From 252f69260502daeb9c5499b82089cac9fba5f064 Mon Sep 17 00:00:00 2001 From: Treecat Date: Tue, 14 Mar 2023 17:01:54 +0800 Subject: [PATCH] =?UTF-8?q?REPORT-90850=20feat:=20=E4=BD=BF=E7=94=A8=20mon?= =?UTF-8?q?orepo=20=E7=BB=93=E5=90=88=EF=BC=8C=E5=B9=B6=E9=AA=8C=E8=AF=81?= =?UTF-8?q?=20fineui=20=E6=8C=89=E9=9C=80=E8=A6=81=E5=BC=95=E5=85=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .eslintignore | 1 - .eslintrc | 18 +- .gitignore | 13 +- .npmignore | 44 - .npmrc | 3 +- .prettierrc | 7 + LICENSE | 201 - README.md | 15 - babel.config.js | 1 - bi.lessconfig.json | 52 - bin/cli/cli.js | 21 - bin/cli/worker/cli.worker.js | 76 - bin/cli/worker/template/main_thread.helper.t | 48 - .../action/action.worker_ability_test.t | 13 - .../worker/template/main_thread/main_thread.t | 13 - bin/cli/worker/template/utils/action_type.t | 8 - bin/cli/worker/template/utils/payload_type.t | 13 - .../action/action.worker_ability_test.t | 24 - .../template/worker_thread/worker_thread.t | 12 - changelog.md | 281 - demo/app.js | 124 - demo/config.js | 1584 ------ demo/index.js | 4 - demo/js/base/button/demo.button.js | 449 -- demo/js/base/button/demo.icon_button.js | 28 - demo/js/base/button/demo.image_button.js | 28 - demo/js/base/button/demo.joker.icon.js | 26 - demo/js/base/button/demo.text_button.js | 28 - demo/js/base/button/index.js | 5 - demo/js/base/demo.html.js | 26 - demo/js/base/demo.icon_label.js | 26 - demo/js/base/demo.label.js | 167 - demo/js/base/demo.label.scene.js | 673 --- demo/js/base/demo.message.js | 27 - demo/js/base/demo.pager.js | 126 - demo/js/base/editor/demo.editor.js | 124 - demo/js/base/editor/demo.multifile_editor.js | 33 - demo/js/base/editor/demo.textarea_editor.js | 52 - demo/js/base/index.js | 11 - demo/js/base/tip/demo.bubble.js | 84 - demo/js/base/tip/demo.title.js | 68 - demo/js/base/tip/demo.toast.js | 86 - demo/js/base/tree/demo.part_tree.js | 98 - demo/js/base/tree/demo.sync_tree.js | 119 - demo/js/base/tree/demo.tree_view.js | 57 - .../combo/demo.search_text_value_combo.js | 122 - .../case/combo/demo.text_vlaue_check_combo.js | 51 - demo/js/case/index.js | 15 - demo/js/case/list/demo.lazy_loader.js | 27 - demo/js/case/list/demo.select_list.js | 28 - demo/js/case/pane/demo.list_pane.js | 41 - demo/js/case/pane/demo.multi_popup_view.js | 46 - demo/js/case/pane/demo.panel.js | 35 - demo/js/case/pane/demo.popup_panel.js | 46 - demo/js/case/tree/demo.level_tree.js | 111 - demo/js/case/tree/demo.simple_tree.js | 147 - demo/js/center.js | 16 - demo/js/component/demo.form.js | 111 - .../component/demo.treevaluechoosercombo.js | 27 - .../js/component/demo.treevaluechooserpane.js | 18 - demo/js/component/demo.valuechoosercombo.js | 24 - demo/js/component/demo.valuechooserpane.js | 18 - demo/js/component/index.js | 5 - demo/js/config/base.js | 89 - demo/js/config/case.js | 185 - demo/js/config/category.js | 8 - demo/js/config/component.js | 27 - demo/js/config/core.js | 203 - demo/js/config/demo.pane.js | 34 - demo/js/config/fix.js | 54 - demo/js/config/index.js | 8 - demo/js/config/widget.js | 205 - .../core/abstract/combination/demo.combo.js | 450 -- .../core/abstract/combination/demo.combo2.js | 167 - .../core/abstract/combination/demo.combo3.js | 77 - .../abstract/combination/demo.combo_group.js | 81 - .../abstract/combination/demo.expander.js | 54 - .../core/abstract/combination/demo.loader.js | 33 - .../abstract/combination/demo.navigation.js | 41 - .../core/abstract/combination/demo.sercher.js | 125 - .../abstract/combination/demo.switcher.js | 73 - demo/js/core/abstract/combination/demo.tab.js | 80 - demo/js/core/abstract/demo.button_group.js | 80 - demo/js/core/abstract/demo.button_tree.js | 36 - demo/js/core/abstract/demo.collection_view.js | 46 - demo/js/core/abstract/demo.custom_tree.js | 282 - demo/js/core/abstract/demo.grid_view.js | 62 - demo/js/core/abstract/demo.list_view.js | 25 - demo/js/core/abstract/demo.virtual_group.js | 86 - .../core/abstract/demo.virtual_group_item.js | 43 - demo/js/core/abstract/demo.virtual_list.js | 21 - demo/js/core/abstract/index.js | 11 - demo/js/core/index.js | 3 - demo/js/core/layout/demo.absolute.js | 27 - demo/js/core/layout/demo.border.js | 102 - demo/js/core/layout/demo.center.js | 40 - demo/js/core/layout/demo.center_adapt.js | 23 - demo/js/core/layout/demo.float_center.js | 30 - demo/js/core/layout/demo.flow.js | 89 - demo/js/core/layout/demo.grid.js | 153 - demo/js/core/layout/demo.horizontal.js | 153 - demo/js/core/layout/demo.horizontal_adapt.js | 64 - demo/js/core/layout/demo.horizontal_auto.js | 45 - demo/js/core/layout/demo.horizontal_float.js | 22 - demo/js/core/layout/demo.htape.js | 40 - .../layout/demo.left_right_vertical_adapt.js | 50 - demo/js/core/layout/demo.table.js | 164 - demo/js/core/layout/demo.td.js | 73 - demo/js/core/layout/demo.vertical.js | 29 - demo/js/core/layout/demo.vertical_adapt.js | 46 - demo/js/core/layout/demo.vtape.js | 43 - demo/js/core/layout/index.js | 18 - demo/js/core/popup/demo.layer.js | 78 - demo/js/core/popup/demo.popover.js | 219 - demo/js/core/popup/demo.popup_view.js | 46 - demo/js/core/popup/demo.searcher_view.js | 61 - demo/js/core/popup/index.js | 4 - demo/js/face.js | 878 --- demo/js/fix-2.0/computed.js | 52 - demo/js/fix-2.0/context.js | 79 - demo/js/fix-2.0/define.js | 45 - demo/js/fix-2.0/demo.js | 74 - demo/js/fix-2.0/globalwatcher.js | 52 - demo/js/fix-2.0/index.js | 10 - demo/js/fix-2.0/inject.js | 102 - demo/js/fix-2.0/scene.js | 445 -- demo/js/fix-2.0/state.js | 49 - demo/js/fix-2.0/store.js | 60 - demo/js/fix-2.0/watcher.js | 51 - demo/js/index.js | 16 - demo/js/main.js | 62 - demo/js/main.store.js | 65 - demo/js/north.js | 46 - demo/js/preview.js | 95 - demo/js/router.js | 17 - demo/js/west.js | 77 - demo/js/widget/basewidget/demo.buttons.js | 87 - demo/js/widget/basewidget/demo.items.js | 43 - demo/js/widget/basewidget/demo.nodes.js | 41 - demo/js/widget/basewidget/demo.sagments.js | 40 - demo/js/widget/basewidget/demo.tips.js | 164 - demo/js/widget/basewidget/index.js | 5 - demo/js/widget/collapase/API.md | 12 - demo/js/widget/collapase/demo.collapse.js | 74 - demo/js/widget/collapase/index.js | 1 - demo/js/widget/date/demo.datepane.js | 93 - demo/js/widget/date/demo.multidate_combo.js | 111 - demo/js/widget/datetime/demo.datetime.js | 57 - demo/js/widget/downlist/demo.downlist.icon.js | 13 - demo/js/widget/downlist/demo.downlist.js | 267 - demo/js/widget/editor/demo.search_editor.js | 31 - demo/js/widget/editor/demo.text_editor.js | 29 - demo/js/widget/index.js | 23 - .../multiselect/demo.multi_select_combo.js | 96 - .../multiselect/demo.multi_select_list.js | 104 - .../widget/multitree/demo.multi_tree_combo.js | 67 - .../widget/multitree/demo.multi_tree_list.js | 73 - .../widget/numbereditor/demo.number_editor.js | 67 - .../numberinterval/demo.number_interval.js | 51 - .../demo.multilayer_select_tree_combo.js | 47 - .../selecttree/demo.select_tree_combo.js | 47 - .../singleselct/demo.single_select_combo.js | 103 - .../demo.multilayer_single_tree_combo.js | 46 - .../singletree/demo.single_tree_combo.js | 47 - demo/js/widget/slider/demo.slider.js | 127 - demo/js/widget/timecombo/demo.timecombo.js | 51 - .../widget/timeinterval/demo.time_interval.js | 112 - .../tree/demo.multilayer_select_level_tree.js | 49 - .../tree/demo.multilayer_single_level_tree.js | 74 - demo/js/widget/tree/demo.select_level_tree.js | 49 - demo/js/widget/tree/demo.single_level_tree.js | 49 - demo/js/widget/year/demo.year.js | 50 - .../widget/yearinterval/demo.year_interval.js | 53 - .../widget/yearmonth/demo.year_month_combo.js | 53 - .../demo.year_month_interval.js | 51 - .../yearquarter/demo.year_quarter_combo.js | 55 - .../demo.yearquarterinterval.js | 53 - demo/less/center.less | 3 - demo/less/face.less | 11 - demo/less/index.less | 1 - demo/less/main.less | 102 - demo/less/north.less | 12 - demo/less/preview.less | 4 - demo/less/vm.less | 123 - demo/less/west.less | 4 - demo/version.js | 1 - dist/README.md | 31 - dist/fix/fix.compact.js | 193 - dist/fix/fix.js | 1419 ----- dist/fix/fix.proxy.js | 2475 -------- dist/fix/worker.compact.js | 123 - dist/font/iconfont.eot | Bin 269484 -> 0 bytes dist/font/iconfont.svg | 2117 ------- dist/font/iconfont.ttf | Bin 269316 -> 0 bytes dist/font/iconfont.woff | Bin 131148 -> 0 bytes dist/font/iconfont.woff2 | Bin 99604 -> 0 bytes dist/images/1x/background/auto_color.png | Bin 771 -> 0 bytes .../1x/background/auto_color_disable.png | Bin 725 -> 0 bytes .../1x/background/auto_color_normal.png | Bin 637 -> 0 bytes .../background/auto_color_normal_disable.png | Bin 608 -> 0 bytes .../background/auto_color_normal_select.png | Bin 617 -> 0 bytes .../1x/background/auto_color_select.png | Bin 744 -> 0 bytes dist/images/1x/background/line_conn.gif | Bin 45 -> 0 bytes dist/images/1x/background/trans_color.png | Bin 301 -> 0 bytes dist/images/1x/background/trans_disable.png | Bin 200 -> 0 bytes dist/images/1x/background/trans_normal.png | Bin 192 -> 0 bytes dist/images/1x/background/trans_select.png | Bin 199 -> 0 bytes dist/images/1x/icon/auto_no_square_normal.png | Bin 707 -> 0 bytes dist/images/1x/icon/auto_square_normal.png | Bin 508 -> 0 bytes dist/images/1x/icon/check_box_active.png | Bin 353 -> 0 bytes dist/images/1x/icon/check_box_disable.png | Bin 202 -> 0 bytes dist/images/1x/icon/check_box_disable2.png | Bin 341 -> 0 bytes dist/images/1x/icon/check_box_hover.png | Bin 205 -> 0 bytes dist/images/1x/icon/check_box_normal.png | Bin 202 -> 0 bytes .../1x/icon/dark/auto_square_normal.png | Bin 500 -> 0 bytes dist/images/1x/icon/dark/trans_normal.png | Bin 448 -> 0 bytes dist/images/1x/icon/dark/trans_select.png | Bin 456 -> 0 bytes dist/images/1x/icon/dark/tree_collapse_1.png | Bin 200 -> 0 bytes dist/images/1x/icon/dark/tree_collapse_2.png | Bin 233 -> 0 bytes dist/images/1x/icon/dark/tree_collapse_3.png | Bin 250 -> 0 bytes dist/images/1x/icon/dark/tree_collapse_4.png | Bin 238 -> 0 bytes dist/images/1x/icon/dark/tree_expand_1.png | Bin 179 -> 0 bytes dist/images/1x/icon/dark/tree_expand_2.png | Bin 214 -> 0 bytes dist/images/1x/icon/dark/tree_expand_3.png | Bin 231 -> 0 bytes dist/images/1x/icon/dark/tree_expand_4.png | Bin 217 -> 0 bytes .../1x/icon/dark/tree_solid_collapse_1.png | Bin 285 -> 0 bytes .../1x/icon/dark/tree_solid_collapse_2.png | Bin 340 -> 0 bytes .../1x/icon/dark/tree_solid_collapse_3.png | Bin 353 -> 0 bytes .../1x/icon/dark/tree_solid_collapse_4.png | Bin 339 -> 0 bytes .../1x/icon/dark/tree_solid_collapse_5.png | Bin 316 -> 0 bytes .../1x/icon/dark/tree_solid_expand_1.png | Bin 246 -> 0 bytes .../1x/icon/dark/tree_solid_expand_2.png | Bin 302 -> 0 bytes .../1x/icon/dark/tree_solid_expand_3.png | Bin 320 -> 0 bytes .../1x/icon/dark/tree_solid_expand_4.png | Bin 306 -> 0 bytes .../1x/icon/dark/tree_solid_expand_5.png | Bin 282 -> 0 bytes .../icon/dark/tree_solid_vertical_line_1.png | Bin 151 -> 0 bytes .../icon/dark/tree_solid_vertical_line_2.png | Bin 169 -> 0 bytes .../icon/dark/tree_solid_vertical_line_3.png | Bin 180 -> 0 bytes .../icon/dark/tree_solid_vertical_line_4.png | Bin 171 -> 0 bytes .../1x/icon/dark/tree_vertical_line_1.png | Bin 102 -> 0 bytes .../1x/icon/dark/tree_vertical_line_2.png | Bin 144 -> 0 bytes .../1x/icon/dark/tree_vertical_line_3.png | Bin 162 -> 0 bytes .../1x/icon/dark/tree_vertical_line_4.png | Bin 148 -> 0 bytes .../1x/icon/dark/tree_vertical_line_5.png | Bin 138 -> 0 bytes dist/images/1x/icon/dots.png | Bin 2834 -> 0 bytes dist/images/1x/icon/half_selected.png | Bin 228 -> 0 bytes dist/images/1x/icon/half_selected_disable.png | Bin 225 -> 0 bytes dist/images/1x/icon/icon_down_arrow.png | Bin 203 -> 0 bytes dist/images/1x/icon/loading.gif | Bin 1810 -> 0 bytes dist/images/1x/icon/push_down.png | Bin 200 -> 0 bytes dist/images/1x/icon/push_up.png | Bin 199 -> 0 bytes dist/images/1x/icon/radio_active.png | Bin 388 -> 0 bytes dist/images/1x/icon/radio_disable.png | Bin 371 -> 0 bytes dist/images/1x/icon/radio_disable2.png | Bin 398 -> 0 bytes dist/images/1x/icon/radio_hover.png | Bin 384 -> 0 bytes dist/images/1x/icon/radio_normal.png | Bin 382 -> 0 bytes dist/images/1x/icon/slider_active.png | Bin 416 -> 0 bytes dist/images/1x/icon/slider_active_small.png | Bin 289 -> 0 bytes dist/images/1x/icon/slider_normal.png | Bin 425 -> 0 bytes dist/images/1x/icon/slider_normal_small.png | Bin 233 -> 0 bytes dist/images/1x/icon/trans_normal.png | Bin 458 -> 0 bytes dist/images/1x/icon/trans_select.png | Bin 456 -> 0 bytes dist/images/1x/icon/tree_collapse_1.png | Bin 199 -> 0 bytes dist/images/1x/icon/tree_collapse_2.png | Bin 233 -> 0 bytes dist/images/1x/icon/tree_collapse_3.png | Bin 247 -> 0 bytes dist/images/1x/icon/tree_collapse_4.png | Bin 236 -> 0 bytes dist/images/1x/icon/tree_expand_1.png | Bin 179 -> 0 bytes dist/images/1x/icon/tree_expand_2.png | Bin 209 -> 0 bytes dist/images/1x/icon/tree_expand_3.png | Bin 226 -> 0 bytes dist/images/1x/icon/tree_expand_4.png | Bin 212 -> 0 bytes dist/images/1x/icon/tree_solid_collapse_1.png | Bin 331 -> 0 bytes dist/images/1x/icon/tree_solid_collapse_2.png | Bin 384 -> 0 bytes dist/images/1x/icon/tree_solid_collapse_3.png | Bin 394 -> 0 bytes dist/images/1x/icon/tree_solid_collapse_4.png | Bin 378 -> 0 bytes dist/images/1x/icon/tree_solid_collapse_5.png | Bin 356 -> 0 bytes dist/images/1x/icon/tree_solid_expand_1.png | Bin 275 -> 0 bytes dist/images/1x/icon/tree_solid_expand_2.png | Bin 328 -> 0 bytes dist/images/1x/icon/tree_solid_expand_3.png | Bin 344 -> 0 bytes dist/images/1x/icon/tree_solid_expand_4.png | Bin 329 -> 0 bytes dist/images/1x/icon/tree_solid_expand_5.png | Bin 303 -> 0 bytes .../1x/icon/tree_solid_vertical_line_1.png | Bin 152 -> 0 bytes .../1x/icon/tree_solid_vertical_line_2.png | Bin 169 -> 0 bytes .../1x/icon/tree_solid_vertical_line_3.png | Bin 180 -> 0 bytes .../1x/icon/tree_solid_vertical_line_4.png | Bin 171 -> 0 bytes dist/images/1x/icon/tree_vertical_line_1.png | Bin 102 -> 0 bytes dist/images/1x/icon/tree_vertical_line_2.png | Bin 143 -> 0 bytes dist/images/1x/icon/tree_vertical_line_3.png | Bin 162 -> 0 bytes dist/images/1x/icon/tree_vertical_line_4.png | Bin 148 -> 0 bytes dist/images/1x/icon/tree_vertical_line_5.png | Bin 138 -> 0 bytes dist/images/1x/icon/wave_loading.gif | Bin 5552 -> 0 bytes .../2x/background/auto_color_disable.png | Bin 1625 -> 0 bytes .../2x/background/auto_color_normal.png | Bin 1651 -> 0 bytes .../2x/background/auto_color_select.png | Bin 1633 -> 0 bytes dist/images/2x/background/line_conn.gif | Bin 45 -> 0 bytes dist/images/2x/background/trans_normal.png | Bin 534 -> 0 bytes dist/images/2x/icon/auto_no_square_normal.png | Bin 707 -> 0 bytes dist/images/2x/icon/auto_normal.png | Bin 1379 -> 0 bytes dist/images/2x/icon/auto_select.png | Bin 1361 -> 0 bytes dist/images/2x/icon/auto_square_normal.png | Bin 996 -> 0 bytes dist/images/2x/icon/check_box_active.png | Bin 577 -> 0 bytes dist/images/2x/icon/check_box_disable.png | Bin 326 -> 0 bytes dist/images/2x/icon/check_box_disable2.png | Bin 547 -> 0 bytes dist/images/2x/icon/check_box_hover.png | Bin 327 -> 0 bytes dist/images/2x/icon/check_box_normal.png | Bin 322 -> 0 bytes .../2x/icon/dark/auto_square_normal.png | Bin 980 -> 0 bytes dist/images/2x/icon/dark/trans_normal.png | Bin 957 -> 0 bytes dist/images/2x/icon/dark/trans_select.png | Bin 991 -> 0 bytes dist/images/2x/icon/dark/tree_collapse_1.png | Bin 291 -> 0 bytes dist/images/2x/icon/dark/tree_collapse_2.png | Bin 351 -> 0 bytes dist/images/2x/icon/dark/tree_collapse_3.png | Bin 361 -> 0 bytes dist/images/2x/icon/dark/tree_collapse_4.png | Bin 344 -> 0 bytes dist/images/2x/icon/dark/tree_expand_1.png | Bin 273 -> 0 bytes dist/images/2x/icon/dark/tree_expand_2.png | Bin 324 -> 0 bytes dist/images/2x/icon/dark/tree_expand_3.png | Bin 335 -> 0 bytes dist/images/2x/icon/dark/tree_expand_4.png | Bin 317 -> 0 bytes .../2x/icon/dark/tree_solid_collapse_1.png | Bin 394 -> 0 bytes .../2x/icon/dark/tree_solid_collapse_2.png | Bin 473 -> 0 bytes .../2x/icon/dark/tree_solid_collapse_3.png | Bin 509 -> 0 bytes .../2x/icon/dark/tree_solid_collapse_4.png | Bin 476 -> 0 bytes .../2x/icon/dark/tree_solid_collapse_5.png | Bin 434 -> 0 bytes .../2x/icon/dark/tree_solid_expand_1.png | Bin 330 -> 0 bytes .../2x/icon/dark/tree_solid_expand_2.png | Bin 409 -> 0 bytes .../2x/icon/dark/tree_solid_expand_3.png | Bin 466 -> 0 bytes .../2x/icon/dark/tree_solid_expand_4.png | Bin 415 -> 0 bytes .../2x/icon/dark/tree_solid_expand_5.png | Bin 376 -> 0 bytes .../icon/dark/tree_solid_vertical_line_1.png | Bin 216 -> 0 bytes .../icon/dark/tree_solid_vertical_line_2.png | Bin 233 -> 0 bytes .../icon/dark/tree_solid_vertical_line_3.png | Bin 255 -> 0 bytes .../icon/dark/tree_solid_vertical_line_4.png | Bin 215 -> 0 bytes .../2x/icon/dark/tree_vertical_line_1.png | Bin 117 -> 0 bytes .../2x/icon/dark/tree_vertical_line_2.png | Bin 220 -> 0 bytes .../2x/icon/dark/tree_vertical_line_3.png | Bin 243 -> 0 bytes .../2x/icon/dark/tree_vertical_line_4.png | Bin 212 -> 0 bytes .../2x/icon/dark/tree_vertical_line_5.png | Bin 215 -> 0 bytes dist/images/2x/icon/dots.png | Bin 135 -> 0 bytes dist/images/2x/icon/half_selected.png | Bin 368 -> 0 bytes dist/images/2x/icon/half_selected_disable.png | Bin 369 -> 0 bytes dist/images/2x/icon/icon_down_arrow.png | Bin 288 -> 0 bytes dist/images/2x/icon/loading.gif | Bin 1810 -> 0 bytes dist/images/2x/icon/push_down.png | Bin 249 -> 0 bytes dist/images/2x/icon/push_up.png | Bin 209 -> 0 bytes dist/images/2x/icon/radio_active.png | Bin 719 -> 0 bytes dist/images/2x/icon/radio_disable.png | Bin 750 -> 0 bytes dist/images/2x/icon/radio_disable2.png | Bin 725 -> 0 bytes dist/images/2x/icon/radio_hover.png | Bin 789 -> 0 bytes dist/images/2x/icon/radio_normal.png | Bin 753 -> 0 bytes dist/images/2x/icon/slider_active.png | Bin 497 -> 0 bytes dist/images/2x/icon/slider_active_small.png | Bin 289 -> 0 bytes dist/images/2x/icon/slider_normal.png | Bin 410 -> 0 bytes dist/images/2x/icon/slider_normal_small.png | Bin 233 -> 0 bytes dist/images/2x/icon/trans_normal.png | Bin 985 -> 0 bytes dist/images/2x/icon/trans_select.png | Bin 991 -> 0 bytes dist/images/2x/icon/tree_collapse_1.png | Bin 289 -> 0 bytes dist/images/2x/icon/tree_collapse_2.png | Bin 345 -> 0 bytes dist/images/2x/icon/tree_collapse_3.png | Bin 351 -> 0 bytes dist/images/2x/icon/tree_collapse_4.png | Bin 334 -> 0 bytes dist/images/2x/icon/tree_expand_1.png | Bin 271 -> 0 bytes dist/images/2x/icon/tree_expand_2.png | Bin 319 -> 0 bytes dist/images/2x/icon/tree_expand_3.png | Bin 327 -> 0 bytes dist/images/2x/icon/tree_expand_4.png | Bin 309 -> 0 bytes dist/images/2x/icon/tree_solid_collapse_1.png | Bin 495 -> 0 bytes dist/images/2x/icon/tree_solid_collapse_2.png | Bin 581 -> 0 bytes dist/images/2x/icon/tree_solid_collapse_3.png | Bin 619 -> 0 bytes dist/images/2x/icon/tree_solid_collapse_4.png | Bin 580 -> 0 bytes dist/images/2x/icon/tree_solid_collapse_5.png | Bin 538 -> 0 bytes dist/images/2x/icon/tree_solid_expand_1.png | Bin 392 -> 0 bytes dist/images/2x/icon/tree_solid_expand_2.png | Bin 476 -> 0 bytes dist/images/2x/icon/tree_solid_expand_3.png | Bin 513 -> 0 bytes dist/images/2x/icon/tree_solid_expand_4.png | Bin 477 -> 0 bytes dist/images/2x/icon/tree_solid_expand_5.png | Bin 434 -> 0 bytes .../2x/icon/tree_solid_vertical_line_1.png | Bin 178 -> 0 bytes .../2x/icon/tree_solid_vertical_line_2.png | Bin 233 -> 0 bytes .../2x/icon/tree_solid_vertical_line_3.png | Bin 255 -> 0 bytes .../2x/icon/tree_solid_vertical_line_4.png | Bin 215 -> 0 bytes dist/images/2x/icon/tree_vertical_line_1.png | Bin 216 -> 0 bytes dist/images/2x/icon/tree_vertical_line_2.png | Bin 219 -> 0 bytes dist/images/2x/icon/tree_vertical_line_3.png | Bin 241 -> 0 bytes dist/images/2x/icon/tree_vertical_line_4.png | Bin 210 -> 0 bytes dist/images/2x/icon/tree_vertical_line_5.png | Bin 213 -> 0 bytes dist/images/2x/icon/wave_loading.gif | Bin 10956 -> 0 bytes examples/ThemeProvider.html | 99 - examples/config-render.html | 76 - examples/demo.worker.js | 29 - examples/dev.html | 97 - examples/effect.html | 59 - examples/hooks.html | 215 - examples/loader-context.html | 126 - examples/resize.html | 75 - examples/style.html | 68 - examples/tab-context.html | 127 - examples/test-id.html | 127 - examples/useContext.html | 198 - examples/virtual-group.html | 91 - examples/visible.html | 222 - examples/worker.html | 57 - examples/worker_new.html | 15 - examples/worker_new/index.js | 105 - examples/worker_new/worker.js | 80 - examples/响应式布局.html | 419 -- examples/插件设计.html | 146 - examples/替换loading动画.html | 104 - i18n/i18n.cn.js | 204 - i18n/i18n.en.js | 122 - index.html | 14 - jsy.lessconfig.json | 21 - karma.conf.js | 143 - lib/postbuild/postbuild.js | 52 - lib/postpublish/postpublish.js | 15 - lib/prepublish/prepublish.js | 63 - lodash.md | 1 - package.json | 137 +- packages/demo/babel.config.js | 1 + packages/demo/i18n/i18n.cn.js | 205 + packages/demo/i18n/i18n.en.js | 122 + packages/demo/index.html | 16 + packages/demo/jsconfig.json | 5 + packages/demo/package.json | 15 + .../demo/src}/case/combo/demo.bubble_combo.js | 0 .../combo/demo.editor_icon_check_combo.js | 0 .../demo/src}/case/combo/demo.icon_combo.js | 0 .../case/combo/demo.icon_text_value_combo.js | 0 .../combo/demo.search_text_value_combo.js | 121 + .../src}/case/combo/demo.text_value_combo.js | 0 .../combo/demo.text_value_down_list_combo.js | 0 .../case/combo/demo.text_vlaue_check_combo.js | 50 + .../demo/src}/case/combo/index.js | 0 .../demo/src}/case/demo.calendar.js | 0 .../demo/src}/case/demo.click.effect.js | 0 .../demo/src}/case/demo.color_chooser.js | 0 .../src}/case/demo.color_chooser_popup.js | 0 .../demo/src}/case/demo.segment.js | 0 .../src}/case/editor/demo.clear_editor.js | 0 .../src}/case/editor/demo.shelter_editor.js | 0 .../demo/src}/case/editor/demo.sign_editor.js | 0 .../case/editor/demo.simple_state_editor.js | 0 .../src}/case/editor/demo.state_editor.js | 0 .../demo/src}/case/editor/index.js | 0 packages/demo/src/case/index.js | 15 + .../src}/case/item/demo.multi_select_item.js | 0 .../src}/case/item/demo.single_select_item.js | 0 .../item/demo.single_select_radio_item.js | 0 .../demo/src}/case/item/index.js | 0 .../demo/src/case/list/demo.lazy_loader.js | 28 + .../demo/src/case/list/demo.select_list.js | 29 + .../demo/src}/case/list/index.js | 0 .../src}/case/pager/demo.all_count_pager.js | 0 .../src}/case/pager/demo.direction_pager.js | 0 .../demo/src}/case/pager/index.js | 0 packages/demo/src/case/pane/demo.list_pane.js | 52 + .../src/case/pane/demo.multi_popup_view.js | 50 + packages/demo/src/case/pane/demo.panel.js | 39 + .../demo/src/case/pane/demo.popup_panel.js | 50 + .../demo/src}/case/pane/index.js | 0 .../demo/src}/case/tree/demo.display_tree.js | 0 .../demo/src/case/tree/demo.level_tree.js | 111 + .../demo/src/case/tree/demo.simple_tree.js | 147 + .../demo/src}/case/tree/index.js | 0 .../src}/case/triggers/demo.editor_trigger.js | 0 .../src}/case/triggers/demo.icon_trigger.js | 0 .../case/triggers/demo.select_text_trigger.js | 0 .../src}/case/triggers/demo.text_trigger.js | 0 .../demo/src}/case/triggers/index.js | 0 packages/demo/src/center.js | 32 + packages/demo/src/config/base.js | 11 + packages/demo/src/config/constant.js | 3600 ++++++++++++ packages/demo/src/config/core.js | 128 + packages/demo/src/config/index.js | 3646 ++++++++++++ packages/demo/src/config/utils.js | 17 + .../demo/src/demo/base/button/demo.button.js | 452 ++ .../src/demo/base/button/demo.icon_button.js | 31 + .../src/demo/base/button/demo.image_button.js | 31 + .../src/demo/base/button/demo.text_button.js | 31 + packages/demo/src/demo/base/button/index.js | 4 + packages/demo/src/demo/base/demo.html.js | 26 + .../demo/src/demo/base/demo.icon_label.js | 26 + packages/demo/src/demo/base/demo.label.js | 173 + .../demo/src/demo/base/demo.label.scene.js | 802 +++ packages/demo/src/demo/base/demo.message.js | 26 + packages/demo/src/demo/base/demo.pager.js | 126 + .../demo/src/demo/base/editor/demo.editor.js | 127 + .../demo/base/editor/demo.multifile_editor.js | 36 + .../demo/base/editor/demo.textarea_editor.js | 55 + .../demo/src/demo}/base/editor/index.js | 0 packages/demo/src/demo/base/index.js | 16 + .../demo/src/demo/base/tip/demo.bubble.js | 87 + packages/demo/src/demo/base/tip/demo.title.js | 71 + packages/demo/src/demo/base/tip/demo.toast.js | 89 + .../demo/src/demo}/base/tip/index.js | 0 .../demo/src/demo/base/tree/demo.part_tree.js | 101 + .../demo/src/demo/base/tree/demo.sync_tree.js | 122 + .../demo/src/demo/base/tree/demo.tree_view.js | 60 + .../demo/src/demo}/base/tree/index.js | 0 .../src/demo/case/combo/demo.bubble_combo.js | 161 + .../combo/demo.editor_icon_check_combo.js | 55 + .../src/demo/case/combo/demo.icon_combo.js | 44 + .../case/combo/demo.icon_text_value_combo.js | 43 + .../combo/demo.search_text_value_combo.js | 132 + .../demo/case/combo/demo.text_value_combo.js | 276 + .../combo/demo.text_value_down_list_combo.js | 86 + .../case/combo/demo.text_vlaue_check_combo.js | 54 + packages/demo/src/demo/case/combo/index.js | 8 + packages/demo/src/demo/case/demo.calendar.js | 38 + .../demo/src/demo/case/demo.click.effect.js | 56 + .../demo/src/demo/case/demo.color_chooser.js | 49 + .../src/demo/case/demo.color_chooser_popup.js | 35 + packages/demo/src/demo/case/demo.segment.js | 39 + .../src/demo/case/editor/demo.clear_editor.js | 27 + .../demo/case/editor/demo.shelter_editor.js | 51 + .../src/demo/case/editor/demo.sign_editor.js | 31 + .../case/editor/demo.simple_state_editor.js | 37 + .../src/demo/case/editor/demo.state_editor.js | 37 + packages/demo/src/demo/case/editor/index.js | 5 + packages/demo/src/demo/case/index.js | 19 + .../demo/case/item/demo.multi_select_item.js | 29 + .../demo/case/item/demo.single_select_item.js | 27 + .../item/demo.single_select_radio_item.js | 30 + packages/demo/src/demo/case/item/index.js | 3 + .../src/demo/case/list/demo.lazy_loader.js | 37 + .../src/demo/case/list/demo.select_list.js | 39 + packages/demo/src/demo/case/list/index.js | 2 + .../demo/case/pager/demo.all_count_pager.js | 37 + .../demo/case/pager/demo.direction_pager.js | 57 + packages/demo/src/demo/case/pager/index.js | 2 + .../demo/src/demo/case/pane/demo.list_pane.js | 51 + .../demo/case/pane/demo.multi_popup_view.js | 59 + .../demo/src/demo/case/pane/demo.panel.js | 46 + .../src/demo/case/pane/demo.popup_panel.js | 59 + packages/demo/src/demo/case/pane/index.js | 4 + .../src/demo/case/tree/demo.display_tree.js | 56 + .../src/demo/case/tree/demo.level_tree.js | 114 + .../src/demo/case/tree/demo.simple_tree.js | 154 + packages/demo/src/demo/case/tree/index.js | 3 + .../demo/case/triggers/demo.editor_trigger.js | 36 + .../demo/case/triggers/demo.icon_trigger.js | 35 + .../case/triggers/demo.select_text_trigger.js | 36 + .../demo/case/triggers/demo.text_trigger.js | 36 + packages/demo/src/demo/case/triggers/index.js | 4 + packages/demo/src/demo/component/demo.form.js | 114 + .../component/demo.treevaluechoosercombo.js | 30 + .../component/demo.treevaluechooserpane.js | 19 + .../demo/component/demo.valuechoosercombo.js | 28 + .../demo/component/demo.valuechooserpane.js | 16 + packages/demo/src/demo/component/index.js | 10 + .../core/abstract/combination/demo.combo.js | 453 ++ .../core/abstract/combination/demo.combo2.js | 175 + .../core/abstract/combination/demo.combo3.js | 85 + .../abstract/combination/demo.combo_group.js | 114 + .../abstract/combination/demo.expander.js | 62 + .../core/abstract/combination/demo.loader.js | 34 + .../abstract/combination/demo.navigation.js | 49 + .../core/abstract/combination/demo.sercher.js | 135 + .../abstract/combination/demo.switcher.js | 84 + .../core/abstract/combination/demo.tab.js | 91 + .../demo}/core/abstract/combination/index.js | 0 .../demo/core/abstract/demo.button_group.js | 87 + .../demo/core/abstract/demo.button_tree.js | 44 + .../core/abstract/demo.collection_view.js | 53 + .../demo/core/abstract/demo.custom_tree.js | 408 ++ .../src/demo/core/abstract/demo.grid_view.js | 70 + .../src/demo/core/abstract/demo.list_view.js | 26 + .../demo/core/abstract/demo.virtual_group.js | 98 + .../core/abstract/demo.virtual_group_item.js | 47 + .../demo/core/abstract/demo.virtual_list.js | 22 + packages/demo/src/demo/core/abstract/index.js | 16 + packages/demo/src/demo/core/index.js | 8 + .../src/demo/core/layout/demo.absolute.js | 30 + .../demo/src/demo/core/layout/demo.border.js | 105 + .../src/demo/core/layout/demo.center_adapt.js | 26 + .../src/demo/core/layout/demo.float_center.js | 33 + .../demo/src/demo/core/layout/demo.flow.js | 92 + .../demo/src/demo/core/layout/demo.grid.js | 156 + .../src/demo/core/layout/demo.horizontal.js | 156 + .../demo/core/layout/demo.horizontal_adapt.js | 67 + .../demo/core/layout/demo.horizontal_auto.js | 48 + .../demo/core/layout/demo.horizontal_float.js | 25 + .../demo/src/demo/core/layout/demo.htape.js | 43 + .../layout/demo.left_right_vertical_adapt.js | 53 + .../demo/src/demo/core/layout/demo.table.js | 167 + packages/demo/src/demo/core/layout/demo.td.js | 76 + .../src/demo/core/layout/demo.vertical.js | 32 + .../demo/core/layout/demo.vertical_adapt.js | 49 + .../demo/src/demo/core/layout/demo.vtape.js | 46 + packages/demo/src/demo/core/layout/index.js | 22 + .../demo/src/demo/core/popup/demo.layer.js | 81 + .../demo/src/demo/core/popup/demo.popover.js | 222 + .../src/demo/core/popup/demo.popup_view.js | 50 + .../src/demo/core/popup/demo.searcher_view.js | 68 + packages/demo/src/demo/core/popup/index.js | 4 + packages/demo/src/demo/fix-2.0/context.js | 81 + packages/demo/src/demo/fix-2.0/define.js | 40 + packages/demo/src/demo/fix-2.0/index.js | 7 + packages/demo/src/demo/index.js | 6 + .../demo/src/demo/slides.js | 0 .../demo/widget/basewidget/demo.buttons.js | 94 + .../src/demo/widget/basewidget/demo.items.js | 53 + .../src/demo/widget/basewidget/demo.nodes.js | 50 + .../demo/widget/basewidget/demo.sagments.js | 40 + .../src/demo/widget/basewidget/demo.tips.js | 175 + .../demo/src/demo/widget/basewidget/index.js | 9 + .../demo/widget/collapase/demo.collapse.js | 82 + .../demo/src/demo/widget/collapase/index.js | 5 + .../src/demo/widget/date/demo.datepane.js | 104 + .../demo/widget/date/demo.multidate_combo.js | 124 + .../demo/src/demo}/widget/date/index.js | 0 .../src/demo/widget/datetime/demo.datetime.js | 65 + .../demo/src/demo}/widget/datetime/index.js | 0 .../widget/downlist/demo.downlist.icon.js | 16 + .../src/demo/widget/downlist/demo.downlist.js | 278 + .../demo/src/demo}/widget/downlist/index.js | 0 .../demo/widget/editor/demo.search_editor.js | 37 + .../demo/widget/editor/demo.text_editor.js | 29 + .../demo/src/demo}/widget/editor/index.js | 0 packages/demo/src/demo/widget/index.js | 30 + .../multiselect/demo.multi_select_combo.js | 109 + .../multiselect/demo.multi_select_list.js | 117 + .../src/demo}/widget/multiselect/index.js | 0 .../widget/multitree/demo.multi_tree_combo.js | 75 + .../widget/multitree/demo.multi_tree_list.js | 81 + .../demo/src/demo}/widget/multitree/index.js | 0 .../widget/numbereditor/demo.number_editor.js | 73 + .../src/demo}/widget/numbereditor/index.js | 0 .../numberinterval/demo.number_interval.js | 56 + .../src/demo}/widget/numberinterval/index.js | 0 .../demo.multilayer_select_tree_combo.js | 51 + .../selecttree/demo.select_tree_combo.js | 55 + .../demo/src/demo}/widget/selecttree/index.js | 0 .../singleselct/demo.single_select_combo.js | 107 + .../src/demo}/widget/singleselct/index.js | 0 .../demo.multilayer_single_tree_combo.js | 50 + .../singletree/demo.single_tree_combo.js | 51 + .../demo/src/demo}/widget/singletree/index.js | 0 .../src/demo/widget/slider/demo.slider.js | 142 + .../demo/src/demo}/widget/slider/index.js | 0 .../demo/widget/timecombo/demo.timecombo.js | 54 + .../demo/src/demo}/widget/timecombo/index.js | 0 .../widget/timeinterval/demo.time_interval.js | 115 + .../src/demo}/widget/timeinterval/index.js | 0 .../tree/demo.multilayer_select_level_tree.js | 58 + .../tree/demo.multilayer_single_level_tree.js | 77 + .../widget/tree/demo.select_level_tree.js | 58 + .../widget/tree/demo.single_level_tree.js | 58 + .../demo/src/demo}/widget/tree/index.js | 0 .../demo/src/demo/widget/year/demo.year.js | 53 + .../demo/src/demo}/widget/year/index.js | 0 .../widget/yearinterval/demo.year_interval.js | 56 + .../src/demo}/widget/yearinterval/index.js | 0 .../widget/yearmonth/demo.year_month_combo.js | 56 + .../demo/src/demo}/widget/yearmonth/index.js | 0 .../demo.year_month_interval.js | 54 + .../demo}/widget/yearmonthinterval/index.js | 0 .../yearquarter/demo.year_quarter_combo.js | 58 + .../src/demo}/widget/yearquarter/index.js | 0 .../demo.yearquarterinterval.js | 56 + .../demo}/widget/yearquarterinterval/index.js | 0 packages/demo/src/face.js | 876 +++ packages/demo/src/index.js | 34 + packages/demo/src/less/face.less | 11 + packages/demo/src/less/fineui.less | 1 + packages/demo/src/less/index.less | 7 + packages/demo/src/less/main.less | 103 + packages/demo/src/less/north.less | 12 + packages/demo/src/less/preview.less | 8 + packages/demo/src/less/vm.less | 123 + packages/demo/src/less/west.less | 4 + packages/demo/src/main.js | 36 + packages/demo/src/north.js | 66 + packages/demo/src/west.js | 101 + packages/demo/webpack.dev.js | 38 + packages/fineui/babel.config.js | 1 + es6.babel.js => packages/fineui/esm.babel.js | 0 packages/fineui/package.json | 43 + packages/fineui/src/base/0.base.js | 23 + packages/fineui/src/base/1.pane.js | 161 + .../fineui/src}/base/behavior/0.behavior.js | 0 .../src}/base/behavior/behavior.highlight.js | 0 .../src}/base/behavior/behavior.redmark.js | 0 .../fineui/src}/base/behavior/index.js | 0 .../collection/__test__/collection.test.js | 0 .../fineui/src}/base/collection/collection.js | 0 .../fineui/src}/base/combination/bubble.js | 0 .../fineui/src}/base/combination/combo.js | 0 .../fineui/src}/base/combination/expander.js | 0 .../src}/base/combination/group.button.js | 0 .../src}/base/combination/group.combo.js | 0 .../src}/base/combination/group.virtual.js | 0 .../fineui/src}/base/combination/index.js | 0 .../fineui/src}/base/combination/loader.js | 0 .../src}/base/combination/navigation.js | 0 .../fineui/src}/base/combination/searcher.js | 0 .../fineui/src}/base/combination/switcher.js | 0 .../fineui/src}/base/combination/tab.js | 0 .../src}/base/combination/tree.button.js | 0 {src => packages/fineui/src}/base/context.js | 0 {src => packages/fineui/src}/base/el.js | 0 .../base/foundation/__test__/message.test.js | 0 .../fineui/src}/base/foundation/message.js | 0 .../src}/base/grid/__test__/grid.test.js | 0 .../fineui/src}/base/grid/grid.js | 0 {src => packages/fineui/src}/base/index.js | 0 .../base/layer/__test__/layer.popover.test.js | 0 .../fineui/src}/base/layer/index.js | 0 .../fineui/src}/base/layer/layer.drawer.js | 0 .../fineui/src}/base/layer/layer.popover.js | 0 .../fineui/src}/base/layer/layer.popup.js | 0 .../fineui/src}/base/layer/layer.searcher.js | 0 .../src}/base/list/__test__/listview.test.js | 0 .../fineui/src}/base/list/index.js | 0 .../fineui/src}/base/list/listview.js | 0 .../fineui/src}/base/list/virtualgrouplist.js | 0 .../fineui/src}/base/list/virtuallist.js | 0 packages/fineui/src/base/pager/pager.js | 418 ++ .../fineui/src}/base/single/0.single.js | 0 .../fineui/src}/base/single/1.text.js | 0 .../src}/base/single/__test__/text.test.js | 0 .../src}/base/single/a/__test__/a.test.js | 0 .../fineui/src}/base/single/a/a.js | 0 .../src}/base/single/bar/bar.loading.js | 0 .../src}/base/single/button/button.basic.js | 0 .../src}/base/single/button/button.node.js | 0 .../button/buttons/__test__/button.test.js | 0 .../base/single/button/buttons/button.icon.js | 0 .../single/button/buttons/button.image.js | 0 .../src}/base/single/button/buttons/button.js | 0 .../base/single/button/buttons/button.text.js | 0 .../fineui/src}/base/single/button/index.js | 0 .../button/listitem/blankiconicontextitem.js | 0 .../button/listitem/blankicontexticonitem.js | 0 .../button/listitem/blankicontextitem.js | 0 .../button/listitem/icontexticonitem.js | 0 .../single/button/listitem/icontextitem.js | 0 .../single/button/listitem/texticonitem.js | 0 .../base/single/button/listitem/textitem.js | 0 .../node/__test__/icontexticonnode.test.js | 0 .../button/node/__test__/icontextnode.test.js | 0 .../button/node/__test__/texticonnode.test.js | 0 .../button/node/__test__/textnode.test.js | 0 .../single/button/node/icontexticonnode.js | 0 .../base/single/button/node/icontextnode.js | 0 .../base/single/button/node/texticonnode.js | 0 .../src}/base/single/button/node/textnode.js | 0 .../fineui/src}/base/single/editor/editor.js | 0 .../base/single/editor/editor.multifile.js | 0 .../base/single/editor/editor.textarea.js | 0 .../fineui/src}/base/single/editor/index.js | 0 .../base/single/html/__test__/html.test.js | 0 .../fineui/src}/base/single/html/html.js | 0 .../fineui/src}/base/single/icon/icon.js | 0 .../single/iframe/__test__/iframe.test.js | 0 .../fineui/src}/base/single/iframe/iframe.js | 0 .../src}/base/single/img/__test__/img.test.js | 0 .../fineui/src}/base/single/img/img.js | 0 .../fineui/src}/base/single/index.js | 0 .../single/input/checkbox/checkbox.image.js | 0 .../base/single/input/checkbox/checkbox.js | 0 .../fineui/src}/base/single/input/file.js | 0 .../fineui/src}/base/single/input/index.js | 0 .../fineui/src}/base/single/input/input.js | 0 .../base/single/input/radio/radio.image.js | 0 .../src}/base/single/input/radio/radio.js | 0 .../base/single/instruction/instruction.js | 0 .../src}/base/single/label/abstract.label.js | 0 .../src}/base/single/label/html.label.js | 0 .../src}/base/single/label/icon.label.js | 0 .../fineui/src}/base/single/label/index.js | 0 .../fineui/src}/base/single/label/label.js | 0 .../base/single/link/__test__/link.test.js | 0 .../fineui/src}/base/single/link/link.js | 0 .../fineui/src}/base/single/text.pure.js | 0 .../fineui/src}/base/single/tip/0.tip.js | 0 .../fineui/src}/base/single/tip/index.js | 0 .../fineui/src}/base/single/tip/tip.toast.js | 0 .../src}/base/single/tip/tip.tooltip.js | 0 .../src}/base/single/trigger/trigger.js | 0 .../fineui/src}/base/tree/customtree.js | 0 {src => packages/fineui/src}/bundle.js | 0 .../src}/case/button/icon/icon.change.js | 0 .../src}/case/button/icon/icon.trigger.js | 0 .../button/icon/iconhalf/icon.half.image.js | 0 .../case/button/icon/iconhalf/icon.half.js | 0 .../fineui/src}/case/button/index.js | 0 .../src}/case/button/item.multiselect.js | 0 .../case/button/item.singleselect.icontext.js | 0 .../src}/case/button/item.singleselect.js | 0 .../case/button/item.singleselect.radio.js | 0 .../button/node/__test__/node.arrow.test.js | 0 .../node/__test__/node.first.plus.test.js | 0 .../node/__test__/node.icon.arrow.test.js | 0 .../node/__test__/node.last.plus.test.js | 0 .../node/__test__/node.mid.plus.test.js | 0 .../node.multilayer.icon.arrow.test.js | 0 .../button/node/__test__/node.plus.test.js | 0 .../src}/case/button/node/node.arrow.js | 0 .../src}/case/button/node/node.icon.arrow.js | 0 .../button/node/node.multilayer.icon.arrow.js | 0 .../fineui/src}/case/button/node/node.plus.js | 0 .../case/button/node/siwtcher.tree.node.js | 0 .../fineui/src}/case/button/node/treenode.js | 0 .../fineui/src}/case/button/switch.js | 0 .../treeitem/__test__/item.treeleaf.test.js | 0 .../button/treeitem/item.icon.treeleaf.js | 0 .../treeitem/item.multilayer.icon.treeleaf.js | 0 .../src}/case/button/treeitem/treeitem.js | 0 .../src}/case/calendar/calendar.date.item.js | 0 .../fineui/src}/case/calendar/calendar.js | 0 .../src}/case/calendar/calendar.year.js | 0 .../fineui/src}/case/calendar/index.js | 0 .../src}/case/checkbox/check.arrownode.js | 0 .../case/checkbox/check.checkingmarknode.js | 0 .../case/checkbox/check.first.treenode.js | 0 .../src}/case/checkbox/check.last.treenode.js | 0 .../src}/case/checkbox/check.mid.treenode.js | 0 .../src}/case/checkbox/check.treenode.js | 0 .../fineui/src}/case/checkbox/index.js | 0 .../__test__/colorchooser.test.js | 0 .../case/colorchooser/colorchooser.custom.js | 0 .../src}/case/colorchooser/colorchooser.js | 0 .../colorchooser/colorchooser.popup.hex.js | 0 .../colorchooser.popup.hex.simple.js | 0 .../case/colorchooser/colorchooser.popup.js | 0 .../colorchooser/colorchooser.popup.simple.js | 0 .../case/colorchooser/colorchooser.simple.js | 0 .../case/colorchooser/colorchooser.trigger.js | 0 .../colorchooser/colorchooser.trigger.long.js | 0 .../colorpicker/button/button.colorpicker.js | 0 .../colorpicker/button/button.colorshow.js | 0 .../colorchooser/colorpicker/button/index.js | 0 .../colorpicker/colorpicker.hex.js | 0 .../colorchooser/colorpicker/colorpicker.js | 0 .../colorpicker/editor.colorpicker.hex.js | 0 .../editor.colorpicker.hex.simple.js | 0 .../colorpicker/editor.colorpicker.js | 0 .../colorpicker/editor.colorpicker.simple.js | 0 .../case/colorchooser/colorpicker/index.js | 0 .../farbtastic/__test__/farbtastic.test.js | 0 .../colorchooser/farbtastic/farbtastic.js | 0 .../fineui/src}/case/colorchooser/index.js | 0 .../bubblecombo/__test__/combo.bubble.test.js | 0 .../case/combo/bubblecombo/combo.bubble.js | 0 .../case/combo/bubblecombo/popup.bubble.js | 0 .../__test__/combo.editiconcheck.test.js | 0 .../combo.editiconcheck.js | 0 .../src}/case/combo/iconcombo/combo.icon.js | 0 .../case/combo/iconcombo/popup.iconcombo.js | 0 .../case/combo/iconcombo/trigger.iconcombo.js | 0 .../__test__/combo.icontextvalue.test.js | 0 .../icontextvaluecombo/combo.icontextvalue.js | 0 .../icontextvaluecombo/popup.icontextvalue.js | 0 .../fineui/src}/case/combo/index.js | 0 .../combo.searchtextvaluecombo.test.js | 0 .../combo.searchtextvalue.js | 0 .../popup.searchtextvalue.js | 0 .../trigger.searchtextvalue.js | 0 .../__test__/combo.textvaluecheck.test.js | 0 .../combo.textvaluecheck.js | 0 .../popup.textvaluecheck.js | 0 .../__test__/combo.textvalue.test.js | 0 .../combo/textvaluecombo/combo.textvalue.js | 0 .../textvaluecombo/combo.textvaluesmall.js | 0 .../combo/textvaluecombo/popup.textvalue.js | 0 .../case/editor/__test__/editor.clear.test.js | 0 .../case/editor/__test__/editor.sign.test.js | 0 .../__test__/editor.state.simple.test.js | 0 .../case/editor/__test__/editor.state.test.js | 0 .../fineui/src}/case/editor/editor.clear.js | 0 .../src}/case/editor/editor.defaulttext.js | 0 .../fineui/src}/case/editor/editor.shelter.js | 0 .../fineui/src}/case/editor/editor.sign.js | 0 .../fineui/src}/case/editor/editor.state.js | 0 .../src}/case/editor/editor.state.simple.js | 0 .../fineui/src}/case/editor/index.js | 0 {src => packages/fineui/src}/case/index.js | 0 .../fineui/src}/case/layer/index.js | 0 .../src}/case/layer/layer.multipopup.js | 0 .../fineui/src}/case/layer/layer.panel.js | 0 .../fineui/src}/case/layer/pane.list.js | 0 .../fineui/src}/case/layer/panel.js | 0 .../linearsegment/button.linear.segment.js | 0 .../fineui/src}/case/linearsegment/index.js | 0 .../src}/case/linearsegment/linear.segment.js | 0 .../fineui/src}/case/list/list.select.js | 0 .../case/loader/__test__/loader.lazy.test.js | 0 .../case/loader/__test__/loader.list.test.js | 0 .../fineui/src}/case/loader/index.js | 0 .../fineui/src}/case/loader/loader.lazy.js | 0 .../fineui/src}/case/loader/loader.list.js | 0 .../fineui/src}/case/loader/sort.list.js | 0 .../src}/case/pager/__test__/pager.test.js | 0 .../fineui/src}/case/pager/index.js | 0 .../fineui/src}/case/pager/pager.all.count.js | 0 .../fineui/src}/case/pager/pager.detail.js | 0 .../fineui/src}/case/pager/pager.direction.js | 0 .../case/segment/__test__/segment.test.js | 0 .../src}/case/segment/button.segment.js | 0 .../fineui/src}/case/segment/index.js | 0 .../fineui/src}/case/segment/segment.js | 0 .../src}/case/toolbar/toolbar.multiselect.js | 0 .../fineui/src}/case/tree/index.js | 0 .../fineui/src}/case/tree/tree.level.js | 0 .../case/tree/treeexpander/tree.expander.js | 0 .../tree/treeexpander/tree.expander.popup.js | 0 .../fineui/src}/case/trigger/index.js | 0 .../src}/case/trigger/trigger.editor.js | 0 .../fineui/src}/case/trigger/trigger.icon.js | 0 .../src}/case/trigger/trigger.icon.text.js | 0 .../case/trigger/trigger.icon.text.select.js | 0 .../fineui/src}/case/trigger/trigger.text.js | 0 .../src}/case/trigger/trigger.text.select.js | 0 .../case/trigger/trigger.text.select.small.js | 0 .../src}/case/trigger/trigger.text.small.js | 0 .../fineui/src}/case/ztree/asynctree.js | 0 .../fineui/src}/case/ztree/index.js | 0 .../src}/case/ztree/jquery.ztree.core-3.5.js | 0 .../case/ztree/jquery.ztree.excheck-3.5.js | 0 .../src}/case/ztree/list/listasynctree.js | 0 .../src}/case/ztree/list/listparttree.js | 0 .../src}/case/ztree/list/listtreeview.js | 0 .../fineui/src}/case/ztree/parttree.js | 0 .../fineui/src}/case/ztree/tree.display.js | 0 .../src}/case/ztree/tree.list.display.js | 0 .../fineui/src}/case/ztree/tree.simple.js | 0 .../case/ztree/treerender.page.service.js | 0 .../case/ztree/treerender.scroll.service.js | 0 packages/fineui/src/case/ztree/treeview.js | 619 ++ .../__test__/combo.allvaluechooser.test.js | 0 .../abstract.allvaluechooser.js | 0 .../allvaluechooser/combo.allvaluechooser.js | 0 .../src}/component/allvaluechooser/index.js | 0 .../allvaluechooser/pane.allvaluechooser.js | 0 .../allvalue.multitextvalue.combo.test.js | 0 .../allvalue.multitextvalue.combo.js | 0 .../fineui/src}/component/form/form.field.js | 0 .../fineui/src}/component/form/form.js | 0 .../fineui/src}/component/form/index.js | 0 packages/fineui/src/component/index.js | 21 + .../combo.listtreevaluechooser.test.js | 0 .../combo.treevaluechooser.insert.test.js | 0 .../__test__/combo.treevaluechooser.test.js | 0 .../__test__/pane.treevaluechooser.test.js | 0 .../abstract.treevaluechooser.js | 0 .../abstract.treevaluechooser.list.js | 0 .../combo.listtreevaluechooser.js | 0 .../combo.treevaluechooser.insert.js | 0 .../combo.treevaluechooser.js | 0 .../src}/component/treevaluechooser/index.js | 0 .../treevaluechooser/pane.treevaluechooser.js | 0 .../combo.valuechooser.insert.test.js | 0 .../__test__/combo.valuechooser.test.js | 0 .../__test__/pane.valuechooser.test.js | 0 .../valuechooser/abstract.valuechooser.js | 0 .../valuechooser/combo.valuechooser.insert.js | 0 .../valuechooser/combo.valuechooser.js | 0 .../valuechooser/combo.valuechooser.nobar.js | 0 .../src}/component/valuechooser/index.js | 0 .../valuechooser/pane.valuechooser.js | 0 .../fineui/src}/core/0.foundation.js | 0 {src => packages/fineui/src}/core/1.lodash.js | 0 packages/fineui/src/core/2.base.js | 1637 ++++++ {src => packages/fineui/src}/core/3.ob.js | 0 packages/fineui/src/core/4.widget.js | 1192 ++++ packages/fineui/src/core/5.inject.js | 528 ++ {src => packages/fineui/src}/core/6.plugin.js | 0 .../fineui/src}/core/__test__/alias.test.js | 0 .../fineui/src}/core/__test__/base.test.js | 0 .../fineui/src}/core/__test__/context.test.js | 0 .../fineui/src}/core/__test__/widget.test.js | 0 .../fineui/src}/core/action/action.js | 0 .../fineui/src}/core/action/action.show.js | 0 .../fineui/src}/core/action/index.js | 0 .../fineui/src}/core/behavior/0.behavior.js | 0 .../src}/core/behavior/behavior.highlight.js | 0 .../src}/core/behavior/behavior.redmark.js | 0 .../fineui/src}/core/behavior/index.js | 0 .../fineui/src}/core/constant/events.js | 0 .../fineui/src}/core/constant/index.js | 0 .../fineui/src}/core/constant/var.js | 0 .../src}/core/controller/0.controller.js | 0 .../core/controller/controller.broadcast.js | 0 .../core/controller/controller.bubbles.js | 0 .../src}/core/controller/controller.drawer.js | 0 .../src/core/controller/controller.layer.js | 201 + .../src}/core/controller/controller.masker.js | 0 .../core/controller/controller.popover.js | 0 .../core/controller/controller.resizer.js | 0 .../core/controller/controller.tooltips.js | 0 .../fineui/src}/core/controller/index.js | 0 .../fineui/src}/core/controller/popper.js | 0 .../fineui/src}/core/decorator.js | 0 .../fineui/src}/core/element/element.js | 0 .../fineui/src}/core/element/index.js | 0 .../fineui/src}/core/element/plugins/attr.js | 0 .../fineui/src}/core/element/plugins/class.js | 0 .../fineui/src}/core/element/plugins/css.js | 0 .../fineui/src}/core/element/plugins/data.js | 0 .../fineui/src}/core/element/plugins/empty.js | 0 .../fineui/src}/core/element/plugins/event.js | 0 .../fineui/src}/core/element/plugins/html.js | 0 .../fineui/src}/core/element/plugins/index.js | 0 .../src}/core/element/plugins/keywordMark.js | 0 .../src}/core/element/plugins/renderToHtml.js | 0 .../core/element/plugins/renderToString.js | 0 .../fineui/src}/core/element/plugins/text.js | 0 .../fineui/src}/core/element/plugins/val.js | 0 .../src}/core/func/__test__/date.test.js | 0 .../src}/core/func/__test__/function.test.js | 0 .../src}/core/func/__test__/string.test.js | 0 .../fineui/src}/core/func/alias.js | 0 .../fineui/src}/core/func/array.js | 0 .../fineui/src}/core/func/date.js | 0 .../fineui/src}/core/func/function.js | 0 .../fineui/src}/core/func/index.js | 0 .../fineui/src}/core/func/number.js | 0 .../fineui/src}/core/func/string.js | 0 {src => packages/fineui/src}/core/h.js | 0 packages/fineui/src/core/index.js | 41 + .../src}/core/listener/listener.show.js | 0 .../fineui/src}/core/loader/loader.style.js | 0 .../fineui/src}/core/logic/index.js | 0 .../fineui/src}/core/logic/logic.js | 0 .../fineui/src}/core/logic/logic.layout.js | 0 .../fineui/src}/core/platform/index.js | 0 .../fineui/src}/core/platform/web/config.js | 0 .../core/platform/web/detectElementResize.js | 0 .../fineui/src}/core/platform/web/function.js | 0 .../fineui/src}/core/platform/web/index.js | 0 .../platform/web/jquery/__test__/fn.test.js | 0 .../src}/core/platform/web/jquery/_jquery.js | 0 .../src}/core/platform/web/jquery/event.js | 0 .../src}/core/platform/web/jquery/fn.js | 0 .../src}/core/platform/web/jquery/index.js | 0 .../platform/web/jquery/jquery.mousewheel.js | 0 .../fineui/src}/core/platform/web/load.js | 0 .../fineui/src}/core/structure/aes.js | 0 .../fineui/src}/core/structure/aspect.js | 0 .../fineui/src}/core/structure/base64.js | 0 .../fineui/src}/core/structure/cache.js | 0 .../structure/cellSizeAndPositionManager.js | 0 .../fineui/src}/core/structure/heap.js | 0 .../fineui/src}/core/structure/index.js | 0 .../src}/core/structure/linkedHashMap.js | 0 .../fineui/src}/core/structure/lru.js | 0 .../src}/core/structure/prefixIntervalTree.js | 0 .../fineui/src}/core/structure/queue.js | 0 .../src}/core/structure/sectionManager.js | 0 .../fineui/src}/core/structure/tree.js | 0 .../fineui/src}/core/structure/vector.js | 0 packages/fineui/src/core/system.js | 154 + .../src}/core/utils/__test__/aes.test.js | 0 .../fineui/src}/core/utils/chinesePY.js | 0 .../fineui/src}/core/utils/color.js | 0 packages/fineui/src/core/utils/dom.js | 788 +++ .../src}/core/utils/events/eventlistener.js | 0 .../fineui/src}/core/utils/events/index.js | 0 .../core/utils/events/mousemovetracker.js | 0 .../src}/core/utils/events/wheelhandler.js | 0 .../fineui/src}/core/utils/i18n.js | 0 .../fineui/src}/core/utils/index.js | 0 packages/fineui/src/core/version.js | 2 + {src => packages/fineui/src}/core/worker.js | 0 .../fineui/src}/core/wrapper/index.js | 0 packages/fineui/src/core/wrapper/layout.js | 821 +++ .../wrapper/layout/adapt/absolute.center.js | 0 .../layout/adapt/absolute.horizontal.js | 0 .../adapt/absolute.leftrightvertical.js | 0 .../wrapper/layout/adapt/absolute.vertical.js | 0 .../core/wrapper/layout/adapt/adapt.center.js | 0 .../wrapper/layout/adapt/adapt.horizontal.js | 0 .../layout/adapt/adapt.leftrightvertical.js | 0 .../core/wrapper/layout/adapt/adapt.table.js | 0 .../wrapper/layout/adapt/adapt.vertical.js | 0 .../wrapper/layout/adapt/auto.horizontal.js | 0 .../src}/core/wrapper/layout/adapt/index.js | 0 .../wrapper/layout/adapt/inline.center.js | 0 .../wrapper/layout/adapt/inline.horizontal.js | 0 .../wrapper/layout/adapt/inline.vertical.js | 0 .../core/wrapper/layout/fill/auto.vtape.js | 0 .../wrapper/layout/fill/fill.horizontal.js | 0 .../core/wrapper/layout/fill/fill.vertical.js | 0 .../layout/fill/float.fill.horizontal.js | 0 .../src}/core/wrapper/layout/fill/index.js | 0 .../core/wrapper/layout/flex/flex.center.js | 0 .../layout/flex/flex.horizontal.center.js | 0 .../wrapper/layout/flex/flex.horizontal.js | 0 .../flex/flex.leftrightvertical.center.js | 0 .../layout/flex/flex.vertical.center.js | 0 .../core/wrapper/layout/flex/flex.vertical.js | 0 .../src}/core/wrapper/layout/flex/index.js | 0 .../flex/wrapper/flex.wrapper.center.js | 0 .../wrapper/flex.wrapper.horizontal.center.js | 0 .../flex/wrapper/flex.wrapper.horizontal.js | 0 .../wrapper/flex.wrapper.vertical.center.js | 0 .../flex/wrapper/flex.wrapper.vertical.js | 0 .../core/wrapper/layout/flex/wrapper/index.js | 0 .../layout/float/float.absolute.center.js | 0 .../layout/float/float.absolute.horizontal.js | 0 .../float/float.absolute.leftrightvertical.js | 0 .../layout/float/float.absolute.vertical.js | 0 .../wrapper/layout/float/float.horizontal.js | 0 .../src}/core/wrapper/layout/float/index.js | 0 .../fineui/src}/core/wrapper/layout/index.js | 0 .../core/wrapper/layout/layout.absolute.js | 0 .../core/wrapper/layout/layout.adaptive.js | 0 .../src}/core/wrapper/layout/layout.border.js | 0 .../src}/core/wrapper/layout/layout.card.js | 0 .../core/wrapper/layout/layout.default.js | 0 .../core/wrapper/layout/layout.division.js | 0 .../src}/core/wrapper/layout/layout.flow.js | 0 .../src}/core/wrapper/layout/layout.grid.js | 0 .../core/wrapper/layout/layout.horizontal.js | 0 .../src}/core/wrapper/layout/layout.inline.js | 0 .../core/wrapper/layout/layout.lattice.js | 0 .../src}/core/wrapper/layout/layout.table.js | 0 .../src}/core/wrapper/layout/layout.tape.js | 0 .../src}/core/wrapper/layout/layout.td.js | 0 .../core/wrapper/layout/layout.vertical.js | 0 .../src}/core/wrapper/layout/layout.window.js | 0 .../src}/core/wrapper/layout/middle/index.js | 0 .../wrapper/layout/middle/middle.center.js | 0 .../layout/middle/middle.float.center.js | 0 .../layout/middle/middle.horizontal.js | 0 .../wrapper/layout/middle/middle.vertical.js | 0 .../core/wrapper/layout/responsive/index.js | 0 .../responsive/responsive.flex.horizontal.js | 0 .../responsive.flex.wrapper.horizontal.js | 0 .../layout/responsive/responsive.inline.js | 0 .../src}/core/wrapper/layout/sticky/index.js | 0 .../layout/sticky/sticky.horizontal.js | 0 .../wrapper/layout/sticky/sticky.vertical.js | 0 .../fineui/src}/fix/fix.compact.js | 0 {src => packages/fineui/src}/fix/fix.js | 0 {src => packages/fineui/src}/fix/index.js | 0 packages/fineui/src/index.js | 17 + .../base/colorchooser/colorchooser.popup.less | 0 .../colorchooser/colorchooser.trigger.less | 0 .../colorpicker/button.colorpicker.less | 0 .../colorpicker/button.colorshow.less | 0 .../colorpicker/editor.colorpicker.less | 0 .../colorchooser/farbtastic/farbtastic.less | 0 .../src}/less/base/combo/combo.bubble.less | 0 .../fineui/src}/less/base/combo/combo.less | 0 .../base/combo/combo.searchtextvalue.less | 0 .../less/base/combo/combo.textvalue.icon.less | 0 .../src}/less/base/combo/combo.textvalue.less | 0 .../less/base/combo/combo.textvaluecheck.less | 0 .../base/combo/combo.textvaluedownlist.less | 0 .../less/base/combo/popup.bubble.bar.less | 0 .../src}/less/base/combo/popup.bubble.less | 0 .../src}/less/base/editor/editor.search.less | 0 .../less/base/editor/editor.search.small.less | 0 .../src}/less/base/foundation/bi.message.less | 0 .../less/base/layer/layer.multiselect.less | 0 .../fineui/src}/less/base/layer/panel.less | 0 .../src}/less/base/loader/sort.list.less | 0 .../src}/less/base/pager/pager.all.count.less | 0 .../src}/less/base/pager/pager.direction.less | 0 .../fineui/src}/less/base/pager/pager.less | 0 .../fineui/src}/less/base/pane.less | 0 .../less/base/segment/button.segment.less | 0 .../src}/less/base/segment/segment.less | 0 .../less/base/single/button/button.half.less | 0 .../src}/less/base/single/button/button.less | 0 .../src}/less/base/single/button/switch.less | 0 .../base/single/editor/editor.multifile.less | 0 .../base/single/editor/editor.textarea.less | 0 .../fineui/src}/less/base/single/html.less | 0 .../src}/less/base/single/input/checkbox.less | 0 .../src}/less/base/single/input/file.less | 0 .../src}/less/base/single/input/input.less | 0 .../src}/less/base/single/input/radio.less | 0 .../src}/less/base/single/instruction.less | 0 .../fineui/src}/less/base/single/label.less | 0 .../fineui/src}/less/base/single/text.less | 0 .../src}/less/base/single/tip/tip.bubble.less | 0 .../fineui/src}/less/base/single/tip/tip.less | 0 .../src}/less/base/single/tip/tip.toast.less | 0 .../less/base/single/tip/tip.tooltip.less | 0 .../src}/less/base/tree/tree.branch.less | 0 .../src}/less/base/tree/tree.display.less | 0 .../src}/less/base/tree/tree.expander.less | 0 .../less/base/tree/tree.list.display.less | 0 .../fineui/src}/less/base/tree/ztree.less | 0 .../src}/less/base/trigger/trigger.less | 0 .../base/trigger/trigger.searchtextvalue.less | 0 .../less/base/trigger/trigger.selecttext.less | 0 .../base/trigger/trigger.selecttextsmall.less | 0 .../src}/less/base/trigger/trigger.text.less | 0 .../fineui/src}/less/base/view/drawer.less | 0 .../fineui/src}/less/base/view/popover.less | 0 .../fineui/src}/less/base/view/popupview.less | 0 .../fineui/src}/less/box-model.less | 0 .../fineui/src}/less/case/tree/tree.item.less | 0 .../fineui/src}/less/component/form/form.less | 0 .../fineui/src}/less/core/normalize.less | 0 .../fineui/src}/less/core/normalize2.less | 0 .../src}/less/core/utils/animation.less | 0 .../fineui/src}/less/core/utils/common.less | 0 .../fineui/src}/less/core/utils/cursor.less | 0 .../src}/less/core/utils/list-item.less | 0 .../src}/less/core/utils/motion/fade.less | 0 .../src}/less/core/utils/motion/move.less | 0 .../src}/less/core/utils/motion/slide.less | 0 .../src}/less/core/utils/motion/zoom.less | 0 .../fineui/src}/less/core/utils/position.less | 0 .../fineui/src}/less/core/utils/size.less | 0 .../fineui/src}/less/core/utils/sizing.less | 0 .../src}/less/core/utils/typographic.less | 0 .../less/core/wrapper/flex.horizontal.less | 0 .../src}/less/core/wrapper/flex.vertical.less | 0 .../core/wrapper/flex.wrapper.horizontal.less | 0 .../core/wrapper/flex.wrapper.vertical.less | 0 .../less/core/wrapper/float.absolute.less | 0 .../fineui/src}/less/core/wrapper/inline.less | 0 .../src}/less/core/wrapper/inline.old.less | 0 .../fineui/src}/less/core/wrapper/table.less | 0 {src => packages/fineui/src}/less/image.less | 0 {src => packages/fineui/src}/less/index.less | 0 .../fineui/src}/less/lib/background.less | 0 .../fineui/src}/less/lib/colors.less | 0 .../fineui/src}/less/lib/constant.less | 0 .../fineui/src}/less/lib/font.less | 0 .../fineui/src}/less/lib/icon.less | 0 .../fineui/src}/less/lib/theme-modern.less | 0 .../fineui/src}/less/lib/theme.less | 0 {src => packages/fineui/src}/less/motion.less | 0 .../fineui/src}/less/position.less | 0 .../fineui/src}/less/resource/app.less | 0 .../fineui/src}/less/resource/background.less | 0 .../fineui/src}/less/resource/font.less | 0 .../fineui/src}/less/resource/icon.less | 0 .../fineui/src}/less/theme/dark.less | 0 .../fineui/src}/less/theme/default.less | 0 .../fineui/src}/less/theme/light.less | 0 .../fineui/src}/less/typographic.less | 0 {src => packages/fineui/src}/less/var.less | 0 {src => packages/fineui/src}/less/visual.less | 0 .../src}/less/widget/date/trigger.date.less | 0 .../less/widget/downlist/popup.downlist.less | 0 .../dynamicdatecombo/dynamicdatepopup.less | 0 .../dynamicdatetime.combo.less | 0 .../dynamicdatetimepopup.less | 0 .../intervalslider/intervalslider.label.less | 0 .../widget/intervalslider/intervalslider.less | 0 .../src}/less/widget/month/trigger.month.less | 0 .../multilayerselecttree.combo.less | 0 .../multilayerselecttree.leveltree.less | 0 .../multilayersingletree.combo.less | 0 .../multilayersingletree.leveltree.less | 0 .../check/multiselect.check.pane.less | 0 .../widget/multiselect/multiselect.combo.less | 0 .../multiselect/multiselect.insert.combo.less | 0 .../search/multiselect.search.pane.less | 0 .../trigger/button.checkselected.less | 0 .../multistringlist.insert.less | 0 .../multistringlist/multistringlist.less | 0 .../check/multi.tree.check.pane.less | 0 .../widget/multitree/multi.tree.combo.less | 0 .../widget/multitree/popup.multi.tree.less | 0 .../multi.tree.button.checkselected.less | 0 .../widget/numbereditor/number.editor.less | 0 .../widget/numberinterval/numberinterval.less | 0 .../less/widget/quarter/trigger.quarter.less | 0 .../searchmultiselect/searchmultiselect.less | 0 .../search/singleselect.search.pane.less | 0 .../singleselect/singleselect.combo.less | 0 .../singleslider/singlelider.label.less | 0 .../singleslider/singlelider.normal.less | 0 .../widget/singleslider/singleslider.less | 0 .../singleslider/slider/widget.slider.less | 0 .../singleslider/track/widget.track.less | 0 .../src}/less/widget/timecombo/timecombo.less | 0 .../widget/timeinterval/dateinterval.less | 0 .../widget/timeinterval/timeinterval.less | 0 .../src}/less/widget/year/popup.year.less | 0 .../src}/less/widget/year/trigger.year.less | 0 .../widget/yearinterval/yearinterval.less | 0 .../widget/yearmonth/popup.yearmonth.less | 0 .../yearmonthinterval/yearmonthinterval.less | 0 .../widget/yearquarter/popup.yearquarter.less | 0 .../yearquarterinterval.less | 0 .../fineui/src}/polyfill/event.js | 0 .../fineui/src}/polyfill/index.js | 0 .../fineui/src}/polyfill/number.js | 0 {src => packages/fineui/src}/polyfill/sort.js | 0 .../fineui/src}/router/0.router.js | 0 {src => packages/fineui/src}/router/index.js | 0 packages/fineui/src/router/router.js | 3143 ++++++++++ .../fineui/src}/third/sort.gb2312.js | 0 .../fineui/src}/widget/collapse/collapse.js | 0 .../widget/date/calendar/combo.month.date.js | 0 .../widget/date/calendar/combo.year.date.js | 0 .../fineui/src}/widget/date/calendar/index.js | 0 .../src}/widget/date/calendar/picker.date.js | 0 .../src}/widget/date/calendar/picker.year.js | 0 .../date/calendar/popup.calendar.date.js | 0 .../src}/widget/date/calendar/popup.month.js | 0 .../src}/widget/date/calendar/popup.year.js | 0 .../date/calendar/trigger.triangle.date.js | 0 .../fineui/src}/widget/date/index.js | 0 .../widget/datepane/__test__/datepane.test.js | 0 .../widget/datepane/card.static.datepane.js | 0 .../fineui/src}/widget/datepane/datepane.js | 0 .../fineui/src}/widget/datepane/index.js | 0 .../widget/datetime/__test__/datetime.test.js | 0 .../src}/widget/datetime/datetime.combo.js | 0 .../src}/widget/datetime/datetime.popup.js | 0 .../src}/widget/datetime/datetime.trigger.js | 0 .../fineui/src}/widget/datetime/index.js | 0 .../__test__/datetimepane.test.js | 0 .../datetimepane/card.static.datetimepane.js | 0 .../src}/widget/datetimepane/datetimepane.js | 0 .../fineui/src}/widget/datetimepane/index.js | 0 .../widget/downlist/__test__/downlist.test.js | 0 .../src}/widget/downlist/combo.downlist.js | 0 .../src}/widget/downlist/group.downlist.js | 0 .../fineui/src}/widget/downlist/index.js | 0 .../src}/widget/downlist/item.downlist.js | 0 .../widget/downlist/item.downlistgroup.js | 0 .../src}/widget/downlist/popup.downlist.js | 0 .../dynamicdate/__test__/dynamicdate.test.js | 0 .../dynamicdate/dynamicdate.caculate.js | 0 .../widget/dynamicdate/dynamicdate.card.js | 0 .../widget/dynamicdate/dynamicdate.combo.js | 0 .../dynamicdate/dynamicdate.param.item.js | 0 .../widget/dynamicdate/dynamicdate.popup.js | 0 .../widget/dynamicdate/dynamicdate.trigger.js | 0 .../fineui/src}/widget/dynamicdate/index.js | 0 .../__test__/dynamicdatetime.test.js | 0 .../dynamicdatetime/dynamicdatetime.combo.js | 0 .../dynamicdatetime/dynamicdatetime.popup.js | 0 .../dynamicdatetime.timeselect.js | 0 .../dynamicdatetime.trigger.js | 0 .../src}/widget/dynamicdatetime/index.js | 0 .../editor/__test__/editor.search.test.js | 0 .../editor/__test__/editor.text.test.js | 0 .../src}/widget/editor/editor.search.js | 0 .../src}/widget/editor/editor.search.small.js | 0 .../fineui/src}/widget/editor/editor.text.js | 0 .../src}/widget/editor/editor.text.small.js | 0 .../fineui/src}/widget/editor/index.js | 0 packages/fineui/src/widget/index.js | 40 + .../__test__/accuratecalculation.test.js | 0 .../__test__/intervalslider.test.js | 0 .../src}/widget/intervalslider/index.js | 0 .../widget/intervalslider/intervalslider.js | 0 .../model.accuratecalculation.js | 0 .../__test__/downlist.test.js | 0 .../multilayerdownlist/combo.downlist.js | 0 .../src}/widget/multilayerdownlist/index.js | 0 .../multilayerdownlist/popup.downlist.js | 0 .../multilayerselecttree.combo.test.js | 0 .../src}/widget/multilayerselecttree/index.js | 0 .../multilayerselecttree.combo.js | 0 ...multilayerselecttree.insert.search.pane.js | 0 .../multilayerselecttree.leveltree.js | 0 .../multilayerselecttree.popup.js | 0 .../multilayerselecttree.trigger.js | 0 .../multilayersingletree.combo.test.js | 0 .../src}/widget/multilayersingletree/index.js | 0 .../multilayersingletree.combo.js | 0 ...multilayersingletree.insert.search.pane.js | 0 .../multilayersingletree.leveltree.js | 0 .../multilayersingletree.popup.js | 0 .../multilayersingletree.trigger.js | 0 .../__test__/multiselect.loader.nobar.test.js | 0 .../__test__/multiselect.loader.test.js | 0 .../__test__/multiselectcombo.test.js | 0 .../__test__/multiselectinsert.combo.test.js | 0 .../check/multiselect.check.pane.js | 0 .../multiselect/check/multiselect.display.js | 0 .../fineui/src}/widget/multiselect/index.js | 0 .../fineui/src}/widget/multiselect/loader.js | 0 .../widget/multiselect/multiselect.combo.js | 0 .../multiselect/multiselect.combo.nobar.js | 0 .../multiselect/multiselect.insert.combo.js | 0 .../multiselect.insert.combo.nobar.js | 0 .../multiselect/multiselect.insert.trigger.js | 0 .../widget/multiselect/multiselect.loader.js | 0 .../multiselect/multiselect.loader.nobar.js | 0 .../multiselect/multiselect.popup.view.js | 0 .../multiselect.popup.view.nobar.js | 0 .../widget/multiselect/multiselect.trigger.js | 0 .../search/multiselect.search.insert.pane.js | 0 .../search/multiselect.search.loader.js | 0 .../search/multiselect.search.pane.js | 0 .../trigger/button.checkselected.js | 0 .../multiselect/trigger/editor.multiselect.js | 0 .../trigger/editor/editor.patch.js | 0 .../trigger/searcher.multiselect.insert.js | 0 .../trigger/searcher.multiselect.js | 0 .../trigger/switcher.checkselected.js | 0 .../__test__/multiselect.insert.nobar.test.js | 0 .../__test__/multiselectlist.insert.test.js | 0 .../src}/widget/multiselectlist/index.js | 0 .../multiselectlist/multiselectlist.insert.js | 0 .../multiselectlist.insert.nobar.js | 0 .../widget/multiselectlist/multiselectlist.js | 0 .../widget/multiselecttree/multiselecttree.js | 0 .../multiselecttree/multiselecttree.popup.js | 0 .../multitree/check/multi.tree.check.pane.js | 0 .../src}/widget/multitree/multi.tree.combo.js | 0 .../multitree/multi.tree.insert.combo.js | 0 .../widget/multitree/multi.tree.list.combo.js | 0 .../src}/widget/multitree/multi.tree.popup.js | 0 .../multi.tree.button.checkselected.js | 0 .../trigger/multi.tree.search.insert.pane.js | 0 .../trigger/multi.tree.search.pane.js | 0 .../trigger/searcher.list.multi.tree.js | 0 .../multitree/trigger/searcher.multi.tree.js | 0 .../src}/widget/numbereditor/number.editor.js | 0 .../__test__/numberinterval.test.js | 0 .../widget/numberinterval/numberinterval.js | 0 .../singleeditor/single.editor.js | 0 .../multitextvalue.combo.search.test.js | 0 .../widget/searchmultitextvaluecombo/index.js | 0 .../multitextvalue.combo.search.js | 0 .../multitextvalue.combo.trigger.search.js | 0 .../multitextvalue.loader.search.js | 0 .../multitextvalue.popup.view.search.js | 0 .../trigger/searcher.multitextvalue.js | 0 .../__test__/selecttree.combo.test.js | 0 .../widget/selecttree/selecttree.combo.js | 0 .../widget/selecttree/selecttree.expander.js | 0 .../widget/selecttree/selecttree.popup.js | 0 .../__test__/singleselect.combo.test.js | 0 .../singleselect.insert.combo.test.js | 0 .../fineui/src}/widget/singleselect/index.js | 0 .../src}/widget/singleselect/search/index.js | 0 .../search/singleselect.search.loader.js | 0 .../search/singleselect.search.pane.insert.js | 0 .../search/singleselect.search.pane.js | 0 .../widget/singleselect/singleselect.combo.js | 0 .../singleselect/singleselect.insert.combo.js | 0 .../widget/singleselect/singleselect.list.js | 0 .../singleselect/singleselect.loader.js | 0 .../singleselect/singleselect.popup.view.js | 0 .../singleselect/singleselect.trigger.js | 0 .../singleselect/singleselectlist.insert.js | 0 .../trigger/editor.singleselect.js | 0 .../src}/widget/singleselect/trigger/index.js | 0 .../trigger/searcher.singleselect.js | 0 .../__test__/singleslider.test.js | 0 .../singleslider/button/editor.sign.text.js | 0 .../singleslider/button/iconbutton.slider.js | 0 .../fineui/src}/widget/singleslider/index.js | 0 .../src}/widget/singleslider/singleslider.js | 0 .../widget/singleslider/singleslider.label.js | 0 .../singleslider/singleslider.normal.js | 0 .../__test__/singletree.combo.test.js | 0 .../widget/singletree/singletree.combo.js | 0 .../widget/singletree/singletree.popup.js | 0 .../widget/singletree/singletree.trigger.js | 0 .../__test__/combo.textvaluedownlist.test.js | 0 .../combo.textvaluedownlist.js | 0 .../widget/textvaluedownlistcombo/index.js | 0 .../trigger.textvaluedownlist.js | 0 .../widget/time/__test__/time.combo.test.js | 0 .../fineui/src}/widget/time/datetime.popup.js | 0 .../fineui/src}/widget/time/index.js | 0 .../fineui/src}/widget/time/time.combo.js | 0 .../fineui/src}/widget/time/time.trigger.js | 0 .../__test__/timeinterval.test.js | 0 .../src}/widget/timeinterval/dateinterval.js | 0 .../fineui/src}/widget/timeinterval/index.js | 0 .../src}/widget/timeinterval/timeinterval.js | 0 .../src}/widget/timeinterval/timeperiods.js | 0 .../widget/year/__test__/combo.year.test.js | 0 .../src}/widget/year/card.dynamic.year.js | 0 .../fineui/src}/widget/year/card.year.js | 0 .../fineui/src}/widget/year/combo.year.js | 0 .../fineui/src}/widget/year/index.js | 0 .../fineui/src}/widget/year/popup.year.js | 0 .../fineui/src}/widget/year/trigger.year.js | 0 .../src}/widget/yearinterval/yearinterval.js | 0 .../__test__/combo.yearmonth.test.js | 0 .../yearmonth/card.dynamic.yearmonth.js | 0 .../widget/yearmonth/card.static.yearmonth.js | 0 .../src}/widget/yearmonth/combo.yearmonth.js | 0 .../fineui/src}/widget/yearmonth/index.js | 0 .../src}/widget/yearmonth/popup.yearmonth.js | 0 .../widget/yearmonth/trigger.yearmonth.js | 0 .../__test__/yearmonthinterval.test.js | 0 .../yearmonthinterval/yearmonthinterval.js | 0 .../__test__/combo.yearquarter.test.js | 0 .../yearquarter/card.dynamic.yearquarter.js | 0 .../yearquarter/card.static.yearquarter.js | 0 .../widget/yearquarter/combo.yearquarter.js | 0 .../fineui/src}/widget/yearquarter/index.js | 0 .../widget/yearquarter/popup.yearquarter.js | 0 .../widget/yearquarter/trigger.yearquarter.js | 0 .../yearquarterinterval.js | 0 packages/fineui/tsconfig.json | 26 + {types => packages/fineui/types}/globals.d.ts | 0 .../fineui/typescript}/base/a/a.ts | 0 .../fineui/typescript}/base/base.ts | 0 .../typescript}/base/combination/combo.ts | 0 .../typescript}/base/combination/expander.ts | 0 .../base/combination/group.button.ts | 0 .../base/combination/group.virtual.ts | 0 .../typescript}/base/combination/loader.ts | 0 .../typescript}/base/combination/searcher.ts | 0 .../typescript}/base/combination/switcher.ts | 0 .../typescript}/base/combination/tab.ts | 0 .../base/combination/tree.button.ts | 0 .../typescript}/base/foundation/message.ts | 0 .../typescript}/base/layer/layer.popover.ts | 0 .../typescript}/base/layer/layer.popup.ts | 0 .../fineui/typescript}/base/list/listview.ts | 0 .../typescript}/base/list/virtualgrouplist.ts | 0 .../typescript}/base/list/virtuallist.ts | 0 .../fineui/typescript}/base/pager/pager.ts | 0 .../fineui/typescript}/base/pane.ts | 0 .../base/single/button/button.basic.ts | 0 .../base/single/button/button.node.ts | 0 .../base/single/button/buttons/button.icon.ts | 0 .../single/button/buttons/button.image.ts | 0 .../base/single/button/buttons/button.text.ts | 0 .../base/single/button/buttons/button.ts | 0 .../button/listitem/blankicontextitem.ts | 0 .../button/listitem/icontexticonitem.ts | 0 .../single/button/listitem/icontextitem.ts | 0 .../base/single/button/node/textnode.ts | 0 .../base/single/editor/editor.textarea.ts | 0 .../typescript}/base/single/editor/editor.ts | 0 .../typescript}/base/single/html/html.ts | 0 .../typescript}/base/single/icon/icon.ts | 0 .../typescript}/base/single/iframe/iframe.ts | 0 .../fineui/typescript}/base/single/img/img.ts | 0 .../typescript}/base/single/input/checkbox.ts | 0 .../typescript}/base/single/input/input.ts | 0 .../base/single/input/radio/radio.ts | 0 .../base/single/label/abstract.label.ts | 0 .../base/single/label/html.label.ts | 0 .../base/single/label/icon.label.ts | 0 .../typescript}/base/single/label/label.ts | 0 .../fineui/typescript}/base/single/single.ts | 0 .../fineui/typescript}/base/single/text.ts | 0 .../base/single/trigger/trigger.ts | 0 .../typescript}/base/tree/customtree.ts | 0 .../typescript}/base/tree/ztree/asynctree.ts | 0 .../base/tree/ztree/list/listasynctree.ts | 0 .../base/tree/ztree/list/listtreeview.ts | 0 .../typescript}/base/tree/ztree/treeview.ts | 0 .../fineui/typescript}/bundle.ts | 0 .../case/button/icon/icon.change.ts | 0 .../case/button/icon/icon.trigger.ts | 0 .../button/icon/iconhalf/icon.half.image.ts | 0 .../case/button/icon/iconhalf/icon.half.ts | 0 .../case/button/item.multiselect.ts | 0 .../case/button/item.singleselect.radio.ts | 0 .../case/button/item.singleselect.ts | 0 .../case/button/node/node.icon.arrow.ts | 0 .../fineui/typescript}/case/button/switch.ts | 0 .../button/treeitem/item.first.treeleaf.ts | 0 .../button/treeitem/item.last.treeleaf.ts | 0 .../case/button/treeitem/item.mid.treeleaf.ts | 0 .../case/checkbox/check.arrownode.ts | 0 .../colorchooser/colorchooser.popup.hex.ts | 0 .../case/colorchooser/colorchooser.simple.ts | 0 .../case/colorchooser/colorchooser.ts | 0 .../case/combo/bubblecombo/combo.bubble.ts | 0 .../case/combo/bubblecombo/popup.bubble.ts | 0 .../typescript}/case/combo/combo.textvalue.ts | 0 .../case/combo/combo.textvaluesmall.ts | 0 .../combo.editiconcheck.ts | 0 .../case/combo/iconcombo/combo.icon.ts | 0 .../icontextvaluecombo/combo.icontextvalue.ts | 0 .../typescript}/case/combo/popup.textvalue.ts | 0 .../combo.searchtextvalue.ts | 0 .../combo.textvaluecheck.ts | 0 .../popup.textvaluecheck.ts | 0 .../typescript}/case/editor/editor.shelter.ts | 0 .../typescript}/case/editor/editor.sign.ts | 0 .../typescript}/case/editor/editor.state.ts | 0 .../case/layer/layer.multipopup.ts | 0 .../typescript}/case/layer/pane.list.ts | 0 .../case/linersegment/linear.segment.ts | 0 .../typescript}/case/list/list.select.ts | 0 .../typescript}/case/pager/pager.all.count.ts | 0 .../typescript}/case/pager/pager.direction.ts | 0 .../typescript}/case/segment/segment.ts | 0 .../case/toolbar/toolbar.multiselect.ts | 0 .../case/trigger/trigger.text.select.ts | 0 .../typescript}/case/trigger/trigger.text.ts | 0 .../abstract.allvaluechooser.ts | 0 .../allvaluechooser/combo.allvaluechooser.ts | 0 .../allvalue.multitextvalue.combo.ts | 0 .../fineui/typescript}/component/form/form.ts | 0 .../abstract.treevaluechooser.list.ts | 0 .../abstract.treevaluechooser.ts | 0 .../combo.listtreevaluechooser.ts | 0 .../combo.treevaluechooser.insert.ts | 0 .../combo.treevaluechooser.ts | 0 .../treevaluechooser/pane.treevaluechooser.ts | 0 .../typescript}/core/action/action.show.ts | 0 .../fineui/typescript}/core/action/action.ts | 0 .../fineui/typescript}/core/base.ts | 0 .../core/behavior/behavior.highlight.ts | 0 .../core/behavior/behavior.redmark.ts | 0 .../typescript}/core/behavior/behavior.ts | 0 .../core/controller/controller.broadcast.ts | 0 .../core/controller/controller.layer.ts | 0 .../typescript}/core/controller/controller.ts | 0 .../typescript}/core/decorator/decorator.ts | 0 .../fineui/typescript}/core/func/array.ts | 0 .../fineui/typescript}/core/func/date.ts | 0 .../fineui/typescript}/core/func/function.ts | 0 .../fineui/typescript}/core/func/index.ts | 0 .../fineui/typescript}/core/func/number.ts | 0 .../fineui/typescript}/core/func/string.ts | 0 .../fineui/typescript}/core/i18n.ts | 0 .../fineui/typescript}/core/inject.ts | 0 .../fineui/typescript}/core/ob.ts | 0 .../core/platform/web/detectElementResize.ts | 0 .../typescript}/core/platform/web/dom.ts | 0 .../core/platform/web/eventListener.ts | 0 .../typescript}/core/platform/web/function.ts | 0 .../typescript}/core/platform/web/index.ts | 0 .../typescript}/core/platform/web/load.ts | 0 .../fineui/typescript}/core/plugin.ts | 0 .../fineui/typescript}/core/utils/aes.ts | 0 .../fineui/typescript}/core/utils/aspect.ts | 0 .../fineui/typescript}/core/utils/base64.ts | 0 .../fineui/typescript}/core/utils/cache.ts | 0 .../core/utils/cellSizeAndPositionManager.ts | 0 .../typescript}/core/utils/chinesePY.ts | 0 .../core/utils/events/mousemovetracker.ts | 0 .../core/utils/events/wheelhandler.ts | 0 .../fineui/typescript}/core/utils/heap.ts | 0 .../fineui/typescript}/core/utils/index.ts | 0 .../typescript}/core/utils/linkedHashMap.ts | 0 .../fineui/typescript}/core/utils/lru.ts | 0 .../core/utils/prefixIntervalTree.ts | 0 .../fineui/typescript}/core/utils/queue.ts | 0 .../typescript}/core/utils/sectionManager.ts | 0 .../fineui/typescript}/core/utils/tree.ts | 0 .../fineui/typescript}/core/utils/vector.ts | 0 .../fineui/typescript}/core/var.ts | 0 .../fineui/typescript}/core/widget.ts | 0 .../core/worker/action/worker.action.ts | 0 .../worker/controller/worker.controller.ts | 0 .../worker.main_thread.controller.ts | 0 .../worker.worker_thread.controller.ts | 0 .../typescript}/core/worker/worker.channel.ts | 0 .../typescript}/core/worker/worker.core.ts | 0 .../core/worker/worker.main_thread.ts | 0 .../core/worker/worker.worker_thread.ts | 0 .../fineui/typescript}/core/worker/workers.ts | 0 .../fineui/typescript}/core/wrapper/layout.ts | 0 .../wrapper/layout/adapt/absolute.center.ts | 0 .../core/wrapper/layout/adapt/adapt.center.ts | 0 .../wrapper/layout/adapt/adapt.horizontal.ts | 0 .../layout/adapt/adapt.leftrightvertical.ts | 0 .../layout/adapt/adapt.leftvertical.ts | 0 .../core/wrapper/layout/adapt/adapt.table.ts | 0 .../wrapper/layout/adapt/adapt.vertical.ts | 0 .../wrapper/layout/adapt/auto.horizontal.ts | 0 .../wrapper/layout/adapt/float.horizontal.ts | 0 .../wrapper/layout/adapt/inline.vertical.ts | 0 .../wrapper/layout/fill/fill.horizontal.ts | 0 .../core/wrapper/layout/fill/fill.vertical.ts | 0 .../core/wrapper/layout/layout.absolute.ts | 0 .../core/wrapper/layout/layout.adaptive.ts | 0 .../core/wrapper/layout/layout.card.ts | 0 .../core/wrapper/layout/layout.default.ts | 0 .../core/wrapper/layout/layout.flow.ts | 0 .../core/wrapper/layout/layout.grid.ts | 0 .../core/wrapper/layout/layout.horizontal.ts | 0 .../core/wrapper/layout/layout.table.ts | 0 .../core/wrapper/layout/layout.tape.ts | 0 .../core/wrapper/layout/layout.td.ts | 0 .../core/wrapper/layout/layout.vertical.ts | 0 .../wrapper/layout/middle/middle.center.ts | 0 .../layout/middle/middle.float.center.ts | 0 .../layout/sticky/sticky.horizontal.ts | 0 .../wrapper/layout/sticky/sticky.vertical.ts | 0 .../fineui/typescript}/index.ts | 0 .../fineui/typescript}/router/router.ts | 0 .../fineui/typescript}/shims-tsx.ts | 0 .../typescript}/widget/collapse/collapse.ts | 0 .../date/calendar/popup.calendar.date.ts | 0 .../typescript}/widget/datepane/datepane.ts | 0 .../widget/datetime/datetime.combo.ts | 0 .../widget/datetimepane/datetimepane.ts | 0 .../widget/downlist/combo.downlist.ts | 0 .../widget/downlist/item.downlistgroup.ts | 0 .../widget/downlist/popup.downlist.ts | 0 .../widget/dynamicdate/dynamicdate.combo.ts | 0 .../dynamicdatetime/dynamicdatetime.combo.ts | 0 .../widget/editor/editor.multifile.ts | 0 .../widget/editor/editor.search.ts | 0 .../widget/editor/editor.text.small.ts | 0 .../typescript}/widget/editor/editor.text.ts | 0 .../widget/intervalslider/intervalslider.ts | 0 .../multilayerdownlist.combo.ts | 0 .../multilayerdownlist.popup.ts | 0 .../multilayerselecttree.combo.ts | 0 .../multilayerselecttree.leveltree.ts | 0 .../multilayerselecttree.popup.ts | 0 .../multilayersingletree.combo.ts | 0 .../multilayersingletree.leveltree.ts | 0 .../multilayersingletree.popup.ts | 0 .../widget/multiselect/multiselect.combo.ts | 0 .../multiselect/multiselect.insert.combo.ts | 0 .../multiselectlist/multiselectlist.insert.ts | 0 .../widget/multiselecttree/multiselecttree.ts | 0 .../widget/multitree/multi.tree.combo.ts | 0 .../multitree/multi.tree.insert.combo.ts | 0 .../widget/multitree/multi.tree.list.combo.ts | 0 .../widget/multitree/multi.tree.popup.ts | 0 .../widget/numbereditor/numbereditor.ts | 0 .../widget/numberinterval/numberinterval.ts | 0 .../widget/selecttree/selecttree.expander.ts | 0 .../widget/singleselect/singleselect.combo.ts | 0 .../singleselect/singleselect.insert.combo.ts | 0 .../singleselect/singleselectlist.insert.ts | 0 .../combo.textvaluedownlist.ts | 0 .../typescript}/widget/time/time.combo.ts | 0 .../widget/timeinterval/dateinterval.ts | 0 .../widget/timeinterval/timeinterval.ts | 0 .../typescript}/widget/year/combo.year.ts | 0 .../typescript}/widget/year/popup.year.ts | 0 .../widget/yearmonth/combo.yearmonth.ts | 0 .../widget/yearmonth/popup.yearmonth.ts | 0 .../yearmonthinterval/yearmonthinterval.ts | 0 .../widget/yearquarter/combo.yearquarter.ts | 0 packages/fineui/webpack.prod.js | 77 + .../webpack-fui-worker-plugin/constants.js | 9 - plugins/webpack-fui-worker-plugin/index.js | 79 - .../worker-loader.js | 135 - pnpm-lock.yaml | 5045 +++++++++++++++++ pnpm-workspace.yaml | 2 + private/less/app.less | 2 - private/less/background.less | 2 - private/less/font.less | 2 - private/less/icon.less | 5 - private/less/var.less | 4 - public/js/index.js | 0 public/less/app.less | 2 - public/less/background.less | 2 - public/less/font.less | 2 - public/less/icon.less | 5 - public/less/var.less | 4 - publish.bat | 1 - publish.sh | 1 - rollup.config.js | 65 - script/code.static.js | 89 + script/lib/fui.component.json | 398 ++ script/lib/fui.export.txt | 789 +++ script/lib/utils.js | 24 + script/rename.js | 17 + server.js | 13 - src/base/0.base.js | 23 - src/base/1.pane.js | 160 - src/base/pager/pager.js | 346 -- src/case/ztree/treeview.js | 618 -- src/component/index.js | 21 - src/core/2.base.js | 1636 ------ src/core/4.widget.js | 1191 ---- src/core/5.inject.js | 527 -- src/core/controller/controller.layer.js | 200 - src/core/index.js | 43 - src/core/system.js | 154 - src/core/utils/dom.js | 787 --- src/core/version.js | 1 - src/core/wrapper/layout.js | 820 --- src/index.js | 16 - src/router/router.js | 3378 ----------- src/widget/index.js | 37 - template/index.html | 46 - tsconfig.json | 46 - ui/js/index.js | 0 ui/less/app.less | 2 - ui/less/background.less | 2 - ui/less/font.less | 2 - ui/less/icon.less | 5 - ui/less/var.less | 5 - webpack/attachments.js | 274 - webpack/components.js | 37 - webpack/dirs.js | 16 - webpack/utils.js | 24 - webpack/webpack.common.js | 119 - webpack/webpack.css.js | 20 - webpack/webpack.dev.js | 79 - webpack/webpack.prod.js | 127 - 1783 files changed, 38080 insertions(+), 36026 deletions(-) delete mode 100644 .eslintignore delete mode 100644 .npmignore create mode 100644 .prettierrc delete mode 100644 LICENSE delete mode 100644 README.md delete mode 100644 babel.config.js delete mode 100644 bi.lessconfig.json delete mode 100755 bin/cli/cli.js delete mode 100644 bin/cli/worker/cli.worker.js delete mode 100644 bin/cli/worker/template/main_thread.helper.t delete mode 100644 bin/cli/worker/template/main_thread/action/action.worker_ability_test.t delete mode 100644 bin/cli/worker/template/main_thread/main_thread.t delete mode 100644 bin/cli/worker/template/utils/action_type.t delete mode 100644 bin/cli/worker/template/utils/payload_type.t delete mode 100644 bin/cli/worker/template/worker_thread/action/action.worker_ability_test.t delete mode 100644 bin/cli/worker/template/worker_thread/worker_thread.t delete mode 100644 changelog.md delete mode 100644 demo/app.js delete mode 100644 demo/config.js delete mode 100644 demo/index.js delete mode 100644 demo/js/base/button/demo.button.js delete mode 100644 demo/js/base/button/demo.icon_button.js delete mode 100644 demo/js/base/button/demo.image_button.js delete mode 100644 demo/js/base/button/demo.joker.icon.js delete mode 100644 demo/js/base/button/demo.text_button.js delete mode 100644 demo/js/base/button/index.js delete mode 100644 demo/js/base/demo.html.js delete mode 100644 demo/js/base/demo.icon_label.js delete mode 100644 demo/js/base/demo.label.js delete mode 100644 demo/js/base/demo.label.scene.js delete mode 100644 demo/js/base/demo.message.js delete mode 100644 demo/js/base/demo.pager.js delete mode 100644 demo/js/base/editor/demo.editor.js delete mode 100644 demo/js/base/editor/demo.multifile_editor.js delete mode 100644 demo/js/base/editor/demo.textarea_editor.js delete mode 100644 demo/js/base/index.js delete mode 100644 demo/js/base/tip/demo.bubble.js delete mode 100644 demo/js/base/tip/demo.title.js delete mode 100644 demo/js/base/tip/demo.toast.js delete mode 100644 demo/js/base/tree/demo.part_tree.js delete mode 100644 demo/js/base/tree/demo.sync_tree.js delete mode 100644 demo/js/base/tree/demo.tree_view.js delete mode 100644 demo/js/case/combo/demo.search_text_value_combo.js delete mode 100644 demo/js/case/combo/demo.text_vlaue_check_combo.js delete mode 100644 demo/js/case/index.js delete mode 100644 demo/js/case/list/demo.lazy_loader.js delete mode 100644 demo/js/case/list/demo.select_list.js delete mode 100644 demo/js/case/pane/demo.list_pane.js delete mode 100644 demo/js/case/pane/demo.multi_popup_view.js delete mode 100644 demo/js/case/pane/demo.panel.js delete mode 100644 demo/js/case/pane/demo.popup_panel.js delete mode 100644 demo/js/case/tree/demo.level_tree.js delete mode 100644 demo/js/case/tree/demo.simple_tree.js delete mode 100644 demo/js/center.js delete mode 100644 demo/js/component/demo.form.js delete mode 100644 demo/js/component/demo.treevaluechoosercombo.js delete mode 100644 demo/js/component/demo.treevaluechooserpane.js delete mode 100644 demo/js/component/demo.valuechoosercombo.js delete mode 100644 demo/js/component/demo.valuechooserpane.js delete mode 100644 demo/js/component/index.js delete mode 100644 demo/js/config/base.js delete mode 100644 demo/js/config/case.js delete mode 100644 demo/js/config/category.js delete mode 100644 demo/js/config/component.js delete mode 100644 demo/js/config/core.js delete mode 100644 demo/js/config/demo.pane.js delete mode 100644 demo/js/config/fix.js delete mode 100644 demo/js/config/index.js delete mode 100644 demo/js/config/widget.js delete mode 100644 demo/js/core/abstract/combination/demo.combo.js delete mode 100644 demo/js/core/abstract/combination/demo.combo2.js delete mode 100644 demo/js/core/abstract/combination/demo.combo3.js delete mode 100644 demo/js/core/abstract/combination/demo.combo_group.js delete mode 100644 demo/js/core/abstract/combination/demo.expander.js delete mode 100644 demo/js/core/abstract/combination/demo.loader.js delete mode 100644 demo/js/core/abstract/combination/demo.navigation.js delete mode 100644 demo/js/core/abstract/combination/demo.sercher.js delete mode 100644 demo/js/core/abstract/combination/demo.switcher.js delete mode 100644 demo/js/core/abstract/combination/demo.tab.js delete mode 100644 demo/js/core/abstract/demo.button_group.js delete mode 100644 demo/js/core/abstract/demo.button_tree.js delete mode 100644 demo/js/core/abstract/demo.collection_view.js delete mode 100644 demo/js/core/abstract/demo.custom_tree.js delete mode 100644 demo/js/core/abstract/demo.grid_view.js delete mode 100644 demo/js/core/abstract/demo.list_view.js delete mode 100644 demo/js/core/abstract/demo.virtual_group.js delete mode 100644 demo/js/core/abstract/demo.virtual_group_item.js delete mode 100644 demo/js/core/abstract/demo.virtual_list.js delete mode 100644 demo/js/core/abstract/index.js delete mode 100644 demo/js/core/index.js delete mode 100644 demo/js/core/layout/demo.absolute.js delete mode 100644 demo/js/core/layout/demo.border.js delete mode 100644 demo/js/core/layout/demo.center.js delete mode 100644 demo/js/core/layout/demo.center_adapt.js delete mode 100644 demo/js/core/layout/demo.float_center.js delete mode 100644 demo/js/core/layout/demo.flow.js delete mode 100644 demo/js/core/layout/demo.grid.js delete mode 100644 demo/js/core/layout/demo.horizontal.js delete mode 100644 demo/js/core/layout/demo.horizontal_adapt.js delete mode 100644 demo/js/core/layout/demo.horizontal_auto.js delete mode 100644 demo/js/core/layout/demo.horizontal_float.js delete mode 100644 demo/js/core/layout/demo.htape.js delete mode 100644 demo/js/core/layout/demo.left_right_vertical_adapt.js delete mode 100644 demo/js/core/layout/demo.table.js delete mode 100644 demo/js/core/layout/demo.td.js delete mode 100644 demo/js/core/layout/demo.vertical.js delete mode 100644 demo/js/core/layout/demo.vertical_adapt.js delete mode 100644 demo/js/core/layout/demo.vtape.js delete mode 100644 demo/js/core/layout/index.js delete mode 100644 demo/js/core/popup/demo.layer.js delete mode 100644 demo/js/core/popup/demo.popover.js delete mode 100644 demo/js/core/popup/demo.popup_view.js delete mode 100644 demo/js/core/popup/demo.searcher_view.js delete mode 100644 demo/js/core/popup/index.js delete mode 100644 demo/js/face.js delete mode 100644 demo/js/fix-2.0/computed.js delete mode 100644 demo/js/fix-2.0/context.js delete mode 100644 demo/js/fix-2.0/define.js delete mode 100644 demo/js/fix-2.0/demo.js delete mode 100644 demo/js/fix-2.0/globalwatcher.js delete mode 100644 demo/js/fix-2.0/index.js delete mode 100644 demo/js/fix-2.0/inject.js delete mode 100644 demo/js/fix-2.0/scene.js delete mode 100644 demo/js/fix-2.0/state.js delete mode 100644 demo/js/fix-2.0/store.js delete mode 100644 demo/js/fix-2.0/watcher.js delete mode 100644 demo/js/index.js delete mode 100644 demo/js/main.js delete mode 100644 demo/js/main.store.js delete mode 100644 demo/js/north.js delete mode 100644 demo/js/preview.js delete mode 100644 demo/js/router.js delete mode 100644 demo/js/west.js delete mode 100644 demo/js/widget/basewidget/demo.buttons.js delete mode 100644 demo/js/widget/basewidget/demo.items.js delete mode 100644 demo/js/widget/basewidget/demo.nodes.js delete mode 100644 demo/js/widget/basewidget/demo.sagments.js delete mode 100644 demo/js/widget/basewidget/demo.tips.js delete mode 100644 demo/js/widget/basewidget/index.js delete mode 100644 demo/js/widget/collapase/API.md delete mode 100644 demo/js/widget/collapase/demo.collapse.js delete mode 100644 demo/js/widget/collapase/index.js delete mode 100644 demo/js/widget/date/demo.datepane.js delete mode 100644 demo/js/widget/date/demo.multidate_combo.js delete mode 100644 demo/js/widget/datetime/demo.datetime.js delete mode 100644 demo/js/widget/downlist/demo.downlist.icon.js delete mode 100644 demo/js/widget/downlist/demo.downlist.js delete mode 100644 demo/js/widget/editor/demo.search_editor.js delete mode 100644 demo/js/widget/editor/demo.text_editor.js delete mode 100644 demo/js/widget/index.js delete mode 100644 demo/js/widget/multiselect/demo.multi_select_combo.js delete mode 100644 demo/js/widget/multiselect/demo.multi_select_list.js delete mode 100644 demo/js/widget/multitree/demo.multi_tree_combo.js delete mode 100644 demo/js/widget/multitree/demo.multi_tree_list.js delete mode 100644 demo/js/widget/numbereditor/demo.number_editor.js delete mode 100644 demo/js/widget/numberinterval/demo.number_interval.js delete mode 100644 demo/js/widget/selecttree/demo.multilayer_select_tree_combo.js delete mode 100644 demo/js/widget/selecttree/demo.select_tree_combo.js delete mode 100644 demo/js/widget/singleselct/demo.single_select_combo.js delete mode 100644 demo/js/widget/singletree/demo.multilayer_single_tree_combo.js delete mode 100644 demo/js/widget/singletree/demo.single_tree_combo.js delete mode 100644 demo/js/widget/slider/demo.slider.js delete mode 100644 demo/js/widget/timecombo/demo.timecombo.js delete mode 100644 demo/js/widget/timeinterval/demo.time_interval.js delete mode 100644 demo/js/widget/tree/demo.multilayer_select_level_tree.js delete mode 100644 demo/js/widget/tree/demo.multilayer_single_level_tree.js delete mode 100644 demo/js/widget/tree/demo.select_level_tree.js delete mode 100644 demo/js/widget/tree/demo.single_level_tree.js delete mode 100644 demo/js/widget/year/demo.year.js delete mode 100644 demo/js/widget/yearinterval/demo.year_interval.js delete mode 100644 demo/js/widget/yearmonth/demo.year_month_combo.js delete mode 100644 demo/js/widget/yearmonthinterval/demo.year_month_interval.js delete mode 100644 demo/js/widget/yearquarter/demo.year_quarter_combo.js delete mode 100644 demo/js/widget/yearquarterinterval/demo.yearquarterinterval.js delete mode 100644 demo/less/center.less delete mode 100644 demo/less/face.less delete mode 100644 demo/less/index.less delete mode 100644 demo/less/main.less delete mode 100644 demo/less/north.less delete mode 100644 demo/less/preview.less delete mode 100644 demo/less/vm.less delete mode 100644 demo/less/west.less delete mode 100644 demo/version.js delete mode 100644 dist/README.md delete mode 100644 dist/fix/fix.compact.js delete mode 100644 dist/fix/fix.js delete mode 100644 dist/fix/fix.proxy.js delete mode 100644 dist/fix/worker.compact.js delete mode 100644 dist/font/iconfont.eot delete mode 100644 dist/font/iconfont.svg delete mode 100644 dist/font/iconfont.ttf delete mode 100644 dist/font/iconfont.woff delete mode 100644 dist/font/iconfont.woff2 delete mode 100644 dist/images/1x/background/auto_color.png delete mode 100644 dist/images/1x/background/auto_color_disable.png delete mode 100644 dist/images/1x/background/auto_color_normal.png delete mode 100644 dist/images/1x/background/auto_color_normal_disable.png delete mode 100644 dist/images/1x/background/auto_color_normal_select.png delete mode 100644 dist/images/1x/background/auto_color_select.png delete mode 100644 dist/images/1x/background/line_conn.gif delete mode 100644 dist/images/1x/background/trans_color.png delete mode 100644 dist/images/1x/background/trans_disable.png delete mode 100644 dist/images/1x/background/trans_normal.png delete mode 100644 dist/images/1x/background/trans_select.png delete mode 100644 dist/images/1x/icon/auto_no_square_normal.png delete mode 100644 dist/images/1x/icon/auto_square_normal.png delete mode 100644 dist/images/1x/icon/check_box_active.png delete mode 100644 dist/images/1x/icon/check_box_disable.png delete mode 100644 dist/images/1x/icon/check_box_disable2.png delete mode 100644 dist/images/1x/icon/check_box_hover.png delete mode 100644 dist/images/1x/icon/check_box_normal.png delete mode 100644 dist/images/1x/icon/dark/auto_square_normal.png delete mode 100755 dist/images/1x/icon/dark/trans_normal.png delete mode 100755 dist/images/1x/icon/dark/trans_select.png delete mode 100644 dist/images/1x/icon/dark/tree_collapse_1.png delete mode 100644 dist/images/1x/icon/dark/tree_collapse_2.png delete mode 100644 dist/images/1x/icon/dark/tree_collapse_3.png delete mode 100644 dist/images/1x/icon/dark/tree_collapse_4.png delete mode 100644 dist/images/1x/icon/dark/tree_expand_1.png delete mode 100644 dist/images/1x/icon/dark/tree_expand_2.png delete mode 100644 dist/images/1x/icon/dark/tree_expand_3.png delete mode 100644 dist/images/1x/icon/dark/tree_expand_4.png delete mode 100644 dist/images/1x/icon/dark/tree_solid_collapse_1.png delete mode 100644 dist/images/1x/icon/dark/tree_solid_collapse_2.png delete mode 100644 dist/images/1x/icon/dark/tree_solid_collapse_3.png delete mode 100644 dist/images/1x/icon/dark/tree_solid_collapse_4.png delete mode 100644 dist/images/1x/icon/dark/tree_solid_collapse_5.png delete mode 100644 dist/images/1x/icon/dark/tree_solid_expand_1.png delete mode 100644 dist/images/1x/icon/dark/tree_solid_expand_2.png delete mode 100644 dist/images/1x/icon/dark/tree_solid_expand_3.png delete mode 100644 dist/images/1x/icon/dark/tree_solid_expand_4.png delete mode 100644 dist/images/1x/icon/dark/tree_solid_expand_5.png delete mode 100644 dist/images/1x/icon/dark/tree_solid_vertical_line_1.png delete mode 100644 dist/images/1x/icon/dark/tree_solid_vertical_line_2.png delete mode 100644 dist/images/1x/icon/dark/tree_solid_vertical_line_3.png delete mode 100644 dist/images/1x/icon/dark/tree_solid_vertical_line_4.png delete mode 100644 dist/images/1x/icon/dark/tree_vertical_line_1.png delete mode 100644 dist/images/1x/icon/dark/tree_vertical_line_2.png delete mode 100644 dist/images/1x/icon/dark/tree_vertical_line_3.png delete mode 100644 dist/images/1x/icon/dark/tree_vertical_line_4.png delete mode 100644 dist/images/1x/icon/dark/tree_vertical_line_5.png delete mode 100644 dist/images/1x/icon/dots.png delete mode 100644 dist/images/1x/icon/half_selected.png delete mode 100644 dist/images/1x/icon/half_selected_disable.png delete mode 100644 dist/images/1x/icon/icon_down_arrow.png delete mode 100644 dist/images/1x/icon/loading.gif delete mode 100644 dist/images/1x/icon/push_down.png delete mode 100644 dist/images/1x/icon/push_up.png delete mode 100644 dist/images/1x/icon/radio_active.png delete mode 100644 dist/images/1x/icon/radio_disable.png delete mode 100644 dist/images/1x/icon/radio_disable2.png delete mode 100644 dist/images/1x/icon/radio_hover.png delete mode 100644 dist/images/1x/icon/radio_normal.png delete mode 100644 dist/images/1x/icon/slider_active.png delete mode 100644 dist/images/1x/icon/slider_active_small.png delete mode 100644 dist/images/1x/icon/slider_normal.png delete mode 100644 dist/images/1x/icon/slider_normal_small.png delete mode 100755 dist/images/1x/icon/trans_normal.png delete mode 100755 dist/images/1x/icon/trans_select.png delete mode 100644 dist/images/1x/icon/tree_collapse_1.png delete mode 100644 dist/images/1x/icon/tree_collapse_2.png delete mode 100644 dist/images/1x/icon/tree_collapse_3.png delete mode 100644 dist/images/1x/icon/tree_collapse_4.png delete mode 100644 dist/images/1x/icon/tree_expand_1.png delete mode 100644 dist/images/1x/icon/tree_expand_2.png delete mode 100644 dist/images/1x/icon/tree_expand_3.png delete mode 100644 dist/images/1x/icon/tree_expand_4.png delete mode 100644 dist/images/1x/icon/tree_solid_collapse_1.png delete mode 100644 dist/images/1x/icon/tree_solid_collapse_2.png delete mode 100644 dist/images/1x/icon/tree_solid_collapse_3.png delete mode 100644 dist/images/1x/icon/tree_solid_collapse_4.png delete mode 100644 dist/images/1x/icon/tree_solid_collapse_5.png delete mode 100644 dist/images/1x/icon/tree_solid_expand_1.png delete mode 100644 dist/images/1x/icon/tree_solid_expand_2.png delete mode 100644 dist/images/1x/icon/tree_solid_expand_3.png delete mode 100644 dist/images/1x/icon/tree_solid_expand_4.png delete mode 100644 dist/images/1x/icon/tree_solid_expand_5.png delete mode 100644 dist/images/1x/icon/tree_solid_vertical_line_1.png delete mode 100644 dist/images/1x/icon/tree_solid_vertical_line_2.png delete mode 100644 dist/images/1x/icon/tree_solid_vertical_line_3.png delete mode 100644 dist/images/1x/icon/tree_solid_vertical_line_4.png delete mode 100644 dist/images/1x/icon/tree_vertical_line_1.png delete mode 100644 dist/images/1x/icon/tree_vertical_line_2.png delete mode 100644 dist/images/1x/icon/tree_vertical_line_3.png delete mode 100644 dist/images/1x/icon/tree_vertical_line_4.png delete mode 100644 dist/images/1x/icon/tree_vertical_line_5.png delete mode 100644 dist/images/1x/icon/wave_loading.gif delete mode 100644 dist/images/2x/background/auto_color_disable.png delete mode 100644 dist/images/2x/background/auto_color_normal.png delete mode 100644 dist/images/2x/background/auto_color_select.png delete mode 100644 dist/images/2x/background/line_conn.gif delete mode 100644 dist/images/2x/background/trans_normal.png delete mode 100644 dist/images/2x/icon/auto_no_square_normal.png delete mode 100644 dist/images/2x/icon/auto_normal.png delete mode 100644 dist/images/2x/icon/auto_select.png delete mode 100644 dist/images/2x/icon/auto_square_normal.png delete mode 100644 dist/images/2x/icon/check_box_active.png delete mode 100644 dist/images/2x/icon/check_box_disable.png delete mode 100644 dist/images/2x/icon/check_box_disable2.png delete mode 100644 dist/images/2x/icon/check_box_hover.png delete mode 100644 dist/images/2x/icon/check_box_normal.png delete mode 100644 dist/images/2x/icon/dark/auto_square_normal.png delete mode 100755 dist/images/2x/icon/dark/trans_normal.png delete mode 100755 dist/images/2x/icon/dark/trans_select.png delete mode 100644 dist/images/2x/icon/dark/tree_collapse_1.png delete mode 100644 dist/images/2x/icon/dark/tree_collapse_2.png delete mode 100644 dist/images/2x/icon/dark/tree_collapse_3.png delete mode 100644 dist/images/2x/icon/dark/tree_collapse_4.png delete mode 100644 dist/images/2x/icon/dark/tree_expand_1.png delete mode 100644 dist/images/2x/icon/dark/tree_expand_2.png delete mode 100644 dist/images/2x/icon/dark/tree_expand_3.png delete mode 100644 dist/images/2x/icon/dark/tree_expand_4.png delete mode 100644 dist/images/2x/icon/dark/tree_solid_collapse_1.png delete mode 100644 dist/images/2x/icon/dark/tree_solid_collapse_2.png delete mode 100644 dist/images/2x/icon/dark/tree_solid_collapse_3.png delete mode 100644 dist/images/2x/icon/dark/tree_solid_collapse_4.png delete mode 100644 dist/images/2x/icon/dark/tree_solid_collapse_5.png delete mode 100644 dist/images/2x/icon/dark/tree_solid_expand_1.png delete mode 100644 dist/images/2x/icon/dark/tree_solid_expand_2.png delete mode 100644 dist/images/2x/icon/dark/tree_solid_expand_3.png delete mode 100644 dist/images/2x/icon/dark/tree_solid_expand_4.png delete mode 100644 dist/images/2x/icon/dark/tree_solid_expand_5.png delete mode 100644 dist/images/2x/icon/dark/tree_solid_vertical_line_1.png delete mode 100644 dist/images/2x/icon/dark/tree_solid_vertical_line_2.png delete mode 100644 dist/images/2x/icon/dark/tree_solid_vertical_line_3.png delete mode 100644 dist/images/2x/icon/dark/tree_solid_vertical_line_4.png delete mode 100644 dist/images/2x/icon/dark/tree_vertical_line_1.png delete mode 100644 dist/images/2x/icon/dark/tree_vertical_line_2.png delete mode 100644 dist/images/2x/icon/dark/tree_vertical_line_3.png delete mode 100644 dist/images/2x/icon/dark/tree_vertical_line_4.png delete mode 100644 dist/images/2x/icon/dark/tree_vertical_line_5.png delete mode 100644 dist/images/2x/icon/dots.png delete mode 100644 dist/images/2x/icon/half_selected.png delete mode 100644 dist/images/2x/icon/half_selected_disable.png delete mode 100644 dist/images/2x/icon/icon_down_arrow.png delete mode 100644 dist/images/2x/icon/loading.gif delete mode 100644 dist/images/2x/icon/push_down.png delete mode 100644 dist/images/2x/icon/push_up.png delete mode 100644 dist/images/2x/icon/radio_active.png delete mode 100644 dist/images/2x/icon/radio_disable.png delete mode 100644 dist/images/2x/icon/radio_disable2.png delete mode 100644 dist/images/2x/icon/radio_hover.png delete mode 100644 dist/images/2x/icon/radio_normal.png delete mode 100644 dist/images/2x/icon/slider_active.png delete mode 100644 dist/images/2x/icon/slider_active_small.png delete mode 100644 dist/images/2x/icon/slider_normal.png delete mode 100644 dist/images/2x/icon/slider_normal_small.png delete mode 100755 dist/images/2x/icon/trans_normal.png delete mode 100755 dist/images/2x/icon/trans_select.png delete mode 100644 dist/images/2x/icon/tree_collapse_1.png delete mode 100644 dist/images/2x/icon/tree_collapse_2.png delete mode 100644 dist/images/2x/icon/tree_collapse_3.png delete mode 100644 dist/images/2x/icon/tree_collapse_4.png delete mode 100644 dist/images/2x/icon/tree_expand_1.png delete mode 100644 dist/images/2x/icon/tree_expand_2.png delete mode 100644 dist/images/2x/icon/tree_expand_3.png delete mode 100644 dist/images/2x/icon/tree_expand_4.png delete mode 100644 dist/images/2x/icon/tree_solid_collapse_1.png delete mode 100644 dist/images/2x/icon/tree_solid_collapse_2.png delete mode 100644 dist/images/2x/icon/tree_solid_collapse_3.png delete mode 100644 dist/images/2x/icon/tree_solid_collapse_4.png delete mode 100644 dist/images/2x/icon/tree_solid_collapse_5.png delete mode 100644 dist/images/2x/icon/tree_solid_expand_1.png delete mode 100644 dist/images/2x/icon/tree_solid_expand_2.png delete mode 100644 dist/images/2x/icon/tree_solid_expand_3.png delete mode 100644 dist/images/2x/icon/tree_solid_expand_4.png delete mode 100644 dist/images/2x/icon/tree_solid_expand_5.png delete mode 100644 dist/images/2x/icon/tree_solid_vertical_line_1.png delete mode 100644 dist/images/2x/icon/tree_solid_vertical_line_2.png delete mode 100644 dist/images/2x/icon/tree_solid_vertical_line_3.png delete mode 100644 dist/images/2x/icon/tree_solid_vertical_line_4.png delete mode 100644 dist/images/2x/icon/tree_vertical_line_1.png delete mode 100644 dist/images/2x/icon/tree_vertical_line_2.png delete mode 100644 dist/images/2x/icon/tree_vertical_line_3.png delete mode 100644 dist/images/2x/icon/tree_vertical_line_4.png delete mode 100644 dist/images/2x/icon/tree_vertical_line_5.png delete mode 100644 dist/images/2x/icon/wave_loading.gif delete mode 100644 examples/ThemeProvider.html delete mode 100644 examples/config-render.html delete mode 100644 examples/demo.worker.js delete mode 100644 examples/dev.html delete mode 100644 examples/effect.html delete mode 100644 examples/hooks.html delete mode 100644 examples/loader-context.html delete mode 100644 examples/resize.html delete mode 100644 examples/style.html delete mode 100644 examples/tab-context.html delete mode 100644 examples/test-id.html delete mode 100644 examples/useContext.html delete mode 100644 examples/virtual-group.html delete mode 100644 examples/visible.html delete mode 100644 examples/worker.html delete mode 100644 examples/worker_new.html delete mode 100644 examples/worker_new/index.js delete mode 100644 examples/worker_new/worker.js delete mode 100644 examples/响应式布局.html delete mode 100644 examples/插件设计.html delete mode 100644 examples/替换loading动画.html delete mode 100644 i18n/i18n.cn.js delete mode 100644 i18n/i18n.en.js delete mode 100644 index.html delete mode 100644 jsy.lessconfig.json delete mode 100644 karma.conf.js delete mode 100644 lib/postbuild/postbuild.js delete mode 100644 lib/postpublish/postpublish.js delete mode 100644 lib/prepublish/prepublish.js delete mode 100644 lodash.md create mode 100644 packages/demo/babel.config.js create mode 100644 packages/demo/i18n/i18n.cn.js create mode 100644 packages/demo/i18n/i18n.en.js create mode 100644 packages/demo/index.html create mode 100644 packages/demo/jsconfig.json create mode 100644 packages/demo/package.json rename {demo/js => packages/demo/src}/case/combo/demo.bubble_combo.js (100%) rename {demo/js => packages/demo/src}/case/combo/demo.editor_icon_check_combo.js (100%) rename {demo/js => packages/demo/src}/case/combo/demo.icon_combo.js (100%) rename {demo/js => packages/demo/src}/case/combo/demo.icon_text_value_combo.js (100%) create mode 100644 packages/demo/src/case/combo/demo.search_text_value_combo.js rename {demo/js => packages/demo/src}/case/combo/demo.text_value_combo.js (100%) rename {demo/js => packages/demo/src}/case/combo/demo.text_value_down_list_combo.js (100%) create mode 100644 packages/demo/src/case/combo/demo.text_vlaue_check_combo.js rename {demo/js => packages/demo/src}/case/combo/index.js (100%) rename {demo/js => packages/demo/src}/case/demo.calendar.js (100%) rename {demo/js => packages/demo/src}/case/demo.click.effect.js (100%) rename {demo/js => packages/demo/src}/case/demo.color_chooser.js (100%) rename {demo/js => packages/demo/src}/case/demo.color_chooser_popup.js (100%) rename {demo/js => packages/demo/src}/case/demo.segment.js (100%) rename {demo/js => packages/demo/src}/case/editor/demo.clear_editor.js (100%) rename {demo/js => packages/demo/src}/case/editor/demo.shelter_editor.js (100%) rename {demo/js => packages/demo/src}/case/editor/demo.sign_editor.js (100%) rename {demo/js => packages/demo/src}/case/editor/demo.simple_state_editor.js (100%) rename {demo/js => packages/demo/src}/case/editor/demo.state_editor.js (100%) rename {demo/js => packages/demo/src}/case/editor/index.js (100%) create mode 100644 packages/demo/src/case/index.js rename {demo/js => packages/demo/src}/case/item/demo.multi_select_item.js (100%) rename {demo/js => packages/demo/src}/case/item/demo.single_select_item.js (100%) rename {demo/js => packages/demo/src}/case/item/demo.single_select_radio_item.js (100%) rename {demo/js => packages/demo/src}/case/item/index.js (100%) create mode 100644 packages/demo/src/case/list/demo.lazy_loader.js create mode 100644 packages/demo/src/case/list/demo.select_list.js rename {demo/js => packages/demo/src}/case/list/index.js (100%) rename {demo/js => packages/demo/src}/case/pager/demo.all_count_pager.js (100%) rename {demo/js => packages/demo/src}/case/pager/demo.direction_pager.js (100%) rename {demo/js => packages/demo/src}/case/pager/index.js (100%) create mode 100644 packages/demo/src/case/pane/demo.list_pane.js create mode 100644 packages/demo/src/case/pane/demo.multi_popup_view.js create mode 100644 packages/demo/src/case/pane/demo.panel.js create mode 100644 packages/demo/src/case/pane/demo.popup_panel.js rename {demo/js => packages/demo/src}/case/pane/index.js (100%) rename {demo/js => packages/demo/src}/case/tree/demo.display_tree.js (100%) create mode 100644 packages/demo/src/case/tree/demo.level_tree.js create mode 100644 packages/demo/src/case/tree/demo.simple_tree.js rename {demo/js => packages/demo/src}/case/tree/index.js (100%) rename {demo/js => packages/demo/src}/case/triggers/demo.editor_trigger.js (100%) rename {demo/js => packages/demo/src}/case/triggers/demo.icon_trigger.js (100%) rename {demo/js => packages/demo/src}/case/triggers/demo.select_text_trigger.js (100%) rename {demo/js => packages/demo/src}/case/triggers/demo.text_trigger.js (100%) rename {demo/js => packages/demo/src}/case/triggers/index.js (100%) create mode 100644 packages/demo/src/center.js create mode 100644 packages/demo/src/config/base.js create mode 100644 packages/demo/src/config/constant.js create mode 100644 packages/demo/src/config/core.js create mode 100644 packages/demo/src/config/index.js create mode 100644 packages/demo/src/config/utils.js create mode 100644 packages/demo/src/demo/base/button/demo.button.js create mode 100644 packages/demo/src/demo/base/button/demo.icon_button.js create mode 100644 packages/demo/src/demo/base/button/demo.image_button.js create mode 100644 packages/demo/src/demo/base/button/demo.text_button.js create mode 100644 packages/demo/src/demo/base/button/index.js create mode 100644 packages/demo/src/demo/base/demo.html.js create mode 100644 packages/demo/src/demo/base/demo.icon_label.js create mode 100644 packages/demo/src/demo/base/demo.label.js create mode 100644 packages/demo/src/demo/base/demo.label.scene.js create mode 100644 packages/demo/src/demo/base/demo.message.js create mode 100644 packages/demo/src/demo/base/demo.pager.js create mode 100644 packages/demo/src/demo/base/editor/demo.editor.js create mode 100644 packages/demo/src/demo/base/editor/demo.multifile_editor.js create mode 100644 packages/demo/src/demo/base/editor/demo.textarea_editor.js rename {demo/js => packages/demo/src/demo}/base/editor/index.js (100%) create mode 100644 packages/demo/src/demo/base/index.js create mode 100644 packages/demo/src/demo/base/tip/demo.bubble.js create mode 100644 packages/demo/src/demo/base/tip/demo.title.js create mode 100644 packages/demo/src/demo/base/tip/demo.toast.js rename {demo/js => packages/demo/src/demo}/base/tip/index.js (100%) create mode 100644 packages/demo/src/demo/base/tree/demo.part_tree.js create mode 100644 packages/demo/src/demo/base/tree/demo.sync_tree.js create mode 100644 packages/demo/src/demo/base/tree/demo.tree_view.js rename {demo/js => packages/demo/src/demo}/base/tree/index.js (100%) create mode 100644 packages/demo/src/demo/case/combo/demo.bubble_combo.js create mode 100644 packages/demo/src/demo/case/combo/demo.editor_icon_check_combo.js create mode 100644 packages/demo/src/demo/case/combo/demo.icon_combo.js create mode 100644 packages/demo/src/demo/case/combo/demo.icon_text_value_combo.js create mode 100644 packages/demo/src/demo/case/combo/demo.search_text_value_combo.js create mode 100644 packages/demo/src/demo/case/combo/demo.text_value_combo.js create mode 100644 packages/demo/src/demo/case/combo/demo.text_value_down_list_combo.js create mode 100644 packages/demo/src/demo/case/combo/demo.text_vlaue_check_combo.js create mode 100644 packages/demo/src/demo/case/combo/index.js create mode 100644 packages/demo/src/demo/case/demo.calendar.js create mode 100644 packages/demo/src/demo/case/demo.click.effect.js create mode 100644 packages/demo/src/demo/case/demo.color_chooser.js create mode 100644 packages/demo/src/demo/case/demo.color_chooser_popup.js create mode 100644 packages/demo/src/demo/case/demo.segment.js create mode 100644 packages/demo/src/demo/case/editor/demo.clear_editor.js create mode 100644 packages/demo/src/demo/case/editor/demo.shelter_editor.js create mode 100644 packages/demo/src/demo/case/editor/demo.sign_editor.js create mode 100644 packages/demo/src/demo/case/editor/demo.simple_state_editor.js create mode 100644 packages/demo/src/demo/case/editor/demo.state_editor.js create mode 100644 packages/demo/src/demo/case/editor/index.js create mode 100644 packages/demo/src/demo/case/index.js create mode 100644 packages/demo/src/demo/case/item/demo.multi_select_item.js create mode 100644 packages/demo/src/demo/case/item/demo.single_select_item.js create mode 100644 packages/demo/src/demo/case/item/demo.single_select_radio_item.js create mode 100644 packages/demo/src/demo/case/item/index.js create mode 100644 packages/demo/src/demo/case/list/demo.lazy_loader.js create mode 100644 packages/demo/src/demo/case/list/demo.select_list.js create mode 100644 packages/demo/src/demo/case/list/index.js create mode 100644 packages/demo/src/demo/case/pager/demo.all_count_pager.js create mode 100644 packages/demo/src/demo/case/pager/demo.direction_pager.js create mode 100644 packages/demo/src/demo/case/pager/index.js create mode 100644 packages/demo/src/demo/case/pane/demo.list_pane.js create mode 100644 packages/demo/src/demo/case/pane/demo.multi_popup_view.js create mode 100644 packages/demo/src/demo/case/pane/demo.panel.js create mode 100644 packages/demo/src/demo/case/pane/demo.popup_panel.js create mode 100644 packages/demo/src/demo/case/pane/index.js create mode 100644 packages/demo/src/demo/case/tree/demo.display_tree.js create mode 100644 packages/demo/src/demo/case/tree/demo.level_tree.js create mode 100644 packages/demo/src/demo/case/tree/demo.simple_tree.js create mode 100644 packages/demo/src/demo/case/tree/index.js create mode 100644 packages/demo/src/demo/case/triggers/demo.editor_trigger.js create mode 100644 packages/demo/src/demo/case/triggers/demo.icon_trigger.js create mode 100644 packages/demo/src/demo/case/triggers/demo.select_text_trigger.js create mode 100644 packages/demo/src/demo/case/triggers/demo.text_trigger.js create mode 100644 packages/demo/src/demo/case/triggers/index.js create mode 100644 packages/demo/src/demo/component/demo.form.js create mode 100644 packages/demo/src/demo/component/demo.treevaluechoosercombo.js create mode 100644 packages/demo/src/demo/component/demo.treevaluechooserpane.js create mode 100644 packages/demo/src/demo/component/demo.valuechoosercombo.js create mode 100644 packages/demo/src/demo/component/demo.valuechooserpane.js create mode 100644 packages/demo/src/demo/component/index.js create mode 100644 packages/demo/src/demo/core/abstract/combination/demo.combo.js create mode 100644 packages/demo/src/demo/core/abstract/combination/demo.combo2.js create mode 100644 packages/demo/src/demo/core/abstract/combination/demo.combo3.js create mode 100644 packages/demo/src/demo/core/abstract/combination/demo.combo_group.js create mode 100644 packages/demo/src/demo/core/abstract/combination/demo.expander.js create mode 100644 packages/demo/src/demo/core/abstract/combination/demo.loader.js create mode 100644 packages/demo/src/demo/core/abstract/combination/demo.navigation.js create mode 100644 packages/demo/src/demo/core/abstract/combination/demo.sercher.js create mode 100644 packages/demo/src/demo/core/abstract/combination/demo.switcher.js create mode 100644 packages/demo/src/demo/core/abstract/combination/demo.tab.js rename {demo/js => packages/demo/src/demo}/core/abstract/combination/index.js (100%) create mode 100644 packages/demo/src/demo/core/abstract/demo.button_group.js create mode 100644 packages/demo/src/demo/core/abstract/demo.button_tree.js create mode 100644 packages/demo/src/demo/core/abstract/demo.collection_view.js create mode 100644 packages/demo/src/demo/core/abstract/demo.custom_tree.js create mode 100644 packages/demo/src/demo/core/abstract/demo.grid_view.js create mode 100644 packages/demo/src/demo/core/abstract/demo.list_view.js create mode 100644 packages/demo/src/demo/core/abstract/demo.virtual_group.js create mode 100644 packages/demo/src/demo/core/abstract/demo.virtual_group_item.js create mode 100644 packages/demo/src/demo/core/abstract/demo.virtual_list.js create mode 100644 packages/demo/src/demo/core/abstract/index.js create mode 100644 packages/demo/src/demo/core/index.js create mode 100644 packages/demo/src/demo/core/layout/demo.absolute.js create mode 100644 packages/demo/src/demo/core/layout/demo.border.js create mode 100644 packages/demo/src/demo/core/layout/demo.center_adapt.js create mode 100644 packages/demo/src/demo/core/layout/demo.float_center.js create mode 100644 packages/demo/src/demo/core/layout/demo.flow.js create mode 100644 packages/demo/src/demo/core/layout/demo.grid.js create mode 100644 packages/demo/src/demo/core/layout/demo.horizontal.js create mode 100644 packages/demo/src/demo/core/layout/demo.horizontal_adapt.js create mode 100644 packages/demo/src/demo/core/layout/demo.horizontal_auto.js create mode 100644 packages/demo/src/demo/core/layout/demo.horizontal_float.js create mode 100644 packages/demo/src/demo/core/layout/demo.htape.js create mode 100644 packages/demo/src/demo/core/layout/demo.left_right_vertical_adapt.js create mode 100644 packages/demo/src/demo/core/layout/demo.table.js create mode 100644 packages/demo/src/demo/core/layout/demo.td.js create mode 100644 packages/demo/src/demo/core/layout/demo.vertical.js create mode 100644 packages/demo/src/demo/core/layout/demo.vertical_adapt.js create mode 100644 packages/demo/src/demo/core/layout/demo.vtape.js create mode 100644 packages/demo/src/demo/core/layout/index.js create mode 100644 packages/demo/src/demo/core/popup/demo.layer.js create mode 100644 packages/demo/src/demo/core/popup/demo.popover.js create mode 100644 packages/demo/src/demo/core/popup/demo.popup_view.js create mode 100644 packages/demo/src/demo/core/popup/demo.searcher_view.js create mode 100644 packages/demo/src/demo/core/popup/index.js create mode 100644 packages/demo/src/demo/fix-2.0/context.js create mode 100644 packages/demo/src/demo/fix-2.0/define.js create mode 100644 packages/demo/src/demo/fix-2.0/index.js create mode 100644 packages/demo/src/demo/index.js rename plugins/webpack-fui-worker-plugin/empty.js => packages/demo/src/demo/slides.js (100%) create mode 100644 packages/demo/src/demo/widget/basewidget/demo.buttons.js create mode 100644 packages/demo/src/demo/widget/basewidget/demo.items.js create mode 100644 packages/demo/src/demo/widget/basewidget/demo.nodes.js create mode 100644 packages/demo/src/demo/widget/basewidget/demo.sagments.js create mode 100644 packages/demo/src/demo/widget/basewidget/demo.tips.js create mode 100644 packages/demo/src/demo/widget/basewidget/index.js create mode 100644 packages/demo/src/demo/widget/collapase/demo.collapse.js create mode 100644 packages/demo/src/demo/widget/collapase/index.js create mode 100644 packages/demo/src/demo/widget/date/demo.datepane.js create mode 100644 packages/demo/src/demo/widget/date/demo.multidate_combo.js rename {demo/js => packages/demo/src/demo}/widget/date/index.js (100%) create mode 100644 packages/demo/src/demo/widget/datetime/demo.datetime.js rename {demo/js => packages/demo/src/demo}/widget/datetime/index.js (100%) create mode 100644 packages/demo/src/demo/widget/downlist/demo.downlist.icon.js create mode 100644 packages/demo/src/demo/widget/downlist/demo.downlist.js rename {demo/js => packages/demo/src/demo}/widget/downlist/index.js (100%) create mode 100644 packages/demo/src/demo/widget/editor/demo.search_editor.js create mode 100644 packages/demo/src/demo/widget/editor/demo.text_editor.js rename {demo/js => packages/demo/src/demo}/widget/editor/index.js (100%) create mode 100644 packages/demo/src/demo/widget/index.js create mode 100644 packages/demo/src/demo/widget/multiselect/demo.multi_select_combo.js create mode 100644 packages/demo/src/demo/widget/multiselect/demo.multi_select_list.js rename {demo/js => packages/demo/src/demo}/widget/multiselect/index.js (100%) create mode 100644 packages/demo/src/demo/widget/multitree/demo.multi_tree_combo.js create mode 100644 packages/demo/src/demo/widget/multitree/demo.multi_tree_list.js rename {demo/js => packages/demo/src/demo}/widget/multitree/index.js (100%) create mode 100644 packages/demo/src/demo/widget/numbereditor/demo.number_editor.js rename {demo/js => packages/demo/src/demo}/widget/numbereditor/index.js (100%) create mode 100644 packages/demo/src/demo/widget/numberinterval/demo.number_interval.js rename {demo/js => packages/demo/src/demo}/widget/numberinterval/index.js (100%) create mode 100644 packages/demo/src/demo/widget/selecttree/demo.multilayer_select_tree_combo.js create mode 100644 packages/demo/src/demo/widget/selecttree/demo.select_tree_combo.js rename {demo/js => packages/demo/src/demo}/widget/selecttree/index.js (100%) create mode 100644 packages/demo/src/demo/widget/singleselct/demo.single_select_combo.js rename {demo/js => packages/demo/src/demo}/widget/singleselct/index.js (100%) create mode 100644 packages/demo/src/demo/widget/singletree/demo.multilayer_single_tree_combo.js create mode 100644 packages/demo/src/demo/widget/singletree/demo.single_tree_combo.js rename {demo/js => packages/demo/src/demo}/widget/singletree/index.js (100%) create mode 100644 packages/demo/src/demo/widget/slider/demo.slider.js rename {demo/js => packages/demo/src/demo}/widget/slider/index.js (100%) create mode 100644 packages/demo/src/demo/widget/timecombo/demo.timecombo.js rename {demo/js => packages/demo/src/demo}/widget/timecombo/index.js (100%) create mode 100644 packages/demo/src/demo/widget/timeinterval/demo.time_interval.js rename {demo/js => packages/demo/src/demo}/widget/timeinterval/index.js (100%) create mode 100644 packages/demo/src/demo/widget/tree/demo.multilayer_select_level_tree.js create mode 100644 packages/demo/src/demo/widget/tree/demo.multilayer_single_level_tree.js create mode 100644 packages/demo/src/demo/widget/tree/demo.select_level_tree.js create mode 100644 packages/demo/src/demo/widget/tree/demo.single_level_tree.js rename {demo/js => packages/demo/src/demo}/widget/tree/index.js (100%) create mode 100644 packages/demo/src/demo/widget/year/demo.year.js rename {demo/js => packages/demo/src/demo}/widget/year/index.js (100%) create mode 100644 packages/demo/src/demo/widget/yearinterval/demo.year_interval.js rename {demo/js => packages/demo/src/demo}/widget/yearinterval/index.js (100%) create mode 100644 packages/demo/src/demo/widget/yearmonth/demo.year_month_combo.js rename {demo/js => packages/demo/src/demo}/widget/yearmonth/index.js (100%) create mode 100644 packages/demo/src/demo/widget/yearmonthinterval/demo.year_month_interval.js rename {demo/js => packages/demo/src/demo}/widget/yearmonthinterval/index.js (100%) create mode 100644 packages/demo/src/demo/widget/yearquarter/demo.year_quarter_combo.js rename {demo/js => packages/demo/src/demo}/widget/yearquarter/index.js (100%) create mode 100644 packages/demo/src/demo/widget/yearquarterinterval/demo.yearquarterinterval.js rename {demo/js => packages/demo/src/demo}/widget/yearquarterinterval/index.js (100%) create mode 100644 packages/demo/src/face.js create mode 100644 packages/demo/src/index.js create mode 100644 packages/demo/src/less/face.less create mode 100644 packages/demo/src/less/fineui.less create mode 100644 packages/demo/src/less/index.less create mode 100644 packages/demo/src/less/main.less create mode 100644 packages/demo/src/less/north.less create mode 100644 packages/demo/src/less/preview.less create mode 100644 packages/demo/src/less/vm.less create mode 100644 packages/demo/src/less/west.less create mode 100644 packages/demo/src/main.js create mode 100644 packages/demo/src/north.js create mode 100644 packages/demo/src/west.js create mode 100644 packages/demo/webpack.dev.js create mode 100644 packages/fineui/babel.config.js rename es6.babel.js => packages/fineui/esm.babel.js (100%) create mode 100644 packages/fineui/package.json create mode 100644 packages/fineui/src/base/0.base.js create mode 100644 packages/fineui/src/base/1.pane.js rename {src => packages/fineui/src}/base/behavior/0.behavior.js (100%) rename {src => packages/fineui/src}/base/behavior/behavior.highlight.js (100%) rename {src => packages/fineui/src}/base/behavior/behavior.redmark.js (100%) rename {src => packages/fineui/src}/base/behavior/index.js (100%) rename {src => packages/fineui/src}/base/collection/__test__/collection.test.js (100%) rename {src => packages/fineui/src}/base/collection/collection.js (100%) rename {src => packages/fineui/src}/base/combination/bubble.js (100%) rename {src => packages/fineui/src}/base/combination/combo.js (100%) rename {src => packages/fineui/src}/base/combination/expander.js (100%) rename {src => packages/fineui/src}/base/combination/group.button.js (100%) rename {src => packages/fineui/src}/base/combination/group.combo.js (100%) rename {src => packages/fineui/src}/base/combination/group.virtual.js (100%) rename {src => packages/fineui/src}/base/combination/index.js (100%) rename {src => packages/fineui/src}/base/combination/loader.js (100%) rename {src => packages/fineui/src}/base/combination/navigation.js (100%) rename {src => packages/fineui/src}/base/combination/searcher.js (100%) rename {src => packages/fineui/src}/base/combination/switcher.js (100%) rename {src => packages/fineui/src}/base/combination/tab.js (100%) rename {src => packages/fineui/src}/base/combination/tree.button.js (100%) rename {src => packages/fineui/src}/base/context.js (100%) rename {src => packages/fineui/src}/base/el.js (100%) rename {src => packages/fineui/src}/base/foundation/__test__/message.test.js (100%) rename {src => packages/fineui/src}/base/foundation/message.js (100%) rename {src => packages/fineui/src}/base/grid/__test__/grid.test.js (100%) rename {src => packages/fineui/src}/base/grid/grid.js (100%) rename {src => packages/fineui/src}/base/index.js (100%) rename {src => packages/fineui/src}/base/layer/__test__/layer.popover.test.js (100%) rename {src => packages/fineui/src}/base/layer/index.js (100%) rename {src => packages/fineui/src}/base/layer/layer.drawer.js (100%) rename {src => packages/fineui/src}/base/layer/layer.popover.js (100%) rename {src => packages/fineui/src}/base/layer/layer.popup.js (100%) rename {src => packages/fineui/src}/base/layer/layer.searcher.js (100%) rename {src => packages/fineui/src}/base/list/__test__/listview.test.js (100%) rename {src => packages/fineui/src}/base/list/index.js (100%) rename {src => packages/fineui/src}/base/list/listview.js (100%) rename {src => packages/fineui/src}/base/list/virtualgrouplist.js (100%) rename {src => packages/fineui/src}/base/list/virtuallist.js (100%) create mode 100644 packages/fineui/src/base/pager/pager.js rename {src => packages/fineui/src}/base/single/0.single.js (100%) rename {src => packages/fineui/src}/base/single/1.text.js (100%) rename {src => packages/fineui/src}/base/single/__test__/text.test.js (100%) rename {src => packages/fineui/src}/base/single/a/__test__/a.test.js (100%) rename {src => packages/fineui/src}/base/single/a/a.js (100%) rename {src => packages/fineui/src}/base/single/bar/bar.loading.js (100%) rename {src => packages/fineui/src}/base/single/button/button.basic.js (100%) rename {src => packages/fineui/src}/base/single/button/button.node.js (100%) rename {src => packages/fineui/src}/base/single/button/buttons/__test__/button.test.js (100%) rename {src => packages/fineui/src}/base/single/button/buttons/button.icon.js (100%) rename {src => packages/fineui/src}/base/single/button/buttons/button.image.js (100%) rename {src => packages/fineui/src}/base/single/button/buttons/button.js (100%) rename {src => packages/fineui/src}/base/single/button/buttons/button.text.js (100%) rename {src => packages/fineui/src}/base/single/button/index.js (100%) rename {src => packages/fineui/src}/base/single/button/listitem/blankiconicontextitem.js (100%) rename {src => packages/fineui/src}/base/single/button/listitem/blankicontexticonitem.js (100%) rename {src => packages/fineui/src}/base/single/button/listitem/blankicontextitem.js (100%) rename {src => packages/fineui/src}/base/single/button/listitem/icontexticonitem.js (100%) rename {src => packages/fineui/src}/base/single/button/listitem/icontextitem.js (100%) rename {src => packages/fineui/src}/base/single/button/listitem/texticonitem.js (100%) rename {src => packages/fineui/src}/base/single/button/listitem/textitem.js (100%) rename {src => packages/fineui/src}/base/single/button/node/__test__/icontexticonnode.test.js (100%) rename {src => packages/fineui/src}/base/single/button/node/__test__/icontextnode.test.js (100%) rename {src => packages/fineui/src}/base/single/button/node/__test__/texticonnode.test.js (100%) rename {src => packages/fineui/src}/base/single/button/node/__test__/textnode.test.js (100%) rename {src => packages/fineui/src}/base/single/button/node/icontexticonnode.js (100%) rename {src => packages/fineui/src}/base/single/button/node/icontextnode.js (100%) rename {src => packages/fineui/src}/base/single/button/node/texticonnode.js (100%) rename {src => packages/fineui/src}/base/single/button/node/textnode.js (100%) rename {src => packages/fineui/src}/base/single/editor/editor.js (100%) rename {src => packages/fineui/src}/base/single/editor/editor.multifile.js (100%) rename {src => packages/fineui/src}/base/single/editor/editor.textarea.js (100%) rename {src => packages/fineui/src}/base/single/editor/index.js (100%) rename {src => packages/fineui/src}/base/single/html/__test__/html.test.js (100%) rename {src => packages/fineui/src}/base/single/html/html.js (100%) rename {src => packages/fineui/src}/base/single/icon/icon.js (100%) rename {src => packages/fineui/src}/base/single/iframe/__test__/iframe.test.js (100%) rename {src => packages/fineui/src}/base/single/iframe/iframe.js (100%) rename {src => packages/fineui/src}/base/single/img/__test__/img.test.js (100%) rename {src => packages/fineui/src}/base/single/img/img.js (100%) rename {src => packages/fineui/src}/base/single/index.js (100%) rename {src => packages/fineui/src}/base/single/input/checkbox/checkbox.image.js (100%) rename {src => packages/fineui/src}/base/single/input/checkbox/checkbox.js (100%) rename {src => packages/fineui/src}/base/single/input/file.js (100%) rename {src => packages/fineui/src}/base/single/input/index.js (100%) rename {src => packages/fineui/src}/base/single/input/input.js (100%) rename {src => packages/fineui/src}/base/single/input/radio/radio.image.js (100%) rename {src => packages/fineui/src}/base/single/input/radio/radio.js (100%) rename {src => packages/fineui/src}/base/single/instruction/instruction.js (100%) rename {src => packages/fineui/src}/base/single/label/abstract.label.js (100%) rename {src => packages/fineui/src}/base/single/label/html.label.js (100%) rename {src => packages/fineui/src}/base/single/label/icon.label.js (100%) rename {src => packages/fineui/src}/base/single/label/index.js (100%) rename {src => packages/fineui/src}/base/single/label/label.js (100%) rename {src => packages/fineui/src}/base/single/link/__test__/link.test.js (100%) rename {src => packages/fineui/src}/base/single/link/link.js (100%) rename {src => packages/fineui/src}/base/single/text.pure.js (100%) rename {src => packages/fineui/src}/base/single/tip/0.tip.js (100%) rename {src => packages/fineui/src}/base/single/tip/index.js (100%) rename {src => packages/fineui/src}/base/single/tip/tip.toast.js (100%) rename {src => packages/fineui/src}/base/single/tip/tip.tooltip.js (100%) rename {src => packages/fineui/src}/base/single/trigger/trigger.js (100%) rename {src => packages/fineui/src}/base/tree/customtree.js (100%) rename {src => packages/fineui/src}/bundle.js (100%) rename {src => packages/fineui/src}/case/button/icon/icon.change.js (100%) rename {src => packages/fineui/src}/case/button/icon/icon.trigger.js (100%) rename {src => packages/fineui/src}/case/button/icon/iconhalf/icon.half.image.js (100%) rename {src => packages/fineui/src}/case/button/icon/iconhalf/icon.half.js (100%) rename {src => packages/fineui/src}/case/button/index.js (100%) rename {src => packages/fineui/src}/case/button/item.multiselect.js (100%) rename {src => packages/fineui/src}/case/button/item.singleselect.icontext.js (100%) rename {src => packages/fineui/src}/case/button/item.singleselect.js (100%) rename {src => packages/fineui/src}/case/button/item.singleselect.radio.js (100%) rename {src => packages/fineui/src}/case/button/node/__test__/node.arrow.test.js (100%) rename {src => packages/fineui/src}/case/button/node/__test__/node.first.plus.test.js (100%) rename {src => packages/fineui/src}/case/button/node/__test__/node.icon.arrow.test.js (100%) rename {src => packages/fineui/src}/case/button/node/__test__/node.last.plus.test.js (100%) rename {src => packages/fineui/src}/case/button/node/__test__/node.mid.plus.test.js (100%) rename {src => packages/fineui/src}/case/button/node/__test__/node.multilayer.icon.arrow.test.js (100%) rename {src => packages/fineui/src}/case/button/node/__test__/node.plus.test.js (100%) rename {src => packages/fineui/src}/case/button/node/node.arrow.js (100%) rename {src => packages/fineui/src}/case/button/node/node.icon.arrow.js (100%) rename {src => packages/fineui/src}/case/button/node/node.multilayer.icon.arrow.js (100%) rename {src => packages/fineui/src}/case/button/node/node.plus.js (100%) rename {src => packages/fineui/src}/case/button/node/siwtcher.tree.node.js (100%) rename {src => packages/fineui/src}/case/button/node/treenode.js (100%) rename {src => packages/fineui/src}/case/button/switch.js (100%) rename {src => packages/fineui/src}/case/button/treeitem/__test__/item.treeleaf.test.js (100%) rename {src => packages/fineui/src}/case/button/treeitem/item.icon.treeleaf.js (100%) rename {src => packages/fineui/src}/case/button/treeitem/item.multilayer.icon.treeleaf.js (100%) rename {src => packages/fineui/src}/case/button/treeitem/treeitem.js (100%) rename {src => packages/fineui/src}/case/calendar/calendar.date.item.js (100%) rename {src => packages/fineui/src}/case/calendar/calendar.js (100%) rename {src => packages/fineui/src}/case/calendar/calendar.year.js (100%) rename {src => packages/fineui/src}/case/calendar/index.js (100%) rename {src => packages/fineui/src}/case/checkbox/check.arrownode.js (100%) rename {src => packages/fineui/src}/case/checkbox/check.checkingmarknode.js (100%) rename {src => packages/fineui/src}/case/checkbox/check.first.treenode.js (100%) rename {src => packages/fineui/src}/case/checkbox/check.last.treenode.js (100%) rename {src => packages/fineui/src}/case/checkbox/check.mid.treenode.js (100%) rename {src => packages/fineui/src}/case/checkbox/check.treenode.js (100%) rename {src => packages/fineui/src}/case/checkbox/index.js (100%) rename {src => packages/fineui/src}/case/colorchooser/__test__/colorchooser.test.js (100%) rename {src => packages/fineui/src}/case/colorchooser/colorchooser.custom.js (100%) rename {src => packages/fineui/src}/case/colorchooser/colorchooser.js (100%) rename {src => packages/fineui/src}/case/colorchooser/colorchooser.popup.hex.js (100%) rename {src => packages/fineui/src}/case/colorchooser/colorchooser.popup.hex.simple.js (100%) rename {src => packages/fineui/src}/case/colorchooser/colorchooser.popup.js (100%) rename {src => packages/fineui/src}/case/colorchooser/colorchooser.popup.simple.js (100%) rename {src => packages/fineui/src}/case/colorchooser/colorchooser.simple.js (100%) rename {src => packages/fineui/src}/case/colorchooser/colorchooser.trigger.js (100%) rename {src => packages/fineui/src}/case/colorchooser/colorchooser.trigger.long.js (100%) rename {src => packages/fineui/src}/case/colorchooser/colorpicker/button/button.colorpicker.js (100%) rename {src => packages/fineui/src}/case/colorchooser/colorpicker/button/button.colorshow.js (100%) rename {src => packages/fineui/src}/case/colorchooser/colorpicker/button/index.js (100%) rename {src => packages/fineui/src}/case/colorchooser/colorpicker/colorpicker.hex.js (100%) rename {src => packages/fineui/src}/case/colorchooser/colorpicker/colorpicker.js (100%) rename {src => packages/fineui/src}/case/colorchooser/colorpicker/editor.colorpicker.hex.js (100%) rename {src => packages/fineui/src}/case/colorchooser/colorpicker/editor.colorpicker.hex.simple.js (100%) rename {src => packages/fineui/src}/case/colorchooser/colorpicker/editor.colorpicker.js (100%) rename {src => packages/fineui/src}/case/colorchooser/colorpicker/editor.colorpicker.simple.js (100%) rename {src => packages/fineui/src}/case/colorchooser/colorpicker/index.js (100%) rename {src => packages/fineui/src}/case/colorchooser/farbtastic/__test__/farbtastic.test.js (100%) rename {src => packages/fineui/src}/case/colorchooser/farbtastic/farbtastic.js (100%) rename {src => packages/fineui/src}/case/colorchooser/index.js (100%) rename {src => packages/fineui/src}/case/combo/bubblecombo/__test__/combo.bubble.test.js (100%) rename {src => packages/fineui/src}/case/combo/bubblecombo/combo.bubble.js (100%) rename {src => packages/fineui/src}/case/combo/bubblecombo/popup.bubble.js (100%) rename {src => packages/fineui/src}/case/combo/editoriconcheckcombo/__test__/combo.editiconcheck.test.js (100%) rename {src => packages/fineui/src}/case/combo/editoriconcheckcombo/combo.editiconcheck.js (100%) rename {src => packages/fineui/src}/case/combo/iconcombo/combo.icon.js (100%) rename {src => packages/fineui/src}/case/combo/iconcombo/popup.iconcombo.js (100%) rename {src => packages/fineui/src}/case/combo/iconcombo/trigger.iconcombo.js (100%) rename {src => packages/fineui/src}/case/combo/icontextvaluecombo/__test__/combo.icontextvalue.test.js (100%) rename {src => packages/fineui/src}/case/combo/icontextvaluecombo/combo.icontextvalue.js (100%) rename {src => packages/fineui/src}/case/combo/icontextvaluecombo/popup.icontextvalue.js (100%) rename {src => packages/fineui/src}/case/combo/index.js (100%) rename {src => packages/fineui/src}/case/combo/searchtextvaluecombo/__test__/combo.searchtextvaluecombo.test.js (100%) rename {src => packages/fineui/src}/case/combo/searchtextvaluecombo/combo.searchtextvalue.js (100%) rename {src => packages/fineui/src}/case/combo/searchtextvaluecombo/popup.searchtextvalue.js (100%) rename {src => packages/fineui/src}/case/combo/searchtextvaluecombo/trigger.searchtextvalue.js (100%) rename {src => packages/fineui/src}/case/combo/textvaluecheckcombo/__test__/combo.textvaluecheck.test.js (100%) rename {src => packages/fineui/src}/case/combo/textvaluecheckcombo/combo.textvaluecheck.js (100%) rename {src => packages/fineui/src}/case/combo/textvaluecheckcombo/popup.textvaluecheck.js (100%) rename {src => packages/fineui/src}/case/combo/textvaluecombo/__test__/combo.textvalue.test.js (100%) rename {src => packages/fineui/src}/case/combo/textvaluecombo/combo.textvalue.js (100%) rename {src => packages/fineui/src}/case/combo/textvaluecombo/combo.textvaluesmall.js (100%) rename {src => packages/fineui/src}/case/combo/textvaluecombo/popup.textvalue.js (100%) rename {src => packages/fineui/src}/case/editor/__test__/editor.clear.test.js (100%) rename {src => packages/fineui/src}/case/editor/__test__/editor.sign.test.js (100%) rename {src => packages/fineui/src}/case/editor/__test__/editor.state.simple.test.js (100%) rename {src => packages/fineui/src}/case/editor/__test__/editor.state.test.js (100%) rename {src => packages/fineui/src}/case/editor/editor.clear.js (100%) rename {src => packages/fineui/src}/case/editor/editor.defaulttext.js (100%) rename {src => packages/fineui/src}/case/editor/editor.shelter.js (100%) rename {src => packages/fineui/src}/case/editor/editor.sign.js (100%) rename {src => packages/fineui/src}/case/editor/editor.state.js (100%) rename {src => packages/fineui/src}/case/editor/editor.state.simple.js (100%) rename {src => packages/fineui/src}/case/editor/index.js (100%) rename {src => packages/fineui/src}/case/index.js (100%) rename {src => packages/fineui/src}/case/layer/index.js (100%) rename {src => packages/fineui/src}/case/layer/layer.multipopup.js (100%) rename {src => packages/fineui/src}/case/layer/layer.panel.js (100%) rename {src => packages/fineui/src}/case/layer/pane.list.js (100%) rename {src => packages/fineui/src}/case/layer/panel.js (100%) rename {src => packages/fineui/src}/case/linearsegment/button.linear.segment.js (100%) rename {src => packages/fineui/src}/case/linearsegment/index.js (100%) rename {src => packages/fineui/src}/case/linearsegment/linear.segment.js (100%) rename {src => packages/fineui/src}/case/list/list.select.js (100%) rename {src => packages/fineui/src}/case/loader/__test__/loader.lazy.test.js (100%) rename {src => packages/fineui/src}/case/loader/__test__/loader.list.test.js (100%) rename {src => packages/fineui/src}/case/loader/index.js (100%) rename {src => packages/fineui/src}/case/loader/loader.lazy.js (100%) rename {src => packages/fineui/src}/case/loader/loader.list.js (100%) rename {src => packages/fineui/src}/case/loader/sort.list.js (100%) rename {src => packages/fineui/src}/case/pager/__test__/pager.test.js (100%) rename {src => packages/fineui/src}/case/pager/index.js (100%) rename {src => packages/fineui/src}/case/pager/pager.all.count.js (100%) rename {src => packages/fineui/src}/case/pager/pager.detail.js (100%) rename {src => packages/fineui/src}/case/pager/pager.direction.js (100%) rename {src => packages/fineui/src}/case/segment/__test__/segment.test.js (100%) rename {src => packages/fineui/src}/case/segment/button.segment.js (100%) rename {src => packages/fineui/src}/case/segment/index.js (100%) rename {src => packages/fineui/src}/case/segment/segment.js (100%) rename {src => packages/fineui/src}/case/toolbar/toolbar.multiselect.js (100%) rename {src => packages/fineui/src}/case/tree/index.js (100%) rename {src => packages/fineui/src}/case/tree/tree.level.js (100%) rename {src => packages/fineui/src}/case/tree/treeexpander/tree.expander.js (100%) rename {src => packages/fineui/src}/case/tree/treeexpander/tree.expander.popup.js (100%) rename {src => packages/fineui/src}/case/trigger/index.js (100%) rename {src => packages/fineui/src}/case/trigger/trigger.editor.js (100%) rename {src => packages/fineui/src}/case/trigger/trigger.icon.js (100%) rename {src => packages/fineui/src}/case/trigger/trigger.icon.text.js (100%) rename {src => packages/fineui/src}/case/trigger/trigger.icon.text.select.js (100%) rename {src => packages/fineui/src}/case/trigger/trigger.text.js (100%) rename {src => packages/fineui/src}/case/trigger/trigger.text.select.js (100%) rename {src => packages/fineui/src}/case/trigger/trigger.text.select.small.js (100%) rename {src => packages/fineui/src}/case/trigger/trigger.text.small.js (100%) rename {src => packages/fineui/src}/case/ztree/asynctree.js (100%) rename {src => packages/fineui/src}/case/ztree/index.js (100%) rename {src => packages/fineui/src}/case/ztree/jquery.ztree.core-3.5.js (100%) rename {src => packages/fineui/src}/case/ztree/jquery.ztree.excheck-3.5.js (100%) rename {src => packages/fineui/src}/case/ztree/list/listasynctree.js (100%) rename {src => packages/fineui/src}/case/ztree/list/listparttree.js (100%) rename {src => packages/fineui/src}/case/ztree/list/listtreeview.js (100%) rename {src => packages/fineui/src}/case/ztree/parttree.js (100%) rename {src => packages/fineui/src}/case/ztree/tree.display.js (100%) rename {src => packages/fineui/src}/case/ztree/tree.list.display.js (100%) rename {src => packages/fineui/src}/case/ztree/tree.simple.js (100%) rename {src => packages/fineui/src}/case/ztree/treerender.page.service.js (100%) rename {src => packages/fineui/src}/case/ztree/treerender.scroll.service.js (100%) create mode 100644 packages/fineui/src/case/ztree/treeview.js rename {src => packages/fineui/src}/component/allvaluechooser/__test__/combo.allvaluechooser.test.js (100%) rename {src => packages/fineui/src}/component/allvaluechooser/abstract.allvaluechooser.js (100%) rename {src => packages/fineui/src}/component/allvaluechooser/combo.allvaluechooser.js (100%) rename {src => packages/fineui/src}/component/allvaluechooser/index.js (100%) rename {src => packages/fineui/src}/component/allvaluechooser/pane.allvaluechooser.js (100%) rename {src => packages/fineui/src}/component/allvaluemultitextvaluecombo/__test__/allvalue.multitextvalue.combo.test.js (100%) rename {src => packages/fineui/src}/component/allvaluemultitextvaluecombo/allvalue.multitextvalue.combo.js (100%) rename {src => packages/fineui/src}/component/form/form.field.js (100%) rename {src => packages/fineui/src}/component/form/form.js (100%) rename {src => packages/fineui/src}/component/form/index.js (100%) create mode 100644 packages/fineui/src/component/index.js rename {src => packages/fineui/src}/component/treevaluechooser/__test__/combo.listtreevaluechooser.test.js (100%) rename {src => packages/fineui/src}/component/treevaluechooser/__test__/combo.treevaluechooser.insert.test.js (100%) rename {src => packages/fineui/src}/component/treevaluechooser/__test__/combo.treevaluechooser.test.js (100%) rename {src => packages/fineui/src}/component/treevaluechooser/__test__/pane.treevaluechooser.test.js (100%) rename {src => packages/fineui/src}/component/treevaluechooser/abstract.treevaluechooser.js (100%) rename {src => packages/fineui/src}/component/treevaluechooser/abstract.treevaluechooser.list.js (100%) rename {src => packages/fineui/src}/component/treevaluechooser/combo.listtreevaluechooser.js (100%) rename {src => packages/fineui/src}/component/treevaluechooser/combo.treevaluechooser.insert.js (100%) rename {src => packages/fineui/src}/component/treevaluechooser/combo.treevaluechooser.js (100%) rename {src => packages/fineui/src}/component/treevaluechooser/index.js (100%) rename {src => packages/fineui/src}/component/treevaluechooser/pane.treevaluechooser.js (100%) rename {src => packages/fineui/src}/component/valuechooser/__test__/combo.valuechooser.insert.test.js (100%) rename {src => packages/fineui/src}/component/valuechooser/__test__/combo.valuechooser.test.js (100%) rename {src => packages/fineui/src}/component/valuechooser/__test__/pane.valuechooser.test.js (100%) rename {src => packages/fineui/src}/component/valuechooser/abstract.valuechooser.js (100%) rename {src => packages/fineui/src}/component/valuechooser/combo.valuechooser.insert.js (100%) rename {src => packages/fineui/src}/component/valuechooser/combo.valuechooser.js (100%) rename {src => packages/fineui/src}/component/valuechooser/combo.valuechooser.nobar.js (100%) rename {src => packages/fineui/src}/component/valuechooser/index.js (100%) rename {src => packages/fineui/src}/component/valuechooser/pane.valuechooser.js (100%) rename {src => packages/fineui/src}/core/0.foundation.js (100%) rename {src => packages/fineui/src}/core/1.lodash.js (100%) create mode 100644 packages/fineui/src/core/2.base.js rename {src => packages/fineui/src}/core/3.ob.js (100%) create mode 100644 packages/fineui/src/core/4.widget.js create mode 100644 packages/fineui/src/core/5.inject.js rename {src => packages/fineui/src}/core/6.plugin.js (100%) rename {src => packages/fineui/src}/core/__test__/alias.test.js (100%) rename {src => packages/fineui/src}/core/__test__/base.test.js (100%) rename {src => packages/fineui/src}/core/__test__/context.test.js (100%) rename {src => packages/fineui/src}/core/__test__/widget.test.js (100%) rename {src => packages/fineui/src}/core/action/action.js (100%) rename {src => packages/fineui/src}/core/action/action.show.js (100%) rename {src => packages/fineui/src}/core/action/index.js (100%) rename {src => packages/fineui/src}/core/behavior/0.behavior.js (100%) rename {src => packages/fineui/src}/core/behavior/behavior.highlight.js (100%) rename {src => packages/fineui/src}/core/behavior/behavior.redmark.js (100%) rename {src => packages/fineui/src}/core/behavior/index.js (100%) rename {src => packages/fineui/src}/core/constant/events.js (100%) rename {src => packages/fineui/src}/core/constant/index.js (100%) rename {src => packages/fineui/src}/core/constant/var.js (100%) rename {src => packages/fineui/src}/core/controller/0.controller.js (100%) rename {src => packages/fineui/src}/core/controller/controller.broadcast.js (100%) rename {src => packages/fineui/src}/core/controller/controller.bubbles.js (100%) rename {src => packages/fineui/src}/core/controller/controller.drawer.js (100%) create mode 100644 packages/fineui/src/core/controller/controller.layer.js rename {src => packages/fineui/src}/core/controller/controller.masker.js (100%) rename {src => packages/fineui/src}/core/controller/controller.popover.js (100%) rename {src => packages/fineui/src}/core/controller/controller.resizer.js (100%) rename {src => packages/fineui/src}/core/controller/controller.tooltips.js (100%) rename {src => packages/fineui/src}/core/controller/index.js (100%) rename {src => packages/fineui/src}/core/controller/popper.js (100%) rename {src => packages/fineui/src}/core/decorator.js (100%) rename {src => packages/fineui/src}/core/element/element.js (100%) rename {src => packages/fineui/src}/core/element/index.js (100%) rename {src => packages/fineui/src}/core/element/plugins/attr.js (100%) rename {src => packages/fineui/src}/core/element/plugins/class.js (100%) rename {src => packages/fineui/src}/core/element/plugins/css.js (100%) rename {src => packages/fineui/src}/core/element/plugins/data.js (100%) rename {src => packages/fineui/src}/core/element/plugins/empty.js (100%) rename {src => packages/fineui/src}/core/element/plugins/event.js (100%) rename {src => packages/fineui/src}/core/element/plugins/html.js (100%) rename {src => packages/fineui/src}/core/element/plugins/index.js (100%) rename {src => packages/fineui/src}/core/element/plugins/keywordMark.js (100%) rename {src => packages/fineui/src}/core/element/plugins/renderToHtml.js (100%) rename {src => packages/fineui/src}/core/element/plugins/renderToString.js (100%) rename {src => packages/fineui/src}/core/element/plugins/text.js (100%) rename {src => packages/fineui/src}/core/element/plugins/val.js (100%) rename {src => packages/fineui/src}/core/func/__test__/date.test.js (100%) rename {src => packages/fineui/src}/core/func/__test__/function.test.js (100%) rename {src => packages/fineui/src}/core/func/__test__/string.test.js (100%) rename {src => packages/fineui/src}/core/func/alias.js (100%) rename {src => packages/fineui/src}/core/func/array.js (100%) rename {src => packages/fineui/src}/core/func/date.js (100%) rename {src => packages/fineui/src}/core/func/function.js (100%) rename {src => packages/fineui/src}/core/func/index.js (100%) rename {src => packages/fineui/src}/core/func/number.js (100%) rename {src => packages/fineui/src}/core/func/string.js (100%) rename {src => packages/fineui/src}/core/h.js (100%) create mode 100644 packages/fineui/src/core/index.js rename {src => packages/fineui/src}/core/listener/listener.show.js (100%) rename {src => packages/fineui/src}/core/loader/loader.style.js (100%) rename {src => packages/fineui/src}/core/logic/index.js (100%) rename {src => packages/fineui/src}/core/logic/logic.js (100%) rename {src => packages/fineui/src}/core/logic/logic.layout.js (100%) rename {src => packages/fineui/src}/core/platform/index.js (100%) rename {src => packages/fineui/src}/core/platform/web/config.js (100%) rename {src => packages/fineui/src}/core/platform/web/detectElementResize.js (100%) rename {src => packages/fineui/src}/core/platform/web/function.js (100%) rename {src => packages/fineui/src}/core/platform/web/index.js (100%) rename {src => packages/fineui/src}/core/platform/web/jquery/__test__/fn.test.js (100%) rename {src => packages/fineui/src}/core/platform/web/jquery/_jquery.js (100%) rename {src => packages/fineui/src}/core/platform/web/jquery/event.js (100%) rename {src => packages/fineui/src}/core/platform/web/jquery/fn.js (100%) rename {src => packages/fineui/src}/core/platform/web/jquery/index.js (100%) rename {src => packages/fineui/src}/core/platform/web/jquery/jquery.mousewheel.js (100%) rename {src => packages/fineui/src}/core/platform/web/load.js (100%) rename {src => packages/fineui/src}/core/structure/aes.js (100%) rename {src => packages/fineui/src}/core/structure/aspect.js (100%) rename {src => packages/fineui/src}/core/structure/base64.js (100%) rename {src => packages/fineui/src}/core/structure/cache.js (100%) rename {src => packages/fineui/src}/core/structure/cellSizeAndPositionManager.js (100%) rename {src => packages/fineui/src}/core/structure/heap.js (100%) rename {src => packages/fineui/src}/core/structure/index.js (100%) rename {src => packages/fineui/src}/core/structure/linkedHashMap.js (100%) rename {src => packages/fineui/src}/core/structure/lru.js (100%) rename {src => packages/fineui/src}/core/structure/prefixIntervalTree.js (100%) rename {src => packages/fineui/src}/core/structure/queue.js (100%) rename {src => packages/fineui/src}/core/structure/sectionManager.js (100%) rename {src => packages/fineui/src}/core/structure/tree.js (100%) rename {src => packages/fineui/src}/core/structure/vector.js (100%) create mode 100644 packages/fineui/src/core/system.js rename {src => packages/fineui/src}/core/utils/__test__/aes.test.js (100%) rename {src => packages/fineui/src}/core/utils/chinesePY.js (100%) rename {src => packages/fineui/src}/core/utils/color.js (100%) create mode 100644 packages/fineui/src/core/utils/dom.js rename {src => packages/fineui/src}/core/utils/events/eventlistener.js (100%) rename {src => packages/fineui/src}/core/utils/events/index.js (100%) rename {src => packages/fineui/src}/core/utils/events/mousemovetracker.js (100%) rename {src => packages/fineui/src}/core/utils/events/wheelhandler.js (100%) rename {src => packages/fineui/src}/core/utils/i18n.js (100%) rename {src => packages/fineui/src}/core/utils/index.js (100%) create mode 100644 packages/fineui/src/core/version.js rename {src => packages/fineui/src}/core/worker.js (100%) rename {src => packages/fineui/src}/core/wrapper/index.js (100%) create mode 100644 packages/fineui/src/core/wrapper/layout.js rename {src => packages/fineui/src}/core/wrapper/layout/adapt/absolute.center.js (100%) rename {src => packages/fineui/src}/core/wrapper/layout/adapt/absolute.horizontal.js (100%) rename {src => packages/fineui/src}/core/wrapper/layout/adapt/absolute.leftrightvertical.js (100%) rename {src => packages/fineui/src}/core/wrapper/layout/adapt/absolute.vertical.js (100%) rename {src => packages/fineui/src}/core/wrapper/layout/adapt/adapt.center.js (100%) rename {src => packages/fineui/src}/core/wrapper/layout/adapt/adapt.horizontal.js (100%) rename {src => packages/fineui/src}/core/wrapper/layout/adapt/adapt.leftrightvertical.js (100%) rename {src => packages/fineui/src}/core/wrapper/layout/adapt/adapt.table.js (100%) rename {src => packages/fineui/src}/core/wrapper/layout/adapt/adapt.vertical.js (100%) rename {src => packages/fineui/src}/core/wrapper/layout/adapt/auto.horizontal.js (100%) rename {src => packages/fineui/src}/core/wrapper/layout/adapt/index.js (100%) rename {src => packages/fineui/src}/core/wrapper/layout/adapt/inline.center.js (100%) rename {src => packages/fineui/src}/core/wrapper/layout/adapt/inline.horizontal.js (100%) rename {src => packages/fineui/src}/core/wrapper/layout/adapt/inline.vertical.js (100%) rename {src => packages/fineui/src}/core/wrapper/layout/fill/auto.vtape.js (100%) rename {src => packages/fineui/src}/core/wrapper/layout/fill/fill.horizontal.js (100%) rename {src => packages/fineui/src}/core/wrapper/layout/fill/fill.vertical.js (100%) rename {src => packages/fineui/src}/core/wrapper/layout/fill/float.fill.horizontal.js (100%) rename {src => packages/fineui/src}/core/wrapper/layout/fill/index.js (100%) rename {src => packages/fineui/src}/core/wrapper/layout/flex/flex.center.js (100%) rename {src => packages/fineui/src}/core/wrapper/layout/flex/flex.horizontal.center.js (100%) rename {src => packages/fineui/src}/core/wrapper/layout/flex/flex.horizontal.js (100%) rename {src => packages/fineui/src}/core/wrapper/layout/flex/flex.leftrightvertical.center.js (100%) rename {src => packages/fineui/src}/core/wrapper/layout/flex/flex.vertical.center.js (100%) rename {src => packages/fineui/src}/core/wrapper/layout/flex/flex.vertical.js (100%) rename {src => packages/fineui/src}/core/wrapper/layout/flex/index.js (100%) rename {src => packages/fineui/src}/core/wrapper/layout/flex/wrapper/flex.wrapper.center.js (100%) rename {src => packages/fineui/src}/core/wrapper/layout/flex/wrapper/flex.wrapper.horizontal.center.js (100%) rename {src => packages/fineui/src}/core/wrapper/layout/flex/wrapper/flex.wrapper.horizontal.js (100%) rename {src => packages/fineui/src}/core/wrapper/layout/flex/wrapper/flex.wrapper.vertical.center.js (100%) rename {src => packages/fineui/src}/core/wrapper/layout/flex/wrapper/flex.wrapper.vertical.js (100%) rename {src => packages/fineui/src}/core/wrapper/layout/flex/wrapper/index.js (100%) rename {src => packages/fineui/src}/core/wrapper/layout/float/float.absolute.center.js (100%) rename {src => packages/fineui/src}/core/wrapper/layout/float/float.absolute.horizontal.js (100%) rename {src => packages/fineui/src}/core/wrapper/layout/float/float.absolute.leftrightvertical.js (100%) rename {src => packages/fineui/src}/core/wrapper/layout/float/float.absolute.vertical.js (100%) rename {src => packages/fineui/src}/core/wrapper/layout/float/float.horizontal.js (100%) rename {src => packages/fineui/src}/core/wrapper/layout/float/index.js (100%) rename {src => packages/fineui/src}/core/wrapper/layout/index.js (100%) rename {src => packages/fineui/src}/core/wrapper/layout/layout.absolute.js (100%) rename {src => packages/fineui/src}/core/wrapper/layout/layout.adaptive.js (100%) rename {src => packages/fineui/src}/core/wrapper/layout/layout.border.js (100%) rename {src => packages/fineui/src}/core/wrapper/layout/layout.card.js (100%) rename {src => packages/fineui/src}/core/wrapper/layout/layout.default.js (100%) rename {src => packages/fineui/src}/core/wrapper/layout/layout.division.js (100%) rename {src => packages/fineui/src}/core/wrapper/layout/layout.flow.js (100%) rename {src => packages/fineui/src}/core/wrapper/layout/layout.grid.js (100%) rename {src => packages/fineui/src}/core/wrapper/layout/layout.horizontal.js (100%) rename {src => packages/fineui/src}/core/wrapper/layout/layout.inline.js (100%) rename {src => packages/fineui/src}/core/wrapper/layout/layout.lattice.js (100%) rename {src => packages/fineui/src}/core/wrapper/layout/layout.table.js (100%) rename {src => packages/fineui/src}/core/wrapper/layout/layout.tape.js (100%) rename {src => packages/fineui/src}/core/wrapper/layout/layout.td.js (100%) rename {src => packages/fineui/src}/core/wrapper/layout/layout.vertical.js (100%) rename {src => packages/fineui/src}/core/wrapper/layout/layout.window.js (100%) rename {src => packages/fineui/src}/core/wrapper/layout/middle/index.js (100%) rename {src => packages/fineui/src}/core/wrapper/layout/middle/middle.center.js (100%) rename {src => packages/fineui/src}/core/wrapper/layout/middle/middle.float.center.js (100%) rename {src => packages/fineui/src}/core/wrapper/layout/middle/middle.horizontal.js (100%) rename {src => packages/fineui/src}/core/wrapper/layout/middle/middle.vertical.js (100%) rename {src => packages/fineui/src}/core/wrapper/layout/responsive/index.js (100%) rename {src => packages/fineui/src}/core/wrapper/layout/responsive/responsive.flex.horizontal.js (100%) rename {src => packages/fineui/src}/core/wrapper/layout/responsive/responsive.flex.wrapper.horizontal.js (100%) rename {src => packages/fineui/src}/core/wrapper/layout/responsive/responsive.inline.js (100%) rename {src => packages/fineui/src}/core/wrapper/layout/sticky/index.js (100%) rename {src => packages/fineui/src}/core/wrapper/layout/sticky/sticky.horizontal.js (100%) rename {src => packages/fineui/src}/core/wrapper/layout/sticky/sticky.vertical.js (100%) rename {src => packages/fineui/src}/fix/fix.compact.js (100%) rename {src => packages/fineui/src}/fix/fix.js (100%) rename {src => packages/fineui/src}/fix/index.js (100%) create mode 100644 packages/fineui/src/index.js rename {src => packages/fineui/src}/less/base/colorchooser/colorchooser.popup.less (100%) rename {src => packages/fineui/src}/less/base/colorchooser/colorchooser.trigger.less (100%) rename {src => packages/fineui/src}/less/base/colorchooser/colorpicker/button.colorpicker.less (100%) rename {src => packages/fineui/src}/less/base/colorchooser/colorpicker/button.colorshow.less (100%) rename {src => packages/fineui/src}/less/base/colorchooser/colorpicker/editor.colorpicker.less (100%) rename {src => packages/fineui/src}/less/base/colorchooser/farbtastic/farbtastic.less (100%) rename {src => packages/fineui/src}/less/base/combo/combo.bubble.less (100%) rename {src => packages/fineui/src}/less/base/combo/combo.less (100%) rename {src => packages/fineui/src}/less/base/combo/combo.searchtextvalue.less (100%) rename {src => packages/fineui/src}/less/base/combo/combo.textvalue.icon.less (100%) rename {src => packages/fineui/src}/less/base/combo/combo.textvalue.less (100%) rename {src => packages/fineui/src}/less/base/combo/combo.textvaluecheck.less (100%) rename {src => packages/fineui/src}/less/base/combo/combo.textvaluedownlist.less (100%) rename {src => packages/fineui/src}/less/base/combo/popup.bubble.bar.less (100%) rename {src => packages/fineui/src}/less/base/combo/popup.bubble.less (100%) rename {src => packages/fineui/src}/less/base/editor/editor.search.less (100%) rename {src => packages/fineui/src}/less/base/editor/editor.search.small.less (100%) rename {src => packages/fineui/src}/less/base/foundation/bi.message.less (100%) rename {src => packages/fineui/src}/less/base/layer/layer.multiselect.less (100%) rename {src => packages/fineui/src}/less/base/layer/panel.less (100%) rename {src => packages/fineui/src}/less/base/loader/sort.list.less (100%) rename {src => packages/fineui/src}/less/base/pager/pager.all.count.less (100%) rename {src => packages/fineui/src}/less/base/pager/pager.direction.less (100%) rename {src => packages/fineui/src}/less/base/pager/pager.less (100%) rename {src => packages/fineui/src}/less/base/pane.less (100%) rename {src => packages/fineui/src}/less/base/segment/button.segment.less (100%) rename {src => packages/fineui/src}/less/base/segment/segment.less (100%) rename {src => packages/fineui/src}/less/base/single/button/button.half.less (100%) rename {src => packages/fineui/src}/less/base/single/button/button.less (100%) rename {src => packages/fineui/src}/less/base/single/button/switch.less (100%) rename {src => packages/fineui/src}/less/base/single/editor/editor.multifile.less (100%) rename {src => packages/fineui/src}/less/base/single/editor/editor.textarea.less (100%) rename {src => packages/fineui/src}/less/base/single/html.less (100%) rename {src => packages/fineui/src}/less/base/single/input/checkbox.less (100%) rename {src => packages/fineui/src}/less/base/single/input/file.less (100%) rename {src => packages/fineui/src}/less/base/single/input/input.less (100%) rename {src => packages/fineui/src}/less/base/single/input/radio.less (100%) rename {src => packages/fineui/src}/less/base/single/instruction.less (100%) rename {src => packages/fineui/src}/less/base/single/label.less (100%) rename {src => packages/fineui/src}/less/base/single/text.less (100%) rename {src => packages/fineui/src}/less/base/single/tip/tip.bubble.less (100%) rename {src => packages/fineui/src}/less/base/single/tip/tip.less (100%) rename {src => packages/fineui/src}/less/base/single/tip/tip.toast.less (100%) rename {src => packages/fineui/src}/less/base/single/tip/tip.tooltip.less (100%) rename {src => packages/fineui/src}/less/base/tree/tree.branch.less (100%) rename {src => packages/fineui/src}/less/base/tree/tree.display.less (100%) rename {src => packages/fineui/src}/less/base/tree/tree.expander.less (100%) rename {src => packages/fineui/src}/less/base/tree/tree.list.display.less (100%) rename {src => packages/fineui/src}/less/base/tree/ztree.less (100%) rename {src => packages/fineui/src}/less/base/trigger/trigger.less (100%) rename {src => packages/fineui/src}/less/base/trigger/trigger.searchtextvalue.less (100%) rename {src => packages/fineui/src}/less/base/trigger/trigger.selecttext.less (100%) rename {src => packages/fineui/src}/less/base/trigger/trigger.selecttextsmall.less (100%) rename {src => packages/fineui/src}/less/base/trigger/trigger.text.less (100%) rename {src => packages/fineui/src}/less/base/view/drawer.less (100%) rename {src => packages/fineui/src}/less/base/view/popover.less (100%) rename {src => packages/fineui/src}/less/base/view/popupview.less (100%) rename {src => packages/fineui/src}/less/box-model.less (100%) rename {src => packages/fineui/src}/less/case/tree/tree.item.less (100%) rename {src => packages/fineui/src}/less/component/form/form.less (100%) rename {src => packages/fineui/src}/less/core/normalize.less (100%) rename {src => packages/fineui/src}/less/core/normalize2.less (100%) rename {src => packages/fineui/src}/less/core/utils/animation.less (100%) rename {src => packages/fineui/src}/less/core/utils/common.less (100%) rename {src => packages/fineui/src}/less/core/utils/cursor.less (100%) rename {src => packages/fineui/src}/less/core/utils/list-item.less (100%) rename {src => packages/fineui/src}/less/core/utils/motion/fade.less (100%) rename {src => packages/fineui/src}/less/core/utils/motion/move.less (100%) rename {src => packages/fineui/src}/less/core/utils/motion/slide.less (100%) rename {src => packages/fineui/src}/less/core/utils/motion/zoom.less (100%) rename {src => packages/fineui/src}/less/core/utils/position.less (100%) rename {src => packages/fineui/src}/less/core/utils/size.less (100%) rename {src => packages/fineui/src}/less/core/utils/sizing.less (100%) rename {src => packages/fineui/src}/less/core/utils/typographic.less (100%) rename {src => packages/fineui/src}/less/core/wrapper/flex.horizontal.less (100%) rename {src => packages/fineui/src}/less/core/wrapper/flex.vertical.less (100%) rename {src => packages/fineui/src}/less/core/wrapper/flex.wrapper.horizontal.less (100%) rename {src => packages/fineui/src}/less/core/wrapper/flex.wrapper.vertical.less (100%) rename {src => packages/fineui/src}/less/core/wrapper/float.absolute.less (100%) rename {src => packages/fineui/src}/less/core/wrapper/inline.less (100%) rename {src => packages/fineui/src}/less/core/wrapper/inline.old.less (100%) rename {src => packages/fineui/src}/less/core/wrapper/table.less (100%) rename {src => packages/fineui/src}/less/image.less (100%) rename {src => packages/fineui/src}/less/index.less (100%) rename {src => packages/fineui/src}/less/lib/background.less (100%) rename {src => packages/fineui/src}/less/lib/colors.less (100%) rename {src => packages/fineui/src}/less/lib/constant.less (100%) rename {src => packages/fineui/src}/less/lib/font.less (100%) rename {src => packages/fineui/src}/less/lib/icon.less (100%) rename {src => packages/fineui/src}/less/lib/theme-modern.less (100%) rename {src => packages/fineui/src}/less/lib/theme.less (100%) rename {src => packages/fineui/src}/less/motion.less (100%) rename {src => packages/fineui/src}/less/position.less (100%) rename {src => packages/fineui/src}/less/resource/app.less (100%) rename {src => packages/fineui/src}/less/resource/background.less (100%) rename {src => packages/fineui/src}/less/resource/font.less (100%) rename {src => packages/fineui/src}/less/resource/icon.less (100%) rename {src => packages/fineui/src}/less/theme/dark.less (100%) rename {src => packages/fineui/src}/less/theme/default.less (100%) rename {src => packages/fineui/src}/less/theme/light.less (100%) rename {src => packages/fineui/src}/less/typographic.less (100%) rename {src => packages/fineui/src}/less/var.less (100%) rename {src => packages/fineui/src}/less/visual.less (100%) rename {src => packages/fineui/src}/less/widget/date/trigger.date.less (100%) rename {src => packages/fineui/src}/less/widget/downlist/popup.downlist.less (100%) rename {src => packages/fineui/src}/less/widget/dynamicdatecombo/dynamicdatepopup.less (100%) rename {src => packages/fineui/src}/less/widget/dynamicdatecombo/dynamicdatetime.combo.less (100%) rename {src => packages/fineui/src}/less/widget/dynamicdatecombo/dynamicdatetimepopup.less (100%) rename {src => packages/fineui/src}/less/widget/intervalslider/intervalslider.label.less (100%) rename {src => packages/fineui/src}/less/widget/intervalslider/intervalslider.less (100%) rename {src => packages/fineui/src}/less/widget/month/trigger.month.less (100%) rename {src => packages/fineui/src}/less/widget/multilayerselecttree/multilayerselecttree.combo.less (100%) rename {src => packages/fineui/src}/less/widget/multilayerselecttree/multilayerselecttree.leveltree.less (100%) rename {src => packages/fineui/src}/less/widget/multilayersingletree/multilayersingletree.combo.less (100%) rename {src => packages/fineui/src}/less/widget/multilayersingletree/multilayersingletree.leveltree.less (100%) rename {src => packages/fineui/src}/less/widget/multiselect/check/multiselect.check.pane.less (100%) rename {src => packages/fineui/src}/less/widget/multiselect/multiselect.combo.less (100%) rename {src => packages/fineui/src}/less/widget/multiselect/multiselect.insert.combo.less (100%) rename {src => packages/fineui/src}/less/widget/multiselect/search/multiselect.search.pane.less (100%) rename {src => packages/fineui/src}/less/widget/multiselect/trigger/button.checkselected.less (100%) rename {src => packages/fineui/src}/less/widget/multistringlist/multistringlist.insert.less (100%) rename {src => packages/fineui/src}/less/widget/multistringlist/multistringlist.less (100%) rename {src => packages/fineui/src}/less/widget/multitree/check/multi.tree.check.pane.less (100%) rename {src => packages/fineui/src}/less/widget/multitree/multi.tree.combo.less (100%) rename {src => packages/fineui/src}/less/widget/multitree/popup.multi.tree.less (100%) rename {src => packages/fineui/src}/less/widget/multitree/trigger/multi.tree.button.checkselected.less (100%) rename {src => packages/fineui/src}/less/widget/numbereditor/number.editor.less (100%) rename {src => packages/fineui/src}/less/widget/numberinterval/numberinterval.less (100%) rename {src => packages/fineui/src}/less/widget/quarter/trigger.quarter.less (100%) rename {src => packages/fineui/src}/less/widget/searchmultiselect/searchmultiselect.less (100%) rename {src => packages/fineui/src}/less/widget/singleselect/search/singleselect.search.pane.less (100%) rename {src => packages/fineui/src}/less/widget/singleselect/singleselect.combo.less (100%) rename {src => packages/fineui/src}/less/widget/singleslider/singlelider.label.less (100%) rename {src => packages/fineui/src}/less/widget/singleslider/singlelider.normal.less (100%) rename {src => packages/fineui/src}/less/widget/singleslider/singleslider.less (100%) rename {src => packages/fineui/src}/less/widget/singleslider/slider/widget.slider.less (100%) rename {src => packages/fineui/src}/less/widget/singleslider/track/widget.track.less (100%) rename {src => packages/fineui/src}/less/widget/timecombo/timecombo.less (100%) rename {src => packages/fineui/src}/less/widget/timeinterval/dateinterval.less (100%) rename {src => packages/fineui/src}/less/widget/timeinterval/timeinterval.less (100%) rename {src => packages/fineui/src}/less/widget/year/popup.year.less (100%) rename {src => packages/fineui/src}/less/widget/year/trigger.year.less (100%) rename {src => packages/fineui/src}/less/widget/yearinterval/yearinterval.less (100%) rename {src => packages/fineui/src}/less/widget/yearmonth/popup.yearmonth.less (100%) rename {src => packages/fineui/src}/less/widget/yearmonthinterval/yearmonthinterval.less (100%) rename {src => packages/fineui/src}/less/widget/yearquarter/popup.yearquarter.less (100%) rename {src => packages/fineui/src}/less/widget/yearquarterinterval/yearquarterinterval.less (100%) rename {src => packages/fineui/src}/polyfill/event.js (100%) rename {src => packages/fineui/src}/polyfill/index.js (100%) rename {src => packages/fineui/src}/polyfill/number.js (100%) rename {src => packages/fineui/src}/polyfill/sort.js (100%) rename {src => packages/fineui/src}/router/0.router.js (100%) rename {src => packages/fineui/src}/router/index.js (100%) create mode 100644 packages/fineui/src/router/router.js rename {src => packages/fineui/src}/third/sort.gb2312.js (100%) rename {src => packages/fineui/src}/widget/collapse/collapse.js (100%) rename {src => packages/fineui/src}/widget/date/calendar/combo.month.date.js (100%) rename {src => packages/fineui/src}/widget/date/calendar/combo.year.date.js (100%) rename {src => packages/fineui/src}/widget/date/calendar/index.js (100%) rename {src => packages/fineui/src}/widget/date/calendar/picker.date.js (100%) rename {src => packages/fineui/src}/widget/date/calendar/picker.year.js (100%) rename {src => packages/fineui/src}/widget/date/calendar/popup.calendar.date.js (100%) rename {src => packages/fineui/src}/widget/date/calendar/popup.month.js (100%) rename {src => packages/fineui/src}/widget/date/calendar/popup.year.js (100%) rename {src => packages/fineui/src}/widget/date/calendar/trigger.triangle.date.js (100%) rename {src => packages/fineui/src}/widget/date/index.js (100%) rename {src => packages/fineui/src}/widget/datepane/__test__/datepane.test.js (100%) rename {src => packages/fineui/src}/widget/datepane/card.static.datepane.js (100%) rename {src => packages/fineui/src}/widget/datepane/datepane.js (100%) rename {src => packages/fineui/src}/widget/datepane/index.js (100%) rename {src => packages/fineui/src}/widget/datetime/__test__/datetime.test.js (100%) rename {src => packages/fineui/src}/widget/datetime/datetime.combo.js (100%) rename {src => packages/fineui/src}/widget/datetime/datetime.popup.js (100%) rename {src => packages/fineui/src}/widget/datetime/datetime.trigger.js (100%) rename {src => packages/fineui/src}/widget/datetime/index.js (100%) rename {src => packages/fineui/src}/widget/datetimepane/__test__/datetimepane.test.js (100%) rename {src => packages/fineui/src}/widget/datetimepane/card.static.datetimepane.js (100%) rename {src => packages/fineui/src}/widget/datetimepane/datetimepane.js (100%) rename {src => packages/fineui/src}/widget/datetimepane/index.js (100%) rename {src => packages/fineui/src}/widget/downlist/__test__/downlist.test.js (100%) rename {src => packages/fineui/src}/widget/downlist/combo.downlist.js (100%) rename {src => packages/fineui/src}/widget/downlist/group.downlist.js (100%) rename {src => packages/fineui/src}/widget/downlist/index.js (100%) rename {src => packages/fineui/src}/widget/downlist/item.downlist.js (100%) rename {src => packages/fineui/src}/widget/downlist/item.downlistgroup.js (100%) rename {src => packages/fineui/src}/widget/downlist/popup.downlist.js (100%) rename {src => packages/fineui/src}/widget/dynamicdate/__test__/dynamicdate.test.js (100%) rename {src => packages/fineui/src}/widget/dynamicdate/dynamicdate.caculate.js (100%) rename {src => packages/fineui/src}/widget/dynamicdate/dynamicdate.card.js (100%) rename {src => packages/fineui/src}/widget/dynamicdate/dynamicdate.combo.js (100%) rename {src => packages/fineui/src}/widget/dynamicdate/dynamicdate.param.item.js (100%) rename {src => packages/fineui/src}/widget/dynamicdate/dynamicdate.popup.js (100%) rename {src => packages/fineui/src}/widget/dynamicdate/dynamicdate.trigger.js (100%) rename {src => packages/fineui/src}/widget/dynamicdate/index.js (100%) rename {src => packages/fineui/src}/widget/dynamicdatetime/__test__/dynamicdatetime.test.js (100%) rename {src => packages/fineui/src}/widget/dynamicdatetime/dynamicdatetime.combo.js (100%) rename {src => packages/fineui/src}/widget/dynamicdatetime/dynamicdatetime.popup.js (100%) rename {src => packages/fineui/src}/widget/dynamicdatetime/dynamicdatetime.timeselect.js (100%) rename {src => packages/fineui/src}/widget/dynamicdatetime/dynamicdatetime.trigger.js (100%) rename {src => packages/fineui/src}/widget/dynamicdatetime/index.js (100%) rename {src => packages/fineui/src}/widget/editor/__test__/editor.search.test.js (100%) rename {src => packages/fineui/src}/widget/editor/__test__/editor.text.test.js (100%) rename {src => packages/fineui/src}/widget/editor/editor.search.js (100%) rename {src => packages/fineui/src}/widget/editor/editor.search.small.js (100%) rename {src => packages/fineui/src}/widget/editor/editor.text.js (100%) rename {src => packages/fineui/src}/widget/editor/editor.text.small.js (100%) rename {src => packages/fineui/src}/widget/editor/index.js (100%) create mode 100644 packages/fineui/src/widget/index.js rename {src => packages/fineui/src}/widget/intervalslider/__test__/accuratecalculation.test.js (100%) rename {src => packages/fineui/src}/widget/intervalslider/__test__/intervalslider.test.js (100%) rename {src => packages/fineui/src}/widget/intervalslider/index.js (100%) rename {src => packages/fineui/src}/widget/intervalslider/intervalslider.js (100%) rename {src => packages/fineui/src}/widget/intervalslider/model.accuratecalculation.js (100%) rename {src => packages/fineui/src}/widget/multilayerdownlist/__test__/downlist.test.js (100%) rename {src => packages/fineui/src}/widget/multilayerdownlist/combo.downlist.js (100%) rename {src => packages/fineui/src}/widget/multilayerdownlist/index.js (100%) rename {src => packages/fineui/src}/widget/multilayerdownlist/popup.downlist.js (100%) rename {src => packages/fineui/src}/widget/multilayerselecttree/__test__/multilayerselecttree.combo.test.js (100%) rename {src => packages/fineui/src}/widget/multilayerselecttree/index.js (100%) rename {src => packages/fineui/src}/widget/multilayerselecttree/multilayerselecttree.combo.js (100%) rename {src => packages/fineui/src}/widget/multilayerselecttree/multilayerselecttree.insert.search.pane.js (100%) rename {src => packages/fineui/src}/widget/multilayerselecttree/multilayerselecttree.leveltree.js (100%) rename {src => packages/fineui/src}/widget/multilayerselecttree/multilayerselecttree.popup.js (100%) rename {src => packages/fineui/src}/widget/multilayerselecttree/multilayerselecttree.trigger.js (100%) rename {src => packages/fineui/src}/widget/multilayersingletree/__test__/multilayersingletree.combo.test.js (100%) rename {src => packages/fineui/src}/widget/multilayersingletree/index.js (100%) rename {src => packages/fineui/src}/widget/multilayersingletree/multilayersingletree.combo.js (100%) rename {src => packages/fineui/src}/widget/multilayersingletree/multilayersingletree.insert.search.pane.js (100%) rename {src => packages/fineui/src}/widget/multilayersingletree/multilayersingletree.leveltree.js (100%) rename {src => packages/fineui/src}/widget/multilayersingletree/multilayersingletree.popup.js (100%) rename {src => packages/fineui/src}/widget/multilayersingletree/multilayersingletree.trigger.js (100%) rename {src => packages/fineui/src}/widget/multiselect/__test__/multiselect.loader.nobar.test.js (100%) rename {src => packages/fineui/src}/widget/multiselect/__test__/multiselect.loader.test.js (100%) rename {src => packages/fineui/src}/widget/multiselect/__test__/multiselectcombo.test.js (100%) rename {src => packages/fineui/src}/widget/multiselect/__test__/multiselectinsert.combo.test.js (100%) rename {src => packages/fineui/src}/widget/multiselect/check/multiselect.check.pane.js (100%) rename {src => packages/fineui/src}/widget/multiselect/check/multiselect.display.js (100%) rename {src => packages/fineui/src}/widget/multiselect/index.js (100%) rename {src => packages/fineui/src}/widget/multiselect/loader.js (100%) rename {src => packages/fineui/src}/widget/multiselect/multiselect.combo.js (100%) rename {src => packages/fineui/src}/widget/multiselect/multiselect.combo.nobar.js (100%) rename {src => packages/fineui/src}/widget/multiselect/multiselect.insert.combo.js (100%) rename {src => packages/fineui/src}/widget/multiselect/multiselect.insert.combo.nobar.js (100%) rename {src => packages/fineui/src}/widget/multiselect/multiselect.insert.trigger.js (100%) rename {src => packages/fineui/src}/widget/multiselect/multiselect.loader.js (100%) rename {src => packages/fineui/src}/widget/multiselect/multiselect.loader.nobar.js (100%) rename {src => packages/fineui/src}/widget/multiselect/multiselect.popup.view.js (100%) rename {src => packages/fineui/src}/widget/multiselect/multiselect.popup.view.nobar.js (100%) rename {src => packages/fineui/src}/widget/multiselect/multiselect.trigger.js (100%) rename {src => packages/fineui/src}/widget/multiselect/search/multiselect.search.insert.pane.js (100%) rename {src => packages/fineui/src}/widget/multiselect/search/multiselect.search.loader.js (100%) rename {src => packages/fineui/src}/widget/multiselect/search/multiselect.search.pane.js (100%) rename {src => packages/fineui/src}/widget/multiselect/trigger/button.checkselected.js (100%) rename {src => packages/fineui/src}/widget/multiselect/trigger/editor.multiselect.js (100%) rename {src => packages/fineui/src}/widget/multiselect/trigger/editor/editor.patch.js (100%) rename {src => packages/fineui/src}/widget/multiselect/trigger/searcher.multiselect.insert.js (100%) rename {src => packages/fineui/src}/widget/multiselect/trigger/searcher.multiselect.js (100%) rename {src => packages/fineui/src}/widget/multiselect/trigger/switcher.checkselected.js (100%) rename {src => packages/fineui/src}/widget/multiselectlist/__test__/multiselect.insert.nobar.test.js (100%) rename {src => packages/fineui/src}/widget/multiselectlist/__test__/multiselectlist.insert.test.js (100%) rename {src => packages/fineui/src}/widget/multiselectlist/index.js (100%) rename {src => packages/fineui/src}/widget/multiselectlist/multiselectlist.insert.js (100%) rename {src => packages/fineui/src}/widget/multiselectlist/multiselectlist.insert.nobar.js (100%) rename {src => packages/fineui/src}/widget/multiselectlist/multiselectlist.js (100%) rename {src => packages/fineui/src}/widget/multiselecttree/multiselecttree.js (100%) rename {src => packages/fineui/src}/widget/multiselecttree/multiselecttree.popup.js (100%) rename {src => packages/fineui/src}/widget/multitree/check/multi.tree.check.pane.js (100%) rename {src => packages/fineui/src}/widget/multitree/multi.tree.combo.js (100%) rename {src => packages/fineui/src}/widget/multitree/multi.tree.insert.combo.js (100%) rename {src => packages/fineui/src}/widget/multitree/multi.tree.list.combo.js (100%) rename {src => packages/fineui/src}/widget/multitree/multi.tree.popup.js (100%) rename {src => packages/fineui/src}/widget/multitree/trigger/multi.tree.button.checkselected.js (100%) rename {src => packages/fineui/src}/widget/multitree/trigger/multi.tree.search.insert.pane.js (100%) rename {src => packages/fineui/src}/widget/multitree/trigger/multi.tree.search.pane.js (100%) rename {src => packages/fineui/src}/widget/multitree/trigger/searcher.list.multi.tree.js (100%) rename {src => packages/fineui/src}/widget/multitree/trigger/searcher.multi.tree.js (100%) rename {src => packages/fineui/src}/widget/numbereditor/number.editor.js (100%) rename {src => packages/fineui/src}/widget/numberinterval/__test__/numberinterval.test.js (100%) rename {src => packages/fineui/src}/widget/numberinterval/numberinterval.js (100%) rename {src => packages/fineui/src}/widget/numberinterval/singleeditor/single.editor.js (100%) rename {src => packages/fineui/src}/widget/searchmultitextvaluecombo/__test__/multitextvalue.combo.search.test.js (100%) rename {src => packages/fineui/src}/widget/searchmultitextvaluecombo/index.js (100%) rename {src => packages/fineui/src}/widget/searchmultitextvaluecombo/multitextvalue.combo.search.js (100%) rename {src => packages/fineui/src}/widget/searchmultitextvaluecombo/multitextvalue.combo.trigger.search.js (100%) rename {src => packages/fineui/src}/widget/searchmultitextvaluecombo/multitextvalue.loader.search.js (100%) rename {src => packages/fineui/src}/widget/searchmultitextvaluecombo/multitextvalue.popup.view.search.js (100%) rename {src => packages/fineui/src}/widget/searchmultitextvaluecombo/trigger/searcher.multitextvalue.js (100%) rename {src => packages/fineui/src}/widget/selecttree/__test__/selecttree.combo.test.js (100%) rename {src => packages/fineui/src}/widget/selecttree/selecttree.combo.js (100%) rename {src => packages/fineui/src}/widget/selecttree/selecttree.expander.js (100%) rename {src => packages/fineui/src}/widget/selecttree/selecttree.popup.js (100%) rename {src => packages/fineui/src}/widget/singleselect/__test__/singleselect.combo.test.js (100%) rename {src => packages/fineui/src}/widget/singleselect/__test__/singleselect.insert.combo.test.js (100%) rename {src => packages/fineui/src}/widget/singleselect/index.js (100%) rename {src => packages/fineui/src}/widget/singleselect/search/index.js (100%) rename {src => packages/fineui/src}/widget/singleselect/search/singleselect.search.loader.js (100%) rename {src => packages/fineui/src}/widget/singleselect/search/singleselect.search.pane.insert.js (100%) rename {src => packages/fineui/src}/widget/singleselect/search/singleselect.search.pane.js (100%) rename {src => packages/fineui/src}/widget/singleselect/singleselect.combo.js (100%) rename {src => packages/fineui/src}/widget/singleselect/singleselect.insert.combo.js (100%) rename {src => packages/fineui/src}/widget/singleselect/singleselect.list.js (100%) rename {src => packages/fineui/src}/widget/singleselect/singleselect.loader.js (100%) rename {src => packages/fineui/src}/widget/singleselect/singleselect.popup.view.js (100%) rename {src => packages/fineui/src}/widget/singleselect/singleselect.trigger.js (100%) rename {src => packages/fineui/src}/widget/singleselect/singleselectlist.insert.js (100%) rename {src => packages/fineui/src}/widget/singleselect/trigger/editor.singleselect.js (100%) rename {src => packages/fineui/src}/widget/singleselect/trigger/index.js (100%) rename {src => packages/fineui/src}/widget/singleselect/trigger/searcher.singleselect.js (100%) rename {src => packages/fineui/src}/widget/singleslider/__test__/singleslider.test.js (100%) rename {src => packages/fineui/src}/widget/singleslider/button/editor.sign.text.js (100%) rename {src => packages/fineui/src}/widget/singleslider/button/iconbutton.slider.js (100%) rename {src => packages/fineui/src}/widget/singleslider/index.js (100%) rename {src => packages/fineui/src}/widget/singleslider/singleslider.js (100%) rename {src => packages/fineui/src}/widget/singleslider/singleslider.label.js (100%) rename {src => packages/fineui/src}/widget/singleslider/singleslider.normal.js (100%) rename {src => packages/fineui/src}/widget/singletree/__test__/singletree.combo.test.js (100%) rename {src => packages/fineui/src}/widget/singletree/singletree.combo.js (100%) rename {src => packages/fineui/src}/widget/singletree/singletree.popup.js (100%) rename {src => packages/fineui/src}/widget/singletree/singletree.trigger.js (100%) rename {src => packages/fineui/src}/widget/textvaluedownlistcombo/__test__/combo.textvaluedownlist.test.js (100%) rename {src => packages/fineui/src}/widget/textvaluedownlistcombo/combo.textvaluedownlist.js (100%) rename {src => packages/fineui/src}/widget/textvaluedownlistcombo/index.js (100%) rename {src => packages/fineui/src}/widget/textvaluedownlistcombo/trigger.textvaluedownlist.js (100%) rename {src => packages/fineui/src}/widget/time/__test__/time.combo.test.js (100%) rename {src => packages/fineui/src}/widget/time/datetime.popup.js (100%) rename {src => packages/fineui/src}/widget/time/index.js (100%) rename {src => packages/fineui/src}/widget/time/time.combo.js (100%) rename {src => packages/fineui/src}/widget/time/time.trigger.js (100%) rename {src => packages/fineui/src}/widget/timeinterval/__test__/timeinterval.test.js (100%) rename {src => packages/fineui/src}/widget/timeinterval/dateinterval.js (100%) rename {src => packages/fineui/src}/widget/timeinterval/index.js (100%) rename {src => packages/fineui/src}/widget/timeinterval/timeinterval.js (100%) rename {src => packages/fineui/src}/widget/timeinterval/timeperiods.js (100%) rename {src => packages/fineui/src}/widget/year/__test__/combo.year.test.js (100%) rename {src => packages/fineui/src}/widget/year/card.dynamic.year.js (100%) rename {src => packages/fineui/src}/widget/year/card.year.js (100%) rename {src => packages/fineui/src}/widget/year/combo.year.js (100%) rename {src => packages/fineui/src}/widget/year/index.js (100%) rename {src => packages/fineui/src}/widget/year/popup.year.js (100%) rename {src => packages/fineui/src}/widget/year/trigger.year.js (100%) rename {src => packages/fineui/src}/widget/yearinterval/yearinterval.js (100%) rename {src => packages/fineui/src}/widget/yearmonth/__test__/combo.yearmonth.test.js (100%) rename {src => packages/fineui/src}/widget/yearmonth/card.dynamic.yearmonth.js (100%) rename {src => packages/fineui/src}/widget/yearmonth/card.static.yearmonth.js (100%) rename {src => packages/fineui/src}/widget/yearmonth/combo.yearmonth.js (100%) rename {src => packages/fineui/src}/widget/yearmonth/index.js (100%) rename {src => packages/fineui/src}/widget/yearmonth/popup.yearmonth.js (100%) rename {src => packages/fineui/src}/widget/yearmonth/trigger.yearmonth.js (100%) rename {src => packages/fineui/src}/widget/yearmonthinterval/__test__/yearmonthinterval.test.js (100%) rename {src => packages/fineui/src}/widget/yearmonthinterval/yearmonthinterval.js (100%) rename {src => packages/fineui/src}/widget/yearquarter/__test__/combo.yearquarter.test.js (100%) rename {src => packages/fineui/src}/widget/yearquarter/card.dynamic.yearquarter.js (100%) rename {src => packages/fineui/src}/widget/yearquarter/card.static.yearquarter.js (100%) rename {src => packages/fineui/src}/widget/yearquarter/combo.yearquarter.js (100%) rename {src => packages/fineui/src}/widget/yearquarter/index.js (100%) rename {src => packages/fineui/src}/widget/yearquarter/popup.yearquarter.js (100%) rename {src => packages/fineui/src}/widget/yearquarter/trigger.yearquarter.js (100%) rename {src => packages/fineui/src}/widget/yearquarterinterval/yearquarterinterval.js (100%) create mode 100644 packages/fineui/tsconfig.json rename {types => packages/fineui/types}/globals.d.ts (100%) rename {typescript => packages/fineui/typescript}/base/a/a.ts (100%) rename {typescript => packages/fineui/typescript}/base/base.ts (100%) rename {typescript => packages/fineui/typescript}/base/combination/combo.ts (100%) rename {typescript => packages/fineui/typescript}/base/combination/expander.ts (100%) rename {typescript => packages/fineui/typescript}/base/combination/group.button.ts (100%) rename {typescript => packages/fineui/typescript}/base/combination/group.virtual.ts (100%) rename {typescript => packages/fineui/typescript}/base/combination/loader.ts (100%) rename {typescript => packages/fineui/typescript}/base/combination/searcher.ts (100%) rename {typescript => packages/fineui/typescript}/base/combination/switcher.ts (100%) rename {typescript => packages/fineui/typescript}/base/combination/tab.ts (100%) rename {typescript => packages/fineui/typescript}/base/combination/tree.button.ts (100%) rename {typescript => packages/fineui/typescript}/base/foundation/message.ts (100%) rename {typescript => packages/fineui/typescript}/base/layer/layer.popover.ts (100%) rename {typescript => packages/fineui/typescript}/base/layer/layer.popup.ts (100%) rename {typescript => packages/fineui/typescript}/base/list/listview.ts (100%) rename {typescript => packages/fineui/typescript}/base/list/virtualgrouplist.ts (100%) rename {typescript => packages/fineui/typescript}/base/list/virtuallist.ts (100%) rename {typescript => packages/fineui/typescript}/base/pager/pager.ts (100%) rename {typescript => packages/fineui/typescript}/base/pane.ts (100%) rename {typescript => packages/fineui/typescript}/base/single/button/button.basic.ts (100%) rename {typescript => packages/fineui/typescript}/base/single/button/button.node.ts (100%) rename {typescript => packages/fineui/typescript}/base/single/button/buttons/button.icon.ts (100%) rename {typescript => packages/fineui/typescript}/base/single/button/buttons/button.image.ts (100%) rename {typescript => packages/fineui/typescript}/base/single/button/buttons/button.text.ts (100%) rename {typescript => packages/fineui/typescript}/base/single/button/buttons/button.ts (100%) rename {typescript => packages/fineui/typescript}/base/single/button/listitem/blankicontextitem.ts (100%) rename {typescript => packages/fineui/typescript}/base/single/button/listitem/icontexticonitem.ts (100%) rename {typescript => packages/fineui/typescript}/base/single/button/listitem/icontextitem.ts (100%) rename {typescript => packages/fineui/typescript}/base/single/button/node/textnode.ts (100%) rename {typescript => packages/fineui/typescript}/base/single/editor/editor.textarea.ts (100%) rename {typescript => packages/fineui/typescript}/base/single/editor/editor.ts (100%) rename {typescript => packages/fineui/typescript}/base/single/html/html.ts (100%) rename {typescript => packages/fineui/typescript}/base/single/icon/icon.ts (100%) rename {typescript => packages/fineui/typescript}/base/single/iframe/iframe.ts (100%) rename {typescript => packages/fineui/typescript}/base/single/img/img.ts (100%) rename {typescript => packages/fineui/typescript}/base/single/input/checkbox.ts (100%) rename {typescript => packages/fineui/typescript}/base/single/input/input.ts (100%) rename {typescript => packages/fineui/typescript}/base/single/input/radio/radio.ts (100%) rename {typescript => packages/fineui/typescript}/base/single/label/abstract.label.ts (100%) rename {typescript => packages/fineui/typescript}/base/single/label/html.label.ts (100%) rename {typescript => packages/fineui/typescript}/base/single/label/icon.label.ts (100%) rename {typescript => packages/fineui/typescript}/base/single/label/label.ts (100%) rename {typescript => packages/fineui/typescript}/base/single/single.ts (100%) rename {typescript => packages/fineui/typescript}/base/single/text.ts (100%) rename {typescript => packages/fineui/typescript}/base/single/trigger/trigger.ts (100%) rename {typescript => packages/fineui/typescript}/base/tree/customtree.ts (100%) rename {typescript => packages/fineui/typescript}/base/tree/ztree/asynctree.ts (100%) rename {typescript => packages/fineui/typescript}/base/tree/ztree/list/listasynctree.ts (100%) rename {typescript => packages/fineui/typescript}/base/tree/ztree/list/listtreeview.ts (100%) rename {typescript => packages/fineui/typescript}/base/tree/ztree/treeview.ts (100%) rename {typescript => packages/fineui/typescript}/bundle.ts (100%) rename {typescript => packages/fineui/typescript}/case/button/icon/icon.change.ts (100%) rename {typescript => packages/fineui/typescript}/case/button/icon/icon.trigger.ts (100%) rename {typescript => packages/fineui/typescript}/case/button/icon/iconhalf/icon.half.image.ts (100%) rename {typescript => packages/fineui/typescript}/case/button/icon/iconhalf/icon.half.ts (100%) rename {typescript => packages/fineui/typescript}/case/button/item.multiselect.ts (100%) rename {typescript => packages/fineui/typescript}/case/button/item.singleselect.radio.ts (100%) rename {typescript => packages/fineui/typescript}/case/button/item.singleselect.ts (100%) rename {typescript => packages/fineui/typescript}/case/button/node/node.icon.arrow.ts (100%) rename {typescript => packages/fineui/typescript}/case/button/switch.ts (100%) rename {typescript => packages/fineui/typescript}/case/button/treeitem/item.first.treeleaf.ts (100%) rename {typescript => packages/fineui/typescript}/case/button/treeitem/item.last.treeleaf.ts (100%) rename {typescript => packages/fineui/typescript}/case/button/treeitem/item.mid.treeleaf.ts (100%) rename {typescript => packages/fineui/typescript}/case/checkbox/check.arrownode.ts (100%) rename {typescript => packages/fineui/typescript}/case/colorchooser/colorchooser.popup.hex.ts (100%) rename {typescript => packages/fineui/typescript}/case/colorchooser/colorchooser.simple.ts (100%) rename {typescript => packages/fineui/typescript}/case/colorchooser/colorchooser.ts (100%) rename {typescript => packages/fineui/typescript}/case/combo/bubblecombo/combo.bubble.ts (100%) rename {typescript => packages/fineui/typescript}/case/combo/bubblecombo/popup.bubble.ts (100%) rename {typescript => packages/fineui/typescript}/case/combo/combo.textvalue.ts (100%) rename {typescript => packages/fineui/typescript}/case/combo/combo.textvaluesmall.ts (100%) rename {typescript => packages/fineui/typescript}/case/combo/editoriconcheckcombo/combo.editiconcheck.ts (100%) rename {typescript => packages/fineui/typescript}/case/combo/iconcombo/combo.icon.ts (100%) rename {typescript => packages/fineui/typescript}/case/combo/icontextvaluecombo/combo.icontextvalue.ts (100%) rename {typescript => packages/fineui/typescript}/case/combo/popup.textvalue.ts (100%) rename {typescript => packages/fineui/typescript}/case/combo/searchtextvaluecombo/combo.searchtextvalue.ts (100%) rename {typescript => packages/fineui/typescript}/case/combo/textvaluecheckcombo/combo.textvaluecheck.ts (100%) rename {typescript => packages/fineui/typescript}/case/combo/textvaluecheckcombo/popup.textvaluecheck.ts (100%) rename {typescript => packages/fineui/typescript}/case/editor/editor.shelter.ts (100%) rename {typescript => packages/fineui/typescript}/case/editor/editor.sign.ts (100%) rename {typescript => packages/fineui/typescript}/case/editor/editor.state.ts (100%) rename {typescript => packages/fineui/typescript}/case/layer/layer.multipopup.ts (100%) rename {typescript => packages/fineui/typescript}/case/layer/pane.list.ts (100%) rename {typescript => packages/fineui/typescript}/case/linersegment/linear.segment.ts (100%) rename {typescript => packages/fineui/typescript}/case/list/list.select.ts (100%) rename {typescript => packages/fineui/typescript}/case/pager/pager.all.count.ts (100%) rename {typescript => packages/fineui/typescript}/case/pager/pager.direction.ts (100%) rename {typescript => packages/fineui/typescript}/case/segment/segment.ts (100%) rename {typescript => packages/fineui/typescript}/case/toolbar/toolbar.multiselect.ts (100%) rename {typescript => packages/fineui/typescript}/case/trigger/trigger.text.select.ts (100%) rename {typescript => packages/fineui/typescript}/case/trigger/trigger.text.ts (100%) rename {typescript => packages/fineui/typescript}/component/allvaluechooser/abstract.allvaluechooser.ts (100%) rename {typescript => packages/fineui/typescript}/component/allvaluechooser/combo.allvaluechooser.ts (100%) rename {typescript => packages/fineui/typescript}/component/allvaluemultitextvaluecombo/allvalue.multitextvalue.combo.ts (100%) rename {typescript => packages/fineui/typescript}/component/form/form.ts (100%) rename {typescript => packages/fineui/typescript}/component/treevaluechooser/abstract.treevaluechooser.list.ts (100%) rename {typescript => packages/fineui/typescript}/component/treevaluechooser/abstract.treevaluechooser.ts (100%) rename {typescript => packages/fineui/typescript}/component/treevaluechooser/combo.listtreevaluechooser.ts (100%) rename {typescript => packages/fineui/typescript}/component/treevaluechooser/combo.treevaluechooser.insert.ts (100%) rename {typescript => packages/fineui/typescript}/component/treevaluechooser/combo.treevaluechooser.ts (100%) rename {typescript => packages/fineui/typescript}/component/treevaluechooser/pane.treevaluechooser.ts (100%) rename {typescript => packages/fineui/typescript}/core/action/action.show.ts (100%) rename {typescript => packages/fineui/typescript}/core/action/action.ts (100%) rename {typescript => packages/fineui/typescript}/core/base.ts (100%) rename {typescript => packages/fineui/typescript}/core/behavior/behavior.highlight.ts (100%) rename {typescript => packages/fineui/typescript}/core/behavior/behavior.redmark.ts (100%) rename {typescript => packages/fineui/typescript}/core/behavior/behavior.ts (100%) rename {typescript => packages/fineui/typescript}/core/controller/controller.broadcast.ts (100%) rename {typescript => packages/fineui/typescript}/core/controller/controller.layer.ts (100%) rename {typescript => packages/fineui/typescript}/core/controller/controller.ts (100%) rename {typescript => packages/fineui/typescript}/core/decorator/decorator.ts (100%) rename {typescript => packages/fineui/typescript}/core/func/array.ts (100%) rename {typescript => packages/fineui/typescript}/core/func/date.ts (100%) rename {typescript => packages/fineui/typescript}/core/func/function.ts (100%) rename {typescript => packages/fineui/typescript}/core/func/index.ts (100%) rename {typescript => packages/fineui/typescript}/core/func/number.ts (100%) rename {typescript => packages/fineui/typescript}/core/func/string.ts (100%) rename {typescript => packages/fineui/typescript}/core/i18n.ts (100%) rename {typescript => packages/fineui/typescript}/core/inject.ts (100%) rename {typescript => packages/fineui/typescript}/core/ob.ts (100%) rename {typescript => packages/fineui/typescript}/core/platform/web/detectElementResize.ts (100%) rename {typescript => packages/fineui/typescript}/core/platform/web/dom.ts (100%) rename {typescript => packages/fineui/typescript}/core/platform/web/eventListener.ts (100%) rename {typescript => packages/fineui/typescript}/core/platform/web/function.ts (100%) rename {typescript => packages/fineui/typescript}/core/platform/web/index.ts (100%) rename {typescript => packages/fineui/typescript}/core/platform/web/load.ts (100%) rename {typescript => packages/fineui/typescript}/core/plugin.ts (100%) rename {typescript => packages/fineui/typescript}/core/utils/aes.ts (100%) rename {typescript => packages/fineui/typescript}/core/utils/aspect.ts (100%) rename {typescript => packages/fineui/typescript}/core/utils/base64.ts (100%) rename {typescript => packages/fineui/typescript}/core/utils/cache.ts (100%) rename {typescript => packages/fineui/typescript}/core/utils/cellSizeAndPositionManager.ts (100%) rename {typescript => packages/fineui/typescript}/core/utils/chinesePY.ts (100%) rename {typescript => packages/fineui/typescript}/core/utils/events/mousemovetracker.ts (100%) rename {typescript => packages/fineui/typescript}/core/utils/events/wheelhandler.ts (100%) rename {typescript => packages/fineui/typescript}/core/utils/heap.ts (100%) rename {typescript => packages/fineui/typescript}/core/utils/index.ts (100%) rename {typescript => packages/fineui/typescript}/core/utils/linkedHashMap.ts (100%) rename {typescript => packages/fineui/typescript}/core/utils/lru.ts (100%) rename {typescript => packages/fineui/typescript}/core/utils/prefixIntervalTree.ts (100%) rename {typescript => packages/fineui/typescript}/core/utils/queue.ts (100%) rename {typescript => packages/fineui/typescript}/core/utils/sectionManager.ts (100%) rename {typescript => packages/fineui/typescript}/core/utils/tree.ts (100%) rename {typescript => packages/fineui/typescript}/core/utils/vector.ts (100%) rename {typescript => packages/fineui/typescript}/core/var.ts (100%) rename {typescript => packages/fineui/typescript}/core/widget.ts (100%) rename {typescript => packages/fineui/typescript}/core/worker/action/worker.action.ts (100%) rename {typescript => packages/fineui/typescript}/core/worker/controller/worker.controller.ts (100%) rename {typescript => packages/fineui/typescript}/core/worker/controller/worker.main_thread.controller.ts (100%) rename {typescript => packages/fineui/typescript}/core/worker/controller/worker.worker_thread.controller.ts (100%) rename {typescript => packages/fineui/typescript}/core/worker/worker.channel.ts (100%) rename {typescript => packages/fineui/typescript}/core/worker/worker.core.ts (100%) rename {typescript => packages/fineui/typescript}/core/worker/worker.main_thread.ts (100%) rename {typescript => packages/fineui/typescript}/core/worker/worker.worker_thread.ts (100%) rename {typescript => packages/fineui/typescript}/core/worker/workers.ts (100%) rename {typescript => packages/fineui/typescript}/core/wrapper/layout.ts (100%) rename {typescript => packages/fineui/typescript}/core/wrapper/layout/adapt/absolute.center.ts (100%) rename {typescript => packages/fineui/typescript}/core/wrapper/layout/adapt/adapt.center.ts (100%) rename {typescript => packages/fineui/typescript}/core/wrapper/layout/adapt/adapt.horizontal.ts (100%) rename {typescript => packages/fineui/typescript}/core/wrapper/layout/adapt/adapt.leftrightvertical.ts (100%) rename {typescript => packages/fineui/typescript}/core/wrapper/layout/adapt/adapt.leftvertical.ts (100%) rename {typescript => packages/fineui/typescript}/core/wrapper/layout/adapt/adapt.table.ts (100%) rename {typescript => packages/fineui/typescript}/core/wrapper/layout/adapt/adapt.vertical.ts (100%) rename {typescript => packages/fineui/typescript}/core/wrapper/layout/adapt/auto.horizontal.ts (100%) rename {typescript => packages/fineui/typescript}/core/wrapper/layout/adapt/float.horizontal.ts (100%) rename {typescript => packages/fineui/typescript}/core/wrapper/layout/adapt/inline.vertical.ts (100%) rename {typescript => packages/fineui/typescript}/core/wrapper/layout/fill/fill.horizontal.ts (100%) rename {typescript => packages/fineui/typescript}/core/wrapper/layout/fill/fill.vertical.ts (100%) rename {typescript => packages/fineui/typescript}/core/wrapper/layout/layout.absolute.ts (100%) rename {typescript => packages/fineui/typescript}/core/wrapper/layout/layout.adaptive.ts (100%) rename {typescript => packages/fineui/typescript}/core/wrapper/layout/layout.card.ts (100%) rename {typescript => packages/fineui/typescript}/core/wrapper/layout/layout.default.ts (100%) rename {typescript => packages/fineui/typescript}/core/wrapper/layout/layout.flow.ts (100%) rename {typescript => packages/fineui/typescript}/core/wrapper/layout/layout.grid.ts (100%) rename {typescript => packages/fineui/typescript}/core/wrapper/layout/layout.horizontal.ts (100%) rename {typescript => packages/fineui/typescript}/core/wrapper/layout/layout.table.ts (100%) rename {typescript => packages/fineui/typescript}/core/wrapper/layout/layout.tape.ts (100%) rename {typescript => packages/fineui/typescript}/core/wrapper/layout/layout.td.ts (100%) rename {typescript => packages/fineui/typescript}/core/wrapper/layout/layout.vertical.ts (100%) rename {typescript => packages/fineui/typescript}/core/wrapper/layout/middle/middle.center.ts (100%) rename {typescript => packages/fineui/typescript}/core/wrapper/layout/middle/middle.float.center.ts (100%) rename {typescript => packages/fineui/typescript}/core/wrapper/layout/sticky/sticky.horizontal.ts (100%) rename {typescript => packages/fineui/typescript}/core/wrapper/layout/sticky/sticky.vertical.ts (100%) rename {typescript => packages/fineui/typescript}/index.ts (100%) rename {typescript => packages/fineui/typescript}/router/router.ts (100%) rename {typescript => packages/fineui/typescript}/shims-tsx.ts (100%) rename {typescript => packages/fineui/typescript}/widget/collapse/collapse.ts (100%) rename {typescript => packages/fineui/typescript}/widget/date/calendar/popup.calendar.date.ts (100%) rename {typescript => packages/fineui/typescript}/widget/datepane/datepane.ts (100%) rename {typescript => packages/fineui/typescript}/widget/datetime/datetime.combo.ts (100%) rename {typescript => packages/fineui/typescript}/widget/datetimepane/datetimepane.ts (100%) rename {typescript => packages/fineui/typescript}/widget/downlist/combo.downlist.ts (100%) rename {typescript => packages/fineui/typescript}/widget/downlist/item.downlistgroup.ts (100%) rename {typescript => packages/fineui/typescript}/widget/downlist/popup.downlist.ts (100%) rename {typescript => packages/fineui/typescript}/widget/dynamicdate/dynamicdate.combo.ts (100%) rename {typescript => packages/fineui/typescript}/widget/dynamicdatetime/dynamicdatetime.combo.ts (100%) rename {typescript => packages/fineui/typescript}/widget/editor/editor.multifile.ts (100%) rename {typescript => packages/fineui/typescript}/widget/editor/editor.search.ts (100%) rename {typescript => packages/fineui/typescript}/widget/editor/editor.text.small.ts (100%) rename {typescript => packages/fineui/typescript}/widget/editor/editor.text.ts (100%) rename {typescript => packages/fineui/typescript}/widget/intervalslider/intervalslider.ts (100%) rename {typescript => packages/fineui/typescript}/widget/multilayerdownlist/multilayerdownlist.combo.ts (100%) rename {typescript => packages/fineui/typescript}/widget/multilayerdownlist/multilayerdownlist.popup.ts (100%) rename {typescript => packages/fineui/typescript}/widget/multilayerselecttree/multilayerselecttree.combo.ts (100%) rename {typescript => packages/fineui/typescript}/widget/multilayerselecttree/multilayerselecttree.leveltree.ts (100%) rename {typescript => packages/fineui/typescript}/widget/multilayerselecttree/multilayerselecttree.popup.ts (100%) rename {typescript => packages/fineui/typescript}/widget/multilayersingletree/multilayersingletree.combo.ts (100%) rename {typescript => packages/fineui/typescript}/widget/multilayersingletree/multilayersingletree.leveltree.ts (100%) rename {typescript => packages/fineui/typescript}/widget/multilayersingletree/multilayersingletree.popup.ts (100%) rename {typescript => packages/fineui/typescript}/widget/multiselect/multiselect.combo.ts (100%) rename {typescript => packages/fineui/typescript}/widget/multiselect/multiselect.insert.combo.ts (100%) rename {typescript => packages/fineui/typescript}/widget/multiselectlist/multiselectlist.insert.ts (100%) rename {typescript => packages/fineui/typescript}/widget/multiselecttree/multiselecttree.ts (100%) rename {typescript => packages/fineui/typescript}/widget/multitree/multi.tree.combo.ts (100%) rename {typescript => packages/fineui/typescript}/widget/multitree/multi.tree.insert.combo.ts (100%) rename {typescript => packages/fineui/typescript}/widget/multitree/multi.tree.list.combo.ts (100%) rename {typescript => packages/fineui/typescript}/widget/multitree/multi.tree.popup.ts (100%) rename {typescript => packages/fineui/typescript}/widget/numbereditor/numbereditor.ts (100%) rename {typescript => packages/fineui/typescript}/widget/numberinterval/numberinterval.ts (100%) rename {typescript => packages/fineui/typescript}/widget/selecttree/selecttree.expander.ts (100%) rename {typescript => packages/fineui/typescript}/widget/singleselect/singleselect.combo.ts (100%) rename {typescript => packages/fineui/typescript}/widget/singleselect/singleselect.insert.combo.ts (100%) rename {typescript => packages/fineui/typescript}/widget/singleselect/singleselectlist.insert.ts (100%) rename {typescript => packages/fineui/typescript}/widget/textvaluedownlistcombo/combo.textvaluedownlist.ts (100%) rename {typescript => packages/fineui/typescript}/widget/time/time.combo.ts (100%) rename {typescript => packages/fineui/typescript}/widget/timeinterval/dateinterval.ts (100%) rename {typescript => packages/fineui/typescript}/widget/timeinterval/timeinterval.ts (100%) rename {typescript => packages/fineui/typescript}/widget/year/combo.year.ts (100%) rename {typescript => packages/fineui/typescript}/widget/year/popup.year.ts (100%) rename {typescript => packages/fineui/typescript}/widget/yearmonth/combo.yearmonth.ts (100%) rename {typescript => packages/fineui/typescript}/widget/yearmonth/popup.yearmonth.ts (100%) rename {typescript => packages/fineui/typescript}/widget/yearmonthinterval/yearmonthinterval.ts (100%) rename {typescript => packages/fineui/typescript}/widget/yearquarter/combo.yearquarter.ts (100%) create mode 100644 packages/fineui/webpack.prod.js delete mode 100644 plugins/webpack-fui-worker-plugin/constants.js delete mode 100644 plugins/webpack-fui-worker-plugin/index.js delete mode 100644 plugins/webpack-fui-worker-plugin/worker-loader.js create mode 100644 pnpm-lock.yaml create mode 100644 pnpm-workspace.yaml delete mode 100644 private/less/app.less delete mode 100644 private/less/background.less delete mode 100644 private/less/font.less delete mode 100644 private/less/icon.less delete mode 100644 private/less/var.less delete mode 100644 public/js/index.js delete mode 100644 public/less/app.less delete mode 100644 public/less/background.less delete mode 100644 public/less/font.less delete mode 100644 public/less/icon.less delete mode 100644 public/less/var.less delete mode 100644 publish.bat delete mode 100644 publish.sh delete mode 100644 rollup.config.js create mode 100644 script/code.static.js create mode 100644 script/lib/fui.component.json create mode 100644 script/lib/fui.export.txt create mode 100644 script/lib/utils.js create mode 100644 script/rename.js delete mode 100644 server.js delete mode 100644 src/base/0.base.js delete mode 100644 src/base/1.pane.js delete mode 100644 src/base/pager/pager.js delete mode 100644 src/case/ztree/treeview.js delete mode 100644 src/component/index.js delete mode 100644 src/core/2.base.js delete mode 100644 src/core/4.widget.js delete mode 100644 src/core/5.inject.js delete mode 100644 src/core/controller/controller.layer.js delete mode 100644 src/core/index.js delete mode 100644 src/core/system.js delete mode 100644 src/core/utils/dom.js delete mode 100644 src/core/version.js delete mode 100644 src/core/wrapper/layout.js delete mode 100644 src/index.js delete mode 100644 src/router/router.js delete mode 100644 src/widget/index.js delete mode 100644 template/index.html delete mode 100644 tsconfig.json delete mode 100644 ui/js/index.js delete mode 100644 ui/less/app.less delete mode 100644 ui/less/background.less delete mode 100644 ui/less/font.less delete mode 100644 ui/less/icon.less delete mode 100644 ui/less/var.less delete mode 100644 webpack/attachments.js delete mode 100644 webpack/components.js delete mode 100644 webpack/dirs.js delete mode 100644 webpack/utils.js delete mode 100644 webpack/webpack.common.js delete mode 100644 webpack/webpack.css.js delete mode 100644 webpack/webpack.dev.js delete mode 100644 webpack/webpack.prod.js diff --git a/.eslintignore b/.eslintignore deleted file mode 100644 index 77738287f..000000000 --- a/.eslintignore +++ /dev/null @@ -1 +0,0 @@ -dist/ \ No newline at end of file diff --git a/.eslintrc b/.eslintrc index 0041bf7e0..3fbfc3524 100644 --- a/.eslintrc +++ b/.eslintrc @@ -21,29 +21,23 @@ "ecmaVersion": 6, "sourceType": "module", "ecmaFeatures": { - "modules": true, - "legacyDecorators": true + "modules": true } }, "plugins": ["@typescript-eslint/eslint-plugin"], "overrides": [{ "files": ["src/*.js","src/**/*.js", "demo/*.js", "demo/**/*.js", "i18n/**/*.js", "i18n/*.js", "test/**/*.js", "test/*.js", "examples/*.js", "examples/**/*.js"], - "extends": "plugin:@fui/esnext", + "extends": "plugin:@fui/es5", "rules": { "no-param-reassign": "off", "quotes": [2, "double"], - "comma-dangle": ["error", { "arrays": "never", "objects": "always-multiline"}], // 多行对象字面量中要求拖尾逗号 - "no-var": 2, - "prefer-const": 2, - "indent": ["error", 4, { "SwitchCase": 1 }], - "no-use-before-define": 0, - "eqeqeq": 0 + "comma-dangle": ["error", { "arrays": "never", "objects": "always-multiline"}] // 多行对象字面量中要求拖尾逗号 } }, { "files": ["webpack/*.js", "./*.js", "lib/**/*.js", "lib/*.js", "./bin/*.js", "./bin/**/*.js"], "extends": "plugin:@fui/esnext" - // }, { - // "files": ["types/*.ts", "typescript/*.ts","typescript/**/*.ts"], - // "extends": "plugin:@fui/typescript" + }, { + "files": ["types/*.ts", "typescript/*.ts","typescript/**/*.ts"], + "extends": "plugin:@fui/typescript" }] } diff --git a/.gitignore b/.gitignore index 7ccb96f74..a0270fb28 100644 --- a/.gitignore +++ b/.gitignore @@ -1,11 +1,2 @@ -node_modules/ -/.idea/ -#demo.js -#demo.css -.DS_Store -coverage -unit.test.statistic.json -package-lock.json -yarn.lock -*.tgz -dist/ +node_modules +dist \ No newline at end of file diff --git a/.npmignore b/.npmignore deleted file mode 100644 index 0f0f7d2e4..000000000 --- a/.npmignore +++ /dev/null @@ -1,44 +0,0 @@ -* -!public/less/*.less -!src/less/**/* -!dist/lib/*.d.ts -!dist/lib/**/*.d.ts -!dist/font.css -!dist/fineui.css -!dist/fineui.js -!dist/fineui.js.map -!dist/fineui.min.css -!dist/fineui_without_normalize.min.css -!dist/fineui.min.js -!dist/fineui.min.js.map -!dist/core.css -!dist/core.js -!dist/resource.css -!dist/resource.js -!dist/utils.js -!dist/utils.js.map -!dist/utils.min.js -!dist/utils.min.js.map -!dist/fineui_without_jquery_polyfill.js -!dist/2.0/fineui.css -!dist/2.0/fineui.js -!dist/2.0/fineui.js.map -!dist/2.0/fineui.min.css -!dist/2.0/fineui.min.js -!dist/2.0/fineui.min.js.map -!dist/2.0/fineui_without_normalize.css -!dist/2.0/fineui_without_normalize.min.css -!dist/font/* -!dist/font/**/* -!dist/images/* -!dist/images/**/* -!dist/router.js -!babel.config.js -!babel.config.ie8.js -!.eslintrc -!dist/2.0/jsy.min.css -!dist/2.0/bi.min.css -!bin/* -!bin/**/* -!plugins/* -!plugins/**/* diff --git a/.npmrc b/.npmrc index 92937ea32..53b9f67c8 100644 --- a/.npmrc +++ b/.npmrc @@ -1,2 +1,3 @@ puppeteer_download_host=https://npm.taobao.org/mirrors -@fui:registry=https://npm.fineres.com/ +# @fui:registry=http://43.143.93.24:4873/ +@fui:registry=https://npm.fineres.com/ \ No newline at end of file diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 000000000..0b2315b16 --- /dev/null +++ b/.prettierrc @@ -0,0 +1,7 @@ +{ + "singleQuote": false, + "tabWidth": 4, + "printWidth": 120, + "arrowParens": "avoid", + "endOfLine": "auto" +} diff --git a/LICENSE b/LICENSE deleted file mode 100644 index 76cf19ec8..000000000 --- a/LICENSE +++ /dev/null @@ -1,201 +0,0 @@ - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "{}" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright©2015-present 帆软软件有限公司 - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. \ No newline at end of file diff --git a/README.md b/README.md deleted file mode 100644 index d77fa284b..000000000 --- a/README.md +++ /dev/null @@ -1,15 +0,0 @@ -FineUI -============ -[![License](https://img.shields.io/badge/license-Apache%202-4EB1BA.svg)](https://www.apache.org/licenses/LICENSE-2.0.html) -> UI Framework used in FineBI and FineReport - -For more details, see the website [http://www.fanruan.com](http://www.fanruan.com). - -Documentation -============= - -http://fanruan.design/doc.html?post=0169cf558d - -License -============ -Please refer to [LICENSE](https://code.fanruan.com/fanruan/fineui/src/branch/master/LICENSE) file. diff --git a/babel.config.js b/babel.config.js deleted file mode 100644 index 12cd09e66..000000000 --- a/babel.config.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = require('@fui/babel-preset-fineui').configs.base; diff --git a/bi.lessconfig.json b/bi.lessconfig.json deleted file mode 100644 index d82f94985..000000000 --- a/bi.lessconfig.json +++ /dev/null @@ -1,52 +0,0 @@ -{ - "@color-primary": "#2C60DB", - "@color-green-100": "#3FC47B", - "@color-light-blue-100": "#19B8EA", - "@color-orange-100": "#FAAA39", - "@color-red-100": "#E65251", - "@color-black": "#091E40", - "@color-light-gray": "#ECEEF3", - "@color-light-gray-theme-dark": "#292F45", - "@border-color-line": "rgba(9, 30, 64, 0.15)", - "@border-color-light-line": "#E6E9EF", - "@border-color-dark-line": "#2E3A4D", - "@color-sliver-theme-dark": "#363E55", - "@border-color-disabled": "rgba(9, 30, 64, 0.07)", - "@font-color-normal": "#091E40", - "@font-color-gray": "rgba(9, 30, 64, 0.9)", - "@font-color-light-gray": "rgba(9, 30, 64, 0.66)", - "@font-color-tips": "rgba(9, 30, 64, 0.47)", - "@font-color-disabled": "rgba(9, 30, 64, 0.25)", - "@background-color-normal": "#F8F9FC", - "@color-bi-background-active-radio": "transparent", - "@color-bi-border-radio": "rgba(9, 30, 64, 0.37)", - "@color-bi-border-disabled-radio": "rgba(9, 30, 64, 0.19)", - "@color-bi-background-active-radio-content": "#2C60DB", - "@color-bi-border-checkbox-theme-dark": "rgba(255, 255, 255, 0.37)", - "@color-bi-border-hover-active-radio-theme-dark": "#3869DC", - "@color-bi-background-active-radio-content-theme-dark": "#3869DC", - "@color-bi-background-disabled-active-radio-content": "#FFFFFF", - "@color-bi-background-disabled-active-radio-content-theme-dark": "#606479", - "@color-bi-background-disabled-active-checkbox-content": "#FFFFFF", - "@color-bi-background-disabled-active-checkbox-content-theme-dark": "#606479", - "@color-bi-background-tooltip-success": "#3F506A", - "@color-bi-background-tooltip-failure": "#E65251", - "@color-bi-border-tooltip-success": "#2E3A4D", - "@color-bi-background-toast-success": "#FFFFFF", - "@color-bi-background-toast-warning": "#FFFFFF", - "@color-bi-background-toast-error": "#FFFFFF", - "@color-bi-background-toast-normal": "#FFFFFF", - "@color-bi-color-toast-success": "#3FC47B", - "@color-bi-color-toast-warning": "#FAAA39", - "@color-bi-color-toast-error": "#E65251", - "@color-bi-color-toast-normal": "#2C60DB", - "@color-bi-color-toast-text": "#000A19", - "@color-bi-text-header-background": "rgba(9, 30, 64, 0.9)", - "@color-bi-text-header-background-theme-dark": "rgba(255, 255, 255, 0.9)", - "@font-date": "e733", - "@font-trigger-triangle": "e924", - "@font-solid-bottom": "e905", - "@font-solid-right": "e906", - "@font-dot": "e762", - "@font-down-triangle": "e70b" -} diff --git a/bin/cli/cli.js b/bin/cli/cli.js deleted file mode 100755 index 513024023..000000000 --- a/bin/cli/cli.js +++ /dev/null @@ -1,21 +0,0 @@ -#!/usr/bin/env node -const yargs = require('yargs/yargs'); -const { hideBin } = require('yargs/helpers'); - -const workerCmd = require('./worker/cli.worker'); - -const argv = yargs(hideBin(process.argv)).argv; - -const cmd = argv._[0]; - -const cmds = new Map([ - ['worker', workerCmd], -]); - -if (!cmd) throw new Error('Command is undefined!'); - -if (cmds.has(cmd)) { - cmds.get(cmd)?.exec(argv); -} else { - throw new Error(`Command ${cmd} not supported`); -} diff --git a/bin/cli/worker/cli.worker.js b/bin/cli/worker/cli.worker.js deleted file mode 100644 index b67513fbb..000000000 --- a/bin/cli/worker/cli.worker.js +++ /dev/null @@ -1,76 +0,0 @@ -const fs = require('fs'); -const path = require('path'); - -function first2UpperCase(str) { - return str.toLowerCase().replace(/( |^)[a-z]/g, L => L.toUpperCase()); -} - -function scanAndCreate(structure, workerName, root) { - Object.keys(structure) - .forEach(name => { - if (typeof structure[name] === 'object') { - fs.mkdirSync(path.resolve(root, name)); - - scanAndCreate(structure[name], workerName, path.resolve(root, `./${name}`)); - } else if (structure[name] === '') { - fs.appendFileSync(path.resolve(root, name), ''); - } else if (typeof structure[name] === 'string') { - let content = fs.readFileSync(structure[name]).toString(); - - content = content - .replace(/\${WorkerName}/g, first2UpperCase(workerName)) - .replace(/\${workerName}/g, workerName); - - fs.appendFileSync(path.resolve(root, name), content); - } - }); -} - -module.exports = { - exec: async args => { - if (!args.init) { - throw new Error(`Command init not found in args`); - } - - if (!args.name) { - throw new Error('Command --name=... not found in args'); - } - - const name = args.name; - - const structure = { - [`${name}_worker`]: { - 'main_thread': { - action: { - 'action.worker_ability_test.ts': path.resolve(__dirname, './template/main_thread/action/action.worker_ability_test.t'), - }, - [`${name}_main_thread.ts`]: path.resolve(__dirname, './template/main_thread/main_thread.t'), - }, - utils: { - 'action_type.ts': path.resolve(__dirname, './template/utils/action_type.t'), - 'payload_type.ts': path.resolve(__dirname, './template/utils/payload_type.t'), - }, - 'worker_thread': { - action: { - 'action.worker_ability_test.ts': path.resolve(__dirname, './template/worker_thread/action/action.worker_ability_test.t'), - }, - [`${name}_worker_thread.ts`]: path.resolve(__dirname, './template/worker_thread/worker_thread.t'), - }, - [`${name}_main_thread.helper.ts`]: path.resolve(__dirname, './template/main_thread.helper.t'), - }, - }; - - scanAndCreate(structure, name, args.where ? path.resolve(args.where) : process.cwd()); - }, -}; - -// 结构 -// -xxx_worker -// -|--main_thread -// -|--|--action -// -|--|--xxx_main_thread.ts -// -|--utils -// -|--|--action_type.ts -// -|--worker_thread -// -|--|--action -// -|--|--worker_main_thread.ts diff --git a/bin/cli/worker/template/main_thread.helper.t b/bin/cli/worker/template/main_thread.helper.t deleted file mode 100644 index 2ee06acb7..000000000 --- a/bin/cli/worker/template/main_thread.helper.t +++ /dev/null @@ -1,48 +0,0 @@ -import { ${WorkerName}MainThreadWorker } from './main_thread/${workerName}_main_thread'; -// 不需要一起打包的话则不需要引入这行 -// FuiWorkerPlugin中的属性会同步到fui-worker中,同时支持loader行内传入属性 -// 根据实际需求传入inline,返回格式 true -> blob url,false -> servicePath -import workerUrl from 'fui-worker!./worker_thread/${workerName}_worker_thread'; - -export class ${WorkerName}WorkerHelper { - private worker: ${WorkerName}MainThreadWorker; - - /** - * 拿到helper中的worker - */ - public getWorker() { - if (this.worker) { - return this.worker; - } - - this.worker = BI.Workers.createWorker(${WorkerName}MainThreadWorker, { - workerUrl: this.urlFormatter(workerUrl), - workerName: BI.UUID(), - }); - - return this.worker; - } - - /** - * 格式化worker url,比如补充一些环境信息到参数里 - * 可通过 #hash 将参数传入blob url - * @param url worker url - */ - private urlFormatter(url: string) { - return url; - } - - /** - * 终止worker - */ - public terminate() { - this.worker?.terminate(); - } -} - -// 使用示例 -// const workerHelper = new ${WorkerName}WorkerHelper(); - -// workerHelper.getWorker() -// .testCommunication() -// .then(res => console.log(res)); diff --git a/bin/cli/worker/template/main_thread/action/action.worker_ability_test.t b/bin/cli/worker/template/main_thread/action/action.worker_ability_test.t deleted file mode 100644 index 42425b859..000000000 --- a/bin/cli/worker/template/main_thread/action/action.worker_ability_test.t +++ /dev/null @@ -1,13 +0,0 @@ -import { WorkerAbilityTestActionType } from '../../utils/action_type'; -import { WorkerAbilityTestPayload, WorkerAbilityTestReponse } from '../../utils/payload_type'; - -export class WorkerAbilityTestMainThreadAction extends BI.Workers.WorkerBaseAction { - /** - * 通信能力检测 - */ - public communicationTest(): Promise { - const mainThreadPostTime: WorkerAbilityTestPayload['CommunicationTest'] = Date.now(); - - return this.controller.requestPromise(WorkerAbilityTestActionType.CommunicationTest, mainThreadPostTime); - } -} diff --git a/bin/cli/worker/template/main_thread/main_thread.t b/bin/cli/worker/template/main_thread/main_thread.t deleted file mode 100644 index 00fb09177..000000000 --- a/bin/cli/worker/template/main_thread/main_thread.t +++ /dev/null @@ -1,13 +0,0 @@ -import { WorkerAbilityTestMainThreadAction } from './action/action.worker_ability_test'; - -export class ${WorkerName}MainThreadWorker extends BI.Workers.MainThreadWorker { - private communicationTest: WorkerAbilityTestMainThreadAction; - - public initActions(): void { - this.communicationTest = this.createAction(WorkerAbilityTestMainThreadAction); - } - - public testCommunication() { - return this.communicationTest.communicationTest(); - } -} diff --git a/bin/cli/worker/template/utils/action_type.t b/bin/cli/worker/template/utils/action_type.t deleted file mode 100644 index c92de897a..000000000 --- a/bin/cli/worker/template/utils/action_type.t +++ /dev/null @@ -1,8 +0,0 @@ -/* - * Worker 事务标识 - * 每类事务有命名空间, 包含多个具体事务 - */ - -export const enum WorkerAbilityTestActionType { - CommunicationTest = 'CommunicationTest', -} diff --git a/bin/cli/worker/template/utils/payload_type.t b/bin/cli/worker/template/utils/payload_type.t deleted file mode 100644 index 6b9a71509..000000000 --- a/bin/cli/worker/template/utils/payload_type.t +++ /dev/null @@ -1,13 +0,0 @@ -/** - * 跨线程通信各事务的发送数据类型声明 - */ -export interface WorkerAbilityTestPayload { - CommunicationTest: number; -} - -/** - * 跨线程通信各事务的响应数据类型声明 - */ -export interface WorkerAbilityTestReponse { - CommunicationTest: number; -} diff --git a/bin/cli/worker/template/worker_thread/action/action.worker_ability_test.t b/bin/cli/worker/template/worker_thread/action/action.worker_ability_test.t deleted file mode 100644 index f7d1248f4..000000000 --- a/bin/cli/worker/template/worker_thread/action/action.worker_ability_test.t +++ /dev/null @@ -1,24 +0,0 @@ -import { WorkerAbilityTestActionType } from '../../utils/action_type'; -import { WorkerAbilityTestPayload, WorkerAbilityTestReponse } from '../../utils/payload_type'; - -export class WorkerAbilityTestWorkerThreadAction extends BI.Workers.WorkerBaseAction { - protected addActionHandler(): void { - this.controller.addActionHandler( - WorkerAbilityTestActionType.CommunicationTest, - this.communicationTest.bind(this) - ); - } - - /** - * 通信能力检测的处理器 - */ - private communicationTest( - payload: WorkerAbilityTestPayload['CommunicationTest'] - ): WorkerAbilityTestReponse['CommunicationTest'] { - const mainThreadPostTime = payload; - // 收到主线程信息的耗时 - const workerGetMessageDuration = Date.now() - mainThreadPostTime; - - return workerGetMessageDuration; - } -} diff --git a/bin/cli/worker/template/worker_thread/worker_thread.t b/bin/cli/worker/template/worker_thread/worker_thread.t deleted file mode 100644 index f437bbc23..000000000 --- a/bin/cli/worker/template/worker_thread/worker_thread.t +++ /dev/null @@ -1,12 +0,0 @@ -// TODO: 这边需要先import fineui资源 -import { WorkerAbilityTestWorkerThreadAction } from './action/action.worker_ability_test'; - -class ${WorkerName}WorkerTreadWorker extends BI.Workers.WorkerThreadWorker { - public communicationTest: WorkerAbilityTestWorkerThreadAction; - - public initActions(): void { - this.communicationTest = this.createAction(WorkerAbilityTestWorkerThreadAction); - } -} - -export const ${workerName}WorkerTreadWorker = BI.Workers.createWorker(${WorkerName}WorkerTreadWorker); diff --git a/changelog.md b/changelog.md deleted file mode 100644 index dbcca9ccd..000000000 --- a/changelog.md +++ /dev/null @@ -1,281 +0,0 @@ -# 更新日志 - -3.0(2022-05) -- 下拉选择框支持清空 - -3.0(2022-03) -- 支持响应式 -- 全面支持Typescript -- 增加JSX支持 -- 布局组件支持更多动态特性 -- 底层API支持动画 -- 增加WebWorker支持 -- 支持路由 -- 插件支持版本控制 -- Fix数据流支持proxy版本 - -2.0(2022-01) -- 提供自定义表单 - -2.0(2021-12) -- 新增Context组件 -- toast支持closable属性,可控制是否显示关闭按钮 -- 新增气泡弹框控件 -- BI.point支持widget添加埋点 -- childContext废弃,替换成provide -- 支持BI.useContext获取上下文环境 -- BI.Msg.alert支持message传json格式 -- 支持BI.config(function(){})进行系统配置 - -2.0(2021-11) -- 限制了复选下拉框一次粘贴添加值个数最大2000 - -2.0(2021-10) -- combo增加window.blur事件触发隐藏 - -2.0(2021-09) -- 支持自动watch -- 支持h函数传递left、right,优化left_right_vertical_adapt布局的jsx写法 -- 新增bi.virtual_group_list组件 - -2.0(2021-07) -- layout支持forceUpdate刷新方式 -- width属性支持calc() -- 修改了颜色选择器交互 -- 新增bi.horizontal_fill、bi.vertical_fill布局 -- 增加module定义插件版本号 -- bubble使用popper.js实现 -- 优化了日期类型控件标红时的报错提示 -- 支持虚拟dom -- 修复了树控件节点未初始化时调用树的getValue始终为空的问题 - -2.0(2021-05) -- 支持搜索的控件支持搜索包含空格的字符串 -- 解决了树列表populate调用两次itemsCreator的问题 - -2.0(2021-03) -- 优化left_right_vertical_adapt布局,去掉float属性只使用flex -- inline布局支持用calc计算fill列宽度 -- 时间类型控件无翻页限制 -- 时间类型控件优化动态时间面板的交互 - -2.0(2021-02) -- 增加beforeRender生命周期函数 - -2.0(2021-01) -- 修改了日期下拉面板中的当前时间按钮的交互效果 -- 新增年区间和年季度区间控件 -- 日期类型控件不操作下拉面板收起不发Confirm事件 -- 日期类型控件全系列可设置是否显示动态日期 -- 日期类型控件全系列可设置最大最小日期 -- 调整了combo的popup显示位置计算逻辑 - -2.0(2020-12) -- multi_layer_down_list_combo支持无限层级 -- 新增不带全选的同步复选下拉框 -- 日期选择控件为年月选择器子组件新增POPUP弹出前事件 -- 文件上传控件新增API(setMaxFileLength)以动态设置最大上传文件数量 -- 复选下拉树显示查看已选效果改成和复选下拉列表一致 -- Pane系列提供small和big两种大小的加载动画 -- 同步树列表系列支持不显示节点连接线和展开收起图标 -- 规范了下拉树trigger中显示值的显示顺序 -- bi.editor支持传入autocomplete -- [视觉]editor水印间距统一与文本域水印不可选中 -- 修复bi.file的url参数拼接问题 -- 修复了colorChooser选择透明后, 打开更多选色面板, 直接点保存会选中自动的问题 -- bi.file支持限制上传文件数 - -2.0(2020-11) -- bi.file上传文件errorMsg默认调用国际化 -- 修复了文本标签text传递空字符串后显示value值的问题 -- 限制了title的最大高度 -- bi.textarea_editor添加setWatermark方法 -- 生命周期可以通过属性传递来操作 -- 修复了颜色选择器hex框不能输入为空的问题 -- 增加纯文本组件bi.pure_text -- store支持webworker,引入多线程机制 -- 修复了Popover小屏幕上看不完整的问题 -- 颜色选择器支持输入16进制颜色编号 -- bi.textarea_editor支持气泡提示报错 - -2.0(2020-10) -- 支持Composition API -- pane和loadingPane支持加载时自定义提示文本 - -2.0(2020-09) -- combo增加click-blur(点击显示,blur消失)作为触发条件功能 -- allCountPager支持是否显示总行数 -- 修复区间滑块setEnable(false)滑块不灰化的问题 -- 修复同步复选下拉框系列setValue所有值后触发器不显示全选的问题 -- BI.Tree.traversal方法迭代函数增加父节点参数 - -2.0(2020-08) -- bi.sign_editor支持显示值居左/居中/居右显示 -- bi.iframe新增EVENT_LOADED事件 -- 修复了searcher在允许搜索的情况下输入空格直接退出搜索的问题 -- 修复了复选下拉系列'点按空格添加完全匹配项'添加的是显示值而非实际值的问题 -- search_text_value_combo支持水印 -- BI.makeObject 方法支持传入iteratee - -2.0(2020-07) -- 修复了日期类型控件先展开切换日期月份面板,再设置区间使得该月份不合法,查看该月份面板灰化不对的问题 -- bi.file文件上传控件accept属性与 [input accept Attribute](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/file#accept) 统一 -- 修复了日期类型控件设置一个不在minDate和maxDate之间的日期值时,面板灰化与翻页按钮状态不对的问题 -- BI.OB的on方法返回一个解除监听的函数 -- 修复了grid_view执行_unMount时不调用子组件的_unMount的问题 -- combo新增belowMouse属性,允许popup在点击处弹出 -- combo新增hideWhenAnotherComboOpen属性,开启则其他combo下拉时当前combo收起 -- 修复了datePicker在setValue的时候没有动态刷新可用月份的问题 -- 同步复选下拉及其面板新增getAllValue获取所有已选值 -- 同步复选下拉树及其面板新增getAllValue获取完整的选中树节点 -- 修复date_picker最大值最小值与面板展示判断问题 -- 复选下拉树和下拉列表添加showView和hideVIew方法 -- number_editor支持自动检测数值与范围是否合法 -- 修复了颜色选择器设置值为null的时候,trigger和popup表现不一致的问题 - -2.0(2020-06) -- 修复了复选下拉树半选节点的子节点未加载的时候,点选该半选节点是取消选中的问题 -- 下拉树系列支持isNeedAdjustWidth以动态变化宽度 -- 修复了新增值的下拉控件传递valueFormatter搜索完全匹配项提示新增 -- 修复了选色控件历史记录没有选中的问题的问题 -- 修复了单选下拉框新增值的时候没有发事件的问题 -- 修复了单选标红combo类setValue为空字符串会标红的问题 -- BI.history提供与注册路由对应的卸载路由方法unRoute -- 修复了单选标红combo类setValue为空和空数组行为不一致的问题 -- 单选列表支持新增选项 -- 增加组件shortcut未定义的错误提示 - -2.0(2020-05) -- 修复调用BI.history.navigate(XXX, {trigger: false})时, XXX包含中文空格等字符仍然触发回调的问题 -- 新增BI.after和BI.before方法 -- 修复bi.button设置宽度并配置iconCls后,文本很长的情况下显示截断的问题 -- 填加bi-user-select-enable和bi-user-select-disable通用类名 -- 修复树系列多层半选状态下,勾选祖先节点,后代节点不受影响的问题 -- 修复上传控件多个title问题 - -2.0(2020-04) -- 修复树列表通过空格回到初始面板没有刷新的问题 -- 下拉树系列添加下拉popup弹出前事件 -- 修复了复选下拉勾选值和搜索结果中含有父子串关系时提示不正确的问题 -- searcher提供可配是否支持搜索空格的allSearchBlank -- 修复了复选下拉全选状态下使用空格添加值trigger显示更新不对的问题 -- 复选下拉树展开节点提供分页加载和滚动加载两种方式 -- 修复了复选下拉列表初始化的时候发送执行两次itemsCreator的问题 -- 修复了virtual_list重新populate无效的问题 -- 复选下拉框新增值的时候外抛事件 -- 空格不再编码成  -- 支持文本区域水印可滚动 - -2.0(2020-03) -- 修复了IE9下使用bi.file上传包含特殊字符的excel出错的问题 -- 修复了下拉类型控件不允许编辑的时候没有title的问题 -- 修复了连续多次调用BI.Msg.alert后只有最后弹出的可以关闭的问题 -- 修复了time_combo设置格式为%M:%S后value设置大于30分钟的值时标红的问题 -- 复选下拉树系列展开节点性能优化 - -2.0(2020-02) -- 拓展BI.concat,使其可以拼接多个数组 -- 修复勾选节点不影响父子节点勾选状态的树搜索选中getValue不正常的问题 - -2.0(2020-01) -- 修复单值系滑块滑动松手后发两次EVENT_CHANGE的问题 - -2.0(2019-12) -- 修复多层级单选下拉树主动设置container后搜索面板弹出问题 -- bi.search_editor支持搜索中间含有空格的字符串 -- 修复了监听日期下拉框before_popup_view事件,调用setMinDate无效的问题 -- 修复了数值滑块逆向排列滑块后populate显示效果不对的问题 -- 不影响父节点勾选状态的复选树支持自定义水印和默认值 -- 修复text组件重新设置文本后标红丢失问题 -- 添加无全选按钮的复选下拉框组件 - -2.0(2019-11) -- 日期系列新增setMinDate和setMaxDate接口 -- 修复了同步复选树设置节点默认open后, 叶子节点无法选中的问题 -- 修复了连续多音字搜索可能导致结果异常或者标红异常的问题 -- 新增BI.set(object, path, value)方法 -- getSearchResult兼容了对null值的处理 -- 增加了异步单选下拉树请求完数据后加载完节点后会自动调整宽高的逻辑 - -2.0(2019-10) -- 修改了下拉树展开图标模糊的问题 -- 修复了下拉树搜索高亮字符与正常字符间存在间距的问题 -- 复选下拉系列的计数器从trigger中拆分, 作为独立的部分 -- 增加BI.createElement方法 -- 统一了单选下拉和复选下拉添加自定义值的交互效果 - -2.0(2019-09) -- [视觉]popover弹出框增加圆角 -- 文本列表通过复制粘贴的形式选中值的时候发送事件 -- 修复tree_value_chooser选中节点的唯一子节点后搜索该子节点,无法取消选中的问题 -- button的bubble创建的popup在收起的时候会destroy -- 修复了dynamic_date_pane在切换静态时间和动态时间的时候不会发事件的问题 - -2.0(2019-08) -- 修复valueChooser系列不支持value属性的问题 -- 更新了若干icon-font的样式 -- 修复了单选树同步搜索状态下父节点前可能没有展开符号的问题 -- 单选树可展示并选中不存在的值 -- 树类型下拉新增可搜索实际值的配置 -- 可编辑的combo新增水印配置 -- 单选下拉树同步状态下内置搜索 - -2.0(2019-07) -- 修改了下拉框控件默认值的配色 -- input及其派生编辑控件在PAUSE事件之前会触发CHANGE事件 - -2.0(2019-06) -- 单选下拉树支持搜索与异步加载节点 -- 提供了AES加密方法 - -2.0(2019-05) -- editor类控件新增EVENT_CHANGE_CONFIRM事件 -- 复选下拉控件和树下拉控件支持trigger是否可编辑 -- 时分秒控件支持自定义时间显示格式和是否可编辑 -- 日期/时间/日期区间/时间区间支持自定义日期选择范围和是否可编辑 -- 日期/时间/日期区间/时间区间支持自定义日期显示格式和是否可编辑 -- 增加less函数: 字体资源添加函数addFontRes和字体激活函数activeFont - -> @fontList: "dec", "report"; -> .addFontRes("dec"); -> .addFontRes("report"); -> .activateFont(@fontList); - -以上即可使用自定义的dec,report字体和fineui的资源字体 - -2.0(2019-04) -- 新增`bi.multi_tree_list_combo`控件, 此下拉树勾选节点时不会影响父子节点的勾选状态 -- 新增`bi.multi_tree_insert_combo`控件, 此下拉树可以插入不存在的新值 -- 新增`bi.list_tree_value_chooser_insert_combo`部件, 封装`bi.multi_tree_list_combo`数据处理逻辑 -- 新增`bi.tree_value_chooser_insert_combo`部件, 封装`bi.multi_tree_insert_combo`数据处理逻辑 -- 增加BI.DOM.ready方法 - -2.0(2019-03) -- 新增`bi.time_combo`时分秒控件和`bi.time_periods`时间选择区间,时间区间无有效值校验 -- Label控件增加highlight参数, 可指定初始化标蓝 - -2.0(2019-01) -- 加载更多的单选下拉系列新增allowNoSelect参数配置, 使得可以不选任意一个值 - -2.0(2018-12) -- 增加Button的点击动画和Combo下拉时下拉图标动画 - - -2.0(2018-11) -- 增加`bi.html`和`bi.html_label`类型,text支持html文本,不支持keyword - - -2.0(2018-10) -- popover增加高度自适应,即open的时候回根据内容高度调整popover的高度 - - -2.0(2018-09) -- 增加Fix对configuable为false的对象的不内部构造响应式数据的性能优化处理,例如: - -> this.model.json = Object.freeze({name: "zhang"}); - -只会对this.model.json进行响应式处理,不会对内部的name进行响应式处理 - - -2.0(2018-08) -- 增加BI.mount方法,支持同构 diff --git a/demo/app.js b/demo/app.js deleted file mode 100644 index f15b97c14..000000000 --- a/demo/app.js +++ /dev/null @@ -1,124 +0,0 @@ -Demo = { - version: 1.0 -}; - -BI.EVENT_BLUR = false - -BI.$(function () { - var ref; - - BI.each(Demo.CONFIG, function (index, item) { - !item.id && (item.id = item.value || item.text); - }); - var tree = BI.Tree.transformToTreeFormat(Demo.CONFIG); - - var routes = [{ - path: "/", - component: function () { - return Promise.resolve({ - type: "demo.face" - }); - } - }, { - name: "component", - path: "/component/:componentId", - component: function () { - return Promise.resolve({ - type: "demo.router" - }); - }, - }, { - name: "user", - path: "/user/:name", - component: function () { - return Promise.resolve({ - type: "bi.vtape", - items: [{ - type: "bi.label", - text: "user", - height: 50 - }, { - type: "bi.router_view", - deps: 1, - height: 100 - }, { - type: "bi.router_view", - name: 'tool-buttons', - deps: 1 - }] - }); - }, - children: [{ - path: '', - components: { - default: function () { - return Promise.resolve({ - type: "bi.label", - text: 'home' - }); - }, - } - }, { - name: 'dashboard', - path: 'dashboard', - component: function () { - return Promise.resolve({ - type: "bi.label", - text: 'dashboard' - }); - } - }, { - name: 'tables', - path: 'tables/:id', - components: { - default: function () { - return Promise.resolve({ - type: "bi.label", - text: 'table-view' - }); - }, - "tool-buttons": function () { - return Promise.resolve({ - type: "bi.label", - text: '预览按钮', - }); - }, - } - }] - }]; - - // BI.Tree.traversal(tree, function (index, node) { - // if (!node.children || BI.isEmptyArray(node.children)) { - // routes.push({ - // path: "/", - // component: function () { - // return Promise.resolve({ - // type: node.value - // }); - // } - // }); - // } - // }); - - // var AppRouter = BI.inherit(BI.Router, obj); - // new AppRouter; - // BI.history.start(); - - BI.createWidget({ - type: "bi.router", - ref: function (_ref) { - BI.$router = _ref.$router; - }, - element: "#wrapper", - routes: routes, - render: function () { - return { - type: "demo.main", - ref: function (_ref) { - console.log(_ref); - ref = _ref; - } - }; - } - }); -}); diff --git a/demo/config.js b/demo/config.js deleted file mode 100644 index a20f13ebe..000000000 --- a/demo/config.js +++ /dev/null @@ -1,1584 +0,0 @@ -Demo.CONFIG = Demo.CORE_CONFIG.concat(Demo.BASE_CONFIG).concat(Demo.CASE_CONFIG).concat(Demo.WIDGET_CONFIG).concat(Demo.COMPONENT_CONFIG).concat(Demo.FIX_CONFIG); - -Demo.CONSTANTS = { - SIMPLE_ITEMS: BI.map("柳州市城贸金属材料有限责任公司 柳州市建福房屋租赁有限公司 柳州市迅昌数码办公设备有限责任公司 柳州市河海贸易有限责任公司 柳州市花篮制衣厂 柳州市兴溪物资有限公司 柳州市针织总厂 柳州市衡管物资有限公司 柳州市琪成机电设备有限公司 柳州市松林工程机械修理厂".match(/[^\s]+/g), function (i, v) { - return { - text: v, - value: v, - title: v - }; - }), - ITEMS: BI.map("柳州市城贸金属材料有限责任公司 柳州市建福房屋租赁有限公司 柳州市迅昌数码办公设备有限责任公司 柳州市河海贸易有限责任公司 柳州市花篮制衣厂 柳州市兴溪物资有限公司 柳州市针织总厂 柳州市衡管物资有限公司 柳州市琪成机电设备有限公司 柳州市松林工程机械修理厂 柳州市积玉贸易有限公司 柳州市福运来贸易有限责任公司 柳州市钢义物资有限公司 柳州市洋力化工有限公司 柳州市悦盛贸易有限公司 柳州市雁城钢管物资有限公司 柳州市恒瑞钢材经营部 柳州市科拓电子有限公司 柳州市九方电子有限公司 柳州市桂龙汽车配件厂 柳州市制鞋工厂 柳州市炜力科贸有限公司 柳州市希翼贸易有限公司 柳州市兆金物资有限公司 柳州市和润电子科技有限责任公司 柳州市汇凯贸易有限公司 柳州市好机汇商贸有限公司 柳州市泛源商贸经营部 柳州市利汇达物资有限公司 广西全民药业有限责任公司 柳州超凡物资贸易有限责任公司 柳州市贵宏物资有限责任公司 柳州昊恒贸易有限责任公司 柳州市浦联物资有限公司 柳州市广通园林绿化工程有限责任公司 柳州市松发物资贸易有限责任公司 柳州市奥士达办公设备有限责任公司 柳州市海泰物资有限公司 柳州市金三环针织厂 柳州市钢贸物资有限公司 柳州市明阳纺织有限公司 柳州市世科科技发展有限公司 柳州市禄羊贸易有限公司 柳州市金兆阳商贸有限公司 柳州市汇昌物资经营部 柳州市林泰金属物资供应站 柳州市自来水管道材料设备公司 柳州市丹柳铝板有限公司 柳州市桂冶物资有限公司 柳州市宸业物资经营部 柳州市耀成贸易有限公司 柳州奥易自动化科技有限公司 柳州市萃丰科技有限责任公司 柳州市华储贸易有限责任公司 柳州市黄颜钢材有限责任公司 柳州市银盛物资有限责任公司 柳州市新仪化玻供应站 柳州市晶凯化工有限公司 广西柳州市柳江包装纸厂 柳州市志新物资有限责任公司 柳州市兆钢物资有限公司 柳州市友方科技发展有限责任公司 柳州市缝纫机台板家具总厂 柳州市晖海数码办公设备有限责任公司 柳州市富兰特服饰有限责任公司 柳州市柳北区富兴物资经营部 柳州市柳锌福利厂 柳州市海泉印刷有限责任公司 柳州市乾亨贸易有限公司 柳州市悦宁物资贸易有限公司 柳州市昊天贸易有限公司 广西惠字钢铁有限公司 柳州市名青物资有限公司 柳州市林郝物资有限公司 柳州市民政服装厂 柳州市多维劳保用品厂 柳州市轻工物资供应公司 柳州市程源物资有限责任公司 柳州市寿丰物资贸易有限责任公司 柳州市凯凡物资有限公司 柳州市利晖物资经营部 柳州市恒茂金属物资供应站 柳州市中储物资经营部 柳州市第二医疗器械厂 柳州市来鑫物资经营部 柳州市钢鑫物资贸易有限责任公司 柳州市双合袜业有限责任公司 柳州市茂松经贸有限责任公司 柳州市行行物资贸易有限公司 柳州市方一物资有限公司 柳州成异钢管销售有限公司 柳州广惠佳电脑有限公司 桂林市圣泽鑫物资有限公司柳州分公司 柳州市砼基建材贸易有限公司 柳州市海燕针织厂 上海浦光仪表厂柳州销售处 柳州市能电工贸有限责任公司 柳州市广贸物资有限公司 柳州市柳北区大昌电工灯饰经营部 柳州市金龙印务有限公司 柳州市奇缘婚典服务有限公司 柳州市盛博物资经营部 柳州市项元钢铁贸易有限公司 柳州市虞美人化妆品经营部 柳州市俊彦鞋厂 柳州市聚源特钢有限公司 柳州市迅龙科贸有限责任公司 柳州市恒飞电子有限责任公司 柳州市蓝正现代办公设备有限责任公司 柳州地区农业生产资料公司 柳州华菱钢管销售有限公司 柳州融通物资有限公司 柳州市可仁广告策划有限责任公司 柳州市鸟鑫物资有限责任公司 柳州市五丰钢材供应站 柳州市金江不锈钢有限公司 柳州市美日物资设备有限责任公司 柳州市鑫东物资贸易有限责任公司 柳州地区日用杂品公司 柳州市华纳物资贸易有限公司 柳州乾利金虹物资贸易有限责任公司 柳州市新迈计算机有限公司 柳州市富丽实业发展公司 柳州市石钢金属材料有限公司 柳州市力志传真机销售有限公司 广西宝森投资有限公司 柳州市嵘基商贸有限公司 柳州市景民商贸有限责任公司 柳州市银桥化玻有限责任公司 柳州市宏文糖烟店 柳州市科苑电脑网络有限公司 柳州市两面针旅游用品厂 柳州市立早室内装璜有限责任公司 柳州地化建材有限公司 柳州市涛达贸易有限公司 柳州市兰丰档案服务中心 柳州市惠贸物资有限责任公司 柳州市立文物资有限责任公司 柳州市致和商贸经营部 柳州市金色阳光信息咨询有限公司 柳州市赛利钢材经销部 柳州市日用化工厂 柳州市昆廷物资有限责任公司 柳州市邦盛贸易有限公司 柳州市济华贸易有限公司 柳州昕威橡塑化工经营部 柳州市联业贸易有限公司 柳州市兰钢贸易有限公司 柳州市子欣科技有限公司 柳州市狄龙机电设备有限公司 柳州市方真物资贸易有限公司 柳州市银鸥废旧回收中心 柳州市冠宝贸易有限公司 柳州市鑫盛德商务咨询有限责任公司 柳州市泰汇银通经贸有限公司 广西瀚维智测科技有限公司 柳州市钓鱼郎制衣有限责任公司 柳州溪水物资有限公司 柳州市融峰物资有限责任公司 广西新地科技有限责任公司 柳州市纺织装饰公司 柳州市粤翔冶金炉料有限公司 柳州市远腾贸易有限公司 柳州市东鸿城市改造有限公司 广西丛欣实业有限公司 柳州市服装厂 柳州市立安联合刀片有限公司 广西国扬投资有限责任公司 柳州市铭泰办公设备公司 柳州市桂钢物资供应站 柳州市昱升物资有限责任公司 柳州市鹰飞灿科贸有限公司 柳州市先导科贸有限公司 柳州市金秋建材物资经营部 柳州市童装厂 柳州市民泽物资有限公司 柳州市恒先物资贸易有限公司 柳州市银夏冷气工程有限责任公司 柳州粮食批发有限责任公司 柳州市金银华窗纱制造有限责任公司 柳州市三方贸易有限公司 柳州市丰涛商贸有限责任公司 柳州华智企业管理咨询有限责任公司 柳州市诚正建筑工程施工图审查有限公司 柳州市今科电讯设备营销中心 柳州市闽德电子有限公司 柳州市鑫虹针织厂 柳州市畅通通讯器材有限责任公司 柳州市正钢物资经营部 柳州市新柳饲料有限责任公司 柳州市黄村油库 柳州市天泰电力装饰工程有限公司 柳州市兆吉物资有限责任公司 柳州市八龙纸制品有限责任公司 柳州市巨佳电脑网络科技有限公司 ".match(/[^\s]+/g), function (i, v) { - return { - text: v, - value: v, - title: v - }; - }), - TREEITEMS: [{ pId: "0", id: "0_0", text: "( 共25个 )", value: "", open: true }, { - pId: "0_0", - id: "0_0_0", - text: "安徽省( 共1个 )", - value: "安徽省", - open: true - }, { pId: "0_0_0", id: "0_0_0_0", text: "芜湖市", value: "芜湖市", open: true }, { - pId: "0_0", - id: "0_0_1", - text: "北京市( 共6个 )", - value: "北京市", - open: true - }, { pId: "0_0_1", id: "0_0_1_0", text: "北京市区", value: "北京市区", open: true }, { - pId: "0_0_1", - id: "0_0_1_1", - text: "朝阳区", - value: "朝阳区", - open: true - }, { pId: "0_0_1", id: "0_0_1_2", text: "东城区", value: "东城区", open: true }, { - pId: "0_0_1", - id: "0_0_1_3", - text: "海淀区4内", - value: "海淀区4内", - open: true - }, { pId: "0_0_1", id: "0_0_1_4", text: "海淀区4外", value: "海淀区4外", open: true }, { - pId: "0_0_1", - id: "0_0_1_5", - text: "石景山区", - value: "石景山区", - open: true - }, { pId: "0_0", id: "0_0_2", text: "福建省( 共2个 )", value: "福建省", open: true }, { - pId: "0_0_2", - id: "0_0_2_0", - text: "莆田市", - value: "莆田市", - open: true - }, { pId: "0_0_2", id: "0_0_2_1", text: "泉州市", value: "泉州市", open: true }, { - pId: "0_0", - id: "0_0_3", - text: "甘肃省( 共1个 )", - value: "甘肃省", - open: true - }, { pId: "0_0_3", id: "0_0_3_0", text: "兰州市", value: "兰州市", open: true }, { - pId: "0_0", - id: "0_0_4", - text: "广东省( 共5个 )", - value: "广东省", - open: true - }, { pId: "0_0_4", id: "0_0_4_0", text: "东莞市", value: "东莞市", open: true }, { - pId: "0_0_4", - id: "0_0_4_1", - text: "广州市", - value: "广州市", - open: true - }, { pId: "0_0_4", id: "0_0_4_2", text: "惠州市", value: "惠州市", open: true }, { - pId: "0_0_4", - id: "0_0_4_3", - text: "深圳市", - value: "深圳市", - open: true - }, { pId: "0_0_4", id: "0_0_4_4", text: "珠海市", value: "珠海市", open: true }, { - pId: "0_0", - id: "0_0_5", - text: "广西壮族自治区( 共1个 )", - value: "广西壮族自治区", - open: true - }, { pId: "0_0_5", id: "0_0_5_0", text: "南宁市", value: "南宁市", open: true }, { - pId: "0_0", - id: "0_0_6", - text: "河北省( 共2个 )", - value: "河北省", - open: true - }, { pId: "0_0_6", id: "0_0_6_0", text: "保定市", value: "保定市", open: true }, { - pId: "0_0_6", - id: "0_0_6_1", - text: "邢台市", - value: "邢台市", - open: true - }, { pId: "0_0", id: "0_0_7", text: "河南省( 共1个 )", value: "河南省", open: true }, { - pId: "0_0_7", - id: "0_0_7_0", - text: "郑州市", - value: "郑州市", - open: true - }, { pId: "0_0", id: "0_0_8", text: "黑龙江省( 共7个 )", value: "黑龙江省", open: true }, { - pId: "0_0_8", - id: "0_0_8_0", - text: "大庆市", - value: "大庆市", - open: true - }, { pId: "0_0_8", id: "0_0_8_1", text: "哈尔滨市", value: "哈尔滨市", open: true }, { - pId: "0_0_8", - id: "0_0_8_2", - text: "鸡西市", - value: "鸡西市", - open: true - }, { pId: "0_0_8", id: "0_0_8_3", text: "佳木斯市", value: "佳木斯市", open: true }, { - pId: "0_0_8", - id: "0_0_8_4", - text: "牡丹江市", - value: "牡丹江市", - open: true - }, { pId: "0_0_8", id: "0_0_8_5", text: "齐齐哈尔市", value: "齐齐哈尔市", open: true }, { - pId: "0_0_8", - id: "0_0_8_6", - text: "双鸭山市", - value: "双鸭山市", - open: true - }, { pId: "0_0", id: "0_0_9", text: "湖北省( 共1个 )", value: "湖北省", open: true }, { - pId: "0_0_9", - id: "0_0_9_0", - text: "武汉市", - value: "武汉市", - open: true - }, { pId: "0_0", id: "0_0_10", text: "湖南省( 共3个 )", value: "湖南省", open: true }, { - pId: "0_0_10", - id: "0_0_10_0", - text: "常德市", - value: "常德市", - open: true - }, { pId: "0_0_10", id: "0_0_10_1", text: "长沙市", value: "长沙市", open: true }, { - pId: "0_0_10", - id: "0_0_10_2", - text: "邵阳市", - value: "邵阳市", - open: true - }, { pId: "0_0", id: "0_0_11", text: "吉林省( 共4个 )", value: "吉林省", open: true }, { - pId: "0_0_11", - id: "0_0_11_0", - text: "白山市", - value: "白山市", - open: true - }, { pId: "0_0_11", id: "0_0_11_1", text: "长春市", value: "长春市", open: true }, { - pId: "0_0_11", - id: "0_0_11_2", - text: "松原市", - value: "松原市", - open: true - }, { pId: "0_0_11", id: "0_0_11_3", text: "通化市", value: "通化市", open: true }, { - pId: "0_0", - id: "0_0_12", - text: "江苏省( 共8个 )", - value: "江苏省", - open: true - }, { pId: "0_0_12", id: "0_0_12_0", text: "常州市", value: "常州市", open: true }, { - pId: "0_0_12", - id: "0_0_12_1", - text: "南京市", - value: "南京市", - open: true - }, { pId: "0_0_12", id: "0_0_12_2", text: "南通市", value: "南通市", open: true }, { - pId: "0_0_12", - id: "0_0_12_3", - text: "苏州市", - value: "苏州市", - open: true - }, { pId: "0_0_12", id: "0_0_12_4", text: "宿迁市", value: "宿迁市", open: true }, { - pId: "0_0_12", - id: "0_0_12_5", - text: "泰州市", - value: "泰州市", - open: true - }, { pId: "0_0_12", id: "0_0_12_6", text: "无锡市", value: "无锡市", open: true }, { - pId: "0_0_12", - id: "0_0_12_7", - text: "盐城市", - value: "盐城市", - open: true - }, { pId: "0_0", id: "0_0_13", text: "辽宁省( 共11个 )", value: "辽宁省", open: true }, { - pId: "0_0_13", - id: "0_0_13_0", - text: "鞍山市", - value: "鞍山市", - open: true - }, { pId: "0_0_13", id: "0_0_13_1", text: "本溪市", value: "本溪市", open: true }, { - pId: "0_0_13", - id: "0_0_13_2", - text: "朝阳市", - value: "朝阳市", - open: true - }, { pId: "0_0_13", id: "0_0_13_3", text: "大连市", value: "大连市", open: true }, { - pId: "0_0_13", - id: "0_0_13_4", - text: "抚顺市", - value: "抚顺市", - open: true - }, { pId: "0_0_13", id: "0_0_13_5", text: "葫芦岛市", value: "葫芦岛市", open: true }, { - pId: "0_0_13", - id: "0_0_13_6", - text: "锦州市", - value: "锦州市", - open: true - }, { pId: "0_0_13", id: "0_0_13_7", text: "辽阳市", value: "辽阳市", open: true }, { - pId: "0_0_13", - id: "0_0_13_8", - text: "盘锦市", - value: "盘锦市", - open: true - }, { pId: "0_0_13", id: "0_0_13_9", text: "沈阳市", value: "沈阳市", open: true }, { - pId: "0_0_13", - id: "0_0_13_10", - text: "营口市", - value: "营口市", - open: true - }, { pId: "0_0", id: "0_0_14", text: "内蒙古( 共1个 )", value: "内蒙古", open: true }, { - pId: "0_0_14", - id: "0_0_14_0", - text: "鄂尔多斯市", - value: "鄂尔多斯市", - open: true - }, { pId: "0_0", id: "0_0_15", text: "宁夏回族自治区( 共1个 )", value: "宁夏回族自治区", open: true }, { - pId: "0_0_15", - id: "0_0_15_0", - text: "银川市", - value: "银川市", - open: true - }, { pId: "0_0", id: "0_0_16", text: "山东省( 共7个 )", value: "山东省", open: true }, { - pId: "0_0_16", - id: "0_0_16_0", - text: "济南市", - value: "济南市", - open: true - }, { pId: "0_0_16", id: "0_0_16_1", text: "济宁市", value: "济宁市", open: true }, { - pId: "0_0_16", - id: "0_0_16_2", - text: "聊城市", - value: "聊城市", - open: true - }, { pId: "0_0_16", id: "0_0_16_3", text: "临沂市", value: "临沂市", open: true }, { - pId: "0_0_16", - id: "0_0_16_4", - text: "青岛市", - value: "青岛市", - open: true - }, { pId: "0_0_16", id: "0_0_16_5", text: "烟台市", value: "烟台市", open: true }, { - pId: "0_0_16", - id: "0_0_16_6", - text: "枣庄市", - value: "枣庄市", - open: true - }, { pId: "0_0", id: "0_0_17", text: "山西省( 共1个 )", value: "山西省", open: true }, { - pId: "0_0_17", - id: "0_0_17_0", - text: "太原市", - value: "太原市", - open: true - }, { pId: "0_0", id: "0_0_18", text: "陕西省( 共1个 )", value: "陕西省", open: true }, { - pId: "0_0_18", - id: "0_0_18_0", - text: "西安市", - value: "西安市", - open: true - }, { pId: "0_0", id: "0_0_19", text: "上海市( 共1个 )", value: "上海市", open: true }, { - pId: "0_0_19", - id: "0_0_19_0", - text: "上海市区", - value: "上海市区", - open: true - }, { pId: "0_0", id: "0_0_20", text: "四川省( 共1个 )", value: "四川省", open: true }, { - pId: "0_0_20", - id: "0_0_20_0", - text: "成都市", - value: "成都市", - open: true - }, { pId: "0_0", id: "0_0_21", text: "新疆维吾尔族自治区( 共2个 )", value: "新疆维吾尔族自治区", open: true }, { - pId: "0_0_21", - id: "0_0_21_0", - text: "吐鲁番地区", - value: "吐鲁番地区", - open: true - }, { pId: "0_0_21", id: "0_0_21_1", text: "乌鲁木齐", value: "乌鲁木齐", open: true }, { - pId: "0_0", - id: "0_0_22", - text: "云南省( 共1个 )", - value: "云南省", - open: true - }, { pId: "0_0_22", id: "0_0_22_0", text: "昆明市", value: "昆明市", open: true }, { - pId: "0_0", - id: "0_0_23", - text: "浙江省( 共5个 )", - value: "浙江省", - open: true - }, { pId: "0_0_23", id: "0_0_23_0", text: "杭州市", value: "杭州市", open: true }, { - pId: "0_0_23", - id: "0_0_23_1", - text: "湖州市", - value: "湖州市", - open: true - }, { pId: "0_0_23", id: "0_0_23_2", text: "嘉兴市", value: "嘉兴市", open: true }, { - pId: "0_0_23", - id: "0_0_23_3", - text: "宁波市", - value: "宁波市", - open: true - }, { pId: "0_0_23", id: "0_0_23_4", text: "绍兴市", value: "绍兴市", open: true }, { - pId: "0_0", - id: "0_0_24", - text: "重庆市( 共1个 )", - value: "重庆市", - open: true - }, { pId: "0_0_24", id: "0_0_24_0", text: "重庆市区", value: "重庆市区", open: true }, { - pId: "0", - id: "0_1", - text: "中国( 共34个 )", - value: "中国", - open: true - }, { pId: "0_1", id: "0_1_0", text: "安徽省( 共19个 )", value: "安徽省", open: true }, { - pId: "0_1_0", - id: "0_1_0_0", - text: "安庆市", - value: "安庆市", - open: true - }, { pId: "0_1_0", id: "0_1_0_1", text: "蚌埠市", value: "蚌埠市", open: true }, { - pId: "0_1_0", - id: "0_1_0_2", - text: "亳州市", - value: "亳州市", - open: true - }, { pId: "0_1_0", id: "0_1_0_3", text: "巢湖市", value: "巢湖市", open: true }, { - pId: "0_1_0", - id: "0_1_0_4", - text: "池州市", - value: "池州市", - open: true - }, { pId: "0_1_0", id: "0_1_0_5", text: "滁州市", value: "滁州市", open: true }, { - pId: "0_1_0", - id: "0_1_0_6", - text: "阜阳市", - value: "阜阳市", - open: true - }, { pId: "0_1_0", id: "0_1_0_7", text: "毫州市", value: "毫州市", open: true }, { - pId: "0_1_0", - id: "0_1_0_8", - text: "合肥市", - value: "合肥市", - open: true - }, { pId: "0_1_0", id: "0_1_0_9", text: "淮北市", value: "淮北市", open: true }, { - pId: "0_1_0", - id: "0_1_0_10", - text: "淮南市", - value: "淮南市", - open: true - }, { pId: "0_1_0", id: "0_1_0_11", text: "黄山市", value: "黄山市", open: true }, { - pId: "0_1_0", - id: "0_1_0_12", - text: "六安市", - value: "六安市", - open: true - }, { pId: "0_1_0", id: "0_1_0_13", text: "马鞍山市", value: "马鞍山市", open: true }, { - pId: "0_1_0", - id: "0_1_0_14", - text: "濮阳市", - value: "濮阳市", - open: true - }, { pId: "0_1_0", id: "0_1_0_15", text: "宿州市", value: "宿州市", open: true }, { - pId: "0_1_0", - id: "0_1_0_16", - text: "铜陵市", - value: "铜陵市", - open: true - }, { pId: "0_1_0", id: "0_1_0_17", text: "芜湖市", value: "芜湖市", open: true }, { - pId: "0_1_0", - id: "0_1_0_18", - text: "宣城市", - value: "宣城市", - open: true - }, { pId: "0_1", id: "0_1_1", text: "澳门特别行政区( 共1个 )", value: "澳门特别行政区", open: true }, { - pId: "0_1_1", - id: "0_1_1_0", - text: "澳门", - value: "澳门", - open: true - }, { pId: "0_1", id: "0_1_2", text: "北京市( 共17个 )", value: "北京市", open: true }, { - pId: "0_1_2", - id: "0_1_2_0", - text: "北京市区", - value: "北京市区", - open: true - }, { pId: "0_1_2", id: "0_1_2_1", text: "昌平区", value: "昌平区", open: true }, { - pId: "0_1_2", - id: "0_1_2_2", - text: "朝阳区", - value: "朝阳区", - open: true - }, { pId: "0_1_2", id: "0_1_2_3", text: "大兴区", value: "大兴区", open: true }, { - pId: "0_1_2", - id: "0_1_2_4", - text: "东城区", - value: "东城区", - open: true - }, { pId: "0_1_2", id: "0_1_2_5", text: "房山区", value: "房山区", open: true }, { - pId: "0_1_2", - id: "0_1_2_6", - text: "丰台区", - value: "丰台区", - open: true - }, { pId: "0_1_2", id: "0_1_2_7", text: "海淀区", value: "海淀区", open: true }, { - pId: "0_1_2", - id: "0_1_2_8", - text: "海淀区4内", - value: "海淀区4内", - open: true - }, { pId: "0_1_2", id: "0_1_2_9", text: "海淀区4外", value: "海淀区4外", open: true }, { - pId: "0_1_2", - id: "0_1_2_10", - text: "门头沟区", - value: "门头沟区", - open: true - }, { pId: "0_1_2", id: "0_1_2_11", text: "平谷区", value: "平谷区", open: true }, { - pId: "0_1_2", - id: "0_1_2_12", - text: "石景山区", - value: "石景山区", - open: true - }, { pId: "0_1_2", id: "0_1_2_13", text: "顺义区", value: "顺义区", open: true }, { - pId: "0_1_2", - id: "0_1_2_14", - text: "通州区", - value: "通州区", - open: true - }, { pId: "0_1_2", id: "0_1_2_15", text: "西城区", value: "西城区", open: true }, { - pId: "0_1_2", - id: "0_1_2_16", - text: "西城区 ", - value: "西城区 ", - open: true - }, { pId: "0_1", id: "0_1_3", text: "福建省( 共9个 )", value: "福建省", open: true }, { - pId: "0_1_3", - id: "0_1_3_0", - text: "福州市", - value: "福州市", - open: true - }, { pId: "0_1_3", id: "0_1_3_1", text: "龙岩市", value: "龙岩市", open: true }, { - pId: "0_1_3", - id: "0_1_3_2", - text: "南平市", - value: "南平市", - open: true - }, { pId: "0_1_3", id: "0_1_3_3", text: "宁德市", value: "宁德市", open: true }, { - pId: "0_1_3", - id: "0_1_3_4", - text: "莆田市", - value: "莆田市", - open: true - }, { pId: "0_1_3", id: "0_1_3_5", text: "泉州市", value: "泉州市", open: true }, { - pId: "0_1_3", - id: "0_1_3_6", - text: "三明市", - value: "三明市", - open: true - }, { pId: "0_1_3", id: "0_1_3_7", text: "厦门市", value: "厦门市", open: true }, { - pId: "0_1_3", - id: "0_1_3_8", - text: "漳州市", - value: "漳州市", - open: true - }, { pId: "0_1", id: "0_1_4", text: "甘肃省( 共12个 )", value: "甘肃省", open: true }, { - pId: "0_1_4", - id: "0_1_4_0", - text: "白银市", - value: "白银市", - open: true - }, { pId: "0_1_4", id: "0_1_4_1", text: "嘉峪关市", value: "嘉峪关市", open: true }, { - pId: "0_1_4", - id: "0_1_4_2", - text: "金昌市", - value: "金昌市", - open: true - }, { pId: "0_1_4", id: "0_1_4_3", text: "酒泉市", value: "酒泉市", open: true }, { - pId: "0_1_4", - id: "0_1_4_4", - text: "兰州市", - value: "兰州市", - open: true - }, { pId: "0_1_4", id: "0_1_4_5", text: "陇南市", value: "陇南市", open: true }, { - pId: "0_1_4", - id: "0_1_4_6", - text: "平凉市", - value: "平凉市", - open: true - }, { pId: "0_1_4", id: "0_1_4_7", text: "庆阳市", value: "庆阳市", open: true }, { - pId: "0_1_4", - id: "0_1_4_8", - text: "天津市区", - value: "天津市区", - open: true - }, { pId: "0_1_4", id: "0_1_4_9", text: "天水市", value: "天水市", open: true }, { - pId: "0_1_4", - id: "0_1_4_10", - text: "武威市", - value: "武威市", - open: true - }, { pId: "0_1_4", id: "0_1_4_11", text: "张掖市", value: "张掖市", open: true }, { - pId: "0_1", - id: "0_1_5", - text: "广东省( 共21个 )", - value: "广东省", - open: true - }, { pId: "0_1_5", id: "0_1_5_0", text: "潮州市", value: "潮州市", open: true }, { - pId: "0_1_5", - id: "0_1_5_1", - text: "东莞市", - value: "东莞市", - open: true - }, { pId: "0_1_5", id: "0_1_5_2", text: "佛山市", value: "佛山市", open: true }, { - pId: "0_1_5", - id: "0_1_5_3", - text: "广州市", - value: "广州市", - open: true - }, { pId: "0_1_5", id: "0_1_5_4", text: "河源市", value: "河源市", open: true }, { - pId: "0_1_5", - id: "0_1_5_5", - text: "惠州市", - value: "惠州市", - open: true - }, { pId: "0_1_5", id: "0_1_5_6", text: "江门市", value: "江门市", open: true }, { - pId: "0_1_5", - id: "0_1_5_7", - text: "揭阳市", - value: "揭阳市", - open: true - }, { pId: "0_1_5", id: "0_1_5_8", text: "茂名市", value: "茂名市", open: true }, { - pId: "0_1_5", - id: "0_1_5_9", - text: "梅州市", - value: "梅州市", - open: true - }, { pId: "0_1_5", id: "0_1_5_10", text: "清远市", value: "清远市", open: true }, { - pId: "0_1_5", - id: "0_1_5_11", - text: "汕头市", - value: "汕头市", - open: true - }, { pId: "0_1_5", id: "0_1_5_12", text: "汕尾市", value: "汕尾市", open: true }, { - pId: "0_1_5", - id: "0_1_5_13", - text: "韶关市", - value: "韶关市", - open: true - }, { pId: "0_1_5", id: "0_1_5_14", text: "深圳市", value: "深圳市", open: true }, { - pId: "0_1_5", - id: "0_1_5_15", - text: "阳江市", - value: "阳江市", - open: true - }, { pId: "0_1_5", id: "0_1_5_16", text: "云浮市", value: "云浮市", open: true }, { - pId: "0_1_5", - id: "0_1_5_17", - text: "湛江市", - value: "湛江市", - open: true - }, { pId: "0_1_5", id: "0_1_5_18", text: "肇庆市", value: "肇庆市", open: true }, { - pId: "0_1_5", - id: "0_1_5_19", - text: "中山市", - value: "中山市", - open: true - }, { pId: "0_1_5", id: "0_1_5_20", text: "珠海市", value: "珠海市", open: true }, { - pId: "0_1", - id: "0_1_6", - text: "广西壮族自治区( 共14个 )", - value: "广西壮族自治区", - open: true - }, { pId: "0_1_6", id: "0_1_6_0", text: "百色市", value: "百色市", open: true }, { - pId: "0_1_6", - id: "0_1_6_1", - text: "北海市", - value: "北海市", - open: true - }, { pId: "0_1_6", id: "0_1_6_2", text: "崇左市", value: "崇左市", open: true }, { - pId: "0_1_6", - id: "0_1_6_3", - text: "防城港市", - value: "防城港市", - open: true - }, { pId: "0_1_6", id: "0_1_6_4", text: "桂林市", value: "桂林市", open: true }, { - pId: "0_1_6", - id: "0_1_6_5", - text: "贵港市", - value: "贵港市", - open: true - }, { pId: "0_1_6", id: "0_1_6_6", text: "河池市", value: "河池市", open: true }, { - pId: "0_1_6", - id: "0_1_6_7", - text: "贺州市", - value: "贺州市", - open: true - }, { pId: "0_1_6", id: "0_1_6_8", text: "来宾市", value: "来宾市", open: true }, { - pId: "0_1_6", - id: "0_1_6_9", - text: "柳州市", - value: "柳州市", - open: true - }, { pId: "0_1_6", id: "0_1_6_10", text: "南宁市", value: "南宁市", open: true }, { - pId: "0_1_6", - id: "0_1_6_11", - text: "钦州市", - value: "钦州市", - open: true - }, { pId: "0_1_6", id: "0_1_6_12", text: "梧州市", value: "梧州市", open: true }, { - pId: "0_1_6", - id: "0_1_6_13", - text: "玉林市", - value: "玉林市", - open: true - }, { pId: "0_1", id: "0_1_7", text: "贵州省( 共9个 )", value: "贵州省", open: true }, { - pId: "0_1_7", - id: "0_1_7_0", - text: "安顺市", - value: "安顺市", - open: true - }, { pId: "0_1_7", id: "0_1_7_1", text: "毕节地区", value: "毕节地区", open: true }, { - pId: "0_1_7", - id: "0_1_7_2", - text: "贵阳市", - value: "贵阳市", - open: true - }, { pId: "0_1_7", id: "0_1_7_3", text: "六盘水市", value: "六盘水市", open: true }, { - pId: "0_1_7", - id: "0_1_7_4", - text: "黔东南州", - value: "黔东南州", - open: true - }, { pId: "0_1_7", id: "0_1_7_5", text: "黔南州", value: "黔南州", open: true }, { - pId: "0_1_7", - id: "0_1_7_6", - text: "黔西南市", - value: "黔西南市", - open: true - }, { pId: "0_1_7", id: "0_1_7_7", text: "铜仁地区", value: "铜仁地区", open: true }, { - pId: "0_1_7", - id: "0_1_7_8", - text: "遵义市", - value: "遵义市", - open: true - }, { pId: "0_1", id: "0_1_8", text: "海南省( 共2个 )", value: "海南省", open: true }, { - pId: "0_1_8", - id: "0_1_8_0", - text: "海口市", - value: "海口市", - open: true - }, { pId: "0_1_8", id: "0_1_8_1", text: "三亚市", value: "三亚市", open: true }, { - pId: "0_1", - id: "0_1_9", - text: "河北省( 共12个 )", - value: "河北省", - open: true - }, { pId: "0_1_9", id: "0_1_9_0", text: "保定市", value: "保定市", open: true }, { - pId: "0_1_9", - id: "0_1_9_1", - text: "沧州市", - value: "沧州市", - open: true - }, { pId: "0_1_9", id: "0_1_9_2", text: "承德市", value: "承德市", open: true }, { - pId: "0_1_9", - id: "0_1_9_3", - text: "邯郸市", - value: "邯郸市", - open: true - }, { pId: "0_1_9", id: "0_1_9_4", text: "衡水市", value: "衡水市", open: true }, { - pId: "0_1_9", - id: "0_1_9_5", - text: "廊坊市", - value: "廊坊市", - open: true - }, { pId: "0_1_9", id: "0_1_9_6", text: "秦皇岛市", value: "秦皇岛市", open: true }, { - pId: "0_1_9", - id: "0_1_9_7", - text: "石家庄市", - value: "石家庄市", - open: true - }, { pId: "0_1_9", id: "0_1_9_8", text: "唐山市", value: "唐山市", open: true }, { - pId: "0_1_9", - id: "0_1_9_9", - text: "天津市区", - value: "天津市区", - open: true - }, { pId: "0_1_9", id: "0_1_9_10", text: "邢台市", value: "邢台市", open: true }, { - pId: "0_1_9", - id: "0_1_9_11", - text: "张家口市", - value: "张家口市", - open: true - }, { pId: "0_1", id: "0_1_10", text: "河南省( 共19个 )", value: "河南省", open: true }, { - pId: "0_1_10", - id: "0_1_10_0", - text: "安阳市", - value: "安阳市", - open: true - }, { pId: "0_1_10", id: "0_1_10_1", text: "鹤壁市", value: "鹤壁市", open: true }, { - pId: "0_1_10", - id: "0_1_10_2", - text: "济源市", - value: "济源市", - open: true - }, { pId: "0_1_10", id: "0_1_10_3", text: "焦作市", value: "焦作市", open: true }, { - pId: "0_1_10", - id: "0_1_10_4", - text: "开封市", - value: "开封市", - open: true - }, { pId: "0_1_10", id: "0_1_10_5", text: "廊坊市", value: "廊坊市", open: true }, { - pId: "0_1_10", - id: "0_1_10_6", - text: "洛阳市", - value: "洛阳市", - open: true - }, { pId: "0_1_10", id: "0_1_10_7", text: "漯河市", value: "漯河市", open: true }, { - pId: "0_1_10", - id: "0_1_10_8", - text: "南阳市", - value: "南阳市", - open: true - }, { pId: "0_1_10", id: "0_1_10_9", text: "平顶山市", value: "平顶山市", open: true }, { - pId: "0_1_10", - id: "0_1_10_10", - text: "濮阳市", - value: "濮阳市", - open: true - }, { pId: "0_1_10", id: "0_1_10_11", text: "三门峡市", value: "三门峡市", open: true }, { - pId: "0_1_10", - id: "0_1_10_12", - text: "商丘市", - value: "商丘市", - open: true - }, { pId: "0_1_10", id: "0_1_10_13", text: "新乡市", value: "新乡市", open: true }, { - pId: "0_1_10", - id: "0_1_10_14", - text: "信阳市", - value: "信阳市", - open: true - }, { pId: "0_1_10", id: "0_1_10_15", text: "许昌市", value: "许昌市", open: true }, { - pId: "0_1_10", - id: "0_1_10_16", - text: "郑州市", - value: "郑州市", - open: true - }, { pId: "0_1_10", id: "0_1_10_17", text: "周口市", value: "周口市", open: true }, { - pId: "0_1_10", - id: "0_1_10_18", - text: "驻马店市", - value: "驻马店市", - open: true - }, { pId: "0_1", id: "0_1_11", text: "黑龙江省( 共13个 )", value: "黑龙江省", open: true }, { - pId: "0_1_11", - id: "0_1_11_0", - text: "大庆市", - value: "大庆市", - open: true - }, { pId: "0_1_11", id: "0_1_11_1", text: "大兴安岭地区", value: "大兴安岭地区", open: true }, { - pId: "0_1_11", - id: "0_1_11_2", - text: "大兴安岭市", - value: "大兴安岭市", - open: true - }, { pId: "0_1_11", id: "0_1_11_3", text: "哈尔滨市", value: "哈尔滨市", open: true }, { - pId: "0_1_11", - id: "0_1_11_4", - text: "鹤港市", - value: "鹤港市", - open: true - }, { pId: "0_1_11", id: "0_1_11_5", text: "黑河市", value: "黑河市", open: true }, { - pId: "0_1_11", - id: "0_1_11_6", - text: "佳木斯市", - value: "佳木斯市", - open: true - }, { pId: "0_1_11", id: "0_1_11_7", text: "牡丹江市", value: "牡丹江市", open: true }, { - pId: "0_1_11", - id: "0_1_11_8", - text: "七台河市", - value: "七台河市", - open: true - }, { pId: "0_1_11", id: "0_1_11_9", text: "齐齐哈尔市", value: "齐齐哈尔市", open: true }, { - pId: "0_1_11", - id: "0_1_11_10", - text: "双鸭山市", - value: "双鸭山市", - open: true - }, { pId: "0_1_11", id: "0_1_11_11", text: "绥化市", value: "绥化市", open: true }, { - pId: "0_1_11", - id: "0_1_11_12", - text: "伊春市", - value: "伊春市", - open: true - }, { pId: "0_1", id: "0_1_12", text: "湖北省( 共16个 )", value: "湖北省", open: true }, { - pId: "0_1_12", - id: "0_1_12_0", - text: "鄂州市", - value: "鄂州市", - open: true - }, { pId: "0_1_12", id: "0_1_12_1", text: "恩施土家族苗族自治州", value: "恩施土家族苗族自治州", open: true }, { - pId: "0_1_12", - id: "0_1_12_2", - text: "黄冈市", - value: "黄冈市", - open: true - }, { pId: "0_1_12", id: "0_1_12_3", text: "黄石市", value: "黄石市", open: true }, { - pId: "0_1_12", - id: "0_1_12_4", - text: "荆门市", - value: "荆门市", - open: true - }, { pId: "0_1_12", id: "0_1_12_5", text: "荆州市", value: "荆州市", open: true }, { - pId: "0_1_12", - id: "0_1_12_6", - text: "神农架市", - value: "神农架市", - open: true - }, { pId: "0_1_12", id: "0_1_12_7", text: "十堰市", value: "十堰市", open: true }, { - pId: "0_1_12", - id: "0_1_12_8", - text: "随州市", - value: "随州市", - open: true - }, { pId: "0_1_12", id: "0_1_12_9", text: "天门市", value: "天门市", open: true }, { - pId: "0_1_12", - id: "0_1_12_10", - text: "武汉市", - value: "武汉市", - open: true - }, { pId: "0_1_12", id: "0_1_12_11", text: "咸宁市", value: "咸宁市", open: true }, { - pId: "0_1_12", - id: "0_1_12_12", - text: "襄樊市", - value: "襄樊市", - open: true - }, { pId: "0_1_12", id: "0_1_12_13", text: "襄阳市", value: "襄阳市", open: true }, { - pId: "0_1_12", - id: "0_1_12_14", - text: "孝感市", - value: "孝感市", - open: true - }, { pId: "0_1_12", id: "0_1_12_15", text: "宜昌市", value: "宜昌市", open: true }, { - pId: "0_1", - id: "0_1_13", - text: "湖南省( 共15个 )", - value: "湖南省", - open: true - }, { pId: "0_1_13", id: "0_1_13_0", text: "常德市", value: "常德市", open: true }, { - pId: "0_1_13", - id: "0_1_13_1", - text: "长沙市", - value: "长沙市", - open: true - }, { pId: "0_1_13", id: "0_1_13_2", text: "郴州市", value: "郴州市", open: true }, { - pId: "0_1_13", - id: "0_1_13_3", - text: "衡阳市", - value: "衡阳市", - open: true - }, { pId: "0_1_13", id: "0_1_13_4", text: "怀化市", value: "怀化市", open: true }, { - pId: "0_1_13", - id: "0_1_13_5", - text: "娄底市", - value: "娄底市", - open: true - }, { pId: "0_1_13", id: "0_1_13_6", text: "邵阳市", value: "邵阳市", open: true }, { - pId: "0_1_13", - id: "0_1_13_7", - text: "湘潭市", - value: "湘潭市", - open: true - }, { pId: "0_1_13", id: "0_1_13_8", text: "湘西市", value: "湘西市", open: true }, { - pId: "0_1_13", - id: "0_1_13_9", - text: "湘西土家族苗族自治州", - value: "湘西土家族苗族自治州", - open: true - }, { pId: "0_1_13", id: "0_1_13_10", text: "益阳市", value: "益阳市", open: true }, { - pId: "0_1_13", - id: "0_1_13_11", - text: "永州市", - value: "永州市", - open: true - }, { pId: "0_1_13", id: "0_1_13_12", text: "岳阳市", value: "岳阳市", open: true }, { - pId: "0_1_13", - id: "0_1_13_13", - text: "张家界市", - value: "张家界市", - open: true - }, { pId: "0_1_13", id: "0_1_13_14", text: "株洲市", value: "株洲市", open: true }, { - pId: "0_1", - id: "0_1_14", - text: "吉林省( 共10个 )", - value: "吉林省", - open: true - }, { pId: "0_1_14", id: "0_1_14_0", text: "白城市", value: "白城市", open: true }, { - pId: "0_1_14", - id: "0_1_14_1", - text: "白山市", - value: "白山市", - open: true - }, { pId: "0_1_14", id: "0_1_14_2", text: "长春市", value: "长春市", open: true }, { - pId: "0_1_14", - id: "0_1_14_3", - text: "大庆市", - value: "大庆市", - open: true - }, { pId: "0_1_14", id: "0_1_14_4", text: "吉林市", value: "吉林市", open: true }, { - pId: "0_1_14", - id: "0_1_14_5", - text: "辽源市", - value: "辽源市", - open: true - }, { pId: "0_1_14", id: "0_1_14_6", text: "四平市", value: "四平市", open: true }, { - pId: "0_1_14", - id: "0_1_14_7", - text: "松原市", - value: "松原市", - open: true - }, { pId: "0_1_14", id: "0_1_14_8", text: "通化市", value: "通化市", open: true }, { - pId: "0_1_14", - id: "0_1_14_9", - text: "延边朝鲜族自治州", - value: "延边朝鲜族自治州", - open: true - }, { pId: "0_1", id: "0_1_15", text: "江苏省( 共13个 )", value: "江苏省", open: true }, { - pId: "0_1_15", - id: "0_1_15_0", - text: "常州市", - value: "常州市", - open: true - }, { pId: "0_1_15", id: "0_1_15_1", text: "淮安市", value: "淮安市", open: true }, { - pId: "0_1_15", - id: "0_1_15_2", - text: "连云港市", - value: "连云港市", - open: true - }, { pId: "0_1_15", id: "0_1_15_3", text: "南京市", value: "南京市", open: true }, { - pId: "0_1_15", - id: "0_1_15_4", - text: "南通市", - value: "南通市", - open: true - }, { pId: "0_1_15", id: "0_1_15_5", text: "苏州市", value: "苏州市", open: true }, { - pId: "0_1_15", - id: "0_1_15_6", - text: "宿迁市", - value: "宿迁市", - open: true - }, { pId: "0_1_15", id: "0_1_15_7", text: "泰州市", value: "泰州市", open: true }, { - pId: "0_1_15", - id: "0_1_15_8", - text: "无锡市", - value: "无锡市", - open: true - }, { pId: "0_1_15", id: "0_1_15_9", text: "徐州市", value: "徐州市", open: true }, { - pId: "0_1_15", - id: "0_1_15_10", - text: "盐城市", - value: "盐城市", - open: true - }, { pId: "0_1_15", id: "0_1_15_11", text: "扬州市", value: "扬州市", open: true }, { - pId: "0_1_15", - id: "0_1_15_12", - text: "镇江市", - value: "镇江市", - open: true - }, { pId: "0_1", id: "0_1_16", text: "江西省( 共10个 )", value: "江西省", open: true }, { - pId: "0_1_16", - id: "0_1_16_0", - text: "抚州市", - value: "抚州市", - open: true - }, { pId: "0_1_16", id: "0_1_16_1", text: "赣州市", value: "赣州市", open: true }, { - pId: "0_1_16", - id: "0_1_16_2", - text: "景德镇市", - value: "景德镇市", - open: true - }, { pId: "0_1_16", id: "0_1_16_3", text: "九江市", value: "九江市", open: true }, { - pId: "0_1_16", - id: "0_1_16_4", - text: "南昌市", - value: "南昌市", - open: true - }, { pId: "0_1_16", id: "0_1_16_5", text: "萍乡市", value: "萍乡市", open: true }, { - pId: "0_1_16", - id: "0_1_16_6", - text: "上饶市", - value: "上饶市", - open: true - }, { pId: "0_1_16", id: "0_1_16_7", text: "新余市", value: "新余市", open: true }, { - pId: "0_1_16", - id: "0_1_16_8", - text: "宜春市", - value: "宜春市", - open: true - }, { pId: "0_1_16", id: "0_1_16_9", text: "鹰潭市", value: "鹰潭市", open: true }, { - pId: "0_1", - id: "0_1_17", - text: "辽宁省( 共14个 )", - value: "辽宁省", - open: true - }, { pId: "0_1_17", id: "0_1_17_0", text: "鞍山市", value: "鞍山市", open: true }, { - pId: "0_1_17", - id: "0_1_17_1", - text: "本溪市", - value: "本溪市", - open: true - }, { pId: "0_1_17", id: "0_1_17_2", text: "朝阳市", value: "朝阳市", open: true }, { - pId: "0_1_17", - id: "0_1_17_3", - text: "大连市", - value: "大连市", - open: true - }, { pId: "0_1_17", id: "0_1_17_4", text: "丹东市", value: "丹东市", open: true }, { - pId: "0_1_17", - id: "0_1_17_5", - text: "抚顺市", - value: "抚顺市", - open: true - }, { pId: "0_1_17", id: "0_1_17_6", text: "阜新市", value: "阜新市", open: true }, { - pId: "0_1_17", - id: "0_1_17_7", - text: "葫芦岛市", - value: "葫芦岛市", - open: true - }, { pId: "0_1_17", id: "0_1_17_8", text: "锦州市", value: "锦州市", open: true }, { - pId: "0_1_17", - id: "0_1_17_9", - text: "辽阳市", - value: "辽阳市", - open: true - }, { pId: "0_1_17", id: "0_1_17_10", text: "盘锦市", value: "盘锦市", open: true }, { - pId: "0_1_17", - id: "0_1_17_11", - text: "沈阳市", - value: "沈阳市", - open: true - }, { pId: "0_1_17", id: "0_1_17_12", text: "铁岭市", value: "铁岭市", open: true }, { - pId: "0_1_17", - id: "0_1_17_13", - text: "营口市", - value: "营口市", - open: true - }, { pId: "0_1", id: "0_1_18", text: "内蒙古( 共10个 )", value: "内蒙古", open: true }, { - pId: "0_1_18", - id: "0_1_18_0", - text: "包头市", - value: "包头市", - open: true - }, { pId: "0_1_18", id: "0_1_18_1", text: "赤峰市", value: "赤峰市", open: true }, { - pId: "0_1_18", - id: "0_1_18_2", - text: "鄂尔多斯市", - value: "鄂尔多斯市", - open: true - }, { pId: "0_1_18", id: "0_1_18_3", text: "呼和浩特市", value: "呼和浩特市", open: true }, { - pId: "0_1_18", - id: "0_1_18_4", - text: "呼伦贝尔市", - value: "呼伦贝尔市", - open: true - }, { pId: "0_1_18", id: "0_1_18_5", text: "通辽市", value: "通辽市", open: true }, { - pId: "0_1_18", - id: "0_1_18_6", - text: "乌海市", - value: "乌海市", - open: true - }, { pId: "0_1_18", id: "0_1_18_7", text: "锡林郭勒市", value: "锡林郭勒市", open: true }, { - pId: "0_1_18", - id: "0_1_18_8", - text: "兴安市", - value: "兴安市", - open: true - }, { pId: "0_1_18", id: "0_1_18_9", text: "运城市", value: "运城市", open: true }, { - pId: "0_1", - id: "0_1_19", - text: "宁夏回族自治区( 共5个 )", - value: "宁夏回族自治区", - open: true - }, { pId: "0_1_19", id: "0_1_19_0", text: "固原市", value: "固原市", open: true }, { - pId: "0_1_19", - id: "0_1_19_1", - text: "石嘴山市", - value: "石嘴山市", - open: true - }, { pId: "0_1_19", id: "0_1_19_2", text: "吴忠市", value: "吴忠市", open: true }, { - pId: "0_1_19", - id: "0_1_19_3", - text: "银川市", - value: "银川市", - open: true - }, { pId: "0_1_19", id: "0_1_19_4", text: "中卫市", value: "中卫市", open: true }, { - pId: "0_1", - id: "0_1_20", - text: "青海省( 共4个 )", - value: "青海省", - open: true - }, { pId: "0_1_20", id: "0_1_20_0", text: "海东地区", value: "海东地区", open: true }, { - pId: "0_1_20", - id: "0_1_20_1", - text: "海南藏族自治州", - value: "海南藏族自治州", - open: true - }, { pId: "0_1_20", id: "0_1_20_2", text: "海西蒙古族藏族自治州", value: "海西蒙古族藏族自治州", open: true }, { - pId: "0_1_20", - id: "0_1_20_3", - text: "西宁市", - value: "西宁市", - open: true - }, { pId: "0_1", id: "0_1_21", text: "山东省( 共17个 )", value: "山东省", open: true }, { - pId: "0_1_21", - id: "0_1_21_0", - text: "滨州市", - value: "滨州市", - open: true - }, { pId: "0_1_21", id: "0_1_21_1", text: "德州市", value: "德州市", open: true }, { - pId: "0_1_21", - id: "0_1_21_2", - text: "东营市", - value: "东营市", - open: true - }, { pId: "0_1_21", id: "0_1_21_3", text: "菏泽市", value: "菏泽市", open: true }, { - pId: "0_1_21", - id: "0_1_21_4", - text: "济南市", - value: "济南市", - open: true - }, { pId: "0_1_21", id: "0_1_21_5", text: "济宁市", value: "济宁市", open: true }, { - pId: "0_1_21", - id: "0_1_21_6", - text: "莱芜市", - value: "莱芜市", - open: true - }, { pId: "0_1_21", id: "0_1_21_7", text: "聊城市", value: "聊城市", open: true }, { - pId: "0_1_21", - id: "0_1_21_8", - text: "临沂市", - value: "临沂市", - open: true - }, { pId: "0_1_21", id: "0_1_21_9", text: "青岛市", value: "青岛市", open: true }, { - pId: "0_1_21", - id: "0_1_21_10", - text: "日照市", - value: "日照市", - open: true - }, { pId: "0_1_21", id: "0_1_21_11", text: "泰安市", value: "泰安市", open: true }, { - pId: "0_1_21", - id: "0_1_21_12", - text: "威海市", - value: "威海市", - open: true - }, { pId: "0_1_21", id: "0_1_21_13", text: "潍坊市", value: "潍坊市", open: true }, { - pId: "0_1_21", - id: "0_1_21_14", - text: "烟台市", - value: "烟台市", - open: true - }, { pId: "0_1_21", id: "0_1_21_15", text: "枣庄市", value: "枣庄市", open: true }, { - pId: "0_1_21", - id: "0_1_21_16", - text: "淄博市", - value: "淄博市", - open: true - }, { pId: "0_1", id: "0_1_22", text: "山西省( 共12个 )", value: "山西省", open: true }, { - pId: "0_1_22", - id: "0_1_22_0", - text: "长治市", - value: "长治市", - open: true - }, { pId: "0_1_22", id: "0_1_22_1", text: "大同市", value: "大同市", open: true }, { - pId: "0_1_22", - id: "0_1_22_2", - text: "晋城市", - value: "晋城市", - open: true - }, { pId: "0_1_22", id: "0_1_22_3", text: "晋中市", value: "晋中市", open: true }, { - pId: "0_1_22", - id: "0_1_22_4", - text: "临汾市", - value: "临汾市", - open: true - }, { pId: "0_1_22", id: "0_1_22_5", text: "吕梁市", value: "吕梁市", open: true }, { - pId: "0_1_22", - id: "0_1_22_6", - text: "青岛市", - value: "青岛市", - open: true - }, { pId: "0_1_22", id: "0_1_22_7", text: "朔州市", value: "朔州市", open: true }, { - pId: "0_1_22", - id: "0_1_22_8", - text: "太原市", - value: "太原市", - open: true - }, { pId: "0_1_22", id: "0_1_22_9", text: "忻州市", value: "忻州市", open: true }, { - pId: "0_1_22", - id: "0_1_22_10", - text: "阳泉市", - value: "阳泉市", - open: true - }, { pId: "0_1_22", id: "0_1_22_11", text: "运城市", value: "运城市", open: true }, { - pId: "0_1", - id: "0_1_23", - text: "陕西省( 共9个 )", - value: "陕西省", - open: true - }, { pId: "0_1_23", id: "0_1_23_0", text: "安康市", value: "安康市", open: true }, { - pId: "0_1_23", - id: "0_1_23_1", - text: "宝鸡市", - value: "宝鸡市", - open: true - }, { pId: "0_1_23", id: "0_1_23_2", text: "汉中市", value: "汉中市", open: true }, { - pId: "0_1_23", - id: "0_1_23_3", - text: "商洛市", - value: "商洛市", - open: true - }, { pId: "0_1_23", id: "0_1_23_4", text: "渭南市", value: "渭南市", open: true }, { - pId: "0_1_23", - id: "0_1_23_5", - text: "西安市", - value: "西安市", - open: true - }, { pId: "0_1_23", id: "0_1_23_6", text: "咸阳市", value: "咸阳市", open: true }, { - pId: "0_1_23", - id: "0_1_23_7", - text: "延安市", - value: "延安市", - open: true - }, { pId: "0_1_23", id: "0_1_23_8", text: "榆林市", value: "榆林市", open: true }, { - pId: "0_1", - id: "0_1_24", - text: "上海市( 共19个 )", - value: "上海市", - open: true - }, { pId: "0_1_24", id: "0_1_24_0", text: "宝山区", value: "宝山区", open: true }, { - pId: "0_1_24", - id: "0_1_24_1", - text: "长宁区", - value: "长宁区", - open: true - }, { pId: "0_1_24", id: "0_1_24_2", text: "崇明县", value: "崇明县", open: true }, { - pId: "0_1_24", - id: "0_1_24_3", - text: "奉贤区", - value: "奉贤区", - open: true - }, { pId: "0_1_24", id: "0_1_24_4", text: "虹口区", value: "虹口区", open: true }, { - pId: "0_1_24", - id: "0_1_24_5", - text: "黄浦区", - value: "黄浦区", - open: true - }, { pId: "0_1_24", id: "0_1_24_6", text: "嘉定区", value: "嘉定区", open: true }, { - pId: "0_1_24", - id: "0_1_24_7", - text: "金山区", - value: "金山区", - open: true - }, { pId: "0_1_24", id: "0_1_24_8", text: "静安区", value: "静安区", open: true }, { - pId: "0_1_24", - id: "0_1_24_9", - text: "昆明市", - value: "昆明市", - open: true - }, { pId: "0_1_24", id: "0_1_24_10", text: "闵行区", value: "闵行区", open: true }, { - pId: "0_1_24", - id: "0_1_24_11", - text: "普陀区", - value: "普陀区", - open: true - }, { pId: "0_1_24", id: "0_1_24_12", text: "浦东新区", value: "浦东新区", open: true }, { - pId: "0_1_24", - id: "0_1_24_13", - text: "青浦区", - value: "青浦区", - open: true - }, { pId: "0_1_24", id: "0_1_24_14", text: "上海市区", value: "上海市区", open: true }, { - pId: "0_1_24", - id: "0_1_24_15", - text: "松江区", - value: "松江区", - open: true - }, { pId: "0_1_24", id: "0_1_24_16", text: "徐汇区", value: "徐汇区", open: true }, { - pId: "0_1_24", - id: "0_1_24_17", - text: "杨浦区", - value: "杨浦区", - open: true - }, { pId: "0_1_24", id: "0_1_24_18", text: "闸北区", value: "闸北区", open: true }, { - pId: "0_1", - id: "0_1_25", - text: "四川省( 共21个 )", - value: "四川省", - open: true - }, { pId: "0_1_25", id: "0_1_25_0", text: "阿坝藏族羌族自治州", value: "阿坝藏族羌族自治州", open: true }, { - pId: "0_1_25", - id: "0_1_25_1", - text: "巴中市", - value: "巴中市", - open: true - }, { pId: "0_1_25", id: "0_1_25_2", text: "成都市", value: "成都市", open: true }, { - pId: "0_1_25", - id: "0_1_25_3", - text: "达州市", - value: "达州市", - open: true - }, { pId: "0_1_25", id: "0_1_25_4", text: "德阳市", value: "德阳市", open: true }, { - pId: "0_1_25", - id: "0_1_25_5", - text: "甘孜市", - value: "甘孜市", - open: true - }, { pId: "0_1_25", id: "0_1_25_6", text: "广安市", value: "广安市", open: true }, { - pId: "0_1_25", - id: "0_1_25_7", - text: "广元市", - value: "广元市", - open: true - }, { pId: "0_1_25", id: "0_1_25_8", text: "乐山市", value: "乐山市", open: true }, { - pId: "0_1_25", - id: "0_1_25_9", - text: "凉山市", - value: "凉山市", - open: true - }, { pId: "0_1_25", id: "0_1_25_10", text: "泸州市", value: "泸州市", open: true }, { - pId: "0_1_25", - id: "0_1_25_11", - text: "眉山市", - value: "眉山市", - open: true - }, { pId: "0_1_25", id: "0_1_25_12", text: "绵阳市", value: "绵阳市", open: true }, { - pId: "0_1_25", - id: "0_1_25_13", - text: "南充市", - value: "南充市", - open: true - }, { pId: "0_1_25", id: "0_1_25_14", text: "内江市", value: "内江市", open: true }, { - pId: "0_1_25", - id: "0_1_25_15", - text: "攀枝花市", - value: "攀枝花市", - open: true - }, { pId: "0_1_25", id: "0_1_25_16", text: "遂宁市", value: "遂宁市", open: true }, { - pId: "0_1_25", - id: "0_1_25_17", - text: "雅安市", - value: "雅安市", - open: true - }, { pId: "0_1_25", id: "0_1_25_18", text: "宜宾市", value: "宜宾市", open: true }, { - pId: "0_1_25", - id: "0_1_25_19", - text: "资阳市", - value: "资阳市", - open: true - }, { pId: "0_1_25", id: "0_1_25_20", text: "自贡市", value: "自贡市", open: true }, { - pId: "0_1", - id: "0_1_26", - text: "台湾( 共1个 )", - value: "台湾", - open: true - }, { pId: "0_1_26", id: "0_1_26_0", text: "台北市", value: "台北市", open: true }, { - pId: "0_1", - id: "0_1_27", - text: "天津市( 共1个 )", - value: "天津市", - open: true - }, { pId: "0_1_27", id: "0_1_27_0", text: "天津市区", value: "天津市区", open: true }, { - pId: "0_1", - id: "0_1_28", - text: "西藏自治区( 共2个 )", - value: "西藏自治区", - open: true - }, { pId: "0_1_28", id: "0_1_28_0", text: "阿里市", value: "阿里市", open: true }, { - pId: "0_1_28", - id: "0_1_28_1", - text: "日喀则市", - value: "日喀则市", - open: true - }, { pId: "0_1", id: "0_1_29", text: "香港特别行政区( 共1个 )", value: "香港特别行政区", open: true }, { - pId: "0_1_29", - id: "0_1_29_0", - text: "香港", - value: "香港", - open: true - }, { - pId: "0_1", - id: "0_1_30", - text: "新疆维吾尔族自治区( 共11个 )", - value: "新疆维吾尔族自治区", - open: true - }, { pId: "0_1_30", id: "0_1_30_0", text: "巴音郭楞市", value: "巴音郭楞市", open: true }, { - pId: "0_1_30", - id: "0_1_30_1", - text: "哈密市", - value: "哈密市", - open: true - }, { pId: "0_1_30", id: "0_1_30_2", text: "和田市", value: "和田市", open: true }, { - pId: "0_1_30", - id: "0_1_30_3", - text: "喀什地区", - value: "喀什地区", - open: true - }, { pId: "0_1_30", id: "0_1_30_4", text: "克拉玛依市", value: "克拉玛依市", open: true }, { - pId: "0_1_30", - id: "0_1_30_5", - text: "克孜勒苏柯州", - value: "克孜勒苏柯州", - open: true - }, { pId: "0_1_30", id: "0_1_30_6", text: "石河子市", value: "石河子市", open: true }, { - pId: "0_1_30", - id: "0_1_30_7", - text: "塔城市", - value: "塔城市", - open: true - }, { pId: "0_1_30", id: "0_1_30_8", text: "吐鲁番地区", value: "吐鲁番地区", open: true }, { - pId: "0_1_30", - id: "0_1_30_9", - text: "乌鲁木齐", - value: "乌鲁木齐", - open: true - }, { pId: "0_1_30", id: "0_1_30_10", text: "伊犁市", value: "伊犁市", open: true }, { - pId: "0_1", - id: "0_1_31", - text: "云南省( 共12个 )", - value: "云南省", - open: true - }, { pId: "0_1_31", id: "0_1_31_0", text: "保山市", value: "保山市", open: true }, { - pId: "0_1_31", - id: "0_1_31_1", - text: "楚雄彝族自治州", - value: "楚雄彝族自治州", - open: true - }, { pId: "0_1_31", id: "0_1_31_2", text: "大理白族自治州", value: "大理白族自治州", open: true }, { - pId: "0_1_31", - id: "0_1_31_3", - text: "红河哈尼族彝族自治州", - value: "红河哈尼族彝族自治州", - open: true - }, { pId: "0_1_31", id: "0_1_31_4", text: "昆明市", value: "昆明市", open: true }, { - pId: "0_1_31", - id: "0_1_31_5", - text: "丽江市", - value: "丽江市", - open: true - }, { pId: "0_1_31", id: "0_1_31_6", text: "临沧市", value: "临沧市", open: true }, { - pId: "0_1_31", - id: "0_1_31_7", - text: "曲靖市", - value: "曲靖市", - open: true - }, { pId: "0_1_31", id: "0_1_31_8", text: "思茅市", value: "思茅市", open: true }, { - pId: "0_1_31", - id: "0_1_31_9", - text: "文山市", - value: "文山市", - open: true - }, { pId: "0_1_31", id: "0_1_31_10", text: "玉溪市", value: "玉溪市", open: true }, { - pId: "0_1_31", - id: "0_1_31_11", - text: "昭通市", - value: "昭通市", - open: true - }, { pId: "0_1", id: "0_1_32", text: "浙江省( 共12个 )", value: "浙江省", open: true }, { - pId: "0_1_32", - id: "0_1_32_0", - text: "杭州市", - value: "杭州市", - open: true - }, { pId: "0_1_32", id: "0_1_32_1", text: "湖州市", value: "湖州市", open: true }, { - pId: "0_1_32", - id: "0_1_32_2", - text: "嘉兴市", - value: "嘉兴市", - open: true - }, { pId: "0_1_32", id: "0_1_32_3", text: "金华市", value: "金华市", open: true }, { - pId: "0_1_32", - id: "0_1_32_4", - text: "丽水市", - value: "丽水市", - open: true - }, { pId: "0_1_32", id: "0_1_32_5", text: "宁波市", value: "宁波市", open: true }, { - pId: "0_1_32", - id: "0_1_32_6", - text: "衢州市", - value: "衢州市", - open: true - }, { pId: "0_1_32", id: "0_1_32_7", text: "绍兴市", value: "绍兴市", open: true }, { - pId: "0_1_32", - id: "0_1_32_8", - text: "台州市", - value: "台州市", - open: true - }, { pId: "0_1_32", id: "0_1_32_9", text: "温州市", value: "温州市", open: true }, { - pId: "0_1_32", - id: "0_1_32_10", - text: "浙江省", - value: "浙江省", - open: true - }, { pId: "0_1_32", id: "0_1_32_11", text: "舟山市", value: "舟山市", open: true }, { - pId: "0_1", - id: "0_1_33", - text: "重庆市( 共1个 )", - value: "重庆市", - open: true - }, { pId: "0_1_33", id: "0_1_33_0", text: "重庆市区", value: "重庆市区", open: true }], - - TREE: [{ id: -1, pId: -2, value: "根目录", text: "根目录" }, - { id: 1, pId: -1, value: "1", text: "第一级目录1", disabled: true }, - { id: 11, pId: 1, value: "11", text: "第二级文件1" }, - { id: 12, pId: 1, value: "12", text: "第二级目录2" }, - { id: 121, pId: 12, value: "121", text: "第三级目录1" }, - { id: 122, pId: 12, value: "122", text: "第三级文件1" }, - { id: 1211, pId: 121, value: "1211", text: "第四级目录1" }, - { - id: 12111, - pId: 1211, - value: "12111", - text: "第五级文件111111111111111111111111111111111111111111111111111111111111111111111111111111111111111" - }, - { id: 2, pId: -1, value: "2", text: "第一级目录2" }, - { id: 21, pId: 2, value: "21", text: "第二级目录3" }, - { id: 22, pId: 2, value: "22", text: "第二级文件2" }, - { id: 211, pId: 21, value: "211", text: "第三级目录2" }, - { id: 212, pId: 21, value: "212", text: "第三级文件2" }, - { id: 2111, pId: 211, value: "2111", text: "第四级文件1" }], - LEVELTREE: [{ - id: 1, - text: "第一项", - value: "1" - }, { - id: 2, - text: "第二项", - value: "2" - }, { - id: 3, - text: "第三项", - value: "3", - open: true - }, { - id: 11, - pId: 1, - text: "子项1", - value: "11" - }, { - id: 12, - pId: 1, - text: "子项2", - value: "12" - }, { - id: 13, - pId: 1, - text: "子项3", - value: "13" - }, { - id: 31, - pId: 3, - text: "子项1", - value: "31" - }, { - id: 32, - pId: 3, - text: "子项2", - value: "32" - }, { - id: 33, - pId: 3, - text: "子项3", - value: "33" - }] -}; - diff --git a/demo/index.js b/demo/index.js deleted file mode 100644 index dbe298959..000000000 --- a/demo/index.js +++ /dev/null @@ -1,4 +0,0 @@ -export * from "./app"; -export * from "./config"; -export * from "./version"; -export * from "./js"; \ No newline at end of file diff --git a/demo/js/base/button/demo.button.js b/demo/js/base/button/demo.button.js deleted file mode 100644 index 823ea0d6c..000000000 --- a/demo/js/base/button/demo.button.js +++ /dev/null @@ -1,449 +0,0 @@ -import { shortcut, Widget, parseInt, Msg, map } from "@/core"; - -@shortcut() -export class Button extends Widget { - static xtype = "demo.button"; - - props = { baseCls: "demo-button" }; - - render() { - const items = [ - { - type: "bi.button", - text: "一般按钮1111111111111", - level: "common", - whiteSpace: "nowrap", - width: 100, - height: 30, - handler() { - console.log("触发点击事件"); - this.loading(); - setTimeout(() => { - this.loaded(); - }, 5 * 1000); - }, - }, - { - type: "bi.button", - text: "表示成功状态按钮", - level: "success", - height: 30, - }, - { - type: "bi.button", - text: "表示警告状态的按钮", - level: "warning", - height: 30, - }, - { - type: "bi.button", - text: "表示错误状态的按钮", - level: "error", - height: 30, - }, - { - type: "bi.button", - text: "表示忽略状态的按钮", - level: "ignore", - height: 30, - }, - { - type: "bi.button", - text: "普通灰化按钮", - disabled: true, - level: "success", - height: 30, - }, - { - type: "bi.button", - text: "忽略状态灰化按钮", - disabled: true, - level: "ignore", - height: 30, - }, - { - type: "bi.button", - text: "带图标的按钮", - // level: 'ignore', - iconCls: "close-font", - height: 30, - }, - { - type: "bi.button", - text: "一般按钮", - block: true, - level: "common", - height: 30, - }, - { - type: "bi.button", - text: "表示成功状态按钮", - block: true, - level: "success", - height: 30, - }, - { - type: "bi.button", - text: "表示警告状态的按钮", - block: true, - level: "warning", - height: 30, - }, - { - type: "bi.button", - text: "表示忽略状态的按钮", - block: true, - level: "ignore", - height: 30, - }, - { - type: "bi.button", - text: "普通灰化按钮", - block: true, - disabled: true, - level: "success", - height: 30, - }, - { - type: "bi.button", - text: "忽略状态灰化按钮", - block: true, - disabled: true, - level: "ignore", - height: 30, - }, - { - type: "bi.button", - text: "带图标的按钮", - block: true, - // level: 'ignore', - iconCls: "close-font", - height: 30, - }, - { - type: "bi.button", - text: "一般按钮", - clear: true, - level: "common", - height: 30, - }, - { - type: "bi.button", - text: "表示成功状态按钮", - clear: true, - level: "success", - height: 30, - }, - { - type: "bi.button", - text: "表示警告状态的按钮", - clear: true, - level: "warning", - height: 30, - }, - { - type: "bi.button", - text: "表示忽略状态的按钮", - clear: true, - level: "ignore", - height: 30, - }, - { - type: "bi.button", - text: "普通灰化按钮", - clear: true, - disabled: true, - level: "success", - height: 30, - }, - { - type: "bi.button", - text: "忽略状态灰化按钮", - clear: true, - disabled: true, - level: "ignore", - height: 30, - }, - { - type: "bi.button", - text: "带图标的按钮", - clear: true, - // level: 'ignore', - iconCls: "close-font", - height: 30, - }, - { - type: "bi.text_button", - text: "文字按钮", - height: 30, - }, - { - type: "bi.button", - text: "幽灵按钮(common)", - ghost: true, - height: 30, - }, - { - type: "bi.button", - iconCls: "plus-font", - text: "幽灵按钮(common)", - ghost: true, - height: 30, - }, - { - type: "bi.button", - iconCls: "plus-font", - text: "幽灵按钮(common)", - ghost: true, - level: "warning", - height: 30, - }, - { - type: "bi.button", - iconCls: "plus-font", - text: "幽灵按钮(common)", - ghost: true, - level: "error", - height: 30, - }, - { - type: "bi.button", - iconCls: "plus-font", - text: "幽灵按钮(common)", - ghost: true, - level: "success", - height: 30, - }, - { - type: "bi.button", - text: "幽灵按钮(common)灰化", - disabled: true, - ghost: true, - height: 30, - }, - { - type: "bi.button", - text: "弹出bubble", - bubble() { - return `${parseInt(Math.random() * 100) % 10}提示`; - }, - handler() { - Msg.toast("1111"); - }, - height: 30, - }, - { - type: "bi.button", - text: "自动撑开", - iconCls: "close-font", - // textHeight: 32, - // height: 32, - iconGap: 64, - vgap: 16, - hgap: 100, - iconPosition: "bottom", - }, - { - type: "bi.button", - text: "图标在下面的按钮", - iconCls: "close-font", - iconPosition: "bottom", - }, - { - type: "bi.button", - text: "图标在左边的按钮", - iconCls: "close-font", - iconPosition: "left", - }, - { - type: "bi.button", - text: "图标在右边的按钮", - iconCls: "close-font", - iconPosition: "right", - }, - { - type: "bi.button", - text: "浅色的一般按钮", - iconCls: "plus-font", - light: true, - }, - { - type: "bi.button", - text: "浅色的成功按钮", - level: "success", - iconCls: "plus-font", - light: true, - }, - { - type: "bi.button", - text: "浅色的警告按钮", - level: "warning", - iconCls: "plus-font", - light: true, - }, - { - type: "bi.button", - iconCls: "plus-font", - text: "浅色的失败按钮", - level: "error", - cls: "hover-mask", - light: true, - }, - { - type: "bi.button", - iconCls: "plus-font", - text: "朴素的按钮", - level: "common", - plain: true, - }, - { - type: "bi.button", - iconCls: "plus-font", - text: "朴素的按钮", - level: "success", - plain: true, - }, - { - type: "bi.button", - iconCls: "plus-font", - text: "朴素的按钮", - level: "error", - plain: true, - }, - { - type: "bi.button", - iconCls: "plus-font", - text: "朴素的按钮", - level: "warning", - plain: true, - }, - { - type: "bi.button", - iconCls: "plus-font", - text: "朴素的按钮", - level: "ignore", - plain: true, - }, - { - type: "bi.button", - iconCls: "plus-font", - plain: true, - level: "error", - }, - { - type: "bi.button", - iconCls: "plus-font", - text: "朴素的按钮", - plain: true, - disabled: true, - }, - { - type: "bi.button", - iconCls: "plus-font", - text: "点我,更改图标", - handler() { - this.i = this.i === undefined ? 0 : ++this.i; - const arr = [ - "text-background-font", - "check-mark-ha-font", - "close-font", - "search-font", - "date-change-h-font" - ]; - if (this.i >= arr.length) { - this.i = 0; - } - this.setIcon(arr[this.i]); - }, - height: 24, - }, - { - type: "bi.button", - text: "带加载的按钮", - handler() { - console.log("触发点击事件"); - this.loading(); - setTimeout(() => { - this.loaded(); - }, 5 * 1000); - }, - }, - { - type: "bi.button", - text: "带加载的按钮", - iconCls: "circle-close-font", - handler() { - console.log("触发点击事件"); - this.loading(); - setTimeout(() => { - this.loaded(); - }, 5 * 1000); - }, - }, - { - type: "bi.button", - clear: true, - text: "带加载的按钮", - iconCls: "circle-close-font", - handler() { - console.log("触发点击事件"); - this.loading(); - setTimeout(() => { - this.loaded(); - }, 5 * 1000); - }, - }, - { - type: "bi.button", - text: "加载中的按钮", - loading: true, - handler() { - console.log("我是无法被触发的!"); - }, - }, - { - type: "bi.button", - text: "自定义图标按钮(点我修改)", - icon: { - type: "demo.joker.icon", - }, - handler() { - console.log("触发点击事件"); - this.loading(); - setTimeout(() => { - this.loaded(); - }, 5 * 1000); - }, - }, - { - type: "bi.button", - text: "文字偏左的按钮", - textAlign: "left", - width: 200, - }, - { - type: "bi.button", - text: "小于最小宽度的按钮", - width: 50, - }, - { - type: "bi.button", - text: "一个文字超级超级长的 button, 他比按钮宽度还长。", - textWidth: 500, - width: 100, - } - ]; - - return { - type: "bi.left", - scrolly: true, - vgap: 100, - hgap: 20, - items: map(items, (index, value) => { - return { - el: value, - }; - }), - }; - } -} diff --git a/demo/js/base/button/demo.icon_button.js b/demo/js/base/button/demo.icon_button.js deleted file mode 100644 index 1f61b18ee..000000000 --- a/demo/js/base/button/demo.icon_button.js +++ /dev/null @@ -1,28 +0,0 @@ -import { shortcut, Widget } from "@/core"; - -@shortcut() -export class Button extends Widget { - static xtype = "demo.icon_button"; - - props = { baseCls: "demo-button" }; - - render() { - const items = [ - { - el: { - type: "bi.icon_button", - cls: "close-ha-font", - width: 25, - height: 25, - }, - } - ]; - - return { - type: "bi.left", - vgap: 200, - hgap: 20, - items, - }; - } -} diff --git a/demo/js/base/button/demo.image_button.js b/demo/js/base/button/demo.image_button.js deleted file mode 100644 index f46bf9ab1..000000000 --- a/demo/js/base/button/demo.image_button.js +++ /dev/null @@ -1,28 +0,0 @@ -import { shortcut, Widget } from "@/core"; - -@shortcut() -export class Button extends Widget { - static xtype = "demo.image_button"; - - props = { baseCls: "demo-button" }; - - render() { - const items = [ - { - el: { - type: "bi.image_button", - src: "http://www.easyicon.net/api/resizeApi.php?id=1206741&size=128", - width: 100, - height: 100, - }, - } - ]; - - return { - type: "bi.left", - vgap: 200, - hgap: 20, - items, - }; - } -} diff --git a/demo/js/base/button/demo.joker.icon.js b/demo/js/base/button/demo.joker.icon.js deleted file mode 100644 index 934351a2d..000000000 --- a/demo/js/base/button/demo.joker.icon.js +++ /dev/null @@ -1,26 +0,0 @@ -import { shortcut, Widget } from "@/core"; - -@shortcut() -export class JokerIcon extends Widget { - static xtype = "demo.joker.icon"; - - render() { - const self = this; - - return { - type: "bi.label", - cls: "anim-rotate", - ref (ref) { - self.text = ref; - }, - }; - } - - loading() { - this.text.setText("🤡"); - } - - loaded() { - this.text.setText(""); - } -} diff --git a/demo/js/base/button/demo.text_button.js b/demo/js/base/button/demo.text_button.js deleted file mode 100644 index e67b33b79..000000000 --- a/demo/js/base/button/demo.text_button.js +++ /dev/null @@ -1,28 +0,0 @@ -import { shortcut, Widget } from "@/core"; - -@shortcut() -export class Button extends Widget { - static xtype = "demo.text_button"; - - props = { baseCls: "demo-button" }; - - render() { - const items = [ - { - el: { - type: "bi.text_button", - text: "文字按钮", - height: 30, - keyword: "w", - }, - } - ]; - - return { - type: "bi.left", - vgap: 200, - hgap: 20, - items, - }; - } -} diff --git a/demo/js/base/button/index.js b/demo/js/base/button/index.js deleted file mode 100644 index 03d382db9..000000000 --- a/demo/js/base/button/index.js +++ /dev/null @@ -1,5 +0,0 @@ -export * from "./demo.button"; -export * from "./demo.icon_button"; -export * from "./demo.image_button"; -export * from "./demo.joker.icon"; -export * from "./demo.text_button"; \ No newline at end of file diff --git a/demo/js/base/demo.html.js b/demo/js/base/demo.html.js deleted file mode 100644 index f0dc67cf7..000000000 --- a/demo/js/base/demo.html.js +++ /dev/null @@ -1,26 +0,0 @@ -import { shortcut, Widget } from "@/core"; - -@shortcut() -export class Html extends Widget { - static xtype = "demo.html"; - - props = { baseCls: "demo-html" }; - - render() { - return { - type: "bi.vertical", - items: [ - { - type: "bi.html", - text: "

在bi.html标签中使用html原生标签

", - }, - { - type: "bi.html", - text: "", - } - ], - hgap: 300, - vgap: 20, - }; - } -} diff --git a/demo/js/base/demo.icon_label.js b/demo/js/base/demo.icon_label.js deleted file mode 100644 index 1e6e34474..000000000 --- a/demo/js/base/demo.icon_label.js +++ /dev/null @@ -1,26 +0,0 @@ -import { shortcut, Widget } from "@/core"; - -@shortcut() -export class IconLabel extends Widget { - static xtype = "demo.icon_label"; - - props = { baseCls: "demo-bubble" }; - - render() { - return { - type: "bi.default", - items: [ - { - type: "bi.label", - text: "这是一个icon标签,在加了border之后仍然是居中显示的", - }, - { - type: "bi.icon_label", - cls: "date-font bi-border", - height: 40, - width: 40, - } - ], - }; - } -} diff --git a/demo/js/base/demo.label.js b/demo/js/base/demo.label.js deleted file mode 100644 index 60c67d9e7..000000000 --- a/demo/js/base/demo.label.js +++ /dev/null @@ -1,167 +0,0 @@ -import { shortcut, Widget } from "@/core"; - -@shortcut() -export class Label extends Widget { - static xtype = "demo.label"; - - props = { baseCls: "demo-label" }; - - render() { - return { - type: "bi.vertical", - items: [ - { - type: "bi.label", - cls: "layout-bg6", - text: "这是一个label控件,默认居中", - disabled: true, - textAlign: "center", - }, - { - type: "bi.label", - cls: "layout-bg1", - text: "这是一个label控件, 高度为30,默认居中", - textAlign: "center", - height: 30, - }, - { - type: "bi.label", - cls: "layout-bg3", - text: "这是一个label控件,使用水平居左", - textAlign: "left", - height: 30, - }, - { - type: "bi.label", - cls: "layout-bg2", - text: "这是一个label控件,whiteSpace是normal,不设置高度,为了演示这个是真的是normal的,我凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数", - whiteSpace: "normal", - }, - { - type: "bi.label", - cls: "layout-bg5", - text: "这是一个label控件,whiteSpace是默认的nowrap,不设置高度,为了演示这个是真的是nowrap的,我凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数", - }, - { - type: "bi.label", - cls: "layout-bg7", - text: "这是一个label控件,whiteSpace是默认的nowrap,高度为30,为了演示这个是真的是nowrap的,我凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数", - height: 30, - }, - { - type: "bi.label", - cls: "layout-bg3", - text: "这是一个label控件,whiteSpace设置为normal,高度为60,为了演示这个是真的是normal的,我凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数", - whiteSpace: "normal", - height: 60, - }, - { - type: "bi.label", - cls: "layout-bg5", - text: "这是一个label控件,whiteSpace设置为normal,textHeight控制text的lineHeight,这样可以实现换行效果,我凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数", - whiteSpace: "normal", - textHeight: 30, - height: 60, - }, - { - type: "bi.label", - cls: "layout-bg1", - text: "这是一个label控件,whiteSpace设置为nowrap,textWidth控制text的width", - textWidth: 200, - height: 60, - }, - { - type: "bi.label", - cls: "layout-bg8", - text: "这是一个label控件,whiteSpace设置为normal,textWidth控制text的width,这样可以实现换行效果,我凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数", - whiteSpace: "normal", - textWidth: 200, - height: 60, - }, - { - type: "bi.label", - cls: "layout-bg7", - text: "whiteSpace为默认的nowrap,高度设置为60,宽度设置为300", - height: 60, - width: 300, - }, - { - type: "bi.label", - cls: "layout-bg6", - text: "设置了宽度300,高度60,whiteSpace设置为normal", - whiteSpace: "normal", - width: 300, - height: 60, - }, - { - type: "bi.label", - cls: "layout-bg8", - text: "textWidth设置为200,textHeight设置为30,width设置300,凑点字数看效果", - width: 300, - textWidth: 200, - textHeight: 30, - height: 60, - whiteSpace: "normal", - }, - { - type: "bi.label", - cls: "layout-bg1", - text: "textWidth设置为200,width设置300,看下水平居左的换行效果", - textAlign: "left", - width: 300, - textWidth: 200, - textHeight: 30, - height: 60, - whiteSpace: "normal", - }, - { - type: "bi.label", - cls: "layout-bg2", - text: "使用默认的nowrap,再去设置textHeight,只会有一行的效果", - textAlign: "left", - width: 300, - textWidth: 200, - textHeight: 30, - height: 60, - }, - { - type: "bi.left", - items: [ - { - type: "bi.label", - cls: "layout-bg3", - text: "在float布局中自适应的,不设高度和宽度,文字多长这个就有多长", - } - ], - height: 30, - }, - { - type: "bi.left", - items: [ - { - type: "bi.label", - cls: "layout-bg4", - text: "在float布局中自适应的,设置了宽度200,后面还有", - width: 200, - } - ], - height: 30, - }, - { - type: "bi.left", - items: [ - { - type: "bi.label", - text: "在float布局中自适应的,设置了高度,文字多长这个就有多长", - cls: "layout-bg5", - height: 30, - } - ], - height: 30, - } - ], - hgap: 300, - vgap: 20, - }; - } -} diff --git a/demo/js/base/demo.label.scene.js b/demo/js/base/demo.label.scene.js deleted file mode 100644 index 50a09866b..000000000 --- a/demo/js/base/demo.label.scene.js +++ /dev/null @@ -1,673 +0,0 @@ -import { shortcut, Widget } from "@/core"; - -@shortcut() -export class LabelScene extends Widget { - static xtype = "demo.label_scene"; - - props = { baseCls: "demo-label" }; - - render() { - const items = []; - - items.push( - this.createExpander("1.1.1 文字居中,有宽度和高度,有文字宽度,whiteSpace为normal", { - type: "bi.label", - cls: "layout-bg6", - text: "设置了textWidth,则一定是嵌套结构,因此需要用center_adapt布局容纳一下.为了实现不足一行时文字水平居中,超出一行时左对齐,需要设置maxWidth.", - whiteSpace: "normal", - height: 50, - width: 500, - textWidth: 200, - textAlign: "center", - }) - ); - - items.push( - this.createExpander("1.1.2 居中,有宽度和高度,有文字宽度,whiteSpace为nowrap", { - type: "bi.label", - cls: "layout-bg6", - text: "居中,有宽度高度,有文字宽度,whiteSpace为nowrap,maxWidth会限制文字", - whiteSpace: "nowrap", - height: 50, - width: 500, - textWidth: 350, - textAlign: "center", - }) - ); - - items.push( - this.createExpander("1.2.1 居中,有宽度无高度,有文字宽度,whiteSpace为normal", { - type: "bi.label", - cls: "layout-bg6", - text: "居中,有宽度无高度,有文字宽度,whiteSpace为normal,我凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数", - whiteSpace: "normal", - width: 500, - textWidth: 200, - textAlign: "center", - }) - ); - - items.push( - this.createExpander("1.2.1 居中,有宽度无高度,有文字宽度,whiteSpace为normal,高度被父容器拉满", { - type: "bi.absolute", - height: 100, - items: [ - { - el: { - type: "bi.label", - cls: "layout-bg6", - text: "此时虽然没有对label设置高度,但由于使用了center_adapt布局,依然会垂直方向居中", - whiteSpace: "normal", - width: 500, - textWidth: 200, - textAlign: "center", - }, - top: 0, - left: 0, - bottom: 0, - } - ], - }) - ); - - items.push( - this.createExpander("1.2.2 居中,有宽度无高度,有文字宽度,whiteSpace为nowrap", { - type: "bi.label", - cls: "layout-bg6", - text: "居中,有宽度无高度,有文字宽度,whiteSpace为nowrap,我凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数", - whiteSpace: "nowrap", - width: 500, - textWidth: 350, - textAlign: "center", - }) - ); - - items.push( - this.createExpander("1.3.1 居中,有宽度和高度,无文字宽度,whiteSpace为normal", { - type: "bi.label", - cls: "layout-bg3", - text: "居中,有宽度高度,无文字宽度,whiteSpace为normal,只需用center_adapt布局包一下即可.度,下即可.居中,有宽度,无文字宽度,whiteSpace为normal居中,有宽度,无文字宽度,下即可.居中,有宽度,无文字宽度,whiteSpace为normal居中,有宽度,无文字宽度,下即可.居中,有宽度,无文字宽度,whiteSpace为normal居中,有宽度,无文字宽度,度,无文字宽度,whiteSpace为normal居中,有宽度,无文字宽度,whiteSpace为normal", - width: 500, - whiteSpace: "normal", - textAlign: "center", - height: 50, - }) - ); - - items.push( - this.createExpander("1.3.2 居中,有宽度无高度,无文字宽度,whiteSpace为normal", { - type: "bi.absolute", - height: 100, - items: [ - { - el: { - type: "bi.label", - cls: "layout-bg3", - text: "居中,有宽度无高度,无文字宽度,whiteSpace为normal,只需用center_adapt布局包一下即可.度,下即可.居中,有宽度,无文字宽度,whiteSpace为normal居中,有宽度,无文字宽度,下即可.居中,有宽度,无文字宽度,whiteSpace为normal居中,有宽度,无文字宽度,下即可.居中,有宽度,无文字宽度,whiteSpace为normal居中,有宽度,无文字宽度,度,无文字宽度,whiteSpace为normal居中,有宽度,无文字宽度,whiteSpace为normal", - width: 500, - whiteSpace: "normal", - textAlign: "center", - }, - top: 0, - left: 0, - bottom: 0, - } - ], - }) - ); - - items.push( - this.createExpander("1.4 居中,有宽度和高度,无文字宽度,whiteSpace为nowrap", { - type: "bi.label", - cls: "layout-bg3", - text: "居中,有宽度500有高度50,无文字宽度,whiteSpace为nowrap,此处无需两层div,设置text即可,然后设置line-height为传入高度即可实现垂直方向居中", - width: 500, - whiteSpace: "nowrap", - textAlign: "center", - height: 50, - }) - ); - - items.push( - this.createExpander("1.5.1 居中,有宽度无高度,无文字宽度,whiteSpace为nowrap", { - type: "bi.label", - cls: "layout-bg3", - text: "居中,有宽度500无高度,无文字宽度,whiteSpace为nowrap,我凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数", - width: 500, - whiteSpace: "nowrap", - textAlign: "center", - }) - ); - - items.push( - this.createExpander("1.5.2 居中,有宽度无高度,无文字宽度,whiteSpace为nowrap,高度被父级拉满", { - type: "bi.absolute", - height: 50, - items: [ - { - el: { - type: "bi.label", - cls: "layout-bg3", - text: "居中,有宽度500无高度,无文字宽度,whiteSpace为nowrap,我凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数", - width: 500, - whiteSpace: "nowrap", - textAlign: "center", - }, - top: 0, - left: 0, - bottom: 0, - } - ], - }) - ); - - items.push( - this.createExpander("1.6.1 居中,无宽度无高度,有文字宽度,whiteSpace为nowrap", { - type: "bi.label", - cls: "layout-bg3", - text: "居中,无宽度,有文字宽度,whiteSpace为nowrap,我凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数", - textWidth: 500, - whiteSpace: "nowrap", - textAlign: "center", - }) - ); - - items.push( - this.createExpander("1.6.2 居中,无宽度无高度,有文字宽度,whiteSpace为normal", { - type: "bi.label", - cls: "layout-bg3", - text: "居中,无宽度,有文字宽度,whiteSpace为normal,我凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数", - textWidth: 500, - whiteSpace: "normal", - textAlign: "center", - }) - ); - - items.push( - this.createExpander("1.6.3 居中,无宽度无,有文字宽度,whiteSpace为normal,被父级拉满", { - type: "bi.absolute", - height: 100, - items: [ - { - el: { - type: "bi.label", - cls: "layout-bg3", - text: "居中,无宽度,有文字宽度,whiteSpace为normal,我凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数", - textWidth: 500, - whiteSpace: "normal", - textAlign: "center", - }, - left: 0, - right: 0, - top: 0, - bottom: 0, - } - ], - }) - ); - - items.push( - this.createExpander("1.7.1 居中,无宽度无高度,无文字宽度,whiteSpace为normal", { - type: "bi.label", - cls: "layout-bg3", - text: "居中,无宽度无高度,无文字宽度,whiteSpace为normal,我凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数", - whiteSpace: "normal", - textAlign: "center", - }) - ); - - items.push( - this.createExpander("1.7.2 居中,无宽度无高度,无文字宽度,whiteSpace为normal,被父级拉满", { - type: "bi.absolute", - height: 100, - items: [ - { - el: { - type: "bi.label", - cls: "layout-bg3", - text: "居中,无宽度无高度,无文字宽度,whiteSpace为normal,我凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数", - whiteSpace: "normal", - textAlign: "center", - }, - left: 0, - right: 0, - top: 0, - bottom: 0, - } - ], - }) - ); - - items.push( - this.createExpander("1.7.3 居中,无宽度有高度,无文字宽度,whiteSpace为normal", { - type: "bi.label", - cls: "layout-bg3", - text: "居中,无宽度有高度,无文字宽度,whiteSpace为normal,我凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数", - whiteSpace: "normal", - height: 50, - textAlign: "center", - }) - ); - - items.push( - this.createExpander("1.8 居中,无宽度有高度,无文字宽度,whiteSpace为nowrap", { - type: "bi.label", - cls: "layout-bg3", - text: "居中,无宽度有高度,无文字宽度,whiteSpace为nowrap,我凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数", - whiteSpace: "nowrap", - height: 50, - textAlign: "center", - }) - ); - - items.push( - this.createExpander("1.9 居中,无宽度无高度,无文字宽度,whiteSpace为nowrap", { - type: "bi.label", - cls: "layout-bg3", - text: "居中,无宽度无高度,无文字宽度,whiteSpace为nowrap,我凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数", - whiteSpace: "nowrap", - textAlign: "center", - }) - ); - - items.push( - this.createExpander("1.9.1 居中,无宽度无高度,无文字宽度,whiteSpace为nowrap,高度被父级拉满", { - type: "bi.absolute", - height: 50, - items: [ - { - el: { - type: "bi.label", - cls: "layout-bg3", - text: "居中,无宽度无高度,无文字宽度,whiteSpace为nowrap,我凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数", - whiteSpace: "nowrap", - textAlign: "center", - }, - top: 0, - left: 0, - right: 0, - bottom: 0, - } - ], - }) - ); - - items.push( - this.createExpander("2.1.1 居左,有宽度有高度,有文字宽度,whiteSpace为normal", { - type: "bi.label", - cls: "layout-bg2", - text: "居左,有宽度有高度,有文字宽度,whiteSpace为normal,为了演示这个是真的是normal的我凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数", - whiteSpace: "normal", - textAlign: "left", - textWidth: 300, - height: 50, - width: 500, - }) - ); - - items.push( - this.createExpander("2.1.2 居左,有宽度有高度,有文字宽度,whiteSpace为nowrap", { - type: "bi.label", - cls: "layout-bg2", - text: "居左,有宽度有高度,有文字宽度,whiteSpace为normal,为了演示这个是真的是normal的我凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数", - whiteSpace: "nowrap", - textAlign: "left", - textWidth: 300, - height: 50, - width: 500, - }) - ); - - items.push( - this.createExpander("2.2.1 居左,有宽度无高度,有文字宽度,whiteSpace为normal", { - type: "bi.label", - cls: "layout-bg2", - text: "居左,有宽度无高度,有文字宽度,whiteSpace为normal,不设置高度,为了演示这个是真的是normal的我凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数", - whiteSpace: "normal", - textAlign: "left", - textWidth: 300, - width: 500, - }) - ); - - items.push( - this.createExpander("2.2.2 居左,有宽度无高度,有文字宽度,whiteSpace为normal,高度被父级拉满", { - type: "bi.absolute", - height: 100, - items: [ - { - el: { - type: "bi.label", - cls: "layout-bg2", - text: "居左,有宽度无高度,有文字宽度,whiteSpace为normal,不设置高度,为了演示这个是真的是normal的我凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数", - whiteSpace: "normal", - textAlign: "left", - textWidth: 300, - width: 500, - }, - top: 0, - bottom: 0, - left: 0, - } - ], - }) - ); - - items.push( - this.createExpander("2.2.3 居左,有宽度无高度,有文字宽度,whiteSpace为nowrap", { - type: "bi.label", - cls: "layout-bg2", - text: "居左,有宽度无高度,有文字宽度,whiteSpace为nowrap,不设置高度,为了演示这个是真的是normal的我凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数", - whiteSpace: "nowrap", - textAlign: "left", - textWidth: 300, - width: 500, - }) - ); - - items.push( - this.createExpander("2.2.4 居左,有宽度无高度,有文字宽度,whiteSpace为nowrap,高度被父级拉满", { - type: "bi.absolute", - height: 100, - items: [ - { - el: { - type: "bi.label", - cls: "layout-bg2", - text: "居左,有宽度无高度,有文字宽度,whiteSpace为nowrap,不设置高度,为了演示这个是真的是normal的我凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数", - whiteSpace: "nowrap", - textAlign: "left", - textWidth: 300, - width: 500, - }, - top: 0, - bottom: 0, - left: 0, - } - ], - }) - ); - - items.push( - this.createExpander("2.3.1 居左,有宽度有高度,无文字宽度,whiteSpace为nowrap", { - type: "bi.label", - cls: "layout-bg2", - text: "居左,有宽度有高度,无文字宽度,whiteSpace为nowrap,我凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数", - whiteSpace: "nowrap", - textAlign: "left", - height: 50, - vgap: 5, - width: 500, - }) - ); - - items.push( - this.createExpander("2.3.2 居左,有宽度有高度,无文字宽度,whiteSpace为normal", { - type: "bi.label", - cls: "layout-bg2", - text: "居左,有宽度有高度,无文字宽度,whiteSpace为normal,我凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数", - whiteSpace: "normal", - textAlign: "left", - height: 50, - width: 500, - }) - ); - - items.push( - this.createExpander("2.4.1 居左,有宽度无高度,无文字宽度,whiteSpace为normal", { - type: "bi.label", - cls: "layout-bg2", - text: "居左,有宽度无高度,无文字宽度,whiteSpace为normal,我凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数", - whiteSpace: "normal", - textAlign: "left", - width: 500, - }) - ); - - items.push( - this.createExpander("2.4.2 居左,有宽度无高度,无文字宽度,whiteSpace为normal,高度被父级拉满", { - type: "bi.absolute", - height: 100, - items: [ - { - el: { - type: "bi.label", - cls: "layout-bg1", - text: "居左,有宽度无高度,无文字宽度,whiteSpace为normal,我凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数", - whiteSpace: "normal", - textAlign: "left", - width: 500, - }, - top: 0, - left: 0, - bottom: 0, - } - ], - }) - ); - - items.push( - this.createExpander("2.5.1 居左,无宽度无高度,有文字宽度,whiteSpace为normal", { - type: "bi.label", - cls: "layout-bg2", - text: "居左,无宽度无高度,有文字宽度,whiteSpace为normal,我凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数", - whiteSpace: "normal", - textAlign: "left", - textWidth: 300, - }) - ); - - items.push( - this.createExpander("2.5.2 居左,无宽度无高度,有文字宽度,whiteSpace为normal,高度被父级拉满", { - type: "bi.absolute", - height: 100, - items: [ - { - el: { - type: "bi.label", - cls: "layout-bg2", - text: "居左,无宽度无高度,有文字宽度,whiteSpace为normal,我凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数", - whiteSpace: "normal", - textAlign: "left", - textWidth: 300, - }, - top: 0, - left: 0, - bottom: 0, - right: 0, - } - ], - }) - ); - - items.push( - this.createExpander("2.5.3 居左,无宽度无高度,有文字宽度,whiteSpace为nowrap", { - type: "bi.label", - cls: "layout-bg2", - text: "居左,无宽度无高度,有文字宽度,whiteSpace为normal,我凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数", - whiteSpace: "nowrap", - textAlign: "left", - textWidth: 300, - }) - ); - - items.push( - this.createExpander("2.5.4 居左,无宽度无高度,有文字宽度,whiteSpace为nowrap,高度被父级拉满", { - type: "bi.absolute", - height: 100, - items: [ - { - el: { - type: "bi.label", - cls: "layout-bg2", - text: "居左,无宽度无高度,有文字宽度,whiteSpace为normal,我凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数", - whiteSpace: "nowrap", - textAlign: "left", - textWidth: 300, - }, - top: 0, - left: 0, - bottom: 0, - right: 0, - } - ], - }) - ); - - items.push( - this.createExpander("2.6.1 居左,无宽度有高度,无文字宽度,whiteSpace为nowrap", { - type: "bi.label", - cls: "layout-bg2", - text: "居左,无宽度有高度,无文字宽度,whiteSpace为nowrap,注意这个是设置了vgap的,为了实现居中,lineHeight要做计算,才能准确的垂直居中", - whiteSpace: "nowrap", - textAlign: "left", - vgap: 10, - height: 50, - }) - ); - - items.push( - this.createExpander("2.6.2 居左,无宽度有高度,无文字宽度,whiteSpace为normal", { - type: "bi.label", - cls: "layout-bg2", - text: "居左,无宽度有高度,无文字宽度,whiteSpace为normal,我凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,我凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,我凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,我凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,我凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,我凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数", - whiteSpace: "normal", - textAlign: "left", - height: 50, - }) - ); - - items.push( - this.createExpander("2.7.1 居左,无宽度无高度,无文字宽度,whiteSpace为normal", { - type: "bi.label", - cls: "layout-bg2", - text: "居左,无宽度无高度,无文字宽度,whiteSpace为normal,我凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,我凑点字数,凑点字数,凑点字数,字数,我凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,我凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数", - whiteSpace: "normal", - textAlign: "left", - }) - ); - - items.push( - this.createExpander("2.7.2 居左,无宽度无高度,无文字宽度,whiteSpace为normal,高度被父级拉满", { - type: "bi.absolute", - height: 100, - items: [ - { - el: { - type: "bi.label", - cls: "layout-bg2", - text: "居左,无宽度无高度,无文字宽度,whiteSpace为normal,我凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,我凑点字数,凑点字数,凑点字数,字数,我凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,我凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数", - whiteSpace: "normal", - textAlign: "left", - }, - top: 0, - left: 0, - bottom: 0, - right: 0, - } - ], - }) - ); - - items.push( - this.createExpander("2.7.3 居左,无宽度无高度,无文字宽度,whiteSpace为nowrap", { - type: "bi.label", - cls: "layout-bg2", - text: "居左,无宽度无高度,无文字宽度,whiteSpace为nowrap,我凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,我凑点字数,凑点字数,凑点字数,字数,我凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,我凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数", - whiteSpace: "nowrap", - textAlign: "left", - }) - ); - - items.push( - this.createExpander("2.7.4 居左,无宽度无高度,无文字宽度,whiteSpace为nowrap,高度被父级拉满", { - type: "bi.absolute", - height: 100, - items: [ - { - el: { - type: "bi.label", - cls: "layout-bg2", - text: "居左,无宽度无高度,无文字宽度,whiteSpace为nowrap,我凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,我凑点字数,凑点字数,凑点字数,字数,我凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,我凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数", - whiteSpace: "nowrap", - textAlign: "left", - }, - top: 0, - left: 0, - bottom: 0, - right: 0, - } - ], - }) - ); - - items.push( - this.createExpander("2.8 居左,无宽度无高度,无文字宽度,whiteSpace为nowrap,高度被父级拉满", { - type: "bi.absolute", - height: 100, - items: [ - { - el: { - type: "bi.label", - cls: "layout-bg2", - text: "居左,无宽度无高度,无文字宽度,whiteSpace为nowrap,我凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,我凑点字数,凑点字数,凑点字数,字数,我凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,我凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数", - whiteSpace: "nowrap", - textAlign: "left", - }, - top: 0, - left: 0, - bottom: 0, - right: 0, - } - ], - }) - ); - - items.push( - this.createExpander("2.8.2 居左,无宽度无高度,无文字宽度,whiteSpace为normal,高度被父级拉满", { - type: "bi.absolute", - height: 100, - items: [ - { - el: { - type: "bi.label", - cls: "layout-bg2", - text: "居左,无宽度无高度,无文字宽度,whiteSpace为normal,我凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,我凑点字数,凑点字数,凑点字数,字数,我凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,我凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数", - whiteSpace: "normal", - textAlign: "left", - }, - top: 0, - left: 0, - bottom: 0, - right: 0, - } - ], - }) - ); - - return { - type: "bi.vertical", - items, - hgap: 300, - vgap: 20, - }; - } - - createExpander(text, popup) { - return { - type: "bi.vertical", - items: [ - { - type: "bi.label", - cls: "demo-font-weight-bold", - textAlign: "left", - text, - height: 30, - }, - { - el: popup, - } - ], - }; - } -} diff --git a/demo/js/base/demo.message.js b/demo/js/base/demo.message.js deleted file mode 100644 index 880f8957f..000000000 --- a/demo/js/base/demo.message.js +++ /dev/null @@ -1,27 +0,0 @@ -import { shortcut, Widget } from "@/core"; -import { Msg } from "@/base"; - -@shortcut() -export class Message extends Widget { - static xtype = "demo.message"; - - props = { baseCls: "demo-bubble" }; - - render() { - return { - type: "bi.center_adapt", - items: [ - { - el: { - type: "bi.button", - text: "点击我弹出一个消息框", - height: 30, - handler() { - Msg.alert("测试消息框", "我是测试消息框的内容"); - }, - }, - } - ], - }; - } -} diff --git a/demo/js/base/demo.pager.js b/demo/js/base/demo.pager.js deleted file mode 100644 index 571917953..000000000 --- a/demo/js/base/demo.pager.js +++ /dev/null @@ -1,126 +0,0 @@ -import { shortcut, Widget } from "@/core"; - -@shortcut() -export class Func extends Widget { - static xtype = "demo.pager"; - - props = { baseCls: "demo-func" }; - - render() { - return { - type: "bi.vertical", - items: [ - { - type: "bi.label", - height: 30, - text: "默认的分页", - }, - { - type: "bi.pager", - height: 50, - pages: 18, - groups: 5, - curr: 6, - first: "首页", - last: "尾页", - }, - { - type: "bi.label", - height: 30, - text: "显示上一页、下一页、首页、尾页", - }, - { - type: "bi.pager", - dynamicShow: false, - height: 50, - pages: 18, - groups: 5, - curr: 1, - first: "首页>", - last: "<尾页", - }, - { - type: "bi.label", - height: 30, - text: "显示上一页、下一页", - }, - { - type: "bi.pager", - dynamicShow: false, - dynamicShowFirstLast: true, - height: 50, - pages: 18, - groups: 5, - curr: 1, - first: "首页>", - last: "<尾页", - }, - { - type: "bi.label", - height: 30, - text: "自定义上一页、下一页", - }, - { - type: "bi.pager", - dynamicShow: false, - height: 50, - pages: 18, - groups: 5, - curr: 6, - prev: { - type: "bi.button", - cls: "", - text: "上一页", - value: "prev", - once: false, - height: 30, - handler() {}, - }, - next: { - type: "bi.button", - cls: "", - text: "下一页", - value: "next", - once: false, - handler() {}, - }, - }, - { - type: "bi.label", - height: 30, - text: "不知道总页数的情况(测试条件 1<=page<=3)", - }, - { - type: "bi.pager", - dynamicShow: false, - height: 50, - pages: false, - curr: 1, - prev: { - type: "bi.button", - cls: "", - text: "上一页", - value: "prev", - once: false, - height: 30, - handler() {}, - }, - next: { - type: "bi.button", - cls: "", - text: "下一页", - value: "next", - once: false, - handler() {}, - }, - hasPrev(v) { - return v > 1; - }, - hasNext(v) { - return v < 3; - }, - } - ], - }; - } -} diff --git a/demo/js/base/editor/demo.editor.js b/demo/js/base/editor/demo.editor.js deleted file mode 100644 index fbfc7bc40..000000000 --- a/demo/js/base/editor/demo.editor.js +++ /dev/null @@ -1,124 +0,0 @@ -import { shortcut, Widget, createWidget } from "@/core"; -import { Editor as BIEditor} from "@/base"; - -@shortcut() -export class Editor extends Widget { - static xtype = "demo.editor"; - - props = { baseCls: "demo-editor" }; - - render() { - const editor1 = createWidget({ - type: "bi.editor", - cls: "bi-border", - watermark: "报错信息显示在控件上方", - errorText: "字段不可重名!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!", - width: 200, - height: 24, - }); - editor1.on(BIEditor.EVENT_ENTER, () => { - editor1.blur(); - }); - const editor2 = createWidget({ - type: "bi.editor", - cls: "bi-border", - watermark: "输入'a'会有错误信息", - disabled: true, - errorText: "字段不可重名", - validationChecker(v) { - if (v == "a") { - return false; - } - - return true; - }, - allowBlank: true, - width: 200, - height: 24, - }); - const editor3 = createWidget({ - type: "bi.editor", - cls: "bi-border", - watermark: "输入'a'会有错误信息且回车键不能退出编辑", - errorText: "字段不可重名", - value: "a", - validationChecker(v) { - if (v == "a") { - return false; - } - - return true; - }, - quitChecker(v) { - return false; - }, - allowBlank: true, - width: 300, - height: 24, - }); - const editor4 = createWidget({ - type: "bi.editor", - cls: "bi-border", - inputType: "password", - autocomplete: "new-password", - watermark: "请输入密码", - allowBlank: true, - width: 300, - height: 24, - }); - createWidget({ - type: "bi.absolute", - element: this, - items: [ - { - el: editor1, - left: 0, - top: 0, - }, - { - el: editor2, - left: 250, - top: 30, - }, - { - el: editor3, - left: 500, - top: 60, - }, - { - el: editor4, - left: 700, - top: 60, - }, - { - el: { - type: "bi.button", - text: "disable", - handler() { - editor1.setEnable(false); - editor2.setEnable(false); - editor3.setEnable(false); - }, - height: 30, - }, - left: 100, - bottom: 60, - }, - { - el: { - type: "bi.button", - text: "enable", - handler() { - editor1.setEnable(true); - editor2.setEnable(true); - editor3.setEnable(true); - }, - height: 30, - }, - left: 200, - bottom: 60, - } - ], - }); - } -} diff --git a/demo/js/base/editor/demo.multifile_editor.js b/demo/js/base/editor/demo.multifile_editor.js deleted file mode 100644 index 103d98694..000000000 --- a/demo/js/base/editor/demo.multifile_editor.js +++ /dev/null @@ -1,33 +0,0 @@ -import { shortcut, Widget } from "@/core"; - -@shortcut() -export class CodeEditor extends Widget { - static xtype = "demo.multifile_editor"; - - props = { baseCls: "demo-editor" }; - - render() { - return { - type: "bi.absolute", - items: [ - { - el: { - type: "bi.adaptive", - cls: "layout-bg1", - items: [ - { - type: "bi.multifile_editor", - width: 400, - height: 300, - } - ], - width: 400, - height: 300, - }, - top: 50, - left: 50, - } - ], - }; - } -} diff --git a/demo/js/base/editor/demo.textarea_editor.js b/demo/js/base/editor/demo.textarea_editor.js deleted file mode 100644 index 7c7d42497..000000000 --- a/demo/js/base/editor/demo.textarea_editor.js +++ /dev/null @@ -1,52 +0,0 @@ -import { shortcut, Widget, createWidget, isNotEmptyString } from "@/core"; -import { TextAreaEditor, Msg } from "@/base"; - -@shortcut() -export class CodeEditor extends Widget { - static xtype = "demo.textarea_editor"; - - props = { baseCls: "demo-editor" }; - - render() { - const editor = createWidget({ - type: "bi.textarea_editor", - cls: "bi-border", - width: 600, - height: 400, - watermark: "请输入内容", - errorText: "检测内容有误", - validationChecker(v) { - return isNotEmptyString(v); - }, - }); - editor.on(TextAreaEditor.EVENT_FOCUS, () => { - Msg.toast("Focus"); - }); - editor.on(TextAreaEditor.EVENT_BLUR, () => { - Msg.toast("Blur"); - }); - createWidget({ - type: "bi.vertical", - element: this, - hgap: 30, - vgap: 20, - items: [ - editor, - { - type: "bi.button", - text: "getValue", - handler() { - Msg.toast(JSON.stringify(editor.getValue())); - }, - }, - { - type: "bi.button", - text: "setValue", - handler() { - editor.setValue("测试数据"); - }, - } - ], - }); - } -} diff --git a/demo/js/base/index.js b/demo/js/base/index.js deleted file mode 100644 index 90aeb226a..000000000 --- a/demo/js/base/index.js +++ /dev/null @@ -1,11 +0,0 @@ -export * from "./demo.html"; -export * from "./demo.icon_label"; -export * from "./demo.label"; -export * from "./demo.label.scene"; -export * from "./demo.message"; -export * from "./demo.pager"; - -export * from "./button"; -export * from "./editor"; -export * from "./tip"; -export * from "./tree"; \ No newline at end of file diff --git a/demo/js/base/tip/demo.bubble.js b/demo/js/base/tip/demo.bubble.js deleted file mode 100644 index 7396d9910..000000000 --- a/demo/js/base/tip/demo.bubble.js +++ /dev/null @@ -1,84 +0,0 @@ -import { shortcut, Widget, Bubbles } from "@/core"; - -@shortcut() -export class Bubble extends Widget { - static xtype = "demo.bubble"; - - props = { baseCls: "demo-bubble" }; - - render() { - const btns = []; - const items = [ - { - el: { - ref(_ref) { - btns.push(_ref); - }, - type: "bi.button", - text: "bubble测试(消息)", - title: "123", - height: 30, - handler() { - Bubbles.show("singleBubble1", "bubble测试", this, { - level: "common", - }); - }, - }, - }, - { - el: { - ref(_ref) { - btns.push(_ref); - }, - type: "bi.button", - text: "bubble测试(成功)", - height: 30, - handler() { - Bubbles.show("singleBubble2", "bubble测试", this, { - offsetStyle: "center", - level: "success", - }); - }, - }, - }, - { - el: { - ref(_ref) { - btns.push(_ref); - }, - type: "bi.button", - text: "bubble测试(错误)", - height: 30, - handler() { - Bubbles.show("singleBubble3", "bubble测试", this, { - offsetStyle: "right", - level: "error", - }); - }, - }, - }, - { - el: { - ref(_ref) { - btns.push(_ref); - }, - type: "bi.button", - text: "bubble测试(警告)", - height: 30, - handler() { - Bubbles.show("singleBubble4", "bubble测试", this, { - level: "warning", - }); - }, - }, - } - ]; - - return { - type: "bi.left", - vgap: 200, - hgap: 20, - items, - }; - } -} diff --git a/demo/js/base/tip/demo.title.js b/demo/js/base/tip/demo.title.js deleted file mode 100644 index c30d360db..000000000 --- a/demo/js/base/tip/demo.title.js +++ /dev/null @@ -1,68 +0,0 @@ -import { shortcut, Widget } from "@/core"; - -@shortcut() -export class Title extends Widget { - static xtype = "demo.title"; - - props = { baseCls: "demo-title" }; - - render() { - return { - type: "bi.vertical", - items: [ - { - type: "bi.label", - cls: "layout-bg1", - height: 50, - title: "title提示", - text: "移上去有title提示", - textAlign: "center", - }, - { - type: "bi.label", - cls: "layout-bg6", - height: 50, - disabled: true, - warningTitle: "title错误提示", - text: "移上去有title错误提示", - textAlign: "center", - }, - { - type: "bi.label", - cls: "layout-bg2", - height: 50, - disabled: true, - tipType: "success", - title: "自定义title提示效果", - warningTitle: "自定义title提示效果", - text: "自定义title提示效果", - textAlign: "center", - }, - { - type: "bi.label", - cls: "layout-bg3", - height: 50, - title: () => "函数返回值作为title提示", - text: "title提示支持函数", - textAlign: "center", - }, - { - type: "bi.label", - cls: "layout-bg4", - height: 50, - title() { - return { - level: "success", - text: "自定义title\n提示效果", - textAlign: "center", - }; - }, - text: "title提示支持对象,作为bi.tooltip的props", - textAlign: "center", - } - ], - hgap: 300, - vgap: 20, - }; - } -} diff --git a/demo/js/base/tip/demo.toast.js b/demo/js/base/tip/demo.toast.js deleted file mode 100644 index 7447041bb..000000000 --- a/demo/js/base/tip/demo.toast.js +++ /dev/null @@ -1,86 +0,0 @@ -import { shortcut, Widget, createWidget } from "@/core"; -import { Msg } from "@/base"; - -@shortcut() -export class Toast extends Widget { - static xtype = "demo.toast"; - - props = { baseCls: "demo-toast" }; - - render() { - const items = [ - { - el: { - type: "bi.button", - text: "简单Toast测试(success)", - height: 30, - handler() { - Msg.toast("这是一条简单的数据", { - level: "success", - }); - }, - }, - }, - { - el: { - type: "bi.button", - text: "很长的Toast测试(normal)", - height: 30, - handler() { - Msg.toast( - "这是一条很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长的数据", - {} - ); - }, - }, - }, - { - el: { - type: "bi.button", - text: "非常长的Toast测试(warning)", - height: 30, - handler() { - Msg.toast( - "这是一条非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长的数据", - { - level: "warning", - autoClose: false, - } - ); - }, - }, - }, - { - el: { - type: "bi.button", - text: "错误提示Toast测试(error)", - height: 30, - handler() { - Msg.toast("错误提示Toast测试", { - level: "error", - }); - }, - }, - }, - { - el: { - type: "bi.button", - text: "错误提示Toast测试(error), 此toast不会自动消失", - height: 30, - handler() { - Msg.toast("错误提示Toast测试", { - autoClose: false, - }); - }, - }, - } - ]; - createWidget({ - type: "bi.left", - element: this, - vgap: 200, - hgap: 20, - items, - }); - } -} diff --git a/demo/js/base/tree/demo.part_tree.js b/demo/js/base/tree/demo.part_tree.js deleted file mode 100644 index 60bc17f81..000000000 --- a/demo/js/base/tree/demo.part_tree.js +++ /dev/null @@ -1,98 +0,0 @@ -import { shortcut, Widget, isNull } from "@/core"; -import { TreeView } from "@/case"; - -@shortcut() -export class Func extends Widget { - static xtype = "demo.part_tree"; - - props = { baseCls: "demo-func" }; - - mounted() { - this.partTree.stroke({ - keyword: "1", - }); - } - - render() { - const self = this; - - return { - type: "bi.vtape", - items: [ - { - type: "bi.label", - height: 50, - text: "先初始化一份数据,然后再异步获取数据的树", - }, - { - type: "bi.part_tree", - ref(_ref) { - self.partTree = _ref; - }, - paras: { - selectedValues: { 1: {}, 2: { 1: {} } }, - }, - itemsCreator(op, callback) { - if (op.type === TreeView.REQ_TYPE_INIT_DATA) { - callback({ - items: [ - { - id: "1", - text: 1, - isParent: true, - open: true, - }, - { - id: "11", - pId: "1", - text: 11, - isParent: true, - open: true, - }, - { - id: "111", - pId: "11", - text: 111, - isParent: true, - }, - { - id: "2", - text: 2, - }, - { - id: "3", - text: 3, - } - ], - hasNext: isNull(op.id), - }); - - return; - } - callback({ - items: [ - { - id: `${op.id || ""}1`, - pId: op.id, - text: 1, - isParent: true, - }, - { - id: `${op.id || ""}2`, - pId: op.id, - text: 2, - }, - { - id: `${op.id || ""}3`, - pId: op.id, - text: 3, - } - ], - hasNext: isNull(op.id), - }); - }, - } - ], - }; - } -} diff --git a/demo/js/base/tree/demo.sync_tree.js b/demo/js/base/tree/demo.sync_tree.js deleted file mode 100644 index f8bddb317..000000000 --- a/demo/js/base/tree/demo.sync_tree.js +++ /dev/null @@ -1,119 +0,0 @@ -import { shortcut, Widget, isNull } from "@/core"; - -@shortcut() -export class Func extends Widget { - static xtype = "demo.sync_tree"; - - props = { baseCls: "demo-func" }; - - mounted() { - this.syncTree1.stroke({ - keyword: "1", - }); - this.syncTree2.stroke({ - keyword: "1", - }); - } - - render() { - const self = this; - - return { - type: "bi.vtape", - rowSize: [0.5, 0.5], - items: [ - { - type: "bi.vtape", - items: [ - { - type: "bi.label", - height: 50, - text: "可以异步获取数据的树", - }, - { - type: "bi.async_tree", - ref(_ref) { - self.syncTree1 = _ref; - }, - paras: { - selectedValues: { 1: {}, 2: { 1: {} } }, - }, - itemsCreator(op, callback) { - callback({ - items: [ - { - id: `${op.id || ""}1`, - pId: op.id, - text: `${op.id || ""}1`, - isParent: true, - iconCls: "close-h-font", - }, - { - id: `${op.id || ""}2`, - pId: op.id, - text: `${op.id || ""}2`, - iconCls: "search-font", - }, - { - id: `${op.id || ""}3`, - pId: op.id, - text: `${op.id || ""}3`, - iconCls: "date-font", - } - ], - hasNext: isNull(op.id), - }); - }, - } - ], - }, - { - type: "bi.vtape", - items: [ - { - type: "bi.label", - height: 50, - text: "showIcon属性搭配节点iconCls,可以显示图标", - }, - { - type: "bi.async_tree", - ref(_ref) { - self.syncTree2 = _ref; - }, - paras: { - selectedValues: { 1: {}, 2: { 1: {} } }, - }, - showIcon: true, - itemsCreator(op, callback) { - callback({ - items: [ - { - id: `${op.id || ""}1`, - pId: op.id, - text: `${op.id || ""}1`, - isParent: true, - iconCls: "close-h-font", - }, - { - id: `${op.id || ""}2`, - pId: op.id, - text: `${op.id || ""}2`, - iconCls: "search-font", - }, - { - id: `${op.id || ""}3`, - pId: op.id, - text: `${op.id || ""}3`, - iconCls: "date-font", - } - ], - hasNext: isNull(op.id), - }); - }, - } - ], - } - ], - }; - } -} diff --git a/demo/js/base/tree/demo.tree_view.js b/demo/js/base/tree/demo.tree_view.js deleted file mode 100644 index a41a43a89..000000000 --- a/demo/js/base/tree/demo.tree_view.js +++ /dev/null @@ -1,57 +0,0 @@ -import { shortcut, Widget, createWidget } from "@/core"; - -@shortcut() -export class Func extends Widget { - static xtype = "demo.tree_view"; - - props = { baseCls: "demo-func" }; - - _createDefaultTree() { - const tree = createWidget({ - type: "bi.tree_view", - }); - tree.initTree([ - { id: 1, pId: 0, text: "test1", open: true }, - { id: 11, pId: 1, text: "test11" }, - { id: 12, pId: 1, text: "test12" }, - { id: 111, pId: 11, text: "test111" }, - { id: 2, pId: 0, text: "test2", open: true }, - { id: 21, pId: 2, text: "test21" }, - { id: 22, pId: 2, text: "test22" } - ]); - - return tree; - } - - render() { - const self = this; - createWidget({ - type: "bi.grid", - columns: 1, - rows: 1, - element: this, - items: [ - { - column: 0, - row: 0, - el: { - type: "bi.vtape", - items: [ - { - el: this._createDefaultTree(), - }, - { - el: { - type: "bi.label", - text: "tree.initTree([{\"id\":1, \"pId\":0, \"text\":\"test1\", open:true},{\"id\":11, \"pId\":1, \"text\":\"test11\"},{\"id\":12, \"pId\":1, \"text\":\"test12\"},{\"id\":111, \"pId\":11, \"text\":\"test111\"}])", - whiteSpace: "normal", - }, - height: 50, - } - ], - }, - } - ], - }); - } -} diff --git a/demo/js/case/combo/demo.search_text_value_combo.js b/demo/js/case/combo/demo.search_text_value_combo.js deleted file mode 100644 index 25cb79fc4..000000000 --- a/demo/js/case/combo/demo.search_text_value_combo.js +++ /dev/null @@ -1,122 +0,0 @@ -import { shortcut, Widget } from "@/core"; -import { Msg } from "@/base"; -import { AllValueMultiTextValueCombo } from "@/component"; - -@shortcut() -export class SearchTextValueCombo extends Widget { - static xtype = "demo.search_text_value_combo"; - - props = { baseCls: "" }; - - render() { - let combo, searchCombo; - - return { - type: "bi.horizontal_auto", - items: [ - { - type: "bi.search_text_value_combo", - ref() { - combo = this; - }, - warningTitle: "111", - text: "默认值", - value: 14, - width: 300, - items: [ - { - text: "ABC-1", - iconCls: "date-font", - value: 1, - }, - { - text: "BCD-2", - iconCls: "search-font", - value: 2, - }, - { - text: "CDE-3", - iconCls: "pull-right-font", - value: 3, - }, - { - text: "DEF-3", - iconCls: "pull-right-font", - value: 4, - }, - { - text: "FEG-3", - iconCls: "pull-right-font", - value: 5, - }, - { - text: "FGH-3", - iconCls: "pull-right-font", - value: 6, - }, - { - text: "GHI-3", - iconCls: "pull-right-font", - value: 7, - }, - { - text: "HIJ-3", - iconCls: "pull-right-font", - value: 8, - }, - { - text: "IJK-3", - iconCls: "pull-right-font", - value: 9, - }, - { - text: "JKL-3", - iconCls: "pull-right-font", - value: 10, - } - ], - }, - { - type: "bi.all_value_multi_text_value_combo", - items: Demo.CONSTANTS.ITEMS, - text: "提示文本", - width: 200, - value: { - type: 1, - value: ["1", "2", "柳州市城贸金属材料有限责任公司", "3"], - }, - ref() { - searchCombo = this; - }, - listeners: [ - { - eventName: AllValueMultiTextValueCombo.EVENT_CONFIRM, - action() { - BI.Msg.toast(JSON.stringify(searchCombo.getValue())); - }, - } - ], - }, - { - type: "bi.button", - text: "setValue(3)", - width: 90, - height: 25, - handler() { - combo.setValue(11); - }, - }, - { - type: "bi.button", - text: "getValue()", - width: 90, - height: 25, - handler() { - BI.Msg.toast(JSON.stringify(searchCombo.getValue())); - }, - } - ], - vgap: 20, - }; - } -} diff --git a/demo/js/case/combo/demo.text_vlaue_check_combo.js b/demo/js/case/combo/demo.text_vlaue_check_combo.js deleted file mode 100644 index 9767d23db..000000000 --- a/demo/js/case/combo/demo.text_vlaue_check_combo.js +++ /dev/null @@ -1,51 +0,0 @@ -import { shortcut, Widget } from "@/core"; -import { Msg } from "@/base"; - -@shortcut() -export class TextValueCheckCombo extends Widget { - static xtype = "demo.text_value_check_combo"; - - props = { baseCls: "" }; - - render() { - const self = this; - - return { - type: "bi.horizontal_auto", - items: [ - { - type: "bi.text_value_check_combo", - ref () { - self.combo = this; - }, - text: "默认值", - // value: 1, - width: 300, - items: [ - { - text: "MVC-1", - value: 1, - }, - { - text: "MVC-2", - value: 2, - }, - { - text: "MVC-3", - value: 3, - } - ], - }, - { - type: "bi.button", - width: 90, - height: 25, - handler () { - BI.Msg.alert("", JSON.stringify(self.combo.getValue())); - }, - } - ], - vgap: 20, - }; - } -} diff --git a/demo/js/case/index.js b/demo/js/case/index.js deleted file mode 100644 index 2f9c885e3..000000000 --- a/demo/js/case/index.js +++ /dev/null @@ -1,15 +0,0 @@ -export * from "./combo"; -export * from "./editor"; -export * from "./item"; -export * from "./list"; -export * from "./pager"; -export * from "./pane"; -export * from "./tree"; -export * from "./triggers"; - - -export * from "./demo.calendar"; -export * from "./demo.click.effect"; -export * from "./demo.color_chooser"; -export * from "./demo.color_chooser_popup"; -export * from "./demo.segment"; \ No newline at end of file diff --git a/demo/js/case/list/demo.lazy_loader.js b/demo/js/case/list/demo.lazy_loader.js deleted file mode 100644 index 066c04b9d..000000000 --- a/demo/js/case/list/demo.lazy_loader.js +++ /dev/null @@ -1,27 +0,0 @@ -import { shortcut, Widget } from "@/core"; - -@shortcut() -export class Func extends Widget { - static xtype = "demo.lazy_loader"; - - props = { baseCls: "demo-func" }; - - render() { - const self = this; - BI.createWidget({ - type: "bi.lazy_loader", - element: this, - el: { - layouts: [ - { - type: "bi.left", - hgap: 5, - } - ], - }, - items: BI.createItems(BI.deepClone(Demo.CONSTANTS.ITEMS), { - type: "bi.button", - }), - }); - } -} diff --git a/demo/js/case/list/demo.select_list.js b/demo/js/case/list/demo.select_list.js deleted file mode 100644 index 5c6f67c0e..000000000 --- a/demo/js/case/list/demo.select_list.js +++ /dev/null @@ -1,28 +0,0 @@ -import { shortcut, Widget, createWidget, createItems, deepClone, Selection } from "@/core"; - -@shortcut() -export class Func extends Widget { - static xtype = "demo.select_list"; - - props = { baseCls: "demo-func" }; - - render() { - const self = this; - createWidget({ - type: "bi.select_list", - toolbar: { - type: "bi.multi_select_bar", - iconWrapperWidth: 26, - }, - element: this, - el: { - el: { - chooseType: Selection.Multi, - }, - }, - items: createItems(deepClone(Demo.CONSTANTS.SIMPLE_ITEMS), { - type: "bi.multi_select_item", - }), - }); - } -} diff --git a/demo/js/case/pane/demo.list_pane.js b/demo/js/case/pane/demo.list_pane.js deleted file mode 100644 index 5ee6698be..000000000 --- a/demo/js/case/pane/demo.list_pane.js +++ /dev/null @@ -1,41 +0,0 @@ -import { shortcut, Widget, createItems, deepClone } from "@/core"; - -@shortcut() -export class Func extends Widget { - static xtype = "demo.list_pane"; - - props = { baseCls: "demo-func" }; - - render() { - const self = this; - - return { - type: "bi.list_pane", - ref() { - self.pane = this; - }, - itemsCreator(op, callback) { - setTimeout(() => { - callback( - createItems(deepClone(Demo.CONSTANTS.ITEMS), { - type: "bi.multi_select_item", - height: 25, - }) - ); - }, 2000); - }, - el: { - type: "bi.button_group", - layouts: [ - { - type: "bi.vertical", - } - ], - }, - }; - } - - mounted() { - this.pane.populate(); - } -} diff --git a/demo/js/case/pane/demo.multi_popup_view.js b/demo/js/case/pane/demo.multi_popup_view.js deleted file mode 100644 index e400a96ce..000000000 --- a/demo/js/case/pane/demo.multi_popup_view.js +++ /dev/null @@ -1,46 +0,0 @@ -import { shortcut, Widget, createItems, deepClone } from "@/core"; - -@shortcut() -export class Func extends Widget { - static xtype = "demo.multi_popup_view"; - - props = { baseCls: "demo-func" }; - - render() { - const self = this; - - return { - type: "bi.absolute", - items: [ - { - el: { - type: "bi.combo", - width: 200, - height: 30, - el: { - type: "bi.text_button", - text: "点击", - cls: "bi-border", - height: 30, - }, - popup: { - type: "bi.multi_popup_view", - el: { - type: "bi.button_group", - layouts: [ - { - type: "bi.vertical", - } - ], - items: createItems(deepClone(Demo.CONSTANTS.ITEMS), { - type: "bi.multi_select_item", - height: 25, - }), - }, - }, - }, - } - ], - }; - } -} diff --git a/demo/js/case/pane/demo.panel.js b/demo/js/case/pane/demo.panel.js deleted file mode 100644 index 8c5c65c9e..000000000 --- a/demo/js/case/pane/demo.panel.js +++ /dev/null @@ -1,35 +0,0 @@ -import { shortcut, Widget, createItems, deepClone } from "@/core"; - -@shortcut() -export class Func extends Widget { - static xtype = "demo.panel"; - - props = { baseCls: "demo-func" }; - - render() { - const self = this; - - return { - type: "bi.panel", - title: "title", - titleButtons: [ - { - type: "bi.button", - text: "操作", - } - ], - el: { - type: "bi.button_group", - layouts: [ - { - type: "bi.vertical", - } - ], - items: createItems(deepClone(Demo.CONSTANTS.ITEMS), { - type: "bi.multi_select_item", - height: 25, - }), - }, - }; - } -} diff --git a/demo/js/case/pane/demo.popup_panel.js b/demo/js/case/pane/demo.popup_panel.js deleted file mode 100644 index 4532a4f56..000000000 --- a/demo/js/case/pane/demo.popup_panel.js +++ /dev/null @@ -1,46 +0,0 @@ -import { shortcut, Widget, createItems, deepClone } from "@/core"; - -@shortcut() -export class Func extends Widget { - static xtype = "demo.popup_panel"; - - props = { baseCls: "demo-func" }; - - render() { - const self = this; - - return { - type: "bi.absolute", - items: [ - { - el: { - type: "bi.combo", - width: 200, - height: 30, - el: { - type: "bi.text_button", - text: "点击", - cls: "bi-border", - height: 30, - }, - popup: { - type: "bi.popup_panel", - el: { - type: "bi.button_group", - layouts: [ - { - type: "bi.vertical", - } - ], - items: BI.createItems(BI.deepClone(Demo.CONSTANTS.ITEMS), { - type: "bi.multi_select_item", - height: 25, - }), - }, - }, - }, - } - ], - }; - } -} diff --git a/demo/js/case/tree/demo.level_tree.js b/demo/js/case/tree/demo.level_tree.js deleted file mode 100644 index 7dd4e0efc..000000000 --- a/demo/js/case/tree/demo.level_tree.js +++ /dev/null @@ -1,111 +0,0 @@ -import { shortcut, Widget, createWidget } from "@/core"; -import { Msg } from "@/base"; - -@shortcut() -export class Func extends Widget { - static xtype = "demo.level_tree"; - - props = { baseCls: "demo-func" }; - - render() { - const tree = BI.createWidget({ - type: "bi.level_tree", - chooseType: 0, - items: [ - { - id: 1, - text: "第一项", - value: 1, - isParent: true, - }, - { - id: 2, - text: "第二项", - value: 2, - isParent: true, - }, - { - id: 3, - text: "第三项", - value: 1, - isParent: true, - open: true, - }, - { - id: 4, - text: "第四项", - value: 1, - }, - { - id: 11, - pId: 1, - text: "子项1", - value: 11, - }, - { - id: 12, - pId: 1, - text: "子项2", - value: 12, - }, - { - id: 13, - pId: 1, - text: "子项3", - value: 13, - }, - { - id: 111, - pId: 11, - text: "子项1-1", - value: 111, - }, - { - id: 21, - pId: 2, - text: "子项1", - value: 21, - }, - { - id: 31, - pId: 3, - text: "子项1", - value: 31, - }, - { - id: 32, - pId: 3, - text: "子项2", - value: 32, - }, - { - id: 33, - pId: 3, - text: "子项3", - value: 33, - } - ], - }); - - BI.createWidget({ - type: "bi.vtape", - element: this, - items: [ - { - el: tree, - }, - { - height: 30, - el: { - type: "bi.button", - height: 30, - text: "getValue", - handler() { - BI.Msg.alert("", tree.getValue()); - }, - }, - } - ], - }); - } -} diff --git a/demo/js/case/tree/demo.simple_tree.js b/demo/js/case/tree/demo.simple_tree.js deleted file mode 100644 index bf82d74b4..000000000 --- a/demo/js/case/tree/demo.simple_tree.js +++ /dev/null @@ -1,147 +0,0 @@ -import { shortcut, Widget, createWidget } from "@/core"; -import { Msg } from "@/base"; - -@shortcut() -export class Func extends Widget { - static xtype = "demo.simple_tree"; - - props = { baseCls: "demo-func" }; - - render() { - // value值一定要是字符串 - const tree = BI.createWidget({ - type: "bi.simple_tree", - items: [ - { - id: 1, - text: "第一项", - value: "1", - }, - { - id: 2, - text: "第二项", - value: "2", - }, - { - id: 3, - text: "第三项", - value: "3", - open: true, - }, - { - id: 11, - pId: 1, - text: "子项1", - value: "11", - }, - { - id: 12, - pId: 1, - text: "子项2", - value: "12", - }, - { - id: 13, - pId: 1, - text: "子项3", - value: "13", - }, - { - id: 31, - pId: 3, - text: "子项1", - value: "31", - }, - { - id: 32, - pId: 3, - text: "子项2", - value: "32", - }, - { - id: 33, - pId: 3, - text: "子项3", - value: "33", - } - ], - value: ["31", "32", "33"], - }); - - // tree.populate([{ - // id: 1, - // text: "第一项", - // value: "1" - // }, { - // id: 2, - // text: "第二项", - // value: "2" - // }, { - // id: 3, - // text: "第三项", - // value: "3", - // open: true - // }, { - // id: 11, - // pId: 1, - // text: "子项1", - // value: "11" - // }, { - // id: 12, - // pId: 1, - // text: "子项2", - // value: "12" - // }, { - // id: 13, - // pId: 1, - // text: "子项3", - // value: "13" - // }, { - // id: 31, - // pId: 3, - // text: "子项1", - // value: "31" - // }, { - // id: 32, - // pId: 3, - // text: "子项2", - // value: "32" - // }, { - // id: 33, - // pId: 3, - // text: "子项3", - // value: "33" - // }], "z"); - BI.createWidget({ - type: "bi.vtape", - element: this, - items: [ - { - el: tree, - }, - { - height: 30, - el: { - type: "bi.button", - height: 30, - text: "setValue(['31', '32', '33'])", - handler() { - tree.setValue(["31", "32", "33"]); - }, - }, - }, - { - height: 30, - el: { - type: "bi.button", - height: 30, - text: "getValue", - handler() { - BI.Msg.alert("", JSON.stringify(tree.getValue())); - }, - }, - } - ], - }); - } -} diff --git a/demo/js/center.js b/demo/js/center.js deleted file mode 100644 index 2b20d9907..000000000 --- a/demo/js/center.js +++ /dev/null @@ -1,16 +0,0 @@ -import { shortcut, Widget } from "@/core"; - -@shortcut() -export class Center extends Widget { - static xtype = "demo.center"; - - props = { baseCls: "demo-center" }; - - render() { - const self = this; - - return { - type: "bi.router_view", - }; - } -} diff --git a/demo/js/component/demo.form.js b/demo/js/component/demo.form.js deleted file mode 100644 index 54e8cdbde..000000000 --- a/demo/js/component/demo.form.js +++ /dev/null @@ -1,111 +0,0 @@ -import { shortcut, Widget, createWidget, isEmpty, isNotEmptyArray } from "@/core"; - -@shortcut() -export class Form extends Widget { - static xtype = "demo.form"; - - props = { baseCls: "demo-form" }; - - render() { - const widget = BI.createWidget({ - type: "bi.custom_form", - width: 300, - labelWidth: 100, - items: [ - { - validate(v) { - return v !== "a" && v !== ""; - }, - tip(v) { - if (BI.isEmpty(v)) { - return "不能为空"; - } - - return "不合法格式"; - }, - label: "E-mail", - el: { - type: "bi.text_editor", - watermark: "输入a报错", - allowBlank: true, - }, - }, - { - validate(v) { - return BI.isNotEmptyArray(v); - }, - tip() { - return "不能为空"; - }, - label: "性别", - el: { - type: "bi.text_value_combo", - text: "请选择", - items: [ - { - text: "男", - value: 1, - }, - { - text: "女", - value: 2, - } - ], - }, - }, - { - validate(v) { - return v !== ""; - }, - tip() { - return "不能为空"; - }, - label: "姓名", - el: { - type: "bi.text_editor", - watermark: "输入姓名", - allowBlank: true, - }, - }, - { - validate(v) { - return v !== ""; - }, - tip() { - return "不能为空"; - }, - label: "姓名", - el: { - type: "bi.textarea_editor", - cls: "bi-border", - watermark: "输入简介", - allowBlank: true, - height: 200, - }, - } - ], - layout: { - type: "bi.vertical", - vgap: 30, - }, - }); - - return { - type: "bi.vertical", - hgap: 200, - vgap: 10, - items: [ - widget, - { - type: "bi.button", - text: "提交", - handler() { - widget.validate(); - - console.log(widget.getValue()); - }, - } - ], - }; - } -} diff --git a/demo/js/component/demo.treevaluechoosercombo.js b/demo/js/component/demo.treevaluechoosercombo.js deleted file mode 100644 index c9578d906..000000000 --- a/demo/js/component/demo.treevaluechoosercombo.js +++ /dev/null @@ -1,27 +0,0 @@ -import { shortcut, Widget, createWidget, deepClone } from "@/core"; - -@shortcut() -export class TreeValueChooser extends Widget { - static xtype = "demo.tree_value_chooser_combo"; - - props = { baseCls: "demo-tree-value-chooser-combo" }; - - render() { - const widget = createWidget({ - type: "bi.tree_value_chooser_combo", - width: 300, - // items: deepClone(Demo.CONSTANTS.TREEITEMS), - itemsCreator(op, callback) { - callback(deepClone(Demo.CONSTANTS.TREEITEMS)); - }, - defaultText: "请选择", - }); - - return { - type: "bi.vertical", - hgap: 200, - vgap: 10, - items: [widget], - }; - } -} diff --git a/demo/js/component/demo.treevaluechooserpane.js b/demo/js/component/demo.treevaluechooserpane.js deleted file mode 100644 index 5ba7025f0..000000000 --- a/demo/js/component/demo.treevaluechooserpane.js +++ /dev/null @@ -1,18 +0,0 @@ -import { shortcut, Widget, deepClone } from "@/core"; - -@shortcut() -export class TreeValueChooser extends Widget { - static xtype = "demo.tree_value_chooser_pane"; - - props = { baseCls: "demo-tree-value-chooser" }; - - render() { - return { - type: "bi.tree_value_chooser_pane", - items: deepClone(Demo.CONSTANTS.TREEITEMS), - // itemsCreator: function (op, callback) { - // callback(tree); - // } - }; - } -} diff --git a/demo/js/component/demo.valuechoosercombo.js b/demo/js/component/demo.valuechoosercombo.js deleted file mode 100644 index 82ebbcb7f..000000000 --- a/demo/js/component/demo.valuechoosercombo.js +++ /dev/null @@ -1,24 +0,0 @@ -import { shortcut, Widget, createWidget, deepClone } from "@/core"; - -@shortcut() -export class ValueChooserCombo extends Widget { - static xtype = "demo.value_chooser_combo"; - - props = { baseCls: "demo-value-chooser-combo" }; - - render() { - const widget = createWidget({ - type: "bi.value_chooser_combo", - itemsCreator (op, callback) { - callback(deepClone(Demo.CONSTANTS.ITEMS)); - }, - }); - - return { - type: "bi.vertical", - hgap: 200, - vgap: 10, - items: [widget], - }; - } -} diff --git a/demo/js/component/demo.valuechooserpane.js b/demo/js/component/demo.valuechooserpane.js deleted file mode 100644 index 656aa5c17..000000000 --- a/demo/js/component/demo.valuechooserpane.js +++ /dev/null @@ -1,18 +0,0 @@ -import { shortcut, Widget, deepClone } from "@/core"; - -@shortcut() -export class ValueChooserPane extends Widget { - static xtype = "demo.value_chooser_pane"; - - props = { baseCls: "demo-value-chooser-pane" }; - - render() { - return { - type: "bi.value_chooser_pane", - items: deepClone(Demo.CONSTANTS.ITEMS), - // itemsCreator: function (op, callback) { - // callback(deepClone(Demo.CONSTANTS.ITEMS)); - // } - }; - } -} diff --git a/demo/js/component/index.js b/demo/js/component/index.js deleted file mode 100644 index a43fa5972..000000000 --- a/demo/js/component/index.js +++ /dev/null @@ -1,5 +0,0 @@ -export * from "./demo.form"; -export * from "./demo.treevaluechoosercombo"; -export * from "./demo.treevaluechooserpane"; -export * from "./demo.valuechoosercombo"; -export * from "./demo.valuechooserpane"; \ No newline at end of file diff --git a/demo/js/config/base.js b/demo/js/config/base.js deleted file mode 100644 index d4fa19205..000000000 --- a/demo/js/config/base.js +++ /dev/null @@ -1,89 +0,0 @@ -Demo.BASE_CONFIG = [{ - id: 2, - text: "基础控件", - open: false -}, { - pId: 2, - text: "bi.label", - value: "demo.label" -},{ - pId: 2, - text: "bi.label_scene", - value: "demo.label_scene" -}, { - pId: 2, - text: "bi.icon_label", - value: "demo.icon_label" -}, { - pId: 2, - text: "bi.html", - value: "demo.html" -}, { - pId: 2, - text: "title提示", - value: "demo.title" -}, { - pId: 2, - text: "气泡提示", - value: "demo.bubble" -}, { - pId: 2, - text: "toast提示", - value: "demo.toast" -}, { - pId: 2, - id: 201, - text: "button" -}, { - pId: 201, - text: "bi.button", - value: "demo.button" -}, { - pId: 201, - text: "bi.text_button", - value: "demo.text_button" -}, { - pId: 201, - text: "bi.icon_button", - value: "demo.icon_button" -}, { - pId: 201, - text: "bi.image_button", - value: "demo.image_button" -}, { - pId: 2, - id: 202, - text: "editor" -}, { - pId: 202, - text: "bi.editor", - value: "demo.editor" -}, { - pId: 202, - text: "bi.multifile_editor", - value: "demo.multifile_editor" -}, { - pId: 202, - text: "bi.textarea_editor", - value: "demo.textarea_editor" -}, { - pId: 2, - id: 203, - text: "tree" -}, { - pId: 203, - text: "bi.tree_view", - value: "demo.tree_view" -}, { - pId: 203, - text: "bi.async_tree", - value: "demo.sync_tree" -}, { - pId: 203, - text: "bi.part_tree", - value: "demo.part_tree" -}, { - pId: 2, - text: "bi.pager", - value: "demo.pager" -}]; \ No newline at end of file diff --git a/demo/js/config/case.js b/demo/js/config/case.js deleted file mode 100644 index 7b62db09e..000000000 --- a/demo/js/config/case.js +++ /dev/null @@ -1,185 +0,0 @@ -Demo.CASE_CONFIG = [{ - id: 3, - text: "实例控件", - open: false -}, { - pId: 3, - id: 300, - text: "按钮" -}, { - pId: 300, - text: "bi.multi_select_item", - value: "demo.multi_select_item" -}, { - pId: 300, - text: "bi.single_select_item", - value: "demo.single_select_item" -}, { - pId: 300, - text: "bi.single_select_radio_item", - value: "demo.single_select_radio_item" -}, { - pId: 3, - id: 301, - text: "editors" -}, { - pId: 301, - text: "bi.shelter_editor", - value: "demo.shelter_editor" -}, { - pId: 301, - text: "bi.sign_editor", - value: "demo.sign_editor" -}, { - pId: 301, - text: "bi.state_editor", - value: "demo.state_editor" -}, { - pId: 301, - text: "bi.simple_state_editor", - value: "demo.simple_state_editor" -}, { - pId: 301, - text: "bi.clear_editor", - value: "demo.clear_editor" -}, { - pId: 3, - id: 302, - text: "列表" -}, { - pId: 302, - text: "bi.select_list", - value: "demo.select_list" -}, { - pId: 302, - text: "bi.lazy_loader", - value: "demo.lazy_loader" -}, { - pId: 3, - id: 303, - text: "面板" -}, { - pId: 303, - text: "bi.list_pane", - value: "demo.list_pane" -}, { - pId: 303, - text: "bi.panel", - value: "demo.panel" -}, { - pId: 3, - id: 304, - text: "popup弹出层" -}, { - pId: 304, - text: "bi.multi_popup_view", - value: "demo.multi_popup_view" -}, { - pId: 304, - text: "bi.popup_panel", - value: "demo.popup_panel" -}, { - pId: 3, - id: 305, - text: "触发器trigger" -}, { - pId: 305, - text: "bi.editor_trigger", - value: "demo.editor_trigger" -}, { - pId: 305, - text: "bi.icon_trigger", - value: "demo.icon_trigger" -}, { - pId: 305, - text: "bi.text_trigger", - value: "demo.text_trigger" -}, { - pId: 305, - text: "bi.select_text_trigger", - value: "demo.select_text_trigger" -}, { - pId: 3, - id: 306, - text: "combo" -}, { - pId: 306, - text: "bi.bubble_combo", - value: "demo.bubble_combo" -}, { - pId: 306, - text: "bi.icon_combo", - value: "demo.icon_combo" -}, { - pId: 306, - text: "bi.text_value_combo", - value: "demo.text_value_combo" -}, { - pId: 306, - text: "bi.search_text_value_combo", - value: "demo.search_text_value_combo" -}, { - pId: 306, - text: "bi.icon_text_value_combo", - value: "demo.icon_text_value_combo" -}, { - pId: 306, - text: "bi.text_value_check_combo", - value: "demo.text_value_check_combo" -}, { - pId: 306, - text: "bi.editor_icon_check_combo", - value: "demo.editor_icon_check_combo" -}, { - pId: 306, - text: "bi.text_value_down_list_combo", - value: "demo.text_value_down_list_combo" -}, { - pId: 3, - id: 307, - text: "tree" -}, { - pId: 307, - text: "bi.display_tree", - value: "demo.display_tree" -}, { - pId: 307, - text: "bi.simple_tree", - value: "demo.simple_tree" -}, { - pId: 307, - text: "bi.level_tree", - value: "demo.level_tree" -}, { - pId: 3, - id: 309, - text: "pager" -}, { - pId: 309, - text: "bi.all_count_pager", - value: "demo.all_count_pager" -}, { - pId: 309, - text: "bi.direction_pager", - value: "demo.direction_pager" -}, { - pId: 3, - text: "bi.calendar", - value: "demo.calendar" -}, { - pId: 3, - text: "bi.color_chooser", - value: "demo.color_chooser" -}, { - pId: 3, - text: "bi.color_chooser_popup", - value: "demo.color_chooser_popup" -}, { - pId: 3, - text: "bi.segment", - value: "demo.segment" -}, { - pId: 3, - text: "点击项样式查看", - value: "demo.click_item_effect" -}]; \ No newline at end of file diff --git a/demo/js/config/category.js b/demo/js/config/category.js deleted file mode 100644 index 1902196ff..000000000 --- a/demo/js/config/category.js +++ /dev/null @@ -1,8 +0,0 @@ -Demo.CATEGORY_CONFIG = [{ - id: 100000, - text: "专题" -}, { - pId: 100000, - text: "可以排序的树", - value: "demo.sort_tree" -}]; \ No newline at end of file diff --git a/demo/js/config/component.js b/demo/js/config/component.js deleted file mode 100644 index e6bbb9cf0..000000000 --- a/demo/js/config/component.js +++ /dev/null @@ -1,27 +0,0 @@ -/** - * Created by User on 2017/3/22. - */ -Demo.COMPONENT_CONFIG = [{ - id: 5, - text: "部件+服务" -}, { - pId: 5, - text: "bi.value_chooser_combo", - value: "demo.value_chooser_combo" -}, { - pId: 5, - text: "bi.value_chooser_pane", - value: "demo.value_chooser_pane" -}, { - pId: 5, - text: "bi.tree_value_chooser_combo", - value: "demo.tree_value_chooser_combo" -}, { - pId: 5, - text: "bi.tree_value_chooser_pane", - value: "demo.tree_value_chooser_pane" -}, { - pId: 5, - text: "demo.form", - value: "demo.form" -}]; \ No newline at end of file diff --git a/demo/js/config/core.js b/demo/js/config/core.js deleted file mode 100644 index 2c5794488..000000000 --- a/demo/js/config/core.js +++ /dev/null @@ -1,203 +0,0 @@ -Demo.CORE_CONFIG = [{ - id: 1, - text: "核心控件" -}, { - id: 101, - pId: 1, - text: "布局" -}, { - pId: 101, - text: "bi.absolute", - value: "demo.absolute" -}, { - pId: 101, - text: "bi.center_adapt", - value: "demo.center_adapt" -}, { - pId: 101, - text: "bi.vertical_adapt", - value: "demo.vertical_adapt" -}, { - pId: 101, - text: "bi.horizontal_adapt", - value: "demo.horizontal_adapt" -}, { - pId: 101, - text: "bi.horizontal_auto", - value: "demo.horizontal_auto" -}, { - pId: 101, - text: "bi.horizontal_float", - value: "demo.horizontal_float" -}, { - pId: 101, - text: "bi.left_right_vertical_adapt", - value: "demo.left_right_vertical_adapt" -}, { - pId: 101, - text: "bi.center", - value: "demo.center_layout" -}, { - pId: 101, - text: "bi.float_center", - value: "demo.float_center" -}, { - pId: 101, - text: "bi.vertical", - value: "demo.vertical" -}, { - pId: 101, - text: "bi.horizontal", - value: "demo.horizontal" -}, { - pId: 101, - text: "bi.border", - value: "demo.border" -}, { - pId: 101, - text: "bi.left, bi.right", - value: "demo.flow" -}, { - pId: 101, - text: "bi.htape", - value: "demo.htape" -}, { - pId: 101, - text: "bi.vtape", - value: "demo.vtape" -}, { - pId: 101, - text: "bi.grid", - value: "demo.grid" -}, { - pId: 101, - text: "bi.table", - value: "demo.table_layout" -}, { - pId: 101, - text: "bi.td", - value: "demo.td" -}, { - pId: 101, - text: "..." -}, { - pId: 1, - id: 102, - text: "抽象控件" -}, { - pId: 102, - text: "bi.button_group", - value: "demo.button_group" -}, { - pId: 102, - text: "bi.button_tree", - value: "demo.button_tree" -}, { - pId: 102, - text: "bi.virtual_group", - value: "demo.virtual_group" -}, { - pId: 102, - text: "bi.custom_tree", - value: "demo.custom_tree" -}, { - pId: 102, - text: "bi.grid_view", - value: "demo.grid_view" -}, { - pId: 102, - text: "bi.collection_view", - value: "demo.collection_view" -}, { - pId: 102, - text: "bi.list_view", - value: "demo.list_view" -}, { - pId: 102, - text: "bi.virtual_list", - value: "demo.virtual_list" -}, { - pId: 102, - id: 10201, - text: "组合控件" -}, { - pId: 10201, - text: "bi.combo", - value: "demo.combo" -}, { - pId: 10201, - text: "bi.combo(各种位置)", - value: "demo.combo2" -}, { - pId: 10201, - text: "bi.combo(內部位置)", - value: "demo.combo3" -}, { - pId: 10201, - text: "bi.expander", - value: "demo.expander" -}, { - pId: 10201, - text: "bi.combo_group", - value: "demo.combo_group" -}, { - pId: 10201, - text: "bi.loader", - value: "demo.loader" -}, { - pId: 10201, - text: "bi.navigation", - value: "demo.navigation" -}, { - pId: 10201, - text: "bi.searcher", - value: "demo.searcher" -}, { - pId: 10201, - text: "bi.switcher", - value: "demo.switcher" -}, { - pId: 10201, - text: "bi.tab", - value: "demo.tab" -}, { - pId: 102, - id: 10202, - text: "弹出层" -}, { - pId: 10202, - text: "layer", - value: "demo.layer" -}, { - pId: 10202, - text: "bi.popover", - value: "demo.popover" -}, { - pId: 10202, - text: "bi.popup_view", - value: "demo.popup_view" -}, { - pId: 10202, - text: "bi.searcher_view", - value: "demo.searcher_view" -}, { - pId: 1, - text: "Widget(继承)", - value: "demo.widget" -}, { - pId: 1, - text: "Single(继承)", - value: "demo.single" -}, { - pId: 1, - text: "BasicButton(继承)", - value: "demo.basic_button" -}, { - pId: 1, - text: "NodeButton(继承)", - value: "demo.node_button" -}, { - pId: 1, - text: "Pane(继承)", - value: "demo.pane" -}]; \ No newline at end of file diff --git a/demo/js/config/demo.pane.js b/demo/js/config/demo.pane.js deleted file mode 100644 index cb69e17a4..000000000 --- a/demo/js/config/demo.pane.js +++ /dev/null @@ -1,34 +0,0 @@ -import { shortcut } from "@/core"; -import { Pane as BIPane } from "@/base"; - -@shortcut() -export class Pane extends BIPane { - static xtype = "demo.pane"; - - props = {}; - - mounted() { - console.log("loading pane mounted"); - } - - render() { - return { - type: "bi.center_adapt", - items: [ - { - type: "bi.label", - text: "this is pane center", - } - ], - }; - } - - beforeRender(callback) { - const self = this; - this.loading(); - setTimeout(() => { - self.loaded(); - callback(); - }, 3000); - } -} diff --git a/demo/js/config/fix.js b/demo/js/config/fix.js deleted file mode 100644 index 6eacf396e..000000000 --- a/demo/js/config/fix.js +++ /dev/null @@ -1,54 +0,0 @@ -Demo.FIX_CONFIG = [{ - id: 7, - text: "数据流框架fix-2.0" -}, { - id: 71, - pId: 7, - text: "定义响应式数据", - value: "demo.fix_define" -}, { - id: 72, - pId: 7, - text: "state属性", - value: "demo.fix_state" -}, { - id: 73, - pId: 7, - text: "计算属性", - value: "demo.fix_computed" -}, { - id: 74, - pId: 7, - text: "store", - value: "demo.fix_store" -}, { - id: 75, - pId: 7, - text: "watcher且或表达式", - value: "demo.fix_watcher" -}, { - id: 76, - pId: 7, - text: "watcher星号表达式", - value: "demo.fix_global_watcher" -}, { - id: 77, - pId: 7, - text: "context", - value: "demo.fix_context" -}, { - id: 78, - pId: 7, - text: "一个混合的例子", - value: "demo.fix" -}, { - id: 79, - pId: 7, - text: "场景", - value: "demo.fix_scene" -}, { - id: 80, - pId: 7, - text: "inject", - value: "demo.fix_inject" -}]; diff --git a/demo/js/config/index.js b/demo/js/config/index.js deleted file mode 100644 index 21b2a224c..000000000 --- a/demo/js/config/index.js +++ /dev/null @@ -1,8 +0,0 @@ -export * from "./base"; -export * from "./case"; -export * from "./category"; -export * from "./component"; -export * from "./core"; -export * from "./demo.pane"; -export * from "./fix"; -export * from "./widget"; \ No newline at end of file diff --git a/demo/js/config/widget.js b/demo/js/config/widget.js deleted file mode 100644 index e48282492..000000000 --- a/demo/js/config/widget.js +++ /dev/null @@ -1,205 +0,0 @@ -Demo.WIDGET_CONFIG = [{ - id: 4, - text: "详细控件", - open: true -}, { - pId: 4, - id: 401, - text: "各种小控件" -}, { - pId: 401, - text: "各种通用按钮", - value: "demo.buttons" -}, { - pId: 401, - text: "各种提示性信息", - value: "demo.tips" -}, { - pId: 401, - text: "各种items", - value: "demo.items" -}, { - pId: 401, - text: "各种节点node", - value: "demo.nodes" -}, { - pId: 401, - text: "各种segment", - value: "demo.segments" -}, { - pId: 4, - id: 402, - text: "文本框控件" -}, { - pId: 402, - text: "bi.text_editor", - value: "demo.text_editor" -}, { - pId: 402, - text: "bi.search_editor", - value: "demo.search_editor" -}, { - pId: 402, - text: "bi.number_editor", - value: "demo.number_editor" -}, { - pId: 4, - id: 403, - text: "tree" -}, { - pId: 403, - text: "bi.single_level_tree", - value: "demo.single_level_tree" -}, { - pId: 403, - text: "bi.select_level_tree", - value: "demo.select_level_tree" -}, { - pId: 403, - text: "bi.multilayer_single_level_tree", - value: "demo.multilayer_single_level_tree" -}, { - pId: 403, - text: "bi.multilayer_select_level_tree", - value: "demo.multilayer_select_level_tree" -}, { - pId: 4, - id: 405, - text: "下拉列表" -}, { - pId: 405, - text: "bi.down_list_combo", - value: "demo.down_list" -}, { - pId: 4, - id: 421, - text: "单选下拉框" -}, { - pId: 421, - text: "bi.single_select_combo", - value: "demo.single_select_combo" -}, { - pId: 4, - id: 406, - text: "复选下拉框" -}, { - pId: 406, - text: "bi.multi_select_combo", - value: "demo.multi_select_combo" -}, { - pId: 406, - text: "bi.multi_select_list", - value: "demo.multi_select_list" -}, { - pId: 4, - id: 407, - text: "简单下拉树" -}, { - pId: 407, - text: "bi.single_tree_combo", - value: "demo.single_tree_combo" -}, { - pId: 4, - id: 408, - text: "多层级下拉树" -}, { - pId: 408, - text: "bi.multilayer_single_tree_combo", - value: "demo.multilayer_single_tree_combo" -}, { - pId: 4, - id: 409, - text: "可选下拉树" -}, { - pId: 409, - text: "bi.select_tree_combo", - value: "demo.select_tree_combo" -}, { - pId: 4, - id: 410, - text: "多层级可选下拉树" -}, { - pId: 410, - text: "bi.multilayer_select_tree_combo", - value: "demo.multilayer_select_tree_combo" -}, { - pId: 4, - id: 411, - text: "复选下拉树" -}, { - pId: 411, - text: "bi.multi_tree_combo", - value: "demo.multi_tree_combo" -}, { - pId: 411, - text: "bi.multi_select_tree", - value: "demo.multi_select_tree" -}, { - pId: 4, - id: 412, - text: "日期相关控件" -}, { - pId: 412, - text: "bi.year_combo", - value: "demo.year" -}, { - pId: 412, - text: "bi.year_month_combo", - value: "demo.year_month_combo" -}, { - pId: 412, - text: "bi.year_quarter_combo", - value: "demo.year_quarter_combo" -}, { - pId: 412, - text: "bi.date_pane", - value: "demo.date_pane" -}, { - pId: 412, - text: "bi.multidate_combo", - value: "demo.multidate_combo" -}, { - pId: 412, - text: "bi.date_time", - value: "demo.date_time" -}, { - pId: 412, - text: "bi.time_combo", - value: "demo.time_combo" -}, { - pId: 412, - text: "bi.time_interval", - value: "demo.time_interval" -}, { - pId: 412, - text: "bi.year_month_interval", - value: "demo.year_month_interval" -}, { - pId: 412, - text: "bi.year_quarter_interval", - value: "demo.year_quarter_interval" -}, { - pId: 412, - text: "bi.year_interval", - value: "demo.year_interval" -}, { - pId: 4, - id: 413, - text: "数值区间控件" -}, { - pId: 413, - text: "bi.number_interval", - value: "demo.number_interval" -}, { - id: 420, - text: "数值滑块sliders", - value: "demo.slider" -}, { - pId: 4, - id: 414, - text: "折叠面板" -}, { - pId: 414, - text: "bi.collapse", - value: "demo.collapse" -}]; diff --git a/demo/js/core/abstract/combination/demo.combo.js b/demo/js/core/abstract/combination/demo.combo.js deleted file mode 100644 index 76027d078..000000000 --- a/demo/js/core/abstract/combination/demo.combo.js +++ /dev/null @@ -1,450 +0,0 @@ -import { shortcut, Widget, createWidget, createItems, deepClone, map, delay, random, makeArray } from "@/core"; -import { Msg } from "@/base"; - -@shortcut() -export class Func extends Widget { - static xtype = "demo.combo"; - - props = { baseCls: "demo-func" }; - years = [ - { text: "2010年", value: 2010, iconCls: "close-ha-font" }, - { text: "2011年", value: 2011 }, - { text: "2012年", value: 2012, iconCls: "close-ha-font" }, - { text: "2013年", value: 2013 }, - { text: "2014年", value: 2014, iconCls: "close-ha-font" }, - { text: "2015年", value: 2015, iconCls: "close-ha-font" }, - { text: "2016年", value: 2016, iconCls: "close-ha-font" }, - { text: "2017年", value: 2017, iconCls: "close-ha-font" } - ]; - child = [ - { - type: "bi.combo_group", - el: { - type: "bi.icon_text_icon_item", - text: "2010年", - value: 2010, - height: 25, - iconCls1: "close-ha-font", - iconCls2: "close-ha-font", - }, - items: [ - { type: "bi.single_select_item", height: 25, text: "一月", value: 11 }, - { - type: "bi.icon_text_icon_item", - height: 25, - text: "二月", - value: 12, - iconCls1: "close-ha-font", - iconCls2: "close-ha-font", - children: [{ type: "bi.single_select_item", text: "一号", value: 101, height: 25 }], - } - ], - }, - { text: "2011年", value: 2011 }, - { text: "2012年", value: 2012, iconCls: "close-ha-font" }, - { text: "2013年", value: 2013 }, - { text: "2014年", value: 2014, iconCls: "close-ha-font" }, - { text: "2015年", value: 2015, iconCls: "close-ha-font" } - ]; - months = [ - [{ el: { text: "一月", value: 1 } }, { el: { text: "二月", value: 2 } }], - [{ el: { text: "三月", value: 3 } }, { el: { text: "四月", value: 4 } }], - [{ el: { text: "五月", value: 5 } }, { el: { text: "六月", value: 6 } }], - [{ el: { text: "七月", value: 7 } }, { el: { text: "八月", value: 8 } }], - [{ el: { text: "九月", value: 9 } }, { el: { text: "十月", value: 10 } }], - [{ el: { text: "十一月", value: 11 } }, { el: { text: "十二月", value: 12 } }] - ]; - dynamic = [ - { text: "2010年", value: 1 }, - { text: "20112222年", value: 2 }, - { text: "201233333年", value: 3 }, - { text: "2013年", value: 4 }, - { text: "2012324年", value: 5 }, - { text: "2015年", value: 6 }, - { text: "2016年", value: 7 }, - { text: "201744444444444444444444444444444444444年", value: 8 } - ]; - week = [ - { text: "周一", value: 100, iconClsLeft: "close-ha-font", iconClsRight: "close-font" }, - { text: "周二", value: 101, iconClsLeft: "close-ha-font" }, - { text: "周三", value: 102 }, - { text: "周四", value: 103, iconClsRight: "close-ha-font" }, - { text: "周五", value: 104, iconClsLeft: "close-ha-font", iconClsRight: "close-font" }, - { text: "周六", value: 105, iconClsLeft: "close-font", iconClsRight: "close-ha-font" }, - { text: "周日", value: 106, iconClsLeft: "close-font" } - ]; - - _createTop() { - const self = this; - - const yearCombo = createWidget({ - type: "bi.combo", - el: { - type: "bi.button", - text: "简单下拉框", - height: 30, - }, - popup: { - el: { - type: "bi.button_group", - items: createItems(deepClone(this.years), { - type: "bi.single_select_radio_item", - height: 25, - handler(v) {}, - }), - layouts: [ - { - type: "bi.vertical", - } - ], - }, - }, - width: 200, - }); - - var multiCombo = createWidget({ - type: "bi.combo", - el: { - type: "bi.button", - text: "多选下拉框", - height: 30, - }, - popup: { - el: { - items: createItems(deepClone(this.years), { - type: "bi.multi_select_item", - height: 25, - handler(v) {}, - }), - chooseType: 1, - layouts: [ - { - type: "bi.vertical", - } - ], - }, - tool: { - type: "bi.label", - text: "这是一个下拉框", - height: 35, - }, - tabs: [ - { - type: "bi.multi_select_bar", - height: 25, - text: "全选", - onCheck(v) { - if (v) { - multiCombo.setValue(map(deepClone(self.years), "value")); - } else { - multiCombo.setValue([]); - } - }, - isAllCheckedBySelectedValue(selectedValue) { - return selectedValue.length == self.years.length; - // return true; - }, - } - ], - buttons: [ - { - type: "bi.text_button", - text: "清空", - handler() { - multiCombo.setValue([]); - }, - }, - { - type: "bi.text_button", - text: "确定", - handler() { - Msg.alert("", multiCombo.getValue()); - }, - } - ], - }, - width: 200, - }); - - const dynamicPopupCombo = createWidget({ - type: "bi.combo", - isNeedAdjustWidth: false, - offsetStyle: "center", - el: { - type: "bi.button", - text: "动态调整宽度", - height: 30, - }, - popup: { - el: { - items: createItems(deepClone(this.dynamic), { - type: "bi.single_select_item", - height: 25, - }), - layouts: [ - { - type: "bi.vertical", - } - ], - }, - }, - width: 200, - }); - - var dynamicCombo = createWidget({ - type: "bi.combo", - el: { - type: "bi.button", - text: "搜索", - height: 30, - }, - popup: { - el: { - type: "bi.loader", - logic: { - dynamic: true, - scrolly: true, - }, - el: { - behaviors: { - redmark() { - return true; - }, - }, - layouts: [ - { - type: "bi.vertical", - } - ], - }, - itemsCreator(options, popuplate) { - const times = options.times; - delay(() => { - if (times == 3) { - popuplate([ - { - type: "bi.single_select_item", - text: "这是最后一个", - value: "这是最后一个", - py: "zszhyg", - height: 25, - } - ]); - - return; - } - - const map = map(makeArray(3, null), (i, v) => { - const val = `${i}_${random(1, 100)}`; - - return { - type: "bi.single_select_item", - text: val, - value: val, - height: 25, - }; - }); - popuplate(map); - }, 1000); - }, - hasNext(options) { - return options.times < 3; - }, - }, - buttons: [ - { - type: "bi.text_button", - text: "清空", - handler() { - dynamicCombo.setValue([]); - }, - }, - { - type: "bi.text_button", - text: "确定", - handler() { - Msg.alert("", dynamicCombo.getValue()); - }, - } - ], - }, - width: 200, - }); - - return createWidget({ - type: "bi.left", - items: [yearCombo, multiCombo, dynamicPopupCombo, dynamicCombo], - hgap: 20, - vgap: 20, - }); - } - - _createBottom() { - const combo = createWidget({ - type: "bi.combo", - el: { - type: "bi.text_button", - cls: "button-combo", - height: 30, - }, - popup: { - el: { - type: "bi.button_group", - items: createItems(deepClone(this.years), { - type: "bi.single_select_item", - iconWidth: 25, - height: 25, - handler(v) {}, - }), - chooseType: 1, - layouts: [ - { - type: "bi.vertical", - } - ], - }, - }, - width: 200, - }); - combo.setValue(deepClone(this.years)[0].value); - - const childCombo = createWidget({ - type: "bi.combo", - el: { - type: "bi.text_button", - cls: "button-combo", - height: 30, - }, - popup: { - el: { - type: "bi.button_tree", - items: createItems(deepClone(this.child), { - type: "bi.single_select_item", - height: 25, - handler(v) {}, - }), - layouts: [ - { - type: "bi.vertical", - } - ], - }, - }, - width: 200, - }); - childCombo.setValue(deepClone(this.child)[0].items[0].value); - - const monthCombo = createWidget({ - type: "bi.combo", - el: { - type: "bi.button", - text: "多层样式下拉框", - height: 30, - }, - popup: { - el: { - items: createItems(deepClone(this.months), { - type: "bi.single_select_item", - cls: "button-combo", - handler(v) {}, - }), - layouts: [ - { - type: "bi.adaptive", - items: [ - { - el: { - type: "bi.table", - columns: 2, - rows: 6, - columnSize: [0.5, "fill"], - rowSize: 30, - }, - left: 4, - right: 4, - top: 2, - bottom: 2, - } - ], - }, - { - type: "bi.absolute", - el: { left: 4, top: 2, right: 4, bottom: 2 }, - } - ], - }, - }, - width: 200, - }); - - const yearCombo = createWidget({ - type: "bi.combo", - el: { - type: "bi.button", - text: "自定义控件", - height: 30, - }, - popup: { - el: { - type: "bi.navigation", - direction: "bottom", - logic: { - dynamic: true, - }, - tab: { - height: 30, - items: [ - { - once: false, - text: "后退", - value: -1, - cls: "mvc-button layout-bg3", - }, - { - once: false, - text: "前进", - value: 1, - cls: "mvc-button layout-bg4", - } - ], - }, - cardCreator(v) { - return createWidget({ - type: "bi.text_button", - whiteSpace: "normal", - text: new Date().getFullYear() + v, - }); - }, - }, - }, - width: 200, - }); - - return createWidget({ - type: "bi.left", - items: [combo, childCombo, monthCombo, yearCombo], - hgap: 20, - vgap: 20, - }); - } - - render() { - return { - type: "bi.grid", - columns: 1, - rows: 2, - items: [ - { - column: 0, - row: 0, - el: this._createTop(), - }, - { - column: 0, - row: 1, - el: this._createBottom(), - } - ], - }; - } -} diff --git a/demo/js/core/abstract/combination/demo.combo2.js b/demo/js/core/abstract/combination/demo.combo2.js deleted file mode 100644 index a587a1a03..000000000 --- a/demo/js/core/abstract/combination/demo.combo2.js +++ /dev/null @@ -1,167 +0,0 @@ -import { shortcut, Widget, createWidget } from "@/core"; - -@shortcut() -export class Func extends Widget { - static xtype = "demo.combo2"; - - props = { baseCls: "demo-func" }; - - _createEl() { - return { - type: "bi.button", - height: 25, - text: "点击", - }; - } - - oneCombo() { - return createWidget({ - type: "bi.combo", - adjustLength: 5, - el: this._createEl(), - popup: { - el: { - type: "bi.layout", - height: 500, - }, - maxHeight: 400, - }, - }); - } - - twoCombo() { - return createWidget({ - type: "bi.combo", - adjustXOffset: 25, - adjustYOffset: 5, - direction: "bottom,left", - el: this._createEl(), - popup: { - el: { - type: "bi.layout", - height: 1200, - }, - }, - }); - } - - threeCombo() { - return createWidget({ - type: "bi.combo", - adjustYOffset: 5, - el: this._createEl(), - isNeedAdjustHeight: false, - popup: { - el: { - type: "bi.layout", - height: 1200, - }, - }, - }); - } - - fourCombo() { - return createWidget({ - type: "bi.combo", - adjustXOffset: 25, - adjustYOffset: 5, - direction: "left", - el: this._createEl(), - isNeedAdjustHeight: true, - popup: { - el: { - type: "bi.layout", - height: 1200, - }, - }, - }); - } - - fiveCombo() { - return createWidget({ - type: "bi.combo", - adjustXOffset: 25, - adjustYOffset: 5, - direction: "left,top", - el: this._createEl(), - isNeedAdjustHeight: true, - popup: { - el: { - type: "bi.layout", - height: 1200, - }, - maxHeight: 2000, - }, - }); - } - - sixCombo() { - return createWidget({ - type: "bi.combo", - adjustXOffset: 25, - adjustYOffset: 5, - direction: "top,left", - el: this._createEl(), - isNeedAdjustHeight: true, - popup: { - el: { - type: "bi.layout", - height: 1200, - }, - }, - }); - } - - sevenCombo() { - return createWidget({ - type: "bi.combo", - adjustXOffset: 25, - adjustYOffset: 5, - direction: "bottom", - isNeedAdjustWidth: false, - // isNeedAdjustHeight: false, - offsetStyle: "center", - el: this._createEl(), - popup: { - el: { - type: "bi.layout", - width: 200, - height: 1200, - }, - }, - }); - } - - eightCombo() { - return createWidget({ - type: "bi.combo", - adjustXOffset: 25, - adjustYOffset: 5, - direction: "right", - isNeedAdjustWidth: false, - // isNeedAdjustHeight: false, - offsetStyle: "middle", - el: this._createEl(), - popup: { - el: { - type: "bi.layout", - width: 200, - height: 200, - }, - }, - }); - } - - render() { - return { - type: "bi.grid", - hgap: 10, - vgap: 5, - items: [ - [this.oneCombo(), this.twoCombo(), this.threeCombo()], - [this.fourCombo(), this.fiveCombo(), this.sixCombo()], - [this.sevenCombo(), this.eightCombo()] - ], - }; - } -} diff --git a/demo/js/core/abstract/combination/demo.combo3.js b/demo/js/core/abstract/combination/demo.combo3.js deleted file mode 100644 index 94f7b5005..000000000 --- a/demo/js/core/abstract/combination/demo.combo3.js +++ /dev/null @@ -1,77 +0,0 @@ -import { shortcut, Widget, createWidget } from "@/core"; - -@shortcut() -export class Func extends Widget { - static xtype = "demo.combo3"; - - props = { baseCls: "demo-func" }; - - _createEl() { - return { - type: "bi.label", - cls: "bi-border", - height: "100%", - text: "点击", - }; - } - - oneCombo() { - return createWidget({ - type: "bi.combo", - direction: "right,innerRight", - isNeedAdjustWidth: false, - isNeedAdjustHeight: false, - el: this._createEl(), - popup: { - el: { - type: "bi.layout", - width: 200, - height: 200, - }, - }, - }); - } - - twoCombo() { - return createWidget({ - type: "bi.combo", - direction: "right,innerRight", - isNeedAdjustWidth: false, - isNeedAdjustHeight: false, - el: this._createEl(), - popup: { - el: { - type: "bi.layout", - width: 1000, - height: 200, - }, - }, - }); - } - - threeCombo() { - return createWidget({ - type: "bi.combo", - direction: "right,innerRight", - isNeedAdjustWidth: false, - isNeedAdjustHeight: false, - el: this._createEl(), - popup: { - el: { - type: "bi.layout", - width: 400, - height: 200, - }, - }, - }); - } - - render() { - return { - type: "bi.grid", - hgap: 10, - vgap: 5, - items: [[this.oneCombo()], [this.twoCombo()], [this.threeCombo()]], - }; - } -} diff --git a/demo/js/core/abstract/combination/demo.combo_group.js b/demo/js/core/abstract/combination/demo.combo_group.js deleted file mode 100644 index 8f643e2b8..000000000 --- a/demo/js/core/abstract/combination/demo.combo_group.js +++ /dev/null @@ -1,81 +0,0 @@ -import { shortcut, Widget, createWidget, createItems, deepClone } from "@/core"; - -@shortcut() -export class Func extends Widget { - static xtype = "demo.combo_group"; - - props = { baseCls: "demo-func" }; - child = [ - { - type: "bi.combo_group", - el: { type: "bi.icon_text_icon_item", text: "2010年", value: 2010, height: 25, iconCls: "close-ha-font" }, - items: [ - { type: "bi.single_select_item", height: 25, text: "一月", value: 11 }, - { - type: "bi.icon_text_icon_item", - height: 25, - text: "二月", - value: 12, - iconCls1: "close-ha-font", - iconCls2: "close-ha-font", - children: [{ type: "bi.single_select_item", text: "一号", value: 101, height: 25 }], - } - ], - }, - { text: "2011年", value: 2011 }, - { text: "2012年", value: 2012, iconCls: "close-ha-font" }, - { text: "2013年", value: 2013 }, - { text: "2014年", value: 2014, iconCls: "close-ha-font" }, - { text: "2015年", value: 2015, iconCls: "close-ha-font" } - ]; - - _createBottom() { - const childCombo = createWidget({ - type: "bi.combo", - el: { - type: "bi.text_button", - cls: "button-combo", - height: 30, - }, - popup: { - el: { - type: "bi.button_tree", - items: createItems(deepClone(this.child), { - type: "bi.single_select_item", - height: 25, - handler(v) {}, - }), - layouts: [ - { - type: "bi.vertical", - } - ], - }, - }, - width: 200, - }); - childCombo.setValue(deepClone(this.child)[0].items[0].value); - - return createWidget({ - type: "bi.left", - items: [childCombo], - hgap: 20, - vgap: 20, - }); - } - - render() { - return { - type: "bi.grid", - columns: 1, - rows: 1, - items: [ - { - column: 0, - row: 0, - el: this._createBottom(), - } - ], - }; - } -} diff --git a/demo/js/core/abstract/combination/demo.expander.js b/demo/js/core/abstract/combination/demo.expander.js deleted file mode 100644 index 36576013f..000000000 --- a/demo/js/core/abstract/combination/demo.expander.js +++ /dev/null @@ -1,54 +0,0 @@ -import { shortcut, Widget, createItems } from "@/core"; - -@shortcut() -export class Func extends Widget { - static xtype = "demo.expander"; - - props = { baseCls: "demo-func" }; - - render() { - return { - type: "bi.vertical", - hgap: 30, - vgap: 20, - items: [ - { - type: "bi.expander", - el: { - type: "bi.icon_text_node", - cls: "pull-right-ha-font mvc-border", - height: 25, - text: "Expander", - }, - popup: { - cls: "mvc-border", - items: createItems( - [ - { - text: "项目1", - value: 1, - }, - { - text: "项目2", - value: 2, - }, - { - text: "项目3", - value: 3, - }, - { - text: "项目4", - value: 4, - } - ], - { - type: "bi.single_select_item", - height: 25, - } - ), - }, - } - ], - }; - } -} diff --git a/demo/js/core/abstract/combination/demo.loader.js b/demo/js/core/abstract/combination/demo.loader.js deleted file mode 100644 index b7689101e..000000000 --- a/demo/js/core/abstract/combination/demo.loader.js +++ /dev/null @@ -1,33 +0,0 @@ -import { shortcut, Widget, deepClone, map, extend } from "@/core"; - -@shortcut() -export class Func extends Widget { - static xtype = "demo.loader"; - - props = { baseCls: "demo-func" }; - - render() { - const self = this; - this.all = 0; - const items = deepClone(Demo.CONSTANTS.ITEMS); - - return { - type: "bi.loader", - itemsCreator(options, populate) { - setTimeout(() => { - populate( - map(items.slice((options.times - 1) * 10, options.times * 10), (i, v) => - extend(v, { - type: "bi.single_select_item", - height: 25, - }) - ) - ); - }, 1000); - }, - hasNext(options) { - return options.times * 10 < items.length; - }, - }; - } -} diff --git a/demo/js/core/abstract/combination/demo.navigation.js b/demo/js/core/abstract/combination/demo.navigation.js deleted file mode 100644 index 5fa90ef31..000000000 --- a/demo/js/core/abstract/combination/demo.navigation.js +++ /dev/null @@ -1,41 +0,0 @@ -import { shortcut, Widget, createWidget, random, bind } from "@/core"; - -@shortcut() -export class Func extends Widget { - static xtype = "demo.navigation"; - - props = { baseCls: "demo-func" }; - - _createNav(v) { - return createWidget({ - type: "bi.label", - cls: `layout-bg${random(1, 8)}`, - text: `第${v}页`, - }); - } - - render() { - return { - type: "bi.navigation", - showIndex: 0, - tab: { - height: 30, - items: [ - { - once: false, - text: "后退", - value: -1, - cls: "mvc-button layout-bg3", - }, - { - once: false, - text: "前进", - value: 1, - cls: "mvc-button layout-bg4", - } - ], - }, - cardCreator: bind(this._createNav, this), - }; - } -} diff --git a/demo/js/core/abstract/combination/demo.sercher.js b/demo/js/core/abstract/combination/demo.sercher.js deleted file mode 100644 index c556c3985..000000000 --- a/demo/js/core/abstract/combination/demo.sercher.js +++ /dev/null @@ -1,125 +0,0 @@ -import { shortcut, Widget, createItems, createWidget } from "@/core"; - -@shortcut() -export class Func extends Widget { - static xtype = "demo.searcher"; - - props = { baseCls: "demo-func" }; - - _createItems(items) { - return createItems(items, { - type: "bi.multi_select_item", - height: 25, - handler(v) {}, - }); - } - - render() { - const self = this; - const items = [ - { - text: "2010年", - value: 2010, - py: "2010n", - title: "1111111111111111111111111111111111", - }, - { - text: "2011年", - value: 2011, - py: "2011n", - title: "1111111111111111111111111111111111", - }, - { - text: "2012年", - value: 2012, - py: "2012n", - title: "1111111111111111111111111111111111", - }, - { - text: "2013年", - value: 2013, - py: "2013n", - title: "1111111111111111111111111111111111", - }, - { - text: "2014年", - value: 2014, - py: "2014n", - title: "1111111111111111111111111111111111", - }, - { - text: "2015年", - value: 2015, - py: "2015n", - title: "1111111111111111111111111111111111", - }, - { - text: "2016年", - value: 2016, - py: "2016n", - title: "1111111111111111111111111111111111", - }, - { - text: "2017年", - value: 2017, - py: "2017n", - title: "1111111111111111111111111111111111", - } - ]; - - const adapter = createWidget({ - type: "bi.button_group", - cls: "layout-bg1", - items: this._createItems(items), - chooseType: 1, - behaviors: {}, - layouts: [ - { - type: "bi.vertical", - } - ], - }); - createWidget({ - type: "bi.absolute", - element: this, - items: [ - { - el: adapter, - top: 50, - left: 50, - width: 200, - height: 100, - } - ], - }); - createWidget({ - type: "bi.absolute", - element: this, - items: [ - { - el: { - type: "bi.absolute", - width: 200, - height: 30, - items: [ - { - el: { - type: "bi.searcher", - adapter, - width: 200, - height: 30, - }, - left: 0, - right: 0, - top: 0, - bottom: 0, - } - ], - }, - top: 100, - left: 300, - } - ], - }); - } -} diff --git a/demo/js/core/abstract/combination/demo.switcher.js b/demo/js/core/abstract/combination/demo.switcher.js deleted file mode 100644 index ea4b2890b..000000000 --- a/demo/js/core/abstract/combination/demo.switcher.js +++ /dev/null @@ -1,73 +0,0 @@ -import { shortcut, Widget, createWidget, createItems } from "@/core"; - -@shortcut() -export class Func extends Widget { - static xtype = "demo.switcher"; - - props = { baseCls: "demo-func" }; - - render() { - const adapter = createWidget({ - type: "bi.label", - cls: "layout-bg2", - text: "将在该处弹出switcher", - }); - createWidget({ - type: "bi.absolute", - element: this, - items: [ - { - el: adapter, - top: 50, - left: 20, - width: 200, - height: 300, - } - ], - }); - createWidget({ - type: "bi.vertical", - element: this, - hgap: 30, - vgap: 20, - items: [ - { - type: "bi.switcher", - el: { - type: "bi.button", - height: 25, - text: "Switcher", - }, - popup: { - cls: "mvc-border layout-bg5", - items: createItems( - [ - { - text: "项目1", - value: 1, - }, - { - text: "项目2", - value: 2, - }, - { - text: "项目3", - value: 3, - }, - { - text: "项目4", - value: 4, - } - ], - { - type: "bi.single_select_item", - height: 25, - } - ), - }, - adapter, - } - ], - }); - } -} diff --git a/demo/js/core/abstract/combination/demo.tab.js b/demo/js/core/abstract/combination/demo.tab.js deleted file mode 100644 index 76365ab33..000000000 --- a/demo/js/core/abstract/combination/demo.tab.js +++ /dev/null @@ -1,80 +0,0 @@ -import { shortcut, Widget, createWidget, bind } from "@/core"; - -@shortcut() -export class Func extends Widget { - static xtype = "demo.tab"; - - props = { baseCls: "demo-func" }; - - _createTabs(v) { - switch (v) { - case 1: - return createWidget({ - type: "bi.label", - cls: "layout-bg1", - text: "面板1", - }); - case 2: - return createWidget({ - type: "bi.label", - cls: "layout-bg2", - text: "面板2", - }); - } - } - - render() { - this.tab = createWidget({ - type: "bi.button_group", - height: 30, - items: [ - { - text: "Tab1", - value: 1, - width: 50, - cls: "mvc-button layout-bg3", - }, - { - text: "Tab2", - value: 2, - width: 50, - cls: "mvc-button layout-bg4", - } - ], - layouts: [ - { - type: "bi.center_adapt", - items: [ - { - el: { - type: "bi.horizontal", - width: 100, - }, - } - ], - } - ], - }); - - const tab = createWidget({ - direction: "custom", - type: "bi.tab", - element: this, - tab: this.tab, - cardCreator: bind(this._createTabs, this), - }); - createWidget({ - type: "bi.absolute", - element: this, - items: [ - { - el: this.tab, - left: 200, - top: 200, - } - ], - }); - - tab.setSelect(2); - } -} diff --git a/demo/js/core/abstract/demo.button_group.js b/demo/js/core/abstract/demo.button_group.js deleted file mode 100644 index b59b1eafa..000000000 --- a/demo/js/core/abstract/demo.button_group.js +++ /dev/null @@ -1,80 +0,0 @@ -import { shortcut, Widget } from "@/core"; -import { ButtonGroup } from "@/base"; - -@shortcut() -export class Func extends Widget { - static xtype = "demo.button_group"; - - props = { baseCls: "demo-func" }; - - render() { - let ref; - - return { - type: "bi.vertical", - items: [ - { - type: "bi.button_group", - ref(_ref) { - ref = _ref; - }, - chooseType: ButtonGroup.CHOOSE_TYPE_NONE, - layouts: [ - { - type: "bi.vertical", - items: [ - { - type: "bi.vtape", - height: 200, - } - ], - } - ], - items: [ - { - el: { - type: "bi.label", - text: "button_group是一类具有相同属性或相似属性的抽象, 本案例实现的是布局的嵌套(vertical布局下内嵌center_adapt布局)", - }, - height: 150, - }, - { - el: { - type: "bi.button", - text: "1", - }, - } - ], - }, - { - type: "bi.button", - text: "populate", - handler() { - ref.populate([ - { - el: { - type: "bi.label", - text: "1", - }, - height: 50, - }, - { - el: { - type: "bi.button", - text: "2", - }, - height: 50, - }, - { - el: { - type: "bi.label", - text: "3", - }, - } - ]); - }, - } - ], - }; - } -} diff --git a/demo/js/core/abstract/demo.button_tree.js b/demo/js/core/abstract/demo.button_tree.js deleted file mode 100644 index f6d2b9b96..000000000 --- a/demo/js/core/abstract/demo.button_tree.js +++ /dev/null @@ -1,36 +0,0 @@ -import { shortcut, Widget } from "@/core"; -import { ButtonGroup } from "@/base"; - -@shortcut() -export class Func extends Widget { - static xtype = "demo.button_tree"; - - props = { baseCls: "demo-func" }; - - render() { - return { - type: "bi.button_tree", - chooseType: ButtonGroup.CHOOSE_TYPE_MULTI, - layouts: [ - { - type: "bi.vertical", - }, - { - type: "bi.center_adapt", - } - ], - items: [ - { - type: "bi.label", - text: "0", - value: 0, - }, - { - type: "bi.button", - text: "1", - value: 1, - } - ], - }; - } -} diff --git a/demo/js/core/abstract/demo.collection_view.js b/demo/js/core/abstract/demo.collection_view.js deleted file mode 100644 index d3dacb08c..000000000 --- a/demo/js/core/abstract/demo.collection_view.js +++ /dev/null @@ -1,46 +0,0 @@ -import { shortcut, Widget, createWidget } from "@/core"; - -@shortcut() -export class Func extends Widget { - static xtype = "demo.collection_view"; - - props = { baseCls: "demo-func" }; - - render() { - const items = []; - const cellCount = 100; - for (let i = 0; i < cellCount; i++) { - items[i] = { - type: "bi.label", - text: i, - }; - } - const grid = createWidget({ - type: "bi.collection_view", - width: 400, - height: 300, - items, - cellSizeAndPositionGetter(index) { - return { - x: (index % 10) * 50, - y: Math.floor(index / 10) * 50, - width: 50, - height: 50, - }; - }, - }); - createWidget({ - type: "bi.absolute", - element: this, - items: [ - { - el: grid, - left: 10, - right: 10, - top: 10, - bottom: 10, - } - ], - }); - } -} diff --git a/demo/js/core/abstract/demo.custom_tree.js b/demo/js/core/abstract/demo.custom_tree.js deleted file mode 100644 index 64cb37330..000000000 --- a/demo/js/core/abstract/demo.custom_tree.js +++ /dev/null @@ -1,282 +0,0 @@ -import { shortcut, Widget, createWidget, deepClone } from "@/core"; -import { Msg } from "@/base"; - -@shortcut() -export class Func extends Widget { - static xtype = "demo.custom_tree"; - - props = { baseCls: "demo-func" }; - - _createDefaultTree() { - const TREEITEMS = [ - { id: -1, pId: -2, value: "根目录", open: true, type: "bi.plus_group_node", height: 25 }, - { id: 1, pId: -1, value: "第一级目录1", type: "bi.plus_group_node", height: 25 }, - { id: 11, pId: 1, value: "第二级文件1", type: "bi.single_select_item", height: 25 }, - { id: 12, pId: 1, value: "第二级目录2", type: "bi.plus_group_node", height: 25 }, - { id: 121, pId: 12, value: "第三级目录1", type: "bi.plus_group_node", height: 25 }, - { id: 122, pId: 12, value: "第三级文件1", type: "bi.single_select_item", height: 25 }, - { id: 1211, pId: 121, value: "第四级目录1", type: "bi.plus_group_node", height: 25 }, - { id: 12111, pId: 1211, value: "第五级文件1", type: "bi.single_select_item", height: 25 }, - { id: 2, pId: -1, value: "第一级目录2", type: "bi.plus_group_node", height: 25 }, - { id: 21, pId: 2, value: "第二级目录3", type: "bi.plus_group_node", height: 25 }, - { id: 22, pId: 2, value: "第二级文件2", type: "bi.single_select_item", height: 25 }, - { id: 211, pId: 21, value: "第三级目录2", type: "bi.plus_group_node", height: 25 }, - { id: 212, pId: 21, value: "第三级文件2", type: "bi.single_select_item", height: 25 }, - { id: 2111, pId: 211, value: "第四级文件1", type: "bi.single_select_item", height: 25 } - ]; - this.tree = createWidget({ - type: "bi.custom_tree", - el: { - type: "bi.button_tree", - chooseType: 0, - layouts: [ - { - type: "bi.vertical", - hgap: 30, - } - ], - }, - items: deepClone(TREEITEMS), - }); - - return this.tree; - } - - _createAsyncTree() { - this.asyncTree = createWidget({ - type: "bi.custom_tree", - itemsCreator(op, callback) { - if (!op.node) { - // 根节点 - callback([ - { - id: 1, - pId: 0, - type: "bi.plus_group_node", - text: "test1", - value: 1, - height: 25, - isParent: true, - }, - { - id: 2, - pId: 0, - type: "bi.plus_group_node", - text: "test2", - value: 1, - isParent: true, - open: true, - height: 25, - } - ]); - } else { - if (op.node.id == 1) { - callback([ - { - id: 11, - pId: 1, - type: "bi.plus_group_node", - text: "test11", - value: 11, - height: 25, - isParent: true, - }, - { - id: 12, - pId: 1, - type: "bi.single_select_item", - text: "test12", - value: 12, - height: 35, - }, - { - id: 13, - pId: 1, - type: "bi.single_select_item", - text: "test13", - value: 13, - height: 35, - }, - { - id: 14, - pId: 1, - type: "bi.single_select_item", - text: "test14", - value: 14, - height: 35, - }, - { - id: 15, - pId: 1, - type: "bi.single_select_item", - text: "test15", - value: 15, - height: 35, - }, - { - id: 16, - pId: 1, - type: "bi.single_select_item", - text: "test16", - value: 16, - height: 35, - }, - { id: 17, pId: 1, type: "bi.single_select_item", text: "test17", value: 17, height: 35 } - ]); - } else if (op.node.id == 2) { - callback([ - { - id: 21, - pId: 2, - type: "bi.single_select_item", - text: "test21", - value: 21, - height: 35, - }, - { - id: 22, - pId: 2, - type: "bi.single_select_item", - text: "test22", - value: 22, - height: 35, - } - ]); - } else if (op.node.id == 11) { - callback([ - { - id: 111, - pId: 11, - type: "bi.single_select_item", - text: "test111", - value: 111, - height: 35, - } - ]); - } - } - }, - el: { - type: "bi.loader", - next: false, - el: { - type: "bi.button_tree", - chooseType: 0, - layouts: [ - { - type: "bi.vertical", - hgap: 30, - vgap: 0, - } - ], - }, - }, - }); - - return this.asyncTree; - } - - render() { - const self = this; - createWidget({ - type: "bi.grid", - columns: 2, - rows: 1, - element: this, - items: [ - { - column: 0, - row: 0, - el: { - type: "bi.vtape", - items: [ - { - el: this._createDefaultTree(), - }, - { - el: { - type: "bi.center", - hgap: 10, - items: [ - { - type: "bi.text_button", - cls: "mvc-button layout-bg2", - text: "getValue", - height: 30, - handler() { - Msg.alert("", JSON.stringify(self.tree.getValue())); - }, - }, - { - type: "bi.text_button", - cls: "mvc-button layout-bg2", - text: "getNodeByValue(第一级目录1)", - height: 30, - handler() { - Msg.alert( - "", - `节点名称为: ${self.tree.getNodeByValue("第一级目录1").getValue()}` - ); - }, - } - ], - }, - height: 30, - } - ], - }, - }, - { - column: 1, - row: 0, - el: { - type: "bi.vtape", - items: [ - { - type: "bi.label", - text: "异步加载数据", - height: 30, - }, - { - el: this._createAsyncTree(), - }, - { - el: { - type: "bi.center", - hgap: 10, - items: [ - { - type: "bi.text_button", - cls: "mvc-button layout-bg2", - text: "getValue", - height: 30, - handler() { - Msg.alert("", JSON.stringify(self.asyncTree.getValue())); - }, - }, - { - type: "bi.text_button", - cls: "mvc-button layout-bg2", - text: "getNodeById(11)", - height: 30, - handler() { - Msg.alert( - "", - `节点名称为: ${ - self.asyncTree.getNodeById(11) && - self.asyncTree.getNodeById(11).getText() - }` - ); - }, - } - ], - }, - height: 30, - } - ], - }, - } - ], - }); - } -} diff --git a/demo/js/core/abstract/demo.grid_view.js b/demo/js/core/abstract/demo.grid_view.js deleted file mode 100644 index 7aa6c28f8..000000000 --- a/demo/js/core/abstract/demo.grid_view.js +++ /dev/null @@ -1,62 +0,0 @@ -import { shortcut, Widget, createWidget } from "@/core"; - -@shortcut() -export class Func extends Widget { - static xtype = "demo.grid_view"; - - props = { baseCls: "demo-func" }; - - render() { - const items = []; - const rowCount = 10000, - columnCount = 100; - for (let i = 0; i < rowCount; i++) { - items[i] = []; - for (let j = 0; j < columnCount; j++) { - items[i][j] = { - type: "bi.label", - text: `${i}-${j}`, - }; - } - } - const grid = createWidget({ - type: "bi.grid_view", - width: 400, - height: 300, - estimatedRowSize: 30, - estimatedColumnSize: 100, - items, - scrollTop: 100, - rowHeightGetter() { - return 30; - }, - columnWidthGetter() { - return 100; - }, - }); - createWidget({ - type: "bi.absolute", - element: this, - items: [ - { - el: { - type: "bi.grid", - columns: 1, - rows: 1, - items: [ - { - column: 0, - row: 0, - el: grid, - } - ], - }, - left: 10, - right: 10, - top: 10, - bottom: 10, - } - ], - }); - } -} diff --git a/demo/js/core/abstract/demo.list_view.js b/demo/js/core/abstract/demo.list_view.js deleted file mode 100644 index 049fb6988..000000000 --- a/demo/js/core/abstract/demo.list_view.js +++ /dev/null @@ -1,25 +0,0 @@ -import { shortcut, Widget, map, extend } from "@/core"; - -@shortcut() -export class Func extends Widget { - static xtype = "demo.list_view"; - - props = { baseCls: "demo-func" }; - - render() { - return { - type: "bi.list_view", - el: { - type: "bi.left", - }, - items: map(Demo.CONSTANTS.ITEMS, (i, item) => - extend({}, item, { - type: "bi.label", - width: 200, - height: 200, - text: `${i + 1}.${item.text}`, - }) - ), - }; - } -} diff --git a/demo/js/core/abstract/demo.virtual_group.js b/demo/js/core/abstract/demo.virtual_group.js deleted file mode 100644 index 44d0fd6fb..000000000 --- a/demo/js/core/abstract/demo.virtual_group.js +++ /dev/null @@ -1,86 +0,0 @@ -import { shortcut, Widget, map, range, deepClone } from "@/core"; -import { ButtonGroup } from "@/base"; - -@shortcut() -export class Func extends Widget { - static xtype = "demo.virtual_group"; - - props = { baseCls: "demo-func" }; - - _createItems() { - const items = map(range(1000), i => { - return { - type: "demo.virtual_group_item", - value: i, - key: i + 1, - }; - }); - - return items; - } - - render() { - const self = this; - const buttonGroupItems = self._createItems(); - const virtualGroupItems = self._createItems(); - - return { - type: "bi.vertical", - vgap: 20, - items: [ - { - type: "bi.label", - cls: "layout-bg5", - height: 50, - text: "共1000个元素,演示button_group和virtual_group每次删除第一个元素,打开控制台看输出", - }, - { - type: "bi.button_group", - width: 500, - height: 300, - ref() { - self.buttonGroup = this; - }, - chooseType: ButtonGroup.CHOOSE_TYPE_MULTI, - layouts: [ - { - type: "bi.vertical", - } - ], - items: this._createItems(), - }, - { - type: "bi.button", - text: "演示button_group的刷新", - handler() { - buttonGroupItems.shift(); - self.buttonGroup.populate(deepClone(buttonGroupItems)); - }, - }, - { - type: "bi.virtual_group", - width: 500, - height: 300, - ref() { - self.virtualGroup = this; - }, - chooseType: ButtonGroup.CHOOSE_TYPE_MULTI, - layouts: [ - { - type: "bi.vertical", - } - ], - items: this._createItems(), - }, - { - type: "bi.button", - text: "演示virtual_group的刷新", - handler() { - virtualGroupItems.shift(); - self.virtualGroup.populate(deepClone(virtualGroupItems)); - }, - } - ], - }; - } -} diff --git a/demo/js/core/abstract/demo.virtual_group_item.js b/demo/js/core/abstract/demo.virtual_group_item.js deleted file mode 100644 index 8cefbd4fa..000000000 --- a/demo/js/core/abstract/demo.virtual_group_item.js +++ /dev/null @@ -1,43 +0,0 @@ -import { shortcut, Widget, UUID } from "@/core"; - -@shortcut() -export class Item extends Widget { - static xtype = "demo.virtual_group_item"; - - props = { baseCls: "demo-item", height: 30 }; - - render() { - const self = this, - o = this.options; - - return { - type: "bi.label", - ref () { - self.label = this; - }, - height: this.options.height, - text: `key:${o.key},随机数${UUID()}`, - }; - } - - shouldUpdate(nextProps) { - const o = this.options; - - return o.type !== nextProps.type || o.key !== nextProps.key || o.value !== nextProps.value; - } - - update(item) { - this.label.setText(item.value); - console.log("更新了一项"); - - return true; // 返回是不是更新成功 - } - - created() { - console.log("创建了一项"); - } - - destroyed() { - console.log("删除了一项"); - } -} diff --git a/demo/js/core/abstract/demo.virtual_list.js b/demo/js/core/abstract/demo.virtual_list.js deleted file mode 100644 index c358d7941..000000000 --- a/demo/js/core/abstract/demo.virtual_list.js +++ /dev/null @@ -1,21 +0,0 @@ -import { shortcut, Widget, map, extend } from "@/core"; - -@shortcut() -export class Func extends Widget { - static xtype = "demo.virtual_list"; - - props = { baseCls: "demo-func" }; - - render() { - return { - type: "bi.virtual_list", - items: map(Demo.CONSTANTS.ITEMS, (i, item) => - extend({}, item, { - type: "bi.label", - height: 30, - text: `${i + 1}.${item.text}` - }) - ) - }; - } -} diff --git a/demo/js/core/abstract/index.js b/demo/js/core/abstract/index.js deleted file mode 100644 index 6e3b38c8e..000000000 --- a/demo/js/core/abstract/index.js +++ /dev/null @@ -1,11 +0,0 @@ -export * from "./combination"; - -export * from "./demo.button_group"; -export * from "./demo.button_tree"; -export * from "./demo.collection_view"; -export * from "./demo.custom_tree"; -export * from "./demo.grid_view"; -export * from "./demo.list_view"; -export * from "./demo.virtual_group"; -export * from "./demo.virtual_group_item"; -export * from "./demo.virtual_list"; \ No newline at end of file diff --git a/demo/js/core/index.js b/demo/js/core/index.js deleted file mode 100644 index a927fd18b..000000000 --- a/demo/js/core/index.js +++ /dev/null @@ -1,3 +0,0 @@ -export * from "./abstract"; -export * from "./layout"; -export * from "./popup"; \ No newline at end of file diff --git a/demo/js/core/layout/demo.absolute.js b/demo/js/core/layout/demo.absolute.js deleted file mode 100644 index 7a0dd1ea9..000000000 --- a/demo/js/core/layout/demo.absolute.js +++ /dev/null @@ -1,27 +0,0 @@ -import { shortcut, Widget } from "@/core"; - -@shortcut() -export class AbsoluteLayout extends Widget { - static xtype = "demo.absolute"; - - props = { baseCls: "demo-absolute" }; - - render() { - return { - type: "bi.absolute", - items: [ - { - el: { - type: "bi.label", - text: "绝对布局", - cls: "layout-bg1", - width: 300, - height: 200, - }, - left: 100, - top: 100, - } - ], - }; - } -} diff --git a/demo/js/core/layout/demo.border.js b/demo/js/core/layout/demo.border.js deleted file mode 100644 index aa69a8851..000000000 --- a/demo/js/core/layout/demo.border.js +++ /dev/null @@ -1,102 +0,0 @@ -import { shortcut, Widget, createWidget } from "@/core"; - -@shortcut() -export class BorderLayout extends Widget { - static xtype = "demo.border"; - - props = { baseCls: "demo-border" }; - - _createNorth() { - return createWidget({ - type: "bi.label", - text: "North", - cls: "layout-bg1", - height: 30, - }); - } - - _createWest() { - return createWidget({ - type: "bi.center", - cls: "layout-bg2", - items: [ - { - type: "bi.label", - text: "West", - whiteSpace: "normal", - } - ], - }); - } - - _createCenter() { - return createWidget({ - type: "bi.center", - cls: "layout-bg3", - items: [ - { - type: "bi.label", - text: "Center", - whiteSpace: "normal", - } - ], - }); - } - - _createEast() { - return createWidget({ - type: "bi.center", - cls: "layout-bg5", - items: [ - { - type: "bi.label", - text: "East", - whiteSpace: "normal", - } - ], - }); - } - - _createSouth() { - return createWidget({ - type: "bi.label", - text: "South", - cls: "layout-bg6", - height: 50, - }); - } - - render() { - return { - type: "bi.border", - cls: "", - items: { - north: { - el: this._createNorth(), - height: 30, - top: 20, - left: 20, - right: 20, - }, - south: { - el: this._createSouth(), - height: 50, - bottom: 20, - left: 20, - right: 20, - }, - west: { - el: this._createWest(), - width: 200, - left: 20, - }, - east: { - el: this._createEast(), - width: 300, - right: 20, - }, - center: this._createCenter(), - }, - }; - } -} diff --git a/demo/js/core/layout/demo.center.js b/demo/js/core/layout/demo.center.js deleted file mode 100644 index 214afd000..000000000 --- a/demo/js/core/layout/demo.center.js +++ /dev/null @@ -1,40 +0,0 @@ -import { shortcut, Widget } from "@/core"; - -@shortcut() -export class CenterLayout extends Widget { - static xtype = "demo.center_layout"; - - props = { baseCls: "demo-center" }; - - render() { - return { - type: "bi.center", - items: [ - { - type: "bi.label", - text: "其实是一个grid嵌套absolute的实现", - cls: "layout-bg1", - whiteSpace: "normal", - }, - { - type: "bi.label", - text: "Center 2,为了演示label是占满整个的,用了一个whiteSpace:normal", - cls: "layout-bg2", - whiteSpace: "normal", - }, - { - type: "bi.label", - text: "Center 3", - cls: "layout-bg3", - }, - { - type: "bi.label", - text: "Center 4", - cls: "layout-bg5", - } - ], - hgap: 20, - vgap: 20, - }; - } -} diff --git a/demo/js/core/layout/demo.center_adapt.js b/demo/js/core/layout/demo.center_adapt.js deleted file mode 100644 index b1703a984..000000000 --- a/demo/js/core/layout/demo.center_adapt.js +++ /dev/null @@ -1,23 +0,0 @@ -import { shortcut, Widget } from "@/core"; - -@shortcut() -export class CenterAdapt extends Widget { - static xtype = "demo.center_adapt"; - - props = { baseCls: "demo-absolute" }; - - render() { - return { - type: "bi.center_adapt", - items: [ - { - type: "bi.label", - text: "水平垂直居中", - width: 300, - height: 200, - cls: "layout-bg1", - } - ], - }; - } -} diff --git a/demo/js/core/layout/demo.float_center.js b/demo/js/core/layout/demo.float_center.js deleted file mode 100644 index 24bf679ac..000000000 --- a/demo/js/core/layout/demo.float_center.js +++ /dev/null @@ -1,30 +0,0 @@ -import { shortcut, Widget } from "@/core"; - -@shortcut() -export class FloatCenterLayout extends Widget { - static xtype = "demo.float_center"; - - props = { baseCls: "demo-float-center" }; - - render() { - return { - type: "bi.float_center", - items: [ - { - type: "bi.label", - text: "floatCenter与center的不同在于,它可以控制最小宽度和最大宽度", - cls: "layout-bg1", - whiteSpace: "normal", - }, - { - type: "bi.label", - text: "浮动式的中间布局", - cls: "layout-bg2", - whiteSpace: "normal", - } - ], - hgap: 20, - vgap: 20, - }; - } -} diff --git a/demo/js/core/layout/demo.flow.js b/demo/js/core/layout/demo.flow.js deleted file mode 100644 index 9398fc900..000000000 --- a/demo/js/core/layout/demo.flow.js +++ /dev/null @@ -1,89 +0,0 @@ -import { shortcut, Widget } from "@/core"; - -@shortcut() -export class FlowLayout extends Widget { - static xtype = "demo.flow"; - - props = { baseCls: "demo-flow" }; - - render() { - return { - type: "bi.center_adapt", - items: [ - { - type: "bi.left", - items: [ - { - type: "bi.label", - height: 30, - text: "Left-1", - cls: "layout-bg1", - }, - { - type: "bi.label", - height: 30, - text: "Left-2", - cls: "layout-bg2", - }, - { - type: "bi.label", - height: 30, - text: "Left-3", - cls: "layout-bg3", - }, - { - type: "bi.label", - height: 30, - text: "Left-4", - cls: "layout-bg4", - }, - { - type: "bi.label", - height: 30, - text: "Left-5", - cls: "layout-bg5", - } - ], - hgap: 20, - }, - { - type: "bi.right", - hgap: 20, - items: [ - { - type: "bi.label", - height: 30, - text: "Right-1", - cls: "layout-bg1", - }, - { - type: "bi.label", - height: 30, - text: "Right-2", - cls: "layout-bg2", - }, - { - type: "bi.label", - height: 30, - text: "Right-3", - cls: "layout-bg3", - }, - { - type: "bi.label", - height: 30, - text: "Right-4", - cls: "layout-bg4", - }, - { - type: "bi.label", - height: 30, - text: "Right-5", - cls: "layout-bg5", - } - ], - vgap: 20, - } - ], - }; - } -} diff --git a/demo/js/core/layout/demo.grid.js b/demo/js/core/layout/demo.grid.js deleted file mode 100644 index 70531458a..000000000 --- a/demo/js/core/layout/demo.grid.js +++ /dev/null @@ -1,153 +0,0 @@ -import { shortcut, Widget } from "@/core"; - -@shortcut() -export class GridLayout extends Widget { - static xtype = "demo.grid"; - - props = { baseCls: "demo-grid" }; - - render() { - return { - type: "bi.grid", - columns: 5, - rows: 3, - items: [ - { - column: 0, - row: 0, - el: { - type: "bi.label", - text: "column-0, row-0", - cls: "layout-bg1", - }, - }, - { - column: 1, - row: 0, - el: { - type: "bi.label", - text: "column-1, row-0", - cls: "layout-bg2", - }, - }, - { - column: 2, - row: 0, - el: { - type: "bi.label", - text: "column-2, row-0", - cls: "layout-bg6", - }, - }, - { - column: 3, - row: 0, - el: { - type: "bi.label", - text: "column-3, row-0", - cls: "layout-bg3", - }, - }, - { - column: 4, - row: 0, - el: { - type: "bi.label", - text: "column-4, row-0", - cls: "layout-bg4", - }, - }, - { - column: 0, - row: 1, - el: { - type: "bi.label", - text: "column-0, row-1", - cls: "layout-bg5", - }, - }, - { - column: 1, - row: 1, - el: { - type: "bi.label", - text: "column-1, row-1", - cls: "layout-bg6", - }, - }, - { - column: 2, - row: 1, - el: { - type: "bi.label", - text: "column-2, row-1", - cls: "layout-bg7", - }, - }, - { - column: 3, - row: 1, - el: { - type: "bi.label", - text: "column-3, row-1", - cls: "layout-bg1", - }, - }, - { - column: 4, - row: 1, - el: { - type: "bi.label", - text: "column-4, row-1", - cls: "layout-bg3", - }, - }, - { - column: 0, - row: 2, - el: { - type: "bi.label", - text: "column-0, row-2", - cls: "layout-bg2", - }, - }, - { - column: 1, - row: 2, - el: { - type: "bi.label", - text: "column-1, row-2", - cls: "layout-bg3", - }, - }, - { - column: 2, - row: 2, - el: { - type: "bi.label", - text: "column-2, row-2", - cls: "layout-bg4", - }, - }, - { - column: 3, - row: 2, - el: { - type: "bi.label", - text: "column-3, row-2", - cls: "layout-bg5", - }, - }, - { - column: 4, - row: 2, - el: { - type: "bi.label", - text: "column-4, row-2", - cls: "layout-bg6", - }, - } - ], - }; - } -} diff --git a/demo/js/core/layout/demo.horizontal.js b/demo/js/core/layout/demo.horizontal.js deleted file mode 100644 index 831310a44..000000000 --- a/demo/js/core/layout/demo.horizontal.js +++ /dev/null @@ -1,153 +0,0 @@ -import { shortcut, Widget } from "@/core"; -import { VerticalAlign, HorizontalAlign } from "@/core"; - -@shortcut() -export class Horizontal extends Widget { - static xtype = "demo.horizontal"; - - props = { baseCls: "demo-horizontal" }; - - render() { - return { - type: "bi.vertical", - vgap: 10, - items: [ - { - type: "bi.horizontal", - height: 150, - hgap: 10, - items: [ - { - type: "bi.label", - whiteSpace: "normal", - text: "因为大多数场景下都需要垂直居中,所以这个布局一般会被vertical_adapt布局设置scrollx=true取代", - cls: "layout-bg3", - width: 500, - height: 50, - }, - { - type: "bi.label", - text: "水平布局", - cls: "layout-bg4", - width: 300, - height: 30, - }, - { - type: "bi.label", - text: "水平布局", - cls: "layout-bg5", - width: 300, - height: 30, - }, - { - type: "bi.label", - text: "水平布局", - cls: "layout-bg6", - width: 300, - height: 30, - } - ], - }, - { - type: "bi.layout", - height: 1, - cls: "bi-border-bottom bi-high-light-border", - }, - { - type: "bi.horizontal", - height: 150, - verticalAlign: BI.VerticalAlign.Middle, - horizontalAlign: BI.HorizontalAlign.Left, - vgap: 10, - items: [ - { - type: "bi.label", - text: "以horizontal实现的vertical_adapt垂直居中", - cls: "layout-bg1", - width: 300, - height: 30, - }, - { - type: "bi.label", - text: "以horizontal实现的vertical_adapt垂直居中", - cls: "layout-bg2", - width: 300, - height: 30, - } - ], - }, - { - type: "bi.layout", - height: 1, - cls: "bi-border-bottom bi-high-light-border", - }, - { - type: "bi.horizontal", - height: 150, - verticalAlign: BI.VerticalAlign.Top, - horizontalAlign: BI.HorizontalAlign.Center, - items: [ - { - type: "bi.label", - text: "以horizontal代替horizontal_adapt实现的水平居中(单元素)", - cls: "layout-bg1", - width: 300, - height: 30, - } - ], - }, - { - type: "bi.layout", - height: 1, - cls: "bi-border-bottom bi-high-light-border", - }, - { - type: "bi.horizontal", - height: 150, - verticalAlign: BI.VerticalAlign.Top, - horizontalAlign: BI.HorizontalAlign.Center, - columnSize: [300, "fill"], - items: [ - { - type: "bi.label", - text: "以horizontal代替horizontal_adapt实现的用于水平适应布局", - cls: "layout-bg1", - height: 30, - }, - { - type: "bi.label", - text: "以horizontal代替horizontal_adapt实现的水平自适应列", - cls: "layout-bg2", - height: 30, - } - ], - }, - { - type: "bi.layout", - height: 1, - cls: "bi-border-bottom bi-high-light-border", - }, - { - type: "bi.center_adapt", - height: 150, - verticalAlign: BI.VerticalAlign.Middle, - horizontalAlign: BI.HorizontalAlign.Center, - items: [ - { - type: "bi.label", - text: "以horizontal代替center_adapt实现的水平垂直居中", - width: 300, - height: 100, - cls: "layout-bg1", - } - ], - }, - { - type: "bi.layout", - height: 1, - cls: "bi-border-bottom bi-high-light-border", - } - ], - }; - } -} diff --git a/demo/js/core/layout/demo.horizontal_adapt.js b/demo/js/core/layout/demo.horizontal_adapt.js deleted file mode 100644 index 07318fe65..000000000 --- a/demo/js/core/layout/demo.horizontal_adapt.js +++ /dev/null @@ -1,64 +0,0 @@ -import { shortcut, Widget, createWidget } from "@/core"; - -@shortcut() -export class HorizontalAdapt extends Widget { - static xtype = "demo.horizontal_adapt"; - - props = { baseCls: "demo-horizontal-adapt" }; - - _createLayout() { - return createWidget({ - type: "bi.horizontal_adapt", - items: [ - { - type: "bi.label", - text: "例子1:可用做水平居中", - cls: "layout-bg1", - width: 300, - height: 30, - } - ], - }); - } - - _createAdaptLayout() { - return createWidget({ - type: "bi.horizontal_adapt", - columnSize: [300, "fill"], - items: [ - { - type: "bi.label", - text: "例子2:用于水平适应布局", - cls: "layout-bg1", - height: 30, - }, - { - type: "bi.label", - text: "水平自适应列", - cls: "layout-bg2", - height: 30, - } - ], - }); - } - - render() { - return { - type: "bi.grid", - columns: 1, - rows: 2, - items: [ - { - column: 0, - row: 0, - el: this._createLayout(), - }, - { - column: 0, - row: 1, - el: this._createAdaptLayout(), - } - ], - }; - } -} diff --git a/demo/js/core/layout/demo.horizontal_auto.js b/demo/js/core/layout/demo.horizontal_auto.js deleted file mode 100644 index 0adc9d715..000000000 --- a/demo/js/core/layout/demo.horizontal_auto.js +++ /dev/null @@ -1,45 +0,0 @@ -import { shortcut, Widget, createWidget } from "@/core"; - -@shortcut() -export class HorizontalAuto extends Widget { - static xtype = "demo.horizontal_auto"; - - props = { baseCls: "demo-horizontal-auto" }; - - _createLayout() { - return createWidget({ - type: "bi.horizontal_auto", - items: [ - { - type: "bi.label", - text: "水平居中", - cls: "layout-bg1", - width: 300, - height: 30, - }, - { - type: "bi.label", - text: "水平居中优先使用该布局", - cls: "layout-bg2", - width: 300, - height: 30, - } - ], - }); - } - - render() { - return { - type: "bi.grid", - columns: 1, - rows: 2, - items: [ - { - column: 0, - row: 0, - el: this._createLayout(), - } - ], - }; - } -} diff --git a/demo/js/core/layout/demo.horizontal_float.js b/demo/js/core/layout/demo.horizontal_float.js deleted file mode 100644 index bb9cd8a67..000000000 --- a/demo/js/core/layout/demo.horizontal_float.js +++ /dev/null @@ -1,22 +0,0 @@ -import { shortcut, Widget } from "@/core"; - -@shortcut() -export class HorizontalFloat extends Widget { - static xtype = "demo.horizontal_float"; - - props = { baseCls: "demo-horizontal-float" }; - - render() { - return { - type: "bi.horizontal_float", - items: [ - { - type: "bi.label", - text: "浮动式水平居中布局方案,用于宽度未知的情况", - cls: "layout-bg1", - height: 30, - } - ], - }; - } -} diff --git a/demo/js/core/layout/demo.htape.js b/demo/js/core/layout/demo.htape.js deleted file mode 100644 index bcd7a092d..000000000 --- a/demo/js/core/layout/demo.htape.js +++ /dev/null @@ -1,40 +0,0 @@ -import { shortcut, Widget } from "@/core"; - -@shortcut() -export class HtapeLayout extends Widget { - static xtype = "demo.htape"; - - props = { baseCls: "demo-htape" }; - - render() { - return { - type: "bi.htape", - items: [ - { - width: 100, - el: { - type: "bi.label", - text: "1", - cls: "bi-background", - }, - }, - { - width: 200, - el: { - type: "bi.label", - text: "2", - cls: "layout-bg2", - }, - }, - { - width: "fill", - el: { - type: "bi.label", - text: "3", - cls: "layout-bg3", - }, - } - ], - }; - } -} diff --git a/demo/js/core/layout/demo.left_right_vertical_adapt.js b/demo/js/core/layout/demo.left_right_vertical_adapt.js deleted file mode 100644 index 7cf1ed74d..000000000 --- a/demo/js/core/layout/demo.left_right_vertical_adapt.js +++ /dev/null @@ -1,50 +0,0 @@ -import { shortcut, Widget } from "@/core"; - -@shortcut() -export class LeftRightVerticalAdaptLayout extends Widget { - static xtype = "demo.left_right_vertical_adapt"; - - props = { baseCls: "demo-left-right-vertical-adapt" }; - - render() { - return { - type: "bi.left_right_vertical_adapt", - lhgap: 10, - rhgap: 30, - items: { - left: [ - { - type: "bi.label", - text: "左边的垂直居中", - cls: "layout-bg1", - width: 100, - height: 30, - }, - { - type: "bi.label", - text: "左边的垂直居中", - cls: "layout-bg2", - width: 100, - height: 30, - } - ], - right: [ - { - type: "bi.label", - text: "右边的垂直居中", - cls: "layout-bg1", - width: 100, - height: 30, - }, - { - type: "bi.label", - text: "右边的垂直居中", - cls: "layout-bg2", - width: 100, - height: 30, - } - ], - }, - }; - } -} diff --git a/demo/js/core/layout/demo.table.js b/demo/js/core/layout/demo.table.js deleted file mode 100644 index 9cbdc666c..000000000 --- a/demo/js/core/layout/demo.table.js +++ /dev/null @@ -1,164 +0,0 @@ -import { shortcut, Widget, createItems } from "@/core"; - -@shortcut() -export class TableLayout extends Widget { - static xtype = "demo.table_layout"; - - props = { baseCls: "demo-table-layout" }; - - _createTable1() { - return { - type: "bi.table", - items: createItems( - [ - [ - { - el: { - cls: "layout-bg1", - }, - }, - { - el: { - cls: "layout-bg2", - }, - }, - { - el: { - cls: "layout-bg3", - }, - } - ], - [ - { - el: { - cls: "layout-bg4", - }, - }, - { - el: { - cls: "layout-bg5", - }, - }, - { - el: { - cls: "layout-bg6", - }, - } - ], - [ - { - el: { - cls: "layout-bg7", - }, - }, - { - el: { - cls: "layout-bg8", - }, - }, - { - el: { - cls: "layout-bg1", - }, - } - ], - [ - { - el: { - cls: "layout-bg2", - }, - }, - { - el: { - cls: "layout-bg3", - }, - }, - { - el: { - cls: "layout-bg4", - }, - } - ], - [ - { - el: { - cls: "layout-bg5", - }, - }, - { - el: { - cls: "layout-bg6", - }, - }, - { - el: { - cls: "layout-bg7", - }, - } - ], - [ - { - el: { - cls: "layout-bg8", - }, - }, - { - el: { - cls: "layout-bg1", - }, - }, - { - el: { - cls: "layout-bg2", - }, - } - ], - [ - { - el: { - cls: "layout-bg6", - }, - }, - { - el: { - cls: "layout-bg7", - }, - }, - { - el: { - cls: "layout-bg8", - }, - } - ] - ], - { - type: "bi.layout", - } - ), - columnSize: [100, "fill", 200], - rowSize: [10, 30, 50, 70, 90, 110, 130], - hgap: 20, - vgap: 10, - }; - } - - render() { - return { - type: "bi.grid", - columns: 1, - rows: 1, - items: [ - { - column: 0, - row: 0, - el: this._createTable1(), - } - // , { - // column: 0, - // row: 1, - // el: this._createTable2() - // } - ], - }; - } -} diff --git a/demo/js/core/layout/demo.td.js b/demo/js/core/layout/demo.td.js deleted file mode 100644 index 704c55380..000000000 --- a/demo/js/core/layout/demo.td.js +++ /dev/null @@ -1,73 +0,0 @@ -import { shortcut, Widget, createItems } from "@/core"; - -@shortcut() -export class TdLayout extends Widget { - static xtype = "demo.td"; - - props = { baseCls: "demo-td" }; - - render() { - return { - type: "bi.vertical", - items: [ - { - type: "bi.td", - columnSize: [100, 100, ""], - items: createItems( - [ - [ - { - el: { - type: "bi.label", - text: "这是一段可以换行的文字,为了使它换行我要多写几个字,但是我又凑不够这么多的字,万般焦急下,只能随便写写", - cls: "layout-bg1", - }, - }, - { - el: { - type: "bi.label", - text: "这是一段可以换行的文字,为了使它换行我要多写几个字,但是我又凑不够这么多的字,万般焦急下,只能随便写写", - cls: "layout-bg2", - }, - }, - { - el: { - type: "bi.label", - text: "这是一段可以换行的文字,为了使它换行我要多写几个字,但是我又凑不够这么多的字,万般焦急下,只能随便写写", - cls: "layout-bg3", - }, - } - ], - [ - { - el: { - type: "bi.label", - text: "这是一段可以换行的文字,为了使它换行我要多写几个字,但是我又凑不够这么多的字,万般焦急下,只能随便写写", - cls: "layout-bg5", - }, - }, - { - el: { - type: "bi.label", - text: "这是一段可以换行的文字,为了使它换行我要多写几个字,但是我又凑不够这么多的字,万般焦急下,只能随便写写", - cls: "layout-bg6", - }, - }, - { - el: { - type: "bi.label", - text: "这是一段可以换行的文字,为了使它换行我要多写几个字,但是我又凑不够这么多的字,万般焦急下,只能随便写写", - cls: "layout-bg7", - }, - } - ] - ], - { - whiteSpace: "normal", - } - ), - } - ], - }; - } -} diff --git a/demo/js/core/layout/demo.vertical.js b/demo/js/core/layout/demo.vertical.js deleted file mode 100644 index 5f2e299f1..000000000 --- a/demo/js/core/layout/demo.vertical.js +++ /dev/null @@ -1,29 +0,0 @@ -import { shortcut, Widget } from "@/core"; - -@shortcut() -export class VerticalLayout extends Widget { - static xtype = "demo.vertical"; - - props = { baseCls: "demo-vertical" }; - - render() { - return { - type: "bi.vertical", - vgap: 10, - items: [ - { - type: "bi.label", - cls: "layout-bg3", - text: "垂直布局", - height: 30, - }, - { - type: "bi.label", - cls: "layout-bg4", - text: "垂直布局", - height: 30, - } - ], - }; - } -} diff --git a/demo/js/core/layout/demo.vertical_adapt.js b/demo/js/core/layout/demo.vertical_adapt.js deleted file mode 100644 index be3a23d84..000000000 --- a/demo/js/core/layout/demo.vertical_adapt.js +++ /dev/null @@ -1,46 +0,0 @@ -import { shortcut, Widget, createWidget } from "@/core"; - -@shortcut() -export class VerticalAdaptLayout extends Widget { - static xtype = "demo.vertical_adapt"; - - props = { baseCls: "demo-vertical-adapt" }; - - _createLayout() { - return createWidget({ - type: "bi.vertical_adapt", - vgap: 10, - items: [ - { - type: "bi.label", - text: "垂直居中", - cls: "layout-bg1", - width: 300, - height: 30, - }, - { - type: "bi.label", - text: "垂直居中", - cls: "layout-bg2", - width: 300, - height: 30, - } - ], - }); - } - - render() { - return { - type: "bi.grid", - columns: 2, - rows: 1, - items: [ - { - column: 0, - row: 0, - el: this._createLayout(), - } - ], - }; - } -} diff --git a/demo/js/core/layout/demo.vtape.js b/demo/js/core/layout/demo.vtape.js deleted file mode 100644 index c8f221451..000000000 --- a/demo/js/core/layout/demo.vtape.js +++ /dev/null @@ -1,43 +0,0 @@ -import { shortcut, Widget } from "@/core"; - -@shortcut() -export class VtapeLayout extends Widget { - static xtype = "demo.vtape"; - - props = { baseCls: "demo-vtape" }; - - render() { - return { - type: "bi.vtape", - vgap: 10, - items: [ - { - height: 100, - el: { - type: "bi.label", - text: "1", - cls: "layout-bg1", - }, - tgap: 10, - vgap: 10, - }, - { - height: 200, - el: { - type: "bi.label", - text: "2", - cls: "layout-bg2", - }, - }, - { - height: "fill", - el: { - type: "bi.label", - text: "3", - cls: "layout-bg3", - }, - } - ], - }; - } -} diff --git a/demo/js/core/layout/index.js b/demo/js/core/layout/index.js deleted file mode 100644 index 14277ed22..000000000 --- a/demo/js/core/layout/index.js +++ /dev/null @@ -1,18 +0,0 @@ -export * from "./demo.absolute"; -export * from "./demo.border"; -export * from "./demo.center"; -export * from "./demo.center_adapt"; -export * from "./demo.float_center"; -export * from "./demo.flow"; -export * from "./demo.grid"; -export * from "./demo.horizontal"; -export * from "./demo.horizontal_adapt"; -export * from "./demo.horizontal_auto"; -export * from "./demo.horizontal_float"; -export * from "./demo.htape"; -export * from "./demo.left_right_vertical_adapt"; -export * from "./demo.table"; -export * from "./demo.td"; -export * from "./demo.vertical"; -export * from "./demo.vertical_adapt"; -export * from "./demo.vtape"; \ No newline at end of file diff --git a/demo/js/core/popup/demo.layer.js b/demo/js/core/popup/demo.layer.js deleted file mode 100644 index 767219d52..000000000 --- a/demo/js/core/popup/demo.layer.js +++ /dev/null @@ -1,78 +0,0 @@ -import { shortcut, Widget, UUID } from "@/core"; -import { Layers } from "@/base"; - -@shortcut() -export class Func extends Widget { - static xtype = "demo.layer"; - - props = { baseCls: "demo-func" }; - - render() { - const self = this, - id1 = UUID(), - id2 = UUID(); - - return { - type: "bi.vertical", - vgap: 10, - items: [ - { - type: "bi.button", - text: "create形式创建layer, 遮住当前面板, 返回创建的面板对象", - height: 30, - handler() { - Layers.create(id1, self, { - // 偏移量 - offset: { - left: 10, - right: 10, - top: 10, - bottom: 10, - }, - type: "bi.center_adapt", - cls: "bi-card", - items: [ - { - type: "bi.button", - text: "点击关闭", - handler() { - Layers.hide(id1); - }, - } - ], - }); - Layers.show(id1); - }, - }, - { - type: "bi.button", - text: "make形式创建layer,可以指定放到哪个面板内,这里指定当前面板(默认放在body下撑满), 返回创建的面板对象", - height: 30, - handler() { - Layers.make(id2, self, { - // 偏移量 - offset: { - left: 10, - right: 10, - top: 10, - bottom: 10, - }, - type: "bi.center_adapt", - cls: "bi-card", - items: [ - { - type: "bi.button", - text: "点击关闭", - handler() { - Layers.remove(id2); - }, - } - ], - }); - Layers.show(id2); - }, - } - ], - }; - } -} diff --git a/demo/js/core/popup/demo.popover.js b/demo/js/core/popup/demo.popover.js deleted file mode 100644 index a5ae5ecac..000000000 --- a/demo/js/core/popup/demo.popover.js +++ /dev/null @@ -1,219 +0,0 @@ -import { shortcut, Widget, UUID, map, range } from "@/core"; -import { Popovers } from "@/base"; - -@shortcut() -export class Func extends Widget { - static xtype = "demo.popover"; - - props = { baseCls: "demo-func" }; - - render() { - const id = UUID(); - let body; - - return { - type: "bi.vertical", - vgap: 10, - items: [ - { - type: "bi.text_button", - text: "点击弹出Popover(normal size & fixed)", - height: 30, - handler() { - Popovers.remove(id); - Popovers.create(id, { - type: "bi.bar_popover", - size: "normal", - header: { - type: "bi.label", - text: "这个是header", - }, - body: { - type: "bi.label", - text: "这个是body", - }, - }).open(id); - }, - }, - { - type: "bi.text_button", - text: "点击弹出Popover(small size & fixed)", - height: 30, - handler() { - Popovers.remove(id); - Popovers.create(id, { - type: "bi.bar_popover", - size: "small", - header: { - type: "bi.label", - text: "这个是header", - }, - body: { - type: "bi.label", - text: "这个是body", - }, - }).open(id); - }, - }, - { - type: "bi.text_button", - text: "点击弹出Popover(big size & fixed)", - height: 30, - handler() { - Popovers.remove(id); - Popovers.create(id, { - type: "bi.bar_popover", - size: "big", - header: { - type: "bi.label", - text: "这个是header", - }, - body: { - type: "bi.label", - text: "这个是body", - }, - }).open(id); - }, - }, - { - type: "bi.text_button", - text: "点击弹出Popover(normal size & adapt body区域高度是300)", - height: 30, - handler() { - Popovers.remove(id); - Popovers.create(id, { - type: "bi.bar_popover", - size: "normal", - logic: { - dynamic: true, - }, - header: { - type: "bi.label", - text: "这个是header", - }, - body: { - type: "bi.vertical", - items: [ - { - type: "bi.button_group", - ref() { - body = this; - }, - items: map(range(0, 10), () => { - return { - type: "bi.label", - text: "1", - height: 30, - }; - }), - layouts: [ - { - type: "bi.vertical", - } - ], - } - ], - }, - }).open(id); - }, - }, - { - type: "bi.text_button", - text: "点击弹出Popover(small size & adapt body区域高度是900)", - height: 30, - handler() { - Popovers.remove(id); - Popovers.create(id, { - type: "bi.bar_popover", - size: "small", - logic: { - dynamic: true, - }, - header: { - type: "bi.label", - text: "这个是header", - }, - body: { - type: "bi.vertical", - items: [ - { - type: "bi.button_group", - ref() { - body = this; - }, - items: map(range(0, 30), () => { - return { - type: "bi.label", - text: "1", - height: 30, - }; - }), - layouts: [ - { - type: "bi.vertical", - } - ], - } - ], - }, - }).open(id); - }, - }, - { - type: "bi.text_button", - text: "点击弹出Popover(custom)", - height: 30, - handler() { - Popovers.remove(id); - Popovers.create(id, { - width: 400, - height: 300, - header: { - type: "bi.label", - text: "这个是header", - }, - body: { - type: "bi.label", - text: "这个是body", - }, - footer: { - type: "bi.label", - text: "这个是footer", - }, - }).open(id); - }, - }, - { - type: "bi.text_button", - height: 30, - text: "弹出一个高度动态的popover层, 此弹出层指定size为small, 但是高度随内容自适应,自适应支持的最大高度为默认为600px", - handler() { - const id = "弹出层id1"; - Popovers.create(id, { - // String或者是json都行 - header: "弹出层标题", - logic: { - dynamic: true, - maxHeight: 700, - }, - size: "small", - body: { - type: "bi.vertical", - items: map(range(0, 50), (idx, v) => { - return { - type: "bi.label", - text: "弹出层内容", - }; - }), - }, - footer: { - type: "bi.label", - text: "这个是footer", - }, - }).open(id); - }, - } - ], - }; - } -} diff --git a/demo/js/core/popup/demo.popup_view.js b/demo/js/core/popup/demo.popup_view.js deleted file mode 100644 index 3dd0d35b7..000000000 --- a/demo/js/core/popup/demo.popup_view.js +++ /dev/null @@ -1,46 +0,0 @@ -import { shortcut, Widget, createItems, deepClone } from "@/core"; - -@shortcut() -export class Func extends Widget { - static xtype = "demo.popup_view"; - - props = { baseCls: "demo-func" }; - - render() { - const self = this; - - return { - type: "bi.absolute", - items: [ - { - el: { - type: "bi.combo", - width: 200, - height: 30, - el: { - type: "bi.text_button", - text: "点击", - cls: "bi-border", - height: 30, - }, - popup: { - type: "bi.popup_view", - el: { - type: "bi.button_group", - layouts: [ - { - type: "bi.vertical", - } - ], - items: createItems(deepClone(Demo.CONSTANTS.ITEMS), { - type: "bi.multi_select_item", - height: 25, - }), - }, - }, - }, - } - ], - }; - } -} diff --git a/demo/js/core/popup/demo.searcher_view.js b/demo/js/core/popup/demo.searcher_view.js deleted file mode 100644 index 84920aae2..000000000 --- a/demo/js/core/popup/demo.searcher_view.js +++ /dev/null @@ -1,61 +0,0 @@ -import { shortcut, Widget, createItems } from "@/core"; - -@shortcut() -export class Func extends Widget { - static xtype = "demo.searcher_view"; - - props = { baseCls: "demo-func" }; - - render() { - const self = this; - - return { - type: "bi.absolute", - items: [ - { - el: { - type: "bi.searcher_view", - ref() { - self.searcherView = this; - }, - }, - left: 100, - top: 20, - width: 230, - } - ], - }; - } - - mounted() { - this.searcherView.populate( - createItems( - [ - { - text: 2012, - }, - { - text: 2013, - }, - { - text: 2014, - }, - { - text: 2015, - } - ], - { - type: "bi.label", - textHeight: 24, - height: 24, - } - ), - [ - { - text: 2, - } - ], - "2" - ); - } -} diff --git a/demo/js/core/popup/index.js b/demo/js/core/popup/index.js deleted file mode 100644 index 3a8fed100..000000000 --- a/demo/js/core/popup/index.js +++ /dev/null @@ -1,4 +0,0 @@ -export * from "./demo.layer"; -export * from "./demo.popover"; -export * from "./demo.popup_view"; -export * from "./demo.searcher_view"; \ No newline at end of file diff --git a/demo/js/face.js b/demo/js/face.js deleted file mode 100644 index 82a4b4754..000000000 --- a/demo/js/face.js +++ /dev/null @@ -1,878 +0,0 @@ -import { shortcut, Widget, each } from "@/core"; -import { Msg, StyleLoaders } from "@/base"; -import { ColorChooser } from "@/case"; - -@shortcut() -export class Face extends Widget { - static xtype = "demo.face"; - - props = { baseCls: "demo-face" }; - - _createLabel(text) { - return { - width: 200, - el: { - type: "bi.label", - text, - textAlign: "left", - hgap: 5, - height: 40, - cls: "config-label", - }, - }; - } - - _createColorPicker(ref, action) { - return { - el: { - type: "bi.vertical_adapt", - items: [ - { - type: "bi.color_chooser", - listeners: [ - { - eventName: ColorChooser.EVENT_CHANGE, - action, - } - ], - ref, - width: 24, - height: 24, - } - ], - }, - }; - } - - _createBackgroundConfig() { - const self = this; - - return { - type: "bi.htape", - cls: "config-item bi-border-bottom", - height: 40, - items: [ - this._createLabel("背景色:"), - this._createColorPicker( - function () { - self.backgroundColor = this; - }, - () => { - self._runGlobalStyle(); - } - ) - ], - }; - } - - _createFontConfig() { - const self = this; - - return { - type: "bi.htape", - cls: "config-item bi-border-bottom", - height: 40, - items: [ - this._createLabel("字体颜色:"), - this._createColorPicker( - function () { - self.fontColor = this; - }, - () => { - self._runGlobalStyle(); - } - ) - ], - }; - } - - _createActiveFontConfig() { - const self = this; - - return { - type: "bi.htape", - cls: "config-item bi-border-bottom", - height: 40, - items: [ - this._createLabel("激活状态字体颜色:"), - this._createColorPicker( - function () { - self.activeFontColor = this; - }, - () => { - self._runGlobalStyle(); - } - ), - { - width: 100, - el: { - type: "bi.text_button", - cls: "bi-list-item-active", - text: "测试激活状态", - }, - } - ], - }; - } - - _createSelectFontConfig() { - const self = this; - - return { - type: "bi.htape", - cls: "config-item bi-border-bottom", - height: 40, - items: [ - this._createLabel("选中状态字体颜色:"), - this._createColorPicker( - function () { - self.selectFontColor = this; - }, - () => { - self._runGlobalStyle(); - } - ), - { - width: 100, - el: { - type: "bi.text_button", - cls: "bi-list-item-active", - text: "测试选中状态", - }, - } - ], - }; - } - - _createGrayFontConfig() { - const self = this; - - return { - type: "bi.htape", - cls: "config-item bi-border-bottom", - height: 40, - items: [ - this._createLabel("tip提示字体颜色:"), - this._createColorPicker( - function () { - self.grayFontColor = this; - }, - () => { - self._runGlobalStyle(); - } - ), - { - width: 100, - el: { - type: "bi.icon_text_item", - cls: "bi-tips copy-font", - height: 40, - text: "测试提示文字", - }, - } - ], - }; - } - - _createDisableFontConfig() { - const self = this; - - return { - type: "bi.htape", - cls: "config-item bi-border-bottom", - height: 40, - items: [ - this._createLabel("灰化字体颜色:"), - this._createColorPicker( - function () { - self.disabledFontColor = this; - }, - () => { - self._runGlobalStyle(); - } - ), - { - width: 100, - el: { - type: "bi.text_button", - text: "这个按钮是灰化的", - disabled: true, - }, - } - ], - }; - } - - _createCardBackgroundConfig() { - const self = this; - - return { - type: "bi.htape", - cls: "config-item bi-border-bottom", - height: 40, - items: [ - this._createLabel("Card背景颜色:"), - this._createColorPicker( - function () { - self.cardBackgroundColor = this; - }, - () => { - self._runGlobalStyle(); - } - ) - ], - }; - } - - _createHoverBackgroundColor() { - const self = this; - - return { - type: "bi.htape", - cls: "config-item bi-border-bottom", - height: 40, - items: [ - this._createLabel("悬浮状态背景颜色:"), - this._createColorPicker( - function () { - self.hoverBackgroundColor = this; - }, - () => { - self._runGlobalStyle(); - } - ), - { - width: 100, - el: { - type: "bi.text_button", - cls: "bi-list-item-active", - text: "测试悬浮状态", - }, - } - ], - }; - } - - _createActiveBackgroundColor() { - const self = this; - - return { - type: "bi.htape", - cls: "config-item bi-border-bottom", - height: 40, - items: [ - this._createLabel("激活状态背景颜色:"), - this._createColorPicker( - function () { - self.activeBackgroundColor = this; - }, - () => { - self._runGlobalStyle(); - } - ), - { - width: 100, - el: { - type: "bi.text_button", - cls: "bi-list-item-active", - text: "测试激活状态", - }, - } - ], - }; - } - - _createSelectBackgroundColor() { - const self = this; - - return { - type: "bi.htape", - cls: "config-item bi-border-bottom", - height: 40, - items: [ - this._createLabel("选中状态背景颜色:"), - this._createColorPicker( - function () { - self.selectBackgroundColor = this; - }, - () => { - self._runGlobalStyle(); - } - ), - { - width: 100, - el: { - type: "bi.text_button", - cls: "bi-list-item-active", - text: "测试选中状态", - }, - } - ], - }; - } - - _createSlitColor() { - const self = this; - - return { - type: "bi.htape", - cls: "config-item bi-border-bottom", - height: 40, - items: [ - this._createLabel("分割线颜色:"), - this._createColorPicker( - function () { - self.slitColor = this; - }, - () => { - self._runGlobalStyle(); - } - ) - ], - }; - } - - _createBaseConfig() { - return { - type: "bi.vertical", - items: [ - this._createLabel("--通用配色--"), - this._createBackgroundConfig(), - this._createCardBackgroundConfig(), - this._createFontConfig(), - this._createActiveFontConfig(), - this._createSelectFontConfig(), - this._createGrayFontConfig(), - this._createDisableFontConfig(), - this._createHoverBackgroundColor(), - this._createActiveBackgroundColor(), - this._createSelectBackgroundColor(), - this._createSlitColor() - ], - }; - } - - _createButton1BackgroundConfig() { - const self = this; - - return { - type: "bi.htape", - cls: "config-item bi-border-bottom", - height: 40, - items: [ - this._createLabel("按钮背景色1:"), - this._createColorPicker( - function () { - self.button1BackgroundColor = this; - }, - () => { - self._runGlobalStyle(); - } - ), - { - width: 100, - el: { - type: "bi.vertical_adapt", - height: 40, - items: [ - { - type: "bi.button", - cls: "config-button1", - text: "测试按钮", - } - ], - }, - } - ], - }; - } - - _createButton2BackgroundConfig() { - const self = this; - - return { - type: "bi.htape", - cls: "config-item bi-border-bottom", - height: 40, - items: [ - this._createLabel("按钮背景色2:"), - this._createColorPicker( - function () { - self.button2BackgroundColor = this; - }, - () => { - self._runGlobalStyle(); - } - ), - { - width: 100, - el: { - type: "bi.vertical_adapt", - height: 40, - items: [ - { - type: "bi.button", - level: "success", - cls: "config-button2", - text: "测试按钮", - } - ], - }, - } - ], - }; - } - - _createButton3BackgroundConfig() { - const self = this; - - return { - type: "bi.htape", - cls: "config-item bi-border-bottom", - height: 40, - items: [ - this._createLabel("按钮背景色3:"), - this._createColorPicker( - function () { - self.button3BackgroundColor = this; - }, - () => { - self._runGlobalStyle(); - } - ), - { - width: 100, - el: { - type: "bi.vertical_adapt", - height: 40, - items: [ - { - type: "bi.button", - level: "warning", - cls: "config-button3", - text: "测试按钮", - } - ], - }, - } - ], - }; - } - - _createButton4BackgroundConfig() { - const self = this; - - return { - type: "bi.htape", - cls: "config-item bi-border-bottom", - height: 40, - items: [ - this._createLabel("按钮背景色4:"), - this._createColorPicker( - function () { - self.button4BackgroundColor = this; - }, - () => { - self._runGlobalStyle(); - } - ), - { - width: 100, - el: { - type: "bi.vertical_adapt", - height: 40, - items: [ - { - type: "bi.button", - level: "ignore", - cls: "config-button4", - text: "测试按钮", - } - ], - }, - } - ], - }; - } - - _createScrollBackgroundConfig() { - const self = this; - - return { - type: "bi.htape", - cls: "config-item bi-border-bottom", - height: 40, - items: [ - this._createLabel("滚动条底色:"), - this._createColorPicker( - function () { - self.scrollBackgroundColor = this; - }, - () => { - self._runGlobalStyle(); - } - ) - ], - }; - } - - _createScrollThumbConfig() { - const self = this; - - return { - type: "bi.htape", - cls: "config-item bi-border-bottom", - height: 40, - items: [ - this._createLabel("滚动条thumb颜色:"), - this._createColorPicker( - function () { - self.scrollThumbColor = this; - }, - () => { - self._runGlobalStyle(); - } - ) - ], - }; - } - - _createPopupBackgroundConfig() { - const self = this; - - return { - type: "bi.htape", - cls: "config-item bi-border-bottom", - height: 40, - items: [ - this._createLabel("下拉框背景颜色:"), - this._createColorPicker( - function () { - self.popupBackgroundColor = this; - }, - () => { - self._runGlobalStyle(); - } - ), - { - width: 100, - el: { - type: "bi.vertical_adapt", - items: [ - { - type: "bi.down_list_combo", - items: [ - [ - { - el: { - text: "column 1111", - iconCls1: "check-mark-e-font", - value: 11, - }, - children: [ - { - text: "column 1.1", - value: 21, - cls: "dot-e-font", - selected: true, - }, - { - text: "column 1.222222222222222222222222222222222222", - cls: "dot-e-font", - value: 22, - }, - { - text: "column 1.3", - cls: "dot-e-font", - value: 23, - }, - { - text: "column 1.4", - cls: "dot-e-font", - value: 24, - }, - { - text: "column 1.5", - cls: "dot-e-font", - value: 25, - } - ], - } - ], - [ - { - el: { - type: "bi.icon_text_icon_item", - text: "column 2", - iconCls1: "chart-type-e-font", - cls: "dot-e-font", - value: 12, - }, - disabled: true, - children: [ - { - type: "bi.icon_text_item", - cls: "dot-e-font", - height: 25, - text: "column 2.1", - value: 11, - }, - { text: "column 2.2", value: 12, cls: "dot-e-font" } - ], - } - ], - [ - { - text: "column 33333333333333333333333333333333", - cls: "style-set-e-font", - value: 13, - } - ], - [ - { - text: "column 4", - cls: "filter-e-font", - value: 14, - } - ], - [ - { - text: "column 5", - cls: "copy-e-font", - value: 15, - } - ], - [ - { - text: "column 6", - cls: "delete-e-font", - value: 16, - } - ], - [ - { - text: "column 7", - cls: "dimension-from-e-font", - value: 17, - disabled: true, - } - ] - ], - } - ], - }, - } - ], - }; - } - - _createMaskBackgroundConfig() { - const self = this; - - return { - type: "bi.htape", - cls: "config-item bi-border-bottom", - height: 40, - items: [ - this._createLabel("弹出层蒙版颜色:"), - this._createColorPicker( - function () { - self.maskBackgroundColor = this; - }, - () => { - self._runGlobalStyle(); - } - ), - { - width: 100, - el: { - type: "bi.vertical_adapt", - items: [ - { - type: "bi.button", - text: "mask测试", - handler() { - Msg.alert("弹出层", "弹出层面板"); - }, - } - ], - }, - } - ], - }; - } - - _createCommonConfig() { - return { - type: "bi.vertical", - items: [ - this._createLabel("--一般配色--"), - this._createButton1BackgroundConfig(), - this._createButton2BackgroundConfig(), - this._createButton3BackgroundConfig(), - this._createButton4BackgroundConfig(), - this._createScrollBackgroundConfig(), - this._createScrollThumbConfig(), - this._createPopupBackgroundConfig(), - this._createMaskBackgroundConfig() - ], - }; - } - - render() { - const self = this; - - return { - type: "bi.grid", - items: [ - [ - { - el: { - type: "bi.vertical", - cls: "face-config bi-border-right", - items: [this._createBaseConfig(), this._createCommonConfig()], - }, - }, - { - el: { - type: "bi.layout", - }, - } - ] - ], - }; - } - - _setStyle(objects) { - let result = ""; - each(objects, (cls, object) => { - result += `${cls}{`; - each(object, (name, value) => { - result += `${name}:${value};`; - }); - result += "} "; - }); - StyleLoaders.removeStyle("style").loadStyle("style", result); - } - - _runGlobalStyle() { - const backgroundColor = this.backgroundColor.getValue(); - const fontColor = this.fontColor.getValue(); - const activeFontColor = this.activeFontColor.getValue(); - const selectFontColor = this.selectFontColor.getValue(); - const grayFontColor = this.grayFontColor.getValue(); - const disabledFontColor = this.disabledFontColor.getValue(); - const cardBackgroundColor = this.cardBackgroundColor.getValue(); - const hoverBackgroundColor = this.hoverBackgroundColor.getValue(); - const activeBackgroundColor = this.activeBackgroundColor.getValue(); - const selectBackgroundColor = this.selectBackgroundColor.getValue(); - const slitColor = this.slitColor.getValue(); - - const button1BackgroundColor = this.button1BackgroundColor.getValue(); - const button2BackgroundColor = this.button2BackgroundColor.getValue(); - const button3BackgroundColor = this.button3BackgroundColor.getValue(); - const button4BackgroundColor = this.button4BackgroundColor.getValue(); - const scrollBackgroundColor = this.scrollBackgroundColor.getValue(); - const scrollThumbColor = this.scrollThumbColor.getValue(); - const popupBackgroundColor = this.popupBackgroundColor.getValue(); - const maskBackgroundColor = this.maskBackgroundColor.getValue(); - - this._setStyle({ - "body.bi-background, body .bi-background": { - "background-color": backgroundColor, - color: fontColor, - }, - "body .bi-card": { - "background-color": cardBackgroundColor, - color: fontColor, - }, - "body .bi-tips": { - color: grayFontColor, - }, - "div::-webkit-scrollbar,.scrollbar-layout-main": { - "background-color": `${scrollBackgroundColor}!important`, - }, - "div::-webkit-scrollbar-thumb,.public-scrollbar-face:after": { - "background-color": `${scrollThumbColor}!important`, - }, - ".base-disabled": { - color: `${disabledFontColor}!important`, - }, - ".base-disabled .b-font:before": { - color: `${disabledFontColor}!important`, - }, - ".list-view-outer": { - "background-color": `${popupBackgroundColor}!important`, - }, - ".bi-z-index-mask": { - "background-color": `${maskBackgroundColor}!important`, - }, - ".bi-list-item:hover,.bi-list-item-hover:hover,.bi-list-item-active:hover,.bi-list-item-select:hover,.bi-list-item-effect:hover": - { - "background-color": `${hoverBackgroundColor}!important`, - }, - ".bi-list-item-active:active,.bi-list-item-select:active,.bi-list-item-effect:active": { - "background-color": `${activeBackgroundColor}!important`, - color: `${activeFontColor}!important`, - }, - ".bi-list-item-active.active,.bi-list-item-select.active,.bi-list-item-effect.active": { - "background-color": `${selectBackgroundColor}!important`, - color: `${selectFontColor}!important`, - }, - "body .bi-button.button-common": { - "background-color": button1BackgroundColor, - "border-color": button1BackgroundColor, - }, - "body .bi-button.button-success": { - "background-color": button2BackgroundColor, - "border-color": button2BackgroundColor, - }, - "body .bi-button.button-warning": { - "background-color": button3BackgroundColor, - "border-color": button3BackgroundColor, - }, - "body .bi-button.button-ignore": { - "background-color": button4BackgroundColor, - }, - // 以下是分割线颜色 - "body .bi-border,body .bi-border-top,#wrapper .bi-border-bottom,body .bi-border-left,body .bi-border-right": - { - "border-color": slitColor, - }, - ".bi-collection-table-cell": { - "border-right-color": slitColor, - "border-bottom-color": slitColor, - }, - ".bi-collection-table-cell.first-col": { - "border-left-color": slitColor, - }, - ".bi-collection-table-cell.first-row": { - "border-top-color": slitColor, - }, - }); - } - - mounted() { - this.backgroundColor.setValue(""); - this.fontColor.setValue(""); - this.activeFontColor.setValue(""); - this.selectFontColor.setValue(""); - this.grayFontColor.setValue(""); - this.disabledFontColor.setValue(""); - this.cardBackgroundColor.setValue(""); - this.hoverBackgroundColor.setValue(""); - this.activeBackgroundColor.setValue(""); - this.selectBackgroundColor.setValue(""); - - this.button1BackgroundColor.setValue(""); - this.button2BackgroundColor.setValue(""); - this.button3BackgroundColor.setValue(""); - this.button4BackgroundColor.setValue(""); - this.scrollBackgroundColor.setValue(""); - this.scrollThumbColor.setValue(""); - this.popupBackgroundColor.setValue(""); - this.maskBackgroundColor.setValue(""); - this.slitColor.setValue(""); - this._runGlobalStyle(); - } -} diff --git a/demo/js/fix-2.0/computed.js b/demo/js/fix-2.0/computed.js deleted file mode 100644 index 7dd00c30e..000000000 --- a/demo/js/fix-2.0/computed.js +++ /dev/null @@ -1,52 +0,0 @@ -(function () { - var model = Fix.define({ - name: "原始属性", - arr: [{ - n: "a" - }, { - n: "b" - }] - }); - var Computed = BI.inherit(Fix.Model, { - computed: { - b: function () { - return this.name + "-计算属性"; - } - } - }); - - Demo.Fix = BI.inherit(BI.Widget, { - _store: function () { - return new Computed(model); - }, - watch: { - b: function () { - this.button.setText(this.model.b); - } - }, - render: function () { - var self = this; - return { - type: "bi.absolute", - items: [{ - el: { - type: "bi.button", - ref: function () { - self.button = this; - }, - handler: function () { - self.model.name = "这是改变后的属性"; - }, - text: this.model.b - } - }] - }; - }, - mounted: function () { - - - } - }); - - BI.shortcut("demo.fix_computed", Demo.Fix); -}()); \ No newline at end of file diff --git a/demo/js/fix-2.0/context.js b/demo/js/fix-2.0/context.js deleted file mode 100644 index b248b502c..000000000 --- a/demo/js/fix-2.0/context.js +++ /dev/null @@ -1,79 +0,0 @@ -(function () { - var ParentStore = BI.inherit(Fix.Model, { - state: function () { - return { - context: "默认context" - }; - }, - childContext: ["context"] - }); - - BI.model("demo.model.context.parent_store",ParentStore) - - var ChildStore = BI.inherit(Fix.Model, { - context: ["context"], - computed: { - currContext: function () { - return this.model.context; - } - }, - actions: { - changeContext: function () { - this.model.context = "改变后的context"; - } - } - }); - - BI.model("demo.model.context.child_store",ChildStore) - - var Child = BI.inherit(BI.Widget, { - _store: function () { - return BI.Models.getModel("demo.model.context.child_store"); - }, - watch: { - currContext: function (val) { - this.button.setText(val); - } - }, - render: function () { - var self = this; - return { - type: "bi.button", - ref: function () { - self.button = this; - }, - text: this.model.context, - handler: function () { - self.store.changeContext(); - } - }; - }, - mounted: function () { - - } - }); - - BI.shortcut("demo.fix_context_child", Child); - - var Parent = BI.inherit(BI.Widget, { - _store: function () { - return BI.Models.getModel("demo.model.context.parent_store"); - }, - render: function () { - var self = this; - return { - type: "bi.absolute", - items: [{ - el: { - type: "demo.fix_context_child" - } - }] - }; - }, - mounted: function () { - - } - }); - - BI.shortcut("demo.fix_context", Parent); -}()); diff --git a/demo/js/fix-2.0/define.js b/demo/js/fix-2.0/define.js deleted file mode 100644 index 969c87f3f..000000000 --- a/demo/js/fix-2.0/define.js +++ /dev/null @@ -1,45 +0,0 @@ -(function () { - var model = Fix.define({ - name: "原始属性", - arr: [{ - n: "a" - }, { - n: "b" - }] - }); - - Demo.Fix = BI.inherit(BI.Widget, { - _store: function () { - return model; - }, - watch: { - name: function () { - this.button.setText(this.model.name); - } - }, - render: function () { - var self = this; - return { - type: "bi.absolute", - items: [{ - el: { - type: "bi.button", - ref: function () { - self.button = this; - }, - handler: function () { - self.model.name = "这是改变后的属性"; - }, - text: this.model.name - } - }] - }; - }, - mounted: function () { - - - } - }); - - BI.shortcut("demo.fix_define", Demo.Fix); -}()); diff --git a/demo/js/fix-2.0/demo.js b/demo/js/fix-2.0/demo.js deleted file mode 100644 index dab4b410c..000000000 --- a/demo/js/fix-2.0/demo.js +++ /dev/null @@ -1,74 +0,0 @@ -(function () { - var model = Fix.define({ - name: 1, - arr: [{ - n: "a" - }, { - n: 0 - }] - }); - var Computed = BI.inherit(Fix.Model, { - computed: { - b: function () { - return this.name + 1; - }, - c: function () { - return this.arr[1].n + this.b; - } - } - }); - - var Store = BI.inherit(Fix.Model, { - _init: function () { - this.comp = new Computed(model); - }, - computed: { - b: function () { - return this.comp.c + 1; - }, - c: function () { - return this.comp.arr[1].n & 1; - } - }, - actions: { - run: function () { - this.comp.name++; - this.comp.arr[1].n++; - } - } - }); - - Demo.Fix = BI.inherit(BI.Widget, { - _store: function () { - return new Store(); - }, - watch: { - "b&&(c||b)": function () { - this.button.setText(this.model.b); - } - }, - render: function () { - var self = this; - return { - type: "bi.absolute", - items: [{ - el: { - type: "bi.button", - ref: function () { - self.button = this; - }, - handler: function () { - self.store.run(); - }, - text: this.model.b - } - }] - }; - }, - mounted: function () { - - } - }); - - BI.shortcut("demo.fix", Demo.Fix); -}()); \ No newline at end of file diff --git a/demo/js/fix-2.0/globalwatcher.js b/demo/js/fix-2.0/globalwatcher.js deleted file mode 100644 index 248fb1671..000000000 --- a/demo/js/fix-2.0/globalwatcher.js +++ /dev/null @@ -1,52 +0,0 @@ -(function () { - var model = Fix.define({ - name: "原始属性", - arr: [{ - n: "a" - }, { - n: 0 - }] - }); - - Demo.Fix = BI.inherit(BI.Widget, { - _store: function () { - return model; - }, - watch: { - "*.*.n": function () { - debugger - }, - "**": function () { - debugger - }, - "arr.1.*": function () { - this.button.setText(this.model.name + "-" + this.model.arr[1].n); - } - }, - render: function () { - var self = this; - return { - type: "bi.absolute", - items: [{ - el: { - type: "bi.button", - ref: function () { - self.button = this; - }, - handler: function () { - self.model.arr[0].n += 1; - self.model.arr[1].n += 1; - }, - text: this.model.name + "-" + this.model.arr[1].n - } - }] - }; - }, - mounted: function () { - - - } - }); - - BI.shortcut("demo.fix_global_watcher", Demo.Fix); -}()); \ No newline at end of file diff --git a/demo/js/fix-2.0/index.js b/demo/js/fix-2.0/index.js deleted file mode 100644 index dab34ad3a..000000000 --- a/demo/js/fix-2.0/index.js +++ /dev/null @@ -1,10 +0,0 @@ -export * from "./computed"; -export * from "./context"; -export * from "./define"; -export * from "./demo"; -export * from "./globalwatcher"; -export * from "./inject"; -export * from "./scene"; -export * from "./state"; -export * from "./store"; -export * from "./watcher"; \ No newline at end of file diff --git a/demo/js/fix-2.0/inject.js b/demo/js/fix-2.0/inject.js deleted file mode 100644 index a5734635a..000000000 --- a/demo/js/fix-2.0/inject.js +++ /dev/null @@ -1,102 +0,0 @@ -(function () { - var ParentStore = BI.inherit(Fix.Model, { - state: function () { - return { - context: { - one: { - key: "one.key" - } - } - }; - }, - childContext: ["context"], - - actions: { - changeContext: function () { - this.model.context = { - two: { - key: "two.key" - } - }; - } - } - }); - - BI.model("demo.model.inject.parent_store", ParentStore); - - var ChildStore = BI.inherit(Fix.Model, { - inject: ["context"], - computed: { - currContext: function () { - return this.model.context.one.key; - } - }, - actions: { - changeContext: function () { - this.model.context = { - one: { - key: "one.changed_key" - } - }; - } - } - }); - - BI.model("demo.model.inject.child_store", ChildStore); - - var Child = BI.inherit(BI.Widget, { - _store: function () { - return BI.Models.getModel("demo.model.inject.child_store"); - }, - watch: { - currContext: function (val) { - this.button.setText(val); - } - }, - render: function () { - var self = this; - return { - type: "bi.button", - ref: function () { - self.button = this; - }, - text: this.model.currContext, - handler: function () { - self.store.changeContext(); - } - }; - }, - }); - - BI.shortcut("demo.fix_inject_child", Child); - - var Parent = BI.inherit(BI.Widget, { - _store: function () { - return BI.Models.getModel("demo.model.inject.parent_store"); - }, - render: function () { - var self = this; - return { - type: "bi.vertical", - items: [{ - el: { - type: "demo.fix_inject_child" - } - }, { - el: { - type: "bi.button", - text: "点击修改parent state", - handler: function () { - self.store.changeContext(); - } - } - }] - }; - }, - mounted: function () { - - } - }); - - BI.shortcut("demo.fix_inject", Parent); -}()); diff --git a/demo/js/fix-2.0/scene.js b/demo/js/fix-2.0/scene.js deleted file mode 100644 index 821da1d6f..000000000 --- a/demo/js/fix-2.0/scene.js +++ /dev/null @@ -1,445 +0,0 @@ -/** - * @Author: Young - * @CreationDate 2017-11-06 10:32 - * @Description - */ -(function () { - var model = Fix.define({ - groups: [{ - id: "27a9c8bf159e99e", - name: "功能数据", - packages: [{ - id: "82a96a4b03ac17e6", - name: "通信行业", - type: 1, - tables: [{ - id: "品类", - name: "品类", - connName: "BIDemo", - fields: [{ - id: "sd2ad2f343ca23", - name: "类别", - type: 32, - enable: true, - usable: true - }, { - id: "f34ds34aw2345w", - name: "描述", - type: 32, - enable: true, - usable: true - }] - }] - }] - }, { - id: "das2dw24214sa4", - name: "样式数据", - packages: [{ - id: "hi23i1o34a34we", - name: "零售行业", - type: 1, - tables: [{ - id: "销售记录", - name: "销售记录", - connName: "BIDemo", - fields: [{ - id: "wr213d24t345", - name: "分类", - type: 16, - enable: true, - usable: true - }, { - id: "faw134r24al344", - name: "金额", - type: 32, - enable: true, - usable: true - }] - }] - }, { - id: "fwr124f3453fa", - name: "地产行业", - tables: [{ - id: "开发商名称", - name: "开发商名称", - connName: "BIDemo", - fields: [{ - id: "sa13f345fg356", - name: "编号", - type: 32, - enable: true, - usable: true - }, { - id: "ad2r24tt232a22", - name: "名称", - type: 16, - enable: true, - usable: true - }] - }, { - id: "楼盘", - name: "楼盘", - connName: "BIDemo", - fields: [{ - id: "hfe3345fg356", - name: "编号", - type: 32, - enable: true, - usable: true - }, { - id: "kl224tt232a22", - name: "名称", - type: 16, - enable: true, - usable: true - }] - }] - }] - }], - fineIndexUpdate: { - needUpdate: false, - lastUpdate: 1509953199062 - } - }); - - Demo.FixScene = BI.inherit(BI.Widget, { - constant: { - TAB1: 1, - TAB2: 2 - }, - - _store: function () { - return model; - }, - - watch: { - "groups.*.name": function () { - this.fineIndexTab.setText("FineIndex更新(******* 分组名变化 需要更新 *******)"); - this.model.fineIndexUpdate.needUpdate = true; - }, - "groups.*.packages.*.name": function () { - this.fineIndexTab.setText("FineIndex更新(******* 业务包名变化 需要更新 *******)"); - this.model.fineIndexUpdate.needUpdate = true; - }, - "groups.*.packages.*.tables.*.name": function () { - this.fineIndexTab.setText("FineIndex更新(******* 表名变化 需要更新 *******)"); - this.model.fineIndexUpdate.needUpdate = true; - }, - "groups.*.packages.*.tables.*.fields.*.name": function () { - this.fineIndexTab.setText("FineIndex更新(******* 字段名变化 需要更新 *******)"); - this.model.fineIndexUpdate.needUpdate = true; - }, - "fineIndexUpdate.needUpdate": function (needUpdate) { - !needUpdate && this.fineIndexTab.setText("FineIndex更新"); - } - }, - - render: function () { - var self = this; - return { - type: "bi.tab", - showIndex: this.constant.TAB1, - single: true, - tab: { - type: "bi.button_group", - items: BI.createItems([{ - text: "业务包管理", - value: this.constant.TAB1 - }, { - text: "FineIndex更新", - value: this.constant.TAB2, - ref: function (ref) { - self.fineIndexTab = ref; - } - }], { - type: "bi.text_button", - cls: "bi-list-item-active", - height: 50 - }), - height: 50 - }, - cardCreator: BI.bind(this.cardCreator, this) - }; - }, - - cardCreator: function (v) { - switch (v) { - case this.constant.TAB1: - return { - type: "demo.fix_scene_data_manager", - data: this.model - }; - case this.constant.TAB2: - return { - type: "demo.fix_scene_fine_index_update" - }; - } - } - }); - BI.shortcut("demo.fix_scene", Demo.FixScene); - - Demo.FixSceneDataManager = BI.inherit(BI.Widget, { - _store: function () { - return this.options.data; - }, - - watch: { - "*.name": function () { - - } - }, - - render: function () { - var items = []; - BI.each(this.model.groups, function (i, group) { - items.push({ - type: "demo.fix_scene_group", - group: group - }); - }); - - return { - type: "bi.vertical", - items: [{ - type: "bi.left", - items: BI.createItems([{ - text: "分组名" - }, { - text: "业务包名" - }, { - text: "表名" - }, { - text: "字段名" - }], { - type: "bi.label", - cls: "layout-bg1", - width: 150 - }) - - }, { - type: "bi.vertical", - items: items - }], - vgap: 20, - hgap: 20 - }; - } - - }); - BI.shortcut("demo.fix_scene_data_manager", Demo.FixSceneDataManager); - - Demo.FixSceneGroup = BI.inherit(BI.Widget, { - props: { - group: {} - }, - - _store: function () { - return this.options.group; - }, - - render: function () { - var self = this; - var items = []; - BI.each(this.model.packages, function (i, child) { - items.push({ - type: "demo.fix_scene_package", - pack: child - }); - }); - return { - type: "bi.left", - items: [{ - type: "bi.sign_editor", - cls: "bi-border-bottom", - width: 100, - height: 30, - value: this.model.name, - listeners: [{ - eventName: BI.SignEditor.EVENT_CHANGE, - action: function () { - self.model.name = this.getValue(); - } - }] - }, { - type: "bi.vertical", - items: items - }], - hgap: 20 - }; - } - }); - BI.shortcut("demo.fix_scene_group", Demo.FixSceneGroup); - - - Demo.FixScenePackage = BI.inherit(BI.Widget, { - props: { - pack: {} - }, - - _store: function () { - return this.options.pack; - }, - - render: function () { - var self = this; - var items = []; - BI.each(this.model.tables, function (i, child) { - items.push({ - type: "demo.fix_scene_table", - table: child - }); - }); - return { - type: "bi.left", - items: [{ - type: "bi.sign_editor", - cls: "bi-border-bottom", - width: 100, - height: 30, - value: this.model.name, - listeners: [{ - eventName: BI.SignEditor.EVENT_CHANGE, - action: function () { - self.model.name = this.getValue(); - } - }] - }, { - type: "bi.vertical", - items: items - }], - hgap: 20 - }; - } - }); - BI.shortcut("demo.fix_scene_package", Demo.FixScenePackage); - - Demo.FixSceneTable = BI.inherit(BI.Widget, { - props: { - table: {} - }, - - _store: function () { - return this.options.table; - }, - - render: function () { - var self = this; - var items = []; - BI.each(this.model.fields, function (i, child) { - items.push({ - type: "demo.fix_scene_field", - field: child - }); - }); - return { - type: "bi.left", - items: [{ - type: "bi.sign_editor", - cls: "bi-border-bottom", - width: 100, - height: 30, - value: this.model.name, - listeners: [{ - eventName: BI.SignEditor.EVENT_CHANGE, - action: function () { - self.model.name = this.getValue(); - } - }] - }, { - type: "bi.vertical", - items: items - }], - hgap: 20 - }; - } - }); - BI.shortcut("demo.fix_scene_table", Demo.FixSceneTable); - - Demo.FixSceneField = BI.inherit(BI.Widget, { - props: { - field: {} - }, - - _store: function () { - return this.options.field; - }, - - render: function () { - var self = this; - return { - type: "bi.center_adapt", - items: [{ - type: "bi.sign_editor", - cls: "bi-border-bottom", - width: 100, - height: 30, - value: this.model.name, - listeners: [{ - eventName: BI.SignEditor.EVENT_CHANGE, - action: function () { - self.model.name = this.getValue(); - } - }] - }] - }; - } - }); - BI.shortcut("demo.fix_scene_field", Demo.FixSceneField); - - Demo.FixSceneFineIndexUpdateStore = BI.inherit(Fix.Model, { - _init: function () { - this.fineIndexUpdate = model.fineIndexUpdate; - }, - computed: { - text: function () { - return "立即更新(上次更新时间:" + BI.date2Str(new Date(this.fineIndexUpdate.lastUpdate), "yyyy-MM-dd HH:mm:ss") + ")"; - }, - needUpdate: function () { - return this.fineIndexUpdate.needUpdate; - } - }, - actions: { - updateFineIndex: function () { - this.fineIndexUpdate.needUpdate = false; - this.fineIndexUpdate.lastUpdate = new Date().getTime(); - } - } - }); - - Demo.FixSceneFineIndexUpdate = BI.inherit(BI.Widget, { - _store: function () { - return new Demo.FixSceneFineIndexUpdateStore(); - }, - - watch: { - needUpdate: function () { - this.button.setEnable(this.model.needUpdate); - }, - text: function () { - this.button.setText(this.model.text); - } - }, - - render: function () { - var self = this; - return { - type: "bi.center_adapt", - items: [{ - type: "bi.button", - text: this.model.text, - disabled: !this.model.needUpdate, - height: 30, - width: 360, - handler: function () { - self.store.updateFineIndex(); - }, - ref: function (ref) { - self.button = ref; - } - }] - }; - } - }); - BI.shortcut("demo.fix_scene_fine_index_update", Demo.FixSceneFineIndexUpdate); - -})(); \ No newline at end of file diff --git a/demo/js/fix-2.0/state.js b/demo/js/fix-2.0/state.js deleted file mode 100644 index ce33b7f0b..000000000 --- a/demo/js/fix-2.0/state.js +++ /dev/null @@ -1,49 +0,0 @@ -(function () { - var State = BI.inherit(Fix.Model, { - state: function () { - return { - name: "原始属性" - }; - }, - computed: { - b: function () { - return this.model.name + "-计算属性"; - } - } - }); - - Demo.Fix = BI.inherit(BI.Widget, { - _store: function () { - return new State(); - }, - watch: { - b: function () { - this.button.setText(this.model.b); - } - }, - render: function () { - var self = this; - return { - type: "bi.absolute", - items: [{ - el: { - type: "bi.button", - ref: function () { - self.button = this; - }, - handler: function () { - self.model.name = "这是改变后的属性"; - }, - text: this.model.b - } - }] - }; - }, - mounted: function () { - - - } - }); - - BI.shortcut("demo.fix_state", Demo.Fix); -}()); \ No newline at end of file diff --git a/demo/js/fix-2.0/store.js b/demo/js/fix-2.0/store.js deleted file mode 100644 index 188a5b906..000000000 --- a/demo/js/fix-2.0/store.js +++ /dev/null @@ -1,60 +0,0 @@ -(function () { - var model = Fix.define({ - name: "原始属性", - arr: [{ - n: "a" - }, { - n: "b" - }] - }); - - var Store = BI.inherit(Fix.Model, { - _init: function () { - }, - computed: { - b: function () { - return model.name + "-计算属性"; - } - }, - actions: { - run: function () { - model.name = "这是改变后的属性"; - } - } - }); - - Demo.Fix = BI.inherit(BI.Widget, { - _store: function () { - return new Store(); - }, - watch: { - b: function () { - this.button.setText(this.model.b); - } - }, - render: function () { - var self = this; - return { - type: "bi.absolute", - items: [{ - el: { - type: "bi.button", - ref: function () { - self.button = this; - }, - handler: function () { - self.store.run(); - }, - text: this.model.b - } - }] - }; - }, - mounted: function () { - - - } - }); - - BI.shortcut("demo.fix_store", Demo.Fix); -}()); \ No newline at end of file diff --git a/demo/js/fix-2.0/watcher.js b/demo/js/fix-2.0/watcher.js deleted file mode 100644 index 98716ed59..000000000 --- a/demo/js/fix-2.0/watcher.js +++ /dev/null @@ -1,51 +0,0 @@ -(function () { - var model = Fix.define({ - name: "原始属性", - arr: [{ - n: "a" - }, { - n: 0 - }] - }); - - Demo.Fix = BI.inherit(BI.Widget, { - _store: function () { - return model; - }, - watch: { - "name||arr.1.n": function () { - this.button.setText(this.model.name + "-" + this.model.arr[1].n); - } - }, - render: function () { - var self = this; - var cnt = 0; - return { - type: "bi.absolute", - items: [{ - el: { - type: "bi.button", - ref: function () { - self.button = this; - }, - handler: function () { - if (cnt & 1) { - self.model.name += 1; - } else { - self.model.arr[1].n += 1; - } - cnt++; - }, - text: this.model.name + "-" + this.model.arr[1].n - } - }] - }; - }, - mounted: function () { - - - } - }); - - BI.shortcut("demo.fix_watcher", Demo.Fix); -}()); \ No newline at end of file diff --git a/demo/js/index.js b/demo/js/index.js deleted file mode 100644 index 251e834a7..000000000 --- a/demo/js/index.js +++ /dev/null @@ -1,16 +0,0 @@ -export * from "./center"; -export * from "./face"; -export * from "./main"; -export * from "./main.store"; -export * from "./north"; -export * from "./preview"; -export * from "./router"; -export * from "./west"; - -export * from "./base"; -export * from "./case"; -export * from "./component"; -export * from "./config"; -export * from "./core"; -export * from "./fix-2.0"; -export * from "./widget"; \ No newline at end of file diff --git a/demo/js/main.js b/demo/js/main.js deleted file mode 100644 index e42ae5a08..000000000 --- a/demo/js/main.js +++ /dev/null @@ -1,62 +0,0 @@ -import { shortcut, Widget, Stores } from "@/core"; - -@shortcut() -export class Main extends Widget { - static xtype = "demo.main"; - - props = { baseCls: "demo-main bi-background" }; - - _store() { - return Stores.getStore("demo.store.main"); - } - - beforeInit(cb) { - this.store.init(cb); - } - - render() { - const self = this; - - return { - type: "bi.border", - items: { - north: { - height: 50, - el: { - type: "demo.north", - listeners: [ - { - eventName: Demo.North.EVENT_VALUE_CHANGE, - action (v) { - self.store.handleTreeSelectChange(v); - }, - } - ], - }, - }, - west: { - width: 230, - el: { - type: "demo.west", - listeners: [ - { - eventName: Demo.West.EVENT_VALUE_CHANGE, - action (v) { - self.store.handleTreeSelectChange(v); - }, - } - ], - }, - }, - center: { - el: { - type: "demo.center", - ref (_ref) { - self.center = _ref; - }, - }, - }, - }, - }; - } -} diff --git a/demo/js/main.store.js b/demo/js/main.store.js deleted file mode 100644 index 82d3b81df..000000000 --- a/demo/js/main.store.js +++ /dev/null @@ -1,65 +0,0 @@ -!(function () { - var Store = BI.inherit(Fix.Model, { - _init: function () { - - }, - - computed: {}, - - watch: {}, - - actions: { - init: function (cb) { - var tree = BI.Tree.transformToTreeFormat(Demo.CONFIG); - var traversal = function (array, callback) { - var t = []; - BI.some(array, function (i, item) { - var match = callback(i, item); - if (match) { - t.push(item.id); - } - var b = traversal(item.children, callback); - if (BI.isNotEmptyArray(b)) { - t = BI.concat([item.id], b); - } - }); - return t; - }; - var paths = traversal(tree, function (index, node) { - if (!node.children || BI.isEmptyArray(node.children)) { - if (node.value === Demo.showIndex) { - return true; - } - } - }); - BI.each(Demo.CONFIG, function (index, item) { - if (BI.contains(paths, item.id)) { - item.open = true; - } - }); - - cb(); - }, - - handleTreeSelectChange: function (v) { - var matched = BI.some(Demo.CONFIG, function (index, item) { - if (item.value === v) { - BI.Router.$router.push({ - name: "component", - params: { - componentId: item.value - } - }); - // BI.history.navigate(item.text, {trigger: true}); - return true; - } - }); - if (!matched) { - BI.Router.$router.push("/"); - // BI.history.navigate("", {trigger: true}); - } - } - } - }); - BI.store("demo.store.main", Store); -})(); diff --git a/demo/js/north.js b/demo/js/north.js deleted file mode 100644 index 90b9b1473..000000000 --- a/demo/js/north.js +++ /dev/null @@ -1,46 +0,0 @@ -Demo.North = BI.inherit(BI.Widget, { - props: { - baseCls: "demo-north" - }, - render: function () { - var self = this; - return { - type: "bi.htape", - items: [{ - width: 230, - el: { - type: "bi.text_button", - listeners: [{ - eventName: BI.Button.EVENT_CHANGE, - action: function () { - self.fireEvent(Demo.North.EVENT_VALUE_CHANGE, ""); - } - }], - cls: "logo", - height: 50, - text: "FineUI2.0" - } - }, { - el: { - type: "bi.right", - hgap: 10, - items: [{ - type: "bi.text_button", - text: "星空蓝", - handler: function () { - BI.$("html").removeClass("bi-theme-default").addClass("bi-theme-dark"); - } - }, { - type: "bi.text_button", - text: "典雅白", - handler: function () { - BI.$("html").removeClass("bi-theme-dark").addClass("bi-theme-default"); - } - }] - } - }] - }; - } -}); -Demo.North.EVENT_VALUE_CHANGE = "EVENT_VALUE_CHANGE"; -BI.shortcut("demo.north", Demo.North); \ No newline at end of file diff --git a/demo/js/preview.js b/demo/js/preview.js deleted file mode 100644 index d1fd6a27a..000000000 --- a/demo/js/preview.js +++ /dev/null @@ -1,95 +0,0 @@ -import { shortcut, Widget, isEqual } from "@/core"; - -@shortcut() -export class Preview extends Widget { - static xtype = "demo.preview"; - - props = { baseCls: "demo-preview" }; - - render() { - const self = this; - const items = [], - header = [], - columnSize = []; - - const rowCount = 100, - columnCount = 100; - for (var i = 0; i < 1; i++) { - header[i] = []; - for (var j = 0; j < columnCount; j++) { - header[i][j] = { - type: "bi.label", - text: `表头${i}-${j}`, - }; - columnSize[j] = 100; - } - } - for (var i = 0; i < rowCount; i++) { - items[i] = []; - for (var j = 0; j < columnCount; j++) { - items[i][j] = { - type: "bi.label", - text: `${i < 3 ? 0 : i}-${j}`, - }; - } - } - - return { - type: "bi.absolute", - cls: "preview-background", - items: [ - { - el: { - type: "bi.vtape", - cls: "preview-card bi-card", - items: [ - { - el: { - type: "bi.label", - cls: "preview-title bi-border-bottom", - height: 40, - text: "Card", - hgap: 10, - textAlign: "left", - }, - height: 40, - }, - { - type: "bi.center_adapt", - scrollable: true, - items: [ - { - type: "bi.resizable_table", - el: { - type: "bi.collection_table", - }, - width: 500, - height: 400, - isResizeAdapt: true, - isNeedResize: true, - isNeedMerge: true, - mergeCols: [0, 1], - mergeRule (col1, col2) { - return isEqual(col1, col2); - }, - isNeedFreeze: true, - freezeCols: [0, 1], - columnSize, - items, - header, - } - ], - } - ], - }, - left: 60, - right: 60, - top: 60, - bottom: 60, - } - ], - }; - } - - mounted() {} -} diff --git a/demo/js/router.js b/demo/js/router.js deleted file mode 100644 index 99ffb0e44..000000000 --- a/demo/js/router.js +++ /dev/null @@ -1,17 +0,0 @@ -import { shortcut, Widget } from "@/core"; - -@shortcut() -export class Router extends Widget { - static xtype = "demo.router"; - - props = { baseCls: "demo-router" }; - - render() { - const self = this; - const params = BI.Router.$router.history.current.params; - - return { - type: params.componentId, - }; - } -} diff --git a/demo/js/west.js b/demo/js/west.js deleted file mode 100644 index d2cd70109..000000000 --- a/demo/js/west.js +++ /dev/null @@ -1,77 +0,0 @@ -Demo.West = BI.inherit(BI.Widget, { - props: { - baseCls: "demo-west bi-border-right bi-card" - }, - - mounted: function () { - this.searcher.setAdapter(this.tree); - }, - - render: function () { - var self = this; - - - var selectedId = BI.Router.$router.currentRoute.params?.componentId; - - return { - type: "bi.vtape", - items: [{ - type: "bi.center_adapt", - items: [{ - type: "bi.searcher", - el: { - type: "bi.search_editor", - watermark: "简单搜索" - }, - width: 200, - isAutoSearch: false, - isAutoSync: false, - ref: function (ref) { - self.searcher = ref; - }, - popup: { - type: "bi.multilayer_single_level_tree", - cls: "bi-card", - listeners: [{ - eventName: BI.MultiLayerSingleLevelTree.EVENT_CHANGE, - action: function (v) { - self.fireEvent(Demo.West.EVENT_VALUE_CHANGE, v); - } - }] - }, - onSearch: function (op, callback) { - var result = BI.Func.getSearchResult(Demo.CONFIG, op.keyword, "text"); - var items = BI.concat(result.match, result.find); - var children = []; - BI.each(items, function (index, item) { - var childList = BI.Func.getSearchResult(Demo.CONFIG, item.id, "pId"); - BI.each(childList.match, function (index, child) { - if (child.value) { - children.push(child); - } - }); - }); - items = BI.concat(items, children); - callback(items); - } - }], - height: 40 - }, { - type: "bi.multilayer_single_level_tree", - listeners: [{ - eventName: BI.MultiLayerSingleLevelTree.EVENT_CHANGE, - action: function (v) { - self.fireEvent(Demo.West.EVENT_VALUE_CHANGE, v); - } - }], - value: selectedId || Demo.showIndex, - items: Demo.CONFIG, - ref: function (ref) { - self.tree = ref; - } - }] - }; - } -}); -Demo.West.EVENT_VALUE_CHANGE = "EVENT_VALUE_CHANGE"; -BI.shortcut("demo.west", Demo.West); diff --git a/demo/js/widget/basewidget/demo.buttons.js b/demo/js/widget/basewidget/demo.buttons.js deleted file mode 100644 index 33242f774..000000000 --- a/demo/js/widget/basewidget/demo.buttons.js +++ /dev/null @@ -1,87 +0,0 @@ -import { shortcut, Widget, each } from "@/core"; -import { Msg } from "@/base"; - -@shortcut() -export class Buttons extends Widget { - static xtype = "demo.buttons"; - - props = { baseCls: "demo-button" }; - - render() { - const items = [ - { - el: { - type: "bi.button", - text: "一般按钮", - level: "common", - height: 30, - }, - }, - { - el: { - type: "bi.button", - text: "带图标的按钮", - // level: 'ignore', - iconCls: "close-font", - height: 30, - }, - }, - { - el: { - type: "bi.button", - text: "一般按钮", - block: true, - level: "common", - height: 30, - }, - }, - { - el: { - type: "bi.button", - text: "一般按钮", - clear: true, - level: "common", - height: 30, - }, - }, - { - el: { - type: "bi.multi_select_bar", - selected: true, - halfSelected: true, - }, - }, - { - el: { - type: "bi.multi_select_bar", - selected: true, - halfSelected: false, - }, - }, - { - el: { - type: "bi.multi_select_bar", - selected: false, - halfSelected: true, - }, - }, - { - el: { - type: "bi.multi_select_bar", - }, - } - ]; - each(items, (i, item) => { - item.el.handler = function () { - Msg.alert("按钮", this.options.text); - }; - }); - - return { - type: "bi.left", - vgap: 100, - hgap: 20, - items, - }; - } -} diff --git a/demo/js/widget/basewidget/demo.items.js b/demo/js/widget/basewidget/demo.items.js deleted file mode 100644 index 113d50d8b..000000000 --- a/demo/js/widget/basewidget/demo.items.js +++ /dev/null @@ -1,43 +0,0 @@ -import { shortcut, Widget } from "@/core"; - -@shortcut() -export class Items extends Widget { - static xtype = "demo.items"; - - render() { - return { - type: "bi.vertical", - items: [ - { - type: "bi.text_button", - cls: "bi-list-item-select bi-high-light-border bi-border", - height: 30, - level: "warning", - text: "单选item", - }, - { - type: "bi.single_select_item", - text: "单选项", - }, - { - type: "bi.single_select_radio_item", - text: "单选项", - }, - { - type: "bi.label", - height: 30, - text: "复选item", - }, - { - type: "bi.multi_select_item", - text: "复选项", - }, - { - type: "bi.switch", - selected: true, - } - ], - hgap: 300, - }; - } -} diff --git a/demo/js/widget/basewidget/demo.nodes.js b/demo/js/widget/basewidget/demo.nodes.js deleted file mode 100644 index e8b5cc801..000000000 --- a/demo/js/widget/basewidget/demo.nodes.js +++ /dev/null @@ -1,41 +0,0 @@ -import { shortcut, Widget } from "@/core"; - -@shortcut() -export class Nodes extends Widget { - static xtype = "demo.nodes"; - - render(vessel) { - return { - type: "bi.vertical", - items: [ - { - type: "bi.label", - height: 30, - text: "十字形的节点", - }, - { - type: "bi.plus_group_node", - text: "十字形的节点", - }, - { - type: "bi.label", - height: 30, - text: "箭头节点", - }, - { - type: "bi.arrow_group_node", - text: "箭头节点", - }, - { - type: "bi.icon_arrow_node", - iconCls: "search-font", - text: "箭头图标节点", - }, - { - type: "bi.multilayer_icon_arrow_node", - layer: 2, - } - ], - }; - } -} diff --git a/demo/js/widget/basewidget/demo.sagments.js b/demo/js/widget/basewidget/demo.sagments.js deleted file mode 100644 index 3cd9b5c20..000000000 --- a/demo/js/widget/basewidget/demo.sagments.js +++ /dev/null @@ -1,40 +0,0 @@ -import { shortcut, Widget } from "@/core"; - -@shortcut() -export class Segments extends Widget { - static xtype = "demo.segments"; - - render() { - return { - type: "bi.vertical", - items: [ - { - type: "bi.label", - height: 30, - text: "默认风格", - }, - { - type: "bi.segment", - items: [ - { - text: "tab1", - value: 1, - selected: true, - }, - { - text: "tab2", - value: 2, - }, - { - text: "tab3 disabled", - disabled: true, - value: 3, - } - ], - } - ], - hgap: 50, - vgap: 20, - }; - } -} diff --git a/demo/js/widget/basewidget/demo.tips.js b/demo/js/widget/basewidget/demo.tips.js deleted file mode 100644 index 150b9ce72..000000000 --- a/demo/js/widget/basewidget/demo.tips.js +++ /dev/null @@ -1,164 +0,0 @@ -import { shortcut, Widget, createWidget, each } from "@/core"; -import { Bubbles, Msg } from "@/base"; - -@shortcut() -export class Tips extends Widget { - static xtype = "demo.tips"; - - props = { baseCls: "demo-tips" }; - - render() { - const btns = []; - const bubble = createWidget({ - type: "bi.left", - items: [ - { - el: { - type: "bi.button", - text: "bubble测试", - height: 30, - handler() { - Bubbles.show("singleBubble1", "bubble测试", this); - btns.push("singleBubble1"); - }, - }, - }, - { - el: { - type: "bi.button", - text: "bubble测试(居中显示)", - height: 30, - handler() { - Bubbles.show("singleBubble2", "bubble测试", this, { - offsetStyle: "center", - }); - btns.push("singleBubble2"); - }, - }, - }, - { - el: { - type: "bi.button", - text: "bubble测试(右边显示)", - height: 30, - handler() { - Bubbles.show("singleBubble3", "bubble测试", this, { - offsetStyle: "right", - }); - btns.push("singleBubble3"); - }, - }, - }, - { - el: { - type: "bi.button", - text: "隐藏所有 bubble", - height: 30, - cls: "layout-bg2", - handler() { - each(btns, (index, value) => { - Bubbles.hide(value); - }); - }, - }, - } - ], - hgap: 20, - }); - - const title = createWidget({ - type: "bi.vertical", - items: [ - { - type: "bi.label", - cls: "layout-bg1", - height: 50, - title: "title提示", - text: "移上去有title提示", - textAlign: "center", - }, - { - type: "bi.label", - cls: "layout-bg6", - height: 50, - disabled: true, - warningTitle: "title错误提示", - text: "移上去有title错误提示", - textAlign: "center", - }, - { - type: "bi.label", - cls: "layout-bg2", - height: 50, - disabled: true, - tipType: "success", - title: "自定义title提示效果", - warningTitle: "自定义title提示效果", - text: "自定义title提示效果", - textAlign: "center", - } - ], - hgap: 20, - vgap: 20, - }); - - const toast = createWidget({ - type: "bi.vertical", - items: [ - { - el: { - type: "bi.button", - text: "简单Toast测试", - height: 30, - handler() { - Msg.toast("这是一条简单的数据"); - }, - }, - }, - { - el: { - type: "bi.button", - text: "很长的Toast测试", - height: 30, - handler() { - Msg.toast( - "这是一条很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长的数据" - ); - }, - }, - }, - { - el: { - type: "bi.button", - text: "非常长的Toast测试", - height: 30, - handler() { - Msg.toast( - "这是一条非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长的数据" - ); - }, - }, - }, - { - el: { - type: "bi.button", - text: "错误提示Toast测试", - level: "warning", - height: 30, - handler() { - Msg.toast("错误提示Toast测试", "warning"); - }, - }, - } - ], - vgap: 20, - }); - - return { - type: "bi.horizontal_auto", - vgap: 20, - hgap: 20, - items: [bubble, title, toast], - }; - } -} diff --git a/demo/js/widget/basewidget/index.js b/demo/js/widget/basewidget/index.js deleted file mode 100644 index 48de6947f..000000000 --- a/demo/js/widget/basewidget/index.js +++ /dev/null @@ -1,5 +0,0 @@ -export * from "./demo.buttons"; -export * from "./demo.items"; -export * from "./demo.nodes"; -export * from "./demo.sagments"; -export * from "./demo.tips"; \ No newline at end of file diff --git a/demo/js/widget/collapase/API.md b/demo/js/widget/collapase/API.md deleted file mode 100644 index 2ba16aa32..000000000 --- a/demo/js/widget/collapase/API.md +++ /dev/null @@ -1,12 +0,0 @@ -## API - -### bi.collapse - -| 参数 | 说明 | 类型 | 默认值 | -| ---------- | ---------- | ------- | -------------------- | -| accordion | 手风琴模式 | boolean | false | -| bordered | 带边框风格的折叠面板 | boolean | true | -| ghost | 使折叠面板透明且无边框 | boolean | false | -| openMotion | 展开动画 | object | { animation: "bi-slide-up", animationDuring: 100} -| value | 初始化选中面板的 key | string\[]
number\[] | - | -| listeners | 监听切换面板事件 | [{eventName: "EVENT_EXPAND", action:(activeKey) => void}] | - | diff --git a/demo/js/widget/collapase/demo.collapse.js b/demo/js/widget/collapase/demo.collapse.js deleted file mode 100644 index 9218b87db..000000000 --- a/demo/js/widget/collapase/demo.collapse.js +++ /dev/null @@ -1,74 +0,0 @@ -import { shortcut, Widget, createItems } from "@/core"; - -@shortcut() -export class Collapse extends Widget { - static xtype = "demo.collapse"; - - props = { baseCls: "demo-collapse" }; - - render() { - const self = this; - - const items = [ - { - value: "test", - popup: { - cls: "mvc-border", - items: createItems( - [ - { - text: "项目1", - value: 1, - }, - { - text: "项目2", - value: 2, - }, - { - text: "项目3", - value: 3, - }, - { - text: "项目4", - value: 4, - } - ], - { - type: "bi.single_select_item", - height: 25, - } - ), - }, - }, - { - value: 2, - popup: { - type: "bi.label", - value: "给岁月以文明,而不是给文明以岁月", - }, - }, - { - value: 3, - popup: { - type: "bi.label", - value: "漂流瓶隐没于黑暗里,在一千米见方的宇宙中,只有生态球里的小太阳发出一点光芒。在这个小小的生命世界中,几只清澈的水球在零重力环境中静静地飘浮着,有一条小鱼从一只水球中蹦出,跃入另一只水球,轻盈地穿游于绿藻之间。", - }, - } - ]; - - return { - type: "bi.vertical", - items: [ - { - type: "bi.collapse", - accordion: true, - items, - value: [2], - } - ], - width: "60%", - tgap: 100, - hgap: 100, - }; - } -} diff --git a/demo/js/widget/collapase/index.js b/demo/js/widget/collapase/index.js deleted file mode 100644 index 4bbdbc7d5..000000000 --- a/demo/js/widget/collapase/index.js +++ /dev/null @@ -1 +0,0 @@ -export * from "./demo.collapse"; \ No newline at end of file diff --git a/demo/js/widget/date/demo.datepane.js b/demo/js/widget/date/demo.datepane.js deleted file mode 100644 index c879484db..000000000 --- a/demo/js/widget/date/demo.datepane.js +++ /dev/null @@ -1,93 +0,0 @@ -import { shortcut, Widget } from "@/core"; -import { Msg } from "@/base"; - -@shortcut() -export class DatePane extends Widget { - static xtype = "demo.date_pane"; - - props = { baseCls: "demo-datepane" }; - - render() { - const self = this; - - return { - type: "bi.horizontal_auto", - items: [ - { - type: "bi.vertical", - vgap: 10, - items: [ - { - type: "bi.label", - cls: "layout-bg2", - text: "bi.date_pane", - }, - { - type: "bi.dynamic_date_pane", - // value: { - // type: 1, - // value: { - // year: 2017, - // month: 12, - // day: 11 - // } - // }, - ref (_ref) { - self.datepane = _ref; - }, - height: 300, - }, - { - type: "bi.button", - text: "getValue", - handler () { - Msg.toast(`date${JSON.stringify(self.datepane.getValue())}`); - }, - }, - { - type: "bi.dynamic_date_time_pane", - value: { - type: 1, - value: { - year: 2017, - month: 12, - day: 11, - hour: 12, - minute: 12, - second: 12, - }, - }, - ref (_ref) { - self.dateTimePane = _ref; - }, - height: 340, - }, - { - type: "bi.button", - text: "getValue", - handler () { - Msg.toast(`date${JSON.stringify(self.dateTimePane.getValue())}`); - }, - }, - { - type: "bi.button", - text: "setValue '2017-12-31'", - handler () { - self.datepane.setValue({ - year: 2017, - month: 12, - day: 31, - }); - }, - } - ], - width: "50%", - } - ], - }; - } - - mounted() { - this.datepane.setValue(); // 不设value值表示当前时间 - } -} diff --git a/demo/js/widget/date/demo.multidate_combo.js b/demo/js/widget/date/demo.multidate_combo.js deleted file mode 100644 index 3cbb99ff0..000000000 --- a/demo/js/widget/date/demo.multidate_combo.js +++ /dev/null @@ -1,111 +0,0 @@ -import { shortcut, Widget } from "@/core"; -import { Msg } from "@/base"; - -@shortcut() -export class Date extends Widget { - static xtype = "demo.multidate_combo"; - - props = { baseCls: "demo-date" }; - - _init() { - Demo.Date.superclass._init.apply(this, arguments); - } - - render() { - const self = this; - - return { - type: "bi.horizontal_auto", - vgap: 20, - items: [ - { - type: "bi.dynamic_date_combo", - ref() { - self.datecombo = this; - }, - width: 300, - // allowEdit: false, - // format: "%Y-%X-%d", // yyyy-MM-dd - // format: "%Y/%X/%d", // yyyy/MM/dd - // format: "%Y-%x-%e", // yyyy-M-d - // format: "%Y/%x/%e", // yyyy/M/d - // format: "%X/%d/%Y", // MM/dd/yyyy - // format: "%X/%e/%y", // MM/d/yy - // format: "%X.%d.%Y", // MM.dd.yyyy - // format: "%X.%e.%Y", // MM.d.yyyy - // format: "%X-%e-%y", // MM.d.yyyy - value: { - type: 1, - value: { - year: 2018, - month: 2, - day: 23, - }, - }, - }, - { - type: "bi.button", - text: "getValue", - width: 300, - handler() { - Msg.alert("date", JSON.stringify(self.datecombo.getValue())); - }, - }, - { - type: "bi.dynamic_date_time_combo", - ref() { - self.datetimecombo = this; - }, - width: 300, - // allowEdit: false, - // format: "%Y-%X-%d %H:%M:%S", // yyyy-MM-dd HH:mm:ss - // format: "%Y/%X/%d %H:%M:%S", // yyyy/MM/dd HH:mm:ss - // format: "%Y-%X-%d %I:%M:%S", // yyyy-MM-dd hh:mm:ss - // format: "%Y/%X/%d %I:%M:%S", // yyyy/MM/dd hh:mm:ss - // format: "%Y-%X-%d %H:%M:%S %p", // yyyy-MM-dd HH:mm:ss a - // format: "Y/%X/%d %H:%M:%S %p", // yyyy/MM/dd HH:mm:ss a - // format: "%Y-%X-%d %I:%M:%S %p", // yyyy-MM-dd hh:mm:ss a - // format: "%Y/%X/%d %I:%M:%S %p", // yyyy/MM/dd hh:mm:ss a - // format: "%X/%d/%Y %I:%M:%S", // MM/dd/yyyy hh:mm:ss - // format: "%X/%d/%Y %H:%M:%S", // MM/dd/yyyy HH:mm:ss - // format: "%X/%d/%Y %I:%M:%S", // MM/dd/yyyy hh:mm:ss a - // format: "%X/%d/%Y %H:%M:%S %p", // MM/dd/yyyy HH:mm:ss a - // format: "%X/%d/%Y %I:%M:%S %p", // MM/dd/yyyy hh:mm:ss a - // format: "%X/%d/%Y %H:%M:%S %p", // MM/dd/yyyy HH:mm:ss a - // format: "%X/%d/%Y %l:%M %p", // MM/dd/yyyy h:mm a - // format: "%X-%d-%Y %k:%M %p", // MM/dd/yyyy H:mm a - // format: "%Y-%x-%e %l:%M", // yyyy-M-d h:mm - // format: "%Y-%x-%e %k:%M", // yyyy-M-d H:mm - value: { - type: 1, - value: { - year: 2018, - month: 2, - day: 23, - }, - }, - }, - { - type: "bi.button", - text: "getValue", - width: 300, - handler() { - Msg.alert("date", JSON.stringify(self.datetimecombo.getValue())); - }, - }, - { - type: "bi.button", - text: "setValue '2017-12-31'", - width: 300, - handler() { - self.datecombo.setValue({ - year: 2017, - month: 11, - day: 31, - }); - }, - } - ], - }; - } -} diff --git a/demo/js/widget/datetime/demo.datetime.js b/demo/js/widget/datetime/demo.datetime.js deleted file mode 100644 index da6b22f47..000000000 --- a/demo/js/widget/datetime/demo.datetime.js +++ /dev/null @@ -1,57 +0,0 @@ -import { shortcut, Widget, print } from "@/core"; -import { Msg } from "@/base"; -import { DateTimeCombo } from "@/widget"; - -@shortcut() -export class CustomDateTime extends Widget { - static xtype = "demo.date_time"; - - props = {}; - - render() { - const self = this; - - return { - type: "bi.absolute", - items: [ - { - el: { - type: "bi.date_time_combo", - listeners: [ - { - eventName: DateTimeCombo.EVENT_CONFIRM, - action() { - const value = this.getValue(); - const date = new Date( - value.year, - value.month - 1, - value.day, - value.hour, - value.minute, - value.second - ); - const dateStr = print(date, "%Y-%X-%d %H:%M:%S"); - Msg.alert("日期", dateStr); - }, - }, - { - eventName: DateTimeCombo.EVENT_CANCEL, - action() {}, - } - ], - value: { - year: 2017, - month: 2, - day: 23, - hour: 12, - minute: 11, - second: 1, - }, - }, - top: 200, - left: 200, - } - ], - }; - } -} diff --git a/demo/js/widget/downlist/demo.downlist.icon.js b/demo/js/widget/downlist/demo.downlist.icon.js deleted file mode 100644 index 23bca0db3..000000000 --- a/demo/js/widget/downlist/demo.downlist.icon.js +++ /dev/null @@ -1,13 +0,0 @@ -import { shortcut, Widget } from "@/core"; - -@shortcut() -export class CustomIcon extends Widget { - static xtype = "demo.downlist.icon"; - - render() { - return { - type: "bi.label", - text: "✨", - }; - } -} diff --git a/demo/js/widget/downlist/demo.downlist.js b/demo/js/widget/downlist/demo.downlist.js deleted file mode 100644 index 4ac1d0936..000000000 --- a/demo/js/widget/downlist/demo.downlist.js +++ /dev/null @@ -1,267 +0,0 @@ -import { shortcut, Widget, i18nText } from "@/core"; -import { DownListCombo } from "@/widget"; - -@shortcut() -export class Downlist extends Widget { - static xtype = "demo.down_list"; - - props = { baseCls: "demo-downlist" }; - - mounted() { - const downlist = this.downlist; - const label = this.label; - this.downlist.setValue([ - { - value: [11, 6], - childValue: 67, - } - ]); - downlist.on(DownListCombo.EVENT_CHANGE, (value, fatherValue) => { - label.setValue(JSON.stringify(downlist.getValue())); - }); - - this.downlist.on(DownListCombo.EVENT_SON_VALUE_CHANGE, (value, fatherValue) => { - label.setValue(JSON.stringify(downlist.getValue())); - }); - } - - render() { - const self = this; - - return { - type: "bi.left", - items: [ - { - type: "bi.down_list_combo", - ref (_ref) { - self.downlist = _ref; - }, - // value: [{"childValue":22,"value":11},{"value":18},{"value":20}], - height: 30, - width: 100, - items: [ - [ - { - text: "column 1111", - iconCls1: "dot-e-font", - value: 12, - children: [ - { - text: "column 1.1", - value: 21, - cls: "dot-e-font", - }, - { - text: "column 1.2", - value: 22, - cls: "dot-e-font", - } - ], - } - ], - [ - { - el: { - text: "column 1111", - iconCls1: "dot-e-font", - value: 11, - }, - children: [ - { - text: "column 1.1", - value: 21, - cls: "dot-e-font", - }, - { - text: "column 1.2", - value: 22, - cls: "dot-e-font", - } - ], - // children: [{ - // text: i18nText("BI-Basic_None"), - // cls: "dot-e-font", - // value: 1 - // }, { - // text: i18nText("BI-Basic_Calculate_Same_Period"), - // cls: "dot-e-font", - // value: 2 - // }, { - // text: i18nText("BI-Basic_Calculate_Same_Ring"), - // cls: "dot-e-font", - // value: 3 - // }, { - // text: i18nText("BI-Basic_Calculate_Same_Period_Rate"), - // cls: "dot-e-font", - // value: 4 - // }, { - // text: i18nText("BI-Basic_Calculate_Same_Ring_Rate"), - // cls: "dot-e-font", - // value: 5 - // }, { - // el: { - // text: i18nText("BI-Basic_Rank"), - // iconCls1: "dot-e-font", - // value: 6 - // }, - // children: [{ - // text: "test1", - // cls: "dot-e-font", - // value: 67 - // }, { - // text: "test2", - // cls: "dot-e-font", - // value: 68 - // }] - // }, { - // text: i18nText("BI-Basic_Rank_In_Group"), - // cls: "dot-e-font", - // value: 7 - // }, { - // text: i18nText("BI-Basic_Sum_Of_All"), - // cls: "dot-e-font", - // value: 8 - // }, { - // text: i18nText("BI-Basic_Sum_Of_All_In_Group"), - // cls: "dot-e-font", - // value: 9 - // }, { - // text: i18nText("BI-Basic_Sum_Of_Above"), - // cls: "dot-e-font", - // value: 10 - // }, { - // text: i18nText("BI-Basic_Sum_Of_Above_In_Group"), - // cls: "dot-e-font", - // value: 11 - // }, { - // text: i18nText("BI-Design_Current_Dimension_Percent"), - // cls: "dot-e-font", - // value: 12 - // }, { - // text: i18nText("BI-Design_Current_Target_Percent"), - // cls: "dot-e-font", - // value: 13 - // }] - } - ] - ], - }, - { - type: "bi.down_list_combo", - el: { - type: "bi.button", - ghost: true, - iconPosition: "right", - icon: "column-next-page-h-font", - text: "自定义 trigger 和 icon 的级联下拉框", - }, - listeners: [ - { - eventName: "EVENT_CHANGE", - action (v) { - console.log("触发值", v); - }, - }, - { - eventName: "EVENT_SON_VALUE_CHANGE", - action (v) { - console.log("二级菜单触发值", v); - }, - } - ], - items: [ - [ - { - text: "选项一", - value: 1, - icon: { - type: "demo.downlist.icon", - }, - children: [ - { - text: "选项一", - value: 11, - icon: { - type: "demo.downlist.icon", - }, - }, - { - text: "选项二", - value: 12, - } - ], - }, - { - text: "选项二", - value: 2, - } - ] - ], - }, - { - type: "bi.multi_layer_down_list_combo", - ref (_ref) { - self.downlist = _ref; - }, - // value: [{"childValue":22,"value":11},{"value":18},{"value":20}], - height: 30, - width: 100, - items: [ - [ - { - el: { - text: "column 1111", - iconCls1: "dot-e-font", - value: 12, - }, - children: [ - { - text: "column 1.1", - value: 21, - cls: "dot-e-font", - }, - { - text: "column 1.2", - value: 22, - cls: "dot-e-font", - } - ], - } - ], - [ - { - el: { - text: "column 1111", - iconCls1: "dot-e-font", - value: 11, - }, - children: [ - { - text: "column 1.1", - value: 21, - cls: "dot-e-font", - }, - { - text: "column 1.2", - value: 22, - cls: "dot-e-font", - } - ], - } - ] - ], - }, - { - type: "bi.label", - text: "显示选择值", - width: 500, - cls: "layout-bg3", - ref (_ref) { - self.label = _ref; - }, - } - ], - vgap: 20, - }; - } -} diff --git a/demo/js/widget/editor/demo.search_editor.js b/demo/js/widget/editor/demo.search_editor.js deleted file mode 100644 index 0b0b516cc..000000000 --- a/demo/js/widget/editor/demo.search_editor.js +++ /dev/null @@ -1,31 +0,0 @@ -import { shortcut, Widget } from "@/core"; - -@shortcut() -export class SearchEditor extends Widget { - static xtype = "demo.search_editor"; - - props = { baseCls: "demo-exceltable" }; - - render() { - return { - type: "bi.horizontal_auto", - items: [ - { - type: "bi.search_editor", - width: 300, - watermark: "添加合法性判断", - errorText: "长度必须大于4", - validationChecker() { - return this.getValue().length > 4; - }, - }, - { - type: "bi.small_search_editor", - width: 300, - watermark: "这个是 small,小一号", - } - ], - vgap: 20, - }; - } -} diff --git a/demo/js/widget/editor/demo.text_editor.js b/demo/js/widget/editor/demo.text_editor.js deleted file mode 100644 index 231beb714..000000000 --- a/demo/js/widget/editor/demo.text_editor.js +++ /dev/null @@ -1,29 +0,0 @@ -import { shortcut, Widget } from "@/core"; - -@shortcut() -export class TextEditor extends Widget { - static xtype = "demo.text_editor"; - - props = { baseCls: "demo-exceltable" }; - - render() { - return { - type: "bi.horizontal_auto", - items: [ - { - type: "bi.text_editor", - watermark: "这是水印,watermark", - width: 300, - }, - { - type: "bi.text_editor", - watermark: "这个不予许空", - allowBlank: false, - errorText: "非空!", - width: 300, - } - ], - vgap: 20, - }; - } -} diff --git a/demo/js/widget/index.js b/demo/js/widget/index.js deleted file mode 100644 index db5525e6e..000000000 --- a/demo/js/widget/index.js +++ /dev/null @@ -1,23 +0,0 @@ -export * from "./basewidget"; -export * from "./collapase"; -export * from "./date"; -export * from "./datetime"; -export * from "./downlist"; -export * from "./editor"; -export * from "./multiselect"; -export * from "./multiselect"; -export * from "./multitree"; -export * from "./numbereditor"; -export * from "./numberinterval"; -export * from "./selecttree"; -export * from "./singleselct"; -export * from "./slider"; -export * from "./timecombo"; -export * from "./timeinterval"; -export * from "./tree"; -export * from "./year"; -export * from "./yearinterval"; -export * from "./yearmonth"; -export * from "./yearmonthinterval"; -export * from "./yearquarter"; -export * from "./yearquarterinterval"; \ No newline at end of file diff --git a/demo/js/widget/multiselect/demo.multi_select_combo.js b/demo/js/widget/multiselect/demo.multi_select_combo.js deleted file mode 100644 index e6483ffae..000000000 --- a/demo/js/widget/multiselect/demo.multi_select_combo.js +++ /dev/null @@ -1,96 +0,0 @@ -import { shortcut, Widget, Func, createWidget, bind, each, makeObject, filter, delay } from "@/core"; -import { Msg } from "@/base"; - -@shortcut() -export class MultiSelectCombo extends Widget { - static xtype = "demo.multi_select_combo"; - - props = { baseCls: "demo-multi-select-combo" }; - - _createMultiSelectCombo() { - const self = this; - const widget = createWidget({ - type: "bi.multi_select_insert_combo", - // allowEdit: false, - itemsCreator: bind(this._itemsCreator, this), - width: 200, - value: { - type: 1, - value: [ - "柳州市城贸金属材料有限责任公司", - "柳州市建福房屋租赁有限公司", - "柳州市迅昌数码办公设备有限责任公司" - ], - }, - }); - - widget.on(MultiSelectCombo.EVENT_CONFIRM, function () { - Msg.toast(JSON.stringify(this.getValue())); - }); - - return widget; - } - - _getItemsByTimes(items, times) { - const res = []; - for (let i = (times - 1) * 100; items[i] && i < times * 100; i++) { - res.push(items[i]); - } - - return res; - } - - _hasNextByTimes(items, times) { - return times * 100 < items.length; - } - - _itemsCreator(options, callback) { - const self = this; - let items = Demo.CONSTANTS.ITEMS; - const keywords = (options.keywords || []).slice(); - if (options.keyword) { - keywords.push(options.keyword); - } - each(keywords, (i, kw) => { - const search = Func.getSearchResult(items, kw); - items = search.match.concat(search.find); - }); - if (options.selectedValues) { - // 过滤 - const filter = makeObject(options.selectedValues, true); - items = filter(items, (i, ob) => !filter[ob.value]); - } - if (options.type == MultiSelectCombo.REQ_GET_ALL_DATA) { - callback({ - items, - }); - - return; - } - if (options.type == MultiSelectCombo.REQ_GET_DATA_LENGTH) { - callback({ count: items.length }); - - return; - } - delay(() => { - callback({ - items: self._getItemsByTimes(items, options.times), - hasNext: self._hasNextByTimes(items, options.times), - }); - }, 1000); - } - - render() { - return { - type: "bi.absolute", - scrolly: false, - items: [ - { - el: this._createMultiSelectCombo(), - right: "50%", - top: 10, - } - ], - }; - } -} diff --git a/demo/js/widget/multiselect/demo.multi_select_list.js b/demo/js/widget/multiselect/demo.multi_select_list.js deleted file mode 100644 index 87254dd1c..000000000 --- a/demo/js/widget/multiselect/demo.multi_select_list.js +++ /dev/null @@ -1,104 +0,0 @@ -import { shortcut, Widget, createWidget, Func, bind, each, makeObject, filter, delay } from "@/core"; -import { Msg } from "@/base"; -import { MultiSelectCombo } from "@/widget"; - -@shortcut() -export class MultiSelectList extends Widget { - static xtype = "demo.multi_select_list"; - - props = { baseCls: "demo-multi-select-combo" }; - - mounted() { - this.list.populate(); - } - - _createMultiSelectCombo() { - const self = this; - const widget = createWidget({ - type: "bi.multi_select_insert_list", - ref(ref) { - self.list = ref; - }, - itemsCreator: bind(this._itemsCreator, this), - value: { - type: 1, - value: [ - "柳州市城贸金属材料有限责任公司", - "柳州市建福房屋租赁有限公司", - "柳州市迅昌数码办公设备有限责任公司" - ], - }, - }); - - widget.on(MultiSelectCombo.EVENT_CONFIRM, function () { - Msg.toast(JSON.stringify(this.getValue())); - }); - - return widget; - } - - _getItemsByTimes(items, times) { - const res = []; - for (let i = (times - 1) * 10; items[i] && i < times * 10; i++) { - res.push(items[i]); - } - - return res; - } - - _hasNextByTimes(items, times) { - return times * 10 < items.length; - } - - _itemsCreator(options, callback) { - const self = this; - let items = Demo.CONSTANTS.ITEMS; - const keywords = (options.keywords || []).slice(); - if (options.keyword) { - keywords.push(options.keyword); - } - each(keywords, (i, kw) => { - const search = Func.getSearchResult(items, kw); - items = search.match.concat(search.find); - }); - if (options.selectedValues) { - // 过滤 - const filter = makeObject(options.selectedValues, true); - items = filter(items, (i, ob) => !filter[ob.value]); - } - if (options.type == MultiSelectCombo.REQ_GET_ALL_DATA) { - callback({ - items, - }); - - return; - } - if (options.type == MultiSelectCombo.REQ_GET_DATA_LENGTH) { - callback({ count: items.length }); - - return; - } - delay(() => { - callback({ - items: self._getItemsByTimes(items, options.times), - hasNext: self._hasNextByTimes(items, options.times), - }); - }, 1000); - } - - render() { - return { - type: "bi.absolute", - scrolly: false, - items: [ - { - el: this._createMultiSelectCombo(), - top: 50, - left: 50, - right: 50, - bottom: 50, - } - ], - }; - } -} diff --git a/demo/js/widget/multitree/demo.multi_tree_combo.js b/demo/js/widget/multitree/demo.multi_tree_combo.js deleted file mode 100644 index b6b9fcbbb..000000000 --- a/demo/js/widget/multitree/demo.multi_tree_combo.js +++ /dev/null @@ -1,67 +0,0 @@ -import { shortcut, Widget, deepClone } from "@/core"; -import { Msg } from "@/base"; -import { TreeView } from "@/case"; - -@shortcut() -export class MultiTreeCombo extends Widget { - static xtype = "demo.multi_tree_combo"; - - props = { baseCls: "" }; - - render() { - const self = this; - const items = deepClone(Demo.CONSTANTS.TREE); - - return { - type: "bi.horizontal_auto", - items: [ - { - type: "bi.multi_tree_combo", - ref(_ref) { - self.tree = _ref; - }, - itemsCreator(options, callback) { - console.log(options); - // 根据不同的类型处理相应的结果 - switch (options.type) { - case TreeView.REQ_TYPE_INIT_DATA: - break; - case TreeView.REQ_TYPE_ADJUST_DATA: - break; - case TreeView.REQ_TYPE_SELECT_DATA: - break; - case TreeView.REQ_TYPE_GET_SELECTED_DATA: - break; - default: - break; - } - callback({ - items, - }); - }, - width: 300, - value: { - 根目录: {}, - }, - listeners: [ - { - eventName: "EVENT_CONFIRM", - action() { - console.log("EVENT_CONFIRM", this.getValue()); - }, - } - ], - }, - { - type: "bi.button", - text: "getValue", - handler() { - Msg.toast(JSON.stringify(self.tree.getValue())); - }, - width: 300, - } - ], - vgap: 20, - }; - } -} diff --git a/demo/js/widget/multitree/demo.multi_tree_list.js b/demo/js/widget/multitree/demo.multi_tree_list.js deleted file mode 100644 index 836a32b6e..000000000 --- a/demo/js/widget/multitree/demo.multi_tree_list.js +++ /dev/null @@ -1,73 +0,0 @@ -import { shortcut, Widget, deepClone } from "@/core"; -import { Msg } from "@/base"; -import { TreeView } from "@/case"; - -@shortcut() -export class MultiTreeCombo extends Widget { - static xtype = "demo.multi_select_tree"; - - props = { baseCls: "" }; - - mounted() { - this.tree.populate(); - } - - render() { - const self = this; - const items = deepClone(Demo.CONSTANTS.TREE); - - return { - type: "bi.absolute", - items: [ - { - el: { - type: "bi.multi_select_tree", - ref(_ref) { - self.tree = _ref; - }, - itemsCreator(options, callback) { - console.log(options); - // 根据不同的类型处理相应的结果 - switch (options.type) { - case TreeView.REQ_TYPE_INIT_DATA: - break; - case TreeView.REQ_TYPE_ADJUST_DATA: - break; - case TreeView.REQ_TYPE_SELECT_DATA: - break; - case TreeView.REQ_TYPE_GET_SELECTED_DATA: - break; - default: - break; - } - callback({ - items: deepClone(items), - }); - }, - width: 300, - value: { - 根目录: {}, - }, - }, - top: 50, - bottom: 50, - left: 50, - right: 50, - }, - { - el: { - type: "bi.button", - height: 30, - text: "getValue", - handler() { - Msg.toast(JSON.stringify(self.tree.getValue())); - }, - }, - left: 50, - right: 50, - bottom: 20, - } - ], - }; - } -} diff --git a/demo/js/widget/numbereditor/demo.number_editor.js b/demo/js/widget/numbereditor/demo.number_editor.js deleted file mode 100644 index 898a57bf8..000000000 --- a/demo/js/widget/numbereditor/demo.number_editor.js +++ /dev/null @@ -1,67 +0,0 @@ -import { shortcut, Widget, createWidget, parseFloat } from "@/core"; -import { Msg } from "@/base"; -import { NumberEditor } from "@/widget"; - -@shortcut() -export class FileManager extends Widget { - static xtype = "demo.number_editor"; - - props = { baseCls: "" }; - - render() { - const editor1 = createWidget({ - type: "bi.number_editor", - validationChecker(v) { - return parseFloat(v) <= 100 && parseFloat(v) >= 0; - }, - height: 24, - width: 150, - errorText: "hahah", - watermark: "每个人都是自己健康的第一责任人", - }); - editor1.on(NumberEditor.EVENT_CHANGE, function () { - if (parseFloat(this.getValue()) < 1) { - editor1.setDownEnable(false); - } else { - editor1.setDownEnable(true); - } - Msg.toast(editor1.getValue()); - }); - - const editor2 = createWidget({ - type: "bi.number_editor", - validationChecker(v) { - return parseFloat(v) <= 100 && parseFloat(v) >= 0; - }, - valueFormatter: v => `${v}$`, - valueParser: v => v.replace(/\$\s?|(,*)/g, ""), - height: 24, - width: 150, - errorText: "hahah", - }); - editor2.on(NumberEditor.EVENT_CHANGE, function () { - if (parseFloat(this.getValue()) < 1) { - editor2.setDownEnable(false); - } else { - editor2.setDownEnable(true); - } - Msg.toast(editor2.getValue()); - }); - - return { - type: "bi.vertical", - hgap: 20, - vgap: 20, - items: [ - { - el: editor1, - height: 24, - }, - { - el: editor2, - height: 24, - } - ], - }; - } -} diff --git a/demo/js/widget/numberinterval/demo.number_interval.js b/demo/js/widget/numberinterval/demo.number_interval.js deleted file mode 100644 index 8ff722b02..000000000 --- a/demo/js/widget/numberinterval/demo.number_interval.js +++ /dev/null @@ -1,51 +0,0 @@ -import { shortcut, Widget } from "@/core"; -import { NumberInterval } from "@/widget"; - -@shortcut() -export class NumericalInterval extends Widget { - static xtype = "demo.number_interval"; - - props = { baseCls: "demo-exceltable" }; - - mounted() { - const numerical = this.numerical; - const label = this.label; - numerical.on(NumberInterval.EVENT_CONFIRM, () => { - const temp = numerical.getValue(); - const res = `大于${temp.closemin ? "等于 " : " "}${temp.min} 小于${temp.closemax ? "等于 " : " "}${ - temp.max - }`; - label.setValue(res); - }); - } - - render() { - const self = this; - - return { - type: "bi.horizontal_auto", - items: [ - { - type: "bi.number_interval", - ref(_ref) { - self.numerical = _ref; - }, - width: 500, - value: { - max: 300, - closeMax: true, - closeMin: false, - }, - }, - { - type: "bi.label", - ref(_ref) { - self.label = _ref; - }, - text: "显示结果", - } - ], - vgap: 20, - }; - } -} diff --git a/demo/js/widget/selecttree/demo.multilayer_select_tree_combo.js b/demo/js/widget/selecttree/demo.multilayer_select_tree_combo.js deleted file mode 100644 index 944431a89..000000000 --- a/demo/js/widget/selecttree/demo.multilayer_select_tree_combo.js +++ /dev/null @@ -1,47 +0,0 @@ -import { shortcut, Widget, deepClone } from "@/core"; -import { Msg } from "@/base"; - -@shortcut() -export class MultiLayerSelectTreeCombo extends Widget { - static xtype = "demo.multilayer_select_tree_combo"; - - props = { baseCls: "" }; - - render() { - const self = this; - const items = deepClone(Demo.CONSTANTS.TREE); - - return { - type: "bi.horizontal_auto", - items: [ - { - type: "bi.multilayer_select_tree_combo", - ref(_ref) { - self.tree = _ref; - }, - defaultText: "请选择", - items, - width: 300, - value: ["第五级文件1"], - }, - { - type: "bi.button", - text: "getVlaue", - handler() { - Msg.toast(self.tree.getValue()[0]); - }, - width: 300, - }, - { - type: "bi.button", - text: "setVlaue (第二级文件1)", - handler() { - self.tree.setValue(["11"]); - }, - width: 300, - } - ], - vgap: 20, - }; - } -} diff --git a/demo/js/widget/selecttree/demo.select_tree_combo.js b/demo/js/widget/selecttree/demo.select_tree_combo.js deleted file mode 100644 index 66d69983d..000000000 --- a/demo/js/widget/selecttree/demo.select_tree_combo.js +++ /dev/null @@ -1,47 +0,0 @@ -import { shortcut, Widget, deepClone } from "@/core"; -import { Msg } from "@/base"; - -@shortcut() -export class SelectTreeCombo extends Widget { - static xtype = "demo.select_tree_combo"; - - props = { baseCls: "demo-exceltable" }; - - render() { - const self = this; - const items = deepClone(Demo.CONSTANTS.LEVELTREE); - - return { - type: "bi.horizontal_auto", - items: [ - { - type: "bi.select_tree_combo", - ref(_ref) { - self.tree = _ref; - }, - value: "11", - text: "默认值", - items, - width: 300, - }, - { - type: "bi.button", - text: "getVlaue", - handler() { - Msg.toast(self.tree.getValue()[0]); - }, - width: 300, - }, - { - type: "bi.button", - text: "setVlaue (11)", - handler() { - self.tree.setValue(["2"]); - }, - width: 300, - } - ], - vgap: 20, - }; - } -} diff --git a/demo/js/widget/singleselct/demo.single_select_combo.js b/demo/js/widget/singleselct/demo.single_select_combo.js deleted file mode 100644 index fea2603bf..000000000 --- a/demo/js/widget/singleselct/demo.single_select_combo.js +++ /dev/null @@ -1,103 +0,0 @@ -import { shortcut, Widget, Func } from "@/core"; - -@shortcut() -export class SingleSelectCombo extends Widget { - static xtype = "demo.single_select_combo"; - - props = { baseCls: "demo-single-select-combo" }; - - _createSingleSelectCombo() { - const self = this; - const widget = createWidget({ - type: "bi.single_select_combo", - itemsCreator: bind(this._itemsCreator, this), - width: 200, - ref() { - self.SingleSelectCombo = this; - }, - value: "柳州市针织总厂", - }); - - widget.populate(); - - widget.on(SingleSelectCombo.EVENT_CONFIRM, function () { - Msg.toast(JSON.stringify(this.getValue())); - }); - - return widget; - } - - _getItemsByTimes(items, times) { - const res = []; - for (let i = (times - 1) * 100; items[i] && i < times * 100; i++) { - res.push(items[i]); - } - - return res; - } - - _hasNextByTimes(items, times) { - return times * 100 < items.length; - } - - _itemsCreator(options, callback) { - const self = this; - let items = Demo.CONSTANTS.ITEMS; - const keywords = (options.keywords || []).slice(); - if (options.keyword) { - keywords.push(options.keyword); - } - each(keywords, (i, kw) => { - const search = Func.getSearchResult(items, kw); - items = search.match.concat(search.find); - }); - if (options.selectedValues) { - // 过滤 - const filter = makeObject(options.selectedValues, true); - items = filter(items, (i, ob) => !filter[ob.value]); - } - if (options.type == SingleSelectCombo.REQ_GET_ALL_DATA) { - callback({ - items, - }); - - return; - } - if (options.type == SingleSelectCombo.REQ_GET_DATA_LENGTH) { - callback({ count: items.length }); - - return; - } - delay(() => { - callback({ - items: self._getItemsByTimes(items, options.times), - hasNext: self._hasNextByTimes(items, options.times), - }); - }, 1000); - } - - render() { - const self = this; - - return { - type: "bi.absolute", - scrolly: false, - items: [ - { - el: this._createSingleSelectCombo(), - right: "50%", - top: 10, - }, - { - el: { - type: "bi.button", - text: "setValue(\"柳州市针织总厂\")", - handler() { - self.SingleSelectCombo.setValue("柳州市针织总厂"); - }, - }, - } - ], - }; - } -} diff --git a/demo/js/widget/singletree/demo.multilayer_single_tree_combo.js b/demo/js/widget/singletree/demo.multilayer_single_tree_combo.js deleted file mode 100644 index df283e47a..000000000 --- a/demo/js/widget/singletree/demo.multilayer_single_tree_combo.js +++ /dev/null @@ -1,46 +0,0 @@ -import { shortcut, Widget, deepClone } from "@/core"; -import { Msg } from "@/base"; - -@shortcut() -export class MultiLayerSingleTreeCombo extends Widget { - static xtype = "demo.multilayer_single_tree_combo"; - - props = { baseCls: "" }; - - render() { - const self = this; - const items = deepClone(Demo.CONSTANTS.TREE); - - return { - type: "bi.horizontal_auto", - items: [ - { - type: "bi.multilayer_single_tree_combo", - ref(_ref) { - self.tree = _ref; - }, - defaultText: "请选择", - items, - width: 300, - }, - { - type: "bi.button", - text: "getVlaue", - handler() { - Msg.toast(self.tree.getValue()[0]); - }, - width: 300, - }, - { - type: "bi.button", - text: "setVlaue (11)", - handler() { - self.tree.setValue(["11"]); - }, - width: 300, - } - ], - vgap: 20, - }; - } -} diff --git a/demo/js/widget/singletree/demo.single_tree_combo.js b/demo/js/widget/singletree/demo.single_tree_combo.js deleted file mode 100644 index 736f52f3e..000000000 --- a/demo/js/widget/singletree/demo.single_tree_combo.js +++ /dev/null @@ -1,47 +0,0 @@ -import { shortcut, Widget, deepClone } from "@/core"; -import { Msg } from "@/base"; - -@shortcut() -export class SingleTreeCombo extends Widget { - static xtype = "demo.single_tree_combo"; - - props = { baseCls: "demo-exceltable" }; - - render() { - const self = this; - const items = deepClone(Demo.CONSTANTS.LEVELTREE); - - return { - type: "bi.horizontal_auto", - items: [ - { - type: "bi.single_tree_combo", - ref(_ref) { - self.tree = _ref; - }, - defaultText: "请选择", - items, - width: 300, - value: "11", - }, - { - type: "bi.button", - text: "getVlaue", - handler() { - Msg.toast(self.tree.getValue()[0]); - }, - width: 300, - }, - { - type: "bi.button", - text: "setVlaue (第二级文件1)", - handler() { - self.tree.setValue(["2"]); - }, - width: 300, - } - ], - vgap: 20, - }; - } -} diff --git a/demo/js/widget/slider/demo.slider.js b/demo/js/widget/slider/demo.slider.js deleted file mode 100644 index 78276fc32..000000000 --- a/demo/js/widget/slider/demo.slider.js +++ /dev/null @@ -1,127 +0,0 @@ -import { shortcut, Widget, createWidget } from "@/core"; -import { SingleSlider, SingleSliderNormal } from "@/widget"; - -@shortcut() -export class Slider extends Widget { - static xtype = "demo.slider"; - - props = { baseCls: "demo-slider", width: 300, height: 50, min: 0, max: 100 }; - - render() { - const self = this, - o = this.options; - const singleSlider = createWidget({ - type: "bi.single_slider", - digit: 0, - width: o.width, - height: o.height, - cls: "layout-bg-white", - value: 30, - min: 10, - max: 100, - }); - singleSlider.on(SingleSlider.EVENT_CHANGE, function () { - console.log(this.getValue()); - }); - - const normalSingleSlider = createWidget({ - type: "bi.single_slider_normal", - width: o.width, - height: 30, - cls: "layout-bg-white", - min: o.min, - max: o.max, - value: 30, - }); - normalSingleSlider.on(SingleSliderNormal.EVENT_DRAG, function () { - console.log(this.getValue()); - }); - - const singleSliderLabel = createWidget({ - type: "bi.single_slider_label", - width: o.width, - height: o.height, - digit: 0, - unit: "个", - cls: "layout-bg-white", - min: o.min, - max: o.max, - value: 10, - }); - - const intervalSlider = createWidget({ - type: "bi.interval_slider", - width: o.width, - digit: 0, - cls: "layout-bg-white", - min: o.min, - max: o.max, - value: { - min: 10, - max: 70, - }, - }); - - const intervalSliderLabel = createWidget({ - type: "bi.interval_slider", - width: o.width, - unit: "px", - cls: "layout-bg-white", - digit: 1, - min: 0, - max: 120, - value: { - min: 60, - max: 120, - }, - }); - - return { - type: "bi.vertical", - element: this, - items: [ - { - type: "bi.center_adapt", - items: [ - { - el: singleSlider, - } - ], - }, - { - type: "bi.center_adapt", - items: [ - { - el: normalSingleSlider, - } - ], - }, - { - type: "bi.center_adapt", - items: [ - { - el: singleSliderLabel, - } - ], - }, - { - type: "bi.center_adapt", - items: [ - { - el: intervalSlider, - } - ], - }, - { - type: "bi.center_adapt", - items: [ - { - el: intervalSliderLabel, - } - ], - } - ], - vgap: 20, - }; - } -} diff --git a/demo/js/widget/timecombo/demo.timecombo.js b/demo/js/widget/timecombo/demo.timecombo.js deleted file mode 100644 index 6257b40dd..000000000 --- a/demo/js/widget/timecombo/demo.timecombo.js +++ /dev/null @@ -1,51 +0,0 @@ -import { shortcut, Widget } from "@/core"; -import { Msg } from "@/base"; - -@shortcut() -export class TimeCombo extends Widget { - static xtype = "demo.time_combo"; - - props = { baseCls: "" }; - - render() { - const self = this; - - return { - type: "bi.horizontal_auto", - items: [ - { - type: "bi.time_combo", - ref(_ref) { - self.timeCombo = _ref; - }, - // allowEdit: true, - // format: "%H:%M:%S", // HH:mm:ss - // format: "%I:%M:%S", // hh:mm:ss - // format: "%l:%M:%S", // h:mm:ss - // format: "%k:%M:%S", // H:mm:ss - // format: "%l:%M:%S %p", // h:mm:ss a - // format: "%l:%M", // h:mm - // format: "%k:%M", // H:mm - // format: "%I:%M", // hh:mm - // format: "%H:%M", // HH:mm - // format: "%M:%S", // mm:ss - value: { - hour: 12, - minute: 0, - second: 0, - }, - width: 300, - }, - { - type: "bi.button", - text: "getValue", - handler() { - Msg.toast(JSON.stringify(self.timeCombo.getValue())); - }, - width: 300, - } - ], - vgap: 20, - }; - } -} diff --git a/demo/js/widget/timeinterval/demo.time_interval.js b/demo/js/widget/timeinterval/demo.time_interval.js deleted file mode 100644 index 81fb79933..000000000 --- a/demo/js/widget/timeinterval/demo.time_interval.js +++ /dev/null @@ -1,112 +0,0 @@ -import { shortcut, Widget, deepClone } from "@/core"; -import { Msg } from "@/base"; - -@shortcut() -export class TimeInterval extends Widget { - static xtype = "demo.time_interval"; - - props = { baseCls: "" }; - - render() { - const self = this; - const items = deepClone(Demo.CONSTANTS.TREE); - - return { - type: "bi.horizontal_auto", - items: [ - { - type: "bi.date_interval", - ref(_ref) { - self.dateInterval = _ref; - }, - value: { - start: { - type: 2, - value: { - year: -1, - position: 2, - }, - }, - end: { - type: 1, - value: { - year: 2018, - month: 1, - day: 12, - }, - }, - }, - width: 300, - }, - { - type: "bi.button", - text: "getValue", - handler() { - Msg.toast(JSON.stringify(self.dateInterval.getValue())); - }, - width: 300, - }, - { - type: "bi.time_interval", - ref(_ref) { - self.interval = _ref; - }, - value: { - start: { - type: 2, - value: { - year: -1, - position: 2, - }, - }, - end: { - type: 1, - value: { - year: 2018, - month: 1, - day: 12, - }, - }, - }, - width: 400, - }, - { - type: "bi.button", - text: "getValue", - handler() { - Msg.toast(JSON.stringify(self.interval.getValue())); - }, - width: 300, - }, - { - type: "bi.time_periods", - value: { - start: { - hour: 7, - minute: 23, - second: 14, - }, - end: { - hour: 23, - minute: 34, - second: 32, - }, - }, - ref(_ref) { - self.periods = _ref; - }, - width: 180, - }, - { - type: "bi.button", - text: "getValue", - handler() { - Msg.toast(JSON.stringify(self.periods.getValue())); - }, - width: 300, - } - ], - vgap: 20, - }; - } -} diff --git a/demo/js/widget/tree/demo.multilayer_select_level_tree.js b/demo/js/widget/tree/demo.multilayer_select_level_tree.js deleted file mode 100644 index c4950e1eb..000000000 --- a/demo/js/widget/tree/demo.multilayer_select_level_tree.js +++ /dev/null @@ -1,49 +0,0 @@ -import { shortcut, Widget, createWidget, deepClone } from "@/core"; -import { Msg } from "@/base"; - -@shortcut() -export class MultiLayerSelectLevelTree extends Widget { - static xtype = "demo.multilayer_select_level_tree"; - - render() { - const self = this; - const tree = createWidget({ - type: "bi.multilayer_select_level_tree", - items: deepClone(Demo.CONSTANTS.TREE), - value: "第五级文件1", - }); - - return { - type: "bi.vtape", - items: [ - { - el: tree, - }, - { - el: { - type: "bi.button", - height: 25, - text: "getValue", - handler() { - Msg.alert("", JSON.stringify(tree.getValue())); - }, - }, - height: 25, - }, - { - el: { - type: "bi.button", - height: 25, - text: "setValue (第二级文件1)", - handler() { - tree.setValue(["11"]); - }, - }, - height: 25, - } - ], - width: 500, - hgap: 300, - }; - } -} diff --git a/demo/js/widget/tree/demo.multilayer_single_level_tree.js b/demo/js/widget/tree/demo.multilayer_single_level_tree.js deleted file mode 100644 index de980c51a..000000000 --- a/demo/js/widget/tree/demo.multilayer_single_level_tree.js +++ /dev/null @@ -1,74 +0,0 @@ -import { shortcut, Widget, createWidget } from "@/core"; -import { Msg } from "@/base"; - -@shortcut() -export class MultiLayerSingleLevelTree extends Widget { - static xtype = "demo.multilayer_single_level_tree"; - - render() { - const self = this; - this.tree = createWidget({ - type: "bi.multilayer_single_level_tree", - items: [], - value: "第二级文件1", - }); - - return { - type: "bi.vtape", - items: [ - { - el: this.tree, - }, - { - el: { - type: "bi.button", - height: 25, - text: "getValue", - handler() { - Msg.alert("", JSON.stringify(self.tree.getValue())); - }, - }, - height: 25, - }, - { - el: { - type: "bi.button", - height: 25, - text: "setValue (第二级文件1)", - handler() { - self.tree.setValue(["第二级文件1"]); - }, - }, - height: 25, - } - ], - width: 500, - hgap: 300, - }; - } - - mounted() { - const tree = [ - // {id: -2, pId: 0, value: "根目录1", text: "根目录1"}, - { id: -1, pId: 0, value: "根目录", text: "根目录" }, - { id: 1, pId: -1, value: "第一级目录1", text: "第一级目录1" }, - { id: 11, pId: 1, value: "第二级文件1", text: "第二级文件1" }, - { id: 12, pId: 1, value: "第二级目录2", text: "第二级目录2", disabled: true }, - { id: 121, pId: 12, value: "第三级目录1", text: "第三级目录1" }, - { id: 122, pId: 12, value: "第三级文件1", text: "第三级文件1" }, - { id: 1211, pId: 121, value: "第四级目录1", text: "第四级目录1" }, - { id: 2, pId: -1, value: "第一级目录2", text: "第一级目录2" }, - { id: 21, pId: 2, value: "第二级目录3", text: "第二级目录3" }, - { id: 22, pId: 2, value: "第二级文件2", text: "第二级文件2" }, - { id: 211, pId: 21, value: "第三级目录2", text: "第三级目录2" }, - { id: 212, pId: 21, value: "第三级文件2", text: "第三级文件2" }, - { id: 2111, pId: 211, value: "第四级文件1", text: "第四级文件1" }, - { id: 3, pId: -1, value: "第一级目录3", text: "第一级目录3" }, - { id: 31, pId: 3, value: "第二级文件2", text: "第二级文件2" }, - { id: 33, pId: 3, value: "第二级目录3", text: "第二级目录1" }, - { id: 32, pId: 3, value: "第二级文件3", text: "第二级文件3" }, - { id: 331, pId: 33, value: "第三级文件1", text: "第三级文件1" } - ]; - this.tree.populate(tree); - } -} diff --git a/demo/js/widget/tree/demo.select_level_tree.js b/demo/js/widget/tree/demo.select_level_tree.js deleted file mode 100644 index 2d920d8b2..000000000 --- a/demo/js/widget/tree/demo.select_level_tree.js +++ /dev/null @@ -1,49 +0,0 @@ -import { shortcut, Widget, createWidget, deepClone } from "@/core"; -import { Msg } from "@/base"; - -@shortcut() -export class SelectLevelTree extends Widget { - static xtype = "demo.select_level_tree"; - - render() { - const self = this; - const tree = createWidget({ - type: "bi.select_level_tree", - items: deepClone(Demo.CONSTANTS.LEVELTREE), - value: "11", - }); - - return { - type: "bi.vtape", - items: [ - { - el: tree, - }, - { - el: { - type: "bi.button", - height: 25, - text: "getValue", - handler() { - Msg.alert("", JSON.stringify(tree.getValue())); - }, - }, - height: 25, - }, - { - el: { - type: "bi.button", - height: 25, - text: "setValue (第二级文件1)", - handler() { - tree.setValue(["2"]); - }, - }, - height: 25, - } - ], - width: 500, - hgap: 300, - }; - } -} diff --git a/demo/js/widget/tree/demo.single_level_tree.js b/demo/js/widget/tree/demo.single_level_tree.js deleted file mode 100644 index 85af7ca6b..000000000 --- a/demo/js/widget/tree/demo.single_level_tree.js +++ /dev/null @@ -1,49 +0,0 @@ -import { shortcut, Widget, createWidget, deepClone } from "@/core"; -import { Msg } from "@/base"; - -@shortcut() -export class SingleLevelTree extends Widget { - static xtype = "demo.single_level_tree"; - - render() { - const self = this; - const tree = createWidget({ - type: "bi.single_level_tree", - items: deepClone(Demo.CONSTANTS.LEVELTREE), - value: "11", - }); - - return { - type: "bi.vtape", - items: [ - { - el: tree, - }, - { - el: { - type: "bi.button", - height: 25, - text: "getValue", - handler() { - Msg.alert("", JSON.stringify(tree.getValue())); - }, - }, - height: 25, - }, - { - el: { - type: "bi.button", - height: 25, - text: "setValue (第二级文件1)", - handler() { - tree.setValue(["2"]); - }, - }, - height: 25, - } - ], - width: 500, - hgap: 300, - }; - } -} diff --git a/demo/js/widget/year/demo.year.js b/demo/js/widget/year/demo.year.js deleted file mode 100644 index 540d47063..000000000 --- a/demo/js/widget/year/demo.year.js +++ /dev/null @@ -1,50 +0,0 @@ -import { shortcut, Widget } from "@/core"; -import { Msg } from "@/base"; - -@shortcut() -export class Year extends Widget { - static xtype = "demo.year"; - - props = { baseCls: "demo-exceltable" }; - - render() { - const self = this; - - return { - type: "bi.horizontal_auto", - vgap: 10, - items: [ - { - type: "bi.dynamic_year_combo", - width: 300, - ref() { - self.yearcombo = this; - }, - value: { - type: 1, - value: { - year: 2017, - }, - }, - }, - { - type: "bi.button", - text: "getValue", - handler() { - Msg.toast(JSON.stringify(self.yearcombo.getValue())); - }, - width: 300, - }, - { - type: "bi.button", - text: "setValue : 2018", - handler() { - self.yearcombo.setValue(2018); - }, - width: 300, - } - ], - vgap: 10, - }; - } -} diff --git a/demo/js/widget/yearinterval/demo.year_interval.js b/demo/js/widget/yearinterval/demo.year_interval.js deleted file mode 100644 index b8950954c..000000000 --- a/demo/js/widget/yearinterval/demo.year_interval.js +++ /dev/null @@ -1,53 +0,0 @@ -import { shortcut, Widget } from "@/core"; -import { Msg } from "@/base"; - -@shortcut() -export class YearInterval extends Widget { - static xtype = "demo.year_interval"; - - props = { baseCls: "" }; - - render() { - const self = this; - - return { - type: "bi.horizontal_auto", - items: [ - { - type: "bi.year_interval", - ref(_ref) { - self.widget = _ref; - }, - width: 300, - minDate: "2012-01-01", - maxDate: "2013-12-31", - value: { - type: 1, - value: { - year: 2012, - }, - }, - }, - { - type: "bi.button", - text: "getValue", - handler() { - Msg.toast(JSON.stringify(self.widget.getValue())); - }, - width: 300, - }, - { - type: "bi.button", - text: "setValue '2017-12'", - width: 300, - handler() { - self.widget.setValue({ - year: 2017, - }); - }, - } - ], - vgap: 20, - }; - } -} diff --git a/demo/js/widget/yearmonth/demo.year_month_combo.js b/demo/js/widget/yearmonth/demo.year_month_combo.js deleted file mode 100644 index ac018af4d..000000000 --- a/demo/js/widget/yearmonth/demo.year_month_combo.js +++ /dev/null @@ -1,53 +0,0 @@ -import { shortcut, Widget } from "@/core"; -import { Msg } from "@/base"; - -@shortcut() -export class YearMonthCombo extends Widget { - static xtype = "demo.year_month_combo"; - - props = { baseCls: "" }; - - render() { - const self = this; - - return { - type: "bi.horizontal_auto", - items: [ - { - type: "bi.dynamic_year_month_combo", - ref(_ref) { - self.widget = _ref; - }, - width: 300, - // value: { - // type: 1, - // value: { - // year: 2018, - // month: 1 - // } - // } - }, - { - type: "bi.button", - text: "getValue", - handler() { - Msg.toast(JSON.stringify(self.widget.getValue())); - }, - width: 300, - }, - { - type: "bi.button", - text: "setValue '2017-12'", - width: 300, - handler() { - self.widget.setValue({ - year: 2017, - month: 12, - }); - }, - } - ], - vgap: 20, - }; - } -} diff --git a/demo/js/widget/yearmonthinterval/demo.year_month_interval.js b/demo/js/widget/yearmonthinterval/demo.year_month_interval.js deleted file mode 100644 index ed3389eb3..000000000 --- a/demo/js/widget/yearmonthinterval/demo.year_month_interval.js +++ /dev/null @@ -1,51 +0,0 @@ -import { shortcut, Widget } from "@/core"; -import { Msg } from "@/base"; - -@shortcut() -export class YearMonthInterval extends Widget { - static xtype = "demo.year_month_interval"; - - props = { baseCls: "" }; - - render() { - const self = this; - - return { - type: "bi.horizontal_auto", - items: [ - { - type: "bi.year_month_interval", - ref(_ref) { - self.interval = _ref; - }, - value: { - start: { - type: 2, - value: { - year: -1, - month: 1, - }, - }, - end: { - type: 1, - value: { - year: 2018, - month: 1, - }, - }, - }, - width: 400, - }, - { - type: "bi.button", - text: "getValue", - handler() { - Msg.toast(JSON.stringify(self.interval.getValue())); - }, - width: 300, - } - ], - vgap: 20, - }; - } -} diff --git a/demo/js/widget/yearquarter/demo.year_quarter_combo.js b/demo/js/widget/yearquarter/demo.year_quarter_combo.js deleted file mode 100644 index 79bd8f8e7..000000000 --- a/demo/js/widget/yearquarter/demo.year_quarter_combo.js +++ /dev/null @@ -1,55 +0,0 @@ -import { shortcut, Widget } from "@/core"; -import { Msg } from "@/base"; - -@shortcut() -export class YearQuarterCombo extends Widget { - static xtype = "demo.year_quarter_combo"; - - props = { baseCls: "" }; - - render() { - const self = this; - - return { - type: "bi.horizontal_auto", - items: [ - { - type: "bi.dynamic_year_quarter_combo", - width: 300, - ref(_ref) { - self.widget = _ref; - }, - yearBehaviors: {}, - quarterBehaviors: {}, - value: { - type: 1, - value: { - year: 2018, - quarter: 1, - }, - }, - }, - { - type: "bi.button", - text: "getValue", - handler() { - Msg.toast(JSON.stringify(self.widget.getValue())); - }, - width: 300, - }, - { - type: "bi.button", - text: "setVlaue '2017 季度3'", - width: 300, - handler() { - self.widget.setValue({ - year: 2017, - quarter: 3, - }); - }, - } - ], - vgap: 20, - }; - } -} diff --git a/demo/js/widget/yearquarterinterval/demo.yearquarterinterval.js b/demo/js/widget/yearquarterinterval/demo.yearquarterinterval.js deleted file mode 100644 index b2b7f589d..000000000 --- a/demo/js/widget/yearquarterinterval/demo.yearquarterinterval.js +++ /dev/null @@ -1,53 +0,0 @@ -import { shortcut, Widget } from "@/core"; -import { Msg } from "@/base"; - -@shortcut() -export class YearQuarterInterval extends Widget { - static xtype = "demo.year_quarter_interval"; - - props = { baseCls: "" }; - - render() { - const self = this; - - return { - type: "bi.horizontal_auto", - items: [ - { - type: "bi.year_quarter_interval", - ref(_ref) { - self.interval = _ref; - }, - minDate: "2012-07-01", - maxDate: "2012-12-31", - value: { - start: { - type: 2, - value: { - year: -1, - month: 1, - }, - }, - end: { - type: 1, - value: { - year: 2018, - month: 1, - }, - }, - }, - width: 400, - }, - { - type: "bi.button", - text: "getValue", - handler() { - Msg.toast(JSON.stringify(self.interval.getValue())); - }, - width: 300, - } - ], - vgap: 20, - }; - } -} diff --git a/demo/less/center.less b/demo/less/center.less deleted file mode 100644 index b15dc85a3..000000000 --- a/demo/less/center.less +++ /dev/null @@ -1,3 +0,0 @@ -.demo-center { - -} \ No newline at end of file diff --git a/demo/less/face.less b/demo/less/face.less deleted file mode 100644 index 3e22a078b..000000000 --- a/demo/less/face.less +++ /dev/null @@ -1,11 +0,0 @@ -@import "index.less"; - -.demo-face { - .face-config { - .config-label { - font-size: 1.4rem; - } - .config-item { - } - } -} \ No newline at end of file diff --git a/demo/less/index.less b/demo/less/index.less deleted file mode 100644 index 9c7a9a367..000000000 --- a/demo/less/index.less +++ /dev/null @@ -1 +0,0 @@ -@import "../../src/less/index.less"; \ No newline at end of file diff --git a/demo/less/main.less b/demo/less/main.less deleted file mode 100644 index 87a094414..000000000 --- a/demo/less/main.less +++ /dev/null @@ -1,102 +0,0 @@ -@import "index.less"; -.layout-bg-white { - background-color: #ffffff; -} - -.layout-bg-gray { - background-color: #eeeeee; -} - -.layout-bg1 { - color: #ffffff; - background-color: #0088cc; -} - -.layout-bg2 { - color: #ffffff; - background-color: #008B8B; -} - -.layout-bg3 { - color: #ffffff; - background-color: #6495ED; -} - -.layout-bg4 { - color: #ffffff; - background-color: #ff69b4; -} - -.layout-bg5 { - color: #ffffff; - background-color: #B8860B; -} - -.layout-bg6 { - color: #ffffff; - background-color: #d9534f; -} - -.layout-bg7 { - color: #ffffff; - background-color: #ea4738; -} - -.layout-bg8 { - color: #ffffff; - background-color: #6495ed; -} - -.demo-main { - & .bg1 { - background-color: #178cdf; - } -} - -body { - background-color: @color-bi-background-normal; -} - -#wrapper { - position: absolute; - left: 0; - right: 0; - top: 0; - bottom: 0; - font-size: 1.2rem; -} - -.bi-theme-dark body { - background-color: @color-bi-background-normal-theme-dark; -} - -.demo-editor { - border: 1px solid rgb(204, 204, 204); -} - -.demo-clolor { - color: #1a1a1a; -} - -.bi-progress-bar-processor { - transition: all 0.5s ease; - -webkit-transition: all 0.5s ease; - -moz-transition: all 0.5s ease; - -o-transition: all 0.5s ease; - background: #3f8ce8; - border-radius: 2rem; - overflow: hidden; - overflow-x: hidden; - overflow-y: hidden; -} - -.bi-progress-text-bar-processor { - transition: all 0.5s ease; - -webkit-transition: all 0.5s ease; - -moz-transition: all 0.5s ease; - -o-transition: all 0.5s ease; -} - -.bi-progress-bar-bar { - border-radius: 2rem; -} diff --git a/demo/less/north.less b/demo/less/north.less deleted file mode 100644 index 12fbdb5b4..000000000 --- a/demo/less/north.less +++ /dev/null @@ -1,12 +0,0 @@ -@import "index.less"; - -.demo-north { - background-color: #3c8dbc; - & .logo { - font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; - color: @color-bi-text; - background-color: #367fa9; - font-size: 2rem; - font-weight: 300; - } -} \ No newline at end of file diff --git a/demo/less/preview.less b/demo/less/preview.less deleted file mode 100644 index 600ec4476..000000000 --- a/demo/less/preview.less +++ /dev/null @@ -1,4 +0,0 @@ -@import "index.less"; - -.demo-preview { -} \ No newline at end of file diff --git a/demo/less/vm.less b/demo/less/vm.less deleted file mode 100644 index 45094646a..000000000 --- a/demo/less/vm.less +++ /dev/null @@ -1,123 +0,0 @@ -@import "index.less"; - -.mvc-button { - &:hover, &.hover { - .opacity(0.5); - } - &.active, &:active { - .opacity(0.5) - } -} - -.bi-set-get { - & .left-title, & .right-title { - background: #0088cc; - color: #ffffff; - } - & .left-nav { - border-bottom: 1px solid #cccccc; - &.active, &:active { - color: #ffffff; - background-color: #d9534f; - } - } -} - -.bi-local { - & .top-button { - background-color: #448eea; - color: #ffffff - } - & .bottom-label { - background-color: #EA4738; - color: #ffffff; - } - & .delete-button { - background-color: #008B8B; - color: #ffffff; - } - & .vessel-border { - border-left: 1px solid #cccccc; - border-bottom: 1px solid #cccccc; - border-right: 1px solid #cccccc; - } -} - -.bi-event { - & .title { - background: #0088cc; - color: #ffffff; - } - & .front { - background: #ADD8E6; - } - & .nav { - border: 1px solid #cccccc; - } -} - -.bi-skip-to { - color: #ffffff; - - & .red-pane { - background-color: #0088cc; - } - & .blue-pane { - background-color: #6495ED; - } - & .green-pane { - background-color: #008B8B; - } - & .yellow-pane { - background-color: #B8860B; - } -} - -.bi-change { - & .outer-text { - background-color: #0088cc; - color: #ffffff; - } - & .inner { - border-left: 1px solid #cccccc; - border-bottom: 1px solid #cccccc; - border-right: 1px solid #cccccc; - } - - & .type-first { - background-color: #008B8B; - } - - & .type-second { - background-color: #6495ED; - } - - & .type-third { - background-color: #0088cc; - } -} - -.bi-tmp { - & .tmp-button { - color: #ffffff; - background: #0088cc; - } -} - -.bi-splice-duplicate { - & .superiors-label { - color: white; - background-color: #008B8B; - } - & .sd-child { - border: 1px solid #cccccc; - & .right-button-add { - color: white; - background-color: #0088cc; - } - & .right-button-del { - color: white; - background-color: #d9534f; - } - } -} \ No newline at end of file diff --git a/demo/less/west.less b/demo/less/west.less deleted file mode 100644 index c9f6477ee..000000000 --- a/demo/less/west.less +++ /dev/null @@ -1,4 +0,0 @@ -@import "index.less"; - -.demo-west { -} diff --git a/demo/version.js b/demo/version.js deleted file mode 100644 index 8b1378917..000000000 --- a/demo/version.js +++ /dev/null @@ -1 +0,0 @@ - diff --git a/dist/README.md b/dist/README.md deleted file mode 100644 index f6a3a9ec7..000000000 --- a/dist/README.md +++ /dev/null @@ -1,31 +0,0 @@ -#### fineui.js - -整个fineui打包文件,不包括配置文件 - -#### fineui.css - -整个fineui打包文件,不包括资源文件 - -#### config.js - -配置文件,这只是一个案例,集成进系统的时候需要进行配置 - -#### resource.css - -app.css background.css icon.css font.css的合并文件,集成进系统的时候需要进行配置 - -#### router.js - -#### 路由文件,使用fineui路由的时候才需要引入 - -#### bundle.js bundle.css - -所有文件的合并文件, 主要给在线demo和文档用的 - -#### core_without_normalize.css - -不带标准化的core.css文件,只引入通用css样式的时候才需要 - -#### chart.js - -封装好的一层图表api diff --git a/dist/fix/fix.compact.js b/dist/fix/fix.compact.js deleted file mode 100644 index dced5e166..000000000 --- a/dist/fix/fix.compact.js +++ /dev/null @@ -1,193 +0,0 @@ -;(function () { - function initWatch (vm, watch) { - vm._watchers || (vm._watchers = []); - for (var key in watch) { - var handler = watch[key]; - if (BI.isArray(handler)) { - for (var i = 0; i < handler.length; i++) { - vm._watchers.push(createWatcher(vm, key, handler[i])); - } - } else { - vm._watchers.push(createWatcher(vm, key, handler)); - } - } - BI.each(vm.$watchDelayCallbacks, function (i, watchDelayCallback) { - var innerWatch = watchDelayCallback[0]; - var innerHandler = watchDelayCallback[1]; - if (BI.isKey(innerWatch)) { - var key = innerWatch; - innerWatch = {}; - innerWatch[key] = innerHandler; - } - for (var key in innerWatch) { - var handler = innerWatch[key]; - if (BI.isArray(handler)) { - for (var i = 0; i < handler.length; i++) { - vm._watchers.push(createWatcher(vm, key, handler[i])); - } - } else { - vm._watchers.push(createWatcher(vm, key, handler)); - } - } - }); - } - - function createWatcher (vm, keyOrFn, cb, options) { - if (BI.isPlainObject(cb)) { - options = cb; - cb = cb.handler; - } - options = options || {}; - return Fix.watch(vm.model, keyOrFn, BI._.bind(cb, vm), BI.extend(options, { - store: vm.store - })); - } - - var target = null; - var targetStack = []; - - function pushTarget (_target) { - if (target) targetStack.push(target); - Fix.Model.target = target = _target; - } - - function popTarget () { - Fix.Model.target = target = targetStack.pop(); - } - - BI.Model = Fix.Model; - - var oldWatch = Fix.watch; - Fix.watch = function (model, expOrFn, cb, options) { - if (BI.isPlainObject(cb)) { - options = cb; - cb = cb.handler; - } - if (typeof cb === "string") { - cb = model[cb]; - } - return oldWatch.call(this, model, expOrFn, function () { - options && options.store && pushTarget(options.store); - try { - var res = cb.apply(this, arguments); - } catch (e) { - console.error(e); - } - options && options.store && popTarget(); - return res; - }, options); - }; - - BI.Widget.findStore = function findStore (widget) { - if (target != null) { - return target; - } - widget = widget || BI.Widget.context; - var p = widget; - while (p) { - if (p instanceof Fix.Model || p.store || p.__cacheStore) { - break; - } - p = p._parent || (p.options && p.options.element) || p._context; - } - if (p) { - if (p instanceof Fix.Model) { - return widget.__cacheStore = p; - } - widget.__cacheStore = p.store || p.__cacheStore; - return p.__cacheStore || p.store; - } - } - - function createStore () { - var needPop = false; - var workerMode = BI.Providers.getProvider("bi.provider.system").getWorkerMode(); - if (workerMode && this._worker) { - return; - } - if (this.store) { - pushTarget(this.store); - return true; - } - if (this._store || this.options._store) { - var store = BI.Widget.findStore(this.options.context || this._parent || this.options.element || this._context); - if (store) { - pushTarget(store); - needPop = true; - } - this.store = (this._store || this.options._store).call(this); - this.store && (this.store._widget = this); - needPop && popTarget(); - needPop = false; - pushTarget(this.store); - if (this.store instanceof Fix.Model) { - this.model = this.store.model; - } else { - this.model = this.store; - } - needPop = true; - } - return needPop; - } - - var _init = BI.Widget.prototype._init; - BI.Widget.prototype._init = function () { - var self = this; - var needPop = createStore.call(this); - try { - _init.apply(this, arguments); - } catch (e) { - console.error(e); - } - needPop && popTarget(); - }; - - var __initWatch = BI.Widget.prototype.__initWatch; - BI.Widget.prototype.__initWatch = function () { - __initWatch.apply(this, arguments); - var workerMode = BI.Providers.getProvider("bi.provider.system").getWorkerMode(); - if (workerMode && this._worker) { - return; - } - if (this._store) { - initWatch(this, this.watch); - } - }; - - var unMount = BI.Widget.prototype.__destroy; - BI.Widget.prototype.__destroy = function () { - try { - unMount.apply(this, arguments); - } catch (e) { - console.error(e); - } - this.store && BI.isFunction(this.store.destroy) && this.store.destroy(); - BI.each(this._watchers, function (i, unwatches) { - unwatches = BI.isArray(unwatches) ? unwatches : [unwatches]; - BI.each(unwatches, function (j, unwatch) { - unwatch(); - }); - }); - this._watchers && (this._watchers = []); - if (this.store) { - this.store._parent && (this.store._parent = null); - this.store._widget && (this.store._widget = null); - this.store = null; - } - delete this.__cacheStore; - }; - - BI._.each(["_render", "__afterRender", "_mount", "__afterMount"], function (name) { - var old = BI.Widget.prototype[name]; - old && (BI.Widget.prototype[name] = function () { - this.store && pushTarget(this.store); - try { - var res = old.apply(this, arguments); - } catch (e) { - console.error(e); - } - this.store && popTarget(); - return res; - }); - }); -}()); diff --git a/dist/fix/fix.js b/dist/fix/fix.js deleted file mode 100644 index 9a106ae7a..000000000 --- a/dist/fix/fix.js +++ /dev/null @@ -1,1419 +0,0 @@ -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -(function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : typeof define === 'function' && define.amd ? define(['exports'], factory) : factory(global.Fix = global.Fix || {}); -})(this, function (exports) { - 'use strict'; - - function noop(a, b, c) {} - - function isNative(Ctor) { - return typeof Ctor === 'function' && /native code/.test(Ctor.toString()); - } - - var hasProto = '__proto__' in {}; - - var _toString = Object.prototype.toString; - - function isPlainObject(obj) { - return _toString.call(obj) === '[object Object]'; - } - - function isConfigurable(obj, key) { - var configurable = true; - var property = Object.getOwnPropertyDescriptor && Object.getOwnPropertyDescriptor(obj, key); - if (property && property.configurable === false) { - configurable = false; - } - return configurable; - } - - function isExtensible(obj) { - if (Object.isExtensible) { - return Object.isExtensible(obj); - } - var name = ''; - while (obj.hasOwnProperty(name)) { - name += '?'; - } - obj[name] = true; - var returnValue = obj.hasOwnProperty(name); - delete obj[name]; - return returnValue; - } - - function remove(arr, item) { - if (arr && arr.length) { - var _index = arr.indexOf(item); - if (_index > -1) { - return arr.splice(_index, 1); - } - } - } - - // const bailRE = /[^\w.$]/ - - function parsePath(path) { - // 正常表达式比较慢,能不要的就不要了 - // if (bailRE.test(path)) { - // return - // } - var segments = path.split('.'); - return function (obj) { - for (var i = 0; i < segments.length; i++) { - if (!obj) return; - obj = obj[segments[i]]; - } - return obj; - }; - } - - var nextTick = function () { - var callbacks = []; - var pending = false; - var timerFunc = void 0; - - function nextTickHandler() { - pending = false; - var copies = callbacks.slice(0); - callbacks.length = 0; - for (var i = 0; i < copies.length; i++) { - copies[i](); - } - } - - // An asynchronous deferring mechanism. - // In pre 2.4, we used to use microtasks (Promise/MutationObserver) - // but microtasks actually has too high a priority and fires in between - // supposedly sequential events (e.g. #4521, #6690) or even between - // bubbling of the same event (#6566). Technically setImmediate should be - // the ideal choice, but it's not available everywhere; and the only polyfill - // that consistently queues the callback after all DOM events triggered in the - // same loop is by using MessageChannel. - /* istanbul ignore if */ - if (typeof setImmediate !== 'undefined' && isNative(setImmediate)) { - timerFunc = function timerFunc() { - setImmediate(nextTickHandler); - }; - } else if (typeof MessageChannel !== 'undefined' && (isNative(MessageChannel) || - // PhantomJS - MessageChannel.toString() === '[object MessageChannelConstructor]')) { - var channel = new MessageChannel(); - var port = channel.port2; - channel.port1.onmessage = nextTickHandler; - timerFunc = function timerFunc() { - port.postMessage(1); - }; - } else - /* istanbul ignore next */ - if (typeof Promise !== 'undefined' && isNative(Promise)) { - // use microtask in non-DOM environments, e.g. Weex - var p = Promise.resolve(); - timerFunc = function timerFunc() { - p.then(nextTickHandler); - }; - } else { - // fallback to setTimeout - timerFunc = function timerFunc() { - setTimeout(nextTickHandler, 0); - }; - } - - return function queueNextTick(cb, ctx) { - var _resolve = void 0; - callbacks.push(function () { - if (cb) { - try { - cb.call(ctx); - } catch (e) { - console.error(e); - } - } else if (_resolve) { - _resolve(ctx); - } - }); - if (!pending) { - pending = true; - timerFunc(); - } - // $flow-disable-line - if (!cb && typeof Promise !== 'undefined') { - return new Promise(function (resolve, reject) { - _resolve = resolve; - }); - } - }; - }(); - - var falsy; - var $$skipArray = { - __ob__: falsy, - $accessors: falsy, - $vbthis: falsy, - $vbsetter: falsy - }; - - var uid = 0; - - /** - * A dep is an observable that can have multiple - * directives subscribing to it. - */ - - var Dep = function () { - function Dep() { - _classCallCheck(this, Dep); - - this.id = uid++; - this.subs = []; - } - - Dep.prototype.addSub = function addSub(sub) { - this.subs.push(sub); - }; - - Dep.prototype.removeSub = function removeSub(sub) { - remove(this.subs, sub); - }; - - Dep.prototype.depend = function depend() { - if (Dep.target) { - Dep.target.addDep(this); - } - }; - - Dep.prototype.notify = function notify(options) { - // stabilize the subscriber list first - var subs = this.subs.slice(); - for (var i = 0, l = subs.length; i < l; i++) { - subs[i].update(options); - } - }; - - return Dep; - }(); - - // the current target watcher being evaluated. - // this is globally unique because there could be only one - // watcher being evaluated at any time. - - - Dep.target = null; - var targetStack = []; - - function pushTarget(_target) { - if (Dep.target) targetStack.push(Dep.target); - Dep.target = _target; - } - - function popTarget() { - Dep.target = targetStack.pop(); - } - - //如果浏览器不支持ecma262v5的Object.defineProperties或者存在BUG,比如IE8 - //标准浏览器使用__defineGetter__, __defineSetter__实现 - var canHideProperty = true; - try { - Object.defineProperty({}, '_', { - value: 'x' - }); - delete $$skipArray.$vbsetter; - delete $$skipArray.$vbthis; - } catch (e) { - /* istanbul ignore next*/ - canHideProperty = false; - } - - var createViewModel = Object.defineProperties; - var defineProperty = void 0; - - /* istanbul ignore if*/ - if (!canHideProperty) { - if ('__defineGetter__' in {}) { - defineProperty = function defineProperty(obj, prop, desc) { - if ('value' in desc) { - obj[prop] = desc.value; - } - if ('get' in desc) { - obj.__defineGetter__(prop, desc.get); - } - if ('set' in desc) { - obj.__defineSetter__(prop, desc.set); - } - return obj; - }; - createViewModel = function createViewModel(obj, descs) { - for (var prop in descs) { - if (descs.hasOwnProperty(prop)) { - defineProperty(obj, prop, descs[prop]); - } - } - return obj; - }; - } - } - - var createViewModel$1 = createViewModel; - - var queue = []; - var activatedChildren = []; - var has = {}; - var waiting = false; - var flushing = false; - var index = 0; - - function resetSchedulerState() { - index = queue.length = activatedChildren.length = 0; - has = {}; - waiting = flushing = false; - } - - function flushSchedulerQueue() { - flushing = true; - var watcher = void 0, - id = void 0, - options = void 0; - - // Sort queue before flush. - // This ensures that: - // 1. Components are updated from parent to child. (because parent is always - // created before the child) - // 2. A component's user watchers are run before its render watcher (because - // user watchers are created before the render watcher) - // 3. If a component is destroyed during a parent component's watcher run, - // its watchers can be skipped. - queue.sort(function (a, b) { - return a.id - b.id; - }); - - // do not cache length because more watchers might be pushed - // as we run existing watchers - for (index = 0; index < queue.length; index++) { - watcher = queue[index].watcher; - options = queue[index].options; - id = watcher.id; - has[id] = null; - watcher.run(options); - } - - resetSchedulerState(); - } - - function queueWatcher(watcher, options) { - var id = watcher.id; - if (has[id] == null) { - has[id] = true; - if (!flushing) { - queue.push({ watcher: watcher, options: options }); - } else { - // if already flushing, splice the watcher based on its id - // if already past its id, it will be run next immediately. - var i = queue.length - 1; - while (i > index && queue[i].watcher.id > watcher.id) { - i--; - } - queue.splice(i + 1, 0, { watcher: watcher, options: options }); - } - // queue the flush - if (!waiting) { - waiting = true; - nextTick(flushSchedulerQueue); - } - } - } - - var uid$1 = 0; - - var Watcher = function () { - function Watcher(vm, expOrFn, cb, options) { - _classCallCheck(this, Watcher); - - this.vm = vm; - // vm._watchers || (vm._watchers = []) - // vm._watchers.push(this) - // options - if (options) { - this.deep = !!options.deep; - this.user = !!options.user; - this.lazy = !!options.lazy; - this.sync = !!options.sync; - } else { - this.deep = this.user = this.lazy = this.sync = false; - } - this.cb = cb; - this.id = ++uid$1; // uid for batching - this.active = true; - this.dirty = this.lazy; // for lazy watchers - this.deps = []; - this.newDeps = []; - this.depIds = new Set(); - this.newDepIds = new Set(); - this.expression = ''; - // parse expression for getter - if (typeof expOrFn === 'function') { - this.getter = expOrFn; - } else { - this.getter = parsePath(expOrFn); - if (!this.getter) { - this.getter = function () {}; - } - } - this.value = this.lazy ? undefined : this.get(); - } - - Watcher.prototype.get = function get() { - pushTarget(this); - var value = void 0; - var vm = this.vm; - try { - value = this.getter.call(vm, vm); - } catch (e) { - // if (this.user) { - // } else { - // console.error(e) - // } - } finally { - // "touch" every property so they are all tracked as - // dependencies for deep watching - if (this.deep) { - traverse(value); - } - popTarget(); - this.cleanupDeps(); - } - return value; - }; - - Watcher.prototype.addDep = function addDep(dep) { - var id = dep.id; - if (!this.newDepIds.has(id)) { - this.newDepIds.add(id); - this.newDeps.push(dep); - if (!this.depIds.has(id)) { - dep.addSub(this); - } - } - }; - - Watcher.prototype.cleanupDeps = function cleanupDeps() { - var i = this.deps.length; - while (i--) { - var dep = this.deps[i]; - if (!this.newDepIds.has(dep.id)) { - dep.removeSub(this); - } - } - var tmp = this.depIds; - this.depIds = this.newDepIds; - this.newDepIds = tmp; - this.newDepIds.clear(); - tmp = this.deps; - this.deps = this.newDeps; - this.newDeps = tmp; - this.newDeps.length = 0; - }; - - Watcher.prototype.update = function update(options) { - /* istanbul ignore else */ - if (this.lazy) { - this.dirty = true; - } else if (this.sync) { - this.run(options); - } else { - queueWatcher(this, options); - } - }; - - Watcher.prototype.run = function run(options) { - if (this.active) { - var value = this.get(); - if (value !== this.value || - // Deep watchers and watchers on Object/Arrays should fire even - // when the value is the same, because the value may - // have mutated. - BI._.isObject(value) && options && options.refresh || this.deep) { - // set new value - var oldValue = this.value; - this.value = value; - if (this.user) { - try { - this.cb.call(this.vm, value, oldValue, options); - } catch (e) { - console.error(e); - } - } else { - try { - this.cb.call(this.vm, value, oldValue, options); - } catch (e) { - console.error(e); - } - } - } - } - }; - - Watcher.prototype.evaluate = function evaluate() { - this.value = this.get(); - this.dirty = false; - }; - - Watcher.prototype.depend = function depend() { - var i = this.deps.length; - while (i--) { - this.deps[i].depend(); - } - }; - - Watcher.prototype.teardown = function teardown() { - if (this.active) { - // remove self from vm's watcher list - // this is a somewhat expensive operation so we skip it - // if the vm is being destroyed. - remove(this.vm && this.vm._watchers, this); - var i = this.deps.length; - while (i--) { - this.deps[i].removeSub(this); - } - this.active = false; - } - }; - - return Watcher; - }(); - - var seenObjects = new Set(); - - function traverse(val) { - seenObjects.clear(); - _traverse(val, seenObjects); - } - - function _traverse(val, seen) { - var i = void 0, - keys = void 0; - var isA = BI._.isArray(val); - if (!isA && !BI._.isObject(val)) { - return; - } - if (val.__ob__) { - var depId = val.__ob__.dep.id; - if (seen.has(depId)) { - return; - } - seen.add(depId); - } - if (isA) { - i = val.length; - while (i--) { - _traverse(val[i], seen); - } - } else { - keys = BI._.keys(val); - i = keys.length; - while (i--) { - _traverse(val[keys[i]], seen); - } - } - } - - var arrayProto = Array.prototype; - var arrayMethods = []; - BI._.each(['push', 'pop', 'shift', 'unshift', 'splice', 'sort', 'reverse'], function (method) { - var original = arrayProto[method]; - arrayMethods[method] = function mutator() { - for (var _len = arguments.length, args = Array(_len), _key2 = 0; _key2 < _len; _key2++) { - args[_key2] = arguments[_key2]; - } - - var ob = this.__ob__; - var inserted = void 0; - switch (method) { - case 'push': - case 'unshift': - inserted = args; - break; - case 'splice': - inserted = args.slice(2); - break; - } - if (inserted) inserted = ob.observeArray(inserted); - switch (method) { - case 'push': - case 'unshift': - args = inserted; - break; - case 'splice': - if (args.length > 2) { - args = [args[0], args[1]].concat(inserted ? inserted : []); - } - break; - } - var result = original.apply(this, args); - notify(ob.parent, ob.parentKey, ob.dep, true); - return result; - }; - }); - - var arrayKeys = BI._.keys(arrayMethods); - - var observerState = { - shouldConvert: true - }; - - function def(obj, key, val, enumerable) { - Object.defineProperty(obj, key, { - value: val, - enumerable: !!enumerable, - writable: true, - configurable: true - }); - } - - /** - * Observer class that are attached to each observed - * object. Once attached, the observer converts target - * object's property keys into getter/setters that - * collect dependencies and dispatches updates. - */ - - var Observer = function () { - function Observer(value) { - _classCallCheck(this, Observer); - - this.value = value; - this.dep = new Dep(); - this.vmCount = 0; - if (BI._.isArray(value)) { - var augment = hasProto ? protoAugment : copyAugment; - augment(value, arrayMethods, arrayKeys); - this.model = this.observeArray(value); - } else { - this.model = this.walk(value); - } - def(this.model, "__ob__", this); - } - - Observer.prototype.walk = function walk(obj) { - return defineReactive(obj, this); - }; - - Observer.prototype.observeArray = function observeArray(items) { - for (var i = 0, l = items.length; i < l; i++) { - var ob = observe(items[i], this, i); - items[i] = ob ? ob.model : items[i]; - } - return items; - }; - - return Observer; - }(); - - function protoAugment(target, src, keys) { - /* eslint-disable no-proto */ - target.__proto__ = src; - /* eslint-enable no-proto */ - } - - /* istanbul ignore next */ - function copyAugment(target, src, keys) { - for (var i = 0, l = keys.length; i < l; i++) { - var key = keys[i]; - target[key] = src[key]; - } - } - - function observe(value, parentObserver, parentKey) { - if (!BI._.isObject(value)) { - return; - } - var ob = void 0; - if (value.__ob__ instanceof Observer) { - ob = value.__ob__; - } else if (observerState.shouldConvert && isExtensible(value) && (BI._.isArray(value) || isPlainObject(value))) { - ob = new Observer(value); - } - if (ob) { - ob.parent = parentObserver || ob.parent; - ob.parentKey = parentKey; - } - return ob; - } - - function notify(observer, key, dep, refresh) { - dep.notify({ observer: observer, key: key, refresh: refresh }); - if (observer) { - //触发a.*绑定的依赖 - BI._.each(observer._deps, function (dep) { - dep.notify({ observer: observer, key: key }); - }); - //触发a.**绑定的依赖 - var parent = observer, - root = observer, - route = key || ""; - while (parent) { - BI._.each(parent._scopeDeps, function (dep) { - dep.notify({ observer: observer, key: key }); - }); - if (parent.parentKey != null) { - route = parent.parentKey + '.' + route; - } - root = parent; - parent = parent.parent; - } - for (var _key in root._globalDeps) { - var reg = new RegExp(_key); - if (reg.test(route)) { - for (var i = 0; i < root._globalDeps[_key].length; i++) { - root._globalDeps[_key][i].notify({ observer: observer, key: _key }); - } - } - } - } - } - - function defineReactive(obj, observer, shallow) { - var props = {}; - var model = void 0; - BI._.each(obj, function (val, key) { - if (key in $$skipArray) { - return; - } - var configurable = isConfigurable(obj, key); - var dep = observer && observer['__dep' + key] || new Dep(); - observer && (observer['__dep' + key] = dep); - var childOb = configurable && !shallow && observe(val, observer, key); - props[key] = { - enumerable: true, - configurable: true, - get: function reactiveGetter() { - var value = childOb ? childOb.model : val; - if (Dep.target) { - dep.depend(); - if (childOb) { - childOb.dep.depend(); - if (BI._.isArray(value)) { - dependArray(value); - } - } - } - return value; - }, - set: function reactiveSetter(newVal) { - var value = childOb ? childOb.model : val; - if (newVal === value || newVal !== newVal && value !== value) { - return; - } - val = newVal; - childOb = configurable && !shallow && observe(newVal, observer, key); - if (childOb && value && value.__ob__) { - childOb._scopeDeps = value.__ob__._scopeDeps; - childOb._deps = value.__ob__._deps; - } - obj[key] = childOb ? childOb.model : newVal; - notify(model.__ob__, key, dep); - } - }; - }); - return model = createViewModel$1(obj, props); - } - - function defineReactiveProperty(obj, key, val, shallow) { - - var dep = new Dep(); - - var configurable = isConfigurable(obj, key); - if (!configurable) { - return; - } - - if (arguments.length === 2) { - val = obj[key]; - } - - var childOb = !shallow && observe(val); - Object.defineProperty(obj, key, { - enumerable: true, - configurable: true, - get: function reactiveGetter() { - var value = childOb ? childOb.model : val; - if (Dep.target) { - dep.depend(); - if (childOb) { - childOb.dep.depend(); - if (BI._.isArray(value)) { - dependArray(value); - } - } - } - return value; - }, - set: function reactiveSetter(newVal) { - var value = childOb ? childOb.model : val; - if (newVal === value || newVal !== newVal && value !== value) { - return; - } - - childOb = configurable && !shallow && observe(newVal); - val = newVal; - obj[key] = childOb ? childOb.model : newVal; - dep.notify(); - } - }); - } - - /** - * Set a property on an object. Adds the new property and - * triggers change notification if the property doesn't - * already exist. - */ - function set(target, key, val) { - if (BI._.isArray(target)) { - target.length = Math.max(target.length, key); - target.splice(key, 1, val); - return val; - } - if (BI._.has(target, key)) { - target[key] = val; - return val; - } - var ob = target.__ob__; - if (!ob) { - target[key] = val; - return val; - } - ob.value[key] = val; - target = defineReactive(ob.value, ob); - notify(ob, key, ob.dep); - return target; - } - - function freeze() { - return Object.freeze.apply(null, arguments); - } - - /** - * Delete a property and trigger change if necessary. - */ - function del(target, key) { - if (BI._.isArray(target)) { - target.splice(key, 1); - return; - } - var ob = target.__ob__; - if (!BI._.has(target, key)) { - return; - } - if (!ob) { - delete target[key]; - return target; - } - delete ob.value[key]; - target = defineReactive(ob.value, ob); - notify(ob, key, ob.dep); - return target; - } - - /** - * Collect dependencies on array elements when the array is touched, since - * we cannot intercept array element access like property getters. - */ - function dependArray(value) { - for (var e, i = 0, l = value.length; i < l; i++) { - e = value[i]; - e && e.__ob__ && e.__ob__.dep.depend(); - if (BI._.isArray(e)) { - dependArray(e); - } - } - } - - var falsy$1; - var operators = { - '||': falsy$1, - '&&': falsy$1, - '(': falsy$1, - ')': falsy$1 - }; - - function runBinaryFunction(binarys) { - var expr = ''; - for (var i = 0, len = binarys.length; i < len; i++) { - if (BI._.isBoolean(binarys[i]) || BI._.has(operators, binarys[i])) { - expr += binarys[i]; - } else { - expr += 'false'; - } - } - return new Function('return ' + expr)(); - } - - function routeToRegExp(route) { - route = route.replace(/\*\*/g, '[a-zA-Z0-9_]+').replace(/\*./g, '[a-zA-Z0-9_]+.'); - return '^' + route + '$'; - } - - function watch(model, expOrFn, cb, options) { - if (isPlainObject(cb)) { - options = cb; - cb = cb.handler; - } - if (typeof cb === 'string') { - cb = model[cb]; - } - options = options || {}; - options.user = true; - var exps = void 0; - if (BI._.isFunction(expOrFn) || !(exps = expOrFn.match(/[a-zA-Z0-9BI._.*]+|[|][|]|[&][&]|[(]|[)]/g)) || exps.length === 1 && expOrFn.indexOf("*") < 0) { - var watcher = new Watcher(model, expOrFn, cb, options); - if (options.immediate) { - cb(watcher.value); - } - return function unwatchFn() { - watcher.teardown(); - }; - } - var watchers = []; - var fns = exps.slice(); - var complete = false, - running = false; - var callback = function callback(index, newValue, oldValue, attrs) { - if (complete === true) { - return; - } - fns[index] = true; - if (runBinaryFunction(fns)) { - complete = true; - cb(newValue, oldValue, attrs); - } - if (options && options.sync) { - complete = false; - running = false; - fns = exps.slice(); - } else { - if (!running) { - running = true; - nextTick(function () { - complete = false; - running = false; - fns = exps.slice(); - }); - } - } - }; - BI._.each(exps, function (exp, i) { - if (BI._.has(operators, exp)) { - return; - } - if (exp.indexOf("*") >= 0) { - //a.**或a.*形式 - if (/^[1-9a-zA-Z.]+(\*\*$|\*$)/.test(exp) || exp === "**" || exp === "*") { - var isGlobal = exp.indexOf("**") >= 0; - if (isGlobal) { - //a.**的形式 - exp = exp.replace(".**", ""); - } else { - //a.*的形式 - exp = exp.replace(".*", ""); - } - var getter = exp === "**" || exp === "*" ? function (m) { - return m; - } : parsePath(exp); - var v = getter.call(model, model); - var _dep = new Dep(); - if (isGlobal) { - (v.__ob__._scopeDeps || (v.__ob__._scopeDeps = [])).push(_dep); - } else { - (v.__ob__._deps || (v.__ob__._deps = [])).push(_dep); - } - var _w = new Watcher(model, function () { - _dep.depend(); - return NaN; - }, function (newValue, oldValue, attrs) { - callback(i, newValue, oldValue, BI._.extend({ index: i }, attrs)); - }, options); - watchers.push(function unwatchFn() { - _w.teardown(); - v.__ob__._scopeDeps && remove(v.__ob__._scopeDeps, _dep); - v.__ob__._deps && remove(v.__ob__._deps, _dep); - }); - return; - } - // **.a.**的情况,场景:a.b.c, 如果用b.**监听, a被重新赋值b上的_scopeDes就不存在了 - if (/^(\*\*\.)+[1-9a-zA-Z]+(\.\*\*$)/.test(exp)) { - //先获取到能获取到的对象 - var _paths = exp.split("."); - var _currentModel = model[_paths[1]]; - exp = _paths[1] + ".**"; - //补全路径 - var _parent = _currentModel.__ob__.parent, - _root = _currentModel.__ob__; - while (_parent) { - exp = '*.' + exp; - _root = _parent; - _parent = _parent.parent; - } - var _regStr = routeToRegExp(exp); - var _dep2 = new Dep(); - _root._globalDeps || (_root._globalDeps = {}); - if (BI._.isArray(_root._globalDeps[_regStr])) { - _root._globalDeps[_regStr].push(_dep2); - } else { - _root._globalDeps[_regStr] = [_dep2]; - } - - var _w2 = new Watcher(_currentModel, function () { - _dep2.depend(); - return NaN; - }, function (newValue, oldValue, attrs) { - callback(i, newValue, oldValue, BI._.extend({ index: i }, attrs)); - }, options); - watchers.push(function unwatchFn() { - if (_root._globalDeps) { - remove(_root._globalDeps[_regStr], _dep2); - - if (_root._globalDeps[_regStr].length === 0) { - delete _root._globalDeps[_regStr]; - _w2.teardown(); - } - } - }); - return; - } - // 再有结尾有*的就不支持了 - if (exp[exp.length - 1] === "*") { - throw new Error('not support'); - } - //其他含有*的情况,如*.a,*.*.a,a.*.a - var currentModel = model; - //先获取到能获取到的对象 - var paths = exp.split("."); - for (var _i = 0, len = paths.length; _i < len; _i++) { - if (paths[_i] === "*") { - break; - } - currentModel = model[paths[_i]]; - } - exp = exp.substr(exp.indexOf("*")); - //补全路径 - var parent = currentModel.__ob__.parent, - root = currentModel.__ob__; - while (parent) { - exp = '*.' + exp; - root = parent; - parent = parent.parent; - } - var regStr = routeToRegExp(exp); - var dep = new Dep(); - root._globalDeps || (root._globalDeps = {}); - if (BI._.isArray(root._globalDeps[regStr])) { - root._globalDeps[regStr].push(dep); - } else { - root._globalDeps[regStr] = [dep]; - } - - var w = new Watcher(currentModel, function () { - dep.depend(); - return NaN; - }, function (newValue, oldValue, attrs) { - callback(i, newValue, oldValue, BI._.extend({ index: i }, attrs)); - }, options); - watchers.push(function unwatchFn() { - if (root._globalDeps) { - remove(root._globalDeps[regStr], dep); - if (root._globalDeps[regStr].length === 0) { - delete root._globalDeps[regStr]; - w.teardown(); - } - } - }); - return; - } - var watcher = new Watcher(model, exp, function (newValue, oldValue, attrs) { - callback(i, newValue, oldValue, BI._.extend({ index: i }, attrs)); - }, options); - watchers.push(function unwatchFn() { - watcher.teardown(); - }); - }); - return watchers; - } - - var mixinInjection = {}; - - function getMixins(type) { - return mixinInjection[type]; - } - - function mixin(xtype, cls) { - mixinInjection[xtype] = BI._.cloneDeep(cls); - } - - var computedWatcherOptions = { lazy: true }; - var REACTIVE = true; - - function initState(vm, state) { - if (state) { - vm.$$state = REACTIVE ? observe(state).model : state; - } - } - - function initComputed(vm, computed) { - var watchers = vm._computedWatchers = {}; - defineComputed(vm, computed); - for (var key in computed) { - watchers[key] = defineComputedWatcher(vm, computed[key]); - } - } - - function defineComputedWatcher(vm, userDef) { - var context = vm.$$model ? vm.model : vm; - var getter = typeof userDef === "function" ? userDef : userDef.get; - - return new Watcher(context, getter || noop, noop, computedWatcherOptions); - } - - function defineOneComputedGetter(vm, key, userDef) { - var shouldCache = true; - var sharedPropertyDefinition = { - enumerable: true, - configurable: true, - get: noop, - set: noop - }; - if (typeof userDef === "function") { - sharedPropertyDefinition.get = createComputedGetter(vm, key); - sharedPropertyDefinition.set = noop; - } else { - sharedPropertyDefinition.get = userDef.get ? shouldCache && userDef.cache !== false ? createComputedGetter(vm, key) : userDef.get : noop; - sharedPropertyDefinition.set = userDef.set ? userDef.set : noop; - } - return sharedPropertyDefinition; - } - - function defineComputed(vm, computed) { - var props = {}; - for (var key in computed) { - if (!(key in vm)) { - props[key] = defineOneComputedGetter(vm, key, computed[key]); - } - } - vm.$$computed = createViewModel$1({}, props); - } - - function createComputedGetter(vm, key) { - return function computedGetter() { - var watcher = vm._computedWatchers && vm._computedWatchers[key]; - if (watcher) { - if (watcher.dirty) { - watcher.evaluate(); - } - if (REACTIVE && Dep.target) { - watcher.depend(); - } - return watcher.value; - } - }; - } - - function initWatch(vm, watch$$1) { - vm._watchers || (vm._watchers = []); - for (var key in watch$$1) { - var handler = watch$$1[key]; - if (BI._.isArray(handler)) { - for (var i = 0; i < handler.length; i++) { - vm._watchers.push(createWatcher(vm, key, handler[i])); - } - } else { - vm._watchers.push(createWatcher(vm, key, handler)); - } - } - } - - function createWatcher(vm, keyOrFn, cb, options) { - if (isPlainObject(cb)) { - options = cb; - cb = cb.handler; - } - if (typeof cb === 'string') { - cb = vm[cb]; - } - return watch(vm.model, keyOrFn, BI._.bind(cb, vm.$$model ? vm.model : vm), options); - } - - function initMethods(vm, methods) { - for (var key in methods) { - vm[key] = methods[key] == null ? noop : BI._.bind(methods[key], vm.$$model ? vm.model : vm); - } - } - - function initMixins(vm, mixins) { - mixins = (mixins || []).slice(0); - - BI._.each(mixins.reverse(), function (mixinType) { - var mixin$$1 = getMixins(mixinType); - - for (var key in mixin$$1) { - if (typeof mixin$$1[key] !== "function") continue; - - if (BI._.has(vm, key)) continue; - - vm[key] = BI._.bind(mixin$$1[key], vm.$$model ? vm.model : vm); - } - }); - } - - function defineProps(vm, keys) { - var props = {}; - // if (typeof Proxy === 'function') { - // return vm.model = new Proxy(props, { - // has: function (target, key) { - // return keys.indexOf(key) > -1; - // }, - // get: function (target, key) { - // if (key in $$skipArray) { - // return props[key] - // } - // if (vm.$$computed && key in vm.$$computed) { - // return vm.$$computed[key] - // } - // if (vm.$$state && key in vm.$$state) { - // return vm.$$state[key] - // } - // return vm.$$model[key] - // }, - // set: function (target, key, val) { - // if (key in $$skipArray) { - // return props[key] = val - // } - // if (vm.$$state && key in vm.$$state) { - // return vm.$$state[key] = val - // } - // if (vm.$$model && key in vm.$$model) { - // return vm.$$model[key] = val - // } - // } - // }) - // } - - var _loop = function _loop(i, len) { - var key = keys[i]; - if (!(key in $$skipArray)) { - props[key] = { - enumerable: true, - configurable: true, - get: function get() { - if (vm.$$computed && key in vm.$$computed) { - return vm.$$computed[key]; - } - if (vm.$$state && key in vm.$$state) { - return vm.$$state[key]; - } - if (vm.$$model && key in vm.$$model) { - return vm.$$model[key]; - } - var p = vm._parent; - while (p) { - if (p.$$context && key in p.$$context) { - return p.$$context[key]; - } - p = p._parent; - } - }, - set: function set(val) { - if (vm.$$state && key in vm.$$state) { - return vm.$$state[key] = val; - } - if (vm.$$model && key in vm.$$model) { - return vm.$$model[key] = val; - } - var p = vm._parent; - while (p) { - if (p.$$context && key in p.$$context) { - return p.$$context[key] = val; - } - p = p._parent; - } - } - }; - } - }; - - for (var i = 0, len = keys.length; i < len; i++) { - _loop(i, len); - } - vm.model = createViewModel$1({}, props); - } - - function defineContext(vm, keys) { - var props = {}; - - var _loop2 = function _loop2(i, len) { - var key = keys[i]; - if (!(key in $$skipArray)) { - props[key] = { - enumerable: true, - configurable: true, - get: function get() { - return vm.model[key]; - }, - set: function set(val) { - return vm.model[key] = val; - } - }; - } - }; - - for (var i = 0, len = keys.length; i < len; i++) { - _loop2(i, len); - } - vm.$$context = createViewModel$1({}, props); - } - - function getInjectValue(vm, key) { - var p = vm._parent; - while (p) { - if (p.$$context && key in p.$$context) { - return p.$$context[key]; - } - p = p._parent; - } - } - - function getInjectValues(vm) { - var inject = vm.inject || []; - var result = {}; - BI._.each(inject, function (key) { - result[key] = getInjectValue(vm, key); - }); - return result; - } - - var Model = function () { - function Model() { - _classCallCheck(this, Model); - } - - Model.prototype._constructor = function _constructor(model, destroyHandler) { - if (model instanceof Observer || model instanceof Model) { - model = model.model; - } - if (model && model.__ob__) { - this.$$model = model; - } else { - this.options = model || {}; - } - this._parent = Model.target; - var state = BI._.isFunction(this.state) ? this.state() : this.state; - var computed = this.computed; - var context = this.context; - var inject = this.inject; - var childContext = this.childContext; - var provide = this.provide; - var watch$$1 = this.watch; - var actions = this.actions; - var keys = BI._.keys(this.$$model).concat(BI._.keys(state)).concat(BI._.keys(computed)).concat(inject || []).concat(context || []); - var mixins = this.mixins; - defineProps(this, keys); - // deprecated - childContext && defineContext(this, childContext); - provide && defineContext(this, provide); - this.$$model && (this.model.__ob__ = this.$$model.__ob__); - initMixins(this, mixins); - this.init(); - initState(this, BI._.extend(getInjectValues(this), state)); - initComputed(this, computed); - REACTIVE && initWatch(this, watch$$1); - initMethods(this, actions); - this.created && this.created(); - this._destroyHandler = destroyHandler; - if (this.$$model) { - return this.model; - } - }; - - Model.prototype._init = function _init() {}; - - Model.prototype.init = function init() { - this._init(); - }; - - Model.prototype.destroy = function destroy() { - for (var _key3 in this._computedWatchers) { - this._computedWatchers[_key3].teardown(); - } - BI._.each(this._watchers, function (unwatches) { - unwatches = BI._.isArray(unwatches) ? unwatches : [unwatches]; - BI._.each(unwatches, function (unwatch) { - unwatch(); - }); - }); - this._watchers && (this._watchers = []); - this.destroyed && this.destroyed(); - this.$$model = null; - this.$$computed = null; - this.$$state = null; - this._destroyHandler && this._destroyHandler(); - }; - - return Model; - }(); - - function define(model) { - return REACTIVE ? new Observer(model).model : model; - } - - var reactive = define; - - function config(options) { - options || (options = {}); - if ("reactive" in options) { - REACTIVE = options.reactive; - } - } - - function toJSON(model) { - var result = void 0; - if (BI._.isArray(model)) { - result = []; - for (var i = 0, len = model.length; i < len; i++) { - result[i] = toJSON(model[i]); - } - } else if (model && isPlainObject(model)) { - result = {}; - for (var _key4 in model) { - if (!BI._.has($$skipArray, _key4)) { - result[_key4] = toJSON(model[_key4]); - } - } - } else { - result = model; - } - return result; - } - - var version = '2.0'; - - exports.version = version; - exports.$$skipArray = $$skipArray; - exports.mixin = mixin; - exports.Model = Model; - exports.define = define; - exports.reactive = reactive; - exports.config = config; - exports.observerState = observerState; - exports.Observer = Observer; - exports.observe = observe; - exports.notify = notify; - exports.defineReactive = defineReactive; - exports.defineReactiveProperty = defineReactiveProperty; - exports.set = set; - exports.freeze = freeze; - exports.del = del; - exports.Watcher = Watcher; - exports.pushTarget = pushTarget; - exports.popTarget = popTarget; - exports.watch = watch; - exports.toJSON = toJSON; - - exports.__esModule = true; -}); \ No newline at end of file diff --git a/dist/fix/fix.proxy.js b/dist/fix/fix.proxy.js deleted file mode 100644 index 4a709fb3c..000000000 --- a/dist/fix/fix.proxy.js +++ /dev/null @@ -1,2475 +0,0 @@ -(function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : - typeof define === 'function' && define.amd ? define(['exports'], factory) : - (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.Fix = {})); -})(this, (function (exports) { 'use strict'; - - function _typeof(obj) { - "@babel/helpers - typeof"; - - return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { - return typeof obj; - } : function (obj) { - return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; - }, _typeof(obj); - } - - function _classCallCheck(instance, Constructor) { - if (!(instance instanceof Constructor)) { - throw new TypeError("Cannot call a class as a function"); - } - } - - function _defineProperties(target, props) { - for (var i = 0; i < props.length; i++) { - var descriptor = props[i]; - descriptor.enumerable = descriptor.enumerable || false; - descriptor.configurable = true; - if ("value" in descriptor) descriptor.writable = true; - Object.defineProperty(target, descriptor.key, descriptor); - } - } - - function _createClass(Constructor, protoProps, staticProps) { - if (protoProps) _defineProperties(Constructor.prototype, protoProps); - if (staticProps) _defineProperties(Constructor, staticProps); - Object.defineProperty(Constructor, "prototype", { - writable: false - }); - return Constructor; - } - - function _defineProperty(obj, key, value) { - if (key in obj) { - Object.defineProperty(obj, key, { - value: value, - enumerable: true, - configurable: true, - writable: true - }); - } else { - obj[key] = value; - } - - return obj; - } - - function _slicedToArray(arr, i) { - return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); - } - - function _toConsumableArray(arr) { - return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); - } - - function _arrayWithoutHoles(arr) { - if (Array.isArray(arr)) return _arrayLikeToArray(arr); - } - - function _arrayWithHoles(arr) { - if (Array.isArray(arr)) return arr; - } - - function _iterableToArray(iter) { - if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); - } - - function _iterableToArrayLimit(arr, i) { - var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]; - - if (_i == null) return; - var _arr = []; - var _n = true; - var _d = false; - - var _s, _e; - - try { - for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { - _arr.push(_s.value); - - if (i && _arr.length === i) break; - } - } catch (err) { - _d = true; - _e = err; - } finally { - try { - if (!_n && _i["return"] != null) _i["return"](); - } finally { - if (_d) throw _e; - } - } - - return _arr; - } - - function _unsupportedIterableToArray(o, minLen) { - if (!o) return; - if (typeof o === "string") return _arrayLikeToArray(o, minLen); - var n = Object.prototype.toString.call(o).slice(8, -1); - if (n === "Object" && o.constructor) n = o.constructor.name; - if (n === "Map" || n === "Set") return Array.from(o); - if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); - } - - function _arrayLikeToArray(arr, len) { - if (len == null || len > arr.length) len = arr.length; - - for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; - - return arr2; - } - - function _nonIterableSpread() { - throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); - } - - function _nonIterableRest() { - throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); - } - - function _createForOfIteratorHelper(o, allowArrayLike) { - var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; - - if (!it) { - if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { - if (it) o = it; - var i = 0; - - var F = function () {}; - - return { - s: F, - n: function () { - if (i >= o.length) return { - done: true - }; - return { - done: false, - value: o[i++] - }; - }, - e: function (e) { - throw e; - }, - f: F - }; - } - - throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); - } - - var normalCompletion = true, - didErr = false, - err; - return { - s: function () { - it = it.call(o); - }, - n: function () { - var step = it.next(); - normalCompletion = step.done; - return step; - }, - e: function (e) { - didErr = true; - err = e; - }, - f: function () { - try { - if (!normalCompletion && it.return != null) it.return(); - } finally { - if (didErr) throw err; - } - } - }; - } - - /** - * Make a map and return a function for checking if a key - * is in that map. - * IMPORTANT: all calls of this function must be prefixed with - * \/\*#\_\_PURE\_\_\*\/ - * So that rollup can tree-shake them if necessary. - */ - function makeMap(str, expectsLowerCase) { - var map = Object.create(null); - var list = str.split(','); - - for (var i = 0; i < list.length; i++) { - map[list[i]] = true; - } - - return expectsLowerCase ? function (val) { - return !!map[val.toLowerCase()]; - } : function (val) { - return !!map[val]; - }; - } - - Object.freeze({}); - Object.freeze([]); - var extend = Object.assign; - var hasOwnProperty = Object.prototype.hasOwnProperty; - - var hasOwn = function hasOwn(val, key) { - return hasOwnProperty.call(val, key); - }; - - var isArray = Array.isArray; - - var isMap$1 = function isMap(val) { - return toTypeString$1(val) === '[object Map]'; - }; - - var isFunction = function isFunction(val) { - return typeof val === 'function'; - }; - - var isString = function isString(val) { - return typeof val === 'string'; - }; - - var isSymbol = function isSymbol(val) { - return _typeof(val) === 'symbol'; - }; - - var isObject = function isObject(val) { - return val !== null && _typeof(val) === 'object'; - }; - - var objectToString$1 = Object.prototype.toString; - - var toTypeString$1 = function toTypeString(value) { - return objectToString$1.call(value); - }; - - var toRawType = function toRawType(value) { - // extract "RawType" from strings like "[object RawType]" - return toTypeString$1(value).slice(8, -1); - }; - - var isIntegerKey = function isIntegerKey(key) { - return isString(key) && key !== 'NaN' && key[0] !== '-' && '' + parseInt(key, 10) === key; - }; - - var cacheStringFunction = function cacheStringFunction(fn) { - var cache = Object.create(null); - return function (str) { - var hit = cache[str]; - return hit || (cache[str] = fn(str)); - }; - }; - /** - * @private - */ - - - var capitalize = cacheStringFunction(function (str) { - return str.charAt(0).toUpperCase() + str.slice(1); - }); // compare whether a value has changed, accounting for NaN. - - var hasChanged$1 = function hasChanged(value, oldValue) { - return !Object.is(value, oldValue); - }; - - var activeEffectScope; - - function recordEffectScope(effect, scope) { - scope = scope || activeEffectScope; - - if (scope && scope.active) { - scope.effects.push(effect); - } - } - - var createDep = function createDep(effects) { - var dep = new Set(effects); - dep.w = 0; - dep.n = 0; - return dep; - }; - - var wasTracked = function wasTracked(dep) { - return (dep.w & trackOpBit) > 0; - }; - - var newTracked = function newTracked(dep) { - return (dep.n & trackOpBit) > 0; - }; - - var initDepMarkers = function initDepMarkers(_ref) { - var deps = _ref.deps; - - if (deps.length) { - for (var i = 0; i < deps.length; i++) { - deps[i].w |= trackOpBit; // set was tracked - } - } - }; - - var finalizeDepMarkers = function finalizeDepMarkers(effect) { - var deps = effect.deps; - - if (deps.length) { - var ptr = 0; - - for (var i = 0; i < deps.length; i++) { - var dep = deps[i]; - - if (wasTracked(dep) && !newTracked(dep)) { - dep.delete(effect); - } else { - deps[ptr++] = dep; - } // clear bits - - - dep.w &= ~trackOpBit; - dep.n &= ~trackOpBit; - } - - deps.length = ptr; - } - }; - - var targetMap = new WeakMap(); // The number of effects currently being tracked recursively. - - var effectTrackDepth = 0; - var trackOpBit = 1; - /** - * The bitwise track markers support at most 30 levels of recursion. - * This value is chosen to enable modern JS engines to use a SMI on all platforms. - * When recursion depth is greater, fall back to using a full cleanup. - */ - - var maxMarkerBits = 30; - var effectStack = []; - var activeEffect; - var ITERATE_KEY = Symbol('iterate'); - var MAP_KEY_ITERATE_KEY = Symbol('Map key iterate'); - - var ReactiveEffect = /*#__PURE__*/function () { - function ReactiveEffect(fn) { - var scheduler = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null; - var scope = arguments.length > 2 ? arguments[2] : undefined; - - _classCallCheck(this, ReactiveEffect); - - this.fn = fn; - this.scheduler = scheduler; - this.active = true; - this.deps = []; - recordEffectScope(this, scope); - } - - _createClass(ReactiveEffect, [{ - key: "run", - value: function run() { - if (!this.active) { - return this.fn(); - } - - if (!effectStack.includes(this)) { - try { - effectStack.push(activeEffect = this); - enableTracking(); - trackOpBit = 1 << ++effectTrackDepth; - - if (effectTrackDepth <= maxMarkerBits) { - initDepMarkers(this); - } else { - cleanupEffect(this); - } - - return this.fn(); - } finally { - if (effectTrackDepth <= maxMarkerBits) { - finalizeDepMarkers(this); - } - - trackOpBit = 1 << --effectTrackDepth; - resetTracking(); - effectStack.pop(); - var n = effectStack.length; - activeEffect = n > 0 ? effectStack[n - 1] : undefined; - } - } - } - }, { - key: "stop", - value: function stop() { - if (this.active) { - cleanupEffect(this); - - if (this.onStop) { - this.onStop(); - } - - this.active = false; - } - } - }]); - - return ReactiveEffect; - }(); - - function cleanupEffect(effect) { - var deps = effect.deps; - - if (deps.length) { - for (var i = 0; i < deps.length; i++) { - deps[i].delete(effect); - } - - deps.length = 0; - } - } - - function effect(fn, options) { - if (fn.effect) { - fn = fn.effect.fn; - } - - var _effect = new ReactiveEffect(fn); - - if (options) { - extend(_effect, options); - if (options.scope) recordEffectScope(_effect, options.scope); - } - - if (!options || !options.lazy) { - _effect.run(); - } - - var runner = _effect.run.bind(_effect); - - runner.effect = _effect; - return runner; - } - - function stop(runner) { - runner.effect.stop(); - } - - var shouldTrack = true; - var trackStack = []; - - function pauseTracking() { - trackStack.push(shouldTrack); - shouldTrack = false; - } - - function enableTracking() { - trackStack.push(shouldTrack); - shouldTrack = true; - } - - function resetTracking() { - var last = trackStack.pop(); - shouldTrack = last === undefined ? true : last; - } - - function track(target, type, key) { - if (!isTracking()) { - return; - } - - var depsMap = targetMap.get(target); - - if (!depsMap) { - targetMap.set(target, depsMap = new Map()); - } - - var dep = depsMap.get(key); - - if (!dep) { - depsMap.set(key, dep = createDep()); - } - - var eventInfo = { - effect: activeEffect, - target: target, - type: type, - key: key - }; - trackEffects(dep, eventInfo); - } - - function isTracking() { - return shouldTrack && activeEffect !== undefined; - } - - function trackEffects(dep, debuggerEventExtraInfo) { - var shouldTrack = false; - - if (effectTrackDepth <= maxMarkerBits) { - if (!newTracked(dep)) { - dep.n |= trackOpBit; // set newly tracked - - shouldTrack = !wasTracked(dep); - } - } else { - // Full cleanup mode. - shouldTrack = !dep.has(activeEffect); - } - - if (shouldTrack) { - dep.add(activeEffect); - activeEffect.deps.push(dep); - - if (activeEffect.onTrack) { - activeEffect.onTrack(Object.assign({ - effect: activeEffect - }, debuggerEventExtraInfo)); - } - } - } - - function trigger(target, type, key, newValue, oldValue, oldTarget) { - var depsMap = targetMap.get(target); - - if (!depsMap) { - // never been tracked - return; - } - - var deps = []; - - if (type === "clear" - /* CLEAR */ - ) { - // collection being cleared - // trigger all effects for target - deps = _toConsumableArray(depsMap.values()); - } else if (key === 'length' && isArray(target)) { - depsMap.forEach(function (dep, key) { - if (key === 'length' || key >= newValue) { - deps.push(dep); - } - }); - } else { - // schedule runs for SET | ADD | DELETE - if (key !== void 0) { - deps.push(depsMap.get(key)); - } // also run for iteration key on ADD | DELETE | Map.SET - - - switch (type) { - case "add" - /* ADD */ - : - if (!isArray(target)) { - deps.push(depsMap.get(ITERATE_KEY)); - - if (isMap$1(target)) { - deps.push(depsMap.get(MAP_KEY_ITERATE_KEY)); - } - } else if (isIntegerKey(key)) { - // new index added to array -> length changes - deps.push(depsMap.get('length')); - } - - break; - - case "delete" - /* DELETE */ - : - if (!isArray(target)) { - deps.push(depsMap.get(ITERATE_KEY)); - - if (isMap$1(target)) { - deps.push(depsMap.get(MAP_KEY_ITERATE_KEY)); - } - } - - break; - - case "set" - /* SET */ - : - if (isMap$1(target)) { - deps.push(depsMap.get(ITERATE_KEY)); - } - - break; - } - } - - var eventInfo = { - target: target, - type: type, - key: key, - newValue: newValue, - oldValue: oldValue, - oldTarget: oldTarget - }; - - if (deps.length === 1) { - if (deps[0]) { - { - triggerEffects(deps[0], eventInfo); - } - } - } else { - var effects = []; - - var _iterator = _createForOfIteratorHelper(deps), - _step; - - try { - for (_iterator.s(); !(_step = _iterator.n()).done;) { - var dep = _step.value; - - if (dep) { - effects.push.apply(effects, _toConsumableArray(dep)); - } - } - } catch (err) { - _iterator.e(err); - } finally { - _iterator.f(); - } - - { - triggerEffects(createDep(effects), eventInfo); - } - } - } - - function triggerEffects(dep, debuggerEventExtraInfo) { - // spread into array for stabilization - var _iterator2 = _createForOfIteratorHelper(isArray(dep) ? dep : _toConsumableArray(dep)), - _step2; - - try { - for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) { - var _effect2 = _step2.value; - - if (_effect2 !== activeEffect || _effect2.allowRecurse) { - if (_effect2.onTrigger) { - _effect2.onTrigger(extend({ - effect: _effect2 - }, debuggerEventExtraInfo)); - } - - if (_effect2.scheduler) { - _effect2.scheduler(); - } else { - _effect2.run(); - } - } - } - } catch (err) { - _iterator2.e(err); - } finally { - _iterator2.f(); - } - } - - var isNonTrackableKeys = /*#__PURE__*/makeMap("__proto__,__v_isRef,__isVue"); - var builtInSymbols = new Set(Object.getOwnPropertyNames(Symbol).map(function (key) { - return Symbol[key]; - }).filter(isSymbol)); - var get = /*#__PURE__*/createGetter(); - var readonlyGet = /*#__PURE__*/createGetter(true); - var arrayInstrumentations = /*#__PURE__*/createArrayInstrumentations(); - - function createArrayInstrumentations() { - var instrumentations = {}; - ['includes', 'indexOf', 'lastIndexOf'].forEach(function (key) { - instrumentations[key] = function () { - var arr = toRaw(this); - - for (var i = 0, l = this.length; i < l; i++) { - track(arr, "get" - /* GET */ - , i + ''); - } // we run the method using the original args first (which may be reactive) - - - for (var _len2 = arguments.length, args = new Array(_len2), _key3 = 0; _key3 < _len2; _key3++) { - args[_key3] = arguments[_key3]; - } - - var res = arr[key].apply(arr, args); - - if (res === -1 || res === false) { - // if that didn't work, run it again using raw values. - return arr[key].apply(arr, _toConsumableArray(args.map(toRaw))); - } else { - return res; - } - }; - }); - ['push', 'pop', 'shift', 'unshift', 'splice'].forEach(function (key) { - instrumentations[key] = function () { - pauseTracking(); - - for (var _len3 = arguments.length, args = new Array(_len3), _key4 = 0; _key4 < _len3; _key4++) { - args[_key4] = arguments[_key4]; - } - - var res = toRaw(this)[key].apply(this, args); - resetTracking(); - return res; - }; - }); - return instrumentations; - } - - function createGetter() { - var isReadonly = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; - var shallow = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; - return function get(target, key, receiver) { - if (key === "__v_isReactive" - /* IS_REACTIVE */ - ) { - return !isReadonly; - } else if (key === "__v_isReadonly" - /* IS_READONLY */ - ) { - return isReadonly; - } else if (key === "__v_raw" - /* RAW */ - && receiver === (isReadonly ? shallow ? shallowReadonlyMap : readonlyMap : shallow ? shallowReactiveMap : reactiveMap).get(target)) { - return target; - } - - var targetIsArray = isArray(target); - - if (!isReadonly && targetIsArray && hasOwn(arrayInstrumentations, key)) { - return Reflect.get(arrayInstrumentations, key, receiver); - } - - var res = Reflect.get(target, key, receiver); - - if (isSymbol(key) ? builtInSymbols.has(key) : isNonTrackableKeys(key)) { - return res; - } - - if (!isReadonly) { - track(target, "get" - /* GET */ - , key); - } - - if (shallow) { - return res; - } - - if (isRef(res)) { - // ref unwrapping - does not apply for Array + integer key. - var shouldUnwrap = !targetIsArray || !isIntegerKey(key); - return shouldUnwrap ? res.value : res; - } - - if (isObject(res)) { - // Convert returned value into a proxy as well. we do the isObject check - // here to avoid invalid value warning. Also need to lazy access readonly - // and reactive here to avoid circular dependency. - return isReadonly ? readonly(res) : reactive(res); - } - - return res; - }; - } - - var set$1 = /*#__PURE__*/createSetter(); - - function createSetter() { - var shallow = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; - return function set(target, key, value, receiver) { - var oldValue = target[key]; - - if (!shallow && !isReadonly(value)) { - value = toRaw(value); - oldValue = toRaw(oldValue); - - if (!isArray(target) && isRef(oldValue) && !isRef(value)) { - oldValue.value = value; - return true; - } - } - - var hadKey = isArray(target) && isIntegerKey(key) ? Number(key) < target.length : hasOwn(target, key); - var result = Reflect.set(target, key, value, receiver); // don't trigger if target is something up in the prototype chain of original - - if (target === toRaw(receiver)) { - if (!hadKey) { - trigger(target, "add" - /* ADD */ - , key, value); - } else if (hasChanged$1(value, oldValue)) { - trigger(target, "set" - /* SET */ - , key, value, oldValue); - } - } - - return result; - }; - } - - function deleteProperty(target, key) { - var hadKey = hasOwn(target, key); - var oldValue = target[key]; - var result = Reflect.deleteProperty(target, key); - - if (result && hadKey) { - trigger(target, "delete" - /* DELETE */ - , key, undefined, oldValue); - } - - return result; - } - - function has$1(target, key) { - var result = Reflect.has(target, key); - - if (!isSymbol(key) || !builtInSymbols.has(key)) { - track(target, "has" - /* HAS */ - , key); - } - - return result; - } - - function ownKeys(target) { - track(target, "iterate" - /* ITERATE */ - , isArray(target) ? 'length' : ITERATE_KEY); - return Reflect.ownKeys(target); - } - - var mutableHandlers = { - get: get, - set: set$1, - deleteProperty: deleteProperty, - has: has$1, - ownKeys: ownKeys - }; - var readonlyHandlers = { - get: readonlyGet, - set: function set(target, key) { - { - console.warn("Set operation on key \"".concat(String(key), "\" failed: target is readonly."), target); - } - return true; - }, - deleteProperty: function deleteProperty(target, key) { - { - console.warn("Delete operation on key \"".concat(String(key), "\" failed: target is readonly."), target); - } - return true; - } - }; - - var toShallow = function toShallow(value) { - return value; - }; - - var getProto = function getProto(v) { - return Reflect.getPrototypeOf(v); - }; - - function get$1(target, key) { - var isReadonly = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; - var isShallow = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false; - // #1772: readonly(reactive(Map)) should return readonly + reactive version - // of the value - target = target["__v_raw" - /* RAW */ - ]; - var rawTarget = toRaw(target); - var rawKey = toRaw(key); - - if (key !== rawKey) { - !isReadonly && track(rawTarget, "get" - /* GET */ - , key); - } - - !isReadonly && track(rawTarget, "get" - /* GET */ - , rawKey); - - var _getProto = getProto(rawTarget), - has = _getProto.has; - - var wrap = isShallow ? toShallow : isReadonly ? toReadonly : toReactive; - - if (has.call(rawTarget, key)) { - return wrap(target.get(key)); - } else if (has.call(rawTarget, rawKey)) { - return wrap(target.get(rawKey)); - } else if (target !== rawTarget) { - // #3602 readonly(reactive(Map)) - // ensure that the nested reactive `Map` can do tracking for itself - target.get(key); - } - } - - function has$1$1(key) { - var isReadonly = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; - var target = this["__v_raw" - /* RAW */ - ]; - var rawTarget = toRaw(target); - var rawKey = toRaw(key); - - if (key !== rawKey) { - !isReadonly && track(rawTarget, "has" - /* HAS */ - , key); - } - - !isReadonly && track(rawTarget, "has" - /* HAS */ - , rawKey); - return key === rawKey ? target.has(key) : target.has(key) || target.has(rawKey); - } - - function size(target) { - var isReadonly = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; - target = target["__v_raw" - /* RAW */ - ]; - !isReadonly && track(toRaw(target), "iterate" - /* ITERATE */ - , ITERATE_KEY); - return Reflect.get(target, 'size', target); - } - - function add(value) { - value = toRaw(value); - var target = toRaw(this); - var proto = getProto(target); - var hadKey = proto.has.call(target, value); - - if (!hadKey) { - target.add(value); - trigger(target, "add" - /* ADD */ - , value, value); - } - - return this; - } - - function set$1$1(key, value) { - value = toRaw(value); - var target = toRaw(this); - - var _getProto2 = getProto(target), - has = _getProto2.has, - get = _getProto2.get; - - var hadKey = has.call(target, key); - - if (!hadKey) { - key = toRaw(key); - hadKey = has.call(target, key); - } else { - checkIdentityKeys(target, has, key); - } - - var oldValue = get.call(target, key); - target.set(key, value); - - if (!hadKey) { - trigger(target, "add" - /* ADD */ - , key, value); - } else if (hasChanged$1(value, oldValue)) { - trigger(target, "set" - /* SET */ - , key, value, oldValue); - } - - return this; - } - - function deleteEntry(key) { - var target = toRaw(this); - - var _getProto3 = getProto(target), - has = _getProto3.has, - get = _getProto3.get; - - var hadKey = has.call(target, key); - - if (!hadKey) { - key = toRaw(key); - hadKey = has.call(target, key); - } else { - checkIdentityKeys(target, has, key); - } - - var oldValue = get ? get.call(target, key) : undefined; // forward the operation before queueing reactions - - var result = target.delete(key); - - if (hadKey) { - trigger(target, "delete" - /* DELETE */ - , key, undefined, oldValue); - } - - return result; - } - - function clear() { - var target = toRaw(this); - var hadItems = target.size !== 0; - var oldTarget = isMap$1(target) ? new Map(target) : new Set(target); // forward the operation before queueing reactions - - var result = target.clear(); - - if (hadItems) { - trigger(target, "clear" - /* CLEAR */ - , undefined, undefined, oldTarget); - } - - return result; - } - - function createForEach(isReadonly, isShallow) { - return function forEach(callback, thisArg) { - var observed = this; - var target = observed["__v_raw" - /* RAW */ - ]; - var rawTarget = toRaw(target); - var wrap = isShallow ? toShallow : isReadonly ? toReadonly : toReactive; - !isReadonly && track(rawTarget, "iterate" - /* ITERATE */ - , ITERATE_KEY); - return target.forEach(function (value, key) { - // important: make sure the callback is - // 1. invoked with the reactive map as `this` and 3rd arg - // 2. the value received should be a corresponding reactive/readonly. - return callback.call(thisArg, wrap(value), wrap(key), observed); - }); - }; - } - - function createIterableMethod(method, isReadonly, isShallow) { - return function () { - var target = this["__v_raw" - /* RAW */ - ]; - var rawTarget = toRaw(target); - var targetIsMap = isMap$1(rawTarget); - var isPair = method === 'entries' || method === Symbol.iterator && targetIsMap; - var isKeyOnly = method === 'keys' && targetIsMap; - var innerIterator = target[method].apply(target, arguments); - var wrap = isShallow ? toShallow : isReadonly ? toReadonly : toReactive; - !isReadonly && track(rawTarget, "iterate" - /* ITERATE */ - , isKeyOnly ? MAP_KEY_ITERATE_KEY : ITERATE_KEY); // return a wrapped iterator which returns observed versions of the - // values emitted from the real iterator - - return _defineProperty({ - // iterator protocol - next: function next() { - var _innerIterator$next = innerIterator.next(), - value = _innerIterator$next.value, - done = _innerIterator$next.done; - - return done ? { - value: value, - done: done - } : { - value: isPair ? [wrap(value[0]), wrap(value[1])] : wrap(value), - done: done - }; - } - }, Symbol.iterator, function () { - return this; - }); - }; - } - - function createReadonlyMethod(type) { - return function () { - { - var key = (arguments.length <= 0 ? undefined : arguments[0]) ? "on key \"".concat(arguments.length <= 0 ? undefined : arguments[0], "\" ") : ""; - console.warn("".concat(capitalize(type), " operation ").concat(key, "failed: target is readonly."), toRaw(this)); - } - return type === "delete" - /* DELETE */ - ? false : this; - }; - } - - function createInstrumentations() { - var mutableInstrumentations = { - get: function get(key) { - return get$1(this, key); - }, - - get size() { - return size(this); - }, - - has: has$1$1, - add: add, - set: set$1$1, - delete: deleteEntry, - clear: clear, - forEach: createForEach(false, false) - }; - var shallowInstrumentations = { - get: function get(key) { - return get$1(this, key, false, true); - }, - - get size() { - return size(this); - }, - - has: has$1$1, - add: add, - set: set$1$1, - delete: deleteEntry, - clear: clear, - forEach: createForEach(false, true) - }; - var readonlyInstrumentations = { - get: function get(key) { - return get$1(this, key, true); - }, - - get size() { - return size(this, true); - }, - - has: function has(key) { - return has$1$1.call(this, key, true); - }, - add: createReadonlyMethod("add" - /* ADD */ - ), - set: createReadonlyMethod("set" - /* SET */ - ), - delete: createReadonlyMethod("delete" - /* DELETE */ - ), - clear: createReadonlyMethod("clear" - /* CLEAR */ - ), - forEach: createForEach(true, false) - }; - var shallowReadonlyInstrumentations = { - get: function get(key) { - return get$1(this, key, true, true); - }, - - get size() { - return size(this, true); - }, - - has: function has(key) { - return has$1$1.call(this, key, true); - }, - add: createReadonlyMethod("add" - /* ADD */ - ), - set: createReadonlyMethod("set" - /* SET */ - ), - delete: createReadonlyMethod("delete" - /* DELETE */ - ), - clear: createReadonlyMethod("clear" - /* CLEAR */ - ), - forEach: createForEach(true, true) - }; - var iteratorMethods = ['keys', 'values', 'entries', Symbol.iterator]; - iteratorMethods.forEach(function (method) { - mutableInstrumentations[method] = createIterableMethod(method, false, false); - readonlyInstrumentations[method] = createIterableMethod(method, true, false); - shallowInstrumentations[method] = createIterableMethod(method, false, true); - shallowReadonlyInstrumentations[method] = createIterableMethod(method, true, true); - }); - return [mutableInstrumentations, readonlyInstrumentations, shallowInstrumentations, shallowReadonlyInstrumentations]; - } - - var _createInstrumentatio = /* #__PURE__*/createInstrumentations(), - _createInstrumentatio2 = _slicedToArray(_createInstrumentatio, 4), - mutableInstrumentations = _createInstrumentatio2[0], - readonlyInstrumentations = _createInstrumentatio2[1], - shallowInstrumentations = _createInstrumentatio2[2], - shallowReadonlyInstrumentations = _createInstrumentatio2[3]; - - function createInstrumentationGetter(isReadonly, shallow) { - var instrumentations = shallow ? isReadonly ? shallowReadonlyInstrumentations : shallowInstrumentations : isReadonly ? readonlyInstrumentations : mutableInstrumentations; - return function (target, key, receiver) { - if (key === "__v_isReactive" - /* IS_REACTIVE */ - ) { - return !isReadonly; - } else if (key === "__v_isReadonly" - /* IS_READONLY */ - ) { - return isReadonly; - } else if (key === "__v_raw" - /* RAW */ - ) { - return target; - } - - return Reflect.get(hasOwn(instrumentations, key) && key in target ? instrumentations : target, key, receiver); - }; - } - - var mutableCollectionHandlers = { - get: /*#__PURE__*/createInstrumentationGetter(false, false) - }; - var readonlyCollectionHandlers = { - get: /*#__PURE__*/createInstrumentationGetter(true, false) - }; - - function checkIdentityKeys(target, has, key) { - var rawKey = toRaw(key); - - if (rawKey !== key && has.call(target, rawKey)) { - var type = toRawType(target); - console.warn("Reactive ".concat(type, " contains both the raw and reactive ") + "versions of the same object".concat(type === "Map" ? " as keys" : "", ", ") + "which can lead to inconsistencies. " + "Avoid differentiating between the raw and reactive versions " + "of an object and only use the reactive version if possible."); - } - } - - var reactiveMap = new WeakMap(); - var shallowReactiveMap = new WeakMap(); - var readonlyMap = new WeakMap(); - var shallowReadonlyMap = new WeakMap(); - - function targetTypeMap(rawType) { - switch (rawType) { - case 'Object': - case 'Array': - return 1 - /* COMMON */ - ; - - case 'Map': - case 'Set': - case 'WeakMap': - case 'WeakSet': - return 2 - /* COLLECTION */ - ; - - default: - return 0 - /* INVALID */ - ; - } - } - - function getTargetType(value) { - return value["__v_skip" - /* SKIP */ - ] || !Object.isExtensible(value) ? 0 - /* INVALID */ - : targetTypeMap(toRawType(value)); - } - - function reactive(target) { - // if trying to observe a readonly proxy, return the readonly version. - if (target && target["__v_isReadonly" - /* IS_READONLY */ - ]) { - return target; - } - - return createReactiveObject(target, false, mutableHandlers, mutableCollectionHandlers, reactiveMap); - } - /** - * Creates a readonly copy of the original object. Note the returned copy is not - * made reactive, but `readonly` can be called on an already reactive object. - */ - - - function readonly(target) { - return createReactiveObject(target, true, readonlyHandlers, readonlyCollectionHandlers, readonlyMap); - } - - function createReactiveObject(target, isReadonly, baseHandlers, collectionHandlers, proxyMap) { - if (!isObject(target)) { - { - console.warn("value cannot be made reactive: ".concat(String(target))); - } - return target; - } // target is already a Proxy, return it. - // exception: calling readonly() on a reactive object - - - if (target["__v_raw" - /* RAW */ - ] && !(isReadonly && target["__v_isReactive" - /* IS_REACTIVE */ - ])) { - return target; - } // target already has corresponding Proxy - - - var existingProxy = proxyMap.get(target); - - if (existingProxy) { - return existingProxy; - } // only a whitelist of value types can be observed. - - - var targetType = getTargetType(target); - - if (targetType === 0 - /* INVALID */ - ) { - return target; - } - - var proxy = new Proxy(target, targetType === 2 - /* COLLECTION */ - ? collectionHandlers : baseHandlers); - proxyMap.set(target, proxy); - return proxy; - } - - function isReactive(value) { - if (isReadonly(value)) { - return isReactive(value["__v_raw" - /* RAW */ - ]); - } - - return !!(value && value["__v_isReactive" - /* IS_REACTIVE */ - ]); - } - - function isReadonly(value) { - return !!(value && value["__v_isReadonly" - /* IS_READONLY */ - ]); - } - - function toRaw(observed) { - var raw = observed && observed["__v_raw" - /* RAW */ - ]; - return raw ? toRaw(raw) : observed; - } - - var toReactive = function toReactive(value) { - return isObject(value) ? reactive(value) : value; - }; - - var toReadonly = function toReadonly(value) { - return isObject(value) ? readonly(value) : value; - }; - - function trackRefValue(ref) { - if (isTracking()) { - ref = toRaw(ref); - - if (!ref.dep) { - ref.dep = createDep(); - } - - { - trackEffects(ref.dep, { - target: ref, - type: "get" - /* GET */ - , - key: 'value' - }); - } - } - } - - function triggerRefValue(ref, newVal) { - ref = toRaw(ref); - - if (ref.dep) { - { - triggerEffects(ref.dep, { - target: ref, - type: "set" - /* SET */ - , - key: 'value', - newValue: newVal - }); - } - } - } - - function isRef(r) { - return Boolean(r && r.__v_isRef === true); - } - - var ComputedRefImpl = /*#__PURE__*/function () { - function ComputedRefImpl(getter, _setter, isReadonly) { - var _this2 = this; - - _classCallCheck(this, ComputedRefImpl); - - this._setter = _setter; - this.dep = undefined; - this._dirty = true; - this.__v_isRef = true; - this.effect = new ReactiveEffect(getter, function () { - if (!_this2._dirty) { - _this2._dirty = true; - triggerRefValue(_this2); - } - }); - this["__v_isReadonly" - /* IS_READONLY */ - ] = isReadonly; - } - - _createClass(ComputedRefImpl, [{ - key: "value", - get: function get() { - // the computed ref may get wrapped by other proxies e.g. readonly() #3376 - var self = toRaw(this); - trackRefValue(self); - - if (self._dirty) { - self._dirty = false; - self._value = self.effect.run(); - } - - return self._value; - }, - set: function set(newValue) { - this._setter(newValue); - } - }]); - - return ComputedRefImpl; - }(); - - function computed(getterOrOptions, debugOptions) { - var getter; - var setter; - var onlyGetter = isFunction(getterOrOptions); - - if (onlyGetter) { - getter = getterOrOptions; - - setter = function setter() { - console.warn('Write operation failed: computed value is readonly'); - }; - } else { - getter = getterOrOptions.get; - setter = getterOrOptions.set; - } - - var cRef = new ComputedRefImpl(getter, setter, onlyGetter || !setter); - - if (debugOptions) { - cRef.effect.onTrack = debugOptions.onTrack; - cRef.effect.onTrigger = debugOptions.onTrigger; - } - - return cRef; - } - - Promise.resolve(); - - function noop() {} - function isNative(Ctor) { - return typeof Ctor === "function" && /native code/.test(Ctor.toString()); - } - var isIE = function isIE() { - if (typeof navigator === "undefined") { - return false; - } - - return /(msie|trident)/i.test(navigator.userAgent.toLowerCase()); - }; - var getIEVersion = function getIEVersion() { - var version = 0; - - if (typeof navigator === "undefined") { - return false; - } - - var agent = navigator.userAgent.toLowerCase(); - var v1 = agent.match(/(?:msie\s([\w.]+))/); - var v2 = agent.match(/(?:trident.*rv:([\w.]+))/); - - if (v1 && v2 && v1[1] && v2[1]) { - version = Math.max(v1[1] * 1, v2[1] * 1); - } else if (v1 && v1[1]) { - version = v1[1] * 1; - } else if (v2 && v2[1]) { - version = v2[1] * 1; - } else { - version = 0; - } - - return version; - }; - isIE() && getIEVersion() < 9; - var _toString = Object.prototype.toString; - function isPlainObject(obj) { - return _toString.call(obj) === "[object Object]"; - } - - function parsePath(path) { - // if (bailRE.test(path)) { - // return; - // } - var segments = path.length > 0 ? path.split(".") : []; - return function (obj) { - for (var i = 0; i < segments.length; i++) { - if (!obj) return; - obj = obj[segments[i]]; - } - - return obj; - }; - } - var nextTick = function () { - var callbacks = []; - var pending = false; - var timerFunc; - - function nextTickHandler() { - pending = false; - var copies = callbacks.slice(0); - callbacks.length = 0; - - for (var i = 0; i < copies.length; i++) { - copies[i](); - } - } // An asynchronous deferring mechanism. - // In pre 2.4, we used to use microtasks (Promise/MutationObserver) - // but microtasks actually has too high a priority and fires in between - // supposedly sequential events (e.g. #4521, #6690) or even between - // bubbling of the same event (#6566). Technically setImmediate should be - // the ideal choice, but it's not available everywhere; and the only polyfill - // that consistently queues the callback after all DOM events triggered in the - // same loop is by using MessageChannel. - - /* istanbul ignore if */ - - - if (typeof setImmediate !== "undefined" && isNative(setImmediate)) { - timerFunc = function timerFunc() { - setImmediate(nextTickHandler); - }; - } else if (typeof MessageChannel !== "undefined" && (isNative(MessageChannel) || // PhantomJS - MessageChannel.toString() === "[object MessageChannelConstructor]")) { - var channel = new MessageChannel(); - var port = channel.port2; - channel.port1.onmessage = nextTickHandler; - - timerFunc = function timerFunc() { - port.postMessage(1); - }; - } else if (typeof Promise !== "undefined" && isNative(Promise)) { - /* istanbul ignore next */ - // use microtask in non-DOM environments, e.g. Weex - var p = Promise.resolve(); - - timerFunc = function timerFunc() { - p.then(nextTickHandler); - }; - } else { - // fallback to setTimeout - timerFunc = function timerFunc() { - setTimeout(nextTickHandler, 0); - }; - } - - return function queueNextTick(cb, ctx) { - var _resolve; - - callbacks.push(function () { - if (cb) { - try { - cb.call(ctx); - } catch (e) { - console.error(e); - } - } else if (_resolve) { - _resolve(ctx); - } - }); - - if (!pending) { - pending = true; - timerFunc(); - } // $flow-disable-line - - - if (!cb && typeof Promise !== "undefined") { - return new Promise(function (resolve) { - _resolve = resolve; - }); - } - }; - }(); - - var mixinInjection = {}; - function getMixins(type) { - return mixinInjection[type]; - } - function mixin(xtype, cls) { - mixinInjection[xtype] = BI._.cloneDeep(cls); - } - - var queue = []; - var has = {}; - var waiting = false; - var flushing = false; - var index = 0; - - function resetSchedulerState() { - index = queue.length = 0; - has = {}; - waiting = flushing = false; - } - - function flushSchedulerQueue() { - flushing = true; - var watcher; - var id; - var options; // Sort queue before flush. - // This ensures that: - // 1. Components are updated from parent to child. (because parent is always - // created before the child) - // 2. A component's user watchers are run before its render watcher (because - // user watchers are created before the render watcher) - // 3. If a component is destroyed during a parent component's watcher run, - // its watchers can be skipped. - - queue.sort(function (a, b) { - return a.id - b.id; - }); // do not cache length because more watchers might be pushed - // as we run existing watchers - - for (index = 0; index < queue.length; index++) { - watcher = queue[index].watcher; - options = queue[index].options; - id = watcher.id; - has[id] = null; - watcher(options); - } - - resetSchedulerState(); - } - - function queueWatcher(watcher, options) { - var id = watcher.id; - - if (has[id] == null) { - has[id] = true; - - if (!flushing) { - queue.push({ - watcher: watcher, - options: options - }); - } else { - // if already flushing, splice the watcher based on its id - // if already past its id, it will be run next immediately. - var i = queue.length - 1; - - while (i > index && queue[i].watcher.id > watcher.id) { - i--; - } - - queue.splice(i + 1, 0, { - watcher: watcher, - options: options - }); - } // queue the flush - - - if (!waiting) { - waiting = true; - nextTick(flushSchedulerQueue); - } - } - } - - function innerWatch(source, cb, options) { - if (!BI._.isFunction(cb)) { - console.warn("`watch(fn, options?)` signature has been moved to a separate API. " + "Use `watchEffect(fn, options?)` instead. `watch` now only " + "supports `watch(source, cb, options?) signature."); - } - - return doWatch(source, cb, options); - } - var INITIAL_WATCHER_VALUE = {}; - var objectToString = Object.prototype.toString; - - var toTypeString = function toTypeString(value) { - return objectToString.call(value); - }; - - var isMap = function isMap(val) { - return toTypeString(val) === "[object Map]"; - }; - - var isSet = function isSet(val) { - return toTypeString(val) === "[object Set]"; - }; - - var hasChanged = function hasChanged(value, oldValue) { - return value !== oldValue && (value === value || oldValue === oldValue); - }; - - var uid = 0; - - function doWatch(source, cb, options, instance) { - options = options || {}; - var _options = options, - immediate = _options.immediate, - deep = _options.deep, - sync = _options.sync, - onTrack = _options.onTrack, - onTrigger = _options.onTrigger; - - if (!cb) { - if (immediate !== undefined) { - console.warn("watch() \"immediate\" option is only respected when using the " + "watch(source, callback, options?) signature."); - } - - if (deep !== undefined) { - console.warn("watch() \"deep\" option is only respected when using the " + "watch(source, callback, options?) signature."); - } - } - - var warnInvalidSource = function warnInvalidSource(s) { - console.warn("Invalid watch source: ", s, "A watch source can only be a getter/effect function, a ref, " + "a reactive object, or an array of these types."); - }; - - var getter; - var forceTrigger = false; - - if (isRef(source)) { - getter = function getter() { - return source.value; - }; - - forceTrigger = !!source._shallow; - } else if (isReactive(source)) { - getter = function getter() { - return source; - }; - - deep = true; - } else if (BI._.isArray(source)) { - getter = function getter() { - return source.map(function (s) { - if (isRef(s)) { - return s.value; - } else if (isReactive(s)) { - return traverse(s); - } else if (BI._.isFunction(s)) { - return s.call(instance); - } else { - warnInvalidSource(s); - } - }); - }; - } else if (BI._.isFunction(source)) { - if (cb) { - // getter with cb - getter = function getter() { - return source.call(instance); - }; - } else { - // no cb -> simple effect - getter = function getter() { - if (instance && instance.isUnmounted) { - return; - } - - if (cleanup) { - cleanup(); - } - - return source.call(instance, onInvalidate); - }; - } - } else { - getter = function getter() {}; - - warnInvalidSource(source); - } - - if (cb && deep) { - var baseGetter = getter; - - getter = function getter() { - return traverse(baseGetter()); - }; - } - - var cleanup; - - var onInvalidate = function onInvalidate(fn) { - cleanup = runner.options.onStop = function () { - fn.call(instance); - }; - }; - - var oldValue = BI._.isArray(source) ? [] : INITIAL_WATCHER_VALUE; - - var job = function job() { - // 这里去掉的原因是,新增属性没有生效也会触发变化监听 - if (!runner.effect.active) { - return; - } - - if (cb) { - // watch(source, cb) - var newValue = runner(); - - if (deep || forceTrigger || hasChanged(newValue, oldValue)) { - // cleanup before running cb again - if (cleanup) { - cleanup(); - } - - cb.apply(instance, [newValue, // pass undefined as the old value when it's changed for the first time - oldValue === INITIAL_WATCHER_VALUE ? undefined : oldValue, onInvalidate]); - oldValue = newValue; - } - } else { - // watchEffect - runner(); - } - }; // important: mark the job as a watcher callback so that scheduler knows - // it is allowed to self-trigger (#1727) - - - job.allowRecurse = !!cb; - job.id = ++uid; - var scheduler; - - if (sync === true) { - scheduler = job; - } else { - scheduler = function scheduler() { - return queueWatcher(job); - }; - } - - var runner = effect(function () { - try { - return getter(); - } catch (e) {// 吞掉异常 - } - }, { - lazy: true, - onTrack: onTrack, - onTrigger: onTrigger, - scheduler: scheduler - }); // initial run - - if (cb) { - if (immediate) { - job(); - } else { - oldValue = runner(); - } - } else { - runner(); - } - - return function () { - stop(runner); - }; - } - - function traverse(value) { - var seen = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : new Set(); - - if (!BI._.isObject(value) || seen.has(value)) { - return value; - } - - seen.add(value); - - if (isRef(value)) { - traverse(value.value, seen); - } else if (BI._.isArray(value)) { - for (var i = 0; i < value.length; i++) { - traverse(value[i], seen); - } - } else if (isSet(value) || isMap(value)) { - value.forEach(function (v) { - traverse(v, seen); - }); - } else { - for (var key in value) { - traverse(value[key], seen); - } - } - - return value; - } - - var falsy; - var operators = { - "||": falsy, - "&&": falsy, - "(": falsy, - ")": falsy - }; - - function runBinaryFunction(binarys) { - var expr = ""; - - for (var i = 0, len = binarys.length; i < len; i++) { - if (BI._.isBoolean(binarys[i]) || BI._.has(operators, binarys[i])) { - expr += binarys[i]; - } else { - expr += "false"; - } - } - - return new Function("return " + expr)(); - } - - function watchExp(model, getter) { - var result = getter.call(model, model); - - if (BI._.isArray(result)) { - return result.concat(); - } - - return result; - } - - function watch(model, expOrFn, cb, options) { - if (isPlainObject(cb)) { - options = cb; - cb = cb.handler; - } - - if (typeof cb === "string") { - cb = model[cb]; - } - - options = options || {}; - options.user = true; - var exps; - - if (BI._.isFunction(expOrFn)) { - var watcher = innerWatch(expOrFn, cb, options); - return function unwatchFn() { - watcher(); - }; - } - - if (!(exps = expOrFn.match(/[a-zA-Z0-9BI._.*]+|[|][|]|[&][&]|[(]|[)]/g)) || exps.length === 1 && !/\*/.test(expOrFn)) { - var paths = expOrFn.split("."); - var prePaths = paths.slice(0, paths.length - 1); - var preGetter = parsePath(prePaths.join(".")); - var v = preGetter.call(model, model); - var getter = parsePath(paths[paths.length - 1]); - - var _watcher = innerWatch(function () { - return watchExp(v, getter); - }, cb, options); - - return function unwatchFn() { - _watcher(); - }; - } - - var watchers = []; - var fns = exps.slice(); - var complete = false, - running = false; - - var callback = function callback(index, newValue, oldValue, attrs) { - if (complete === true) { - return; - } - - fns[index] = true; - - if (runBinaryFunction(fns)) { - complete = true; - cb(newValue, oldValue, attrs); - } - - if (options && options.sync) { - complete = false; - running = false; - fns = exps.slice(); - } else { - if (!running) { - running = true; - nextTick(function () { - complete = false; - running = false; - fns = exps.slice(); - }); - } - } - }; - - BI._.each(exps, function (exp, i) { - if (BI._.has(operators, exp)) { - return; - } - - if (exp.indexOf("*") >= 0) { - // eslint-disable-next-line no-inner-declarations - var travers = function travers(root, deps, parent, key, res) { - if (deps.length === _paths.length) { - root !== undefined && res.push({ - parent: parent, - k: key - }); - return; - } - - if (root) { - if (_paths[deps.length] === "*") { - // 遍历所有节点 - for (var k in root) { - travers(root[k], deps.concat([k]), root, k, res); - } - } else { - var nextKey = _paths[deps.length]; - travers(root[nextKey], deps.concat([nextKey]), root, nextKey, res); - } - } - }; - - //a.**形式 - if (/^[1-9a-zA-Z.]+\*\*$/.test(exp) || exp === "**") { - exp = exp.replace(".**", ""); - - var _paths2 = exp.split("."); - - var _prePaths2 = _paths2.slice(0, _paths2.length - 1); - - var _preGetter = parsePath(_prePaths2.join(".")); - - var _v2 = _preGetter.call(model, model); - - var _getter = exp === "**" ? function (m) { - return m; - } : parsePath(_paths2[_paths2.length - 1]); - - watchers.push(innerWatch(function () { - return watchExp(_v2, _getter); - }, function (newValue, oldValue) { - // a.** 在a变化的时候不会触发change - if (!BI._.isArray(newValue) && oldValue !== newValue) { - return; - } - - callback(i, NaN, NaN, BI._.extend({ - index: i - })); - }, BI._.extend({ - deep: true - }, options))); - return; - } - - if (/^(\*\*\.)+[1-9a-zA-Z]+(\.\*\*$)/.test(exp)) { - throw new Error("not support"); - } //含有*的情况,如a.*,如*.a,*.*.a,a.*.a - //先获取到能获取到的对象 - - - var _paths = exp.split("."); - - var _prePaths = []; - - for (var _i = 0, len = _paths.length; _i < len; _i++) { - if (_paths[_i] === "*") { - break; - } - - _prePaths[_i] = _paths[_i]; - } - - var _v; - - if (_prePaths.length > 0) { - var _getter2 = parsePath(_prePaths.join(".")); - - _v = _getter2.call(model, model); - } else { - _v = model; - } - - _paths = _paths.slice(_prePaths.length); - var changes = []; - watchers.push(innerWatch(function () { - var routes = []; - travers(_v, [], _v, null, routes); - - for (var _i2 = 0, _len = routes.length; _i2 < _len; _i2++) { - var _routes$_i = routes[_i2], - parent = _routes$_i.parent, - k = _routes$_i.k; - - for (var j = 0, l = changes.length; j < l; j++) { - var _changes$j = changes[j], - target = _changes$j.target, - key = _changes$j.key; - - if (target === toRaw(parent) && key === k) { - return true; - } - } - } - }, function (newValue) { - changes = []; - - if (newValue === true) { - callback(i, NaN, NaN, BI._.extend({ - index: i - })); - } - }, BI._.extend({}, options, { - deep: true, - onTrigger: function onTrigger(_ref) { - var target = _ref.target, - key = _ref.key; - changes.push({ - target: target, - key: key - }); - } - }))); - return; - } - - var getter = parsePath(exp); - watchers.push(innerWatch(function () { - return watchExp(model, getter); - }, function (newValue, oldValue) { - callback(i, newValue, oldValue, BI._.extend({ - index: i - })); - }, options)); - }); - - return watchers; - } - - var REACTIVE = true; - - function initState(vm, state) { - if (state) { - vm.$$state = REACTIVE ? reactive(state) : state; - } - } - - function initComputed(vm, c) { - var $$computed = vm.$$computed = {}; - - for (var key in c) { - $$computed[key] = computed(BI._.bind(c[key], vm)); - } - } - - function initWatch(vm, watch) { - vm._watchers || (vm._watchers = []); - - for (var key in watch) { - var handler = watch[key]; - - if (BI._.isArray(handler)) { - for (var i = 0; i < handler.length; i++) { - vm._watchers.push(createWatcher(vm, key, handler[i])); - } - } else { - vm._watchers.push(createWatcher(vm, key, handler)); - } - } - } - - function createWatcher(vm, keyOrFn, cb, options) { - if (isPlainObject(cb)) { - options = cb; - cb = cb.handler; - } - - if (typeof cb === "string") { - cb = vm[cb]; - } - - return watch(vm.model, keyOrFn, BI._.bind(cb, vm), options); - } - - function initMethods(vm, methods) { - for (var key in methods) { - vm[key] = methods[key] == null ? noop : BI._.bind(methods[key], vm); - } - } - - function initMixins(vm, mixins) { - mixins = (mixins || []).slice(0); - - BI._.each(mixins.reverse(), function (mixinType) { - var mixin = getMixins(mixinType); - - for (var key in mixin) { - if (typeof mixin[key] !== "function") continue; - if (BI._.has(vm, key)) continue; - vm[key] = BI._.bind(mixin[key], vm); - } - }); - } - - function defineProps(vm) { - vm.model = new Proxy({}, { - get: function get(target, key) { - if (vm.$$computed && key in vm.$$computed) { - try { - return vm.$$computed[key].value; - } catch (e) {// 吞掉异常 - } - - return; - } - - if (vm.$$state && key in vm.$$state) { - return vm.$$state[key]; - } - - var p = vm._parent; - - while (p) { - if (p.$$context && key in p.$$context) { - return p.$$context[key]; - } - - p = p._parent; - } - }, - set: function set(target, key, value) { - if (vm.$$state && key in vm.$$state) { - vm.$$state[key] = value; - return true; - } - - var p = vm._parent; - - while (p) { - if (p.$$context && key in p.$$context) { - p.$$context[key] = value; - return true; - } - - p = p._parent; - } - - return true; - } - }); - } - - function defineContext(vm, keys) { - var props = {}; - - var _loop = function _loop(i, len) { - var key = keys[i]; - props[key] = { - enumerable: true, - configurable: true, - get: function get() { - return vm.model[key]; - }, - set: function set(val) { - return vm.model[key] = val; - } - }; - }; - - for (var i = 0, len = keys.length; i < len; i++) { - _loop(i); - } - - vm.$$context = Object.defineProperties({}, props); - } - - function getInjectValue(vm, key) { - var p = vm._parent; - - while (p) { - if (p.$$context && key in p.$$context) { - return p.$$context[key]; - } - - p = p._parent; - } - } - - function getInjectValues(vm) { - var inject = vm.inject || []; - var result = {}; - - BI._.each(inject, function (key) { - result[key] = getInjectValue(vm, key); - }); - - return result; - } - - var Model = /*#__PURE__*/function () { - function Model() { - _classCallCheck(this, Model); - } - - _createClass(Model, [{ - key: "_constructor", - value: function _constructor(options, destroyHandler) { - this.options = options || {}; - this._parent = Model.target; - var state = BI._.isFunction(this.state) ? this.state() : this.state; - var computed = this.computed; - var context = this.context; - var inject = this.inject; - var childContext = this.childContext; - var watch = this.watch; - var actions = this.actions; - - BI._.keys(state).concat(BI._.keys(computed)).concat(inject || []).concat(context || []); - - var mixins = this.mixins; - defineProps(this); - childContext && defineContext(this, childContext); - initMixins(this, mixins); - this.init(); - initState(this, BI._.extend(getInjectValues(this), state)); - initComputed(this, computed); - REACTIVE && initWatch(this, watch); - initMethods(this, actions); - this.created && this.created(); - this._destroyHandler = destroyHandler; - } - }, { - key: "_init", - value: function _init() {} - }, { - key: "init", - value: function init() { - this._init(); - } - }, { - key: "destroy", - value: function destroy() { - BI._.each(this._watchers, function (unwatches) { - unwatches = BI._.isArray(unwatches) ? unwatches : [unwatches]; - - BI._.each(unwatches, function (unwatch) { - unwatch(); - }); - }); - - this._watchers && (this._watchers = []); - this.destroyed && this.destroyed(); - this.$$computed = null; - this.$$state = null; - this._destroyHandler && this._destroyHandler(); - } - }]); - - return Model; - }(); - function set(target, key, val) { - if (BI._.isArray(target)) { - target.length = Math.max(target.length, key); - target.splice(key, 1, val); - return val; - } - - target[key] = val; - return target; - } - function freeze(value) { - Object.defineProperty(value, '__v_skip', { - configurable: true, - enumerable: false, - value: value - }); - return value; - } - function del(target, key) { - if (BI._.isArray(target)) { - target.splice(key, 1); - return; - } - - if (!BI._.has(target, key)) { - return; - } - - delete target[key]; - } - function define(model) { - return REACTIVE ? reactive(model) : model; - } - function config(options) { - options || (options = {}); - - if ("reactive" in options) { - REACTIVE = options.reactive; - } - } - - function toJSON(model) { - var result; - - if (BI._.isArray(model)) { - result = []; - - for (var i = 0, len = model.length; i < len; i++) { - result[i] = toJSON(model[i]); - } - } else if (model && isPlainObject(model)) { - result = {}; - - for (var key in model) { - result[key] = toJSON(model[key]); - } - } else { - result = model; - } - - return result; - } - - var version = "3.0"; - - exports.Model = Model; - exports.config = config; - exports.define = define; - exports.del = del; - exports.freeze = freeze; - exports.mixin = mixin; - exports.set = set; - exports.toJSON = toJSON; - exports.version = version; - exports.watch = watch; - - Object.defineProperty(exports, '__esModule', { value: true }); - -})); diff --git a/dist/fix/worker.compact.js b/dist/fix/worker.compact.js deleted file mode 100644 index e537706ad..000000000 --- a/dist/fix/worker.compact.js +++ /dev/null @@ -1,123 +0,0 @@ -;(function () { - var contexts = {}; - var init = false; - - var WORKER; - - var enableWorker = function () { - if (init) { - return init; - } - // 开启Worker模式 - BI.config("bi.provider.system", function (provider) { - provider.setWorkerMode(true); - }); - var _init = BI.Widget.prototype._init; - BI.Widget.prototype._init = function () { - this.$destroyWorker = createWorker.call(this); - try { - _init.apply(this, arguments); - } catch (e) { - console.error(e); - } - }; - - var _initRender = BI.Widget.prototype._initRender; - var postMessage = function (data) { - switch (data.eventType) { - case "create": - this.model = data.msg; - _initRender.call(this); - break; - case "watch": - var watchArgs = data.args; - this.watch[data.currentWatchType].apply(this, watchArgs); - break; - } - }; - BI.Widget.prototype._initRender = function () { - if (WORKER && this._worker) { - this.__asking = true; - this.__async = true; - } else { - _initRender.apply(this, arguments); - } - }; - - var unMount = BI.Widget.prototype.__d; - BI.Widget.prototype.__d = function () { - this.$destroyWorker && this.$destroyWorker(); - try { - unMount.apply(this, arguments); - } catch (e) { - console.error(e); - } - }; - init = postMessage; - return postMessage; - }; - - BI.useWorker = function (wk) { - if (!_global.Worker || !_global.Proxy) { - return; - } - var postMessage = enableWorker(); - WORKER = wk; - if (WORKER) { - WORKER.addEventListener("message", function (e) { - var data = e.data; - postMessage.apply(contexts[data.name], [data]); - }, false); - } - }; - - function createWorker () { - var self = this; - if (this._worker) { - var name = this.getName(); - var modelType = this._worker(); - var options; - if (BI.isArray(modelType)) { - options = modelType[1]; - modelType = modelType[0]; - } - if (WORKER) { - contexts[name] = this; - WORKER.postMessage({ - type: modelType, - name: name, - eventType: "create", - options: options, - watches: BI.map(this.$watch || this.watch, function (key) { - return key; - }) - }); - var store = {}; - this.store = new Proxy(store, { - get: function (target, key) { - return function () { - WORKER.postMessage({ - type: modelType, - name: name, - eventType: "action", - action: key, - args: [].slice.call(arguments) - }); - }; - }, - set: function (target, key, value) { - return Reflect.set(target, key, value); - } - }); - return function () { - delete contexts[name]; - WORKER.postMessage({ - type: modelType, - name: name, - eventType: "destroy" - }); - }; - } - } - } -}()); diff --git a/dist/font/iconfont.eot b/dist/font/iconfont.eot deleted file mode 100644 index 876d0c407d165eac549880a4b85715ec15cef904..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 269484 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

(+kku(1`}!1wG!N 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

|HSa@Ma(jBq7}mDorF@3@S#H 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ξ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 B)!YC8 diff --git a/dist/font/iconfont.svg b/dist/font/iconfont.svg deleted file mode 100644 index bf89d8452..000000000 --- a/dist/font/iconfont.svg +++ /dev/null @@ -1,2117 +0,0 @@ - - - - Created by iconfont - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/dist/font/iconfont.ttf b/dist/font/iconfont.ttf deleted file mode 100644 index d126a7c979367c4bb1e8939c2a547790f796e844..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 269316 zcmeFa3!GQu+W&uD*Zn=rch2XTnr50qbEu}8^GxR{VNx+V5QZi?AqgRbK?os)kZlk` z2qA<)2qA=S@pwX@5J?dTsNL@%EXzEeHfQTl(2)S-=?Y4 z&zUmuzOSz#YS=(-)|_dRCr;`;b>c&?y9rcHgF({iN$EIW1-eZ;W!CJBm-cLif7^-T zebY}pVPY_J>=L4p>u?=$%EZ|-{iX6U?yH;Z852*L9DnzK<>cNSOC(cgo_fZt6}ML0 zL+*X}S9dTW?5=4~6E(!$vgfxwZE?4#$^QR*?3uu{;F`L_Cd3W+iK2X-g)ct2<|92( zh1(0`ZgCgmGJ>St54iEMJVgbbb-^(b|B3c^*9f9#QbL1Bh8;9=EX7WrIBN!VCiC9z z?|;tIPnJ`4 zi_8D={M7QgKmVikTkGS0wN7@}@6i8Be*G(M{wx0fo7t_^@cg4V@A>Wj)%X8Pd4{pf z-n8BS{C~8*?H8v1QaJuk%E><}fB#~59{A_ng>GrLH(d4qLOA|QX}Euw|DD3Jf4Ke^ zpL=cLzj^%rgL3WfD98VDdHXky_rFEF{)0Ms{l8h-{U3(MKlR@%K3?Ac2WkI5S}y*z zJ`X|0`T|yah>9)vp(VCX5b+0?>WV=z6e9wd`yx)qb+orC;@kY_=1(_=zxnL@H}_x- zWb>lUt2T$XvR%QJ{bSf3M003PL3jyy;xqXyKAUIrIeadk#|?ZeAIB58ktg!;d;(A6$vlOp@-#k?PvVpLP(F<7`EVZ1 zV|Xl&<0JS;9?wVd(R>V#*oIG3f*>B?s~XN_h+}m{otN*Ps@95m3!W`xR=~&SL6D- zLGD$z#_e=hy7^q=E_3tTHEw~s-Ys-LyIqpX54+v`v%AUdaf^5kU%*X#G0&xk_%fcy zSMq$mh8OVlypV6=MZB2r;jefrf5Y4PJLxQaq`wT3S~)-tlHqcgjFxe7q#P~BN~4@0 zQ{+UME~m=ra;D6d^W*|)l1t<=tQ5_cYvp>mQ5MN<@(0-}cghmEPo9*gWtF@jYvfIN zOY-GC`9L zFLCGdeMr$uco{#!kGaeF30}$1^7H&6ujbeI4StK)@%#KCf6N>C3;vS7=2rfe|IFX> zPX2{|<2E625|EHYOPnM~vZV1O=^|YvSMuEzQY1a4x0FhSR7*b@D1&9F94K`%LJoCX z*XW)L^jG7@}+z&t@20tlkAWm$G+N$wOk)1BeYaz;Ejx|iK6?lt$id(*w;-f{1`_uU8XBlofU)P3f@aGTv% z?rXQredE4$e{$cs@7<5?C-;l{)&1uF;@Vu;M|?hC$QSV?d?{bfSMXJQHDAlu@ePv2 zH}cJV3*W}K^Bt&bcY%9h@*qFVkMatBil5=*|Jw#YUvlxIL zG>(p-Bk5MUjTX|4bQ9f7*U}=og|4R?XgnQ7N7Hq*fUcpdX+B*=$4~i_UgXmzYL+{;>`qKa!NS9DKRZt~WQ8m?2Un-+s)SLQH36)}3 zq>zfJJN2NR7%${g9(AK!%BCFZN?DXiT_^*4A)P3lQYnp6D29?Lj^ZhS5-ApAgeZ(K zLKs&BG4b_d|AVo);V21P7P=Sm|M!2`*B~k#V9DU?q@yjv9Sy~7OL50SZ#7&a^ftqt z09|ajDbU*ucOvu;hMNw(!*HiUn+=EY-sU?EcP8{MgVp}s2A=|5V(<*;JqD{k_ZmDC zdY{3kL6;h={@-u#8Bok96`los&|rP;GK0^8Vn0#gv!M?gJRACm!RJ7i8;rfn&5s&< z9u)h83O7KXGg#B@d4rFGzF_bKXp6y`o-Z0a5&DwB$3tH>Skrm6!IPk`7(5yJs==E6 zuNgcQy2jvX(AN#te0js*lb~-Jd@^*c!G}WMGWam)+XmM|-!b@bDE3hm9u0lh;4#qm z48}g{=JyRA2VHOQ5zr3|J`(z&!Q-LWCsp_;=mvwe9DZ!@G0;y89tr)_;8D=9!TpK0 zvLQ&ztzyVRs59hdsLv3T>#cr6P=2=t3_&^F8Z-puaVvI36-Jrb8Zw;v7ilm4*C5BrKEj3&Xw9If?t~A`h4T4q}?p3IU8@M&lD#PuBRvYe0sQLxm zd}v=o-+kEH&v2JP^%=m;gAOpCN? zABGMy+-~TB2CLhH40jXsV8iW!)){UQbhyEDpobWI0d$1HP0*1BUkpY4R4^~4t%n*I z_0ZPC4A!{U8?13h`=YR>+h{}I3)woxU`>;;2Hs+zt>X;VG&#axO_L)H*0_u}Si^sm z!Hc0s8+;G+7=yopHW<7WigsM#Z=lB+`d-OawBrhY2W>P&>(fL-w0s?Ji017HhG-s6 zGDP!jvLTv3Qw-63m}-co_cTK^%}z8#)8-^YG!4*>E28n9ZivS36hkx~GYrx2o@$7O zYo;Ok{L>84=bUbc`gevQ>TZ@HdjCvARL?SGHuP*m&V%YT5G^O?7}5ki*N{t~Y7fX| zP%T?Pu7I9zh?W6$59C_tg@$Opt6xBFgkEHb=CzhTAh$vF89@F3)v^d=EA&!B?u6>I zfh>VuZpeL5Etf!^gld?8Xq%&D6v!&*RffC()vy9t1HIaiH=$Z~fxHFPH~`6qYB>g8 z+jSkzfqVefxB=M!y}^)gpjy6xd<)e$1Nk#l%Q}#q(3=g}1J$$uj-j_0&Ii5Ka6zc1 z5pXfk#fJO_z1@)AP)$4F;-PmKE(zLfxKya7BXC`zcNs1hdbi;;zM8(k6+!PY+)(Jf zhC2|d=?>f>(4~eO3BBL&&L6-zaP`m!4X5qIGQ(+Ed&qDoTU#GCSfBrh;k0}$H&~zf zsNwbXkKr6REjy1JtbVUBSp9gyV705|1GvkfPZ_NDR~oFUIZ~)e_r{x>)_t3QlYdO^L0saO0w!vDi-Z8ihs^JDg(02`S z(Dw`pKs7!t^lDu!GIMR`)>8mP~Z>!5zasU4Iv#a#^z8e9O4Fx<6Jlt0C( z+ekz1g+>{2KNRIsk!8>rLmq*~8iKZB8_KI9Xdkx48-n&>TY@2I3$`U1f;zt~$q>}- zZOMkLhNc*Ty1FgZ5Y)+SX@;zYrW^7Ow38w4LOUC>9-3juN6;>Yd;-lh1odHCmLXq2 zyBhK(G~1A`p*e=MLURp4Io+0L2+HHOZib-TZObYQlOU_k`BGhkWA?1hGawM8BXJVg&}#+D-9`tUS-Jl(D{b^ z0=?Rh?$B!tDTZEaNEvj2A(hbU45@)$Z^%ffmR%s4rwa|yJiXBn&C{C<(LB|%3qUND@dQ;Xp=ZC*4)%hXGT)AV@RaGD0I z4X5#b#c&$eR}H7}d(Chf#x;i1Fura$4c8ln(`UYEIDO7q!>QkI8BYCs+i>c~JBCwt z>kOxM-!+`xf6s7g_P*g%*BkBwXglsBoPTJzkD+=E+^5hDhSM^y_kjBX`ibE-L)9K| zUqLq-?rW&J0d5=gbHjZDRrkPs3)T7q+@GN87jWM}zck$UQ1utMAE8?e_Y+i~0o*Up zt%my*s?P)NH)yNj{sPr!1J?%qqv66(4F~WMbi2XlLp4l*FNFTt;ESLdKERhicNlyr zRKp7Ra_A2RUjfx{1HKBn)8MP28VA7FLVq^+I;h46@D0#ihGaoCZh&uuYTN+d4Ar;+ zz6HA5;M<@YPr$cBHJ*U)fbKDP4iS>agVEl!vf-Hv&HC8fP%-N^88q??4j_ zM%iyoH24E(lEEm;t;q&|3QaNib7-o;D1WVK2BWOCrW=g%)Y{2ll%3Yj2BUnmW*CgJ z(Avdd4h_{sI{T9caiA&_RZb zhYmL67-+2_$3gYkKqf+m8ZrrbfFV<%8YUnoK@T+K6zD;Q%!F!Kft&@cGvo~Da6`_4 zY8-&ffsQbAJ*Rb~As0b4Zb0Tj4>ja+=wXIj3Dr0Qxf*)7q5W6uXhUv*YFYrf2|Cu0 zTcG0%Sq#-Q0&)lRNJH*|YI*^=2YQqtOQA;_@*q^x5s23D21B%tA8W|NP)%PT+CEG$ zMB9f(L!N_bx&zU6;CMr{9XP=dZ3iY9@;Y>~q2sjHDTcfa)qDc74m!<{_n{{m@*!07 z56H*RlMU9oGTo5Rp_;EiHbZ9^vITmoA={uc4K9S9X2^Ev>4tm zyP#(o@)zjYhG==1Z8(BzxdAQ{damI*L(el@EL6)AaB0x<4VMhPz;FrB3k@gGCd2um zTIPU@fL?64DCi}I%Z6%M1TGJHso}IexXf@`?=Lq<%jZ196+o{rTz9D61Fjf)mEo$P z^9|Pzs%09ufzWFVR|~z?prueP>%biVz0Pn4L9aKMp*I*frPhUpI~01O;SPu1WVo@= zn+KHQlr>0S-cMH#h+OgTb24TE_tUpv?v&gIn)3yfEK| zbKr&fZkz+sbX{W59_T#=T@1a~pfL14gVsVdjR3s~z2BfWpbr@II`lz<)&-I;9|C>WAgzn54EhcFoIyWApEqbH^aX={g0>j+GxSA+eu2JZkk-wY4f++j z+Mpkxnihbxj%ykL`W~uj2WSUW(-hF3p_ae06h)W@(1WbsFpuK7eKZA z0eS}dt3l^Me=}$$^e+ZI0o`rz0BD=R1EFDqH0}2o^rTnJw5Sn1g>yD&4paZCx5LFa&ok&FXg7l%g612v3|e5&{m?=~_g}s# zGH4T2!wqONRKpGEOQ?n$us%nh2Uwq@;RCGC(QpIScxc=JYdkb=fU}{Rc7Qc4HSGXv zT58$>*0j{T0jz1M`3hLmQu7tCrlsaRU`#AEjxn^*0NJ;u$HeO2FE~$8XN^Zz~E@;FoPyT4>afm=s^ZGLeY*W^Z^v@ zh(hb3!wq^LdWb>qK}Q($E_9?p??6Wxv<`ZxL2pA3Gw3a7y+Ny?ha2=VbhJS)LB|;M zB6O@lEzofWy#PJJAbrk}20aHIZ_xA5qYPRFJ=&lLpvM^WAhf}t`=G}fbT9NcgYJP& zFlY%>(+kku(1`}!1wG!NJE5AsfSRF`47viUc>ri0bc#WjL8lsYDRi1acR)`xXfE_5 zgY=mv8+1E#xnFeV- zoMn*a!`TLDKFl`gR_Hkf-3C3^poP%$47w3I$Do^_=Noi0^a6vfg1XSYyyuLuw3(zR2rWc^$P)#pD zgQ1#UfNG(dMu3JuHH`obg=&5PIsmHq0caRh%L1-vbcsO&q4yZ1`E##9dPA2R)Cc;gK_$?~3@U{_ZcqVqg+YbTCk!frK50;Q=u-yu zfUY#CC-iB9ilNUKln;H@pgia*gStVVGbk7Oyg}K}7YxdQwiwhE`l3Nu(3cF#guZN0 z7wBq(GN7**)EWA!L7kwl8I%rPV^Aveb%WBNZy1yUebb;A=vsr4p>G)!2YuV1c<4I@ zB|z61ln8y-pjha821P^PHz*3a-k?b62L^?p9~u+^{m7sobb~=Y=*I^6p`REOfPQM| zWc8bk1_|^tgB+$sh@(PDpyOW)`evk$Zzg`_bv{u5c^#aKPkbTn5exA-uW4WhK7NKg zjh;mmGl?j6JXl5)R|IzBn`HI)*4YZ8#3k^04pB1hr;G&%N9tmtG-x`W(HU+t;CGh> zqRcr&S$K9f$bnhzFo5%JO+@){Td=DlFndnZvzI@nEA zRzp;-;JjiTQDq%b73@{dBC2U6>I;AR!A*ZWb3idzOf+yj(V%%~YDS`oL0pF58AG<9 zSwR?vRiNpBUk5|$V83oVnkR&7R5H=w*#LfyhTAa>`21TV(YRqmN8tHKb|V@OJLA`) zX~zAdXQK(7kEU}qn#pLe3r*xoqQ(-UiQxDF0M9$2nP^fS(d3bs3T?#nX%(hZVCGVy z(~1Gi&R9z{YbVi}>xj;Up0|YPeCP#pFi5`RB zkHgK1Y@#QM0Q`9pZk}9-DbRFG#YzCe^lUuXiO=F84$rM6dcFcoBYI&uQ44qx&wFVF z(aW&+GOl0VL9}`<(JSMLUWL2YV73NsUvDOQBOPqS5)ACViSWOPXRe)1^j0^pis6k*y3KQ^wxG#qX|Ux2UW zt;6uX7{mJ6L|@_j>pHyag=gw}C^{GW<18#Q3?SM*49gH>u`Dqi%NOwHdmorX^g|cW zO0=_u=%-0UKW7vDQUo>;?SlPXD~NuBKfkRe+6{NRcM-KMA__O-!+Z5$HClni#5|uE z>(=ZVu*{VV*5DV%CSh5ukvL)wacBu~)eIC=osL>yZSHWJ6JB#v*uFdudk=YXBW zNjos4Uj(2jD=@`?d0H`8g=s}JfM4mmFs*>QPD{Nh1$Tz~&InHi>}AXbIPX#q)?zwQ zhp9{prZDg;2jR;di|G%-*ljwdJ9tK6I#^Cz1banWh`Zx?Jr)!9grCKDMz4*;z1I=< zSx8(0wQvD5(fL*Q;G{200cOA>H*z&b2(%mQn$ya9U$bpr_3!Ce5{*HvJd zWDfBmc+MdWU>Vp>JOcMe;CckkN0tEiGYWP_O#*n%q0wLq@nOZp^{`t%4eTa99R42; zJBKg9uP?O{kC_8tZ|p*VFpR_V#?2x=VkYsCI6o3*5aDRC>Fp_v)G4U1A z0Qat3f$d+IUxjDS2Uo{~S;W^gf;HFzo=d!7I)J~|A+FcK&h<555%Izz0Dl*5BEAX! z-h{Z_jQfjr5Z?-aZe2xu+b-h8^RU$mySMMgt55Lvj@iV`3&2j|I}wJv8o&~~@>B;_ z6EDH@mcZ^kaDQ()fcyK3!BVgtzp@np=3uM0o_N_ZfagDyP5dzIJW@ow9DY1T0OpUc z0q|=D%$`7+Jb~*c8vyP-g>XEzk$7bVSWf&j^y#I<&&&s~|7;hqo_JLY@pCwTeh$F- z3kXxoEWFkY`!B-oOA*8`7l93Uy&Lgb4Y#ih1MvS9gzvSHpc%lgHF*B(Gx54N+`h3G zY#~Ow%WHAI7Uyr_{O#$)@1z6RT{jo(AbuBa--G%42*>-oh}YxZ2hqeIMv!hF^9J18 zu#x!Vc>rPj1nxeq11s=KIP81|cc0C;I%6$9AmJQlQ)WNabn(oB*$nkY#^L$n){q>DXQPdj zqlN+aar8oxV>Xa9EG9V?=M!p48sTT-Qfx~@C$1(rehJA5V@W0D*Tk^%fXxrt;t!ZLk5$qYPi2Ch#n28&2eivVzQdN-0Yz^sKNXfNfg zNhD`ikj$P-a!v!uxv+npvWaBQTD(@?h+j)8BDrunNfVxN(JqpU=a5_iKQ7scZR_16 zm(ItpB`pBBH;=#y{Av=yb_LvDIgjKj_;od&b#)7VH3@p{Y5;fFA*|Qo-u2r_7Q+5Q zxVv#3$s(BFG8^Fhwvi-@#{>9v`x5+m68yNsN7B53NtVF=JqXjivq

NX)5(oPc#eQQjMdzDJnty@fAlnR$E1^M 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

e@%Q+-lV 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

pnW;x}OvE8&Mt^ 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�<`n z)$}Vr$KqPNY=^?&nVNp(yDDyB8CypDJo!HK57S*-FWn~HC(Zpb&BfJT8$&DtUy#S) z3&1o@uo=e|y8ih8*bN? z9qhz2`YxyLR_lEs8M59N5*+^3XL2Idxva({{*FUeCg3&MTf$+N;Xyxs_tX0S0dt35 z0(hKbU}Rum0AjU15C3?6o39MqEDRuU|5o3182$g(|9bwJ%uPTp2LlsGH2_|c4d(y= z0C=2ZU}RumZusB85W_$7|F8dl`DZc!MUVjtBLKW!2de-80C=2ZVPIfjp&I`GpL%AI zfq9^KAl*P^%s-O`VahV_{u;%jm}ty`h6mI=p!`T`o`k6O26xn>CvN0C=1|mwkMXWgEti`?`jyVHg&}XlfX(EQVp2 z44bx0CR3wfvM_In(PDWC8PC!%wKT7->|q#|u*qVwGM<&myS%I{sYXLz|2%y@$LG55 z>pIWlJkI01cK0Lw|Gxv0QzW@emTD}OYUW9`QY2RokS0AA4=Sa{^Ch=wQk^)dZZyc2 z>iL3d$vr}J=sh(@Sq^^u8?hK|@G@)DN!ytf9n*R!9TT6^7__|V2CAgj@Hf_98U;oN0qVV;DaE0A z3|hwG)i}J42a`8TiPTSIZz`PA=y^K*&0?L6*K=6s;@vyJQZgFeMejV;`Ebo=W(%mf z5Un4eV>uqArb;W|SxLSBpf3#%(n_Td!78+UgfHo=tI@QEnXaMkTIyt!Ntx*R6hGI~ zZx;17(C-F3-N?P!L(YHcXFJ?G$jQaao!p_F z@a!UI7c7;lIT573Oi3n!m7Kca?77<4ruN zU{=3!*MFnuTk!nu0=T2M@#Z$V?=Xiy(exKS{f$q5pO>nLucGIB@Z6*SYVxX?*?szX zK%WoM_pnfoGUPZ*<(L#XHb#z%2Pl$LGfqyeSUIjqa%yMEd2BMMmg5!#&daGA49exy z%ah|yUVUO45ZmC6oQ9QhJkkMcqg*+S*>B zMqIO*fM>4=P%Ni;s2silPD{92p|5q6oF~!flOU%JHJ`9 zsL=tP9ZTdqlP1TXT>nMjnw)3he~#Ln9w7k07vKV@)7cfEvr8C2W1u@Aw=4R(QllGZ z-SI7mT0N-MliIyP0R0D(-6i03eW08cnE;mjwTI)m|ZFnV4@R|K&U@qjr+!XHUYB(r;oUWdRv zgt#a?h(g0q>J3HD%k(jf=V9zc!!_I&usMsoHVoU!N~&1_z$*En>HA$Dvs zV1FEYjd-?^{7q=y#NFJ4r(5uP3qE{Kf7#rf zZ0djEE$2&OwoxYsj_us@?dE=jgH;;oX6br@MsU~9%}4m zR(pxx#~s^;|M~nqe#P^CYVPOxYcw6eql3gBB=!(`3aDE^?}hYLNbX@~b{PJ{=sSWp zM=}9iMb!V6dw7)Gqj-0e{`u}Y#XJ}De4OX+=>G&YP7qsy|0VeOJ-I)ye-a%h@wAk) zQ_S!*wfV$4Wt^4K%a3^VBN~4q?+kvPVZPfGhd-bL#@X7vxb{Dg3-@##L#5770{S4Li-QpUu}SZ^7ZN63|_5h7EwSf&=MYoJVR zPjE-(v2+>!*J$dv%hXMgsR!JBWa>xAG+?hmzD&b384p*PM&vdkr*WQ4lg%=o2{KRk z0b-g)fon3&F3Wgj$~2!T(;{1@CC}dEw<4xB9IZ=aeB3~^Oq(Q`r@{bweW}@&^S0!- zcLAX?eoJLKz~3=g<{5PP!}Tor&&A7hDw7ES&%@g}StgK}u4wMcc{j8L(O(a|=s`|T z>hLvK;NKgGGPZ~!trx3 z`d%ddMK~hxJQANG$&Dmu2)c)$DT?|-sXw$xW*D{kMw;RHHyn;v@M8qpV=`n$^86aw zW8sWN_bAp;g)*bj@H(Exp(lG2(A zolK2)>2V%&n-9l)?m|kn%zJ2CfKLlJ<7b~)M4iQGTTK4@c(??vWzbhzw_zuD>(P#-`8k4!2UsS$X})a-U2*1jDO#7FOHz0 zh~D^anWN0(826)?zr|vBj}!YHdQUL#67+wMr$2CqPNJg}Z%>hX8VC+{qG=Nf%pr?>0G-N1*Nyx(NM zg7aUg`x}~X!Bxpx$@%Ya-sb%eV*a4s9W?!!Bl8#c=Wp~^QR6PNxySxL>{Y{2O`rGi z?LnHXd}SRUS>pmyWUVLIEb9^k4#?I>maXXus$^>w%DS@FE|Yy+piXTP zCF@SUd$DYNVj95LFc@5xZImk8I9}EhE>F&y#>h5vll3ZEm-PkhN@Uxo%XY|+?Z~@-ob0pc?i33uWCN)CJh}Ytvz_7W zLhV5KyP>1IKOmQX6WSggvV4ndFKPw{fb+7wdG51FHiY<)a@l@7zu*nn@1G+(ph$Kg z+6U2Vn4fGoK8C|Jm|pnpW+UK^M0p5j=gcj#N#2q*X(%unZVwg zU}6{`Z!+}~nbnjK*=b4t0_Q^8VR)QlU}RumVPx9QpvC|KOhC*9gbWP-!F&b)9#R4O z0C=2*kv(q0KoEtW!H@)$C`zO>X;vvH63P6ONU2bur=SP3=0~>IS}#b{IZcj`6XXc# zXmg54dDue(MZDVCZ{EI{9mxRhu!o28yXP+1!zHtlE4aX;aFzO#uupy#uAzyZaGmZ#LnHQT9GXwt}}?s$&%ViQm8sXWm(Uzt>OgU(SJ=~UZen|!$lsH=s{=_3}B%#g=3sUVTK*!3Ly+qL`8IG`IznnHi%hi|8-C3w#ca; za)mAebk1BOy3)dVI!%r(U+YnIbSrMlnuIizTFpsfvf>Xs+^wmE)B`MwstkR!xuO$) zP|T400oapoS9qM2TLpY0H`ZTCFLq)KFGCr9mkH;3)a`EDZMW^V+q;OB+4zbhN>Ff-4 zCOeCr&CX%xvh&#a>;iTn%duOqTe2x;v1vBLX4xE@XA5kREwNj%i`cE%ZP;zu?bz+v z#q2P5C zcV%~Dd3JYZvjQu!5_8xxE3*o7*$P`_RaRpj^Vu3(XLZ(KO%||IY=gB}n{BdtuzRw5 zv3s-ou=}$6vHPq zu&1)8v8S_VuxGMov1haAu;;SpvFEcFuotoyu@|$Ku$Quzv6r(~uvfBIu~)O#u-CHJ zvDdRVus5lus^atu|KoFu)nguvA?r_uz#|Dv46Aw z@Ex3S&IJcPz+*hl2l)_B@FY+1G|%uXALb)`l#lUoKEWsXPQHup=6m>FzK`$c2lzpL zh@Zw!=V$OU`C0sIehxpEpU2PV7w`*tj^Bdcl237qPxBc*%jft!U*L;;iQkG}#Ba@S z!*9!P$8XOs=7;$u{0KkFFXfl<%lR>W1;3IX=U4Ho`8E6mzm{LePx9;e9rzvj4g5xa z6TcI`GrtSJE594h^Sg7K7kH7ExWkuunOC^WSNJNg@*4NJ&)4`muk!|P@_?V>8@$Ea ze3RdU-;>{q-<#iu-?KbJp`KcByVzmUI(znH&-zm&g>zns5zm~s_zn;H=zmdO*znQ;m@zn#B>zmva<~lid|y2*dz9e zePX{jAP$N{;xuu(I76H%&Jt&fbHusgJaN9bKwKzt;uhkTVoF$ITFi)9F(>B5f>;zw z;#T4!acglKaa(aaaeHyGI4mv^N5oNasklsBE{=&S#FgT>xJq0tt`R51wcXL}(c&@U zvEp&!@!|>MiQ-A($>J&Esp4tk>EapUnc`XE+2T3kx#D@^`QioQh2llx#o{I6rQ&7c z<>D3MmEu+6)#5ecwc>T+_2LcUjp9w>&EhTMt>SIs?cyEco#I{M-Qqpsz2bf1{o(`S zgW^Nt!{Q_2qvB)Y*5>Yo8nvI z+u}RoyW)G|`{D=UhvG-#$KogAr{ZVg=i(RQm*Q9A*Wx$gx8ir=_u>!YkK#|_&*CrQ zui|gw@8TcgpW3v)0J3$O@F za4Wb7ZVk7A+rsVO_HZ#AhD+cG9ED5aGPoR$!4+^N9EYpmYPbeYz_oB4oP_J)4sb`f z0d9nw;7)L7xC`7B?gn|dJJ?WwB9y>^Whg@hTv&lss6q`q@L>(sp$-jbLI9^=16t6A zO}Gc#6Yd4~hWo&M;eK#`cmO;Q9t01DhrmPOVeoKx1UwQR1&@Zuz+>TY@OXFvJQ1D* zPll(!Q{idwba)0l6P^XnhUdU@;d$_Ucmcc+UIZ_Om%vNmW$;pTJMy zXYh0Q1^g0z1;2*hz;EGq@O$_J{1N^He}=!nU*T`?clZbV6aEGNhW`xg7+?c@M|#bz zy0%wdah;XGNi{0LN`TLeifawDZExL8*8G<1m9d~1B$geo<y z9=WXUINn+{s9`THIq@^?oaRPzYWvu!l!?E*+;*4kLg0I6Y)|AFns}q)2W@9MW9LrP z{WYiFY+J>OohsTMHp2hKN|4%cJjoKi)q~U;vRQGx?jR1Qp%dQ$t zyXkm-y=GVUc4}4gNL@-Tmnz>AnPvl}TQ15E8h0{MRd+no)BZ?tbaYi4ZG>vpl;gOY z&aOzY6nn{xzdKSe%qy9_IGpIatpRE zS<~Xig_Mhj%Cd=T=B7~xeB3f}J&R7t&aK&QE2#M>n6!RDp?R&~-0p5S1HIm*z;8IH zi};Ewjt{3r2+M(AJ+*}*+SO*@xBZ~v6x=>tbrI6e#HB>0w-BD+B_f*?YMVX}bnlhb zo-MVfQ@vj8uG$w?Ijy48Q+Y6~+{9fIXhYSh&$em%m&o?41Qv4KWoz^js506+<)-b@ zI&3AC3)e%r;x_QW$W~Z7*|Z zMGDUUG~>RMYR0|uxLJl&Gwc5`ebwTE|7pP#ZLDPbXiiaK$fr=JhCjQY-VgSv)bpgG zL;V^DYjQ{`vikMD;ppB`%W3a*)uOYKGQkBotzR`cDwLb;d2WA-b$Y?Mt_HSyupfm| zINW_zyKg;On^xd$KZ25gW^`Xa3hEn&>D#?(P9%r6XHQLIS3iQfyYBXtovcvp_V=q^ zMiWM*ec6(YB_=4?Uf)@J_}C5{)&JiALa}WfTIB84LrQWTOZrOFBX3X&vPCIzuWEaw zRMtr6eL0X`(3wotJ>tCXSyx$2JTk! zQypW89;+Dm1aMjbl}z7E8*giqeG-lpT*s-exS?~n@v7qpA6qV>pf(wZ0@0?UuU_JW z-)NTW&dFn2$W(SSNk;5ZSv#M=;4lM!xAB)<3U6#>4M8A$kJdQ3J4qb^Z z7&uvRs?~!U=J?Vw(Z0l~N1)E&$%{`ANE@_sm(~4X%}UxiWVhkePdW9GE^jC`exwUo z$UQRJMMI`+peBJpGJ>&3r7lS3G-$wmnTxcOm{2w}8iv)%-Fn*Fdhw!PtJz*DQ&JWa z`4)K{GKGv8&p+8rA@PX^<%) z5o#`hz=(7+-Ow+IM$1KQlehu}xom5^ij%-^Sap_zDB6_B%8?d14Ox9rI^yS|FLeVVRpyOGKkDN0lId8l9WtFX>La+r1tDu?pSWvSij@u=K@ zJNs1J;MYr&eacT9xfJ_RTeFA|Py$%_EDijmf*<67Bx?=YHvWj-KMImcim@Ugh81PH zTV#9YD1JmZ?t9%{H}vu?`osA|Oytxyt$JE?3?%M+()Fq|HyA@V94oDhl=_csA&@Q) z<5AK^TvMMopqiR?i2Z9@+U@kzdST^R5xc8osU;Pb=8*dV(yvrAK#i61MS`@pQp(zA zBD)gDJ`{P?D}deDMb!8}O2j|C4*`V@9g-}WBfmx94w)XL{frv0r#HN^$@|rUYOt$o zD>^uvvg1luHLho+(4mH=X(Oj4yNXpW;ziZj$+S|;_{iInxA5%`<7 zTXOW4#J}XKaum|ZN~GXW_#@wBf4NOxPdQezeN>nP3fXbVtY!+1_FjaT2Z;>hvO#0$ zlFPwHu8jY&BYe4p4LU!i@dDa~{f4I9%P)|VwWXnAe2i8~J;Q;UFf>u!fE zr9754_+$`q>L_1h@w$geUtM;+R@hjNLE(4$I-E$uR3#&ZHm%82US-6PC{;(%=+uz3 z-YY>?R^y6e8JVu#(L72Xl~fufm4A^7EcZCBAu41Nm%N~NeQYJ5FJ*T|I+~J`O$+XD zq@-l8+HQ=DwUweT#g3%_0ah;CR?02dr?>8!w|F^_c*RO7#?@O27g1SM{GXB|dUAhZNk+a< zkg4j3+l_!;hE|=5dP<_qiVi(m+LS39F)EEwAy8wfT;14~qUGhCv}gn*bgZdf5%{eK zPKj)MqJ&OgTC;{TF11^#7jC~62@S=wUoNvp_}G(xO+qyi3vypvJ-t)Ayxdh?P{o_h zfo(~shlATzE6;LZyYW?ZC&99bh^wV{Et#NT?NC^`s`WjrthuF9RXQmXZUrcYp4v`x z;}W+e*fO{xIIulI$=~n}Y|o#p-nV^qur{IAJ6u_nv)$WMD$|(j)UY6f=e~6vl^G8Q z)P6>KsL9?!l~3H+TYUH!?dsi;s0+u@iA1?_TUu1<%Za01MXP0{HV{5|tJ<6so?H(U z99eN`uS`UIu=&VYTT0Oh<*c2(rNmAjYTQmaD<%O`ZeD#YjCUCbnb^f?>?RM|ujbqk zPAxD0S3Gs$c7%Q4nwQ&-I1);CsL$>LPjF@moNTIOHdgJ6kQD=c^q_D|ZhBYWN@-wK zmRv4k+qDomDZ{0Z6B-kJO5%H|&hzqeiiX_?rt>8<@X@`5V0UT@iVI)!%2*poYc1() zhNIUX*GNuMs;ViW)tsOw43F%Z z({$>&k{=YRy0lq$%VjLXZ;93%#c1G_oH}kyr^D!mUH5PyMycQwVpq3lS97JhUGC7- zaB#cqC{Apg=mzq$+#HU)<8YPcI2A|)Y&U)6$32A-9P2Jbd>J%U%VoE!*xvAZiGpg= z-Pc`4BjgHoySVB!8%l%?$F3JEim!%WbxXw8Xm`W4su?g?3+15%ZI?>DLTn&~5r^a~ zY%$qGSa+7|h(`Bz4<^SCnH*7rRNb

@#wQYC5(oWD~ojYOC)_|2wY8;+Dj#9Hy| zGUjjU)yYQsmV>H(yr5P<-Xc90-FmU=L7m{(ZkUnYVXSkuZ_zbSwtFD!^qX(DWw7bfZgx^V z!%WAu-R>!$+0zvaD1*L2Vb|7SXNJhY%BU= zdF>cg?rFnDb3RnI<+&_+*<{I)5o%64gc1F0k~A2A=;4;8vZ}7_NMDH{C8oZh>X)%& z<+Ysr^pK2ta!sev98^Gcc0R88N$bR>Iv($|v4+C5&Zv%aiBaWtGYuJDhI2?p^1>Mv z#nIt8{v|Z8*5cIAQIjf8NGPXNV2A*qd`@aFMyUlItLU?P<*89qtf?t+@!?B!HeR{A zwDjTfIZwA1PO6MG#`tvduVU5CyryD0MQYHT8lpom8&?EYib5TonM<1W$0nL!I;(2e zH6$*l4Gk%XrkY8s^93!#Ohk`5UCpLcSBjUolp6{lzM^ujX_=2yIc1rypeq7KQFI6M ziB53Vk%yd~CRi|?sF+yBaxJa1nqo19(JsO>ok583sR@=+N&~gP^tw(jOlh66j5g-l z`sznVs56GfN^2UqSy$Xx0YA!)0Wdo6o7EQ)^14xk+ga1m%pr|;4MrkSNe)e`fpxj^ z0|<=$V5}EF<*TP6y-u56=SI7sR33Nl0JX(_5Ekz5f@Qr!%6ya-yXkNtr7}J$JCj@u zLPa$ciy0#kZ4W|a4+XnqOaR8ob;pxNA+upqfQV}*^+8ikPnpiJ14%}zgl5RpTXCJp zicH=zmD5>sP@{@v?e}o9U>KdZijERC( zW@LYt>mt&8+ch~`(`s%g3|2)}ZIsjwY(Hdn?7Zn@F{KR@rTY?Uk4H3X zW(lJQa*hau-Ei;`Z{2ky z&KU3JK&PKuBx_gWKba<7wY?hIgG|_faxrOje?`wHyH58(0&^^s?IxB&p)&ayV?EJVGg zLY+asJl@M727p0lg|!%}K|P46!y%Kcw>nDI3?k~9q5C8bB{o-sUYWHeTODDW0|5<} zN;F?mhCQ7*=he}dy0__}Ogl2r=u;k0;&gU(ov*ermeL!&!zu!|wre2bUP?%oZC9OD zk&QQ94oAkvF6+Tq*axM7XtQNZ%2A=yXd6lkjnw5Ors#dt;ZELCwaL=Xk_mgIX-PT; zQ+Rtqn<3c-4Xuv41}GGr=o>j^$O+`y=1@SM{o(v1VNxFtz46K;LB-+HPe%ludO{~)G0d7o;-O- zKQr2OqmF1(AuUE^A?0jrg)mlHA^Nu3McUrZO%1fAt|(n^2c%QutNKJR3dB+>$EYqH()Fd$p4PZ3nebFe&dbubqt)W|lB3^B((0&@2Iy?9mk8~AqJ-Pj#9QlC z31$n97uSm)VvfZ`=R7W^V)k@dojoaIHRv>}(p?%SHaC}{OijUW zX-#RQsX`vpdVXr6Ba6JEknnNDM8%y`dELN@HjsBtlzTMQ)05Ha&iN=*9CyJG&7_JH zB`W(>kT1jt z2b(pTUyP&pW#_|ot{60$e$8H6Lq%LRPJM1roHm+d;XG1=>M}v|o-J8%3 zK$}v9W!eE+JafxJ8F3wpx8gGM-qFZ~c@?{ra9Ab1gq=!)fZi6V8K(`a6N;#e1nH56X1F~64Ss-F&3U@8@kfU9BZdvc4Y!X?^tlJAjK zc?$|B5hnRetJx&JN%NmW&#KZ{%DfnYxuIgLsWgjb zB~P@Q*g0*lNj;j@iWRv}Wp+fTxwMB&MGrp**R?AdUe_`y8#4WkTdfoftGKvRJGyCf zkJi>9P~+LxN}Hgv_wYpy2v2b*p!2&=G{ z5jn^3&M5vFYr8ZZ4nWtChO0JuGIeW-(1$=@H-=Shxq+2wqKjJzbN=YpQ`%NiKp(?T z3~1Cj8!ms zw~hcJh9(2~8t?GYIi?(vWXJHWmC}N01@ca92@1sBzM4V{=~!(~#}J}0;Q2#It<{}R(mNkeN)1jyj= zV6-H^>Xfv^O;Jo??L>#jtm4vyvYbTTsg9|6k0>uCk(IV#F_jeAOBhMzjPN0^u&KIe zBEhjG(DulOY56fTiY~fA`N$By%JSJkjd(5jHWybZ8>sJ< zM7VLI7HCk;RsMzHf)(4K6iZkz%`Q)qb<699Va+T^Lm$4*(N7toKOtEOLn>=N(FoId zF?CX%R+h7ua$z)jbf%BsOyy#1g)T&f1xvhoDyFW;Bq`~y;)6Kd6}5e+%HPj~J0^+4 zmRyxSQ?SAxQ^!22%&Ft#Yqk{ee8T)lqaM%z?I0UwvDH1wj4H0^%ji1wqZD^s)s^Tx z%TOeB+$|-aiV_U>x}0o@R$HzyxleSe`VO%C#X-?&sNdwsG^z$E)=(9-&nLL1!HAV; zyG9#u*ZOjh{NZCdeR=p;PM*Q)TgP-RH!QWSdP?#{Fshv0H1Ya6MGV;}0X~juRVTQj zM3|0{R8LKYA`3HDPVYd{l8u;-!k3X9t0hM_a#SlSa{EY{$b_#R`bh zZA1W2rP{08jt^8Y-Q1ycC)ZjXyjlkjjB&Ry=nim+%B!Vk|NsC0|NpjR5^I*pE|b9W z3lx+`ZEGK|_X*7*FOrv))1+?nLRzJAY^1I`>`ziU4481lLAsV@A&v7y^hqrl_9E;F z(@fKPp)p4boI;n(ocqf-!f9B!k(88zd#b*KmwF339`m)#=i4Gx_^wm0g72>teF%H)+$wjVa+S4c#&O@_Gq|QseGD$9ZqnvfWwdj6p?|G1 zDL3Qyx;nwOEkFvv@Z!Wr@JxXS}rl$0oqSO&u8Ro0&=a8ot5h4PRV2n(M>V zO=rAE@UI`)8EnkPZ~Q^xC$d&4)c#=l8<$Rnx#jNgaCCGt5~w&>0nRATcOehyOk5+8 zZlp?*NFk6+?m{}9=7zI75-1Lo8xw3V|u2TDLm=DxI$_4S^X#fGx7qN-0FZpbx4-(qu1*q8T};sehl>9{QxN$Ct?%< z*4PSD)=3MTwVxeZw=H#gB&V`V4EF+U=&95%mgDBuGFQGzqxe3xfH9xN}N#zVq|Q_ ztXwiYKeyiYm%v~_EQl33VgYRABI&UrYSai(DvS{-!^8#)1QQh_&jRDD!^*Sj>^t*L zz1_Q?b}vGT30ZUlbby?nD-k9oyaEWIp8i1h-(wC&G#v1FgcG6y)~W?*vD3l1suAXd zqYAYo0jM3K5EoKNc3CL>#(n_^9s%#HKDc_-M0`OdCc9CDv_WfM$?Y#K~lx%#3 zB>KrEhg{?}qJ+X!)fkd3Rdj)~T_27R$2D@OjuCeJm9Wk5c>f5Xdj4Sl?S+{H45<$P z@QmZVAx){S&HsBkb_u93j}*ZQp1!qb;l6h}#~w-E@r!94D2%Xp$Nc~6*8kaIymzg= z6MZEoL73?_KpmZGp-gGofn7pkNxBZGGji``X7WRRbAERTM64+%ITS0US{k4|$@zYD zVy>k|lCsDeU$iO_`A4(sjSbujYg9Vy+FW6Gk_QPSkg&s&Fs3LGP~s#g zN>tP+D5xm0Qo&KhQK60xjutAm;;5ry#V+}_Ra&ju);1wbAUO;;I#2yi0SBHG@)RA$xxMAnq74(RQ9-iZwk9EiH!{_mak&a^z!@&!Z7 zhCqSvyOI^#*jc=`SVM))&`HRj3I} zx{qt&hoS9$Kh6JFcHJm0yFKZzRL;qGlm2x}Xeft84>S(Y%mBm=1^_h%&;p?8t{DK;HAVxF+5;d*QrdkK zxOxww%=&i%L2{QeyPwo*zjxsU38gc}W`XvMi+*@PctQA+^k0&vM@3%5@ra%^0DWw0 z@S)o8Q5|ZEuW%Kz-aV#kmf`T95PXbziTcqxva-{cs(n{9DcGbva#0iIpC`*dg}d#^ z+L#WPkZ$>{wdHxczyhPGf3k+WvR`nn_)tM#Tv-wn+OE*W&*h>{adYhlX;DP*f_V za^@PL-Tmh!I%^2!a;@fg@CO18bYom3OO~v%t72a!(dmB$I8961zI;N230`0WVJ#2r zE!mnD-2FvtR>%DBc4xAbV`zV#LLiXOj%8btrFinVKrbgC4~0!KF#uERJHj&INg8NK z1LTSGzxlIcI);J?)aHHdx?SMj`)dEn6#rr^xbH4Nwm`Q{SwMCUEVVUTFKnfBVJ#lC@z!uQtDwB1ho z&DLpTkeG_uSeE?v2NM?T1PBu&$$(O#tSo2TC7g_+b$ z$B)vY?#5-m2v_!e;TwyK7hirs5xssB$h1En9KJ}ZQ0ok47p~oT{J)=mYZG%T5Wy){ z!D~hDKK&pucoKDfvG@N~m6ff7vzw>h9C_qzCOOPZ* z8XcodIr0@MQKr&lHR?5K(Po+%+WGRAELA$Zuli)mm9J2d5@jk>88Bo-j0fZA6T~D) zGhxb%ISZDoSO@FBNFtSMtnD0K+_eU?Pr?=5a)UT4KcTlHaY=PKX zx4)Lx-P65&;7BwUPb5?6@9m$>-p>Eo ziFB@5skgd=@oc%d`Pkh*y&f-->Z-TSh8k(Ssb-I44_fV8n@6Iz9duk?)w}O%5Z|c# z-7)BUtV51MsnOA&iA;V<4iTT!WT!r@=?>+^a6cV@h}YLSJa!<6g+Zf`Fm%0nXn&61 zd^VkoN5jGQ^AqzfoRkmKSC9Ou{${{D*t@Zr9`Kd|9nG+r@5wAQ5mj3<`$4 zK)~zm4tP8-=i}+%kG1#1Wav|MwYEFywhm2060g0ic|Lmf+*8l0@Aj_ks%+Y6hwb@# zGa648%lWL;p8A3(9(z#SAN+&=7go1dZ#46TVyRrI)>7$AHkSyM@lY0uq2$;$oBf49 z@Ed-?PxubP{_xFLUwrn-M<2Wo{Qdua|9rf^y}mp@J+_+l+C#N`cYj+6hQg6(ES^YS z-<+PEUmRRs9iODqnWMw~y>2I)%NL3TGS7SqEHu~bbpr+s88%|nm~pd~S60^^O`V;a zUszn49vh#Soa!GK92y=O?d$37?(FJlZ)2T&ESQ*Lc zsIf)^69XGNU33C@9E$kqIssIP@JUlL88j(qQ_-a%q$6hFH52nJEV8l8!73N)Jb-+_ z0-!?RB9LOx60lP6GKg}>3aCmvR^h1{&oy|dMOuff9{mOk8Zm6bs2SrHOjk?m z9eC)Ey<`j^)D8v30;L3Clnf=M0Vg~N%7Th3fSN%AnypE+Y+7`jUG$7GU|`H(WNct! zoIo-jFf)FzusB#*4Q$*o>;wxqxPNfcIb1{&a1$ipAw<~$Ij1;Rwnl&IpW5}{*uCP|*7y)_KjsojIk!e7QX+xRm zL4|dp%6d>^r>L_~G*~#AyEH9WAlfV#9Ttf$!=lHc(Py!s*g0r+i2rE$E9+g%i#gH&O>g4N8C1#xn1nI1MG<#4kQmp(uNc1!I@BSAw#&53EapW z?sNnH(JefoyLd`A@Syv6Mvw5E?D2w}@RD5divGiE@_^@R(i@i6|D3M3P^5Y`~@`*zDOyPW?D7+~e48`F?iTF|qew2D6Tnv{j4URGY$k~uW`JB~j67z6e0CKD@47;m6^htx6tnjzVINV- zWmCpJqnyj5;(g3l3G<_hE2f$&qh@ET78XR^POF}CR|D5XBiBk3N2HnSpoQzEmFuI8 z8-&1(K;*`0=cXWWvvhC^baKmdacgvQ-|6AD=;e0kin8!z&07<2bp1qEU`=1vA30LAG(PHx`RW`9!GQ!$Mg^< zWQS97#2LBZoZN9iPjN}l@snQR7rnu6dWS#s0e@HQALI=(`8tpWumC_iURd&77Z*Hw5$MhtQhpH3=FIijI0JstR6_#1ZLI>7Dj}Xb->2D zVP}1CumL#PFkEaDZZ-iAn}(Oo!N(ThXUhn%H3ZprgxD6s><1!j4^eiA7&}3n{X~NM zgCzTh6kUNdDL{tMkR>BrAydeaIpoO_3Um#MbOTCs3(9mCDr5^)dH^+g40UpV2025M z+@M8IpiR%9LocCAp3tMW&?hgT=mXI72?q29hJ=9;`NEj|VM56;rBs+vI?M?V3;GI6 z>f}@0zMd-A;=0vei#bFQ4)djNK{3k zHX02vXpTi&9NOd2nSh=|^e15`8KWtfNX2v-=F+j4ft5_0W#KX#zjFv(qYuE3F~gs+ zA%Jlrkntgi2_l%<5W++d%ES@IjtFNLL@+5tGFe11C19B?&edA!1nx;#fK2 zSrrmkCy8vHB(_L0TOoz5lS(uJq!Aa=i5D3p13bwglN9llRFFk#$Rf|;E+{2;l+ja^({ohND^$`ORM9(BlQ(L}2elM{x|LSX>1v=1 zG*Tv-C<)D!f)>g`E9Ib#@<5;h5E&NjR16Z8qJzrONtNiLYIIX0dZ-D#)PlZMu6~Hb z0Ch6Bx@rjOWq37dgk@`#r8UM%8|QRQd`&{rOwlaUG|vnzGE2+M(JJ$_&H{aBkv3VP zZI)?=720E!4p^fj*6DKm8kkS`v{gBZgpEjKXz5n%ox$dDmKDIiQKAwsDjN@*cR z86ZxXAVFCmN!cMqxgbq>AVY;9yO!t*R048qljK>o6ga&UsWOzP8kDIfRHzPAsT9;G z8tT*t8q^e;)B;-c8nmeubm(p9Qfuf@Tjp=vUa% z9NeS%xKE4lfY#w5ZNwv5ipR79cC;Gyv;_{707puK6YYXC?S%{Ngex6_8y$f=9mjuk z3Qy=Po-&f~pi6j0SMi*F!wb5Jmy85n(OtZz2k@lFyrF0OPcL~(fAfz1#ft^Rdlnx) zu(@;tLB2Zx#hGEK2yWsNl<@g&#{0{wxs$u;dZQQbG{9PcTayAuK6` zvSbm)Qb#yT3lS_`M6ytbB2R*483M;LK{NwF3pJ3CHxbXeg9Mfh5*ZpKF%(E< zsFA`@A(cTOje#Sbp+p7)1D=5*^9{GJJj#OHA)EY<9CDpp@}E5N1|Xlj4k#e60Sd{h zfFkk=pqRW2C?PKaO390WGV-r-@{bDgw@PvvRg5L7$r;p;W2hy^QAbXoo}5GjIfX{X z0!`#7n#o^U$j@5IFWShj2;?_J^1F8O2NL;H2l+`S`5w?ke$-8V&_lih^pbA@edH@Z zKlvIkK)wVFl5YS*1Ynqa0T>~l07l8DfHCqJV4Qpom>_QgCdpfXDe^X8n!E#;S+r&$ z?*it?dw_ZJK45_y!6G?~C2|PM`HW?#qF~-z<1F0BE!$cHjqOlNzl~`=VVJ89ykvIv*Ghuik1h0hRjh*40o#2BV;*1@PXoZuf&un3EnD& zcS_@pGI*#g9w~?W%Hy62xT_-WsD#@p#wqRKw05ytRjg4BYgNZdHE=>r98(KN)y5HZj$0S&w1@TD#|9l> zqYkl2N0_H$%-0DP=oAZehPgV&>@F}zml)6$26c@g-C$U^7||U@b&oMUU|f%w)f1-m zjOo2#Mz5IJ8+PlRcb7im@EMP<1biprCkemF_)EciDxT8toQ{_aymrQ07hHG6O*h7}roR6ad92VlB2>Zp@E5U9lw#%?nj;#tT zRbsOWE7e%7!CEcW>#$sp#Re=iV!jD;&6sV$Oe@B1n6zWsfk9sk`(gC2^s@ihKw%C6 zF-gSxVq^zgjBUPt|9CHHSQ4S@{4Y`p7*R9nh4p=srC4i=^FP~YsgCB$W~j|#vaVZS zDqGyvQoP`>?r-0I{5UbcwCustHU|~#vHT1=^Il6ip<#~g?>>jk>naK$-)4JV4`4Jb zHg{@Mw^ z#bceSsB13X#r0XR>oknl!3Q7i8Fa8MHs%2gXCT>H1*$+d)8@7|m^~WX9KdWK=qC37 zk++udI^e6@AZx1OI zT+_zGcQVO=CJ?Oh5E7;yN&eNsg&S*~kFk}EItVt}Z$5dX7P^|DsSQs_el1-YqY7DU zPouh6lQnr0H-ru=o`izSro2@EAyGurNpAXIZ8b-txIr*T*~4$^p|su5%F~Nsu&$mY z%Mh7IEzlgCtI1MaTzxbUnBgB=0@-n&bXnxG?BeLm5VDKRT7-d9v6dqz@&mcRly$X` zANqn!hHrvc=-Ev9n+aB=Z0@(s6GbznDGODTr&D7}qYrBb6xgiO^PHMmoU@D4UUd5y z@|AsslA%3pHaQ&T!jJSD>0aQ5*@R)rJC(KguA2#&%2rR)CEp-P+ol>0DKb2M+5DMV zPZE5=fx%B(8(g)8H`V{X#yPhFbgS;aD4iRJZqvGI z7=PNOwPgm{x@p06R{_?p+q$sLx|JH-|GRN{H4J|R12wg%O8SNX;EOhcPAy&ws69gf&UDd3 zRT=-nip2AJ7hiC^J*u90sN2d)V@%bV6^H;F+G1P2qJajLV%hXMuaaI6hWl#V$hy3< zVFASxq7J6Hb@GCNoa5|4Tu+6lU$ugUpn41mX-kyD6k^KOTUkXwlzb@W^zwR{n9EH7 zn16WOg?Kgt$&8d}OU?6R0eP}h{%+ntEC zsq6OZQxqXpz9C|IA__#l>x_0I9WV@N3DMsH6+L4kVcfcHDQH=ivt^xMsPepc4@|)J zM|@I}!qpuBrihcVz!w&Bo?pCtda5?wDiuH^cDkz1$nFOzCzg+FwZ81J?aN@fZIDCN zl$jNvntV)X@m`%BTl@ajllz>?TgzY!Oagu7ju-je`#ttOt^w2`{|bj8B}53tk_Z5O z3?Mo7nN{>}qKLPTY)#t&E}0@33vIW~uxj?zmZaF#E$PO(5|rU80D4F{gB+(-Fd!g< z#yn~~((n`3pXq3|Z1MD%z!5$V3Oc0CLwU5&#GMJ^9bPEFYJwo~% zq*(+a8b0REAg{G2A3#Z(I9v=qwTW z(XUb_i8b3coL;FMC_`BTiC-OyeEI5RKCF&Jb_3z`E;S$}7p}w=`!%Sw0Z6N~FQ!g! zk~%H`O0(sUuT=^UK^SGUXWMG>Etc z(trT4Q-@Z;xtWOaJA$}tK@2O4J;OKfjCh_iR0Q!eV>*k1Oa7-FGi(*26EL` zj};g1L}OHC7Xj4@Y#0;gtcBY3gtji9PIn>;N4WKA4Wcy$E4n2rFDZ0b06a};`F@V- z*!HAcj^P7n2eSO?)%aFzsO~cWLlbag9jFB~kAbZAO5?x#NjD&om)k>Sm4*ZZJ(-V}`G_G9fxd(Vn1!8)B z8N_LNcei^c;)26Y13(N}+BlhEMRcJ=45u*GHNU7$^tS3F@anP&5TUa!V*rAaqzO%44zAh%Je6k5Jym z?HR(dTiaQmGh7*%@rsCg_s()SL40SCtv0k&h1+U*FH=ia^%Xhoz?qomX^O1si$hr4 zR!CVjC6H%B`zAInxQ@g~2Jo;al0!7Z$a$-Ie?TubvNUpiy|R1<*rWAz`8a$yKurB6 zum>=VVNfQ~Z&*J2ERAVo`fOik2&$iD`+=Lo zj5!l!kOGDp<0*2XA` zo{D;k=Z$67WN$`6kJ?o@M9F4%<32s~?o8}@@RK+R!CKnw>^E|{nl9YH*$0SBqJyT% zSS?f7)g@M3W$nW@rE5Do5RujAn)UL|)q@{~W4*Ummi>}+Mt-w#_Oi2^N@SX98d zXuy~Q9uin}l5>i;)|KP4%9*n^jdmT$Ser+nuCr>t-$V843Uhiir*6TLXWpAJr#<#_ zmTvZUZ&Hh)Z!%kZnA31T&_5w)^8c{A^l5(W@qV2W1qQ#eD%XSg2S+&#OSzJ*FzF8X z=F^mOt542Dq1NV|TfV(1>KeHna*35!5I8<{wX*wf4~O?iH4$H)qy;@z9?$*7zARU< zcC#53oL8M$8Qlrv6|EwIy7!PFh~|y0NEh{V^FX<@hS=S%RM}z$wH12x0ztq9Xo2@J z; zs7$-*_ry{T>!JcoiNq6jr(hie&rR;!F$SM3gd%yhlSPGQ^0%SRrfWe zE)ozrZ0W9asHz7Q!#~KLH*z(HW+NWhI&$xi99-P3)IAhmdRS|Yn(AJ2i zT|KKUpDZ6vk*CJnFOW?I&5$nRdPPSTz29_&GLnfBR%t=WT__jkK_?`N`8})(svb;6 zjJ+2V?jL>gHcv!IGhEU{niJpD89*wG5qQ=LaXl8{>6V{3$qfqQ9eT@jgS#u%-7NQ@9EvQJN8TDqzHSE@@TE;NvlGQDCUT!?u zO26#l-ec}p9k*@#wx$FPxE|>AJWT_pA>iP}BMc6CoME&Vm$xB#cfPDa1El38p`ic| zu)0=2x#%J-=#IZ=*=v(@nONuqg9}l36v-Jk<)TyX8}BT~mFR}p!@NqNRnZohx(cfm zPJ0pgiBrXz=Z<_(^)ssT;fvkX#r>a(7*T`5Y zieM8c_hPk%lif6xR3E0rvFgnAQ%r-v=WI5PhQ1TCI3X z_eH`m5rUHwClwJP@&5cQm;@@*N7+FcHu^9}=7b;?F_kXhL#()ls@s^bfk4M-rz05C zKKt{*I2V^qh%S_H;Ea)by<#XpySz$Q>pj*|p=pdUK=CYQOJe`3BTCS%P~^*F;7KNV zeFVv~26z`*3qcCu_ov0luD_Q=iB-@wsrPWp+fTvlA&M*w!kK5@guSy?+UcZkPAsTI zce1-N%3Sd{#fL-+KF+jw%WkmqT++-GSIg#rXkRlneMgLWk0fEuc2P*_XFn5? zxoQ2pW$&2Z-Q7sZ4lkuWs*6M0Ym{$9^=FJYiie-z{zjZL=V&t5^a#_q@)I0ozXk0nO>>)TnD#kc#YM}aKq>~89e9G(@JW5?125x(1N zLmavrJ1SQ#e5aF3O=xee8GH>`LlHx5^YDG97hGd58I^e1Iw8n%%2zBj9GtLyh!^%saM?F$k%92yjl{}DNl@b)mDan^@>S)l|nRnE@4 zsbM@mCciTnV9pTzX1tO~t~S_*#FUaLSVrZRS{nS25vI*AQ^wWEsm`=uNODtwA@Uuj z=j-DG#nsngmsGjpIwXW3-+@?Dl%c5M`MRD^2@`Cpl&vV!?ykGDueJv_vy+(WN#Nzy zhzQ~*T4g~^s0?aQqAMydfx{MRn!>AuS~~jtM^nNB0ly!BK$tpEnzvXp?yL)x#LlFd zSAz5lgWC;H7Bt~kaGv)n73lT!tRmoA zVR}0gLxMzuM3xDMiZgId1{ux5?KtWtYw+u*L9T6A?ene=45o&821yX^JPU zOtn^N^aBn9@}+o_4KUp#No=k(u~yR9Kl}Tsmcz-;o}wC1Udtx^#S4|TI`T3cdamX^ zH-pdSp}e_QC9B6a3ba`f@J)@y;dLUw;k^-}5D_ zcZP+Vhg%2=Hf*jXE>CD6G~hk}dDUyptUS2U_VURick zz}DI{1HCgxMATv`!M_#@>VV9s^kP&9Pp1tdwTzx8aBp}U85d_ixoxt}X5ypN4_Wu= z>N_=D;vGsxKB(|7U6x?dLKMsl2w9eX2mWJDVJl~N=pd)KO)x&v_{x8u3I0@ZI&4n9 z!M95e2mdkhR!o^r#0DUs{~?-uo;4^U1(4PC5L|<2s{LW(Az%zFXOh<_r;|j|5PsZw!yvfCSyXav8vF_ z)O;GJ!$l$#Mt%Xc0CJt@13i^1WOKfBteia^)0Ok$LnlrdIGkED$ogt5J3KvYzEZjA z<{Zpr_E&t$2WcXOPt|U&VEg#CE%N$RetDqKzwBg;;^YT;oLlbZ_r*1>y=-1&wIOY~ z(AG?s{$SUd);Mh%hV7@h)YX3^%-8c|N>EwX#1xKgU6Z$0v-QX0%?&C?pS<}r_DdHs zlu)wy&G^fI(a-P?Li*5$Pt39gUqv&?Q47Jh^rB-K~gg^ZudCPW-^>(zGKuleDb` z{Z!Q63-YcHAa_e7B%o0RONI?`%cfg!z<4Pq%o0(p5&cTMLV_XtFAVMQ&tle^{Q{-7 zIeMYam3@)Wr9PPCuv_dg$IU>?8qbHRs_86<&{!P_eC$OZRM^_LjP#$V>uP{#Nltp% zA~afSGWLUIDC`D|V4WciOgAF;qDHleuNI*3cGGEt`g(GNw42z1n%?n*Ha2}re6=syipWa zZ_FvIkJ#Iyg3fthr3ofktATT$8xHXS#7v8)TV5$Bt=6TwJq$aP!;5Q)P*T0jqbKNh zhgM#9ZEnOPM%toO$3Jh{e+jq*!xsPMVbV#$-=ffNGG(Zwu!A!s=Dq7(TA}zUl11i| zk96C3tpcpq+L;rn`{77K2%_=}mhvq*YGFa4kXqCMhuuhUuAKabPMR_U4yHRir3~4a56S@$9e{KJk=o7&bDVJhzIF47@8VQ-Pw$tf$S8Z?556Q zUEti7Xnted(i>#3B!L4U))kMrS*fl@k0i1I)~0dtL%_ zi%<7y0-?iW8WA2(;T!OC*DFRc$e#eC2Tnf_X2=Qzt3#iGCNO?^ zg%n9P(>|hu@c`V^=D}$3dZSr%jKFwEt_!GMOfTU`3CApzl;hUUF5Io8*7IybG1!Vf;Rjef84uOHpi5D0htIG|OB9my#q~3^KK*v>J2pDUeH&b9rE6Y(v)k zhV&?r_io%AV*ZU%q*>^~aCyobhv{HmuQ2+(WPX$l&KfeHC)1Q0$3Hn}(xcV2d^NWU zv0#j&%_zzR=5rO5Q9zh;aQA4_>qyZbh!@6xc%j)$JVArWok=TJ3eC@JZJ_Fmxvd-PE1PMq zF_xF*vXmh>wwGTUb>`Id0wbcvNzsL!tDwCxu`bnM=LW~`Fs#`-G~}HNRPd-r&=L<&oI8<{LR>}$NhVxsD#?` z*uu#A`cbiV!2M&O5WKoD0go&55{v&^0QbT}$!*BtHZbn|IPZ4op7@pqzL~$-5Va`<&Wr%60YK0q-oF1PLbwX5Boma z3{k>rl5eP9)GhSO_CR|UwUIx*xvb4M6sAm#FnC_H3D*p~d~!JjH|t8=Ca^OHcaCxF zbhOPRFEGBD3@uIetD%CPo0tph&!UaJf%eD43@Nxs)Cq^3!q9F;}lXCHZfydkhF zol**dw=0muq_tcm0kPr=wxKz3@L`xN!_1|OoeyMD6;zC>Y6wi%2?QUX4MXBJv|qnk zmOi}OH&8_?1m4Jlwxh3T5pk#vbT~x#6_*n$_~ z4hmf$VMfy-cLHztU+q8GeVl%1uxM36hS*E91_b zP(7AxO6fq{cik4@!dix2N>1S$MDgUK)wNe?i(>3ffn10!T{&h^al>{uI@7)e4ZA$N z(@{@b-u7}ta>Iiq%Iim3-zH+3#OJ9}+2k#$AZL-Q{6c$&u@EpS!nWf3Cj6n9iYy-l zOHCI1wRm>kVi_$`D7K)mcFl z7(^+f_~LhBeLP4onN$ySDu-HC?&Usb?ZaokkUQ^?oBC&aONQ}41*?b3f;-=PZ7ZH6 z2mRNJ>i>@8te7*l_ZQ8Dz3K<-94uMOhr5dJXzsM-&C8HP;R1?3S6G4e<`5KM#N;<> zP-R*9QB^+TYPBT4Qz^mVTqO;$ZW<8Jg-1+r&`QNUxDr(^zcsoA!zGCbfR*~CACFUL zXJCeUaPKqNM9?cPj7(JB+m*_C$Dr<*gbUW4({JmHbim zaZ`dI2Pn~S^V7}o`hDegs}P6pVz^R-_)g4|>Z$+S!}KaHzbgoq?tbHblKx~Ma`}{0 z+rK#-q3)UDaBm26Og0PP@pu7kzpqH}Jm*3XrtZzd1*3CFO==BDl+H*N05?w|B%3GPkO9#8BfK_R6=C^JVZbUa5f?#ESFJ$m{(!nbHDFt;>XRv^QDh3@@>idM0EjbzC zhLU%F*DeV7eO6LQ#ktn;Ds_16`vMeYIPFgZiyp@E3_OWJ2Scd*Rq000G1n()H zTTF9eOvZ69hlqp!O@)#Tc_Pe2M)FL^Z;08uD%+aib{+4_R)T_Jt9Xpir*w!3~mm;F%Lnzoc6 zsmMPD3}43x4`84_hWH)$J#Ak4ZX>cyy^VhzQ@5|UIVlatNGngmc#6;(NxwnGkWH@wdgrKc@!ME9ZO4J-x90Fl^$ zM5*OS*H)(TeQ78$I2u65^rg_Hp)M0p>Qls9tSe>xuN;K#ivoQ?iQhGwU`M0LCN+Ea zz|n%h-Gb>Z2$kYK)F(i<7+i`y?UJ)qFtr{Kg#MI#_jm-+;ROG3t;nLrXid)`)MP(|k;kft1{5)p8h$5wo*tS%9Zi5mjk4p6TJKv-gUO_SuJ z3r>W&6iVXP+0s*-EyB(SA9@?qsBmXtQ8VOqXba?1PLpRLYgy#e9+{kiG3GQBIBvhw zMlR;Vk|vtEM>&@y1UTN}oJH2}OOgcbco#xO%AVwACJTp-ESwaP=ICUo=|V1~{=}4> zZHA0c#F3Hy;Bstk03S$XyD=n63W;cYAmr$D1<{f5&jx>!K#XWrt>It)5(aG?lk==KI=@&l!JAeE%U zUYQbE?7Cby0mc*~KR`NtoN}V56M#du;dBw%F&I5oJ2AIVJAh_bWe}@p{v7mtm<{B$ z#=|pM>#A2$xtU*OF`$<6EAT1RPdU>a`nxniP(A3!2|@xtpwUlI2#gx|voq}T2KcK4 z+5d$V;dU;)%P>01)K9z*&CUk{1OFuYab&4-@U|+6jK=5zM>zXSR;c>4tEAsR%)g)# z3lOF304YG$zlpy}YoVz~-pIyBzdFSkgC~eoRw`Hx`#UsHoT({|DXx;EGI_v;fa+_) zCkLW-4+v!E_7#s5Q4#oSPE@TLkrLic1Zo=b;LzGNA@bP$HO=n;Y0gY|?7{jI1GUOH zznX9{^=ZX9^>z$wYK=;@=lo95Rhuq!E=+sXjocYu)%jNh#tI|z7XbL>JPV94xfT1e9`tG-5X}STke7kQDyVvCHZm;3{jl735CwxYw=^lDfcrUj zc+_FzTL)$)$j{t!oWfS~9}PJD6{N+NrJaa z)+wczG5$S8N!qnOjPbYgUYi-XC$XNzQ{dmCs!4$05Wh1CmJellUYojJPr?fgTQ^*- zgY$GSD>e6c$EVJ-_RZyLfxd^xAI|6^1oKyU#sgx3Ys7U>$Ksnd_ zU;1WhGGG-N$FXHLO8g4*t`Z_t4np5#t5?J#8=wkQD1=^1Q-5UKRX%EdsdjPOosMuI zqvsQmjn{aQ$u-pXD)n*#)#9I%)fNd@$|J_*cc5gi*4KZLoh*T62vi(BVcyr0WPUTM z1+EYA_7aMIi~^-=mQ%OYhX1nvsKQU*+vD_^Fug(8^I-F>RC#EiRASQNfjalX|KLs9 zRZe3sEJ#dIv^ep~lev#qQl&Q>eR8Y?=V>vM98|#h-V@>LFcSO~7xA#|=$RQS&1)1O z(%M2g-CPU{5ba~Bp|6gT=}~)__Id>m`bqI z?7sfUmR{=Ldl+;-uAjZA8(33wA3h1Y9@Wj9RG1xO?c9qw0H5U#S~oHpnd~&nU*t0a z5?ZnYa5?YZSzm|T!Z+M%frrSzlys+?9E|u*Wh;{AX(E2u~M)rr7dPV6q;jD-Z_CHCq0>- zU@!r1l|}8eu>x&DSv;P^dAT~IagtHBePDktLbJfBtaSe_BL3G!nb>aDO*gP%mwrXe zPDdGrulZ+O{^F#HA@_1}51pzY>CZbO(2x_10Y#@l`?o93I5W;+*|7-_MUo+n6cOSm zdi!eh;HDfqrlh2IP!^r7V$htOE*+U!yd9fUVdOxzxPCD4# zFm{gh@-ye$HG^gr&EYocuj||WE6jfri|Z+EA^r8qwOT@PANZu-m8rv;FO?>i>rv*w zT-gGXd-G2*EA|(Rsj@{~(L$1xCg=<E1}ve3xvP zNBqzTtd=Q!;@5I_;rsu0cpZwQQmm>b@3(-N>VrPBUhGM@9LC)6JaoC7>M(loT*9)Oi~puA??#7l)Ze4pWXCKp6-mc>%Lkoe z2|b9MGCvUwAz^y0yG@bn0xJfVn{@l{yF{boC){ssIoo?WJWWA{ZEuizksJGA;N+4J zcrm=q&W^i#V5YbiIH4b}Jl$aoA~X+!b1$$}$`J29(cTvf9|--uFZ`x;gUVrC-4^u3 zKV6USJN`wkZ+wb_*O8%ZBHM!cuI-T+RswZ~z>(Af1x>=uv~c)hieVnXVf7#}v@l$D z86QU2T1H&Z42~f4YBN}t3hyiK--jt8+RZN(=L{;H_NuiaQzv2rcp11}W>%awm4k3X zbToKgWZ_UJGY$(@6z4cv(D1Y%P^TN(;t;gRJNHgh9P zNo{6kEjffr_YQ+GLa@S*9kh@;sGiKaZ>#Q5$(M2Srtp|YS{w=0;=ul_w|X*oXt$mN z$9~EAdbQFpYmMvR8ugKdzRL8EjM+)?icZJ19Hcm5d71aF{8b{i5dDz8=g;dg(g%~G z!_xqX@atI|y+U0OaktT+kFHBghQ?SQJMd9*Ph8A9)J0xq6rZtD3S|bG`32aMsZ*$l zaqu*(Mn{>%?eT_HO?qpNR54-;mFHGP|5n(YapAlB{WplSQsO`jcosQ0ylm8d&^3Gk z2kx<_@p`awkDcngP3wF^sY-}gJCbtxfC9n^&5y->BA+0Zp?2#bfL8`fH`2Y?&4=ek zw^`(~!-ppuqerFi6qg3x;BqB1jaj>8SwUcDTu8N8br)=hn%wy>f;(9llWxiq&I@Q@ zt(ETQ$7>HKqsTH~Ya-dd)Ruo6D+L-ok3m>{n-sSFzelXU{`+NX8SLu`m0yo+6VX&u zYj^Jw@*k@9OvxybSfJyU!r7%MBR*Vi>~n&DD5pL9z$Xbf0-Ga4emSlgj0-`{GMPc5 zb~6^SY(j~r%9eolaI(EY6LNVZbC%MGr<_OoVNw}N$(x_G+f$PRqKyePc#7}Z1Iq#| zE}bXJi>TV8{hUjiIs?VHN$;>Y@5kbEEcy|0A49qCcUzuI$#7xiDYs}1^)OXuHSTv= z+&$Qb@|P37Odj(<>SHaCy(@?je!oSrL})KLH9z_}V0i1sM6{!#85ZVvINny~MGzi2 zFG)g{8MFp9qsYo|JB!u#-ubYeX0&|e{z;y(h=$7}B)@<6#snrqD^Fg?rx7Ch@v2UJ z;Z8duN+tIKz?jo!OY#0WY=>Rmc>pnBpgV@yE}b}LrdXG(rxQ`L+g3-l45H33Tm&9b z;iXB=T4+FS6D(Mh#5uH-4@C4_YVy9M2IZ7zjs2U4FMaV(%0|pI>^6(Jg``FpRxPgu z+yN5&5UDq$?ydR0)RJ}-#i-O-u?rf{8iOdWIn*|uGppO4UTq8~mdITZhG?tF%VrYe zVfe9?kiFW?ty_2Pr6ycWo4pRKsg=4OFo$k)Bj=e??&2uYhZZsjLv1QySZIDR%`D@0 zQ5VEpY-Jy)>SN|I_6#qBd_83`&RX z*H>v|Kti^7q=oWrLvs`|$rmMR0Y8}TK(Cc$ANuBkVVAhG`ge+IdumsDQI@ z?{pUax=YWvqaKfcJPo-{uS9*0M9HrM8&pujZ{MKv~Ek!+g z8PCwR7U|`*kCQekh#dd$)q@w4$ePD&0l%LmhJSg{PH#khC;N&&lePd_atnSJhu7jV zG;&!?!~9gEcY7s{{Ri(7#C7k|wn|;Bc`3Bw@#u8PAGQ%}af?hXp)Z#j zn`1@bztL16!Y{bn0r;Y%*L8t%(j<-8rfGa1sBwDE@QJ#J^=l>C4==$AG_@eS6y&N= zySb;~;_CB9Km02Su=r#wPCmHp5Q@+F>@t<6ffI(>f-#cy}oBB)z=F`&SK^#Xc|M%xKqJB zC^B^E@D(1%2Vee_W;Pk7m;PXNfZ>(YarHx(p49OZa0OxuP2g$ZMP`d%5xFr(3BUZD z@%0GFew(ui$!;j(H93+EJj=Nl4h^pzTIV#7Ku0@=x)~FlE(4v2*loY^gBTu?l*!m& zM%=r#P{f8U!(58eP^2y{8xJ=a#c+_q+8Np5q+(56jV@8inZ?Pz9f>Fwf{&c+l{!4Q z)?*k8xT0{or0WH;N9AM;BJ?^yO$Z(#7jzld@ydTXyhRdj-^dUR*Db;lw|o4$U+mb7 zFbRvycLx16wcX4VH;r}fRrRsr`3viJ(vGD`GAx|KOdBD7xOoUM7`AaDeLVB~PoS1w zz=gLi3PP9U#v4`~cU%fK(NQXpGj7`3#fql6@-FI*9|P00kz3MJw7V#jd37Zv0T41J6YGIqf)Pyt9eLmuuXXrk0tIFvgbuX4#w zK~0Y6Wo~aVRV>Ts{YFW6!^Pp_wvMK_Cgs$I-n~rP3JuXOOwr+t!|n9W(?P1*4M~M7 z?rT69rcxXzrFpQ0eFE@Q*? zI!DR7)g?K9jyMb&c(2JA(datqWGmg8)lJGrUewOJ={Zv|zsN`OTpAq-hpfQ)lTcop zsR(*1J3BV^vHl{k$AnX^gHfAoHsFZGE&rtziyk!9e6&f-I&08sGOsU}bM7X0cO5lj z)>V_Gm>L+u6l^wS6|HMhP2CTP4vU!`@ARxYJ3cynV6$a_2^au^X)#HGNub{5MzJaZ zXPb2F5A=nQ^anT>q}hF6k&JR(0)QpA%?M*%Ik|7?Xz%NvZzXrepgr==X>r_2ZM1U` zgMG_)wm<#h=EFonu6d86VUH6Ln|ggyWI{dABei4%hygRTt!Mz*FeS(sXv4Q-cnL)3 ze?c@(5m0)Ro%peHDP;Ug60xZ0{JJ3+8)J(^GLU_e6MJ`l8|M^J+rq5+@!oBmSp0i< zaOd;}LTS-?WRnI%Mj}}y5y+&@C}r(wCyQ9EPgY|_38{{2!{%j`_}U!fA0z$X6oArXaeFcj%?^kqLjP3^eo z3VL@b&tk3`f}&cq1Xg2~l%1HB(=v;au%tMBMA5V|26x4J9ZPD;%DXq9Pmv8Hs> z$I=Ygg~!2Smj@i)@8Sa{+`)~TvqfbyWhq6Sb31Eu?pLI&l{ z*r9qg&9W6^2Q~Xt8K@sbdggi12*CPg+B+=ky&$s1G$)%{o68Bsd(c+NwpOS4+IWj) zO*MC>0PjKks=- zMX(u7bPNztx}YbXx`65mG=;nOKwz{nCi)T#_%0`ugWf#6LviT}j30}kaUN!Woh?hL ztxE*n7^g?)>1avnojC{l&_jh-;;&Ddwpi15;;Gn2jX?dIv^9+NpoFUG(WyCjLmfZb z#VMJIqerPy*m_-Z=PQaZP7-5qy20d~=q=#t_lIlCDUC2%l*H4+_3jec_=el;lHENB z#imm1oky`Q&|7h=;no0rr93Dqtrz)y{o~M5Mcu!Kr==L# z8}$M23S`JAhyG9;VhDy1zTdK{`e>S)&&+`r)E=!oJ>1~tu;p{bfrG#QkM)1JgGT>~ zLkE6)NH7rq%$~5WL(E1W;=Xqa?xlqf=l$h_4pCXzyBR`BFfZ*%a#vLV^{s#c)u*9P zJi5roU0l1>05Z;p?9T8>;fJyaC|h2$-~6!-ic4KA$_C5aLc^69nmyD4ljI?>|GGQC z+fypx-22J$%kPu)9>MytWGwvN2Z!l?`3F}zJ8DSq`peeqAuiaNU^}^em>76!9mJr$ z>fyc4+b>EtkF2^UmRxzYe_{{X9k18EI^9@wW3F=w0WKWzS1)Xcid1c^ySQq#M=H{@ zUea_tLh#Fkf3#QuoM@R~|2$vK-Ch)}aw5(=D>3o!qD{$BFDfx!zg!J*epC-b)rs81 z5<$z6-&%z9a9ij}KV$@83P(h*=9$?P`6S(Qug$%Z_kzH|>RZX%-9FpzTw#~C-JSv0 zb?n6yjh-heL};)qinyJ|BL|Ohv!TKxfCViW3W2w?Qf)Vbpf}JSAI$Lq}NY^Ku zH~=9Uu6zTq;*n@geFIKUNc$L@)_SU_bMln^>O<*)*2m2+u6+6{RFPBoR}u0x`_4+2%CuF}RPs*H47G`3IDk$wNZ$DgCqv;WPBjC~Ft%WtW+q{NGy6 zj~^pRuxlxa@Uiy3Ms-_UKG!^agp-`^a{$gZ^-c(Yj9q6*hr_*zhy~fa&c_#K$Zmz( zE?z;nwhHb;`M6mX8KW`T7f;p9xiO;h@IvY#HwvoMCKbvGMyr*q52t=+E^TfyGtHR0 z2AhNvkI?Y2veF|K?A({${aSU6B8RpKGYEil(thKws91wGxA;@w`7YyAZ;}oxf#ByO zAc*C&Mv@$f+dXdW4T7FLU9y<7g`*@tL_dpus-#|t=+6?$pO`<&m}f7zlx~dKouq`8Y*1Be`K3Gs z4Z1FchmuYchyQkDq`uZ80gZCc|IOnmAZVnBSmW)aywfHfz1RN99%w`kpUO-YL8_ev6X zOpMYO=mNc|z6v|-KR=|sU;-XiKz@Q^g13@h1~kq_DC&4io0a=u7_o?u&G(|x;$Br( zKPlO9FHg2See{W9pbe=Gb0U4peelA`2E2{CFN%fmDrl$WQH|O+j+{YTN1AC93nc>{ z`)joE&}(-!9cj+&oKdCwjLUJvdCFeC+b?vot^(TWTfX%g_P8%&WSfo&mk9}_O2RUa zs{9XS&|{o>WV1a}6CZG&P;pwi!1#tT%yWMht&Mf^!D;J4`*iX&N|Ph8GUpPLi6<+T zXYEQ$OZBm!Thoa+wud<99L$_r4<10}7%Lo`q-o9e z3BC@O^`%Lr6AU~r`$KV*t)X}Py9{;r){!ubna~!7Zr+jnr6uuI*H=8-)r?N-FHJ`C zI-2h3FgQcU2gPSv@~t+R&d2E-+*7I(d@JaNPf&`loZzjxQVd<9LRtqt#daqhm!7y_ znQqgnfhXj+r2obH6@yQKDehX9dDo@%WcU@mi7jzPIU=GrRLt(zc;~8U*uxZEWKh}v z7HP)=zx_UPtAx%te3y8jo?g9Hl4A8)Yo+bJtB~5)vp82$+vrJmTQ-l2;Acs^5?^zgO^9CFI%L4g5eP6A7<@@rK8H8r$T_K6_@|)qcXByj-}negisCOZuO(o~ z{y?};&Ocj>N!A!-?1NXLa-9Vs$WU}&7`@Ym(F|O9!Za0ryn42-tw;lK#M*hvztX%F zYt5)S!uwq5Qs`$4hF9KvLFPOW+2t?OASKFD0_(-WBIAW%hN?p-vTxt`yr*zV0Yi5} zq)L&Qu|<^85JC;5eXS%p#Zjkhu@|FVUy2Stp+XERRl)sS7y(-j272fqK3U&*-9}57 z@4PZd$~=`W9&c*CV!r4B4hDLdZ*3bCK=wp>p4G(OzpOYcWkuMsqwrBa;J_;AjW7rR zrU4CO3Pwjf5s@$i#wv_DqiK;79ge|+fQK|aaymhX=aWJ=$op%6IU+-zk6RJqT(1?t zZ4{<*Zk%U|=x+|3yc|KH&orNnf``5vpe~TTvj4)ba52mFOU?o7DVZI9!$y3g5g_^{ zfd?GYZQb~)!4nDA12=beBjGFVO1Jd*|H1Vt6O<A_`YvI2SrUCgjw8Ql=r)f#dG8{ssz6d~lhRfl!pH1oR>iUaSqE4fD1 ztvqMfS}IaPcb@bKZG{4!6SeYLh^y=D!z@9MhZ#m33H!-E)3{6P3D?PxvZYy$|ND@j zX9PyQAlyseOif7ib=zU*{VPH5Q|TZ~quqomlONu5(7=`;xhb_6Qe`FYAFWK^UZ#U+ z1&Q230}CY2xhP-{2J9tEJKUmcA=JXOR|M$lGpv^0r_N~H0`bcb1_L7<7h+~ELDhK= zDv=Nr*H#VXm=X<#@{UzUPo70!pkYfjPkWqdA0(%b!*q;TDl#TcjRaZ)QHqfHbtMBl zpg*Qth=B4o*BQ1g6e4wmbCFNs{%(2eMHHGH9Cs86A<~*PePc!}NS4x$ts?)%4xj}q zmB~UoV_nc5NC@&_{2&XA@vL)*W>w~501jmm7yMzrD=J~LnlI^$U|pEtCYZX-yc~#19=T7BVMau-un0grkF6s>L^S8yVk&r$m+>dcOB?}gvMqF6qFxA3QiF1z>Rno}~j=In+)s1$XPAM){$OZE14u`>;vw_`synafRl0nj;5? z5htIIENxR`+#Li7mT)*?)`BfN;9C7k_u~L!FjNwr=rS6{;*6vc`)6OJIrx}41_-uhC1>S{@TK1oL7Xm zwr19f1XIoI0tht&{TF#`9~pX7S-%sHvBl88{gKg%CcViI;}F!Av;$A_x*Vm>3WU_E zTPBgR0_)3eGVWu9(YXy#-sHVaYJUdk@OA@^2_pn!N|k+W#i6LkL8|`g&OiraMA8;B zqh11=eT!lB+7mB#Wdn6Th8AXQ!GXpeIYr9GQ^qag5TThe+18Y!+iG?OpIPhn`HK_? zSa&!Y?{Mk$TR3s(K^>;Y(eeI60dr2V*dyX>r+;U7Q@$cThti>hfc>%;02HZm7>lS6 zTup`RbPFiDgSE}yfWihkT!)g!h=fbJ!cq_sy0xT&Y?44;P$IE->;C1M)uhP+C3cfq zlR}H`ZIbb*%b$>M6yIXnB|S5kg`avjzYPf_fwBsA8jj_^T>pwg(9|D3dTrqpGqHZ!oT$A(H%F~ZpWDjQ@dZ>d+N{biam zp}rR(u|~jg9AZ;|nCRY1cAw?NK{h zGc9@OWIGQh3eZrx)!gs=Ty*=ZGPP-`FU*-FJ^`lWrHc%*gs_vg)0)}+p);Pz1H76o$ zQsKzMod0Tz;UtZ;M@Kspu|MDAJ{tj4GA4EOCM0`blm+U99qLG(Z-}^3hx}dbblY~B zvD(y+E-K2mk3B zP0q3s#ZdZLbqsyTDJpxN@CnIbKR2@7@#-w%I1|B)a5Cg@p)T}|%A0!2o<6{8`V?j@ z4AI=G=nL3)xBE!KA?XOU8?i({unoA%N`u`E56}OY2s(5JDfUJiai?>ea7GGUCreEy z@^2%owfXhN72I)(QOSd6ObD}HiY<#>sEqeApq~1u4jbRlT4{~@7>ram#OXR0+9g($ zQ|lgl3aW)?E;AI)10s(nQxb9F<1Qmu68QX7TY-)z#J3hCPWh>I76h`HtX_Ysl?1Zl zz3{tbcpCYYfI#34f?vCdJ5D$584O}n==;4&tc>I3q!YYx53ofO*R#$}U8}1ocM2%g zO)jlm*2yfI2k)9~Z@1iUYlszR`OLZ#-8^~s32YGu!I=_qSV6`jJineThRrb2)<9n2 zMX_@qi1vkbwSIY2-n=6R3x+!dgVAX6@%K!hNx_k@@-_B6H$&x*)QWQhI4f3JK{`73Q<~c_KGGfc^oy*7s=g<7yY{aEavAg&8O z%uf=9HU5YccmAWyq?lGI@>G)eb}}nQ)f_&3$^uQrWl$(cYe039)mWVCO?6J<0Yyp@ zwhGRG;r|j^<_dIoEcfQMe-H=#)Y}WC5ZLA5QDR9!Z4sooZ|?&N;9E^dnRD#8DTHYL z>MHQDAst%bq!a>9z5^~YYNGYk-VEbY-lakb93Vf^2t^^Z}ooa znT(Y@^3c`}>IN(u`LtlLr6!!+Bq$u@O=_lYkRSR3Tx=AXrY#%5M#->`O)6EI;894jBrFJMZ#)0}!uucA)W=U6 zzJ0dX_6n|d3dcJZf`-6YrlJm08Q71m23bfhQ+cavYeW)K+AUh znKlW*=Vqsqx*)fMxA*eO$Eqi}M}@fe{z+lOeAFqz?ZlP87y;FMqe3WHLR-4t{(;yN z7t^h?8e303Nnpks*{vs3hwSAMLe$}~zl2)a<|E+DxwD-*y!6_S74yT@6G!e%cD%MW zMMM}q!tj6!Zl^r89VKiTrB;GWw;#S|FA&NHRppDoXpKG$`_XvZ!y zUhq2;Jc@8$LEk6$i9Xa)fd_V=Gp+=gEFIQ(~ z6n^37{8COS*?EHT$-mhtFdCf~f*ljW|EyI2?0T~-*v5Zkhj+g00I~4c+F7xV6%TC= zt}wrTw4|N2WE>4oT3Xk}@0(>Ld7KDCyb=Wv3W5_FG}-gbO;RG}rYJscuP!H4;*HSU z9io$A_FgV0NXyl<KL{v;UJHMw5?U2O037$!QUO7&1EvIQ{ONxL z{M*`ikzR2^(@}&aFa0Ial}L74^de<_=^Ql>q#|hYE~kc3R!91ulX1MX3|x@85ICoM zVsayXIHYF?Y_)6*#`fATWieia)5nF1z{%TMXq?JbZMrNPOX3ez$8S;pM2gLe?J<|u zY9d^|U31e*X**ymysN(Ox_T%hXVVG{J!Fm-<+Q1@&G*WHu~UYggv^ZL-F@I;>JIjr zl1u4r;4~JcZ#SZpJ)ZAwiQoQLSe)rxkg?W|ew*;X_Vyy<-#cByi87UMwUm~|j$R`F zF1s$j5=qkVYb!LnxX+JoqNeAS!h^^2ZPHw+LM_qH*{CC7kl?tMV(Lr4q%%ChCv65( zbIo&K-z0TGrg4LU)11LDk&vd$Np8Z#O6hn01?=g`s1wFd3I{1DSZK*gV1E{!dGTz< zUEi{`oNznYl9<|jtviA$rSM+W=Q*LA=yvB3F%)Cf%VJK2Qfiuy0&JFzY)1|isi5}Q z6xMoSZ2d!5i59D_rwnJPwkN5p`lUzcoeN_EW`U~Ug!GdI?|lnAdycdfTvUHf&}eX0 zVDOsyhOdY0D-{fCfWyng3XHarnM|DFWG(KXhq5w0&MH$`=gN5cqD<9PF>b2_`z>+Ux8YmcLDNz`a-Wg=e$6qhTD&j;xX#cV){u|A}^$c^g z9Jw)ySsz6k+GY$9)kLv%%GqAIINd3k59_J+ROtuDApp)x@7IsHj#Z(VXQl=hRb_O) z5c7Z;OVDWC$2Z^sW~oQ$r6Y=bs<)%k0x=O2fT`px%>gC%UFfxQ~S=1&_ z+Vk+#l(nCnBE$U(3nfu2DW|aDt_3A@=gRi6*xt;`Dru!9fy5UumaYfP-t?sH9^f;Bzn)wA{QGYPe(XIf$p1LdSAH=d2!7b9A~l{zVZQ_e&S@fq z0q&m@5xe2H5tmr^sLGlXgUfmkczLXblciE6&{nw`-nf14)=rO%JcGx{(*V+$qbbTe zU%I9?(xpmMt`f$K1}3~7x1p!x6NbYQVEv2AoaEOkB6S3BTd!`jEV2t|S`V>iN7aB0 zQlR0L&GuKdX?sC8JF3~k+wDB2A}K0CKmOT6+AUT%PNO;5*R%Gp{EM3@8aPI$RgDI~ zvFwT`)!yk)XCf?nB_b)&-CG}sH;`2fw0QX8J+d}tiYhscmIc{)X6q$9F1bnww1Zd` zsGlq}Y68j4;K}`=v2>x)Q|6p)(3`M`&QuMj(W!z@TR&$N3Ev@g?c~J8^B?;U$6h&> zKKRl2tLWD7=w5lS3hxH4fzAv(*HydNyHNGZwm2l&T2SIu;}7POtvbRNxqt%Yr?k99 zHs!ft-@7rWSt++iBU{mmJ2u#8t{>ICtQB^m};p z+XTS`DokX#*QgB;$H_P8%xHu-S$ru;fUSJ;jDO8BKYgaN#Vzmzyh}gpb~&W1I@PTD zpf4n~Fw+;2ALU`!f*=|%wwkI~iIAZhXf;S>6s<5*;AM+vy?iOMw>ZN2 z#{PlADH!ic%)4w2X1xc1d){F2!0btWE^fkm0+=#DpDks_qQ=vKP8Pa2+*jfnw%2ru zt7zB%lQHu%NeIMk$LxCT=%(W#VnVU! zVw)6}Lh^RfVitw+g@_h#x*dom?jwRQM`Z(I+*bQ>LG~@w!|r!IQrfw$)h~kMgqU^P z*kMdAHm%RA=9{p>pI*!MQ;y0zH)>AvH5LhiqTF97=WI0nBu*mqE&892)QYee3uIxUEXk>4 zb4r9hOTJ3TzAy;McUbmY2#n+sLNK&~{oTEPj=s9c4O`~SfP+!>B%xj>c@f;lX}p>W z91eDTB&(wBH*KW3c z#C`jcdqWjgX?sSuaLBTGLX_>v-)%C8Xgm zRtVaO=zaKO#2?{YPj6y`m;OGI;h@9EW7W{SB}apg8q4jX#l(R@QyK*zD%`#}4^^lU7F2U%{#g_;a+Nk#vDckVOmW1$5Na{BZILhJS$rz-J zesK62@1`AdpEBEHMeKXyHA#7HuV(Fg8(^upV{kNPC{xD zd;5>!?W z0#<)zI(_fcsu1(z0+;_0LAa55lyv(MkZB}QHxVq$beI_SZT6*{meiF5vtG76y#|M% zwtjY^flr*+=49;NG*c%j4z;gah`tU2PGWiKTG4b7J5 zXjeNtaPN1(7cLrAa-gXj) zIrVS?5g|8=<5r3>)_L3-?`k=7I%=j&`O0m1r!t@acta{G^Ihjn3zZxwkB+eA%dD+m zt)o;;oZPTP7{oH(S!3vT1;D#K2?{*Dnmc#`C5Av1@tLf7( z4d2=FM(%DsJv?guaIE#?3F}AW=Z%3OGjXB$tzj#DY1)sVPzb3>*SR#zs#dfc+R!lp z8SkuV4VzNM9B4ys&=Sr+N<}9jBJ}Ue$rpmT+7!HADz)C9`I_aXfO{fVQW^Mpv-kYC zb@$-EOg{~KL*j}PzE&E8yjk{E)h`eRQ<&MkwAbjc4W3l6-g<#YSo*3ztPiju8{wgL z55?~>Vv0q0=_j~{xeUZ`ON0TG_CO_~VQgWv=wI|VZFwZ8lu))7eJO;FQRH+8Cv5-~ zewrr9oVF2bBXL^$GtU)=!MGtLW(R@43z%V?nO(efWKU3>s&Bwy;%@wS$mq{Vaeub$ ztZ7KY7%yyDkOkGo#)Bv%QjX`{O!q&Cga8uLFtt9@POzRuxRMth;G zv2;z;F$KR~gd3q6xQ2ux;b_WiN1QnG!LS5MR=$W-(tm9rcK3dNZ%>e=jGf$BXSN>g?`)>6yC;8~mJZvcXOLuU?Ni9) zt~D}KZY{_Z^8Av6wbfS+pR(!r>M*FQaT{aeJ2e-KnevzVmsO7?X6^Q@Q81=Q`%U&w zjWWepLDel2MOI3fJ8k}qvbG8Zt%ZML{l4$32-XI;4m}5Y&`%C?A%%k)9b1^qGUA0P z>SE#;7VpMYN)hM^wmQG=VRWVdhwF-sXdaoHLVlH$iZ7hriW4X&B=l=`NZ}yEWwdNd zhOL(>o+&3ko9$Kfppik`1$Ol*%owTkmCbrXn>0a0Z7zNyZeyb2-UYSNOjjym(YIfc zI+bwQIx(Rxft~7z`oR6z`nNRj>K+fjj4`DxBuvN#O3!V?coXvz>u;h&tAyvj==@Jjn)73=n^X^~E&+0M1`Saa%7v^VYTHtbcJ;KHnSy0+QU+&elir z=$9>OPPrGXFWAolhh6eOdm;1c&tz`rhYMGDy=U_X`v5H91)h|{cpsx6*$R`NkL^22 zG2bS{=l~J3fa6SU;%pew-zrG(VL8W)VEXl3zD9@rF&sZ*VJD-CaC!RC#Q=$W3dVTw z_V~7LkIgiL4t7A4^^p)JCvhoKb7Q)4mfK@-s-}*z zrAqpHk9*O|^$4)P!u?P=sj!Vb(NdB1jcNMto(KqB&_&wF57(p5HB(cwNpZg&D>Q#I z6VIcpr{h8%Y;j^rIgD2r2D@N$kRcckBTMGA5VZj!2)T8POM%yc4&Lz1fdNby(#lTC z(b?x18apgEuRes)ZVdt+)|bEw;YI{8_5CSoMof>#S(JPcyx$A{6^#ak&RO>bn+cNj zEZ}w+GC6pg!g1Hy*9z=tBua$6rXjF`Q5QV=w>6xhFOr$4D>UH-C@Wfm&a2#(4thqr$>VA#73} zH4b%xx^5e2K^- zcFh;Vn?&lcaez|+5wo!6F7O(4qo=qEbLK?r77$%Q<0?hxw9UBZ5)--P}vrV@R({1lJ;zU4lK5lbncli2x=@Zr9`w6^5C9C9K@o zMVSY%ECDdakpGzQ4``-4TNh`*6Qb_2`;-vW#zT%C7wb(888Qae=uNy z^n~ixHzReuHYdxrbDRjvH4WH1^!-)`z_8))W_K|hRQp;gYCpT{9)W};$Yn%Fz^U(& z{D-h8((P3lacoJ})R=8$DrEWU-kSVeNz4F;dEWu6AMz@TJZgiKO(<6C;OX_|`7n2ZCsKFW$LxVN5Cp}(JHPdr=#r||37EZlC9 zk=7U)&(U;7p^Kkj3+;Z%AkSbY3~1<}@T7QD`2BK}gz+kY#fJ1+D@R}~2gTkKN;slF z5R_NKyUK|=Fe>}rR2dg!{}ykD{l)I)cZdIBUk{aUku)#=AA?8}&9Fh>Oacfq#gbf< z)+Mnu8@TKZJfw{kBE8Z0%4)HdWyAVd!Nzp%8%B5}Sc?nYUm7x4VY_tKx1YFabnaJ$ z9$AL}t(dOZ3Bn6_UPKSZSiKgAzy5+iu^5fEB@IjzDgm>~5zLv43&{A(z4(h*aP{{K z2mV{uS(3ZSJns-BY3{^1YONXfsMj>4s%80|vGa^TWW?Vbdhnc?Hh=z44$vAlh}EN-OsJlW(wEF~{ z1o83Fm8?_X@{(?Woc+NwvBU7Vpbn&#peY(Mk;pU-GNhlu+!6>}X zL#T7hBm4h#rC3ArT3@piNTnI+BcPOvw)^?e?5)D%G>CI7n;qwW_2!}XmP4yA4;A1> z0erO77QP%uni*-<_E}fQl)yeeSh^)5qQPm&8y@2G&j}@44;Aj3Uf!2lnBMv`sjtEK z#sLUFIxgb`(-vpYYQvll-GCXheKFWz35jlyJS}Dhs`0uwfagLmWD{~y+~u$$I^jo@ z^x+U7Kd!l6DlyoE(^_t+@q*|zFn|F1LTl0+2o=Ftt^WAwLTRY< za}lOe)>Da)>tu6uCUx426EEyz$BE}DKpb_DOX)&ngf}<6#;W%^9v`Ri6^HdE9vWBL)YX@wz^zKC30+=_S`;g?$ zo7GBVWwat$bNj#064iseiyy?*)UW7C*`)UqoW+ILXFisadx`P{;SkR|`-OhoU63JF zqIF&`b!Qy>w17*ocCi#Hm?dCA^OB_!3j{Oywo>gWp2Zd4pcZqAO@c8)@ci;G#MD59 zVDbmHk-q?xb=GSxFF-Ix0Ejhx&Jikwwy!7sb=-f~BgHZ8Z>bZfQUfOwD^zFL_k@b>?)5w$n|iuM>8z?M-2b<+pCsr*9^W7wL}Ld& z;}i0Kt`#1gF%Z#;sh~}Q)J+?R;Ppk8AT=L(Qp0UXHZN|Z(i{PHCHHJ0KDU6)&HHes zX(m1_)@l)_2UyZ|ET!xAcPeR>)8QV8xO>k83-VS9OcUK?Xr@xC(`Yl%R)e_HkS79E z-0PO}Z}E(~e!V_~?loohg)&NT&sxJ41&A-#ie@rO292tj0g(B|JvbZh7fJ`93rPt_ zU=CT2fS8fye0Z-*)b!iqpHQf3$uOhP#^2gsD06mh(HKHTr8$2nKknFKCYWpHV51SoCi0O?l-P>vg^X^E7!oaxD8rja z$qfKUK)AogF+KqnXH#R7y{E)w*#Pf?Z4>LWTtjl-712El>HTDz@Nx`if%_zUR`H2S z>_XMjos{z#Winb|VbI;e;joC9qMIa$yBiZq>6}ps?K~ct#_GHxt+#6vYr59TFIoz- zT8B~J@?cNLBdtx&ah#b|eN;>F&Hig%oZV~H+am|RJlIdXDe^NknZf36IyXPQeIn|X>DB@ndW5^*iBQbI3$LFixI{N}8?E(7 z6ZW&*P+w42TNA|2)PiUGGv0K5Oa7)YQ8#*=eDwF>vY{_&xS9<0 zHT>#Ape_Paj*B^N5v!QXU~|3`wDe^9%(^VKS#RN z$dsAthtTef8GSa0C9hYl(Q63r2r2wZWy$U|kqpudqgmnt7cz zK1=X>%54R^pwNcn(5}0z(dvTzDJ{_o!@J%A5m-qg(b22CFEzAiwvB}vV+6VkI4-%# z^b;DAvo;w9uO|RY_1jZIY2FCKt(xM|`~N0KBH3JAq%T_qx-2938-B&&9-zh-wEZDWbKNAxMD*Jo-K)ObiX>Somx~a&TB>NF~aVi}-08W=WOA3v* z94VReL)l&{tW`Cu8bnt6N44A{RR)V))7m0;0&1s z)H2a$l9^@UP~#HIZ|*WpJ>%0KCvjnI{zca&^L8+;YARkf)OQtIYe9&m@22=wqh6|f z@ZQw9{@@6aZF|hzmtTyO_LBIOM&q%C2xWC}3o;(ITJIu>uSd{XhEM(Cg)La79~8;}3w^>#{hH=dx9B9P zgP>3gjA|{QUUK5mR6$$$z&}dvP6@j8JOALzI)8rdA`RW!y2Cx?U#JAn0Y^vw_jg{~ zb|GTTYzGXISPz&P`(jU4=y)}6c|q|ka7ID)qu>Q4#AQrx5shxq7|gR{;JH@5IOSkO zPQdLbzm@?DH;IXvrJef=?YVuS|JEM1DtJ-nn)mC*ONhd6ufMlDRS_y}dh)9;wf5+E zV{_VSz3a`7!#53BE_FN>VcF|-*r+~_vPd?8gWm>!rkN5??c$!mWNlb|TO873<0G;r z+3Qt>UU#JqL4sHc&Y`g}%t|>&xJ(Lnj)qNA0F=|EkS?#DR1r`Puk6SUAH`aa8cA8*TWil9M{N|lg;9m4!%vdNwUA@2z z*kB&M#ga&u58GG`?{JR)q}1=}z0ku$=~rG`Po)NmA_6N+Y@9pQ+z@ znizWAPCM9-rP(=bZ=AM}U-JJjJ)5k!NE6B=j!Efu*^`#v9m4VAA4-d&_joDIhcn4b z>Xg4{YN;hgAYzrt(`F<`CiF>-MJ9vZ{e<@>pt^^Xp8L-Ou(&4^ZywOu1||;S_*eWF zS8(}5O*b$D8i|Ar#~3%D8}m*s;WoEam(;mSxc9{27s22&P*`01RxGGK*W?r$gUqJc z+(@@*lLhp4WhkArB@F3EeyHEnRMmV5n#;+o3srr!n}TcRBpIoamY+4LVrxcz;)0gJlg-GWSkYSi+IEZ2I;G)RI-8`q{5HL!n#D7BpQR2Xqpd2U zVJhuBk_nW*R{tl-50{L8zJ){@wt1hspYnw0DtOn|Kq`pVG(EwE;b_eKmH%@J>~1U{ zq*vvCcQJ+MzFr&ZxAn^HjmNy_2HN!cFe{+Jpb;;sr*ch8jLY0!>CX_~G#HYTh^MCN zQ_gU?TVo?1BMjf2#`tG;lQ7}6-=DNOK19#y$t0w|cZa@4$Z z^C;+|MV-2RV8|({{f$1J4Ci!PtM`sy+m94`?V&pBp|5f1=G3;T_}MK~WD!@&Y&9>) zal5zkkl;Za32GZ=M}_H}`Lcd{y0~*bvYv}zexAU;kViL0rrUa0M`--cL=j?LtYM{` z(RjIcRaQoi4xF;?WM)orB)4tFo;RRxTW9GI+kc7wrpIm)P(dg&^4Z7K|iELW{orY+C{5VU~nbnD&y-jk>h z2EN6}F@F<)?#^7T@VL^QqOhf_<)I%tU#N#vWceuChCFmNA8T1k4G>AT0+YJw4UbjG zJqVbwyP1d0cB;(d@ViWTLp*NURxejP-8ZAcSdb}9L}MKKmL5zeE$clzDJ6c&bKLQU zN_gKHmkPA=7;nQQx%t^I)L~qRb@N_{L4_?XyHqP3uL5j?E?aJ0DMW=xs(vhgzM!!)i?tRqz&xg^3)78Amf22{6J|Hf(y))J=Z&Sex1_DX9*^T7){+ zX7K4x={J_4-BwT2S?{0&pYAB3F(sMdxN6F~@}~Kssl2I7bCYn^(pLMNE|d9qPeLcq zb@J!!=Q0*nAUEHmXv*6mPIas%&YuDm@T2FDQ3XT0z(%Q=q$Z(%eopgg?NaawrxNNH z{9IEjY-FU`Ny?J^W_}JpMOx*&$o`=jn9H%-bS`IH{CyTi&pddUVZPt;b}8Y5g1aQ6 zRlgH(23%g^;fy4u5nPG}hr!p$Puiucw<9(g@5Q5#r_hA%5}=U@XIjD(ytYT-!3`?e zb$(Rh7#8|zyJKws7(9r)<&j zFO_5HB_xnRyzJ*DaT^mUoSft8Au=z?r7w~_7T(_FvK@n&fvP%SkX>}qq3=$j-7qqD zIaV8iPNAITD*8;E1%9m%88>hX72< zud>oNWWjyKX^oPfOB3nhdNA-1NS^< zrfGASi>r)ljrp%HtQ?XO);hjQR^IHUDIOQh91DFkZ01+KR8eM?9uwM+r?}MfBnPQS z)P604O?xvxg*YwiIe1uB4XMD_h+t{R_Uua~Q+Znl+^KTSGi9EnYll;72_Yycv}R~d z?KH^w0G;~MHhn(vX#b$_MQFa@J@ct!(*U;&BsdTd`RL@>WAB)#NE>G6e&Ed ze~zAc^xRAux#A#`upS;MJ3zvL_O^70u?I79VFytaLFi_p^(~ zFP-<^yUl!{u2^EOf)*p^xq(?Zir3PqmnvU!hA4a}+bxSSIV|svcYxUlUgdnI$`roW z>f7IFkS2-;EyDVQe5)g_@8fbkmd z^3%9P{Y^Rv8bQrR=+_~r#~6OLRYk6kc+3$U1^RkQT$q$!FqHG9?MJrK9?K+nCn6I~ zx0&X^n=({ZDq)r0LuvMZrNODI%GT6|(sI?kusC6M+Hdrxs6($+RY28i&MH5+icf4W zS8tCtTvV&BYyQf6tE_Oneu_}(G=3EJRF(5WPmaAbnH*kL6$$T2m+XOsI18Rnt!Uez zTakPmbk?-%R8F;iskrKYDmdg#lDK?^R(cncY;-24#@CNzYfE=3&t!J6U8aJ~I0`PI zg!696!YIn<@zJE=AlxWo zP^G21e`|6w7GEjacvqku&oNceSX^E;Z#3O&aeKXv=9^l#AqH2KeK7yPR6|7QnOA#I zrT@tzw-RD)ut`n2;kzj`PX-qiM;M;##6ms(yHduhj8QmI9ru5p(Kl1rr2_>jE-1=1+8e=PnXjV;s1{xGz3T`$8 z^ycp03PUG=Kb4?#v+Pec0#nsDS@UB>0~yA2?5f{&qXUa@gY?*4=!ebO=yW?5TVsS& zce|bqBLvu#7$Zbr?F8_UOU#uCA#5h=NAqzay3s& z_Hn=Gn`4J3n7!cy#_icnH=X8;$X%%}wv605Jh*(A0?+PtXW-q&R~29=b8prXX(mEd zs^9ds$o|1$j^CNktfJ*48XJ1?{@ByMgZvHr@!s|If9>AY(1|qlmcxL_Dg0OPSm2RX zots;)7?@53%AsSd9aa@nJc^cf58(b}(lmz&#?uURd708_CXWrv`3i>Os^`V>hhZ7b>C{njfY=1 z+&p(kul$Wb9_vU!W|O^?NXmdq#eG=m*3Zj=f`|7WaL?(6}LGRg^mC>dB8nq3?= zqu~29g%`ogxM<{5JjWcmpP%qeOIqD^I>=zdL^RTx(#i+__|5CGtGgfn-+zw#uf1++ z*{4TpKij!hBq*^BW)7vopO38A+E<&&xVePyio%VTg{J72!Ef*ukoaEw@2CBcZrmO7f2yN@Ho0+|`6V6RbkX5( z(*Sngda0BB7FS06_n-QaMuJPxaQ4z1bi-#d?9ag ztKzZQP4%1PU0r6zAM5wXO{NbY+KPc-i6E!$EqxyUQpc&zKxIq^<7$JLQ}-uhp7XVi zlNOWi0cd~XV+-dPjVX!Vj`e1$soI|)cXs4D5^&AC(i3e|qX_~kkb=fh2>v+-WYhfS zPDs7l9_e!B-_T>r3g%Srv6Q5(9k|7-oyj@k;6$Z;d1lk5tR&y+vQF8^jxG<{BS-F5 zjz8zb6};q!MRz-3uN`YI{mXI!TXADd!;tCvaxU-r1oG~E2+h>vfor=ci9!LQqxQmi zc8)~chf}ld<|CQz_jLOQsN-b;b0T6Fgn75_hu5qH zI^y#zii^-0THxpei5lW}2b>dEK1FAt*hFLoKhfWLdiEBq|Dsp<&FAL}d{%?K;dbTr z%t5*pI3Y>@v)AE&?9&hiY$ttUz9-`>7r5`=65e8Ipv;T=;sO-oxB_d zV@}h0<=;?573fpl$PlDQ@H0yD()ohC6UrDqU*!-*4HB?njg+`MpCPw%};tTWG= zU)jtK86+I|&>g}cX3_@(+5xpv6ba0KCyqaNQOfk+7Jz+Ln!gnn_mJUDrw&X17Z>Sh)_ zy$0}4&h#8s0#3t`E zSCp7cB0q{f-ZZWjy{(41#uGdSyLVZnhFh=|GhnH?Tqu^%!I;&hE$P4*TJj2@(fjr|Q`&TvJ&wg)01K4~O!w^kokgF*~? z0q6?4q`w3ejqArJil(B^?~*K;L|he#8v+Pqf4X7|*F?qb09j~IE*)<&!XBd$rDK`y zNp?kwa&twITO>6bph5Js%oM%j568Q;T=Y(I-l04qe$ z6f}Ux(@wPWk}WSR_UCXeK!*Z!N!}W-+2OOM&x%9P{?Ms&+#>6TZI3Uh4_@rPQs3U0 z-cMQ_T4(W61L0k8o(_xh%}R_{$L4tCl8^Z(M<+%H8iGuPwIXw5US6bG6h=e{4$hW2 z%UZ1^H!;r0W*|Ji%fI7CF@r}!v3ZQ5|NhSP*L&u^G|av6El?;gH=h5nJ8P*4wAE}07D;-DxeY|~OY&^;qjJ1!q zkJ$kMWLPVU40px05`WxYO zfIE#QV=o{!Xm?$4L{Yt+iui5pz%{(_cO^$Ga8=#HHX~0zc0$m+9gCCBfqyEz`E(t$ z+_L0=S*FYwgZWOHvOA)Ddi+oSz2*7-Iezo!`{nrOUluS}V87*j|H~n7Bh-dT`sE3H zi3l6NeDjLgiMB&YAJ?VwGKcbtdHS&Q^e{aSKwSeK2V(8moY=*;KQ6V`%ldh64?rt^ zKdwO6|7_|d&)L+vcvH2paW1-Tc+TP#Gn7)vQA0I}?&N*Z6(zZi)j4K;`KcjSDQd4h@X~p6>-NWeR zbE}P;7PrpXRI)Ljtu$5Gj5g;_J(%97{C< z6Q<-#p%b~AIKPmV*+xdA1YZx>3ds@iDxCtw->@UtarS`dF=c(~T4#(eeoL8o3;rSs zy&0t)$85*;Xjg($_ zcR`NNsmWew@q@Lk4O9JdLBLaS+a&S!ern||$6cyt%-m#3j$LKXshJy(Bh?{&zAjoO zvHL=iisQjeAJq4D%0*LqqAjN@GB~m;r|m@C+7jg2@q%Dni&IF!c)CLAc)F6>zx}s3 z#@`?xlFAm!LkY8_WOi;f0qRF3J!HGRg(KTBGJn6Ed20+FNA_daN0d z#5&_GIt=KLo|6z1lwbmY$7FZ!2x!(CllQPkea~+aSNqXYm_ceBy2$$->qBAcke$nd zS)Si}L8?+#5wy%3jx$TI4xxj{h1WWoIigR{8T(6W#qAZBoM+J6!MOLxEK@wvi#GJO zT0>WBGgaAaC`1n-MaQbcQ$xd3s0Be42c*@KC@%JoMnowLn?2mq zHnI1_uxGjwS}DwJ3umW?;)$?h_ORI^00of`Za_>2AQ4n13GS`>C<%DAOdSHn1xP-+ z>sYk({mMD-wjBImk%D&yrC2jfn!h;Hh}5gGp}WEbI*gt*WCiH-dDGI-z&gY-W6}j} zD4P7$z`CHJwXftzc*(SRTU{)u2wz2jeVZI|aBcPR+~d`24=!@o^C;_;+$+{@;3GD7 z=spSAMFg*mW&K0TC%snQJ6r@jpUcYV!{2(f{mgJS3rJnb=8!`$?OlPk;1}sOgxmz$4ru|a;JL;oz9AcYHRlRI=u_5ah2Xa_ zNE&fH!MDEltM$G_=FSIW+LgbGtn5bXFdOpdt%Of>i^O+pEoEa7{t+14d$Z2wpRtOx zzhJ?G)e#XbEP(%_eIy8=^S$}Qf~E-&b>hbpArdkm+C2`i6}*XhB9L#z6AvNMu1F8` z(e+P~a*yrqd}3tXYuB|XIl#bFU9+N)S?*R(AQ8y2pe(>;IFRnODjmEBi^t=9h#aZF zI%`$G1=ZHpFL*RI4TGdB$n=Way4Ik1C7Fqra7vQNO55fRL3%4a?Sn|D&q(Y>$jg^W zWON3Bu0lxkbslIog$KnzJc^b~+t#|KnXZTLIP3oDLP0(~J)HlQ@+&W=(U{}*UeT)* z|Kq1`b?@tvqBF`fZ3iF{n#F;UAyeFHfsL4>|IYRO1~slNX#)1~3%P?ZWgNk%WuTv5L%Qh^1O*7^V&o=B z4p+f!aaJaV-~yD+U8JiRf(dFF%*Fj!hWQ zqG=8M!-JDikGe_r^uRL&HoFJ@!}+OjSz_d`^}k`z9&lv2{cu{_mOLtX&H1i$UedIn zPam!(G7f_z)KK=6PKdi2MaeqMU>IUb@XV# z-eN9-?aPd4THPrFO~P9N4Bg`~GXjKl|)rn$p<4L#)#L8|&TVx{8*BAp75?Wrs2;j>mw?c?W9||@S z;+mNZj~_?@I#OrBXhEl+cCR_eGX)=zsoSY7>`aW&sXc9;pSsNm5Ov|(qN4Ip4vZR# zO8XYi)gzX|DLc`GW*ky)kqMf;+=eme_Q^;LQ-=noa?-~Id}MWKV%Vt9zz~-B?=4Xy zwsK=VoUOR^?^5b08DSX-VH$3*_Lq?SiO9M>S?7Qcuia&Y zNq%E1{ZyM9XrsP4c|d#sZAP=&zZS(zcnfVa?l4f zXjTAfa7IR0VyHSbFr70F;8zr?4oe&jO9<8YvNd4|VTQzk>52m5jmJB(rw=TpCJf6+ zKB#ZfVVNK!&Cw}=mCW8L;1|XD&;M^{t_GeA5tmiTR{3qNppLRS)j^Y$*+FLdG2G@e zQAj`fEneZTx~;8SX_Y>2JzY^3{s~brkO!F0QQ;EmCr&K=t93N>7$S5Nr34#c=y9Jz z2`cOZ(Q`(`--{C`Ta35#`+x z@R4%_d7?W$!zx9#GDtChz9L9@qJrvG%-;*2K#}6u;hx4MteG3$vcNsOP53qg z>h81cjO~3>K!E&f4fB%9Mr?UflW5m9Yn_4cE#~Tds8wD(GwCj_*$|;q>UuHmZ z*dHPx#pVom*MMCWKZt|^0{`n9lEWg%zg^}N2VW&*9%(CqRG2~6z*IgWJ*cRs4-8Qt z(hWy-LmI4sbptiI79ycQh=h_}Gj5^+%msh*8fSYDN76WNl7k(zHM zb_nwH*yIFkKXDH@3gzhmj-reA!0Q2GpSW-jsCN}Z5fNgatPo(H1;-P-t03iNn@DP1 zK3|5FRc@?=n!<83C<0J9yzqG|hsXXrQ5(ZQF-9i8QOB6x$I?A~$s|D}l+h^LqDx7r zamyp+urDls$iIEVmqDTzz$y@RvS7VW(Vp}G9z;S`%igzJ+7(9#^;`$i2`ANAV&f#8 zwL&C>e7hcg9rWov<6P+8+`EEc5w4}WBr7Z=_l3kEb0o~g~71CfvfmP0deeF-Fo4fM?mo2mgtLn>-7*}ErD z-R*ps^&vz;lMo5LZ%%_a{njangp7t;L2cI$#SjTiJL6h=7?2|Nq%PJ2kx(n8Od~{s zEkD?0A3I0s0qC!~BaljS{v<;2deph>?{b)8cCFWF9S#Xi3h$!>z`8D+{-_kxr8Ip1 zL?)`jz*qR zw({S;%Jhxr<*uME2}#Qm@17s!(VJbI=nGg_!iOK0{+smfi}$LNaGu^HEjB9ikhm?e zjQTM1ri={Byw548Xj8hKq^be%$_(LVCrj8t0M?WkWBG1Q75?Gni>1DydI`7dFL(_E zx~L!pGysv%G($zcwgx-~{TvV3@>YNZWGTkm>cPzFS zUEF22w%ePvT9CvsZLnfy)@yq;*0T4jhkI(b3Atv|(^#wPZZudquOl2q?C5*Ki!n#L z1CqJ|BB9*VVak7#F<7Tf`ZooesC@q~F%n(fm%vKMNKOknmdzp(Qplj4$?S&8dJ#V5 z4_{VqHE)*7;k`fw56+m%R;no9>sKVOUKta^ELiMI#k3EXY73IBFja;IT zxxGu?-HFk;H&HbDkJ6O0$Sq!xkQ<^d+YhKi&IpzCgZ+>*A*!I{S7$QdH76t&Y}6=k zG>%TCU%dSdJFF%|ijkKp1U}$ni$5dwckbAinzfd_r<0Qq2{{}z_{FEf1$O5R=GM{k zM4O9vcD#Hhit^}Ne&9s^snT8GHa^}_2|CT`8UaVbO4&#>$wgyta8=Rkz*3F-ttkBR zx=O_5H6#j473%i$+O#SX1Gki;C3?Li<_4SvcjA+|5o4A}^hKYy`~O*_F8b3i9MP18 zDl}N?--v))c~*uMkRgdPCaui$5P}qUAu0sLnz}=QpbPkRy`D(mspy}7vO2x8$6K6Tq`<8SCrsKp56sG9ih_J;DOMz2>u1p%l@P>T&_u`^TN1ZpkR z*GfzR78{iesUkGlZ{+Go;ye-;cPUK?arQE!2rTKd?(mOhkc@QGt)>ZDf?|0Ot3BbH^@o6sstkKax4DCF7e`0A@n?6ZYR`TlI$BySjI4fJzxnlJ)A&h_ z0NM@-Ig{~*L-TEfp3l!H5%94i7V1@hJ?4N!ka8W=U_lIIv@te8 zpnywZN1j-rxW8Y8fcaDcF@v;2SXG*i2<_jJ$ed`TPHF&boS=NKo_tNo#5!B{fI(3rsL8+89NAAKjC=El3 z_h#n84#g{pKzA^p4)9rW)U!R}u`Ho{?IU;p;2Le;K2`jKlMioRd*@ktyq%z5jeY2! zCXmnOdCC3GQLbHK@s_cEPr-~X7bFa-bnc;pHLY91ym;SJ79Vz;X{b_4!PlY{mVcT* z@?YXsFE+kF2W1ffrVK1t(R6-A$X%Yk{tlduwbf$zp=qN7tFL6d7+#s3UKGlF$&0D9 z=0CZ$ZGFsc_sT=x(=D9x;+&V(XM!}wBo@3ii%F2#%;9m;-L{R#)ARJ+P5V$z#e*w4kFFAl%wF&IQv&Wff4+LP3j5J`cqU=y-W}5F zf^JZB_1elubC1prnu#(c`*`i-z8AXD9tnnHMF%2+v`8NO*f zzu*m1!A5UAtCkv%g)>3QVqpj zsrNU=P@EGRfB}{R{~*_pVj8RpMkMKT#iclST3H z0hlh|s#R3A&|2P(%Y`tB-HFIL6LGzD*k0Lx0*xi^sX|TRaS#o-l2!?tqX@ZsH#x1{ zyij47G>Cg8VFgcCDlg$lXn{0#xPmIoRw_x@WQnYlr=SJEyf6h7S-eqX5+WfU&fG$c z+saCJqdS{XY%wD9dW1CRcnd^Wd}%_6jJyMh;B8Nw8!bNlQO*|@LErs`p|I7fnp+{p z8K3sqWQGE%)bjbYrh{y^WqgC-Rs)8ccg03A1$@2<)8EVj(@FM) zd2?=Ia7|1BNyfYCQg~BB!^G*+6F~o4pqG>WI)`JaUoB)Mzty}W0xXG^$dDq`Kg)k! z;o>}nf2M}yE}mwu#9H>TMa3s5zkc=f|7~n~G0D{=fw{!1D*L*NztIm(2lF4mU^O~C z69T3hb2y#^2QVi5HUx(Nq7KO>D2~e*EF>2%6W8wvRKvIGjvOaT^y401<^gLes$FaVlg5CMukC8{_jO*L|jVZA+~%V zI|H?xgrN{dujT|f*zx99L^K1g@xscXj*Z=Rc5X@M^yInME1zpHCQ=S;9vg=4iV{y!UY z41a$w8Zyjf@7Aqnk9#=P+^xfwG46wV;`!h=#G93!UP2l3C~W~O!i`D6{f)Y%2&sNv zx=pPPReRXqWZeaWdy-;sAtIy63BRB4mcd2nQThaIId3XSYIlWEa3;#?Q8KkRJJo|Y zEsOYUx!==8M0bmG!8RBjXLBh%#&Kd@bGwVrpeCI3V>;KU=6=!7CcX2aT^Yh@@VV2d z`cksd-I?hjX)W?}U*_g9i(&l(@m#-r{niA2EUxcoO}d!iH}-hsh(yf!%H# z&-ruxlEq8XmMmIg_}%%oa@S#fxW4wZ{`6;^;rANDkh9Qv>nTV9Y4NKjLTC{p2&8!! ze(Qi=XAM<}h*?2eJv)OeNJQp;ocS<3Cvbh!Zi?cQ#_=6RlN(zFD-*97kUE}*6-gEo zTLXXHx8n1;iSob{yDC^y*Y*?9O;==IZbTXovD8v$vK^j{XScz=ro%a!s<JZe zRM&awE4rm-bA{(m9-r{cAABvYdkZQ}2GF*1aihY$Y5Znn6xP95xrM03;U-8)>K#J?wvVa;{u~3I|(&#Dg;OF>pMs@X8KeC!oUbG9g1=c z@V_^Hl$n{N@o^5UyMQ#51-1Ag66x@(FWHYsT<(hJ^=?Sxfmxwl>s{vjvorG4>PUDz z^2@qw`_|WaWm#V>a2Qh8A>g8!I!;^>uN_a^&(&?6yfNFABw7D;*)8r-L%RoEI#aJp zfs0@PY5o^}k@GzuE@CChHQAH%rG2vV?6NKMo}Vo}n?J8*dp5s;_d^%>#~(w*OExmW z{6{k@JQmO=TwpE}bYh`r?}PiJfs4W=9`o>AbM){niXW?v+9~VuP(i5tDJ7EnRG|0u zx&A4&WAd`)=4(VWg~?-5q{M4$Ncd*F)6aC1cm>LgGozC8J(>z(0N-5bk~qclM$}mJ zve4F3IYmuU@5L)zgf752+$HmyjLhIO$vS4CA$O1}exfqkC= zPJxx-D2l5&`R)F%Rehr%Wo=LZ9|ajxR=Qq`HGRbTucH;2#X~2w85za;?B&^AXbfcJ0ODx z($m+C5y!7UUSk*i`OvVOy<;{n=<+Qz3_Aq|1YJ;cmKyfA6{Z_exxpwAaWEE?!0s#l ziwl*{dHv^sxgW;o)VLBBt%i*y(g{-4bC}1t>v6g+Q{ARXT+08uHflq#PqDIR+aecg z5{#Z4Qj=vYZOH_)J#pXm)ad4cCTfu)j-RQkp!A9*1XGg0a;$0nSfOd=vsf#H+;!KkPV7<;bRaXS;fIX;bm`;KJEA<6E9a0Lam{{kP|_U1{JwoW;Gl<@nD&p#~^ zwOpE`gUu81`r{FgC^;EsmjI`-Nk|t4)lbW~^LpY!HNJ2|L>>R%JA+D>R8r8A?z)aM z3$iNy3FEJFhnBX%?lznGTwNtv4}K-KJMC z6Ie+`%bgvSED(XUGX|*xRH}e-D1wd&7_1WsQe??5?bGL62io@49*7z7)n|`L8Hrr_ zRb^&P$ZV~mUoTluz3)?7ZO;c)L^Yvmf7pCe{^oI+=mUt#GCaWV*+ZAFu9MRRP{%rA zrJ04d)$41Ewkii3Uh%|IQG!UJ>GEXaUbrC=q<~8-GpYq4~0RNQ5 zQ3M4kvITrlaP~m9M$A@ty#wu?15MEDY+qFQ74lUa7zpKnB3tV|W9BzHw@9Vh@rJX3>;KNI=E4N=CMn``ulj4cN(pdrcN!*hKRj;nm*NTQqangr3#u>@JlC;kf-#+zxPVg6B}!_=>T=e?Bgb>q8mSYs++J>{_FMOy>C>hfse9IkPJZV9}@7rDp%zWZst3t~5I zY~xCeEVFaVgkXX%QuOl&TE@j#6Ae+rk$$ks$??u4UWFrASbGO}v`e*%#3dIW4X1)n zQAx?oF_(>IYiep%YksNKn!KK-#^$7?NzY2IiGk?Wv2<3Fb8ZpBEckW1@gRpokh9P1Ls0az3 zMdhV%X6Mu@{>y|Imgo5xp-RX6V8Jp_Keuvlb+CLk&|Q<;rdc|kO`j*i z>@6aUh)r2P`Ta2mt&n4np=Kl?;udB==$W78%T4-{1S#s#U=caC*kO!~@6e1$Vpaw* z(zrI!q=boRo%|_X=5x%wt$BqQ$N^*F8VH5{n3NC;4EA%u>w20AHSn-MJ-W3YvKx=FR~6|v6ghhAXsuI&R{$v{@FDCJx5xp3=U3dVOCjT z4xYD)*^=VM&j=DHZ!20Zp@6WcE$5W229iz_NC>?`B$!wmHib|{Mj|TzcENlayTZn; z#%$VrI1+LhWTpAhU{`@gT6JDD27x~}5i{b+ndgXobZs1V{|PLLi# z^QDD?APq8+f29WQU5v^Bqdma+l6F#``g=DeuWGN{nHC0#ppSDVlu@Bw6SN|0$qyig za^uPeW6KRjT0B(DMQY3+y}c zi6v153@gf-9j9|}MZZHWUQ(5Nnp|~kVer619OlYo@6XT_SPuQ0m>6VmqZ48h7wdBW za9}>HHH-2hBlAS&+6rz?Smx%sQb)qzxTVl9F(4_^9F`uMni`rOX3k6rNboP3hs}~Y zRMd}ThUM@C6DEG5=l3Mo?71mz%L^<1~j8`1^ah4OP9*0H7r}yY+fd4_9z!@-Pj~s zCZAS6u&R&x&}m~0A}D`AYvsz_$}#MT?1sMJL%zpqS8gacfv*!&inJH zG}o?*+~~4hUohKieZYXFV_D(`M7MZ)>%G6V;l4W@IqPvm012@GiiCgporI7g*v^Fe zBI1zgmkd|g7iemYL>u8IA!a=H1Yoy=N#+!5*@4bGy?eztj+X?eNqMoN@KE?o< zOeyy@`ezprU4e|#O_unt!RXh+n0iJsUDMEz#F~5PpS;PqM8J&Na|gNGZRE`C`?-|2 zNUQ|*^W8^1rtpT1#FF`8z}X?f*D<`sobeC_s>g08#9zyjSnv4jbmksng6ZW6KB3R9 zPx#?~x&3m1b-mUfyWV-aEv@}>JL}VUbb_TZu*;{G$Cbv!l*W~R6)-G@=*N9EBr>NH zM)l4a`L$4d8k3Lt0=W4=Z9w(hJ{;!2n7TLm-4`riGlfs@=H8Ekn|E&dcJoEmo0R5n z{g-S~dr$3*${-fTQON2#98z+u3YLmJB(H+Cz+S0CR;P&Om6}wOlVq~ohPtIpscdMF z&jBV%!`&oJHmP`}=iV!Dx`+VzpcX*R&=@HGqugachlgo43Hg?=&3F!J`7{DU} zrhj10r#$Z*t=moiI9((zANKZe>K};L+~ow?j$KlFgcsga!_$(T@ zX@1Q6*aEJC-LhNfb!~BzDlj9lPghpGsLHfTa}5Bg{6&<;S@w=Ttb?;tz`xW?j;o1K z=O73F`3uRjb8t(ZqszBjj}+6-GB8>(g*Jsw$)WDw|6;7?hqKHq&0>Hyh?)A8U6oV& z`xx7YD!z6}s#iky+mYSiF2x{-4q?M2tmM`9Ek48+(@2<`SfVK5!X!=1{-7@D<0+p{ zpPgLp{2yYZvnBeY$Op!No-NiI>55{>VHrzMFD!?ehj-97Bb^Wnyj;L9P*m_nQ8dL` zU2+_Zr4?fgF%6D`ajnY`?0lukpWvD0%n4m%^8>8F5B8L1IMGuFutyrDCB zJQiitvc;}GEpqgUJdk0JjVp_ZDKiS#V^nh8!XXl(Tpz;?>O}&8)Li7G)eAAlVy?e5o8X7K;AoqcF-U=YL zu8@?Ai;Ln)7BtY5dRm$=RS=pUo>>wIZ*)aTW_Wt2AXS(~(<^BW3rgaOipAxU6^0qQCZiOH?Zm;<6zV1Xpgzfr4ictw zrk;A@gelHaZ|Q^Xc((HT!QOz;bEC><%G$@-Ee}SODVRUgtP*7DU@Dt1P|vhc#Ia->iD;-l)L z>yK7{RA*Tha&F<+UY*WZx*<&NB)@$dLt`s2I=0dOEW@YrY1^h&lg$So#or^{^xeC< z%Wir%@*ZLkjg9*CijDHKfR}dhgBS6N_UC;#g5SF30b8@?lr(2%(EeO>+kssghK%G@ zxx(xSL6%VWwSc|Z5qsguS6TPd=qGd+G5Bg<|AA3qfBdmA?N=xoRC7#6x6O5(AR*{1 zw9~rKG3x+~ZSF*q<9`3WNitY6zOv{?SppPgI*z)%EiZ2t>a#$8U04u6@~$ezi@!!0 z*}#$JBZ!3XW*HlClCyG(5i$<|SWWidY$OM^&3 zU~w6kC{Lth88bk2wdF!mRFT+);^J7PEa2gL{ZLq#ceGmYd)qOm;T4S&r;%Ksf03LYBxSB{)JPoevccQ0MC z5RPcKZ`Y!!3zrx@@ZWWch-*%MKy-KG8+t5&LAck=Ic?Zc^N;zTnjMDIoOf>tLO{(= zz7SLj0+G5o*#D_-h>USb&V2$tvgC&P7{LI4+;Yf0-~D#OIe$qx13aPSldsG%(WwW( zhJK$~2>997w+B~wZo>@^zO~x$#OBXztEGHDHxu!|RK!5z#f5LKhd%6#oxyiV(UcL< z*zWDo1V{+QUrsTi3t5)PthGinV@)5}8Hj{*23X4jbqOL8kN`QBr9*W=&4%lkFe0_J zvEZ6g<)G2ikV_=e1k17nG)0EmzAilVo_p&e$0`WyLuz#;p4wUyUTMw0d&HG2jYvXx z3=wE^7v>7Gvjy?Wi!2ai3v(w8?fpzP5*yajJkV_|=T<2YM&b&NTXscsp~`(sci87_ zwZG9H52%lx4kB@tua6OM7?aQ_mp5*a7p3eLXfNq_6B<#Gq>S{&!^^r+ZHKoQAOAiNv-JUv z3A(HnALU0XlX8bX;>I*|dyV`5t|vXM@v9h1j(xS@F)F~h$2TX`Z8u6k%|z5E4-Hk0 z1*q~+@8FD7nV;0xSL!EA9q^IRJCJ&U+v!PtWqv8*I7>{7B~HZ84$moVbz@dc6&6J1 zMq~1y_Y|AK8ltGE>s0HgD#}n;OSpC*>eEfYZ!J#zb9ngDC-%GkN7IoGhPfql^zrHxar8Pkl} zXpeNFb4?~Y=WrTkqL0Y$Zj4i)c-@WYR@EHN1G|?|y%T}zV0Zq)7fj60I^!j~Jy(be zRexLH4G00IDej#?Z|a3-FBZJGklK6I6DMjQtWJpSy~e3`cKx!5dVG{ryqO~n6g&(z zj$8@9Ug?%}9llZ-nW=4TZD@6mr7fk{1;O+}naersZCKd|Uko>rS0#fW8g~8@eK?8@ zI!&+BYGo@hE3tt>WpQyDU}#?7+)|eL&)&PHmX@Bo_a9vudb6^)$aK?iOY5dRcQX<* z_I%1I^L>A0-k=CjZrnAswpQD0_KX(mUXO`(lL^*;k0c&Rq6#8mR`uPCQ;lg7b369o zeB%7u*uk|^O=byANgeOM5axokx2?`7jp)49+i48k-f$|`Q!wp`S?q4yRO3sa(o_4y z3VsxJF&GD&SO4fw1dH`{zz6i6#GxeiZohDiw@UnBC;G;jCHA)zywn^KL8^lE zF9GXa5x%=~*?jnYnZ zB$BwrmzMtGs~Xx*&p&&BW8&a(CjyR&W8mO1XUuswKmVLvAegu_JWOXsY#Z$P(?ubEm=Hmtke*KG%#-5wS0#B-edTzHoYA9*kwQFqIOqV{k2*5fsA zT7@Mg6Lb5;^}p}Z&usqSrXD5qee$mdrLOVHlUM6}+$F(LEFIf*c*aAy1{_EeOHljV890kOxUy=N}CY7KDO`sLio{X!6N^%MA(pFZC(Y@b68IHuD) z6i0AAIuXgnFHg?X|;_1#fmEr75`BaCImJgBc5aH}KJXCbc-ekLf;-L4U6M#|@ z7b$8x(MG_{M9|z$K&D!G(8$)2=n;g4h|D446CEca-+?&@mnI{#klv^3t}mY5G%hj9 zYt&n&h^|vN__zV#_4tOBuwd0pEIxbqOT#`Y%2i8`M^p&SOO{=Vuee;eud5fXQaOv; zJA7UA=!MFaJ%?GtZ`=!R-)hsLnIkWH_7qD*AYh`_n}3l!8@Np#b8ZLDfDM7v$Eora;JB6iVbt;>X;MJXgsxZ`*yH`n=10o z@yxAi`W$99CWV$oot`__=3jwamV5|m32k||eLKuPaYnMD6Vst-8&^P93ar@`5tfI!pPj0W{x-Z*d z!hd$^s~=M}Hr#N6pKI9&=n$u#*8Qa4^ukXJ$E^{Y)5B6jLsP@j$7^m2kAuI!-cxZF zh=f?Khh5w8(dlM7sqzMp8#Nbi(U_QT81}aCfm_Y`pwc3-r@_`*mTRs0={3DtAHX~r zWR+oi*U#KjH)^+qzqk46UAE2rHqGMG0Axohb9LFmoeYO`ty|S;>W#9zCdVWVbCvO7 zIj!xdhIPWUX>Dz3TKMlYonih;W=Vp$W`QKEBqOo4kpCosE1ilHB&{hn`{-o9R}n<5 zk5nCeLS_wnE%Nd!7TP@wYz`d791-r#8@fzn(UyVz(|_1u($c^_Tcs^kY4<`KO>I!^fz`?FZgQ?jA5$(cvY~b^hb} z(2qs)FBMN4$pZG_o{D<>YctvR;m}&6RQqT9Bf8Tc!b{?JVNHBQ$NZ_48u2>j_Yh-# zjrY9e>F42-P8ePJf?@e6Ss}Wnq8Hq$?RD??a)9n1Zu7qb|B{$3*GVr^iMnYcm@2gP zFW9$(QA-M78KLRHf|T$yjNS=aC&nQe6$^$GJ17d_byZlw`Ho)q+OOM|-y}Q_1DKxa zf&KbVQe0kz<1o};CZ;KnSz39NoOw*COO{10xlgF~NyON7t60fFxwzHelU2bE3&DhG z)3dSxJ40eW1~bM1;lvC5y=Shzg<$mO=v~rtNAYQNT>A}3Pb{(tL7{Haxn#7QLC3aW zG(vhDas`NlhrfMmbUX6nzPMElpT1$%wu|S$wFTJ)!;KH}_{yUjo99<&o4{=krSR~g%C=m}d zE##Wk(rj`I=?D7DD>itK#ErymiQBSs?aeQd{A^#wc@TcO{dId|0|wewdfNNWWy4wd zE^BZ=d-*J=wr?H;FEXN?W+#lNO1VV=TyMh1RR|L$p`~L2mr2x6$Xy!)yc3Otd-(UH zXy2y38<^??F}xEF$C~N|ccYGoJtZW^Vv|hCIQToR4G9v9Ze!thLi%!`+1J5-jWGhXT7cEyNg?|SSg6(H<5;K4@S05-&ljhl8{#HQ?u#!iujH%(pp zj#&ADk#+zXWoTL9w8U}R;i=Ok_oCQ|@JAwe${&uvD>Xb;O}+8X(Zos8(z|DSZ+JR# z=Dr|74@7=Ml25=-&I_YIcHG4v^|=^J)qQ8Amy~5WER>@1mK{Lml*tKK>fKBHN?32n zBqzF4nNyohq1uo9sdKyVxoIk%W{6PGc2U@i9yvNgAo{wS5>DF;Uj*2mF_qa&uRD^$YecUJA?PC()K2)TaJ_|C-m~ zey{$QFW*jVIj-dPvCX#?u8lTkEG+XGnc`Bi@O3xjX!4HyfFkk^~Rut z0FEjMW9Q{l05h-&tXgK7x5QK>U=6c_MPRdxne$1>P@)%&kVq%(P?I6{bZW&8SI8~S zA7Ak3E{H8l4bD~7vL)B0^#Vh_Z=3Tv$z*w?4Lq`ieiB-&lj5CL0jPk# z3maa%6_(U`3Y;s-usf2e=t68|8Fn~{mv&B>#YI^3$2L@%Gj|HBo|u;qItjBJ_Os8i zky6pg*5TxX`hM`76P|)!GcslCK|dR;13>_OHc+H>-iIX-fU68NJ~QyFsY)QAQH9LB z+aCfiptix#5>7iaUvZkwOz%~!$tkBYjuoA{IIpX6|N6F{2q($6V^wxDrFWo{Ezo@R z9dPvWJRVK-)RN8_;C(T2>mt|rcHR$Qt}hFKD!zPCcJQ6Db##(!P+iOPboLTRO8m-4{TZa)oEv}MMO2M@b9Z1ikI>e=@`!;}q9GDGEvfHP;_a#Pb7Xgn{UffBuF ze22!9`Qr}`Ob!7dZ?(di6w;ak9D0f*6)meB0-L}OD`cynK3I>}H?3eM^0Udg!uHb( z=S1dJ6P&}dlX<#`YAskD+bXaO1CG9WO+cU@{;mgyo-1?b-%YvIN8ss!P4onwIYWf| z!M=WeOMI!Rs3jOmx>$X;Av?1mu+-FT#i>R+dgYEz3TKigvUK{iXT1e{I;L(-SawsC z1t*PY^j^axpwW=fbvFNY2s8QV=;&DWXDkSlB&Duh3!xTfNlBd58edY%By(5W?DbP( zXCdisV()faZXuZ$C4$@c?PWZ-ivZ z4KAs4n+O_kGauO5q*YspC~Q;jUu@E(Z#S&xJpqolwlPq66WTlOTI_h7Ziv(ya^Tt& z@HJxx3%VB+k!Q^QRqMvh9V5?V^BVc;=6Ae*6YGBK6ZZ(Ro{alf{l@PRgz(L)qj1!ZKMI6?rx&MUMUOeAGrFb2{{DaBy-? zaEf!;(A+)=}|h)jB(bC1Qc+PM&(u%Jd) zT#|nJbbSJ@81>f`Cim%Ei&GG;kN8%=V1eDXIFp%Gy+!S>2|OoYu)w~wD?J)cxKIv} z(6R!Fq`(cj@7*gY09p2gXD2rU>byu3lJ=P1fm6vqzfEKs87Ravff_F}pHeHQd4>XK z3?|ki9g>-QhZiOY=iQmh0Wp`%d~+G8xF)@^pD&2Ct|szGU2mIPLHUqy=eY#zlnXr>V$2p!<`+ zN+4kQ^?oK(&<-4co;k$p-{O9MMlt83*H30*;@~zH}>5vo%Lzmpm@6;Cd1`afEW^?K8Ed~dn~U~4&LQ|dopnF}Ho z2li7L&g^>H9A}K$57J_%{>2RL$G3-n^ZxDau@xOK5H4Zc0-6IbYCAOA3~$NY?>3t4 z$A?5}Uq?p|l}NKqn)Lj+jRpp;xiVThdiB+~7Ka%^(`!_`ym0|TRLRg>=*D$R^Oduu zUnKs0)%j(Dt$09isUxBQtNmIgd`Q1#?;Yv&UsxSa46u8E_!WNZ(!-4#L-`;&HjMY6;Rd;mlzbaBUeyRTQgQfCIgStz99+jN39eMjd z$-zO{1PC*c$eIQbA|8?M@Wjon@>SHAhLxg|X@EXcnf^gn?LawWE3&u)-b5cn_R$Xt zroME+Ub7rwQnnCmDQreZnm0IaNH_{<7XMA61a_axk@oPUq&B&(@48GuMNdn}e zU-&9UW%opjPqR;UmUj!wPIOl=s$6c>)DY2F8}qPQot%^u!C6Og@<>M|lq?yxcZ}5C zPjyXmJw!^Q^U%?ns%U|IE-i38i!*|q`=9<%>ROu7P0nveMmg)>CUHS$tcF{YMNH2A zJzAbQBd+{DB~tj+W#FTqRZ@aP`Q$7*wm&rLf#q~MvW`AF@! zvxoFC`hSv5A0_yvW_OttmY~ig4QovNP zqDhl&`ZIPdl0dDs2WSmwoQdOwXFTlb49qmF(6skROoiH*cO_Zb1HJ0l)b3 z=H>e32V6EW?_Ad8)+{S?EnBj9>0$uuazyshB>*A0#nl235Mj9u@bS3^=#a@}I=JGj zHV$iYwFu~o=2%>tLoNH?LO0J_+$<4}k*IDfGAC&9KF(tOeEU6xT%=))>IEdld#WAy zl_87X60*&EVTE=Taxh_CclDN_QFhPdlr>om9lr#t3eFAAN{!b_&ILPr6ndnJ(I}~KI3Re7+XG9mdrTe+R7q_Gl4s(!_I`N0#gsW!N&Azu@cp|N6+tUN zXT|Y#%7O)!({yFzI!PzzDQ3|ZaYJ0rEqS?9t)z;bEOiL^*bq|=lI<3(T_NAHYga$D zKXWYnLI+?U!#8M%pedz)?Wm1mYa5m6Gy75QBEg_FvS;>6P#ak7OdgZZ1O&aE#6{#Y zG19jTh+yA14##-J3_D^rmTiQf`t*mL4o7=L4?Ce(#(TH)0ka9{>V`7a6=t!ExcwX~Y06@iluzKl+ ziX5N6)vpL!GYGAr0&YJHANsA58vmU z^=QkkU9fs~>~};p3j~(yjRJNp%TT#8F>;P?x;#;qL1=dL z(@y-H^;_nhKyQV0`g~SAY0Zr3a`BjGOQ566k0{}mC&QJy;-%{<*1W8zpyudo9Ct=TSZ_}zXh&QC>1RkG#CT?1^;bu z5eb9|3+2iZf(0+}vqGz5HsfKNq%CH#Q?qJ(^Gpo@A3mxAZIU)HD#7l)2r|YM>_^{1 z@6W|0)IHrPVDXZm7y2tF>>>NF=<`Mljxl>Y_C#MZkB%Ak7>=G?-w1W^D{@-lVo#UkF~=mu1tjBQNp*-lPg3D-^&A7I6U5%LHJEMd?lyjg zCb&0@-OyvBGO0GXzfogM<4!=I!{L6db;#!6NBQ^ncRxXgxnkq@PZXvCJ>TDvT0=(4 zEmi1cB0P&e0AnAIH3UI~-A=&L5+)z`%N^CbYw69YYu#r!cqB~GX6f6bjv$<^b^#q~{MuU#y!dt(ib2FUOsv6gr>4zrZooM>6XvFuz_HBYrxBbtKxgRS2 zZ>0s${`YD)9)B&H!&mH*yqCbEOv>vNmuyre(jQfUswrD(6=s9W3Aw#PQ0bOcv=wxJ zS`$rUs%SDgWI;kMLKQ+1hpO@w2^Rk`Bydn0fVs4cA%E5W&4-NkONO|an+s_ijApB# z!heXW$T_Ib6*DpvmG}CP1`-Gm%)cf~F$wp7HUYk2E~U8Q*+V3_y_5+*%Pf5ui!^3A zGTo2wLYC`Rq_>TMb)GJ1shurO|Jj41J8i@a*HUTF35a-f`3h=J#q`QqKWd5^dlpG3 zJry(dx=i$f^YAa(MGb`wa~8d;myAostm1n!Vi7>!!Gu`r7^AvEF9$Yueg<#R_W;;F zJgE-zkt-|_uQ~-F0NzojEK-P+AN3$|X-6pbGf*wR^G_wABv_8!Pto6so1fOzWuWkb zzY)+V98xq)A_|pCHKBtCnJ8AH0|8GmP_;uaAQVX4=ZOI)wLq@PQY=Ma^q7bK17gR# zy2Jz*2{XL_r_Yh1fff@*_Q8kMHe?m7ZpYC z4owOUPRbFmCr8n?V!tKB5*1Ps<(%#9l6>{w-ijQ5dpL5U7o$T&d2VnfXU1yx!o^@- z5b=j6Q-qiR#!9Sf;oHoqNUb@T!%fIjQx+Daa zui|(%=l)00Hhr>Zf@gD?U>1xLlmjp8oo&vJYry^FJ3(LAm8-j5ZtuRB!Xlw1dd;84 z3Vx6^6z$$k(WE*%rV+}gZ^;cU;N2B4STRC*AD9z7{SR!+P!8-_fw4KdxGB0lx=BeK z4oT*4lCuTu$wtp$o5yZHUnfpe)TDxR<-!3rR>~b7V-VP*9g;lkm%?HNd=nbK}$PSkIECWjCH%SVeY z7wW1ZW@WGRIaw1!z<<1&CgFuNBrp>)ohPAxRx2*t-j7Cq&kM`ucJY$c)hyQc(lSsy zP4Jrh@KZfk#-*=ERR8=mgCTY#I=JR+(xY_T67^FBYw(9{?G@}0oBaNg8O8noa~zE) zs`koC0g2N8Gr|d<7Maw+80Q$E7R^ntxf?g;KKqRB!Y;(7LUvk4 zCP(YEF*kSP`@cS@36L+DM?oV3sUkWO=*Q;>+N*OHoa$Acs!Wk?J^g(EBjLA1ofJc` zZQ)@r5Aw5{GFlcLA|>&o=Mmg( zNvR7J?B?y(ak-DTWx6cN066MzU+MiQfNcjmPjq!9D+>9bra}yTceXaH7}>$>oY3GC z7@y1h;VPihY$^%4G|VDSMysw$ZFEH@BAqvFB`Kl#SP6gHX~8EEHV_dB-L6kNGOV%} z_aT!6cludNP$fK1?Vd*r;PY8cqVMh7HbeHtC%Su=Mlbb|4{d{E-8hH(7me>G$QL3o zIY%y(M=OR$Igk2|8UEg1DBLN2mPNX<<4#|^Tu%p;N@#oIL*eN$A7a)K{5iftF7Qp} za6{5lcm=2oe_@hSA=9LaeU%)5HlzCj=tKoU!Ia~PnfS$)^8*@wHc)bYh;)u6iBkSg zO9_Vv)rTs2=LqDESROvS|LfPH)SDOO*(~}pNh3`JO7$;ZJR#8dzxmUGfPbRxQbJl9 z6UDs{c*1w0RtJ`J@uC^l`Wc*Umo7b9(DV`*9LQ1VZ6uPY5WTZn+Kw?GtwsnKEU*_w zyiUDC-1P@FXSq4o+W|x$&C?7x!N!rS9YX3JXC+Z1C5jhf7pKK*r~vzt2$8fCy{-eX zq~1GmeO5a(JUFHBNL7FCT?0Ux)Z<0sp4~P0q1}7dPrMg|f>~1wMTN(h$r9gZsRhXg2^NAVzp#Lr zB-I9eB}qb%P*6Bvy}gc9zya~3;Gp#!aU?4&ww-fWp`N=4kp?FRzk5c6V@DgPu}lUD z6?_yu0B-L6?(&9T0kf&8wJjAZD<4<;#+DfQIxbhoGo2OiP94|CKWoSWd;99;|GaK<@Jo8rTTgtu=ft?-2=}!PeT84H2je3OU_VtLA~!>1+XA9TN19 z>$buJgUw zdNk?zzQ#a@+(oE1R38SjqQm^gXZy^x8%66xhZl)2OVpnMN9g6|x~yKxM|25W|X_rd$_ z53gU(oHfk}r$5gZ=YOG-_u_EpbDs2q=i(Qc?z!)f`rhblQQI$b>!0iM*_na+6nNF6 zw*U8cWWyO>hsRu&MA+s2tqPRu3%t(1=xez;UC%)O6^D0!fl|DCB}ZY&q{mzb-^%NC zd0zUu0_22m|EJqq#d!=?jll{2^EIch-i@1@FcZ@mj;I@P{)UUNryB4NIMM@}urF)J z^1~;Ag2;%xsP@2Rsew3ONVrDtlR^BzccK{*=EWA3M70QbIUpSN!?0ww z8)=C4YJ_r{QuvCd+^zVeq+OyJbBVxR#qnJFoyiKL#qmF!r8usW%(=t!`)`y$%AxO` zKa7p@KjPaV3eyJ&X96{}3pfH}9q8q78MM0j3sIX*@fD6KOPb`dGgJ;2gS{Zl=ymiz z$$v+^3}vPC0W`bPXcl5;g%K@N*UJjXdEJ4)>*54H`q%zh?B{X>M%(aDG4if%xuYC{ z1x~^x2Pi}5sfC5-&V@TeLn;{q&MLZv8ew37TppkmaC%^rTpOLCjvf`Yq)cIDBHkZ< zt4r9rW`(DvRh!QY+cl)jhr4T>+wR8G0fJ6Wik{k#D8`@^HnQ6CI4`Xv0v3@BXYjD0_{0a|6V z)u?4apR&is`e=P=ueIp3^#tC!{&e}4O%rd{#YJ0`G5xWM53BEFk{(^UL7KOF%_ur2 zcj?mH4D`t(7dV-L-mlGFiq3fsV+zYwwF4H%+Y*BXcDw0FbbD|!Vo?0iJ2A~=r8w<5 z?TCkx^2jVG{ahumoP&560Ah!@~-;aZlWa z*!4v|t~BHYqZ*Kn{InoGG7wJLkx2|JcR!qbD@~hSB~Nz?wBAE*rSTJAwPrqWHpeoG z101Sdudb}hSTZSir78u2dSGSnq+7+Rl~*fV9ReA}v1aE%XMOU#Q?f&i>j_&;Cn_!O zmgJiDt8KoMZ*HwQTkj#OO)`gRM=H>L0%uHii=R);kpYmNM-XT(r@U$Jr;U?L=n@W1~7}19k zJJCbz?z6Yu?ZEN#t%PCHI{A{YYD?Vewe~R}ST=Vwal=ZZu~8|^H)zDjbk+0>_5c=h z>nwY9O(ySoT^p%gnzh?g`vW5!oV%7j@$088yPk2LV~N(350pd@Qy=-gYD0V&ta(Fp z^5H|0K2$UfON;mgKE;{%J_EDorAzniCf|&xUpgk350rrs&lKQx#)y@;}$Mo72*MU#vYR>e5yb@qaCC55iBcW`2(uSLfe*8G+`uhfe6UxXZ97 zg@U-)@`{)^_spALUesL7L`ScnCq@qWnq<$v_;HoRK14bH(OT8GPg(0G_^0YjAyJ@RHm$x~KEF>hmnIIAxG>X+1L3a4+LxzF`>Z(KMU|~g6>Nw_89|2^d=BX>7S0&{pd7a?n)jl zAuI5*f#f((TKIo=1nYOd3weJOBI8!;_zb_Nu|tvN8juyz*1_Pn3JvOI6YlJOO5g0x zsAkhKmR4AAO27ih9>266vVl|Hyo{uy$Ee>mc4W(nS&2&shjoiG8wA3}j794lq)XIjn^JOr(B0QOMHQA3o=<@kPy+-Fli{ee z5wyj~nHNMxx}efsVFawC1G&u1!-7ynn>Q@gXiZw%gUJEoGy^z%C>*enZ#rTkdNyxR zfb~ENa{^Fpw@MD|J8*QswCd5zit;kcqeo1|tluJZz(8^5u*xCwfsY<1au(gXS)S?d z=oltfIn~i|@>uRsJuz;G7~j(+?V$L;SxE#9e+F%<&_6lpF7M+h2H`A_XMgKc=#%17 zSnC=U?6_(nwEe@n&2`6FPt_AT8U5mjHTto1O*tmzEnz>gP|WB=snVxy|9ZumV2CvU zj0RK^?+g7)afRz6!b%K^j12bSSZ-IKqa(@l^pG;h+3FE#V$}YN1=xR=F-%STKeX02 zZ0FSS!2yWiU`n>N$?v&c3^o8RM3elwyE#2sM+Gmb)`40AB>7Iwy<|X`00-Xww9Ow3 z2HJ)`i&e1XY6k~&4+=*0poLf^OQykQ-d(adP=9?1F-dwo^dbFWK>5~Tj$WsT5vQ|M zo&5W2D%e*?J9vmpFUfCVo?X7s$~ef8GiXpj)}Y$0e9UVASG74r2zs$Dtsd-?ab~e6 z6HdmO#hpy^vPE}Cbw}G;gp&_cP2J4!S(U)tqU5bE_~xlq2lShmF2^3JVUGAP>#6W9 zx@U8rm^*>$yH_-Se$o9EC{>Gl(EXpn0gfffb(J@Kv#P^g@42d|t=}5tu5at&1KNRl zM*R%fwpRqtD-J-8lTN{%QSPQHy}k-xf~`n``s+WI<#n7sGDAG&^oiLGGYB(Y5}mG4 zjclc!R_vlFaPOG;oZtSlmOH^+;^#N70#)vdRp(qfUA|l;=`D9J2S~Zo@x_BY86=6o zXUzP=n$2VUxQSvy$q-i(S;bz%{iYt=%R9w{mkWsVOYZi~a-Ee@$$VDV4yQZsuZ!t0 zjqTEKvlGo}-?%}dBp1rloUFrMWxZE9Jih&@+pWi`n$*WSH?Q)flyKc-Q|h`iznExk z1%*|#Xzu@b30w0-7p{uPv3I@8Uh*JG>~;Bd=M&A-c+sa0-}t9bKd)96uvljz(TRZu zTzAZei{3YkKB>n(#3UMU$$^p5GYk54oQ2uMzJmePRp!E_62o2iF)4FqUdCpC4x6*6@YoBcaXwzgv(8?aUB3l6w!CIvh9-Ev7l`5%{X48rD=7jjWT8 z2l_2};L37pZ<@b<2S-`grLHC8frjhA2YtaP&*dr=lYCS%*seabk-K*~JAY-MYA|fu z2GcGXYjk-sSts6eskVJ8VPRpVAhNIv*jJRAO!uNiTRalkpl@(fU&rWlcV}lkd9r+Y z6Xvfl6;LPhZf~cqpl-XvdxlmexAEFitd&_CF{%>c%LUjj?Dm&LXH2p_ldS@-Z1)-> zU%y>mHl#c#G#xFr5M~RcokldvA^}n~lj^xEXN<`iwuYG;p+b8;eANj^y zr1;jVKI$L#{Go5tk~dp2$GyCUR|*mv1kS=OTRv_puqRX7u%(NL`}Z2p3{D9zLT=!% zozB4EEzIvi=H;_;UtcG@8X_URG*!bGX(}QKXjJ}brz(TSnM4$ZC!#UAjBtwaYWvi- zQ>jc16@1n#&X4;zkRSA}od&*MMRu|dKoe`JrOKM!>>V1>M@-RXFp&4if0DlCNJrv( zycv*o19%c!rtw+#;pRk0`q*gXMo^=gKT&>m&MTDgy$B>H+onM?$+8?PB%rXdqwfsZ z@8RN6L-Vw$hJa(=Ow*Eajcklprm;;2h=K#O!OG=335v(yyKBt;?@GF*q_X_-K+Jyt zWI&t0X)*if?%z#N$3+s17yjG+-{ymDlz3yIYv1=J`gt>elZM!MH}XlO8O}Aaq(oFkce- z(6~iQBZ2;7ghpAYT5N_`*CUxCVa|(Da2>>22@80&j+YULWjllvrElH5Vo}ee_I5Wa zB=x+OZmjF6v&{+QTDR<3#0{KNXSn0HL_lc(I`t-DY7PG-A|rp&}}(g`QdEf%y?U-k#KS@d94W<(Q*BwPE6F!w5iCh<{|LCY6c-VHz1nClnGny0N z^e)G#FU~nWFKb>e%WII``nK`2Cwj94qqQlE~DVn)4f=LmSXn=E_PGlYr+EP~{2 zhXl3QJB$r?vyuwA%;HuYw?l?}H~n(gX%Ba`vLDIy5NKw+WDALmrGgPi!ZDPyM;g;T z2o|qCHG#nM97IY7k<3<`!$?{8&pu(r$$}Lza}*gqOD_)w=X_F!lDW0N#ry1%^S7A= zg6ro{3-P+W(G2b|7oyEj3OpRoZ`MPe<_1a7Sf{8HA$%c%tW%OWkR*Y6dw8?)>17tH zrR?R^yf}>?wt_#rITW!-1r@w++0LNEpq*;BD5|2AwMj|JMH*I-(4AhlRrpKUyPGMg z_%FXbFPvHBk}Usw!8aEMl+lBfExN@D6QEvd*cJ6~@)8Fg z*DE(@=mU1d>S9(CVFH+p<`de{810{sl2&UYOaw6~wn-;sFq*MJQom*d)4+CBl#UVp zYc=K|I8pFIbE7JKVx$bnhn$n&kRMtwF*@{YH=9SV(jqE7m`=^N^hn@TW;Axj6X>dv z87x^9LZix<1aA!|?Sz2As;EQ}oPi>kLayQE`xV`+pn{sMzz`HTK_M{L-aXprHsQ~4 zutC{%(|anbzW~HPgxgeOF!u0}szIu#zBhGVXLW)(PVo8Z46r7|n_WlTA+T6zkII4-+UW*Us!^M0W6pF!7T%p3k=Gdl+G$9j( z1I{|Iv*{*j=js2$m!QVazF6T1+=g7ZY67Q({|L z1eOW^)WRXyh+D3YwByx(X9IkrPhghOWVG7nNh1IhBpDAY?GRs@R7#F4Gzd7+%Td=+ z%cD7h?O7R|k3e3e0V^OT8_t9-yYr1WNWtoWvy|&eyycp+XeH&nZ3nbVwPC2<2TXX% zV$a~P^bQX*QC!A$$UpE>@`r(sy?yVB^yXdU;p}<|kXX^H9%!#&oQm@iw~x1jfu%i% z_m6}&N7@e;6#r9mmbmpB+B?!$E*er>=B)w&cL*12U}C?_gdbd9W0Hk)Y<>Ll+WHle zVOUqp=A{vvf+ISkw0>TEaBDlyKZhR~V%EybspTY7oFE@n<5$#h>^%1cd}T20Us=?I09wuX5a2vFgC*2<5wCS~j5_|UT;=AE@ zS0%i5i}L9S*R_HrWrr=Y*T;3C7j0RH$rxHat@r5v>=oEED+4Ry`21@#`2j?BVJ)u3 z=3;cty&W>s#%mj<^j+l4;`^1Sa4hHKE+0%bQE3c&JPoV*6idTTI&-vG>n5`sYNo{l zxdrDZ@ad_-laD$l=bUd85!za#wYUK_=lgkAkKe79F}h2q*XfR)b+~<44;;=FPMtvM zSW6sAN0&FFNM@i2wkr*zqpy#}Xy~eqQ?BpxaFQVW-7jrTx0(aUrP7RReg|~@Leg`` z^q1UHX#m-bY`6C{-I{aHPk-?)jT+L8D*d#TACU3*LF@Qoyn)VAdI}<;TD*^8jF|nm zdB`+;z36{{HCVua`f+MHad8vA+o!pCxg}>aejpl8-|d5I(TyL>Q|`<5@G~iZmk!p* zrv!&4hj{K4$cYuNxp$`b_f*DtL#wx~u9>aDq*6S4{)7=02(y7EZ-~9+)%Eg3{00EM z%ADSmhWcmb1M4>qiV|0|TB>4s^@8e)kZbnFRTEA^%{Yzv(X~3mg5`@Yuc6TC0W_|L zel$%K^3h-*ig8QkQ9LkMEQS|PpPr_p*NG#Wr3r-EzuqrCTP5lAC&n9oynddVUiej? z`~TnSG~7cF$$s%-kd5;$IK3OeAzsbBm)^ZAGkAZl2xpkIf|>iZCY|U2(al$a9Du}K zFGj2r2$l$#faG7FxU!>y{U2o9VGY=D@uqA1llY38SwFlkbeps<2e@W%M_;^0d=+D9uBK=cCxLjYcuV5c@BBt0I zd`*@9_^~YvgxcpC%;gH+|4!$fB}AKCUb-|>Qkf{BT{?IxXr#^vo`Fzv5G?L(Ly$sX zN7ER;S0U&{X;^uj=nis4Nf?cc{d81lcB%p%{VQS=EtRx%TZF)l7n%7q6%Q`N6hob{ zk>Hb6Uix(u`5XUg55{bB42_JDZ;DsU{fU^cd{E#o@(X#wb}D7qE?s>T;YamXx$e z?o?wMo5MMF_`wJKP;wKLIC~2%TG9Lu{ITV|3%h$Iz2I9$o`aC@&}`{FU_@;ol4%p~ zXs&(HPZD(jmWlw6EWDVh0}2|8kv$U#zFEIvemYe#$}A(bKK0~mt#384F)?p)NTVY) zBcoYwC0m7Ms${B#X(nd-Mx+-B*w{=2zZ~Vx@|!oq8AK`Q9S)6){}cbo2^y^)1Uxuz z>x8r*hplzfnx(W^z)3%}&f*36bVqSx_S4>vos14fVWC*D(?y*k$H@r_9GRRM6wB-LijXAwd$dBSRG?4S(INmEo<@_C;F`2`pckzB z^c;e%T@W$P3-N&eExtFRg6j2JDG z@drqxcklYz`)X={J=ycv8{y6|(XrRUAIJ84e!4_v+CQECiA6i3qS4nPP@xKPyBzDA z?m7Bn0XPcnr|tL;zA>Rk9w@@!qf2X|jXmVo4j~WPqJ97#;3zukY##+<(1xpXjFpvL zJhj6^J-AvN7cbsDG~7oe7b66%Eqs1UD-hh}9r&tO)$##Ap+9miOCSdzlKtENqoEW^ z7Ex!RVuUuMy3sbHZ{G~%eKw#6fsB4I21xSz3(!(Fu`_uld+F^y`yzSU76Pnx})dW3y21^E3X3w4|UI8up3Q%eed;Q z`3Z!<48=F7sRx3^$R;0;fW2IPaQYk3DZRF8FVggMF@h#B_02ZPt ziR#B`lfld21rP~!EQho}ZqFhM;4*xR495>@Qo=m2NHUA(ydnwnTUIrHj6+T5v|WLy zzY}RR0eo{JK2V+U*2k^5Gd2IiqX&kw1fqN${d{~KM}fiF)yK`bw;u+2<}1ST&R~kg z#h46!le=Zk{4z2x1Ve3OB7N{k#O;aO;ns-c_Rqe_K`TTzMVFM)Hh{n!6PBGxC zuw+Vi_}0@h_o`gk40IP-F`)8uvis?+;goJzvIa&T+v>${Wi#2We6Ov?V5HWf6TfGU z0{fPC4itd)iP6}J^t~D@vQr`kiDU+4rm~HFEk^Xng^%*?S$$Y@cUKR!AJ`~8+SJ>a zZ)}^@zhQ1`)0*8f!-@-cL=Z{f2#K$g~^Q0s&u(C+dtmxiDSmuTaE{!>KDMOJWvh^{t zQWOj+J*UAXiQLR9V&zmX(*+uW%n5-LG6xv~b<3&&bBRNT)}kwNwA1JrU02s@9PD+n zro~$C(9N0cDeX9XE5YbmAH=zGmPfjphzUd}P0ED@CdFUq*qbZ#?vH)Dwbxb8pGm1!RvI zfMUdZ7=S)>J5;Vf3!!%oz@ekcfHagErS#wyBW0*GgGUB7-$4^n9vf30WdRMKCAK`$ zBiA^WSAuZ+iJZy*)pQyYC;|mx9pz8%tVZddidLhN$lMZy9F=DD$Z*J;v$2$`h#98x z>XE;+j@I*_(P+{8fxqb2LbHY$XRVOb!U(#<6Ds5bnE03ORHXx5^>8z4Gx{8!s@5ay z)WP}M!C&4^*Aef)$|~AOYA0=|ILOj!@~2s4oXo_qv-`~GM(UkgJuUAG0|px^Lr!n< zvJap+eX{<%R=)YhcPrrk0ynzW;lREhOZ2-2a^;uS(j>gwj>5x~Kaz`f)7Xz!v%5vK^Zn>9(lE5J zL2(%%U>FUHpl|YM(cGP}f)2`M!LU$063uCuC+=EfOkLLfZEn!izG7GH)q&t%3b;UVN`q_4qDz_bl(^#8!;BO;Q%cWj z#wneD&L%E_w7TwYoff*Q)E9?|(XV^>Way;m31CfWl^x;$tm-bo+)%d}ge6Z_Q@pujdA%{LizyidX zbpE?qj>y`h_058%21IC_v&qI-na(EzRcUU6{OHN_BKR9wNRaQdIE%Pv3CDr-$tL{F zymWMNr`u*<9FuX%XY2m?P~!@~qO;=aBw~pF;u#?w45A>A!9b8c5RPX!4nqVZQ0Lm9 z`wb0r`+cusa<}I55~NC{^JwI(=4Sf++nO3*Mce0c?^mgWZe-G={5kaQ|8Yh40k0&A z!TUoF2GayEawap+y2jzqcSr#x==RO7C<5SV6&9HVbVbBa!sGP}b##EAOy;K*ut(bo zA8?1{#ctOi?Bl3&(>O;hjx#fI)CMU0WO9Fn|B!&+Q+~1lg_dxf&%u*&R6zo9+J6#% z;&I=bGFL;LCR$kZQzm!zkYcza0$Bn(SQ(-=;UGB_x8#^Ixf=Yb!HC^YY|falE1eUP zW>}#KmM286gPn0%#~OF%w-dtxWp0z!rqyNr>R;JUS3NY#+74LhtA5Bjcm}Wqp*BtY$d8+v)IUKLmM@!{r4X>9|kw_s~s9qU6R4w0*l9|r1d zud8cqWs?X$Ap}7*qh#Co6lVJ?g44RZVq(dfoK$Zuz@9WoEgZAkF(?UsSiBto6urWN z`B)1k-Myp8h!uwa%qsHTxB*{Dq z7dnxcgj~Wzaew{)Znb>A{mqF2Jhv>UelyG7J}o8*nvcbkisftIkOHFUnMrg_b5$}` zifTLT^L~ytYaE+0d{{D=Dsi{BZmtU=AQpNvD*xkZYPwN9=%OP<5pvILHyj%~V6u)c zd+3&`Atj=N+C#7#S-A$5OC_VsdGW6dmS_lT!#E@3H;p1VkrR}d8I)jWrb3(qkZ}XY zw1O4>P_K=4D;F9!>Rfg5i~F(o+l>rVO@J=v^LTqdx567*V!9kQFnSXcJCwI2upOWp zGe&$k#Z9-f?PF6>Q4K_YvvP}n9TNr<_Ma8-JtaT%cQ4E7No)yQn(Az`*d~Lkjqn6~ zB60Leh^423CMzwLQro!cj*C2V<5d~{W&wi*_77!ldfV?le!6o%S*jgt@^jB-g`{9} zy-e{^J>$xrL6_CYL@(*7TOE~;CG<3FDvs&sYTQ=d_sbtG_3#5-UCWbodjRnaT2IpnV1E`#s7= z7K7>z)X9HjRAeDcE!Kv6H<{sz@oI>yW3*V*rH5bkDS#-`(^oxzZ+&Ha0&24_bLOzrr&1Kw1MYt?ppsw1w4 zQK;QMA4qmzU=P~*u131{JRGUAUK1(dQ6Vf>Yn*Rr1{J^I7N7{1GKp1b2tklE})uU^RiXdOLyi`A_zww_ZTTbDNTP`y-c>t07~mp1D9 z>5|dd{AP-1f@=-ABmu!*L<=(~r{P#t@TN}&=SM)^ZssuriIC!|EvOCrGkkw!7DA9C zB|tIybp*ljSD8MPF8!o7(QIhY_eK6uZHUc%es*1#aG|5V#jFd{hK6dxbmIa(vNlu~ zHf}Kn_MkUK(Pp9099{IPg6cI3_rkBb9p)P&jLrFB5d8MOfrOOXP75w59I?aM^qe9n z#o@#Fp=~`%BN;OX-6cTUJo!$QlY0UwkrT|U83mMPPymAx2`!L>Ot%@>JvZN=C?Q4W z|7VfEY@ZG<`cvk=&k*?age{i1?X?w2L9+KY)9r~G*HEIXMP7>bo42ND(zIWGbu{uJkuYZ36I~W=-(HRsv@o|H78<&LLV&|)?A?@?UR&>BfXw?)f9Sk zG9JjCa&_{6A`A7@q6sX-EDUh1mZ2Ncv>u)K4+_Uzog$#9l(x6yp0lfAIS;Rw?5!~w z=hf*L5)^kkAcOTiU}Ne=GKM!0u$K#xbx5UTg@cHlFR%$*#-^qYW}iGS&;$?-KQhqI zj6hXH2l3ePf8-?2cdAPIzg_#vq#lD&5iAMHlm^Lz4aWZ9Nip`kc6#atXPm-t{`d}# z;mN=~GBmDQ0+6}_S;Y)19n1DA4%LrUJFPW9UD>V)RF9Nvr_Ku-3Q22#qYnGvPn|)w zZUM#UjoPgP>nYo;jQL2^*t63<`1UnxEL@vyZS;F~>xX=3gXCce{R4wjQC4I#BVQ*f z5pXKmtgVt%#!u^q3*zD!pT1C1xi(U;lXh0Kkj^?1sHCTPS2y``27=SHOYKd6(qlFu z7A#Ik^MYQxKq*^xvi=NWK|rkptk?qrG75rPv3js~P$*Q2%xEDUcN440fP6_VNh?uG zu@xdBP4N?zRomUXx_vhmIeLCnZ?tOx|Ve(-TpN)}2a z#=}c4y^JUWd*^o7FbaY(XP14@#m7Ha^)z}`d=CAXsg@bFHlDV)!~TJ9_*pHHf+jkp zIZkuIekJaH{csQqANTI(pF}MvgP3h!>s`vEJ&tn82tbbLoJGE=+Npr(Zq3*zCds@c zK6-T{2`ptMT$f7*%v!12Zp8Jg9g8Jm-heHup>3p<(U;R&-U@mdZ4(dK(4|RC~tDnRh3OLG@s~SbEPdzeLr(OQt=> zcuCg-vh&-|u!0$zYBFAz-jhq$;w|JDH|srv@kd zkm9|*3)tF<3qS`7WGLEd%GH>Yb6J0_K(V=}!91PoRvKLK9&1fJJ= zKlof4JsQsBOcX1`i@}2q+7Ejly96PEf*}#2uBiHU9|vKi+pM_5O1;j2l7d1)UqP0{ z)8vS!d~2k~v#?JbI{xjtsGfyJ{RWvruZFDvQ zH%u!m^|tg|ys$Tk%~-E-$63oI;^CTWhyVV)S-RsUXDaBbX&gK&KnF?A+*kT3h92k9~wggH@$wWHc+@D>d7R z_+yyDY!+!RvR9p9l1`R}#Fa|h<3hk0GPumtu9Y6IK4X^9;_jHUPWq?N9>$@jWdH-I zmqlO!c0Cu$26Jk1yI`vw!Md2-aH=F6;pU`Hb{eVJi^Ri}9)gWv8X2y~;LE@}x+j5b zj6pcf-`z8)DFBI~A`jAh|GDsg*b1Is=iY z*k#MZ)bx`li3ltX17TWO9D%khMd?6 zpD6q}#)aty~ zf5s6K?V%TU829df9)W(p5Bmn(dSm?LPkMnk0z*=}d_k#VZSi#o^vdP*S$ao%xP~`l zM*q+&R|wFxT2g@KqeRo9P8*z-Lz~fo8t|sDYliBs5S;-Ff~`Y5UllW>OM@wf%{eeM zIyx<}@z@z1K^=XgQAzEH6e)ixdntE?W3_9`03T{0z8YvsOzV$j^ zejb%_*I(GK`9}WY+~oj{iDR&W2K!Zv?h$(edP9gLY{PMlZ@mnBI`T>*Q>T9TFs7cK z@-+V!n6Texd!%AGcDqQe*0 zyp{Ko&b$izXjWUmAc+9uN5GJ31A%tDTIO7%fM;+}n%l1JtG$fmB_8 zTsxNJkm&iwA<0X9G*LeTi3yIE=bqU-ch!M|;13<<`#W~r^BVwQKB3EfIdLm#Iq90F zXE9>cJ>>s!0qPb%_x8tm*SBNmJrYCNa@(fO6MlmLH1`B(wXU{GEPKZ>9p?3rd8sLb zcA>x_!lo%ctRC8-|5-MYTpk?61F1qEWwbRM+Ul}9NsDKe)fdp3GMW^_6)ZIpp?%dChdG@;edWs(_>z$? zu&>{nc$fP;!~grwXE1b))|ppVBMZUy3xUn*_89|@@P3EC{<`wvcKAPirkUhu=mD`f z-ms;(3N1FUV?xV(sQv!ks_&Ufg+Ytx6=<*%SWXZ}!p2cY7WR_CdTE%>+8XOk{2QM? z@5L4WgeoC8rrXp@V0z4iy@Vm=w0VmiOdw){^xlXkJre9q>Oi zS{ECQLAALkY9E#0P@4xZUn!S+7=lc|@uVwR&X!D#r^!5(S_)^~uhOhHe0|5?cp4TJ z38HNw9XPK4dpMK{?g(C+?j7qM;%TrDZGH%e=EE^6S}#rWJ?M9hG=F` z=d)OiJbI}w2Y0<&w?pUj`O56=(D7ciPvUO_35>ziwW$nXUy2E89~nGy%Z;GPk(C5V z-B_FMpI;Q4{vkcKDBnLFRI3M1Zl}m+JS>M4uU!dK#%9gBMiOb;PekFZ3@vf-?Iy4= zeYTsXRPuPH3O-MMBnQggl)fsKopPscHufpDki7D(34Bs4)AL$c1GZ_Hw1BABdAp@>OkENn?{51~8 zn^)8~gc^1@!Mtgu0lm=?9!5O2-=lprXW|-%1yavnTJ(@R+leAJPzBdPM&_)bvoE% ziZ~+gbgai@an;q+C%A!k3;n))_F=pAo;6IDy}YWTvf&*~>*<5kTb^Uo6c5gjgRyl% z%Ve=}*~S9# zk@2t1;_>&lG0emjL?nKDaWiIxKh|!V(&LhuX9-N09>&AYS-H}p&%$QlZ}lXr_0J**|6Wn-TdCs(12qo2};bQL3E#v91eIG z+J`>2jZ~0^Jn4PT`K0=qGknxNKifQ&KMV0m5=$hwUkZw1-K72!j`~oz)K8?jqC6gX zS1T@JgkvVbHD)`y!iy@F&P1gcd4%0YVtB~>Xd&_aL<*&&Bn zyYH|xkPRLDmaF07*Spg5_j~R1jCLCJa+~3r)ploEn10me;_mmp8ln?&)f+^lMEf_* ze&=a5@i4}QfXP`Yb>tc!y`E9+UYDFbIj|o0N46;wF<*Ci*&5lJ z_jhD>-os2#e<#gl=9Np@XxhFYJEix&>tb(83RcL&Zc>bTr35((#E3n)Elz7TmYye6 z^di^@G`QV+w|xiT)$D2PEnY^?R$z&s`_Wl|CI&CV2zB#1>oDQNRpc^n27G*Er8*vS zKye|-FG%ArTO-e`d$pjm?$ws!MLuz{q-W&fml3*}-_Arge2r4AJbm!;r?UEVskO5B zieNpDA-H^SU=#ZnDm;1((r+zldxsF2Wl-G3ERq0gH}+$qFE?6q9&{Qm}QXFDNH+Zi|jzIf(8c*Zge!&;|a-&b^v~+rKkZ`&ro^x zcuw@Ub@(E@?k%0cl8>)I7oiobb#$US?oW~#zF6qtK5(ENG3k;75br^`#zM>C`-?m{ zZM{$J@_@VCTNp?I-A}ScKHszO+*mMMu5o7;0x>p{3L!+f@aG2n**=MZ*0=Y0uE;1v zA|zU^`*0yWV$C$YzuAr7cxGkpg|gjP8&kmDn?w{w6Bnet2E#U;z5}A4C9TskfsAO^ z==7xJ2XUonwKFJb?EnD~>t|te<0HZ`^l4#ToHgqr%gaXFbRe1Wp5cYLKM_lhMV*qS8RUjK=+F@>|4HHWu_x0Qzg1cZUwjpOkpbdK4= z&BnSQ$=K1TK@{(!DQM*m*ccWh#%6m1u$ZY{v}lBW2=ueFwQuo;JfFqvi!6=%W1XF@ zRkJ$+Zhfr#N_6|$g^!DiFh%m?@GE(}m=1kw+^XIJuENtO1jhY{Ux)rJ?RY+%? zmfiTI-?dg*=ig7PkmujFG9{(*r34;XE8#>9VW<~~qB&lV>bQ&uaR zGK`B0YZIEbP8&iG9xL1CGUfpSqEfFlC8;V?S!w*Dq)b4gWQ|cjGi1kJ0 zwOqBE7zg90BXC9@jKkr$>RwrYw!`GrJ{zTn$hr`ul?XZrsA1gM0bs$xMeVNuE#0VC z#4d4Z@YwmZ#p6t1qj#NWe0T-k7`q59#p=CBnaPTuYpz!l{2#9J zSXiCxi$sm@JGXWAB##1q!$`Cft)sl-STE491dW=*Ku$V!Y>%y@hiQKqhzQd&EA5xD zC|WYQR=q&H{2eV%{ivm^ZGSnqMXxi#Zs4t-_)#xpZ+m6Do)I=d05|#+k6nTt2bB%& zEzOVm;0^@znJ^y~CGI}ut$kil{7b+=*e}B#8A+N=fm3^o6p6fccAS7*+L_yQixHs6 zaFvSwM9RyryAV-{s>N<>K>~~ITAP=boAcALyxhPbvO=-mgUw11u&K|hrj)sUeP01& zh&r{T_Dj;u%GD~l$$M&Mn@=rlQg&(bAF-(gSuY)aK_Wauq@( z1c&4h`b8@)V)i4*4+Hzhi+aA{6y3AL+XTr~=vT^YKzI3oWK*}J4D15(3k1>fk`;o& z;z=b20t~zRw}Qq+00t`#@b~SOcs$Y4l4SeMEpml@9tBeIZ%wb?*SN3BQGgrp$Ztn4&7z^bJsWeYJ}1lUv%9I*tXHa35%=+ctt^4L%1 z&gd10EBo9+(Iq7@`^s9KeqZ6sAV`B;&Id)7Pt61MX zyZcXti~mYW2}NpIqg*tyf!AN+9Hf_556T@kIZuzkwEgy)7k*Fj8VtjBwS0T=_U@zF zT$nZ*anJ_d5Y=sLm12 zJ=HxPoNb+7?N5{t))lnfi>%_;1)R7pm}XYH+I6_5&mqm9qODF6>7oc>KbJ-6fgm z|3EKDbsDU=Au(46PWo$1x&Ez5@?1)K;4H*yoN;qkY>O6IZ9q;Mql9!7#?Fx&sW z3Xg=PH1^3#-P9TS?k=(VX#T-LM$w~(@1c13DX`-~d1y~bM+ZmCYzlp)FXCB^`!+u@ zzE0wBMk@p1FbumCtn4au3_D*vAz~A~Nd9-SFP&)Q8L_afp*ANtF+PD|0#t>LU_l*< zpa;@%1V4}_ub+~geek;uCFF_Uubp9qm9XahAH+UH0ly)E5iF{yhFK zPp*G%852||5fq-9eKg@YqlzNnmh#sPM+Z|VQOrj#_MPG0_5>MVaRr=unBwfs8!y)F6`QtkFYJ;W0a4O#=( z8RoxyV0m0U{NSM^ivG2iLm*%ZZ6GjQs{!W)hNz*cG zEwv~kEjB7P?Rr{LR8m?&ZE|fjE*rC?Q|*HiO6t3IxvsI#abQ3cjR9#9tZ%(J3?`!y?2DgWpD6$jISZP_=d zj9XSplORDLbBiKM3$vCAHNIM>VcIn!!;~SoYm$CDFMmX9Di2cy7e~qSqg1+(SIJIo zu9R8c{ZcGDbfr|Y*lTtbSex@BzuED397Eq6S)*l=e%WDhng}8(w9mvPJnEWLEcbmL zGc}-AoLIOpy);DOlfgKQgCLmxDBRY7dPt_Wh|?#c_&Sq|=Vg+pVU-jVayy}zm}L5f zC}62TH1sQCsr@ER%!^D#SJIzvsPe92j;zc@=~x}A$0z&=1B+_h|E@3fs9;_SCU_Q@ zvc|PlvZ1vl52bO~<~&4W-}q0%<+VZM3*khz@_&$p7ff8PV3vB+|C8pfu}50-aQ$l& z4Xtscidp5|y7``tMyB#4G!VXcWPc5Zoi7s;xGg8(2?-#F9h4x%h|Wfm!HF43KH*H~ ztjYQSfQ^(&l*Ua=TqwV=z-O(`n%@!?*hFB8%#IXKd_xy-@KeYY{T72j%^)RjRb2W$ zv+dn3+33QW-G#X|9ql!(wN^QI`Q`sABK6xZsgxjdr^P2FxiO36KQE;xU(uL!Qo?Be zy`lpSDR*u>0&bSgjc^Bk218ZQlBf#m)tzK1*`MrM8=ii^bOhoj0f-4d{oVU)Lq-QFnE-}Pg;(0;%*WdQzg_@q*UESEF) z5_PEjfkSoLSi?I>pZ;!6>{8`-hYS}|37S+Y%C%Vf)GCkw?AC8KJH_`OlmA+L{2@Vr zf^M!hJ(}odyj{{KnfK+e#uT2-o`YCaI4VB3p56KEun6(|iwARnZY$$!wXFK9Y&b(i zZ*TLg=Xx7yFV`$xs>wR^CV`pDxt>R}{MkF&E^2js<}P9-u@6tB-UF6a0{8OiZjO|FQ-8-;I-4qOK-h#<1(rVCfY}+ZxZ{lLo-1fz;4+hbo66` zKx?4YHY*MYEbi`VZ~{YmvTs-_b<)?q#(QsSkmxg``MJW7CNC8$kQ{?-MM9N>FB%T);qBiDby`uACL*l%2#uuf^R8;_Cdj&FH7)F}gD_tvd z7c#7H9I3AL48H?ofQ(n8fQS}g8^Dco%t*sNR(&AICVkFBVKkVMX6;x;%gDPouTyFZ8G*m)Ot^3#>~Aa8w`PCP4o%<$u$7I)M>Z>g{-x=D5F4U?IQh$0LM|(7*EYCQmaSZsjOZsO=MRDMvaU$yo4tF_b^4RXLdAp69i_M)*&|B9D= z0phF5KCI}YyvBCysFv9qS%I`|Zc-!OJ*$S9u31yx4CYG^mgTzqD4{J_*{do23WA)_ zf0)OAe54;XO72N4TZ{bVL;ZLQu{5-#y^Ag$d^nWz&24>uA?9IyhZ*~Y4x0iC@dWN; zid5l5h>)O&TvL!};cP)8SGSohLalUj`Rw4U3~^Qv<^fe=4lyd$yu)@xkcKPDSe33W zelkh0Ltl1Mf1`<#t>+{He1s@877ap}c0zR^Te1QC*rGz3ijxRi~kEBwWMiVQK^k2X$@Z%(s)eC`}j?b6A0NBRK(bLk? zR}SetdC}WDm_tkrMgezXYV;I)p)Pk_RaKEP`;61}cWQ7yD>UqUfz*%}%7zmHK)_j+ z&s>j?BV8g81B-ui*y^^$c8;Hy#Z*uI&`&)zJ|#Bc{a0jq-6;^-&wG|*r+ zjJKNJU+ZQ{9OiAXT<ZvEL1PgfGP&LlX!t4A>B1v*p^avcgemhRB}Z zq(08)#D1Shn5YKnf5ICJ2MvVXiV2L&_Z-3C_fCjN=oZQbpDGJV?Y^6{)|U0GR7mCE8f&nsjmf`Yia(MGcWP*V7CUdkMH{ z&mJMJvro%Tx69$kuV4Slx6#$0(Jpgs^nJ2rOBM`G@Fits$<4b%l}<^_>S|^(QxUp5 zNkom&@2j{6f+1~(2FO*3Q$-LZZ3dN15G^dx>;{$dPp0(N_ZWhz*W^!ftJ|<)M5dg> z(_Bvego%M{Im123JtGv@y-jjpprhN?kDKn8VA6gZ^?-~O$f>}m;&%N4o!d9WxqF3{pS*>dbD+pC2= z&8sKb} z)d?~s2jza|(#3u%lV(FBD{)T!Xrzb6r1b&+Fe;$_Qh)uj6{VLY?6?g3N`J?q{ODS0 zYidFV8XFn_<*DGdjv2vt{3I<*j*Xlujmq z*LNmm*7v&@_+75EFwF5f&J27roB1dYLwsWl13bjKlf6+AR8G~uapJV+lILl3uQluD zTo9_LrIi!TVI{scJv86(#MJxWN>Sy>UU^eIcWEyzr$&D$_hHmvNQ^-?^bd8hz4QM_ z1(sZ{!s~M(G>!wUGX6|WNUX{=L z=pvlzJDO2b`Ln-cnk#|=GgVW{^bVv%m>Ut9D~u;LLax>CzPVYw#+|%^yqre8Vk>iJ zTsMx7?_LFP1?ANE0xLgVLFRQ?yWHvU$jafbY#lvC%`qVVE;sIo+A`w5z!ql-)&vD< zGJ+ByW+WTsj35o%4T-gpD#0b#(sf{mKZL-<1@g*z*}pQ~22B0R>S>g8?nEebMWM;m z6G()ui^(l_lT*@NWjU7VA{F^X>yGMK-{LB|<|W=Mp$B7j>P)w#CC2a&*7D}}dFJeH*#;-s z?9^Fq%Nz{BYx3GC@|@t3D%O000Zwr9txdWWVcE7X;Ys(=-=mdT__3qnQw%9qZBedW z=?`1?7Y$$+6T)rzf{b#0W`-bq9U{#LLtv6FqI zk?Yj#L|@gq8BL~}Sfc`l#z(1q6WQw8d`xVUSgr9?(yrb7c}IHo=gn~?Z7;mw*Zx%n z&?caH4`W#BU>S9OkvW6YzHK9VehmYICj`kj7$d3T)EIha0w{0LKZsgcc@yfMnfJR% zDWY$hXrl+Pl@d-GR_PTzd)_NLzJK3eP2$GDOZ}RDW;Eh)m2@^xU31L!&

jGyvs9}^l=5xg{ki$9R@ldrsfTk}Vz;|LZ6gRS<7MpFWq>-f^(PJAC18{RcpPX<5#ATM14b=NZ< z@4_}V-m0&!Ga9giV>Mw>gZQ3hD4K#IE@s_rywhLo?PB5DR_wZ46BUKL=~Q2`j^ay| z(%2L&n6=QfI4XsR)3W|6qU!)X{XdrYYgEV3(ThGAr{ORPycfHf(rUG}X7h}0W7tY+ zOHz846O{^g$ZR`Xu;5BImNbtqjVDl>UWZfNAcxw>8m(T3MLmcs)ZHK#(N9av_#P2~ zd3qk3O$5!fO4776aXwnJ!L!7*)We>UfrT_9GxOfp!5OzOHdTY21Y&@@q`Qeprw&vf zx=vF%LIg1e2gyHEfCvU8G%mK?GzpE>6yso)4^_g3nP(T82nd(a_pM*`N;3~7S`)q& zj48S?v?zLeIsIG!-sLxNGrcv5;09kG=+7=mN>UZQAPc1vQ`+Ek`js9`OIT4+SO;eF zd32+X!I-Y|er(UzN&Fk5L6=_ZUGMWI-ny>z$01T{oU}U#=(wT*4K1;@HrX?A*!Khq zzdOxoZ{U@R#S#7b#TD_csnkL)o06|osx(EEOph#*iKq}&E)DOOgM!IN3A^ItSR}jr zG>PVeQN~)4v!(!b);DL}3usyF-KYYHoYL6bCo-@uQS3$hfM~826s)HyXc%m`9%C${TD*9txx)Rl{Vh{B zH15sV&~k5W%-YsJH)iZ@+~Blkz&(+9U^k!EFN(gPJ2rds9GYPF0aMhb!Hw%)p7kC$ zm>#sL8Ytx0#nwntxtv_r${9e*?YW`>9EfIvN_P zPX-oeualxPTa}B4v(A9Ihd;upWEE;Nj_ySTg}n*iXR4*KyHkbU?7$xO&n7DGl9cML zP*|4-wSmO#a~`_i+Tq}(_I5a>bE6e166CwVBQELxH-ZRlp$G3qi{`xf|D?jo4xQYU zYjjx~J1NjJVac&|LcWS23}a>nV4>W*xz^!|Hu6AmMtdOLW%}8 z8wTUU+%%L=g0S!~!6*Kwm7SaGkxJHyzr%-7`ptmdegpkx@4@={6B~-Q=tIn~?2zy@ zY>{tvQcOM}*ITNjCJ*!YIKQdIeUhkD(5UIZYf#z+7KIBDn5L(XcmKNF8vo`1@pz{u_6M)Fy0J^Pt!j6~y+-3FrJoQY^^Z*~4pt378V z7(v@v56uNcGr@0q3BJU4I>S8vT0-HMrF@LwlNQ1cnm)U9cQy4&Bgyz~J!(fsXU8=5 zPDNC9&LAKMFkKx0+5or%5b4fs2FURf!1*piJ*%p_?~-7I5B=;@c#ju~?GN>2jy0n1 zOoTV)w73Y2;XHA@K#`n#vwTk6yc_$a&_{@4$Yf~5$uavGsLcc!WqOz&;si7lh( zomRc`D&XQp2J=drN4{zck!}$@e2^brLJ=ECq>I-lec0|X;<1`1!SC_%DJkKqu#l86 z4Fy5E zREmWbJeI$o=1t<8G(Ue4#B2ra)HiVH*qV>i8F0?4R3AtQG z#4)oa^42il7i%1?LpU)ZjG`@9W%OkuJ%|jHm7jIB2kDz81W*n{hKnfSgq*Q32iq#M0#bMJ~bpme-fs9d3>mwHB<(QmeG zpSA$aZZ532zp?$x^}%8B&FEJ^auqY5TtHE&CmOy#PWK-@YC1Aa_tT|kDz0is=~#y?=8J6p z9R>H3v_l1u2tfq)2o@u^CJ@k5_|NngiRbi-+w^R}<1q>F3R$w z%uH?0#X>R$Z`a;`9d}KHz>;9HR7@wUzIYPbrv|y@)+{fV>SRLdTm`%LE7(Lx%h{xrw`DR( zApk}CxW#YCx6_AZ6mollv`j&s-9=a}LRmd&S+ImX8QsommxknJN6^R(lI{Dw@%iNd zBo|kn{JBQ~POL0{mVokw6uEi(uP*&(5b*c#Y${>`5=2RFI9$ZGVZU~emj85H)j(Fk zvNCc^jK)x#m*`uo!OP)^qs{S&gO{Q8o5;%++Q=}Oa!O%|Gk@+{RTX#ok2|2n@`Nmg74iIBJ|!lAP92i zBr>ZEd>ea~oR3)3eL^wl9w{xo5;n=}*=} zDqixYLL?-_kr^u9=o5(fN-eSDB}B`!7~R6+s}{=!q%eA=-l-yZ(i)&*Zj|( zbI2(kil5r?=dZg0plnBB&!2C6FBo|ZkVKA}2q2BXA=(ZbM}%lA;!O`BZY6jLTfzEn zbO{0M0z|}*sGfDCA>`1^v**;KmDjI7vB*y!X1;yHgkvkV^Wx`nt-0q>%SZ~kQ0(4Y z65gI_q{U>(=bFLqM8H{(g+e^&IwmntJNB9JLGeKbS8&0xJXzF~w*jB7DZ`c8e#r1b z(rKdD3x|#FcuacuJc^tC--Ww_cQ5=m!)@NR2o)WM<)s1Dh;E{P-?$oUGVqsvXLQVI z!$8g7c)O`);Khk~_m+Ts+idPLlnzIt(bOZu^G$5F0mouVIup^zuU0n9oTB76AaTv1 ziH=;loD|B^m+d)6B=1JSU(?+5e+}&Rq_90l2mbxQ`}YBc)x8zUv4CSRm>IQw#Kucx z$j_|i0m*-G0lX1ME=Zz3E0r4)47N+!^qx2N=_#H3#P`}U^eOt7HV+)LnhhO%TH`q9EnlPdJyNi@q z$L$muyc4J@j|*SaQ)eP7eBH(6EHyG2DPg^orrZ%(WQiw>%kRN;fc|yDf&v}{D=DQx zT4qn`shxAbR~^2S$@yM%U-${QoV$m0d7JeLe4Oh5kx(ckLa=9DKC#!f;=hL&RDE5F zyCbl77t)*pB~!U>dfR&04%kPs_bQeADCvx4n?6$C<`foV zH@T^)+|1AY;9v?c_=ystlUx@0VLX(uWQY*ozeXg(5@-qD)zw6cgI#ZErb?9=3QRZM zuZJl0=^RC%OyidrkWn~L=$n3dctdynUfzZc;Johbbs*4*Dk5r&!U7}{h)xBuDVzAr zymPnt^fqv$i?PC{XenpDYbTlY9<`(iu7Va?7#%J$nfXx;gW<+-o{lRxRM`T9@|W)e zQ)hD*ttqA{A~j~VcMOf`bEw6V0iw% z)=`t@xa@z29ry45oOoupiaBqEuU=#!t)Cv66P7=T;tywq5lg3U%n8j8tBTaleOu_< zMfnrh*!;rC5@91JOs9`(U;$;rExah{aQp4S-?+Or6I@vzk{xRt8mW=lVln}Qq|_I^ zImY9p=T8!54}bdqUr?&Coe>9lIHV1eZ9vdK(zNuup~S|2Im;ErfBlyOP!qDHoS{N{mykCu;vy?G)a z7Jih0r2aolOlKsG(Y3@|jdD>@`yrV(zv3J9L@gcg__&COgThC zQ;01$Yl7p(DrHAQ1NzB|x(44D0-_-tw}upuQJlp{_esG&|5;#RqA(IwLQ^DaC{kC! zwR2LzN(P3X8CY^D4dv1i)PyYw=O{%5(BisJo;<}R9qF#@{qCuIYl3rVwtQuSVE>QO z2-oTdWkh$#O_<&x&K=BsddorxkoK@4xpcX=_sZ$?5{|`JaabLN9&Vuq+2rS+SvA%?sF+Wlq!%3 zGSev8`)rfuF4>r(UM=ADxvR;6)toNA`k&M_S8+1?q?=Of(IDEgk_)Z;Q;L$w29ge5 zjKQkN{iiD{rLO;7jTFcv4$c|y^1~@%)n8mB4zlUTQBw}X%gr6OMfXti#qKUTnX|{u z?h7T$JhdWy%mOTU(~6lkcIhJ$hadJqDB*Gml1)|kLjRcYl}2Y;#DcwYR7wgVX|D66 zy;g%TZ~odQG#JoZqS+zPO5}cjD@uza@`9yWa;aNsoGy=B1{DP;(rCqa%UxMP5JSzM zp-}SDBYd-oW~QYIR}>joN~_3_T{t2&zm?BDgrAP_#=*g-9vqw{f&g#AAQX1pmv>9V zQ7JcFZAPOD27386)7FZRt!?;$7jkp}n0l&yC&~W7+pR2x~sl`IC9SOp--Y z`-UrMS$=Bqg8O2FBC$eEErRCQl_< za6iCEOIhedGRnZ)1*~&Dx~mlwiur2;FN zlqMvv)-AQmmdS)7q+NA0p58))PD7n#NN-uSR*;Aw{R8BV!nPpNQKxh>z0GD+DR>tE zL*BlgTlK}JPg}<&HpmiNVY?^uwO8@Hdxt}wLr2xzZjAvSk%+9s45$El1SJUa(ku^n z3?;>jeQqB`mpOT}klDA$WTp<`iJk-2*=eseu0!RP9nc=HOYfbBGz8E#>MXU}BwN1X zXyqWl^m!N)GP@l5?64rve-IKq>_AwkX?r&nPP)cvhB*jiVR#y*#9Z*r&<97*7HC#s zzHuxa|3=>6+~E4PfsMzFQb1cailB`jLE2HTg2lxbxj;LJ;(V>l<<32KKNq88f>1=d zy4@6G7L$d^RtFn-Vt~l#9`?vTQrXegK^*)+H9_WH;&z}Biwlx)&|r0lYXcXxUn?jC zkTwidT#u(Jrn^s;K3kQq2Td4GJtiGRadC3T2-ehty`tLtcnTJIT;xbjJ$?c2nf=A4 zatwlaR%HPpGZ9V0M>1HkK;pEv*p3+kMX;>$Ik7v0Tg&OVrzXCejTj{2YoS7k|7AreY@)qDjDVejK&>?=qPC&8asU*#ftJ|`9JUocNU zU_`98I2(xaZz%AgXG{X;Nlj-2@zp8Np0zsg9h7H9#{D~);+ezD6P_ow(cWEx=GO(-S#$SHi%r2PcGHJV6JWq z7Wnf|oKhzO{@2AU(_8efs;2FH+zXjJ*S9>+FJ2Bt+8PGF<8Ot$ zXT70Y$!s$V#2t)YiJ~sH?H`$w*JloV5 zXI*qnRt)hWtKsKp#nn~4t12?K@8nE5>N8E9o!ev?-6xpwBhIVWP8C@V_T1eZZ$ABu zUGNp9>sMXG4JxF>9x53ocEuLD-CZt1k7XkWh;r9VviihW-6J!-RiY)?Y9{jfn5uJH zpl51{#b=u1@oZzuqnK;$~?=_lZONy!2wTiSh&r! zk9E@9ELRMYBf#`;^Ze#;4b30{6>c`jE8HxUbg3EcLf=hKCnlzc^FymcUAfO{uv(DD z*E|~zDIj}<9Qpwv_XSU20t8T`!4>6U@D=bcn7^Sz@l!*?#FQg}vjPuI;Xd}%uZm5I zog}8sb<)84P)sXzxF9qKsuP@l4l-0!H%L{}17&S|*`A&|wJNu#L_0LFwAN1o24AhD z8RJfQ{)864jHHpLCZ&cvROY5Dd|Bxgi6 z13kJ}p$XOCpTiJO_yMGrRWc8cwsUaAx6W!9t<3tr4bAn!3?ShUYbRke5GiK_JFpRU znJnI-2AO~aR^p+0YzvVHTb=8A9S>dBp(<2rA~1xM2O^8Lg}6EA+L*R)R4;qLwF_?K zW0Z;nMr`Dt`u@B`ZmiC>{vi3dUkSQp3dAue+tL-EQOT<7$qns{70w_W7MaDC*x7G;^p0C1%yf8<0_=y}eNQ;W$^Xze_`d~~!8Hfp+J3y9 zO3NfPW#9=;fB-#t;7Crw65V!FIfb4vcL4U7dxMj^_X(JN$CDC{>hcL=F@3`Z2uAp* z&nxzQpoR&4eGgI?JP04?-6A1G{(Z#oHd=FiYrTI!I!d(ziW20-W? z2B^HP8&B=)Z)dE&6*OEfu-;Z-pV-!I-y9?iGfNUYs#fjctQ3zYi1L4@8GkSeStc%- zx_sE_-l(g`*>`G{%;WwHtY=j5ku7E$N5pZ?X7xLOBtb>ouCRMhFrjycPAh>r zrcqtyVI8D2RYd`el=ezM0AUqC8r{MQl0evHu$pp;kpq>L2QPn<+~>3zLad5gg~s=Z zRdyOOQEAvq=GuioMU&-lnH4yyQc)*FQr7WQx^??C%z(;ygIXSezjZ1FFHk8|ZbeGe z(9owpcvo8>MgFUUS<9Tz*v3ZSNU)IFz(+7m)mWDBKh(*oa0J%c^Rjr5C+aO5c6tXU zU_}bi^q$9zeQHOCUBN;vLi1tIC8wNs$qTZFS!?s3uh>goSw-L8F?JLJSy{lpIjj$uOYKsyhMf?m+zq8WbWs_#@7glt;p1@hGG*@ck=JjU?)^mwTOqrgpV|)OJ;B8jU zCGhbF8KK%LSjkMLr@8ijSP_}YVT0tS3aP7e^{)+Ug)-U$O9BehHS44V5JEx%w3Z3Z zB*}*BJN_Le%oLRe(A#K%BKNg>1K@n%6F3J}3uz}OF&e+it9mRX0XRKBJ&~B)vcjDT1!AgsHWFVN|##9=OGQM0y^3 z68`UHL95iUY z>D4WKu@)WAz}bqW-k&#xVv!b$B5+$pG)B+YNWrLvmK$DqmWu@61MN-TaSSu2>*b~{ zl$AybPD+t{j$4l;`TfVZ>NMPB5Fk_pBtGrK*D}jjE-w{W=z3YXQP<`-j%rI2ccp_LobBD>#ygwXo1{ncNFug~P zxT+yn%~O+6E9enl_<5b#wbGDzudxnEq5f>EPWgHyw8XT|J(`iiJsNd0sFL48nX=Z028gujzp;r>k#3N=K^Ab-IT{t80oAbUe4J3G{f8tI7BMo*T z(pi!q>cP4NuUf~XiBbwMB5ny3>u}$U$9b8-B0Mve^H*GOwvP%W#968fIzq6EMy z)SmTZGp$v?6-jzG1B4_QMS0dW<~Hdg?y<#bzk=RvcK=skg~wKRBK|Bl8fA~tHw!js z=A8f8MNzs(RnUz`HnOjvOlhhf(jOQk>+}zU6EUG#V1XHR94hV->)so0%SsYEa3{|h zeSSW!yr1QRO2D1$du}vinCt|afyfmJNn)EBCLg^UqoxxEinMz2Yg258t=A46!3sXY zjF)KKb|aLHWg{l8Ld^*-Otya$dZ)V8I9EiR3Wc7=4%N*vDt)Gb(*!(RXJ!=S=2W7y zc)>e?5)0io6L@lzmxgcDY0&n{to*aQZtb11+0+Kf1y~fkz>Y{+5~%dcaV0l_g7O=ug=7fq$lvB7( zQ3F4y-EwqbPSL$Oq_;nTd`@-(w+SY+J&JZnTTvhsE}GkQRaliGyjT6yR7oUj*p-%w zd}%+iXlw?In$zFk0_9b|B#D)T;}S!9f!B$1&$24YtZ3r#qkvv(e&%tByZv=-u$0Q> zjMZD6^_F&DOPa3QBiCR(BoQ}(1!mi}%GBX`XKJzRl(Uzm)y+{7xuyOrE2@b5AUhz& zTWZ)Tw3Au4+LDrsr*|~IzC9w$Hcg-Qv2D?eAEf8C5=N=Oi!eTe|K1o0f{=vYAnk}8 zn~boM6+xsMxW>?)IAd8{leL%JYbE<%#HwHF#vz63S;2f-fbG_+D1=AUf+d2i+nR2w!1xOKqq*Iwq z%DK><88KyQ{{|39#d_t8wurQP4?PhcLGH3cXr{e40gHm9!{cD5O4n@282;Nf#)C8> z9)`H7tVd@%*p)&@)Anp=TlIsB+ZY2J`~fL8*jBhn}SWp zLeb8S8SB?Z?i55h%B7#>tdhvH+DZ70aDki3nsXjx)vIJ?#;l6O2riuTZ*#a4uKeU` z9lp1o52re~Yk%vJN=Jxo+r7*q)JD*7-^ymk?d(~#%5(eBl!^1yqlsE2N`>e*ry#R| zRhJ>j@4EH;z}l;*UFjXMCqum_GZLkO83C21$?Z6``kF}C9t0!QTS$ti>QQscd2SjJ zpuZbYx^fdjb`CKpsyPdv4F;Xv3{;gMZU2)|H;2U)mobPWotU*Vd*QcPNX$|o$$*k# zhIo_lP8zb85J{^`+ob!Z5rPVVTTUT+BdYhARvNo;QSdZ_6CX}B;C>zxMVf2G<6Csf zjKDcISd|N^-%4~e#z=4B0Me*9HO@|nPnXe?Ro`m$kp8}jQ!Q00N15ewWTc#B*a%TiL-{-dB z(9qG%b3O6I4y=KlH|Ri{P(VWS#`F0C3Qy|N8c0)5(13kg!TehFNrIK#TiH=O-Ff)R92zxh2=Z&+&<)`mB-IG^jl`|F6_U7}gOHD!Gr$t62h zu^PI}w9PPtfNW-sBv|SG zGy!~|Xy+N9e;NVf=Z|dS)xjRPFwHg|Cyb7`jUUK<`hbEPh1&NoPuPa>(ER&{-m=d$ za=zK^$xyiQJ?T#==C=RCDGz$U!=LI^KBiKH~7m=W!Zv^?jTU zSpJUNf$YD&efGfr{BjSLk^oO|0z)E@vs8{hzuuIvT7&Ywj}J*%37kr{H@5CBToFsk zHttY0Y{z?=(9)UYa{T^?)-K6QCkgT!-1~fYbCc%ouz{TEos|Um6j1Mzq6=AskWP4-F5Wf=Eq#Vfds$n}mWN5NyWtca~rHp~;s_K$FUy%eY zavQusCEwlLny6K5l%F!66`Mc)_V3&QgkU5Jjlsgk!G#+S-c`EyD}{-7G6nWG#gt|H zoubJPLVr~JiZm+}rE4lyw_QJsKC4*0tlNG#v?6a{=-diaRn09dy}8l0cQ@AL`;9gE zhU0IPPoKYdW1uiN0*OLnusA${NFr0HG&+OHVsp4WzCb7v`z=EX&g9>X6-t#_V`Xh) zYiIA^=;Z9;>gMj@snzKXMw8hBAi{()E~KJrx?x(j<9dD&Msbp6c~Mq%({}wZPV=&E z`*9)+gfcFq(#AS12m?vcOctBN#m&QuHy^&|jQIgT2owfKAW>)x7KbMgNn{F@MrSZt zYz~*l7YIdSiBu+6C{=2WR;M=@oj7&o+=WY5uHCqG=iY-yPoBLq&M#d(lX66=_ zR@MLr!3c`s1WC~h%gGf=6|dIBs+}Nu_2%7&PoEu{z~BfZDpX{!I6Q$!BEvsxsx&%- z$zpT3Jib6E5=*2qxk9N@YpkqoZ0+nF9G#q9T;1F~JheK#!DupD07RHj#)VW=O*c%- zc3jU7!YEGCEHBEcZrZLN#%W&GZ9mSGqtw>NT>IR&1t^G;tW>ErTG~3gbnDSOgNc=p zn6Y5Rh8+jah`ASUPhNcZ2@oVim26)-DQq*#ek7G=s+ zs5D8H$)>1QqgI`I4H`9R)}mFLsiv832CH^HeEIPgAW)ECAwq=-7a>vMJR-JkcF6Y3_BDMN#>f?yo zk#cqF(yhnmX*vA{3>xwqmz+^!#!dL1|1ze{m^EkKf<;S~eOrdE`E60HzT2>A%eEhO z?Ao*M0G2v(?8K=v=Pq2jq(l58f4}jcAEsqHU2cz;w~sI1e*F4F(G1J+f+)#~s_BMl z*^cY^K^VnJn&m}V)lJ*=!#K^$y6wk#a(Z@tv0}d^o_~9EeRF$v|M2+q{E}wwcc!Z`@`{czFcqj$FuGFVVvd#K!gcpTu4RLbi=f4$MyUmWD~_nn&m}V z)lJ*=!#K^$y6wkF3{msQ>e>4flVtcVs`v2(Y%9V_F|1lE)TCMdC(x!gho@ z3G4%cA(tC*$b=#0Zz#Yl0@Ve$6Rkfwrk*&N)7ZlHKoikI;^u_#5ouI5ab>!8X-UYL znyf!AMBaO?Q{eiD{d-;|v6qs9yneg%1T1AaPzjj||Bb=TyV|E!iw?M@puR5IW77?$ zYzPrx40ue=orbNsIFOp7(J(iSj%+P0QO%(Tq|lR$STN#o9`EXPbV{SJjRQQ0eDVW5 zX2|r^`4dUYgcubOhgO#ow$)@gy2DN%LgaloSv5Q@34wu25?ni~AQJ2-Ce)ehSV zhv~Of%!J02p^5U;FM}th=2Y|tL7|-SoluNelXrPsN+VtaD08RC`^1}EAJtlf+Uo*& zqJl!{Pb^Hbj$Ty*wqT3m{6Sqn1~NP-y{Vn_3=gM?X*Zs<+o&xLKKOzASHeEW{R5A3BaKt(l1eK&d&@BP zVfk4W%uH#+%M6h}_M>T2wjEFxv|ziEj*fP(cSWrN{|6v}qrD^@iI*f5bF#xU(82UB zj_72UC~yxgzot>vGMTbqFaL;~VQpJ;VbIr?g~4(9WvY(3d;ec+VZK8qSdu%vpV#LJ z5=cP4gN*LjFS2#|C@zZb@^R5{6*^wOd`1l& z=wTpE@{kY8r8+!x^(ZE*wWrU3YuwBPJSe8!?Y+D0g+HSbxhuX@8G#%K_x!_a7}Sb4PcpbjbbfnY zJWt!%27mhD>m|iwp>u14uB2`I@rUci&GYwS5}GcNGoDY-ol*_R9VM>3Cls}kZx7=snz{xqV*HWOu@QRWX-uUR zfeKJX_k9=wTu5e2i+DsTa!00t97 zto9ukpav?D9k7+6-;}PJ8CA$jPLxa4G>c1k+xCBqgk0Ou>1EVY42A)sZ-!wdAnAA zT%g$vYx$($j~qxWvBd7K*YR=H#!tgmKK_tWV%JzI&sl68{o|i(zD`$}*ZNJG;_^20 z{l}lCfwyHY2T@+(|GAogFI5jDe1PdmyJdV?(+*ZgVQKZOYy}dxSw9B{@xpf8!+{7( zTuZ`>{`)4j?6I3?HB`_p-^MnG%x~$bbu<9CXvk}f`{s2a6nDANo)F8xg>;T`Wi1Tb zD3QI$Q6(i^)mcpk|tSvl2Y37?WyHT0oeludI*5r@K@UXLjfFxsbLjW+3@N^yZ*ZC7?O#fr?WzMXlI+?tNH}Q5SX! z+;})9E*6mpw;UZgV4H+U{NLNd$&UOVVy_B+CE9d3C|87qJHbA02zLh`;h?;Wg`6Pr zljay=0B6Ovt+HiIQW4wot*Lc%_4>8|R}I7m0Ojbr9*r(#Gi!q)T_P}l-ZV^xFGRYJme#EvSH$IeNnkxhRIuQrR z`om2#q!Ky6k&IHgiOes|bF?*)@TA)Ij8>_JN;{wlqxKB`h5M2+*=!#QRD!``E8Hn5 zrYM-5Z=jY8IOuX9ErEAROO$GW8L4@<<85?q>qK*4JOAUGSQRL5(=sGq8dV}BOAgqI ztW|p20Rv6xa_2yi8behFEE~t%caHh32b+&*D3=;Q&aaKuS$G=rtpD) zTNI7*k=$uu_q1elS>D-M)-xONVKJ)x@E&2Q($&MRaZ$jzk{ccTwm9^p?jN7zj?}G! z*_w*N3n)^!SEJi+kQ0kugv@880)iFVT4Q;(ho9MY}goh@6QN@z{aX(8B+ESDXg805Q0= zC*HAgq)Up!m>~qB6a7N|(jQwVJm;4WqNARmzO;h;<)cb7Ea)IHzc$-L=CEqOqh=sC z(z9i*`)^h1;>+@`tN#PFQq?Ys6TqMu9eC>WPt_#9j(o63M|KSK`ye8(KGlgP({f>P zS^$|V_K+VtP}4w$f?`@&Yl;OVK(b9Z{GTh!u+7hN)b0PB(vps1Vt%H7m8P@w0)g`tK)F?SSs3InD- zB;$&3?PxD4o2#&T1I1s3W))~!#+8qa4jSoi7Ra5(bht}!-acupMw-?6s*pU#ww-^h z=IJE(ix$nsm*&Rb9=M3|R*mn*lzA`?xv$0d{Qm2<;?@PEm%b2e)HAH zG3mSPR+kM^tn1G2p!S=APReo}yr%-sGUf)bwzcw2e4n>GGQb}39o5~i)T>i)N-OPYXtc=6=*#QE7V-0+W0*R_ z<~Aiw?lCEkLReGPbc^h(m$Yr%QNEu2sZh?I_zE>Orr>r^Z*aFr-0ztT)a<6^8)!~b ztB1M7VLB-ALx)q?_Q8rAGO5JMKOxdBigxPkf4UG_!LCY6q)HvuITCw4X=T2B$36&x4I@HphD+*pUUW9^Uw7cMzF$5OoKzt^EPEF@$ZW z=`;9u+X6Ofwzc@Ls9`qQ{&vT{m8np~ey8u#5h}$w6L-K4B*13tH5pLD`agBh6xhz& z%D-Vd`8OFbX^NfFsoi!nCAIL}AXH@J)Wmz^0r+u~xOC*k z#znovBKOj`YC>NRe8P5Y!R4HS2`?9DE*Qs>3perf!o(YXzhKU}{VxLv1`B0mr{K?a zD5WcGQ^WoT2>F|jJn;xNgHeaz|3q4wscGh|_M+Cdu-Q%xjLCln-J?{K!%3j<7e7bb zbZB|yoM7z>J;6TuddEhSensS{BJwTD%r`}-V z!wFr}!qzf!attBb$+!mCPN;KN{!2Jn7Fx8T2{h9dl^5dkmCHj2GOZ9q)Op^BFK=~S zsvn_gg2>StA8u4IIy#jZM9-9`G3f8Fcyzmk-dCflsRur-2hzBFRC%D1Dcgg-C^F@= zv6RK$9_*Q!3{{JrP>Y ziW5_`2u$gY#o@Nh6-{tCrvbh|dUbH-M()yg0<}Sxg^y{;QR(^p-7+eR7Rpvn0BJ=n zVC)r%J`h_7Y$6@VUrTF@>%>s$umKjQcIxt2gF6K-ZXl^Mr&h-_;5*EmSo5Bu1$_sJ zYU<8YxSMmv5xD@iOPdJwB)ACU&zZjoB5y|!=$l1=yFBLyV?<_p$Fk zA|?1K=Ls#*G1Q1gXH%=62aBH^?D6b~P&>6?+c44M18i^}B4-XmQf=gXTcxhEe1Mwi zPgI0U7Bx`x>Ye_MRqf4oS`uF=>ZB=vbOgn00;g;NS35?#>@=}1?TK&j{Am^G3FINj zR4F>P4Uw^3dsO}bT&Q$9?d~P~LKUfqg;VU^F4$3nj5X|~w#uLnr;8tz+LjYbIq|Fmz=?!7V>qjq>`1~YS{|2F{Y9Z@!!@|27LVJT zIwI@}6xa?!`5>hwUBZt_4s7gphc)I)L48JV|0VJh@Uo6}ca12Ea>S$*UJ zLL1GA-Hli?4Z$Oq&?~H`W>2xG+RA5%Z^V+Sk_Cap3lZ#rVO?8ZupkIuNLE-};?xZ7 zd|@?;SO5S%vLn#I%+|su8SD+rCw=i$02)KPETl#I>WS(c`P<& zDuOCaauai)#lAtcN>d&gl9ij>9;4KvwjBr1b4Mg8ZozK8+mEJ0a1Vq7Uanet4kgVY zV2nBd4rOZf8GlQhLkWn^e+-(AXmWDAzhRv>&R}IZfef-1aUxV zJ|hql8I2cC30fXRgO$OZh|{o|65yOsWr69`*1E;jR|JwFPZ!?OHwIi9inAy7dMaXJ zC(NkMospX#RR)|5Pg5_=*T|$#oxI0psp)B86A9xmzswvQ+G0&Ddd#~iK2qn_IfH7i8s1CQgTN>S`6Kl{5pFV!cL^hzGRGoq zwjY>C@jevtV$`WFS238H4vKDl zeXfvf^I8R<2ph$E%%VX(aFmM~II+X`>8H84AjZ@yW49Fw!k~C@0jk)Y8r8URZUg1j zk$M6dI1Ox&5i6ohIHdD>LUX(pxoJ?7ST`f6B9<=}(3OfH*Dx&prv_o0prbK`;CypX z*J((&{x!qURKda0&l{$0yAQtq;%=NL2W#9gs1hu5#qy6ceD(3%om76s@}OL7IEZp) z-7}nY3JyM6BcU>CaUpDzcA^I{YoUd=)d`9mH7P{#;gDpB546-ZG77x0;8(qXhPWRs zbnVk3o^@f07NJECI4Ra1i4S`6J&Hhb!e~WpU=G3{>m>j9{InV{NY&*TXN%TPG!m6U)PT07UGB0mdr3#(SSo;=+zBiz}(CGDc>-1vh z3}feSp9VM|w9(sWb^|_#L%U^iswG8ZurJg=<%)n;QNH;ZOs*l02ZmI{r4X?`5vZw< z&pv&x7srAl(M`%=Sggc}QyC;e`9;`|dsar&-pNjMH9d*nokiFrU9e`JJ^y!3+$i$0 zBSH{oSJV>>qOpsMNXJOH^C@P_2rys$Ip)c+Amn#bMO^60CJvOOH*2y(>nc#8k>lS* z>Wk?t+HE1tfTBr9?@jZjmj65G)AmgUek}FX`R(_2->QD6Pa?HuH)KHTwm73jebU^G zzY&e!!YYlp>WjwcDWrMa{IA?})(Q>e6xdQi*#TPvr2HZKK=b3J3Hc;4=Go+$_edeO zC7m01%G-HNMl$edd3&2e`OY??T(}^~bc+q?IyTaQ;fFnk{%174SX{#RF*TTX6CSck z=O_gBDESIpYt)X$sb=OP)cNE^G!Tysz^2zY1<16bR>PpRE?zZol4 zBIcMjp{q+e=Pu}7li44iYX2TXO8$5hr^iQa7ya{0Dz}mNA;@9>#p0yz_voi{0-X^> zVcYF?B3n^kc%zAgz^tb@jjg9N#|{Nd_Y`v4Bw;uw2Qg@%AI$gXZ3evJjhb7hNtkz|4RV1U`6*RMi~=hJkl6Z_Yc= zu|4!?y|P2+A$FN}yonz{++75^9)_4&RpP%e0TER6;}>~(f%r_o%>^VLbV1AM^vg|r z7|DYBq2-6GQPGDe7^{jnRD*)0?sAFnkx%pG8;}rLkauAw4Q8^GJ-ot+iPuM|>2!z1 zY||%uqGxLh0J?%Hf5bHrXrRcRjM-jGsPT;WmpyTahKs+>1>c;y$x8 z4BPLPsc;^Lt*Iw|RTi7q&zw!Bm8{&W6bJzzq2I<3di%(DMFo>4tz3B^^*PRvBd)20 z+GO|l&B*>6E!fXN35@V+&Tr}ag8c{?}nKVEMw^~&a2W-<1zi?fS z%~MH#Y{W4N$z@jU0sK8WNQIiP%V?{MgS8M@76M0Z@EoZsc>46Hc+BqQbXi_2BenvZ zwApLKdW%FfesqnFvZdbZ;eg4s`DQ~T4pWVClI=Oh2LlpfT@3$GkYlIqWJjw!65?{6 zT02NMxalzHp;Y1DSq}IoJgKSM-Ob^H?jGjy@Px%y-7qtR5%gMQq4=0VGy5rc5PFz%|4_|g35c)2DxTZVR|UC4lNW0fw~BGQMWa{ z^j`ePbWa(GLPn>wgd#e*bSTXTB|JsqA+UC8F8u)wyzlcozxmBD z^P54)u-ZUZ6(-GUhKmU)9|$9WFoOUi2X+)aG7MilBgA^L-?p2C6yzQNwsDIKRzE0L9CGx?qXz9Pbnfl%9LP0(jUYsc<*9PR@_ z6@V%q2;H90J~2EXsl?~=C2bg>F4$Sh>AZmEb&bjCc5Dl9Rcq#EvN;`B zmawczW;>XmYn*(JgDM*vL)kj0r{`7_5!+c48A!?$--<0^QxJf^zdwsxy`m6c zy)w-W+b}E412|M4xRKey;5SM`GRx}5Ibn|tsNKmIq7wI@8{ zbRwDNRemqbFV8h|Yi^$A1;cpl)SO6s*5)U(BO2qbU?vGvq5;3rpTmKdxRNCTD&+~~ zupT?VtxlF{&RR^Buzzu%yD`-XC&H&ZwHg+5mk?=b@gfJRJg2i_Fw}NlK87dJwA(Wb z;utf)8jTtT@}AnJ3UiMP$v9WldY=U$p5`i_cXzj}Xc7xP!c}_ZJ-^)9#P?$^oCCl-Th6QP60Upvs-_E`HFW)A zvC*x6tF^6={j!%Wo}W<8Uxhir@9Dz+i~s*&zX5-X5BPuSMAiTR002ovPDHLkV1iIo BU=jcT diff --git a/dist/images/1x/background/auto_color_disable.png b/dist/images/1x/background/auto_color_disable.png deleted file mode 100644 index a15403d206cc1541de68296a7c9fa42864b23796..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 725 zcmV;`0xJE9P)Px%k4Z#9R5%gMQc+8jVH7^+{hUq-w5%b~jdKm%NTuE6lISAzqR6@^C=3FlA5hXi z&|gq=nbB1kgQCm45~MD=*mRrdw?-|tpg_f@PWHX0bKdpJxAg})@NwSryyrdNbDnb$ zS}c>@oFaf}Ah-ZXAt2l$gp49wba3EhJdTGgPfUmwTwnioy5=3cCcp#|ydXy{DbN)l zb(~0FI=iv9AuWE_V>9QU_Ob=;ohYW0q|;M|T!Ye$eUIvKa3fWQe?^1T+rhz8yAq3`f<@M9 zOwP>g5h9##$F_Nit(ncv|EJF!^!>tD3V9WiP`IWWs6dlI1S;Yg(H7q&I`|BU|tYrr(?+YOF200000NkvXX Hu0mjfg(6p~ diff --git a/dist/images/1x/background/auto_color_normal.png b/dist/images/1x/background/auto_color_normal.png deleted file mode 100644 index 2018e472540166617412142d89c37645a3aad27f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 637 zcmV-@0)qXCP)Px%H%UZ6R5%f(Q$1)?Q4~JszW2Z?6cNOs1w{}mf}o(AVy7w&(m_yHOM*_O+LRZqGP2;$G;AULQX3W7F6b*O`g*ox4ackk)>Zg}A}xOpMr-Fv?8yXSo8 zT&91l>{xA&bFC9XW+%eN(H9PbXN~E6vm4Io0}!o^XG!QJle{D5&ps})SBMW1(~}?w zFQ>&&c zvTSqIAKdP1*0htG0nX*>+w^>hiMQ~=kK;JQ0tO|51FnJFFs!@gKfHQI3tS{a_pI=6 zo8JBh795G~knycb+)kl{=$x8*msr$TI;{qF4EHeQI77R<2PvNa9LZ1hi_o#a$nzjH zuUTk&cC31&8;8ANa$iaNoDOnq&#F;ut-OlY+@g>~;$%Y^;9$UvG0{^D3HqFfX!_^b z(2bCK`teiKYTEIRfS(EFU^;zWBcqkaYRcBW-r~{k%agnRl4}N$_PI9x7NQrgP8?`i zdLKpMz>dxN=F&>#rC$2$R=s%2d!Q;gOc;hF*d)tZSScYx;O4c`2V;0V4D8Quzbli# zVx$rC0`v9af@Xjev#V?JP!I1T*tH%Zrp?Fzo4kh&t@*FVl)lZsjns2Sr(kw+YZ|)_ XeFqUhP&yN~00000NkvXXu0mjf3=%XC diff --git a/dist/images/1x/background/auto_color_normal_disable.png b/dist/images/1x/background/auto_color_normal_disable.png deleted file mode 100644 index fe1fb3035a4e5f1936e32327a4fffabe017db6fb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 608 zcmV-m0-ybfP)Px%8c9S!R5%fxQ$26gKoFf-+b0D&B)T9zF5pW-fNN4Bs6r}~0*Q|j30kNS;s*e! zC=eY=1sx=!3DD3{Af(Hg^KpqU+#y7ZprE)9dzfcu%_gG4lC`@t@6GJYyk+{w*KThg zABtRHlEZK_ao=ZtGc!|7_QKgUfH;!$kx~}b-XNCE+%FvJS|^hAfW2F8pfW(K(>*^< zWtD_t6ZqFpg-1JX@MyDF%SPj;dYxI{PY zFt6(VqLxuMJclVq?MKRnIb3Qc$)ujovZ1%W@jqzI2cvd>-o@Cx5#p~@%-PzAhI|(os(xf$(@&8Q?%*ro#MM0d>szZv?rj&LK)fyo7>ssuOhff(;L6xNKl?^i1FOS^w>u2%hM zZ!}js78yf#_Ic@#sGU3j7LtZP4{&C>x&?Wv_HX_k&>H*xOG_?SFL(u?_Us0*_C4$x u4TMoB>^~k;nMpSYPx%BS}O-R5%f(Q$1)@K@gtV_g;vJS_pOlEsUq8N|U=o5UdihkQ9PHr4U=SFeKNc z@t${uScqUDR;JU4O`;ZQqTxgk1jT3(Ed(pk+(l2{y&dP0~Pr z$)T|9@-^9&w_BebNcec8vi%9pSnfK+Z#Yg02Hi%(LNY)~KB@g*)h6B3-i*WM7qH++ zo{bteD&K97*w{}K^Q;2rG{^}NokO^kqf^=2ZCL0l*1iwu|B+at$7JH?LbSV_{ul`{ z{%qLtM{P>M8{D4TQ=}O?(s^cWwyNjEirsPza3C-vNwNTupfNs(kep%So6)v-0H0w~ zC*BMItP_^1(?C^F7({|Om(%t>%{Uy#=Fak^zEAi>=&okmf4J5z00S&I;JO|p)N>IE zTS(W_Sh8<=t~{OWf8i_A5x!E}q{*`{^VQ~6U?FMvU4W(O-gl6vC42s-$b*RJz9;)# zZ4cqo(kGmh|2(WMqxrALP)Px%qDe$SR5%gMQ_V|MQ4~Mt-qD${@uLrf3Jq%(tqsyq3n5XW4{f1P7zBo!R;8J` zax-cOt%`7!(W(ri2!c=w%#T?F;j(a%L52us@690MyQg#Bc&FF&4|L(qx#yhU{k?O3 z_Y6Ybsu}&&3I;nlTuTJyh_J!uB?OwRh!;Pe?7;23E53_1SbsNtXlKVf1%wko@Q4X! z6zEkCXfJ}PCx9*jN+ary)WDvP_MWvqkx$~86a&8%LgBR!gOSe`VC|V<+V6sUpZ!*) zbkjnA(Y(!x^@(bd&MYD6Bk|%>T)HO-BEp&xXHFxGEew>rkeIBKN#`NoYAaE(UMp&Fiu6>e;e;juBw4;5doHE7Twbpqm4w(ef!YE&px+?*OLIVYRR7S(QhLqy6m(93f(HH2t#Px#=Sf6CR7efA);kV@KoEf89TF~JLFFy9;0oX|OtkR=nqY{9hcFgiLJy(G(3l93 z&PEc(9SV#OU?0O)o6Y9?x0{6|$pQr2Ad0?VTma$%2orHj?`Iha8Euh=;rtOTuVg#) za?k4>xB__)L|7DS_jKHo?Qp^5lsMu_Zg;NlPw9*;@P&^djtjOx9nKPH!mR^sxK%&} zHx8)cMgbjMJD`he1x#?|fGMsNu)$jcws>QJ1FsEm;eP|1_)mZv{|Iz}R{@DH@I8sD zVL=ycmqXM4IT+3)w3TCy4Nuc-RQ@cw{z diff --git a/dist/images/1x/background/trans_disable.png b/dist/images/1x/background/trans_disable.png deleted file mode 100644 index c070eb9bbf73cf6d9c7e43efb127d4786fdb1e3f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 200 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|nmk<`Lo5W7 z_Y^$6R?o)8!0oZVu}?}_Gc9Ic-R+0(?b||m{{Qbbnz%@C$+t^iZ+}xb>*K?-P{GcV zt-<8~@8cV!mPGmoe^u~gOStT_g>i?8a4Lh{Sr%S}C6enIk7OLnWY{=sqm)Be8V|F_ x)t)2<%UKWECajjsW2pMX;wiu_p?UTk!yNZCNh4i%W1wpoJYD@<);T3K0RU^qMF9W+ diff --git a/dist/images/1x/background/trans_normal.png b/dist/images/1x/background/trans_normal.png deleted file mode 100644 index 4f63b4314d08c533969e9a2e55caabd11f8982e6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 192 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|sytmBLo5W7 z_Y^$6R?p_eV9EC9+sDEmZ(si8S~9&e~VNKc^wh4JUrE|zfUOWVQtB&$uD oA!UJz{{)te4HM_w>BzBQh`JOQvQ$>99_R`NPgg&ebxsLQ06hOfi~s-t diff --git a/dist/images/1x/background/trans_select.png b/dist/images/1x/background/trans_select.png deleted file mode 100644 index 1e3837a5f5821c5f3920e71bcc12fd7bcca57e5d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 199 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|8a-VcLo5W7 zO|t)fncv8Cfay~8s#*OLMU3ly|FAIl^LO{DTWL!*gf*ocv+Ap>ZZ(@Q&s?Zr=gHP! zYHYBEEi>)zzP}2dYzdcrwlMB65l&^WJIlhWutah_9%Y4fR17CboFyt=akR{0Q1>J!T6gA}f5OZv>fz@+Qx;usRa z`8IUFw@jeGyqjlbSGYL7>1lOw5?JGM#mmKKL)bYMp+B|PUU7DvHIs5Fe(6-SsApWDFeyv>k({qw#{N>SlUgzx z)*DJiXN0zIQ??amP+XV)OViLU&Y6(jzZVNLq z7G3bTx8>)FGxK*aDn#f8sV(@!*K=&ztAjc@-T^FD#mwplj9&6H+g1M0GkYxd_{&Od zg-_0N&K%~K*8aGYFC$kybD&F_t$PWNLwDi zm(xU{K5U&M-*TbGzmJdR<<-jGud^1M|M%I7!p**W=Kee&kfR^Lc##k~IVs z1paPf+h3N=b0E0lchaQS*EDD9=k;sN(>TYljPd10wudf;SMPGQCaO+vmSZ``8MeRy d2pgK1rhhG3y(MU^VIe31dAjPx$wn;=mR7gwhma$74Q5?s=zq`aD0bN{bLJJNKf^!xNbrf_EnyJvC+?_5$-Z{kP z3C)maif9fOp_e=9+Cn=NbQEj_{R4E6IEmW1gP>L4uiPd!^%6Bs{?^~)^Wl9TKi-dQ zSN&wh5ZX{g*d$9R4m?S1;3Hx`3T{lc<%sNj+0~|z2p5a<&AeGlg4a`}uFgdA7yub3 zX0Pwh{Em~fB(U8%o0XNLg&2t1jKfVNPd z85lNBdeXi>asEF^Q#Y_hd7MGt0RF%*HzF8;UjSUx#IIJWvtREdu!Q;!V5|{@fYq8O zM{g}~^6IH38~_LmlRjMq@g=`uz|qOX^OgBRG#~#|Y(%!J3RPx$8%ab#R5%f1V4x5%g7jN-eD(bQ@87Kd|NqMnV;&?lK-?{a{ zL>U0m9Aw1C@Zx!!BCC`=uc*b^0nU?Y*ks{He=I_VZe&hzZs+im>9xM*%Px$4@pEpR5%f(lizB>Fc`&8%2cZLzpGTbp=@`8@39xzL+wTO9)sNp4*!cHgDKuM z_Ozs0n`zZtG+(})^Gm)o0q$&q{;%);o0RfHLb_>q0%9zLc<*&zKMfkLF$a2oA$k~x zfRroKpqkok08q(Gz0+(UZ{}jM)BxA9VK=I1Kegc3A3;(9Xs*}F@H`L0$((1V2N;Hd zm$r+dm5&6+=D~1^&2|^fF?cv0)hZ=e1=Fw7!Ov)ha?y%b)|nH4)%q9NYzB|@3OdhW zt=#s1<^+I=>3qp9fLtM>KkB&Brgj zL~IHB5|%mQ4wB4Mwl$udyyMK5_wp9T4>vYfXfh<5X>l){`HchUBnD4cKbLh*2~7ZP CYDta& diff --git a/dist/images/1x/icon/check_box_normal.png b/dist/images/1x/icon/check_box_normal.png deleted file mode 100644 index 02ecc0515fbd63e0415a0b362a927dee43d00564..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 202 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|T0C7GLo5W7 z6BY;Px$u1Q2eR7gwh)-h-kVHn2o=lPOgq|#k07Ho2cyEAvtK$jNkDCkgV*KUeS2fGMG za1kov;v!TWx;p3}=vZhgm?6XEdY5v!OrmvmYfbXKlDepzy`*iNdg~qkANL%`9qU1J zTYzZ{;UMslUeFZRHaLVndhIjd$Ylqf$P1!nrI;<7#?yYD*+4+G8jt2L$R0p;_SL0I zW#W4pG7#YJw(jVzet8(By60MjwNnM^Ve=Ef5fRY<4qV%qIyE2+W3w$1Qt>{7T0}pm zQr8``5FCZ{J(0H)KLcgyd``x+)^gCzdK{ zbgbg)F@Y!|`OUG6+2laH0phZ26^(%b5y|*rt4gIFmCcC{NdZ5MZVJ@nvRRlS+4=jL q)QQsG)U@+wK-xn8>6<+4-%V>bHv4ZDflNk5M(6(w3??9XMh1p6|NsBr%lhZTbX8T=pU8Sp47hstl?@X! z^I`^u|C|3YGc09b7rqKs{PV3g(_e;Y1_nl7mKV>`RV{RP!3=>L0Mg9J%(V3X|9}44 zieeYA`RrBi#Ox2wo|71V{Pctw0yY5T>_4nRH~#(q8;DEuZ%L1FqeFUBJl5sHCYNl84P^m}Uk>#xU0H+YerU@MhBg|Nrl4DT+=28*u%> z8<3w{v}Hw3q8os&86OT+T zx3{;o6htI(8h}ePRs+zzfKM}aFCYaXA(j&NgdmSvavBk*M`>za` z7@60jL?bvYoVe`vpM!n7z~1e7V#WDWacO2`WZwAy@84)`Ww9gBWR6e@GUShh)J%Ly q`QP8au`taT2EbA!*_nx)oDBd1fb$W_&pzS+0000sQIW%`Pl1mieEF(V2mP(F7v@{|w{5|9juQd^P>fWYwR@dQc27Z~0{NpNU~H z!+*xjOpO1Qa{S`E3R3)o?UVMu|4h*gjQ@S5zCBIf(4x5uW(eE>kmi4kj7u39{`jA+ z7QBGXXNyv%WUrF)nZ)w%yC=*LumK=v3rULK`2YWJATG_nJw5Fi{{LUKT*jwqic(z3 zyXP-8K;8ixVBYev;6Edi(y40RJZv_@G&3+VhOutne$cG-^CZUq|L&cv;hz9Dz^v`l zW+sOJEhnn@Pof)ut{Eh6(e}~&9|L2}sVY8Sr~#j!bN%8`J>nnCgo4gYz* zv3;NHaLh&;t<`jXC!g^+Z0|QU?od zY%yZm`rd$%k$F8zG=dZc)LeJ_!^F8g?AeyQxH&mfacO2?WZB5{?|<~k8onbSH7H3L yWXLlv>6!SFGUGpnSeRxE17N9=?94`Iy7(6mk*uCJXy`E*s$Cbia1+xw}t&^C!zxcLXieA{Z-P5_l3TG$?_c-$G z&Acv^G-crm#gj}Tb6tuu@)++~FjxxNMojowm#4_`*YN^VinBwT@@LLjd?5~>6{KRs wCP>*VP&gvZ-eM$ZSZJ^+&4i`RfrEkJ&q?9W5{I%s0bRr3>FVdQ&MBb@0GswfkN^Mx diff --git a/dist/images/1x/icon/dark/tree_collapse_2.png b/dist/images/1x/icon/dark/tree_collapse_2.png deleted file mode 100644 index e05a3c2a1c3eb760821e83e3d7852e4c7a6d0aaa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 233 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjjKx9jP7LeL$-D$|7JIrlhIsHM zCrGd^R&>bZFnDC7uzSH%dp*mNk1K_<3T7Q{S|>4cfAMX(6uq!*yQg!970yr)?s4SV zn|WO-Y0APCiYJ*w=DHMRAI`K4$0lTjB1WCB_}hNzJT{EFL`z zSPh&VW;wJef1b#D=onk)MVk(`>8v-J*u_kCWb7$)&=7uTG$p6-iHOrS#lz9cmX0Pn fCcRwHBhTP=UirIAPRKW)a~V8c{an^LB{Ts59G+5g diff --git a/dist/images/1x/icon/dark/tree_collapse_3.png b/dist/images/1x/icon/dark/tree_collapse_3.png deleted file mode 100644 index b9435ff49c5b8db2c2fd63ba6cf1d5b0d2d6c4a5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 250 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjjKx9jP7LeL$-D$|ws^WYhIsHM zCnzw+?EHRfI?L09r9Mlt6hdv!>MC4ybdIsLoOq_=^!b~ty8jDLF6{Q78_;}NMy%xM zi9d61e^V&lxascRm diff --git a/dist/images/1x/icon/dark/tree_collapse_4.png b/dist/images/1x/icon/dark/tree_collapse_4.png deleted file mode 100644 index c83be64c7a9ea1cd7719c22001a90f1c784e48ba..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 238 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjjKx9jP7LeL$-D$|R(QHNhIsHM zCnzw+?EHRfI?L09r9Mlt6hdv!>MC4ybdIsLoOq_=^!b~ty8jDLF6{Q78_;}NMy%xM zi9d61e^V&lxascRm`Iy7(6mk*uCJXy`E*s$Cbia1+xw}t&^C!zxcLXieA{Z-P5_l3TG$?_c&@- zy@+lw=W{r?E%Un6oQ2Pyi!}xFsX1O?O5$mhZ0nW#Rp?MG|Dc!IX(mVXjQ+0PwgUn@ aj0}5!a^H5E@Kg$DF@vY8pUXO@geCyuLOj?2 diff --git a/dist/images/1x/icon/dark/tree_expand_2.png b/dist/images/1x/icon/dark/tree_expand_2.png deleted file mode 100644 index f6d8fe280d544c9f92416f0b9eb3a94c7f31a574..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 214 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjjKx9jP7LeL$-D$|CV09yhIsHM zCrGd^R&>bZFnDC7uzSH%dp*mNk1K_<3T7Q{S|>4cfAMX(6uq!*yQg!970yr)?s3$v zdJ)}V&gXD&Tjq7CISZdZ7h{^XyXgJa^?j3GqzSMeY0G5j6x_m)#^EDuCY5I4!8eol z5&vI{1v~ja9AjMQ!@`xkis^}nQ)qL0f8rAs!Lz}FXLT1;{$XTb|1W)CDXX6q=r#sV LS3j3^P6MC4ybdIsLoOq_=^!b~ty8jDLF6{Q78_;}NMy%xM zi9d61e^V&lxascRmw+vj3TV$4hRWK}PoRp2Y~ zV(t{&!jQ(%_R@pN;IO09i5!9Y7snaT);5^)ail5*NCb;2EEiZMWmChWtlp6^uPY;u d@$6%MhMD&jx4-E+Gy~{Z22WQ%mvv4FO#m%iRb2o8 diff --git a/dist/images/1x/icon/dark/tree_expand_4.png b/dist/images/1x/icon/dark/tree_expand_4.png deleted file mode 100644 index 0e2bd0c15aa9705ae01b1bc5918335d419a676f4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 217 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjjKx9jP7LeL$-D$|CVRR#hIsHM zCnzw+?EHRfI?L09r9Mlt6hdv!>MC4ybdIsLoOq_=^!b~ty8jDLF6{Q78_;}NMy%xM zi9d61e^V&lxascRmw+vj3TV$4hRWK}PoRp2Y~ zV(t{&!jQ(%_R@pN;IO09i5!9Y7snaT);5^)ail5*Nc1;d6p&z3WMHVBBYpq5)wxul P^B6o`{an^LB{Ts5l^{hSCshhO5y=MC!^<^g8rZ<$_D7P#*x7AwgRveSE?wlC*4RIFl8Kn-(`~A%esqb;( cSh&l+M^RVP`K!-Wpz9etUHx3vIVCg!0Bwe3LjV8( diff --git a/dist/images/1x/icon/dark/tree_solid_collapse_2.png b/dist/images/1x/icon/dark/tree_solid_collapse_2.png deleted file mode 100644 index d9c33bada66d79f11882130345c540e644c55da7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 340 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&H|6fVg?3oVGw3ym^DWND9BhG z;g(K*)$kMEx9+SelMzCSt5$kC+0;ubh* z%QfMcWe<+WYJPp;CB@wP?US&Z^O=5wYZBYnxvXlK#-<$=By@2jw}2!g^PY@*Yz7|+ z9|&{rj$5d%!`^n_He>eA)ir6~`M&KwRGxI_ME9n++)LX(KTlp5!L%YJQ)uxF$K3}K zv`s>Hohr=dw*9%^{DTv#PXyDQ=HF8rPCVv!pC`R0amxGCR<~6@PETHvc!cS94D;j% iu?kEs4ICVL4>;xBt({gCKEDj~G=rzBpUXO@geCxIxq-?6 diff --git a/dist/images/1x/icon/dark/tree_solid_collapse_3.png b/dist/images/1x/icon/dark/tree_solid_collapse_3.png deleted file mode 100644 index a73232ffbe9c76be0d5ee52615ee1872d15daa92..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 353 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&H|6fVg?3oVGw3ym^DWND9BhG z1epfdPdVN>NTrhSm|Ghqd%>eAAGxXN|iG=7sm|Wbrwbo5+C1K)Q~<~QIoli z$9~5$iA4{r1ro0^H{${k<^iB$;d8;Au7HP6tzVxaiadlu)?!+*?VxfBw1_UUp+Hl~L( za0M{lW9_kYympII&++bl|4WZzza-zjEb*C%olW9`V)_=Dik1v*kq-r|o3tFB{5Z&} zF2EY!*tvrJ!-B{}g$2H>vu0ebYVPBCELP*By56Y&MER2EJinK$Ii~3O-eTSUZ}EPe zf}9UFb(>$VzuzQuYQvdLr(|lQU!3?*wZM(d$%ScE+iP!!8;|(K4Ibavyr59RGJ#jw eHBjXJ9>!mv>@{^(Uz!i}GlQqApUXO@geCx%h<^eA diff --git a/dist/images/1x/icon/dark/tree_solid_collapse_5.png b/dist/images/1x/icon/dark/tree_solid_collapse_5.png deleted file mode 100644 index ea1e4a8d68d3c11f5b0588fd60259487a4cf2dc9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 316 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&H|6fVg?3oVGw3ym^DWND9BhG zt=RcXi^KVq><+MB;eWyY%KeYSotCq%+;>a7ofFxeGHy(|tD4I&B}mKgFz2Rg zeg(6f=4>~7c3H%PO>X;7QTL-g=L>QQ_RM11$!Q@Pw&f8^((!i(Oqdw&WISZ!I8w6U z+@xphTU1^-h%d5s(B+?cKI5&+dDVHs_j{8I>(*`mdH?rz??e~Q0@+V@WhTG;qWxio zQ+(5bCK)+Cn3ug=S^>C)hBl3N<`6~N+fDYNIZ=-DTtv*g;3ea;5p00i_ I>zopr026U|LI3~& diff --git a/dist/images/1x/icon/dark/tree_solid_expand_1.png b/dist/images/1x/icon/dark/tree_solid_expand_1.png deleted file mode 100644 index 6365fbd12e0e98d26d6d1f87dd1e7b22702a406a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 246 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&H|6fVg?3oVGw3ym^DWND9BhG zd}SDP=gzo(<4Yd2%t9hpR?^LFV#XEAuX`njxgN@xNAWq4P@ diff --git a/dist/images/1x/icon/dark/tree_solid_expand_2.png b/dist/images/1x/icon/dark/tree_solid_expand_2.png deleted file mode 100644 index fa29e6eb1b865ae1584fc822b5a2ce6263c35dc1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 302 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&H|6fVg?3oVGw3ym^DWND9BhG z<_9rXShdJA>;|gV}@F zBhFq1Ph^rfEjuC_SZA;$F>e%ElprInxv6a&D(+ z+t!wkL07-e$j~(V^C;XU{fc@A^CL^OEm9v!Zd^R4bfoj{(GyN-ZEQ|O3)sK!KDa^l z$6tqeCjS<%c~w?_rk-WH_tHSNH6oSM4xL#Ndg1fkL}lTFDt}gMc`(IU6yNX2a(lWn uuRC}epO3NWVvT_3eoBc#ml$|29AKAX(yCfzd-65VI}Dz#elF{r5}E+S(Q^9$ diff --git a/dist/images/1x/icon/dark/tree_solid_expand_3.png b/dist/images/1x/icon/dark/tree_solid_expand_3.png deleted file mode 100644 index 9513a4b82e5dc8143673d847781775b1346eb3f0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 320 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&H|6fVg?3oVGw3ym^DWND9BhG z8}5lsW14y4 zKnJ6t0vnsTfvd~4Tax7`pa0!!cK5~|FVdQ&MBb@0JtY~fB*mh diff --git a/dist/images/1x/icon/dark/tree_solid_expand_4.png b/dist/images/1x/icon/dark/tree_solid_expand_4.png deleted file mode 100644 index 6be667d7d14c23c8f3844292eda48d896ad31d43..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 306 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&H|6fVg?3oVGw3ym^DWND9BhG z0Cd$b}KvJ0{oFzjy73lJ}C{1ILxu=R<)X3L@93QJ7tXWO5wu2d3SW7ay^!)=m; z=>oPZ4n@q#ZcpaSUT}Kf{r9;ydwiqqswI-=2_4{Qod2XHjN83$TU%qbhsWE7<;VD^ z_XxD(nnT yY!4S~Qg~l*ICV+iI@bE`K!#Nknq7-jp0j>ktCzUM@)0Oh7(8A5T-G@yGywo4>2$mR diff --git a/dist/images/1x/icon/dark/tree_solid_expand_5.png b/dist/images/1x/icon/dark/tree_solid_expand_5.png deleted file mode 100644 index 66648d619d11ba66e883d8fee86fc80aac4d90f8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 282 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&H|6fVg?3oVGw3ym^DWND9BhG zGYkmL# diff --git a/dist/images/1x/icon/dark/tree_solid_vertical_line_1.png b/dist/images/1x/icon/dark/tree_solid_vertical_line_1.png deleted file mode 100644 index a64ab7e49b18f73cf80b8542b69ad9dd2d3b704b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 151 zcmeAS@N?(olHy`uVBq!ia0vp^0zj<5!3HFyJAa%3Qk(@Ik;M!Q+`=Ht$S`Y;1W=H% zILO_JVcj{Imp~3nx}&cn1H;CC?mvmFK)#Nri(^OyZKz$6Ju6{1-oD!M z&g&~@J=@cGmxaONjn~1?b;`4=etVz&bl}ywL^d7?gM=XbF{%In diff --git a/dist/images/1x/icon/dark/tree_solid_vertical_line_3.png b/dist/images/1x/icon/dark/tree_solid_vertical_line_3.png deleted file mode 100644 index a7b4e4bf050bc4b68c53a5f980ea49292e20ef7c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 180 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&H|6fVg?3oVGw3ym^DWND9BhG zX5I}`fod5%UHx3vIVCg!0MwNp AU;qFB diff --git a/dist/images/1x/icon/dark/tree_vertical_line_2.png b/dist/images/1x/icon/dark/tree_vertical_line_2.png deleted file mode 100644 index 95dc9470b2ff5c8ea3429ae5476ba71a2242361e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 144 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjjKx9jP7LeL$-D$|ygXeTLp*qs z6C_v{D;h{KEmm|eV3FWlznK)AbSiE&5UN6ya1C!I_u*o2lQKG9TC@0gJx p>tnLL;hLO8%CmkqBVQ#J2IYAoCn7Ii6$hHi;OXk;vd$@?2>>`2DdzwH diff --git a/dist/images/1x/icon/dark/tree_vertical_line_3.png b/dist/images/1x/icon/dark/tree_vertical_line_3.png deleted file mode 100644 index ecd99fd2d29cc6e0c9dc30fc0aad56e72c5214f4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 162 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjjKx9jP7LeL$-D$|Vmw_OLp*qs z6BHO@c7DG#o#ko5QlBMR3Zb@Vbrr5UI>-FYP~rc`p>pi!6Bi?8L$-FYP~rc`p>pi!6Bi?8L$_C$lJYD@<);T3K0RRJ$EusJb diff --git a/dist/images/1x/icon/dark/tree_vertical_line_5.png b/dist/images/1x/icon/dark/tree_vertical_line_5.png deleted file mode 100644 index 3125a9baafd82481e61df2dc587102cc91ad5781..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 138 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 diff --git a/dist/images/1x/icon/half_selected.png b/dist/images/1x/icon/half_selected.png deleted file mode 100644 index 7ec85e364adc517056e87412d778b633167cfcd3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 228 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|=6Sj}hFAzD zCoB*!X!;UeQuFoC|M&OT{Qv*|v_P_)vhrhLH??J3ghlV%j&zW6m?bGOKjm-P_I^#C?f5i0K=XMsmX?GXqA!=`;WRWlmSKDHG6V ZW!M;?pZwoyRR_?e44$rjF6*2UngCn`P{IHJ diff --git a/dist/images/1x/icon/half_selected_disable.png b/dist/images/1x/icon/half_selected_disable.png deleted file mode 100644 index 5e9add3de38f3b4413c1f394bf04a62543c8c520..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 225 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|W_!9ghFAzD zCoB*!X!;VrtLpgY|NsAQ{%8DWy5cb#H@0KyJv}{{RkyTmAAF@BxAX6hOIvrx9m!x@ zxwGc&I&%;Hn7^&s+y5Q5bTLY(n$Z!`A1ujjCOPBfiy}6wtOo|pV#{x^E@m?@Na$tF zS=cM{=|s*e7A1|`=1JFVdQ&MBb@00YulhX4Qo diff --git a/dist/images/1x/icon/icon_down_arrow.png b/dist/images/1x/icon/icon_down_arrow.png deleted file mode 100644 index b77c3309045e2e000764e46990b449f20bd344da..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 203 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`k|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*D5Xay?xfLn>}1r5s@X_y4~>!xEl`AI!?ik6GD*7%woi{}HcqhOkJsw3 ysZ0=Bz?d=X{A6M6-xGNX7N|rOx=A}UFfs(aex_siB#8-VF@vY8pUXO@geCxO{Xr5%(GQ`zk9!uLS~AsQn;zFfp39xYDT6>~zjAN>wn`Gt*5rFf&&$x70Hx^| z#0uTKVr7^KE~&-IMVSR9nfZANAQKal@=Hr>m4GgVcpix%w4} z1^R}12Ku?VAb){X7ncO3BAkI$b#X{#L8^XGYH@yPQF1C!xiU;MFzoPK1X2iejg@~< zCNNSGb6oP1OLJ56N<3X`m4GsODVZr&mKG+)X~yQ3x@jqC#=0iPX34siNr_3i=H^Cb zCP@a#$wr1IFmtf!H?=f&GO%zmHM2A~GcP;hnz$GU=sZ(?$09!O9V z6j2a=yQCInmZhe+73JqDfJ53U6N@W|3jv7!6mmmQALuB3P;x;^J}@C*nglW7nE}Xw zXQ$LWU>+(0W){Z(|Nj2@{p;tC@87({PcxqRv3h4bgmo;iK$# zu35cm<%;FYmM&SmXyJnS^XAT(J!|HS>C>i8nLKIYg#NzXp6;&Bj`p_Jmgc6$hWfhN zn(C^`it@73lH#Jmg8aPPob0U3jP$hBl;otug!s7FnCPg;i14t`kl>)e0DnJUA8#*D z4|g|L7iT9&2YWkP8*5;4GdD9eF*Y(Z(AU$|(bm$`P*+n`QC3n^ke8E{k(QE_5El~_ z5f%~@;OFDz;pXDxU}s}xVP*mrIf_47SUDJ27<53T5~#ppV9xf~b?2YKDbLk=!#I47 zKj2|7iBk@1Fw=XgG%tA7rum-^ZB$z`t2Ta9@5`f}tTHYWiYhO@RB2ox^5~80lHg@! z-92UD2O1vSn9!ujP?+#kb;;uA9#uSfyU%7=9IlIB{HP|cP@*xqHKwDptCJI9KMMmZ zgBXJ#(0(J2T{?#hoYY^}@J72%m$+rtm?TiUFvZPLYu|>gTANw!RK&Vl$o+Si_jYSA zL&rhaz$r-HU}a!u5M>Ym8l&SOvhbh4HnI6DHm_Qp`7}zSFXgAf84aE{3Jd0K+qNL{ zz6B?P<;KrDf~8G64T~QUcmM2)S?f@ zZU?2$_8Z&~YItoU*vByEhl1AQ3q>}jsz^R!2l_|==okiOeUDut2L*O{+)g%5`jW7>m>%!z643vChKE^Xx4=Em45eu~Q&^Bgg##KY#=uyS(sR=gpKMMC>(~HuZzg@ru69Sx24i;|*pgzv}adI52~O!5RRo Cf`a1! diff --git a/dist/images/1x/icon/push_down.png b/dist/images/1x/icon/push_down.png deleted file mode 100644 index 7eb88eb00623c089746c083519b9828c87c5cdac..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 200 zcmeAS@N?(olHy`uVBq!ia0vp^AT}2V8<6ZZI=>f4^?SNFhDd}brzi*+2(9dE{P^SJ zV=fsP8F?OFUi*a0C0||yGVAHBWAAbAlhsc6@!x*l?C#Tou^%r!J}&(4|9|_&nG-KE zf4^?ABDhDd}brzi*+2(9d6bbfeo zu{*ECj2VB{>gq~Q2>R0Bm}sx8{Mfzi|Nrl|Bcjz0i5wO^Bw}c2C|Xolkn`i$ z+uMw6Y;B(njwZC8=vt$zE8cMA+Px$K1oDDR5%f(Q$0!pQ4pS4pW0+Qdkbv?sRXeINGc0+0}C53Ac&Qv1iXNahe(l1 zgcLSu)7p53wbC`?e6yKlb|DeXKr-{@ec!zKTcQnx+x(M}Gyy zX{+<_dc#HJGy)vm7pJ_CCn4I8Ah#9#E*W3WZu6Jmt4xsfsb>;t1a)AonKdCAcn||y z+GR0c^>R&K8ptH2yo+)Yd{%QvJ7q*y{T({%ZX0DX|Dwm~CzXpT0v-ZKPj?D687{Rc zkS~sRX|I#n4>o*J&}5ve03rwR(qCTZ^9gwd5&I|G0$|ROg__&a_BqFzh$YdQdQL*a zAYO_$(eI(bF^#`X#%LvAp4c!As}uS~6a%cUblpVTEZs0H$*K@`7q$>M^)Aut diff --git a/dist/images/1x/icon/radio_disable.png b/dist/images/1x/icon/radio_disable.png deleted file mode 100644 index 1de4dc7bc57e8d5d5e77f76e75f414b02f78f4a2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 371 zcmV-(0gV2MP)Px$ElET{R5%f(lRZwuKoEsz0E>XlPh*P;8mL@w2M$09Mee~Nau1r693Xc{;R+f$ zWH;;lj#q<9PRQFG&Vb6gh3%w(?fjv!;1}7SZ8(eme1x9)MZZ+@)z6?+mtm zeQy7leM(hTjWK%ZAr8Q`zvSgU%hIDoW={fAmetdi9Gub41_gTN+N;cH(V)e{w*wes zuIZVBkcE~01c260$N@r3i!@yecFv3{bfG01=(`qdNSJdd0IeP0xCf9h zLc)kvEi`EH^nfm&IwT~^Ak@&1Mjz=uiO|-HvcG!&Gudn~Ue1^OOy2kJ{RhfbnagIf Rij)8V002ovPDHLkV1klTq?iBz diff --git a/dist/images/1x/icon/radio_disable2.png b/dist/images/1x/icon/radio_disable2.png deleted file mode 100644 index 3808cfbce145e52ca92d357c1ab95132890aef6f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 398 zcmV;90df9`P)Px$NJ&INR5%f(Q%y<(Q4CJ{Bi$&YGNrpN?4lsWo}qNDckm4Edx4(8L%0_2AR=_p zjXR-82i=I!#(b%HO$SC%1MSO8zArC-L-bGKGJiH(?0>9^t2N2FI(zU7(Y!`{vscfi z{eJ!yIXeOFALk<>xh9cr1SOsMiHR@IPJ4H5O94REw{Arw*&Gy4X4Zsw>_KX9B5l0< z6B$@wfCUHl2L4cUOq(@_PJT>>*#X?NEMDn(@uCpBB1+ddL=($kEpqYYvIFFHenib? z!+y|Vi-IQOZUOYglj!u9zq4tQHX#cTfxp!)0OlNtsJSdK z-H#I-oHlcePx$I!Q!9R5%f(Q!!4%KoHzb8Z5;!ZEEOH+DPdlklW-1RBn){DR=-%K~0$^`9WGs z5jAZ@mrq!>WE$Aqcvb<@{a^Z72{?Blh->&n>y&fQ6RAbpP=ju6>ZLM=!PV{r)^}2D27wz5ZN6}nYwd3rELZlmkgW= zh+JJn!Dk!M;=o#mECY+3JXZqf^H)~h9Lok49N;Sfm_+D1IaUBzaB2ZK%=s;Dnq;4# zVkB11ZwBZmJOCpd5>XGpY@C>-YbW9~1&C`Wr)ZURMr%fi5;x8EM*t%BnA~zouD#eh e^q3GoYwQ5DHj@^5f+NoW0000``8)W{8fMPalzEaqfx(briI~U?|FThvumun zRwfsqvvcbr5RQS``at2*k+GQW$pAQoeod}j87Bn#pp<&bvaAw9Jo?sIYyIAJovNzp zjl9&jCIk%SJy}0n=yRUuFGW$XG)=u5-1j|enufJ)d$I6Wd+F2qbuK%1^jJWqp-?b5 z2j?LUY1e4n^6 diff --git a/dist/images/1x/icon/slider_active_small.png b/dist/images/1x/icon/slider_active_small.png deleted file mode 100644 index 1c29cec8439ff877a30b1c944715e6342e57cce7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 289 zcmV++0p9+JP)!sZKLveurlOt?lU^}+QVhG9vD zV9*204fgd$_?kh4URW;BrWxV8h|l}NF_}~BDJz5k>$-w-ZaXWbKx++M*YRtUtOvm% z679*WG|JlH5cjid2lq@G$l89z6R2Ei|;;nacn`#WTe(R=`+^ejAbE$P`( nQw%3&(9}J%kedXNegX^t$`nNtX#aAi00000NkvXXu0mjf?zD88 diff --git a/dist/images/1x/icon/slider_normal.png b/dist/images/1x/icon/slider_normal.png deleted file mode 100644 index 8a611ffc9c6dcac5b568adfaeb1bfbc25466fb87..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 425 zcmV;a0apHrP)+h#?>6;X#}R{`i=y~Qk|bA3UH8seYyI8#eUaz+ z7hBY9RH`sdgDGW?Xkj6vn&&7nhKY|I;=+>wq1gQ zXCD@h*A+_PcAF&sPUOb#-$b zZJI{7!m$qPQHOYHSh6IO5sL%(>Kifk;{u`uZzKbrB!;ac43NWf diff --git a/dist/images/1x/icon/slider_normal_small.png b/dist/images/1x/icon/slider_normal_small.png deleted file mode 100644 index 7bd6fc789790cb7375507adc4f177c32d1140f21..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 233 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh1|;P@bT0xa&H|6fVg?3oArNM~bhqvgP;j=V zi(`n!`MHx0@*Y+YU@=$w^nR5^r&Y`(??O(!gL&+oT0aycXZvqB=TfMk{4ui3Zi516 zvDzeQ`CBHZ6RZKGyE&7-Z-Ih#YU{GQTZ7n``?HRl0EtQr6 zFIK_E@Bb$8u2`{j($hKbkLLG0uF&t|h}y(>Adfk8ugK}gA#dvI-Op#~z1}!EIyyYK dJ65@#(QfsRs2WtU|6naRMw=*-B#U;>i=&%khof#Lt&=YQCz-`PI-C$b(C1FU`0Y?zoB z7Bl?+zxh8C<5Ctjma8Dee}4VZX8iX*nt_qgSL)xN^p#uY?SdHsHvp`ekzpzG-~avx zw#~kP&1cKK!m?L0^G;&@|KAg42-pCyvsr)MVE*$z5SQlPo}Ts$|NpOA!^GD#jYXj3 z`EPa&kaxfa*!rdwFfjaAI=p#y9yXg{ni&`w!&tX(KWOWlI*EaS@!sLhvnD_dNZ3_?Sjk8Xo8-T7EByZ!NX3qGJvF7mRnZ95H?0nOoGjTAh9#}o?3$g*&G=thHh6FlVAi|(7Utkbj@* zV4;mIMjX6S4gRt)u1ASRkiu}EB)8v;jN3#1e$I>BwrVO)&CHA&|NUo(KDuSr5s(^` zqzp3T857G)d`bD=KZaPCW())1sgm5xL{82I0Kg#e5fI=pDgXcg07*qoM6N<$f(qE; AcmMzZ diff --git a/dist/images/1x/icon/trans_select.png b/dist/images/1x/icon/trans_select.png deleted file mode 100755 index ce061d9aeab881b2c14577c0964537089895afd4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 456 zcmV;(0XP1MP)sQIW%`Pl1mieEF(V2mP(F7v@{|w{5|9juQd^P>fWYwR@dQc27Z~0{NpNU~H z!+*xjOpO1Qa{S`E3R3)o?UVMu|4h*gjQ@S5zCBIf(4x5uW(eE>kmi4kj7u39{`jA+ z7QBGXXNyv%WUrF)nZ)w%yC=*LumK=v3rULK`2YWJATG_nJw5Fi{{LUKT*jwqic(z3 zyXP-8K;8ixVBYev;6Edi(y40RJZv_@G&3+VhOutne$cG-^CZUq|L&cv;hz9Dz^v`l zW+sOJEhnn@Pof)ut{Eh6(e}~&9|L2}sVY8Sr~#j!bN%8`J>nnCgo4gYz* zv3;NHaLh&;t<`jXC!g^+Z0|QU?od zY%yZm`rd$%k$F8zG=dZc)LeJ_!^F8g?AeyQxH&mfacO2?WZB5{?|<~k8onbSH7H3L yWXLlv>6!SFGUGpnSeRxE17N9=?94`Iy7(6n1aN=b5|H6|CyKm2U{n(_PHP+DR{w*K=ncY)szg$sW^T@zaO`=)i z);ayT5~&(l9-A0k)hEi#if%CHbLey77fboK(AT*03%gkAf{+%zoZ8D5TK@@q<(lv> vI+)66nb>DOi8ED6C(vBWM2gATkcDA`w8i&)i^=Rj$1r%h`njxgN@xNA&1FLZ diff --git a/dist/images/1x/icon/tree_collapse_2.png b/dist/images/1x/icon/tree_collapse_2.png deleted file mode 100644 index 6d807542f35a066a1e11c7d037f2d6217e3b3098..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 233 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjjKx9jP7LeL$-D$|7JIrlhIsHM zCrGd^R&>bZFnDD2;Ka%9|Ai+PcHf@y`msqnYpkKs{aZf#GrOnOez~H$=8=J;nnbh2 zt#kTwB~mrAJT@`7s!x=e72ROY=g{ZEFP8Fep|A15e=~NMBs&*vsb}tBPHN5&Xy|mT z$WYM`UC11L-=t*W|CS)>v&|U=kqq3$TP_?qeN_5ni;-a5zQ^QlBMR3Zb@Vbrr5UI>*>rPCV0b`nb&Th z`14v?)rpujZx%1tOB8MAoHV8D&7Vt&zdDwAZfeK~o+xtZ4%41Oh9Zut4GN$6b7ygu zX={|Ky8kwBusET~tHu`A;@1!)Xtm+1ue10se~qmdZ93Sdvu-eO=l83r*)!2cL-?Wb u3?0iSB2Lp75625zI-2a5^m0LuGJ}k>*J+#0S04c#&*16m=d#Wzp$Pyq@?CHM diff --git a/dist/images/1x/icon/tree_collapse_4.png b/dist/images/1x/icon/tree_collapse_4.png deleted file mode 100644 index 42d2a1ef86bc5eb79ed1fe1499d25f992cb4cc24..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 236 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjjKx9jP7LeL$-D$|mU+53hIsHM zCnzwUiQToak>zQ^QlBMR3Zb@Vbrr5UI>*>rPCV0b`nb&Th z`14v?)rpujZx%1tOB8MAoHV8D&7Vt&zdDwAZfeK~o+xtZ4%41Oh9Zut4GN$6b7ygu zX={|Ky8kwBusET~tHu`A;@1!)Xtm+1ue10se~qmdZ93Sdvu-eO=l83r*)!2cL-?U_ iMM$0rOIrX31H&;s*M}wd`Iy7(6n1aN=b5|H6|CyKm2U{n(_PHP+DR{w*K=ncY)szg$sW^T@zaO``7#YnXV2-&roWKAWg@&>#;0ik>k$biV;*VSFOM6Z*&UE(Z!r?wW*{#r&D*Fb a!Ni~>z}GX+j=KqHF@vY8pUXO@geCyijyu!< diff --git a/dist/images/1x/icon/tree_expand_2.png b/dist/images/1x/icon/tree_expand_2.png deleted file mode 100644 index ec715ed54bac6f45116163e11a0aa4e8bc445eca..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 209 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjjKx9jP7LeL$-D$|x;`Iy7(6n1aN=b5|H6|CyKm2U{n(_PHP+DR{w*K=ncY)szg$sW^T@zaO``7#YnXV2-&roWKAWg@I&UjFh}+mnp{Yy#{@*e)tC2seMY;1Qsu#3taC>uk@L z@s4@VL>~>|g|5<1W1fgO?aVxUiKVEizQ^QlBMR3Zb@Vbrr5UI>*>rPCV0b`nb&Th z`14v?)rpujZx%1tOB8MAyksNFTg(077^8;F+dr2Q4|Y1r-!c)_Ve^VTdGQ~w0$-6= zb7!OILg57=E<6fTZnf3PT)4wtp*%A{&8gqK>*op0mZZaN%Nd`r2%ZfVJgd8)GKPsE Y_O8cM^JRVUKzA~Dy85}Sb4q9e02#YfLjV8( diff --git a/dist/images/1x/icon/tree_expand_4.png b/dist/images/1x/icon/tree_expand_4.png deleted file mode 100644 index f166471812cf745ed3a5fc73a27314c156694948..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 212 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjjKx9jP7LeL$-D$|`aE46Lp*qs z6BHQF#O~VI$nrE{sn3!ug;3kGx(Zhvonve*C!Xmzecs(K?oYorU+kS@G4jhTbzXE$ z{CO>{>O{<%H;b3+C5pClUa}G8t>yl3j8Q}8?Vn4D2Rj|*ZXq diff --git a/dist/images/1x/icon/tree_solid_collapse_1.png b/dist/images/1x/icon/tree_solid_collapse_1.png deleted file mode 100644 index a5e5dcf9ce63d68c356167acd457e9fe2ad409f4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 331 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&H|6fVg?3oVGw3ym^DWND9BhG zgT;?cs?nu}->aDEY5X;CnialBno0R4( z<#;T@vV~#p^pnYKOi>N;8zPx!&HCimAJsAS*R_W>*Uj%To&A~caT_CJ+^+K1HL?6N z{C_i4wNy=UoU__5|Ed`C--l8^p4f36U}n{IDBc)VaD>5c(Z2#UmY(mu7tNKANl4!n Yw%()vTd<%>4d_<}Pgg&ebxsLQ0229ng8%>k diff --git a/dist/images/1x/icon/tree_solid_collapse_2.png b/dist/images/1x/icon/tree_solid_collapse_2.png deleted file mode 100644 index 2acf7e7c4f23cbd7c67ae506fb9c67a48f054df4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 384 zcmV-`0e}99P)7E?a zr#NnAx88WzpBD?}OL)o5X*>froO`Q1{XeW{qt&Uv-UWIKBr-#hC1Tm0nDn&m;z$1Q z3_PM=ra%N7cm|HU8JPGmpqb)@qu_#EH(14JJRHm$t#;*Y46zuoSXyi1i~pI>Z-FwP e3@8Jk8@K|c$3Hy!MCq#l0000$^4h(aM@8+I|H*!YOYlZa$~ z#qR9Rdzt@x^YI2?FtHaNnCSR1N`Mle1pHh;kYp8!gy95Jx4)+|8!)1|hd#z(j?HF^ z7igd$2GP6cmJJ#f;8x(Q$FB@&8Iag;Rwa^UDBcJ0kmjucGg^R|D1ZS^fEy^DpG7eE zlU?9Pq}-KJdtOe=wHa&5PJMvga(HR=I;~MAZQZ$Nt)#{iaKXL4wVQ8WKFig5{@c4i zA|n)0!bmj5p!-z=AM%H5z>j_$00D5|3D~WNVDg3l%@QXZ1rI3@q1A#X#i-Y5kIL0r o{-F=C7_m^-awR|sPy)We2|@Nou3cJFx&QzG07*qoM6N<$f(GxKtpET3 diff --git a/dist/images/1x/icon/tree_solid_collapse_4.png b/dist/images/1x/icon/tree_solid_collapse_4.png deleted file mode 100644 index b445df5d978c6f5d57079ddce97c370f9a21a8a2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 378 zcmV-=0fqjFP))=S zC%W8~t@gZv_}6BlC12_T?3TmJRj<72*Je4r_H%UbR#@_FT_6zG99*b_$3VbbD{&qe2n?RCelF{r5}E*j;fj?2 diff --git a/dist/images/1x/icon/tree_solid_expand_1.png b/dist/images/1x/icon/tree_solid_expand_1.png deleted file mode 100644 index 0b28d5e7e67367ff4bdd1acdf4ece4dfa6b6a69e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 275 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&H|6fVg?3oVGw3ym^DWND9BhG zo%eHQe1qh|s~Xb_1m!ZtD;`!H@+=X!FMUp5SxM=6RrC?X$YRM$ R=YVcz@O1TaS?83{1OVz+UI_pI diff --git a/dist/images/1x/icon/tree_solid_expand_2.png b/dist/images/1x/icon/tree_solid_expand_2.png deleted file mode 100644 index e418819a2e4e16a3d4724b231f6321c4ab81072c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 328 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&H|6fVg?3oVGw3ym^DWND9BhG z^Zt;Ss1)zjmfz( zllukh9M6;s$}bx@ce796e(d|3zpyAI zd!NHzhs_h5ZG(8(-q||rYgj9~?F*A@v$KHS!k-&GH01&W9{yQ&dhhds|KAJj^a2_t z*M1HZ5EMPk6v4o~BF3RP$-rX?Y#vEMS`B@RBoQiN@iK0~gP{e|tHSsj7IwkG_BV4s4r$VnKt_pN?JM!i7wj z3epSY+SfST;&f4&^SebPGCS9C&yt-S+Lu@hzkWNRzoGDxb7}kavs_`buNK{Z-8H{s z-wTbOLL56Ze{cLe=bZTAMY|P*{w{27Di91?$t@yyuRui3N8nr^}h$ag#^(EuE%m`z|?Y?74sGLY=C0yr_P(cNMS95cFR6}kCSEZJ6fi+v?Rwk z%rs3X{bj5$@Be=d|BAa!TS{-_o_{>?m#5DahY)QA(dT>q&pQ9K%DA=e$}Vml>q88t u4_$98iB$+GI~1s*a9{eIzB16_cg*#5n!J?}3w(k8VeoYIb6Mw<&;$T5!ExFE diff --git a/dist/images/1x/icon/tree_solid_vertical_line_1.png b/dist/images/1x/icon/tree_solid_vertical_line_1.png deleted file mode 100644 index b80a5808f205d7e1f57e9644d0d9d54e80e4fd04..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 152 zcmeAS@N?(olHy`uVBq!ia0vp^0zj<5!3HFyJAa%3Qk(@Ik;M!Q+`=Ht$S`Y;1W=H% zILO_JVcj{Imp~3nx}&cn1H;CC?mvmFK)$Z0i(^OyFx-c!3SAONV5!PC{xWt~$(697RzByIoz diff --git a/dist/images/1x/icon/tree_solid_vertical_line_2.png b/dist/images/1x/icon/tree_solid_vertical_line_2.png deleted file mode 100644 index 894cfd1535dc5e3f98030728795835b0338878de..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 169 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&H|6fVg?3oVGw3ym^DWND9BhG zbP0l+XkKq~S8{ diff --git a/dist/images/1x/icon/tree_solid_vertical_line_3.png b/dist/images/1x/icon/tree_solid_vertical_line_3.png deleted file mode 100644 index 8a6914b6305975f05ac400f3dd3b257cf6dc3ad3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 180 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&H|6fVg?3oVGw3ym^DWND9BhG zSkYTQ?)toR)cvRM2w+>S?^2|w^^;i&leyO MPgg&ebxsLQ00;0bTmS$7 diff --git a/dist/images/1x/icon/tree_solid_vertical_line_4.png b/dist/images/1x/icon/tree_solid_vertical_line_4.png deleted file mode 100644 index 28d18d2a917702da8dd457de62bcf221438751f8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 171 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&H|6fVg?3oVGw3ym^DWND9BhG z)+59|4pWT&bstGbNyfG9`KEV6F6=*1fr>mdKI;Vst0N&jwP5=M^ diff --git a/dist/images/1x/icon/tree_vertical_line_3.png b/dist/images/1x/icon/tree_vertical_line_3.png deleted file mode 100644 index 4b8c500a807d1d42d85f97aaed455fb6f75de91a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 162 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjjKx9jP7LeL$-D$|Vmw_OLp*qs z6BHQF#O~VI$nrE{sn3!ug;3kGx(Zhvon!uHsPKQ}P&xMViHni4A=}|A2Xs98zU4D? z9{izTW@k9TCXnH#!y=O&8`mc+f@i&hXGI$vdQ@pLDO2bn!=5;)BeC-)y#U(7;OXk; Jvd$@?2>>(DH#z_S diff --git a/dist/images/1x/icon/tree_vertical_line_4.png b/dist/images/1x/icon/tree_vertical_line_4.png deleted file mode 100644 index 25be9ef045335f4f327aa5848beabdc0ca82d906..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 148 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjjKx9jP7LeL$-D$|{5)M8Lp*qs z6BHQF#O~VI$nrE{sn3!ug;3kGx(Zhvon!uHsPKQ}P&xMViHni4A=}|A2Xs98zU4D? r9{izTW@k9zkA?(q<3#}=(a6KdaQ3ut^1*yLko^pvu6{1-oD!M<6Z|f- diff --git a/dist/images/1x/icon/tree_vertical_line_5.png b/dist/images/1x/icon/tree_vertical_line_5.png deleted file mode 100644 index c9a5754ac0240d69b387e5b9e80a9c7baeb8b290..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 138 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjjKx9jP7LeL$-D$|Ts&PILp*qs z6BHQF#O~VI$nrE{sn3!uh0wn%SXrENOgh|}I}$hqLJoKYuuftM>h5}y@t;lQ?cy^R i1tfSIfy4#@1_lKSw$9(%*cSrLWAJqKb6Mw<&;$VQn<=^g diff --git a/dist/images/1x/icon/wave_loading.gif b/dist/images/1x/icon/wave_loading.gif deleted file mode 100644 index 1434622179ad6ced2f681c29314860038e5cad31..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5552 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 Bm=gd1 diff --git a/dist/images/2x/background/auto_color_disable.png b/dist/images/2x/background/auto_color_disable.png deleted file mode 100644 index b61713005f547496336ce18c53b766ae241839a4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1625 zcmV-f2B!ImP)Px*6G=otR9Fe^S8s?^RTRJX&D&Ys)pRRmU0rG1T~~K?twa?37euCzrczOT$PX11 z;-@}T_{D{ivLM(f=t~fS5kZNY6f7b^U&MkP_3gUO&JMJoC55@U>uk<@r{C|s_lD=} zd$U6y!wWO_+;h&o_uO;Ox##z^sE5ochptsoj1?ss zbYW<0n~3`fj9L@U)LIuopM`fuJw>m`ZBcp&yatac=*#l5u2Pdq>koRm+TX!EH{{RO z#~PF!%Dpb0^kK3cEO1_>QtvHZF!zU+mX@icMF*YSBU;oe@aC(~sWW<74=iY~pUY%2 zed>05_OEeDiB7CWJI-i(Nl72p*=5$z`iiaW?cLp( z->S_sx>1F|GoJ>$Y@JT+>F#d(HL6o94Py|0qwjhmZ*dNS{#-*^Z|~^nn69>l6$(wv z_}4@hj9Iv)nlXdU=pkIubsXa5aE)jWk9s}b9dBEfdXsz+wQ=f>d=}M-qm4m44Febo zHm}L|%;H;d6UcKMNo$c_?6OFC>PV6v`8{1LkHNU(q{UMQvd-96(n-x2 zKaiON#p&_NwgiH+)gHZYvZusc7f$=LdSHGZ4?>x^Zq;j}j<)n^ql>s39xgmYy0X!r z7BX25DutEfk&&wpB7JxG`s&2G=H^MbXTaB!Sq(~w6BvDe+5;NZ*4qenI-9x+iCw z7e1hJCh3W>iGlyTSwyf&1Hl#cJjjis4cMma9i7s>J*(S)iONZ5FXeWk+YJP{b9{V! zZY8c}MQ}^*dcLAstdo`V!?9&10t1slq(^WS3d_CtwF~KfCC(V?h3U_O-IyruD9;TD z_m2BMGZ7xXF~2dDSTA{Hihvw3GzqdUKzfEx8Su`dIMfQ#XkYr>%>OX`DS`g(sK(%M zem@TTq~U3OG?NhYl$(vs*8u=I892o*B0bVJzX-pvuNo9vdzX$OI$3%JrSEPw1Q=%t;i3d4OYWaMA z!QcP5TN`aXK&VP%#Pv?YJFUEdRGqzfP3MYi(tPsE264bQWMZmx4#urCLLfbYtE7ye zPEzAF(KCD+;9X!+>zRjFw|$eOAM)=qh)l;RG?&z!lUQh@Q3BEsS)42n)9(j&Mco*{%_)n=h&ZTc_4A6@$%ea{2`OAq`D X+kuA@0HN6200000NkvXXu0mjfWhW%6 diff --git a/dist/images/2x/background/auto_color_normal.png b/dist/images/2x/background/auto_color_normal.png deleted file mode 100644 index 2085e7c23f27822d6e152b81e966aef9d2872418..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1651 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 Y0Xpp2rkVV3bpQYW07*qoM6N<$f_KO89smFU diff --git a/dist/images/2x/icon/auto_no_square_normal.png b/dist/images/2x/icon/auto_no_square_normal.png deleted file mode 100644 index a2482a1494adbf3ce743ee1e1af6f83d4fa615e2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 707 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}E~ycoX}-P; zT0k}j17mw80}DtA5K93u0|WB{Mh0de%?J`(zyz07Sip>6gA}f5OZv>fz@+Qx;usRa z`8IUFw@jeGyqjlbSGYL7>1lOw5?JGM#mmKKL)bYMp+B|PUU7DvHIs5Fe(6-SsApWDFeyv>k({qw#{N>SlUgzx z)*DJiXN0zIQ??amP+XV)OViLU&Y6(jzZVNLq z7G3bTx8>)FGxK*aDn#f8sV(@!*K=&ztAjc@-T^FD#mwplj9&6H+g1M0GkYxd_{&Od zg-_0N&K%~K*8aGYFC$kybD&F_t$PWNLwDi zm(xU{K5U&M-*TbGzmJdR<<-jGud^1M|M%I7!p**W=Kee&kfR^Lc##k~IVs z1paPf+h3N=b0E0lchaQS*EDD9=k;sN(>TYljPd10wudf;SMPGQCaO+vmSZ``8MeRy d2pgK1rhhG3y(MU^VIe31dAjPx)9Z5t%R9FecS50VKRTMtw&7>KjHDF`u4_IgmL0!4A5sgp@idu=%O2K_5W{QiX zO=2R-ppr?3G+Ag;lM3!CM8#$!{(;blKc(1BskX(UVB1CGPtqVsXXYKxckjC|?@eYV zr3kr@++Wv2HjzENcqgLxc9}X~&Fv}`{5D_cc_My@ zL^j2EnQs!wIgja7qRyK+KGc6DhOcs2(|}Cx@co5CF(*WARb*5ItKgZsx@7-EzVGLX z1Oc$B0qM!fI{)IIBP4WKUzPwpGZpp!tnOd>#J?w*t^-~a+UAk$6rm@Twng_O;7VH} zrg5)n^UKeUgk(M&T z)EkD0>9oi72d0i4or_beiRAz&7g_#6U$GlFCjK~;qRczFfg9ztweGL<58k`9L=!@C z(8yu>mASsT+=!R~*6nj&+n2LGg0fSi{ckbr`zx$$_M7C~zh}0*oA0|;0j&-YPIu>C zSLUpSM&F{IXliVYhQo_81~E5ohw>9+18-JS4&hhlzyEfrP`ujFojVkjKV z)sPw;jzIU&0A#yOIO}%2JVLkXm_9Q6h`M(#5GC?6s|X?h<3$an0clbjT>(Bc0HtQK zT@wy5ul8~$m&t$0oz=UKBIe<}>;PGisbz#-k+8Zfkud;G#??8peXWF>o}Nx9{fjGl zB(b#2&#l~7pCA*mfq^dQ#Mu~7yd~P*)b(2DC^ejGt*?H((yBSI1vJVNl$N|uiw8K! zw!K8drd<^1q-5N$Y5kju7%?D{R(v0DuC}afo(0~v^e_pvx9dWO z!(MA;vmc~{*uIwKL$&5pLobvnE-XAR9ag7jtPVabXs>Gt_~YjF{jS3$JUV$| zbl{RE*#+?VWJ6g?MyNw|LbvBWsbF%wy_NtLvDwdj{=Jdc&VyD%XuP1k<5@JbTKrKR z&~0*{7DE)5?i*^*l6wX)jsM9I$DT1j6SF}s{ryA;zl}o@!^Exme+((UYPEQzAP4ld z^@fJ|r_SEtrhtC2DE^#&KN?AVZy= z*M{}qDn!5Ml~<-Gzm-Y$RmMi3B3obX$u&nH zv7_(PQx;%#8Ur+*GXby#-}4wpa4GnOLu#O<_q@&|CHF@Ev=Z7JpL)QSsRIOiAiD)u zjBeP?tplW@N@y}>l8Gde_=WvWP{NCpp92PaBAGO9#g&VtFrSc=kZBtjm#i+! z6dGWrR~;Y$)|VW_Bx6a`O~RM8g=!O{GspA&-#K{sKAG=3tNEn8o=ZAUU37Rm71_~D zWsFBB<QB6W!t+3-+=X#qXVC9;QC!UPCd5PoUo%|PwQPN+6Er*8X0aP zG9#Jlh^$rhx~@a1Gi+VQ^3aI&{9)pZz`kxj&7wx&j2RB2n^uT+yy`zr(N)pdT%DK8 lDZj5u!g7LY_y6nX`G2ogeysT~Jx~Au002ovPDHLkV1l(Jr@#OJ diff --git a/dist/images/2x/icon/auto_select.png b/dist/images/2x/icon/auto_select.png deleted file mode 100644 index 49423cac0919bd14571a9255a836b548e2934920..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1361 zcmV-X1+MyuP)Px)3rR#lR9FecSKVtIRTRHxcA8z~0R+lLBmLDYxZ7qe}evXwG6RK}1D1vVlG-C21S_DH9o3w~gEcFYEg0>H>U)^ms-QAhv`Q1BrcDk9_ zgd*fZa?d^AbM86ko+WjMt1!md#=p0=K-}$2Uzr-9%AKg9)e7w`Ep4m$jXtILAQA6k zR=KDwkt#FOf>Jcm;kc8tLz&A_dJ?>%1No8i1Kdz0RxHL>zev#}xoT+sSnm6FQi%>c z|2D7t_Rq>G5guUX6qJb4hWwk6D4b<-esdIG1>RS*nb^NiI3821dc|2+^AmZpkL|oC zd-RPFY%E&50d?SlZqE5=7DlRZ8668+VxBzoTc7T?WFm40zzuz5{1 zy*|x{rjFiqJ<1DsnFGeSnitx3%|JBXp;Z6OaPAt;t6jY(%Je10hVItd(SxbOwL^$Uv|zdW|#N*rB`Q@&JrMTCzlf#rLr zAMVN)qu1d?1Kt~^_Bcz@(ewyPmPb2)CS&Uy*}hW39r-|)2j#2~MZvB4wW>Ji8G(4nBi`jdooeXHu4I6+>R}CESIp}iIWLBzk z2>YI|!!M!#)o~cjN=eNW@jd`fT3WYmWZ+=^(K-ThMZ1g;pG^|B_`-Xfkx-ehW#@gD zJ3adbM)E@~0G^nH|pjBuREjQ(5V+YNx~6 zfDYJp?2`&1+uPeJU}dtO=;FDTa~HuY%5)S2dJ4^~oqW^=Z0jp%ClI9-PjaV(|4HB^ zgl8;`9LG4os`IzParqZ%$s^j)qE4t3en@hSex1bhiFo>$uNQU zyj29}YF){L!-n6X7gMg=9sP4C)o0~AZkRH)h+q$N_nIS3VAqq2OYTICYi~*|yBH<} z|At|T{tv=WbS;z5zB{$wbhIc(_lfc)3IBsZpBRkN0P8^|n65B40;j(S1EjP_jSwdW zTOXD^qf6W6ZXbbwOa>pu83)alqwG6+PL>}6&MxSLZk%Du4z1b&jg$dW8j6PoAvJ+X zCQKx+-Z)?tMa$3P?7q%*bXak&d(C`;E~8WBU<1Rdl?fdPrq?kLMBp$c8OtOo`?L7% zi$@pchH~dZd`QENJs-tNR2jpf#fHT_{? zoxr|kKh2^}0LBc5(GAlRh6$8wln1?Ca&7@#6^+f-d6Xv(UY3M$OmVpX>*x7@dy;K diff --git a/dist/images/2x/icon/auto_square_normal.png b/dist/images/2x/icon/auto_square_normal.png deleted file mode 100644 index 850bdbec28aada4c63a2a1307c1de05214bd04c2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 996 zcmVPx&o=HSORA@u(noVdEQ4q&xUaYo)tzZ$w_M+k!Uj3+|;K74}s0cj?YRPV_o_3?P z*?0&@UaCztiYPW4QSnv;KhTpPh+@^N2*rBQN~?k(exPl$Z)7)#G$M7=-L(nioi<_K zoBwZS-oDvnQ406$03k92)B;sB5bzx^CZnYA;c63KjI#xSK_yPs7uj?at0)0b)LjFZ zsjSs9FjJ8)`mJT4mI0R$_%9_SsfmMtP``b{GNZk{-E^tBWV-JFvdTLJ(M8)UqLS6M zvsDEksr)4ot;y@hSB9>wtQvrzdU_*JZeX%t#sXV1sqV*KLHJrilFBngB$bF|cqNuFY+7_NcJ!MU5WZzV4)X&-(A7fi4-!BQh}PysV=$Z6 zE>|=_P>nwXf~|Rxtcx*`69V)+5IiyT=;n$AIHDw$kAoO0h|SHdhn62>b4(KBBLq}u zBQac^Noj*_A$%zzNsV(Nh}ZxCw~cgkk994n@f$?2FAo5{nN+l^;sE;l`vdo%4!t3Q zC58ImZRpw^>pG|IJs5+d5g`aBfS*?5LEe#;$ejdPl4F8 zzX>Ct^#IgXJmd^rTRr0dQaG`Wgm^w3A%OsH>Pu=RO`p?sJln*Q$}bU7$f@JWc8GY{ z(6!)n=6V94D0;&;{5eWQP4*!L$cfR%sRdy(2|8Ig6TZ%8b&He9F#`l{9 z*9$f6_@SlrVTTYcSht}^PCF4HEAg-ZNaoK3d}O4xLi6Wj zcHYJ{KxcPi>BJbl1|S4LlQlH7X1FryM8e@?y$elq;$5-93(Trp(bwB$H-S!vYXB+C zPZet!5$_thw#%t=%T7}HO(L?JJpk;bUIuC5E061;%)JN1;%i1CZ*kS>fEvm z9qZX;nx@_C0pdtYW27|}L*aA{R{-*fo+dGFelA4s16#GAH4_R=ICXB>*$v*n&@cfk zwm#3P$L0$O?UU0rTme{4WR-^mPzS?6c)Gtf96ruB=S(<b%YZ>q(s^zTtI|Eh!vPZSQZu1LIe2#05 SJa<(900001r;P)Px$`$T2s)&n|)Xk~T-O0_t(GGqA{Q!cXlUu)l z*uhbp?JBs4lcOSZ&~{Oa*gt1p%FA8PyIk8#7R}IH^XL73$-N5%;J+8<-+;}Nb^&_5 zQ`dzufV<%DOa9Cnj6of2`{4F4^Fr~YfPiI)_#^0(ErX=i}3QxC!m^OuFsf&%_CPzDM(ML<&6j+{CIl?_Da)mwv$#$ zXcr)Od2O)tjU`7Zp;aIVr_Il2Ey$$gkweX*)+P`Ie{S_*|GW*&PksV~l#v9&-MwgW z@VAd}I7WySC>CtEsAOO<7p{>69xH%w%;MEK8>+j%C6dCG0xPqYfK&3!=d2+K9dM<< zQ?m~@k6j!i3rQ^JnfT7>Q=%chK9*jl*#}dFvC{e9{)BMEs$gdzVDI$PRfHfk<7-;rbQb1f944}e7`dLx{ zZ!G+5YlThF*(MmAMKPs-xT)|P3uCMX;B65NOkU&FjK}ufijv3t3lV+*jzG-LuUnKa P00000NkvXXu0mjf*E|R_ diff --git a/dist/images/2x/icon/check_box_disable.png b/dist/images/2x/icon/check_box_disable.png deleted file mode 100644 index 700bda33caeea45f07e132fa8e5175fcc1b1340a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 326 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^T<44y8IArYK! z!wvbG0(f!-dwUM0JUVqo)TW*Nqd?q|>oP7wPO?V8$cPxorDfxnm0HeES5Fi#f!f zYdP%udBHqgi1R4lzx93%CAB|H7@sv*Ch*N*hEj8xO}2kFId=JV#KIf-dd~tG>oOOJ z+gN2kZtzOcN%wg8X=g!AwqYRqpJh(c+-@7%4=4%V`2FN+&&KApE6ktyGuSXb+ZfC) UvOxC~Fkl!wUHx3vIVCg!0Dt#{CIA2c diff --git a/dist/images/2x/icon/check_box_disable2.png b/dist/images/2x/icon/check_box_disable2.png deleted file mode 100644 index d134520ccb400b5b4d2af85ccc00a384c80943aa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 547 zcmV+;0^I$HP)Px$-AP12R9Fe+m&;B9F%*VR2WCJaXfR%gh!`X+c?F-!hww#w4PSvZE=XGYJA(H;5h zy5H@Nq@Ds0=Cf$P&FgY9kDfz}DPVmG;VF~l%5yb`mslY8lD-N+Y`YxIx!1iEK;~y| zTZDGMRsgny9OrTcI6kbC=c#*cTt;pH?Xw1*939X_>(mO73joabYE`k~YGua?kvV{F zF8ACo7Wgiht<0k`GhuHspH63V|1hHYd|_0}3?Pj;h_(V$cFWZ3v?%b4#uZ>NtvPb7 z05HcbE|*KxX*Z1!F6LH%Qs4{oLSe}m@b`5HS92@CbQaR*_YY!JlMsN*!W_bz50+0p zKD`R_`hHFH_y9!j@|+m|UDeyR+pfpz&(=GDKtPNqUwTev<`CTqfFKhD#?jKQe3=~+ z0Kp~*S99pb+5rTj=@40%L(_T*5wP9>5r%VmA5S)Zy{_lj-V*~r?B(slrkQ9i(Get4 zjv2fH;Q!lW=D3GxUJ5`I4ervh6m%~IfQm&F4Y4HB2MG`EB^4Bas8o2x!aTYqZHr`} lbC1#t+FDiQtobJdegVD+#wOn4+nWFY002ovPDHLkV1fg}@cRG& diff --git a/dist/images/2x/icon/check_box_hover.png b/dist/images/2x/icon/check_box_hover.png deleted file mode 100644 index ebbec3fda9b3e52c7c1cd2bf57a3e435561bea3e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 327 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^T)VtxJ%lTK@v zDgAMX3{zSZBD8MK3C)LoobH|%eos6Ykl-s*t)katZScgYp!)X9Y^I`T9IS$7$4|L# zPx#{7FPXR9Fe^m$41PFc3xWAo2j|kk}zB&_YXxs2PDF7$G$h6)m)^zz#@s3=k0+ z|B!FFPXa=m8(-|x|93CVS>)fBrU3TG)3mCdJM}vA;wR}{*H}gGUj45XS=e&-?BiCS25}7tUh=O#1Y01sDM%U<8bS5ikNqzz9SFnA8q$O?cdgU0iNh( U@7f7_+W-In07*qoM6N<$f|5vw2><{9 diff --git a/dist/images/2x/icon/dark/auto_square_normal.png b/dist/images/2x/icon/dark/auto_square_normal.png deleted file mode 100644 index 1df5c88267ef42883cd5bd0983fdc0c5b8c43bdb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 980 zcmV;_11tQAP)Px&j!8s8RA@u(npC(7X`aPu|C*S%1 z&iO7UX)wji4McR6fI6X$8UhX?;y%<3o~t+Ur8qkfNh3pcMc|K?F;i3IYlvw1)LeFZ-~f7>?D(|j&fP6mR z`tj4~FcHiiFBSp5HR0S2Rh>Ut4T!)ppd0260&&xs`vCobSR|sDyO{TAihRAc0a)e< z5v&^%EcK$Gq5wKSCK{h7V)B}r1z^k!7f5hdU@_F%)Y(#)X?-t@<^iDD?w6XIqw%GS z`~5-$GKF-;PZH4)ck8^bsqz;4S~vI|0@^m#4`($s(pz%?L=@5)e+vK$U4YG+DnGEV zQ|atRA*@Gk|8QIhcOhcY4@A{7Fqz27;HC;ub%62H1VB2Ih=mW07pF6Rf{2d(IlXEE zU|=BM{kkq^)r!e9xU8S zNwk8nZDb&bs8%v&BLkI0D+t^FCj)i=u}8gsZu1MDbiXN$#{#wh0000Bl|uO53!x?cEiV-gx)F_xruy`}`x6_`wq6gC+uj zK*0DjY}iGB2LZuFMBCW`M0^JXZUlN-VFXkRS{>w>#!GB|ny<3S0PtYhHcUW**`p_1Kbo3>l~@Rxo!Q~|hk(~7 z^>NJEb4QJMq-b!WVE}LeqWe?#?I~7*bHZU4+tZ!NAi&ukiP99u9F3wwtL!Pyli&bu zJz~??-TptcD0w+2^krC`UL6?(ygq4QsnoEe!7la{C3_Y)4h+n)ol&3E4nVzJq7J** znzWrFz)fZ@Z1{zUen*YTu9WTB~H-lffR6;fw&V*I_rmjQ5t*N1t?!fVy-#VSjzKX+SLjwcu=TY%0_m zi^=^6c-?6i&u0?&EIlWpW-K$*J8c#3)ez7E&h|Y1pW7%J9z(<-XRWv|gTSaS_!R)w zn~h@mx^=jqL_jMz+nbr8)xkxH8``%9yLm&=1d0JqCx8gk&RVmzs1Otjt{4K3iX>bP zxMC72mEm&1;|dfi!$OVde}F4CB4(JY75@)#Rjrs0We=nJllxZ`YOhMAn*7eYfvRDY zP$52!g-CdC^SQQaAaX%sswD@DTHwSC5WJJpBO*AYIF9*;r9Cj{kpb)03=e_j;XSt= zps9H9?>C6#vxxBV*R0r}xR5Z39~Um}{BpYM73c&#D*=^NN44$-3EA(n=K%0~CF!i2 zHm#k@Rxj^T$|R;c&p%)#ma~+y=PP90j$GgwoiJBiOS+b)6DrxoBwLk|UCp$Voz}Ce f?uJ^8YB~QG;g^6v8tOMB00000NkvXXu0mjfQ4zkU diff --git a/dist/images/2x/icon/dark/trans_select.png b/dist/images/2x/icon/dark/trans_select.png deleted file mode 100755 index afaeecfa75bf051ab7568daa743cf495ab627c66..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 991 zcmV<510ei~P)Q+iZCT=YQ5VfdjA6!LqO5%xdud@y z++tje8AhYq%ZxGZ4@KiPk|AkleDHydEntioCJ{2$+rgl>zhh3Jgm$I(-m;|k@!sD( z-_JScch2wp5Q_X@k@dkAz|L+epDB$uN}$&WumK33PC0<^2Lg=->lTn#0SQ$Wya$uPnIDr$SQtNb6c^?3oF`GOpd8U1rfus`J}A{+b>g}A6nWn6uv zbduj2cNaW{NY;^*uL8hsBC6r{0^!R~-=3EdD0C3pV8U6aQ=b!rguFh^mX-AyblFzqs z5#Y*+C*E%O-s1y~M54<5RCYQZ0B8)x`Z(w8xzDfdDO5Z`bOit!2yx`4ZQo3ABzR9m z0`3E=oyh=5?RLYM;GC<9tKM$d)1Ifr0bs;|xV@>R|GtrokMf>CRjplJ9T@=61!G|@ zH6frq;&=BI683Cy42SizEmz0iWAVSZM5_~8MY>t70Bj5CFBp<8A>zqsKs#v1do%I0EpJf&jEFi^fiDjG zwaZIQboprv#XgY|I)$R_h#aa2TLrKxo=QW{J)cY_`-Onx5x@Jx3;=IP|A{2MT!JM} z4h70?Spl#k&i0yu_qQz4;!PCzbJVZBk_iyh|0Sa8@(r3c*nx2~0K4LBujM4U=4N#r z5vQU7ZBxMjg@|VX+>Qn`PeCatRNOQLRyN^!#7#G$SsAWZoB{HdVZKK6FvLw85fkQW z#ScT=QY%h{DC;m98r)Hquf3X;YWh3R29^$^6zTGDTq+j^ei`0Zi$o3SQ!Rb4SQX}V z-9#cB(tjX=U8ct||B#vkr(-uHVBPDJVff(BuSZG%wihbiABvvLL~ zQuf^GOg@`SJfjol%4<=_^3^~^yO?B0rD#_(J7s5gt);u6U88o^{|{WijX!>^*%<%; N002ovPDHLkV1j2j)#d;I diff --git a/dist/images/2x/icon/dark/tree_collapse_1.png b/dist/images/2x/icon/dark/tree_collapse_1.png deleted file mode 100644 index b3f555f807be88d8a824a60e6b776e72a604047c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 291 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpTC#^NA%Cx&(BWL^R}cRgJkLo!(3 zPIu&DGURbxU11VfV5pt{@EG%sFARBmTD8TQyUK&p1T(~sW;(4n7%p+?l3MOPea*>2 zyi5WO3@i!^j2wUT8(p(swLkuO_my$_->*ekcBe(kE!BVMuaC^+|1J?9b^TEO?r8DH z*BmQY?+ER%&(Hj|XLdBxJ@)B8R1{RIB1K-f#(fLj&n)yHdg;ou{ImDA7~K32eqxP7 z?~)1Y&(7YEe(s^DLZi=Fy;zYKO}4kM#I$aTaJ|0!*NL=;>nB7pzMeltV9Tu!ToH^9 i_!&7I7+~(QZRD4GE2cc}3a2U1qYR#|elF{r5}E*Ojc?5W diff --git a/dist/images/2x/icon/dark/tree_collapse_2.png b/dist/images/2x/icon/dark/tree_collapse_2.png deleted file mode 100644 index 4a78b939a0b44967c7ab402246b929a9895f3f15..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 351 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpTC#^NA%Cx&(BWL^T3SuhKV8T)5W*^Q4i%ee6`$fh2l+Jh2ohVhBXGO6BVx)T5o@=7_QxA zSFSHEVz+XRqCB(7=L5@Pvn3p6Tx&>^Td?(T;i2aaaAXH ke@ZNHSLnUfsL#T1=d2F%5+2S+zz}2bboFyt=akR{01e527XSbN diff --git a/dist/images/2x/icon/dark/tree_collapse_3.png b/dist/images/2x/icon/dark/tree_collapse_3.png deleted file mode 100644 index 3361b8a46681280e12126d04c25c1a3e73c1ed94..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 361 zcmV-v0ha!WP)Px$BS}O-RA>e5n867GF%U&pu>~9OY#E{;=*cd;Sb#?h@M0I96a>XGJllXpC=q_x z4Fr>nLm2oA%Vd(tWas@QVYg|NuE+DWaJN!=pSJH?MjI@kws2ISwgOzA1V})M08ipX zu)V}MAGY4?-ro6Rn7Jo3tqv5$dfc|!$Ya`D5DL!C*+y#KZRQvG-*=ilI5Etm~N_-oWbMrR&YQzopr07XfQhX4Qo diff --git a/dist/images/2x/icon/dark/tree_expand_1.png b/dist/images/2x/icon/dark/tree_expand_1.png deleted file mode 100644 index 484843f1ce0d202409c1cf82f16867c41dabb5d0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 273 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpTC#^NA%Cx&(BWL^R}r#)R9Lo!(3 zPT$CT$UwlA_f!VQ5|NcRn$(yBj2L{kc}!Ib64>1sw4@;M=6y@=h&?8KZ|j%u{;nHY z*2m8z(7?c=z`)4yN58T8)~~hoHCJYc{Qa=!^wu?%{hBB1BQHM@+kWQ#odErJm*(x+ zX|?hmqf~(I_G^zDOao2j`BofR^Y!NU17Rn=NNtbLd~+_`Q(h>%zNO4M!PUscVq4r^ zW)p$UJHFWQO;M9M-Op_3wDkMt_l7W$zTGaDthU!+`U Q4D=R*r>mdKI;Vst0QgyHrT_o{ diff --git a/dist/images/2x/icon/dark/tree_expand_2.png b/dist/images/2x/icon/dark/tree_expand_2.png deleted file mode 100644 index d44e15d4e244d39f56975838e18455e3abaa9732..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 324 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpTC#^NA%Cx&(BWL^R}|2$nBLo!&C z6C_v{D;h{Kp%6vR4HHAwr;Bg-qaMm{_-eV|3dNhc3dJ)!3~LNlCn{bqwBG(!Fnn3USI3TWaYJJ_C(c$M<e zXu*q%5)vyWwBNLrV%{)8LSxpOs)kGRM7G-4Jee%8m5J%FOn@|7xHX%zAuH2jLkGtP zy;-unjft{MiPx$2}wjjRA>cbV4xAWa__Y-2-C=TxUo!d)(~ZkdSIXA zjMl_N1}r0y>fp+<3tIleIaFj!olrxvTR_$i`HGB%+(6v9Z4bFxQS`ZcxuEb#T(HI~##Hg*F?0Nv^kWIVRz?dY_er_Qs>R}@oI!dCOktJZ_ z$YLNiOx=)ALKMdUdPt&&6tR3*h@z{v?oO^4-feyM6H0pFlTgJ2qQ>F1x7<)Gz91x0;8o6k-WD0;tDpX2h0iX9t$3a$yH_EaS-P|h=9W3ys&dn?b|cu`fd3@kQAS}0nVGE9j@{J?CNQ~<8WtZF8|J`z%M(icP{wg`IP6Ugv3{dm4SY_ zUl$uXycJNry62*Vg6WYJYv;YGVt6*eclWgeGgL0trAx@>(=|qH4mU6G;kY zK6fYhJBb`;sPb6UF0!#EqGQqO{#+Q^jR%gM?|i35%O^0tVs1&&Uv)uXyp^Ts0S95HNVU`njxgN@xNA6C-z4 diff --git a/dist/images/2x/icon/dark/tree_solid_collapse_1.png b/dist/images/2x/icon/dark/tree_solid_collapse_1.png deleted file mode 100644 index 1b39baa92f0a92eb68a61c7eb8c54f1132475973..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 394 zcmeAS@N?(olHy`uVBq!ia0vp^HXzKw1|+Ti+$;i8oCO|{#S9E$svykh8Km+7D9BhG zaCN;I-Y9GK(URAG3k{SK?hKl_thESxV7rps?+0h-Ccpr(J)@!Zah zr>7_B275*Ge$kUxebfKw$+ur7jn>lA**~Lh%sAOu{$T6WyZh(d2znW}i?!}@w_<^b z_T`R`>Ma8G72YOrfhvITcH@Q`X;8&hI#tRxhFp!So`U3b0uq> jRv72)?+Q#{ZxxgxWEaJV23OK1B4woz>O29GC(^)M_>UKFn&^kLa>w|zvoo$ z_mix&snzPM?f4HsL_|bHL_|czb5P*DufpXFw${$M9TFWwhlH(R$G6wL3EbI+vVpEu zC<`dj4!jB7?g>i5Q0ZQ(1wO)oVPI>an=V87Y)ggA=5FB=WX3LCx`PX>JrDoVK9q*z zwEv*0dUNfMFqdzKx1L|#o6GCE!Ni|_du^hPX&N~A82S7$a!>w&Qy8%hJVwH~!TV^v zyPNa+{`Mky6=xmzDsoS{bl0*E_`4zaf+5quk+F!unBB$dSmLx)I?lrx$V16vCfNhG z=Tc_#>=<_GRI#OE0tcm&)sA-H6?941B@}4}mZn``{J_oi>i_rqlW7HBPpv4s9=Xce z7}H7Ev5m-n3R^rc1vBAFt8@%pItDHs1DB40OUJ;aW8l*9Oe=%g_QK*DQkPMy1PqTi P00000NkvXXu0mjfLU7Tc diff --git a/dist/images/2x/icon/dark/tree_solid_collapse_3.png b/dist/images/2x/icon/dark/tree_solid_collapse_3.png deleted file mode 100644 index ff6c4f653b458cde8446d49fdf94f09b81b7877c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 509 zcmeAS@N?(olHy`uVBq!ia0vp^HXzKw1|+Ti+$;i8oCO|{#S9E$svykh8Km+7D9BhG zP} z2U-0ZSWF+VJ?Oj4++NTmyga}m$kA&7qf|kflJ%xA?VA(R%NL)t$$XNs+3S8;@cS;%6uZM)z-|NENs`#P#P;;Fo&Y7Z*8o!V6@Rl-F;knXF;)^XzskXhi83>aPmGX zXu%?tX*aZLp diff --git a/dist/images/2x/icon/dark/tree_solid_collapse_4.png b/dist/images/2x/icon/dark/tree_solid_collapse_4.png deleted file mode 100644 index fb8e354d394d08e2b2561203f26f209575fd6909..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 476 zcmeAS@N?(olHy`uVBq!ia0vp^HXzKw1|+Ti+$;i8oCO|{#S9E$svykh8Km+7D9BhG zPN1LC2U4FvuKldD^iB}qb|0vL_kh6XF?%AF_`}f}1y|d(n)~563FSn)1 zFKr2TxbLBn`QXIPjt6t@9_jP!JUppXrrr3%+)EkXD^mFHtnpTrPXE2ZlV5bU7T<#f zTQ1zV#Anm2Ctt?pI;*kvs^5Yg55y|}AKb#EKXDrW?Q%sY7YO+Boc*p`aLQEux+q{| OFnGH9xvXvu1gn;*CO^XW~ORN>#xHHMfY`$#>IhiEq9-cecZXpr1Z)|!6mLMul4oF?YKF; zX!Yh=iA&B;^F-M>jBZ8dMzY792;;Jzu6X*u%ItKbI|Zj}{wIVrPX9FZ&^Ox-u%8)f ZezMf5yZfAO-Fyrr;OXk;vd$@?2>>=xxuF06 diff --git a/dist/images/2x/icon/dark/tree_solid_expand_1.png b/dist/images/2x/icon/dark/tree_solid_expand_1.png deleted file mode 100644 index 05a11cd9c1f7cacd50a43ef01bed897d3f83b756..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 330 zcmeAS@N?(olHy`uVBq!ia0vp^HXzKw1|+Ti+$;i8oCO|{#S9E$svykh8Km+7D9BhG z=3< zWsl;@D>s@SJ$e2!zsdS~QOuLAy2qo`-aYXC`KHfE(|PIcEv)BF3|Y4KJ-8-#$LhPy zpJzLt#H?6uG(BEa#bk%Y>ixTJMQEK^Z~yYo(|dZqc;8>WAKU2EtbF`YfRFcDtRZGL=xRQ|V@6|A*tAcWDKeeB`v4e{44$rjF6*2Ung9`>s~rFU diff --git a/dist/images/2x/icon/dark/tree_solid_expand_3.png b/dist/images/2x/icon/dark/tree_solid_expand_3.png deleted file mode 100644 index 09e0ad07d5bbaf1b5ec611f63efaf928063e8784..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 466 zcmeAS@N?(olHy`uVBq!ia0vp^HXzKw1|+Ti+$;i8oCO|{#S9E$svykh8Km+7D9BhG zW6^H!X`GAB^NGE5H4We!60s6JYgzBYlZo|-nA#|FJ(Q-*m9|O&Xf1I z4$QK&mA`IvK`{D;fyNtIuIlzf_ZDs_hcRzjJj|5{xc+tCl*3c*y*_z3eDB0dmK z?GBSr`h0Zf{WZ^?t=|GQ|Kg=dl~3+CstGBkYq$g^KIHtF(R0UD(Tm%BVbR0$AC;PP zth9E%o+0J_diU(Chu61m`5^h}=a1)q=c}vFo3ZS%k%9Mj39yS3x8!vHn<^pn!FtA) zV^I|x(II8>Z4q3r-K`xy^F3abdE&{XjY9L5nPsV6)4IK7=kH6abzF9}_sgx5ME5Yz j@4I%)ymm7x;wQ^n+5Bf078!2kJnzd9POb*7j25=Ge2&=@&Z=#ABdu_MU;L&>1?fZf%x4T3)W7|S zI#Tk$XWa#3u5W$^?`ht!X02YH@LuH2+@`&+V?UU3B=wY+Rarc_HUDEu@jvPM`h{~d zITAbjm^gGS_Woe{xkPr-MArTbf~hU#I&Wq)XJ;H|P!cJ&p7aUIi_{K!H66`$L+NfJMrzLVIJ8MV7cp29qZOO=e(l z_}IjAL}LD>cdq-=6kDcN?V8>z6MfSE&b#$$J2v{F26s?rol1WVd3m$uxa_{=fapzWz=ReQi=`v@SY-S$2U@czNZv zj~eRt4jzB9qu|5-uY2aNzy9j`@3r4`&RPF(zPtA63DX@Li(^OytQ zKDIvYd(CIfW-$Ge=#KsV`Jegk`ku3#YgodVv>T@$@JdkKAQV9q_v*LC=Mni;VqbqV Y7%Q=EyH--<4YZiS)78&qol`;+0B8C|IRF3v diff --git a/dist/images/2x/icon/dark/tree_solid_vertical_line_2.png b/dist/images/2x/icon/dark/tree_solid_vertical_line_2.png deleted file mode 100644 index 22688bcaf3ff90b56ac82722169f9b45b50dd22d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 233 zcmeAS@N?(olHy`uVBq!ia0vp^HXzKw1|+Ti+$;i8oCO|{#S9E$svykh8Km+7D9BhG zE0+0J`zx%oEo-=AJT7*u;K{qODdJFTmK zKaKHCv){1woP3_5#oPxaO_w?S)G-+4J0A1}o|ZejWu&>rLkU{w4dYMEKsK zlje<|ZcnY*@`7iX@r-i`R?RQ5F$#o+1c=d#Wzp$X0a E0Q{6(lK=n! diff --git a/dist/images/2x/icon/dark/tree_solid_vertical_line_4.png b/dist/images/2x/icon/dark/tree_solid_vertical_line_4.png deleted file mode 100644 index 9af333f28cbe5891318189aad5d563be51866b15..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 215 zcmeAS@N?(olHy`uVBq!ia0vp^HXzKw1|+Ti+$;i8oCO|{#S9E$svykh8Km+7D9BhG z+Tg-h>f{mejHFEj>pxx^~m!Ekl267h= b{IJ<{hO@%s#?Al`&(qbDiF4+2WvD|`E4q>Bu6E=?43oHH<@G~;lShC)~6f*Z9 PP%DF{tDnm{r-UW|^}Zul diff --git a/dist/images/2x/icon/dark/tree_vertical_line_2.png b/dist/images/2x/icon/dark/tree_vertical_line_2.png deleted file mode 100644 index 0e43988fcee8e53c31f1e036b19b8a2e0e9e9ef6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 220 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpTC#^NA%Cx&(BWL^R}(>z@qLo!(3 zUOmX!Y9PSsu$5iw)VW-18R11ESwzLn>_wJc6Bo2oT;9Dxq?GL!J&bHk%it_By-%(?65n<;9lke9>bmd#L?%(U*$>O#MG})IKCK#%f69ea*eX z+T^)>YUq52Sv|d+e|9(67k=Pgv9EWRgTc!!n_dZfOx{=+@PK`lr0le*?TPzbP0l+XkKl8sHr diff --git a/dist/images/2x/icon/dark/tree_vertical_line_3.png b/dist/images/2x/icon/dark/tree_vertical_line_3.png deleted file mode 100644 index 54fd201534c9c4d2692325f64dc76ba851ea7270..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 243 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpTC#^NA%Cx&(BWL^R}Ydu{YLo!(3 z&N#@~U?AeW+ImMrdU#<}_{TR)dWv#UOO}gBojR`G(b{&RK9G4?iq*N-_wHX#iO+ey ziECFv!^MLW54>R6Vb7wFpyVLjo$!)TaEh-Rli3ytX9lKZ&I?DB{(D|AJ^jjF==Ls| z_{mlF@3+1>BpxZZ=l9g|1=c}4iVTfvOf{`8F%P?Y7>_K;-SmO;#)$-;#{I$zI*+O= h{7IjJ5Y-W?V0dysUn5Rk^g7Vt44$rjF6*2UngBr{T}uD} diff --git a/dist/images/2x/icon/dark/tree_vertical_line_4.png b/dist/images/2x/icon/dark/tree_vertical_line_4.png deleted file mode 100644 index 60f2c0a8cf9a1a52da71a2c4c2102e86afd58b3c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 212 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpTC#^NA%Cx&(BWL^R}eV#6kAsMW1 zZ*1gjFc4sHC}kJlP$s&(R5V+>fOBJj%GKo+O%;t39Om)w)R((d>Y04I|LH8xm-DwA z-u(N;G3F?7Kh~)51AkdKR5)K8ag3-{;Fv15j45-Akg&pqFb8$MU*8Yzc(vh^d(ymP zU*|5d*?&IkvEBU>@7kj|1r!__7#NvYIADx_ss&8D_++QeuRk~k=rRURS3j3^P6mglvWve^2+{vP4@(YS2> z?j_RvA4&_&5|{%H#B(q`DwICZVsL;>K|yXiqYnpj4g<1~|NR4PoMMa@&4sR4UitX) p3$M>NZdCivuQj#UE5hcO-X(i=}MX3yqDfvmM z3ZA)%>8U}fi7AzZCsS>JiZnf4978H@B_&9_YY;rPV#SId{W=#fUOd?0%e?f}j2CYY hKg@slft`VojY0n;565X0M{}Si22WQ%mvv4FO#uF4ELi{m diff --git a/dist/images/2x/icon/half_selected.png b/dist/images/2x/icon/half_selected.png deleted file mode 100644 index 7fe3379aa0b388ef41147cf18aa50078ccb4a070..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 368 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^TVg(qjD>=}g(K0XLBmAC1BeA!frb+Mv>6cdQLUenE9E-s|yR(NnXfV5+_)CM)uV*28ILOQJ-QbYUl!kkipZ{ K&t;ucLK6VB#)AX^ diff --git a/dist/images/2x/icon/half_selected_disable.png b/dist/images/2x/icon/half_selected_disable.png deleted file mode 100644 index 7157ac641f9f64f668f7b5e1ac614c0615b39bbe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 369 zcmV-%0gnEOP)Px$D@jB_R9Fe^SFsJkFcADlkOAnBXhVe*MxbQ{24Dn+V1z8d2(*j<5*4&abPN!R z$M5hTCygT#h!A$;H~+dj-;=}!`1gUX0msW_3=i56!5j!iZmw~Ra6^PW3~-&q@m26t zfF;l9Xvl|>{KRZT+#$k5MD&#;-}w*`cM!o!3N+s^$TtWn5iQVg8Mq}w_5|13&WjI_ zGpyZ^!RA=GOsoQ==WXwt31uj@^ZzOYNY$6;AfR{(Jk}phXY!Pk(zEGAAMsM6vIs2* z4g?2+1HpmL9jN^+sQYfOyz0Hn&K(E>3J1)&of~FPuinnRSD@H0E=ExS_R_$=WRPkh zuUi^&EN3|7;#lzWg705U)PelmjtTZ)Yh>AWh`3f}zM3(%b1P~E_vb;LhId+gT0rI1 P00000NkvXXu0mjf4HKS2 diff --git a/dist/images/2x/icon/icon_down_arrow.png b/dist/images/2x/icon/icon_down_arrow.png deleted file mode 100644 index 5285f739a88f7c4dd1e874f538b18cd5304be00a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 288 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz$r9IylHmNblJdl&R0hYC{G?O` z&)mfH)S%SFl*+=BsWw1Ghdf;zLn>}1B}lw%m>ARhzmegnf`YGg{PnY2lG9f{5EGn8lys;f8$ey zy-XslvKJayxMU_cOyyva+A^Q#^!H$0Rz}`ng~NM*W5B%S zZOk$q1r5x;-F{4|hihg{zguyN?bK(R)>LOEW?ROnn;Ygg-eXvsqhNi0^Mt#rQ&Vaf kw(Jl*rgmMXfq|LfuW&)a<9B`YfWBeyboFyt=akR{0F38syZ`_I diff --git a/dist/images/2x/icon/loading.gif b/dist/images/2x/icon/loading.gif deleted file mode 100644 index d04fdd21277e90469d8ef930254c69b23dc75bea..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1810 zcmZ?wbhEHblw*)%Sj58c|Ns9pXU@!=IWsLS4ajDI0mc8^ey$r5%(GQ`zk9!uLS~AsQn;zFfp39xYDT6>~zjAN>wn`Gt*5rFf&&$x70Hx^| z#0uTKVr7^KE~&-IMVSR9nfZANAQKal@=Hr>m4GgVcpix%w4} z1^R}12Ku?VAb){X7ncO3BAkI$b#X{#L8^XGYH@yPQF1C!xiU;MFzoPK1X2iejg@~< zCNNSGb6oP1OLJ56N<3X`m4GsODVZr&mKG+)X~yQ3x@jqC#=0iPX34siNr_3i=H^Cb zCP@a#$wr1IFmtf!H?=f&GO%zmHM2A~GcP;hnz$GU=sZ(?$09!O9V z6j2a=yQCInmZhe+73JqDfJ53U6N@W|3jv7!6mmmQALuB3P;x;^J}@C*nglW7nE}Xw zXQ$LWU>+(0W){Z(|Nj2@{p;tC@87({PcxqRv3h4bgmo;iK$# zu35cm<%;FYmM&SmXyJnS^XAT(J!|HS>C>i8nLKIYg#NzXp6;&Bj`p_Jmgc6$hWfhN zn(C^`it@73lH#Jmg8aPPob0U3jP$hBl;otug!s7FnCPg;i14t`kl>)e0DnJUA8#*D z4|g|L7iT9&2YWkP8*5;4GdD9eF*Y(Z(AU$|(bm$`P*+n`QC3n^ke8E{k(QE_5El~_ z5f%~@;OFDz;pXDxU}s}xVP*mrIf_47SUDJ27<53T5~#ppV9xf~b?2YKDbLk=!#I47 zKj2|7iBk@1Fw=XgG%tA7rum-^ZB$z`t2Ta9@5`f}tTHYWiYhO@RB2ox^5~80lHg@! z-92UD2O1vSn9!ujP?+#kb;;uA9#uSfyU%7=9IlIB{HP|cP@*xqHKwDptCJI9KMMmZ zgBXJ#(0(J2T{?#hoYY^}@J72%m$+rtm?TiUFvZPLYu|>gTANw!RK&Vl$o+Si_jYSA zL&rhaz$r-HU}a!u5M>Ym8l&SOvhbh4HnI6DHm_Qp`7}zSFXgAf84aE{3Jd0K+qNL{ zz6B?P<;KrDf~8G64T~QUcmM2)S?f@ zZU?2$_8Z&~YItoU*vByEhl1AQ3q>}jsz^R!2l_|==okiOeUDut2L*O{+)g%5`jW7>m>%!z643vChKE^Xx4=Em45eu~Q&^Bgg##KY#=uyS(sR=gpKMMC>(~HuZzg@ru69Sx24i;|*pgzv}adI52~O!5RRo Cf`a1! diff --git a/dist/images/2x/icon/push_down.png b/dist/images/2x/icon/push_down.png deleted file mode 100644 index 88ef8d5fba9cd2b26d5f0d34ba804c3f5821d0d3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 249 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc1|)ksWqE-VXMsm#F$05`DhM-r2B~}i3a<8a zaSX9I{r1X6-opw4tq=bPRE2qV-!brVJE0-jsbsd+y;EI*cj6qD*~VoPm98_*pYZOk zr&p))>4Jj4b``IZ_b`|rC_mS$>mmPGlH)+=yTczCbPTpGFh0XHnX%@Wj=-l@HJ%S@ z|1*rE4p}{SW8NSdd+6S-HLlk;tiN&Pf)ty=(u>-*XWSP~&4gRf@@t5t8HMCo*2s{ciQBFf{49vc;LD(+TQN*`wLE3UN*Y8 zL!R;alxe0*mvUA(C>vO<@OiVQFVdQ&MBb@ E0Ck;8k^lez diff --git a/dist/images/2x/icon/radio_active.png b/dist/images/2x/icon/radio_active.png deleted file mode 100644 index 60aadf28dc2c394cdb027acf9fb9e1d0a1e02ff0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 719 zcmV;=0xPx%iAh93R9Fe+S37SMF%X`)V-YAynurD(pn;Bul!PlHDq4aRD*gur2@*mgq2Pbe z01~04LMbi}iAP5opaBYWO`-_Ia%bkdTU&Ep@7hT&N|7nf_IPH#Z~Yk05gm8oy(~cM z>F%|j>D>{ZSwrR=8#)Vr!}NoRze{(u!Hw7L2V)T$wi?S3 zun$WWh&^ys^I9LX)mV;z4shswmaI^SBY-E>Dnl)n-xz(3i-1Ah4 z*=j6DK!UH<0U*iXp2q|>2?@zzIRdC;V!@GQ>PXl`6pN#=TqcCm^wRccX`)rnK~k~A z-`ZH5xC}hVP)=V5<5TOPsLG!2rO}6GJP2iJ7JCHeM}lG^)OUt*tLkv~)ao z2CNb_oD^yuJ04jpG5fK-fF%N`SWv@}lu@4T{)hdNjOYDo2mwn3phWG48g3*j(JxBF z^&qfHX8=koM_QI!5@?U?kBKIM{$czz^D&O!_&+I6`Ex94&a?mk002ovPDHLkV1mAb BOuqmC diff --git a/dist/images/2x/icon/radio_disable.png b/dist/images/2x/icon/radio_disable.png deleted file mode 100644 index 3cf082470ad9928f70f5379f183875b2ae9e6de8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 750 zcmVPx%s7XXYR9Fe+mpgA0Q4mJwdL4vK9wH7D&_H1UibSA5f&x*|M}msql9Jy-1rj|K zq5z2kf@DGD0-6K~;-EaR5%%t7j#sm`cO9^?S1vL|c5@%+`}RJ^A}2lEI0Nv$R=-&g zS&zKjbxtmd_zQ7=x8uER7o5C`M4sPRt-c$TJCcFTTK%DlJyww`qkz@imWbO}Tdh9* zSNp#j*!=Y6vV`p?-uv5tia}9I<2##oYDug4OFChvTkf2D zBf;FGwX2stcMFF6Io803kM(;#^3U|ED=OxfmKNQ@{Fxz$Y|-J-Pubr;@M=muNW&G} zgX`C-FS9LmoQ4%59)BGN1`M#; zS#Zob!#=Hm1rv6>qk7~418g;_Sa9Rcc@LR=g9S6Li8ZWMVt_-2ea==Jb+sF0lqXEs zXrN_%5(E0OP9gg|uQ0Z0p_3Tkc%^_tCa*BIX`z!C&~2h;yPkG>!sQjlHZ61#19q|4 z@tTK;9@{Rl0RwqR9?SGr(>DTche9rvyrRc;Uri%1pxa}cLT&1_xZE~CTukNQ?|rFEa*0Pl1y-)Pb*-- zjCrw!v9tL=t^S%@i!1c}xfN?S(evB)-ELw+il%wuoqkwq1hh(XI31=2nGDIqqyYmK zOxS5&#sC=$Ih;0ZlgZ%zf2M;z^o0QnW;z?9A~OXP5;ILoV+$fPP0P&$&zb!&={Lc9 g9zV^}8Yl1nKaW6ERs8yv=l}o!07*qoM6N<$f^~&glK=n! diff --git a/dist/images/2x/icon/radio_disable2.png b/dist/images/2x/icon/radio_disable2.png deleted file mode 100644 index a8b773ccccaaf8d2bac735b50b85aecd022a9c95..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 725 zcmV;`0xJE9P)Px%k4Z#9R9Fe+SIuh^K@@*4NmCK6wqC@7=pk(-U{om7gLv{T=*hpO$Nnw7RKdHa z;z2=BBLv&#pcK-2v3?@jG#TG-mzm5?W_H%3!9(9==Y9Y7?aZ6EL?@m2UkdQH)xKFG zy5CoHhnePy)TPv)_mrYeiRpQt=;@7m?M>0Rg#a{L?T3j zu3xKd`s}>`ki6eh&%|NM=QM(>TPpKCABZ6UY1t27jr-;$?|z4jG|6F(r`ZE&GNjb&jIF~|DrLGnf053fIqhgt_Q%g(wA=YaM@K!c-Uyj* z>1Jg<0Xm#92rTlF!v(-#6C*p90f6?J=ZLb0-rV+s4Q%ts&Se0|F_GRLCVcav6tlH+ z832Qe#h*rRIKMV4joa!=jK~6z4KiU)>G&1^-qS+g6GyEm#cg?C$1(t|CZ3!l~KX*^=@^r=D?I zu^hqeMtxyPgLLi!UX|mxp_QR0N*pV5$QPrUt;auSb)!~LVp;p+>|Mp{IgTQ(czh-WZlgIxBDKYc}l$Ik;00000NkvXX Hu0mjf5)E2~ diff --git a/dist/images/2x/icon/radio_hover.png b/dist/images/2x/icon/radio_hover.png deleted file mode 100644 index 5814caa36712dbabf75ba9f3a2ad4d261ed50263..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 789 zcmV+w1M2*VP)Px%&q+i$*3qoM~hI!|m%lYhJJ2}fmrtt2~?Y{SJ zZ*S+BXuAgwvH(-%Uk3vT&gz_LAsJ_(0_F=-jfuZ$cgbV##d2x)C*=Eyz62bZ_s@&S z9R-~12UN#YnR)j8O#WG~@&6TY_}=dW{I~u@h>ikCLBDEKVb6P+4Kl0QJv(d2H-7#p zG`!}71i@*&EUMUj$Se4Y?8sgEaAVhJTz88N1x(HR$D1V2NocPU*O=wj{)zmfg^S$m z24uMlPbKqZ)xRRbw^c|%Rs6^hpIe^EzqK*(wyS^^IlUo~95XFuGx^K!Zn7Vr*sFi+ zuH+j{|FH<2(WR?rh)#49(IEiKPWAdn_v8;xmd38nF$cW}yWO7?@m`hJ9_WKy#Y#{v zcPRNfyyQf@^AT9Lv7hCy#Rg16aVsW(G(6 zewzUIsS!5Zpzk~mn(PA$n8+K4jfn){kkRBMJ~ixi8<18DOkjha)BcffU_M5oN#D|5r%DC;D`iRVX@}J}nVJrK0!;S>FdQPZnb~EkPu#F4&kpS&4A>m3Y zx~WGDJLCdEBmhpvF&0r$(`I*=#gKHJYh8e|QB{};)bq3jv^+v+RH|{y7OemX^{AXh z3p0Uwj(!>eEMNl5I1IN<06d%;gcUd$m7zh+5}?RWhTqYH&S TNHE6B00000NkvXXu0mjf)? diff --git a/dist/images/2x/icon/radio_normal.png b/dist/images/2x/icon/radio_normal.png deleted file mode 100644 index f7eed28318676b455fdddcacc4b47321cb15b3c7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 753 zcmVPx%t4TybR9Fe+m(6PvK^Vs0=|fQ6-(V{yFu$jojMprPWRjGj3yXNOP8iQ_|392~Itwe21G z`D;r)ZGM-H&);OLwr%rfl~#hF|NiXsjjBzg{OKrQVd>da9LWipQK z7|=b#h?S4k4OxF1>RN4w$A1I`xjQ?3dpYgJR5-|^NWC(9eT*4TT`fzY5Tw1|F&9O# zEWfGP6*0B(yHL>A(?t9uz%F~VyT;5fl+MXS`C>kr-pPlsY6_K==)aQOj=m&_ z-E%|E%nwTr_C)!Tts5o;c9O460M$;xvF9v%Rsj~6V8hXh+a{p#sR;#l&^>PjO^(3= zlf2__&v*eGGA3E#Q={6m4lu!nqrqhj^z(9ey+%mYlY3CG3Q z3uxG=5HmqP&pNn53K=10+ux-20IC8TVyiXQ%mN=^wg9#MfA{?I}u!a_QRxA jL|sVsKh2UHNALf?m}6c&&*s4j00000NkvXXu0mjfXb@k& diff --git a/dist/images/2x/icon/slider_active.png b/dist/images/2x/icon/slider_active.png deleted file mode 100644 index cf361f74dab223ea79f7376c5716d26612c4eebd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 497 zcmVv{c$v+G)LB-^bRo3_=GIn}UN8vhccFrHx8dtf8*3yRaKB>Stq1`zl)-1HxY&* zxUOqjYA2|JjC%G+Y$%KzkH1#x!`aGyckA7 zOnojmTtQtx3#>CP7~Hngq+<*$YR=A)gIohrK{vG)*g>$U$3*cRav0s_`tsJMZj0j| zMv1Awc_&g?8k>@5hU+Qr%7O--XhFe94OLwo(v6%fAeQupDN8d%?PnB=|JRt<3-5}C n+R52S^UGz@!sZKLveurlOt?lU^}+QVhG9vD zV9*204fgd$_?kh4URW;BrWxV8h|l}NF_}~BDJz5k>$-w-ZaXWbKx++M*YRtUtOvm% z679*WG|JlH5cjid2lq@G$l89z6R2Ei|;;nacn`#WTe(R=`+^ejAbE$P`( nQw%3&(9}J%kedXNegX^t$`nNtX#aAi00000NkvXXu0mjf?zD88 diff --git a/dist/images/2x/icon/slider_normal.png b/dist/images/2x/icon/slider_normal.png deleted file mode 100644 index a81cf03879fdb60d1660d49c6d5b276301684704..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 410 zcmV;L0cHM)P)(b!!VFiLPQwH5dh~L-g`m_G)-dxzrN(3dQq3lg}(1^psU7le*KR8{mV2xMC$6+yDRo07*qoM6N<$ Eg2QpInE(I) diff --git a/dist/images/2x/icon/slider_normal_small.png b/dist/images/2x/icon/slider_normal_small.png deleted file mode 100644 index 7bd6fc789790cb7375507adc4f177c32d1140f21..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 233 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh1|;P@bT0xa&H|6fVg?3oArNM~bhqvgP;j=V zi(`n!`MHx0@*Y+YU@=$w^nR5^r&Y`(??O(!gL&+oT0aycXZvqB=TfMk{4ui3Zi516 zvDzeQ`CBHZ6RZKGyE&7-Z-Ih#YU{GQTZ7n``?HRl0EtQr6 zFIK_E@Bb$8u2`{j($hKbkLLG0uF&t|h}y(>Adfk8ugK}gA#dvI-Op#~z1}!EIyyYK dJ65@#(Qf|96MiM|Fl%*YF7%ImeensWfjJ`3x^Z^{ zXQz&8=5xrM4u^5C=5I*zQtUcb-v)L>c zRae(ZV{GcuRxmyXBcKSk_tAqbZzfLtRO-8u1O(jFk4C{fn+QoCeD5WbUyR$ynSUM( zeq2Anf1R9!T4xY4d+EWdQY4-s@I-c8m&ge?*tRmTCmM}vH{iL#Y;S*QiuuYRV_s9Q zs)s1C)Q?w+)A0;}=3wNQ|3@b69txB(Y` zYdX7^Ol32-NYTYqBKCHn0>Q|bW?o>-^3)IZeEp9d0k`1dueEFE9P@E@ToK(HO2+&Z z6Q~3{p8zSkn@Yq26{Vn3aQhTED8iY5+ZUlt8_pD52$XHZa)ao3fZGnDoJ1u?@$&$8 zG>UUoT67sDGQZ6#H(u>p)jF5mz|m#&f1YyJaV_-uvzd{F1T^&aJJZx1n37ZtVX9b;*7|BHJUx00000NkvXX Hu0mjfFu~J< diff --git a/dist/images/2x/icon/trans_select.png b/dist/images/2x/icon/trans_select.png deleted file mode 100755 index afaeecfa75bf051ab7568daa743cf495ab627c66..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 991 zcmV<510ei~P)Q+iZCT=YQ5VfdjA6!LqO5%xdud@y z++tje8AhYq%ZxGZ4@KiPk|AkleDHydEntioCJ{2$+rgl>zhh3Jgm$I(-m;|k@!sD( z-_JScch2wp5Q_X@k@dkAz|L+epDB$uN}$&WumK33PC0<^2Lg=->lTn#0SQ$Wya$uPnIDr$SQtNb6c^?3oF`GOpd8U1rfus`J}A{+b>g}A6nWn6uv zbduj2cNaW{NY;^*uL8hsBC6r{0^!R~-=3EdD0C3pV8U6aQ=b!rguFh^mX-AyblFzqs z5#Y*+C*E%O-s1y~M54<5RCYQZ0B8)x`Z(w8xzDfdDO5Z`bOit!2yx`4ZQo3ABzR9m z0`3E=oyh=5?RLYM;GC<9tKM$d)1Ifr0bs;|xV@>R|GtrokMf>CRjplJ9T@=61!G|@ zH6frq;&=BI683Cy42SizEmz0iWAVSZM5_~8MY>t70Bj5CFBp<8A>zqsKs#v1do%I0EpJf&jEFi^fiDjG zwaZIQboprv#XgY|I)$R_h#aa2TLrKxo=QW{J)cY_`-Onx5x@Jx3;=IP|A{2MT!JM} z4h70?Spl#k&i0yu_qQz4;!PCzbJVZBk_iyh|0Sa8@(r3c*nx2~0K4LBujM4U=4N#r z5vQU7ZBxMjg@|VX+>Qn`PeCatRNOQLRyN^!#7#G$SsAWZoB{HdVZKK6FvLw85fkQW z#ScT=QY%h{DC;m98r)Hquf3X;YWh3R29^$^6zTGDTq+j^ei`0Zi$o3SQ!Rb4SQX}V z-9#cB(tjX=U8ct||B#vkr(-uHVBPDJVff(BuSZG%wihbiABvvLL~ zQuf^GOg@`SJfjol%4<=_^3^~^yO?B0rD#_(J7s5gt);u6U88o^{|{WijX!>^*%<%; N002ovPDHLkV1j2j)#d;I diff --git a/dist/images/2x/icon/tree_collapse_1.png b/dist/images/2x/icon/tree_collapse_1.png deleted file mode 100644 index 2041a0e4b348d607b21d9e0724c07bcb88de05d0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 289 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpTC#^NA%Cx&(BWL^R}w>@1PLo!(3 zPIu&DGURbxT_Jb(WzrGl3f}WiOl_K8B;9%0Iwg|jmTTcGfvgXrZCkc@&i?LwYKcoT z1B(I!BZmV6(|_-Ti?e>^*6fR}eYWQQd$Y6YGau3y%t9hhoXn{560`l*hhkJ%qlBkcfX z%_rHP)!xi3u3+_02;S^1&blk%yqRhELY=USU)R}fiu|FyB<#R1byb$NW_y^z7=Ac2 iFbOn3-R0o_fZ1TRSl7{q_dS5#WbkzLb6Mw<&;$U&wQ~Ld diff --git a/dist/images/2x/icon/tree_collapse_2.png b/dist/images/2x/icon/tree_collapse_2.png deleted file mode 100644 index f2b989399c280e820fb9263ea055f2ee4fe5755d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 345 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpTC#^NA%Cx&(BWL^T3SuhKV8T=|zhX8c?%*U);z;o@RLg8)VT&C}mhF{Cjp zoWwT$&q810M7M^QJH5@#8YE6${FfkggpF~AMN7Lv;;XhAA*G#v8MC1o(kdG6knKyizeMMmLwqJ_! z%vbmXc2q7f<5^e66C)@pvDna|)j`HI$%LgXm7`~xlZ)Hy3HomCwhk#imwj#mjhfYZ fX2n65HU@@y`MN<-p|Wbguww9Z^>bP0l+XkKFHnL9 diff --git a/dist/images/2x/icon/tree_collapse_3.png b/dist/images/2x/icon/tree_collapse_3.png deleted file mode 100644 index 24eb8e827a8af155174485ce88ef67300c92ba0d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 351 zcmV-l0igbgP)Px$8A(JzRA>cbV4xA0yL4j%2-C=TxUo!d)(~ZkdSIXA zjMl_N1}r0y>fp+boV@rS&Y>d1#$2Cdw}7l4@)a2ixq)bHrbn(;6n#feT|(iL${F%8 zKr;{6`K2>}Fs%X2JV0xQ!^|J`04yX1iXM%DfeLw;y=2z|FarpcG`QpsZJG%)0!+h3 zFp{JF8;~Vn;>cnkHcZ`+PeLTOKVWSkLNzfgH+jLO>h2? zj{%D70bC(YsPw_5k5uuI8w0TNo751aw)!C-1Jn)>xOt=FLhzs%WsHWvXb22Q2#l6O xLr002s(H!7Xh*Y5xT002ovPDHLkV1hs9iTMBk diff --git a/dist/images/2x/icon/tree_collapse_4.png b/dist/images/2x/icon/tree_collapse_4.png deleted file mode 100644 index 242f034da4c42de73c91773d5d6af4451a115be9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 334 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpTC#^NA%Cx&(BWL^T<9G)(YAsMX6 z2@3>g>@G=W=D2*KV#h|Gf@=b)Jyi({l=Dp3*sR#x-pcbfUKCgm$kB7{hzpyJ^2ApU zPW8>%^F#jJLZ!pUV&m-dHzoG8t_;nVCZ0*kl(Qj}-D!Z#uCvzv2*2@3|%@IwF?I16=yjz~QG Q3Jf3yPgg&ebxsLQ0CUEC<^TWy diff --git a/dist/images/2x/icon/tree_expand_1.png b/dist/images/2x/icon/tree_expand_1.png deleted file mode 100644 index 9f5acc590e4681f037e502cba05e5ed81ef86738..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 271 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpTC#^NA%Cx&(BWL^R}Cp}#pLo!(3 zPT$CT$UwlA_ms_riAo)Uo7jvuvMIZGPAu6VpyA3TKJD+^%`Hd0AK&;_zN`BFq}1m> z6c`ve92l4c8V>vyvRJXU|MTm`$CkWU|2A@6>e*@^&wr<9scql!uILo+*GJ2qzCC-@ z^DEzlhOC`i<=EGBuKHQvpqjS!{66+=PI-T8e@{L3@aKdtiiKa@Gqy8_sW`VJzrJei zz--v<{r<5-=An&$ECiH8s_cKu-S|CeQ`VYa$|Lo!&C z6C_v{D;h{Kp%6vR4HHAw%Uf1{v|m}(5tyI6&VN(1!!skn1@a5X6ukOB{=$T22X&si>GP637ZG6Vb*H(-Es|g>@G=W=D2*KV#h|Gf@=b)Jyi({l=Dp3*sR#x-pcbfUKCgm$kB7{hzpyJ^2ApU zPW8>%^F#jJLZ!pUV&}D`&@n7i)stJ!yBq^Br z+@0X>q_W*UAy+Z$`Vr-Ax+YI1Us%C@!JED6GtjJiihX(aC-gIJ%1-jC4tk;JsaJpE zIKxgk^%eOgF&zm4y;>4rM`v>MOmlK!dp}|Q2{&7Z6ramJH-WllwVqjV(4~!mp>?Ca VlfIYCHekpwc)I$ztaD0e0stiifn)#x diff --git a/dist/images/2x/icon/tree_expand_4.png b/dist/images/2x/icon/tree_expand_4.png deleted file mode 100644 index e8df787d604b6fc16b102c94b6a30aa0f3fc56b8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 309 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpTC#^NA%Cx&(BWL^R}?>$`{Lo!&C z6BY>0*jpd#Vx^DCe25v01UXy_M%}yeP0BkfZ0?5f?Tc<%zEz zoa&pi=ZE~cg-VBy#mrCH-mpgglc*&3&c=+~W$x?3L~7mrW1SvOJ|+3d(BKtg(Be6_ zUb!bX+*0&fRk_&EA*&-W+VN9rQxcQ?LHS qafY38@>k8Jm=-GCoqt1?qyEXV?wqAMC)D z7h%81^P~K!e&_v*nf}6Vsj-47V-3$cHZ4o(+J5F-GE}G9C^FH(6Ri|3^G$5zyx!wg z2a!Y#>{7IVa_HD+*gz9)`t8rt!hsD$GV5DfC%iWocO91UWaJPeQ+B?a zw5%(PWvuiikua}>A=|)y;8x9`%=oaPJ4Vywie+G}ri+FHw*mR~{q>my4ny*fxp6G& luh9Y#5fKp)5fRaEyaO|=W)h}C9$f$c002ovPDHLkV1kzG+)V%g diff --git a/dist/images/2x/icon/tree_solid_collapse_2.png b/dist/images/2x/icon/tree_solid_collapse_2.png deleted file mode 100644 index 0796aaf5a4246e294d1efcc1c6471cfa18f0050b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 581 zcmeAS@N?(olHy`uVBq!ia0vp^HXzKw1|+Ti+$;i8oCO|{#S9E$svykh8Km+7D9BhG zS2B9S#s-|4>}zeblu;ScJW> zyL?D7X(3ts7!iN1Pt!~KHz28E-J*1KLjOL8p`Tc|oqrZ{M+$=YSA-Gwotg%$xP4n+|0S}|k7?ASt)r)CEg`0sLWudC(fOm%EF&~aisv+#l3 zp8wK~w^y*Wm@g2%RJ0+I$@dEz-yySktJD{qd~(Oi3+|V=PT#xjc-_%`25=NHs!)4P4lgWPTlo3~TSwx3dc!LO@#=6lTyH|EtcAq;=|iti^Lj-R?PX+v+^G4-?q z6Rs>@%E8w@@xATsxzo;b9dG~L8D5yiymWlequkQ6U(!J@&G<(^U^UXpB&ns^VTEnn$ z*A7?5Njv}7*x}ClZ}IKj?2q_)I(2Mv)Ejfrk?C3yp0}|xYMGQhYTM1X9clo^I)kUH KpUXO@geCw(e=1S57cKk%HiC`zqOG8fr60gTu~!hWP)i%_Y*Ykm z5hACTapy!NXEYZwd(m-zA-T)4A@^f%XXoY)pkR(q&WPX8AxiMYFk$VOuy#yXJ0`3h z6V{FiYsZAO^W}ugAVB5sK;)=0ny2sj)=s+Z`ZG8SEs$Wm9bX)rLYp86kRCk39E5}X zYo&U*w*qYDz`5^Y{ zch#%iqf8UdOie6Lj;$?2KB%Yrf5X8HD(ouY6X#l8+p}zXR3%#EtT6*O{DwdjzAR;6 zIm~=-*l%@hV{U1F`lIF28L&3~stGV6!bRREqy+@3TZa>RxPgEK6|SD|XXhfMbJjhb z<}BN&Pe^Q8(vAs-#<>~?C4#pja!?9imToWhI4TEQXPaTEWxH@$Mv6NuA=fKG5Lsbg za7$}YVt84kKB3}jili{5)y3uoH+<=z2ZYx8zmJG87s-7gK38A9>ftTt#*iQK|FHv~ z5qtEoU`$v$CafJ3){Y5l$AqS2CI|Yice<(X7^xyCJ`5flowYQmAd8k1p;eMRMGC zUmniCke%^Yc-_x$f=NyZ0&zA@Qg0Oho(PTWvh3(w+Fl>P$??8H_|m4jNEWp{jinKN zaTyZxW7}V)C%kjscEHGccV8t>xtZ0@Z7i$G68o6%-~Vv`(fK`lB{KL|PkbWrWoA#} z^^;4EYMO3*r8zZ2YWWl%n%pndz9l+N7HOe>&CC;T&rP1J8( z-Z$P9S{pyj?v$&sc64;Q^~ANQG0SugFYV$q`RbK$L^?wJ&LJrgX<4z%&Xqf)9`X1j zmQLLGAgq0VoxR<(1Is+taeqt@eEDCaLBNSau?0l9nD1jeQ(1HV&AJsgfRWDN>FVdQ I&MBb@0EMjh>Hq)$ diff --git a/dist/images/2x/icon/tree_solid_collapse_5.png b/dist/images/2x/icon/tree_solid_collapse_5.png deleted file mode 100644 index 0cb0d5d73e5667cb3e0d242d5639847119d3351e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 538 zcmV+#0_FXQP))%V zPYRN-Oa*dB;%nH?{}K3$)JXW2G_kD2nX~gE@B<$H6E{OsUbex-!1KJmrK+iSzMU!dNZ8{HXc=oqPDTmu*tv5Nip80PqPCv zEQ{THDcUC?xoE#lwev5M(n4_JJA!1*Ii*{dFj+vxw9S-H~nH+K&xN(1- zo{N;sS<`yVZP;$dxP)bC*defM#zeL#3H@A=of`PE^ir?ds_bl??FFxvS=qLXmL})e z_A5z|Zs54#mh_<1#9>*MmAc6Z&A^g$7Zn?BE&T2Gvr`Fdo8%vTV^<`;Muh+X00000 c008>&4z3q)YB`pHK>z>%07*qoM6N<$f{0z?EC2ui diff --git a/dist/images/2x/icon/tree_solid_expand_1.png b/dist/images/2x/icon/tree_solid_expand_1.png deleted file mode 100644 index d607d042cb500a690fb9e0ac170ac60f5f6d7383..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 392 zcmeAS@N?(olHy`uVBq!ia0vp^HXzKw1|+Ti+$;i8oCO|{#S9E$svykh8Km+7D9BhG zL~8Bp-dLB`@O z+aC$eCg}q8cZdH*2ox@eZR8FpWcCYM_44apjTOqhw$rCw|J=N-0|MS!~+0{|8H6d4iF>PyTO(hiuDl ze0%weNhP{kea61BpNAH+hDR84>CJ8OUjE?HM0uOKtZn`7rLnn53%>o#YEoEuu(a9G z;JCxQIBSkgZ-Q^t|MV08#eeu&y2Ogl+r?S9c=P1*4y`--|5EPC60j-m`*oj2wxwoG zeY#i3<<0|>9bctIe7j8T71o}#P22GOwNhch?}Ynx^@UR&*i5Q_cP!9GHkk+F6~T%7 aE7*4@+RbXvoP8b`a15TVelF{r5}E*$?VL3L diff --git a/dist/images/2x/icon/tree_solid_expand_2.png b/dist/images/2x/icon/tree_solid_expand_2.png deleted file mode 100644 index bde83809a8885f906cbea4dd412c82246007e398..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 476 zcmeAS@N?(olHy`uVBq!ia0vp^HXzKw1|+Ti+$;i8oCO|{#S9E$svykh8Km+7D9BhG zosh9==aW^*(scN#}^3 zS=qmkrUd<{3P!W0&?ml$d)6t=%mGFj)MYc^emGfo&0_v z%`+k*?vT-Db_FE}_{_p}>FC*_N0($>u1x%v`upiOLFHMEO*&x#jyC7+E6-6^-f`UY z!4tk&M{YNwLjEv z(j^_PtbMVjzv?DEKK%F9!MwFyHFsW}`gFkFIICdNBEFKq37?NMDRoNCaqgJB?>+N+ z>-DiAe*S%K_l_Rro%T+S>(!3)grYlb(h*rJaoytcUfi#fSkoNph)s=s0Ud^_3S10#dM M)78&qol`;+0KEy#V z&oAGy^r_Qt)uq0ETs=1qKi*szK4nQ0=i-BxGB=b+>C9#GUJhm6J;LhW=(uA?B(Kko zx#@3zrdscvAGbnwaYM_l@VnP{tMhaoP^kUfV)e)H+ohiSd9x&hPK&)W7Ua3xEIgC9 zdNZ5ao`Yu7lC}TLh`r_X+_-SQ^R|S))28_~FTI@bvgG=tV2kk8Y>ugHtViEp4}7L+ zWpyL_&HF7-j65m|E2B>@`UHlJ0563$h{ke`Hazq@L`m3A4kS1oJn@?pSK9VP-b% zjMe1=)1#6(mtH=)&uso`{rTpAoWJiQn(j`x!}q9oZK=EMyL)e?mF<(`7x(`6_+Mp_ ngc2fUKE diff --git a/dist/images/2x/icon/tree_solid_expand_4.png b/dist/images/2x/icon/tree_solid_expand_4.png deleted file mode 100644 index 9738216c4ec76563bfdc3139ead529ad8c7361f2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 477 zcmeAS@N?(olHy`uVBq!ia0vp^HXzKw1|+Ti+$;i8oCO|{#S9E$svykh8Km+7D9BhG zosh9_DY_l%RYgaz*Qn zqsPw8*HXCAEf&|%n~+?k@8BVII;NpDA>ZMMQ}C^f^u>>OZ>YGKKR(l?;oTMct*34B zdrnV}h)H{VPVlK8kl($#e#^hE`k;d|5;v6bT&@9S^ZAX-pUbN3EyJx{7&~9af0>^z7ci-@;mcv^D}sHc)6>2`UDY|sCG1E0+XJ(r zJ&elE-d*F+k+Y$DYD8=PWp3#gd)5C{YlxkR&jcDQ+r0JhwV)uI;MHz{sa&k3@%q*? zm!CO!&o8-r^;HMEvdYZD7fEcqeMvidKQplYw7-=m=yBnJOwF8=HgZ*WJYTP=tJz|o zRsE93_=cNf=idrv2gl~!{?}!DB<4-qk__^P-=8f{jvED4Elc{dN2n>K`R)PTxsIKM z8;`By;tda;bkJg)K5Bz5r zeq!)m6#Xuf*)69zHs@neHKQ`O_HK!N)BhbY=Jxw=-oT=ar%$#yIlbob$M9`CE_+^1 zk>eFzZ~pU$dr?)*4eML)zX$ZMTff%tuW>Wma!IxW61*#`brdHoIB5FAVrGT?*Xrqi zSHJst)ARN29UBfB**Q2bt=prxV8Owomt*@R51$TtBOznWcKqC*O;6G#wVgeWyq{{2 zBK?MKdseg2<0Mz}-fK^~Qa6OXUi9$6H`ltqb=7JI>s0>V>vaw+?_unKf>%FSOmBO9 Ul4QCZ0SsaWPgg&ebxsLQ02NNRrT_o{ diff --git a/dist/images/2x/icon/tree_solid_vertical_line_1.png b/dist/images/2x/icon/tree_solid_vertical_line_1.png deleted file mode 100644 index 2b1a23d9bcd24ea2933a1f81bcb5ea706c18338b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 178 zcmeAS@N?(olHy`uVBq!ia0vp^3P9|@!3HF&`%2dVDb50q$YKTtF;x&|^bAt@02E{_ z4sv&5Sa(k5C6L3C?&#~tz_78O`%fY(knis4;uuoF`1agFUIqmLmV?}X#oHY&^0bIm rd`vTov_F|%{Pwfo#);2>O7Q``(nR)3Z}SHiK#DwF{an^LB{Ts5ka{S+ diff --git a/dist/images/2x/icon/tree_solid_vertical_line_2.png b/dist/images/2x/icon/tree_solid_vertical_line_2.png deleted file mode 100644 index 56c00c080dc4ff7cc0a84eabf2f6a76e74ec8c13..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 233 zcmeAS@N?(olHy`uVBq!ia0vp^HXzKw1|+Ti+$;i8oCO|{#S9E$svykh8Km+7D9BhG zsc#$UZzdH3yJsg$)RIsDWu<~}HCy3C1%u{|Vx?mw@$H@4q5Tpld} eG#&^Zd}jF2z+>hRr0ELcdb;|#taD0eg3$o(c1ME% diff --git a/dist/images/2x/icon/tree_vertical_line_1.png b/dist/images/2x/icon/tree_vertical_line_1.png deleted file mode 100644 index c6b8e799ccf120e0727955320af94aa020ee7e71..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 216 zcmeAS@N?(olHy`uVBq!ia0vp^8bEBr!3HEncK&z(q&N#aB8wRq#8g3;(KATp15l8$ zILO_JVcj{Imp~3nx}&cn1H;CC?mvmFKz^>Li(^Oy5WBTpjr4 zLBfL_4{UGbG;2QS-*}_c{(b%C|Hp64IpCF`xzpCaLmkk4J&gr0=OZM_n5j7@1f&1QZ;g zj2%u7rhdKj(!75A-s9&tL~lQz{dRxp`&}3J3P!Z{Pnmrw*qd|Cqs=o9^s@RaOxSU^ zKaib6ZEo1LTBb}RDdCD;4fcf}xL?%uSUDKH+_LGNu*c+!78)BEYE`AqsC=v61#}>T Mr>mdKI;Vst09Kb$p#T5? diff --git a/dist/images/2x/icon/tree_vertical_line_3.png b/dist/images/2x/icon/tree_vertical_line_3.png deleted file mode 100644 index 878ea613b4877aaded5480f29bc913cda3aeb7d7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 241 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpTC#^NA%Cx&(BWL^R}t36#DLo!(3 z&N#@~U?AeWn%k4$jWe@@oV_)%)q3^WU`TCnw)^+%@mac=Wat51%v4fzB-@cU1GPd`Kw&`Ci>s3 zEx%LOhl}q!aq7Y0^?R5PPfX%qw=&y1UJVS4Oe`D%3Jx&F2mMCob>F4VtUAbgALuRyPgg&ebxsLQ072MD AbN~PV diff --git a/dist/images/2x/icon/tree_vertical_line_5.png b/dist/images/2x/icon/tree_vertical_line_5.png deleted file mode 100644 index 3c3c9c8fe9f15474fc9b0b088a266cae62d3865b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 213 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpTC#^NA%Cx&(BWL^R}{hlt4AsMW1 zZ*1f|pdjKJIGNSh;grrJrD>7}c$<6YUVW-;f2TpA@qg3vrJJTKSiW~}pQwm^^7)s$U+sr*!X-laCGdOSn+Okpa1gw ngon?wSw#XI7*UDF`P?o`T8Sk|2YI*q~8)z4*}Q$iB}XMRWC diff --git a/dist/images/2x/icon/wave_loading.gif b/dist/images/2x/icon/wave_loading.gif deleted file mode 100644 index 932045e8b1ed5aca04812084696c28ea5ef1ea3e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10956 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 diff --git a/examples/ThemeProvider.html b/examples/ThemeProvider.html deleted file mode 100644 index 7848ee406..000000000 --- a/examples/ThemeProvider.html +++ /dev/null @@ -1,99 +0,0 @@ - - - - - - - - - - -

- - - diff --git a/examples/config-render.html b/examples/config-render.html deleted file mode 100644 index 41545d3b4..000000000 --- a/examples/config-render.html +++ /dev/null @@ -1,76 +0,0 @@ - - - - - - - - - -
- - - diff --git a/examples/demo.worker.js b/examples/demo.worker.js deleted file mode 100644 index dae3c723a..000000000 --- a/examples/demo.worker.js +++ /dev/null @@ -1,29 +0,0 @@ -if (this.importScripts) { - importScripts("https://fanruan.design/fineui/fineui_without_jquery_polyfill.js"); - BI.useInWorker(); -} -var Model = BI.inherit(Fix.Model, { - state: function () { - return { - count: 0 - }; - }, - - computed: { - name: function () { - return this.getText(this.model.count); - } - }, - - actions: { - addCount: function () { - this.model.count += 1; - } - }, - - getText (count) { - return "被点击了" + count + "次"; - } -}); - -BI.model("demo.model", Model); diff --git a/examples/dev.html b/examples/dev.html deleted file mode 100644 index 167c18ac5..000000000 --- a/examples/dev.html +++ /dev/null @@ -1,97 +0,0 @@ - - - - - - - - - -
- - - diff --git a/examples/effect.html b/examples/effect.html deleted file mode 100644 index 34bae9199..000000000 --- a/examples/effect.html +++ /dev/null @@ -1,59 +0,0 @@ - - - - - - - - - -
- - - diff --git a/examples/hooks.html b/examples/hooks.html deleted file mode 100644 index c9302a0d5..000000000 --- a/examples/hooks.html +++ /dev/null @@ -1,215 +0,0 @@ - - - - - - - - - -
- - - diff --git a/examples/loader-context.html b/examples/loader-context.html deleted file mode 100644 index a8ba36a96..000000000 --- a/examples/loader-context.html +++ /dev/null @@ -1,126 +0,0 @@ - - - - - - - - - -
- - - diff --git a/examples/resize.html b/examples/resize.html deleted file mode 100644 index dda9edda3..000000000 --- a/examples/resize.html +++ /dev/null @@ -1,75 +0,0 @@ - - - - - - - - - -
- - - diff --git a/examples/style.html b/examples/style.html deleted file mode 100644 index 339f14365..000000000 --- a/examples/style.html +++ /dev/null @@ -1,68 +0,0 @@ - - - - - - - - - -
- - - diff --git a/examples/tab-context.html b/examples/tab-context.html deleted file mode 100644 index 6a0a2d130..000000000 --- a/examples/tab-context.html +++ /dev/null @@ -1,127 +0,0 @@ - - - - - - - - - -
- - - diff --git a/examples/test-id.html b/examples/test-id.html deleted file mode 100644 index 7eec9e549..000000000 --- a/examples/test-id.html +++ /dev/null @@ -1,127 +0,0 @@ - - - - - - - - - -
- - - - diff --git a/examples/useContext.html b/examples/useContext.html deleted file mode 100644 index 4092713e9..000000000 --- a/examples/useContext.html +++ /dev/null @@ -1,198 +0,0 @@ - - - - - - - - - - - -
- - - diff --git a/examples/virtual-group.html b/examples/virtual-group.html deleted file mode 100644 index a21a37fe6..000000000 --- a/examples/virtual-group.html +++ /dev/null @@ -1,91 +0,0 @@ - - - - - - - - - -
- - - diff --git a/examples/visible.html b/examples/visible.html deleted file mode 100644 index 790d091c1..000000000 --- a/examples/visible.html +++ /dev/null @@ -1,222 +0,0 @@ - - - - - - - - - -
- - - diff --git a/examples/worker.html b/examples/worker.html deleted file mode 100644 index 759f0eac4..000000000 --- a/examples/worker.html +++ /dev/null @@ -1,57 +0,0 @@ - - - - - - - - - - -
- - - diff --git a/examples/worker_new.html b/examples/worker_new.html deleted file mode 100644 index 53e83c4ee..000000000 --- a/examples/worker_new.html +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - Document - - - - -
- - - \ No newline at end of file diff --git a/examples/worker_new/index.js b/examples/worker_new/index.js deleted file mode 100644 index b95fbbad6..000000000 --- a/examples/worker_new/index.js +++ /dev/null @@ -1,105 +0,0 @@ -document.cookie = "test=demo"; - -// worker获取主线程资源 -var CookieAction = BI.inherit(BI.Workers.WorkerBaseAction, { - addActionHandler: function() { - this.controller.addActionHandler("Cookie", this.getCookie.bind(this)); - }, - - getCookie: function() { - return document.cookie; - } -}); - -// 调用worker计算 -var FibonacciAction = BI.inherit(BI.Workers.WorkerBaseAction, { - addActionHandler: function() {}, - - getResult: function(times) { - return this.controller.requestPromise("Fibonacci", { times: times }) - .then(function(v) { - console.log(v); - }); - } -}); - -// 主线程与worker多次交互 -const HeartBeatCheckAction = BI.inherit(BI.Workers.WorkerBaseAction, { - addActionHandler: function() { - this.controller.addActionHandler("HeartBeatChecked", this.recieveHeartBeatChecked.bind(this)); - }, - - recieveHeartBeatChecked: function (payload) { - console.log("heartbeat: " + payload.time); - }, - - startHeatBeatCheck: function() { - return this.controller.request("HeartBeatCheckStart"); - }, - - stopHeatBeatCheck: function() { - return this.controller.request("HeartBeatCheckStop"); - } -}); - -var MainThreadWorker = BI.inherit(BI.Workers.MainThreadWorker, { - initActions: function() { - this.cookieAction = this.createAction(CookieAction); - - this.fibonacciAction = this.createAction(FibonacciAction); - - this.heartBeatCheckAction = this.createAction(HeartBeatCheckAction); - }, - - calculateFibonacci: function(times) { - this.fibonacciAction.getResult(times); - }, - - startHeatBeatCheck: function() { - this.heartBeatCheckAction.startHeatBeatCheck(); - }, - - stopHeatBeatCheck: function() { - this.heartBeatCheckAction.stopHeatBeatCheck(); - } -}); - -var mainThreadWorker = BI.Workers.createWorker(MainThreadWorker, { - workerUrl: "./worker_new/worker.js", - workerName: "demo" -}); - -BI.createWidget({ - type: "bi.vertical", - element: "#wrapper", - vgap: 10, - hgap: 10, - items: [ - { - type: "bi.button", - text: "点击计算斐波那契数列第40项", - width: 200, - handler: function() { - console.log("click"); - - mainThreadWorker.calculateFibonacci(40); - } - }, - { - type: "bi.button", - text: "开始心跳", - width: 200, - handler: function() { - mainThreadWorker.startHeatBeatCheck(); - } - }, - { - type: "bi.button", - text: "停止心跳", - width: 200, - handler: function() { - mainThreadWorker.stopHeatBeatCheck(); - } - } - ] -}); diff --git a/examples/worker_new/worker.js b/examples/worker_new/worker.js deleted file mode 100644 index 96e88e542..000000000 --- a/examples/worker_new/worker.js +++ /dev/null @@ -1,80 +0,0 @@ -self.importScripts("https://fanruan.design/fineui/fineui_without_jquery_polyfill.js"); - -var CookieAction = BI.inherit(BI.Workers.WorkerBaseAction, { - addActionHandler: function() {}, - - getCookie: function() { - return this.controller.requestPromise("Cookie"); - } -}); - -function fibonacci(n) { - if (n === 1 || n === 2) { - return 1; - } - - return fibonacci(n - 2) + fibonacci(n - 1); -} - -var FibonacciAction = BI.inherit(BI.Workers.WorkerBaseAction, { - addActionHandler: function() { - this.controller.addActionHandler("Fibonacci", this.getResult.bind(this)); - }, - - getResult: function(payload) { - return fibonacci(payload.times); - } -}); - -const HeartBeatCheckAction = BI.inherit(BI.Workers.WorkerBaseAction, { - addActionHandler: function() { - this.controller.addActionHandler("HeartBeatCheckStart", this.startHeatBeatCheck.bind(this)); - this.controller.addActionHandler("HeartBeatCheckStop", this.stopHeatBeatCheck.bind(this)); - }, - - startHeatBeatCheck: function() { - var self = this; - - if (!this.timer) { - console.log("heart beat check started"); - - this.timer = setInterval(function() { - // 模拟请求 - setTimeout(function() { - self.controller.request("HeartBeatChecked", { - time: new Date() - }); - }, 50); - }, 5 * 1000); - } else { - console.log("heart beat has already started!"); - } - }, - - stopHeatBeatCheck: function() { - console.log("heart beat check stopped"); - - clearInterval(this.timer); - } -}); - -var MainThreadWorker = BI.inherit(BI.Workers.WorkerThreadWorker, { - initActions: function() { - this.cookieAction = this.createAction(CookieAction); - - this.fibonacciAction = this.createAction(FibonacciAction); - - this.heartBeatCheckAction = this.createAction(HeartBeatCheckAction); - }, - - fetchCookie: function() { - return this.cookieAction.getCookie() - .then(function (v) { - console.log(v); - }); - } -}); - -var workerThreadWorker = BI.Workers.createWorker(MainThreadWorker); - -workerThreadWorker.fetchCookie(); diff --git a/examples/响应式布局.html b/examples/响应式布局.html deleted file mode 100644 index 72a71951f..000000000 --- a/examples/响应式布局.html +++ /dev/null @@ -1,419 +0,0 @@ - - - - - - PullRequest | Code Review as a Service - - - - - - - - - -
- - - diff --git a/examples/插件设计.html b/examples/插件设计.html deleted file mode 100644 index 91c2b29c8..000000000 --- a/examples/插件设计.html +++ /dev/null @@ -1,146 +0,0 @@ - - - - - - - - - -
- - - - diff --git a/examples/替换loading动画.html b/examples/替换loading动画.html deleted file mode 100644 index 9ae3707d4..000000000 --- a/examples/替换loading动画.html +++ /dev/null @@ -1,104 +0,0 @@ - - - - - - - - Document - - - - - - -
- - - - \ No newline at end of file diff --git a/i18n/i18n.cn.js b/i18n/i18n.cn.js deleted file mode 100644 index 900ff7630..000000000 --- a/i18n/i18n.cn.js +++ /dev/null @@ -1,204 +0,0 @@ -BI.i18n = { - "BI-Multi_Date_Quarter_End": "季度末", - "BI-Multi_Date_Month_Begin": "月初", - "BI-Multi_Date_YMD": "年月日", - "BI-Custom_Color": "自定义颜色", - "BI-Numerical_Interval_Input_Data": "请输入数值", - "BI-Please_Input_Natural_Number": "请输入非负整数", - "BI-No_More_Data": "无更多数据", - "BI-Basic_Altogether": "共", - "BI-Basic_Sunday": "星期日", - "BI-Widget_Background_Colour": "组件背景", - "BI-Color_Picker_Error_Text": "请输入0-255的正整数", - "BI-Multi_Date_Month": "月", - "BI-No_Selected_Item": "没有可选项", - "BI-Multi_Date_Year_Begin": "年初", - "BI-Quarter_1": "第1季度", - "BI-Quarter_2": "第2季度", - "BI-Quarter_3": "第3季度", - "BI-Quarter_4": "第4季度", - "BI-Multi_Date_Year_Next": "年后", - "BI-Multi_Date_Month_Prev": "个月前", - "BI-Month_Trigger_Error_Text": "请输入1~12的正整数", - "BI-Less_And_Equal": "小于等于", - "BI-Year_Trigger_Invalid_Text": "请输入有效时间", - "BI-Multi_Date_Week_Next": "周后", - "BI-Font_Size": "字号", - "BI-Basic_Total": "共", - "BI-Already_Selected": "已选择", - "BI-Formula_Insert": "插入", - "BI-Select_All": "全选", - "BI-Basic_Tuesday": "星期二", - "BI-Multi_Date_Month_End": "月末", - "BI-Load_More": "点击加载更多数据", - "BI-Basic_September": "九月", - "BI-Current_Is_Last_Page": "当前已是最后一页", - "BI-Basic_Auto": "自动", - "BI-Basic_Count": "个", - "BI-Basic_Value": "值", - "BI-Basic_Unrestricted": "无限制", - "BI-Quarter_Trigger_Error_Text": "请输入1~4的正整数", - "BI-Basic_More": "更多", - "BI-Basic_Wednesday": "星期三", - "BI-Basic_Bold": "加粗", - "BI-Basic_Simple_Saturday": "六", - "BI-Multi_Date_Month_Next": "个月后", - "BI-Basic_March": "三月", - "BI-Current_Is_First_Page": "当前已是第一页", - "BI-Basic_Thursday": "星期四", - "BI-Basic_Prompt": "提示", - "BI-Multi_Date_Today": "今天", - "BI-Multi_Date_Quarter_Prev": "个季度前", - "BI-Row_Header": "行表头", - "BI-Date_Trigger_Error_Text": "日期格式示例:2015-3-11", - "BI-Basic_Cancel": "取消", - "BI-Basic_January": "一月", - "BI-Basic_June": "六月", - "BI-Basic_July": "七月", - "BI-Basic_April": "四月", - "BI-Multi_Date_Quarter_Begin": "季度初", - "BI-Multi_Date_Week": "周", - "BI-Click_Blank_To_Select": "点击\"空格键\"选中完全匹配项", - "BI-Basic_August": "八月", - "BI-Word_Align_Left": "文字居左", - "BI-Basic_November": "十一月", - "BI-Font_Colour": "字体颜色", - "BI-Multi_Date_Day_Prev": "天前", - "BI-Select_Part": "部分选择", - "BI-Multi_Date_Day_Next": "天后", - "BI-Less_Than": "小于", - "BI-Basic_February": "二月", - "BI-Multi_Date_Year": "年", - "BI-Number_Index": "序号", - "BI-Multi_Date_Week_Prev": "周前", - "BI-Next_Page": "下一页", - "BI-Right_Page": "向右翻页", - "BI-Numerical_Interval_Signal_Value": "前后值相等,请将操作符改为“≤”", - "BI-Basic_December": "十二月", - "BI-Basic_Saturday": "星期六", - "BI-Basic_Simple_Wednesday": "三", - "BI-Multi_Date_Quarter_Next": "个季度后", - "BI-Basic_October": "十月", - "BI-Basic_Simple_Friday": "五", - "BI-Basic_Save": "保存", - "BI-Numerical_Interval_Number_Value": "请保证前面的数值小于/等于后面的数值", - "BI-Previous_Page": "上一页", - "BI-No_Select": "搜索结果为空", - "BI-Basic_Clears": "清空", - "BI-Created_By_Me": "我创建的", - "BI-Basic_Simple_Tuesday": "二", - "BI-Word_Align_Right": "文字居右", - "BI-Summary_Values": "汇总", - "BI-Basic_Clear": "清除", - "BI-Upload_File_Size_Error": "文件大小不支持", - "BI-Upload_File_Count_Error": "超出上传数量上限{R1},请重新上传", - "BI-Up_Page": "向上翻页", - "BI-Basic_Simple_Sunday": "日", - "BI-Multi_Date_Relative_Current_Time": "相对当前时间", - "BI-Selected_Data": "已选数据:", - "BI-Multi_Date_Quarter": "季度", - "BI-Check_Selected": "查看已选", - "BI-Basic_Search": "搜索", - "BI-Basic_May": "五月", - "BI-Continue_Select": "继续选择", - "BI-Please_Input_Positive_Integer": "请输入正整数", - "BI-Upload_File_Type_Error": "文件类型不支持", - "BI-Upload_File_Error": "文件上传失败", - "BI-Basic_Friday": "星期五", - "BI-Down_Page": "向下翻页", - "BI-Basic_Monday": "星期一", - "BI-Left_Page": "向左翻页", - "BI-Transparent_Color": "透明", - "BI-Basic_Simple_Monday": "一", - "BI-Multi_Date_Year_End": "年末", - "BI-Time_Interval_Error_Text": "请保证开始时间早于/等于结束时间", - "BI-Basic_Time": "时间", - "BI-Basic_OK": "确定", - "BI-Basic_Sure": "确定", - "BI-Basic_Simple_Thursday": "四", - "BI-Multi_Date_Year_Prev": "年前", - "BI-Tiao_Data": "条数据", - "BI-Basic_Italic": "斜体", - "BI-Basic_Dynamic_Title": "动态时间", - "BI-Basic_Year": "年", - "BI-Basic_Single_Quarter": "季", - "BI-Basic_Month": "月", - "BI-Basic_Week": "周", - "BI-Basic_Day": "天", - "BI-Basic_Work_Day": "工作日", - "BI-Basic_Front": "前", - "BI-Basic_Behind": "后", - "BI-Basic_Empty": "空", - "BI-Basic_Month_End": "月末", - "BI-Basic_Month_Begin": "月初", - "BI-Basic_Year_End": "年末", - "BI-Basic_Year_Begin": "年初", - "BI-Basic_Quarter_End": "季末", - "BI-Basic_Quarter_Begin": "季初", - "BI-Basic_Week_End": "周末", - "BI-Basic_Week_Begin": "周初", - "BI-Basic_Current_Day": "当天", - "BI-Basic_Begin_Start": "初", - "BI-Basic_End_Stop": "末", - "BI-Basic_Current_Year": "今年", - "BI-Basic_Year_Fen": "年份", - "BI-Basic_Current_Month": "本月", - "BI-Basic_Current_Quarter": "本季度", - "BI-Basic_Year_Month": "年月", - "BI-Basic_Year_Quarter": "年季度", - "BI-Basic_Input_Can_Not_Null": "输入框不能为空", - "BI-Basic_Date_Time_Error_Text": "日期格式示例:2015-3-11 00:00:00", - "BI-Basic_Input_From_To_Number": "请输入{R1}的数值", - "BI-Basic_Or": "或", - "BI-Basic_And": "且", - "BI-Conf_Add_Formula": "添加公式", - "BI-Conf_Add_Condition": "添加条件", - "BI-Conf_Formula_And": "且公式条件", - "BI-Conf_Formula_Or": "或公式条件", - "BI-Conf_Condition_And": "且条件", - "BI-Conf_Condition_Or": "或条件", - "BI-Microsoft_YaHei": "微软雅黑", - "BI-Apple_Light": "苹方-light", - "BI-Font_Family": "字体", - "BI-Basic_Please_Input_Content": "请输入内容", - "BI-Word_Align_Center": "文字居中", - "BI-Basic_Please_Enter_Number_Between": "请输入{R1}-{R2}的值", - "BI-More_Than": "大于", - "BI-More_And_Equal": "大于等于", - "BI-Please_Enter_SQL": "请输入SQL", - "BI-Basic_Click_To_Add_Text": "+点击新增\"{R1}\"", - "BI-Basic_Press_Enter_To_Add_Text": "点按回车键添加\"{R1}\"", - "BI-Basic_Please_Select": "请选择", - "BI-Basic_Font_Color": "文字颜色", - "BI-Basic_Background_Color": "背景色", - "BI-Basic_Underline": "下划线", - "BI-Basic_Param_Month": "{R1}月", - "BI-Basic_Param_Day": "{R1}日", - "BI-Basic_Param_Quarter": "{R1}季度", - "BI-Basic_Param_Week_Count": "第{R1}周", - "BI-Basic_Param_Hour": "{R1}时", - "BI-Basic_Param_Minute": "{R1}分", - "BI-Basic_Param_Second": "{R1}秒", - "BI-Basic_Param_Year": "{R1}年", - "BI-Basic_Date_Day": "日", - "BI-Basic_Hour_Sin": "时", - "BI-Basic_Seconds": "秒", - "BI-Basic_Minute": "分", - "BI-Basic_Thousand": "千", - "BI-Basic_Wan": "万", - "BI-Basic_Million": "百万", - "BI-Basic_Billion": "亿", - "BI-Basic_Quarter": "季度", - "BI-Basic_No_Select": "不选", - "BI-Basic_Now": "此刻", - "BI-Color_Picker_Error_Text_Hex": "请输入6位16进制颜色编号", - "BI-Basic_Date_Range_Error": "请选择{R1}年{R2}月{R3}日-{R4}年{R5}月{R6}日的日期", - "BI-Basic_Year_Range_Error": "请选择{R1}年-{R2}年的日期", - "BI-Basic_Year_Month_Range_Error": "请选择{R1}年{R2}月-{R3}年{R4}月的日期", - "BI-Basic_Year_Quarter_Range_Error": "请选择{R1}年{R2}季度-{R3}年{R4}季度的日期", - "BI-Basic_Search_And_Patch_Paste": "搜索,支持批量粘贴、粘贴值通过换行识别", - "BI-Basic_Recommend_Color": "推荐色", - "BI-Basic_Too_Much_Value_Get_Two_Thousand": "粘贴的值过多,只能识别出前2000个值", - "BI-Basic_Simple_Open": "开", - "BI-Basic_Simple_Close": "关", -}; \ No newline at end of file diff --git a/i18n/i18n.en.js b/i18n/i18n.en.js deleted file mode 100644 index 39e7a7758..000000000 --- a/i18n/i18n.en.js +++ /dev/null @@ -1,122 +0,0 @@ -BI.i18n = { - "BI-Multi_Date_Quarter_End": "", - "BI-Multi_Date_Month_Begin": "", - "BI-Multi_Date_YMD": "", - "BI-Custom_Color": "", - "BI-Numerical_Interval_Input_Data": "", - "BI-Please_Input_Natural_Number": "", - "BI-No_More_Data": "No More Data", - "BI-Basic_Altogether": "Altogether", - "BI-Basic_Sunday": "Sunday", - "BI-Widget_Background_Colour": "", - "BI-Color_Picker_Error_Text": "", - "BI-Multi_Date_Month": "", - "BI-No_Selected_Item": "", - "BI-Multi_Date_Year_Begin": "", - "BI-Quarter_1": "First Quarter", - "BI-Quarter_2": "Second Quarter", - "BI-Quarter_3": "Third Quarter", - "BI-Quarter_4": "Fourth Quarter", - "BI-Multi_Date_Year_Next": "", - "BI-Multi_Date_Month_Prev": "", - "BI-Month_Trigger_Error_Text": "", - "BI-Less_And_Equal": "", - "BI-Year_Trigger_Invalid_Text": "", - "BI-Multi_Date_Week_Next": "", - "BI-Font_Size": "", - "BI-Basic_Total": "Total", - "BI-Already_Selected": "Already Selected items", - "BI-Formula_Insert": "", - "BI-Select_All": "Select All", - "BI-Basic_Tuesday": "Tuesday", - "BI-Multi_Date_Month_End": "", - "BI-Load_More": "Click to Load More", - "BI-Basic_September": "September", - "BI-Current_Is_Last_Page": "", - "BI-Basic_Auto": "Auto", - "BI-Basic_Count": "", - "BI-Basic_Value": "value", - "BI-Basic_Unrestricted": "unrestricted", - "BI-Quarter_Trigger_Error_Text": "", - "BI-Basic_More": "More", - "BI-Basic_Wednesday": "Wednesday", - "BI-Basic_Bold": "Bold", - "BI-Basic_Simple_Saturday": "Sat", - "BI-Multi_Date_Month_Next": "", - "BI-Basic_March": "March", - "BI-Current_Is_First_Page": "", - "BI-Basic_Thursday": "Thursday", - "BI-Basic_Prompt": "Prompt", - "BI-Multi_Date_Today": "Toady", - "BI-Multi_Date_Quarter_Prev": "", - "BI-Row_Header": "Row header", - "BI-Date_Trigger_Error_Text": "日期格式示例:2015-3-11", - "BI-Basic_Cancel": "Cancel", - "BI-Basic_January": "January", - "BI-Basic_June": "June", - "BI-Basic_July": "July", - "BI-Basic_April": "April", - "BI-Multi_Date_Quarter_Begin": "", - "BI-Multi_Date_Week": "Week", - "BI-Click_Blank_To_Select": "", - "BI-Basic_August": "August", - "BI-Word_Align_Left": "Align Left", - "BI-Basic_November": "November", - "BI-Font_Colour": "Font Color", - "BI-Multi_Date_Day_Prev": "", - "BI-Select_Part": "", - "BI-Multi_Date_Day_Next": "", - "BI-Less_Than": "Less Than", - "BI-Basic_February": "February", - "BI-Multi_Date_Year": "Year", - "BI-Number_Index": "Number", - "BI-Multi_Date_Week_Prev": "", - "BI-Next_Page": "Next", - "BI-Right_Page": "Right", - "BI-Numerical_Interval_Signal_Value": "", - "BI-Basic_December": "December", - "BI-Basic_Saturday": "Saturday", - "BI-Basic_Simple_Wednesday": "Wed", - "BI-Multi_Date_Quarter_Next": "", - "BI-Basic_October": "October", - "BI-Basic_Simple_Friday": "Fri", - "BI-Basic_Save": "Save", - "BI-Numerical_Interval_Number_Value": "", - "BI-Previous_Page": "Previous", - "BI-No_Select": "Blank", - "BI-Basic_Clears": "Clear", - "BI-Created_By_Me": "Created By Me", - "BI-Basic_Simple_Tuesday": "Tue", - "BI-Word_Align_Right": "Align Right", - "BI-Summary_Values": "Summary", - "BI-Basic_Clear": "Clear", - "BI-Upload_File_Size_Error": "", - "BI-Up_Page": "Up", - "BI-Basic_Simple_Sunday": "Sun", - "BI-Multi_Date_Relative_Current_Time": "", - "BI-Selected_Data": "Selected", - "BI-Multi_Date_Quarter": "Quarter", - "BI-Check_Selected": "", - "BI-Basic_Search": "Search", - "BI-Basic_May": "May", - "BI-Continue_Select": "Continue Select", - "BI-Please_Input_Positive_Integer": "Please Input Positive Integer", - "BI-Upload_File_Type_Error": "", - "BI-Upload_File_Error": "", - "BI-Basic_Friday": "Friday", - "BI-Down_Page": "Down", - "BI-Basic_Monday": "Monday", - "BI-Left_Page": "Left", - "BI-Transparent_Color": "Transparent", - "BI-Basic_Simple_Monday": "Mon", - "BI-Multi_Date_Year_End": "", - "BI-Time_Interval_Error_Text": "", - "BI-Basic_Time": "Time", - "BI-Basic_OK": "Ok", - "BI-Basic_Sure": "Sure", - "BI-Basic_Simple_Thursday": "Thu", - "BI-Multi_Date_Year_Prev": "", - "BI-Tiao_Data": "", - "BI-Basic_Italic": "Italic", - "BI-Color_Picker_Error_Text_Hex": "Please Input Correct Hex Value" -}; \ No newline at end of file diff --git a/index.html b/index.html deleted file mode 100644 index 03f734a32..000000000 --- a/index.html +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - Demo - - - - -
- - - diff --git a/jsy.lessconfig.json b/jsy.lessconfig.json deleted file mode 100644 index 9efbfa906..000000000 --- a/jsy.lessconfig.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "@background-color-card-primary": "#003D4D", - "@color-primary": "#00acbe", - "font-color-normal": "#0d1540", - "font-color-light-gray": "#0d1540", - "font-color-disabled": "fade(#0d1540, 40)", - "font-color-light-disabled": "fade(#0d1540, 20)", - "font-color-success": "#28b668", - "font-color-negative": "#e65251", - "font-color-warning": "#faaa39", - "font-color-tips": "fade(#0d1540, 40)", - - "background-color-light-disabled": "fade(#0d1540, 5)", - "background-color-dark-success": "#28b668", - "background-color-negative": "#e65251", - "background-color-warning": "#faaa39", - - "border-color-disabled": "#e8eaed", - "border-color-success": "#28b668", - "border-color-negative": "#e65251" -} diff --git a/karma.conf.js b/karma.conf.js deleted file mode 100644 index 1152ccb6a..000000000 --- a/karma.conf.js +++ /dev/null @@ -1,143 +0,0 @@ -// Karma configuration -// Generated on Mon Nov 27 2017 11:16:26 GMT+0800 (中国标准时间) - -const os = require("os"); - -process.env.CHROME_BIN = require("puppeteer").executablePath(); - -module.exports = function (config) { - config.set({ - - // base path that will be used to resolve all patterns (eg. files, exclude) - basePath: "", - - - // frameworks to use - // available frameworks: https://npmjs.org/browse/keyword/karma-adapter - frameworks: ["mocha", "chai"], - - - // list of files / patterns to load in the browser - files: [ - "dist/fineui.min.css", - "src/core/**/*.js", - "src/data/**/*.js", - "src/third/**/*.js", - "src/base/**/*.js", - "src/case/**/*.js", - "src/widget/**/*.js", - "src/component/**/*.js", - "dist/fix/fix.js", - "dist/fix/fix.compact.js", - "src/**/*.test.js", - "test/**/*.js" - ], - - exclude: [ - "src/base/single/input/file.js", - "src/case/ztree/**/*.js", - "src/widget/multitree/**/*.js", - "src/widget/multiselecttree/**/*.js", - "src/component/treevaluechooser/*.js" - ], - - - // preprocess matching files before serving them to the browser - // available preprocessors: https://npmjs.org/browse/keyword/karma-preprocessor - preprocessors: { - "src/core/1.base.js": "coverage", - "src/core/func/**/*.js": "coverage", - "src/base/**/!(*.test).js": "coverage", - "src/case/**/!(*.test).js": "coverage", - "src/widget/**/!(*.test).js": "coverage", - "src/component/**/!(*.test).js": "coverage" - }, - - - // test results reporter to use - // possible values: 'dots', 'progress' - // available reporters: https://npmjs.org/browse/keyword/karma-reporter - reporters: ["progress", "coverage"], - - browserDisconnectTolerance: 3, - browserDisconnectTimeout : 300000, - browserNoActivityTimeout : 300000, - - coverageReporter: { - // specify a common output directory - dir: "coverage/", - reporters: [ - // reporters not supporting the `file` property - { type: "html", subdir: "report-html" }, - { type: "json-summary", subdir: "report-json-summary" }, - { type: "cobertura", subdir: "report-cobertura"} - ] - }, - - - // web server port - port: 9878, - - - // enable / disable colors in the output (reporters and logs) - colors: true, - - - // level of logging - // possible values: config.LOG_DISABLE || config.LOG_ERROR || config.LOG_WARN || config.LOG_INFO || config.LOG_DEBUG - logLevel: config.LOG_INFO, - - - // enable / disable watching file and executing tests whenever any file changes - autoWatch: true, - - - customLaunchers: { - HeadlessChrome: { - base: "ChromeHeadless", - flags: [ - "--no-sandbox", - "--remote-debugging-port=9222", - "--enable-logging", - "--user-data-dir=./karma-chrome", - "--v=1", - "--disable-background-timer-throttling", - "--disable-renderer-backgrounding", - "--proxy-bypass-list=*", - "--disable-web-security", - "--disable-gpu", - "--no-sandbox", - ], - }, - }, - - - // start these browsers - // available browser launchers: https://npmjs.org/browse/keyword/karma-launcher - browsers: [os.platform() === "win32" - && parseFloat(os.release() - .split(".") - .slice(0, 2) - .join(".")) <= 6.1 - ? "HeadlessChrome" : "ChromeHeadless"], - - retryLimit: 30, - - captureTimeout: 30000, - - // Continuous Integration mode - // if true, Karma captures browsers, runs the tests and exits - singleRun: true, - - // Concurrency level - // how many browser should be started simultaneous - concurrency: Infinity, - - plugins: [ - "karma-mocha", - "karma-chai", - "karma-chrome-launcher", - "karma-coverage" - ] - }); -}; diff --git a/lib/postbuild/postbuild.js b/lib/postbuild/postbuild.js deleted file mode 100644 index 9e7e5301a..000000000 --- a/lib/postbuild/postbuild.js +++ /dev/null @@ -1,52 +0,0 @@ -const { resolve } = require("path"); -const { existsSync, mkdirSync, readFileSync, writeFileSync } = require("fs"); -const rimraf = require("rimraf"); -const concat = require("concat"); -const glob = require("glob"); -const { config } = require("../../webpack/attachments"); - -const dest = resolve(__dirname, '../../dist'); - -const $dest = resolve(dest, './2.0'); - -if (!existsSync($dest)) { - mkdirSync($dest); -} - -const deleteList = [ - "fineui_without_jquery_polyfill.css", - "font.js", - "font.js.map", - "resource.js", - "resource.js.map", - "2.0/fineui_without_normalize.js", - "2.0/fineui_without_normalize.js.map", - "2.0/fineui_without_normalize.min.js", - "2.0/fineui_without_normalize.min.js.map", - "fineui_without_normalize.min.js", - "fineui_without_normalize.min.js.map", -].concat(glob.sync("dist/**/*.css.map").map(name => name.replace("dist/", ""))); - -deleteList.forEach(filename => { - const sourcefile = resolve(dest, `./${filename}`); - - rimraf(sourcefile, () => { - console.log(`${sourcefile} deleted`); - }); -}); - -const fileList = ['demo.js', 'fineui.js', '2.0/fineui.js', 'core.js']; -fileList.forEach(filename => { - const sourcefile = resolve(dest, `./${filename}`); - - const paths = filename.split("/"); - - const name = paths[paths.length - 1]; - - const content = `${readFileSync(sourcefile, { encoding: 'utf8' })} -//# sourceMappingURL=./${name}.map`; - - writeFileSync(sourcefile, content); -}); - -concat(config, resolve(dest, "resource.js")); diff --git a/lib/postpublish/postpublish.js b/lib/postpublish/postpublish.js deleted file mode 100644 index 49b4ae7e6..000000000 --- a/lib/postpublish/postpublish.js +++ /dev/null @@ -1,15 +0,0 @@ -const { resolve } = require("path"); -const { execSync } = require("child_process"); -const { writeFileSync } = require("fs"); - -const packageJSON = require("../../package.json"); - -packageJSON.name = "fineui"; - -packageJSON.publishConfig.registry = 'https://registry.npmjs.org'; - -writeFileSync(resolve(__dirname, "../../package.json"), JSON.stringify(packageJSON, null, 2)); - -execSync('git add dist/'); -execSync('git add package.json'); -execSync(`git diff-index --quiet HEAD || git commit -am "auto upgrade version to ${packageJSON.version}"`); diff --git a/lib/prepublish/prepublish.js b/lib/prepublish/prepublish.js deleted file mode 100644 index 4f082ab6a..000000000 --- a/lib/prepublish/prepublish.js +++ /dev/null @@ -1,63 +0,0 @@ -const { resolve, join } = require("path"); -const { writeFileSync } = require("fs"); -const { spawnSync } = require('child_process'); -const { bundleWithoutNormalize } = require('../../webpack/attachments'); - -function pad2(n) {// always returns a string - return (n < 10 ? "0" : "") + n; -} - -const d = new Date(); - -const version = d.getFullYear() + - pad2(d.getMonth() + 1) + - pad2(d.getDate()) + - pad2(d.getHours()) + - pad2(d.getMinutes()) + - pad2(d.getSeconds()); - -const packageJSON = require("../../package.json"); - -const versionChars = packageJSON.version.split("."); - -versionChars[versionChars.length - 1] = version; - -packageJSON.version = versionChars.join("."); - -packageJSON.publishConfig.registry = 'https://npm.fineres.com/'; - -packageJSON.name = "@fui/core"; - -writeFileSync(resolve(__dirname, "../../package.json"), JSON.stringify(packageJSON, null, 2)); - -// 将less打包成fineui.less发布到npm以供用户定制主题 -const lessPath = join(process.cwd(), '/src/less'); - -function copyFiles(from, to) { - spawnSync('cp', ['-r', from, to]); -} - -function removeFiles(src) { - spawnSync('rm', ['-rf', src]); -} - -function finalizeCompile() { - let lessContent = ''; - - bundleWithoutNormalize.forEach(path => { - const relativePath = path.replace(/.*src\/less/, 'src/less').replace(/.*public\/less/, 'public/less'); - lessContent += `@import "../../${relativePath}";\n`; - }); - - writeFileSync( - join(lessPath, 'fineui.less'), - lessContent, - ); -} - -removeFiles(`${lessPath}/font`); -removeFiles(`${lessPath}/fineui.less`); - -finalizeCompile(); - -copyFiles(`${process.cwd()}/dist/font`, lessPath); diff --git a/lodash.md b/lodash.md deleted file mode 100644 index 411585265..000000000 --- a/lodash.md +++ /dev/null @@ -1 +0,0 @@ -lodash core plus="debounce,throttle,get,set,findIndex,findLastIndex,findKey,findLastKey,isArrayLike,invert,invertBy,uniq,uniqBy,omit,omitBy,zip,unzip,rest,range,random,reject,intersection,drop,countBy,union,zipObject,initial,cloneDeep,clamp,isPlainObject,take,takeRight,without,difference,defaultsDeep,trim,merge,groupBy,uniqBy,before,after,unescape,chunk,pick,pickBy,identity" diff --git a/package.json b/package.json index aeaef1f66..cb4d5c201 100644 --- a/package.json +++ b/package.json @@ -1,108 +1,33 @@ { - "name": "fineui", - "version": "2.0.20230208163847", - "description": "fineui", - "main": "dist/fineui_without_conflict.min.js", - "module": "dist/esm/index.js", - "sideEffects": [ - "dist/esm/polyfill/**/*", - "dist/esm/core/platform/**/*.js" - ], - "types": "dist/lib/index.d.ts", - "bin": { - "fui-cli": "./bin/cli/cli.js" - }, - "devDependencies": { - "@babel/cli": "^7.21.0", - "@babel/core": "^7.17.4", - "@fui/babel-preset-fineui": "^3.0.0", - "@fui/eslint-plugin": "^1.0.19", - "@juggle/resize-observer": "^3.4.0", - "@rollup/plugin-alias": "4.0.3", - "@rollup/plugin-babel": "6.0.3", - "@rollup/plugin-commonjs": "24.0.1", - "@rollup/plugin-node-resolve": "15.0.1", - "@types/node": "15.6.1", - "@typescript-eslint/eslint-plugin": "2.33.0", - "@typescript-eslint/parser": "2.33.0", - "autoprefixer": "9.6.1", - "babel-loader": "8.0.6", - "babel-plugin-module-resolver": "^5.0.0", - "chai": "4.2.0", - "concat": "1.0.3", - "core-js": "3.3.2", - "cross-env": "6.0.0", - "css-loader": "3.0.0", - "es6-promise": "4.2.8", - "eslint": "7.32.0", - "expose-loader": "0.7.5", - "express": "4.15.2", - "fork-ts-checker-webpack-plugin": "1.4.3", - "glob": "^7.2.0", - "html-webpack-plugin": "3.2.0", - "husky": "^3.1.0", - "karma": "3.1.4", - "karma-chai": "0.1.0", - "karma-chrome-launcher": "2.2.0", - "karma-coverage": "1.1.2", - "karma-mocha": "1.3.0", - "less": "3.11.2", - "less-loader": "5.0.0", - "mini-css-extract-plugin": "0.7.0", - "mocha": "5.2.0", - "npm-run-all": "4.1.5", - "open": "0.0.5", - "optimize-css-assets-webpack-plugin": "5.0.3", - "postcss-loader": "3.0.0", - "postcss-simple-vars": "5.0.2", - "prettier": "2.8.2", - "puppeteer": "^13.3.0", - "rimraf": "3.0.2", - "script-loader": "0.7.2", - "source-map-loader": "0.2.4", - "style-loader": "0.23.1", - "terser-webpack-plugin": "4.2.3", - "typescript": "3.9.2", - "webpack": "4.35.2", - "webpack-cli": "3.3.5", - "webpack-dev-server": "3.7.2", - "webpack-merge": "4.2.1" - }, - "scripts": { - "webpack:dev": "node --max_old_space_size=4096 node_modules/webpack-dev-server/bin/webpack-dev-server.js -p --progress --host 0.0.0.0 --config=webpack/webpack.dev.js --mode development", - "webpack:prod": "node --max_old_space_size=4096 node_modules/webpack/bin/webpack -p --progress --config=webpack/webpack.prod.js --mode production && npm run biCss && npm run jsyCss", - "webpack:css": "node --max_old_space_size=4096 node_modules/webpack/bin/webpack -p --progress --config=webpack/webpack.css.js --mode production", - "start": "node server.js", - "build": "npm run esm && npm run webpack:prod && tsc", - "postbuild": "node ./lib/postbuild/postbuild.js", - "test": "karma start", - "dev": "npm run webpack:dev", - "esm": "babel src -d dist\\esm --config-file .\\es6.babel.js", - "esm:dev": "babel src -d dist\\esm --config-file .\\es6.babel.js -w", - "prepublishToPrivate": "npm run build && node ./lib/prepublish/prepublish.js", - "publishToPrivate": "npm publish", - "postpublishToPrivate": " node ./lib/postpublish/postpublish.js", - "biCss": "cross-env LESS_CONFIG_PATH=bi.lessconfig.json LESS_FILE_NAME=bi npm run webpack:css", - "jsyCss": "cross-env LESS_CONFIG_PATH=jsy.lessconfig.json LESS_FILE_NAME=jsy npm run webpack:css" - }, - "repository": { - "type": "git", - "url": "https://git.coding.net/fanruan/fineui.git" - }, - "keywords": [ - "ui", - "fineui", - "finebi" - ], - "publishConfig": { - "registry": "https://registry.npmjs.org" - }, - "author": "fanruan", - "license": "MIT", - "dependencies": { - "@popperjs/core": "2.11.6", - "@types/yargs": "17.0.13", - "jquery": "3.6.3", - "yargs": "17.6.2" - } + "name": "monorepo", + "version": "1.0.0", + "description": "", + "keywords": [], + "author": "", + "license": "ISC", + "scripts": { + "dev": "npm-run-all --parallel dev:*", + "dev:demo": "cd packages/demo && npm run dev", + "dev:fineui": "cd packages/fineui && npm run dev", + "static": "node script/code.static.js" + }, + "devDependencies": { + "@babel/cli": "^7.21.0", + "@babel/core": "^7.21.0", + "@babel/runtime": "^7.21.0", + "@fui/babel-preset-fineui": "^3.0.1", + "babel-loader": "^9.1.2", + "babel-plugin-module-resolver": "^5.0.0", + "css-loader": "^6.7.3", + "html-webpack-plugin": "^5.5.0", + "less": "^4.1.3", + "less-loader": "^11.1.0", + "npm-run-all": "^4.1.5", + "style-loader": "^3.3.1", + "typescript": "^4.9.5", + "webpack": "^5.75.0", + "webpack-bundle-analyzer": "^4.8.0", + "webpack-cli": "^5.0.1", + "webpack-dev-server": "^4.11.1" + } } diff --git a/packages/demo/babel.config.js b/packages/demo/babel.config.js new file mode 100644 index 000000000..d01a496d7 --- /dev/null +++ b/packages/demo/babel.config.js @@ -0,0 +1 @@ +module.exports = require('@fui/babel-preset-fineui').configs.base; \ No newline at end of file diff --git a/packages/demo/i18n/i18n.cn.js b/packages/demo/i18n/i18n.cn.js new file mode 100644 index 000000000..879cf1c49 --- /dev/null +++ b/packages/demo/i18n/i18n.cn.js @@ -0,0 +1,205 @@ +window.BI = {}; +window.BI.i18n = { + 'BI-Multi_Date_Quarter_End': '季度末', + 'BI-Multi_Date_Month_Begin': '月初', + 'BI-Multi_Date_YMD': '年月日', + 'BI-Custom_Color': '自定义颜色', + 'BI-Numerical_Interval_Input_Data': '请输入数值', + 'BI-Please_Input_Natural_Number': '请输入非负整数', + 'BI-No_More_Data': '无更多数据', + 'BI-Basic_Altogether': '共', + 'BI-Basic_Sunday': '星期日', + 'BI-Widget_Background_Colour': '组件背景', + 'BI-Color_Picker_Error_Text': '请输入0-255的正整数', + 'BI-Multi_Date_Month': '月', + 'BI-No_Selected_Item': '没有可选项', + 'BI-Multi_Date_Year_Begin': '年初', + 'BI-Quarter_1': '第1季度', + 'BI-Quarter_2': '第2季度', + 'BI-Quarter_3': '第3季度', + 'BI-Quarter_4': '第4季度', + 'BI-Multi_Date_Year_Next': '年后', + 'BI-Multi_Date_Month_Prev': '个月前', + 'BI-Month_Trigger_Error_Text': '请输入1~12的正整数', + 'BI-Less_And_Equal': '小于等于', + 'BI-Year_Trigger_Invalid_Text': '请输入有效时间', + 'BI-Multi_Date_Week_Next': '周后', + 'BI-Font_Size': '字号', + 'BI-Basic_Total': '共', + 'BI-Already_Selected': '已选择', + 'BI-Formula_Insert': '插入', + 'BI-Select_All': '全选', + 'BI-Basic_Tuesday': '星期二', + 'BI-Multi_Date_Month_End': '月末', + 'BI-Load_More': '点击加载更多数据', + 'BI-Basic_September': '九月', + 'BI-Current_Is_Last_Page': '当前已是最后一页', + 'BI-Basic_Auto': '自动', + 'BI-Basic_Count': '个', + 'BI-Basic_Value': '值', + 'BI-Basic_Unrestricted': '无限制', + 'BI-Quarter_Trigger_Error_Text': '请输入1~4的正整数', + 'BI-Basic_More': '更多', + 'BI-Basic_Wednesday': '星期三', + 'BI-Basic_Bold': '加粗', + 'BI-Basic_Simple_Saturday': '六', + 'BI-Multi_Date_Month_Next': '个月后', + 'BI-Basic_March': '三月', + 'BI-Current_Is_First_Page': '当前已是第一页', + 'BI-Basic_Thursday': '星期四', + 'BI-Basic_Prompt': '提示', + 'BI-Multi_Date_Today': '今天', + 'BI-Multi_Date_Quarter_Prev': '个季度前', + 'BI-Row_Header': '行表头', + 'BI-Date_Trigger_Error_Text': '日期格式示例:2015-3-11', + 'BI-Basic_Cancel': '取消', + 'BI-Basic_January': '一月', + 'BI-Basic_June': '六月', + 'BI-Basic_July': '七月', + 'BI-Basic_April': '四月', + 'BI-Multi_Date_Quarter_Begin': '季度初', + 'BI-Multi_Date_Week': '周', + 'BI-Click_Blank_To_Select': '点击"空格键"选中完全匹配项', + 'BI-Basic_August': '八月', + 'BI-Word_Align_Left': '文字居左', + 'BI-Basic_November': '十一月', + 'BI-Font_Colour': '字体颜色', + 'BI-Multi_Date_Day_Prev': '天前', + 'BI-Select_Part': '部分选择', + 'BI-Multi_Date_Day_Next': '天后', + 'BI-Less_Than': '小于', + 'BI-Basic_February': '二月', + 'BI-Multi_Date_Year': '年', + 'BI-Number_Index': '序号', + 'BI-Multi_Date_Week_Prev': '周前', + 'BI-Next_Page': '下一页', + 'BI-Right_Page': '向右翻页', + 'BI-Numerical_Interval_Signal_Value': '前后值相等,请将操作符改为“≤”', + 'BI-Basic_December': '十二月', + 'BI-Basic_Saturday': '星期六', + 'BI-Basic_Simple_Wednesday': '三', + 'BI-Multi_Date_Quarter_Next': '个季度后', + 'BI-Basic_October': '十月', + 'BI-Basic_Simple_Friday': '五', + 'BI-Basic_Save': '保存', + 'BI-Numerical_Interval_Number_Value': '请保证前面的数值小于/等于后面的数值', + 'BI-Previous_Page': '上一页', + 'BI-No_Select': '搜索结果为空', + 'BI-Basic_Clears': '清空', + 'BI-Created_By_Me': '我创建的', + 'BI-Basic_Simple_Tuesday': '二', + 'BI-Word_Align_Right': '文字居右', + 'BI-Summary_Values': '汇总', + 'BI-Basic_Clear': '清除', + 'BI-Upload_File_Size_Error': '文件大小不支持', + 'BI-Upload_File_Count_Error': '超出上传数量上限{R1},请重新上传', + 'BI-Up_Page': '向上翻页', + 'BI-Basic_Simple_Sunday': '日', + 'BI-Multi_Date_Relative_Current_Time': '相对当前时间', + 'BI-Selected_Data': '已选数据:', + 'BI-Multi_Date_Quarter': '季度', + 'BI-Check_Selected': '查看已选', + 'BI-Basic_Search': '搜索', + 'BI-Basic_May': '五月', + 'BI-Continue_Select': '继续选择', + 'BI-Please_Input_Positive_Integer': '请输入正整数', + 'BI-Upload_File_Type_Error': '文件类型不支持', + 'BI-Upload_File_Error': '文件上传失败', + 'BI-Basic_Friday': '星期五', + 'BI-Down_Page': '向下翻页', + 'BI-Basic_Monday': '星期一', + 'BI-Left_Page': '向左翻页', + 'BI-Transparent_Color': '透明', + 'BI-Basic_Simple_Monday': '一', + 'BI-Multi_Date_Year_End': '年末', + 'BI-Time_Interval_Error_Text': '请保证开始时间早于/等于结束时间', + 'BI-Basic_Time': '时间', + 'BI-Basic_OK': '确定', + 'BI-Basic_Sure': '确定', + 'BI-Basic_Simple_Thursday': '四', + 'BI-Multi_Date_Year_Prev': '年前', + 'BI-Tiao_Data': '条数据', + 'BI-Basic_Italic': '斜体', + 'BI-Basic_Dynamic_Title': '动态时间', + 'BI-Basic_Year': '年', + 'BI-Basic_Single_Quarter': '季', + 'BI-Basic_Month': '月', + 'BI-Basic_Week': '周', + 'BI-Basic_Day': '天', + 'BI-Basic_Work_Day': '工作日', + 'BI-Basic_Front': '前', + 'BI-Basic_Behind': '后', + 'BI-Basic_Empty': '空', + 'BI-Basic_Month_End': '月末', + 'BI-Basic_Month_Begin': '月初', + 'BI-Basic_Year_End': '年末', + 'BI-Basic_Year_Begin': '年初', + 'BI-Basic_Quarter_End': '季末', + 'BI-Basic_Quarter_Begin': '季初', + 'BI-Basic_Week_End': '周末', + 'BI-Basic_Week_Begin': '周初', + 'BI-Basic_Current_Day': '当天', + 'BI-Basic_Begin_Start': '初', + 'BI-Basic_End_Stop': '末', + 'BI-Basic_Current_Year': '今年', + 'BI-Basic_Year_Fen': '年份', + 'BI-Basic_Current_Month': '本月', + 'BI-Basic_Current_Quarter': '本季度', + 'BI-Basic_Year_Month': '年月', + 'BI-Basic_Year_Quarter': '年季度', + 'BI-Basic_Input_Can_Not_Null': '输入框不能为空', + 'BI-Basic_Date_Time_Error_Text': '日期格式示例:2015-3-11 00:00:00', + 'BI-Basic_Input_From_To_Number': '请输入{R1}的数值', + 'BI-Basic_Or': '或', + 'BI-Basic_And': '且', + 'BI-Conf_Add_Formula': '添加公式', + 'BI-Conf_Add_Condition': '添加条件', + 'BI-Conf_Formula_And': '且公式条件', + 'BI-Conf_Formula_Or': '或公式条件', + 'BI-Conf_Condition_And': '且条件', + 'BI-Conf_Condition_Or': '或条件', + 'BI-Microsoft_YaHei': '微软雅黑', + 'BI-Apple_Light': '苹方-light', + 'BI-Font_Family': '字体', + 'BI-Basic_Please_Input_Content': '请输入内容', + 'BI-Word_Align_Center': '文字居中', + 'BI-Basic_Please_Enter_Number_Between': '请输入{R1}-{R2}的值', + 'BI-More_Than': '大于', + 'BI-More_And_Equal': '大于等于', + 'BI-Please_Enter_SQL': '请输入SQL', + 'BI-Basic_Click_To_Add_Text': '+点击新增"{R1}"', + 'BI-Basic_Press_Enter_To_Add_Text': '点按回车键添加"{R1}"', + 'BI-Basic_Please_Select': '请选择', + 'BI-Basic_Font_Color': '文字颜色', + 'BI-Basic_Background_Color': '背景色', + 'BI-Basic_Underline': '下划线', + 'BI-Basic_Param_Month': '{R1}月', + 'BI-Basic_Param_Day': '{R1}日', + 'BI-Basic_Param_Quarter': '{R1}季度', + 'BI-Basic_Param_Week_Count': '第{R1}周', + 'BI-Basic_Param_Hour': '{R1}时', + 'BI-Basic_Param_Minute': '{R1}分', + 'BI-Basic_Param_Second': '{R1}秒', + 'BI-Basic_Param_Year': '{R1}年', + 'BI-Basic_Date_Day': '日', + 'BI-Basic_Hour_Sin': '时', + 'BI-Basic_Seconds': '秒', + 'BI-Basic_Minute': '分', + 'BI-Basic_Thousand': '千', + 'BI-Basic_Wan': '万', + 'BI-Basic_Million': '百万', + 'BI-Basic_Billion': '亿', + 'BI-Basic_Quarter': '季度', + 'BI-Basic_No_Select': '不选', + 'BI-Basic_Now': '此刻', + 'BI-Color_Picker_Error_Text_Hex': '请输入6位16进制颜色编号', + 'BI-Basic_Date_Range_Error': '请选择{R1}年{R2}月{R3}日-{R4}年{R5}月{R6}日的日期', + 'BI-Basic_Year_Range_Error': '请选择{R1}年-{R2}年的日期', + 'BI-Basic_Year_Month_Range_Error': '请选择{R1}年{R2}月-{R3}年{R4}月的日期', + 'BI-Basic_Year_Quarter_Range_Error': '请选择{R1}年{R2}季度-{R3}年{R4}季度的日期', + 'BI-Basic_Search_And_Patch_Paste': '搜索,支持批量粘贴、粘贴值通过换行识别', + 'BI-Basic_Recommend_Color': '推荐色', + 'BI-Basic_Too_Much_Value_Get_Two_Thousand': '粘贴的值过多,只能识别出前2000个值', + 'BI-Basic_Simple_Open': '开', + 'BI-Basic_Simple_Close': '关', +}; diff --git a/packages/demo/i18n/i18n.en.js b/packages/demo/i18n/i18n.en.js new file mode 100644 index 000000000..0acc5cb29 --- /dev/null +++ b/packages/demo/i18n/i18n.en.js @@ -0,0 +1,122 @@ +BI.i18n = { + 'BI-Multi_Date_Quarter_End': '', + 'BI-Multi_Date_Month_Begin': '', + 'BI-Multi_Date_YMD': '', + 'BI-Custom_Color': '', + 'BI-Numerical_Interval_Input_Data': '', + 'BI-Please_Input_Natural_Number': '', + 'BI-No_More_Data': 'No More Data', + 'BI-Basic_Altogether': 'Altogether', + 'BI-Basic_Sunday': 'Sunday', + 'BI-Widget_Background_Colour': '', + 'BI-Color_Picker_Error_Text': '', + 'BI-Multi_Date_Month': '', + 'BI-No_Selected_Item': '', + 'BI-Multi_Date_Year_Begin': '', + 'BI-Quarter_1': 'First Quarter', + 'BI-Quarter_2': 'Second Quarter', + 'BI-Quarter_3': 'Third Quarter', + 'BI-Quarter_4': 'Fourth Quarter', + 'BI-Multi_Date_Year_Next': '', + 'BI-Multi_Date_Month_Prev': '', + 'BI-Month_Trigger_Error_Text': '', + 'BI-Less_And_Equal': '', + 'BI-Year_Trigger_Invalid_Text': '', + 'BI-Multi_Date_Week_Next': '', + 'BI-Font_Size': '', + 'BI-Basic_Total': 'Total', + 'BI-Already_Selected': 'Already Selected items', + 'BI-Formula_Insert': '', + 'BI-Select_All': 'Select All', + 'BI-Basic_Tuesday': 'Tuesday', + 'BI-Multi_Date_Month_End': '', + 'BI-Load_More': 'Click to Load More', + 'BI-Basic_September': 'September', + 'BI-Current_Is_Last_Page': '', + 'BI-Basic_Auto': 'Auto', + 'BI-Basic_Count': '', + 'BI-Basic_Value': 'value', + 'BI-Basic_Unrestricted': 'unrestricted', + 'BI-Quarter_Trigger_Error_Text': '', + 'BI-Basic_More': 'More', + 'BI-Basic_Wednesday': 'Wednesday', + 'BI-Basic_Bold': 'Bold', + 'BI-Basic_Simple_Saturday': 'Sat', + 'BI-Multi_Date_Month_Next': '', + 'BI-Basic_March': 'March', + 'BI-Current_Is_First_Page': '', + 'BI-Basic_Thursday': 'Thursday', + 'BI-Basic_Prompt': 'Prompt', + 'BI-Multi_Date_Today': 'Toady', + 'BI-Multi_Date_Quarter_Prev': '', + 'BI-Row_Header': 'Row header', + 'BI-Date_Trigger_Error_Text': '日期格式示例:2015-3-11', + 'BI-Basic_Cancel': 'Cancel', + 'BI-Basic_January': 'January', + 'BI-Basic_June': 'June', + 'BI-Basic_July': 'July', + 'BI-Basic_April': 'April', + 'BI-Multi_Date_Quarter_Begin': '', + 'BI-Multi_Date_Week': 'Week', + 'BI-Click_Blank_To_Select': '', + 'BI-Basic_August': 'August', + 'BI-Word_Align_Left': 'Align Left', + 'BI-Basic_November': 'November', + 'BI-Font_Colour': 'Font Color', + 'BI-Multi_Date_Day_Prev': '', + 'BI-Select_Part': '', + 'BI-Multi_Date_Day_Next': '', + 'BI-Less_Than': 'Less Than', + 'BI-Basic_February': 'February', + 'BI-Multi_Date_Year': 'Year', + 'BI-Number_Index': 'Number', + 'BI-Multi_Date_Week_Prev': '', + 'BI-Next_Page': 'Next', + 'BI-Right_Page': 'Right', + 'BI-Numerical_Interval_Signal_Value': '', + 'BI-Basic_December': 'December', + 'BI-Basic_Saturday': 'Saturday', + 'BI-Basic_Simple_Wednesday': 'Wed', + 'BI-Multi_Date_Quarter_Next': '', + 'BI-Basic_October': 'October', + 'BI-Basic_Simple_Friday': 'Fri', + 'BI-Basic_Save': 'Save', + 'BI-Numerical_Interval_Number_Value': '', + 'BI-Previous_Page': 'Previous', + 'BI-No_Select': 'Blank', + 'BI-Basic_Clears': 'Clear', + 'BI-Created_By_Me': 'Created By Me', + 'BI-Basic_Simple_Tuesday': 'Tue', + 'BI-Word_Align_Right': 'Align Right', + 'BI-Summary_Values': 'Summary', + 'BI-Basic_Clear': 'Clear', + 'BI-Upload_File_Size_Error': '', + 'BI-Up_Page': 'Up', + 'BI-Basic_Simple_Sunday': 'Sun', + 'BI-Multi_Date_Relative_Current_Time': '', + 'BI-Selected_Data': 'Selected', + 'BI-Multi_Date_Quarter': 'Quarter', + 'BI-Check_Selected': '', + 'BI-Basic_Search': 'Search', + 'BI-Basic_May': 'May', + 'BI-Continue_Select': 'Continue Select', + 'BI-Please_Input_Positive_Integer': 'Please Input Positive Integer', + 'BI-Upload_File_Type_Error': '', + 'BI-Upload_File_Error': '', + 'BI-Basic_Friday': 'Friday', + 'BI-Down_Page': 'Down', + 'BI-Basic_Monday': 'Monday', + 'BI-Left_Page': 'Left', + 'BI-Transparent_Color': 'Transparent', + 'BI-Basic_Simple_Monday': 'Mon', + 'BI-Multi_Date_Year_End': '', + 'BI-Time_Interval_Error_Text': '', + 'BI-Basic_Time': 'Time', + 'BI-Basic_OK': 'Ok', + 'BI-Basic_Sure': 'Sure', + 'BI-Basic_Simple_Thursday': 'Thu', + 'BI-Multi_Date_Year_Prev': '', + 'BI-Tiao_Data': '', + 'BI-Basic_Italic': 'Italic', + 'BI-Color_Picker_Error_Text_Hex': 'Please Input Correct Hex Value', +}; diff --git a/packages/demo/index.html b/packages/demo/index.html new file mode 100644 index 000000000..5560a4205 --- /dev/null +++ b/packages/demo/index.html @@ -0,0 +1,16 @@ + + + + + + Document + + + +
+ + diff --git a/packages/demo/jsconfig.json b/packages/demo/jsconfig.json new file mode 100644 index 000000000..215f7a417 --- /dev/null +++ b/packages/demo/jsconfig.json @@ -0,0 +1,5 @@ +{ + "compilerOptions": { + "experimentalDecorators": true + } +} diff --git a/packages/demo/package.json b/packages/demo/package.json new file mode 100644 index 000000000..deaabb82e --- /dev/null +++ b/packages/demo/package.json @@ -0,0 +1,15 @@ +{ + "name": "demo", + "version": "1.0.0", + "description": "", + "main": "index.js", + "scripts": { + "dev": "webpack-dev-server --open --config=webpack.dev.js" + }, + "keywords": [], + "author": "", + "license": "ISC", + "dependencies": { + "@fui/core": "workspace:^2.0.20230208163847" + } +} diff --git a/demo/js/case/combo/demo.bubble_combo.js b/packages/demo/src/case/combo/demo.bubble_combo.js similarity index 100% rename from demo/js/case/combo/demo.bubble_combo.js rename to packages/demo/src/case/combo/demo.bubble_combo.js diff --git a/demo/js/case/combo/demo.editor_icon_check_combo.js b/packages/demo/src/case/combo/demo.editor_icon_check_combo.js similarity index 100% rename from demo/js/case/combo/demo.editor_icon_check_combo.js rename to packages/demo/src/case/combo/demo.editor_icon_check_combo.js diff --git a/demo/js/case/combo/demo.icon_combo.js b/packages/demo/src/case/combo/demo.icon_combo.js similarity index 100% rename from demo/js/case/combo/demo.icon_combo.js rename to packages/demo/src/case/combo/demo.icon_combo.js diff --git a/demo/js/case/combo/demo.icon_text_value_combo.js b/packages/demo/src/case/combo/demo.icon_text_value_combo.js similarity index 100% rename from demo/js/case/combo/demo.icon_text_value_combo.js rename to packages/demo/src/case/combo/demo.icon_text_value_combo.js diff --git a/packages/demo/src/case/combo/demo.search_text_value_combo.js b/packages/demo/src/case/combo/demo.search_text_value_combo.js new file mode 100644 index 000000000..1c4c6c695 --- /dev/null +++ b/packages/demo/src/case/combo/demo.search_text_value_combo.js @@ -0,0 +1,121 @@ +import { CONSTANTS } from "@/config/constant"; +import { shortcut, Widget, Msg, AllValueMultiTextValueCombo} from "@fui/core"; + +@shortcut() +export class SearchTextValueCombo extends Widget { + static xtype = "demo.search_text_value_combo"; + + props = { baseCls: "" }; + + render() { + let combo, searchCombo; + + return { + type: "bi.horizontal_auto", + items: [ + { + type: "bi.search_text_value_combo", + ref() { + combo = this; + }, + warningTitle: "111", + text: "默认值", + value: 14, + width: 300, + items: [ + { + text: "ABC-1", + iconCls: "date-font", + value: 1, + }, + { + text: "BCD-2", + iconCls: "search-font", + value: 2, + }, + { + text: "CDE-3", + iconCls: "pull-right-font", + value: 3, + }, + { + text: "DEF-3", + iconCls: "pull-right-font", + value: 4, + }, + { + text: "FEG-3", + iconCls: "pull-right-font", + value: 5, + }, + { + text: "FGH-3", + iconCls: "pull-right-font", + value: 6, + }, + { + text: "GHI-3", + iconCls: "pull-right-font", + value: 7, + }, + { + text: "HIJ-3", + iconCls: "pull-right-font", + value: 8, + }, + { + text: "IJK-3", + iconCls: "pull-right-font", + value: 9, + }, + { + text: "JKL-3", + iconCls: "pull-right-font", + value: 10, + } + ], + }, + { + type: "bi.all_value_multi_text_value_combo", + items: CONSTANTS.ITEMS, + text: "提示文本", + width: 200, + value: { + type: 1, + value: ["1", "2", "柳州市城贸金属材料有限责任公司", "3"], + }, + ref() { + searchCombo = this; + }, + listeners: [ + { + eventName: AllValueMultiTextValueCombo.EVENT_CONFIRM, + action() { + Msg.toast(JSON.stringify(searchCombo.getValue())); + }, + } + ], + }, + { + type: "bi.button", + text: "setValue(3)", + width: 90, + height: 25, + handler() { + combo.setValue(11); + }, + }, + { + type: "bi.button", + text: "getValue()", + width: 90, + height: 25, + handler() { + Msg.toast(JSON.stringify(searchCombo.getValue())); + }, + } + ], + vgap: 20, + }; + } +} diff --git a/demo/js/case/combo/demo.text_value_combo.js b/packages/demo/src/case/combo/demo.text_value_combo.js similarity index 100% rename from demo/js/case/combo/demo.text_value_combo.js rename to packages/demo/src/case/combo/demo.text_value_combo.js diff --git a/demo/js/case/combo/demo.text_value_down_list_combo.js b/packages/demo/src/case/combo/demo.text_value_down_list_combo.js similarity index 100% rename from demo/js/case/combo/demo.text_value_down_list_combo.js rename to packages/demo/src/case/combo/demo.text_value_down_list_combo.js diff --git a/packages/demo/src/case/combo/demo.text_vlaue_check_combo.js b/packages/demo/src/case/combo/demo.text_vlaue_check_combo.js new file mode 100644 index 000000000..74b662c20 --- /dev/null +++ b/packages/demo/src/case/combo/demo.text_vlaue_check_combo.js @@ -0,0 +1,50 @@ +import { Msg, shortcut, Widget } from "@fui/core"; + +@shortcut() +export class TextValueCheckCombo extends Widget { + static xtype = "demo.text_value_check_combo"; + + props = { baseCls: "" }; + + render() { + const self = this; + + return { + type: "bi.horizontal_auto", + items: [ + { + type: "bi.text_value_check_combo", + ref () { + self.combo = this; + }, + text: "默认值", + // value: 1, + width: 300, + items: [ + { + text: "MVC-1", + value: 1, + }, + { + text: "MVC-2", + value: 2, + }, + { + text: "MVC-3", + value: 3, + } + ], + }, + { + type: "bi.button", + width: 90, + height: 25, + handler () { + Msg.alert("", JSON.stringify(self.combo.getValue())); + }, + } + ], + vgap: 20, + }; + } +} diff --git a/demo/js/case/combo/index.js b/packages/demo/src/case/combo/index.js similarity index 100% rename from demo/js/case/combo/index.js rename to packages/demo/src/case/combo/index.js diff --git a/demo/js/case/demo.calendar.js b/packages/demo/src/case/demo.calendar.js similarity index 100% rename from demo/js/case/demo.calendar.js rename to packages/demo/src/case/demo.calendar.js diff --git a/demo/js/case/demo.click.effect.js b/packages/demo/src/case/demo.click.effect.js similarity index 100% rename from demo/js/case/demo.click.effect.js rename to packages/demo/src/case/demo.click.effect.js diff --git a/demo/js/case/demo.color_chooser.js b/packages/demo/src/case/demo.color_chooser.js similarity index 100% rename from demo/js/case/demo.color_chooser.js rename to packages/demo/src/case/demo.color_chooser.js diff --git a/demo/js/case/demo.color_chooser_popup.js b/packages/demo/src/case/demo.color_chooser_popup.js similarity index 100% rename from demo/js/case/demo.color_chooser_popup.js rename to packages/demo/src/case/demo.color_chooser_popup.js diff --git a/demo/js/case/demo.segment.js b/packages/demo/src/case/demo.segment.js similarity index 100% rename from demo/js/case/demo.segment.js rename to packages/demo/src/case/demo.segment.js diff --git a/demo/js/case/editor/demo.clear_editor.js b/packages/demo/src/case/editor/demo.clear_editor.js similarity index 100% rename from demo/js/case/editor/demo.clear_editor.js rename to packages/demo/src/case/editor/demo.clear_editor.js diff --git a/demo/js/case/editor/demo.shelter_editor.js b/packages/demo/src/case/editor/demo.shelter_editor.js similarity index 100% rename from demo/js/case/editor/demo.shelter_editor.js rename to packages/demo/src/case/editor/demo.shelter_editor.js diff --git a/demo/js/case/editor/demo.sign_editor.js b/packages/demo/src/case/editor/demo.sign_editor.js similarity index 100% rename from demo/js/case/editor/demo.sign_editor.js rename to packages/demo/src/case/editor/demo.sign_editor.js diff --git a/demo/js/case/editor/demo.simple_state_editor.js b/packages/demo/src/case/editor/demo.simple_state_editor.js similarity index 100% rename from demo/js/case/editor/demo.simple_state_editor.js rename to packages/demo/src/case/editor/demo.simple_state_editor.js diff --git a/demo/js/case/editor/demo.state_editor.js b/packages/demo/src/case/editor/demo.state_editor.js similarity index 100% rename from demo/js/case/editor/demo.state_editor.js rename to packages/demo/src/case/editor/demo.state_editor.js diff --git a/demo/js/case/editor/index.js b/packages/demo/src/case/editor/index.js similarity index 100% rename from demo/js/case/editor/index.js rename to packages/demo/src/case/editor/index.js diff --git a/packages/demo/src/case/index.js b/packages/demo/src/case/index.js new file mode 100644 index 000000000..161b58b4d --- /dev/null +++ b/packages/demo/src/case/index.js @@ -0,0 +1,15 @@ +// export * from "./combo"; +// export * from "./editor"; +// export * from "./item"; +// export * from "./list"; +// export * from "./pager"; +// export * from "./pane"; +// export * from "./tree"; +// export * from "./triggers"; + +export const caseComponent = {}; +// export * from "./demo.calendar"; +// export * from "./demo.click.effect"; +// export * from "./demo.color_chooser"; +// export * from "./demo.color_chooser_popup"; +// export * from "./demo.segment"; diff --git a/demo/js/case/item/demo.multi_select_item.js b/packages/demo/src/case/item/demo.multi_select_item.js similarity index 100% rename from demo/js/case/item/demo.multi_select_item.js rename to packages/demo/src/case/item/demo.multi_select_item.js diff --git a/demo/js/case/item/demo.single_select_item.js b/packages/demo/src/case/item/demo.single_select_item.js similarity index 100% rename from demo/js/case/item/demo.single_select_item.js rename to packages/demo/src/case/item/demo.single_select_item.js diff --git a/demo/js/case/item/demo.single_select_radio_item.js b/packages/demo/src/case/item/demo.single_select_radio_item.js similarity index 100% rename from demo/js/case/item/demo.single_select_radio_item.js rename to packages/demo/src/case/item/demo.single_select_radio_item.js diff --git a/demo/js/case/item/index.js b/packages/demo/src/case/item/index.js similarity index 100% rename from demo/js/case/item/index.js rename to packages/demo/src/case/item/index.js diff --git a/packages/demo/src/case/list/demo.lazy_loader.js b/packages/demo/src/case/list/demo.lazy_loader.js new file mode 100644 index 000000000..6878824ac --- /dev/null +++ b/packages/demo/src/case/list/demo.lazy_loader.js @@ -0,0 +1,28 @@ +import { CONSTANTS } from "@/config/constant"; +import { shortcut, Widget } from "@fui/core"; + +@shortcut() +export class Func extends Widget { + static xtype = "demo.lazy_loader"; + + props = { baseCls: "demo-func" }; + + render() { + const self = this; + createWidget({ + type: "bi.lazy_loader", + element: this, + el: { + layouts: [ + { + type: "bi.left", + hgap: 5, + } + ], + }, + items: createItems(deepClone(CONSTANTS.ITEMS), { + type: "bi.button", + }), + }); + } +} diff --git a/packages/demo/src/case/list/demo.select_list.js b/packages/demo/src/case/list/demo.select_list.js new file mode 100644 index 000000000..36550c128 --- /dev/null +++ b/packages/demo/src/case/list/demo.select_list.js @@ -0,0 +1,29 @@ +import { CONSTANTS } from "@/config/constant"; +import { shortcut, Widget, createWidget, createItems, deepClone, Selection } from "@/core"; + +@shortcut() +export class Func extends Widget { + static xtype = "demo.select_list"; + + props = { baseCls: "demo-func" }; + + render() { + const self = this; + createWidget({ + type: "bi.select_list", + toolbar: { + type: "bi.multi_select_bar", + iconWrapperWidth: 26, + }, + element: this, + el: { + el: { + chooseType: Selection.Multi, + }, + }, + items: createItems(deepClone(CONSTANTS.SIMPLE_ITEMS), { + type: "bi.multi_select_item", + }), + }); + } +} diff --git a/demo/js/case/list/index.js b/packages/demo/src/case/list/index.js similarity index 100% rename from demo/js/case/list/index.js rename to packages/demo/src/case/list/index.js diff --git a/demo/js/case/pager/demo.all_count_pager.js b/packages/demo/src/case/pager/demo.all_count_pager.js similarity index 100% rename from demo/js/case/pager/demo.all_count_pager.js rename to packages/demo/src/case/pager/demo.all_count_pager.js diff --git a/demo/js/case/pager/demo.direction_pager.js b/packages/demo/src/case/pager/demo.direction_pager.js similarity index 100% rename from demo/js/case/pager/demo.direction_pager.js rename to packages/demo/src/case/pager/demo.direction_pager.js diff --git a/demo/js/case/pager/index.js b/packages/demo/src/case/pager/index.js similarity index 100% rename from demo/js/case/pager/index.js rename to packages/demo/src/case/pager/index.js diff --git a/packages/demo/src/case/pane/demo.list_pane.js b/packages/demo/src/case/pane/demo.list_pane.js new file mode 100644 index 000000000..541d34fe5 --- /dev/null +++ b/packages/demo/src/case/pane/demo.list_pane.js @@ -0,0 +1,52 @@ +import { CONSTANTS } from "@/config/constant"; + +import { + ListPane, + MultiSelectItem, + ButtonGroup, + VerticalLayout, + shortcut, + Widget, + createItems, + deepClone, +} from "@fui/core"; + +@shortcut() +export class ListPaneDemo extends Widget { + static xtype = "demo.list_pane"; + + props = { baseCls: "demo-func" }; + + render() { + const self = this; + + return { + type: ListPane.xtype, + ref() { + self.pane = this; + }, + itemsCreator(op, callback) { + setTimeout(() => { + callback( + createItems(deepClone(CONSTANTS.ITEMS), { + type: MultiSelectItem.xtype, + height: 25, + }) + ); + }, 2000); + }, + el: { + type: ButtonGroup.xtype, + layouts: [ + { + type: VerticalLayout.xtype, + }, + ], + }, + }; + } + + mounted() { + this.pane.populate(); + } +} diff --git a/packages/demo/src/case/pane/demo.multi_popup_view.js b/packages/demo/src/case/pane/demo.multi_popup_view.js new file mode 100644 index 000000000..9d6357212 --- /dev/null +++ b/packages/demo/src/case/pane/demo.multi_popup_view.js @@ -0,0 +1,50 @@ +import { CONSTANTS } from "@/config/constant"; + +import { AbsoluteLayout, Combo, TextButton, MultiPopupView, ButtonGroup, VerticalLayout, MultiSelectItem, shortcut, Widget, createItems, deepClone } from "@fui/core" + + +@shortcut() +export class MultiPopupViewDemo extends Widget { + static xtype = "demo.multi_popup_view"; + + props = { baseCls: "demo-func" }; + + render() { + const self = this; + + return { + type: AbsoluteLayout.xtype, + items: [ + { + el: { + type: Combo.xtype, + width: 200, + height: 30, + el: { + type: TextButton.xtype, + text: "点击", + cls: "bi-border", + height: 30, + }, + popup: { + type: MultiPopupView.xtype, + el: { + type: ButtonGroup.xtype, + layouts: [ + { + type: VerticalLayout.xtype, + } + ], + items: createItems(deepClone(CONSTANTS.ITEMS), { + type: MultiSelectItem.xtype, + height: 25, + }), + }, + }, + }, + } + ], + }; + } +} + diff --git a/packages/demo/src/case/pane/demo.panel.js b/packages/demo/src/case/pane/demo.panel.js new file mode 100644 index 000000000..d6835e279 --- /dev/null +++ b/packages/demo/src/case/pane/demo.panel.js @@ -0,0 +1,39 @@ +import { CONSTANTS } from "@/config/constant"; + +import { Panel, Button, ButtonGroup, VerticalLayout, MultiSelectItem, shortcut, Widget, createItems, deepClone } from "@fui/core" + + +@shortcut() +export class PanelDemo extends Widget { + static xtype = "demo.panel"; + + props = { baseCls: "demo-func" }; + + render() { + const self = this; + + return { + type: Panel.xtype, + title: "title", + titleButtons: [ + { + type: Button.xtype, + text: "操作", + } + ], + el: { + type: ButtonGroup.xtype, + layouts: [ + { + type: VerticalLayout.xtype, + } + ], + items: createItems(deepClone(CONSTANTS.ITEMS), { + type: MultiSelectItem.xtype, + height: 25, + }), + }, + }; + } +} + diff --git a/packages/demo/src/case/pane/demo.popup_panel.js b/packages/demo/src/case/pane/demo.popup_panel.js new file mode 100644 index 000000000..d3cc26363 --- /dev/null +++ b/packages/demo/src/case/pane/demo.popup_panel.js @@ -0,0 +1,50 @@ +import { CONSTANTS } from "@/config/constant"; + +import { createItems, deepClone, AbsoluteLayout, Combo, TextButton, PopupPanel, ButtonGroup, VerticalLayout, MultiSelectItem, shortcut, Widget } from "@fui/core" + + +@shortcut() +export class PopupPanelDemo extends Widget { + static xtype = "demo.popup_panel"; + + props = { baseCls: "demo-func" }; + + render() { + const self = this; + + return { + type: AbsoluteLayout.xtype, + items: [ + { + el: { + type: Combo.xtype, + width: 200, + height: 30, + el: { + type: TextButton.xtype, + text: "点击", + cls: "bi-border", + height: 30, + }, + popup: { + type: PopupPanel.xtype, + el: { + type: ButtonGroup.xtype, + layouts: [ + { + type: VerticalLayout.xtype, + } + ], + items: createItems(deepClone(CONSTANTS.ITEMS), { + type: MultiSelectItem.xtype, + height: 25, + }), + }, + }, + }, + } + ], + }; + } +} + diff --git a/demo/js/case/pane/index.js b/packages/demo/src/case/pane/index.js similarity index 100% rename from demo/js/case/pane/index.js rename to packages/demo/src/case/pane/index.js diff --git a/demo/js/case/tree/demo.display_tree.js b/packages/demo/src/case/tree/demo.display_tree.js similarity index 100% rename from demo/js/case/tree/demo.display_tree.js rename to packages/demo/src/case/tree/demo.display_tree.js diff --git a/packages/demo/src/case/tree/demo.level_tree.js b/packages/demo/src/case/tree/demo.level_tree.js new file mode 100644 index 000000000..0f6a6222a --- /dev/null +++ b/packages/demo/src/case/tree/demo.level_tree.js @@ -0,0 +1,111 @@ +import { shortcut, Widget, createWidget } from "@/core"; +import { Msg } from "@/base"; + +@shortcut() +export class Func extends Widget { + static xtype = "demo.level_tree"; + + props = { baseCls: "demo-func" }; + + render() { + const tree = createWidget({ + type: "bi.level_tree", + chooseType: 0, + items: [ + { + id: 1, + text: "第一项", + value: 1, + isParent: true, + }, + { + id: 2, + text: "第二项", + value: 2, + isParent: true, + }, + { + id: 3, + text: "第三项", + value: 1, + isParent: true, + open: true, + }, + { + id: 4, + text: "第四项", + value: 1, + }, + { + id: 11, + pId: 1, + text: "子项1", + value: 11, + }, + { + id: 12, + pId: 1, + text: "子项2", + value: 12, + }, + { + id: 13, + pId: 1, + text: "子项3", + value: 13, + }, + { + id: 111, + pId: 11, + text: "子项1-1", + value: 111, + }, + { + id: 21, + pId: 2, + text: "子项1", + value: 21, + }, + { + id: 31, + pId: 3, + text: "子项1", + value: 31, + }, + { + id: 32, + pId: 3, + text: "子项2", + value: 32, + }, + { + id: 33, + pId: 3, + text: "子项3", + value: 33, + } + ], + }); + + createWidget({ + type: "bi.vtape", + element: this, + items: [ + { + el: tree, + }, + { + height: 30, + el: { + type: "bi.button", + height: 30, + text: "getValue", + handler() { + Msg.alert("", tree.getValue()); + }, + }, + } + ], + }); + } +} diff --git a/packages/demo/src/case/tree/demo.simple_tree.js b/packages/demo/src/case/tree/demo.simple_tree.js new file mode 100644 index 000000000..0ad803ae8 --- /dev/null +++ b/packages/demo/src/case/tree/demo.simple_tree.js @@ -0,0 +1,147 @@ +import { shortcut, Widget, createWidget } from "@/core"; +import { Msg } from "@/base"; + +@shortcut() +export class Func extends Widget { + static xtype = "demo.simple_tree"; + + props = { baseCls: "demo-func" }; + + render() { + // value值一定要是字符串 + const tree = createWidget({ + type: "bi.simple_tree", + items: [ + { + id: 1, + text: "第一项", + value: "1", + }, + { + id: 2, + text: "第二项", + value: "2", + }, + { + id: 3, + text: "第三项", + value: "3", + open: true, + }, + { + id: 11, + pId: 1, + text: "子项1", + value: "11", + }, + { + id: 12, + pId: 1, + text: "子项2", + value: "12", + }, + { + id: 13, + pId: 1, + text: "子项3", + value: "13", + }, + { + id: 31, + pId: 3, + text: "子项1", + value: "31", + }, + { + id: 32, + pId: 3, + text: "子项2", + value: "32", + }, + { + id: 33, + pId: 3, + text: "子项3", + value: "33", + } + ], + value: ["31", "32", "33"], + }); + + // tree.populate([{ + // id: 1, + // text: "第一项", + // value: "1" + // }, { + // id: 2, + // text: "第二项", + // value: "2" + // }, { + // id: 3, + // text: "第三项", + // value: "3", + // open: true + // }, { + // id: 11, + // pId: 1, + // text: "子项1", + // value: "11" + // }, { + // id: 12, + // pId: 1, + // text: "子项2", + // value: "12" + // }, { + // id: 13, + // pId: 1, + // text: "子项3", + // value: "13" + // }, { + // id: 31, + // pId: 3, + // text: "子项1", + // value: "31" + // }, { + // id: 32, + // pId: 3, + // text: "子项2", + // value: "32" + // }, { + // id: 33, + // pId: 3, + // text: "子项3", + // value: "33" + // }], "z"); + createWidget({ + type: "bi.vtape", + element: this, + items: [ + { + el: tree, + }, + { + height: 30, + el: { + type: "bi.button", + height: 30, + text: "setValue(['31', '32', '33'])", + handler() { + tree.setValue(["31", "32", "33"]); + }, + }, + }, + { + height: 30, + el: { + type: "bi.button", + height: 30, + text: "getValue", + handler() { + Msg.alert("", JSON.stringify(tree.getValue())); + }, + }, + } + ], + }); + } +} diff --git a/demo/js/case/tree/index.js b/packages/demo/src/case/tree/index.js similarity index 100% rename from demo/js/case/tree/index.js rename to packages/demo/src/case/tree/index.js diff --git a/demo/js/case/triggers/demo.editor_trigger.js b/packages/demo/src/case/triggers/demo.editor_trigger.js similarity index 100% rename from demo/js/case/triggers/demo.editor_trigger.js rename to packages/demo/src/case/triggers/demo.editor_trigger.js diff --git a/demo/js/case/triggers/demo.icon_trigger.js b/packages/demo/src/case/triggers/demo.icon_trigger.js similarity index 100% rename from demo/js/case/triggers/demo.icon_trigger.js rename to packages/demo/src/case/triggers/demo.icon_trigger.js diff --git a/demo/js/case/triggers/demo.select_text_trigger.js b/packages/demo/src/case/triggers/demo.select_text_trigger.js similarity index 100% rename from demo/js/case/triggers/demo.select_text_trigger.js rename to packages/demo/src/case/triggers/demo.select_text_trigger.js diff --git a/demo/js/case/triggers/demo.text_trigger.js b/packages/demo/src/case/triggers/demo.text_trigger.js similarity index 100% rename from demo/js/case/triggers/demo.text_trigger.js rename to packages/demo/src/case/triggers/demo.text_trigger.js diff --git a/demo/js/case/triggers/index.js b/packages/demo/src/case/triggers/index.js similarity index 100% rename from demo/js/case/triggers/index.js rename to packages/demo/src/case/triggers/index.js diff --git a/packages/demo/src/center.js b/packages/demo/src/center.js new file mode 100644 index 000000000..bb120071b --- /dev/null +++ b/packages/demo/src/center.js @@ -0,0 +1,32 @@ +import { shortcut, Widget, RouterView, Router } from '@fui/core'; + +@shortcut() +export class Center extends Widget { + static xtype = 'demo.center'; + + props = { baseCls: 'demo-center' }; + + render() { + const self = this; + + return { + type: RouterView.xtype, + }; + } +} + +@shortcut() +export class RouterDemo extends Widget { + static xtype = 'demo.router'; + + props = { + baseCls: 'demo-router', + }; + + render() { + const params = Router.$router.history.current.params; + return { + type: params.componentId, + }; + } +} diff --git a/packages/demo/src/config/base.js b/packages/demo/src/config/base.js new file mode 100644 index 000000000..195715320 --- /dev/null +++ b/packages/demo/src/config/base.js @@ -0,0 +1,11 @@ +import { basic } from "../base"; +import { transModule2Route } from "./utils"; + +export const baseConfig = [ + { + id: 2, + text: "基础控件", + open: false + }, + ...transModule2Route(basic, 2) +]; diff --git a/packages/demo/src/config/constant.js b/packages/demo/src/config/constant.js new file mode 100644 index 000000000..e6b94b74a --- /dev/null +++ b/packages/demo/src/config/constant.js @@ -0,0 +1,3600 @@ +import { map } from "@fui/core"; + +export const CONSTANTS = { + SIMPLE_ITEMS: map( + "柳州市城贸金属材料有限责任公司 柳州市建福房屋租赁有限公司 柳州市迅昌数码办公设备有限责任公司 柳州市河海贸易有限责任公司 柳州市花篮制衣厂 柳州市兴溪物资有限公司 柳州市针织总厂 柳州市衡管物资有限公司 柳州市琪成机电设备有限公司 柳州市松林工程机械修理厂".match( + /[^\s]+/g + ), + function (i, v) { + return { + text: v, + value: v, + title: v + }; + } + ), + ITEMS: map( + "柳州市城贸金属材料有限责任公司 柳州市建福房屋租赁有限公司 柳州市迅昌数码办公设备有限责任公司 柳州市河海贸易有限责任公司 柳州市花篮制衣厂 柳州市兴溪物资有限公司 柳州市针织总厂 柳州市衡管物资有限公司 柳州市琪成机电设备有限公司 柳州市松林工程机械修理厂 柳州市积玉贸易有限公司 柳州市福运来贸易有限责任公司 柳州市钢义物资有限公司 柳州市洋力化工有限公司 柳州市悦盛贸易有限公司 柳州市雁城钢管物资有限公司 柳州市恒瑞钢材经营部 柳州市科拓电子有限公司 柳州市九方电子有限公司 柳州市桂龙汽车配件厂 柳州市制鞋工厂 柳州市炜力科贸有限公司 柳州市希翼贸易有限公司 柳州市兆金物资有限公司 柳州市和润电子科技有限责任公司 柳州市汇凯贸易有限公司 柳州市好机汇商贸有限公司 柳州市泛源商贸经营部 柳州市利汇达物资有限公司 广西全民药业有限责任公司 柳州超凡物资贸易有限责任公司 柳州市贵宏物资有限责任公司 柳州昊恒贸易有限责任公司 柳州市浦联物资有限公司 柳州市广通园林绿化工程有限责任公司 柳州市松发物资贸易有限责任公司 柳州市奥士达办公设备有限责任公司 柳州市海泰物资有限公司 柳州市金三环针织厂 柳州市钢贸物资有限公司 柳州市明阳纺织有限公司 柳州市世科科技发展有限公司 柳州市禄羊贸易有限公司 柳州市金兆阳商贸有限公司 柳州市汇昌物资经营部 柳州市林泰金属物资供应站 柳州市自来水管道材料设备公司 柳州市丹柳铝板有限公司 柳州市桂冶物资有限公司 柳州市宸业物资经营部 柳州市耀成贸易有限公司 柳州奥易自动化科技有限公司 柳州市萃丰科技有限责任公司 柳州市华储贸易有限责任公司 柳州市黄颜钢材有限责任公司 柳州市银盛物资有限责任公司 柳州市新仪化玻供应站 柳州市晶凯化工有限公司 广西柳州市柳江包装纸厂 柳州市志新物资有限责任公司 柳州市兆钢物资有限公司 柳州市友方科技发展有限责任公司 柳州市缝纫机台板家具总厂 柳州市晖海数码办公设备有限责任公司 柳州市富兰特服饰有限责任公司 柳州市柳北区富兴物资经营部 柳州市柳锌福利厂 柳州市海泉印刷有限责任公司 柳州市乾亨贸易有限公司 柳州市悦宁物资贸易有限公司 柳州市昊天贸易有限公司 广西惠字钢铁有限公司 柳州市名青物资有限公司 柳州市林郝物资有限公司 柳州市民政服装厂 柳州市多维劳保用品厂 柳州市轻工物资供应公司 柳州市程源物资有限责任公司 柳州市寿丰物资贸易有限责任公司 柳州市凯凡物资有限公司 柳州市利晖物资经营部 柳州市恒茂金属物资供应站 柳州市中储物资经营部 柳州市第二医疗器械厂 柳州市来鑫物资经营部 柳州市钢鑫物资贸易有限责任公司 柳州市双合袜业有限责任公司 柳州市茂松经贸有限责任公司 柳州市行行物资贸易有限公司 柳州市方一物资有限公司 柳州成异钢管销售有限公司 柳州广惠佳电脑有限公司 桂林市圣泽鑫物资有限公司柳州分公司 柳州市砼基建材贸易有限公司 柳州市海燕针织厂 上海浦光仪表厂柳州销售处 柳州市能电工贸有限责任公司 柳州市广贸物资有限公司 柳州市柳北区大昌电工灯饰经营部 柳州市金龙印务有限公司 柳州市奇缘婚典服务有限公司 柳州市盛博物资经营部 柳州市项元钢铁贸易有限公司 柳州市虞美人化妆品经营部 柳州市俊彦鞋厂 柳州市聚源特钢有限公司 柳州市迅龙科贸有限责任公司 柳州市恒飞电子有限责任公司 柳州市蓝正现代办公设备有限责任公司 柳州地区农业生产资料公司 柳州华菱钢管销售有限公司 柳州融通物资有限公司 柳州市可仁广告策划有限责任公司 柳州市鸟鑫物资有限责任公司 柳州市五丰钢材供应站 柳州市金江不锈钢有限公司 柳州市美日物资设备有限责任公司 柳州市鑫东物资贸易有限责任公司 柳州地区日用杂品公司 柳州市华纳物资贸易有限公司 柳州乾利金虹物资贸易有限责任公司 柳州市新迈计算机有限公司 柳州市富丽实业发展公司 柳州市石钢金属材料有限公司 柳州市力志传真机销售有限公司 广西宝森投资有限公司 柳州市嵘基商贸有限公司 柳州市景民商贸有限责任公司 柳州市银桥化玻有限责任公司 柳州市宏文糖烟店 柳州市科苑电脑网络有限公司 柳州市两面针旅游用品厂 柳州市立早室内装璜有限责任公司 柳州地化建材有限公司 柳州市涛达贸易有限公司 柳州市兰丰档案服务中心 柳州市惠贸物资有限责任公司 柳州市立文物资有限责任公司 柳州市致和商贸经营部 柳州市金色阳光信息咨询有限公司 柳州市赛利钢材经销部 柳州市日用化工厂 柳州市昆廷物资有限责任公司 柳州市邦盛贸易有限公司 柳州市济华贸易有限公司 柳州昕威橡塑化工经营部 柳州市联业贸易有限公司 柳州市兰钢贸易有限公司 柳州市子欣科技有限公司 柳州市狄龙机电设备有限公司 柳州市方真物资贸易有限公司 柳州市银鸥废旧回收中心 柳州市冠宝贸易有限公司 柳州市鑫盛德商务咨询有限责任公司 柳州市泰汇银通经贸有限公司 广西瀚维智测科技有限公司 柳州市钓鱼郎制衣有限责任公司 柳州溪水物资有限公司 柳州市融峰物资有限责任公司 广西新地科技有限责任公司 柳州市纺织装饰公司 柳州市粤翔冶金炉料有限公司 柳州市远腾贸易有限公司 柳州市东鸿城市改造有限公司 广西丛欣实业有限公司 柳州市服装厂 柳州市立安联合刀片有限公司 广西国扬投资有限责任公司 柳州市铭泰办公设备公司 柳州市桂钢物资供应站 柳州市昱升物资有限责任公司 柳州市鹰飞灿科贸有限公司 柳州市先导科贸有限公司 柳州市金秋建材物资经营部 柳州市童装厂 柳州市民泽物资有限公司 柳州市恒先物资贸易有限公司 柳州市银夏冷气工程有限责任公司 柳州粮食批发有限责任公司 柳州市金银华窗纱制造有限责任公司 柳州市三方贸易有限公司 柳州市丰涛商贸有限责任公司 柳州华智企业管理咨询有限责任公司 柳州市诚正建筑工程施工图审查有限公司 柳州市今科电讯设备营销中心 柳州市闽德电子有限公司 柳州市鑫虹针织厂 柳州市畅通通讯器材有限责任公司 柳州市正钢物资经营部 柳州市新柳饲料有限责任公司 柳州市黄村油库 柳州市天泰电力装饰工程有限公司 柳州市兆吉物资有限责任公司 柳州市八龙纸制品有限责任公司 柳州市巨佳电脑网络科技有限公司 ".match( + /[^\s]+/g + ), + function (i, v) { + return { + text: v, + value: v, + title: v + }; + } + ), + TREEITEMS: [ + { pId: "0", id: "0_0", text: "( 共25个 )", value: "", open: true }, + { + pId: "0_0", + id: "0_0_0", + text: "安徽省( 共1个 )", + value: "安徽省", + open: true + }, + { + pId: "0_0_0", + id: "0_0_0_0", + text: "芜湖市", + value: "芜湖市", + open: true + }, + { + pId: "0_0", + id: "0_0_1", + text: "北京市( 共6个 )", + value: "北京市", + open: true + }, + { + pId: "0_0_1", + id: "0_0_1_0", + text: "北京市区", + value: "北京市区", + open: true + }, + { + pId: "0_0_1", + id: "0_0_1_1", + text: "朝阳区", + value: "朝阳区", + open: true + }, + { + pId: "0_0_1", + id: "0_0_1_2", + text: "东城区", + value: "东城区", + open: true + }, + { + pId: "0_0_1", + id: "0_0_1_3", + text: "海淀区4内", + value: "海淀区4内", + open: true + }, + { + pId: "0_0_1", + id: "0_0_1_4", + text: "海淀区4外", + value: "海淀区4外", + open: true + }, + { + pId: "0_0_1", + id: "0_0_1_5", + text: "石景山区", + value: "石景山区", + open: true + }, + { + pId: "0_0", + id: "0_0_2", + text: "福建省( 共2个 )", + value: "福建省", + open: true + }, + { + pId: "0_0_2", + id: "0_0_2_0", + text: "莆田市", + value: "莆田市", + open: true + }, + { + pId: "0_0_2", + id: "0_0_2_1", + text: "泉州市", + value: "泉州市", + open: true + }, + { + pId: "0_0", + id: "0_0_3", + text: "甘肃省( 共1个 )", + value: "甘肃省", + open: true + }, + { + pId: "0_0_3", + id: "0_0_3_0", + text: "兰州市", + value: "兰州市", + open: true + }, + { + pId: "0_0", + id: "0_0_4", + text: "广东省( 共5个 )", + value: "广东省", + open: true + }, + { + pId: "0_0_4", + id: "0_0_4_0", + text: "东莞市", + value: "东莞市", + open: true + }, + { + pId: "0_0_4", + id: "0_0_4_1", + text: "广州市", + value: "广州市", + open: true + }, + { + pId: "0_0_4", + id: "0_0_4_2", + text: "惠州市", + value: "惠州市", + open: true + }, + { + pId: "0_0_4", + id: "0_0_4_3", + text: "深圳市", + value: "深圳市", + open: true + }, + { + pId: "0_0_4", + id: "0_0_4_4", + text: "珠海市", + value: "珠海市", + open: true + }, + { + pId: "0_0", + id: "0_0_5", + text: "广西壮族自治区( 共1个 )", + value: "广西壮族自治区", + open: true + }, + { + pId: "0_0_5", + id: "0_0_5_0", + text: "南宁市", + value: "南宁市", + open: true + }, + { + pId: "0_0", + id: "0_0_6", + text: "河北省( 共2个 )", + value: "河北省", + open: true + }, + { + pId: "0_0_6", + id: "0_0_6_0", + text: "保定市", + value: "保定市", + open: true + }, + { + pId: "0_0_6", + id: "0_0_6_1", + text: "邢台市", + value: "邢台市", + open: true + }, + { + pId: "0_0", + id: "0_0_7", + text: "河南省( 共1个 )", + value: "河南省", + open: true + }, + { + pId: "0_0_7", + id: "0_0_7_0", + text: "郑州市", + value: "郑州市", + open: true + }, + { + pId: "0_0", + id: "0_0_8", + text: "黑龙江省( 共7个 )", + value: "黑龙江省", + open: true + }, + { + pId: "0_0_8", + id: "0_0_8_0", + text: "大庆市", + value: "大庆市", + open: true + }, + { + pId: "0_0_8", + id: "0_0_8_1", + text: "哈尔滨市", + value: "哈尔滨市", + open: true + }, + { + pId: "0_0_8", + id: "0_0_8_2", + text: "鸡西市", + value: "鸡西市", + open: true + }, + { + pId: "0_0_8", + id: "0_0_8_3", + text: "佳木斯市", + value: "佳木斯市", + open: true + }, + { + pId: "0_0_8", + id: "0_0_8_4", + text: "牡丹江市", + value: "牡丹江市", + open: true + }, + { + pId: "0_0_8", + id: "0_0_8_5", + text: "齐齐哈尔市", + value: "齐齐哈尔市", + open: true + }, + { + pId: "0_0_8", + id: "0_0_8_6", + text: "双鸭山市", + value: "双鸭山市", + open: true + }, + { + pId: "0_0", + id: "0_0_9", + text: "湖北省( 共1个 )", + value: "湖北省", + open: true + }, + { + pId: "0_0_9", + id: "0_0_9_0", + text: "武汉市", + value: "武汉市", + open: true + }, + { + pId: "0_0", + id: "0_0_10", + text: "湖南省( 共3个 )", + value: "湖南省", + open: true + }, + { + pId: "0_0_10", + id: "0_0_10_0", + text: "常德市", + value: "常德市", + open: true + }, + { + pId: "0_0_10", + id: "0_0_10_1", + text: "长沙市", + value: "长沙市", + open: true + }, + { + pId: "0_0_10", + id: "0_0_10_2", + text: "邵阳市", + value: "邵阳市", + open: true + }, + { + pId: "0_0", + id: "0_0_11", + text: "吉林省( 共4个 )", + value: "吉林省", + open: true + }, + { + pId: "0_0_11", + id: "0_0_11_0", + text: "白山市", + value: "白山市", + open: true + }, + { + pId: "0_0_11", + id: "0_0_11_1", + text: "长春市", + value: "长春市", + open: true + }, + { + pId: "0_0_11", + id: "0_0_11_2", + text: "松原市", + value: "松原市", + open: true + }, + { + pId: "0_0_11", + id: "0_0_11_3", + text: "通化市", + value: "通化市", + open: true + }, + { + pId: "0_0", + id: "0_0_12", + text: "江苏省( 共8个 )", + value: "江苏省", + open: true + }, + { + pId: "0_0_12", + id: "0_0_12_0", + text: "常州市", + value: "常州市", + open: true + }, + { + pId: "0_0_12", + id: "0_0_12_1", + text: "南京市", + value: "南京市", + open: true + }, + { + pId: "0_0_12", + id: "0_0_12_2", + text: "南通市", + value: "南通市", + open: true + }, + { + pId: "0_0_12", + id: "0_0_12_3", + text: "苏州市", + value: "苏州市", + open: true + }, + { + pId: "0_0_12", + id: "0_0_12_4", + text: "宿迁市", + value: "宿迁市", + open: true + }, + { + pId: "0_0_12", + id: "0_0_12_5", + text: "泰州市", + value: "泰州市", + open: true + }, + { + pId: "0_0_12", + id: "0_0_12_6", + text: "无锡市", + value: "无锡市", + open: true + }, + { + pId: "0_0_12", + id: "0_0_12_7", + text: "盐城市", + value: "盐城市", + open: true + }, + { + pId: "0_0", + id: "0_0_13", + text: "辽宁省( 共11个 )", + value: "辽宁省", + open: true + }, + { + pId: "0_0_13", + id: "0_0_13_0", + text: "鞍山市", + value: "鞍山市", + open: true + }, + { + pId: "0_0_13", + id: "0_0_13_1", + text: "本溪市", + value: "本溪市", + open: true + }, + { + pId: "0_0_13", + id: "0_0_13_2", + text: "朝阳市", + value: "朝阳市", + open: true + }, + { + pId: "0_0_13", + id: "0_0_13_3", + text: "大连市", + value: "大连市", + open: true + }, + { + pId: "0_0_13", + id: "0_0_13_4", + text: "抚顺市", + value: "抚顺市", + open: true + }, + { + pId: "0_0_13", + id: "0_0_13_5", + text: "葫芦岛市", + value: "葫芦岛市", + open: true + }, + { + pId: "0_0_13", + id: "0_0_13_6", + text: "锦州市", + value: "锦州市", + open: true + }, + { + pId: "0_0_13", + id: "0_0_13_7", + text: "辽阳市", + value: "辽阳市", + open: true + }, + { + pId: "0_0_13", + id: "0_0_13_8", + text: "盘锦市", + value: "盘锦市", + open: true + }, + { + pId: "0_0_13", + id: "0_0_13_9", + text: "沈阳市", + value: "沈阳市", + open: true + }, + { + pId: "0_0_13", + id: "0_0_13_10", + text: "营口市", + value: "营口市", + open: true + }, + { + pId: "0_0", + id: "0_0_14", + text: "内蒙古( 共1个 )", + value: "内蒙古", + open: true + }, + { + pId: "0_0_14", + id: "0_0_14_0", + text: "鄂尔多斯市", + value: "鄂尔多斯市", + open: true + }, + { + pId: "0_0", + id: "0_0_15", + text: "宁夏回族自治区( 共1个 )", + value: "宁夏回族自治区", + open: true + }, + { + pId: "0_0_15", + id: "0_0_15_0", + text: "银川市", + value: "银川市", + open: true + }, + { + pId: "0_0", + id: "0_0_16", + text: "山东省( 共7个 )", + value: "山东省", + open: true + }, + { + pId: "0_0_16", + id: "0_0_16_0", + text: "济南市", + value: "济南市", + open: true + }, + { + pId: "0_0_16", + id: "0_0_16_1", + text: "济宁市", + value: "济宁市", + open: true + }, + { + pId: "0_0_16", + id: "0_0_16_2", + text: "聊城市", + value: "聊城市", + open: true + }, + { + pId: "0_0_16", + id: "0_0_16_3", + text: "临沂市", + value: "临沂市", + open: true + }, + { + pId: "0_0_16", + id: "0_0_16_4", + text: "青岛市", + value: "青岛市", + open: true + }, + { + pId: "0_0_16", + id: "0_0_16_5", + text: "烟台市", + value: "烟台市", + open: true + }, + { + pId: "0_0_16", + id: "0_0_16_6", + text: "枣庄市", + value: "枣庄市", + open: true + }, + { + pId: "0_0", + id: "0_0_17", + text: "山西省( 共1个 )", + value: "山西省", + open: true + }, + { + pId: "0_0_17", + id: "0_0_17_0", + text: "太原市", + value: "太原市", + open: true + }, + { + pId: "0_0", + id: "0_0_18", + text: "陕西省( 共1个 )", + value: "陕西省", + open: true + }, + { + pId: "0_0_18", + id: "0_0_18_0", + text: "西安市", + value: "西安市", + open: true + }, + { + pId: "0_0", + id: "0_0_19", + text: "上海市( 共1个 )", + value: "上海市", + open: true + }, + { + pId: "0_0_19", + id: "0_0_19_0", + text: "上海市区", + value: "上海市区", + open: true + }, + { + pId: "0_0", + id: "0_0_20", + text: "四川省( 共1个 )", + value: "四川省", + open: true + }, + { + pId: "0_0_20", + id: "0_0_20_0", + text: "成都市", + value: "成都市", + open: true + }, + { + pId: "0_0", + id: "0_0_21", + text: "新疆维吾尔族自治区( 共2个 )", + value: "新疆维吾尔族自治区", + open: true + }, + { + pId: "0_0_21", + id: "0_0_21_0", + text: "吐鲁番地区", + value: "吐鲁番地区", + open: true + }, + { + pId: "0_0_21", + id: "0_0_21_1", + text: "乌鲁木齐", + value: "乌鲁木齐", + open: true + }, + { + pId: "0_0", + id: "0_0_22", + text: "云南省( 共1个 )", + value: "云南省", + open: true + }, + { + pId: "0_0_22", + id: "0_0_22_0", + text: "昆明市", + value: "昆明市", + open: true + }, + { + pId: "0_0", + id: "0_0_23", + text: "浙江省( 共5个 )", + value: "浙江省", + open: true + }, + { + pId: "0_0_23", + id: "0_0_23_0", + text: "杭州市", + value: "杭州市", + open: true + }, + { + pId: "0_0_23", + id: "0_0_23_1", + text: "湖州市", + value: "湖州市", + open: true + }, + { + pId: "0_0_23", + id: "0_0_23_2", + text: "嘉兴市", + value: "嘉兴市", + open: true + }, + { + pId: "0_0_23", + id: "0_0_23_3", + text: "宁波市", + value: "宁波市", + open: true + }, + { + pId: "0_0_23", + id: "0_0_23_4", + text: "绍兴市", + value: "绍兴市", + open: true + }, + { + pId: "0_0", + id: "0_0_24", + text: "重庆市( 共1个 )", + value: "重庆市", + open: true + }, + { + pId: "0_0_24", + id: "0_0_24_0", + text: "重庆市区", + value: "重庆市区", + open: true + }, + { + pId: "0", + id: "0_1", + text: "中国( 共34个 )", + value: "中国", + open: true + }, + { + pId: "0_1", + id: "0_1_0", + text: "安徽省( 共19个 )", + value: "安徽省", + open: true + }, + { + pId: "0_1_0", + id: "0_1_0_0", + text: "安庆市", + value: "安庆市", + open: true + }, + { + pId: "0_1_0", + id: "0_1_0_1", + text: "蚌埠市", + value: "蚌埠市", + open: true + }, + { + pId: "0_1_0", + id: "0_1_0_2", + text: "亳州市", + value: "亳州市", + open: true + }, + { + pId: "0_1_0", + id: "0_1_0_3", + text: "巢湖市", + value: "巢湖市", + open: true + }, + { + pId: "0_1_0", + id: "0_1_0_4", + text: "池州市", + value: "池州市", + open: true + }, + { + pId: "0_1_0", + id: "0_1_0_5", + text: "滁州市", + value: "滁州市", + open: true + }, + { + pId: "0_1_0", + id: "0_1_0_6", + text: "阜阳市", + value: "阜阳市", + open: true + }, + { + pId: "0_1_0", + id: "0_1_0_7", + text: "毫州市", + value: "毫州市", + open: true + }, + { + pId: "0_1_0", + id: "0_1_0_8", + text: "合肥市", + value: "合肥市", + open: true + }, + { + pId: "0_1_0", + id: "0_1_0_9", + text: "淮北市", + value: "淮北市", + open: true + }, + { + pId: "0_1_0", + id: "0_1_0_10", + text: "淮南市", + value: "淮南市", + open: true + }, + { + pId: "0_1_0", + id: "0_1_0_11", + text: "黄山市", + value: "黄山市", + open: true + }, + { + pId: "0_1_0", + id: "0_1_0_12", + text: "六安市", + value: "六安市", + open: true + }, + { + pId: "0_1_0", + id: "0_1_0_13", + text: "马鞍山市", + value: "马鞍山市", + open: true + }, + { + pId: "0_1_0", + id: "0_1_0_14", + text: "濮阳市", + value: "濮阳市", + open: true + }, + { + pId: "0_1_0", + id: "0_1_0_15", + text: "宿州市", + value: "宿州市", + open: true + }, + { + pId: "0_1_0", + id: "0_1_0_16", + text: "铜陵市", + value: "铜陵市", + open: true + }, + { + pId: "0_1_0", + id: "0_1_0_17", + text: "芜湖市", + value: "芜湖市", + open: true + }, + { + pId: "0_1_0", + id: "0_1_0_18", + text: "宣城市", + value: "宣城市", + open: true + }, + { + pId: "0_1", + id: "0_1_1", + text: "澳门特别行政区( 共1个 )", + value: "澳门特别行政区", + open: true + }, + { + pId: "0_1_1", + id: "0_1_1_0", + text: "澳门", + value: "澳门", + open: true + }, + { + pId: "0_1", + id: "0_1_2", + text: "北京市( 共17个 )", + value: "北京市", + open: true + }, + { + pId: "0_1_2", + id: "0_1_2_0", + text: "北京市区", + value: "北京市区", + open: true + }, + { + pId: "0_1_2", + id: "0_1_2_1", + text: "昌平区", + value: "昌平区", + open: true + }, + { + pId: "0_1_2", + id: "0_1_2_2", + text: "朝阳区", + value: "朝阳区", + open: true + }, + { + pId: "0_1_2", + id: "0_1_2_3", + text: "大兴区", + value: "大兴区", + open: true + }, + { + pId: "0_1_2", + id: "0_1_2_4", + text: "东城区", + value: "东城区", + open: true + }, + { + pId: "0_1_2", + id: "0_1_2_5", + text: "房山区", + value: "房山区", + open: true + }, + { + pId: "0_1_2", + id: "0_1_2_6", + text: "丰台区", + value: "丰台区", + open: true + }, + { + pId: "0_1_2", + id: "0_1_2_7", + text: "海淀区", + value: "海淀区", + open: true + }, + { + pId: "0_1_2", + id: "0_1_2_8", + text: "海淀区4内", + value: "海淀区4内", + open: true + }, + { + pId: "0_1_2", + id: "0_1_2_9", + text: "海淀区4外", + value: "海淀区4外", + open: true + }, + { + pId: "0_1_2", + id: "0_1_2_10", + text: "门头沟区", + value: "门头沟区", + open: true + }, + { + pId: "0_1_2", + id: "0_1_2_11", + text: "平谷区", + value: "平谷区", + open: true + }, + { + pId: "0_1_2", + id: "0_1_2_12", + text: "石景山区", + value: "石景山区", + open: true + }, + { + pId: "0_1_2", + id: "0_1_2_13", + text: "顺义区", + value: "顺义区", + open: true + }, + { + pId: "0_1_2", + id: "0_1_2_14", + text: "通州区", + value: "通州区", + open: true + }, + { + pId: "0_1_2", + id: "0_1_2_15", + text: "西城区", + value: "西城区", + open: true + }, + { + pId: "0_1_2", + id: "0_1_2_16", + text: "西城区 ", + value: "西城区 ", + open: true + }, + { + pId: "0_1", + id: "0_1_3", + text: "福建省( 共9个 )", + value: "福建省", + open: true + }, + { + pId: "0_1_3", + id: "0_1_3_0", + text: "福州市", + value: "福州市", + open: true + }, + { + pId: "0_1_3", + id: "0_1_3_1", + text: "龙岩市", + value: "龙岩市", + open: true + }, + { + pId: "0_1_3", + id: "0_1_3_2", + text: "南平市", + value: "南平市", + open: true + }, + { + pId: "0_1_3", + id: "0_1_3_3", + text: "宁德市", + value: "宁德市", + open: true + }, + { + pId: "0_1_3", + id: "0_1_3_4", + text: "莆田市", + value: "莆田市", + open: true + }, + { + pId: "0_1_3", + id: "0_1_3_5", + text: "泉州市", + value: "泉州市", + open: true + }, + { + pId: "0_1_3", + id: "0_1_3_6", + text: "三明市", + value: "三明市", + open: true + }, + { + pId: "0_1_3", + id: "0_1_3_7", + text: "厦门市", + value: "厦门市", + open: true + }, + { + pId: "0_1_3", + id: "0_1_3_8", + text: "漳州市", + value: "漳州市", + open: true + }, + { + pId: "0_1", + id: "0_1_4", + text: "甘肃省( 共12个 )", + value: "甘肃省", + open: true + }, + { + pId: "0_1_4", + id: "0_1_4_0", + text: "白银市", + value: "白银市", + open: true + }, + { + pId: "0_1_4", + id: "0_1_4_1", + text: "嘉峪关市", + value: "嘉峪关市", + open: true + }, + { + pId: "0_1_4", + id: "0_1_4_2", + text: "金昌市", + value: "金昌市", + open: true + }, + { + pId: "0_1_4", + id: "0_1_4_3", + text: "酒泉市", + value: "酒泉市", + open: true + }, + { + pId: "0_1_4", + id: "0_1_4_4", + text: "兰州市", + value: "兰州市", + open: true + }, + { + pId: "0_1_4", + id: "0_1_4_5", + text: "陇南市", + value: "陇南市", + open: true + }, + { + pId: "0_1_4", + id: "0_1_4_6", + text: "平凉市", + value: "平凉市", + open: true + }, + { + pId: "0_1_4", + id: "0_1_4_7", + text: "庆阳市", + value: "庆阳市", + open: true + }, + { + pId: "0_1_4", + id: "0_1_4_8", + text: "天津市区", + value: "天津市区", + open: true + }, + { + pId: "0_1_4", + id: "0_1_4_9", + text: "天水市", + value: "天水市", + open: true + }, + { + pId: "0_1_4", + id: "0_1_4_10", + text: "武威市", + value: "武威市", + open: true + }, + { + pId: "0_1_4", + id: "0_1_4_11", + text: "张掖市", + value: "张掖市", + open: true + }, + { + pId: "0_1", + id: "0_1_5", + text: "广东省( 共21个 )", + value: "广东省", + open: true + }, + { + pId: "0_1_5", + id: "0_1_5_0", + text: "潮州市", + value: "潮州市", + open: true + }, + { + pId: "0_1_5", + id: "0_1_5_1", + text: "东莞市", + value: "东莞市", + open: true + }, + { + pId: "0_1_5", + id: "0_1_5_2", + text: "佛山市", + value: "佛山市", + open: true + }, + { + pId: "0_1_5", + id: "0_1_5_3", + text: "广州市", + value: "广州市", + open: true + }, + { + pId: "0_1_5", + id: "0_1_5_4", + text: "河源市", + value: "河源市", + open: true + }, + { + pId: "0_1_5", + id: "0_1_5_5", + text: "惠州市", + value: "惠州市", + open: true + }, + { + pId: "0_1_5", + id: "0_1_5_6", + text: "江门市", + value: "江门市", + open: true + }, + { + pId: "0_1_5", + id: "0_1_5_7", + text: "揭阳市", + value: "揭阳市", + open: true + }, + { + pId: "0_1_5", + id: "0_1_5_8", + text: "茂名市", + value: "茂名市", + open: true + }, + { + pId: "0_1_5", + id: "0_1_5_9", + text: "梅州市", + value: "梅州市", + open: true + }, + { + pId: "0_1_5", + id: "0_1_5_10", + text: "清远市", + value: "清远市", + open: true + }, + { + pId: "0_1_5", + id: "0_1_5_11", + text: "汕头市", + value: "汕头市", + open: true + }, + { + pId: "0_1_5", + id: "0_1_5_12", + text: "汕尾市", + value: "汕尾市", + open: true + }, + { + pId: "0_1_5", + id: "0_1_5_13", + text: "韶关市", + value: "韶关市", + open: true + }, + { + pId: "0_1_5", + id: "0_1_5_14", + text: "深圳市", + value: "深圳市", + open: true + }, + { + pId: "0_1_5", + id: "0_1_5_15", + text: "阳江市", + value: "阳江市", + open: true + }, + { + pId: "0_1_5", + id: "0_1_5_16", + text: "云浮市", + value: "云浮市", + open: true + }, + { + pId: "0_1_5", + id: "0_1_5_17", + text: "湛江市", + value: "湛江市", + open: true + }, + { + pId: "0_1_5", + id: "0_1_5_18", + text: "肇庆市", + value: "肇庆市", + open: true + }, + { + pId: "0_1_5", + id: "0_1_5_19", + text: "中山市", + value: "中山市", + open: true + }, + { + pId: "0_1_5", + id: "0_1_5_20", + text: "珠海市", + value: "珠海市", + open: true + }, + { + pId: "0_1", + id: "0_1_6", + text: "广西壮族自治区( 共14个 )", + value: "广西壮族自治区", + open: true + }, + { + pId: "0_1_6", + id: "0_1_6_0", + text: "百色市", + value: "百色市", + open: true + }, + { + pId: "0_1_6", + id: "0_1_6_1", + text: "北海市", + value: "北海市", + open: true + }, + { + pId: "0_1_6", + id: "0_1_6_2", + text: "崇左市", + value: "崇左市", + open: true + }, + { + pId: "0_1_6", + id: "0_1_6_3", + text: "防城港市", + value: "防城港市", + open: true + }, + { + pId: "0_1_6", + id: "0_1_6_4", + text: "桂林市", + value: "桂林市", + open: true + }, + { + pId: "0_1_6", + id: "0_1_6_5", + text: "贵港市", + value: "贵港市", + open: true + }, + { + pId: "0_1_6", + id: "0_1_6_6", + text: "河池市", + value: "河池市", + open: true + }, + { + pId: "0_1_6", + id: "0_1_6_7", + text: "贺州市", + value: "贺州市", + open: true + }, + { + pId: "0_1_6", + id: "0_1_6_8", + text: "来宾市", + value: "来宾市", + open: true + }, + { + pId: "0_1_6", + id: "0_1_6_9", + text: "柳州市", + value: "柳州市", + open: true + }, + { + pId: "0_1_6", + id: "0_1_6_10", + text: "南宁市", + value: "南宁市", + open: true + }, + { + pId: "0_1_6", + id: "0_1_6_11", + text: "钦州市", + value: "钦州市", + open: true + }, + { + pId: "0_1_6", + id: "0_1_6_12", + text: "梧州市", + value: "梧州市", + open: true + }, + { + pId: "0_1_6", + id: "0_1_6_13", + text: "玉林市", + value: "玉林市", + open: true + }, + { + pId: "0_1", + id: "0_1_7", + text: "贵州省( 共9个 )", + value: "贵州省", + open: true + }, + { + pId: "0_1_7", + id: "0_1_7_0", + text: "安顺市", + value: "安顺市", + open: true + }, + { + pId: "0_1_7", + id: "0_1_7_1", + text: "毕节地区", + value: "毕节地区", + open: true + }, + { + pId: "0_1_7", + id: "0_1_7_2", + text: "贵阳市", + value: "贵阳市", + open: true + }, + { + pId: "0_1_7", + id: "0_1_7_3", + text: "六盘水市", + value: "六盘水市", + open: true + }, + { + pId: "0_1_7", + id: "0_1_7_4", + text: "黔东南州", + value: "黔东南州", + open: true + }, + { + pId: "0_1_7", + id: "0_1_7_5", + text: "黔南州", + value: "黔南州", + open: true + }, + { + pId: "0_1_7", + id: "0_1_7_6", + text: "黔西南市", + value: "黔西南市", + open: true + }, + { + pId: "0_1_7", + id: "0_1_7_7", + text: "铜仁地区", + value: "铜仁地区", + open: true + }, + { + pId: "0_1_7", + id: "0_1_7_8", + text: "遵义市", + value: "遵义市", + open: true + }, + { + pId: "0_1", + id: "0_1_8", + text: "海南省( 共2个 )", + value: "海南省", + open: true + }, + { + pId: "0_1_8", + id: "0_1_8_0", + text: "海口市", + value: "海口市", + open: true + }, + { + pId: "0_1_8", + id: "0_1_8_1", + text: "三亚市", + value: "三亚市", + open: true + }, + { + pId: "0_1", + id: "0_1_9", + text: "河北省( 共12个 )", + value: "河北省", + open: true + }, + { + pId: "0_1_9", + id: "0_1_9_0", + text: "保定市", + value: "保定市", + open: true + }, + { + pId: "0_1_9", + id: "0_1_9_1", + text: "沧州市", + value: "沧州市", + open: true + }, + { + pId: "0_1_9", + id: "0_1_9_2", + text: "承德市", + value: "承德市", + open: true + }, + { + pId: "0_1_9", + id: "0_1_9_3", + text: "邯郸市", + value: "邯郸市", + open: true + }, + { + pId: "0_1_9", + id: "0_1_9_4", + text: "衡水市", + value: "衡水市", + open: true + }, + { + pId: "0_1_9", + id: "0_1_9_5", + text: "廊坊市", + value: "廊坊市", + open: true + }, + { + pId: "0_1_9", + id: "0_1_9_6", + text: "秦皇岛市", + value: "秦皇岛市", + open: true + }, + { + pId: "0_1_9", + id: "0_1_9_7", + text: "石家庄市", + value: "石家庄市", + open: true + }, + { + pId: "0_1_9", + id: "0_1_9_8", + text: "唐山市", + value: "唐山市", + open: true + }, + { + pId: "0_1_9", + id: "0_1_9_9", + text: "天津市区", + value: "天津市区", + open: true + }, + { + pId: "0_1_9", + id: "0_1_9_10", + text: "邢台市", + value: "邢台市", + open: true + }, + { + pId: "0_1_9", + id: "0_1_9_11", + text: "张家口市", + value: "张家口市", + open: true + }, + { + pId: "0_1", + id: "0_1_10", + text: "河南省( 共19个 )", + value: "河南省", + open: true + }, + { + pId: "0_1_10", + id: "0_1_10_0", + text: "安阳市", + value: "安阳市", + open: true + }, + { + pId: "0_1_10", + id: "0_1_10_1", + text: "鹤壁市", + value: "鹤壁市", + open: true + }, + { + pId: "0_1_10", + id: "0_1_10_2", + text: "济源市", + value: "济源市", + open: true + }, + { + pId: "0_1_10", + id: "0_1_10_3", + text: "焦作市", + value: "焦作市", + open: true + }, + { + pId: "0_1_10", + id: "0_1_10_4", + text: "开封市", + value: "开封市", + open: true + }, + { + pId: "0_1_10", + id: "0_1_10_5", + text: "廊坊市", + value: "廊坊市", + open: true + }, + { + pId: "0_1_10", + id: "0_1_10_6", + text: "洛阳市", + value: "洛阳市", + open: true + }, + { + pId: "0_1_10", + id: "0_1_10_7", + text: "漯河市", + value: "漯河市", + open: true + }, + { + pId: "0_1_10", + id: "0_1_10_8", + text: "南阳市", + value: "南阳市", + open: true + }, + { + pId: "0_1_10", + id: "0_1_10_9", + text: "平顶山市", + value: "平顶山市", + open: true + }, + { + pId: "0_1_10", + id: "0_1_10_10", + text: "濮阳市", + value: "濮阳市", + open: true + }, + { + pId: "0_1_10", + id: "0_1_10_11", + text: "三门峡市", + value: "三门峡市", + open: true + }, + { + pId: "0_1_10", + id: "0_1_10_12", + text: "商丘市", + value: "商丘市", + open: true + }, + { + pId: "0_1_10", + id: "0_1_10_13", + text: "新乡市", + value: "新乡市", + open: true + }, + { + pId: "0_1_10", + id: "0_1_10_14", + text: "信阳市", + value: "信阳市", + open: true + }, + { + pId: "0_1_10", + id: "0_1_10_15", + text: "许昌市", + value: "许昌市", + open: true + }, + { + pId: "0_1_10", + id: "0_1_10_16", + text: "郑州市", + value: "郑州市", + open: true + }, + { + pId: "0_1_10", + id: "0_1_10_17", + text: "周口市", + value: "周口市", + open: true + }, + { + pId: "0_1_10", + id: "0_1_10_18", + text: "驻马店市", + value: "驻马店市", + open: true + }, + { + pId: "0_1", + id: "0_1_11", + text: "黑龙江省( 共13个 )", + value: "黑龙江省", + open: true + }, + { + pId: "0_1_11", + id: "0_1_11_0", + text: "大庆市", + value: "大庆市", + open: true + }, + { + pId: "0_1_11", + id: "0_1_11_1", + text: "大兴安岭地区", + value: "大兴安岭地区", + open: true + }, + { + pId: "0_1_11", + id: "0_1_11_2", + text: "大兴安岭市", + value: "大兴安岭市", + open: true + }, + { + pId: "0_1_11", + id: "0_1_11_3", + text: "哈尔滨市", + value: "哈尔滨市", + open: true + }, + { + pId: "0_1_11", + id: "0_1_11_4", + text: "鹤港市", + value: "鹤港市", + open: true + }, + { + pId: "0_1_11", + id: "0_1_11_5", + text: "黑河市", + value: "黑河市", + open: true + }, + { + pId: "0_1_11", + id: "0_1_11_6", + text: "佳木斯市", + value: "佳木斯市", + open: true + }, + { + pId: "0_1_11", + id: "0_1_11_7", + text: "牡丹江市", + value: "牡丹江市", + open: true + }, + { + pId: "0_1_11", + id: "0_1_11_8", + text: "七台河市", + value: "七台河市", + open: true + }, + { + pId: "0_1_11", + id: "0_1_11_9", + text: "齐齐哈尔市", + value: "齐齐哈尔市", + open: true + }, + { + pId: "0_1_11", + id: "0_1_11_10", + text: "双鸭山市", + value: "双鸭山市", + open: true + }, + { + pId: "0_1_11", + id: "0_1_11_11", + text: "绥化市", + value: "绥化市", + open: true + }, + { + pId: "0_1_11", + id: "0_1_11_12", + text: "伊春市", + value: "伊春市", + open: true + }, + { + pId: "0_1", + id: "0_1_12", + text: "湖北省( 共16个 )", + value: "湖北省", + open: true + }, + { + pId: "0_1_12", + id: "0_1_12_0", + text: "鄂州市", + value: "鄂州市", + open: true + }, + { + pId: "0_1_12", + id: "0_1_12_1", + text: "恩施土家族苗族自治州", + value: "恩施土家族苗族自治州", + open: true + }, + { + pId: "0_1_12", + id: "0_1_12_2", + text: "黄冈市", + value: "黄冈市", + open: true + }, + { + pId: "0_1_12", + id: "0_1_12_3", + text: "黄石市", + value: "黄石市", + open: true + }, + { + pId: "0_1_12", + id: "0_1_12_4", + text: "荆门市", + value: "荆门市", + open: true + }, + { + pId: "0_1_12", + id: "0_1_12_5", + text: "荆州市", + value: "荆州市", + open: true + }, + { + pId: "0_1_12", + id: "0_1_12_6", + text: "神农架市", + value: "神农架市", + open: true + }, + { + pId: "0_1_12", + id: "0_1_12_7", + text: "十堰市", + value: "十堰市", + open: true + }, + { + pId: "0_1_12", + id: "0_1_12_8", + text: "随州市", + value: "随州市", + open: true + }, + { + pId: "0_1_12", + id: "0_1_12_9", + text: "天门市", + value: "天门市", + open: true + }, + { + pId: "0_1_12", + id: "0_1_12_10", + text: "武汉市", + value: "武汉市", + open: true + }, + { + pId: "0_1_12", + id: "0_1_12_11", + text: "咸宁市", + value: "咸宁市", + open: true + }, + { + pId: "0_1_12", + id: "0_1_12_12", + text: "襄樊市", + value: "襄樊市", + open: true + }, + { + pId: "0_1_12", + id: "0_1_12_13", + text: "襄阳市", + value: "襄阳市", + open: true + }, + { + pId: "0_1_12", + id: "0_1_12_14", + text: "孝感市", + value: "孝感市", + open: true + }, + { + pId: "0_1_12", + id: "0_1_12_15", + text: "宜昌市", + value: "宜昌市", + open: true + }, + { + pId: "0_1", + id: "0_1_13", + text: "湖南省( 共15个 )", + value: "湖南省", + open: true + }, + { + pId: "0_1_13", + id: "0_1_13_0", + text: "常德市", + value: "常德市", + open: true + }, + { + pId: "0_1_13", + id: "0_1_13_1", + text: "长沙市", + value: "长沙市", + open: true + }, + { + pId: "0_1_13", + id: "0_1_13_2", + text: "郴州市", + value: "郴州市", + open: true + }, + { + pId: "0_1_13", + id: "0_1_13_3", + text: "衡阳市", + value: "衡阳市", + open: true + }, + { + pId: "0_1_13", + id: "0_1_13_4", + text: "怀化市", + value: "怀化市", + open: true + }, + { + pId: "0_1_13", + id: "0_1_13_5", + text: "娄底市", + value: "娄底市", + open: true + }, + { + pId: "0_1_13", + id: "0_1_13_6", + text: "邵阳市", + value: "邵阳市", + open: true + }, + { + pId: "0_1_13", + id: "0_1_13_7", + text: "湘潭市", + value: "湘潭市", + open: true + }, + { + pId: "0_1_13", + id: "0_1_13_8", + text: "湘西市", + value: "湘西市", + open: true + }, + { + pId: "0_1_13", + id: "0_1_13_9", + text: "湘西土家族苗族自治州", + value: "湘西土家族苗族自治州", + open: true + }, + { + pId: "0_1_13", + id: "0_1_13_10", + text: "益阳市", + value: "益阳市", + open: true + }, + { + pId: "0_1_13", + id: "0_1_13_11", + text: "永州市", + value: "永州市", + open: true + }, + { + pId: "0_1_13", + id: "0_1_13_12", + text: "岳阳市", + value: "岳阳市", + open: true + }, + { + pId: "0_1_13", + id: "0_1_13_13", + text: "张家界市", + value: "张家界市", + open: true + }, + { + pId: "0_1_13", + id: "0_1_13_14", + text: "株洲市", + value: "株洲市", + open: true + }, + { + pId: "0_1", + id: "0_1_14", + text: "吉林省( 共10个 )", + value: "吉林省", + open: true + }, + { + pId: "0_1_14", + id: "0_1_14_0", + text: "白城市", + value: "白城市", + open: true + }, + { + pId: "0_1_14", + id: "0_1_14_1", + text: "白山市", + value: "白山市", + open: true + }, + { + pId: "0_1_14", + id: "0_1_14_2", + text: "长春市", + value: "长春市", + open: true + }, + { + pId: "0_1_14", + id: "0_1_14_3", + text: "大庆市", + value: "大庆市", + open: true + }, + { + pId: "0_1_14", + id: "0_1_14_4", + text: "吉林市", + value: "吉林市", + open: true + }, + { + pId: "0_1_14", + id: "0_1_14_5", + text: "辽源市", + value: "辽源市", + open: true + }, + { + pId: "0_1_14", + id: "0_1_14_6", + text: "四平市", + value: "四平市", + open: true + }, + { + pId: "0_1_14", + id: "0_1_14_7", + text: "松原市", + value: "松原市", + open: true + }, + { + pId: "0_1_14", + id: "0_1_14_8", + text: "通化市", + value: "通化市", + open: true + }, + { + pId: "0_1_14", + id: "0_1_14_9", + text: "延边朝鲜族自治州", + value: "延边朝鲜族自治州", + open: true + }, + { + pId: "0_1", + id: "0_1_15", + text: "江苏省( 共13个 )", + value: "江苏省", + open: true + }, + { + pId: "0_1_15", + id: "0_1_15_0", + text: "常州市", + value: "常州市", + open: true + }, + { + pId: "0_1_15", + id: "0_1_15_1", + text: "淮安市", + value: "淮安市", + open: true + }, + { + pId: "0_1_15", + id: "0_1_15_2", + text: "连云港市", + value: "连云港市", + open: true + }, + { + pId: "0_1_15", + id: "0_1_15_3", + text: "南京市", + value: "南京市", + open: true + }, + { + pId: "0_1_15", + id: "0_1_15_4", + text: "南通市", + value: "南通市", + open: true + }, + { + pId: "0_1_15", + id: "0_1_15_5", + text: "苏州市", + value: "苏州市", + open: true + }, + { + pId: "0_1_15", + id: "0_1_15_6", + text: "宿迁市", + value: "宿迁市", + open: true + }, + { + pId: "0_1_15", + id: "0_1_15_7", + text: "泰州市", + value: "泰州市", + open: true + }, + { + pId: "0_1_15", + id: "0_1_15_8", + text: "无锡市", + value: "无锡市", + open: true + }, + { + pId: "0_1_15", + id: "0_1_15_9", + text: "徐州市", + value: "徐州市", + open: true + }, + { + pId: "0_1_15", + id: "0_1_15_10", + text: "盐城市", + value: "盐城市", + open: true + }, + { + pId: "0_1_15", + id: "0_1_15_11", + text: "扬州市", + value: "扬州市", + open: true + }, + { + pId: "0_1_15", + id: "0_1_15_12", + text: "镇江市", + value: "镇江市", + open: true + }, + { + pId: "0_1", + id: "0_1_16", + text: "江西省( 共10个 )", + value: "江西省", + open: true + }, + { + pId: "0_1_16", + id: "0_1_16_0", + text: "抚州市", + value: "抚州市", + open: true + }, + { + pId: "0_1_16", + id: "0_1_16_1", + text: "赣州市", + value: "赣州市", + open: true + }, + { + pId: "0_1_16", + id: "0_1_16_2", + text: "景德镇市", + value: "景德镇市", + open: true + }, + { + pId: "0_1_16", + id: "0_1_16_3", + text: "九江市", + value: "九江市", + open: true + }, + { + pId: "0_1_16", + id: "0_1_16_4", + text: "南昌市", + value: "南昌市", + open: true + }, + { + pId: "0_1_16", + id: "0_1_16_5", + text: "萍乡市", + value: "萍乡市", + open: true + }, + { + pId: "0_1_16", + id: "0_1_16_6", + text: "上饶市", + value: "上饶市", + open: true + }, + { + pId: "0_1_16", + id: "0_1_16_7", + text: "新余市", + value: "新余市", + open: true + }, + { + pId: "0_1_16", + id: "0_1_16_8", + text: "宜春市", + value: "宜春市", + open: true + }, + { + pId: "0_1_16", + id: "0_1_16_9", + text: "鹰潭市", + value: "鹰潭市", + open: true + }, + { + pId: "0_1", + id: "0_1_17", + text: "辽宁省( 共14个 )", + value: "辽宁省", + open: true + }, + { + pId: "0_1_17", + id: "0_1_17_0", + text: "鞍山市", + value: "鞍山市", + open: true + }, + { + pId: "0_1_17", + id: "0_1_17_1", + text: "本溪市", + value: "本溪市", + open: true + }, + { + pId: "0_1_17", + id: "0_1_17_2", + text: "朝阳市", + value: "朝阳市", + open: true + }, + { + pId: "0_1_17", + id: "0_1_17_3", + text: "大连市", + value: "大连市", + open: true + }, + { + pId: "0_1_17", + id: "0_1_17_4", + text: "丹东市", + value: "丹东市", + open: true + }, + { + pId: "0_1_17", + id: "0_1_17_5", + text: "抚顺市", + value: "抚顺市", + open: true + }, + { + pId: "0_1_17", + id: "0_1_17_6", + text: "阜新市", + value: "阜新市", + open: true + }, + { + pId: "0_1_17", + id: "0_1_17_7", + text: "葫芦岛市", + value: "葫芦岛市", + open: true + }, + { + pId: "0_1_17", + id: "0_1_17_8", + text: "锦州市", + value: "锦州市", + open: true + }, + { + pId: "0_1_17", + id: "0_1_17_9", + text: "辽阳市", + value: "辽阳市", + open: true + }, + { + pId: "0_1_17", + id: "0_1_17_10", + text: "盘锦市", + value: "盘锦市", + open: true + }, + { + pId: "0_1_17", + id: "0_1_17_11", + text: "沈阳市", + value: "沈阳市", + open: true + }, + { + pId: "0_1_17", + id: "0_1_17_12", + text: "铁岭市", + value: "铁岭市", + open: true + }, + { + pId: "0_1_17", + id: "0_1_17_13", + text: "营口市", + value: "营口市", + open: true + }, + { + pId: "0_1", + id: "0_1_18", + text: "内蒙古( 共10个 )", + value: "内蒙古", + open: true + }, + { + pId: "0_1_18", + id: "0_1_18_0", + text: "包头市", + value: "包头市", + open: true + }, + { + pId: "0_1_18", + id: "0_1_18_1", + text: "赤峰市", + value: "赤峰市", + open: true + }, + { + pId: "0_1_18", + id: "0_1_18_2", + text: "鄂尔多斯市", + value: "鄂尔多斯市", + open: true + }, + { + pId: "0_1_18", + id: "0_1_18_3", + text: "呼和浩特市", + value: "呼和浩特市", + open: true + }, + { + pId: "0_1_18", + id: "0_1_18_4", + text: "呼伦贝尔市", + value: "呼伦贝尔市", + open: true + }, + { + pId: "0_1_18", + id: "0_1_18_5", + text: "通辽市", + value: "通辽市", + open: true + }, + { + pId: "0_1_18", + id: "0_1_18_6", + text: "乌海市", + value: "乌海市", + open: true + }, + { + pId: "0_1_18", + id: "0_1_18_7", + text: "锡林郭勒市", + value: "锡林郭勒市", + open: true + }, + { + pId: "0_1_18", + id: "0_1_18_8", + text: "兴安市", + value: "兴安市", + open: true + }, + { + pId: "0_1_18", + id: "0_1_18_9", + text: "运城市", + value: "运城市", + open: true + }, + { + pId: "0_1", + id: "0_1_19", + text: "宁夏回族自治区( 共5个 )", + value: "宁夏回族自治区", + open: true + }, + { + pId: "0_1_19", + id: "0_1_19_0", + text: "固原市", + value: "固原市", + open: true + }, + { + pId: "0_1_19", + id: "0_1_19_1", + text: "石嘴山市", + value: "石嘴山市", + open: true + }, + { + pId: "0_1_19", + id: "0_1_19_2", + text: "吴忠市", + value: "吴忠市", + open: true + }, + { + pId: "0_1_19", + id: "0_1_19_3", + text: "银川市", + value: "银川市", + open: true + }, + { + pId: "0_1_19", + id: "0_1_19_4", + text: "中卫市", + value: "中卫市", + open: true + }, + { + pId: "0_1", + id: "0_1_20", + text: "青海省( 共4个 )", + value: "青海省", + open: true + }, + { + pId: "0_1_20", + id: "0_1_20_0", + text: "海东地区", + value: "海东地区", + open: true + }, + { + pId: "0_1_20", + id: "0_1_20_1", + text: "海南藏族自治州", + value: "海南藏族自治州", + open: true + }, + { + pId: "0_1_20", + id: "0_1_20_2", + text: "海西蒙古族藏族自治州", + value: "海西蒙古族藏族自治州", + open: true + }, + { + pId: "0_1_20", + id: "0_1_20_3", + text: "西宁市", + value: "西宁市", + open: true + }, + { + pId: "0_1", + id: "0_1_21", + text: "山东省( 共17个 )", + value: "山东省", + open: true + }, + { + pId: "0_1_21", + id: "0_1_21_0", + text: "滨州市", + value: "滨州市", + open: true + }, + { + pId: "0_1_21", + id: "0_1_21_1", + text: "德州市", + value: "德州市", + open: true + }, + { + pId: "0_1_21", + id: "0_1_21_2", + text: "东营市", + value: "东营市", + open: true + }, + { + pId: "0_1_21", + id: "0_1_21_3", + text: "菏泽市", + value: "菏泽市", + open: true + }, + { + pId: "0_1_21", + id: "0_1_21_4", + text: "济南市", + value: "济南市", + open: true + }, + { + pId: "0_1_21", + id: "0_1_21_5", + text: "济宁市", + value: "济宁市", + open: true + }, + { + pId: "0_1_21", + id: "0_1_21_6", + text: "莱芜市", + value: "莱芜市", + open: true + }, + { + pId: "0_1_21", + id: "0_1_21_7", + text: "聊城市", + value: "聊城市", + open: true + }, + { + pId: "0_1_21", + id: "0_1_21_8", + text: "临沂市", + value: "临沂市", + open: true + }, + { + pId: "0_1_21", + id: "0_1_21_9", + text: "青岛市", + value: "青岛市", + open: true + }, + { + pId: "0_1_21", + id: "0_1_21_10", + text: "日照市", + value: "日照市", + open: true + }, + { + pId: "0_1_21", + id: "0_1_21_11", + text: "泰安市", + value: "泰安市", + open: true + }, + { + pId: "0_1_21", + id: "0_1_21_12", + text: "威海市", + value: "威海市", + open: true + }, + { + pId: "0_1_21", + id: "0_1_21_13", + text: "潍坊市", + value: "潍坊市", + open: true + }, + { + pId: "0_1_21", + id: "0_1_21_14", + text: "烟台市", + value: "烟台市", + open: true + }, + { + pId: "0_1_21", + id: "0_1_21_15", + text: "枣庄市", + value: "枣庄市", + open: true + }, + { + pId: "0_1_21", + id: "0_1_21_16", + text: "淄博市", + value: "淄博市", + open: true + }, + { + pId: "0_1", + id: "0_1_22", + text: "山西省( 共12个 )", + value: "山西省", + open: true + }, + { + pId: "0_1_22", + id: "0_1_22_0", + text: "长治市", + value: "长治市", + open: true + }, + { + pId: "0_1_22", + id: "0_1_22_1", + text: "大同市", + value: "大同市", + open: true + }, + { + pId: "0_1_22", + id: "0_1_22_2", + text: "晋城市", + value: "晋城市", + open: true + }, + { + pId: "0_1_22", + id: "0_1_22_3", + text: "晋中市", + value: "晋中市", + open: true + }, + { + pId: "0_1_22", + id: "0_1_22_4", + text: "临汾市", + value: "临汾市", + open: true + }, + { + pId: "0_1_22", + id: "0_1_22_5", + text: "吕梁市", + value: "吕梁市", + open: true + }, + { + pId: "0_1_22", + id: "0_1_22_6", + text: "青岛市", + value: "青岛市", + open: true + }, + { + pId: "0_1_22", + id: "0_1_22_7", + text: "朔州市", + value: "朔州市", + open: true + }, + { + pId: "0_1_22", + id: "0_1_22_8", + text: "太原市", + value: "太原市", + open: true + }, + { + pId: "0_1_22", + id: "0_1_22_9", + text: "忻州市", + value: "忻州市", + open: true + }, + { + pId: "0_1_22", + id: "0_1_22_10", + text: "阳泉市", + value: "阳泉市", + open: true + }, + { + pId: "0_1_22", + id: "0_1_22_11", + text: "运城市", + value: "运城市", + open: true + }, + { + pId: "0_1", + id: "0_1_23", + text: "陕西省( 共9个 )", + value: "陕西省", + open: true + }, + { + pId: "0_1_23", + id: "0_1_23_0", + text: "安康市", + value: "安康市", + open: true + }, + { + pId: "0_1_23", + id: "0_1_23_1", + text: "宝鸡市", + value: "宝鸡市", + open: true + }, + { + pId: "0_1_23", + id: "0_1_23_2", + text: "汉中市", + value: "汉中市", + open: true + }, + { + pId: "0_1_23", + id: "0_1_23_3", + text: "商洛市", + value: "商洛市", + open: true + }, + { + pId: "0_1_23", + id: "0_1_23_4", + text: "渭南市", + value: "渭南市", + open: true + }, + { + pId: "0_1_23", + id: "0_1_23_5", + text: "西安市", + value: "西安市", + open: true + }, + { + pId: "0_1_23", + id: "0_1_23_6", + text: "咸阳市", + value: "咸阳市", + open: true + }, + { + pId: "0_1_23", + id: "0_1_23_7", + text: "延安市", + value: "延安市", + open: true + }, + { + pId: "0_1_23", + id: "0_1_23_8", + text: "榆林市", + value: "榆林市", + open: true + }, + { + pId: "0_1", + id: "0_1_24", + text: "上海市( 共19个 )", + value: "上海市", + open: true + }, + { + pId: "0_1_24", + id: "0_1_24_0", + text: "宝山区", + value: "宝山区", + open: true + }, + { + pId: "0_1_24", + id: "0_1_24_1", + text: "长宁区", + value: "长宁区", + open: true + }, + { + pId: "0_1_24", + id: "0_1_24_2", + text: "崇明县", + value: "崇明县", + open: true + }, + { + pId: "0_1_24", + id: "0_1_24_3", + text: "奉贤区", + value: "奉贤区", + open: true + }, + { + pId: "0_1_24", + id: "0_1_24_4", + text: "虹口区", + value: "虹口区", + open: true + }, + { + pId: "0_1_24", + id: "0_1_24_5", + text: "黄浦区", + value: "黄浦区", + open: true + }, + { + pId: "0_1_24", + id: "0_1_24_6", + text: "嘉定区", + value: "嘉定区", + open: true + }, + { + pId: "0_1_24", + id: "0_1_24_7", + text: "金山区", + value: "金山区", + open: true + }, + { + pId: "0_1_24", + id: "0_1_24_8", + text: "静安区", + value: "静安区", + open: true + }, + { + pId: "0_1_24", + id: "0_1_24_9", + text: "昆明市", + value: "昆明市", + open: true + }, + { + pId: "0_1_24", + id: "0_1_24_10", + text: "闵行区", + value: "闵行区", + open: true + }, + { + pId: "0_1_24", + id: "0_1_24_11", + text: "普陀区", + value: "普陀区", + open: true + }, + { + pId: "0_1_24", + id: "0_1_24_12", + text: "浦东新区", + value: "浦东新区", + open: true + }, + { + pId: "0_1_24", + id: "0_1_24_13", + text: "青浦区", + value: "青浦区", + open: true + }, + { + pId: "0_1_24", + id: "0_1_24_14", + text: "上海市区", + value: "上海市区", + open: true + }, + { + pId: "0_1_24", + id: "0_1_24_15", + text: "松江区", + value: "松江区", + open: true + }, + { + pId: "0_1_24", + id: "0_1_24_16", + text: "徐汇区", + value: "徐汇区", + open: true + }, + { + pId: "0_1_24", + id: "0_1_24_17", + text: "杨浦区", + value: "杨浦区", + open: true + }, + { + pId: "0_1_24", + id: "0_1_24_18", + text: "闸北区", + value: "闸北区", + open: true + }, + { + pId: "0_1", + id: "0_1_25", + text: "四川省( 共21个 )", + value: "四川省", + open: true + }, + { + pId: "0_1_25", + id: "0_1_25_0", + text: "阿坝藏族羌族自治州", + value: "阿坝藏族羌族自治州", + open: true + }, + { + pId: "0_1_25", + id: "0_1_25_1", + text: "巴中市", + value: "巴中市", + open: true + }, + { + pId: "0_1_25", + id: "0_1_25_2", + text: "成都市", + value: "成都市", + open: true + }, + { + pId: "0_1_25", + id: "0_1_25_3", + text: "达州市", + value: "达州市", + open: true + }, + { + pId: "0_1_25", + id: "0_1_25_4", + text: "德阳市", + value: "德阳市", + open: true + }, + { + pId: "0_1_25", + id: "0_1_25_5", + text: "甘孜市", + value: "甘孜市", + open: true + }, + { + pId: "0_1_25", + id: "0_1_25_6", + text: "广安市", + value: "广安市", + open: true + }, + { + pId: "0_1_25", + id: "0_1_25_7", + text: "广元市", + value: "广元市", + open: true + }, + { + pId: "0_1_25", + id: "0_1_25_8", + text: "乐山市", + value: "乐山市", + open: true + }, + { + pId: "0_1_25", + id: "0_1_25_9", + text: "凉山市", + value: "凉山市", + open: true + }, + { + pId: "0_1_25", + id: "0_1_25_10", + text: "泸州市", + value: "泸州市", + open: true + }, + { + pId: "0_1_25", + id: "0_1_25_11", + text: "眉山市", + value: "眉山市", + open: true + }, + { + pId: "0_1_25", + id: "0_1_25_12", + text: "绵阳市", + value: "绵阳市", + open: true + }, + { + pId: "0_1_25", + id: "0_1_25_13", + text: "南充市", + value: "南充市", + open: true + }, + { + pId: "0_1_25", + id: "0_1_25_14", + text: "内江市", + value: "内江市", + open: true + }, + { + pId: "0_1_25", + id: "0_1_25_15", + text: "攀枝花市", + value: "攀枝花市", + open: true + }, + { + pId: "0_1_25", + id: "0_1_25_16", + text: "遂宁市", + value: "遂宁市", + open: true + }, + { + pId: "0_1_25", + id: "0_1_25_17", + text: "雅安市", + value: "雅安市", + open: true + }, + { + pId: "0_1_25", + id: "0_1_25_18", + text: "宜宾市", + value: "宜宾市", + open: true + }, + { + pId: "0_1_25", + id: "0_1_25_19", + text: "资阳市", + value: "资阳市", + open: true + }, + { + pId: "0_1_25", + id: "0_1_25_20", + text: "自贡市", + value: "自贡市", + open: true + }, + { + pId: "0_1", + id: "0_1_26", + text: "台湾( 共1个 )", + value: "台湾", + open: true + }, + { + pId: "0_1_26", + id: "0_1_26_0", + text: "台北市", + value: "台北市", + open: true + }, + { + pId: "0_1", + id: "0_1_27", + text: "天津市( 共1个 )", + value: "天津市", + open: true + }, + { + pId: "0_1_27", + id: "0_1_27_0", + text: "天津市区", + value: "天津市区", + open: true + }, + { + pId: "0_1", + id: "0_1_28", + text: "西藏自治区( 共2个 )", + value: "西藏自治区", + open: true + }, + { + pId: "0_1_28", + id: "0_1_28_0", + text: "阿里市", + value: "阿里市", + open: true + }, + { + pId: "0_1_28", + id: "0_1_28_1", + text: "日喀则市", + value: "日喀则市", + open: true + }, + { + pId: "0_1", + id: "0_1_29", + text: "香港特别行政区( 共1个 )", + value: "香港特别行政区", + open: true + }, + { + pId: "0_1_29", + id: "0_1_29_0", + text: "香港", + value: "香港", + open: true + }, + { + pId: "0_1", + id: "0_1_30", + text: "新疆维吾尔族自治区( 共11个 )", + value: "新疆维吾尔族自治区", + open: true + }, + { + pId: "0_1_30", + id: "0_1_30_0", + text: "巴音郭楞市", + value: "巴音郭楞市", + open: true + }, + { + pId: "0_1_30", + id: "0_1_30_1", + text: "哈密市", + value: "哈密市", + open: true + }, + { + pId: "0_1_30", + id: "0_1_30_2", + text: "和田市", + value: "和田市", + open: true + }, + { + pId: "0_1_30", + id: "0_1_30_3", + text: "喀什地区", + value: "喀什地区", + open: true + }, + { + pId: "0_1_30", + id: "0_1_30_4", + text: "克拉玛依市", + value: "克拉玛依市", + open: true + }, + { + pId: "0_1_30", + id: "0_1_30_5", + text: "克孜勒苏柯州", + value: "克孜勒苏柯州", + open: true + }, + { + pId: "0_1_30", + id: "0_1_30_6", + text: "石河子市", + value: "石河子市", + open: true + }, + { + pId: "0_1_30", + id: "0_1_30_7", + text: "塔城市", + value: "塔城市", + open: true + }, + { + pId: "0_1_30", + id: "0_1_30_8", + text: "吐鲁番地区", + value: "吐鲁番地区", + open: true + }, + { + pId: "0_1_30", + id: "0_1_30_9", + text: "乌鲁木齐", + value: "乌鲁木齐", + open: true + }, + { + pId: "0_1_30", + id: "0_1_30_10", + text: "伊犁市", + value: "伊犁市", + open: true + }, + { + pId: "0_1", + id: "0_1_31", + text: "云南省( 共12个 )", + value: "云南省", + open: true + }, + { + pId: "0_1_31", + id: "0_1_31_0", + text: "保山市", + value: "保山市", + open: true + }, + { + pId: "0_1_31", + id: "0_1_31_1", + text: "楚雄彝族自治州", + value: "楚雄彝族自治州", + open: true + }, + { + pId: "0_1_31", + id: "0_1_31_2", + text: "大理白族自治州", + value: "大理白族自治州", + open: true + }, + { + pId: "0_1_31", + id: "0_1_31_3", + text: "红河哈尼族彝族自治州", + value: "红河哈尼族彝族自治州", + open: true + }, + { + pId: "0_1_31", + id: "0_1_31_4", + text: "昆明市", + value: "昆明市", + open: true + }, + { + pId: "0_1_31", + id: "0_1_31_5", + text: "丽江市", + value: "丽江市", + open: true + }, + { + pId: "0_1_31", + id: "0_1_31_6", + text: "临沧市", + value: "临沧市", + open: true + }, + { + pId: "0_1_31", + id: "0_1_31_7", + text: "曲靖市", + value: "曲靖市", + open: true + }, + { + pId: "0_1_31", + id: "0_1_31_8", + text: "思茅市", + value: "思茅市", + open: true + }, + { + pId: "0_1_31", + id: "0_1_31_9", + text: "文山市", + value: "文山市", + open: true + }, + { + pId: "0_1_31", + id: "0_1_31_10", + text: "玉溪市", + value: "玉溪市", + open: true + }, + { + pId: "0_1_31", + id: "0_1_31_11", + text: "昭通市", + value: "昭通市", + open: true + }, + { + pId: "0_1", + id: "0_1_32", + text: "浙江省( 共12个 )", + value: "浙江省", + open: true + }, + { + pId: "0_1_32", + id: "0_1_32_0", + text: "杭州市", + value: "杭州市", + open: true + }, + { + pId: "0_1_32", + id: "0_1_32_1", + text: "湖州市", + value: "湖州市", + open: true + }, + { + pId: "0_1_32", + id: "0_1_32_2", + text: "嘉兴市", + value: "嘉兴市", + open: true + }, + { + pId: "0_1_32", + id: "0_1_32_3", + text: "金华市", + value: "金华市", + open: true + }, + { + pId: "0_1_32", + id: "0_1_32_4", + text: "丽水市", + value: "丽水市", + open: true + }, + { + pId: "0_1_32", + id: "0_1_32_5", + text: "宁波市", + value: "宁波市", + open: true + }, + { + pId: "0_1_32", + id: "0_1_32_6", + text: "衢州市", + value: "衢州市", + open: true + }, + { + pId: "0_1_32", + id: "0_1_32_7", + text: "绍兴市", + value: "绍兴市", + open: true + }, + { + pId: "0_1_32", + id: "0_1_32_8", + text: "台州市", + value: "台州市", + open: true + }, + { + pId: "0_1_32", + id: "0_1_32_9", + text: "温州市", + value: "温州市", + open: true + }, + { + pId: "0_1_32", + id: "0_1_32_10", + text: "浙江省", + value: "浙江省", + open: true + }, + { + pId: "0_1_32", + id: "0_1_32_11", + text: "舟山市", + value: "舟山市", + open: true + }, + { + pId: "0_1", + id: "0_1_33", + text: "重庆市( 共1个 )", + value: "重庆市", + open: true + }, + { + pId: "0_1_33", + id: "0_1_33_0", + text: "重庆市区", + value: "重庆市区", + open: true + } + ], + + TREE: [ + { id: -1, pId: -2, value: "根目录", text: "根目录" }, + { id: 1, pId: -1, value: "1", text: "第一级目录1", disabled: true }, + { id: 11, pId: 1, value: "11", text: "第二级文件1" }, + { id: 12, pId: 1, value: "12", text: "第二级目录2" }, + { id: 121, pId: 12, value: "121", text: "第三级目录1" }, + { id: 122, pId: 12, value: "122", text: "第三级文件1" }, + { id: 1211, pId: 121, value: "1211", text: "第四级目录1" }, + { + id: 12111, + pId: 1211, + value: "12111", + text: "第五级文件111111111111111111111111111111111111111111111111111111111111111111111111111111111111111" + }, + { id: 2, pId: -1, value: "2", text: "第一级目录2" }, + { id: 21, pId: 2, value: "21", text: "第二级目录3" }, + { id: 22, pId: 2, value: "22", text: "第二级文件2" }, + { id: 211, pId: 21, value: "211", text: "第三级目录2" }, + { id: 212, pId: 21, value: "212", text: "第三级文件2" }, + { id: 2111, pId: 211, value: "2111", text: "第四级文件1" } + ], + LEVELTREE: [ + { + id: 1, + text: "第一项", + value: "1" + }, + { + id: 2, + text: "第二项", + value: "2" + }, + { + id: 3, + text: "第三项", + value: "3", + open: true + }, + { + id: 11, + pId: 1, + text: "子项1", + value: "11" + }, + { + id: 12, + pId: 1, + text: "子项2", + value: "12" + }, + { + id: 13, + pId: 1, + text: "子项3", + value: "13" + }, + { + id: 31, + pId: 3, + text: "子项1", + value: "31" + }, + { + id: 32, + pId: 3, + text: "子项2", + value: "32" + }, + { + id: 33, + pId: 3, + text: "子项3", + value: "33" + } + ] +}; diff --git a/packages/demo/src/config/core.js b/packages/demo/src/config/core.js new file mode 100644 index 000000000..e66c74a8f --- /dev/null +++ b/packages/demo/src/config/core.js @@ -0,0 +1,128 @@ +import { layout, abstract } from "../core"; +import { transModule2Route } from "./utils"; + + + +export const coreConfig = [ + { + id: 1, + text: "核心控件" + }, + { + id: 101, + pId: 1, + text: "布局" + }, + ...transModule2Route(layout, 101), + { + pId: 1, + id: 102, + text: "抽象控件" + }, + ...transModule2Route(abstract, 102), + { + pId: 102, + id: 10201, + text: "组合控件" + }, + // { + // pId: 10201, + // text: "bi.combo", + // value: "demo.combo" + // }, + // { + // pId: 10201, + // text: "bi.combo(各种位置)", + // value: "demo.combo2" + // }, + // { + // pId: 10201, + // text: "bi.combo(內部位置)", + // value: "demo.combo3" + // }, + // { + // pId: 10201, + // text: "bi.expander", + // value: "demo.expander" + // }, + // { + // pId: 10201, + // text: "bi.combo_group", + // value: "demo.combo_group" + // }, + // { + // pId: 10201, + // text: "bi.loader", + // value: "demo.loader" + // }, + // { + // pId: 10201, + // text: "bi.navigation", + // value: "demo.navigation" + // }, + // { + // pId: 10201, + // text: "bi.searcher", + // value: "demo.searcher" + // }, + // { + // pId: 10201, + // text: "bi.switcher", + // value: "demo.switcher" + // }, + // { + // pId: 10201, + // text: "bi.tab", + // value: "demo.tab" + // }, + { + pId: 102, + id: 10202, + text: "弹出层" + }, + // { + // pId: 10202, + // text: "layer", + // value: "demo.layer" + // }, + // { + // pId: 10202, + // text: "bi.popover", + // value: "demo.popover" + // }, + // { + // pId: 10202, + // text: "bi.popup_view", + // value: "demo.popup_view" + // }, + // { + // pId: 10202, + // text: "bi.searcher_view", + // value: "demo.searcher_view" + // }, + // { + // pId: 1, + // text: "Widget(继承)", + // value: "demo.widget" + // }, + // { + // pId: 1, + // text: "Single(继承)", + // value: "demo.single" + // }, + // { + // pId: 1, + // text: "BasicButton(继承)", + // value: "demo.basic_button" + // }, + // { + // pId: 1, + // text: "NodeButton(继承)", + // value: "demo.node_button" + // }, + // { + // pId: 1, + // text: "Pane(继承)", + // value: "demo.pane" + // } +]; diff --git a/packages/demo/src/config/index.js b/packages/demo/src/config/index.js new file mode 100644 index 000000000..100ba07f8 --- /dev/null +++ b/packages/demo/src/config/index.js @@ -0,0 +1,3646 @@ +// import { coreConfig } from "./core"; +// import { baseConfig } from "./base"; +import { map, UUID } from "@fui/core"; +import * as DemoModule from "../demo"; + +const routes = []; +function tranvase(m, parent, text) { + if (m.__esModule) { + const keys = Object.keys(m); + const id = UUID(); + const obj = { + id, + text, + value: id + }; + if (parent) { + obj.pId = parent.id; + routes.push(obj); + } + obj.text = m.meta?.title || text; + keys.sort((keyA, keyB) => { + const rankA = m[keyA].meta?.rank || 0; + const rankB = m[keyB].meta?.rank || 0; + return rankB - rankA; + }); + keys.forEach((key) => { + tranvase(m[key], obj, key); + }); + } else if (m.xtype) { + const obj = { id: m.xtype, value: m.xtype, text: m.xtype }; + if (parent) { + obj.pId = parent.id; + } + routes.push(obj); + } +} +tranvase(DemoModule); + +// console.log(routes); + +export const demoConfig = routes; + +// Demo.CONFIG = Demo.CORE_CONFIG.concat(Demo.BASE_CONFIG) +// .concat(Demo.CASE_CONFIG) +// .concat(Demo.WIDGET_CONFIG) +// .concat(Demo.COMPONENT_CONFIG) +// .concat(Demo.FIX_CONFIG); + +const CONSTANTS = { + SIMPLE_ITEMS: map( + "柳州市城贸金属材料有限责任公司 柳州市建福房屋租赁有限公司 柳州市迅昌数码办公设备有限责任公司 柳州市河海贸易有限责任公司 柳州市花篮制衣厂 柳州市兴溪物资有限公司 柳州市针织总厂 柳州市衡管物资有限公司 柳州市琪成机电设备有限公司 柳州市松林工程机械修理厂".match( + /[^\s]+/g + ), + function (i, v) { + return { + text: v, + value: v, + title: v + }; + } + ), + ITEMS: map( + "柳州市城贸金属材料有限责任公司 柳州市建福房屋租赁有限公司 柳州市迅昌数码办公设备有限责任公司 柳州市河海贸易有限责任公司 柳州市花篮制衣厂 柳州市兴溪物资有限公司 柳州市针织总厂 柳州市衡管物资有限公司 柳州市琪成机电设备有限公司 柳州市松林工程机械修理厂 柳州市积玉贸易有限公司 柳州市福运来贸易有限责任公司 柳州市钢义物资有限公司 柳州市洋力化工有限公司 柳州市悦盛贸易有限公司 柳州市雁城钢管物资有限公司 柳州市恒瑞钢材经营部 柳州市科拓电子有限公司 柳州市九方电子有限公司 柳州市桂龙汽车配件厂 柳州市制鞋工厂 柳州市炜力科贸有限公司 柳州市希翼贸易有限公司 柳州市兆金物资有限公司 柳州市和润电子科技有限责任公司 柳州市汇凯贸易有限公司 柳州市好机汇商贸有限公司 柳州市泛源商贸经营部 柳州市利汇达物资有限公司 广西全民药业有限责任公司 柳州超凡物资贸易有限责任公司 柳州市贵宏物资有限责任公司 柳州昊恒贸易有限责任公司 柳州市浦联物资有限公司 柳州市广通园林绿化工程有限责任公司 柳州市松发物资贸易有限责任公司 柳州市奥士达办公设备有限责任公司 柳州市海泰物资有限公司 柳州市金三环针织厂 柳州市钢贸物资有限公司 柳州市明阳纺织有限公司 柳州市世科科技发展有限公司 柳州市禄羊贸易有限公司 柳州市金兆阳商贸有限公司 柳州市汇昌物资经营部 柳州市林泰金属物资供应站 柳州市自来水管道材料设备公司 柳州市丹柳铝板有限公司 柳州市桂冶物资有限公司 柳州市宸业物资经营部 柳州市耀成贸易有限公司 柳州奥易自动化科技有限公司 柳州市萃丰科技有限责任公司 柳州市华储贸易有限责任公司 柳州市黄颜钢材有限责任公司 柳州市银盛物资有限责任公司 柳州市新仪化玻供应站 柳州市晶凯化工有限公司 广西柳州市柳江包装纸厂 柳州市志新物资有限责任公司 柳州市兆钢物资有限公司 柳州市友方科技发展有限责任公司 柳州市缝纫机台板家具总厂 柳州市晖海数码办公设备有限责任公司 柳州市富兰特服饰有限责任公司 柳州市柳北区富兴物资经营部 柳州市柳锌福利厂 柳州市海泉印刷有限责任公司 柳州市乾亨贸易有限公司 柳州市悦宁物资贸易有限公司 柳州市昊天贸易有限公司 广西惠字钢铁有限公司 柳州市名青物资有限公司 柳州市林郝物资有限公司 柳州市民政服装厂 柳州市多维劳保用品厂 柳州市轻工物资供应公司 柳州市程源物资有限责任公司 柳州市寿丰物资贸易有限责任公司 柳州市凯凡物资有限公司 柳州市利晖物资经营部 柳州市恒茂金属物资供应站 柳州市中储物资经营部 柳州市第二医疗器械厂 柳州市来鑫物资经营部 柳州市钢鑫物资贸易有限责任公司 柳州市双合袜业有限责任公司 柳州市茂松经贸有限责任公司 柳州市行行物资贸易有限公司 柳州市方一物资有限公司 柳州成异钢管销售有限公司 柳州广惠佳电脑有限公司 桂林市圣泽鑫物资有限公司柳州分公司 柳州市砼基建材贸易有限公司 柳州市海燕针织厂 上海浦光仪表厂柳州销售处 柳州市能电工贸有限责任公司 柳州市广贸物资有限公司 柳州市柳北区大昌电工灯饰经营部 柳州市金龙印务有限公司 柳州市奇缘婚典服务有限公司 柳州市盛博物资经营部 柳州市项元钢铁贸易有限公司 柳州市虞美人化妆品经营部 柳州市俊彦鞋厂 柳州市聚源特钢有限公司 柳州市迅龙科贸有限责任公司 柳州市恒飞电子有限责任公司 柳州市蓝正现代办公设备有限责任公司 柳州地区农业生产资料公司 柳州华菱钢管销售有限公司 柳州融通物资有限公司 柳州市可仁广告策划有限责任公司 柳州市鸟鑫物资有限责任公司 柳州市五丰钢材供应站 柳州市金江不锈钢有限公司 柳州市美日物资设备有限责任公司 柳州市鑫东物资贸易有限责任公司 柳州地区日用杂品公司 柳州市华纳物资贸易有限公司 柳州乾利金虹物资贸易有限责任公司 柳州市新迈计算机有限公司 柳州市富丽实业发展公司 柳州市石钢金属材料有限公司 柳州市力志传真机销售有限公司 广西宝森投资有限公司 柳州市嵘基商贸有限公司 柳州市景民商贸有限责任公司 柳州市银桥化玻有限责任公司 柳州市宏文糖烟店 柳州市科苑电脑网络有限公司 柳州市两面针旅游用品厂 柳州市立早室内装璜有限责任公司 柳州地化建材有限公司 柳州市涛达贸易有限公司 柳州市兰丰档案服务中心 柳州市惠贸物资有限责任公司 柳州市立文物资有限责任公司 柳州市致和商贸经营部 柳州市金色阳光信息咨询有限公司 柳州市赛利钢材经销部 柳州市日用化工厂 柳州市昆廷物资有限责任公司 柳州市邦盛贸易有限公司 柳州市济华贸易有限公司 柳州昕威橡塑化工经营部 柳州市联业贸易有限公司 柳州市兰钢贸易有限公司 柳州市子欣科技有限公司 柳州市狄龙机电设备有限公司 柳州市方真物资贸易有限公司 柳州市银鸥废旧回收中心 柳州市冠宝贸易有限公司 柳州市鑫盛德商务咨询有限责任公司 柳州市泰汇银通经贸有限公司 广西瀚维智测科技有限公司 柳州市钓鱼郎制衣有限责任公司 柳州溪水物资有限公司 柳州市融峰物资有限责任公司 广西新地科技有限责任公司 柳州市纺织装饰公司 柳州市粤翔冶金炉料有限公司 柳州市远腾贸易有限公司 柳州市东鸿城市改造有限公司 广西丛欣实业有限公司 柳州市服装厂 柳州市立安联合刀片有限公司 广西国扬投资有限责任公司 柳州市铭泰办公设备公司 柳州市桂钢物资供应站 柳州市昱升物资有限责任公司 柳州市鹰飞灿科贸有限公司 柳州市先导科贸有限公司 柳州市金秋建材物资经营部 柳州市童装厂 柳州市民泽物资有限公司 柳州市恒先物资贸易有限公司 柳州市银夏冷气工程有限责任公司 柳州粮食批发有限责任公司 柳州市金银华窗纱制造有限责任公司 柳州市三方贸易有限公司 柳州市丰涛商贸有限责任公司 柳州华智企业管理咨询有限责任公司 柳州市诚正建筑工程施工图审查有限公司 柳州市今科电讯设备营销中心 柳州市闽德电子有限公司 柳州市鑫虹针织厂 柳州市畅通通讯器材有限责任公司 柳州市正钢物资经营部 柳州市新柳饲料有限责任公司 柳州市黄村油库 柳州市天泰电力装饰工程有限公司 柳州市兆吉物资有限责任公司 柳州市八龙纸制品有限责任公司 柳州市巨佳电脑网络科技有限公司 ".match( + /[^\s]+/g + ), + function (i, v) { + return { + text: v, + value: v, + title: v + }; + } + ), + TREEITEMS: [ + { pId: "0", id: "0_0", text: "( 共25个 )", value: "", open: true }, + { + pId: "0_0", + id: "0_0_0", + text: "安徽省( 共1个 )", + value: "安徽省", + open: true + }, + { + pId: "0_0_0", + id: "0_0_0_0", + text: "芜湖市", + value: "芜湖市", + open: true + }, + { + pId: "0_0", + id: "0_0_1", + text: "北京市( 共6个 )", + value: "北京市", + open: true + }, + { + pId: "0_0_1", + id: "0_0_1_0", + text: "北京市区", + value: "北京市区", + open: true + }, + { + pId: "0_0_1", + id: "0_0_1_1", + text: "朝阳区", + value: "朝阳区", + open: true + }, + { + pId: "0_0_1", + id: "0_0_1_2", + text: "东城区", + value: "东城区", + open: true + }, + { + pId: "0_0_1", + id: "0_0_1_3", + text: "海淀区4内", + value: "海淀区4内", + open: true + }, + { + pId: "0_0_1", + id: "0_0_1_4", + text: "海淀区4外", + value: "海淀区4外", + open: true + }, + { + pId: "0_0_1", + id: "0_0_1_5", + text: "石景山区", + value: "石景山区", + open: true + }, + { + pId: "0_0", + id: "0_0_2", + text: "福建省( 共2个 )", + value: "福建省", + open: true + }, + { + pId: "0_0_2", + id: "0_0_2_0", + text: "莆田市", + value: "莆田市", + open: true + }, + { + pId: "0_0_2", + id: "0_0_2_1", + text: "泉州市", + value: "泉州市", + open: true + }, + { + pId: "0_0", + id: "0_0_3", + text: "甘肃省( 共1个 )", + value: "甘肃省", + open: true + }, + { + pId: "0_0_3", + id: "0_0_3_0", + text: "兰州市", + value: "兰州市", + open: true + }, + { + pId: "0_0", + id: "0_0_4", + text: "广东省( 共5个 )", + value: "广东省", + open: true + }, + { + pId: "0_0_4", + id: "0_0_4_0", + text: "东莞市", + value: "东莞市", + open: true + }, + { + pId: "0_0_4", + id: "0_0_4_1", + text: "广州市", + value: "广州市", + open: true + }, + { + pId: "0_0_4", + id: "0_0_4_2", + text: "惠州市", + value: "惠州市", + open: true + }, + { + pId: "0_0_4", + id: "0_0_4_3", + text: "深圳市", + value: "深圳市", + open: true + }, + { + pId: "0_0_4", + id: "0_0_4_4", + text: "珠海市", + value: "珠海市", + open: true + }, + { + pId: "0_0", + id: "0_0_5", + text: "广西壮族自治区( 共1个 )", + value: "广西壮族自治区", + open: true + }, + { + pId: "0_0_5", + id: "0_0_5_0", + text: "南宁市", + value: "南宁市", + open: true + }, + { + pId: "0_0", + id: "0_0_6", + text: "河北省( 共2个 )", + value: "河北省", + open: true + }, + { + pId: "0_0_6", + id: "0_0_6_0", + text: "保定市", + value: "保定市", + open: true + }, + { + pId: "0_0_6", + id: "0_0_6_1", + text: "邢台市", + value: "邢台市", + open: true + }, + { + pId: "0_0", + id: "0_0_7", + text: "河南省( 共1个 )", + value: "河南省", + open: true + }, + { + pId: "0_0_7", + id: "0_0_7_0", + text: "郑州市", + value: "郑州市", + open: true + }, + { + pId: "0_0", + id: "0_0_8", + text: "黑龙江省( 共7个 )", + value: "黑龙江省", + open: true + }, + { + pId: "0_0_8", + id: "0_0_8_0", + text: "大庆市", + value: "大庆市", + open: true + }, + { + pId: "0_0_8", + id: "0_0_8_1", + text: "哈尔滨市", + value: "哈尔滨市", + open: true + }, + { + pId: "0_0_8", + id: "0_0_8_2", + text: "鸡西市", + value: "鸡西市", + open: true + }, + { + pId: "0_0_8", + id: "0_0_8_3", + text: "佳木斯市", + value: "佳木斯市", + open: true + }, + { + pId: "0_0_8", + id: "0_0_8_4", + text: "牡丹江市", + value: "牡丹江市", + open: true + }, + { + pId: "0_0_8", + id: "0_0_8_5", + text: "齐齐哈尔市", + value: "齐齐哈尔市", + open: true + }, + { + pId: "0_0_8", + id: "0_0_8_6", + text: "双鸭山市", + value: "双鸭山市", + open: true + }, + { + pId: "0_0", + id: "0_0_9", + text: "湖北省( 共1个 )", + value: "湖北省", + open: true + }, + { + pId: "0_0_9", + id: "0_0_9_0", + text: "武汉市", + value: "武汉市", + open: true + }, + { + pId: "0_0", + id: "0_0_10", + text: "湖南省( 共3个 )", + value: "湖南省", + open: true + }, + { + pId: "0_0_10", + id: "0_0_10_0", + text: "常德市", + value: "常德市", + open: true + }, + { + pId: "0_0_10", + id: "0_0_10_1", + text: "长沙市", + value: "长沙市", + open: true + }, + { + pId: "0_0_10", + id: "0_0_10_2", + text: "邵阳市", + value: "邵阳市", + open: true + }, + { + pId: "0_0", + id: "0_0_11", + text: "吉林省( 共4个 )", + value: "吉林省", + open: true + }, + { + pId: "0_0_11", + id: "0_0_11_0", + text: "白山市", + value: "白山市", + open: true + }, + { + pId: "0_0_11", + id: "0_0_11_1", + text: "长春市", + value: "长春市", + open: true + }, + { + pId: "0_0_11", + id: "0_0_11_2", + text: "松原市", + value: "松原市", + open: true + }, + { + pId: "0_0_11", + id: "0_0_11_3", + text: "通化市", + value: "通化市", + open: true + }, + { + pId: "0_0", + id: "0_0_12", + text: "江苏省( 共8个 )", + value: "江苏省", + open: true + }, + { + pId: "0_0_12", + id: "0_0_12_0", + text: "常州市", + value: "常州市", + open: true + }, + { + pId: "0_0_12", + id: "0_0_12_1", + text: "南京市", + value: "南京市", + open: true + }, + { + pId: "0_0_12", + id: "0_0_12_2", + text: "南通市", + value: "南通市", + open: true + }, + { + pId: "0_0_12", + id: "0_0_12_3", + text: "苏州市", + value: "苏州市", + open: true + }, + { + pId: "0_0_12", + id: "0_0_12_4", + text: "宿迁市", + value: "宿迁市", + open: true + }, + { + pId: "0_0_12", + id: "0_0_12_5", + text: "泰州市", + value: "泰州市", + open: true + }, + { + pId: "0_0_12", + id: "0_0_12_6", + text: "无锡市", + value: "无锡市", + open: true + }, + { + pId: "0_0_12", + id: "0_0_12_7", + text: "盐城市", + value: "盐城市", + open: true + }, + { + pId: "0_0", + id: "0_0_13", + text: "辽宁省( 共11个 )", + value: "辽宁省", + open: true + }, + { + pId: "0_0_13", + id: "0_0_13_0", + text: "鞍山市", + value: "鞍山市", + open: true + }, + { + pId: "0_0_13", + id: "0_0_13_1", + text: "本溪市", + value: "本溪市", + open: true + }, + { + pId: "0_0_13", + id: "0_0_13_2", + text: "朝阳市", + value: "朝阳市", + open: true + }, + { + pId: "0_0_13", + id: "0_0_13_3", + text: "大连市", + value: "大连市", + open: true + }, + { + pId: "0_0_13", + id: "0_0_13_4", + text: "抚顺市", + value: "抚顺市", + open: true + }, + { + pId: "0_0_13", + id: "0_0_13_5", + text: "葫芦岛市", + value: "葫芦岛市", + open: true + }, + { + pId: "0_0_13", + id: "0_0_13_6", + text: "锦州市", + value: "锦州市", + open: true + }, + { + pId: "0_0_13", + id: "0_0_13_7", + text: "辽阳市", + value: "辽阳市", + open: true + }, + { + pId: "0_0_13", + id: "0_0_13_8", + text: "盘锦市", + value: "盘锦市", + open: true + }, + { + pId: "0_0_13", + id: "0_0_13_9", + text: "沈阳市", + value: "沈阳市", + open: true + }, + { + pId: "0_0_13", + id: "0_0_13_10", + text: "营口市", + value: "营口市", + open: true + }, + { + pId: "0_0", + id: "0_0_14", + text: "内蒙古( 共1个 )", + value: "内蒙古", + open: true + }, + { + pId: "0_0_14", + id: "0_0_14_0", + text: "鄂尔多斯市", + value: "鄂尔多斯市", + open: true + }, + { + pId: "0_0", + id: "0_0_15", + text: "宁夏回族自治区( 共1个 )", + value: "宁夏回族自治区", + open: true + }, + { + pId: "0_0_15", + id: "0_0_15_0", + text: "银川市", + value: "银川市", + open: true + }, + { + pId: "0_0", + id: "0_0_16", + text: "山东省( 共7个 )", + value: "山东省", + open: true + }, + { + pId: "0_0_16", + id: "0_0_16_0", + text: "济南市", + value: "济南市", + open: true + }, + { + pId: "0_0_16", + id: "0_0_16_1", + text: "济宁市", + value: "济宁市", + open: true + }, + { + pId: "0_0_16", + id: "0_0_16_2", + text: "聊城市", + value: "聊城市", + open: true + }, + { + pId: "0_0_16", + id: "0_0_16_3", + text: "临沂市", + value: "临沂市", + open: true + }, + { + pId: "0_0_16", + id: "0_0_16_4", + text: "青岛市", + value: "青岛市", + open: true + }, + { + pId: "0_0_16", + id: "0_0_16_5", + text: "烟台市", + value: "烟台市", + open: true + }, + { + pId: "0_0_16", + id: "0_0_16_6", + text: "枣庄市", + value: "枣庄市", + open: true + }, + { + pId: "0_0", + id: "0_0_17", + text: "山西省( 共1个 )", + value: "山西省", + open: true + }, + { + pId: "0_0_17", + id: "0_0_17_0", + text: "太原市", + value: "太原市", + open: true + }, + { + pId: "0_0", + id: "0_0_18", + text: "陕西省( 共1个 )", + value: "陕西省", + open: true + }, + { + pId: "0_0_18", + id: "0_0_18_0", + text: "西安市", + value: "西安市", + open: true + }, + { + pId: "0_0", + id: "0_0_19", + text: "上海市( 共1个 )", + value: "上海市", + open: true + }, + { + pId: "0_0_19", + id: "0_0_19_0", + text: "上海市区", + value: "上海市区", + open: true + }, + { + pId: "0_0", + id: "0_0_20", + text: "四川省( 共1个 )", + value: "四川省", + open: true + }, + { + pId: "0_0_20", + id: "0_0_20_0", + text: "成都市", + value: "成都市", + open: true + }, + { + pId: "0_0", + id: "0_0_21", + text: "新疆维吾尔族自治区( 共2个 )", + value: "新疆维吾尔族自治区", + open: true + }, + { + pId: "0_0_21", + id: "0_0_21_0", + text: "吐鲁番地区", + value: "吐鲁番地区", + open: true + }, + { + pId: "0_0_21", + id: "0_0_21_1", + text: "乌鲁木齐", + value: "乌鲁木齐", + open: true + }, + { + pId: "0_0", + id: "0_0_22", + text: "云南省( 共1个 )", + value: "云南省", + open: true + }, + { + pId: "0_0_22", + id: "0_0_22_0", + text: "昆明市", + value: "昆明市", + open: true + }, + { + pId: "0_0", + id: "0_0_23", + text: "浙江省( 共5个 )", + value: "浙江省", + open: true + }, + { + pId: "0_0_23", + id: "0_0_23_0", + text: "杭州市", + value: "杭州市", + open: true + }, + { + pId: "0_0_23", + id: "0_0_23_1", + text: "湖州市", + value: "湖州市", + open: true + }, + { + pId: "0_0_23", + id: "0_0_23_2", + text: "嘉兴市", + value: "嘉兴市", + open: true + }, + { + pId: "0_0_23", + id: "0_0_23_3", + text: "宁波市", + value: "宁波市", + open: true + }, + { + pId: "0_0_23", + id: "0_0_23_4", + text: "绍兴市", + value: "绍兴市", + open: true + }, + { + pId: "0_0", + id: "0_0_24", + text: "重庆市( 共1个 )", + value: "重庆市", + open: true + }, + { + pId: "0_0_24", + id: "0_0_24_0", + text: "重庆市区", + value: "重庆市区", + open: true + }, + { + pId: "0", + id: "0_1", + text: "中国( 共34个 )", + value: "中国", + open: true + }, + { + pId: "0_1", + id: "0_1_0", + text: "安徽省( 共19个 )", + value: "安徽省", + open: true + }, + { + pId: "0_1_0", + id: "0_1_0_0", + text: "安庆市", + value: "安庆市", + open: true + }, + { + pId: "0_1_0", + id: "0_1_0_1", + text: "蚌埠市", + value: "蚌埠市", + open: true + }, + { + pId: "0_1_0", + id: "0_1_0_2", + text: "亳州市", + value: "亳州市", + open: true + }, + { + pId: "0_1_0", + id: "0_1_0_3", + text: "巢湖市", + value: "巢湖市", + open: true + }, + { + pId: "0_1_0", + id: "0_1_0_4", + text: "池州市", + value: "池州市", + open: true + }, + { + pId: "0_1_0", + id: "0_1_0_5", + text: "滁州市", + value: "滁州市", + open: true + }, + { + pId: "0_1_0", + id: "0_1_0_6", + text: "阜阳市", + value: "阜阳市", + open: true + }, + { + pId: "0_1_0", + id: "0_1_0_7", + text: "毫州市", + value: "毫州市", + open: true + }, + { + pId: "0_1_0", + id: "0_1_0_8", + text: "合肥市", + value: "合肥市", + open: true + }, + { + pId: "0_1_0", + id: "0_1_0_9", + text: "淮北市", + value: "淮北市", + open: true + }, + { + pId: "0_1_0", + id: "0_1_0_10", + text: "淮南市", + value: "淮南市", + open: true + }, + { + pId: "0_1_0", + id: "0_1_0_11", + text: "黄山市", + value: "黄山市", + open: true + }, + { + pId: "0_1_0", + id: "0_1_0_12", + text: "六安市", + value: "六安市", + open: true + }, + { + pId: "0_1_0", + id: "0_1_0_13", + text: "马鞍山市", + value: "马鞍山市", + open: true + }, + { + pId: "0_1_0", + id: "0_1_0_14", + text: "濮阳市", + value: "濮阳市", + open: true + }, + { + pId: "0_1_0", + id: "0_1_0_15", + text: "宿州市", + value: "宿州市", + open: true + }, + { + pId: "0_1_0", + id: "0_1_0_16", + text: "铜陵市", + value: "铜陵市", + open: true + }, + { + pId: "0_1_0", + id: "0_1_0_17", + text: "芜湖市", + value: "芜湖市", + open: true + }, + { + pId: "0_1_0", + id: "0_1_0_18", + text: "宣城市", + value: "宣城市", + open: true + }, + { + pId: "0_1", + id: "0_1_1", + text: "澳门特别行政区( 共1个 )", + value: "澳门特别行政区", + open: true + }, + { + pId: "0_1_1", + id: "0_1_1_0", + text: "澳门", + value: "澳门", + open: true + }, + { + pId: "0_1", + id: "0_1_2", + text: "北京市( 共17个 )", + value: "北京市", + open: true + }, + { + pId: "0_1_2", + id: "0_1_2_0", + text: "北京市区", + value: "北京市区", + open: true + }, + { + pId: "0_1_2", + id: "0_1_2_1", + text: "昌平区", + value: "昌平区", + open: true + }, + { + pId: "0_1_2", + id: "0_1_2_2", + text: "朝阳区", + value: "朝阳区", + open: true + }, + { + pId: "0_1_2", + id: "0_1_2_3", + text: "大兴区", + value: "大兴区", + open: true + }, + { + pId: "0_1_2", + id: "0_1_2_4", + text: "东城区", + value: "东城区", + open: true + }, + { + pId: "0_1_2", + id: "0_1_2_5", + text: "房山区", + value: "房山区", + open: true + }, + { + pId: "0_1_2", + id: "0_1_2_6", + text: "丰台区", + value: "丰台区", + open: true + }, + { + pId: "0_1_2", + id: "0_1_2_7", + text: "海淀区", + value: "海淀区", + open: true + }, + { + pId: "0_1_2", + id: "0_1_2_8", + text: "海淀区4内", + value: "海淀区4内", + open: true + }, + { + pId: "0_1_2", + id: "0_1_2_9", + text: "海淀区4外", + value: "海淀区4外", + open: true + }, + { + pId: "0_1_2", + id: "0_1_2_10", + text: "门头沟区", + value: "门头沟区", + open: true + }, + { + pId: "0_1_2", + id: "0_1_2_11", + text: "平谷区", + value: "平谷区", + open: true + }, + { + pId: "0_1_2", + id: "0_1_2_12", + text: "石景山区", + value: "石景山区", + open: true + }, + { + pId: "0_1_2", + id: "0_1_2_13", + text: "顺义区", + value: "顺义区", + open: true + }, + { + pId: "0_1_2", + id: "0_1_2_14", + text: "通州区", + value: "通州区", + open: true + }, + { + pId: "0_1_2", + id: "0_1_2_15", + text: "西城区", + value: "西城区", + open: true + }, + { + pId: "0_1_2", + id: "0_1_2_16", + text: "西城区 ", + value: "西城区 ", + open: true + }, + { + pId: "0_1", + id: "0_1_3", + text: "福建省( 共9个 )", + value: "福建省", + open: true + }, + { + pId: "0_1_3", + id: "0_1_3_0", + text: "福州市", + value: "福州市", + open: true + }, + { + pId: "0_1_3", + id: "0_1_3_1", + text: "龙岩市", + value: "龙岩市", + open: true + }, + { + pId: "0_1_3", + id: "0_1_3_2", + text: "南平市", + value: "南平市", + open: true + }, + { + pId: "0_1_3", + id: "0_1_3_3", + text: "宁德市", + value: "宁德市", + open: true + }, + { + pId: "0_1_3", + id: "0_1_3_4", + text: "莆田市", + value: "莆田市", + open: true + }, + { + pId: "0_1_3", + id: "0_1_3_5", + text: "泉州市", + value: "泉州市", + open: true + }, + { + pId: "0_1_3", + id: "0_1_3_6", + text: "三明市", + value: "三明市", + open: true + }, + { + pId: "0_1_3", + id: "0_1_3_7", + text: "厦门市", + value: "厦门市", + open: true + }, + { + pId: "0_1_3", + id: "0_1_3_8", + text: "漳州市", + value: "漳州市", + open: true + }, + { + pId: "0_1", + id: "0_1_4", + text: "甘肃省( 共12个 )", + value: "甘肃省", + open: true + }, + { + pId: "0_1_4", + id: "0_1_4_0", + text: "白银市", + value: "白银市", + open: true + }, + { + pId: "0_1_4", + id: "0_1_4_1", + text: "嘉峪关市", + value: "嘉峪关市", + open: true + }, + { + pId: "0_1_4", + id: "0_1_4_2", + text: "金昌市", + value: "金昌市", + open: true + }, + { + pId: "0_1_4", + id: "0_1_4_3", + text: "酒泉市", + value: "酒泉市", + open: true + }, + { + pId: "0_1_4", + id: "0_1_4_4", + text: "兰州市", + value: "兰州市", + open: true + }, + { + pId: "0_1_4", + id: "0_1_4_5", + text: "陇南市", + value: "陇南市", + open: true + }, + { + pId: "0_1_4", + id: "0_1_4_6", + text: "平凉市", + value: "平凉市", + open: true + }, + { + pId: "0_1_4", + id: "0_1_4_7", + text: "庆阳市", + value: "庆阳市", + open: true + }, + { + pId: "0_1_4", + id: "0_1_4_8", + text: "天津市区", + value: "天津市区", + open: true + }, + { + pId: "0_1_4", + id: "0_1_4_9", + text: "天水市", + value: "天水市", + open: true + }, + { + pId: "0_1_4", + id: "0_1_4_10", + text: "武威市", + value: "武威市", + open: true + }, + { + pId: "0_1_4", + id: "0_1_4_11", + text: "张掖市", + value: "张掖市", + open: true + }, + { + pId: "0_1", + id: "0_1_5", + text: "广东省( 共21个 )", + value: "广东省", + open: true + }, + { + pId: "0_1_5", + id: "0_1_5_0", + text: "潮州市", + value: "潮州市", + open: true + }, + { + pId: "0_1_5", + id: "0_1_5_1", + text: "东莞市", + value: "东莞市", + open: true + }, + { + pId: "0_1_5", + id: "0_1_5_2", + text: "佛山市", + value: "佛山市", + open: true + }, + { + pId: "0_1_5", + id: "0_1_5_3", + text: "广州市", + value: "广州市", + open: true + }, + { + pId: "0_1_5", + id: "0_1_5_4", + text: "河源市", + value: "河源市", + open: true + }, + { + pId: "0_1_5", + id: "0_1_5_5", + text: "惠州市", + value: "惠州市", + open: true + }, + { + pId: "0_1_5", + id: "0_1_5_6", + text: "江门市", + value: "江门市", + open: true + }, + { + pId: "0_1_5", + id: "0_1_5_7", + text: "揭阳市", + value: "揭阳市", + open: true + }, + { + pId: "0_1_5", + id: "0_1_5_8", + text: "茂名市", + value: "茂名市", + open: true + }, + { + pId: "0_1_5", + id: "0_1_5_9", + text: "梅州市", + value: "梅州市", + open: true + }, + { + pId: "0_1_5", + id: "0_1_5_10", + text: "清远市", + value: "清远市", + open: true + }, + { + pId: "0_1_5", + id: "0_1_5_11", + text: "汕头市", + value: "汕头市", + open: true + }, + { + pId: "0_1_5", + id: "0_1_5_12", + text: "汕尾市", + value: "汕尾市", + open: true + }, + { + pId: "0_1_5", + id: "0_1_5_13", + text: "韶关市", + value: "韶关市", + open: true + }, + { + pId: "0_1_5", + id: "0_1_5_14", + text: "深圳市", + value: "深圳市", + open: true + }, + { + pId: "0_1_5", + id: "0_1_5_15", + text: "阳江市", + value: "阳江市", + open: true + }, + { + pId: "0_1_5", + id: "0_1_5_16", + text: "云浮市", + value: "云浮市", + open: true + }, + { + pId: "0_1_5", + id: "0_1_5_17", + text: "湛江市", + value: "湛江市", + open: true + }, + { + pId: "0_1_5", + id: "0_1_5_18", + text: "肇庆市", + value: "肇庆市", + open: true + }, + { + pId: "0_1_5", + id: "0_1_5_19", + text: "中山市", + value: "中山市", + open: true + }, + { + pId: "0_1_5", + id: "0_1_5_20", + text: "珠海市", + value: "珠海市", + open: true + }, + { + pId: "0_1", + id: "0_1_6", + text: "广西壮族自治区( 共14个 )", + value: "广西壮族自治区", + open: true + }, + { + pId: "0_1_6", + id: "0_1_6_0", + text: "百色市", + value: "百色市", + open: true + }, + { + pId: "0_1_6", + id: "0_1_6_1", + text: "北海市", + value: "北海市", + open: true + }, + { + pId: "0_1_6", + id: "0_1_6_2", + text: "崇左市", + value: "崇左市", + open: true + }, + { + pId: "0_1_6", + id: "0_1_6_3", + text: "防城港市", + value: "防城港市", + open: true + }, + { + pId: "0_1_6", + id: "0_1_6_4", + text: "桂林市", + value: "桂林市", + open: true + }, + { + pId: "0_1_6", + id: "0_1_6_5", + text: "贵港市", + value: "贵港市", + open: true + }, + { + pId: "0_1_6", + id: "0_1_6_6", + text: "河池市", + value: "河池市", + open: true + }, + { + pId: "0_1_6", + id: "0_1_6_7", + text: "贺州市", + value: "贺州市", + open: true + }, + { + pId: "0_1_6", + id: "0_1_6_8", + text: "来宾市", + value: "来宾市", + open: true + }, + { + pId: "0_1_6", + id: "0_1_6_9", + text: "柳州市", + value: "柳州市", + open: true + }, + { + pId: "0_1_6", + id: "0_1_6_10", + text: "南宁市", + value: "南宁市", + open: true + }, + { + pId: "0_1_6", + id: "0_1_6_11", + text: "钦州市", + value: "钦州市", + open: true + }, + { + pId: "0_1_6", + id: "0_1_6_12", + text: "梧州市", + value: "梧州市", + open: true + }, + { + pId: "0_1_6", + id: "0_1_6_13", + text: "玉林市", + value: "玉林市", + open: true + }, + { + pId: "0_1", + id: "0_1_7", + text: "贵州省( 共9个 )", + value: "贵州省", + open: true + }, + { + pId: "0_1_7", + id: "0_1_7_0", + text: "安顺市", + value: "安顺市", + open: true + }, + { + pId: "0_1_7", + id: "0_1_7_1", + text: "毕节地区", + value: "毕节地区", + open: true + }, + { + pId: "0_1_7", + id: "0_1_7_2", + text: "贵阳市", + value: "贵阳市", + open: true + }, + { + pId: "0_1_7", + id: "0_1_7_3", + text: "六盘水市", + value: "六盘水市", + open: true + }, + { + pId: "0_1_7", + id: "0_1_7_4", + text: "黔东南州", + value: "黔东南州", + open: true + }, + { + pId: "0_1_7", + id: "0_1_7_5", + text: "黔南州", + value: "黔南州", + open: true + }, + { + pId: "0_1_7", + id: "0_1_7_6", + text: "黔西南市", + value: "黔西南市", + open: true + }, + { + pId: "0_1_7", + id: "0_1_7_7", + text: "铜仁地区", + value: "铜仁地区", + open: true + }, + { + pId: "0_1_7", + id: "0_1_7_8", + text: "遵义市", + value: "遵义市", + open: true + }, + { + pId: "0_1", + id: "0_1_8", + text: "海南省( 共2个 )", + value: "海南省", + open: true + }, + { + pId: "0_1_8", + id: "0_1_8_0", + text: "海口市", + value: "海口市", + open: true + }, + { + pId: "0_1_8", + id: "0_1_8_1", + text: "三亚市", + value: "三亚市", + open: true + }, + { + pId: "0_1", + id: "0_1_9", + text: "河北省( 共12个 )", + value: "河北省", + open: true + }, + { + pId: "0_1_9", + id: "0_1_9_0", + text: "保定市", + value: "保定市", + open: true + }, + { + pId: "0_1_9", + id: "0_1_9_1", + text: "沧州市", + value: "沧州市", + open: true + }, + { + pId: "0_1_9", + id: "0_1_9_2", + text: "承德市", + value: "承德市", + open: true + }, + { + pId: "0_1_9", + id: "0_1_9_3", + text: "邯郸市", + value: "邯郸市", + open: true + }, + { + pId: "0_1_9", + id: "0_1_9_4", + text: "衡水市", + value: "衡水市", + open: true + }, + { + pId: "0_1_9", + id: "0_1_9_5", + text: "廊坊市", + value: "廊坊市", + open: true + }, + { + pId: "0_1_9", + id: "0_1_9_6", + text: "秦皇岛市", + value: "秦皇岛市", + open: true + }, + { + pId: "0_1_9", + id: "0_1_9_7", + text: "石家庄市", + value: "石家庄市", + open: true + }, + { + pId: "0_1_9", + id: "0_1_9_8", + text: "唐山市", + value: "唐山市", + open: true + }, + { + pId: "0_1_9", + id: "0_1_9_9", + text: "天津市区", + value: "天津市区", + open: true + }, + { + pId: "0_1_9", + id: "0_1_9_10", + text: "邢台市", + value: "邢台市", + open: true + }, + { + pId: "0_1_9", + id: "0_1_9_11", + text: "张家口市", + value: "张家口市", + open: true + }, + { + pId: "0_1", + id: "0_1_10", + text: "河南省( 共19个 )", + value: "河南省", + open: true + }, + { + pId: "0_1_10", + id: "0_1_10_0", + text: "安阳市", + value: "安阳市", + open: true + }, + { + pId: "0_1_10", + id: "0_1_10_1", + text: "鹤壁市", + value: "鹤壁市", + open: true + }, + { + pId: "0_1_10", + id: "0_1_10_2", + text: "济源市", + value: "济源市", + open: true + }, + { + pId: "0_1_10", + id: "0_1_10_3", + text: "焦作市", + value: "焦作市", + open: true + }, + { + pId: "0_1_10", + id: "0_1_10_4", + text: "开封市", + value: "开封市", + open: true + }, + { + pId: "0_1_10", + id: "0_1_10_5", + text: "廊坊市", + value: "廊坊市", + open: true + }, + { + pId: "0_1_10", + id: "0_1_10_6", + text: "洛阳市", + value: "洛阳市", + open: true + }, + { + pId: "0_1_10", + id: "0_1_10_7", + text: "漯河市", + value: "漯河市", + open: true + }, + { + pId: "0_1_10", + id: "0_1_10_8", + text: "南阳市", + value: "南阳市", + open: true + }, + { + pId: "0_1_10", + id: "0_1_10_9", + text: "平顶山市", + value: "平顶山市", + open: true + }, + { + pId: "0_1_10", + id: "0_1_10_10", + text: "濮阳市", + value: "濮阳市", + open: true + }, + { + pId: "0_1_10", + id: "0_1_10_11", + text: "三门峡市", + value: "三门峡市", + open: true + }, + { + pId: "0_1_10", + id: "0_1_10_12", + text: "商丘市", + value: "商丘市", + open: true + }, + { + pId: "0_1_10", + id: "0_1_10_13", + text: "新乡市", + value: "新乡市", + open: true + }, + { + pId: "0_1_10", + id: "0_1_10_14", + text: "信阳市", + value: "信阳市", + open: true + }, + { + pId: "0_1_10", + id: "0_1_10_15", + text: "许昌市", + value: "许昌市", + open: true + }, + { + pId: "0_1_10", + id: "0_1_10_16", + text: "郑州市", + value: "郑州市", + open: true + }, + { + pId: "0_1_10", + id: "0_1_10_17", + text: "周口市", + value: "周口市", + open: true + }, + { + pId: "0_1_10", + id: "0_1_10_18", + text: "驻马店市", + value: "驻马店市", + open: true + }, + { + pId: "0_1", + id: "0_1_11", + text: "黑龙江省( 共13个 )", + value: "黑龙江省", + open: true + }, + { + pId: "0_1_11", + id: "0_1_11_0", + text: "大庆市", + value: "大庆市", + open: true + }, + { + pId: "0_1_11", + id: "0_1_11_1", + text: "大兴安岭地区", + value: "大兴安岭地区", + open: true + }, + { + pId: "0_1_11", + id: "0_1_11_2", + text: "大兴安岭市", + value: "大兴安岭市", + open: true + }, + { + pId: "0_1_11", + id: "0_1_11_3", + text: "哈尔滨市", + value: "哈尔滨市", + open: true + }, + { + pId: "0_1_11", + id: "0_1_11_4", + text: "鹤港市", + value: "鹤港市", + open: true + }, + { + pId: "0_1_11", + id: "0_1_11_5", + text: "黑河市", + value: "黑河市", + open: true + }, + { + pId: "0_1_11", + id: "0_1_11_6", + text: "佳木斯市", + value: "佳木斯市", + open: true + }, + { + pId: "0_1_11", + id: "0_1_11_7", + text: "牡丹江市", + value: "牡丹江市", + open: true + }, + { + pId: "0_1_11", + id: "0_1_11_8", + text: "七台河市", + value: "七台河市", + open: true + }, + { + pId: "0_1_11", + id: "0_1_11_9", + text: "齐齐哈尔市", + value: "齐齐哈尔市", + open: true + }, + { + pId: "0_1_11", + id: "0_1_11_10", + text: "双鸭山市", + value: "双鸭山市", + open: true + }, + { + pId: "0_1_11", + id: "0_1_11_11", + text: "绥化市", + value: "绥化市", + open: true + }, + { + pId: "0_1_11", + id: "0_1_11_12", + text: "伊春市", + value: "伊春市", + open: true + }, + { + pId: "0_1", + id: "0_1_12", + text: "湖北省( 共16个 )", + value: "湖北省", + open: true + }, + { + pId: "0_1_12", + id: "0_1_12_0", + text: "鄂州市", + value: "鄂州市", + open: true + }, + { + pId: "0_1_12", + id: "0_1_12_1", + text: "恩施土家族苗族自治州", + value: "恩施土家族苗族自治州", + open: true + }, + { + pId: "0_1_12", + id: "0_1_12_2", + text: "黄冈市", + value: "黄冈市", + open: true + }, + { + pId: "0_1_12", + id: "0_1_12_3", + text: "黄石市", + value: "黄石市", + open: true + }, + { + pId: "0_1_12", + id: "0_1_12_4", + text: "荆门市", + value: "荆门市", + open: true + }, + { + pId: "0_1_12", + id: "0_1_12_5", + text: "荆州市", + value: "荆州市", + open: true + }, + { + pId: "0_1_12", + id: "0_1_12_6", + text: "神农架市", + value: "神农架市", + open: true + }, + { + pId: "0_1_12", + id: "0_1_12_7", + text: "十堰市", + value: "十堰市", + open: true + }, + { + pId: "0_1_12", + id: "0_1_12_8", + text: "随州市", + value: "随州市", + open: true + }, + { + pId: "0_1_12", + id: "0_1_12_9", + text: "天门市", + value: "天门市", + open: true + }, + { + pId: "0_1_12", + id: "0_1_12_10", + text: "武汉市", + value: "武汉市", + open: true + }, + { + pId: "0_1_12", + id: "0_1_12_11", + text: "咸宁市", + value: "咸宁市", + open: true + }, + { + pId: "0_1_12", + id: "0_1_12_12", + text: "襄樊市", + value: "襄樊市", + open: true + }, + { + pId: "0_1_12", + id: "0_1_12_13", + text: "襄阳市", + value: "襄阳市", + open: true + }, + { + pId: "0_1_12", + id: "0_1_12_14", + text: "孝感市", + value: "孝感市", + open: true + }, + { + pId: "0_1_12", + id: "0_1_12_15", + text: "宜昌市", + value: "宜昌市", + open: true + }, + { + pId: "0_1", + id: "0_1_13", + text: "湖南省( 共15个 )", + value: "湖南省", + open: true + }, + { + pId: "0_1_13", + id: "0_1_13_0", + text: "常德市", + value: "常德市", + open: true + }, + { + pId: "0_1_13", + id: "0_1_13_1", + text: "长沙市", + value: "长沙市", + open: true + }, + { + pId: "0_1_13", + id: "0_1_13_2", + text: "郴州市", + value: "郴州市", + open: true + }, + { + pId: "0_1_13", + id: "0_1_13_3", + text: "衡阳市", + value: "衡阳市", + open: true + }, + { + pId: "0_1_13", + id: "0_1_13_4", + text: "怀化市", + value: "怀化市", + open: true + }, + { + pId: "0_1_13", + id: "0_1_13_5", + text: "娄底市", + value: "娄底市", + open: true + }, + { + pId: "0_1_13", + id: "0_1_13_6", + text: "邵阳市", + value: "邵阳市", + open: true + }, + { + pId: "0_1_13", + id: "0_1_13_7", + text: "湘潭市", + value: "湘潭市", + open: true + }, + { + pId: "0_1_13", + id: "0_1_13_8", + text: "湘西市", + value: "湘西市", + open: true + }, + { + pId: "0_1_13", + id: "0_1_13_9", + text: "湘西土家族苗族自治州", + value: "湘西土家族苗族自治州", + open: true + }, + { + pId: "0_1_13", + id: "0_1_13_10", + text: "益阳市", + value: "益阳市", + open: true + }, + { + pId: "0_1_13", + id: "0_1_13_11", + text: "永州市", + value: "永州市", + open: true + }, + { + pId: "0_1_13", + id: "0_1_13_12", + text: "岳阳市", + value: "岳阳市", + open: true + }, + { + pId: "0_1_13", + id: "0_1_13_13", + text: "张家界市", + value: "张家界市", + open: true + }, + { + pId: "0_1_13", + id: "0_1_13_14", + text: "株洲市", + value: "株洲市", + open: true + }, + { + pId: "0_1", + id: "0_1_14", + text: "吉林省( 共10个 )", + value: "吉林省", + open: true + }, + { + pId: "0_1_14", + id: "0_1_14_0", + text: "白城市", + value: "白城市", + open: true + }, + { + pId: "0_1_14", + id: "0_1_14_1", + text: "白山市", + value: "白山市", + open: true + }, + { + pId: "0_1_14", + id: "0_1_14_2", + text: "长春市", + value: "长春市", + open: true + }, + { + pId: "0_1_14", + id: "0_1_14_3", + text: "大庆市", + value: "大庆市", + open: true + }, + { + pId: "0_1_14", + id: "0_1_14_4", + text: "吉林市", + value: "吉林市", + open: true + }, + { + pId: "0_1_14", + id: "0_1_14_5", + text: "辽源市", + value: "辽源市", + open: true + }, + { + pId: "0_1_14", + id: "0_1_14_6", + text: "四平市", + value: "四平市", + open: true + }, + { + pId: "0_1_14", + id: "0_1_14_7", + text: "松原市", + value: "松原市", + open: true + }, + { + pId: "0_1_14", + id: "0_1_14_8", + text: "通化市", + value: "通化市", + open: true + }, + { + pId: "0_1_14", + id: "0_1_14_9", + text: "延边朝鲜族自治州", + value: "延边朝鲜族自治州", + open: true + }, + { + pId: "0_1", + id: "0_1_15", + text: "江苏省( 共13个 )", + value: "江苏省", + open: true + }, + { + pId: "0_1_15", + id: "0_1_15_0", + text: "常州市", + value: "常州市", + open: true + }, + { + pId: "0_1_15", + id: "0_1_15_1", + text: "淮安市", + value: "淮安市", + open: true + }, + { + pId: "0_1_15", + id: "0_1_15_2", + text: "连云港市", + value: "连云港市", + open: true + }, + { + pId: "0_1_15", + id: "0_1_15_3", + text: "南京市", + value: "南京市", + open: true + }, + { + pId: "0_1_15", + id: "0_1_15_4", + text: "南通市", + value: "南通市", + open: true + }, + { + pId: "0_1_15", + id: "0_1_15_5", + text: "苏州市", + value: "苏州市", + open: true + }, + { + pId: "0_1_15", + id: "0_1_15_6", + text: "宿迁市", + value: "宿迁市", + open: true + }, + { + pId: "0_1_15", + id: "0_1_15_7", + text: "泰州市", + value: "泰州市", + open: true + }, + { + pId: "0_1_15", + id: "0_1_15_8", + text: "无锡市", + value: "无锡市", + open: true + }, + { + pId: "0_1_15", + id: "0_1_15_9", + text: "徐州市", + value: "徐州市", + open: true + }, + { + pId: "0_1_15", + id: "0_1_15_10", + text: "盐城市", + value: "盐城市", + open: true + }, + { + pId: "0_1_15", + id: "0_1_15_11", + text: "扬州市", + value: "扬州市", + open: true + }, + { + pId: "0_1_15", + id: "0_1_15_12", + text: "镇江市", + value: "镇江市", + open: true + }, + { + pId: "0_1", + id: "0_1_16", + text: "江西省( 共10个 )", + value: "江西省", + open: true + }, + { + pId: "0_1_16", + id: "0_1_16_0", + text: "抚州市", + value: "抚州市", + open: true + }, + { + pId: "0_1_16", + id: "0_1_16_1", + text: "赣州市", + value: "赣州市", + open: true + }, + { + pId: "0_1_16", + id: "0_1_16_2", + text: "景德镇市", + value: "景德镇市", + open: true + }, + { + pId: "0_1_16", + id: "0_1_16_3", + text: "九江市", + value: "九江市", + open: true + }, + { + pId: "0_1_16", + id: "0_1_16_4", + text: "南昌市", + value: "南昌市", + open: true + }, + { + pId: "0_1_16", + id: "0_1_16_5", + text: "萍乡市", + value: "萍乡市", + open: true + }, + { + pId: "0_1_16", + id: "0_1_16_6", + text: "上饶市", + value: "上饶市", + open: true + }, + { + pId: "0_1_16", + id: "0_1_16_7", + text: "新余市", + value: "新余市", + open: true + }, + { + pId: "0_1_16", + id: "0_1_16_8", + text: "宜春市", + value: "宜春市", + open: true + }, + { + pId: "0_1_16", + id: "0_1_16_9", + text: "鹰潭市", + value: "鹰潭市", + open: true + }, + { + pId: "0_1", + id: "0_1_17", + text: "辽宁省( 共14个 )", + value: "辽宁省", + open: true + }, + { + pId: "0_1_17", + id: "0_1_17_0", + text: "鞍山市", + value: "鞍山市", + open: true + }, + { + pId: "0_1_17", + id: "0_1_17_1", + text: "本溪市", + value: "本溪市", + open: true + }, + { + pId: "0_1_17", + id: "0_1_17_2", + text: "朝阳市", + value: "朝阳市", + open: true + }, + { + pId: "0_1_17", + id: "0_1_17_3", + text: "大连市", + value: "大连市", + open: true + }, + { + pId: "0_1_17", + id: "0_1_17_4", + text: "丹东市", + value: "丹东市", + open: true + }, + { + pId: "0_1_17", + id: "0_1_17_5", + text: "抚顺市", + value: "抚顺市", + open: true + }, + { + pId: "0_1_17", + id: "0_1_17_6", + text: "阜新市", + value: "阜新市", + open: true + }, + { + pId: "0_1_17", + id: "0_1_17_7", + text: "葫芦岛市", + value: "葫芦岛市", + open: true + }, + { + pId: "0_1_17", + id: "0_1_17_8", + text: "锦州市", + value: "锦州市", + open: true + }, + { + pId: "0_1_17", + id: "0_1_17_9", + text: "辽阳市", + value: "辽阳市", + open: true + }, + { + pId: "0_1_17", + id: "0_1_17_10", + text: "盘锦市", + value: "盘锦市", + open: true + }, + { + pId: "0_1_17", + id: "0_1_17_11", + text: "沈阳市", + value: "沈阳市", + open: true + }, + { + pId: "0_1_17", + id: "0_1_17_12", + text: "铁岭市", + value: "铁岭市", + open: true + }, + { + pId: "0_1_17", + id: "0_1_17_13", + text: "营口市", + value: "营口市", + open: true + }, + { + pId: "0_1", + id: "0_1_18", + text: "内蒙古( 共10个 )", + value: "内蒙古", + open: true + }, + { + pId: "0_1_18", + id: "0_1_18_0", + text: "包头市", + value: "包头市", + open: true + }, + { + pId: "0_1_18", + id: "0_1_18_1", + text: "赤峰市", + value: "赤峰市", + open: true + }, + { + pId: "0_1_18", + id: "0_1_18_2", + text: "鄂尔多斯市", + value: "鄂尔多斯市", + open: true + }, + { + pId: "0_1_18", + id: "0_1_18_3", + text: "呼和浩特市", + value: "呼和浩特市", + open: true + }, + { + pId: "0_1_18", + id: "0_1_18_4", + text: "呼伦贝尔市", + value: "呼伦贝尔市", + open: true + }, + { + pId: "0_1_18", + id: "0_1_18_5", + text: "通辽市", + value: "通辽市", + open: true + }, + { + pId: "0_1_18", + id: "0_1_18_6", + text: "乌海市", + value: "乌海市", + open: true + }, + { + pId: "0_1_18", + id: "0_1_18_7", + text: "锡林郭勒市", + value: "锡林郭勒市", + open: true + }, + { + pId: "0_1_18", + id: "0_1_18_8", + text: "兴安市", + value: "兴安市", + open: true + }, + { + pId: "0_1_18", + id: "0_1_18_9", + text: "运城市", + value: "运城市", + open: true + }, + { + pId: "0_1", + id: "0_1_19", + text: "宁夏回族自治区( 共5个 )", + value: "宁夏回族自治区", + open: true + }, + { + pId: "0_1_19", + id: "0_1_19_0", + text: "固原市", + value: "固原市", + open: true + }, + { + pId: "0_1_19", + id: "0_1_19_1", + text: "石嘴山市", + value: "石嘴山市", + open: true + }, + { + pId: "0_1_19", + id: "0_1_19_2", + text: "吴忠市", + value: "吴忠市", + open: true + }, + { + pId: "0_1_19", + id: "0_1_19_3", + text: "银川市", + value: "银川市", + open: true + }, + { + pId: "0_1_19", + id: "0_1_19_4", + text: "中卫市", + value: "中卫市", + open: true + }, + { + pId: "0_1", + id: "0_1_20", + text: "青海省( 共4个 )", + value: "青海省", + open: true + }, + { + pId: "0_1_20", + id: "0_1_20_0", + text: "海东地区", + value: "海东地区", + open: true + }, + { + pId: "0_1_20", + id: "0_1_20_1", + text: "海南藏族自治州", + value: "海南藏族自治州", + open: true + }, + { + pId: "0_1_20", + id: "0_1_20_2", + text: "海西蒙古族藏族自治州", + value: "海西蒙古族藏族自治州", + open: true + }, + { + pId: "0_1_20", + id: "0_1_20_3", + text: "西宁市", + value: "西宁市", + open: true + }, + { + pId: "0_1", + id: "0_1_21", + text: "山东省( 共17个 )", + value: "山东省", + open: true + }, + { + pId: "0_1_21", + id: "0_1_21_0", + text: "滨州市", + value: "滨州市", + open: true + }, + { + pId: "0_1_21", + id: "0_1_21_1", + text: "德州市", + value: "德州市", + open: true + }, + { + pId: "0_1_21", + id: "0_1_21_2", + text: "东营市", + value: "东营市", + open: true + }, + { + pId: "0_1_21", + id: "0_1_21_3", + text: "菏泽市", + value: "菏泽市", + open: true + }, + { + pId: "0_1_21", + id: "0_1_21_4", + text: "济南市", + value: "济南市", + open: true + }, + { + pId: "0_1_21", + id: "0_1_21_5", + text: "济宁市", + value: "济宁市", + open: true + }, + { + pId: "0_1_21", + id: "0_1_21_6", + text: "莱芜市", + value: "莱芜市", + open: true + }, + { + pId: "0_1_21", + id: "0_1_21_7", + text: "聊城市", + value: "聊城市", + open: true + }, + { + pId: "0_1_21", + id: "0_1_21_8", + text: "临沂市", + value: "临沂市", + open: true + }, + { + pId: "0_1_21", + id: "0_1_21_9", + text: "青岛市", + value: "青岛市", + open: true + }, + { + pId: "0_1_21", + id: "0_1_21_10", + text: "日照市", + value: "日照市", + open: true + }, + { + pId: "0_1_21", + id: "0_1_21_11", + text: "泰安市", + value: "泰安市", + open: true + }, + { + pId: "0_1_21", + id: "0_1_21_12", + text: "威海市", + value: "威海市", + open: true + }, + { + pId: "0_1_21", + id: "0_1_21_13", + text: "潍坊市", + value: "潍坊市", + open: true + }, + { + pId: "0_1_21", + id: "0_1_21_14", + text: "烟台市", + value: "烟台市", + open: true + }, + { + pId: "0_1_21", + id: "0_1_21_15", + text: "枣庄市", + value: "枣庄市", + open: true + }, + { + pId: "0_1_21", + id: "0_1_21_16", + text: "淄博市", + value: "淄博市", + open: true + }, + { + pId: "0_1", + id: "0_1_22", + text: "山西省( 共12个 )", + value: "山西省", + open: true + }, + { + pId: "0_1_22", + id: "0_1_22_0", + text: "长治市", + value: "长治市", + open: true + }, + { + pId: "0_1_22", + id: "0_1_22_1", + text: "大同市", + value: "大同市", + open: true + }, + { + pId: "0_1_22", + id: "0_1_22_2", + text: "晋城市", + value: "晋城市", + open: true + }, + { + pId: "0_1_22", + id: "0_1_22_3", + text: "晋中市", + value: "晋中市", + open: true + }, + { + pId: "0_1_22", + id: "0_1_22_4", + text: "临汾市", + value: "临汾市", + open: true + }, + { + pId: "0_1_22", + id: "0_1_22_5", + text: "吕梁市", + value: "吕梁市", + open: true + }, + { + pId: "0_1_22", + id: "0_1_22_6", + text: "青岛市", + value: "青岛市", + open: true + }, + { + pId: "0_1_22", + id: "0_1_22_7", + text: "朔州市", + value: "朔州市", + open: true + }, + { + pId: "0_1_22", + id: "0_1_22_8", + text: "太原市", + value: "太原市", + open: true + }, + { + pId: "0_1_22", + id: "0_1_22_9", + text: "忻州市", + value: "忻州市", + open: true + }, + { + pId: "0_1_22", + id: "0_1_22_10", + text: "阳泉市", + value: "阳泉市", + open: true + }, + { + pId: "0_1_22", + id: "0_1_22_11", + text: "运城市", + value: "运城市", + open: true + }, + { + pId: "0_1", + id: "0_1_23", + text: "陕西省( 共9个 )", + value: "陕西省", + open: true + }, + { + pId: "0_1_23", + id: "0_1_23_0", + text: "安康市", + value: "安康市", + open: true + }, + { + pId: "0_1_23", + id: "0_1_23_1", + text: "宝鸡市", + value: "宝鸡市", + open: true + }, + { + pId: "0_1_23", + id: "0_1_23_2", + text: "汉中市", + value: "汉中市", + open: true + }, + { + pId: "0_1_23", + id: "0_1_23_3", + text: "商洛市", + value: "商洛市", + open: true + }, + { + pId: "0_1_23", + id: "0_1_23_4", + text: "渭南市", + value: "渭南市", + open: true + }, + { + pId: "0_1_23", + id: "0_1_23_5", + text: "西安市", + value: "西安市", + open: true + }, + { + pId: "0_1_23", + id: "0_1_23_6", + text: "咸阳市", + value: "咸阳市", + open: true + }, + { + pId: "0_1_23", + id: "0_1_23_7", + text: "延安市", + value: "延安市", + open: true + }, + { + pId: "0_1_23", + id: "0_1_23_8", + text: "榆林市", + value: "榆林市", + open: true + }, + { + pId: "0_1", + id: "0_1_24", + text: "上海市( 共19个 )", + value: "上海市", + open: true + }, + { + pId: "0_1_24", + id: "0_1_24_0", + text: "宝山区", + value: "宝山区", + open: true + }, + { + pId: "0_1_24", + id: "0_1_24_1", + text: "长宁区", + value: "长宁区", + open: true + }, + { + pId: "0_1_24", + id: "0_1_24_2", + text: "崇明县", + value: "崇明县", + open: true + }, + { + pId: "0_1_24", + id: "0_1_24_3", + text: "奉贤区", + value: "奉贤区", + open: true + }, + { + pId: "0_1_24", + id: "0_1_24_4", + text: "虹口区", + value: "虹口区", + open: true + }, + { + pId: "0_1_24", + id: "0_1_24_5", + text: "黄浦区", + value: "黄浦区", + open: true + }, + { + pId: "0_1_24", + id: "0_1_24_6", + text: "嘉定区", + value: "嘉定区", + open: true + }, + { + pId: "0_1_24", + id: "0_1_24_7", + text: "金山区", + value: "金山区", + open: true + }, + { + pId: "0_1_24", + id: "0_1_24_8", + text: "静安区", + value: "静安区", + open: true + }, + { + pId: "0_1_24", + id: "0_1_24_9", + text: "昆明市", + value: "昆明市", + open: true + }, + { + pId: "0_1_24", + id: "0_1_24_10", + text: "闵行区", + value: "闵行区", + open: true + }, + { + pId: "0_1_24", + id: "0_1_24_11", + text: "普陀区", + value: "普陀区", + open: true + }, + { + pId: "0_1_24", + id: "0_1_24_12", + text: "浦东新区", + value: "浦东新区", + open: true + }, + { + pId: "0_1_24", + id: "0_1_24_13", + text: "青浦区", + value: "青浦区", + open: true + }, + { + pId: "0_1_24", + id: "0_1_24_14", + text: "上海市区", + value: "上海市区", + open: true + }, + { + pId: "0_1_24", + id: "0_1_24_15", + text: "松江区", + value: "松江区", + open: true + }, + { + pId: "0_1_24", + id: "0_1_24_16", + text: "徐汇区", + value: "徐汇区", + open: true + }, + { + pId: "0_1_24", + id: "0_1_24_17", + text: "杨浦区", + value: "杨浦区", + open: true + }, + { + pId: "0_1_24", + id: "0_1_24_18", + text: "闸北区", + value: "闸北区", + open: true + }, + { + pId: "0_1", + id: "0_1_25", + text: "四川省( 共21个 )", + value: "四川省", + open: true + }, + { + pId: "0_1_25", + id: "0_1_25_0", + text: "阿坝藏族羌族自治州", + value: "阿坝藏族羌族自治州", + open: true + }, + { + pId: "0_1_25", + id: "0_1_25_1", + text: "巴中市", + value: "巴中市", + open: true + }, + { + pId: "0_1_25", + id: "0_1_25_2", + text: "成都市", + value: "成都市", + open: true + }, + { + pId: "0_1_25", + id: "0_1_25_3", + text: "达州市", + value: "达州市", + open: true + }, + { + pId: "0_1_25", + id: "0_1_25_4", + text: "德阳市", + value: "德阳市", + open: true + }, + { + pId: "0_1_25", + id: "0_1_25_5", + text: "甘孜市", + value: "甘孜市", + open: true + }, + { + pId: "0_1_25", + id: "0_1_25_6", + text: "广安市", + value: "广安市", + open: true + }, + { + pId: "0_1_25", + id: "0_1_25_7", + text: "广元市", + value: "广元市", + open: true + }, + { + pId: "0_1_25", + id: "0_1_25_8", + text: "乐山市", + value: "乐山市", + open: true + }, + { + pId: "0_1_25", + id: "0_1_25_9", + text: "凉山市", + value: "凉山市", + open: true + }, + { + pId: "0_1_25", + id: "0_1_25_10", + text: "泸州市", + value: "泸州市", + open: true + }, + { + pId: "0_1_25", + id: "0_1_25_11", + text: "眉山市", + value: "眉山市", + open: true + }, + { + pId: "0_1_25", + id: "0_1_25_12", + text: "绵阳市", + value: "绵阳市", + open: true + }, + { + pId: "0_1_25", + id: "0_1_25_13", + text: "南充市", + value: "南充市", + open: true + }, + { + pId: "0_1_25", + id: "0_1_25_14", + text: "内江市", + value: "内江市", + open: true + }, + { + pId: "0_1_25", + id: "0_1_25_15", + text: "攀枝花市", + value: "攀枝花市", + open: true + }, + { + pId: "0_1_25", + id: "0_1_25_16", + text: "遂宁市", + value: "遂宁市", + open: true + }, + { + pId: "0_1_25", + id: "0_1_25_17", + text: "雅安市", + value: "雅安市", + open: true + }, + { + pId: "0_1_25", + id: "0_1_25_18", + text: "宜宾市", + value: "宜宾市", + open: true + }, + { + pId: "0_1_25", + id: "0_1_25_19", + text: "资阳市", + value: "资阳市", + open: true + }, + { + pId: "0_1_25", + id: "0_1_25_20", + text: "自贡市", + value: "自贡市", + open: true + }, + { + pId: "0_1", + id: "0_1_26", + text: "台湾( 共1个 )", + value: "台湾", + open: true + }, + { + pId: "0_1_26", + id: "0_1_26_0", + text: "台北市", + value: "台北市", + open: true + }, + { + pId: "0_1", + id: "0_1_27", + text: "天津市( 共1个 )", + value: "天津市", + open: true + }, + { + pId: "0_1_27", + id: "0_1_27_0", + text: "天津市区", + value: "天津市区", + open: true + }, + { + pId: "0_1", + id: "0_1_28", + text: "西藏自治区( 共2个 )", + value: "西藏自治区", + open: true + }, + { + pId: "0_1_28", + id: "0_1_28_0", + text: "阿里市", + value: "阿里市", + open: true + }, + { + pId: "0_1_28", + id: "0_1_28_1", + text: "日喀则市", + value: "日喀则市", + open: true + }, + { + pId: "0_1", + id: "0_1_29", + text: "香港特别行政区( 共1个 )", + value: "香港特别行政区", + open: true + }, + { + pId: "0_1_29", + id: "0_1_29_0", + text: "香港", + value: "香港", + open: true + }, + { + pId: "0_1", + id: "0_1_30", + text: "新疆维吾尔族自治区( 共11个 )", + value: "新疆维吾尔族自治区", + open: true + }, + { + pId: "0_1_30", + id: "0_1_30_0", + text: "巴音郭楞市", + value: "巴音郭楞市", + open: true + }, + { + pId: "0_1_30", + id: "0_1_30_1", + text: "哈密市", + value: "哈密市", + open: true + }, + { + pId: "0_1_30", + id: "0_1_30_2", + text: "和田市", + value: "和田市", + open: true + }, + { + pId: "0_1_30", + id: "0_1_30_3", + text: "喀什地区", + value: "喀什地区", + open: true + }, + { + pId: "0_1_30", + id: "0_1_30_4", + text: "克拉玛依市", + value: "克拉玛依市", + open: true + }, + { + pId: "0_1_30", + id: "0_1_30_5", + text: "克孜勒苏柯州", + value: "克孜勒苏柯州", + open: true + }, + { + pId: "0_1_30", + id: "0_1_30_6", + text: "石河子市", + value: "石河子市", + open: true + }, + { + pId: "0_1_30", + id: "0_1_30_7", + text: "塔城市", + value: "塔城市", + open: true + }, + { + pId: "0_1_30", + id: "0_1_30_8", + text: "吐鲁番地区", + value: "吐鲁番地区", + open: true + }, + { + pId: "0_1_30", + id: "0_1_30_9", + text: "乌鲁木齐", + value: "乌鲁木齐", + open: true + }, + { + pId: "0_1_30", + id: "0_1_30_10", + text: "伊犁市", + value: "伊犁市", + open: true + }, + { + pId: "0_1", + id: "0_1_31", + text: "云南省( 共12个 )", + value: "云南省", + open: true + }, + { + pId: "0_1_31", + id: "0_1_31_0", + text: "保山市", + value: "保山市", + open: true + }, + { + pId: "0_1_31", + id: "0_1_31_1", + text: "楚雄彝族自治州", + value: "楚雄彝族自治州", + open: true + }, + { + pId: "0_1_31", + id: "0_1_31_2", + text: "大理白族自治州", + value: "大理白族自治州", + open: true + }, + { + pId: "0_1_31", + id: "0_1_31_3", + text: "红河哈尼族彝族自治州", + value: "红河哈尼族彝族自治州", + open: true + }, + { + pId: "0_1_31", + id: "0_1_31_4", + text: "昆明市", + value: "昆明市", + open: true + }, + { + pId: "0_1_31", + id: "0_1_31_5", + text: "丽江市", + value: "丽江市", + open: true + }, + { + pId: "0_1_31", + id: "0_1_31_6", + text: "临沧市", + value: "临沧市", + open: true + }, + { + pId: "0_1_31", + id: "0_1_31_7", + text: "曲靖市", + value: "曲靖市", + open: true + }, + { + pId: "0_1_31", + id: "0_1_31_8", + text: "思茅市", + value: "思茅市", + open: true + }, + { + pId: "0_1_31", + id: "0_1_31_9", + text: "文山市", + value: "文山市", + open: true + }, + { + pId: "0_1_31", + id: "0_1_31_10", + text: "玉溪市", + value: "玉溪市", + open: true + }, + { + pId: "0_1_31", + id: "0_1_31_11", + text: "昭通市", + value: "昭通市", + open: true + }, + { + pId: "0_1", + id: "0_1_32", + text: "浙江省( 共12个 )", + value: "浙江省", + open: true + }, + { + pId: "0_1_32", + id: "0_1_32_0", + text: "杭州市", + value: "杭州市", + open: true + }, + { + pId: "0_1_32", + id: "0_1_32_1", + text: "湖州市", + value: "湖州市", + open: true + }, + { + pId: "0_1_32", + id: "0_1_32_2", + text: "嘉兴市", + value: "嘉兴市", + open: true + }, + { + pId: "0_1_32", + id: "0_1_32_3", + text: "金华市", + value: "金华市", + open: true + }, + { + pId: "0_1_32", + id: "0_1_32_4", + text: "丽水市", + value: "丽水市", + open: true + }, + { + pId: "0_1_32", + id: "0_1_32_5", + text: "宁波市", + value: "宁波市", + open: true + }, + { + pId: "0_1_32", + id: "0_1_32_6", + text: "衢州市", + value: "衢州市", + open: true + }, + { + pId: "0_1_32", + id: "0_1_32_7", + text: "绍兴市", + value: "绍兴市", + open: true + }, + { + pId: "0_1_32", + id: "0_1_32_8", + text: "台州市", + value: "台州市", + open: true + }, + { + pId: "0_1_32", + id: "0_1_32_9", + text: "温州市", + value: "温州市", + open: true + }, + { + pId: "0_1_32", + id: "0_1_32_10", + text: "浙江省", + value: "浙江省", + open: true + }, + { + pId: "0_1_32", + id: "0_1_32_11", + text: "舟山市", + value: "舟山市", + open: true + }, + { + pId: "0_1", + id: "0_1_33", + text: "重庆市( 共1个 )", + value: "重庆市", + open: true + }, + { + pId: "0_1_33", + id: "0_1_33_0", + text: "重庆市区", + value: "重庆市区", + open: true + } + ], + + TREE: [ + { id: -1, pId: -2, value: "根目录", text: "根目录" }, + { id: 1, pId: -1, value: "1", text: "第一级目录1", disabled: true }, + { id: 11, pId: 1, value: "11", text: "第二级文件1" }, + { id: 12, pId: 1, value: "12", text: "第二级目录2" }, + { id: 121, pId: 12, value: "121", text: "第三级目录1" }, + { id: 122, pId: 12, value: "122", text: "第三级文件1" }, + { id: 1211, pId: 121, value: "1211", text: "第四级目录1" }, + { + id: 12111, + pId: 1211, + value: "12111", + text: "第五级文件111111111111111111111111111111111111111111111111111111111111111111111111111111111111111" + }, + { id: 2, pId: -1, value: "2", text: "第一级目录2" }, + { id: 21, pId: 2, value: "21", text: "第二级目录3" }, + { id: 22, pId: 2, value: "22", text: "第二级文件2" }, + { id: 211, pId: 21, value: "211", text: "第三级目录2" }, + { id: 212, pId: 21, value: "212", text: "第三级文件2" }, + { id: 2111, pId: 211, value: "2111", text: "第四级文件1" } + ], + LEVELTREE: [ + { + id: 1, + text: "第一项", + value: "1" + }, + { + id: 2, + text: "第二项", + value: "2" + }, + { + id: 3, + text: "第三项", + value: "3", + open: true + }, + { + id: 11, + pId: 1, + text: "子项1", + value: "11" + }, + { + id: 12, + pId: 1, + text: "子项2", + value: "12" + }, + { + id: 13, + pId: 1, + text: "子项3", + value: "13" + }, + { + id: 31, + pId: 3, + text: "子项1", + value: "31" + }, + { + id: 32, + pId: 3, + text: "子项2", + value: "32" + }, + { + id: 33, + pId: 3, + text: "子项3", + value: "33" + } + ] +}; diff --git a/packages/demo/src/config/utils.js b/packages/demo/src/config/utils.js new file mode 100644 index 000000000..b58889c94 --- /dev/null +++ b/packages/demo/src/config/utils.js @@ -0,0 +1,17 @@ +/** + * 把模块转换成路由信息 + * @param {ESModule} module + * @param {string} pId + * @returns + */ +export function transModule2Route(module, pId) { + return Object.keys(module).map((key) => { + const item = module[key]; + const text = item.demoText || item.xtype; + return { + pId, + value: item.xtype, + text: text + }; + }); +} diff --git a/packages/demo/src/demo/base/button/demo.button.js b/packages/demo/src/demo/base/button/demo.button.js new file mode 100644 index 000000000..2cfc93acb --- /dev/null +++ b/packages/demo/src/demo/base/button/demo.button.js @@ -0,0 +1,452 @@ + +import { Button, TextButton, FloatLeftLayout, shortcut, Widget, parseInt, Msg, map } from "@fui/core" + + +@shortcut() +export class ButtonDemo extends Widget { + static xtype = "demo.button"; + + props = { baseCls: "demo-button" }; + + render() { + const items = [ + { + type: Button.xtype, + text: "一般按钮1111111111111", + level: "common", + whiteSpace: "nowrap", + width: 100, + height: 30, + handler() { + console.log("触发点击事件"); + this.loading(); + setTimeout(() => { + this.loaded(); + }, 5 * 1000); + }, + }, + { + type: Button.xtype, + text: "表示成功状态按钮", + level: "success", + height: 30, + }, + { + type: Button.xtype, + text: "表示警告状态的按钮", + level: "warning", + height: 30, + }, + { + type: Button.xtype, + text: "表示错误状态的按钮", + level: "error", + height: 30, + }, + { + type: Button.xtype, + text: "表示忽略状态的按钮", + level: "ignore", + height: 30, + }, + { + type: Button.xtype, + text: "普通灰化按钮", + disabled: true, + level: "success", + height: 30, + }, + { + type: Button.xtype, + text: "忽略状态灰化按钮", + disabled: true, + level: "ignore", + height: 30, + }, + { + type: Button.xtype, + text: "带图标的按钮", + // level: 'ignore', + iconCls: "close-font", + height: 30, + }, + { + type: Button.xtype, + text: "一般按钮", + block: true, + level: "common", + height: 30, + }, + { + type: Button.xtype, + text: "表示成功状态按钮", + block: true, + level: "success", + height: 30, + }, + { + type: Button.xtype, + text: "表示警告状态的按钮", + block: true, + level: "warning", + height: 30, + }, + { + type: Button.xtype, + text: "表示忽略状态的按钮", + block: true, + level: "ignore", + height: 30, + }, + { + type: Button.xtype, + text: "普通灰化按钮", + block: true, + disabled: true, + level: "success", + height: 30, + }, + { + type: Button.xtype, + text: "忽略状态灰化按钮", + block: true, + disabled: true, + level: "ignore", + height: 30, + }, + { + type: Button.xtype, + text: "带图标的按钮", + block: true, + // level: 'ignore', + iconCls: "close-font", + height: 30, + }, + { + type: Button.xtype, + text: "一般按钮", + clear: true, + level: "common", + height: 30, + }, + { + type: Button.xtype, + text: "表示成功状态按钮", + clear: true, + level: "success", + height: 30, + }, + { + type: Button.xtype, + text: "表示警告状态的按钮", + clear: true, + level: "warning", + height: 30, + }, + { + type: Button.xtype, + text: "表示忽略状态的按钮", + clear: true, + level: "ignore", + height: 30, + }, + { + type: Button.xtype, + text: "普通灰化按钮", + clear: true, + disabled: true, + level: "success", + height: 30, + }, + { + type: Button.xtype, + text: "忽略状态灰化按钮", + clear: true, + disabled: true, + level: "ignore", + height: 30, + }, + { + type: Button.xtype, + text: "带图标的按钮", + clear: true, + // level: 'ignore', + iconCls: "close-font", + height: 30, + }, + { + type: TextButton.xtype, + text: "文字按钮", + height: 30, + }, + { + type: Button.xtype, + text: "幽灵按钮(common)", + ghost: true, + height: 30, + }, + { + type: Button.xtype, + iconCls: "plus-font", + text: "幽灵按钮(common)", + ghost: true, + height: 30, + }, + { + type: Button.xtype, + iconCls: "plus-font", + text: "幽灵按钮(common)", + ghost: true, + level: "warning", + height: 30, + }, + { + type: Button.xtype, + iconCls: "plus-font", + text: "幽灵按钮(common)", + ghost: true, + level: "error", + height: 30, + }, + { + type: Button.xtype, + iconCls: "plus-font", + text: "幽灵按钮(common)", + ghost: true, + level: "success", + height: 30, + }, + { + type: Button.xtype, + text: "幽灵按钮(common)灰化", + disabled: true, + ghost: true, + height: 30, + }, + { + type: Button.xtype, + text: "弹出bubble", + bubble() { + return `${parseInt(Math.random() * 100) % 10}提示`; + }, + handler() { + Msg.toast("1111"); + }, + height: 30, + }, + { + type: Button.xtype, + text: "自动撑开", + iconCls: "close-font", + // textHeight: 32, + // height: 32, + iconGap: 64, + vgap: 16, + hgap: 100, + iconPosition: "bottom", + }, + { + type: Button.xtype, + text: "图标在下面的按钮", + iconCls: "close-font", + iconPosition: "bottom", + }, + { + type: Button.xtype, + text: "图标在左边的按钮", + iconCls: "close-font", + iconPosition: "left", + }, + { + type: Button.xtype, + text: "图标在右边的按钮", + iconCls: "close-font", + iconPosition: "right", + }, + { + type: Button.xtype, + text: "浅色的一般按钮", + iconCls: "plus-font", + light: true, + }, + { + type: Button.xtype, + text: "浅色的成功按钮", + level: "success", + iconCls: "plus-font", + light: true, + }, + { + type: Button.xtype, + text: "浅色的警告按钮", + level: "warning", + iconCls: "plus-font", + light: true, + }, + { + type: Button.xtype, + iconCls: "plus-font", + text: "浅色的失败按钮", + level: "error", + cls: "hover-mask", + light: true, + }, + { + type: Button.xtype, + iconCls: "plus-font", + text: "朴素的按钮", + level: "common", + plain: true, + }, + { + type: Button.xtype, + iconCls: "plus-font", + text: "朴素的按钮", + level: "success", + plain: true, + }, + { + type: Button.xtype, + iconCls: "plus-font", + text: "朴素的按钮", + level: "error", + plain: true, + }, + { + type: Button.xtype, + iconCls: "plus-font", + text: "朴素的按钮", + level: "warning", + plain: true, + }, + { + type: Button.xtype, + iconCls: "plus-font", + text: "朴素的按钮", + level: "ignore", + plain: true, + }, + { + type: Button.xtype, + iconCls: "plus-font", + plain: true, + level: "error", + }, + { + type: Button.xtype, + iconCls: "plus-font", + text: "朴素的按钮", + plain: true, + disabled: true, + }, + { + type: Button.xtype, + iconCls: "plus-font", + text: "点我,更改图标", + handler() { + this.i = this.i === undefined ? 0 : ++this.i; + const arr = [ + "text-background-font", + "check-mark-ha-font", + "close-font", + "search-font", + "date-change-h-font" + ]; + if (this.i >= arr.length) { + this.i = 0; + } + this.setIcon(arr[this.i]); + }, + height: 24, + }, + { + type: Button.xtype, + text: "带加载的按钮", + handler() { + console.log("触发点击事件"); + this.loading(); + setTimeout(() => { + this.loaded(); + }, 5 * 1000); + }, + }, + { + type: Button.xtype, + text: "带加载的按钮", + iconCls: "circle-close-font", + handler() { + console.log("触发点击事件"); + this.loading(); + setTimeout(() => { + this.loaded(); + }, 5 * 1000); + }, + }, + { + type: Button.xtype, + clear: true, + text: "带加载的按钮", + iconCls: "circle-close-font", + handler() { + console.log("触发点击事件"); + this.loading(); + setTimeout(() => { + this.loaded(); + }, 5 * 1000); + }, + }, + { + type: Button.xtype, + text: "加载中的按钮", + loading: true, + handler() { + console.log("我是无法被触发的!"); + }, + }, + { + type: Button.xtype, + text: "自定义图标按钮(点我修改)", + icon: { + type: "demo.joker.icon", + }, + handler() { + console.log("触发点击事件"); + this.loading(); + setTimeout(() => { + this.loaded(); + }, 5 * 1000); + }, + }, + { + type: Button.xtype, + text: "文字偏左的按钮", + textAlign: "left", + width: 200, + }, + { + type: Button.xtype, + text: "小于最小宽度的按钮", + width: 50, + }, + { + type: Button.xtype, + text: "一个文字超级超级长的 button, 他比按钮宽度还长。", + textWidth: 500, + width: 100, + } + ]; + + return { + type: FloatLeftLayout.xtype, + scrolly: true, + vgap: 100, + hgap: 20, + items: map(items, (index, value) => { + return { + el: value, + }; + }), + }; + } +} + diff --git a/packages/demo/src/demo/base/button/demo.icon_button.js b/packages/demo/src/demo/base/button/demo.icon_button.js new file mode 100644 index 000000000..4fb252337 --- /dev/null +++ b/packages/demo/src/demo/base/button/demo.icon_button.js @@ -0,0 +1,31 @@ + +import { IconButton, FloatLeftLayout, shortcut, Widget } from "@fui/core" + + +@shortcut() +export class IconButtonDemo extends Widget { + static xtype = "demo.icon_button"; + + props = { baseCls: "demo-button" }; + + render() { + const items = [ + { + el: { + type: IconButton.xtype, + cls: "close-ha-font", + width: 25, + height: 25, + }, + } + ]; + + return { + type: FloatLeftLayout.xtype, + vgap: 200, + hgap: 20, + items, + }; + } +} + diff --git a/packages/demo/src/demo/base/button/demo.image_button.js b/packages/demo/src/demo/base/button/demo.image_button.js new file mode 100644 index 000000000..ba46d0d75 --- /dev/null +++ b/packages/demo/src/demo/base/button/demo.image_button.js @@ -0,0 +1,31 @@ + +import { ImageButton, FloatLeftLayout, shortcut, Widget } from "@fui/core" + + +@shortcut() +export class ImageButtonDemo extends Widget { + static xtype = "demo.image_button"; + + props = { baseCls: "demo-button" }; + + render() { + const items = [ + { + el: { + type: ImageButton.xtype, + src: "http://www.easyicon.net/api/resizeApi.php?id=1206741&size=128", + width: 100, + height: 100, + }, + } + ]; + + return { + type: FloatLeftLayout.xtype, + vgap: 200, + hgap: 20, + items, + }; + } +} + diff --git a/packages/demo/src/demo/base/button/demo.text_button.js b/packages/demo/src/demo/base/button/demo.text_button.js new file mode 100644 index 000000000..4f4a2e292 --- /dev/null +++ b/packages/demo/src/demo/base/button/demo.text_button.js @@ -0,0 +1,31 @@ + +import { TextButton, FloatLeftLayout, shortcut, Widget } from "@fui/core" + + +@shortcut() +export class TextButtonDemo extends Widget { + static xtype = "demo.text_button"; + + props = { baseCls: "demo-button" }; + + render() { + const items = [ + { + el: { + type: TextButton.xtype, + text: "文字按钮", + height: 30, + keyword: "w", + }, + } + ]; + + return { + type: FloatLeftLayout.xtype, + vgap: 200, + hgap: 20, + items, + }; + } +} + diff --git a/packages/demo/src/demo/base/button/index.js b/packages/demo/src/demo/base/button/index.js new file mode 100644 index 000000000..768de5c1b --- /dev/null +++ b/packages/demo/src/demo/base/button/index.js @@ -0,0 +1,4 @@ +export * from "./demo.button"; +export * from "./demo.icon_button"; +export * from "./demo.image_button"; +export * from "./demo.text_button"; \ No newline at end of file diff --git a/packages/demo/src/demo/base/demo.html.js b/packages/demo/src/demo/base/demo.html.js new file mode 100644 index 000000000..fc612e4ed --- /dev/null +++ b/packages/demo/src/demo/base/demo.html.js @@ -0,0 +1,26 @@ +import { shortcut, Widget, VerticalLayout, Html } from "@fui/core"; + +@shortcut() +export class HtmlDemo extends Widget { + static xtype = "demo.html"; + + props = { baseCls: "demo-html" }; + + render() { + return { + type: VerticalLayout.xtype, + items: [ + { + type: Html.xtype, + text: "

在bi.html标签中使用html原生标签

" + }, + { + type: Html.xtype, + text: "
    ul列表
  • list item1
  • list item2
" + } + ], + hgap: 300, + vgap: 20 + }; + } +} diff --git a/packages/demo/src/demo/base/demo.icon_label.js b/packages/demo/src/demo/base/demo.icon_label.js new file mode 100644 index 000000000..bbc85fc4d --- /dev/null +++ b/packages/demo/src/demo/base/demo.icon_label.js @@ -0,0 +1,26 @@ +import { DefaultLayout, Label, IconLabel, shortcut, Widget } from "@fui/core"; + +@shortcut() +export class IconLabelDemo extends Widget { + static xtype = "demo.icon_label"; + + props = { baseCls: "demo-bubble" }; + + render() { + return { + type: DefaultLayout.xtype, + items: [ + { + type: Label.xtype, + text: "这是一个icon标签,在加了border之后仍然是居中显示的" + }, + { + type: IconLabel.xtype, + cls: "date-font bi-border", + height: 40, + width: 40 + } + ] + }; + } +} diff --git a/packages/demo/src/demo/base/demo.label.js b/packages/demo/src/demo/base/demo.label.js new file mode 100644 index 000000000..b396f57d3 --- /dev/null +++ b/packages/demo/src/demo/base/demo.label.js @@ -0,0 +1,173 @@ +import { + VerticalLayout, + FloatLeftLayout, + shortcut, + Widget, + Label +} from "@fui/core"; + +@shortcut() +export class LabelDemo extends Widget { + static xtype = "demo.label"; + + props = { baseCls: "demo-label" }; + + render() { + return { + type: VerticalLayout.xtype, + items: [ + { + type: Label.xtype, + cls: "layout-bg6", + text: "这是一个label控件,默认居中", + disabled: true, + textAlign: "center" + }, + { + type: Label.xtype, + cls: "layout-bg1", + text: "这是一个label控件, 高度为30,默认居中", + textAlign: "center", + height: 30 + }, + { + type: Label.xtype, + cls: "layout-bg3", + text: "这是一个label控件,使用水平居左", + textAlign: "left", + height: 30 + }, + { + type: Label.xtype, + cls: "layout-bg2", + text: "这是一个label控件,whiteSpace是normal,不设置高度,为了演示这个是真的是normal的,我凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数", + whiteSpace: "normal" + }, + { + type: Label.xtype, + cls: "layout-bg5", + text: "这是一个label控件,whiteSpace是默认的nowrap,不设置高度,为了演示这个是真的是nowrap的,我凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数" + }, + { + type: Label.xtype, + cls: "layout-bg7", + text: "这是一个label控件,whiteSpace是默认的nowrap,高度为30,为了演示这个是真的是nowrap的,我凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数", + height: 30 + }, + { + type: Label.xtype, + cls: "layout-bg3", + text: "这是一个label控件,whiteSpace设置为normal,高度为60,为了演示这个是真的是normal的,我凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数", + whiteSpace: "normal", + height: 60 + }, + { + type: Label.xtype, + cls: "layout-bg5", + text: "这是一个label控件,whiteSpace设置为normal,textHeight控制text的lineHeight,这样可以实现换行效果,我凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数", + whiteSpace: "normal", + textHeight: 30, + height: 60 + }, + { + type: Label.xtype, + cls: "layout-bg1", + text: "这是一个label控件,whiteSpace设置为nowrap,textWidth控制text的width", + textWidth: 200, + height: 60 + }, + { + type: Label.xtype, + cls: "layout-bg8", + text: "这是一个label控件,whiteSpace设置为normal,textWidth控制text的width,这样可以实现换行效果,我凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数", + whiteSpace: "normal", + textWidth: 200, + height: 60 + }, + { + type: Label.xtype, + cls: "layout-bg7", + text: "whiteSpace为默认的nowrap,高度设置为60,宽度设置为300", + height: 60, + width: 300 + }, + { + type: Label.xtype, + cls: "layout-bg6", + text: "设置了宽度300,高度60,whiteSpace设置为normal", + whiteSpace: "normal", + width: 300, + height: 60 + }, + { + type: Label.xtype, + cls: "layout-bg8", + text: "textWidth设置为200,textHeight设置为30,width设置300,凑点字数看效果", + width: 300, + textWidth: 200, + textHeight: 30, + height: 60, + whiteSpace: "normal" + }, + { + type: Label.xtype, + cls: "layout-bg1", + text: "textWidth设置为200,width设置300,看下水平居左的换行效果", + textAlign: "left", + width: 300, + textWidth: 200, + textHeight: 30, + height: 60, + whiteSpace: "normal" + }, + { + type: Label.xtype, + cls: "layout-bg2", + text: "使用默认的nowrap,再去设置textHeight,只会有一行的效果", + textAlign: "left", + width: 300, + textWidth: 200, + textHeight: 30, + height: 60 + }, + { + type: FloatLeftLayout.xtype, + items: [ + { + type: Label.xtype, + cls: "layout-bg3", + text: "在float布局中自适应的,不设高度和宽度,文字多长这个就有多长" + } + ], + height: 30 + }, + { + type: FloatLeftLayout.xtype, + items: [ + { + type: Label.xtype, + cls: "layout-bg4", + text: "在float布局中自适应的,设置了宽度200,后面还有", + width: 200 + } + ], + height: 30 + }, + { + type: FloatLeftLayout.xtype, + items: [ + { + type: Label.xtype, + text: "在float布局中自适应的,设置了高度,文字多长这个就有多长", + cls: "layout-bg5", + height: 30 + } + ], + height: 30 + } + ], + hgap: 300, + vgap: 20 + }; + } +} diff --git a/packages/demo/src/demo/base/demo.label.scene.js b/packages/demo/src/demo/base/demo.label.scene.js new file mode 100644 index 000000000..b797ca169 --- /dev/null +++ b/packages/demo/src/demo/base/demo.label.scene.js @@ -0,0 +1,802 @@ +import { + Label, + AbsoluteLayout, + shortcut, + Widget, + VerticalLayout +} from "@fui/core"; + +@shortcut() +export class LabelSceneDemo extends Widget { + static xtype = "demo.label_scene"; + + props = { baseCls: "demo-label" }; + + render() { + const items = []; + + items.push( + this.createExpander( + "1.1.1 文字居中,有宽度和高度,有文字宽度,whiteSpace为normal", + { + type: Label.xtype, + cls: "layout-bg6", + text: "设置了textWidth,则一定是嵌套结构,因此需要用center_adapt布局容纳一下.为了实现不足一行时文字水平居中,超出一行时左对齐,需要设置maxWidth.", + whiteSpace: "normal", + height: 50, + width: 500, + textWidth: 200, + textAlign: "center" + } + ) + ); + + items.push( + this.createExpander( + "1.1.2 居中,有宽度和高度,有文字宽度,whiteSpace为nowrap", + { + type: Label.xtype, + cls: "layout-bg6", + text: "居中,有宽度高度,有文字宽度,whiteSpace为nowrap,maxWidth会限制文字", + whiteSpace: "nowrap", + height: 50, + width: 500, + textWidth: 350, + textAlign: "center" + } + ) + ); + + items.push( + this.createExpander( + "1.2.1 居中,有宽度无高度,有文字宽度,whiteSpace为normal", + { + type: Label.xtype, + cls: "layout-bg6", + text: "居中,有宽度无高度,有文字宽度,whiteSpace为normal,我凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数", + whiteSpace: "normal", + width: 500, + textWidth: 200, + textAlign: "center" + } + ) + ); + + items.push( + this.createExpander( + "1.2.1 居中,有宽度无高度,有文字宽度,whiteSpace为normal,高度被父容器拉满", + { + type: AbsoluteLayout.xtype, + height: 100, + items: [ + { + el: { + type: Label.xtype, + cls: "layout-bg6", + text: "此时虽然没有对label设置高度,但由于使用了center_adapt布局,依然会垂直方向居中", + whiteSpace: "normal", + width: 500, + textWidth: 200, + textAlign: "center" + }, + top: 0, + left: 0, + bottom: 0 + } + ] + } + ) + ); + + items.push( + this.createExpander( + "1.2.2 居中,有宽度无高度,有文字宽度,whiteSpace为nowrap", + { + type: Label.xtype, + cls: "layout-bg6", + text: "居中,有宽度无高度,有文字宽度,whiteSpace为nowrap,我凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数", + whiteSpace: "nowrap", + width: 500, + textWidth: 350, + textAlign: "center" + } + ) + ); + + items.push( + this.createExpander( + "1.3.1 居中,有宽度和高度,无文字宽度,whiteSpace为normal", + { + type: Label.xtype, + cls: "layout-bg3", + text: "居中,有宽度高度,无文字宽度,whiteSpace为normal,只需用center_adapt布局包一下即可.度,下即可.居中,有宽度,无文字宽度,whiteSpace为normal居中,有宽度,无文字宽度,下即可.居中,有宽度,无文字宽度,whiteSpace为normal居中,有宽度,无文字宽度,下即可.居中,有宽度,无文字宽度,whiteSpace为normal居中,有宽度,无文字宽度,度,无文字宽度,whiteSpace为normal居中,有宽度,无文字宽度,whiteSpace为normal", + width: 500, + whiteSpace: "normal", + textAlign: "center", + height: 50 + } + ) + ); + + items.push( + this.createExpander( + "1.3.2 居中,有宽度无高度,无文字宽度,whiteSpace为normal", + { + type: AbsoluteLayout.xtype, + height: 100, + items: [ + { + el: { + type: Label.xtype, + cls: "layout-bg3", + text: "居中,有宽度无高度,无文字宽度,whiteSpace为normal,只需用center_adapt布局包一下即可.度,下即可.居中,有宽度,无文字宽度,whiteSpace为normal居中,有宽度,无文字宽度,下即可.居中,有宽度,无文字宽度,whiteSpace为normal居中,有宽度,无文字宽度,下即可.居中,有宽度,无文字宽度,whiteSpace为normal居中,有宽度,无文字宽度,度,无文字宽度,whiteSpace为normal居中,有宽度,无文字宽度,whiteSpace为normal", + width: 500, + whiteSpace: "normal", + textAlign: "center" + }, + top: 0, + left: 0, + bottom: 0 + } + ] + } + ) + ); + + items.push( + this.createExpander( + "1.4 居中,有宽度和高度,无文字宽度,whiteSpace为nowrap", + { + type: Label.xtype, + cls: "layout-bg3", + text: "居中,有宽度500有高度50,无文字宽度,whiteSpace为nowrap,此处无需两层div,设置text即可,然后设置line-height为传入高度即可实现垂直方向居中", + width: 500, + whiteSpace: "nowrap", + textAlign: "center", + height: 50 + } + ) + ); + + items.push( + this.createExpander( + "1.5.1 居中,有宽度无高度,无文字宽度,whiteSpace为nowrap", + { + type: Label.xtype, + cls: "layout-bg3", + text: "居中,有宽度500无高度,无文字宽度,whiteSpace为nowrap,我凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数", + width: 500, + whiteSpace: "nowrap", + textAlign: "center" + } + ) + ); + + items.push( + this.createExpander( + "1.5.2 居中,有宽度无高度,无文字宽度,whiteSpace为nowrap,高度被父级拉满", + { + type: AbsoluteLayout.xtype, + height: 50, + items: [ + { + el: { + type: Label.xtype, + cls: "layout-bg3", + text: "居中,有宽度500无高度,无文字宽度,whiteSpace为nowrap,我凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数", + width: 500, + whiteSpace: "nowrap", + textAlign: "center" + }, + top: 0, + left: 0, + bottom: 0 + } + ] + } + ) + ); + + items.push( + this.createExpander( + "1.6.1 居中,无宽度无高度,有文字宽度,whiteSpace为nowrap", + { + type: Label.xtype, + cls: "layout-bg3", + text: "居中,无宽度,有文字宽度,whiteSpace为nowrap,我凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数", + textWidth: 500, + whiteSpace: "nowrap", + textAlign: "center" + } + ) + ); + + items.push( + this.createExpander( + "1.6.2 居中,无宽度无高度,有文字宽度,whiteSpace为normal", + { + type: Label.xtype, + cls: "layout-bg3", + text: "居中,无宽度,有文字宽度,whiteSpace为normal,我凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数", + textWidth: 500, + whiteSpace: "normal", + textAlign: "center" + } + ) + ); + + items.push( + this.createExpander( + "1.6.3 居中,无宽度无,有文字宽度,whiteSpace为normal,被父级拉满", + { + type: AbsoluteLayout.xtype, + height: 100, + items: [ + { + el: { + type: Label.xtype, + cls: "layout-bg3", + text: "居中,无宽度,有文字宽度,whiteSpace为normal,我凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数", + textWidth: 500, + whiteSpace: "normal", + textAlign: "center" + }, + left: 0, + right: 0, + top: 0, + bottom: 0 + } + ] + } + ) + ); + + items.push( + this.createExpander( + "1.7.1 居中,无宽度无高度,无文字宽度,whiteSpace为normal", + { + type: Label.xtype, + cls: "layout-bg3", + text: "居中,无宽度无高度,无文字宽度,whiteSpace为normal,我凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数", + whiteSpace: "normal", + textAlign: "center" + } + ) + ); + + items.push( + this.createExpander( + "1.7.2 居中,无宽度无高度,无文字宽度,whiteSpace为normal,被父级拉满", + { + type: AbsoluteLayout.xtype, + height: 100, + items: [ + { + el: { + type: Label.xtype, + cls: "layout-bg3", + text: "居中,无宽度无高度,无文字宽度,whiteSpace为normal,我凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数", + whiteSpace: "normal", + textAlign: "center" + }, + left: 0, + right: 0, + top: 0, + bottom: 0 + } + ] + } + ) + ); + + items.push( + this.createExpander( + "1.7.3 居中,无宽度有高度,无文字宽度,whiteSpace为normal", + { + type: Label.xtype, + cls: "layout-bg3", + text: "居中,无宽度有高度,无文字宽度,whiteSpace为normal,我凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数", + whiteSpace: "normal", + height: 50, + textAlign: "center" + } + ) + ); + + items.push( + this.createExpander( + "1.8 居中,无宽度有高度,无文字宽度,whiteSpace为nowrap", + { + type: Label.xtype, + cls: "layout-bg3", + text: "居中,无宽度有高度,无文字宽度,whiteSpace为nowrap,我凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数", + whiteSpace: "nowrap", + height: 50, + textAlign: "center" + } + ) + ); + + items.push( + this.createExpander( + "1.9 居中,无宽度无高度,无文字宽度,whiteSpace为nowrap", + { + type: Label.xtype, + cls: "layout-bg3", + text: "居中,无宽度无高度,无文字宽度,whiteSpace为nowrap,我凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数", + whiteSpace: "nowrap", + textAlign: "center" + } + ) + ); + + items.push( + this.createExpander( + "1.9.1 居中,无宽度无高度,无文字宽度,whiteSpace为nowrap,高度被父级拉满", + { + type: AbsoluteLayout.xtype, + height: 50, + items: [ + { + el: { + type: Label.xtype, + cls: "layout-bg3", + text: "居中,无宽度无高度,无文字宽度,whiteSpace为nowrap,我凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数", + whiteSpace: "nowrap", + textAlign: "center" + }, + top: 0, + left: 0, + right: 0, + bottom: 0 + } + ] + } + ) + ); + + items.push( + this.createExpander( + "2.1.1 居左,有宽度有高度,有文字宽度,whiteSpace为normal", + { + type: Label.xtype, + cls: "layout-bg2", + text: "居左,有宽度有高度,有文字宽度,whiteSpace为normal,为了演示这个是真的是normal的我凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数", + whiteSpace: "normal", + textAlign: "left", + textWidth: 300, + height: 50, + width: 500 + } + ) + ); + + items.push( + this.createExpander( + "2.1.2 居左,有宽度有高度,有文字宽度,whiteSpace为nowrap", + { + type: Label.xtype, + cls: "layout-bg2", + text: "居左,有宽度有高度,有文字宽度,whiteSpace为normal,为了演示这个是真的是normal的我凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数", + whiteSpace: "nowrap", + textAlign: "left", + textWidth: 300, + height: 50, + width: 500 + } + ) + ); + + items.push( + this.createExpander( + "2.2.1 居左,有宽度无高度,有文字宽度,whiteSpace为normal", + { + type: Label.xtype, + cls: "layout-bg2", + text: "居左,有宽度无高度,有文字宽度,whiteSpace为normal,不设置高度,为了演示这个是真的是normal的我凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数", + whiteSpace: "normal", + textAlign: "left", + textWidth: 300, + width: 500 + } + ) + ); + + items.push( + this.createExpander( + "2.2.2 居左,有宽度无高度,有文字宽度,whiteSpace为normal,高度被父级拉满", + { + type: AbsoluteLayout.xtype, + height: 100, + items: [ + { + el: { + type: Label.xtype, + cls: "layout-bg2", + text: "居左,有宽度无高度,有文字宽度,whiteSpace为normal,不设置高度,为了演示这个是真的是normal的我凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数", + whiteSpace: "normal", + textAlign: "left", + textWidth: 300, + width: 500 + }, + top: 0, + bottom: 0, + left: 0 + } + ] + } + ) + ); + + items.push( + this.createExpander( + "2.2.3 居左,有宽度无高度,有文字宽度,whiteSpace为nowrap", + { + type: Label.xtype, + cls: "layout-bg2", + text: "居左,有宽度无高度,有文字宽度,whiteSpace为nowrap,不设置高度,为了演示这个是真的是normal的我凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数", + whiteSpace: "nowrap", + textAlign: "left", + textWidth: 300, + width: 500 + } + ) + ); + + items.push( + this.createExpander( + "2.2.4 居左,有宽度无高度,有文字宽度,whiteSpace为nowrap,高度被父级拉满", + { + type: AbsoluteLayout.xtype, + height: 100, + items: [ + { + el: { + type: Label.xtype, + cls: "layout-bg2", + text: "居左,有宽度无高度,有文字宽度,whiteSpace为nowrap,不设置高度,为了演示这个是真的是normal的我凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数", + whiteSpace: "nowrap", + textAlign: "left", + textWidth: 300, + width: 500 + }, + top: 0, + bottom: 0, + left: 0 + } + ] + } + ) + ); + + items.push( + this.createExpander( + "2.3.1 居左,有宽度有高度,无文字宽度,whiteSpace为nowrap", + { + type: Label.xtype, + cls: "layout-bg2", + text: "居左,有宽度有高度,无文字宽度,whiteSpace为nowrap,我凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数", + whiteSpace: "nowrap", + textAlign: "left", + height: 50, + vgap: 5, + width: 500 + } + ) + ); + + items.push( + this.createExpander( + "2.3.2 居左,有宽度有高度,无文字宽度,whiteSpace为normal", + { + type: Label.xtype, + cls: "layout-bg2", + text: "居左,有宽度有高度,无文字宽度,whiteSpace为normal,我凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数", + whiteSpace: "normal", + textAlign: "left", + height: 50, + width: 500 + } + ) + ); + + items.push( + this.createExpander( + "2.4.1 居左,有宽度无高度,无文字宽度,whiteSpace为normal", + { + type: Label.xtype, + cls: "layout-bg2", + text: "居左,有宽度无高度,无文字宽度,whiteSpace为normal,我凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数", + whiteSpace: "normal", + textAlign: "left", + width: 500 + } + ) + ); + + items.push( + this.createExpander( + "2.4.2 居左,有宽度无高度,无文字宽度,whiteSpace为normal,高度被父级拉满", + { + type: AbsoluteLayout.xtype, + height: 100, + items: [ + { + el: { + type: Label.xtype, + cls: "layout-bg1", + text: "居左,有宽度无高度,无文字宽度,whiteSpace为normal,我凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数", + whiteSpace: "normal", + textAlign: "left", + width: 500 + }, + top: 0, + left: 0, + bottom: 0 + } + ] + } + ) + ); + + items.push( + this.createExpander( + "2.5.1 居左,无宽度无高度,有文字宽度,whiteSpace为normal", + { + type: Label.xtype, + cls: "layout-bg2", + text: "居左,无宽度无高度,有文字宽度,whiteSpace为normal,我凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数", + whiteSpace: "normal", + textAlign: "left", + textWidth: 300 + } + ) + ); + + items.push( + this.createExpander( + "2.5.2 居左,无宽度无高度,有文字宽度,whiteSpace为normal,高度被父级拉满", + { + type: AbsoluteLayout.xtype, + height: 100, + items: [ + { + el: { + type: Label.xtype, + cls: "layout-bg2", + text: "居左,无宽度无高度,有文字宽度,whiteSpace为normal,我凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数", + whiteSpace: "normal", + textAlign: "left", + textWidth: 300 + }, + top: 0, + left: 0, + bottom: 0, + right: 0 + } + ] + } + ) + ); + + items.push( + this.createExpander( + "2.5.3 居左,无宽度无高度,有文字宽度,whiteSpace为nowrap", + { + type: Label.xtype, + cls: "layout-bg2", + text: "居左,无宽度无高度,有文字宽度,whiteSpace为normal,我凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数", + whiteSpace: "nowrap", + textAlign: "left", + textWidth: 300 + } + ) + ); + + items.push( + this.createExpander( + "2.5.4 居左,无宽度无高度,有文字宽度,whiteSpace为nowrap,高度被父级拉满", + { + type: AbsoluteLayout.xtype, + height: 100, + items: [ + { + el: { + type: Label.xtype, + cls: "layout-bg2", + text: "居左,无宽度无高度,有文字宽度,whiteSpace为normal,我凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数", + whiteSpace: "nowrap", + textAlign: "left", + textWidth: 300 + }, + top: 0, + left: 0, + bottom: 0, + right: 0 + } + ] + } + ) + ); + + items.push( + this.createExpander( + "2.6.1 居左,无宽度有高度,无文字宽度,whiteSpace为nowrap", + { + type: Label.xtype, + cls: "layout-bg2", + text: "居左,无宽度有高度,无文字宽度,whiteSpace为nowrap,注意这个是设置了vgap的,为了实现居中,lineHeight要做计算,才能准确的垂直居中", + whiteSpace: "nowrap", + textAlign: "left", + vgap: 10, + height: 50 + } + ) + ); + + items.push( + this.createExpander( + "2.6.2 居左,无宽度有高度,无文字宽度,whiteSpace为normal", + { + type: Label.xtype, + cls: "layout-bg2", + text: "居左,无宽度有高度,无文字宽度,whiteSpace为normal,我凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,我凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,我凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,我凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,我凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,我凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数", + whiteSpace: "normal", + textAlign: "left", + height: 50 + } + ) + ); + + items.push( + this.createExpander( + "2.7.1 居左,无宽度无高度,无文字宽度,whiteSpace为normal", + { + type: Label.xtype, + cls: "layout-bg2", + text: "居左,无宽度无高度,无文字宽度,whiteSpace为normal,我凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,我凑点字数,凑点字数,凑点字数,字数,我凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,我凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数", + whiteSpace: "normal", + textAlign: "left" + } + ) + ); + + items.push( + this.createExpander( + "2.7.2 居左,无宽度无高度,无文字宽度,whiteSpace为normal,高度被父级拉满", + { + type: AbsoluteLayout.xtype, + height: 100, + items: [ + { + el: { + type: Label.xtype, + cls: "layout-bg2", + text: "居左,无宽度无高度,无文字宽度,whiteSpace为normal,我凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,我凑点字数,凑点字数,凑点字数,字数,我凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,我凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数", + whiteSpace: "normal", + textAlign: "left" + }, + top: 0, + left: 0, + bottom: 0, + right: 0 + } + ] + } + ) + ); + + items.push( + this.createExpander( + "2.7.3 居左,无宽度无高度,无文字宽度,whiteSpace为nowrap", + { + type: Label.xtype, + cls: "layout-bg2", + text: "居左,无宽度无高度,无文字宽度,whiteSpace为nowrap,我凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,我凑点字数,凑点字数,凑点字数,字数,我凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,我凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数", + whiteSpace: "nowrap", + textAlign: "left" + } + ) + ); + + items.push( + this.createExpander( + "2.7.4 居左,无宽度无高度,无文字宽度,whiteSpace为nowrap,高度被父级拉满", + { + type: AbsoluteLayout.xtype, + height: 100, + items: [ + { + el: { + type: Label.xtype, + cls: "layout-bg2", + text: "居左,无宽度无高度,无文字宽度,whiteSpace为nowrap,我凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,我凑点字数,凑点字数,凑点字数,字数,我凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,我凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数", + whiteSpace: "nowrap", + textAlign: "left" + }, + top: 0, + left: 0, + bottom: 0, + right: 0 + } + ] + } + ) + ); + + items.push( + this.createExpander( + "2.8 居左,无宽度无高度,无文字宽度,whiteSpace为nowrap,高度被父级拉满", + { + type: AbsoluteLayout.xtype, + height: 100, + items: [ + { + el: { + type: Label.xtype, + cls: "layout-bg2", + text: "居左,无宽度无高度,无文字宽度,whiteSpace为nowrap,我凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,我凑点字数,凑点字数,凑点字数,字数,我凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,我凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数", + whiteSpace: "nowrap", + textAlign: "left" + }, + top: 0, + left: 0, + bottom: 0, + right: 0 + } + ] + } + ) + ); + + items.push( + this.createExpander( + "2.8.2 居左,无宽度无高度,无文字宽度,whiteSpace为normal,高度被父级拉满", + { + type: AbsoluteLayout.xtype, + height: 100, + items: [ + { + el: { + type: Label.xtype, + cls: "layout-bg2", + text: "居左,无宽度无高度,无文字宽度,whiteSpace为normal,我凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,我凑点字数,凑点字数,凑点字数,字数,我凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,我凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数,凑点字数", + whiteSpace: "normal", + textAlign: "left" + }, + top: 0, + left: 0, + bottom: 0, + right: 0 + } + ] + } + ) + ); + + return { + type: VerticalLayout.xtype, + items, + hgap: 300, + vgap: 20 + }; + } + + createExpander(text, popup) { + return { + type: VerticalLayout.xtype, + items: [ + { + type: Label.xtype, + cls: "demo-font-weight-bold", + textAlign: "left", + text, + height: 30 + }, + { + el: popup + } + ] + }; + } +} diff --git a/packages/demo/src/demo/base/demo.message.js b/packages/demo/src/demo/base/demo.message.js new file mode 100644 index 000000000..b9db94862 --- /dev/null +++ b/packages/demo/src/demo/base/demo.message.js @@ -0,0 +1,26 @@ +import { shortcut, Widget, Msg, CenterAdaptLayout, Button } from "@fui/core"; + +@shortcut() +export class MessageDemo extends Widget { + static xtype = "demo.message"; + + props = { baseCls: "demo-bubble" }; + + render() { + return { + type: CenterAdaptLayout.xtype, + items: [ + { + el: { + type: Button.xtype, + text: "点击我弹出一个消息框", + height: 30, + handler() { + Msg.alert("测试消息框", "我是测试消息框的内容"); + } + } + } + ] + }; + } +} diff --git a/packages/demo/src/demo/base/demo.pager.js b/packages/demo/src/demo/base/demo.pager.js new file mode 100644 index 000000000..cf1cf55df --- /dev/null +++ b/packages/demo/src/demo/base/demo.pager.js @@ -0,0 +1,126 @@ +import { VerticalLayout, Label, shortcut, Widget, Pager } from "@fui/core"; + +@shortcut() +export class FuncDemo extends Widget { + static xtype = "demo.pager"; + + props = { baseCls: "demo-func" }; + + render() { + return { + type: VerticalLayout.xtype, + items: [ + { + type: Label.xtype, + height: 30, + text: "默认的分页" + }, + { + type: Pager.xtype, + height: 50, + pages: 18, + groups: 5, + curr: 6, + first: "首页", + last: "尾页" + }, + { + type: Label.xtype, + height: 30, + text: "显示上一页、下一页、首页、尾页" + }, + { + type: Pager.xtype, + dynamicShow: false, + height: 50, + pages: 18, + groups: 5, + curr: 1, + first: "首页>", + last: "<尾页" + }, + { + type: Label.xtype, + height: 30, + text: "显示上一页、下一页" + }, + { + type: Pager.xtype, + dynamicShow: false, + dynamicShowFirstLast: true, + height: 50, + pages: 18, + groups: 5, + curr: 1, + first: "首页>", + last: "<尾页" + }, + { + type: Label.xtype, + height: 30, + text: "自定义上一页、下一页" + }, + { + type: Pager.xtype, + dynamicShow: false, + height: 50, + pages: 18, + groups: 5, + curr: 6, + prev: { + type: Pager.xtype, + cls: "", + text: "上一页", + value: "prev", + once: false, + height: 30, + handler() {} + }, + next: { + type: Pager.xtype, + cls: "", + text: "下一页", + value: "next", + once: false, + handler() {} + } + }, + { + type: Label.xtype, + height: 30, + text: "不知道总页数的情况(测试条件 1<=page<=3)" + }, + { + type: Pager.xtype, + dynamicShow: false, + height: 50, + pages: false, + curr: 1, + prev: { + type: Pager.xtype, + cls: "", + text: "上一页", + value: "prev", + once: false, + height: 30, + handler() {} + }, + next: { + type: Pager.xtype, + cls: "", + text: "下一页", + value: "next", + once: false, + handler() {} + }, + hasPrev(v) { + return v > 1; + }, + hasNext(v) { + return v < 3; + } + } + ] + }; + } +} diff --git a/packages/demo/src/demo/base/editor/demo.editor.js b/packages/demo/src/demo/base/editor/demo.editor.js new file mode 100644 index 000000000..1fa233ad3 --- /dev/null +++ b/packages/demo/src/demo/base/editor/demo.editor.js @@ -0,0 +1,127 @@ + +import { Editor, AbsoluteLayout, Button, shortcut, Widget, createWidget, Editor as BIEditor } from "@fui/core" + + + +@shortcut() +export class EditorDemo extends Widget { + static xtype = "demo.editor"; + + props = { baseCls: "demo-editor" }; + + render() { + const editor1 = createWidget({ + type: Editor.xtype, + cls: "bi-border", + watermark: "报错信息显示在控件上方", + errorText: "字段不可重名!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!", + width: 200, + height: 24, + }); + editor1.on(BIEditor.EVENT_ENTER, () => { + editor1.blur(); + }); + const editor2 = createWidget({ + type: Editor.xtype, + cls: "bi-border", + watermark: "输入'a'会有错误信息", + disabled: true, + errorText: "字段不可重名", + validationChecker(v) { + if (v == "a") { + return false; + } + + return true; + }, + allowBlank: true, + width: 200, + height: 24, + }); + const editor3 = createWidget({ + type: Editor.xtype, + cls: "bi-border", + watermark: "输入'a'会有错误信息且回车键不能退出编辑", + errorText: "字段不可重名", + value: "a", + validationChecker(v) { + if (v == "a") { + return false; + } + + return true; + }, + quitChecker(v) { + return false; + }, + allowBlank: true, + width: 300, + height: 24, + }); + const editor4 = createWidget({ + type: Editor.xtype, + cls: "bi-border", + inputType: "password", + autocomplete: "new-password", + watermark: "请输入密码", + allowBlank: true, + width: 300, + height: 24, + }); + createWidget({ + type: AbsoluteLayout.xtype, + element: this, + items: [ + { + el: editor1, + left: 0, + top: 0, + }, + { + el: editor2, + left: 250, + top: 30, + }, + { + el: editor3, + left: 500, + top: 60, + }, + { + el: editor4, + left: 700, + top: 60, + }, + { + el: { + type: Button.xtype, + text: "disable", + handler() { + editor1.setEnable(false); + editor2.setEnable(false); + editor3.setEnable(false); + }, + height: 30, + }, + left: 100, + bottom: 60, + }, + { + el: { + type: Button.xtype, + text: "enable", + handler() { + editor1.setEnable(true); + editor2.setEnable(true); + editor3.setEnable(true); + }, + height: 30, + }, + left: 200, + bottom: 60, + } + ], + }); + } +} + diff --git a/packages/demo/src/demo/base/editor/demo.multifile_editor.js b/packages/demo/src/demo/base/editor/demo.multifile_editor.js new file mode 100644 index 000000000..9bbcdfd39 --- /dev/null +++ b/packages/demo/src/demo/base/editor/demo.multifile_editor.js @@ -0,0 +1,36 @@ + +import { AbsoluteLayout, AdaptiveLayout, MultifileEditor, shortcut, Widget } from "@fui/core" + + +@shortcut() +export class CodeEditorDemo extends Widget { + static xtype = "demo.multifile_editor"; + + props = { baseCls: "demo-editor" }; + + render() { + return { + type: AbsoluteLayout.xtype, + items: [ + { + el: { + type: AdaptiveLayout.xtype, + cls: "layout-bg1", + items: [ + { + type: MultifileEditor.xtype, + width: 400, + height: 300, + } + ], + width: 400, + height: 300, + }, + top: 50, + left: 50, + } + ], + }; + } +} + diff --git a/packages/demo/src/demo/base/editor/demo.textarea_editor.js b/packages/demo/src/demo/base/editor/demo.textarea_editor.js new file mode 100644 index 000000000..6a62b6f8e --- /dev/null +++ b/packages/demo/src/demo/base/editor/demo.textarea_editor.js @@ -0,0 +1,55 @@ + +import { TextAreaEditor, VerticalLayout, Button, shortcut, Widget, createWidget, isNotEmptyString, Msg } from "@fui/core" + + + +@shortcut() +export class TextareaEditorDemo extends Widget { + static xtype = "demo.textarea_editor"; + + props = { baseCls: "demo-editor" }; + + render() { + const editor = createWidget({ + type: TextAreaEditor.xtype, + cls: "bi-border", + width: 600, + height: 400, + watermark: "请输入内容", + errorText: "检测内容有误", + validationChecker(v) { + return isNotEmptyString(v); + }, + }); + editor.on(TextAreaEditor.EVENT_FOCUS, () => { + Msg.toast("Focus"); + }); + editor.on(TextAreaEditor.EVENT_BLUR, () => { + Msg.toast("Blur"); + }); + createWidget({ + type: VerticalLayout.xtype, + element: this, + hgap: 30, + vgap: 20, + items: [ + editor, + { + type: Button.xtype, + text: "getValue", + handler() { + Msg.toast(JSON.stringify(editor.getValue())); + }, + }, + { + type: Button.xtype, + text: "setValue", + handler() { + editor.setValue("测试数据"); + }, + } + ], + }); + } +} + diff --git a/demo/js/base/editor/index.js b/packages/demo/src/demo/base/editor/index.js similarity index 100% rename from demo/js/base/editor/index.js rename to packages/demo/src/demo/base/editor/index.js diff --git a/packages/demo/src/demo/base/index.js b/packages/demo/src/demo/base/index.js new file mode 100644 index 000000000..68df8186a --- /dev/null +++ b/packages/demo/src/demo/base/index.js @@ -0,0 +1,16 @@ +export const meta = { + title: "基础控件 base", + rank: 8 +}; + +export * as button from "./button"; +export * as editor from "./editor"; +export * as tip from "./tip"; +export * as tree from "./tree"; + +export * from "./demo.html"; +export * from "./demo.icon_label"; +export * from "./demo.label"; +export * from "./demo.label.scene"; +export * from "./demo.message"; +export * from "./demo.pager"; diff --git a/packages/demo/src/demo/base/tip/demo.bubble.js b/packages/demo/src/demo/base/tip/demo.bubble.js new file mode 100644 index 000000000..e59b83f3a --- /dev/null +++ b/packages/demo/src/demo/base/tip/demo.bubble.js @@ -0,0 +1,87 @@ + +import { Button, FloatLeftLayout, shortcut, Widget, Bubbles } from "@fui/core" + + +@shortcut() +export class BubbleDemo extends Widget { + static xtype = "demo.bubble"; + + props = { baseCls: "demo-bubble" }; + + render() { + const btns = []; + const items = [ + { + el: { + ref(_ref) { + btns.push(_ref); + }, + type: Button.xtype, + text: "bubble测试(消息)", + title: "123", + height: 30, + handler() { + Bubbles.show("singleBubble1", "bubble测试", this, { + level: "common", + }); + }, + }, + }, + { + el: { + ref(_ref) { + btns.push(_ref); + }, + type: Button.xtype, + text: "bubble测试(成功)", + height: 30, + handler() { + Bubbles.show("singleBubble2", "bubble测试", this, { + offsetStyle: "center", + level: "success", + }); + }, + }, + }, + { + el: { + ref(_ref) { + btns.push(_ref); + }, + type: Button.xtype, + text: "bubble测试(错误)", + height: 30, + handler() { + Bubbles.show("singleBubble3", "bubble测试", this, { + offsetStyle: "right", + level: "error", + }); + }, + }, + }, + { + el: { + ref(_ref) { + btns.push(_ref); + }, + type: Button.xtype, + text: "bubble测试(警告)", + height: 30, + handler() { + Bubbles.show("singleBubble4", "bubble测试", this, { + level: "warning", + }); + }, + }, + } + ]; + + return { + type: FloatLeftLayout.xtype, + vgap: 200, + hgap: 20, + items, + }; + } +} + diff --git a/packages/demo/src/demo/base/tip/demo.title.js b/packages/demo/src/demo/base/tip/demo.title.js new file mode 100644 index 000000000..e3c86b260 --- /dev/null +++ b/packages/demo/src/demo/base/tip/demo.title.js @@ -0,0 +1,71 @@ + +import { VerticalLayout, Label, shortcut, Widget } from "@fui/core" + + +@shortcut() +export class TitleDemo extends Widget { + static xtype = "demo.title"; + + props = { baseCls: "demo-title" }; + + render() { + return { + type: VerticalLayout.xtype, + items: [ + { + type: Label.xtype, + cls: "layout-bg1", + height: 50, + title: "title提示", + text: "移上去有title提示", + textAlign: "center", + }, + { + type: Label.xtype, + cls: "layout-bg6", + height: 50, + disabled: true, + warningTitle: "title错误提示", + text: "移上去有title错误提示", + textAlign: "center", + }, + { + type: Label.xtype, + cls: "layout-bg2", + height: 50, + disabled: true, + tipType: "success", + title: "自定义title提示效果", + warningTitle: "自定义title提示效果", + text: "自定义title提示效果", + textAlign: "center", + }, + { + type: Label.xtype, + cls: "layout-bg3", + height: 50, + title: () => "函数返回值作为title提示", + text: "title提示支持函数", + textAlign: "center", + }, + { + type: Label.xtype, + cls: "layout-bg4", + height: 50, + title() { + return { + level: "success", + text: "自定义title\n提示效果", + textAlign: "center", + }; + }, + text: "title提示支持对象,作为bi.tooltip的props", + textAlign: "center", + } + ], + hgap: 300, + vgap: 20, + }; + } +} + diff --git a/packages/demo/src/demo/base/tip/demo.toast.js b/packages/demo/src/demo/base/tip/demo.toast.js new file mode 100644 index 000000000..0866a7708 --- /dev/null +++ b/packages/demo/src/demo/base/tip/demo.toast.js @@ -0,0 +1,89 @@ + +import { Button, FloatLeftLayout, shortcut, Widget, createWidget, Msg } from "@fui/core" + + + +@shortcut() +export class ToastDemo extends Widget { + static xtype = "demo.toast"; + + props = { baseCls: "demo-toast" }; + + render() { + const items = [ + { + el: { + type: Button.xtype, + text: "简单Toast测试(success)", + height: 30, + handler() { + Msg.toast("这是一条简单的数据", { + level: "success", + }); + }, + }, + }, + { + el: { + type: Button.xtype, + text: "很长的Toast测试(normal)", + height: 30, + handler() { + Msg.toast( + "这是一条很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长的数据", + {} + ); + }, + }, + }, + { + el: { + type: Button.xtype, + text: "非常长的Toast测试(warning)", + height: 30, + handler() { + Msg.toast( + "这是一条非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长的数据", + { + level: "warning", + autoClose: false, + } + ); + }, + }, + }, + { + el: { + type: Button.xtype, + text: "错误提示Toast测试(error)", + height: 30, + handler() { + Msg.toast("错误提示Toast测试", { + level: "error", + }); + }, + }, + }, + { + el: { + type: Button.xtype, + text: "错误提示Toast测试(error), 此toast不会自动消失", + height: 30, + handler() { + Msg.toast("错误提示Toast测试", { + autoClose: false, + }); + }, + }, + } + ]; + createWidget({ + type: FloatLeftLayout.xtype, + element: this, + vgap: 200, + hgap: 20, + items, + }); + } +} + diff --git a/demo/js/base/tip/index.js b/packages/demo/src/demo/base/tip/index.js similarity index 100% rename from demo/js/base/tip/index.js rename to packages/demo/src/demo/base/tip/index.js diff --git a/packages/demo/src/demo/base/tree/demo.part_tree.js b/packages/demo/src/demo/base/tree/demo.part_tree.js new file mode 100644 index 000000000..deaffcb03 --- /dev/null +++ b/packages/demo/src/demo/base/tree/demo.part_tree.js @@ -0,0 +1,101 @@ + +import { VTapeLayout, Label, PartTree, shortcut, Widget, isNull, TreeView } from "@fui/core" + + + +@shortcut() +export class PartTreeDemo extends Widget { + static xtype = "demo.part_tree"; + + props = { baseCls: "demo-func" }; + + mounted() { + this.partTree.stroke({ + keyword: "1", + }); + } + + render() { + const self = this; + + return { + type: VTapeLayout.xtype, + items: [ + { + type: Label.xtype, + height: 50, + text: "先初始化一份数据,然后再异步获取数据的树", + }, + { + type: PartTree.xtype, + ref(_ref) { + self.partTree = _ref; + }, + paras: { + selectedValues: { 1: {}, 2: { 1: {} } }, + }, + itemsCreator(op, callback) { + if (op.type === TreeView.REQ_TYPE_INIT_DATA) { + callback({ + items: [ + { + id: "1", + text: 1, + isParent: true, + open: true, + }, + { + id: "11", + pId: "1", + text: 11, + isParent: true, + open: true, + }, + { + id: "111", + pId: "11", + text: 111, + isParent: true, + }, + { + id: "2", + text: 2, + }, + { + id: "3", + text: 3, + } + ], + hasNext: isNull(op.id), + }); + + return; + } + callback({ + items: [ + { + id: `${op.id || ""}1`, + pId: op.id, + text: 1, + isParent: true, + }, + { + id: `${op.id || ""}2`, + pId: op.id, + text: 2, + }, + { + id: `${op.id || ""}3`, + pId: op.id, + text: 3, + } + ], + hasNext: isNull(op.id), + }); + }, + } + ], + }; + } +} + diff --git a/packages/demo/src/demo/base/tree/demo.sync_tree.js b/packages/demo/src/demo/base/tree/demo.sync_tree.js new file mode 100644 index 000000000..f2534ab56 --- /dev/null +++ b/packages/demo/src/demo/base/tree/demo.sync_tree.js @@ -0,0 +1,122 @@ + +import { VTapeLayout, Label, Asynctree, shortcut, Widget, isNull } from "@fui/core" + + +@shortcut() +export class SyncTreeDemo extends Widget { + static xtype = "demo.sync_tree"; + + props = { baseCls: "demo-func" }; + + mounted() { + this.syncTree1.stroke({ + keyword: "1", + }); + this.syncTree2.stroke({ + keyword: "1", + }); + } + + render() { + const self = this; + + return { + type: VTapeLayout.xtype, + rowSize: [0.5, 0.5], + items: [ + { + type: VTapeLayout.xtype, + items: [ + { + type: Label.xtype, + height: 50, + text: "可以异步获取数据的树", + }, + { + type: Asynctree.xtype, + ref(_ref) { + self.syncTree1 = _ref; + }, + paras: { + selectedValues: { 1: {}, 2: { 1: {} } }, + }, + itemsCreator(op, callback) { + callback({ + items: [ + { + id: `${op.id || ""}1`, + pId: op.id, + text: `${op.id || ""}1`, + isParent: true, + iconCls: "close-h-font", + }, + { + id: `${op.id || ""}2`, + pId: op.id, + text: `${op.id || ""}2`, + iconCls: "search-font", + }, + { + id: `${op.id || ""}3`, + pId: op.id, + text: `${op.id || ""}3`, + iconCls: "date-font", + } + ], + hasNext: isNull(op.id), + }); + }, + } + ], + }, + { + type: VTapeLayout.xtype, + items: [ + { + type: Label.xtype, + height: 50, + text: "showIcon属性搭配节点iconCls,可以显示图标", + }, + { + type: Asynctree.xtype, + ref(_ref) { + self.syncTree2 = _ref; + }, + paras: { + selectedValues: { 1: {}, 2: { 1: {} } }, + }, + showIcon: true, + itemsCreator(op, callback) { + callback({ + items: [ + { + id: `${op.id || ""}1`, + pId: op.id, + text: `${op.id || ""}1`, + isParent: true, + iconCls: "close-h-font", + }, + { + id: `${op.id || ""}2`, + pId: op.id, + text: `${op.id || ""}2`, + iconCls: "search-font", + }, + { + id: `${op.id || ""}3`, + pId: op.id, + text: `${op.id || ""}3`, + iconCls: "date-font", + } + ], + hasNext: isNull(op.id), + }); + }, + } + ], + } + ], + }; + } +} + diff --git a/packages/demo/src/demo/base/tree/demo.tree_view.js b/packages/demo/src/demo/base/tree/demo.tree_view.js new file mode 100644 index 000000000..01f87667e --- /dev/null +++ b/packages/demo/src/demo/base/tree/demo.tree_view.js @@ -0,0 +1,60 @@ + +import { TreeView, GridLayout, VTapeLayout, Label, shortcut, Widget, createWidget } from "@fui/core" + + +@shortcut() +export class FuncDemo extends Widget { + static xtype = "demo.tree_view"; + + props = { baseCls: "demo-func" }; + + _createDefaultTree() { + const tree = createWidget({ + type: TreeView.xtype, + }); + tree.initTree([ + { id: 1, pId: 0, text: "test1", open: true }, + { id: 11, pId: 1, text: "test11" }, + { id: 12, pId: 1, text: "test12" }, + { id: 111, pId: 11, text: "test111" }, + { id: 2, pId: 0, text: "test2", open: true }, + { id: 21, pId: 2, text: "test21" }, + { id: 22, pId: 2, text: "test22" } + ]); + + return tree; + } + + render() { + const self = this; + createWidget({ + type: GridLayout.xtype, + columns: 1, + rows: 1, + element: this, + items: [ + { + column: 0, + row: 0, + el: { + type: VTapeLayout.xtype, + items: [ + { + el: this._createDefaultTree(), + }, + { + el: { + type: Label.xtype, + text: "tree.initTree([{\"id\":1, \"pId\":0, \"text\":\"test1\", open:true},{\"id\":11, \"pId\":1, \"text\":\"test11\"},{\"id\":12, \"pId\":1, \"text\":\"test12\"},{\"id\":111, \"pId\":11, \"text\":\"test111\"}])", + whiteSpace: "normal", + }, + height: 50, + } + ], + }, + } + ], + }); + } +} + diff --git a/demo/js/base/tree/index.js b/packages/demo/src/demo/base/tree/index.js similarity index 100% rename from demo/js/base/tree/index.js rename to packages/demo/src/demo/base/tree/index.js diff --git a/packages/demo/src/demo/case/combo/demo.bubble_combo.js b/packages/demo/src/demo/case/combo/demo.bubble_combo.js new file mode 100644 index 000000000..b882ed4e8 --- /dev/null +++ b/packages/demo/src/demo/case/combo/demo.bubble_combo.js @@ -0,0 +1,161 @@ +import { + BubbleCombo, + Button, + ButtonGroup, + TextItem, + VerticalLayout, + TextBubblePopupBarView, + AbsoluteLayout, + shortcut, + Widget, + createWidget, + makeArray +} from "@fui/core"; + +@shortcut() +export class BubbleComboDemo extends Widget { + static xtype = "demo.bubble_combo"; + + props = { baseCls: "demo-func" }; + + render() { + let self = this, + count = 1; + const combo1 = createWidget({ + type: BubbleCombo.xtype, + trigger: "click,hover", + el: { + type: Button.xtype, + text: "测试", + height: 24 + }, + popup: { + el: { + type: ButtonGroup.xtype, + items: makeArray(100, { + type: TextItem.xtype, + height: 24, + text: "item" + }), + layouts: [ + { + type: VerticalLayout.xtype + } + ] + }, + maxHeight: 200 + } + }); + const combo2 = createWidget({ + type: BubbleCombo.xtype, + direction: "right", + el: { + type: Button.xtype, + text: "测试", + height: 24 + }, + popup: { + type: TextBubblePopupBarView.xtype, + text: "我有很多文字很多文字很多文字很多文字很多文字很多文字很多文字很多文字很多文字很多文字很多文字很多文字很多文字很多文字很多文字很多文字很多文字很多文字很多文字很多文字很多文字很多文字很多文字很多文字很多文字很多文字很多文字很多文字很多文字很多文字很多文字很多文字很多文字很多文字很多文字很多文字很多文字很多文字", + ref() { + self.popup = this; + } + }, + listeners: [ + { + eventName: BubbleCombo.EVENT_BEFORE_POPUPVIEW, + action() { + self.popup.populate( + count++ % 2 === 1 + ? "我的文字变少了" + : "我有很多文字很多文字很多文字很多文字很多文字很多文字很多文字很多文字很多文字很多文字很多文字很多文字很多文字很多文字很多文字很多文字很多文字很多文字很多文字很多文字很多文字很多文字很多文字很多文字很多文字很多文字很多文字很多文字很多文字很多文字很多文字很多文字很多文字很多文字很多文字很多文字很多文字很多文字" + ); + } + } + ] + }); + + const combo3 = createWidget({ + type: BubbleCombo.xtype, + el: { + type: Button.xtype, + text: "测试", + height: 25 + }, + popup: { + type: TextBubblePopupBarView.xtype, + text: "我有很多文字很多文字很多文字很多文字很多文字很多文字很多文字很多文字很多文字很多文字很多文字很多文字很多文字很多文字很多文字很多文字很多文字很多文字很多文字很多文字很多文字很多文字很多文字很多文字很多文字很多文字很多文字很多文字很多文字很多文字很多文字很多文字很多文字很多文字很多文字很多文字很多文字很多文字", + ref() { + self.popup = this; + } + }, + listeners: [ + { + eventName: BubbleCombo.EVENT_BEFORE_POPUPVIEW, + action() { + self.popup.populate( + count++ % 2 === 1 + ? "我的文字变少了" + : "我有很多文字很多文字很多文字很多文字很多文字很多文字很多文字很多文字很多文字很多文字很多文字很多文字很多文字很多文字很多文字很多文字很多文字很多文字很多文字很多文字很多文字很多文字很多文字很多文字很多文字很多文字很多文字很多文字很多文字很多文字很多文字很多文字很多文字很多文字很多文字很多文字很多文字很多文字" + ); + } + } + ] + }); + + const combo4 = createWidget({ + type: BubbleCombo.xtype, + el: { + type: Button.xtype, + text: "测试", + height: 25 + }, + popup: { + type: TextBubblePopupBarView.xtype, + text: "我有很多文字很多文字很多文字很多文字很多文字很多文字很多文字很多文字很多文字很多文字很多文字很多文字很多文字很多文字很多文字很多文字很多文字很多文字很多文字很多文字很多文字很多文字很多文字很多文字很多文字很多文字很多文字很多文字很多文字很多文字很多文字很多文字很多文字很多文字很多文字很多文字很多文字很多文字", + ref() { + self.popup = this; + } + }, + listeners: [ + { + eventName: BubbleCombo.EVENT_BEFORE_POPUPVIEW, + action() { + self.popup.populate( + count++ % 2 === 1 + ? "我的文字变少了" + : "我有很多文字很多文字很多文字很多文字很多文字很多文字很多文字很多文字很多文字很多文字很多文字很多文字很多文字很多文字很多文字很多文字很多文字很多文字很多文字很多文字很多文字很多文字很多文字很多文字很多文字很多文字很多文字很多文字很多文字很多文字很多文字很多文字很多文字很多文字很多文字很多文字很多文字很多文字" + ); + } + } + ] + }); + + createWidget({ + type: AbsoluteLayout.xtype, + element: this, + items: [ + { + el: combo1, + left: 150, + top: 10 + }, + { + el: combo2, + left: 10, + bottom: 200 + }, + { + el: combo3, + right: 10, + bottom: 10 + }, + { + el: combo4, + right: 10, + top: 10 + } + ] + }); + } +} diff --git a/packages/demo/src/demo/case/combo/demo.editor_icon_check_combo.js b/packages/demo/src/demo/case/combo/demo.editor_icon_check_combo.js new file mode 100644 index 000000000..6faaa49c7 --- /dev/null +++ b/packages/demo/src/demo/case/combo/demo.editor_icon_check_combo.js @@ -0,0 +1,55 @@ + +import { HorizontalAutoLayout, EditorIconCheckCombo, Button, shortcut, Widget } from "@fui/core" + + +@shortcut() +export class EditorIconCheckComboDemo extends Widget { + static xtype = "demo.editor_icon_check_combo"; + + props = { baseCls: "" }; + + render() { + const self = this; + + return { + type: HorizontalAutoLayout.xtype, + items: [ + { + type: EditorIconCheckCombo.xtype, + ref() { + self.combo = this; + }, + watermark: "默认值", + width: 200, + height: 24, + value: 2, + items: [ + { + // text: "MVC-1", + value: "1", + }, + { + // text: "MVC-2", + value: "2", + }, + { + // text: "MVC-3", + value: "3", + } + ], + }, + { + type: Button.xtype, + width: 90, + height: 25, + text: "setValue为空", + handler() { + self.combo.setValue(); + }, + } + ], + vgap: 20, + }; + } +} + diff --git a/packages/demo/src/demo/case/combo/demo.icon_combo.js b/packages/demo/src/demo/case/combo/demo.icon_combo.js new file mode 100644 index 000000000..271f7f326 --- /dev/null +++ b/packages/demo/src/demo/case/combo/demo.icon_combo.js @@ -0,0 +1,44 @@ + +import { HorizontalAutoLayout, IconCombo, shortcut, Widget } from "@fui/core" + + +@shortcut() +export class IconComboDemo extends Widget { + static xtype = "demo.icon_combo"; + + props = { baseCls: "" }; + + render() { + const self = this; + + return { + type: HorizontalAutoLayout.xtype, + items: [ + { + type: IconCombo.xtype, + container: "body", + ref(_ref) { + self.refs = _ref; + }, + value: "第二项", + items: [ + { + value: "第一项", + iconCls: "close-font", + }, + { + value: "第二项", + iconCls: "search-font", + }, + { + value: "第三项", + iconCls: "copy-font", + } + ], + } + ], + vgap: 20, + }; + } +} + diff --git a/packages/demo/src/demo/case/combo/demo.icon_text_value_combo.js b/packages/demo/src/demo/case/combo/demo.icon_text_value_combo.js new file mode 100644 index 000000000..b631b7548 --- /dev/null +++ b/packages/demo/src/demo/case/combo/demo.icon_text_value_combo.js @@ -0,0 +1,43 @@ + +import { HorizontalAutoLayout, IconTextValueCombo, shortcut, Widget } from "@fui/core" + + +@shortcut() +export class IconTextValueComboDemo extends Widget { + static xtype = "demo.icon_text_value_combo"; + + props = { baseCls: "" }; + + render() { + return { + type: HorizontalAutoLayout.xtype, + items: [ + { + type: IconTextValueCombo.xtype, + text: "默认值", + // defaultIconCls: "next-page-h-font", + width: 300, + items: [ + { + text: "MVC-1", + iconCls: "close-font", + value: 1, + }, + { + text: "MVC-2", + iconCls: "date-font", + value: 2, + }, + { + text: "MVC-3", + iconCls: "search-close-h-font", + value: 3, + } + ], + } + ], + vgap: 20, + }; + } +} + diff --git a/packages/demo/src/demo/case/combo/demo.search_text_value_combo.js b/packages/demo/src/demo/case/combo/demo.search_text_value_combo.js new file mode 100644 index 000000000..a4558e64f --- /dev/null +++ b/packages/demo/src/demo/case/combo/demo.search_text_value_combo.js @@ -0,0 +1,132 @@ +import { CONSTANTS } from "@/config/constant"; +import { + HorizontalAutoLayout, + SearchTextValueCombo, + AllValueMultiTextValueCombo, + Button, + shortcut, + Widget, + Msg +} from "@fui/core"; + +@shortcut() +export class SearchTextValueComboDemo extends Widget { + static xtype = "demo.search_text_value_combo"; + + props = { baseCls: "" }; + + render() { + let combo, searchCombo; + + return { + type: HorizontalAutoLayout.xtype, + items: [ + { + type: SearchTextValueCombo.xtype, + ref() { + combo = this; + }, + warningTitle: "111", + text: "默认值", + value: 14, + width: 300, + items: [ + { + text: "ABC-1", + iconCls: "date-font", + value: 1 + }, + { + text: "BCD-2", + iconCls: "search-font", + value: 2 + }, + { + text: "CDE-3", + iconCls: "pull-right-font", + value: 3 + }, + { + text: "DEF-3", + iconCls: "pull-right-font", + value: 4 + }, + { + text: "FEG-3", + iconCls: "pull-right-font", + value: 5 + }, + { + text: "FGH-3", + iconCls: "pull-right-font", + value: 6 + }, + { + text: "GHI-3", + iconCls: "pull-right-font", + value: 7 + }, + { + text: "HIJ-3", + iconCls: "pull-right-font", + value: 8 + }, + { + text: "IJK-3", + iconCls: "pull-right-font", + value: 9 + }, + { + text: "JKL-3", + iconCls: "pull-right-font", + value: 10 + } + ] + }, + { + type: AllValueMultiTextValueCombo.xtype, + items: CONSTANTS.ITEMS, + text: "提示文本", + width: 200, + value: { + type: 1, + value: ["1", "2", "柳州市城贸金属材料有限责任公司", "3"] + }, + ref() { + searchCombo = this; + }, + listeners: [ + { + eventName: + AllValueMultiTextValueCombo.EVENT_CONFIRM, + action() { + Msg.toast( + JSON.stringify(searchCombo.getValue()) + ); + } + } + ] + }, + { + type: Button.xtype, + text: "setValue(3)", + width: 90, + height: 25, + handler() { + combo.setValue(11); + } + }, + { + type: Button.xtype, + text: "getValue()", + width: 90, + height: 25, + handler() { + Msg.toast(JSON.stringify(searchCombo.getValue())); + } + } + ], + vgap: 20 + }; + } +} diff --git a/packages/demo/src/demo/case/combo/demo.text_value_combo.js b/packages/demo/src/demo/case/combo/demo.text_value_combo.js new file mode 100644 index 000000000..aff1e4efa --- /dev/null +++ b/packages/demo/src/demo/case/combo/demo.text_value_combo.js @@ -0,0 +1,276 @@ +import { + VerticalLayout, + TextValueCombo, + Button, + Label, + shortcut, + Selection, + Widget +} from "@fui/core"; +/** + * Created by Dailer on 2017/7/11. + */ +@shortcut() +export class TextValueComboDemo extends Widget { + static xtype = "demo.text_value_combo"; + + props = { + baseCls: "" + }; + + render() { + var combo1, combo2; + + var items = [ + { + text: "MVC-1", + iconCls: "date-font", + value: 1 + }, + { + text: "MVC-2", + iconCls: "search-font", + value: 2 + }, + { + text: "MVC-3", + iconCls: "pull-right-font", + value: 3 + } + ]; + + // 创建下拉框各种场景用例 + return { + type: VerticalLayout.xtype, + vgap: 20, + hgap: 20, + items: [ + this.createCombo("无初始值,带提示文字", { + type: TextValueCombo.xtype, + ref: (ref) => { + this.combo1 = ref; + }, + defaultText: "请选择", + width: 300, + items: items, + listeners: [ + { + eventName: TextValueCombo.EVENT_CHANGE, + action: function () { + console.log(this.getValue()); + } + } + ] + }), + this.createCombo("自动根据value匹配text", { + type: TextValueCombo.xtype, + ref: function () { + combo = this; + }, + defaultText: "请选择", + width: 300, + value: 1, + items: items, + listeners: [ + { + eventName: TextValueCombo.EVENT_CHANGE, + action: function () { + console.log(this.getValue()); + } + } + ] + }), + this.createCombo("无初始值,可以清空", { + type: TextValueCombo.xtype, + ref: function () { + combo = this; + }, + defaultText: "请选择", + width: 300, + items: items, + allowClear: true, + listeners: [ + { + eventName: TextValueCombo.EVENT_CHANGE, + action: function () { + console.log(this.getValue()); + } + } + ] + }), + this.createCombo("有初始值,可以清空", { + type: TextValueCombo.xtype, + ref: function () { + combo = this; + }, + defaultText: "请选择", + width: 300, + value: 1, + items: items, + allowClear: true, + listeners: [ + { + eventName: TextValueCombo.EVENT_CHANGE, + action: function () { + console.log(this.getValue()); + } + } + ] + }), + this.createCombo("有初始值,value不匹配,自动标红,指定标红文字", { + type: TextValueCombo.xtype, + ref: function () { + combo = this; + }, + width: 300, + text: "MVC-111", + value: 111, + items: items, + allowClear: true, + defaultText: "请选择", + warningTitle: "value值不合法", + listeners: [ + { + eventName: TextValueCombo.EVENT_CHANGE, + action: function () { + console.log(this.getValue()); + } + } + ] + }), + this.createCombo("无初始值,外部受控调用setValue", { + type: VerticalLayout.xtype, + items: [ + { + type: TextValueCombo.xtype, + ref: function () { + combo1 = this; + }, + width: 300, + items: items, + allowClear: true, + defaultText: "请选择", + listeners: [ + { + eventName: TextValueCombo.EVENT_CHANGE, + action: function () { + console.log(this.getValue()); + } + } + ] + }, + { + el: { + type: Button.xtype, + text: "setValue(1)", + handler: function () { + combo1.setValue(1); + } + }, + vgap: 10 + } + ] + }), + this.createCombo("无初始值,外部受控调用setStatus", { + type: VerticalLayout.xtype, + items: [ + { + type: TextValueCombo.xtype, + ref: function () { + combo2 = this; + }, + width: 300, + items: items, + allowClear: true, + defaultText: "请选择", + listeners: [ + { + eventName: TextValueCombo.EVENT_CHANGE, + action: function () { + console.log(this.getValue()); + } + } + ] + }, + { + el: { + type: Button.xtype, + text: "setStatus()", + handler: function () { + combo2.setStatus("error"); + } + }, + vgap: 10 + } + ] + }), + this.createCombo("支持复选", { + type: VerticalLayout.xtype, + items: [ + { + type: TextValueCombo.xtype, + width: 300, + items: items, + allowClear: true, + defaultText: "请选择", + chooseType: Selection.Multi, + value: [1], + // allowSelectAll: false, + listeners: [ + { + eventName: TextValueCombo.EVENT_CHANGE, + action: function () { + console.log(this.getValue()); + } + } + ] + } + ] + }), + this.createCombo("支持复选,不要全选功能", { + type: VerticalLayout.xtype, + items: [ + { + type: TextValueCombo.xtype, + width: 300, + items: items, + allowClear: true, + defaultText: "请选择", + chooseType: Selection.Multi, + value: [1], + allowSelectAll: false, + listeners: [ + { + eventName: TextValueCombo.EVENT_CHANGE, + action: function () { + console.log(this.getValue()); + } + } + ] + } + ] + }) + ] + }; + } + + createCombo(text, combo) { + return { + type: VerticalLayout.xtype, + items: [ + { + el: { + type: Label.xtype, + textAlign: "left", + text + }, + bgap: 10 + }, + { + el: combo, + bgap: 10 + } + ] + }; + } +} diff --git a/packages/demo/src/demo/case/combo/demo.text_value_down_list_combo.js b/packages/demo/src/demo/case/combo/demo.text_value_down_list_combo.js new file mode 100644 index 000000000..0cac0148e --- /dev/null +++ b/packages/demo/src/demo/case/combo/demo.text_value_down_list_combo.js @@ -0,0 +1,86 @@ + +import { HorizontalAutoLayout, TextValueDownListCombo, Button, shortcut, Widget, Msg } from "@fui/core" + + + +@shortcut() +export class TextValueDownListComboDemo extends Widget { + static xtype = "demo.text_value_down_list_combo"; + + props = { baseCls: "" }; + + render() { + const self = this; + + return { + type: HorizontalAutoLayout.xtype, + items: [ + { + type: TextValueDownListCombo.xtype, + width: 300, + ref(_ref) { + self.refs = _ref; + }, + text: "默认值", + value: 11, + items: [ + [ + { + text: "属于", + value: 1, + cls: "dot-e-font", + }, + { + text: "不属于", + value: 2, + cls: "dot-e-font", + } + ], + [ + { + el: { + text: "大于", + value: 3, + iconCls1: "dot-e-font", + }, + value: 3, + children: [ + { + text: "固定值", + value: 4, + cls: "dot-e-font", + }, + { + text: "平均值", + value: 5, + cls: "dot-e-font", + } + ], + } + ] + ], + }, + { + type: Button.xtype, + width: 90, + height: 25, + text: "setValue", + handler() { + self.refs.setValue(2); + }, + }, + { + type: Button.xtype, + width: 90, + height: 25, + text: "getValue", + handler() { + Msg.alert("", JSON.stringify(self.refs.getValue())); + }, + } + ], + vgap: 20, + }; + } +} + diff --git a/packages/demo/src/demo/case/combo/demo.text_vlaue_check_combo.js b/packages/demo/src/demo/case/combo/demo.text_vlaue_check_combo.js new file mode 100644 index 000000000..92d340976 --- /dev/null +++ b/packages/demo/src/demo/case/combo/demo.text_vlaue_check_combo.js @@ -0,0 +1,54 @@ + +import { Msg, HorizontalAutoLayout, TextValueCheckCombo, Button, shortcut, Widget } from "@fui/core" + + + +@shortcut() +export class TextValueCheckComboDemo extends Widget { + static xtype = "demo.text_value_check_combo"; + + props = { baseCls: "" }; + + render() { + const self = this; + + return { + type: HorizontalAutoLayout.xtype, + items: [ + { + type: TextValueCheckCombo.xtype, + ref () { + self.combo = this; + }, + text: "默认值", + // value: 1, + width: 300, + items: [ + { + text: "MVC-1", + value: 1, + }, + { + text: "MVC-2", + value: 2, + }, + { + text: "MVC-3", + value: 3, + } + ], + }, + { + type: Button.xtype, + width: 90, + height: 25, + handler () { + Msg.alert("", JSON.stringify(self.combo.getValue())); + }, + } + ], + vgap: 20, + }; + } +} + diff --git a/packages/demo/src/demo/case/combo/index.js b/packages/demo/src/demo/case/combo/index.js new file mode 100644 index 000000000..560d7ddff --- /dev/null +++ b/packages/demo/src/demo/case/combo/index.js @@ -0,0 +1,8 @@ +export * from "./demo.bubble_combo"; +export * from "./demo.editor_icon_check_combo"; +export * from "./demo.icon_combo"; +export * from "./demo.icon_text_value_combo"; +export * from "./demo.search_text_value_combo"; +export * from "./demo.text_value_combo"; +export * from "./demo.text_value_down_list_combo"; +export * from "./demo.text_vlaue_check_combo"; \ No newline at end of file diff --git a/packages/demo/src/demo/case/demo.calendar.js b/packages/demo/src/demo/case/demo.calendar.js new file mode 100644 index 000000000..402aeee9a --- /dev/null +++ b/packages/demo/src/demo/case/demo.calendar.js @@ -0,0 +1,38 @@ + +import { Calendar, shortcut, Widget } from "@fui/core" + + +@shortcut() +export class CalendarDemo extends Widget { + static xtype = "demo.calendar"; + + props = { baseCls: "demo-func" }; + + render() { + const self = this; + const date = new Date(); + + return { + type: Calendar.xtype, + ref() { + self.calendar = this; + }, + logic: { + dynamic: false, + }, + year: date.getFullYear(), + month: date.getMonth(), + day: date.getDate(), + }; + } + + mounted() { + const date = new Date(); + this.calendar.setValue({ + year: date.getFullYear(), + month: date.getMonth(), + day: date.getDate(), + }); + } +} + diff --git a/packages/demo/src/demo/case/demo.click.effect.js b/packages/demo/src/demo/case/demo.click.effect.js new file mode 100644 index 000000000..a475f3829 --- /dev/null +++ b/packages/demo/src/demo/case/demo.click.effect.js @@ -0,0 +1,56 @@ + +import { VerticalLayout, IconTextItem, shortcut, Widget, createItems } from "@fui/core" + + +@shortcut() +export class ClickItemEffectDemo extends Widget { + static xtype = "demo.click_item_effect"; + + props = { baseCls: "demo-func" }; + + render() { + return { + type: VerticalLayout.xtype, + items: createItems( + [ + { + text: "bi-list-item", + cls: "bi-list-item close-font", + }, + { + text: "bi-list-item-simple", + cls: "bi-list-item-simple close-font", + }, + { + text: "bi-list-item-effect", + cls: "bi-list-item-effect close-font", + }, + { + text: "bi-list-item-active", + cls: "bi-list-item-active close-font", + }, + { + text: "bi-list-item-active2", + cls: "bi-list-item-active2 close-font", + }, + { + text: "bi-list-item-select", + cls: "bi-list-item-select close-font", + }, + { + text: "bi-list-item-select2", + cls: "bi-list-item-select2 close-font", + } + ], + { + type: IconTextItem.xtype, + logic: { + dynamic: true, + }, + } + ), + vgap: 10, + }; + } +} + diff --git a/packages/demo/src/demo/case/demo.color_chooser.js b/packages/demo/src/demo/case/demo.color_chooser.js new file mode 100644 index 000000000..5489839a0 --- /dev/null +++ b/packages/demo/src/demo/case/demo.color_chooser.js @@ -0,0 +1,49 @@ + +import { AbsoluteLayout, ColorChooser, SimpleColorChooser, shortcut, Widget } from "@fui/core" + + +@shortcut() +export class ColorChooserDemo extends Widget { + static xtype = "demo.color_chooser"; + + props = { baseCls: "demo-func" }; + + render() { + return { + type: AbsoluteLayout.xtype, + items: [ + { + el: { + type: ColorChooser.xtype, + recommendColorsGetter() { + return ["#ffffff", "#9d775f", "#dd4b4b", "#ef8b07", "#fcc800"]; + }, + width: 24, + height: 24, + }, + left: 100, + top: 250, + }, + { + el: { + type: SimpleColorChooser.xtype, + width: 30, + height: 24, + }, + left: 400, + top: 250, + }, + { + el: { + type: ColorChooser.xtype, + width: 230, + height: 24, + }, + left: 100, + top: 350, + } + ], + }; + } +} + diff --git a/packages/demo/src/demo/case/demo.color_chooser_popup.js b/packages/demo/src/demo/case/demo.color_chooser_popup.js new file mode 100644 index 000000000..1c641a97d --- /dev/null +++ b/packages/demo/src/demo/case/demo.color_chooser_popup.js @@ -0,0 +1,35 @@ + +import { AbsoluteLayout, ColorChooserPopup, SimpleColorChooserPopup, shortcut, Widget } from "@fui/core" + + +@shortcut() +export class ColorChooserPopupDemo extends Widget { + static xtype = "demo.color_chooser_popup"; + + props = { baseCls: "demo-func" }; + + render() { + return { + type: AbsoluteLayout.xtype, + items: [ + { + el: { + type: ColorChooserPopup.xtype, + cls: "bi-card", + }, + left: 100, + top: 250, + }, + { + el: { + type: SimpleColorChooserPopup.xtype, + cls: "bi-card", + }, + left: 400, + top: 250, + } + ], + }; + } +} + diff --git a/packages/demo/src/demo/case/demo.segment.js b/packages/demo/src/demo/case/demo.segment.js new file mode 100644 index 000000000..a8e09e948 --- /dev/null +++ b/packages/demo/src/demo/case/demo.segment.js @@ -0,0 +1,39 @@ + +import { HorizontalLayout, Segment, shortcut, Widget, createWidget } from "@fui/core" + + +@shortcut() +export class SegmentDemo extends Widget { + static xtype = "demo.segment"; + + props = { baseCls: "demo-func" }; + + render() { + createWidget({ + type: HorizontalLayout.xtype, + element: this, + vgap: 20, + hgap: 30, + items: [ + { + type: Segment.xtype, + items: [ + { + text: "较长的选项1", + value: 1, + }, + { + text: "选项2", + value: 2, + }, + { + text: "选项3", + value: 3, + } + ], + } + ], + }); + } +} + diff --git a/packages/demo/src/demo/case/editor/demo.clear_editor.js b/packages/demo/src/demo/case/editor/demo.clear_editor.js new file mode 100644 index 000000000..7c78a0ffa --- /dev/null +++ b/packages/demo/src/demo/case/editor/demo.clear_editor.js @@ -0,0 +1,27 @@ + +import { HorizontalAutoLayout, ClearEditor, shortcut, Widget } from "@fui/core" + + +@shortcut() +export class ClearEditorDemo extends Widget { + static xtype = "demo.clear_editor"; + + props = { baseCls: "" }; + + render() { + return { + type: HorizontalAutoLayout.xtype, + items: [ + { + type: ClearEditor.xtype, + cls: "bi-border", + width: 300, + watermark: "这个是带清除按钮的", + value: 123, + } + ], + vgap: 20, + }; + } +} + diff --git a/packages/demo/src/demo/case/editor/demo.shelter_editor.js b/packages/demo/src/demo/case/editor/demo.shelter_editor.js new file mode 100644 index 000000000..6c0cc3802 --- /dev/null +++ b/packages/demo/src/demo/case/editor/demo.shelter_editor.js @@ -0,0 +1,51 @@ + +import { ShelterEditor, VerticalLayout, AbsoluteLayout, Button, shortcut, Widget, createWidget } from "@fui/core" + + +@shortcut() +export class ShelterEditorDemo extends Widget { + static xtype = "demo.shelter_editor"; + + props = { baseCls: "" }; + + render() { + const editor = createWidget({ + type: ShelterEditor.xtype, + cls: "bi-border", + validationChecker(v) { + return v != "a"; + }, + watermark: "可以设置标记的输入框", + value: "这是一个遮罩", + keyword: "z", + }); + createWidget({ + type: VerticalLayout.xtype, + element: this, + hgap: 30, + vgap: 20, + bgap: 50, + items: [editor], + }); + createWidget({ + type: AbsoluteLayout.xtype, + element: this, + items: [ + { + el: { + type: Button.xtype, + text: "focus", + height: 25, + handler() { + editor.focus(); + }, + }, + right: 10, + left: 10, + bottom: 10, + } + ], + }); + } +} + diff --git a/packages/demo/src/demo/case/editor/demo.sign_editor.js b/packages/demo/src/demo/case/editor/demo.sign_editor.js new file mode 100644 index 000000000..8a7ffb7cf --- /dev/null +++ b/packages/demo/src/demo/case/editor/demo.sign_editor.js @@ -0,0 +1,31 @@ + +import { SignEditor, VerticalLayout, shortcut, Widget, createWidget } from "@fui/core" + + +@shortcut() +export class SignEditorDemo extends Widget { + static xtype = "demo.sign_editor"; + + props = { baseCls: "" }; + + render() { + const editor = createWidget({ + type: SignEditor.xtype, + cls: "bi-border bi-focus-shadow", + validationChecker(v) { + return v != "abc"; + }, + watermark: "可以设置标记的输入框", + text: "这是一个标记,点击它即可进行输入", + }); + editor.setValue(2); + createWidget({ + type: VerticalLayout.xtype, + element: this, + hgap: 30, + vgap: 20, + items: [editor], + }); + } +} + diff --git a/packages/demo/src/demo/case/editor/demo.simple_state_editor.js b/packages/demo/src/demo/case/editor/demo.simple_state_editor.js new file mode 100644 index 000000000..9ddface18 --- /dev/null +++ b/packages/demo/src/demo/case/editor/demo.simple_state_editor.js @@ -0,0 +1,37 @@ + +import { HorizontalAdaptLayout, SimpleStateEditor, shortcut, Widget } from "@fui/core" + + +@shortcut() +export class SimpleStateEditorDemo extends Widget { + static xtype = "demo.simple_state_editor"; + + props = { baseCls: "" }; + + render() { + const self = this; + + return { + type: HorizontalAdaptLayout.xtype, + items: [ + { + type: SimpleStateEditor.xtype, + ref() { + self.editor = this; + }, + cls: "bi-border", + width: 300, + } + ], + vgap: 20, + }; + } + + mounted() { + const self = this; + setTimeout(() => { + self.editor.setState(["*", "*"]); + }, 1000); + } +} + diff --git a/packages/demo/src/demo/case/editor/demo.state_editor.js b/packages/demo/src/demo/case/editor/demo.state_editor.js new file mode 100644 index 000000000..98da9f000 --- /dev/null +++ b/packages/demo/src/demo/case/editor/demo.state_editor.js @@ -0,0 +1,37 @@ + +import { HorizontalAdaptLayout, StateEditor, shortcut, Widget } from "@fui/core" + + +@shortcut() +export class StateEditorDemo extends Widget { + static xtype = "demo.state_editor"; + + props = { baseCls: "" }; + + render() { + const self = this; + + return { + type: HorizontalAdaptLayout.xtype, + items: [ + { + type: StateEditor.xtype, + ref() { + self.editor = this; + }, + cls: "bi-border", + width: 300, + } + ], + vgap: 20, + }; + } + + mounted() { + const self = this; + setTimeout(() => { + self.editor.setState(["*", "*"]); + }, 1000); + } +} + diff --git a/packages/demo/src/demo/case/editor/index.js b/packages/demo/src/demo/case/editor/index.js new file mode 100644 index 000000000..684975dd1 --- /dev/null +++ b/packages/demo/src/demo/case/editor/index.js @@ -0,0 +1,5 @@ +export * from "./demo.clear_editor"; +export * from "./demo.shelter_editor"; +export * from "./demo.sign_editor"; +export * from "./demo.simple_state_editor"; +export * from "./demo.state_editor"; \ No newline at end of file diff --git a/packages/demo/src/demo/case/index.js b/packages/demo/src/demo/case/index.js new file mode 100644 index 000000000..5fbb4121f --- /dev/null +++ b/packages/demo/src/demo/case/index.js @@ -0,0 +1,19 @@ +export const meta = { + title: "实例控件 case", + rank: 7 +}; + +export * as combo from "./combo"; +export * as editor from "./editor"; +export * as item from "./item"; +export * as list from "./list"; +export * as pager from "./pager"; +export * as pane from "./pane"; +export * as tree from "./tree"; +export * as triggers from "./triggers"; + +export * from "./demo.calendar"; +export * from "./demo.click.effect"; +export * from "./demo.color_chooser"; +export * from "./demo.color_chooser_popup"; +export * from "./demo.segment"; diff --git a/packages/demo/src/demo/case/item/demo.multi_select_item.js b/packages/demo/src/demo/case/item/demo.multi_select_item.js new file mode 100644 index 000000000..575bcd55b --- /dev/null +++ b/packages/demo/src/demo/case/item/demo.multi_select_item.js @@ -0,0 +1,29 @@ + +import { VerticalLayout, Label, MultiSelectItem, shortcut, Widget } from "@fui/core" + + +@shortcut() +export class MultiSelectItemDemo extends Widget { + static xtype = "demo.multi_select_item"; + + props = { baseCls: "demo-func" }; + + render() { + return { + type: VerticalLayout.xtype, + items: [ + { + type: Label.xtype, + height: 30, + text: "复选item", + }, + { + type: MultiSelectItem.xtype, + text: "复选项", + } + ], + hgap: 300, + }; + } +} + diff --git a/packages/demo/src/demo/case/item/demo.single_select_item.js b/packages/demo/src/demo/case/item/demo.single_select_item.js new file mode 100644 index 000000000..1c9e51748 --- /dev/null +++ b/packages/demo/src/demo/case/item/demo.single_select_item.js @@ -0,0 +1,27 @@ + +import { VerticalLayout, Label, SingleSelectItem, shortcut, Widget } from "@fui/core" + + +@shortcut() +export class SingleSelectItemDemo extends Widget { + static xtype = "demo.single_select_item"; + + render() { + return { + type: VerticalLayout.xtype, + items: [ + { + type: Label.xtype, + height: 30, + text: "单选item", + }, + { + type: SingleSelectItem.xtype, + text: "单选项", + } + ], + hgap: 300, + }; + } +} + diff --git a/packages/demo/src/demo/case/item/demo.single_select_radio_item.js b/packages/demo/src/demo/case/item/demo.single_select_radio_item.js new file mode 100644 index 000000000..22f3ce14e --- /dev/null +++ b/packages/demo/src/demo/case/item/demo.single_select_radio_item.js @@ -0,0 +1,30 @@ +import { + VerticalLayout, + Label, + SingleSelectRadioItem, + shortcut, + Widget +} from "@fui/core"; + +@shortcut() +export class SingleSelectRadioItemDemo extends Widget { + static xtype = "demo.single_select_radio_item"; + + render() { + return { + type: VerticalLayout.xtype, + items: [ + { + type: Label.xtype, + height: 30, + text: "单选item" + }, + { + type: SingleSelectRadioItem.xtype, + text: "单选项" + } + ], + hgap: 300 + }; + } +} diff --git a/packages/demo/src/demo/case/item/index.js b/packages/demo/src/demo/case/item/index.js new file mode 100644 index 000000000..a5da7036c --- /dev/null +++ b/packages/demo/src/demo/case/item/index.js @@ -0,0 +1,3 @@ +export * from "./demo.multi_select_item"; +export * from "./demo.single_select_item"; +export * from "./demo.single_select_radio_item"; \ No newline at end of file diff --git a/packages/demo/src/demo/case/list/demo.lazy_loader.js b/packages/demo/src/demo/case/list/demo.lazy_loader.js new file mode 100644 index 000000000..b99ee13ac --- /dev/null +++ b/packages/demo/src/demo/case/list/demo.lazy_loader.js @@ -0,0 +1,37 @@ +import { CONSTANTS } from "@/config/constant"; +import { + LazyLoader, + FloatLeftLayout, + Button, + shortcut, + Widget, + createWidget, + createItems, + deepClone +} from "@fui/core"; + +@shortcut() +export class LazyLoaderDemo extends Widget { + static xtype = "demo.lazy_loader"; + + props = { baseCls: "demo-func" }; + + render() { + const self = this; + createWidget({ + type: LazyLoader.xtype, + element: this, + el: { + layouts: [ + { + type: FloatLeftLayout.xtype, + hgap: 5 + } + ] + }, + items: createItems(deepClone(CONSTANTS.ITEMS), { + type: Button.xtype + }) + }); + } +} diff --git a/packages/demo/src/demo/case/list/demo.select_list.js b/packages/demo/src/demo/case/list/demo.select_list.js new file mode 100644 index 000000000..5e115d0c9 --- /dev/null +++ b/packages/demo/src/demo/case/list/demo.select_list.js @@ -0,0 +1,39 @@ +import { CONSTANTS } from "@/config/constant"; +import { + SelectList, + MultiSelectBar, + MultiSelectItem, + shortcut, + Widget, + createWidget, + createItems, + deepClone, + Selection +} from "@fui/core"; + +@shortcut() +export class SelectListDemo extends Widget { + static xtype = "demo.select_list"; + + props = { baseCls: "demo-func" }; + + render() { + const self = this; + createWidget({ + type: SelectList.xtype, + toolbar: { + type: MultiSelectBar.xtype, + iconWrapperWidth: 26 + }, + element: this, + el: { + el: { + chooseType: Selection.Multi + } + }, + items: createItems(deepClone(CONSTANTS.SIMPLE_ITEMS), { + type: MultiSelectItem.xtype + }) + }); + } +} diff --git a/packages/demo/src/demo/case/list/index.js b/packages/demo/src/demo/case/list/index.js new file mode 100644 index 000000000..4e008070c --- /dev/null +++ b/packages/demo/src/demo/case/list/index.js @@ -0,0 +1,2 @@ +export * from "./demo.lazy_loader"; +export * from "./demo.select_list"; \ No newline at end of file diff --git a/packages/demo/src/demo/case/pager/demo.all_count_pager.js b/packages/demo/src/demo/case/pager/demo.all_count_pager.js new file mode 100644 index 000000000..25b8babc3 --- /dev/null +++ b/packages/demo/src/demo/case/pager/demo.all_count_pager.js @@ -0,0 +1,37 @@ +import { + VerticalLayout, + Label, + AllCountPager, + shortcut, + Widget, + createWidget +} from "@fui/core"; + +@shortcut() +export class AllCountPagerDemo extends Widget { + static xtype = "demo.all_count_pager"; + + props = { baseCls: "demo-func" }; + + render() { + createWidget({ + type: VerticalLayout.xtype, + hgap: 200, + vgap: 50, + element: this, + items: [ + { + type: Label.xtype, + height: 30, + text: " (测试条件:总页数为3)" + }, + { + type: AllCountPager.xtype, + pages: 3, + curr: 1, + count: 1000 + } + ] + }); + } +} diff --git a/packages/demo/src/demo/case/pager/demo.direction_pager.js b/packages/demo/src/demo/case/pager/demo.direction_pager.js new file mode 100644 index 000000000..dca9914bf --- /dev/null +++ b/packages/demo/src/demo/case/pager/demo.direction_pager.js @@ -0,0 +1,57 @@ + +import { VerticalLayout, DirectionPager, shortcut, Widget, createWidget } from "@fui/core" + + +@shortcut() +export class DirectionPagerDemo extends Widget { + static xtype = "demo.direction_pager"; + + props = { baseCls: "demo-func" }; + + mounted() { + this.pager.populate(); + } + + render() { + const self = this; + createWidget({ + type: VerticalLayout.xtype, + hgap: 200, + vgap: 50, + element: this, + items: [ + { + type: DirectionPager.xtype, + ref(_ref) { + self.pager = _ref; + }, + horizontal: { + pages: false, // 总页数 + curr: 1, // 初始化当前页, pages为数字时可用 + + hasPrev(v) { + return v > 1; + }, + hasNext() { + return true; + }, + firstPage: 1, + }, + vertical: { + pages: false, // 总页数 + curr: 1, // 初始化当前页, pages为数字时可用 + + hasPrev(v) { + return v > 1; + }, + hasNext() { + return true; + }, + firstPage: 1, + }, + } + ], + }); + } +} + diff --git a/packages/demo/src/demo/case/pager/index.js b/packages/demo/src/demo/case/pager/index.js new file mode 100644 index 000000000..c4061c8c6 --- /dev/null +++ b/packages/demo/src/demo/case/pager/index.js @@ -0,0 +1,2 @@ +export * from "./demo.all_count_pager"; +export * from "./demo.direction_pager"; \ No newline at end of file diff --git a/packages/demo/src/demo/case/pane/demo.list_pane.js b/packages/demo/src/demo/case/pane/demo.list_pane.js new file mode 100644 index 000000000..b68799cde --- /dev/null +++ b/packages/demo/src/demo/case/pane/demo.list_pane.js @@ -0,0 +1,51 @@ +import { CONSTANTS } from "@/config/constant"; +import { + ListPane, + MultiSelectItem, + ButtonGroup, + VerticalLayout, + shortcut, + Widget, + createItems, + deepClone +} from "@fui/core"; + +@shortcut() +export class ListPaneDemo extends Widget { + static xtype = "demo.list_pane"; + + props = { baseCls: "demo-func" }; + + render() { + const self = this; + + return { + type: ListPane.xtype, + ref() { + self.pane = this; + }, + itemsCreator(op, callback) { + setTimeout(() => { + callback( + createItems(deepClone(CONSTANTS.ITEMS), { + type: MultiSelectItem.xtype, + height: 25 + }) + ); + }, 2000); + }, + el: { + type: ButtonGroup.xtype, + layouts: [ + { + type: VerticalLayout.xtype + } + ] + } + }; + } + + mounted() { + this.pane.populate(); + } +} diff --git a/packages/demo/src/demo/case/pane/demo.multi_popup_view.js b/packages/demo/src/demo/case/pane/demo.multi_popup_view.js new file mode 100644 index 000000000..8a4263d67 --- /dev/null +++ b/packages/demo/src/demo/case/pane/demo.multi_popup_view.js @@ -0,0 +1,59 @@ +import { CONSTANTS } from "@/config/constant"; +import { + AbsoluteLayout, + Combo, + TextButton, + MultiPopupView, + ButtonGroup, + VerticalLayout, + MultiSelectItem, + shortcut, + Widget, + createItems, + deepClone +} from "@fui/core"; + +@shortcut() +export class MultiPopupViewDemo extends Widget { + static xtype = "demo.multi_popup_view"; + + props = { baseCls: "demo-func" }; + + render() { + const self = this; + + return { + type: AbsoluteLayout.xtype, + items: [ + { + el: { + type: Combo.xtype, + width: 200, + height: 30, + el: { + type: TextButton.xtype, + text: "点击", + cls: "bi-border", + height: 30 + }, + popup: { + type: MultiPopupView.xtype, + el: { + type: ButtonGroup.xtype, + layouts: [ + { + type: VerticalLayout.xtype + } + ], + items: createItems(deepClone(CONSTANTS.ITEMS), { + type: MultiSelectItem.xtype, + height: 25 + }) + } + } + } + } + ] + }; + } +} diff --git a/packages/demo/src/demo/case/pane/demo.panel.js b/packages/demo/src/demo/case/pane/demo.panel.js new file mode 100644 index 000000000..fc3ead71c --- /dev/null +++ b/packages/demo/src/demo/case/pane/demo.panel.js @@ -0,0 +1,46 @@ +import { CONSTANTS } from "@/config/constant"; +import { + Panel, + Button, + ButtonGroup, + VerticalLayout, + MultiSelectItem, + shortcut, + Widget, + createItems, + deepClone +} from "@fui/core"; + +@shortcut() +export class PanelDemo extends Widget { + static xtype = "demo.panel"; + + props = { baseCls: "demo-func" }; + + render() { + const self = this; + + return { + type: Panel.xtype, + title: "title", + titleButtons: [ + { + type: Button.xtype, + text: "操作" + } + ], + el: { + type: ButtonGroup.xtype, + layouts: [ + { + type: VerticalLayout.xtype + } + ], + items: createItems(deepClone(CONSTANTS.ITEMS), { + type: MultiSelectItem.xtype, + height: 25 + }) + } + }; + } +} diff --git a/packages/demo/src/demo/case/pane/demo.popup_panel.js b/packages/demo/src/demo/case/pane/demo.popup_panel.js new file mode 100644 index 000000000..b4a437a35 --- /dev/null +++ b/packages/demo/src/demo/case/pane/demo.popup_panel.js @@ -0,0 +1,59 @@ +import { CONSTANTS } from "@/config/constant"; +import { + AbsoluteLayout, + Combo, + TextButton, + PopupPanel, + ButtonGroup, + VerticalLayout, + MultiSelectItem, + shortcut, + Widget, + createItems, + deepClone +} from "@fui/core"; + +@shortcut() +export class PopupPanelDemo extends Widget { + static xtype = "demo.popup_panel"; + + props = { baseCls: "demo-func" }; + + render() { + const self = this; + + return { + type: AbsoluteLayout.xtype, + items: [ + { + el: { + type: Combo.xtype, + width: 200, + height: 30, + el: { + type: TextButton.xtype, + text: "点击", + cls: "bi-border", + height: 30 + }, + popup: { + type: PopupPanel.xtype, + el: { + type: ButtonGroup.xtype, + layouts: [ + { + type: VerticalLayout.xtype + } + ], + items: createItems(deepClone(CONSTANTS.ITEMS), { + type: MultiSelectItem.xtype, + height: 25 + }) + } + } + } + } + ] + }; + } +} diff --git a/packages/demo/src/demo/case/pane/index.js b/packages/demo/src/demo/case/pane/index.js new file mode 100644 index 000000000..6fd6c64e2 --- /dev/null +++ b/packages/demo/src/demo/case/pane/index.js @@ -0,0 +1,4 @@ +export * from "./demo.list_pane"; +export * from "./demo.multi_popup_view"; +export * from "./demo.panel"; +export * from "./demo.popup_panel"; \ No newline at end of file diff --git a/packages/demo/src/demo/case/tree/demo.display_tree.js b/packages/demo/src/demo/case/tree/demo.display_tree.js new file mode 100644 index 000000000..35584c4de --- /dev/null +++ b/packages/demo/src/demo/case/tree/demo.display_tree.js @@ -0,0 +1,56 @@ + +import { DisplayTree, shortcut, Widget, createWidget } from "@fui/core" + + +@shortcut() +export class DisplayTreeDemo extends Widget { + static xtype = "demo.display_tree"; + + props = { baseCls: "demo-func" }; + + render() { + const tree = createWidget({ + type: DisplayTree.xtype, + element: this, + }); + + tree.initTree([ + { + id: 1, + text: "第一项", + open: true, + }, + { + id: 2, + text: "第二项", + }, + { + id: 11, + pId: 1, + text: "子项1(共2个)", + open: true, + }, + { + id: 111, + pId: 11, + text: "子子项1", + }, + { + id: 112, + pId: 11, + text: "子子项2", + }, + { + id: 12, + pId: 1, + text: "子项2", + }, + { + id: 13, + pId: 1, + text: "子项3", + } + ]); + } +} + diff --git a/packages/demo/src/demo/case/tree/demo.level_tree.js b/packages/demo/src/demo/case/tree/demo.level_tree.js new file mode 100644 index 000000000..6a432c673 --- /dev/null +++ b/packages/demo/src/demo/case/tree/demo.level_tree.js @@ -0,0 +1,114 @@ + +import { createWidget, Msg, LevelTree, VTapeLayout, Button, shortcut, Widget } from "@fui/core" + + + +@shortcut() +export class LevelTreeDemo extends Widget { + static xtype = "demo.level_tree"; + + props = { baseCls: "demo-func" }; + + render() { + const tree = createWidget({ + type: LevelTree.xtype, + chooseType: 0, + items: [ + { + id: 1, + text: "第一项", + value: 1, + isParent: true, + }, + { + id: 2, + text: "第二项", + value: 2, + isParent: true, + }, + { + id: 3, + text: "第三项", + value: 1, + isParent: true, + open: true, + }, + { + id: 4, + text: "第四项", + value: 1, + }, + { + id: 11, + pId: 1, + text: "子项1", + value: 11, + }, + { + id: 12, + pId: 1, + text: "子项2", + value: 12, + }, + { + id: 13, + pId: 1, + text: "子项3", + value: 13, + }, + { + id: 111, + pId: 11, + text: "子项1-1", + value: 111, + }, + { + id: 21, + pId: 2, + text: "子项1", + value: 21, + }, + { + id: 31, + pId: 3, + text: "子项1", + value: 31, + }, + { + id: 32, + pId: 3, + text: "子项2", + value: 32, + }, + { + id: 33, + pId: 3, + text: "子项3", + value: 33, + } + ], + }); + + createWidget({ + type: VTapeLayout.xtype, + element: this, + items: [ + { + el: tree, + }, + { + height: 30, + el: { + type: Button.xtype, + height: 30, + text: "getValue", + handler() { + Msg.alert("", tree.getValue()); + }, + }, + } + ], + }); + } +} + diff --git a/packages/demo/src/demo/case/tree/demo.simple_tree.js b/packages/demo/src/demo/case/tree/demo.simple_tree.js new file mode 100644 index 000000000..dce211fd4 --- /dev/null +++ b/packages/demo/src/demo/case/tree/demo.simple_tree.js @@ -0,0 +1,154 @@ +import { + SimpleTreeView, + VTapeLayout, + Button, + shortcut, + Widget, + createWidget, + Msg +} from "@fui/core"; + +@shortcut() +export class SimpleTreeDemo extends Widget { + static xtype = "demo.simple_tree"; + + props = { baseCls: "demo-func" }; + + render() { + // value值一定要是字符串 + const tree = createWidget({ + type: SimpleTreeView.xtype, + items: [ + { + id: 1, + text: "第一项", + value: "1" + }, + { + id: 2, + text: "第二项", + value: "2" + }, + { + id: 3, + text: "第三项", + value: "3", + open: true + }, + { + id: 11, + pId: 1, + text: "子项1", + value: "11" + }, + { + id: 12, + pId: 1, + text: "子项2", + value: "12" + }, + { + id: 13, + pId: 1, + text: "子项3", + value: "13" + }, + { + id: 31, + pId: 3, + text: "子项1", + value: "31" + }, + { + id: 32, + pId: 3, + text: "子项2", + value: "32" + }, + { + id: 33, + pId: 3, + text: "子项3", + value: "33" + } + ], + value: ["31", "32", "33"] + }); + + // tree.populate([{ + // id: 1, + // text: "第一项", + // value: "1" + // }, { + // id: 2, + // text: "第二项", + // value: "2" + // }, { + // id: 3, + // text: "第三项", + // value: "3", + // open: true + // }, { + // id: 11, + // pId: 1, + // text: "子项1", + // value: "11" + // }, { + // id: 12, + // pId: 1, + // text: "子项2", + // value: "12" + // }, { + // id: 13, + // pId: 1, + // text: "子项3", + // value: "13" + // }, { + // id: 31, + // pId: 3, + // text: "子项1", + // value: "31" + // }, { + // id: 32, + // pId: 3, + // text: "子项2", + // value: "32" + // }, { + // id: 33, + // pId: 3, + // text: "子项3", + // value: "33" + // }], "z"); + createWidget({ + type: VTapeLayout.xtype, + element: this, + items: [ + { + el: tree + }, + { + height: 30, + el: { + type: Button.xtype, + height: 30, + text: "setValue(['31', '32', '33'])", + handler() { + tree.setValue(["31", "32", "33"]); + } + } + }, + { + height: 30, + el: { + type: Button.xtype, + height: 30, + text: "getValue", + handler() { + Msg.alert("", JSON.stringify(tree.getValue())); + } + } + } + ] + }); + } +} diff --git a/packages/demo/src/demo/case/tree/index.js b/packages/demo/src/demo/case/tree/index.js new file mode 100644 index 000000000..8180d07ab --- /dev/null +++ b/packages/demo/src/demo/case/tree/index.js @@ -0,0 +1,3 @@ +export * from "./demo.display_tree"; +export * from "./demo.level_tree"; +export * from "./demo.simple_tree"; \ No newline at end of file diff --git a/packages/demo/src/demo/case/triggers/demo.editor_trigger.js b/packages/demo/src/demo/case/triggers/demo.editor_trigger.js new file mode 100644 index 000000000..f492e7dc6 --- /dev/null +++ b/packages/demo/src/demo/case/triggers/demo.editor_trigger.js @@ -0,0 +1,36 @@ +import { + VerticalLayout, + Label, + EditorTrigger, + shortcut, + Widget, + createWidget +} from "@fui/core"; + +@shortcut() +export class EditorTriggerDemo extends Widget { + static xtype = "demo.editor_trigger"; + + props = { baseCls: "demo-func" }; + + render() { + createWidget({ + type: VerticalLayout.xtype, + element: this, + items: [ + { + type: Label.xtype, + text: "输入框加图标的trigger" + }, + { + type: EditorTrigger.xtype, + watermark: "这是水印", + width: 200, + height: 24 + } + ], + hgap: 20, + vgap: 20 + }); + } +} diff --git a/packages/demo/src/demo/case/triggers/demo.icon_trigger.js b/packages/demo/src/demo/case/triggers/demo.icon_trigger.js new file mode 100644 index 000000000..867820dee --- /dev/null +++ b/packages/demo/src/demo/case/triggers/demo.icon_trigger.js @@ -0,0 +1,35 @@ +import { + VerticalLayout, + Label, + IconTrigger, + shortcut, + Widget, + createWidget +} from "@fui/core"; + +@shortcut() +export class IconTriggerDemo extends Widget { + static xtype = "demo.icon_trigger"; + + props = { baseCls: "demo-func" }; + + render() { + createWidget({ + type: VerticalLayout.xtype, + element: this, + items: [ + { + type: Label.xtype, + text: "只有一个图标的trigger" + }, + { + type: IconTrigger.xtype, + width: 30, + height: 24 + } + ], + hgap: 20, + vgap: 20 + }); + } +} diff --git a/packages/demo/src/demo/case/triggers/demo.select_text_trigger.js b/packages/demo/src/demo/case/triggers/demo.select_text_trigger.js new file mode 100644 index 000000000..dc7fd502b --- /dev/null +++ b/packages/demo/src/demo/case/triggers/demo.select_text_trigger.js @@ -0,0 +1,36 @@ +import { + VerticalLayout, + Label, + SelectTextTrigger, + shortcut, + Widget, + createWidget +} from "@fui/core"; + +@shortcut() +export class SelectTextTriggerDemo extends Widget { + static xtype = "demo.select_text_trigger"; + + props = { baseCls: "demo-func" }; + + render() { + createWidget({ + type: VerticalLayout.xtype, + element: this, + items: [ + { + type: Label.xtype, + text: "可被选择的trigger" + }, + { + type: SelectTextTrigger.xtype, + text: "这是一个简单的trigger", + width: 200, + height: 24 + } + ], + hgap: 20, + vgap: 20 + }); + } +} diff --git a/packages/demo/src/demo/case/triggers/demo.text_trigger.js b/packages/demo/src/demo/case/triggers/demo.text_trigger.js new file mode 100644 index 000000000..c9ec4447d --- /dev/null +++ b/packages/demo/src/demo/case/triggers/demo.text_trigger.js @@ -0,0 +1,36 @@ +import { + VerticalLayout, + Label, + TextTrigger, + shortcut, + Widget, + createWidget +} from "@fui/core"; + +@shortcut() +export class TextTriggerDemo extends Widget { + static xtype = "demo.text_trigger"; + + props = { baseCls: "demo-func" }; + + render() { + createWidget({ + type: VerticalLayout.xtype, + element: this, + items: [ + { + type: Label.xtype, + text: "文本加图标的trigger" + }, + { + type: TextTrigger.xtype, + text: "这是一个简单的trigger", + width: 200, + height: 24 + } + ], + hgap: 20, + vgap: 20 + }); + } +} diff --git a/packages/demo/src/demo/case/triggers/index.js b/packages/demo/src/demo/case/triggers/index.js new file mode 100644 index 000000000..0ef8e8a04 --- /dev/null +++ b/packages/demo/src/demo/case/triggers/index.js @@ -0,0 +1,4 @@ +export * from "./demo.editor_trigger"; +export * from "./demo.icon_trigger"; +export * from "./demo.select_text_trigger"; +export * from "./demo.text_trigger"; \ No newline at end of file diff --git a/packages/demo/src/demo/component/demo.form.js b/packages/demo/src/demo/component/demo.form.js new file mode 100644 index 000000000..bd26bcc4b --- /dev/null +++ b/packages/demo/src/demo/component/demo.form.js @@ -0,0 +1,114 @@ + +import { createWidget, isEmpty, isNotEmptyArray, Form, TextEditor, TextValueCombo, TextAreaEditor, VerticalLayout, Button, shortcut, Widget } from "@fui/core" + + +@shortcut() +export class FormDemo extends Widget { + static xtype = "demo.form"; + + props = { baseCls: "demo-form" }; + + render() { + const widget = createWidget({ + type: Form.xtype, + width: 300, + labelWidth: 100, + items: [ + { + validate(v) { + return v !== "a" && v !== ""; + }, + tip(v) { + if (isEmpty(v)) { + return "不能为空"; + } + + return "不合法格式"; + }, + label: "E-mail", + el: { + type: TextEditor.xtype, + watermark: "输入a报错", + allowBlank: true, + }, + }, + { + validate(v) { + return isNotEmptyArray(v); + }, + tip() { + return "不能为空"; + }, + label: "性别", + el: { + type: TextValueCombo.xtype, + text: "请选择", + items: [ + { + text: "男", + value: 1, + }, + { + text: "女", + value: 2, + } + ], + }, + }, + { + validate(v) { + return v !== ""; + }, + tip() { + return "不能为空"; + }, + label: "姓名", + el: { + type: TextEditor.xtype, + watermark: "输入姓名", + allowBlank: true, + }, + }, + { + validate(v) { + return v !== ""; + }, + tip() { + return "不能为空"; + }, + label: "姓名", + el: { + type: TextAreaEditor.xtype, + cls: "bi-border", + watermark: "输入简介", + allowBlank: true, + height: 200, + }, + } + ], + layout: { + type: VerticalLayout.xtype, + vgap: 30, + }, + }); + + return { + type: VerticalLayout.xtype, + hgap: 200, + vgap: 10, + items: [ + widget, + { + type: Button.xtype, + text: "提交", + handler() { + widget.validate(); + + console.log(widget.getValue()); + }, + } + ], + }; + } +} + diff --git a/packages/demo/src/demo/component/demo.treevaluechoosercombo.js b/packages/demo/src/demo/component/demo.treevaluechoosercombo.js new file mode 100644 index 000000000..09e846dfb --- /dev/null +++ b/packages/demo/src/demo/component/demo.treevaluechoosercombo.js @@ -0,0 +1,30 @@ +import { CONSTANTS } from "@/config/constant"; + +import { TreeValueChooserCombo, VerticalLayout, shortcut, Widget, createWidget, deepClone } from "@fui/core" + + +@shortcut() +export class TreeValueChooserDemo extends Widget { + static xtype = "demo.tree_value_chooser_combo"; + + props = { baseCls: "demo-tree-value-chooser-combo" }; + + render() { + const widget = createWidget({ + type: TreeValueChooserCombo.xtype, + width: 300, + itemsCreator(op, callback) { + callback(deepClone(CONSTANTS.TREEITEMS)); + }, + defaultText: "请选择", + }); + + return { + type: VerticalLayout.xtype, + hgap: 200, + vgap: 10, + items: [widget], + }; + } +} + diff --git a/packages/demo/src/demo/component/demo.treevaluechooserpane.js b/packages/demo/src/demo/component/demo.treevaluechooserpane.js new file mode 100644 index 000000000..74d105be7 --- /dev/null +++ b/packages/demo/src/demo/component/demo.treevaluechooserpane.js @@ -0,0 +1,19 @@ +import { CONSTANTS } from "@/config/constant"; +import { TreeValueChooserPane, shortcut, Widget, deepClone } from "@fui/core"; + +@shortcut() +export class TreeValueChooserPaneDemo extends Widget { + static xtype = "demo.tree_value_chooser_pane"; + + props = { baseCls: "demo-tree-value-chooser" }; + + render() { + return { + type: TreeValueChooserPane.xtype, + items: deepClone(CONSTANTS.TREEITEMS) + // itemsCreator: function (op, callback) { + // callback(tree); + // } + }; + } +} diff --git a/packages/demo/src/demo/component/demo.valuechoosercombo.js b/packages/demo/src/demo/component/demo.valuechoosercombo.js new file mode 100644 index 000000000..419005a4f --- /dev/null +++ b/packages/demo/src/demo/component/demo.valuechoosercombo.js @@ -0,0 +1,28 @@ +import { CONSTANTS } from "@/config/constant"; + +import { ValueChooserCombo, VerticalLayout, shortcut, Widget, createWidget, deepClone } from "@fui/core" + + +@shortcut() +export class ValueChooserComboDemo extends Widget { + static xtype = "demo.value_chooser_combo"; + + props = { baseCls: "demo-value-chooser-combo" }; + + render() { + const widget = createWidget({ + type: ValueChooserCombo.xtype, + itemsCreator (op, callback) { + callback(deepClone(CONSTANTS.ITEMS)); + }, + }); + + return { + type: VerticalLayout.xtype, + hgap: 200, + vgap: 10, + items: [widget], + }; + } +} + diff --git a/packages/demo/src/demo/component/demo.valuechooserpane.js b/packages/demo/src/demo/component/demo.valuechooserpane.js new file mode 100644 index 000000000..94d49f7cf --- /dev/null +++ b/packages/demo/src/demo/component/demo.valuechooserpane.js @@ -0,0 +1,16 @@ +import { CONSTANTS } from "@/config/constant"; +import { ValueChooserPane, shortcut, Widget, deepClone } from "@fui/core"; + +@shortcut() +export class ValueChooserPaneDemo extends Widget { + static xtype = "demo.value_chooser_pane"; + + props = { baseCls: "demo-value-chooser-pane" }; + + render() { + return { + type: ValueChooserPane.xtype, + items: deepClone(CONSTANTS.ITEMS) + }; + } +} diff --git a/packages/demo/src/demo/component/index.js b/packages/demo/src/demo/component/index.js new file mode 100644 index 000000000..b980af9a7 --- /dev/null +++ b/packages/demo/src/demo/component/index.js @@ -0,0 +1,10 @@ +export const meta = { + title: "部件+服务", + rank: 4 +}; + +export * from "./demo.form"; +export * from "./demo.treevaluechoosercombo"; +export * from "./demo.treevaluechooserpane"; +export * from "./demo.valuechoosercombo"; +export * from "./demo.valuechooserpane"; diff --git a/packages/demo/src/demo/core/abstract/combination/demo.combo.js b/packages/demo/src/demo/core/abstract/combination/demo.combo.js new file mode 100644 index 000000000..c56563b77 --- /dev/null +++ b/packages/demo/src/demo/core/abstract/combination/demo.combo.js @@ -0,0 +1,453 @@ + +import { ComboGroup, IconTextIconItem, SingleSelectItem, Combo, Button, ButtonGroup, SingleSelectRadioItem, VerticalLayout, MultiSelectItem, Label, MultiSelectBar, TextButton, Loader, FloatLeftLayout, ButtonTree, AdaptiveLayout, TableLayout, AbsoluteLayout, Navigation, GridLayout, shortcut, Widget, createWidget, createItems, deepClone, map, delay, random, makeArray, Msg } from "@fui/core" + + + +@shortcut() +export class ComboDemo extends Widget { + static xtype = "demo.combo"; + + props = { baseCls: "demo-func" }; + years = [ + { text: "2010年", value: 2010, iconCls: "close-ha-font" }, + { text: "2011年", value: 2011 }, + { text: "2012年", value: 2012, iconCls: "close-ha-font" }, + { text: "2013年", value: 2013 }, + { text: "2014年", value: 2014, iconCls: "close-ha-font" }, + { text: "2015年", value: 2015, iconCls: "close-ha-font" }, + { text: "2016年", value: 2016, iconCls: "close-ha-font" }, + { text: "2017年", value: 2017, iconCls: "close-ha-font" } + ]; + child = [ + { + type: ComboGroup.xtype, + el: { + type: IconTextIconItem.xtype, + text: "2010年", + value: 2010, + height: 25, + iconCls1: "close-ha-font", + iconCls2: "close-ha-font", + }, + items: [ + { type: SingleSelectItem.xtype, height: 25, text: "一月", value: 11 }, + { + type: IconTextIconItem.xtype, + height: 25, + text: "二月", + value: 12, + iconCls1: "close-ha-font", + iconCls2: "close-ha-font", + children: [{ type: SingleSelectItem.xtype, text: "一号", value: 101, height: 25 }], + } + ], + }, + { text: "2011年", value: 2011 }, + { text: "2012年", value: 2012, iconCls: "close-ha-font" }, + { text: "2013年", value: 2013 }, + { text: "2014年", value: 2014, iconCls: "close-ha-font" }, + { text: "2015年", value: 2015, iconCls: "close-ha-font" } + ]; + months = [ + [{ el: { text: "一月", value: 1 } }, { el: { text: "二月", value: 2 } }], + [{ el: { text: "三月", value: 3 } }, { el: { text: "四月", value: 4 } }], + [{ el: { text: "五月", value: 5 } }, { el: { text: "六月", value: 6 } }], + [{ el: { text: "七月", value: 7 } }, { el: { text: "八月", value: 8 } }], + [{ el: { text: "九月", value: 9 } }, { el: { text: "十月", value: 10 } }], + [{ el: { text: "十一月", value: 11 } }, { el: { text: "十二月", value: 12 } }] + ]; + dynamic = [ + { text: "2010年", value: 1 }, + { text: "20112222年", value: 2 }, + { text: "201233333年", value: 3 }, + { text: "2013年", value: 4 }, + { text: "2012324年", value: 5 }, + { text: "2015年", value: 6 }, + { text: "2016年", value: 7 }, + { text: "201744444444444444444444444444444444444年", value: 8 } + ]; + week = [ + { text: "周一", value: 100, iconClsLeft: "close-ha-font", iconClsRight: "close-font" }, + { text: "周二", value: 101, iconClsLeft: "close-ha-font" }, + { text: "周三", value: 102 }, + { text: "周四", value: 103, iconClsRight: "close-ha-font" }, + { text: "周五", value: 104, iconClsLeft: "close-ha-font", iconClsRight: "close-font" }, + { text: "周六", value: 105, iconClsLeft: "close-font", iconClsRight: "close-ha-font" }, + { text: "周日", value: 106, iconClsLeft: "close-font" } + ]; + + _createTop() { + const self = this; + + const yearCombo = createWidget({ + type: Combo.xtype, + el: { + type: Button.xtype, + text: "简单下拉框", + height: 30, + }, + popup: { + el: { + type: ButtonGroup.xtype, + items: createItems(deepClone(this.years), { + type: SingleSelectRadioItem.xtype, + height: 25, + handler(v) {}, + }), + layouts: [ + { + type: VerticalLayout.xtype, + } + ], + }, + }, + width: 200, + }); + + var multiCombo = createWidget({ + type: Combo.xtype, + el: { + type: Button.xtype, + text: "多选下拉框", + height: 30, + }, + popup: { + el: { + items: createItems(deepClone(this.years), { + type: MultiSelectItem.xtype, + height: 25, + handler(v) {}, + }), + chooseType: 1, + layouts: [ + { + type: VerticalLayout.xtype, + } + ], + }, + tool: { + type: Label.xtype, + text: "这是一个下拉框", + height: 35, + }, + tabs: [ + { + type: MultiSelectBar.xtype, + height: 25, + text: "全选", + onCheck(v) { + if (v) { + multiCombo.setValue(map(deepClone(self.years), "value")); + } else { + multiCombo.setValue([]); + } + }, + isAllCheckedBySelectedValue(selectedValue) { + return selectedValue.length == self.years.length; + // return true; + }, + } + ], + buttons: [ + { + type: TextButton.xtype, + text: "清空", + handler() { + multiCombo.setValue([]); + }, + }, + { + type: TextButton.xtype, + text: "确定", + handler() { + Msg.alert("", multiCombo.getValue()); + }, + } + ], + }, + width: 200, + }); + + const dynamicPopupCombo = createWidget({ + type: Combo.xtype, + isNeedAdjustWidth: false, + offsetStyle: "center", + el: { + type: Button.xtype, + text: "动态调整宽度", + height: 30, + }, + popup: { + el: { + items: createItems(deepClone(this.dynamic), { + type: SingleSelectItem.xtype, + height: 25, + }), + layouts: [ + { + type: VerticalLayout.xtype, + } + ], + }, + }, + width: 200, + }); + + var dynamicCombo = createWidget({ + type: Combo.xtype, + el: { + type: Button.xtype, + text: "搜索", + height: 30, + }, + popup: { + el: { + type: Loader.xtype, + logic: { + dynamic: true, + scrolly: true, + }, + el: { + behaviors: { + redmark() { + return true; + }, + }, + layouts: [ + { + type: VerticalLayout.xtype, + } + ], + }, + itemsCreator(options, popuplate) { + const times = options.times; + delay(() => { + if (times == 3) { + popuplate([ + { + type: SingleSelectItem.xtype, + text: "这是最后一个", + value: "这是最后一个", + py: "zszhyg", + height: 25, + } + ]); + + return; + } + + const map = map(makeArray(3, null), (i, v) => { + const val = `${i}_${random(1, 100)}`; + + return { + type: SingleSelectItem.xtype, + text: val, + value: val, + height: 25, + }; + }); + popuplate(map); + }, 1000); + }, + hasNext(options) { + return options.times < 3; + }, + }, + buttons: [ + { + type: TextButton.xtype, + text: "清空", + handler() { + dynamicCombo.setValue([]); + }, + }, + { + type: TextButton.xtype, + text: "确定", + handler() { + Msg.alert("", dynamicCombo.getValue()); + }, + } + ], + }, + width: 200, + }); + + return createWidget({ + type: FloatLeftLayout.xtype, + items: [yearCombo, multiCombo, dynamicPopupCombo, dynamicCombo], + hgap: 20, + vgap: 20, + }); + } + + _createBottom() { + const combo = createWidget({ + type: Combo.xtype, + el: { + type: TextButton.xtype, + cls: "button-combo", + height: 30, + }, + popup: { + el: { + type: ButtonGroup.xtype, + items: createItems(deepClone(this.years), { + type: SingleSelectItem.xtype, + iconWidth: 25, + height: 25, + handler(v) {}, + }), + chooseType: 1, + layouts: [ + { + type: VerticalLayout.xtype, + } + ], + }, + }, + width: 200, + }); + combo.setValue(deepClone(this.years)[0].value); + + const childCombo = createWidget({ + type: Combo.xtype, + el: { + type: TextButton.xtype, + cls: "button-combo", + height: 30, + }, + popup: { + el: { + type: ButtonTree.xtype, + items: createItems(deepClone(this.child), { + type: SingleSelectItem.xtype, + height: 25, + handler(v) {}, + }), + layouts: [ + { + type: VerticalLayout.xtype, + } + ], + }, + }, + width: 200, + }); + childCombo.setValue(deepClone(this.child)[0].items[0].value); + + const monthCombo = createWidget({ + type: Combo.xtype, + el: { + type: Button.xtype, + text: "多层样式下拉框", + height: 30, + }, + popup: { + el: { + items: createItems(deepClone(this.months), { + type: SingleSelectItem.xtype, + cls: "button-combo", + handler(v) {}, + }), + layouts: [ + { + type: AdaptiveLayout.xtype, + items: [ + { + el: { + type: TableLayout.xtype, + columns: 2, + rows: 6, + columnSize: [0.5, "fill"], + rowSize: 30, + }, + left: 4, + right: 4, + top: 2, + bottom: 2, + } + ], + }, + { + type: AbsoluteLayout.xtype, + el: { left: 4, top: 2, right: 4, bottom: 2 }, + } + ], + }, + }, + width: 200, + }); + + const yearCombo = createWidget({ + type: Combo.xtype, + el: { + type: Button.xtype, + text: "自定义控件", + height: 30, + }, + popup: { + el: { + type: Navigation.xtype, + direction: "bottom", + logic: { + dynamic: true, + }, + tab: { + height: 30, + items: [ + { + once: false, + text: "后退", + value: -1, + cls: "mvc-button layout-bg3", + }, + { + once: false, + text: "前进", + value: 1, + cls: "mvc-button layout-bg4", + } + ], + }, + cardCreator(v) { + return createWidget({ + type: TextButton.xtype, + whiteSpace: "normal", + text: new Date().getFullYear() + v, + }); + }, + }, + }, + width: 200, + }); + + return createWidget({ + type: FloatLeftLayout.xtype, + items: [combo, childCombo, monthCombo, yearCombo], + hgap: 20, + vgap: 20, + }); + } + + render() { + return { + type: GridLayout.xtype, + columns: 1, + rows: 2, + items: [ + { + column: 0, + row: 0, + el: this._createTop(), + }, + { + column: 0, + row: 1, + el: this._createBottom(), + } + ], + }; + } +} + diff --git a/packages/demo/src/demo/core/abstract/combination/demo.combo2.js b/packages/demo/src/demo/core/abstract/combination/demo.combo2.js new file mode 100644 index 000000000..b2fc9eb7e --- /dev/null +++ b/packages/demo/src/demo/core/abstract/combination/demo.combo2.js @@ -0,0 +1,175 @@ +import { + Button, + Combo, + Layout, + GridLayout, + shortcut, + Widget, + createWidget +} from "@fui/core"; + +@shortcut() +export class Combo2Demo extends Widget { + static xtype = "demo.combo2"; + + props = { baseCls: "demo-func" }; + + _createEl() { + return { + type: Button.xtype, + height: 25, + text: "点击" + }; + } + + oneCombo() { + return createWidget({ + type: Combo.xtype, + adjustLength: 5, + el: this._createEl(), + popup: { + el: { + type: Layout.xtype, + height: 500 + }, + maxHeight: 400 + } + }); + } + + twoCombo() { + return createWidget({ + type: Combo.xtype, + adjustXOffset: 25, + adjustYOffset: 5, + direction: "bottom,left", + el: this._createEl(), + popup: { + el: { + type: Layout.xtype, + height: 1200 + } + } + }); + } + + threeCombo() { + return createWidget({ + type: Combo.xtype, + adjustYOffset: 5, + el: this._createEl(), + isNeedAdjustHeight: false, + popup: { + el: { + type: Layout.xtype, + height: 1200 + } + } + }); + } + + fourCombo() { + return createWidget({ + type: Combo.xtype, + adjustXOffset: 25, + adjustYOffset: 5, + direction: "left", + el: this._createEl(), + isNeedAdjustHeight: true, + popup: { + el: { + type: Layout.xtype, + height: 1200 + } + } + }); + } + + fiveCombo() { + return createWidget({ + type: Combo.xtype, + adjustXOffset: 25, + adjustYOffset: 5, + direction: "left,top", + el: this._createEl(), + isNeedAdjustHeight: true, + popup: { + el: { + type: Layout.xtype, + height: 1200 + }, + maxHeight: 2000 + } + }); + } + + sixCombo() { + return createWidget({ + type: Combo.xtype, + adjustXOffset: 25, + adjustYOffset: 5, + direction: "top,left", + el: this._createEl(), + isNeedAdjustHeight: true, + popup: { + el: { + type: Layout.xtype, + height: 1200 + } + } + }); + } + + sevenCombo() { + return createWidget({ + type: Combo.xtype, + adjustXOffset: 25, + adjustYOffset: 5, + direction: "bottom", + isNeedAdjustWidth: false, + // isNeedAdjustHeight: false, + offsetStyle: "center", + el: this._createEl(), + popup: { + el: { + type: Layout.xtype, + width: 200, + height: 1200 + } + } + }); + } + + eightCombo() { + return createWidget({ + type: Combo.xtype, + adjustXOffset: 25, + adjustYOffset: 5, + direction: "right", + isNeedAdjustWidth: false, + // isNeedAdjustHeight: false, + offsetStyle: "middle", + el: this._createEl(), + popup: { + el: { + type: Layout.xtype, + width: 200, + height: 200 + } + } + }); + } + + render() { + return { + type: GridLayout.xtype, + hgap: 10, + vgap: 5, + items: [ + [this.oneCombo(), this.twoCombo(), this.threeCombo()], + [this.fourCombo(), this.fiveCombo(), this.sixCombo()], + [this.sevenCombo(), this.eightCombo()] + ] + }; + } +} diff --git a/packages/demo/src/demo/core/abstract/combination/demo.combo3.js b/packages/demo/src/demo/core/abstract/combination/demo.combo3.js new file mode 100644 index 000000000..6b4e80401 --- /dev/null +++ b/packages/demo/src/demo/core/abstract/combination/demo.combo3.js @@ -0,0 +1,85 @@ +import { + Label, + Combo, + Layout, + GridLayout, + shortcut, + Widget, + createWidget +} from "@fui/core"; + +@shortcut() +export class Combo3Demo extends Widget { + static xtype = "demo.combo3"; + + props = { baseCls: "demo-func" }; + + _createEl() { + return { + type: Label.xtype, + cls: "bi-border", + height: "100%", + text: "点击" + }; + } + + oneCombo() { + return createWidget({ + type: Combo.xtype, + direction: "right,innerRight", + isNeedAdjustWidth: false, + isNeedAdjustHeight: false, + el: this._createEl(), + popup: { + el: { + type: Layout.xtype, + width: 200, + height: 200 + } + } + }); + } + + twoCombo() { + return createWidget({ + type: Combo.xtype, + direction: "right,innerRight", + isNeedAdjustWidth: false, + isNeedAdjustHeight: false, + el: this._createEl(), + popup: { + el: { + type: Layout.xtype, + width: 1000, + height: 200 + } + } + }); + } + + threeCombo() { + return createWidget({ + type: Combo.xtype, + direction: "right,innerRight", + isNeedAdjustWidth: false, + isNeedAdjustHeight: false, + el: this._createEl(), + popup: { + el: { + type: Layout.xtype, + width: 400, + height: 200 + } + } + }); + } + + render() { + return { + type: GridLayout.xtype, + hgap: 10, + vgap: 5, + items: [[this.oneCombo()], [this.twoCombo()], [this.threeCombo()]] + }; + } +} diff --git a/packages/demo/src/demo/core/abstract/combination/demo.combo_group.js b/packages/demo/src/demo/core/abstract/combination/demo.combo_group.js new file mode 100644 index 000000000..67aadd452 --- /dev/null +++ b/packages/demo/src/demo/core/abstract/combination/demo.combo_group.js @@ -0,0 +1,114 @@ +import { + ComboGroup, + IconTextIconItem, + SingleSelectItem, + Combo, + TextButton, + ButtonTree, + VerticalLayout, + FloatLeftLayout, + GridLayout, + shortcut, + Widget, + createWidget, + createItems, + deepClone +} from "@fui/core"; + +@shortcut() +export class ComboGroupDemo extends Widget { + static xtype = "demo.combo.group"; + + props = { baseCls: "demo-func" }; + child = [ + { + type: ComboGroup.xtype, + el: { + type: IconTextIconItem.xtype, + text: "2010年", + value: 2010, + height: 25, + iconCls: "close-ha-font" + }, + items: [ + { + type: SingleSelectItem.xtype, + height: 25, + text: "一月", + value: 11 + }, + { + type: IconTextIconItem.xtype, + height: 25, + text: "二月", + value: 12, + iconCls1: "close-ha-font", + iconCls2: "close-ha-font", + children: [ + { + type: SingleSelectItem.xtype, + text: "一号", + value: 101, + height: 25 + } + ] + } + ] + }, + { text: "2011年", value: 2011 }, + { text: "2012年", value: 2012, iconCls: "close-ha-font" }, + { text: "2013年", value: 2013 }, + { text: "2014年", value: 2014, iconCls: "close-ha-font" }, + { text: "2015年", value: 2015, iconCls: "close-ha-font" } + ]; + + _createBottom() { + const childCombo = createWidget({ + type: Combo.xtype, + el: { + type: TextButton.xtype, + cls: "button-combo", + height: 30 + }, + popup: { + el: { + type: ButtonTree.xtype, + items: createItems(deepClone(this.child), { + type: SingleSelectItem.xtype, + height: 25, + handler(v) {} + }), + layouts: [ + { + type: VerticalLayout.xtype + } + ] + } + }, + width: 200 + }); + childCombo.setValue(deepClone(this.child)[0].items[0].value); + + return createWidget({ + type: FloatLeftLayout.xtype, + items: [childCombo], + hgap: 20, + vgap: 20 + }); + } + + render() { + return { + type: GridLayout.xtype, + columns: 1, + rows: 1, + items: [ + { + column: 0, + row: 0, + el: this._createBottom() + } + ] + }; + } +} diff --git a/packages/demo/src/demo/core/abstract/combination/demo.expander.js b/packages/demo/src/demo/core/abstract/combination/demo.expander.js new file mode 100644 index 000000000..49533e4b0 --- /dev/null +++ b/packages/demo/src/demo/core/abstract/combination/demo.expander.js @@ -0,0 +1,62 @@ +import { + VerticalLayout, + Expander, + IconTextNode, + SingleSelectItem, + shortcut, + Widget, + createItems +} from "@fui/core"; + +@shortcut() +export class ExpanderDemo extends Widget { + static xtype = "demo.expander"; + + props = { baseCls: "demo-func" }; + + render() { + return { + type: VerticalLayout.xtype, + hgap: 30, + vgap: 20, + items: [ + { + type: Expander.xtype, + el: { + type: IconTextNode.xtype, + cls: "pull-right-ha-font mvc-border", + height: 25, + text: "Expander" + }, + popup: { + cls: "mvc-border", + items: createItems( + [ + { + text: "项目1", + value: 1 + }, + { + text: "项目2", + value: 2 + }, + { + text: "项目3", + value: 3 + }, + { + text: "项目4", + value: 4 + } + ], + { + type: SingleSelectItem.xtype, + height: 25 + } + ) + } + } + ] + }; + } +} diff --git a/packages/demo/src/demo/core/abstract/combination/demo.loader.js b/packages/demo/src/demo/core/abstract/combination/demo.loader.js new file mode 100644 index 000000000..0cb891c6c --- /dev/null +++ b/packages/demo/src/demo/core/abstract/combination/demo.loader.js @@ -0,0 +1,34 @@ +import { Loader, SingleSelectItem, shortcut, Widget, deepClone, map, extend } from '@fui/core'; +import { CONSTANTS } from '@/config/constant'; + +@shortcut() +export class LoaderDemo extends Widget { + static xtype = 'demo.loader'; + + props = { baseCls: 'demo-func' }; + + render() { + const self = this; + this.all = 0; + const items = deepClone(CONSTANTS.ITEMS); + + return { + type: Loader.xtype, + itemsCreator(options, populate) { + setTimeout(() => { + populate( + map(items.slice((options.times - 1) * 10, options.times * 10), (i, v) => + extend(v, { + type: SingleSelectItem.xtype, + height: 25, + }) + ) + ); + }, 1000); + }, + hasNext(options) { + return options.times * 10 < items.length; + }, + }; + } +} diff --git a/packages/demo/src/demo/core/abstract/combination/demo.navigation.js b/packages/demo/src/demo/core/abstract/combination/demo.navigation.js new file mode 100644 index 000000000..43620d356 --- /dev/null +++ b/packages/demo/src/demo/core/abstract/combination/demo.navigation.js @@ -0,0 +1,49 @@ +import { + Label, + Navigation, + shortcut, + Widget, + createWidget, + random, + bind +} from "@fui/core"; + +@shortcut() +export class NagvigationDemo extends Widget { + static xtype = "demo.navigation"; + + props = { baseCls: "demo-func" }; + + _createNav(v) { + return createWidget({ + type: Label.xtype, + cls: `layout-bg${random(1, 8)}`, + text: `第${v}页` + }); + } + + render() { + return { + type: Navigation.xtype, + showIndex: 0, + tab: { + height: 30, + items: [ + { + once: false, + text: "后退", + value: -1, + cls: "mvc-button layout-bg3" + }, + { + once: false, + text: "前进", + value: 1, + cls: "mvc-button layout-bg4" + } + ] + }, + cardCreator: bind(this._createNav, this) + }; + } +} diff --git a/packages/demo/src/demo/core/abstract/combination/demo.sercher.js b/packages/demo/src/demo/core/abstract/combination/demo.sercher.js new file mode 100644 index 000000000..50487eef5 --- /dev/null +++ b/packages/demo/src/demo/core/abstract/combination/demo.sercher.js @@ -0,0 +1,135 @@ +import { + MultiSelectItem, + ButtonGroup, + VerticalLayout, + AbsoluteLayout, + Searcher, + shortcut, + Widget, + createItems, + createWidget +} from "@fui/core"; + +@shortcut() +export class SearcherDemo extends Widget { + static xtype = "demo.searcher"; + + props = { baseCls: "demo-func" }; + + _createItems(items) { + return createItems(items, { + type: MultiSelectItem.xtype, + height: 25, + handler(v) {} + }); + } + + render() { + const self = this; + const items = [ + { + text: "2010年", + value: 2010, + py: "2010n", + title: "1111111111111111111111111111111111" + }, + { + text: "2011年", + value: 2011, + py: "2011n", + title: "1111111111111111111111111111111111" + }, + { + text: "2012年", + value: 2012, + py: "2012n", + title: "1111111111111111111111111111111111" + }, + { + text: "2013年", + value: 2013, + py: "2013n", + title: "1111111111111111111111111111111111" + }, + { + text: "2014年", + value: 2014, + py: "2014n", + title: "1111111111111111111111111111111111" + }, + { + text: "2015年", + value: 2015, + py: "2015n", + title: "1111111111111111111111111111111111" + }, + { + text: "2016年", + value: 2016, + py: "2016n", + title: "1111111111111111111111111111111111" + }, + { + text: "2017年", + value: 2017, + py: "2017n", + title: "1111111111111111111111111111111111" + } + ]; + + const adapter = createWidget({ + type: ButtonGroup.xtype, + cls: "layout-bg1", + items: this._createItems(items), + chooseType: 1, + behaviors: {}, + layouts: [ + { + type: VerticalLayout.xtype + } + ] + }); + createWidget({ + type: AbsoluteLayout.xtype, + element: this, + items: [ + { + el: adapter, + top: 50, + left: 50, + width: 200, + height: 100 + } + ] + }); + createWidget({ + type: AbsoluteLayout.xtype, + element: this, + items: [ + { + el: { + type: AbsoluteLayout.xtype, + width: 200, + height: 30, + items: [ + { + el: { + type: Searcher.xtype, + adapter, + width: 200, + height: 30 + }, + left: 0, + right: 0, + top: 0, + bottom: 0 + } + ] + }, + top: 100, + left: 300 + } + ] + }); + } +} diff --git a/packages/demo/src/demo/core/abstract/combination/demo.switcher.js b/packages/demo/src/demo/core/abstract/combination/demo.switcher.js new file mode 100644 index 000000000..d18a7c3f4 --- /dev/null +++ b/packages/demo/src/demo/core/abstract/combination/demo.switcher.js @@ -0,0 +1,84 @@ +import { + Label, + AbsoluteLayout, + VerticalLayout, + Switcher, + Button, + SingleSelectItem, + shortcut, + Widget, + createWidget, + createItems +} from "@fui/core"; + +@shortcut() +export class SwitcherDemo extends Widget { + static xtype = "demo.switcher"; + + props = { baseCls: "demo-func" }; + + render() { + const adapter = createWidget({ + type: Label.xtype, + cls: "layout-bg2", + text: "将在该处弹出switcher" + }); + createWidget({ + type: AbsoluteLayout.xtype, + element: this, + items: [ + { + el: adapter, + top: 50, + left: 20, + width: 200, + height: 300 + } + ] + }); + createWidget({ + type: VerticalLayout.xtype, + element: this, + hgap: 30, + vgap: 20, + items: [ + { + type: Switcher.xtype, + el: { + type: Button.xtype, + height: 25, + text: "Switcher" + }, + popup: { + cls: "mvc-border layout-bg5", + items: createItems( + [ + { + text: "项目1", + value: 1 + }, + { + text: "项目2", + value: 2 + }, + { + text: "项目3", + value: 3 + }, + { + text: "项目4", + value: 4 + } + ], + { + type: SingleSelectItem.xtype, + height: 25 + } + ) + }, + adapter + } + ] + }); + } +} diff --git a/packages/demo/src/demo/core/abstract/combination/demo.tab.js b/packages/demo/src/demo/core/abstract/combination/demo.tab.js new file mode 100644 index 000000000..a597c331c --- /dev/null +++ b/packages/demo/src/demo/core/abstract/combination/demo.tab.js @@ -0,0 +1,91 @@ +import { + Label, + ButtonGroup, + CenterAdaptLayout, + HorizontalLayout, + Tab, + AbsoluteLayout, + shortcut, + Widget, + createWidget, + bind +} from "@fui/core"; + +@shortcut() +export class TabDemo extends Widget { + static xtype = "demo.tab"; + + props = { baseCls: "demo-func" }; + + _createTabs(v) { + switch (v) { + case 1: + return createWidget({ + type: Label.xtype, + cls: "layout-bg1", + text: "面板1" + }); + case 2: + return createWidget({ + type: Label.xtype, + cls: "layout-bg2", + text: "面板2" + }); + } + } + + render() { + this.tab = createWidget({ + type: ButtonGroup.xtype, + height: 30, + items: [ + { + text: "Tab1", + value: 1, + width: 50, + cls: "mvc-button layout-bg3" + }, + { + text: "Tab2", + value: 2, + width: 50, + cls: "mvc-button layout-bg4" + } + ], + layouts: [ + { + type: CenterAdaptLayout.xtype, + items: [ + { + el: { + type: HorizontalLayout.xtype, + width: 100 + } + } + ] + } + ] + }); + + const tab = createWidget({ + direction: "custom", + type: Tab.xtype, + element: this, + tab: this.tab, + cardCreator: bind(this._createTabs, this) + }); + createWidget({ + type: AbsoluteLayout.xtype, + element: this, + items: [ + { + el: this.tab, + left: 200, + top: 200 + } + ] + }); + + tab.setSelect(2); + } +} diff --git a/demo/js/core/abstract/combination/index.js b/packages/demo/src/demo/core/abstract/combination/index.js similarity index 100% rename from demo/js/core/abstract/combination/index.js rename to packages/demo/src/demo/core/abstract/combination/index.js diff --git a/packages/demo/src/demo/core/abstract/demo.button_group.js b/packages/demo/src/demo/core/abstract/demo.button_group.js new file mode 100644 index 000000000..ca43fdaa6 --- /dev/null +++ b/packages/demo/src/demo/core/abstract/demo.button_group.js @@ -0,0 +1,87 @@ +import { + VerticalLayout, + ButtonGroup, + VTapeLayout, + Label, + Button, + shortcut, + Widget +} from "@fui/core"; + +@shortcut() +export class ButtonGroupDemo extends Widget { + static xtype = "demo.button_group"; + + props = { baseCls: "demo-func" }; + + render() { + let ref; + + return { + type: VerticalLayout.xtype, + items: [ + { + type: ButtonGroup.xtype, + ref(_ref) { + ref = _ref; + }, + chooseType: ButtonGroup.CHOOSE_TYPE_NONE, + layouts: [ + { + type: VerticalLayout.xtype, + items: [ + { + type: VTapeLayout.xtype, + height: 200 + } + ] + } + ], + items: [ + { + el: { + type: Label.xtype, + text: "button_group是一类具有相同属性或相似属性的抽象, 本案例实现的是布局的嵌套(vertical布局下内嵌center_adapt布局)" + }, + height: 150 + }, + { + el: { + type: Button.xtype, + text: "1" + } + } + ] + }, + { + type: Button.xtype, + text: "populate", + handler() { + ref.populate([ + { + el: { + type: Label.xtype, + text: "1" + }, + height: 50 + }, + { + el: { + type: Button.xtype, + text: "2" + }, + height: 50 + }, + { + el: { + type: Label.xtype, + text: "3" + } + } + ]); + } + } + ] + }; + } +} diff --git a/packages/demo/src/demo/core/abstract/demo.button_tree.js b/packages/demo/src/demo/core/abstract/demo.button_tree.js new file mode 100644 index 000000000..5411f68ea --- /dev/null +++ b/packages/demo/src/demo/core/abstract/demo.button_tree.js @@ -0,0 +1,44 @@ +import { + ButtonTree, + VerticalLayout, + CenterAdaptLayout, + Label, + Button, + shortcut, + Widget, + ButtonGroup +} from "@fui/core"; + +@shortcut() +export class ButtonTreeDemo extends Widget { + static xtype = "demo.button_tree"; + + props = { baseCls: "demo-func" }; + + render() { + return { + type: ButtonTree.xtype, + chooseType: ButtonGroup.CHOOSE_TYPE_MULTI, + layouts: [ + { + type: VerticalLayout.xtype + }, + { + type: CenterAdaptLayout.xtype + } + ], + items: [ + { + type: Label.xtype, + text: "0", + value: 0 + }, + { + type: Button.xtype, + text: "1", + value: 1 + } + ] + }; + } +} diff --git a/packages/demo/src/demo/core/abstract/demo.collection_view.js b/packages/demo/src/demo/core/abstract/demo.collection_view.js new file mode 100644 index 000000000..85d34f0dc --- /dev/null +++ b/packages/demo/src/demo/core/abstract/demo.collection_view.js @@ -0,0 +1,53 @@ +import { + Label, + CollectionView, + AbsoluteLayout, + shortcut, + Widget, + createWidget +} from "@fui/core"; + +@shortcut() +export class CollectionViewDemo extends Widget { + static xtype = "demo.collection_view"; + + props = { baseCls: "demo-func" }; + + render() { + const items = []; + const cellCount = 100; + for (let i = 0; i < cellCount; i++) { + items[i] = { + type: Label.xtype, + text: i + }; + } + const grid = createWidget({ + type: CollectionView.xtype, + width: 400, + height: 300, + items, + cellSizeAndPositionGetter(index) { + return { + x: (index % 10) * 50, + y: Math.floor(index / 10) * 50, + width: 50, + height: 50 + }; + } + }); + createWidget({ + type: AbsoluteLayout.xtype, + element: this, + items: [ + { + el: grid, + left: 10, + right: 10, + top: 10, + bottom: 10 + } + ] + }); + } +} diff --git a/packages/demo/src/demo/core/abstract/demo.custom_tree.js b/packages/demo/src/demo/core/abstract/demo.custom_tree.js new file mode 100644 index 000000000..6a6c2f244 --- /dev/null +++ b/packages/demo/src/demo/core/abstract/demo.custom_tree.js @@ -0,0 +1,408 @@ +import { + PlusGroupNode, + SingleSelectItem, + CustomTree, + ButtonTree, + VerticalLayout, + Loader, + GridLayout, + VTapeLayout, + CenterLayout, + TextButton, + Label, + shortcut, + Widget, + createWidget, + deepClone, + Msg +} from "@fui/core"; + +@shortcut() +export class CustomTreeDemo extends Widget { + static xtype = "demo.custom_tree"; + + props = { baseCls: "demo-func" }; + + _createDefaultTree() { + const TREEITEMS = [ + { + id: -1, + pId: -2, + value: "根目录", + open: true, + type: PlusGroupNode.xtype, + height: 25 + }, + { + id: 1, + pId: -1, + value: "第一级目录1", + type: PlusGroupNode.xtype, + height: 25 + }, + { + id: 11, + pId: 1, + value: "第二级文件1", + type: SingleSelectItem.xtype, + height: 25 + }, + { + id: 12, + pId: 1, + value: "第二级目录2", + type: PlusGroupNode.xtype, + height: 25 + }, + { + id: 121, + pId: 12, + value: "第三级目录1", + type: PlusGroupNode.xtype, + height: 25 + }, + { + id: 122, + pId: 12, + value: "第三级文件1", + type: SingleSelectItem.xtype, + height: 25 + }, + { + id: 1211, + pId: 121, + value: "第四级目录1", + type: PlusGroupNode.xtype, + height: 25 + }, + { + id: 12111, + pId: 1211, + value: "第五级文件1", + type: SingleSelectItem.xtype, + height: 25 + }, + { + id: 2, + pId: -1, + value: "第一级目录2", + type: PlusGroupNode.xtype, + height: 25 + }, + { + id: 21, + pId: 2, + value: "第二级目录3", + type: PlusGroupNode.xtype, + height: 25 + }, + { + id: 22, + pId: 2, + value: "第二级文件2", + type: SingleSelectItem.xtype, + height: 25 + }, + { + id: 211, + pId: 21, + value: "第三级目录2", + type: PlusGroupNode.xtype, + height: 25 + }, + { + id: 212, + pId: 21, + value: "第三级文件2", + type: SingleSelectItem.xtype, + height: 25 + }, + { + id: 2111, + pId: 211, + value: "第四级文件1", + type: SingleSelectItem.xtype, + height: 25 + } + ]; + this.tree = createWidget({ + type: CustomTree.xtype, + el: { + type: ButtonTree.xtype, + chooseType: 0, + layouts: [ + { + type: VerticalLayout.xtype, + hgap: 30 + } + ] + }, + items: deepClone(TREEITEMS) + }); + + return this.tree; + } + + _createAsyncTree() { + this.asyncTree = createWidget({ + type: CustomTree.xtype, + itemsCreator(op, callback) { + if (!op.node) { + // 根节点 + callback([ + { + id: 1, + pId: 0, + type: PlusGroupNode.xtype, + text: "test1", + value: 1, + height: 25, + isParent: true + }, + { + id: 2, + pId: 0, + type: PlusGroupNode.xtype, + text: "test2", + value: 1, + isParent: true, + open: true, + height: 25 + } + ]); + } else { + if (op.node.id == 1) { + callback([ + { + id: 11, + pId: 1, + type: PlusGroupNode.xtype, + text: "test11", + value: 11, + height: 25, + isParent: true + }, + { + id: 12, + pId: 1, + type: SingleSelectItem.xtype, + text: "test12", + value: 12, + height: 35 + }, + { + id: 13, + pId: 1, + type: SingleSelectItem.xtype, + text: "test13", + value: 13, + height: 35 + }, + { + id: 14, + pId: 1, + type: SingleSelectItem.xtype, + text: "test14", + value: 14, + height: 35 + }, + { + id: 15, + pId: 1, + type: SingleSelectItem.xtype, + text: "test15", + value: 15, + height: 35 + }, + { + id: 16, + pId: 1, + type: SingleSelectItem.xtype, + text: "test16", + value: 16, + height: 35 + }, + { + id: 17, + pId: 1, + type: SingleSelectItem.xtype, + text: "test17", + value: 17, + height: 35 + } + ]); + } else if (op.node.id == 2) { + callback([ + { + id: 21, + pId: 2, + type: SingleSelectItem.xtype, + text: "test21", + value: 21, + height: 35 + }, + { + id: 22, + pId: 2, + type: SingleSelectItem.xtype, + text: "test22", + value: 22, + height: 35 + } + ]); + } else if (op.node.id == 11) { + callback([ + { + id: 111, + pId: 11, + type: SingleSelectItem.xtype, + text: "test111", + value: 111, + height: 35 + } + ]); + } + } + }, + el: { + type: Loader.xtype, + next: false, + el: { + type: ButtonTree.xtype, + chooseType: 0, + layouts: [ + { + type: VerticalLayout.xtype, + hgap: 30, + vgap: 0 + } + ] + } + } + }); + + return this.asyncTree; + } + + render() { + const self = this; + createWidget({ + type: GridLayout.xtype, + columns: 2, + rows: 1, + element: this, + items: [ + { + column: 0, + row: 0, + el: { + type: VTapeLayout.xtype, + items: [ + { + el: this._createDefaultTree() + }, + { + el: { + type: CenterLayout.xtype, + hgap: 10, + items: [ + { + type: TextButton.xtype, + cls: "mvc-button layout-bg2", + text: "getValue", + height: 30, + handler() { + Msg.alert( + "", + JSON.stringify( + self.tree.getValue() + ) + ); + } + }, + { + type: TextButton.xtype, + cls: "mvc-button layout-bg2", + text: "getNodeByValue(第一级目录1)", + height: 30, + handler() { + Msg.alert( + "", + `节点名称为: ${self.tree + .getNodeByValue( + "第一级目录1" + ) + .getValue()}` + ); + } + } + ] + }, + height: 30 + } + ] + } + }, + { + column: 1, + row: 0, + el: { + type: VTapeLayout.xtype, + items: [ + { + type: Label.xtype, + text: "异步加载数据", + height: 30 + }, + { + el: this._createAsyncTree() + }, + { + el: { + type: CenterLayout.xtype, + hgap: 10, + items: [ + { + type: TextButton.xtype, + cls: "mvc-button layout-bg2", + text: "getValue", + height: 30, + handler() { + Msg.alert( + "", + JSON.stringify( + self.asyncTree.getValue() + ) + ); + } + }, + { + type: TextButton.xtype, + cls: "mvc-button layout-bg2", + text: "getNodeById(11)", + height: 30, + handler() { + Msg.alert( + "", + `节点名称为: ${ + self.asyncTree.getNodeById( + 11 + ) && + self.asyncTree + .getNodeById(11) + .getText() + }` + ); + } + } + ] + }, + height: 30 + } + ] + } + } + ] + }); + } +} diff --git a/packages/demo/src/demo/core/abstract/demo.grid_view.js b/packages/demo/src/demo/core/abstract/demo.grid_view.js new file mode 100644 index 000000000..505a23c33 --- /dev/null +++ b/packages/demo/src/demo/core/abstract/demo.grid_view.js @@ -0,0 +1,70 @@ +import { + Label, + GridView, + AbsoluteLayout, + GridLayout, + shortcut, + Widget, + createWidget +} from "@fui/core"; + +@shortcut() +export class GridViewDemo extends Widget { + static xtype = "demo.grid_view"; + + props = { baseCls: "demo-func" }; + + render() { + const items = []; + const rowCount = 10000, + columnCount = 100; + for (let i = 0; i < rowCount; i++) { + items[i] = []; + for (let j = 0; j < columnCount; j++) { + items[i][j] = { + type: Label.xtype, + text: `${i}-${j}` + }; + } + } + const grid = createWidget({ + type: GridView.xtype, + width: 400, + height: 300, + estimatedRowSize: 30, + estimatedColumnSize: 100, + items, + scrollTop: 100, + rowHeightGetter() { + return 30; + }, + columnWidthGetter() { + return 100; + } + }); + createWidget({ + type: AbsoluteLayout.xtype, + element: this, + items: [ + { + el: { + type: GridLayout.xtype, + columns: 1, + rows: 1, + items: [ + { + column: 0, + row: 0, + el: grid + } + ] + }, + left: 10, + right: 10, + top: 10, + bottom: 10 + } + ] + }); + } +} diff --git a/packages/demo/src/demo/core/abstract/demo.list_view.js b/packages/demo/src/demo/core/abstract/demo.list_view.js new file mode 100644 index 000000000..39f5e1c10 --- /dev/null +++ b/packages/demo/src/demo/core/abstract/demo.list_view.js @@ -0,0 +1,26 @@ +import { ListView, FloatLeftLayout, Label, shortcut, Widget, map, extend } from '@fui/core'; +import { CONSTANTS } from '@/config/constant'; + +@shortcut() +export class ListViewDemo extends Widget { + static xtype = 'demo.list_view'; + + props = { baseCls: 'demo-func' }; + + render() { + return { + type: ListView.xtype, + el: { + type: FloatLeftLayout.xtype, + }, + items: map(CONSTANTS.ITEMS, (i, item) => + extend({}, item, { + type: Label.xtype, + width: 200, + height: 200, + text: `${i + 1}.${item.text}`, + }) + ), + }; + } +} diff --git a/packages/demo/src/demo/core/abstract/demo.virtual_group.js b/packages/demo/src/demo/core/abstract/demo.virtual_group.js new file mode 100644 index 000000000..92131d284 --- /dev/null +++ b/packages/demo/src/demo/core/abstract/demo.virtual_group.js @@ -0,0 +1,98 @@ +import { + VerticalLayout, + Label, + ButtonGroup, + Button, + VirtualGroup, + shortcut, + Widget, + map, + range, + deepClone +} from "@fui/core"; + +@shortcut() +export class VirtualGroupDemo extends Widget { + static xtype = "demo.virtual_group"; + + props = { baseCls: "demo-func" }; + + _createItems() { + const items = map(range(1000), (i) => { + return { + type: "demo.virtual_group_item", + value: i, + key: i + 1 + }; + }); + + return items; + } + + render() { + const self = this; + const buttonGroupItems = self._createItems(); + const virtualGroupItems = self._createItems(); + + return { + type: VerticalLayout.xtype, + vgap: 20, + items: [ + { + type: Label.xtype, + cls: "layout-bg5", + height: 50, + text: "共1000个元素,演示button_group和virtual_group每次删除第一个元素,打开控制台看输出" + }, + { + type: ButtonGroup.xtype, + width: 500, + height: 300, + ref() { + self.buttonGroup = this; + }, + chooseType: ButtonGroup.CHOOSE_TYPE_MULTI, + layouts: [ + { + type: VerticalLayout.xtype + } + ], + items: this._createItems() + }, + { + type: Button.xtype, + text: "演示button_group的刷新", + handler() { + buttonGroupItems.shift(); + self.buttonGroup.populate(deepClone(buttonGroupItems)); + } + }, + { + type: VirtualGroup.xtype, + width: 500, + height: 300, + ref() { + self.virtualGroup = this; + }, + chooseType: ButtonGroup.CHOOSE_TYPE_MULTI, + layouts: [ + { + type: VerticalLayout.xtype + } + ], + items: this._createItems() + }, + { + type: Button.xtype, + text: "演示virtual_group的刷新", + handler() { + virtualGroupItems.shift(); + self.virtualGroup.populate( + deepClone(virtualGroupItems) + ); + } + } + ] + }; + } +} diff --git a/packages/demo/src/demo/core/abstract/demo.virtual_group_item.js b/packages/demo/src/demo/core/abstract/demo.virtual_group_item.js new file mode 100644 index 000000000..4a42f08c6 --- /dev/null +++ b/packages/demo/src/demo/core/abstract/demo.virtual_group_item.js @@ -0,0 +1,47 @@ +import { Label, shortcut, Widget, UUID } from "@fui/core"; + +@shortcut() +export class VirtualGroupItemDemo extends Widget { + static xtype = "demo.virtual_group_item"; + + props = { baseCls: "demo-item", height: 30 }; + + render() { + const self = this, + o = this.options; + + return { + type: Label.xtype, + ref() { + self.label = this; + }, + height: this.options.height, + text: `key:${o.key},随机数${UUID()}` + }; + } + + shouldUpdate(nextProps) { + const o = this.options; + + return ( + o.type !== nextProps.type || + o.key !== nextProps.key || + o.value !== nextProps.value + ); + } + + update(item) { + this.label.setText(item.value); + console.log("更新了一项"); + + return true; // 返回是不是更新成功 + } + + created() { + console.log("创建了一项"); + } + + destroyed() { + console.log("删除了一项"); + } +} diff --git a/packages/demo/src/demo/core/abstract/demo.virtual_list.js b/packages/demo/src/demo/core/abstract/demo.virtual_list.js new file mode 100644 index 000000000..b6fa4a624 --- /dev/null +++ b/packages/demo/src/demo/core/abstract/demo.virtual_list.js @@ -0,0 +1,22 @@ +import { VirtualList, Label, shortcut, Widget, map, extend } from '@fui/core'; +import { CONSTANTS } from '@/config/constant'; + +@shortcut() +export class VirtualListDemo extends Widget { + static xtype = 'demo.virtual_list'; + + props = { baseCls: 'demo-func' }; + + render() { + return { + type: VirtualList.xtype, + items: map(CONSTANTS.ITEMS, (i, item) => + extend({}, item, { + type: Label.xtype, + height: 30, + text: `${i + 1}.${item.text}`, + }) + ), + }; + } +} diff --git a/packages/demo/src/demo/core/abstract/index.js b/packages/demo/src/demo/core/abstract/index.js new file mode 100644 index 000000000..8d976634f --- /dev/null +++ b/packages/demo/src/demo/core/abstract/index.js @@ -0,0 +1,16 @@ +export const meta = { + title: "抽象控件 core", + rank: 9999 +}; + +export * as combination from "./combination"; + +export * from "./demo.button_group"; +export * from "./demo.button_tree"; +export * from "./demo.collection_view"; +export * from "./demo.custom_tree"; +export * from "./demo.grid_view"; +export * from "./demo.list_view"; +export * from "./demo.virtual_group"; +export * from "./demo.virtual_group_item"; +export * from "./demo.virtual_list"; diff --git a/packages/demo/src/demo/core/index.js b/packages/demo/src/demo/core/index.js new file mode 100644 index 000000000..0136c7f8e --- /dev/null +++ b/packages/demo/src/demo/core/index.js @@ -0,0 +1,8 @@ +export const meta = { + title: "核心控件 core", + rank: 9999 +}; + +export * as layout from "./layout"; +export * as abstract from "./abstract"; +export * as popup from "./popup"; diff --git a/packages/demo/src/demo/core/layout/demo.absolute.js b/packages/demo/src/demo/core/layout/demo.absolute.js new file mode 100644 index 000000000..3df7b8b4c --- /dev/null +++ b/packages/demo/src/demo/core/layout/demo.absolute.js @@ -0,0 +1,30 @@ + +import { AbsoluteLayout, Label, shortcut, Widget } from "@fui/core" + + +@shortcut() +export class AbsoluteLayoutDemo extends Widget { + static xtype = "demo.absolute"; + + props = { baseCls: "demo-absolute" }; + + render() { + return { + type: AbsoluteLayout.xtype, + items: [ + { + el: { + type: Label.xtype, + text: "绝对布局", + cls: "layout-bg1", + width: 300, + height: 200, + }, + left: 100, + top: 100, + } + ], + }; + } +} + diff --git a/packages/demo/src/demo/core/layout/demo.border.js b/packages/demo/src/demo/core/layout/demo.border.js new file mode 100644 index 000000000..cff86a08b --- /dev/null +++ b/packages/demo/src/demo/core/layout/demo.border.js @@ -0,0 +1,105 @@ + +import { Label, CenterLayout, BorderLayout, shortcut, Widget, createWidget } from "@fui/core" + + +@shortcut() +export class BorderLayoutDemo extends Widget { + static xtype = "demo.border"; + + props = { baseCls: "demo-border" }; + + _createNorth() { + return createWidget({ + type: Label.xtype, + text: "North", + cls: "layout-bg1", + height: 30, + }); + } + + _createWest() { + return createWidget({ + type: CenterLayout.xtype, + cls: "layout-bg2", + items: [ + { + type: Label.xtype, + text: "West", + whiteSpace: "normal", + } + ], + }); + } + + _createCenter() { + return createWidget({ + type: CenterLayout.xtype, + cls: "layout-bg3", + items: [ + { + type: Label.xtype, + text: "Center", + whiteSpace: "normal", + } + ], + }); + } + + _createEast() { + return createWidget({ + type: CenterLayout.xtype, + cls: "layout-bg5", + items: [ + { + type: Label.xtype, + text: "East", + whiteSpace: "normal", + } + ], + }); + } + + _createSouth() { + return createWidget({ + type: Label.xtype, + text: "South", + cls: "layout-bg6", + height: 50, + }); + } + + render() { + return { + type: BorderLayout.xtype, + cls: "", + items: { + north: { + el: this._createNorth(), + height: 30, + top: 20, + left: 20, + right: 20, + }, + south: { + el: this._createSouth(), + height: 50, + bottom: 20, + left: 20, + right: 20, + }, + west: { + el: this._createWest(), + width: 200, + left: 20, + }, + east: { + el: this._createEast(), + width: 300, + right: 20, + }, + center: this._createCenter(), + }, + }; + } +} + diff --git a/packages/demo/src/demo/core/layout/demo.center_adapt.js b/packages/demo/src/demo/core/layout/demo.center_adapt.js new file mode 100644 index 000000000..5b39be5e3 --- /dev/null +++ b/packages/demo/src/demo/core/layout/demo.center_adapt.js @@ -0,0 +1,26 @@ + +import { CenterAdaptLayout, Label, shortcut, Widget } from "@fui/core" + + +@shortcut() +export class CenterAdaptDemo extends Widget { + static xtype = "demo.center_adapt"; + + props = { baseCls: "demo-absolute" }; + + render() { + return { + type: CenterAdaptLayout.xtype, + items: [ + { + type: Label.xtype, + text: "水平垂直居中", + width: 300, + height: 200, + cls: "layout-bg1", + } + ], + }; + } +} + diff --git a/packages/demo/src/demo/core/layout/demo.float_center.js b/packages/demo/src/demo/core/layout/demo.float_center.js new file mode 100644 index 000000000..dde4c36e4 --- /dev/null +++ b/packages/demo/src/demo/core/layout/demo.float_center.js @@ -0,0 +1,33 @@ + +import { FloatCenterLayout, Label, shortcut, Widget } from "@fui/core" + + +@shortcut() +export class FloatCenterLayoutDemo extends Widget { + static xtype = "demo.float_center"; + + props = { baseCls: "demo-float-center" }; + + render() { + return { + type: FloatCenterLayout.xtype, + items: [ + { + type: Label.xtype, + text: "floatCenter与center的不同在于,它可以控制最小宽度和最大宽度", + cls: "layout-bg1", + whiteSpace: "normal", + }, + { + type: Label.xtype, + text: "浮动式的中间布局", + cls: "layout-bg2", + whiteSpace: "normal", + } + ], + hgap: 20, + vgap: 20, + }; + } +} + diff --git a/packages/demo/src/demo/core/layout/demo.flow.js b/packages/demo/src/demo/core/layout/demo.flow.js new file mode 100644 index 000000000..31e897428 --- /dev/null +++ b/packages/demo/src/demo/core/layout/demo.flow.js @@ -0,0 +1,92 @@ + +import { CenterAdaptLayout, FloatLeftLayout, Label, FloatRightLayout, shortcut, Widget } from "@fui/core" + + +@shortcut() +export class FlowLayoutDemo extends Widget { + static xtype = "demo.flow"; + + props = { baseCls: "demo-flow" }; + + render() { + return { + type: CenterAdaptLayout.xtype, + items: [ + { + type: FloatLeftLayout.xtype, + items: [ + { + type: Label.xtype, + height: 30, + text: "Left-1", + cls: "layout-bg1", + }, + { + type: Label.xtype, + height: 30, + text: "Left-2", + cls: "layout-bg2", + }, + { + type: Label.xtype, + height: 30, + text: "Left-3", + cls: "layout-bg3", + }, + { + type: Label.xtype, + height: 30, + text: "Left-4", + cls: "layout-bg4", + }, + { + type: Label.xtype, + height: 30, + text: "Left-5", + cls: "layout-bg5", + } + ], + hgap: 20, + }, + { + type: FloatRightLayout.xtype, + hgap: 20, + items: [ + { + type: Label.xtype, + height: 30, + text: "Right-1", + cls: "layout-bg1", + }, + { + type: Label.xtype, + height: 30, + text: "Right-2", + cls: "layout-bg2", + }, + { + type: Label.xtype, + height: 30, + text: "Right-3", + cls: "layout-bg3", + }, + { + type: Label.xtype, + height: 30, + text: "Right-4", + cls: "layout-bg4", + }, + { + type: Label.xtype, + height: 30, + text: "Right-5", + cls: "layout-bg5", + } + ], + vgap: 20, + } + ], + }; + } +} + diff --git a/packages/demo/src/demo/core/layout/demo.grid.js b/packages/demo/src/demo/core/layout/demo.grid.js new file mode 100644 index 000000000..f84f1607f --- /dev/null +++ b/packages/demo/src/demo/core/layout/demo.grid.js @@ -0,0 +1,156 @@ + +import { GridLayout, Label, shortcut, Widget } from "@fui/core" + + +@shortcut() +export class GridLayoutDemo extends Widget { + static xtype = "demo.grid"; + + props = { baseCls: "demo-grid" }; + + render() { + return { + type: GridLayout.xtype, + columns: 5, + rows: 3, + items: [ + { + column: 0, + row: 0, + el: { + type: Label.xtype, + text: "column-0, row-0", + cls: "layout-bg1", + }, + }, + { + column: 1, + row: 0, + el: { + type: Label.xtype, + text: "column-1, row-0", + cls: "layout-bg2", + }, + }, + { + column: 2, + row: 0, + el: { + type: Label.xtype, + text: "column-2, row-0", + cls: "layout-bg6", + }, + }, + { + column: 3, + row: 0, + el: { + type: Label.xtype, + text: "column-3, row-0", + cls: "layout-bg3", + }, + }, + { + column: 4, + row: 0, + el: { + type: Label.xtype, + text: "column-4, row-0", + cls: "layout-bg4", + }, + }, + { + column: 0, + row: 1, + el: { + type: Label.xtype, + text: "column-0, row-1", + cls: "layout-bg5", + }, + }, + { + column: 1, + row: 1, + el: { + type: Label.xtype, + text: "column-1, row-1", + cls: "layout-bg6", + }, + }, + { + column: 2, + row: 1, + el: { + type: Label.xtype, + text: "column-2, row-1", + cls: "layout-bg7", + }, + }, + { + column: 3, + row: 1, + el: { + type: Label.xtype, + text: "column-3, row-1", + cls: "layout-bg1", + }, + }, + { + column: 4, + row: 1, + el: { + type: Label.xtype, + text: "column-4, row-1", + cls: "layout-bg3", + }, + }, + { + column: 0, + row: 2, + el: { + type: Label.xtype, + text: "column-0, row-2", + cls: "layout-bg2", + }, + }, + { + column: 1, + row: 2, + el: { + type: Label.xtype, + text: "column-1, row-2", + cls: "layout-bg3", + }, + }, + { + column: 2, + row: 2, + el: { + type: Label.xtype, + text: "column-2, row-2", + cls: "layout-bg4", + }, + }, + { + column: 3, + row: 2, + el: { + type: Label.xtype, + text: "column-3, row-2", + cls: "layout-bg5", + }, + }, + { + column: 4, + row: 2, + el: { + type: Label.xtype, + text: "column-4, row-2", + cls: "layout-bg6", + }, + } + ], + }; + } +} + diff --git a/packages/demo/src/demo/core/layout/demo.horizontal.js b/packages/demo/src/demo/core/layout/demo.horizontal.js new file mode 100644 index 000000000..8e76a19bc --- /dev/null +++ b/packages/demo/src/demo/core/layout/demo.horizontal.js @@ -0,0 +1,156 @@ + +import { VerticalLayout, HorizontalLayout, Label, Layout, CenterAdaptLayout, shortcut, Widget, VerticalAlign, HorizontalAlign } from "@fui/core" + + + +@shortcut() +export class HorizontalDemo extends Widget { + static xtype = "demo.horizontal"; + + props = { baseCls: "demo-horizontal" }; + + render() { + return { + type: VerticalLayout.xtype, + vgap: 10, + items: [ + { + type: HorizontalLayout.xtype, + height: 150, + hgap: 10, + items: [ + { + type: Label.xtype, + whiteSpace: "normal", + text: "因为大多数场景下都需要垂直居中,所以这个布局一般会被vertical_adapt布局设置scrollx=true取代", + cls: "layout-bg3", + width: 500, + height: 50, + }, + { + type: Label.xtype, + text: "水平布局", + cls: "layout-bg4", + width: 300, + height: 30, + }, + { + type: Label.xtype, + text: "水平布局", + cls: "layout-bg5", + width: 300, + height: 30, + }, + { + type: Label.xtype, + text: "水平布局", + cls: "layout-bg6", + width: 300, + height: 30, + } + ], + }, + { + type: Layout.xtype, + height: 1, + cls: "bi-border-bottom bi-high-light-border", + }, + { + type: HorizontalLayout.xtype, + height: 150, + verticalAlign: VerticalAlign.Middle, + horizontalAlign: HorizontalAlign.Left, + vgap: 10, + items: [ + { + type: Label.xtype, + text: "以horizontal实现的vertical_adapt垂直居中", + cls: "layout-bg1", + width: 300, + height: 30, + }, + { + type: Label.xtype, + text: "以horizontal实现的vertical_adapt垂直居中", + cls: "layout-bg2", + width: 300, + height: 30, + } + ], + }, + { + type: Layout.xtype, + height: 1, + cls: "bi-border-bottom bi-high-light-border", + }, + { + type: HorizontalLayout.xtype, + height: 150, + verticalAlign: VerticalAlign.Top, + horizontalAlign: HorizontalAlign.Center, + items: [ + { + type: Label.xtype, + text: "以horizontal代替horizontal_adapt实现的水平居中(单元素)", + cls: "layout-bg1", + width: 300, + height: 30, + } + ], + }, + { + type: Layout.xtype, + height: 1, + cls: "bi-border-bottom bi-high-light-border", + }, + { + type: HorizontalLayout.xtype, + height: 150, + verticalAlign: VerticalAlign.Top, + horizontalAlign: HorizontalAlign.Center, + columnSize: [300, "fill"], + items: [ + { + type: Label.xtype, + text: "以horizontal代替horizontal_adapt实现的用于水平适应布局", + cls: "layout-bg1", + height: 30, + }, + { + type: Label.xtype, + text: "以horizontal代替horizontal_adapt实现的水平自适应列", + cls: "layout-bg2", + height: 30, + } + ], + }, + { + type: Layout.xtype, + height: 1, + cls: "bi-border-bottom bi-high-light-border", + }, + { + type: CenterAdaptLayout.xtype, + height: 150, + verticalAlign: VerticalAlign.Middle, + horizontalAlign: HorizontalAlign.Center, + items: [ + { + type: Label.xtype, + text: "以horizontal代替center_adapt实现的水平垂直居中", + width: 300, + height: 100, + cls: "layout-bg1", + } + ], + }, + { + type: Layout.xtype, + height: 1, + cls: "bi-border-bottom bi-high-light-border", + } + ], + }; + } +} + diff --git a/packages/demo/src/demo/core/layout/demo.horizontal_adapt.js b/packages/demo/src/demo/core/layout/demo.horizontal_adapt.js new file mode 100644 index 000000000..d89efab6c --- /dev/null +++ b/packages/demo/src/demo/core/layout/demo.horizontal_adapt.js @@ -0,0 +1,67 @@ + +import { HorizontalAdaptLayout, Label, GridLayout, shortcut, Widget, createWidget } from "@fui/core" + + +@shortcut() +export class HorizontalAdaptDemo extends Widget { + static xtype = "demo.horizontal_adapt"; + + props = { baseCls: "demo-horizontal-adapt" }; + + _createLayout() { + return createWidget({ + type: HorizontalAdaptLayout.xtype, + items: [ + { + type: Label.xtype, + text: "例子1:可用做水平居中", + cls: "layout-bg1", + width: 300, + height: 30, + } + ], + }); + } + + _createAdaptLayout() { + return createWidget({ + type: HorizontalAdaptLayout.xtype, + columnSize: [300, "fill"], + items: [ + { + type: Label.xtype, + text: "例子2:用于水平适应布局", + cls: "layout-bg1", + height: 30, + }, + { + type: Label.xtype, + text: "水平自适应列", + cls: "layout-bg2", + height: 30, + } + ], + }); + } + + render() { + return { + type: GridLayout.xtype, + columns: 1, + rows: 2, + items: [ + { + column: 0, + row: 0, + el: this._createLayout(), + }, + { + column: 0, + row: 1, + el: this._createAdaptLayout(), + } + ], + }; + } +} + diff --git a/packages/demo/src/demo/core/layout/demo.horizontal_auto.js b/packages/demo/src/demo/core/layout/demo.horizontal_auto.js new file mode 100644 index 000000000..572b9cf6b --- /dev/null +++ b/packages/demo/src/demo/core/layout/demo.horizontal_auto.js @@ -0,0 +1,48 @@ + +import { HorizontalAutoLayout, Label, GridLayout, shortcut, Widget, createWidget } from "@fui/core" + + +@shortcut() +export class HorizontalAutoDemo extends Widget { + static xtype = "demo.horizontal_auto"; + + props = { baseCls: "demo-horizontal-auto" }; + + _createLayout() { + return createWidget({ + type: HorizontalAutoLayout.xtype, + items: [ + { + type: Label.xtype, + text: "水平居中", + cls: "layout-bg1", + width: 300, + height: 30, + }, + { + type: Label.xtype, + text: "水平居中优先使用该布局", + cls: "layout-bg2", + width: 300, + height: 30, + } + ], + }); + } + + render() { + return { + type: GridLayout.xtype, + columns: 1, + rows: 2, + items: [ + { + column: 0, + row: 0, + el: this._createLayout(), + } + ], + }; + } +} + diff --git a/packages/demo/src/demo/core/layout/demo.horizontal_float.js b/packages/demo/src/demo/core/layout/demo.horizontal_float.js new file mode 100644 index 000000000..5cf44e22d --- /dev/null +++ b/packages/demo/src/demo/core/layout/demo.horizontal_float.js @@ -0,0 +1,25 @@ + +import { FloatHorizontalLayout, Label, shortcut, Widget } from "@fui/core" + + +@shortcut() +export class HorizontalFloatDemo extends Widget { + static xtype = "demo.horizontal_float"; + + props = { baseCls: "demo-horizontal-float" }; + + render() { + return { + type: FloatHorizontalLayout.xtype, + items: [ + { + type: Label.xtype, + text: "浮动式水平居中布局方案,用于宽度未知的情况", + cls: "layout-bg1", + height: 30, + } + ], + }; + } +} + diff --git a/packages/demo/src/demo/core/layout/demo.htape.js b/packages/demo/src/demo/core/layout/demo.htape.js new file mode 100644 index 000000000..52c1a92d1 --- /dev/null +++ b/packages/demo/src/demo/core/layout/demo.htape.js @@ -0,0 +1,43 @@ + +import { HTapeLayout, Label, shortcut, Widget } from "@fui/core" + + +@shortcut() +export class HtapeLayoutDemo extends Widget { + static xtype = "demo.htape"; + + props = { baseCls: "demo-htape" }; + + render() { + return { + type: HTapeLayout.xtype, + items: [ + { + width: 100, + el: { + type: Label.xtype, + text: "1", + cls: "bi-background", + }, + }, + { + width: 200, + el: { + type: Label.xtype, + text: "2", + cls: "layout-bg2", + }, + }, + { + width: "fill", + el: { + type: Label.xtype, + text: "3", + cls: "layout-bg3", + }, + } + ], + }; + } +} + diff --git a/packages/demo/src/demo/core/layout/demo.left_right_vertical_adapt.js b/packages/demo/src/demo/core/layout/demo.left_right_vertical_adapt.js new file mode 100644 index 000000000..438236051 --- /dev/null +++ b/packages/demo/src/demo/core/layout/demo.left_right_vertical_adapt.js @@ -0,0 +1,53 @@ + +import { LeftRightVerticalAdaptLayout, Label, shortcut, Widget } from "@fui/core" + + +@shortcut() +export class LeftRightVerticalAdaptLayoutDemo extends Widget { + static xtype = "demo.left_right_vertical_adapt"; + + props = { baseCls: "demo-left-right-vertical-adapt" }; + + render() { + return { + type: LeftRightVerticalAdaptLayout.xtype, + lhgap: 10, + rhgap: 30, + items: { + left: [ + { + type: Label.xtype, + text: "左边的垂直居中", + cls: "layout-bg1", + width: 100, + height: 30, + }, + { + type: Label.xtype, + text: "左边的垂直居中", + cls: "layout-bg2", + width: 100, + height: 30, + } + ], + right: [ + { + type: Label.xtype, + text: "右边的垂直居中", + cls: "layout-bg1", + width: 100, + height: 30, + }, + { + type: Label.xtype, + text: "右边的垂直居中", + cls: "layout-bg2", + width: 100, + height: 30, + } + ], + }, + }; + } +} + diff --git a/packages/demo/src/demo/core/layout/demo.table.js b/packages/demo/src/demo/core/layout/demo.table.js new file mode 100644 index 000000000..e988d4a9e --- /dev/null +++ b/packages/demo/src/demo/core/layout/demo.table.js @@ -0,0 +1,167 @@ + +import { TableLayout, Layout, GridLayout, shortcut, Widget, createItems } from "@fui/core" + + +@shortcut() +export class TableLayoutDemo extends Widget { + static xtype = "demo.table_layout"; + + props = { baseCls: "demo-table-layout" }; + + _createTable1() { + return { + type: TableLayout.xtype, + items: createItems( + [ + [ + { + el: { + cls: "layout-bg1", + }, + }, + { + el: { + cls: "layout-bg2", + }, + }, + { + el: { + cls: "layout-bg3", + }, + } + ], + [ + { + el: { + cls: "layout-bg4", + }, + }, + { + el: { + cls: "layout-bg5", + }, + }, + { + el: { + cls: "layout-bg6", + }, + } + ], + [ + { + el: { + cls: "layout-bg7", + }, + }, + { + el: { + cls: "layout-bg8", + }, + }, + { + el: { + cls: "layout-bg1", + }, + } + ], + [ + { + el: { + cls: "layout-bg2", + }, + }, + { + el: { + cls: "layout-bg3", + }, + }, + { + el: { + cls: "layout-bg4", + }, + } + ], + [ + { + el: { + cls: "layout-bg5", + }, + }, + { + el: { + cls: "layout-bg6", + }, + }, + { + el: { + cls: "layout-bg7", + }, + } + ], + [ + { + el: { + cls: "layout-bg8", + }, + }, + { + el: { + cls: "layout-bg1", + }, + }, + { + el: { + cls: "layout-bg2", + }, + } + ], + [ + { + el: { + cls: "layout-bg6", + }, + }, + { + el: { + cls: "layout-bg7", + }, + }, + { + el: { + cls: "layout-bg8", + }, + } + ] + ], + { + type: Layout.xtype, + } + ), + columnSize: [100, "fill", 200], + rowSize: [10, 30, 50, 70, 90, 110, 130], + hgap: 20, + vgap: 10, + }; + } + + render() { + return { + type: GridLayout.xtype, + columns: 1, + rows: 1, + items: [ + { + column: 0, + row: 0, + el: this._createTable1(), + } + // , { + // column: 0, + // row: 1, + // el: this._createTable2() + // } + ], + }; + } +} + diff --git a/packages/demo/src/demo/core/layout/demo.td.js b/packages/demo/src/demo/core/layout/demo.td.js new file mode 100644 index 000000000..ddd5f70ff --- /dev/null +++ b/packages/demo/src/demo/core/layout/demo.td.js @@ -0,0 +1,76 @@ + +import { VerticalLayout, TdLayout, Label, shortcut, Widget, createItems } from "@fui/core" + + +@shortcut() +export class TdLayoutDemo extends Widget { + static xtype = "demo.td"; + + props = { baseCls: "demo-td" }; + + render() { + return { + type: VerticalLayout.xtype, + items: [ + { + type: TdLayout.xtype, + columnSize: [100, 100, ""], + items: createItems( + [ + [ + { + el: { + type: Label.xtype, + text: "这是一段可以换行的文字,为了使它换行我要多写几个字,但是我又凑不够这么多的字,万般焦急下,只能随便写写", + cls: "layout-bg1", + }, + }, + { + el: { + type: Label.xtype, + text: "这是一段可以换行的文字,为了使它换行我要多写几个字,但是我又凑不够这么多的字,万般焦急下,只能随便写写", + cls: "layout-bg2", + }, + }, + { + el: { + type: Label.xtype, + text: "这是一段可以换行的文字,为了使它换行我要多写几个字,但是我又凑不够这么多的字,万般焦急下,只能随便写写", + cls: "layout-bg3", + }, + } + ], + [ + { + el: { + type: Label.xtype, + text: "这是一段可以换行的文字,为了使它换行我要多写几个字,但是我又凑不够这么多的字,万般焦急下,只能随便写写", + cls: "layout-bg5", + }, + }, + { + el: { + type: Label.xtype, + text: "这是一段可以换行的文字,为了使它换行我要多写几个字,但是我又凑不够这么多的字,万般焦急下,只能随便写写", + cls: "layout-bg6", + }, + }, + { + el: { + type: Label.xtype, + text: "这是一段可以换行的文字,为了使它换行我要多写几个字,但是我又凑不够这么多的字,万般焦急下,只能随便写写", + cls: "layout-bg7", + }, + } + ] + ], + { + whiteSpace: "normal", + } + ), + } + ], + }; + } +} + diff --git a/packages/demo/src/demo/core/layout/demo.vertical.js b/packages/demo/src/demo/core/layout/demo.vertical.js new file mode 100644 index 000000000..263214e1b --- /dev/null +++ b/packages/demo/src/demo/core/layout/demo.vertical.js @@ -0,0 +1,32 @@ + +import { VerticalLayout, Label, shortcut, Widget } from "@fui/core" + + +@shortcut() +export class VerticalLayoutDemo extends Widget { + static xtype = "demo.vertical"; + + props = { baseCls: "demo-vertical" }; + + render() { + return { + type: VerticalLayout.xtype, + vgap: 10, + items: [ + { + type: Label.xtype, + cls: "layout-bg3", + text: "垂直布局", + height: 30, + }, + { + type: Label.xtype, + cls: "layout-bg4", + text: "垂直布局", + height: 30, + } + ], + }; + } +} + diff --git a/packages/demo/src/demo/core/layout/demo.vertical_adapt.js b/packages/demo/src/demo/core/layout/demo.vertical_adapt.js new file mode 100644 index 000000000..a6c825d54 --- /dev/null +++ b/packages/demo/src/demo/core/layout/demo.vertical_adapt.js @@ -0,0 +1,49 @@ + +import { VerticalAdaptLayout, Label, GridLayout, shortcut, Widget, createWidget } from "@fui/core" + + +@shortcut() +export class VerticalAdaptLayoutDemo extends Widget { + static xtype = "demo.vertical_adapt"; + + props = { baseCls: "demo-vertical-adapt" }; + + _createLayout() { + return createWidget({ + type: VerticalAdaptLayout.xtype, + vgap: 10, + items: [ + { + type: Label.xtype, + text: "垂直居中", + cls: "layout-bg1", + width: 300, + height: 30, + }, + { + type: Label.xtype, + text: "垂直居中", + cls: "layout-bg2", + width: 300, + height: 30, + } + ], + }); + } + + render() { + return { + type: GridLayout.xtype, + columns: 2, + rows: 1, + items: [ + { + column: 0, + row: 0, + el: this._createLayout(), + } + ], + }; + } +} + diff --git a/packages/demo/src/demo/core/layout/demo.vtape.js b/packages/demo/src/demo/core/layout/demo.vtape.js new file mode 100644 index 000000000..370c46e60 --- /dev/null +++ b/packages/demo/src/demo/core/layout/demo.vtape.js @@ -0,0 +1,46 @@ + +import { VTapeLayout, Label, shortcut, Widget } from "@fui/core" + + +@shortcut() +export class VtapeLayoutDemo extends Widget { + static xtype = "demo.vtape"; + + props = { baseCls: "demo-vtape" }; + + render() { + return { + type: VTapeLayout.xtype, + vgap: 10, + items: [ + { + height: 100, + el: { + type: Label.xtype, + text: "1", + cls: "layout-bg1", + }, + tgap: 10, + vgap: 10, + }, + { + height: 200, + el: { + type: Label.xtype, + text: "2", + cls: "layout-bg2", + }, + }, + { + height: "fill", + el: { + type: Label.xtype, + text: "3", + cls: "layout-bg3", + }, + } + ], + }; + } +} + diff --git a/packages/demo/src/demo/core/layout/index.js b/packages/demo/src/demo/core/layout/index.js new file mode 100644 index 000000000..151ed390b --- /dev/null +++ b/packages/demo/src/demo/core/layout/index.js @@ -0,0 +1,22 @@ +export const meta = { + title: "布局组件", + rank: 9999 +}; + +export * from "./demo.absolute"; +export * from "./demo.border"; +export * from "./demo.center_adapt"; +export * from "./demo.float_center"; +export * from "./demo.flow"; +export * from "./demo.grid"; +export * from "./demo.horizontal"; +export * from "./demo.horizontal_adapt"; +export * from "./demo.horizontal_auto"; +export * from "./demo.horizontal_float"; +export * from "./demo.htape"; +export * from "./demo.left_right_vertical_adapt"; +export * from "./demo.table"; +export * from "./demo.td"; +export * from "./demo.vertical"; +export * from "./demo.vertical_adapt"; +export * from "./demo.vtape"; diff --git a/packages/demo/src/demo/core/popup/demo.layer.js b/packages/demo/src/demo/core/popup/demo.layer.js new file mode 100644 index 000000000..b0fdc81a4 --- /dev/null +++ b/packages/demo/src/demo/core/popup/demo.layer.js @@ -0,0 +1,81 @@ + +import { VerticalLayout, Button, CenterAdaptLayout, shortcut, Widget, UUID, Layers } from "@fui/core" + + + +@shortcut() +export class LayerDemo extends Widget { + static xtype = "demo.layer"; + + props = { baseCls: "demo-func" }; + + render() { + const self = this, + id1 = UUID(), + id2 = UUID(); + + return { + type: VerticalLayout.xtype, + vgap: 10, + items: [ + { + type: Button.xtype, + text: "create形式创建layer, 遮住当前面板, 返回创建的面板对象", + height: 30, + handler() { + Layers.create(id1, self, { + // 偏移量 + offset: { + left: 10, + right: 10, + top: 10, + bottom: 10, + }, + type: CenterAdaptLayout.xtype, + cls: "bi-card", + items: [ + { + type: Button.xtype, + text: "点击关闭", + handler() { + Layers.hide(id1); + }, + } + ], + }); + Layers.show(id1); + }, + }, + { + type: Button.xtype, + text: "make形式创建layer,可以指定放到哪个面板内,这里指定当前面板(默认放在body下撑满), 返回创建的面板对象", + height: 30, + handler() { + Layers.make(id2, self, { + // 偏移量 + offset: { + left: 10, + right: 10, + top: 10, + bottom: 10, + }, + type: CenterAdaptLayout.xtype, + cls: "bi-card", + items: [ + { + type: Button.xtype, + text: "点击关闭", + handler() { + Layers.remove(id2); + }, + } + ], + }); + Layers.show(id2); + }, + } + ], + }; + } +} + diff --git a/packages/demo/src/demo/core/popup/demo.popover.js b/packages/demo/src/demo/core/popup/demo.popover.js new file mode 100644 index 000000000..394b4863d --- /dev/null +++ b/packages/demo/src/demo/core/popup/demo.popover.js @@ -0,0 +1,222 @@ + +import { VerticalLayout, TextButton, BarPopover, Label, ButtonGroup, shortcut, Widget, UUID, map, range, Popovers } from "@fui/core" + + + +@shortcut() +export class PopoverDemo extends Widget { + static xtype = "demo.popover"; + + props = { baseCls: "demo-func" }; + + render() { + const id = UUID(); + let body; + + return { + type: VerticalLayout.xtype, + vgap: 10, + items: [ + { + type: TextButton.xtype, + text: "点击弹出Popover(normal size & fixed)", + height: 30, + handler() { + Popovers.remove(id); + Popovers.create(id, { + type: BarPopover.xtype, + size: "normal", + header: { + type: Label.xtype, + text: "这个是header", + }, + body: { + type: Label.xtype, + text: "这个是body", + }, + }).open(id); + }, + }, + { + type: TextButton.xtype, + text: "点击弹出Popover(small size & fixed)", + height: 30, + handler() { + Popovers.remove(id); + Popovers.create(id, { + type: BarPopover.xtype, + size: "small", + header: { + type: Label.xtype, + text: "这个是header", + }, + body: { + type: Label.xtype, + text: "这个是body", + }, + }).open(id); + }, + }, + { + type: TextButton.xtype, + text: "点击弹出Popover(big size & fixed)", + height: 30, + handler() { + Popovers.remove(id); + Popovers.create(id, { + type: BarPopover.xtype, + size: "big", + header: { + type: Label.xtype, + text: "这个是header", + }, + body: { + type: Label.xtype, + text: "这个是body", + }, + }).open(id); + }, + }, + { + type: TextButton.xtype, + text: "点击弹出Popover(normal size & adapt body区域高度是300)", + height: 30, + handler() { + Popovers.remove(id); + Popovers.create(id, { + type: BarPopover.xtype, + size: "normal", + logic: { + dynamic: true, + }, + header: { + type: Label.xtype, + text: "这个是header", + }, + body: { + type: VerticalLayout.xtype, + items: [ + { + type: ButtonGroup.xtype, + ref() { + body = this; + }, + items: map(range(0, 10), () => { + return { + type: Label.xtype, + text: "1", + height: 30, + }; + }), + layouts: [ + { + type: VerticalLayout.xtype, + } + ], + } + ], + }, + }).open(id); + }, + }, + { + type: TextButton.xtype, + text: "点击弹出Popover(small size & adapt body区域高度是900)", + height: 30, + handler() { + Popovers.remove(id); + Popovers.create(id, { + type: BarPopover.xtype, + size: "small", + logic: { + dynamic: true, + }, + header: { + type: Label.xtype, + text: "这个是header", + }, + body: { + type: VerticalLayout.xtype, + items: [ + { + type: ButtonGroup.xtype, + ref() { + body = this; + }, + items: map(range(0, 30), () => { + return { + type: Label.xtype, + text: "1", + height: 30, + }; + }), + layouts: [ + { + type: VerticalLayout.xtype, + } + ], + } + ], + }, + }).open(id); + }, + }, + { + type: TextButton.xtype, + text: "点击弹出Popover(custom)", + height: 30, + handler() { + Popovers.remove(id); + Popovers.create(id, { + width: 400, + height: 300, + header: { + type: Label.xtype, + text: "这个是header", + }, + body: { + type: Label.xtype, + text: "这个是body", + }, + footer: { + type: Label.xtype, + text: "这个是footer", + }, + }).open(id); + }, + }, + { + type: TextButton.xtype, + height: 30, + text: "弹出一个高度动态的popover层, 此弹出层指定size为small, 但是高度随内容自适应,自适应支持的最大高度为默认为600px", + handler() { + const id = "弹出层id1"; + Popovers.create(id, { + // String或者是json都行 + header: "弹出层标题", + logic: { + dynamic: true, + maxHeight: 700, + }, + size: "small", + body: { + type: VerticalLayout.xtype, + items: map(range(0, 50), (idx, v) => { + return { + type: Label.xtype, + text: "弹出层内容", + }; + }), + }, + footer: { + type: Label.xtype, + text: "这个是footer", + }, + }).open(id); + }, + } + ], + }; + } +} + diff --git a/packages/demo/src/demo/core/popup/demo.popup_view.js b/packages/demo/src/demo/core/popup/demo.popup_view.js new file mode 100644 index 000000000..69d404bf3 --- /dev/null +++ b/packages/demo/src/demo/core/popup/demo.popup_view.js @@ -0,0 +1,50 @@ + +import { AbsoluteLayout, Combo, TextButton, PopupView, ButtonGroup, VerticalLayout, MultiSelectItem, shortcut, Widget, createItems, deepClone } from "@fui/core" +import { CONSTANTS } from "@/config/constant"; + + +@shortcut() +export class PopupViewDemo extends Widget { + static xtype = "demo.popup_view"; + + props = { baseCls: "demo-func" }; + + render() { + const self = this; + + return { + type: AbsoluteLayout.xtype, + items: [ + { + el: { + type: Combo.xtype, + width: 200, + height: 30, + el: { + type: TextButton.xtype, + text: "点击", + cls: "bi-border", + height: 30, + }, + popup: { + type: PopupView.xtype, + el: { + type: ButtonGroup.xtype, + layouts: [ + { + type: VerticalLayout.xtype, + } + ], + items: createItems(deepClone(CONSTANTS.ITEMS), { + type: MultiSelectItem.xtype, + height: 25, + }), + }, + }, + }, + } + ], + }; + } +} + diff --git a/packages/demo/src/demo/core/popup/demo.searcher_view.js b/packages/demo/src/demo/core/popup/demo.searcher_view.js new file mode 100644 index 000000000..241c54350 --- /dev/null +++ b/packages/demo/src/demo/core/popup/demo.searcher_view.js @@ -0,0 +1,68 @@ +import { + AbsoluteLayout, + SearcherView, + Label, + shortcut, + Widget, + createItems +} from "@fui/core"; + +@shortcut() +export class SearcherViewDemo extends Widget { + static xtype = "demo.searcher_view"; + + props = { baseCls: "demo-func" }; + + render() { + const self = this; + + return { + type: AbsoluteLayout.xtype, + items: [ + { + el: { + type: SearcherView.xtype, + ref() { + self.searcherView = this; + } + }, + left: 100, + top: 20, + width: 230 + } + ] + }; + } + + mounted() { + this.searcherView.populate( + createItems( + [ + { + text: 2012 + }, + { + text: 2013 + }, + { + text: 2014 + }, + { + text: 2015 + } + ], + { + type: Label.xtype, + textHeight: 24, + height: 24 + } + ), + [ + { + text: 2 + } + ], + "2" + ); + } +} diff --git a/packages/demo/src/demo/core/popup/index.js b/packages/demo/src/demo/core/popup/index.js new file mode 100644 index 000000000..d6f2c44b0 --- /dev/null +++ b/packages/demo/src/demo/core/popup/index.js @@ -0,0 +1,4 @@ +export * from "./demo.layer"; +export * from "./demo.popover"; +export * from "./demo.popup_view"; +export * from "./demo.searcher_view"; diff --git a/packages/demo/src/demo/fix-2.0/context.js b/packages/demo/src/demo/fix-2.0/context.js new file mode 100644 index 000000000..2264ef9b6 --- /dev/null +++ b/packages/demo/src/demo/fix-2.0/context.js @@ -0,0 +1,81 @@ +import { shortcut, Widget, AbsoluteLayout, Button, Fix, model, Models } from '@fui/core'; + +@model() +class ParentStore extends Fix.Model { + static xtype = 'demo.model.context.parent_store'; + + state() { + return { + context: '默认context', + }; + } + childContext = ['context']; +} + +@model() +class ChildStore extends Fix.Model { + static xtype = 'demo.model.context.child_store'; + + context = ['context']; + computed = { + currContext: function () { + return this.model.context; + }, + }; + actions = { + changeContext: function () { + this.model.context = '改变后的context'; + }, + }; +} + +@shortcut() +class Child extends Widget { + static xtype = 'demo.fix_context_child'; + + _store() { + return Models.getModel(ChildStore.xtype); + } + + watch = { + currContext(val) { + this.button.setText(val); + }, + }; + + render() { + var self = this; + return { + type: Button.xtype, + ref() { + self.button = this; + }, + text: this.model.context, + handler() { + self.store.changeContext(); + }, + }; + } +} + +@shortcut() +export class FixContextDemo extends Widget { + static xtype = 'demo.fix_context'; + + _store() { + return Models.getModel(ParentStore.xtype); + } + + render() { + return { + type: AbsoluteLayout.xtype, + items: [ + { + el: { + type: Child.xtype, + }, + }, + ], + }; + } +} diff --git a/packages/demo/src/demo/fix-2.0/define.js b/packages/demo/src/demo/fix-2.0/define.js new file mode 100644 index 000000000..851c2bbe3 --- /dev/null +++ b/packages/demo/src/demo/fix-2.0/define.js @@ -0,0 +1,40 @@ +import { shortcut, AbsoluteLayout, Button, Widget, Fix } from '@fui/core'; + +@shortcut() +export class DefineDemo extends Widget { + static xtype = 'demo.fix2.define'; + + watch = { + name() { + this.button.setText(this.model.name); + }, + }; + + _store() { + return Fix.define({ + name: '原始属性', + }); + } + + render() { + const self = this; + + return { + type: AbsoluteLayout.xtype, + items: [ + { + el: { + type: Button.xtype, + ref() { + self.button = this; + }, + handler() { + self.model.name = '这是改变后的属性'; + }, + text: this.model.name, + }, + }, + ], + }; + } +} diff --git a/packages/demo/src/demo/fix-2.0/index.js b/packages/demo/src/demo/fix-2.0/index.js new file mode 100644 index 000000000..6d259a331 --- /dev/null +++ b/packages/demo/src/demo/fix-2.0/index.js @@ -0,0 +1,7 @@ +export const meta = { + title: '数据流框架 fix-2.0', + rank: 0, +}; + +export * from './define'; +export * from './context'; diff --git a/packages/demo/src/demo/index.js b/packages/demo/src/demo/index.js new file mode 100644 index 000000000..7a777eea5 --- /dev/null +++ b/packages/demo/src/demo/index.js @@ -0,0 +1,6 @@ +export * as base from "./base"; +export * as core from "./core"; +export * as caseModule from "./case"; +export * as widget from "./widget"; +export * as component from "./component"; +export * as fix from "./fix-2.0"; diff --git a/plugins/webpack-fui-worker-plugin/empty.js b/packages/demo/src/demo/slides.js similarity index 100% rename from plugins/webpack-fui-worker-plugin/empty.js rename to packages/demo/src/demo/slides.js diff --git a/packages/demo/src/demo/widget/basewidget/demo.buttons.js b/packages/demo/src/demo/widget/basewidget/demo.buttons.js new file mode 100644 index 000000000..8f60986da --- /dev/null +++ b/packages/demo/src/demo/widget/basewidget/demo.buttons.js @@ -0,0 +1,94 @@ +import { + Button, + MultiSelectBar, + FloatLeftLayout, + shortcut, + Widget, + each, + Msg +} from "@fui/core"; + +@shortcut() +export class ButtonsDemo extends Widget { + static xtype = "demo.buttons"; + + props = { baseCls: "demo-button" }; + + render() { + const items = [ + { + el: { + type: Button.xtype, + text: "一般按钮", + level: "common", + height: 30 + } + }, + { + el: { + type: Button.xtype, + text: "带图标的按钮", + // level: 'ignore', + iconCls: "close-font", + height: 30 + } + }, + { + el: { + type: Button.xtype, + text: "一般按钮", + block: true, + level: "common", + height: 30 + } + }, + { + el: { + type: Button.xtype, + text: "一般按钮", + clear: true, + level: "common", + height: 30 + } + }, + { + el: { + type: MultiSelectBar.xtype, + selected: true, + halfSelected: true + } + }, + { + el: { + type: MultiSelectBar.xtype, + selected: true, + halfSelected: false + } + }, + { + el: { + type: MultiSelectBar.xtype, + selected: false, + halfSelected: true + } + }, + { + el: { + type: MultiSelectBar.xtype + } + } + ]; + each(items, (i, item) => { + item.el.handler = function () { + Msg.alert("按钮", this.options.text); + }; + }); + + return { + type: FloatLeftLayout.xtype, + vgap: 100, + hgap: 20, + items + }; + } +} diff --git a/packages/demo/src/demo/widget/basewidget/demo.items.js b/packages/demo/src/demo/widget/basewidget/demo.items.js new file mode 100644 index 000000000..11a3959c1 --- /dev/null +++ b/packages/demo/src/demo/widget/basewidget/demo.items.js @@ -0,0 +1,53 @@ +import { + shortcut, + Widget, + VerticalLayout, + TextButton, + SingleSelectItem, + SingleSelectRadioItem, + Label, + MultiSelectItem, + Switch +} from "@fui/core"; + +@shortcut() +export class Items extends Widget { + static xtype = "demo.items"; + + render() { + return { + type: VerticalLayout.xtype, + items: [ + { + type: TextButton.xtype, + cls: "bi-list-item-select bi-high-light-border bi-border", + height: 30, + level: "warning", + text: "单选item" + }, + { + type: SingleSelectItem.xtype, + text: "单选项" + }, + { + type: SingleSelectRadioItem.xtype, + text: "单选项" + }, + { + type: Label.xtype, + height: 30, + text: "复选item" + }, + { + type: MultiSelectItem.xtype, + text: "复选项" + }, + { + type: Switch.xtype, + selected: true + } + ], + hgap: 300 + }; + } +} diff --git a/packages/demo/src/demo/widget/basewidget/demo.nodes.js b/packages/demo/src/demo/widget/basewidget/demo.nodes.js new file mode 100644 index 000000000..494d37697 --- /dev/null +++ b/packages/demo/src/demo/widget/basewidget/demo.nodes.js @@ -0,0 +1,50 @@ +import { + shortcut, + Widget, + VerticalLayout, + Label, + PlusGroupNode, + ArrowNode, + IconArrowNode, + MultiLayerIconArrowNode +} from "@fui/core"; + +@shortcut() +export class NodesDemo extends Widget { + static xtype = "demo.nodes"; + + render(vessel) { + return { + type: VerticalLayout.xtype, + items: [ + { + type: Label.xtype, + height: 30, + text: "十字形的节点" + }, + { + type: PlusGroupNode.xtype, + text: "十字形的节点" + }, + { + type: Label.xtype, + height: 30, + text: "箭头节点" + }, + { + type: ArrowNode.xtype, + text: "箭头节点" + }, + { + type: IconArrowNode.xtype, + iconCls: "search-font", + text: "箭头图标节点" + }, + { + type: MultiLayerIconArrowNode.xtype, + layer: 2 + } + ] + }; + } +} diff --git a/packages/demo/src/demo/widget/basewidget/demo.sagments.js b/packages/demo/src/demo/widget/basewidget/demo.sagments.js new file mode 100644 index 000000000..ccbc2105c --- /dev/null +++ b/packages/demo/src/demo/widget/basewidget/demo.sagments.js @@ -0,0 +1,40 @@ +import { VerticalLayout, Label, Segment, shortcut, Widget } from "@fui/core"; + +@shortcut() +export class SegmentsDemo extends Widget { + static xtype = "demo.segments"; + + render() { + return { + type: VerticalLayout.xtype, + items: [ + { + type: Label.xtype, + height: 30, + text: "默认风格" + }, + { + type: Segment.xtype, + items: [ + { + text: "tab1", + value: 1, + selected: true + }, + { + text: "tab2", + value: 2 + }, + { + text: "tab3 disabled", + disabled: true, + value: 3 + } + ] + } + ], + hgap: 50, + vgap: 20 + }; + } +} diff --git a/packages/demo/src/demo/widget/basewidget/demo.tips.js b/packages/demo/src/demo/widget/basewidget/demo.tips.js new file mode 100644 index 000000000..3cb3fbff5 --- /dev/null +++ b/packages/demo/src/demo/widget/basewidget/demo.tips.js @@ -0,0 +1,175 @@ +import { + Bubbles, + Msg, + shortcut, + Widget, + createWidget, + each, + FloatLeftLayout, + Button, + VerticalLayout, + Label, + HorizontalAutoLayout +} from "@fui/core"; + +@shortcut() +export class TipsDemo extends Widget { + static xtype = "demo.tips"; + + props = { baseCls: "demo-tips" }; + + render() { + const btns = []; + const bubble = createWidget({ + type: FloatLeftLayout.xtype, + items: [ + { + el: { + type: Button.xtype, + text: "bubble测试", + height: 30, + handler() { + Bubbles.show("singleBubble1", "bubble测试", this); + btns.push("singleBubble1"); + } + } + }, + { + el: { + type: Button.xtype, + text: "bubble测试(居中显示)", + height: 30, + handler() { + Bubbles.show("singleBubble2", "bubble测试", this, { + offsetStyle: "center" + }); + btns.push("singleBubble2"); + } + } + }, + { + el: { + type: Button.xtype, + text: "bubble测试(右边显示)", + height: 30, + handler() { + Bubbles.show("singleBubble3", "bubble测试", this, { + offsetStyle: "right" + }); + btns.push("singleBubble3"); + } + } + }, + { + el: { + type: Button.xtype, + text: "隐藏所有 bubble", + height: 30, + cls: "layout-bg2", + handler() { + each(btns, (index, value) => { + Bubbles.hide(value); + }); + } + } + } + ], + hgap: 20 + }); + + const title = createWidget({ + type: VerticalLayout.xtype, + items: [ + { + type: Label.xtype, + cls: "layout-bg1", + height: 50, + title: "title提示", + text: "移上去有title提示", + textAlign: "center" + }, + { + type: Label.xtype, + cls: "layout-bg6", + height: 50, + disabled: true, + warningTitle: "title错误提示", + text: "移上去有title错误提示", + textAlign: "center" + }, + { + type: Label.xtype, + cls: "layout-bg2", + height: 50, + disabled: true, + tipType: "success", + title: "自定义title提示效果", + warningTitle: "自定义title提示效果", + text: "自定义title提示效果", + textAlign: "center" + } + ], + hgap: 20, + vgap: 20 + }); + + const toast = createWidget({ + type: VerticalLayout.xtype, + items: [ + { + el: { + type: Button.xtype, + text: "简单Toast测试", + height: 30, + handler() { + Msg.toast("这是一条简单的数据"); + } + } + }, + { + el: { + type: Button.xtype, + text: "很长的Toast测试", + height: 30, + handler() { + Msg.toast( + "这是一条很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长的数据" + ); + } + } + }, + { + el: { + type: Button.xtype, + text: "非常长的Toast测试", + height: 30, + handler() { + Msg.toast( + "这是一条非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长非常长的数据" + ); + } + } + }, + { + el: { + type: Button.xtype, + text: "错误提示Toast测试", + level: "warning", + height: 30, + handler() { + Msg.toast("错误提示Toast测试", "warning"); + } + } + } + ], + vgap: 20 + }); + + return { + type: HorizontalAutoLayout.xtype, + vgap: 20, + hgap: 20, + items: [bubble, title, toast] + }; + } +} diff --git a/packages/demo/src/demo/widget/basewidget/index.js b/packages/demo/src/demo/widget/basewidget/index.js new file mode 100644 index 000000000..74e1099d2 --- /dev/null +++ b/packages/demo/src/demo/widget/basewidget/index.js @@ -0,0 +1,9 @@ +export const meta = { + title: "各种小控件" +}; + +export * from "./demo.buttons"; +export * from "./demo.items"; +export * from "./demo.nodes"; +export * from "./demo.sagments"; +export * from "./demo.tips"; diff --git a/packages/demo/src/demo/widget/collapase/demo.collapse.js b/packages/demo/src/demo/widget/collapase/demo.collapse.js new file mode 100644 index 000000000..7a9da8d11 --- /dev/null +++ b/packages/demo/src/demo/widget/collapase/demo.collapse.js @@ -0,0 +1,82 @@ +import { + shortcut, + Widget, + createItems, + SingleSelectItem, + Label, + VerticalLayout, + Collapse +} from "@fui/core"; + +@shortcut() +export class CollapseDemo extends Widget { + static xtype = "demo.collapse"; + + props = { baseCls: "demo-collapse" }; + + render() { + const self = this; + + const items = [ + { + value: "test", + popup: { + cls: "mvc-border", + items: createItems( + [ + { + text: "项目1", + value: 1 + }, + { + text: "项目2", + value: 2 + }, + { + text: "项目3", + value: 3 + }, + { + text: "项目4", + value: 4 + } + ], + { + type: SingleSelectItem.xtype, + height: 25 + } + ) + } + }, + { + value: 2, + popup: { + type: Label.xtype, + value: "给岁月以文明,而不是给文明以岁月" + } + }, + { + value: 3, + popup: { + type: Label.xtype, + value: "漂流瓶隐没于黑暗里,在一千米见方的宇宙中,只有生态球里的小太阳发出一点光芒。在这个小小的生命世界中,几只清澈的水球在零重力环境中静静地飘浮着,有一条小鱼从一只水球中蹦出,跃入另一只水球,轻盈地穿游于绿藻之间。" + } + } + ]; + + return { + type: VerticalLayout.xtype, + items: [ + { + type: Collapse.xtype, + accordion: true, + items, + value: [2] + } + ], + width: "60%", + tgap: 100, + hgap: 100 + }; + } +} diff --git a/packages/demo/src/demo/widget/collapase/index.js b/packages/demo/src/demo/widget/collapase/index.js new file mode 100644 index 000000000..874481a67 --- /dev/null +++ b/packages/demo/src/demo/widget/collapase/index.js @@ -0,0 +1,5 @@ +export const meta = { + title: "collapase" +}; + +export * from "./demo.collapse"; diff --git a/packages/demo/src/demo/widget/date/demo.datepane.js b/packages/demo/src/demo/widget/date/demo.datepane.js new file mode 100644 index 000000000..98bd52dd1 --- /dev/null +++ b/packages/demo/src/demo/widget/date/demo.datepane.js @@ -0,0 +1,104 @@ +import { + shortcut, + Widget, + Msg, + HorizontalAutoLayout, + VerticalLayout, + DynamicDatePane, + Button, + DynamicDateTimePane +} from "@fui/core"; + +@shortcut() +export class DatePane extends Widget { + static xtype = "demo.date_pane"; + + props = { baseCls: "demo-datepane" }; + + render() { + const self = this; + + return { + type: HorizontalAutoLayout.xtype, + items: [ + { + type: VerticalLayout.xtype, + vgap: 10, + items: [ + { + type: DynamicDatePane.xtype, + // value: { + // type: 1, + // value: { + // year: 2017, + // month: 12, + // day: 11 + // } + // }, + ref(_ref) { + self.datepane = _ref; + }, + height: 300 + }, + { + type: Button.xtype, + text: "getValue", + handler() { + Msg.toast( + `date${JSON.stringify( + self.datepane.getValue() + )}` + ); + } + }, + { + type: DynamicDateTimePane.xtype, + value: { + type: 1, + value: { + year: 2017, + month: 12, + day: 11, + hour: 12, + minute: 12, + second: 12 + } + }, + ref(_ref) { + self.dateTimePane = _ref; + }, + height: 340 + }, + { + type: Button.xtype, + text: "getValue", + handler() { + Msg.toast( + `date${JSON.stringify( + self.dateTimePane.getValue() + )}` + ); + } + }, + { + type: Button.xtype, + text: "setValue '2017-12-31'", + handler() { + self.datepane.setValue({ + year: 2017, + month: 12, + day: 31 + }); + } + } + ], + width: "50%" + } + ] + }; + } + + mounted() { + this.datepane.setValue(); // 不设value值表示当前时间 + } +} diff --git a/packages/demo/src/demo/widget/date/demo.multidate_combo.js b/packages/demo/src/demo/widget/date/demo.multidate_combo.js new file mode 100644 index 000000000..dfc684802 --- /dev/null +++ b/packages/demo/src/demo/widget/date/demo.multidate_combo.js @@ -0,0 +1,124 @@ +import { + shortcut, + Widget, + Msg, + HorizontalAutoLayout, + DynamicDateCombo, + Button, + DynamicDateTimeCombo +} from "@fui/core"; + +@shortcut() +export class Date extends Widget { + static xtype = "demo.multidate_combo"; + + props = { baseCls: "demo-date" }; + + _init(...args) { + super._init(...args); + } + + render() { + const self = this; + + return { + type: HorizontalAutoLayout.xtype, + vgap: 20, + items: [ + { + type: DynamicDateCombo.xtype, + ref() { + self.datecombo = this; + }, + width: 300, + // allowEdit: false, + // format: "%Y-%X-%d", // yyyy-MM-dd + // format: "%Y/%X/%d", // yyyy/MM/dd + // format: "%Y-%x-%e", // yyyy-M-d + // format: "%Y/%x/%e", // yyyy/M/d + // format: "%X/%d/%Y", // MM/dd/yyyy + // format: "%X/%e/%y", // MM/d/yy + // format: "%X.%d.%Y", // MM.dd.yyyy + // format: "%X.%e.%Y", // MM.d.yyyy + // format: "%X-%e-%y", // MM.d.yyyy + value: { + type: 1, + value: { + year: 2018, + month: 2, + day: 23 + } + } + }, + { + type: Button.xtype, + text: "getValue", + width: 300, + handler() { + Msg.alert( + "date", + JSON.stringify(self.datecombo.getValue()) + ); + } + }, + { + type: DynamicDateTimeCombo.xtype, + ref() { + self.datetimecombo = this; + }, + width: 300, + // allowEdit: false, + // format: "%Y-%X-%d %H:%M:%S", // yyyy-MM-dd HH:mm:ss + // format: "%Y/%X/%d %H:%M:%S", // yyyy/MM/dd HH:mm:ss + // format: "%Y-%X-%d %I:%M:%S", // yyyy-MM-dd hh:mm:ss + // format: "%Y/%X/%d %I:%M:%S", // yyyy/MM/dd hh:mm:ss + // format: "%Y-%X-%d %H:%M:%S %p", // yyyy-MM-dd HH:mm:ss a + // format: "Y/%X/%d %H:%M:%S %p", // yyyy/MM/dd HH:mm:ss a + // format: "%Y-%X-%d %I:%M:%S %p", // yyyy-MM-dd hh:mm:ss a + // format: "%Y/%X/%d %I:%M:%S %p", // yyyy/MM/dd hh:mm:ss a + // format: "%X/%d/%Y %I:%M:%S", // MM/dd/yyyy hh:mm:ss + // format: "%X/%d/%Y %H:%M:%S", // MM/dd/yyyy HH:mm:ss + // format: "%X/%d/%Y %I:%M:%S", // MM/dd/yyyy hh:mm:ss a + // format: "%X/%d/%Y %H:%M:%S %p", // MM/dd/yyyy HH:mm:ss a + // format: "%X/%d/%Y %I:%M:%S %p", // MM/dd/yyyy hh:mm:ss a + // format: "%X/%d/%Y %H:%M:%S %p", // MM/dd/yyyy HH:mm:ss a + // format: "%X/%d/%Y %l:%M %p", // MM/dd/yyyy h:mm a + // format: "%X-%d-%Y %k:%M %p", // MM/dd/yyyy H:mm a + // format: "%Y-%x-%e %l:%M", // yyyy-M-d h:mm + // format: "%Y-%x-%e %k:%M", // yyyy-M-d H:mm + value: { + type: 1, + value: { + year: 2018, + month: 2, + day: 23 + } + } + }, + { + type: Button.xtype, + text: "getValue", + width: 300, + handler() { + Msg.alert( + "date", + JSON.stringify(self.datetimecombo.getValue()) + ); + } + }, + { + type: Button.xtype, + text: "setValue '2017-12-31'", + width: 300, + handler() { + self.datecombo.setValue({ + year: 2017, + month: 11, + day: 31 + }); + } + } + ] + }; + } +} diff --git a/demo/js/widget/date/index.js b/packages/demo/src/demo/widget/date/index.js similarity index 100% rename from demo/js/widget/date/index.js rename to packages/demo/src/demo/widget/date/index.js diff --git a/packages/demo/src/demo/widget/datetime/demo.datetime.js b/packages/demo/src/demo/widget/datetime/demo.datetime.js new file mode 100644 index 000000000..c13242cfe --- /dev/null +++ b/packages/demo/src/demo/widget/datetime/demo.datetime.js @@ -0,0 +1,65 @@ +import { + AbsoluteLayout, + DateTimeCombo, + shortcut, + Widget, + print, + Msg, +} from "@fui/core"; + +@shortcut() +export class CustomDateTimeDemo extends Widget { + static xtype = "demo.date_time"; + + props = {}; + + render() { + const self = this; + + return { + type: AbsoluteLayout.xtype, + items: [ + { + el: { + type: DateTimeCombo.xtype, + listeners: [ + { + eventName: DateTimeCombo.EVENT_CONFIRM, + action() { + const value = this.getValue(); + const date = new Date( + value.year, + value.month - 1, + value.day, + value.hour, + value.minute, + value.second + ); + const dateStr = print( + date, + "%Y-%X-%d %H:%M:%S" + ); + Msg.alert("日期", dateStr); + } + }, + { + eventName: DateTimeCombo.EVENT_CANCEL, + action() {} + } + ], + value: { + year: 2017, + month: 2, + day: 23, + hour: 12, + minute: 11, + second: 1 + } + }, + top: 200, + left: 200 + } + ] + }; + } +} diff --git a/demo/js/widget/datetime/index.js b/packages/demo/src/demo/widget/datetime/index.js similarity index 100% rename from demo/js/widget/datetime/index.js rename to packages/demo/src/demo/widget/datetime/index.js diff --git a/packages/demo/src/demo/widget/downlist/demo.downlist.icon.js b/packages/demo/src/demo/widget/downlist/demo.downlist.icon.js new file mode 100644 index 000000000..7ead43c98 --- /dev/null +++ b/packages/demo/src/demo/widget/downlist/demo.downlist.icon.js @@ -0,0 +1,16 @@ + +import { Label, shortcut, Widget } from "@fui/core" + +@shortcut() +export class CustomIcon extends Widget { + static xtype = "demo.downlist.icon"; + + render() { + return { + type: Label.xtype, + text: "✨", + }; + } +} + + diff --git a/packages/demo/src/demo/widget/downlist/demo.downlist.js b/packages/demo/src/demo/widget/downlist/demo.downlist.js new file mode 100644 index 000000000..fccb8c3e6 --- /dev/null +++ b/packages/demo/src/demo/widget/downlist/demo.downlist.js @@ -0,0 +1,278 @@ +import { + shortcut, + Widget, + i18nText, + DownListCombo, + FloatLeftLayout, + Button, + MultiLayerDownListCombo, + Label +} from "@fui/core"; + +@shortcut() +export class DownlistDemo extends Widget { + static xtype = "demo.down_list"; + + props = { baseCls: "demo-downlist" }; + + mounted() { + const downlist = this.downlist; + const label = this.label; + this.downlist.setValue([ + { + value: [11, 6], + childValue: 67 + } + ]); + downlist.on(DownListCombo.EVENT_CHANGE, (value, fatherValue) => { + label.setValue(JSON.stringify(downlist.getValue())); + }); + + this.downlist.on( + DownListCombo.EVENT_SON_VALUE_CHANGE, + (value, fatherValue) => { + label.setValue(JSON.stringify(downlist.getValue())); + } + ); + } + + render() { + const self = this; + + return { + type: FloatLeftLayout.xtype, + items: [ + { + type: DownListCombo.xtype, + ref(_ref) { + self.downlist = _ref; + }, + // value: [{"childValue":22,"value":11},{"value":18},{"value":20}], + height: 30, + width: 100, + items: [ + [ + { + text: "column 1111", + iconCls1: "dot-e-font", + value: 12, + children: [ + { + text: "column 1.1", + value: 21, + cls: "dot-e-font" + }, + { + text: "column 1.2", + value: 22, + cls: "dot-e-font" + } + ] + } + ], + [ + { + el: { + text: "column 1111", + iconCls1: "dot-e-font", + value: 11 + }, + children: [ + { + text: "column 1.1", + value: 21, + cls: "dot-e-font" + }, + { + text: "column 1.2", + value: 22, + cls: "dot-e-font" + } + ] + // children: [{ + // text: i18nText("BI-Basic_None"), + // cls: "dot-e-font", + // value: 1 + // }, { + // text: i18nText("BI-Basic_Calculate_Same_Period"), + // cls: "dot-e-font", + // value: 2 + // }, { + // text: i18nText("BI-Basic_Calculate_Same_Ring"), + // cls: "dot-e-font", + // value: 3 + // }, { + // text: i18nText("BI-Basic_Calculate_Same_Period_Rate"), + // cls: "dot-e-font", + // value: 4 + // }, { + // text: i18nText("BI-Basic_Calculate_Same_Ring_Rate"), + // cls: "dot-e-font", + // value: 5 + // }, { + // el: { + // text: i18nText("BI-Basic_Rank"), + // iconCls1: "dot-e-font", + // value: 6 + // }, + // children: [{ + // text: "test1", + // cls: "dot-e-font", + // value: 67 + // }, { + // text: "test2", + // cls: "dot-e-font", + // value: 68 + // }] + // }, { + // text: i18nText("BI-Basic_Rank_In_Group"), + // cls: "dot-e-font", + // value: 7 + // }, { + // text: i18nText("BI-Basic_Sum_Of_All"), + // cls: "dot-e-font", + // value: 8 + // }, { + // text: i18nText("BI-Basic_Sum_Of_All_In_Group"), + // cls: "dot-e-font", + // value: 9 + // }, { + // text: i18nText("BI-Basic_Sum_Of_Above"), + // cls: "dot-e-font", + // value: 10 + // }, { + // text: i18nText("BI-Basic_Sum_Of_Above_In_Group"), + // cls: "dot-e-font", + // value: 11 + // }, { + // text: i18nText("BI-Design_Current_Dimension_Percent"), + // cls: "dot-e-font", + // value: 12 + // }, { + // text: i18nText("BI-Design_Current_Target_Percent"), + // cls: "dot-e-font", + // value: 13 + // }] + } + ] + ] + }, + { + type: DownListCombo.xtype, + el: { + type: Button.xtype, + ghost: true, + iconPosition: "right", + icon: "column-next-page-h-font", + text: "自定义 trigger 和 icon 的级联下拉框" + }, + listeners: [ + { + eventName: "EVENT_CHANGE", + action(v) { + console.log("触发值", v); + } + }, + { + eventName: "EVENT_SON_VALUE_CHANGE", + action(v) { + console.log("二级菜单触发值", v); + } + } + ], + items: [ + [ + { + text: "选项一", + value: 1, + icon: { + type: "demo.downlist.icon" + }, + children: [ + { + text: "选项一", + value: 11, + icon: { + type: "demo.downlist.icon" + } + }, + { + text: "选项二", + value: 12 + } + ] + }, + { + text: "选项二", + value: 2 + } + ] + ] + }, + { + type: MultiLayerDownListCombo.xtype, + ref(_ref) { + self.downlist = _ref; + }, + // value: [{"childValue":22,"value":11},{"value":18},{"value":20}], + height: 30, + width: 100, + items: [ + [ + { + el: { + text: "column 1111", + iconCls1: "dot-e-font", + value: 12 + }, + children: [ + { + text: "column 1.1", + value: 21, + cls: "dot-e-font" + }, + { + text: "column 1.2", + value: 22, + cls: "dot-e-font" + } + ] + } + ], + [ + { + el: { + text: "column 1111", + iconCls1: "dot-e-font", + value: 11 + }, + children: [ + { + text: "column 1.1", + value: 21, + cls: "dot-e-font" + }, + { + text: "column 1.2", + value: 22, + cls: "dot-e-font" + } + ] + } + ] + ] + }, + { + type: Label.xtype, + text: "显示选择值", + width: 500, + cls: "layout-bg3", + ref(_ref) { + self.label = _ref; + } + } + ], + vgap: 20 + }; + } +} diff --git a/demo/js/widget/downlist/index.js b/packages/demo/src/demo/widget/downlist/index.js similarity index 100% rename from demo/js/widget/downlist/index.js rename to packages/demo/src/demo/widget/downlist/index.js diff --git a/packages/demo/src/demo/widget/editor/demo.search_editor.js b/packages/demo/src/demo/widget/editor/demo.search_editor.js new file mode 100644 index 000000000..0b3cfa9ba --- /dev/null +++ b/packages/demo/src/demo/widget/editor/demo.search_editor.js @@ -0,0 +1,37 @@ +import { + HorizontalAutoLayout, + SearchEditor, + SmallSearchEditor, + shortcut, + Widget +} from "@fui/core"; + +@shortcut() +export class SearchEditorDemo extends Widget { + static xtype = "demo.search_editor"; + + props = { baseCls: "demo-exceltable" }; + + render() { + return { + type: HorizontalAutoLayout.xtype, + items: [ + { + type: SearchEditor.xtype, + width: 300, + watermark: "添加合法性判断", + errorText: "长度必须大于4", + validationChecker() { + return this.getValue().length > 4; + } + }, + { + type: SmallSearchEditor.xtype, + width: 300, + watermark: "这个是 small,小一号" + } + ], + vgap: 20 + }; + } +} diff --git a/packages/demo/src/demo/widget/editor/demo.text_editor.js b/packages/demo/src/demo/widget/editor/demo.text_editor.js new file mode 100644 index 000000000..8ea69c4d3 --- /dev/null +++ b/packages/demo/src/demo/widget/editor/demo.text_editor.js @@ -0,0 +1,29 @@ +import { HorizontalAutoLayout, TextEditor, shortcut, Widget } from "@fui/core"; + +@shortcut() +export class TextEditorDemo extends Widget { + static xtype = "demo.text_editor"; + + props = { baseCls: "demo-exceltable" }; + + render() { + return { + type: HorizontalAutoLayout.xtype, + items: [ + { + type: TextEditor.xtype, + watermark: "这是水印,watermark", + width: 300 + }, + { + type: TextEditor.xtype, + watermark: "这个不予许空", + allowBlank: false, + errorText: "非空!", + width: 300 + } + ], + vgap: 20 + }; + } +} diff --git a/demo/js/widget/editor/index.js b/packages/demo/src/demo/widget/editor/index.js similarity index 100% rename from demo/js/widget/editor/index.js rename to packages/demo/src/demo/widget/editor/index.js diff --git a/packages/demo/src/demo/widget/index.js b/packages/demo/src/demo/widget/index.js new file mode 100644 index 000000000..5d6c985fc --- /dev/null +++ b/packages/demo/src/demo/widget/index.js @@ -0,0 +1,30 @@ +export const meta = { + title: "详细控件 widget", + rank: 6 +}; + +export * as basewiget from "./basewidget"; +export * as collapase from "./collapase"; +export * as date from "./date"; +export * as datetime from "./datetime"; +export * as downlist from "./downlist"; +export * as editor from "./editor"; +export * as multiselect from "./multiselect"; +export * as multitree from "./multitree"; +export * as numbereditor from "./numbereditor"; +export * as numberinterval from "./numberinterval"; +export * as selecttree from "./selecttree"; +export * as singleselct from "./singleselct"; + +export * as singletree from "./singletree"; +export * as slider from "./slider"; +export * as timecombo from "./timecombo"; +export * as timeinterval from "./timeinterval"; +export * as tree from "./tree"; +export * as year from "./year"; +export * as yearinterval from "./yearinterval"; + +export * as yearmonth from "./yearmonth"; +export * as yearmonthinterval from "./yearmonthinterval"; +export * as yearquarter from "./yearquarter"; +export * as yearquarterinterval from "./yearquarterinterval"; diff --git a/packages/demo/src/demo/widget/multiselect/demo.multi_select_combo.js b/packages/demo/src/demo/widget/multiselect/demo.multi_select_combo.js new file mode 100644 index 000000000..e4f1d1219 --- /dev/null +++ b/packages/demo/src/demo/widget/multiselect/demo.multi_select_combo.js @@ -0,0 +1,109 @@ +import { CONSTANTS } from "@/config/constant"; +import { + MultiSelectInsertCombo, + AbsoluteLayout, + shortcut, + Widget, + Func, + createWidget, + bind, + each, + makeObject, + filter, + delay, + Msg +} from "@fui/core"; + +@shortcut() +export class MultiSelectComboDemo extends Widget { + static xtype = "demo.multi_select_combo"; + + props = { baseCls: "demo-multi-select-combo" }; + + _createMultiSelectCombo() { + const self = this; + const widget = createWidget({ + type: MultiSelectInsertCombo.xtype, + // allowEdit: false, + itemsCreator: bind(this._itemsCreator, this), + width: 200, + value: { + type: 1, + value: [ + "柳州市城贸金属材料有限责任公司", + "柳州市建福房屋租赁有限公司", + "柳州市迅昌数码办公设备有限责任公司" + ] + } + }); + + widget.on(MultiSelectComboDemo.EVENT_CONFIRM, function () { + Msg.toast(JSON.stringify(this.getValue())); + }); + + return widget; + } + + _getItemsByTimes(items, times) { + const res = []; + for (let i = (times - 1) * 100; items[i] && i < times * 100; i++) { + res.push(items[i]); + } + + return res; + } + + _hasNextByTimes(items, times) { + return times * 100 < items.length; + } + + _itemsCreator(options, callback) { + const self = this; + let items = CONSTANTS.ITEMS; + const keywords = (options.keywords || []).slice(); + if (options.keyword) { + keywords.push(options.keyword); + } + each(keywords, (i, kw) => { + const search = Func.getSearchResult(items, kw); + items = search.match.concat(search.find); + }); + if (options.selectedValues) { + // 过滤 + const filter = makeObject(options.selectedValues, true); + items = filter(items, (i, ob) => !filter[ob.value]); + } + if (options.type == MultiSelectCombo.REQ_GET_ALL_DATA) { + callback({ + items + }); + + return; + } + if (options.type == MultiSelectCombo.REQ_GET_DATA_LENGTH) { + callback({ count: items.length }); + + return; + } + delay(() => { + callback({ + items: self._getItemsByTimes(items, options.times), + hasNext: self._hasNextByTimes(items, options.times) + }); + }, 1000); + } + + render() { + return { + type: AbsoluteLayout.xtype, + scrolly: false, + items: [ + { + el: this._createMultiSelectCombo(), + right: "50%", + top: 10 + } + ] + }; + } +} diff --git a/packages/demo/src/demo/widget/multiselect/demo.multi_select_list.js b/packages/demo/src/demo/widget/multiselect/demo.multi_select_list.js new file mode 100644 index 000000000..367380644 --- /dev/null +++ b/packages/demo/src/demo/widget/multiselect/demo.multi_select_list.js @@ -0,0 +1,117 @@ +import { CONSTANTS } from "@/config/constant"; +import { + MultiSelectInsertList, + AbsoluteLayout, + shortcut, + Widget, + createWidget, + Func, + bind, + each, + makeObject, + filter, + delay, + Msg, + MultiSelectCombo +} from "@fui/core"; + +@shortcut() +export class MultiSelectListDemo extends Widget { + static xtype = "demo.multi_select_list"; + + props = { baseCls: "demo-multi-select-combo" }; + + mounted() { + this.list.populate(); + } + + _createMultiSelectCombo() { + const self = this; + const widget = createWidget({ + type: MultiSelectInsertList.xtype, + ref(ref) { + self.list = ref; + }, + itemsCreator: bind(this._itemsCreator, this), + value: { + type: 1, + value: [ + "柳州市城贸金属材料有限责任公司", + "柳州市建福房屋租赁有限公司", + "柳州市迅昌数码办公设备有限责任公司" + ] + } + }); + + widget.on(MultiSelectCombo.EVENT_CONFIRM, function () { + Msg.toast(JSON.stringify(this.getValue())); + }); + + return widget; + } + + _getItemsByTimes(items, times) { + const res = []; + for (let i = (times - 1) * 10; items[i] && i < times * 10; i++) { + res.push(items[i]); + } + + return res; + } + + _hasNextByTimes(items, times) { + return times * 10 < items.length; + } + + _itemsCreator(options, callback) { + const self = this; + let items = CONSTANTS.ITEMS; + const keywords = (options.keywords || []).slice(); + if (options.keyword) { + keywords.push(options.keyword); + } + each(keywords, (i, kw) => { + const search = Func.getSearchResult(items, kw); + items = search.match.concat(search.find); + }); + if (options.selectedValues) { + // 过滤 + const filter = makeObject(options.selectedValues, true); + items = filter(items, (i, ob) => !filter[ob.value]); + } + if (options.type == MultiSelectCombo.REQ_GET_ALL_DATA) { + callback({ + items + }); + + return; + } + if (options.type == MultiSelectCombo.REQ_GET_DATA_LENGTH) { + callback({ count: items.length }); + + return; + } + delay(() => { + callback({ + items: self._getItemsByTimes(items, options.times), + hasNext: self._hasNextByTimes(items, options.times) + }); + }, 1000); + } + + render() { + return { + type: AbsoluteLayout.xtype, + scrolly: false, + items: [ + { + el: this._createMultiSelectCombo(), + top: 50, + left: 50, + right: 50, + bottom: 50 + } + ] + }; + } +} diff --git a/demo/js/widget/multiselect/index.js b/packages/demo/src/demo/widget/multiselect/index.js similarity index 100% rename from demo/js/widget/multiselect/index.js rename to packages/demo/src/demo/widget/multiselect/index.js diff --git a/packages/demo/src/demo/widget/multitree/demo.multi_tree_combo.js b/packages/demo/src/demo/widget/multitree/demo.multi_tree_combo.js new file mode 100644 index 000000000..d5660d147 --- /dev/null +++ b/packages/demo/src/demo/widget/multitree/demo.multi_tree_combo.js @@ -0,0 +1,75 @@ +import { CONSTANTS } from "@/config/constant"; +import { + HorizontalAutoLayout, + MultiTreeCombo, + Button, + shortcut, + Widget, + deepClone, + Msg, + TreeView +} from "@fui/core"; + +@shortcut() +export class MultiTreeComboDemo extends Widget { + static xtype = "demo.multi_tree_combo"; + + props = { baseCls: "" }; + + render() { + const self = this; + const items = deepClone(CONSTANTS.TREE); + + return { + type: HorizontalAutoLayout.xtype, + items: [ + { + type: MultiTreeCombo.xtype, + ref(_ref) { + self.tree = _ref; + }, + itemsCreator(options, callback) { + console.log(options); + // 根据不同的类型处理相应的结果 + switch (options.type) { + case TreeView.REQ_TYPE_INIT_DATA: + break; + case TreeView.REQ_TYPE_ADJUST_DATA: + break; + case TreeView.REQ_TYPE_SELECT_DATA: + break; + case TreeView.REQ_TYPE_GET_SELECTED_DATA: + break; + default: + break; + } + callback({ + items + }); + }, + width: 300, + value: { + 根目录: {} + }, + listeners: [ + { + eventName: "EVENT_CONFIRM", + action() { + console.log("EVENT_CONFIRM", this.getValue()); + } + } + ] + }, + { + type: Button.xtype, + text: "getValue", + handler() { + Msg.toast(JSON.stringify(self.tree.getValue())); + }, + width: 300 + } + ], + vgap: 20 + }; + } +} diff --git a/packages/demo/src/demo/widget/multitree/demo.multi_tree_list.js b/packages/demo/src/demo/widget/multitree/demo.multi_tree_list.js new file mode 100644 index 000000000..002933000 --- /dev/null +++ b/packages/demo/src/demo/widget/multitree/demo.multi_tree_list.js @@ -0,0 +1,81 @@ +import { CONSTANTS } from "@/config/constant"; +import { + AbsoluteLayout, + MultiSelectTree, + Button, + shortcut, + Widget, + deepClone, + Msg, + TreeView +} from "@fui/core"; + +@shortcut() +export class MultiSelectTreeDemo extends Widget { + static xtype = "demo.multi_select_tree"; + + props = { baseCls: "" }; + + mounted() { + this.tree.populate(); + } + + render() { + const self = this; + const items = deepClone(CONSTANTS.TREE); + + return { + type: AbsoluteLayout.xtype, + items: [ + { + el: { + type: MultiSelectTree.xtype, + ref(_ref) { + self.tree = _ref; + }, + itemsCreator(options, callback) { + console.log(options); + // 根据不同的类型处理相应的结果 + switch (options.type) { + case TreeView.REQ_TYPE_INIT_DATA: + break; + case TreeView.REQ_TYPE_ADJUST_DATA: + break; + case TreeView.REQ_TYPE_SELECT_DATA: + break; + case TreeView.REQ_TYPE_GET_SELECTED_DATA: + break; + default: + break; + } + callback({ + items: deepClone(items) + }); + }, + width: 300, + value: { + 根目录: {} + } + }, + top: 50, + bottom: 50, + left: 50, + right: 50 + }, + { + el: { + type: Button.xtype, + height: 30, + text: "getValue", + handler() { + Msg.toast(JSON.stringify(self.tree.getValue())); + } + }, + left: 50, + right: 50, + bottom: 20 + } + ] + }; + } +} diff --git a/demo/js/widget/multitree/index.js b/packages/demo/src/demo/widget/multitree/index.js similarity index 100% rename from demo/js/widget/multitree/index.js rename to packages/demo/src/demo/widget/multitree/index.js diff --git a/packages/demo/src/demo/widget/numbereditor/demo.number_editor.js b/packages/demo/src/demo/widget/numbereditor/demo.number_editor.js new file mode 100644 index 000000000..727cb9ba5 --- /dev/null +++ b/packages/demo/src/demo/widget/numbereditor/demo.number_editor.js @@ -0,0 +1,73 @@ +import { + NumberEditor, + VerticalLayout, + shortcut, + Widget, + createWidget, + parseFloat, + Msg +} from "@fui/core"; + +@shortcut() +export class FileManagerDemo extends Widget { + static xtype = "demo.number_editor"; + + props = { baseCls: "" }; + + render() { + const editor1 = createWidget({ + type: NumberEditor.xtype, + validationChecker(v) { + return parseFloat(v) <= 100 && parseFloat(v) >= 0; + }, + height: 24, + width: 150, + errorText: "hahah", + watermark: "每个人都是自己健康的第一责任人" + }); + editor1.on(NumberEditor.EVENT_CHANGE, function () { + if (parseFloat(this.getValue()) < 1) { + editor1.setDownEnable(false); + } else { + editor1.setDownEnable(true); + } + Msg.toast(editor1.getValue()); + }); + + const editor2 = createWidget({ + type: NumberEditor.xtype, + validationChecker(v) { + return parseFloat(v) <= 100 && parseFloat(v) >= 0; + }, + valueFormatter: (v) => `${v}$`, + valueParser: (v) => v.replace(/\$\s?|(,*)/g, ""), + height: 24, + width: 150, + errorText: "hahah" + }); + editor2.on(NumberEditor.EVENT_CHANGE, function () { + if (parseFloat(this.getValue()) < 1) { + editor2.setDownEnable(false); + } else { + editor2.setDownEnable(true); + } + Msg.toast(editor2.getValue()); + }); + + return { + type: VerticalLayout.xtype, + hgap: 20, + vgap: 20, + items: [ + { + el: editor1, + height: 24 + }, + { + el: editor2, + height: 24 + } + ] + }; + } +} diff --git a/demo/js/widget/numbereditor/index.js b/packages/demo/src/demo/widget/numbereditor/index.js similarity index 100% rename from demo/js/widget/numbereditor/index.js rename to packages/demo/src/demo/widget/numbereditor/index.js diff --git a/packages/demo/src/demo/widget/numberinterval/demo.number_interval.js b/packages/demo/src/demo/widget/numberinterval/demo.number_interval.js new file mode 100644 index 000000000..295cd8b9a --- /dev/null +++ b/packages/demo/src/demo/widget/numberinterval/demo.number_interval.js @@ -0,0 +1,56 @@ +import { + HorizontalAutoLayout, + NumberInterval, + Label, + shortcut, + Widget +} from "@fui/core"; + +@shortcut() +export class NumericalIntervalDemo extends Widget { + static xtype = "demo.number_interval"; + + props = { baseCls: "demo-exceltable" }; + + mounted() { + const numerical = this.numerical; + const label = this.label; + numerical.on(NumberInterval.EVENT_CONFIRM, () => { + const temp = numerical.getValue(); + const res = `大于${temp.closemin ? "等于 " : " "}${temp.min} 小于${ + temp.closemax ? "等于 " : " " + }${temp.max}`; + label.setValue(res); + }); + } + + render() { + const self = this; + + return { + type: HorizontalAutoLayout.xtype, + items: [ + { + type: NumberInterval.xtype, + ref(_ref) { + self.numerical = _ref; + }, + width: 500, + value: { + max: 300, + closeMax: true, + closeMin: false + } + }, + { + type: Label.xtype, + ref(_ref) { + self.label = _ref; + }, + text: "显示结果" + } + ], + vgap: 20 + }; + } +} diff --git a/demo/js/widget/numberinterval/index.js b/packages/demo/src/demo/widget/numberinterval/index.js similarity index 100% rename from demo/js/widget/numberinterval/index.js rename to packages/demo/src/demo/widget/numberinterval/index.js diff --git a/packages/demo/src/demo/widget/selecttree/demo.multilayer_select_tree_combo.js b/packages/demo/src/demo/widget/selecttree/demo.multilayer_select_tree_combo.js new file mode 100644 index 000000000..30fb4b21a --- /dev/null +++ b/packages/demo/src/demo/widget/selecttree/demo.multilayer_select_tree_combo.js @@ -0,0 +1,51 @@ +import { CONSTANTS } from "@/config/constant"; + +import { HorizontalAutoLayout, MultiLayerSelectTreeCombo, Button, shortcut, Widget, deepClone, Msg } from "@fui/core" + + + +@shortcut() +export class MultiLayerSelectTreeComboDemo extends Widget { + static xtype = "demo.multilayer_select_tree_combo"; + + props = { baseCls: "" }; + + render() { + const self = this; + const items = deepClone(CONSTANTS.TREE); + + return { + type: HorizontalAutoLayout.xtype, + items: [ + { + type: MultiLayerSelectTreeCombo.xtype, + ref(_ref) { + self.tree = _ref; + }, + defaultText: "请选择", + items, + width: 300, + value: ["第五级文件1"], + }, + { + type: Button.xtype, + text: "getVlaue", + handler() { + Msg.toast(self.tree.getValue()[0]); + }, + width: 300, + }, + { + type: Button.xtype, + text: "setVlaue (第二级文件1)", + handler() { + self.tree.setValue(["11"]); + }, + width: 300, + } + ], + vgap: 20, + }; + } +} + diff --git a/packages/demo/src/demo/widget/selecttree/demo.select_tree_combo.js b/packages/demo/src/demo/widget/selecttree/demo.select_tree_combo.js new file mode 100644 index 000000000..c891f46a8 --- /dev/null +++ b/packages/demo/src/demo/widget/selecttree/demo.select_tree_combo.js @@ -0,0 +1,55 @@ +import { CONSTANTS } from "@/config/constant"; +import { + HorizontalAutoLayout, + SelectTreeCombo, + Button, + shortcut, + Widget, + deepClone, + Msg +} from "@fui/core"; + +@shortcut() +export class SelectTreeComboDemo extends Widget { + static xtype = "demo.select_tree_combo"; + + props = { baseCls: "demo-exceltable" }; + + render() { + const self = this; + const items = deepClone(CONSTANTS.LEVELTREE); + + return { + type: HorizontalAutoLayout.xtype, + items: [ + { + type: SelectTreeCombo.xtype, + ref(_ref) { + self.tree = _ref; + }, + value: "11", + text: "默认值", + items, + width: 300 + }, + { + type: Button.xtype, + text: "getVlaue", + handler() { + Msg.toast(self.tree.getValue()[0]); + }, + width: 300 + }, + { + type: Button.xtype, + text: "setVlaue (11)", + handler() { + self.tree.setValue(["2"]); + }, + width: 300 + } + ], + vgap: 20 + }; + } +} diff --git a/demo/js/widget/selecttree/index.js b/packages/demo/src/demo/widget/selecttree/index.js similarity index 100% rename from demo/js/widget/selecttree/index.js rename to packages/demo/src/demo/widget/selecttree/index.js diff --git a/packages/demo/src/demo/widget/singleselct/demo.single_select_combo.js b/packages/demo/src/demo/widget/singleselct/demo.single_select_combo.js new file mode 100644 index 000000000..707389335 --- /dev/null +++ b/packages/demo/src/demo/widget/singleselct/demo.single_select_combo.js @@ -0,0 +1,107 @@ +import { CONSTANTS } from "@/config/constant"; + +import { SingleSelectCombo, AbsoluteLayout, Button, shortcut, Widget, Func, createWidget, bind, each, makeObject } from "@fui/core" + + +@shortcut() +export class SingleSelectComboDemo extends Widget { + static xtype = "demo.single_select_combo"; + + props = { baseCls: "demo-single-select-combo" }; + + _createSingleSelectCombo() { + const self = this; + const widget = createWidget({ + type: SingleSelectCombo.xtype, + itemsCreator: bind(this._itemsCreator, this), + width: 200, + ref() { + self.SingleSelectCombo = this; + }, + value: "柳州市针织总厂", + }); + + widget.populate(); + + widget.on(SingleSelectCombo.EVENT_CONFIRM, function () { + Msg.toast(JSON.stringify(this.getValue())); + }); + + return widget; + } + + _getItemsByTimes(items, times) { + const res = []; + for (let i = (times - 1) * 100; items[i] && i < times * 100; i++) { + res.push(items[i]); + } + + return res; + } + + _hasNextByTimes(items, times) { + return times * 100 < items.length; + } + + _itemsCreator(options, callback) { + const self = this; + let items = CONSTANTS.ITEMS; + const keywords = (options.keywords || []).slice(); + if (options.keyword) { + keywords.push(options.keyword); + } + each(keywords, (i, kw) => { + const search = Func.getSearchResult(items, kw); + items = search.match.concat(search.find); + }); + if (options.selectedValues) { + // 过滤 + const filter = makeObject(options.selectedValues, true); + items = filter(items, (i, ob) => !filter[ob.value]); + } + if (options.type == SingleSelectCombo.REQ_GET_ALL_DATA) { + callback({ + items, + }); + + return; + } + if (options.type == SingleSelectCombo.REQ_GET_DATA_LENGTH) { + callback({ count: items.length }); + + return; + } + delay(() => { + callback({ + items: self._getItemsByTimes(items, options.times), + hasNext: self._hasNextByTimes(items, options.times), + }); + }, 1000); + } + + render() { + const self = this; + + return { + type: AbsoluteLayout.xtype, + scrolly: false, + items: [ + { + el: this._createSingleSelectCombo(), + right: "50%", + top: 10, + }, + { + el: { + type: Button.xtype, + text: "setValue(\"柳州市针织总厂\")", + handler() { + self.SingleSelectCombo.setValue("柳州市针织总厂"); + }, + }, + } + ], + }; + } +} + diff --git a/demo/js/widget/singleselct/index.js b/packages/demo/src/demo/widget/singleselct/index.js similarity index 100% rename from demo/js/widget/singleselct/index.js rename to packages/demo/src/demo/widget/singleselct/index.js diff --git a/packages/demo/src/demo/widget/singletree/demo.multilayer_single_tree_combo.js b/packages/demo/src/demo/widget/singletree/demo.multilayer_single_tree_combo.js new file mode 100644 index 000000000..e9364ff99 --- /dev/null +++ b/packages/demo/src/demo/widget/singletree/demo.multilayer_single_tree_combo.js @@ -0,0 +1,50 @@ +import { CONSTANTS } from "@/config/constant"; + +import { HorizontalAutoLayout, MultiLayerSingleTreeCombo, Button, shortcut, Widget, deepClone, Msg } from "@fui/core" + + + +@shortcut() +export class MultiLayerSingleTreeComboDemo extends Widget { + static xtype = "demo.multilayer_single_tree_combo"; + + props = { baseCls: "" }; + + render() { + const self = this; + const items = deepClone(CONSTANTS.TREE); + + return { + type: HorizontalAutoLayout.xtype, + items: [ + { + type: MultiLayerSingleTreeCombo.xtype, + ref(_ref) { + self.tree = _ref; + }, + defaultText: "请选择", + items, + width: 300, + }, + { + type: Button.xtype, + text: "getVlaue", + handler() { + Msg.toast(self.tree.getValue()[0]); + }, + width: 300, + }, + { + type: Button.xtype, + text: "setVlaue (11)", + handler() { + self.tree.setValue(["11"]); + }, + width: 300, + } + ], + vgap: 20, + }; + } +} + diff --git a/packages/demo/src/demo/widget/singletree/demo.single_tree_combo.js b/packages/demo/src/demo/widget/singletree/demo.single_tree_combo.js new file mode 100644 index 000000000..930c87383 --- /dev/null +++ b/packages/demo/src/demo/widget/singletree/demo.single_tree_combo.js @@ -0,0 +1,51 @@ +import { CONSTANTS } from "@/config/constant"; + +import { HorizontalAutoLayout, SingleTreeCombo, Button, shortcut, Widget, deepClone, Msg } from "@fui/core" + + + +@shortcut() +export class SingleTreeComboDemo extends Widget { + static xtype = "demo.single_tree_combo"; + + props = { baseCls: "demo-exceltable" }; + + render() { + const self = this; + const items = deepClone(CONSTANTS.LEVELTREE); + + return { + type: HorizontalAutoLayout.xtype, + items: [ + { + type: SingleTreeCombo.xtype, + ref(_ref) { + self.tree = _ref; + }, + defaultText: "请选择", + items, + width: 300, + value: "11", + }, + { + type: Button.xtype, + text: "getVlaue", + handler() { + Msg.toast(self.tree.getValue()[0]); + }, + width: 300, + }, + { + type: Button.xtype, + text: "setVlaue (第二级文件1)", + handler() { + self.tree.setValue(["2"]); + }, + width: 300, + } + ], + vgap: 20, + }; + } +} + diff --git a/demo/js/widget/singletree/index.js b/packages/demo/src/demo/widget/singletree/index.js similarity index 100% rename from demo/js/widget/singletree/index.js rename to packages/demo/src/demo/widget/singletree/index.js diff --git a/packages/demo/src/demo/widget/slider/demo.slider.js b/packages/demo/src/demo/widget/slider/demo.slider.js new file mode 100644 index 000000000..d19e1a896 --- /dev/null +++ b/packages/demo/src/demo/widget/slider/demo.slider.js @@ -0,0 +1,142 @@ +import { + SingleSlider, + SingleSliderNormal, + SingleSliderLabel, + IntervalSlider, + VerticalLayout, + CenterAdaptLayout, + shortcut, + Widget, + createWidget +} from "@fui/core"; + +@shortcut() +export class SliderDemo extends Widget { + static xtype = "demo.slider"; + + props = { + baseCls: "demo-slider", + width: 300, + height: 50, + min: 0, + max: 100 + }; + + render() { + const self = this, + o = this.options; + const singleSlider = createWidget({ + type: SingleSlider.xtype, + digit: 0, + width: o.width, + height: o.height, + cls: "layout-bg-white", + value: 30, + min: 10, + max: 100 + }); + singleSlider.on(SingleSlider.EVENT_CHANGE, function () { + console.log(this.getValue()); + }); + + const normalSingleSlider = createWidget({ + type: SingleSliderNormal.xtype, + width: o.width, + height: 30, + cls: "layout-bg-white", + min: o.min, + max: o.max, + value: 30 + }); + normalSingleSlider.on(SingleSliderNormal.EVENT_DRAG, function () { + console.log(this.getValue()); + }); + + const singleSliderLabel = createWidget({ + type: SingleSliderLabel.xtype, + width: o.width, + height: o.height, + digit: 0, + unit: "个", + cls: "layout-bg-white", + min: o.min, + max: o.max, + value: 10 + }); + + const intervalSlider = createWidget({ + type: IntervalSlider.xtype, + width: o.width, + digit: 0, + cls: "layout-bg-white", + min: o.min, + max: o.max, + value: { + min: 10, + max: 70 + } + }); + + const intervalSliderLabel = createWidget({ + type: IntervalSlider.xtype, + width: o.width, + unit: "px", + cls: "layout-bg-white", + digit: 1, + min: 0, + max: 120, + value: { + min: 60, + max: 120 + } + }); + + return { + type: VerticalLayout.xtype, + element: this, + items: [ + { + type: CenterAdaptLayout.xtype, + items: [ + { + el: singleSlider + } + ] + }, + { + type: CenterAdaptLayout.xtype, + items: [ + { + el: normalSingleSlider + } + ] + }, + { + type: CenterAdaptLayout.xtype, + items: [ + { + el: singleSliderLabel + } + ] + }, + { + type: CenterAdaptLayout.xtype, + items: [ + { + el: intervalSlider + } + ] + }, + { + type: CenterAdaptLayout.xtype, + items: [ + { + el: intervalSliderLabel + } + ] + } + ], + vgap: 20 + }; + } +} diff --git a/demo/js/widget/slider/index.js b/packages/demo/src/demo/widget/slider/index.js similarity index 100% rename from demo/js/widget/slider/index.js rename to packages/demo/src/demo/widget/slider/index.js diff --git a/packages/demo/src/demo/widget/timecombo/demo.timecombo.js b/packages/demo/src/demo/widget/timecombo/demo.timecombo.js new file mode 100644 index 000000000..62fbdd0a2 --- /dev/null +++ b/packages/demo/src/demo/widget/timecombo/demo.timecombo.js @@ -0,0 +1,54 @@ + +import { HorizontalAutoLayout, TimeCombo, Button, shortcut, Widget, Msg } from "@fui/core" + + + +@shortcut() +export class TimeComboDemo extends Widget { + static xtype = "demo.time_combo"; + + props = { baseCls: "" }; + + render() { + const self = this; + + return { + type: HorizontalAutoLayout.xtype, + items: [ + { + type: TimeCombo.xtype, + ref(_ref) { + self.timeCombo = _ref; + }, + // allowEdit: true, + // format: "%H:%M:%S", // HH:mm:ss + // format: "%I:%M:%S", // hh:mm:ss + // format: "%l:%M:%S", // h:mm:ss + // format: "%k:%M:%S", // H:mm:ss + // format: "%l:%M:%S %p", // h:mm:ss a + // format: "%l:%M", // h:mm + // format: "%k:%M", // H:mm + // format: "%I:%M", // hh:mm + // format: "%H:%M", // HH:mm + // format: "%M:%S", // mm:ss + value: { + hour: 12, + minute: 0, + second: 0, + }, + width: 300, + }, + { + type: Button.xtype, + text: "getValue", + handler() { + Msg.toast(JSON.stringify(self.timeCombo.getValue())); + }, + width: 300, + } + ], + vgap: 20, + }; + } +} + diff --git a/demo/js/widget/timecombo/index.js b/packages/demo/src/demo/widget/timecombo/index.js similarity index 100% rename from demo/js/widget/timecombo/index.js rename to packages/demo/src/demo/widget/timecombo/index.js diff --git a/packages/demo/src/demo/widget/timeinterval/demo.time_interval.js b/packages/demo/src/demo/widget/timeinterval/demo.time_interval.js new file mode 100644 index 000000000..989a101b7 --- /dev/null +++ b/packages/demo/src/demo/widget/timeinterval/demo.time_interval.js @@ -0,0 +1,115 @@ +import { CONSTANTS } from "@/config/constant"; + +import { HorizontalAutoLayout, DateInterval, Button, TimeInterval, TimePeriods, shortcut, Widget, deepClone, Msg } from "@fui/core" + + +@shortcut() +export class TimeIntervalDemo extends Widget { + static xtype = "demo.time_interval"; + + props = { baseCls: "" }; + + render() { + const self = this; + const items = deepClone(CONSTANTS.TREE); + + return { + type: HorizontalAutoLayout.xtype, + items: [ + { + type: DateInterval.xtype, + ref(_ref) { + self.dateInterval = _ref; + }, + value: { + start: { + type: 2, + value: { + year: -1, + position: 2, + }, + }, + end: { + type: 1, + value: { + year: 2018, + month: 1, + day: 12, + }, + }, + }, + width: 300, + }, + { + type: Button.xtype, + text: "getValue", + handler() { + Msg.toast(JSON.stringify(self.dateInterval.getValue())); + }, + width: 300, + }, + { + type: TimeInterval.xtype, + ref(_ref) { + self.interval = _ref; + }, + value: { + start: { + type: 2, + value: { + year: -1, + position: 2, + }, + }, + end: { + type: 1, + value: { + year: 2018, + month: 1, + day: 12, + }, + }, + }, + width: 400, + }, + { + type: Button.xtype, + text: "getValue", + handler() { + Msg.toast(JSON.stringify(self.interval.getValue())); + }, + width: 300, + }, + { + type: TimePeriods.xtype, + value: { + start: { + hour: 7, + minute: 23, + second: 14, + }, + end: { + hour: 23, + minute: 34, + second: 32, + }, + }, + ref(_ref) { + self.periods = _ref; + }, + width: 180, + }, + { + type: Button.xtype, + text: "getValue", + handler() { + Msg.toast(JSON.stringify(self.periods.getValue())); + }, + width: 300, + } + ], + vgap: 20, + }; + } +} + diff --git a/demo/js/widget/timeinterval/index.js b/packages/demo/src/demo/widget/timeinterval/index.js similarity index 100% rename from demo/js/widget/timeinterval/index.js rename to packages/demo/src/demo/widget/timeinterval/index.js diff --git a/packages/demo/src/demo/widget/tree/demo.multilayer_select_level_tree.js b/packages/demo/src/demo/widget/tree/demo.multilayer_select_level_tree.js new file mode 100644 index 000000000..3820912fa --- /dev/null +++ b/packages/demo/src/demo/widget/tree/demo.multilayer_select_level_tree.js @@ -0,0 +1,58 @@ +import { CONSTANTS } from "@/config/constant"; +import { + MultiLayerSelectLevelTree, + VTapeLayout, + Button, + shortcut, + Widget, + createWidget, + deepClone, + Msg +} from "@fui/core"; + +@shortcut() +export class MultiLayerSelectLevelTreeDemo extends Widget { + static xtype = "demo.multilayer_select_level_tree"; + + render() { + const self = this; + const tree = createWidget({ + type: MultiLayerSelectLevelTree.xtype, + items: deepClone(CONSTANTS.TREE), + value: "第五级文件1" + }); + + return { + type: VTapeLayout.xtype, + items: [ + { + el: tree + }, + { + el: { + type: Button.xtype, + height: 25, + text: "getValue", + handler() { + Msg.alert("", JSON.stringify(tree.getValue())); + } + }, + height: 25 + }, + { + el: { + type: Button.xtype, + height: 25, + text: "setValue (第二级文件1)", + handler() { + tree.setValue(["11"]); + } + }, + height: 25 + } + ], + width: 500, + hgap: 300 + }; + } +} diff --git a/packages/demo/src/demo/widget/tree/demo.multilayer_single_level_tree.js b/packages/demo/src/demo/widget/tree/demo.multilayer_single_level_tree.js new file mode 100644 index 000000000..9b142450f --- /dev/null +++ b/packages/demo/src/demo/widget/tree/demo.multilayer_single_level_tree.js @@ -0,0 +1,77 @@ + +import { MultiLayerSingleLevelTree, VTapeLayout, Button, shortcut, Widget, createWidget, Msg } from "@fui/core" + + + +@shortcut() +export class MultiLayerSingleLevelTreeDemo extends Widget { + static xtype = "demo.multilayer_single_level_tree"; + + render() { + const self = this; + this.tree = createWidget({ + type: MultiLayerSingleLevelTree.xtype, + items: [], + value: "第二级文件1", + }); + + return { + type: VTapeLayout.xtype, + items: [ + { + el: this.tree, + }, + { + el: { + type: Button.xtype, + height: 25, + text: "getValue", + handler() { + Msg.alert("", JSON.stringify(self.tree.getValue())); + }, + }, + height: 25, + }, + { + el: { + type: Button.xtype, + height: 25, + text: "setValue (第二级文件1)", + handler() { + self.tree.setValue(["第二级文件1"]); + }, + }, + height: 25, + } + ], + width: 500, + hgap: 300, + }; + } + + mounted() { + const tree = [ + // {id: -2, pId: 0, value: "根目录1", text: "根目录1"}, + { id: -1, pId: 0, value: "根目录", text: "根目录" }, + { id: 1, pId: -1, value: "第一级目录1", text: "第一级目录1" }, + { id: 11, pId: 1, value: "第二级文件1", text: "第二级文件1" }, + { id: 12, pId: 1, value: "第二级目录2", text: "第二级目录2", disabled: true }, + { id: 121, pId: 12, value: "第三级目录1", text: "第三级目录1" }, + { id: 122, pId: 12, value: "第三级文件1", text: "第三级文件1" }, + { id: 1211, pId: 121, value: "第四级目录1", text: "第四级目录1" }, + { id: 2, pId: -1, value: "第一级目录2", text: "第一级目录2" }, + { id: 21, pId: 2, value: "第二级目录3", text: "第二级目录3" }, + { id: 22, pId: 2, value: "第二级文件2", text: "第二级文件2" }, + { id: 211, pId: 21, value: "第三级目录2", text: "第三级目录2" }, + { id: 212, pId: 21, value: "第三级文件2", text: "第三级文件2" }, + { id: 2111, pId: 211, value: "第四级文件1", text: "第四级文件1" }, + { id: 3, pId: -1, value: "第一级目录3", text: "第一级目录3" }, + { id: 31, pId: 3, value: "第二级文件2", text: "第二级文件2" }, + { id: 33, pId: 3, value: "第二级目录3", text: "第二级目录1" }, + { id: 32, pId: 3, value: "第二级文件3", text: "第二级文件3" }, + { id: 331, pId: 33, value: "第三级文件1", text: "第三级文件1" } + ]; + this.tree.populate(tree); + } +} + diff --git a/packages/demo/src/demo/widget/tree/demo.select_level_tree.js b/packages/demo/src/demo/widget/tree/demo.select_level_tree.js new file mode 100644 index 000000000..cbe9dd096 --- /dev/null +++ b/packages/demo/src/demo/widget/tree/demo.select_level_tree.js @@ -0,0 +1,58 @@ +import { CONSTANTS } from "@/config/constant"; +import { + SelectTreePopup, + VTapeLayout, + Button, + shortcut, + Widget, + createWidget, + deepClone, + Msg +} from "@fui/core"; + +@shortcut() +export class SelectLevelTreeDemo extends Widget { + static xtype = "demo.select_level_tree"; + + render() { + const self = this; + const tree = createWidget({ + type: SelectTreePopup.xtype, + items: deepClone(CONSTANTS.LEVELTREE), + value: "11" + }); + + return { + type: VTapeLayout.xtype, + items: [ + { + el: tree + }, + { + el: { + type: Button.xtype, + height: 25, + text: "getValue", + handler() { + Msg.alert("", JSON.stringify(tree.getValue())); + } + }, + height: 25 + }, + { + el: { + type: Button.xtype, + height: 25, + text: "setValue (第二级文件1)", + handler() { + tree.setValue(["2"]); + } + }, + height: 25 + } + ], + width: 500, + hgap: 300 + }; + } +} diff --git a/packages/demo/src/demo/widget/tree/demo.single_level_tree.js b/packages/demo/src/demo/widget/tree/demo.single_level_tree.js new file mode 100644 index 000000000..8615a811e --- /dev/null +++ b/packages/demo/src/demo/widget/tree/demo.single_level_tree.js @@ -0,0 +1,58 @@ +import { CONSTANTS } from "../../../config/constant"; +import { + SingleTreePopup, + VTapeLayout, + Button, + shortcut, + Widget, + createWidget, + deepClone, + Msg +} from "@fui/core"; + +@shortcut() +export class SingleLevelTreeDemo extends Widget { + static xtype = "demo.single_level_tree"; + + render() { + const self = this; + const tree = createWidget({ + type: SingleTreePopup.xtype, + items: deepClone(CONSTANTS.LEVELTREE), + value: "11" + }); + + return { + type: VTapeLayout.xtype, + items: [ + { + el: tree + }, + { + el: { + type: Button.xtype, + height: 25, + text: "getValue", + handler() { + Msg.alert("", JSON.stringify(tree.getValue())); + } + }, + height: 25 + }, + { + el: { + type: Button.xtype, + height: 25, + text: "setValue (第二级文件1)", + handler() { + tree.setValue(["2"]); + } + }, + height: 25 + } + ], + width: 500, + hgap: 300 + }; + } +} diff --git a/demo/js/widget/tree/index.js b/packages/demo/src/demo/widget/tree/index.js similarity index 100% rename from demo/js/widget/tree/index.js rename to packages/demo/src/demo/widget/tree/index.js diff --git a/packages/demo/src/demo/widget/year/demo.year.js b/packages/demo/src/demo/widget/year/demo.year.js new file mode 100644 index 000000000..a007a3b87 --- /dev/null +++ b/packages/demo/src/demo/widget/year/demo.year.js @@ -0,0 +1,53 @@ + +import { HorizontalAutoLayout, DynamicYearCombo, Button, shortcut, Widget, Msg } from "@fui/core" + + + +@shortcut() +export class YearDemo extends Widget { + static xtype = "demo.year"; + + props = { baseCls: "demo-exceltable" }; + + render() { + const self = this; + + return { + type: HorizontalAutoLayout.xtype, + vgap: 10, + items: [ + { + type: DynamicYearCombo.xtype, + width: 300, + ref() { + self.yearcombo = this; + }, + value: { + type: 1, + value: { + year: 2017, + }, + }, + }, + { + type: Button.xtype, + text: "getValue", + handler() { + Msg.toast(JSON.stringify(self.yearcombo.getValue())); + }, + width: 300, + }, + { + type: Button.xtype, + text: "setValue : 2018", + handler() { + self.yearcombo.setValue(2018); + }, + width: 300, + } + ], + vgap: 10, + }; + } +} + diff --git a/demo/js/widget/year/index.js b/packages/demo/src/demo/widget/year/index.js similarity index 100% rename from demo/js/widget/year/index.js rename to packages/demo/src/demo/widget/year/index.js diff --git a/packages/demo/src/demo/widget/yearinterval/demo.year_interval.js b/packages/demo/src/demo/widget/yearinterval/demo.year_interval.js new file mode 100644 index 000000000..5fe5cf16c --- /dev/null +++ b/packages/demo/src/demo/widget/yearinterval/demo.year_interval.js @@ -0,0 +1,56 @@ + +import { HorizontalAutoLayout, YearInterval, Button, shortcut, Widget, Msg } from "@fui/core" + + + +@shortcut() +export class YearIntervalDemo extends Widget { + static xtype = "demo.year_interval"; + + props = { baseCls: "" }; + + render() { + const self = this; + + return { + type: HorizontalAutoLayout.xtype, + items: [ + { + type: YearInterval.xtype, + ref(_ref) { + self.widget = _ref; + }, + width: 300, + minDate: "2012-01-01", + maxDate: "2013-12-31", + value: { + type: 1, + value: { + year: 2012, + }, + }, + }, + { + type: Button.xtype, + text: "getValue", + handler() { + Msg.toast(JSON.stringify(self.widget.getValue())); + }, + width: 300, + }, + { + type: Button.xtype, + text: "setValue '2017-12'", + width: 300, + handler() { + self.widget.setValue({ + year: 2017, + }); + }, + } + ], + vgap: 20, + }; + } +} + diff --git a/demo/js/widget/yearinterval/index.js b/packages/demo/src/demo/widget/yearinterval/index.js similarity index 100% rename from demo/js/widget/yearinterval/index.js rename to packages/demo/src/demo/widget/yearinterval/index.js diff --git a/packages/demo/src/demo/widget/yearmonth/demo.year_month_combo.js b/packages/demo/src/demo/widget/yearmonth/demo.year_month_combo.js new file mode 100644 index 000000000..1995fe9c9 --- /dev/null +++ b/packages/demo/src/demo/widget/yearmonth/demo.year_month_combo.js @@ -0,0 +1,56 @@ + +import { HorizontalAutoLayout, DynamicYearMonthCombo, Button, shortcut, Widget, Msg } from "@fui/core" + + + +@shortcut() +export class YearMonthComboDemo extends Widget { + static xtype = "demo.year_month_combo"; + + props = { baseCls: "" }; + + render() { + const self = this; + + return { + type: HorizontalAutoLayout.xtype, + items: [ + { + type: DynamicYearMonthCombo.xtype, + ref(_ref) { + self.widget = _ref; + }, + width: 300, + // value: { + // type: 1, + // value: { + // year: 2018, + // month: 1 + // } + // } + }, + { + type: Button.xtype, + text: "getValue", + handler() { + Msg.toast(JSON.stringify(self.widget.getValue())); + }, + width: 300, + }, + { + type: Button.xtype, + text: "setValue '2017-12'", + width: 300, + handler() { + self.widget.setValue({ + year: 2017, + month: 12, + }); + }, + } + ], + vgap: 20, + }; + } +} + diff --git a/demo/js/widget/yearmonth/index.js b/packages/demo/src/demo/widget/yearmonth/index.js similarity index 100% rename from demo/js/widget/yearmonth/index.js rename to packages/demo/src/demo/widget/yearmonth/index.js diff --git a/packages/demo/src/demo/widget/yearmonthinterval/demo.year_month_interval.js b/packages/demo/src/demo/widget/yearmonthinterval/demo.year_month_interval.js new file mode 100644 index 000000000..95c9a3555 --- /dev/null +++ b/packages/demo/src/demo/widget/yearmonthinterval/demo.year_month_interval.js @@ -0,0 +1,54 @@ + +import { HorizontalAutoLayout, YearMonthInterval, Button, shortcut, Widget, Msg } from "@fui/core" + + + +@shortcut() +export class YearMonthIntervalDemo extends Widget { + static xtype = "demo.year_month_interval"; + + props = { baseCls: "" }; + + render() { + const self = this; + + return { + type: HorizontalAutoLayout.xtype, + items: [ + { + type: YearMonthInterval.xtype, + ref(_ref) { + self.interval = _ref; + }, + value: { + start: { + type: 2, + value: { + year: -1, + month: 1, + }, + }, + end: { + type: 1, + value: { + year: 2018, + month: 1, + }, + }, + }, + width: 400, + }, + { + type: Button.xtype, + text: "getValue", + handler() { + Msg.toast(JSON.stringify(self.interval.getValue())); + }, + width: 300, + } + ], + vgap: 20, + }; + } +} + diff --git a/demo/js/widget/yearmonthinterval/index.js b/packages/demo/src/demo/widget/yearmonthinterval/index.js similarity index 100% rename from demo/js/widget/yearmonthinterval/index.js rename to packages/demo/src/demo/widget/yearmonthinterval/index.js diff --git a/packages/demo/src/demo/widget/yearquarter/demo.year_quarter_combo.js b/packages/demo/src/demo/widget/yearquarter/demo.year_quarter_combo.js new file mode 100644 index 000000000..62f05fbf2 --- /dev/null +++ b/packages/demo/src/demo/widget/yearquarter/demo.year_quarter_combo.js @@ -0,0 +1,58 @@ + +import { HorizontalAutoLayout, DynamicYearQuarterCombo, Button, shortcut, Widget, Msg } from "@fui/core" + + + +@shortcut() +export class YearQuarterComboDemo extends Widget { + static xtype = "demo.year_quarter_combo"; + + props = { baseCls: "" }; + + render() { + const self = this; + + return { + type: HorizontalAutoLayout.xtype, + items: [ + { + type: DynamicYearQuarterCombo.xtype, + width: 300, + ref(_ref) { + self.widget = _ref; + }, + yearBehaviors: {}, + quarterBehaviors: {}, + value: { + type: 1, + value: { + year: 2018, + quarter: 1, + }, + }, + }, + { + type: Button.xtype, + text: "getValue", + handler() { + Msg.toast(JSON.stringify(self.widget.getValue())); + }, + width: 300, + }, + { + type: Button.xtype, + text: "setVlaue '2017 季度3'", + width: 300, + handler() { + self.widget.setValue({ + year: 2017, + quarter: 3, + }); + }, + } + ], + vgap: 20, + }; + } +} + diff --git a/demo/js/widget/yearquarter/index.js b/packages/demo/src/demo/widget/yearquarter/index.js similarity index 100% rename from demo/js/widget/yearquarter/index.js rename to packages/demo/src/demo/widget/yearquarter/index.js diff --git a/packages/demo/src/demo/widget/yearquarterinterval/demo.yearquarterinterval.js b/packages/demo/src/demo/widget/yearquarterinterval/demo.yearquarterinterval.js new file mode 100644 index 000000000..fd2bd1c68 --- /dev/null +++ b/packages/demo/src/demo/widget/yearquarterinterval/demo.yearquarterinterval.js @@ -0,0 +1,56 @@ + +import { HorizontalAutoLayout, YearQuarterInterval, Button, shortcut, Widget, Msg } from "@fui/core" + + + +@shortcut() +export class YearQuarterIntervalDemo extends Widget { + static xtype = "demo.year_quarter_interval"; + + props = { baseCls: "" }; + + render() { + const self = this; + + return { + type: HorizontalAutoLayout.xtype, + items: [ + { + type: YearQuarterInterval.xtype, + ref(_ref) { + self.interval = _ref; + }, + minDate: "2012-07-01", + maxDate: "2012-12-31", + value: { + start: { + type: 2, + value: { + year: -1, + month: 1, + }, + }, + end: { + type: 1, + value: { + year: 2018, + month: 1, + }, + }, + }, + width: 400, + }, + { + type: Button.xtype, + text: "getValue", + handler() { + Msg.toast(JSON.stringify(self.interval.getValue())); + }, + width: 300, + } + ], + vgap: 20, + }; + } +} + diff --git a/demo/js/widget/yearquarterinterval/index.js b/packages/demo/src/demo/widget/yearquarterinterval/index.js similarity index 100% rename from demo/js/widget/yearquarterinterval/index.js rename to packages/demo/src/demo/widget/yearquarterinterval/index.js diff --git a/packages/demo/src/face.js b/packages/demo/src/face.js new file mode 100644 index 000000000..c19045449 --- /dev/null +++ b/packages/demo/src/face.js @@ -0,0 +1,876 @@ +import { + Widget, + Label, + shortcut, + each, + Msg, + StyleLoaders, + ColorChooser, + VerticalAdaptLayout, + HTapeLayout, + TextButton, + IconTextItem, + VerticalLayout, + Button, + DownListCombo, + IconTextIconItem, + GridLayout, + Layout, +} from '@fui/core'; + +@shortcut() +export class Face extends Widget { + static xtype = 'demo.face'; + + props = { + baseCls: 'demo-face', + }; + + _createLabel(text) { + return { + width: 200, + el: { + type: Label.xtyp, + text: text, + textAlign: 'left', + hgap: 5, + height: 40, + cls: 'config-label', + }, + }; + } + + _createColorPicker(ref, action) { + return { + el: { + type: VerticalAdaptLayout.xtype, + items: [ + { + type: ColorChooser.xtype, + listeners: [ + { + eventName: ColorChooser.EVENT_CHANGE, + action: action, + }, + ], + ref: ref, + width: 24, + height: 24, + }, + ], + }, + }; + } + + _createBackgroundConfig() { + var self = this; + return { + type: HTapeLayout.xtype, + cls: 'config-item bi-border-bottom', + height: 40, + items: [ + this._createLabel('背景色:'), + this._createColorPicker( + function () { + self.backgroundColor = this; + }, + function () { + self._runGlobalStyle(); + } + ), + ], + }; + } + + _createFontConfig() { + var self = this; + return { + type: HTapeLayout.xtype, + cls: 'config-item bi-border-bottom', + height: 40, + items: [ + this._createLabel('字体颜色:'), + this._createColorPicker( + function () { + self.fontColor = this; + }, + function () { + self._runGlobalStyle(); + } + ), + ], + }; + } + + _createActiveFontConfig() { + var self = this; + return { + type: HTapeLayout.xtype, + cls: 'config-item bi-border-bottom', + height: 40, + items: [ + this._createLabel('激活状态字体颜色:'), + this._createColorPicker( + function () { + self.activeFontColor = this; + }, + function () { + self._runGlobalStyle(); + } + ), + { + width: 100, + el: { + type: TextButton.xtype, + cls: 'bi-list-item-active', + text: '测试激活状态', + }, + }, + ], + }; + } + + _createSelectFontConfig() { + var self = this; + return { + type: HTapeLayout.xtype, + cls: 'config-item bi-border-bottom', + height: 40, + items: [ + this._createLabel('选中状态字体颜色:'), + this._createColorPicker( + function () { + self.selectFontColor = this; + }, + function () { + self._runGlobalStyle(); + } + ), + { + width: 100, + el: { + type: TextButton.xtype, + cls: 'bi-list-item-active', + text: '测试选中状态', + }, + }, + ], + }; + } + + _createGrayFontConfig() { + var self = this; + return { + type: HTapeLayout.xtype, + cls: 'config-item bi-border-bottom', + height: 40, + items: [ + this._createLabel('tip提示字体颜色:'), + this._createColorPicker( + function () { + self.grayFontColor = this; + }, + function () { + self._runGlobalStyle(); + } + ), + { + width: 100, + el: { + type: IconTextItem.xtype, + cls: 'bi-tips copy-font', + height: 40, + text: '测试提示文字', + }, + }, + ], + }; + } + + _createDisableFontConfig() { + var self = this; + return { + type: HTapeLayout.xtype, + cls: 'config-item bi-border-bottom', + height: 40, + items: [ + this._createLabel('灰化字体颜色:'), + this._createColorPicker( + function () { + self.disabledFontColor = this; + }, + function () { + self._runGlobalStyle(); + } + ), + { + width: 100, + el: { + type: TextButton.xtype, + text: '这个按钮是灰化的', + disabled: true, + }, + }, + ], + }; + } + + _createCardBackgroundConfig() { + var self = this; + return { + type: HTapeLayout.xtype, + cls: 'config-item bi-border-bottom', + height: 40, + items: [ + this._createLabel('Card背景颜色:'), + this._createColorPicker( + function () { + self.cardBackgroundColor = this; + }, + function () { + self._runGlobalStyle(); + } + ), + ], + }; + } + + _createHoverBackgroundColor() { + var self = this; + return { + type: HTapeLayout.xtype, + cls: 'config-item bi-border-bottom', + height: 40, + items: [ + this._createLabel('悬浮状态背景颜色:'), + this._createColorPicker( + function () { + self.hoverBackgroundColor = this; + }, + function () { + self._runGlobalStyle(); + } + ), + { + width: 100, + el: { + type: TextButton.xtype, + cls: 'bi-list-item-active', + text: '测试悬浮状态', + }, + }, + ], + }; + } + + _createActiveBackgroundColor() { + var self = this; + return { + type: HTapeLayout.xtype, + cls: 'config-item bi-border-bottom', + height: 40, + items: [ + this._createLabel('激活状态背景颜色:'), + this._createColorPicker( + function () { + self.activeBackgroundColor = this; + }, + function () { + self._runGlobalStyle(); + } + ), + { + width: 100, + el: { + type: TextButton.xtype, + cls: 'bi-list-item-active', + text: '测试激活状态', + }, + }, + ], + }; + } + + _createSelectBackgroundColor() { + var self = this; + return { + type: HTapeLayout.xtype, + cls: 'config-item bi-border-bottom', + height: 40, + items: [ + this._createLabel('选中状态背景颜色:'), + this._createColorPicker( + function () { + self.selectBackgroundColor = this; + }, + function () { + self._runGlobalStyle(); + } + ), + { + width: 100, + el: { + type: TextButton.xtype, + cls: 'bi-list-item-active', + text: '测试选中状态', + }, + }, + ], + }; + } + + _createSlitColor() { + var self = this; + return { + type: HTapeLayout.xtype, + cls: 'config-item bi-border-bottom', + height: 40, + items: [ + this._createLabel('分割线颜色:'), + this._createColorPicker( + function () { + self.slitColor = this; + }, + function () { + self._runGlobalStyle(); + } + ), + ], + }; + } + + _createBaseConfig() { + return { + type: VerticalLayout.xtype, + items: [ + this._createLabel('--通用配色--'), + this._createBackgroundConfig(), + this._createCardBackgroundConfig(), + this._createFontConfig(), + this._createActiveFontConfig(), + this._createSelectFontConfig(), + this._createGrayFontConfig(), + this._createDisableFontConfig(), + this._createHoverBackgroundColor(), + this._createActiveBackgroundColor(), + this._createSelectBackgroundColor(), + this._createSlitColor(), + ], + }; + } + + _createButton1BackgroundConfig() { + var self = this; + return { + type: HTapeLayout.xtype, + cls: 'config-item bi-border-bottom', + height: 40, + items: [ + this._createLabel('按钮背景色1:'), + this._createColorPicker( + function () { + self.button1BackgroundColor = this; + }, + function () { + self._runGlobalStyle(); + } + ), + { + width: 100, + el: { + type: VerticalAdaptLayout.xtype, + height: 40, + items: [ + { + type: Button.xtype, + cls: 'config-button1', + text: '测试按钮', + }, + ], + }, + }, + ], + }; + } + + _createButton2BackgroundConfig() { + var self = this; + return { + type: HTapeLayout.xtype, + cls: 'config-item bi-border-bottom', + height: 40, + items: [ + this._createLabel('按钮背景色2:'), + this._createColorPicker( + function () { + self.button2BackgroundColor = this; + }, + function () { + self._runGlobalStyle(); + } + ), + { + width: 100, + el: { + type: VerticalAdaptLayout.xtype, + height: 40, + items: [ + { + type: Button.xtype, + level: 'success', + cls: 'config-button2', + text: '测试按钮', + }, + ], + }, + }, + ], + }; + } + + _createButton3BackgroundConfig() { + var self = this; + return { + type: HTapeLayout.xtype, + cls: 'config-item bi-border-bottom', + height: 40, + items: [ + this._createLabel('按钮背景色3:'), + this._createColorPicker( + function () { + self.button3BackgroundColor = this; + }, + function () { + self._runGlobalStyle(); + } + ), + { + width: 100, + el: { + type: VerticalAdaptLayout.xtype, + height: 40, + items: [ + { + type: Button.xtype, + level: 'warning', + cls: 'config-button3', + text: '测试按钮', + }, + ], + }, + }, + ], + }; + } + + _createButton4BackgroundConfig() { + var self = this; + return { + type: HTapeLayout.xtype, + cls: 'config-item bi-border-bottom', + height: 40, + items: [ + this._createLabel('按钮背景色4:'), + this._createColorPicker( + function () { + self.button4BackgroundColor = this; + }, + function () { + self._runGlobalStyle(); + } + ), + { + width: 100, + el: { + type: VerticalAdaptLayout.xtype, + height: 40, + items: [ + { + type: Button.xtype, + level: 'ignore', + cls: 'config-button4', + text: '测试按钮', + }, + ], + }, + }, + ], + }; + } + + _createScrollBackgroundConfig() { + var self = this; + return { + type: HTapeLayout.xtype, + cls: 'config-item bi-border-bottom', + height: 40, + items: [ + this._createLabel('滚动条底色:'), + this._createColorPicker( + function () { + self.scrollBackgroundColor = this; + }, + function () { + self._runGlobalStyle(); + } + ), + ], + }; + } + + _createScrollThumbConfig() { + var self = this; + return { + type: HTapeLayout.xtype, + cls: 'config-item bi-border-bottom', + height: 40, + items: [ + this._createLabel('滚动条thumb颜色:'), + this._createColorPicker( + function () { + self.scrollThumbColor = this; + }, + function () { + self._runGlobalStyle(); + } + ), + ], + }; + } + + _createPopupBackgroundConfig() { + var self = this; + return { + type: HTapeLayout.xtype, + cls: 'config-item bi-border-bottom', + height: 40, + items: [ + this._createLabel('下拉框背景颜色:'), + this._createColorPicker( + function () { + self.popupBackgroundColor = this; + }, + function () { + self._runGlobalStyle(); + } + ), + { + width: 100, + el: { + type: VerticalAdaptLayout.xtype, + items: [ + { + type: DownListCombo.xtype, + items: [ + [ + { + el: { + text: 'column 1111', + iconCls1: 'check-mark-e-font', + value: 11, + }, + children: [ + { + text: 'column 1.1', + value: 21, + cls: 'dot-e-font', + selected: true, + }, + { + text: 'column 1.222222222222222222222222222222222222', + cls: 'dot-e-font', + value: 22, + }, + { + text: 'column 1.3', + cls: 'dot-e-font', + value: 23, + }, + { + text: 'column 1.4', + cls: 'dot-e-font', + value: 24, + }, + { + text: 'column 1.5', + cls: 'dot-e-font', + value: 25, + }, + ], + }, + ], + [ + { + el: { + type: IconTextIconItem.xtype, + text: 'column 2', + iconCls1: 'chart-type-e-font', + cls: 'dot-e-font', + value: 12, + }, + disabled: true, + children: [ + { + type: IconTextItem.xtype, + cls: 'dot-e-font', + height: 25, + text: 'column 2.1', + value: 11, + }, + { text: 'column 2.2', value: 12, cls: 'dot-e-font' }, + ], + }, + ], + [ + { + text: 'column 33333333333333333333333333333333', + cls: 'style-set-e-font', + value: 13, + }, + ], + [ + { + text: 'column 4', + cls: 'filter-e-font', + value: 14, + }, + ], + [ + { + text: 'column 5', + cls: 'copy-e-font', + value: 15, + }, + ], + [ + { + text: 'column 6', + cls: 'delete-e-font', + value: 16, + }, + ], + [ + { + text: 'column 7', + cls: 'dimension-from-e-font', + value: 17, + disabled: true, + }, + ], + ], + }, + ], + }, + }, + ], + }; + } + + _createMaskBackgroundConfig() { + var self = this; + return { + type: HTapeLayout.xtype, + cls: 'config-item bi-border-bottom', + height: 40, + items: [ + this._createLabel('弹出层蒙版颜色:'), + this._createColorPicker( + function () { + self.maskBackgroundColor = this; + }, + function () { + self._runGlobalStyle(); + } + ), + { + width: 100, + el: { + type: VerticalAdaptLayout.xtype, + items: [ + { + type: Button.xtype, + text: 'mask测试', + handler() { + Msg.alert('弹出层', '弹出层面板'); + }, + }, + ], + }, + }, + ], + }; + } + + _createCommonConfig() { + return { + type: VerticalLayout.xtype, + items: [ + this._createLabel('--一般配色--'), + this._createButton1BackgroundConfig(), + this._createButton2BackgroundConfig(), + this._createButton3BackgroundConfig(), + this._createButton4BackgroundConfig(), + this._createScrollBackgroundConfig(), + this._createScrollThumbConfig(), + this._createPopupBackgroundConfig(), + this._createMaskBackgroundConfig(), + ], + }; + } + + render() { + var self = this; + return { + type: GridLayout.xtype, + items: [ + [ + { + el: { + type: VerticalLayout.xtype, + cls: 'face-config bi-border-right', + items: [this._createBaseConfig(), this._createCommonConfig()], + }, + }, + { + el: { + type: Layout.xtype, + }, + }, + ], + ], + }; + } + + _setStyle(objects) { + var result = ''; + each(objects, function (cls, object) { + result += cls + '{'; + each(object, function (name, value) { + result += name + ':' + value + ';'; + }); + result += '} '; + }); + StyleLoaders.removeStyle('style').loadStyle('style', result); + } + + _runGlobalStyle() { + var backgroundColor = this.backgroundColor.getValue(); + var fontColor = this.fontColor.getValue(); + var activeFontColor = this.activeFontColor.getValue(); + var selectFontColor = this.selectFontColor.getValue(); + var grayFontColor = this.grayFontColor.getValue(); + var disabledFontColor = this.disabledFontColor.getValue(); + var cardBackgroundColor = this.cardBackgroundColor.getValue(); + var hoverBackgroundColor = this.hoverBackgroundColor.getValue(); + var activeBackgroundColor = this.activeBackgroundColor.getValue(); + var selectBackgroundColor = this.selectBackgroundColor.getValue(); + var slitColor = this.slitColor.getValue(); + + var button1BackgroundColor = this.button1BackgroundColor.getValue(); + var button2BackgroundColor = this.button2BackgroundColor.getValue(); + var button3BackgroundColor = this.button3BackgroundColor.getValue(); + var button4BackgroundColor = this.button4BackgroundColor.getValue(); + var scrollBackgroundColor = this.scrollBackgroundColor.getValue(); + var scrollThumbColor = this.scrollThumbColor.getValue(); + var popupBackgroundColor = this.popupBackgroundColor.getValue(); + var maskBackgroundColor = this.maskBackgroundColor.getValue(); + + this._setStyle({ + 'body.bi-background, body .bi-background': { + 'background-color': backgroundColor, + color: fontColor, + }, + 'body .bi-card': { + 'background-color': cardBackgroundColor, + color: fontColor, + }, + 'body .bi-tips': { + color: grayFontColor, + }, + 'div::-webkit-scrollbar,.scrollbar-layout-main': { + 'background-color': scrollBackgroundColor + '!important', + }, + 'div::-webkit-scrollbar-thumb,.public-scrollbar-face:after': { + 'background-color': scrollThumbColor + '!important', + }, + '.base-disabled': { + color: disabledFontColor + '!important', + }, + '.base-disabled .b-font:before': { + color: disabledFontColor + '!important', + }, + '.list-view-outer': { + 'background-color': popupBackgroundColor + '!important', + }, + '.bi-z-index-mask': { + 'background-color': maskBackgroundColor + '!important', + }, + '.bi-list-item:hover,.bi-list-item-hover:hover,.bi-list-item-active:hover,.bi-list-item-select:hover,.bi-list-item-effect:hover': + { + 'background-color': hoverBackgroundColor + '!important', + }, + '.bi-list-item-active:active,.bi-list-item-select:active,.bi-list-item-effect:active': { + 'background-color': activeBackgroundColor + '!important', + color: activeFontColor + '!important', + }, + '.bi-list-item-active.active,.bi-list-item-select.active,.bi-list-item-effect.active': { + 'background-color': selectBackgroundColor + '!important', + color: selectFontColor + '!important', + }, + 'body .bi-button.button-common': { + 'background-color': button1BackgroundColor, + 'border-color': button1BackgroundColor, + }, + 'body .bi-button.button-success': { + 'background-color': button2BackgroundColor, + 'border-color': button2BackgroundColor, + }, + 'body .bi-button.button-warning': { + 'background-color': button3BackgroundColor, + 'border-color': button3BackgroundColor, + }, + 'body .bi-button.button-ignore': { + 'background-color': button4BackgroundColor, + }, + // 以下是分割线颜色 + 'body .bi-border,body .bi-border-top,#wrapper .bi-border-bottom,body .bi-border-left,body .bi-border-right': + { + 'border-color': slitColor, + }, + '.bi-collection-table-cell': { + 'border-right-color': slitColor, + 'border-bottom-color': slitColor, + }, + '.bi-collection-table-cell.first-col': { + 'border-left-color': slitColor, + }, + '.bi-collection-table-cell.first-row': { + 'border-top-color': slitColor, + }, + }); + } + + mounted() { + this.backgroundColor.setValue(''); + this.fontColor.setValue(''); + this.activeFontColor.setValue(''); + this.selectFontColor.setValue(''); + this.grayFontColor.setValue(''); + this.disabledFontColor.setValue(''); + this.cardBackgroundColor.setValue(''); + this.hoverBackgroundColor.setValue(''); + this.activeBackgroundColor.setValue(''); + this.selectBackgroundColor.setValue(''); + + this.button1BackgroundColor.setValue(''); + this.button2BackgroundColor.setValue(''); + this.button3BackgroundColor.setValue(''); + this.button4BackgroundColor.setValue(''); + this.scrollBackgroundColor.setValue(''); + this.scrollThumbColor.setValue(''); + this.popupBackgroundColor.setValue(''); + this.maskBackgroundColor.setValue(''); + this.slitColor.setValue(''); + this._runGlobalStyle(); + } +} diff --git a/packages/demo/src/index.js b/packages/demo/src/index.js new file mode 100644 index 000000000..056a80be8 --- /dev/null +++ b/packages/demo/src/index.js @@ -0,0 +1,34 @@ +import './less/index.less'; +import '../i18n/i18n.cn'; +import { createWidget, Layout, RouterWidget } from '@fui/core'; +import { Main } from './main'; +import { RouterDemo } from './center'; + +createWidget({ + type: RouterWidget.xtype, + routes: [ + { + path: '/', + component: function () { + return Promise.resolve({ + type: Layout.xtype, + }); + }, + }, + { + name: 'component', + path: '/component/:componentId', + component() { + return Promise.resolve({ + type: RouterDemo.xtype, + }); + }, + }, + ], + render() { + return { + type: Main.xtype, + element: '#wrapper', + }; + }, +}); diff --git a/packages/demo/src/less/face.less b/packages/demo/src/less/face.less new file mode 100644 index 000000000..041cd31ba --- /dev/null +++ b/packages/demo/src/less/face.less @@ -0,0 +1,11 @@ +@import "fineui.less"; + +.demo-face { + .face-config { + .config-label { + font-size: 1.4rem; + } + .config-item { + } + } +} \ No newline at end of file diff --git a/packages/demo/src/less/fineui.less b/packages/demo/src/less/fineui.less new file mode 100644 index 000000000..77a935b79 --- /dev/null +++ b/packages/demo/src/less/fineui.less @@ -0,0 +1 @@ +@import "../../node_modules/@fui/core/src/less/index.less"; \ No newline at end of file diff --git a/packages/demo/src/less/index.less b/packages/demo/src/less/index.less new file mode 100644 index 000000000..d9e864713 --- /dev/null +++ b/packages/demo/src/less/index.less @@ -0,0 +1,7 @@ +@import "./face.less"; +@import "./index.less"; +@import "./main.less"; +@import "./north.less"; +@import "./preview.less"; +@import "./vm.less"; +@import "./west.less"; diff --git a/packages/demo/src/less/main.less b/packages/demo/src/less/main.less new file mode 100644 index 000000000..ff1f415de --- /dev/null +++ b/packages/demo/src/less/main.less @@ -0,0 +1,103 @@ +@import "fineui.less"; + +.layout-bg-white { + background-color: #ffffff; +} + +.layout-bg-gray { + background-color: #eeeeee; +} + +.layout-bg1 { + color: #ffffff; + background-color: #0088cc; +} + +.layout-bg2 { + color: #ffffff; + background-color: #008B8B; +} + +.layout-bg3 { + color: #ffffff; + background-color: #6495ED; +} + +.layout-bg4 { + color: #ffffff; + background-color: #ff69b4; +} + +.layout-bg5 { + color: #ffffff; + background-color: #B8860B; +} + +.layout-bg6 { + color: #ffffff; + background-color: #d9534f; +} + +.layout-bg7 { + color: #ffffff; + background-color: #ea4738; +} + +.layout-bg8 { + color: #ffffff; + background-color: #6495ed; +} + +.demo-main { + & .bg1 { + background-color: #178cdf; + } +} + +body { + background-color: @color-bi-background-normal; +} + +#wrapper { + position: absolute; + left: 0; + right: 0; + top: 0; + bottom: 0; + font-size: 1.2rem; +} + +.bi-theme-dark body { + background-color: @color-bi-background-normal-theme-dark; +} + +.demo-editor { + border: 1px solid rgb(204, 204, 204); +} + +.demo-clolor { + color: #1a1a1a; +} + +.bi-progress-bar-processor { + transition: all 0.5s ease; + -webkit-transition: all 0.5s ease; + -moz-transition: all 0.5s ease; + -o-transition: all 0.5s ease; + background: #3f8ce8; + border-radius: 2rem; + overflow: hidden; + overflow-x: hidden; + overflow-y: hidden; +} + +.bi-progress-text-bar-processor { + transition: all 0.5s ease; + -webkit-transition: all 0.5s ease; + -moz-transition: all 0.5s ease; + -o-transition: all 0.5s ease; +} + +.bi-progress-bar-bar { + border-radius: 2rem; +} diff --git a/packages/demo/src/less/north.less b/packages/demo/src/less/north.less new file mode 100644 index 000000000..f174587dd --- /dev/null +++ b/packages/demo/src/less/north.less @@ -0,0 +1,12 @@ +@import "fineui.less"; + +.demo-north { + background-color: #3c8dbc; + & .logo { + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + color: @color-bi-text; + background-color: #367fa9; + font-size: 2rem; + font-weight: 300; + } +} \ No newline at end of file diff --git a/packages/demo/src/less/preview.less b/packages/demo/src/less/preview.less new file mode 100644 index 000000000..ac267e5a2 --- /dev/null +++ b/packages/demo/src/less/preview.less @@ -0,0 +1,8 @@ +@import "fineui.less"; + +.demo-preview { +} + +#wrapper { + font-size: 12px; +} \ No newline at end of file diff --git a/packages/demo/src/less/vm.less b/packages/demo/src/less/vm.less new file mode 100644 index 000000000..d962e2cc0 --- /dev/null +++ b/packages/demo/src/less/vm.less @@ -0,0 +1,123 @@ +@import "fineui.less"; + +.mvc-button { + &:hover, &.hover { + .opacity(0.5); + } + &.active, &:active { + .opacity(0.5) + } +} + +.bi-set-get { + & .left-title, & .right-title { + background: #0088cc; + color: #ffffff; + } + & .left-nav { + border-bottom: 1px solid #cccccc; + &.active, &:active { + color: #ffffff; + background-color: #d9534f; + } + } +} + +.bi-local { + & .top-button { + background-color: #448eea; + color: #ffffff + } + & .bottom-label { + background-color: #EA4738; + color: #ffffff; + } + & .delete-button { + background-color: #008B8B; + color: #ffffff; + } + & .vessel-border { + border-left: 1px solid #cccccc; + border-bottom: 1px solid #cccccc; + border-right: 1px solid #cccccc; + } +} + +.bi-event { + & .title { + background: #0088cc; + color: #ffffff; + } + & .front { + background: #ADD8E6; + } + & .nav { + border: 1px solid #cccccc; + } +} + +.bi-skip-to { + color: #ffffff; + + & .red-pane { + background-color: #0088cc; + } + & .blue-pane { + background-color: #6495ED; + } + & .green-pane { + background-color: #008B8B; + } + & .yellow-pane { + background-color: #B8860B; + } +} + +.bi-change { + & .outer-text { + background-color: #0088cc; + color: #ffffff; + } + & .inner { + border-left: 1px solid #cccccc; + border-bottom: 1px solid #cccccc; + border-right: 1px solid #cccccc; + } + + & .type-first { + background-color: #008B8B; + } + + & .type-second { + background-color: #6495ED; + } + + & .type-third { + background-color: #0088cc; + } +} + +.bi-tmp { + & .tmp-button { + color: #ffffff; + background: #0088cc; + } +} + +.bi-splice-duplicate { + & .superiors-label { + color: white; + background-color: #008B8B; + } + & .sd-child { + border: 1px solid #cccccc; + & .right-button-add { + color: white; + background-color: #0088cc; + } + & .right-button-del { + color: white; + background-color: #d9534f; + } + } +} \ No newline at end of file diff --git a/packages/demo/src/less/west.less b/packages/demo/src/less/west.less new file mode 100644 index 000000000..920fbc8b8 --- /dev/null +++ b/packages/demo/src/less/west.less @@ -0,0 +1,4 @@ +@import "fineui.less"; + +.demo-west { +} diff --git a/packages/demo/src/main.js b/packages/demo/src/main.js new file mode 100644 index 000000000..02f8f32ed --- /dev/null +++ b/packages/demo/src/main.js @@ -0,0 +1,36 @@ +import { shortcut, Widget, BorderLayout, Label } from "@fui/core"; +import { West } from "./west"; +import { Center } from "./center"; +import { North } from "./north"; + +@shortcut() +export class Main extends Widget { + static xtype = "demo.main"; + + props = { baseCls: "demo-main bi-background" }; + + render() { + return { + type: BorderLayout.xtype, + items: { + north: { + height: 50, + el: { + type: North, + }, + }, + west: { + width: 230, + el: { + type: West.xtype, + }, + }, + center: { + el: { + type: Center.xtype, + }, + }, + }, + }; + } +} diff --git a/packages/demo/src/north.js b/packages/demo/src/north.js new file mode 100644 index 000000000..562dbe313 --- /dev/null +++ b/packages/demo/src/north.js @@ -0,0 +1,66 @@ +import { Widget, Button, $, HTapeLayout, TextButton, FloatRightLayout, } from "@fui/core"; + +export class North extends Widget { + static xtype = "demo.north"; + static EVENT_VALUE_CHANGE = "EVENT_VALUE_CHANGE"; + + props = { + baseCls: "demo-north" + }; + + render() { + var self = this; + return { + type: HTapeLayout.xtype, + items: [ + { + width: 230, + el: { + type: TextButton.xtype, + listeners: [ + { + eventName: Button.EVENT_CHANGE, + action: function () { + // self.fireEvent( + // Demo.North.EVENT_VALUE_CHANGE, + // "" + // ); + } + } + ], + cls: "logo", + height: 50, + text: "FineUI2.0" + } + }, + { + el: { + type: FloatRightLayout.xtype, + hgap: 10, + items: [ + { + type: TextButton.xtype, + text: "星空蓝", + handler: function () { + $("html") + .removeClass(undefined.xtype) + .addClass(undefined.xtype); + } + }, + { + type: TextButton.xtype, + text: "典雅白", + handler: function () { + $("html") + .removeClass(undefined.xtype) + .addClass(undefined.xtype); + } + } + ] + } + } + ] + }; + } +} + diff --git a/packages/demo/src/west.js b/packages/demo/src/west.js new file mode 100644 index 000000000..13109b203 --- /dev/null +++ b/packages/demo/src/west.js @@ -0,0 +1,101 @@ +import { + Widget, + shortcut, + VTapeLayout, + CenterAdaptLayout, + Searcher, + SearchEditor, + Func, + concat, + each, + Router, + MultiLayerSingleLevelTree, +} from '@fui/core'; +import { demoConfig } from './config'; + +@shortcut() +export class West extends Widget { + static xtype = 'demo.west'; + static EVENT_VALUE_CHANGE = 'EVENT_VALUE_CHANGE'; + + props = { + baseCls: 'demo-west bi-border-right bi-card', + }; + + mounted() { + this.searcher.setAdapter(this.tree); + } + + render() { + var self = this; + + // var selectedId = BI.Router.$router.currentRoute.params?.componentId; + + return { + type: VTapeLayout.xtype, + items: [ + { + type: CenterAdaptLayout.xtype, + items: [ + { + type: Searcher.xtype, + el: { + type: SearchEditor.xtype, + watermark: '简单搜索', + }, + width: 200, + isAutoSearch: false, + isAutoSync: false, + ref: function (ref) { + self.searcher = ref; + }, + popup: { + type: MultiLayerSingleLevelTree.xtype, + cls: 'bi-card', + listeners: [ + { + eventName: MultiLayerSingleLevelTree.EVENT_CHANGE, + action: function (v) {}, + }, + ], + }, + onSearch: function (op, callback) { + var result = Func.getSearchResult(Demo.CONFIG, op.keyword, 'text'); + var items = concat(result.match, result.find); + var children = []; + each(items, function (index, item) { + var childList = Func.getSearchResult(Demo.CONFIG, item.id, 'pId'); + each(childList.match, function (index, child) { + if (child.value) { + children.push(child); + } + }); + }); + items = concat(items, children); + callback(items); + }, + }, + ], + height: 40, + }, + { + type: MultiLayerSingleLevelTree.xtype, + listeners: [ + { + eventName: MultiLayerSingleLevelTree.EVENT_CHANGE, + action: function (v) { + Router.$router.push({ + name: 'component', + params: { + componentId: v, + }, + }); + }, + }, + ], + items: demoConfig, + }, + ], + }; + } +} diff --git a/packages/demo/webpack.dev.js b/packages/demo/webpack.dev.js new file mode 100644 index 000000000..4a3743bf1 --- /dev/null +++ b/packages/demo/webpack.dev.js @@ -0,0 +1,38 @@ +const HtmlWebpackPlugin = require('html-webpack-plugin'); +const path = require('path'); + +module.exports = { + mode: 'development', + entry: './src/index.js', + devServer: { + port: 3000, + liveReload: true, + }, + module: { + rules: [ + { + test: /\.js$/, + exclude: /node_modules/, + use: { + loader: 'babel-loader', + }, + }, + { + test: /\.less$/i, + use: ['style-loader', 'css-loader', 'less-loader'], + }, + ], + }, + devtool: 'source-map', + resolve: { + extensions: ['.js', '.ts'], + alias: { + '@': path.resolve(__dirname, './src'), + }, + }, + plugins: [ + new HtmlWebpackPlugin({ + template: 'index.html', + }), + ], +}; diff --git a/packages/fineui/babel.config.js b/packages/fineui/babel.config.js new file mode 100644 index 000000000..d01a496d7 --- /dev/null +++ b/packages/fineui/babel.config.js @@ -0,0 +1 @@ +module.exports = require('@fui/babel-preset-fineui').configs.base; \ No newline at end of file diff --git a/es6.babel.js b/packages/fineui/esm.babel.js similarity index 100% rename from es6.babel.js rename to packages/fineui/esm.babel.js diff --git a/packages/fineui/package.json b/packages/fineui/package.json new file mode 100644 index 000000000..a7dd64fb6 --- /dev/null +++ b/packages/fineui/package.json @@ -0,0 +1,43 @@ +{ + "name": "@fui/core", + "version": "2.0.20230208163847", + "description": "fineui", + "main": "dist/fineui_without_conflict.min.js", + "module": "dist/es/index.js", + "types": "dist/type/index.d.ts", + "sideEffects": [ + "dist/es/core/*.js", + "dist/es/polyfill/**/*.js", + "dist/es/core/platform/**/*.js", + "dist/es/case/ztree/jquery.ztree.core-3.5.js", + "dist/es/case/ztree/jquery.ztree.excheck-3.5.js" + ], + "bin": { + "fui-cli": "./bin/cli/cli.js" + }, + "scripts": { + "dev": "babel src -d dist/es --config-file ./esm.babel.js -w" + }, + "repository": { + "type": "git", + "url": "https://git.coding.net/fanruan/fineui.git" + }, + "keywords": [ + "ui", + "fineui", + "finebi" + ], + "publishConfig": { + "registry": "https://registry.npmjs.org" + }, + "author": "fanruan", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.21.0", + "@juggle/resize-observer": "^3.4.0", + "@popperjs/core": "2.11.6", + "@types/yargs": "17.0.13", + "jquery": "3.6.3", + "yargs": "17.6.2" + } +} diff --git a/packages/fineui/src/base/0.base.js b/packages/fineui/src/base/0.base.js new file mode 100644 index 000000000..3cf9b52a3 --- /dev/null +++ b/packages/fineui/src/base/0.base.js @@ -0,0 +1,23 @@ +import { + BroadcastController, + BubblesController, + DrawerController, + LayerController, + MaskersController, + PopoverController, + ResizeController, + TooltipsController, +} from '../core/controller'; +import { StyleLoaderManager } from '../core/loader/loader.style'; + +const Resizers = new ResizeController(); +const Layers = new LayerController(); +const Maskers = new MaskersController(); +const Bubbles = new BubblesController(); +const Tooltips = new TooltipsController(); +const Popovers = new PopoverController(); +const Drawers = new DrawerController(); +const Broadcasts = new BroadcastController(); +const StyleLoaders = new StyleLoaderManager(); + +export { Resizers, Layers, Maskers, Bubbles, Tooltips, Popovers, Drawers, Broadcasts, StyleLoaders }; diff --git a/packages/fineui/src/base/1.pane.js b/packages/fineui/src/base/1.pane.js new file mode 100644 index 000000000..e36f2bd81 --- /dev/null +++ b/packages/fineui/src/base/1.pane.js @@ -0,0 +1,161 @@ +import { + AbsoluteCenterLayout, + CenterAdaptLayout, + HorizontalAdaptLayout, + VerticalLayout, + Widget, + shortcut, + isNotEmptyString, + extend, + isNull, + isEmpty, + createWidget, + Providers, + i18nText, + emptyFn, + SystemProvider +} from "@/core"; +import { Label, Text } from "./single"; +import { Layers } from "@/base/0.base"; + +/** + * 当没有元素时有提示信息的view + * + * Created by GUY on 2015/9/8. + * @class Pane + * @extends Widget + * @abstract + */ + +@shortcut() +export class Pane extends Widget { + static xtype = "bi.pane"; + static EVENT_LOADED = "EVENT_LOADED"; + static EVENT_LOADING = "EVENT_LOADING"; + + _defaultConfig() { + return extend(super._defaultConfig(), { + _baseCls: "bi-pane", + tipText: i18nText("BI-No_Selected_Item"), + loadingText: "", + loadingSize: "small", + overlap: true, + onLoaded: emptyFn, + }); + } + + _assertTip() { + if (!this._tipText) { + createWidget({ + type: AbsoluteCenterLayout.xtype, + element: this, + items: [ + { + type: Label.xtype, + ref: _ref => { + this._tipText = _ref; + }, + cls: "bi-tips", + text: this.options.tipText, + height: 25, + } + ], + }); + } + } + + loading() { + const o = this.options; + const loadingAnimation = createWidget( + Providers.getProvider(SystemProvider.xtype).getLoading({ + loadingSize: o.loadingSize, + context: this, + }) + ); + // pane在同步方式下由items决定tipText的显示与否 + // loading的异步情况下由loaded后对面板的populate的时机决定 + this.setTipVisible(false); + if (o.overlap === true) { + if (!Layers.has(`${this.getName()}-loading`)) { + createWidget({ + type: CenterAdaptLayout.xtype, + cls: "loading-container", + items: this._getLoadingTipItems(loadingAnimation), + element: Layers.make(`${this.getName()}-loading`, this), + }); + } + Layers.show(`${this.getName()}-loading`); + } else if (isNull(this._loading)) { + loadingAnimation.element.css("zIndex", 1); + createWidget({ + type: CenterAdaptLayout.xtype, + element: this, + cls: "loading-container", + items: this._getLoadingTipItems(loadingAnimation), + }); + } + this.fireEvent(Pane.EVENT_LOADING); + this.element.addClass("loading-status"); + } + + _getSize(v) { + return Math.ceil(v / (this.options.loadingSize === "small" ? 2 : 1)); + } + + _getLoadingTipItems(loadingTip) { + const o = this.options; + const loadingTipItems = [ + { + type: HorizontalAdaptLayout.xtype, + items: [loadingTip], + } + ]; + isNotEmptyString(o.loadingText) && + loadingTipItems.push({ + type: Text.xtype, + text: o.loadingText, + tgap: this._getSize(10), + }); + + return [ + { + type: VerticalLayout.xtype, + ref: _ref => { + this._loading = _ref; + }, + items: loadingTipItems, + } + ]; + } + + loaded() { + Layers.remove(`${this.getName()}-loading`); + this._loading && this._loading.destroy(); + this.options.onLoaded(); + this.fireEvent(Pane.EVENT_LOADED); + this.element.removeClass("loading-status"); + } + + check() { + this.setTipVisible(isEmpty(this.options.items)); + } + + setTipVisible(b) { + if (b === true) { + this._assertTip(); + this._tipText && this._tipText.setVisible(true); + } else { + this._tipText && this._tipText.setVisible(false); + } + } + + setTipText(text) { + this._assertTip(); + this._tipText.setText(text); + } + + populate(items) { + this.options.items = items || []; + this.check(); + } +} diff --git a/src/base/behavior/0.behavior.js b/packages/fineui/src/base/behavior/0.behavior.js similarity index 100% rename from src/base/behavior/0.behavior.js rename to packages/fineui/src/base/behavior/0.behavior.js diff --git a/src/base/behavior/behavior.highlight.js b/packages/fineui/src/base/behavior/behavior.highlight.js similarity index 100% rename from src/base/behavior/behavior.highlight.js rename to packages/fineui/src/base/behavior/behavior.highlight.js diff --git a/src/base/behavior/behavior.redmark.js b/packages/fineui/src/base/behavior/behavior.redmark.js similarity index 100% rename from src/base/behavior/behavior.redmark.js rename to packages/fineui/src/base/behavior/behavior.redmark.js diff --git a/src/base/behavior/index.js b/packages/fineui/src/base/behavior/index.js similarity index 100% rename from src/base/behavior/index.js rename to packages/fineui/src/base/behavior/index.js diff --git a/src/base/collection/__test__/collection.test.js b/packages/fineui/src/base/collection/__test__/collection.test.js similarity index 100% rename from src/base/collection/__test__/collection.test.js rename to packages/fineui/src/base/collection/__test__/collection.test.js diff --git a/src/base/collection/collection.js b/packages/fineui/src/base/collection/collection.js similarity index 100% rename from src/base/collection/collection.js rename to packages/fineui/src/base/collection/collection.js diff --git a/src/base/combination/bubble.js b/packages/fineui/src/base/combination/bubble.js similarity index 100% rename from src/base/combination/bubble.js rename to packages/fineui/src/base/combination/bubble.js diff --git a/src/base/combination/combo.js b/packages/fineui/src/base/combination/combo.js similarity index 100% rename from src/base/combination/combo.js rename to packages/fineui/src/base/combination/combo.js diff --git a/src/base/combination/expander.js b/packages/fineui/src/base/combination/expander.js similarity index 100% rename from src/base/combination/expander.js rename to packages/fineui/src/base/combination/expander.js diff --git a/src/base/combination/group.button.js b/packages/fineui/src/base/combination/group.button.js similarity index 100% rename from src/base/combination/group.button.js rename to packages/fineui/src/base/combination/group.button.js diff --git a/src/base/combination/group.combo.js b/packages/fineui/src/base/combination/group.combo.js similarity index 100% rename from src/base/combination/group.combo.js rename to packages/fineui/src/base/combination/group.combo.js diff --git a/src/base/combination/group.virtual.js b/packages/fineui/src/base/combination/group.virtual.js similarity index 100% rename from src/base/combination/group.virtual.js rename to packages/fineui/src/base/combination/group.virtual.js diff --git a/src/base/combination/index.js b/packages/fineui/src/base/combination/index.js similarity index 100% rename from src/base/combination/index.js rename to packages/fineui/src/base/combination/index.js diff --git a/src/base/combination/loader.js b/packages/fineui/src/base/combination/loader.js similarity index 100% rename from src/base/combination/loader.js rename to packages/fineui/src/base/combination/loader.js diff --git a/src/base/combination/navigation.js b/packages/fineui/src/base/combination/navigation.js similarity index 100% rename from src/base/combination/navigation.js rename to packages/fineui/src/base/combination/navigation.js diff --git a/src/base/combination/searcher.js b/packages/fineui/src/base/combination/searcher.js similarity index 100% rename from src/base/combination/searcher.js rename to packages/fineui/src/base/combination/searcher.js diff --git a/src/base/combination/switcher.js b/packages/fineui/src/base/combination/switcher.js similarity index 100% rename from src/base/combination/switcher.js rename to packages/fineui/src/base/combination/switcher.js diff --git a/src/base/combination/tab.js b/packages/fineui/src/base/combination/tab.js similarity index 100% rename from src/base/combination/tab.js rename to packages/fineui/src/base/combination/tab.js diff --git a/src/base/combination/tree.button.js b/packages/fineui/src/base/combination/tree.button.js similarity index 100% rename from src/base/combination/tree.button.js rename to packages/fineui/src/base/combination/tree.button.js diff --git a/src/base/context.js b/packages/fineui/src/base/context.js similarity index 100% rename from src/base/context.js rename to packages/fineui/src/base/context.js diff --git a/src/base/el.js b/packages/fineui/src/base/el.js similarity index 100% rename from src/base/el.js rename to packages/fineui/src/base/el.js diff --git a/src/base/foundation/__test__/message.test.js b/packages/fineui/src/base/foundation/__test__/message.test.js similarity index 100% rename from src/base/foundation/__test__/message.test.js rename to packages/fineui/src/base/foundation/__test__/message.test.js diff --git a/src/base/foundation/message.js b/packages/fineui/src/base/foundation/message.js similarity index 100% rename from src/base/foundation/message.js rename to packages/fineui/src/base/foundation/message.js diff --git a/src/base/grid/__test__/grid.test.js b/packages/fineui/src/base/grid/__test__/grid.test.js similarity index 100% rename from src/base/grid/__test__/grid.test.js rename to packages/fineui/src/base/grid/__test__/grid.test.js diff --git a/src/base/grid/grid.js b/packages/fineui/src/base/grid/grid.js similarity index 100% rename from src/base/grid/grid.js rename to packages/fineui/src/base/grid/grid.js diff --git a/src/base/index.js b/packages/fineui/src/base/index.js similarity index 100% rename from src/base/index.js rename to packages/fineui/src/base/index.js diff --git a/src/base/layer/__test__/layer.popover.test.js b/packages/fineui/src/base/layer/__test__/layer.popover.test.js similarity index 100% rename from src/base/layer/__test__/layer.popover.test.js rename to packages/fineui/src/base/layer/__test__/layer.popover.test.js diff --git a/src/base/layer/index.js b/packages/fineui/src/base/layer/index.js similarity index 100% rename from src/base/layer/index.js rename to packages/fineui/src/base/layer/index.js diff --git a/src/base/layer/layer.drawer.js b/packages/fineui/src/base/layer/layer.drawer.js similarity index 100% rename from src/base/layer/layer.drawer.js rename to packages/fineui/src/base/layer/layer.drawer.js diff --git a/src/base/layer/layer.popover.js b/packages/fineui/src/base/layer/layer.popover.js similarity index 100% rename from src/base/layer/layer.popover.js rename to packages/fineui/src/base/layer/layer.popover.js diff --git a/src/base/layer/layer.popup.js b/packages/fineui/src/base/layer/layer.popup.js similarity index 100% rename from src/base/layer/layer.popup.js rename to packages/fineui/src/base/layer/layer.popup.js diff --git a/src/base/layer/layer.searcher.js b/packages/fineui/src/base/layer/layer.searcher.js similarity index 100% rename from src/base/layer/layer.searcher.js rename to packages/fineui/src/base/layer/layer.searcher.js diff --git a/src/base/list/__test__/listview.test.js b/packages/fineui/src/base/list/__test__/listview.test.js similarity index 100% rename from src/base/list/__test__/listview.test.js rename to packages/fineui/src/base/list/__test__/listview.test.js diff --git a/src/base/list/index.js b/packages/fineui/src/base/list/index.js similarity index 100% rename from src/base/list/index.js rename to packages/fineui/src/base/list/index.js diff --git a/src/base/list/listview.js b/packages/fineui/src/base/list/listview.js similarity index 100% rename from src/base/list/listview.js rename to packages/fineui/src/base/list/listview.js diff --git a/src/base/list/virtualgrouplist.js b/packages/fineui/src/base/list/virtualgrouplist.js similarity index 100% rename from src/base/list/virtualgrouplist.js rename to packages/fineui/src/base/list/virtualgrouplist.js diff --git a/src/base/list/virtuallist.js b/packages/fineui/src/base/list/virtuallist.js similarity index 100% rename from src/base/list/virtuallist.js rename to packages/fineui/src/base/list/virtuallist.js diff --git a/packages/fineui/src/base/pager/pager.js b/packages/fineui/src/base/pager/pager.js new file mode 100644 index 000000000..19f47066f --- /dev/null +++ b/packages/fineui/src/base/pager/pager.js @@ -0,0 +1,418 @@ +import { + HorizontalLayout, + Widget, + shortcut, + extend, + emptyFn, + result, + isKey, + createWidget, + map, + stripEL, + formatEL, + Controller, + Events, + MIN, + MAX +} from "@/core"; +import { Label } from "../single"; +import { ButtonGroup } from "../combination"; + +/** + * 分页控件 + * + * Created by GUY on 2015/8/31. + * @class Pager + * @extends Widget + */ + +@shortcut() +export class Pager extends Widget { + static xtype = "bi.pager"; + static EVENT_CHANGE = "EVENT_CHANGE"; + static EVENT_AFTER_POPULATE = "EVENT_AFTER_POPULATE"; + + _defaultConfig() { + return extend(super._defaultConfig(...arguments), { + baseCls: "bi-pager", + behaviors: {}, + layouts: [ + { + type: HorizontalLayout.xtype, + hgap: 10, + vgap: 0 + } + ], + + dynamicShow: true, // 是否动态显示上一页、下一页、首页、尾页, 若为false,则指对其设置使能状态 + // dynamicShow为false时以下两个有用 + dynamicShowFirstLast: false, // 是否动态显示首页、尾页 + dynamicShowPrevNext: false, // 是否动态显示上一页、下一页 + pages: false, // 总页数 + curr: () => 1, // 初始化当前页 + groups: 0, // 连续显示分页数 + jump: emptyFn, // 分页的回调函数 + first: false, // 是否显示首页 + last: false, // 是否显示尾页 + prev: "上一页", + next: "下一页", + + firstPage: 1, + lastPage: () => + // 在万不得已时才会调用这个函数获取最后一页的页码, 主要作用于setValue方法 + 1, + hasPrev: emptyFn, // pages不可用时有效 + hasNext: emptyFn // pages不可用时有效 + }); + } + + render() { + this.currPage = result(this.options, "curr"); + // 翻页太灵敏 + // this._lock = false; + // this._debouce = debounce(function () { + // self._lock = false; + // }, 300); + this._populate(); + } + + _populate() { + const o = this.options, + view = [], + dict = {}; + const { + dynamicShow, + dynamicShowPrevNext, + hasPrev, + dynamicShowFirstLast, + hasNext, + behaviors, + layouts, + jump + } = this.options; + this.empty(); + const pages = result(o, "pages"); + const curr = result(this, "currPage"); + let groups = result(o, "groups"); + let first = result(o, "first"); + let last = result(o, "last"); + const prev = result(o, "prev"); + const next = result(o, "next"); + + if (pages === false) { + groups = 0; + first = false; + last = false; + } else { + groups > pages && (groups = pages); + } + + // 计算当前组 + dict.index = Math.ceil( + (curr + (groups > 1 && groups !== pages ? 1 : 0)) / + (groups === 0 ? 1 : groups) + ); + + // 当前页非首页,则输出上一页 + if ( + ((!dynamicShow && !dynamicShowPrevNext) || curr > 1) && + prev !== false + ) { + if (isKey(prev)) { + view.push({ + text: prev, + value: "prev", + disabled: + pages === false + ? hasPrev(curr) === false + : !(curr > 1 && prev !== false) + }); + } else { + view.push({ + el: extend( + { + disabled: + pages === false + ? hasPrev(curr) === false + : !(curr > 1 && prev !== false) + }, + prev + ) + }); + } + } + + // 当前组非首组,则输出首页 + if ( + ((!dynamicShow && !dynamicShowFirstLast) || + (dict.index > 1 && groups !== 0)) && + first + ) { + view.push({ + text: first, + value: "first", + disabled: !(dict.index > 1 && groups !== 0) + }); + if (dict.index > 1 && groups !== 0 && groups !== pages - 1) { + view.push({ + type: Label.xtype, + cls: "page-ellipsis", + text: "\u2026" + }); + } + } + + // 输出当前页组 + dict.poor = Math.floor((groups - 1) / 2); + dict.start = dict.index > 1 ? curr - dict.poor : 1; + dict.end = + dict.index > 1 + ? (function () { + const max = curr + (groups - dict.poor - 1); + + return max > pages ? pages : max; + })() + : groups; + if (dict.end - dict.start < groups - 1) { + // 最后一组状态 + dict.start = dict.end - groups + 1; + } + let s = dict.start, + e = dict.end; + if ( + first && + last && + dict.index > 1 && + groups !== 0 && + pages > groups && + dict.end < pages && + groups !== 0 + ) { + s++; + e--; + } + for (; s <= e; s++) { + if (s === curr) { + view.push({ + text: s, + value: s, + selected: true + }); + } else { + view.push({ + text: s, + value: s + }); + } + } + + // 总页数大于连续分页数,且当前组最大页小于总页,输出尾页 + if ( + ((!dynamicShow && !dynamicShowFirstLast) || + (pages > groups && dict.end < pages && groups !== 0)) && + last + ) { + if ( + pages > groups && + dict.end < pages && + groups !== 0 && + groups !== pages - 1 + ) { + view.push({ + type: Label.xtype, + cls: "page-ellipsis", + text: "\u2026" + }); + } + view.push({ + text: last, + value: "last", + disabled: !(pages > groups && dict.end < pages && groups !== 0) + }); + } + + // 当前页不为尾页时,输出下一页 + dict.flow = !prev && groups === 0; + if ( + (!dynamicShow && !dynamicShowPrevNext && next) || + (curr !== pages && next) || + dict.flow + ) { + view.push( + (function () { + if (isKey(next)) { + if (pages === false) { + return { + text: next, + value: "next", + disabled: hasNext(curr) === false + }; + } + + return dict.flow && curr === pages + ? { text: next, value: "next", disabled: true } + : { + text: next, + value: "next", + disabled: !( + (curr !== pages && next) || + dict.flow + ) + }; + } + + return { + el: extend( + { + disabled: + pages === false + ? hasNext(curr) === false + : !( + (curr !== pages && next) || + dict.flow + ) + }, + next + ) + }; + })() + ); + } + + this.button_group = createWidget({ + type: ButtonGroup.xtype, + element: this, + items: map(view, (idx, v) => { + v = extend( + { + cls: "bi-list-item-select bi-border-radius", + height: 23, + hgap: v.el ? 0 : 10, + stopPropagation: true + }, + stripEL(v) + ); + + return formatEL(v); + }), + behaviors, + layouts + }); + this.button_group.on( + Controller.EVENT_CHANGE, + (type, value, obj, ...args) => { + // if (self._lock === true) { + // return; + // } + // self._lock = true; + // self._debouce(); + if (type === Events.CLICK) { + const v = this.button_group.getValue()[0]; + switch (v) { + case "first": + this.currPage = 1; + break; + case "last": + this.currPage = pages; + break; + case "prev": + this.currPage--; + break; + case "next": + this.currPage++; + break; + default: + this.currPage = v; + break; + } + jump.apply(this, [ + { + pages, + curr: this.currPage + } + ]); + this._populate(); + this.fireEvent(Pager.EVENT_CHANGE, obj); + } + this.fireEvent( + Controller.EVENT_CHANGE, + type, + value, + obj, + ...args + ); + } + ); + this.fireEvent(Pager.EVENT_AFTER_POPULATE); + } + + getCurrentPage() { + return this.currPage; + } + + setAllPages(pages) { + this.options.pages = pages; + this._populate(); + } + + hasPrev(v) { + v || (v = 1); + const { pages, hasPrev } = this.options; + + return pages === false ? hasPrev(v) : v > 1; + } + + hasNext(v) { + v || (v = 1); + const { pages, hasNext } = this.options; + + return pages === false ? hasNext(v) : v < pages; + } + + setValue(v) { + const o = this.options; + const { pages } = this.options; + v = v || 0; + v = v < 1 ? 1 : v; + if (pages === false) { + const lastPage = result(o, "lastPage"); + let firstPage = 1; + this.currPage = + v > lastPage + ? lastPage + : ((firstPage = result(o, "firstPage")), + v < firstPage ? firstPage : v); + } else { + v = v > pages ? pages : v; + this.currPage = v; + } + this._populate(); + } + + getValue() { + const val = this.button_group.getValue()[0]; + switch (val) { + case "prev": + return -1; + case "next": + return 1; + case "first": + return MIN; + case "last": + return MAX; + default: + return val; + } + } + + attr(key, value) { + super.attr(...arguments); + if (key === "curr") { + this.currPage = result(this.options, "curr"); + } + } + + populate() { + this._populate(); + } +} diff --git a/src/base/single/0.single.js b/packages/fineui/src/base/single/0.single.js similarity index 100% rename from src/base/single/0.single.js rename to packages/fineui/src/base/single/0.single.js diff --git a/src/base/single/1.text.js b/packages/fineui/src/base/single/1.text.js similarity index 100% rename from src/base/single/1.text.js rename to packages/fineui/src/base/single/1.text.js diff --git a/src/base/single/__test__/text.test.js b/packages/fineui/src/base/single/__test__/text.test.js similarity index 100% rename from src/base/single/__test__/text.test.js rename to packages/fineui/src/base/single/__test__/text.test.js diff --git a/src/base/single/a/__test__/a.test.js b/packages/fineui/src/base/single/a/__test__/a.test.js similarity index 100% rename from src/base/single/a/__test__/a.test.js rename to packages/fineui/src/base/single/a/__test__/a.test.js diff --git a/src/base/single/a/a.js b/packages/fineui/src/base/single/a/a.js similarity index 100% rename from src/base/single/a/a.js rename to packages/fineui/src/base/single/a/a.js diff --git a/src/base/single/bar/bar.loading.js b/packages/fineui/src/base/single/bar/bar.loading.js similarity index 100% rename from src/base/single/bar/bar.loading.js rename to packages/fineui/src/base/single/bar/bar.loading.js diff --git a/src/base/single/button/button.basic.js b/packages/fineui/src/base/single/button/button.basic.js similarity index 100% rename from src/base/single/button/button.basic.js rename to packages/fineui/src/base/single/button/button.basic.js diff --git a/src/base/single/button/button.node.js b/packages/fineui/src/base/single/button/button.node.js similarity index 100% rename from src/base/single/button/button.node.js rename to packages/fineui/src/base/single/button/button.node.js diff --git a/src/base/single/button/buttons/__test__/button.test.js b/packages/fineui/src/base/single/button/buttons/__test__/button.test.js similarity index 100% rename from src/base/single/button/buttons/__test__/button.test.js rename to packages/fineui/src/base/single/button/buttons/__test__/button.test.js diff --git a/src/base/single/button/buttons/button.icon.js b/packages/fineui/src/base/single/button/buttons/button.icon.js similarity index 100% rename from src/base/single/button/buttons/button.icon.js rename to packages/fineui/src/base/single/button/buttons/button.icon.js diff --git a/src/base/single/button/buttons/button.image.js b/packages/fineui/src/base/single/button/buttons/button.image.js similarity index 100% rename from src/base/single/button/buttons/button.image.js rename to packages/fineui/src/base/single/button/buttons/button.image.js diff --git a/src/base/single/button/buttons/button.js b/packages/fineui/src/base/single/button/buttons/button.js similarity index 100% rename from src/base/single/button/buttons/button.js rename to packages/fineui/src/base/single/button/buttons/button.js diff --git a/src/base/single/button/buttons/button.text.js b/packages/fineui/src/base/single/button/buttons/button.text.js similarity index 100% rename from src/base/single/button/buttons/button.text.js rename to packages/fineui/src/base/single/button/buttons/button.text.js diff --git a/src/base/single/button/index.js b/packages/fineui/src/base/single/button/index.js similarity index 100% rename from src/base/single/button/index.js rename to packages/fineui/src/base/single/button/index.js diff --git a/src/base/single/button/listitem/blankiconicontextitem.js b/packages/fineui/src/base/single/button/listitem/blankiconicontextitem.js similarity index 100% rename from src/base/single/button/listitem/blankiconicontextitem.js rename to packages/fineui/src/base/single/button/listitem/blankiconicontextitem.js diff --git a/src/base/single/button/listitem/blankicontexticonitem.js b/packages/fineui/src/base/single/button/listitem/blankicontexticonitem.js similarity index 100% rename from src/base/single/button/listitem/blankicontexticonitem.js rename to packages/fineui/src/base/single/button/listitem/blankicontexticonitem.js diff --git a/src/base/single/button/listitem/blankicontextitem.js b/packages/fineui/src/base/single/button/listitem/blankicontextitem.js similarity index 100% rename from src/base/single/button/listitem/blankicontextitem.js rename to packages/fineui/src/base/single/button/listitem/blankicontextitem.js diff --git a/src/base/single/button/listitem/icontexticonitem.js b/packages/fineui/src/base/single/button/listitem/icontexticonitem.js similarity index 100% rename from src/base/single/button/listitem/icontexticonitem.js rename to packages/fineui/src/base/single/button/listitem/icontexticonitem.js diff --git a/src/base/single/button/listitem/icontextitem.js b/packages/fineui/src/base/single/button/listitem/icontextitem.js similarity index 100% rename from src/base/single/button/listitem/icontextitem.js rename to packages/fineui/src/base/single/button/listitem/icontextitem.js diff --git a/src/base/single/button/listitem/texticonitem.js b/packages/fineui/src/base/single/button/listitem/texticonitem.js similarity index 100% rename from src/base/single/button/listitem/texticonitem.js rename to packages/fineui/src/base/single/button/listitem/texticonitem.js diff --git a/src/base/single/button/listitem/textitem.js b/packages/fineui/src/base/single/button/listitem/textitem.js similarity index 100% rename from src/base/single/button/listitem/textitem.js rename to packages/fineui/src/base/single/button/listitem/textitem.js diff --git a/src/base/single/button/node/__test__/icontexticonnode.test.js b/packages/fineui/src/base/single/button/node/__test__/icontexticonnode.test.js similarity index 100% rename from src/base/single/button/node/__test__/icontexticonnode.test.js rename to packages/fineui/src/base/single/button/node/__test__/icontexticonnode.test.js diff --git a/src/base/single/button/node/__test__/icontextnode.test.js b/packages/fineui/src/base/single/button/node/__test__/icontextnode.test.js similarity index 100% rename from src/base/single/button/node/__test__/icontextnode.test.js rename to packages/fineui/src/base/single/button/node/__test__/icontextnode.test.js diff --git a/src/base/single/button/node/__test__/texticonnode.test.js b/packages/fineui/src/base/single/button/node/__test__/texticonnode.test.js similarity index 100% rename from src/base/single/button/node/__test__/texticonnode.test.js rename to packages/fineui/src/base/single/button/node/__test__/texticonnode.test.js diff --git a/src/base/single/button/node/__test__/textnode.test.js b/packages/fineui/src/base/single/button/node/__test__/textnode.test.js similarity index 100% rename from src/base/single/button/node/__test__/textnode.test.js rename to packages/fineui/src/base/single/button/node/__test__/textnode.test.js diff --git a/src/base/single/button/node/icontexticonnode.js b/packages/fineui/src/base/single/button/node/icontexticonnode.js similarity index 100% rename from src/base/single/button/node/icontexticonnode.js rename to packages/fineui/src/base/single/button/node/icontexticonnode.js diff --git a/src/base/single/button/node/icontextnode.js b/packages/fineui/src/base/single/button/node/icontextnode.js similarity index 100% rename from src/base/single/button/node/icontextnode.js rename to packages/fineui/src/base/single/button/node/icontextnode.js diff --git a/src/base/single/button/node/texticonnode.js b/packages/fineui/src/base/single/button/node/texticonnode.js similarity index 100% rename from src/base/single/button/node/texticonnode.js rename to packages/fineui/src/base/single/button/node/texticonnode.js diff --git a/src/base/single/button/node/textnode.js b/packages/fineui/src/base/single/button/node/textnode.js similarity index 100% rename from src/base/single/button/node/textnode.js rename to packages/fineui/src/base/single/button/node/textnode.js diff --git a/src/base/single/editor/editor.js b/packages/fineui/src/base/single/editor/editor.js similarity index 100% rename from src/base/single/editor/editor.js rename to packages/fineui/src/base/single/editor/editor.js diff --git a/src/base/single/editor/editor.multifile.js b/packages/fineui/src/base/single/editor/editor.multifile.js similarity index 100% rename from src/base/single/editor/editor.multifile.js rename to packages/fineui/src/base/single/editor/editor.multifile.js diff --git a/src/base/single/editor/editor.textarea.js b/packages/fineui/src/base/single/editor/editor.textarea.js similarity index 100% rename from src/base/single/editor/editor.textarea.js rename to packages/fineui/src/base/single/editor/editor.textarea.js diff --git a/src/base/single/editor/index.js b/packages/fineui/src/base/single/editor/index.js similarity index 100% rename from src/base/single/editor/index.js rename to packages/fineui/src/base/single/editor/index.js diff --git a/src/base/single/html/__test__/html.test.js b/packages/fineui/src/base/single/html/__test__/html.test.js similarity index 100% rename from src/base/single/html/__test__/html.test.js rename to packages/fineui/src/base/single/html/__test__/html.test.js diff --git a/src/base/single/html/html.js b/packages/fineui/src/base/single/html/html.js similarity index 100% rename from src/base/single/html/html.js rename to packages/fineui/src/base/single/html/html.js diff --git a/src/base/single/icon/icon.js b/packages/fineui/src/base/single/icon/icon.js similarity index 100% rename from src/base/single/icon/icon.js rename to packages/fineui/src/base/single/icon/icon.js diff --git a/src/base/single/iframe/__test__/iframe.test.js b/packages/fineui/src/base/single/iframe/__test__/iframe.test.js similarity index 100% rename from src/base/single/iframe/__test__/iframe.test.js rename to packages/fineui/src/base/single/iframe/__test__/iframe.test.js diff --git a/src/base/single/iframe/iframe.js b/packages/fineui/src/base/single/iframe/iframe.js similarity index 100% rename from src/base/single/iframe/iframe.js rename to packages/fineui/src/base/single/iframe/iframe.js diff --git a/src/base/single/img/__test__/img.test.js b/packages/fineui/src/base/single/img/__test__/img.test.js similarity index 100% rename from src/base/single/img/__test__/img.test.js rename to packages/fineui/src/base/single/img/__test__/img.test.js diff --git a/src/base/single/img/img.js b/packages/fineui/src/base/single/img/img.js similarity index 100% rename from src/base/single/img/img.js rename to packages/fineui/src/base/single/img/img.js diff --git a/src/base/single/index.js b/packages/fineui/src/base/single/index.js similarity index 100% rename from src/base/single/index.js rename to packages/fineui/src/base/single/index.js diff --git a/src/base/single/input/checkbox/checkbox.image.js b/packages/fineui/src/base/single/input/checkbox/checkbox.image.js similarity index 100% rename from src/base/single/input/checkbox/checkbox.image.js rename to packages/fineui/src/base/single/input/checkbox/checkbox.image.js diff --git a/src/base/single/input/checkbox/checkbox.js b/packages/fineui/src/base/single/input/checkbox/checkbox.js similarity index 100% rename from src/base/single/input/checkbox/checkbox.js rename to packages/fineui/src/base/single/input/checkbox/checkbox.js diff --git a/src/base/single/input/file.js b/packages/fineui/src/base/single/input/file.js similarity index 100% rename from src/base/single/input/file.js rename to packages/fineui/src/base/single/input/file.js diff --git a/src/base/single/input/index.js b/packages/fineui/src/base/single/input/index.js similarity index 100% rename from src/base/single/input/index.js rename to packages/fineui/src/base/single/input/index.js diff --git a/src/base/single/input/input.js b/packages/fineui/src/base/single/input/input.js similarity index 100% rename from src/base/single/input/input.js rename to packages/fineui/src/base/single/input/input.js diff --git a/src/base/single/input/radio/radio.image.js b/packages/fineui/src/base/single/input/radio/radio.image.js similarity index 100% rename from src/base/single/input/radio/radio.image.js rename to packages/fineui/src/base/single/input/radio/radio.image.js diff --git a/src/base/single/input/radio/radio.js b/packages/fineui/src/base/single/input/radio/radio.js similarity index 100% rename from src/base/single/input/radio/radio.js rename to packages/fineui/src/base/single/input/radio/radio.js diff --git a/src/base/single/instruction/instruction.js b/packages/fineui/src/base/single/instruction/instruction.js similarity index 100% rename from src/base/single/instruction/instruction.js rename to packages/fineui/src/base/single/instruction/instruction.js diff --git a/src/base/single/label/abstract.label.js b/packages/fineui/src/base/single/label/abstract.label.js similarity index 100% rename from src/base/single/label/abstract.label.js rename to packages/fineui/src/base/single/label/abstract.label.js diff --git a/src/base/single/label/html.label.js b/packages/fineui/src/base/single/label/html.label.js similarity index 100% rename from src/base/single/label/html.label.js rename to packages/fineui/src/base/single/label/html.label.js diff --git a/src/base/single/label/icon.label.js b/packages/fineui/src/base/single/label/icon.label.js similarity index 100% rename from src/base/single/label/icon.label.js rename to packages/fineui/src/base/single/label/icon.label.js diff --git a/src/base/single/label/index.js b/packages/fineui/src/base/single/label/index.js similarity index 100% rename from src/base/single/label/index.js rename to packages/fineui/src/base/single/label/index.js diff --git a/src/base/single/label/label.js b/packages/fineui/src/base/single/label/label.js similarity index 100% rename from src/base/single/label/label.js rename to packages/fineui/src/base/single/label/label.js diff --git a/src/base/single/link/__test__/link.test.js b/packages/fineui/src/base/single/link/__test__/link.test.js similarity index 100% rename from src/base/single/link/__test__/link.test.js rename to packages/fineui/src/base/single/link/__test__/link.test.js diff --git a/src/base/single/link/link.js b/packages/fineui/src/base/single/link/link.js similarity index 100% rename from src/base/single/link/link.js rename to packages/fineui/src/base/single/link/link.js diff --git a/src/base/single/text.pure.js b/packages/fineui/src/base/single/text.pure.js similarity index 100% rename from src/base/single/text.pure.js rename to packages/fineui/src/base/single/text.pure.js diff --git a/src/base/single/tip/0.tip.js b/packages/fineui/src/base/single/tip/0.tip.js similarity index 100% rename from src/base/single/tip/0.tip.js rename to packages/fineui/src/base/single/tip/0.tip.js diff --git a/src/base/single/tip/index.js b/packages/fineui/src/base/single/tip/index.js similarity index 100% rename from src/base/single/tip/index.js rename to packages/fineui/src/base/single/tip/index.js diff --git a/src/base/single/tip/tip.toast.js b/packages/fineui/src/base/single/tip/tip.toast.js similarity index 100% rename from src/base/single/tip/tip.toast.js rename to packages/fineui/src/base/single/tip/tip.toast.js diff --git a/src/base/single/tip/tip.tooltip.js b/packages/fineui/src/base/single/tip/tip.tooltip.js similarity index 100% rename from src/base/single/tip/tip.tooltip.js rename to packages/fineui/src/base/single/tip/tip.tooltip.js diff --git a/src/base/single/trigger/trigger.js b/packages/fineui/src/base/single/trigger/trigger.js similarity index 100% rename from src/base/single/trigger/trigger.js rename to packages/fineui/src/base/single/trigger/trigger.js diff --git a/src/base/tree/customtree.js b/packages/fineui/src/base/tree/customtree.js similarity index 100% rename from src/base/tree/customtree.js rename to packages/fineui/src/base/tree/customtree.js diff --git a/src/bundle.js b/packages/fineui/src/bundle.js similarity index 100% rename from src/bundle.js rename to packages/fineui/src/bundle.js diff --git a/src/case/button/icon/icon.change.js b/packages/fineui/src/case/button/icon/icon.change.js similarity index 100% rename from src/case/button/icon/icon.change.js rename to packages/fineui/src/case/button/icon/icon.change.js diff --git a/src/case/button/icon/icon.trigger.js b/packages/fineui/src/case/button/icon/icon.trigger.js similarity index 100% rename from src/case/button/icon/icon.trigger.js rename to packages/fineui/src/case/button/icon/icon.trigger.js diff --git a/src/case/button/icon/iconhalf/icon.half.image.js b/packages/fineui/src/case/button/icon/iconhalf/icon.half.image.js similarity index 100% rename from src/case/button/icon/iconhalf/icon.half.image.js rename to packages/fineui/src/case/button/icon/iconhalf/icon.half.image.js diff --git a/src/case/button/icon/iconhalf/icon.half.js b/packages/fineui/src/case/button/icon/iconhalf/icon.half.js similarity index 100% rename from src/case/button/icon/iconhalf/icon.half.js rename to packages/fineui/src/case/button/icon/iconhalf/icon.half.js diff --git a/src/case/button/index.js b/packages/fineui/src/case/button/index.js similarity index 100% rename from src/case/button/index.js rename to packages/fineui/src/case/button/index.js diff --git a/src/case/button/item.multiselect.js b/packages/fineui/src/case/button/item.multiselect.js similarity index 100% rename from src/case/button/item.multiselect.js rename to packages/fineui/src/case/button/item.multiselect.js diff --git a/src/case/button/item.singleselect.icontext.js b/packages/fineui/src/case/button/item.singleselect.icontext.js similarity index 100% rename from src/case/button/item.singleselect.icontext.js rename to packages/fineui/src/case/button/item.singleselect.icontext.js diff --git a/src/case/button/item.singleselect.js b/packages/fineui/src/case/button/item.singleselect.js similarity index 100% rename from src/case/button/item.singleselect.js rename to packages/fineui/src/case/button/item.singleselect.js diff --git a/src/case/button/item.singleselect.radio.js b/packages/fineui/src/case/button/item.singleselect.radio.js similarity index 100% rename from src/case/button/item.singleselect.radio.js rename to packages/fineui/src/case/button/item.singleselect.radio.js diff --git a/src/case/button/node/__test__/node.arrow.test.js b/packages/fineui/src/case/button/node/__test__/node.arrow.test.js similarity index 100% rename from src/case/button/node/__test__/node.arrow.test.js rename to packages/fineui/src/case/button/node/__test__/node.arrow.test.js diff --git a/src/case/button/node/__test__/node.first.plus.test.js b/packages/fineui/src/case/button/node/__test__/node.first.plus.test.js similarity index 100% rename from src/case/button/node/__test__/node.first.plus.test.js rename to packages/fineui/src/case/button/node/__test__/node.first.plus.test.js diff --git a/src/case/button/node/__test__/node.icon.arrow.test.js b/packages/fineui/src/case/button/node/__test__/node.icon.arrow.test.js similarity index 100% rename from src/case/button/node/__test__/node.icon.arrow.test.js rename to packages/fineui/src/case/button/node/__test__/node.icon.arrow.test.js diff --git a/src/case/button/node/__test__/node.last.plus.test.js b/packages/fineui/src/case/button/node/__test__/node.last.plus.test.js similarity index 100% rename from src/case/button/node/__test__/node.last.plus.test.js rename to packages/fineui/src/case/button/node/__test__/node.last.plus.test.js diff --git a/src/case/button/node/__test__/node.mid.plus.test.js b/packages/fineui/src/case/button/node/__test__/node.mid.plus.test.js similarity index 100% rename from src/case/button/node/__test__/node.mid.plus.test.js rename to packages/fineui/src/case/button/node/__test__/node.mid.plus.test.js diff --git a/src/case/button/node/__test__/node.multilayer.icon.arrow.test.js b/packages/fineui/src/case/button/node/__test__/node.multilayer.icon.arrow.test.js similarity index 100% rename from src/case/button/node/__test__/node.multilayer.icon.arrow.test.js rename to packages/fineui/src/case/button/node/__test__/node.multilayer.icon.arrow.test.js diff --git a/src/case/button/node/__test__/node.plus.test.js b/packages/fineui/src/case/button/node/__test__/node.plus.test.js similarity index 100% rename from src/case/button/node/__test__/node.plus.test.js rename to packages/fineui/src/case/button/node/__test__/node.plus.test.js diff --git a/src/case/button/node/node.arrow.js b/packages/fineui/src/case/button/node/node.arrow.js similarity index 100% rename from src/case/button/node/node.arrow.js rename to packages/fineui/src/case/button/node/node.arrow.js diff --git a/src/case/button/node/node.icon.arrow.js b/packages/fineui/src/case/button/node/node.icon.arrow.js similarity index 100% rename from src/case/button/node/node.icon.arrow.js rename to packages/fineui/src/case/button/node/node.icon.arrow.js diff --git a/src/case/button/node/node.multilayer.icon.arrow.js b/packages/fineui/src/case/button/node/node.multilayer.icon.arrow.js similarity index 100% rename from src/case/button/node/node.multilayer.icon.arrow.js rename to packages/fineui/src/case/button/node/node.multilayer.icon.arrow.js diff --git a/src/case/button/node/node.plus.js b/packages/fineui/src/case/button/node/node.plus.js similarity index 100% rename from src/case/button/node/node.plus.js rename to packages/fineui/src/case/button/node/node.plus.js diff --git a/src/case/button/node/siwtcher.tree.node.js b/packages/fineui/src/case/button/node/siwtcher.tree.node.js similarity index 100% rename from src/case/button/node/siwtcher.tree.node.js rename to packages/fineui/src/case/button/node/siwtcher.tree.node.js diff --git a/src/case/button/node/treenode.js b/packages/fineui/src/case/button/node/treenode.js similarity index 100% rename from src/case/button/node/treenode.js rename to packages/fineui/src/case/button/node/treenode.js diff --git a/src/case/button/switch.js b/packages/fineui/src/case/button/switch.js similarity index 100% rename from src/case/button/switch.js rename to packages/fineui/src/case/button/switch.js diff --git a/src/case/button/treeitem/__test__/item.treeleaf.test.js b/packages/fineui/src/case/button/treeitem/__test__/item.treeleaf.test.js similarity index 100% rename from src/case/button/treeitem/__test__/item.treeleaf.test.js rename to packages/fineui/src/case/button/treeitem/__test__/item.treeleaf.test.js diff --git a/src/case/button/treeitem/item.icon.treeleaf.js b/packages/fineui/src/case/button/treeitem/item.icon.treeleaf.js similarity index 100% rename from src/case/button/treeitem/item.icon.treeleaf.js rename to packages/fineui/src/case/button/treeitem/item.icon.treeleaf.js diff --git a/src/case/button/treeitem/item.multilayer.icon.treeleaf.js b/packages/fineui/src/case/button/treeitem/item.multilayer.icon.treeleaf.js similarity index 100% rename from src/case/button/treeitem/item.multilayer.icon.treeleaf.js rename to packages/fineui/src/case/button/treeitem/item.multilayer.icon.treeleaf.js diff --git a/src/case/button/treeitem/treeitem.js b/packages/fineui/src/case/button/treeitem/treeitem.js similarity index 100% rename from src/case/button/treeitem/treeitem.js rename to packages/fineui/src/case/button/treeitem/treeitem.js diff --git a/src/case/calendar/calendar.date.item.js b/packages/fineui/src/case/calendar/calendar.date.item.js similarity index 100% rename from src/case/calendar/calendar.date.item.js rename to packages/fineui/src/case/calendar/calendar.date.item.js diff --git a/src/case/calendar/calendar.js b/packages/fineui/src/case/calendar/calendar.js similarity index 100% rename from src/case/calendar/calendar.js rename to packages/fineui/src/case/calendar/calendar.js diff --git a/src/case/calendar/calendar.year.js b/packages/fineui/src/case/calendar/calendar.year.js similarity index 100% rename from src/case/calendar/calendar.year.js rename to packages/fineui/src/case/calendar/calendar.year.js diff --git a/src/case/calendar/index.js b/packages/fineui/src/case/calendar/index.js similarity index 100% rename from src/case/calendar/index.js rename to packages/fineui/src/case/calendar/index.js diff --git a/src/case/checkbox/check.arrownode.js b/packages/fineui/src/case/checkbox/check.arrownode.js similarity index 100% rename from src/case/checkbox/check.arrownode.js rename to packages/fineui/src/case/checkbox/check.arrownode.js diff --git a/src/case/checkbox/check.checkingmarknode.js b/packages/fineui/src/case/checkbox/check.checkingmarknode.js similarity index 100% rename from src/case/checkbox/check.checkingmarknode.js rename to packages/fineui/src/case/checkbox/check.checkingmarknode.js diff --git a/src/case/checkbox/check.first.treenode.js b/packages/fineui/src/case/checkbox/check.first.treenode.js similarity index 100% rename from src/case/checkbox/check.first.treenode.js rename to packages/fineui/src/case/checkbox/check.first.treenode.js diff --git a/src/case/checkbox/check.last.treenode.js b/packages/fineui/src/case/checkbox/check.last.treenode.js similarity index 100% rename from src/case/checkbox/check.last.treenode.js rename to packages/fineui/src/case/checkbox/check.last.treenode.js diff --git a/src/case/checkbox/check.mid.treenode.js b/packages/fineui/src/case/checkbox/check.mid.treenode.js similarity index 100% rename from src/case/checkbox/check.mid.treenode.js rename to packages/fineui/src/case/checkbox/check.mid.treenode.js diff --git a/src/case/checkbox/check.treenode.js b/packages/fineui/src/case/checkbox/check.treenode.js similarity index 100% rename from src/case/checkbox/check.treenode.js rename to packages/fineui/src/case/checkbox/check.treenode.js diff --git a/src/case/checkbox/index.js b/packages/fineui/src/case/checkbox/index.js similarity index 100% rename from src/case/checkbox/index.js rename to packages/fineui/src/case/checkbox/index.js diff --git a/src/case/colorchooser/__test__/colorchooser.test.js b/packages/fineui/src/case/colorchooser/__test__/colorchooser.test.js similarity index 100% rename from src/case/colorchooser/__test__/colorchooser.test.js rename to packages/fineui/src/case/colorchooser/__test__/colorchooser.test.js diff --git a/src/case/colorchooser/colorchooser.custom.js b/packages/fineui/src/case/colorchooser/colorchooser.custom.js similarity index 100% rename from src/case/colorchooser/colorchooser.custom.js rename to packages/fineui/src/case/colorchooser/colorchooser.custom.js diff --git a/src/case/colorchooser/colorchooser.js b/packages/fineui/src/case/colorchooser/colorchooser.js similarity index 100% rename from src/case/colorchooser/colorchooser.js rename to packages/fineui/src/case/colorchooser/colorchooser.js diff --git a/src/case/colorchooser/colorchooser.popup.hex.js b/packages/fineui/src/case/colorchooser/colorchooser.popup.hex.js similarity index 100% rename from src/case/colorchooser/colorchooser.popup.hex.js rename to packages/fineui/src/case/colorchooser/colorchooser.popup.hex.js diff --git a/src/case/colorchooser/colorchooser.popup.hex.simple.js b/packages/fineui/src/case/colorchooser/colorchooser.popup.hex.simple.js similarity index 100% rename from src/case/colorchooser/colorchooser.popup.hex.simple.js rename to packages/fineui/src/case/colorchooser/colorchooser.popup.hex.simple.js diff --git a/src/case/colorchooser/colorchooser.popup.js b/packages/fineui/src/case/colorchooser/colorchooser.popup.js similarity index 100% rename from src/case/colorchooser/colorchooser.popup.js rename to packages/fineui/src/case/colorchooser/colorchooser.popup.js diff --git a/src/case/colorchooser/colorchooser.popup.simple.js b/packages/fineui/src/case/colorchooser/colorchooser.popup.simple.js similarity index 100% rename from src/case/colorchooser/colorchooser.popup.simple.js rename to packages/fineui/src/case/colorchooser/colorchooser.popup.simple.js diff --git a/src/case/colorchooser/colorchooser.simple.js b/packages/fineui/src/case/colorchooser/colorchooser.simple.js similarity index 100% rename from src/case/colorchooser/colorchooser.simple.js rename to packages/fineui/src/case/colorchooser/colorchooser.simple.js diff --git a/src/case/colorchooser/colorchooser.trigger.js b/packages/fineui/src/case/colorchooser/colorchooser.trigger.js similarity index 100% rename from src/case/colorchooser/colorchooser.trigger.js rename to packages/fineui/src/case/colorchooser/colorchooser.trigger.js diff --git a/src/case/colorchooser/colorchooser.trigger.long.js b/packages/fineui/src/case/colorchooser/colorchooser.trigger.long.js similarity index 100% rename from src/case/colorchooser/colorchooser.trigger.long.js rename to packages/fineui/src/case/colorchooser/colorchooser.trigger.long.js diff --git a/src/case/colorchooser/colorpicker/button/button.colorpicker.js b/packages/fineui/src/case/colorchooser/colorpicker/button/button.colorpicker.js similarity index 100% rename from src/case/colorchooser/colorpicker/button/button.colorpicker.js rename to packages/fineui/src/case/colorchooser/colorpicker/button/button.colorpicker.js diff --git a/src/case/colorchooser/colorpicker/button/button.colorshow.js b/packages/fineui/src/case/colorchooser/colorpicker/button/button.colorshow.js similarity index 100% rename from src/case/colorchooser/colorpicker/button/button.colorshow.js rename to packages/fineui/src/case/colorchooser/colorpicker/button/button.colorshow.js diff --git a/src/case/colorchooser/colorpicker/button/index.js b/packages/fineui/src/case/colorchooser/colorpicker/button/index.js similarity index 100% rename from src/case/colorchooser/colorpicker/button/index.js rename to packages/fineui/src/case/colorchooser/colorpicker/button/index.js diff --git a/src/case/colorchooser/colorpicker/colorpicker.hex.js b/packages/fineui/src/case/colorchooser/colorpicker/colorpicker.hex.js similarity index 100% rename from src/case/colorchooser/colorpicker/colorpicker.hex.js rename to packages/fineui/src/case/colorchooser/colorpicker/colorpicker.hex.js diff --git a/src/case/colorchooser/colorpicker/colorpicker.js b/packages/fineui/src/case/colorchooser/colorpicker/colorpicker.js similarity index 100% rename from src/case/colorchooser/colorpicker/colorpicker.js rename to packages/fineui/src/case/colorchooser/colorpicker/colorpicker.js diff --git a/src/case/colorchooser/colorpicker/editor.colorpicker.hex.js b/packages/fineui/src/case/colorchooser/colorpicker/editor.colorpicker.hex.js similarity index 100% rename from src/case/colorchooser/colorpicker/editor.colorpicker.hex.js rename to packages/fineui/src/case/colorchooser/colorpicker/editor.colorpicker.hex.js diff --git a/src/case/colorchooser/colorpicker/editor.colorpicker.hex.simple.js b/packages/fineui/src/case/colorchooser/colorpicker/editor.colorpicker.hex.simple.js similarity index 100% rename from src/case/colorchooser/colorpicker/editor.colorpicker.hex.simple.js rename to packages/fineui/src/case/colorchooser/colorpicker/editor.colorpicker.hex.simple.js diff --git a/src/case/colorchooser/colorpicker/editor.colorpicker.js b/packages/fineui/src/case/colorchooser/colorpicker/editor.colorpicker.js similarity index 100% rename from src/case/colorchooser/colorpicker/editor.colorpicker.js rename to packages/fineui/src/case/colorchooser/colorpicker/editor.colorpicker.js diff --git a/src/case/colorchooser/colorpicker/editor.colorpicker.simple.js b/packages/fineui/src/case/colorchooser/colorpicker/editor.colorpicker.simple.js similarity index 100% rename from src/case/colorchooser/colorpicker/editor.colorpicker.simple.js rename to packages/fineui/src/case/colorchooser/colorpicker/editor.colorpicker.simple.js diff --git a/src/case/colorchooser/colorpicker/index.js b/packages/fineui/src/case/colorchooser/colorpicker/index.js similarity index 100% rename from src/case/colorchooser/colorpicker/index.js rename to packages/fineui/src/case/colorchooser/colorpicker/index.js diff --git a/src/case/colorchooser/farbtastic/__test__/farbtastic.test.js b/packages/fineui/src/case/colorchooser/farbtastic/__test__/farbtastic.test.js similarity index 100% rename from src/case/colorchooser/farbtastic/__test__/farbtastic.test.js rename to packages/fineui/src/case/colorchooser/farbtastic/__test__/farbtastic.test.js diff --git a/src/case/colorchooser/farbtastic/farbtastic.js b/packages/fineui/src/case/colorchooser/farbtastic/farbtastic.js similarity index 100% rename from src/case/colorchooser/farbtastic/farbtastic.js rename to packages/fineui/src/case/colorchooser/farbtastic/farbtastic.js diff --git a/src/case/colorchooser/index.js b/packages/fineui/src/case/colorchooser/index.js similarity index 100% rename from src/case/colorchooser/index.js rename to packages/fineui/src/case/colorchooser/index.js diff --git a/src/case/combo/bubblecombo/__test__/combo.bubble.test.js b/packages/fineui/src/case/combo/bubblecombo/__test__/combo.bubble.test.js similarity index 100% rename from src/case/combo/bubblecombo/__test__/combo.bubble.test.js rename to packages/fineui/src/case/combo/bubblecombo/__test__/combo.bubble.test.js diff --git a/src/case/combo/bubblecombo/combo.bubble.js b/packages/fineui/src/case/combo/bubblecombo/combo.bubble.js similarity index 100% rename from src/case/combo/bubblecombo/combo.bubble.js rename to packages/fineui/src/case/combo/bubblecombo/combo.bubble.js diff --git a/src/case/combo/bubblecombo/popup.bubble.js b/packages/fineui/src/case/combo/bubblecombo/popup.bubble.js similarity index 100% rename from src/case/combo/bubblecombo/popup.bubble.js rename to packages/fineui/src/case/combo/bubblecombo/popup.bubble.js diff --git a/src/case/combo/editoriconcheckcombo/__test__/combo.editiconcheck.test.js b/packages/fineui/src/case/combo/editoriconcheckcombo/__test__/combo.editiconcheck.test.js similarity index 100% rename from src/case/combo/editoriconcheckcombo/__test__/combo.editiconcheck.test.js rename to packages/fineui/src/case/combo/editoriconcheckcombo/__test__/combo.editiconcheck.test.js diff --git a/src/case/combo/editoriconcheckcombo/combo.editiconcheck.js b/packages/fineui/src/case/combo/editoriconcheckcombo/combo.editiconcheck.js similarity index 100% rename from src/case/combo/editoriconcheckcombo/combo.editiconcheck.js rename to packages/fineui/src/case/combo/editoriconcheckcombo/combo.editiconcheck.js diff --git a/src/case/combo/iconcombo/combo.icon.js b/packages/fineui/src/case/combo/iconcombo/combo.icon.js similarity index 100% rename from src/case/combo/iconcombo/combo.icon.js rename to packages/fineui/src/case/combo/iconcombo/combo.icon.js diff --git a/src/case/combo/iconcombo/popup.iconcombo.js b/packages/fineui/src/case/combo/iconcombo/popup.iconcombo.js similarity index 100% rename from src/case/combo/iconcombo/popup.iconcombo.js rename to packages/fineui/src/case/combo/iconcombo/popup.iconcombo.js diff --git a/src/case/combo/iconcombo/trigger.iconcombo.js b/packages/fineui/src/case/combo/iconcombo/trigger.iconcombo.js similarity index 100% rename from src/case/combo/iconcombo/trigger.iconcombo.js rename to packages/fineui/src/case/combo/iconcombo/trigger.iconcombo.js diff --git a/src/case/combo/icontextvaluecombo/__test__/combo.icontextvalue.test.js b/packages/fineui/src/case/combo/icontextvaluecombo/__test__/combo.icontextvalue.test.js similarity index 100% rename from src/case/combo/icontextvaluecombo/__test__/combo.icontextvalue.test.js rename to packages/fineui/src/case/combo/icontextvaluecombo/__test__/combo.icontextvalue.test.js diff --git a/src/case/combo/icontextvaluecombo/combo.icontextvalue.js b/packages/fineui/src/case/combo/icontextvaluecombo/combo.icontextvalue.js similarity index 100% rename from src/case/combo/icontextvaluecombo/combo.icontextvalue.js rename to packages/fineui/src/case/combo/icontextvaluecombo/combo.icontextvalue.js diff --git a/src/case/combo/icontextvaluecombo/popup.icontextvalue.js b/packages/fineui/src/case/combo/icontextvaluecombo/popup.icontextvalue.js similarity index 100% rename from src/case/combo/icontextvaluecombo/popup.icontextvalue.js rename to packages/fineui/src/case/combo/icontextvaluecombo/popup.icontextvalue.js diff --git a/src/case/combo/index.js b/packages/fineui/src/case/combo/index.js similarity index 100% rename from src/case/combo/index.js rename to packages/fineui/src/case/combo/index.js diff --git a/src/case/combo/searchtextvaluecombo/__test__/combo.searchtextvaluecombo.test.js b/packages/fineui/src/case/combo/searchtextvaluecombo/__test__/combo.searchtextvaluecombo.test.js similarity index 100% rename from src/case/combo/searchtextvaluecombo/__test__/combo.searchtextvaluecombo.test.js rename to packages/fineui/src/case/combo/searchtextvaluecombo/__test__/combo.searchtextvaluecombo.test.js diff --git a/src/case/combo/searchtextvaluecombo/combo.searchtextvalue.js b/packages/fineui/src/case/combo/searchtextvaluecombo/combo.searchtextvalue.js similarity index 100% rename from src/case/combo/searchtextvaluecombo/combo.searchtextvalue.js rename to packages/fineui/src/case/combo/searchtextvaluecombo/combo.searchtextvalue.js diff --git a/src/case/combo/searchtextvaluecombo/popup.searchtextvalue.js b/packages/fineui/src/case/combo/searchtextvaluecombo/popup.searchtextvalue.js similarity index 100% rename from src/case/combo/searchtextvaluecombo/popup.searchtextvalue.js rename to packages/fineui/src/case/combo/searchtextvaluecombo/popup.searchtextvalue.js diff --git a/src/case/combo/searchtextvaluecombo/trigger.searchtextvalue.js b/packages/fineui/src/case/combo/searchtextvaluecombo/trigger.searchtextvalue.js similarity index 100% rename from src/case/combo/searchtextvaluecombo/trigger.searchtextvalue.js rename to packages/fineui/src/case/combo/searchtextvaluecombo/trigger.searchtextvalue.js diff --git a/src/case/combo/textvaluecheckcombo/__test__/combo.textvaluecheck.test.js b/packages/fineui/src/case/combo/textvaluecheckcombo/__test__/combo.textvaluecheck.test.js similarity index 100% rename from src/case/combo/textvaluecheckcombo/__test__/combo.textvaluecheck.test.js rename to packages/fineui/src/case/combo/textvaluecheckcombo/__test__/combo.textvaluecheck.test.js diff --git a/src/case/combo/textvaluecheckcombo/combo.textvaluecheck.js b/packages/fineui/src/case/combo/textvaluecheckcombo/combo.textvaluecheck.js similarity index 100% rename from src/case/combo/textvaluecheckcombo/combo.textvaluecheck.js rename to packages/fineui/src/case/combo/textvaluecheckcombo/combo.textvaluecheck.js diff --git a/src/case/combo/textvaluecheckcombo/popup.textvaluecheck.js b/packages/fineui/src/case/combo/textvaluecheckcombo/popup.textvaluecheck.js similarity index 100% rename from src/case/combo/textvaluecheckcombo/popup.textvaluecheck.js rename to packages/fineui/src/case/combo/textvaluecheckcombo/popup.textvaluecheck.js diff --git a/src/case/combo/textvaluecombo/__test__/combo.textvalue.test.js b/packages/fineui/src/case/combo/textvaluecombo/__test__/combo.textvalue.test.js similarity index 100% rename from src/case/combo/textvaluecombo/__test__/combo.textvalue.test.js rename to packages/fineui/src/case/combo/textvaluecombo/__test__/combo.textvalue.test.js diff --git a/src/case/combo/textvaluecombo/combo.textvalue.js b/packages/fineui/src/case/combo/textvaluecombo/combo.textvalue.js similarity index 100% rename from src/case/combo/textvaluecombo/combo.textvalue.js rename to packages/fineui/src/case/combo/textvaluecombo/combo.textvalue.js diff --git a/src/case/combo/textvaluecombo/combo.textvaluesmall.js b/packages/fineui/src/case/combo/textvaluecombo/combo.textvaluesmall.js similarity index 100% rename from src/case/combo/textvaluecombo/combo.textvaluesmall.js rename to packages/fineui/src/case/combo/textvaluecombo/combo.textvaluesmall.js diff --git a/src/case/combo/textvaluecombo/popup.textvalue.js b/packages/fineui/src/case/combo/textvaluecombo/popup.textvalue.js similarity index 100% rename from src/case/combo/textvaluecombo/popup.textvalue.js rename to packages/fineui/src/case/combo/textvaluecombo/popup.textvalue.js diff --git a/src/case/editor/__test__/editor.clear.test.js b/packages/fineui/src/case/editor/__test__/editor.clear.test.js similarity index 100% rename from src/case/editor/__test__/editor.clear.test.js rename to packages/fineui/src/case/editor/__test__/editor.clear.test.js diff --git a/src/case/editor/__test__/editor.sign.test.js b/packages/fineui/src/case/editor/__test__/editor.sign.test.js similarity index 100% rename from src/case/editor/__test__/editor.sign.test.js rename to packages/fineui/src/case/editor/__test__/editor.sign.test.js diff --git a/src/case/editor/__test__/editor.state.simple.test.js b/packages/fineui/src/case/editor/__test__/editor.state.simple.test.js similarity index 100% rename from src/case/editor/__test__/editor.state.simple.test.js rename to packages/fineui/src/case/editor/__test__/editor.state.simple.test.js diff --git a/src/case/editor/__test__/editor.state.test.js b/packages/fineui/src/case/editor/__test__/editor.state.test.js similarity index 100% rename from src/case/editor/__test__/editor.state.test.js rename to packages/fineui/src/case/editor/__test__/editor.state.test.js diff --git a/src/case/editor/editor.clear.js b/packages/fineui/src/case/editor/editor.clear.js similarity index 100% rename from src/case/editor/editor.clear.js rename to packages/fineui/src/case/editor/editor.clear.js diff --git a/src/case/editor/editor.defaulttext.js b/packages/fineui/src/case/editor/editor.defaulttext.js similarity index 100% rename from src/case/editor/editor.defaulttext.js rename to packages/fineui/src/case/editor/editor.defaulttext.js diff --git a/src/case/editor/editor.shelter.js b/packages/fineui/src/case/editor/editor.shelter.js similarity index 100% rename from src/case/editor/editor.shelter.js rename to packages/fineui/src/case/editor/editor.shelter.js diff --git a/src/case/editor/editor.sign.js b/packages/fineui/src/case/editor/editor.sign.js similarity index 100% rename from src/case/editor/editor.sign.js rename to packages/fineui/src/case/editor/editor.sign.js diff --git a/src/case/editor/editor.state.js b/packages/fineui/src/case/editor/editor.state.js similarity index 100% rename from src/case/editor/editor.state.js rename to packages/fineui/src/case/editor/editor.state.js diff --git a/src/case/editor/editor.state.simple.js b/packages/fineui/src/case/editor/editor.state.simple.js similarity index 100% rename from src/case/editor/editor.state.simple.js rename to packages/fineui/src/case/editor/editor.state.simple.js diff --git a/src/case/editor/index.js b/packages/fineui/src/case/editor/index.js similarity index 100% rename from src/case/editor/index.js rename to packages/fineui/src/case/editor/index.js diff --git a/src/case/index.js b/packages/fineui/src/case/index.js similarity index 100% rename from src/case/index.js rename to packages/fineui/src/case/index.js diff --git a/src/case/layer/index.js b/packages/fineui/src/case/layer/index.js similarity index 100% rename from src/case/layer/index.js rename to packages/fineui/src/case/layer/index.js diff --git a/src/case/layer/layer.multipopup.js b/packages/fineui/src/case/layer/layer.multipopup.js similarity index 100% rename from src/case/layer/layer.multipopup.js rename to packages/fineui/src/case/layer/layer.multipopup.js diff --git a/src/case/layer/layer.panel.js b/packages/fineui/src/case/layer/layer.panel.js similarity index 100% rename from src/case/layer/layer.panel.js rename to packages/fineui/src/case/layer/layer.panel.js diff --git a/src/case/layer/pane.list.js b/packages/fineui/src/case/layer/pane.list.js similarity index 100% rename from src/case/layer/pane.list.js rename to packages/fineui/src/case/layer/pane.list.js diff --git a/src/case/layer/panel.js b/packages/fineui/src/case/layer/panel.js similarity index 100% rename from src/case/layer/panel.js rename to packages/fineui/src/case/layer/panel.js diff --git a/src/case/linearsegment/button.linear.segment.js b/packages/fineui/src/case/linearsegment/button.linear.segment.js similarity index 100% rename from src/case/linearsegment/button.linear.segment.js rename to packages/fineui/src/case/linearsegment/button.linear.segment.js diff --git a/src/case/linearsegment/index.js b/packages/fineui/src/case/linearsegment/index.js similarity index 100% rename from src/case/linearsegment/index.js rename to packages/fineui/src/case/linearsegment/index.js diff --git a/src/case/linearsegment/linear.segment.js b/packages/fineui/src/case/linearsegment/linear.segment.js similarity index 100% rename from src/case/linearsegment/linear.segment.js rename to packages/fineui/src/case/linearsegment/linear.segment.js diff --git a/src/case/list/list.select.js b/packages/fineui/src/case/list/list.select.js similarity index 100% rename from src/case/list/list.select.js rename to packages/fineui/src/case/list/list.select.js diff --git a/src/case/loader/__test__/loader.lazy.test.js b/packages/fineui/src/case/loader/__test__/loader.lazy.test.js similarity index 100% rename from src/case/loader/__test__/loader.lazy.test.js rename to packages/fineui/src/case/loader/__test__/loader.lazy.test.js diff --git a/src/case/loader/__test__/loader.list.test.js b/packages/fineui/src/case/loader/__test__/loader.list.test.js similarity index 100% rename from src/case/loader/__test__/loader.list.test.js rename to packages/fineui/src/case/loader/__test__/loader.list.test.js diff --git a/src/case/loader/index.js b/packages/fineui/src/case/loader/index.js similarity index 100% rename from src/case/loader/index.js rename to packages/fineui/src/case/loader/index.js diff --git a/src/case/loader/loader.lazy.js b/packages/fineui/src/case/loader/loader.lazy.js similarity index 100% rename from src/case/loader/loader.lazy.js rename to packages/fineui/src/case/loader/loader.lazy.js diff --git a/src/case/loader/loader.list.js b/packages/fineui/src/case/loader/loader.list.js similarity index 100% rename from src/case/loader/loader.list.js rename to packages/fineui/src/case/loader/loader.list.js diff --git a/src/case/loader/sort.list.js b/packages/fineui/src/case/loader/sort.list.js similarity index 100% rename from src/case/loader/sort.list.js rename to packages/fineui/src/case/loader/sort.list.js diff --git a/src/case/pager/__test__/pager.test.js b/packages/fineui/src/case/pager/__test__/pager.test.js similarity index 100% rename from src/case/pager/__test__/pager.test.js rename to packages/fineui/src/case/pager/__test__/pager.test.js diff --git a/src/case/pager/index.js b/packages/fineui/src/case/pager/index.js similarity index 100% rename from src/case/pager/index.js rename to packages/fineui/src/case/pager/index.js diff --git a/src/case/pager/pager.all.count.js b/packages/fineui/src/case/pager/pager.all.count.js similarity index 100% rename from src/case/pager/pager.all.count.js rename to packages/fineui/src/case/pager/pager.all.count.js diff --git a/src/case/pager/pager.detail.js b/packages/fineui/src/case/pager/pager.detail.js similarity index 100% rename from src/case/pager/pager.detail.js rename to packages/fineui/src/case/pager/pager.detail.js diff --git a/src/case/pager/pager.direction.js b/packages/fineui/src/case/pager/pager.direction.js similarity index 100% rename from src/case/pager/pager.direction.js rename to packages/fineui/src/case/pager/pager.direction.js diff --git a/src/case/segment/__test__/segment.test.js b/packages/fineui/src/case/segment/__test__/segment.test.js similarity index 100% rename from src/case/segment/__test__/segment.test.js rename to packages/fineui/src/case/segment/__test__/segment.test.js diff --git a/src/case/segment/button.segment.js b/packages/fineui/src/case/segment/button.segment.js similarity index 100% rename from src/case/segment/button.segment.js rename to packages/fineui/src/case/segment/button.segment.js diff --git a/src/case/segment/index.js b/packages/fineui/src/case/segment/index.js similarity index 100% rename from src/case/segment/index.js rename to packages/fineui/src/case/segment/index.js diff --git a/src/case/segment/segment.js b/packages/fineui/src/case/segment/segment.js similarity index 100% rename from src/case/segment/segment.js rename to packages/fineui/src/case/segment/segment.js diff --git a/src/case/toolbar/toolbar.multiselect.js b/packages/fineui/src/case/toolbar/toolbar.multiselect.js similarity index 100% rename from src/case/toolbar/toolbar.multiselect.js rename to packages/fineui/src/case/toolbar/toolbar.multiselect.js diff --git a/src/case/tree/index.js b/packages/fineui/src/case/tree/index.js similarity index 100% rename from src/case/tree/index.js rename to packages/fineui/src/case/tree/index.js diff --git a/src/case/tree/tree.level.js b/packages/fineui/src/case/tree/tree.level.js similarity index 100% rename from src/case/tree/tree.level.js rename to packages/fineui/src/case/tree/tree.level.js diff --git a/src/case/tree/treeexpander/tree.expander.js b/packages/fineui/src/case/tree/treeexpander/tree.expander.js similarity index 100% rename from src/case/tree/treeexpander/tree.expander.js rename to packages/fineui/src/case/tree/treeexpander/tree.expander.js diff --git a/src/case/tree/treeexpander/tree.expander.popup.js b/packages/fineui/src/case/tree/treeexpander/tree.expander.popup.js similarity index 100% rename from src/case/tree/treeexpander/tree.expander.popup.js rename to packages/fineui/src/case/tree/treeexpander/tree.expander.popup.js diff --git a/src/case/trigger/index.js b/packages/fineui/src/case/trigger/index.js similarity index 100% rename from src/case/trigger/index.js rename to packages/fineui/src/case/trigger/index.js diff --git a/src/case/trigger/trigger.editor.js b/packages/fineui/src/case/trigger/trigger.editor.js similarity index 100% rename from src/case/trigger/trigger.editor.js rename to packages/fineui/src/case/trigger/trigger.editor.js diff --git a/src/case/trigger/trigger.icon.js b/packages/fineui/src/case/trigger/trigger.icon.js similarity index 100% rename from src/case/trigger/trigger.icon.js rename to packages/fineui/src/case/trigger/trigger.icon.js diff --git a/src/case/trigger/trigger.icon.text.js b/packages/fineui/src/case/trigger/trigger.icon.text.js similarity index 100% rename from src/case/trigger/trigger.icon.text.js rename to packages/fineui/src/case/trigger/trigger.icon.text.js diff --git a/src/case/trigger/trigger.icon.text.select.js b/packages/fineui/src/case/trigger/trigger.icon.text.select.js similarity index 100% rename from src/case/trigger/trigger.icon.text.select.js rename to packages/fineui/src/case/trigger/trigger.icon.text.select.js diff --git a/src/case/trigger/trigger.text.js b/packages/fineui/src/case/trigger/trigger.text.js similarity index 100% rename from src/case/trigger/trigger.text.js rename to packages/fineui/src/case/trigger/trigger.text.js diff --git a/src/case/trigger/trigger.text.select.js b/packages/fineui/src/case/trigger/trigger.text.select.js similarity index 100% rename from src/case/trigger/trigger.text.select.js rename to packages/fineui/src/case/trigger/trigger.text.select.js diff --git a/src/case/trigger/trigger.text.select.small.js b/packages/fineui/src/case/trigger/trigger.text.select.small.js similarity index 100% rename from src/case/trigger/trigger.text.select.small.js rename to packages/fineui/src/case/trigger/trigger.text.select.small.js diff --git a/src/case/trigger/trigger.text.small.js b/packages/fineui/src/case/trigger/trigger.text.small.js similarity index 100% rename from src/case/trigger/trigger.text.small.js rename to packages/fineui/src/case/trigger/trigger.text.small.js diff --git a/src/case/ztree/asynctree.js b/packages/fineui/src/case/ztree/asynctree.js similarity index 100% rename from src/case/ztree/asynctree.js rename to packages/fineui/src/case/ztree/asynctree.js diff --git a/src/case/ztree/index.js b/packages/fineui/src/case/ztree/index.js similarity index 100% rename from src/case/ztree/index.js rename to packages/fineui/src/case/ztree/index.js diff --git a/src/case/ztree/jquery.ztree.core-3.5.js b/packages/fineui/src/case/ztree/jquery.ztree.core-3.5.js similarity index 100% rename from src/case/ztree/jquery.ztree.core-3.5.js rename to packages/fineui/src/case/ztree/jquery.ztree.core-3.5.js diff --git a/src/case/ztree/jquery.ztree.excheck-3.5.js b/packages/fineui/src/case/ztree/jquery.ztree.excheck-3.5.js similarity index 100% rename from src/case/ztree/jquery.ztree.excheck-3.5.js rename to packages/fineui/src/case/ztree/jquery.ztree.excheck-3.5.js diff --git a/src/case/ztree/list/listasynctree.js b/packages/fineui/src/case/ztree/list/listasynctree.js similarity index 100% rename from src/case/ztree/list/listasynctree.js rename to packages/fineui/src/case/ztree/list/listasynctree.js diff --git a/src/case/ztree/list/listparttree.js b/packages/fineui/src/case/ztree/list/listparttree.js similarity index 100% rename from src/case/ztree/list/listparttree.js rename to packages/fineui/src/case/ztree/list/listparttree.js diff --git a/src/case/ztree/list/listtreeview.js b/packages/fineui/src/case/ztree/list/listtreeview.js similarity index 100% rename from src/case/ztree/list/listtreeview.js rename to packages/fineui/src/case/ztree/list/listtreeview.js diff --git a/src/case/ztree/parttree.js b/packages/fineui/src/case/ztree/parttree.js similarity index 100% rename from src/case/ztree/parttree.js rename to packages/fineui/src/case/ztree/parttree.js diff --git a/src/case/ztree/tree.display.js b/packages/fineui/src/case/ztree/tree.display.js similarity index 100% rename from src/case/ztree/tree.display.js rename to packages/fineui/src/case/ztree/tree.display.js diff --git a/src/case/ztree/tree.list.display.js b/packages/fineui/src/case/ztree/tree.list.display.js similarity index 100% rename from src/case/ztree/tree.list.display.js rename to packages/fineui/src/case/ztree/tree.list.display.js diff --git a/src/case/ztree/tree.simple.js b/packages/fineui/src/case/ztree/tree.simple.js similarity index 100% rename from src/case/ztree/tree.simple.js rename to packages/fineui/src/case/ztree/tree.simple.js diff --git a/src/case/ztree/treerender.page.service.js b/packages/fineui/src/case/ztree/treerender.page.service.js similarity index 100% rename from src/case/ztree/treerender.page.service.js rename to packages/fineui/src/case/ztree/treerender.page.service.js diff --git a/src/case/ztree/treerender.scroll.service.js b/packages/fineui/src/case/ztree/treerender.scroll.service.js similarity index 100% rename from src/case/ztree/treerender.scroll.service.js rename to packages/fineui/src/case/ztree/treerender.scroll.service.js diff --git a/packages/fineui/src/case/ztree/treeview.js b/packages/fineui/src/case/ztree/treeview.js new file mode 100644 index 000000000..aa2f6e202 --- /dev/null +++ b/packages/fineui/src/case/ztree/treeview.js @@ -0,0 +1,619 @@ +import { + cjkEncodeDO, + Controller, + createWidget, + emptyFn, + Events, + extend, + UUID, + isNotNull, + jsonEncode, + delay, + each, + replaceAll, + isUndefined, + isNotEmptyArray, + deepClone, + map, + Tree, + isNull, + shortcut, + VerticalLayout, + Layout, + DefaultLayout, + some, + Widget, + STYLE_CONSTANTS +} from "@/core"; +import { Msg, Pane, LoadingBar, Text } from "@/base"; +import $ from "jquery"; +import "./jquery.ztree.core-3.5"; + +@shortcut() +export class TreeView extends Pane { + static xtype = "bi.tree_view"; + static REQ_TYPE_INIT_DATA = 1; + static REQ_TYPE_ADJUST_DATA = 2; + static REQ_TYPE_SELECT_DATA = 3; + static REQ_TYPE_GET_SELECTED_DATA = 4; + static EVENT_CHANGE = "EVENT_CHANGE"; + static EVENT_INIT = Events.INIT; + static EVENT_AFTERINIT = Events.AFTERINIT; + + _defaultConfig() { + return extend(super._defaultConfig(...arguments), { + _baseCls: "bi-tree", + paras: { + selectedValues: {}, + }, + itemsCreator: emptyFn, + showLine: true, + }); + } + + _init() { + super._init(...arguments); + const o = this.options; + this._stop = false; + + this._createTree(); + this.tip = createWidget({ + type: LoadingBar.xtype, + invisible: true, + handler: () => this._loadMore(), + }); + createWidget({ + type: VerticalLayout.xtype, + scrollable: true, + scrolly: false, + element: this, + items: [this.tip], + }); + if (isNotNull(o.value)) { + this.setSelectedValue(o.value); + } + } + + _createTree() { + this.id = `bi-tree${UUID()}`; + if (this.nodes) { + this.nodes.destroy(); + } + if (this.tree) { + this.tree.destroy(); + } + this.tree = createWidget({ + type: Layout.xtype, + element: ``, + }); + createWidget({ + type: DefaultLayout.xtype, + element: this, + items: [this.tree], + }); + } + + // 选择节点触发方法 + _selectTreeNode(treeId, treeNode) { + this.fireEvent(Controller.EVENT_CHANGE, Events.CLICK, treeNode, this); + this.fireEvent(TreeView.EVENT_CHANGE, treeNode, this); + } + + // 配置属性 + _configSetting() { + const paras = this.options.paras; + const self = this; + const o = this.options; + const setting = { + async: { + enable: true, + url: getUrl, + autoParam: ["id", "name"], // 节点展开异步请求自动提交id和name + otherParam: cjkEncodeDO(paras), // 静态参数 + }, + check: { + enable: true, + }, + data: { + key: { + title: "title", + name: "text", // 节点的name属性替换成text + }, + simpleData: { + enable: true, // 可以穿id,pid属性的对象数组 + }, + }, + view: { + showIcon: false, + expandSpeed: "", + nameIsHTML: true, // 节点可以用html标签代替 + dblClickExpand: false, + showLine: o.showLine, + }, + callback: { + beforeExpand, + onAsyncSuccess, + onAsyncError, + beforeCheck, + onCheck, + onExpand, + onCollapse, + onClick, + }, + }; + const className = "dark", + perTime = 100; + + function onClick(event, treeId, treeNode) { + // 当前点击节点的状态是半选,且为true_part, 则将其改为false_part,使得点击半选后切换到的是全选 + let checked = treeNode.checked; + const status = treeNode.getCheckStatus(); + if (status.half === true && status.checked === true) { + checked = false; + } + // 更新此node的check状态, 影响父子关联,并调用beforeCheck和onCheck回调 + self.nodes.checkNode(treeNode, !checked, true, true); + } + + function getUrl(treeId, treeNode) { + const parentNode = self._getParentValues(treeNode); + treeNode.times = treeNode.times || 1; + const param = `id=${treeNode.id}×=${treeNode.times++}&parentValues= ${_global.encodeURIComponent( + jsonEncode(parentNode) + )}&checkState=${_global.encodeURIComponent(jsonEncode(treeNode.getCheckStatus()))}`; + + return `&${param}`; + } + + function beforeExpand(treeId, treeNode) { + if (!treeNode.isAjaxing) { + if (!treeNode.children) { + treeNode.times = 1; + ajaxGetNodes(treeNode, "refresh"); + } + + return true; + } + Msg.toast("Please Wait。", { + level: "warning", + }); // 不展开节点,也不触发onExpand事件 + + return false; + } + + function onAsyncSuccess(event, treeId, treeNode, msg) { + treeNode.halfCheck = false; + if (!msg || msg.length === 0 || /^[\s,\S]*<\/html>$/gi.test(msg) || self._stop) { + return; + } + const zTree = self.nodes; + const totalCount = treeNode.count || 0; + + // 尝试去获取下一组节点,若获取值为空数组,表示获取完成 + // TODO by GUY + if (treeNode.children.length > totalCount) { + treeNode.count = treeNode.children.length; + delay(() => { + ajaxGetNodes(treeNode); + }, perTime); + } else { + // treeNode.icon = ""; + zTree.updateNode(treeNode); + zTree.selectNode(treeNode.children[0]); + // className = (className === "dark" ? "":"dark"); + } + } + + function onAsyncError(event, treeId, treeNode, XMLHttpRequest, textStatus, errorThrown) { + const zTree = self.nodes; + Msg.toast("Error!", "warning"); + // treeNode.icon = ""; + // zTree.updateNode(treeNode); + } + + function ajaxGetNodes(treeNode, reloadType) { + const zTree = self.nodes; + if (reloadType === "refresh") { + zTree.updateNode(treeNode); // 刷新一下当前节点,如果treeNode.xxx被改了的话 + } + zTree.reAsyncChildNodes(treeNode, reloadType, true); // 强制加载子节点,reloadType === refresh为先清空再加载,否则为追加到现有子节点之后 + } + + function beforeCheck(treeId, treeNode) { + if (treeNode.disabled) { + return false; + } + // 下面主动修改了node的halfCheck属性, 节点属性的判断依赖halfCheck,改之前就获取一下 + const status = treeNode.getCheckStatus(); + treeNode.halfCheck = false; + if (treeNode.checked === true) { + // 将展开的节点halfCheck设为false,解决展开节点存在halfCheck=true的情况 guy + // 所有的半选状态都需要取消halfCheck=true的情况 + function track(children) { + each(children, (i, ch) => { + if (ch.halfCheck === true) { + ch.halfCheck = false; + track(ch.children); + } + }); + } + + track(treeNode.children); + const treeObj = self.nodes; + const nodes = treeObj.getSelectedNodes(); + $.each(nodes, (index, node) => { + node.halfCheck = false; + }); + } + // 当前点击节点的状态是半选,且为true_part, 则将其改为false_part,使得点击半选后切换到的是全选 + if (status.half === true && status.checked === true) { + treeNode.checked = false; + } + } + + function onCheck(event, treeId, treeNode) { + if (treeNode.disabled) { + return false; + } + self._selectTreeNode(treeId, treeNode); + } + + function onExpand(event, treeId, treeNode) { + treeNode.halfCheck = false; + } + + function onCollapse(event, treeId, treeNode) {} + + return setting; + } + + _getParentValues(treeNode) { + if (!treeNode.getParentNode()) { + return []; + } + const parentNode = treeNode.getParentNode(); + let result = this._getParentValues(parentNode); + result = result.concat([this._getNodeValue(parentNode)]); + + return result; + } + + _getNodeValue(node) { + // 去除标红 + return isUndefined(node.value) ? replaceAll(node.text.replace(/<[^>]+>/g, ""), " ", " ") : node.value; + } + + // 获取半选框值 + _getHalfSelectedValues(map, node) { + const self = this; + const checkState = node.getCheckStatus(); + // 将未选的去掉 + if (checkState.checked === false && checkState.half === false) { + return; + } + // 如果节点已展开,并且是半选 + if (isNotEmptyArray(node.children) && checkState.half === true) { + const children = node.children; + each(children, (i, ch) => { + self._getHalfSelectedValues(map, ch); + }); + + return; + } + const parent = node.parentValues || self._getParentValues(node); + const path = parent.concat(this._getNodeValue(node)); + // 当前节点是全选的,因为上面的判断已经排除了不选和半选 + if (isNotEmptyArray(node.children) || checkState.half === false) { + this._buildTree(map, path); + + return; + } + // 剩下的就是半选不展开的节点,因为不知道里面是什么情况,所以借助selectedValues(这个是完整的选中情况) + const storeValues = deepClone(this.options.paras.selectedValues); + const treeNode = this._getTree(storeValues, path); + this._addTreeNode(map, parent, this._getNodeValue(node), treeNode); + } + + // 获取的是以values最后一个节点为根的子树 + _getTree(map, values) { + let cur = map; + some(values, (i, value) => { + if (cur[value] == null) { + return true; + } + cur = cur[value]; + }); + + return cur; + } + + // 以values为path一路向里补充map, 并在末尾节点添加key: value节点 + _addTreeNode(map, values, key, value) { + let cur = map; + each(values, (i, value) => { + if (cur[value] == null) { + cur[value] = {}; + } + cur = cur[value]; + }); + cur[key] = value; + } + + // 构造树节点 + _buildTree(map, values) { + let cur = map; + each(values, (i, value) => { + if (cur[value] == null) { + cur[value] = {}; + } + cur = cur[value]; + }); + } + + // 获取选中的值 + _getSelectedValues() { + const self = this; + const hashMap = {}; + const rootNoots = this.nodes.getNodes(); + track(rootNoots); // 可以看到这个方法没有递归调用,所以在_getHalfSelectedValues中需要关心全选的节点 + function track(nodes) { + each(nodes, (i, node) => { + const checkState = node.getCheckStatus(); + if (checkState.checked === true || checkState.half === true) { + if (checkState.half === true) { + self._getHalfSelectedValues(hashMap, node); + } else { + const parentValues = node.parentValues || self._getParentValues(node); + const values = parentValues.concat([self._getNodeValue(node)]); + self._buildTree(hashMap, values); + } + } + }); + } + + return hashMap; + } + + // 处理节点 + _dealWidthNodes(nodes) { + const self = this, + o = this.options; + const ns = Tree.arrayFormat(nodes); + + return map(ns, (i, n) => { + const newNode = extend({}, n); + newNode.isParent = newNode.isParent || newNode.parent; + // n.value = BI.isUndefined(n.value) ? n.text : n.value; + // n.text = BI.isUndefined(n.text) ? n.value : n.text; + // if (n.text === null) { + // n.text = ""; + // } + if (isNull(newNode.title)) { + newNode.title = newNode.text; + } + if (newNode.disabled) { + newNode.title = newNode.warningTitle || newNode.title; + } + const text = createWidget( + extend( + { + cls: "tree-node-text", + tagName: "span", + whiteSpace: "nowrap", + root: true, + keyword: o.paras.keyword, + }, + newNode, + { + type: Text.xtype, + text: replaceAll(newNode.text, "\n", " "), + } + ) + ); + const fragment = Widget._renderEngine.createElement("
"); + fragment.append(text.element[0]); + newNode.text = fragment.html(); + // // 处理标红 + // if (BI.isNotNull(n.text)) { + // if (BI.isKey(o.paras.keyword)) { + // n.text = $("
").__textKeywordMarked__(BI.Text.formatText(n.text + ""), o.paras.keyword, n.py).html(); + // } else { + // n.text = BI.htmlEncode(BI.Text.formatText(n.text + "")); + // } + // } + + return newNode; + }); + } + + _loadMore() { + const self = this, + o = this.options; + this.tip.setLoading(); + const op = extend({}, o.paras, { + times: ++this.times, + }); + o.itemsCreator(op, res => { + if (self._stop === true) { + return; + } + const hasNext = !!res.hasNext, + nodes = res.items || []; + + if (!hasNext) { + self.tip.setEnd(); + } else { + self.tip.setLoaded(); + } + if (nodes.length > 0) { + self.nodes.addNodes(null, self._dealWidthNodes(nodes)); + } + }); + } + + // 生成树内部方法 + _initTree(setting) { + const self = this, + o = this.options; + self.fireEvent(Events.INIT); + this.times = 1; + const tree = this.tree; + tree.empty(); + this.loading(); + this.tip.setVisible(false); + + function callback(nodes) { + if (self._stop === true) { + return; + } + self.nodes = $.fn.zTree.init(tree.element, setting, nodes); + } + + const op = extend({}, o.paras, { + times: 1, + }); + + o.itemsCreator(op, res => { + if (self._stop === true) { + return; + } + const hasNext = !!res.hasNext, + nodes = res.items || []; + if (nodes.length > 0) { + callback(self._dealWidthNodes(nodes)); + } + self.setTipVisible(nodes.length <= 0); + self.loaded(); + if (!hasNext) { + self.tip.invisible(); + } else { + self.tip.setLoaded(); + } + op.times === 1 && self.fireEvent(Events.AFTERINIT); + }); + } + + // 构造树结构, + initTree(nodes, setting) { + const defaultSetting = { + async: { + enable: false, + }, + check: { + enable: false, + }, + data: { + key: { + title: "title", + name: "text", + }, + simpleData: { + enable: true, + }, + }, + view: { + showIcon: false, + expandSpeed: "", + nameIsHTML: true, + }, + callback: {}, + }; + this.nodes = $.fn.zTree.init(this.tree.element, setting || defaultSetting, nodes); + } + + start() { + this._stop = false; + } + + stop() { + this._stop = true; + } + + // 生成树方法 + stroke(config) { + delete this.options.keyword; + extend(this.options.paras, config); + const setting = this._configSetting(); + this._createTree(); + this.start(); + this._initTree(setting); + } + + populate() { + this.stroke(...arguments); + } + + hasChecked() { + const treeObj = this.nodes; + + return treeObj.getCheckedNodes(true).length > 0; + } + + checkAll(checked) { + function setNode(children) { + each(children, (i, child) => { + child.halfCheck = false; + setNode(child.children); + }); + } + + if (!this.nodes) { + return; + } + + each(this.nodes.getNodes(), (i, node) => { + node.halfCheck = false; + setNode(node.children); + }); + this.nodes.checkAllNodes(checked); + } + + expandAll(flag) { + this.nodes && this.nodes.expandAll(flag); + } + + // 设置树节点的状态 + setValue(value, param) { + this.checkAll(false); + this.updateValue(value, param); + this.refresh(); + } + + setSelectedValue(value) { + this.options.paras.selectedValues = deepClone(value || {}); + } + + updateValue(values, param) { + if (!this.nodes) { + return; + } + param || (param = "value"); + const treeObj = this.nodes; + each(values, (v, op) => { + const nodes = treeObj.getNodesByParam(param, v, null); + each(nodes, (j, node) => { + extend(node, { checked: true }, op); + treeObj.updateNode(node); + }); + }); + } + + refresh() { + this.nodes && this.nodes.refresh(); + } + + getValue() { + if (!this.nodes) { + return null; + } + + return this._getSelectedValues(); + } + + destroyed() { + this.stop(); + this.nodes && this.nodes.destroy(); + } +} diff --git a/src/component/allvaluechooser/__test__/combo.allvaluechooser.test.js b/packages/fineui/src/component/allvaluechooser/__test__/combo.allvaluechooser.test.js similarity index 100% rename from src/component/allvaluechooser/__test__/combo.allvaluechooser.test.js rename to packages/fineui/src/component/allvaluechooser/__test__/combo.allvaluechooser.test.js diff --git a/src/component/allvaluechooser/abstract.allvaluechooser.js b/packages/fineui/src/component/allvaluechooser/abstract.allvaluechooser.js similarity index 100% rename from src/component/allvaluechooser/abstract.allvaluechooser.js rename to packages/fineui/src/component/allvaluechooser/abstract.allvaluechooser.js diff --git a/src/component/allvaluechooser/combo.allvaluechooser.js b/packages/fineui/src/component/allvaluechooser/combo.allvaluechooser.js similarity index 100% rename from src/component/allvaluechooser/combo.allvaluechooser.js rename to packages/fineui/src/component/allvaluechooser/combo.allvaluechooser.js diff --git a/src/component/allvaluechooser/index.js b/packages/fineui/src/component/allvaluechooser/index.js similarity index 100% rename from src/component/allvaluechooser/index.js rename to packages/fineui/src/component/allvaluechooser/index.js diff --git a/src/component/allvaluechooser/pane.allvaluechooser.js b/packages/fineui/src/component/allvaluechooser/pane.allvaluechooser.js similarity index 100% rename from src/component/allvaluechooser/pane.allvaluechooser.js rename to packages/fineui/src/component/allvaluechooser/pane.allvaluechooser.js diff --git a/src/component/allvaluemultitextvaluecombo/__test__/allvalue.multitextvalue.combo.test.js b/packages/fineui/src/component/allvaluemultitextvaluecombo/__test__/allvalue.multitextvalue.combo.test.js similarity index 100% rename from src/component/allvaluemultitextvaluecombo/__test__/allvalue.multitextvalue.combo.test.js rename to packages/fineui/src/component/allvaluemultitextvaluecombo/__test__/allvalue.multitextvalue.combo.test.js diff --git a/src/component/allvaluemultitextvaluecombo/allvalue.multitextvalue.combo.js b/packages/fineui/src/component/allvaluemultitextvaluecombo/allvalue.multitextvalue.combo.js similarity index 100% rename from src/component/allvaluemultitextvaluecombo/allvalue.multitextvalue.combo.js rename to packages/fineui/src/component/allvaluemultitextvaluecombo/allvalue.multitextvalue.combo.js diff --git a/src/component/form/form.field.js b/packages/fineui/src/component/form/form.field.js similarity index 100% rename from src/component/form/form.field.js rename to packages/fineui/src/component/form/form.field.js diff --git a/src/component/form/form.js b/packages/fineui/src/component/form/form.js similarity index 100% rename from src/component/form/form.js rename to packages/fineui/src/component/form/form.js diff --git a/src/component/form/index.js b/packages/fineui/src/component/form/index.js similarity index 100% rename from src/component/form/index.js rename to packages/fineui/src/component/form/index.js diff --git a/packages/fineui/src/component/index.js b/packages/fineui/src/component/index.js new file mode 100644 index 000000000..6ce49c20b --- /dev/null +++ b/packages/fineui/src/component/index.js @@ -0,0 +1,21 @@ +export * from "./allvaluechooser"; +export * from "./form"; +export * from "./valuechooser"; +export * from "./treevaluechooser"; +export { AllValueMultiTextValueCombo } from "./allvaluemultitextvaluecombo/allvalue.multitextvalue.combo"; + +// Object.assign(BI, { +// ...allvaluechooser, +// ...form, +// ...valueChooser, +// ......treeValueChooser, +// AllValueMultiTextValueCombo, +// }); + +// export * from "./allvaluechooser"; +// export * from "./form"; +// export * from "./valuechooser"; +// export * from "./treevaluechooser"; +// export { +// AllValueMultiTextValueCombo +// }; diff --git a/src/component/treevaluechooser/__test__/combo.listtreevaluechooser.test.js b/packages/fineui/src/component/treevaluechooser/__test__/combo.listtreevaluechooser.test.js similarity index 100% rename from src/component/treevaluechooser/__test__/combo.listtreevaluechooser.test.js rename to packages/fineui/src/component/treevaluechooser/__test__/combo.listtreevaluechooser.test.js diff --git a/src/component/treevaluechooser/__test__/combo.treevaluechooser.insert.test.js b/packages/fineui/src/component/treevaluechooser/__test__/combo.treevaluechooser.insert.test.js similarity index 100% rename from src/component/treevaluechooser/__test__/combo.treevaluechooser.insert.test.js rename to packages/fineui/src/component/treevaluechooser/__test__/combo.treevaluechooser.insert.test.js diff --git a/src/component/treevaluechooser/__test__/combo.treevaluechooser.test.js b/packages/fineui/src/component/treevaluechooser/__test__/combo.treevaluechooser.test.js similarity index 100% rename from src/component/treevaluechooser/__test__/combo.treevaluechooser.test.js rename to packages/fineui/src/component/treevaluechooser/__test__/combo.treevaluechooser.test.js diff --git a/src/component/treevaluechooser/__test__/pane.treevaluechooser.test.js b/packages/fineui/src/component/treevaluechooser/__test__/pane.treevaluechooser.test.js similarity index 100% rename from src/component/treevaluechooser/__test__/pane.treevaluechooser.test.js rename to packages/fineui/src/component/treevaluechooser/__test__/pane.treevaluechooser.test.js diff --git a/src/component/treevaluechooser/abstract.treevaluechooser.js b/packages/fineui/src/component/treevaluechooser/abstract.treevaluechooser.js similarity index 100% rename from src/component/treevaluechooser/abstract.treevaluechooser.js rename to packages/fineui/src/component/treevaluechooser/abstract.treevaluechooser.js diff --git a/src/component/treevaluechooser/abstract.treevaluechooser.list.js b/packages/fineui/src/component/treevaluechooser/abstract.treevaluechooser.list.js similarity index 100% rename from src/component/treevaluechooser/abstract.treevaluechooser.list.js rename to packages/fineui/src/component/treevaluechooser/abstract.treevaluechooser.list.js diff --git a/src/component/treevaluechooser/combo.listtreevaluechooser.js b/packages/fineui/src/component/treevaluechooser/combo.listtreevaluechooser.js similarity index 100% rename from src/component/treevaluechooser/combo.listtreevaluechooser.js rename to packages/fineui/src/component/treevaluechooser/combo.listtreevaluechooser.js diff --git a/src/component/treevaluechooser/combo.treevaluechooser.insert.js b/packages/fineui/src/component/treevaluechooser/combo.treevaluechooser.insert.js similarity index 100% rename from src/component/treevaluechooser/combo.treevaluechooser.insert.js rename to packages/fineui/src/component/treevaluechooser/combo.treevaluechooser.insert.js diff --git a/src/component/treevaluechooser/combo.treevaluechooser.js b/packages/fineui/src/component/treevaluechooser/combo.treevaluechooser.js similarity index 100% rename from src/component/treevaluechooser/combo.treevaluechooser.js rename to packages/fineui/src/component/treevaluechooser/combo.treevaluechooser.js diff --git a/src/component/treevaluechooser/index.js b/packages/fineui/src/component/treevaluechooser/index.js similarity index 100% rename from src/component/treevaluechooser/index.js rename to packages/fineui/src/component/treevaluechooser/index.js diff --git a/src/component/treevaluechooser/pane.treevaluechooser.js b/packages/fineui/src/component/treevaluechooser/pane.treevaluechooser.js similarity index 100% rename from src/component/treevaluechooser/pane.treevaluechooser.js rename to packages/fineui/src/component/treevaluechooser/pane.treevaluechooser.js diff --git a/src/component/valuechooser/__test__/combo.valuechooser.insert.test.js b/packages/fineui/src/component/valuechooser/__test__/combo.valuechooser.insert.test.js similarity index 100% rename from src/component/valuechooser/__test__/combo.valuechooser.insert.test.js rename to packages/fineui/src/component/valuechooser/__test__/combo.valuechooser.insert.test.js diff --git a/src/component/valuechooser/__test__/combo.valuechooser.test.js b/packages/fineui/src/component/valuechooser/__test__/combo.valuechooser.test.js similarity index 100% rename from src/component/valuechooser/__test__/combo.valuechooser.test.js rename to packages/fineui/src/component/valuechooser/__test__/combo.valuechooser.test.js diff --git a/src/component/valuechooser/__test__/pane.valuechooser.test.js b/packages/fineui/src/component/valuechooser/__test__/pane.valuechooser.test.js similarity index 100% rename from src/component/valuechooser/__test__/pane.valuechooser.test.js rename to packages/fineui/src/component/valuechooser/__test__/pane.valuechooser.test.js diff --git a/src/component/valuechooser/abstract.valuechooser.js b/packages/fineui/src/component/valuechooser/abstract.valuechooser.js similarity index 100% rename from src/component/valuechooser/abstract.valuechooser.js rename to packages/fineui/src/component/valuechooser/abstract.valuechooser.js diff --git a/src/component/valuechooser/combo.valuechooser.insert.js b/packages/fineui/src/component/valuechooser/combo.valuechooser.insert.js similarity index 100% rename from src/component/valuechooser/combo.valuechooser.insert.js rename to packages/fineui/src/component/valuechooser/combo.valuechooser.insert.js diff --git a/src/component/valuechooser/combo.valuechooser.js b/packages/fineui/src/component/valuechooser/combo.valuechooser.js similarity index 100% rename from src/component/valuechooser/combo.valuechooser.js rename to packages/fineui/src/component/valuechooser/combo.valuechooser.js diff --git a/src/component/valuechooser/combo.valuechooser.nobar.js b/packages/fineui/src/component/valuechooser/combo.valuechooser.nobar.js similarity index 100% rename from src/component/valuechooser/combo.valuechooser.nobar.js rename to packages/fineui/src/component/valuechooser/combo.valuechooser.nobar.js diff --git a/src/component/valuechooser/index.js b/packages/fineui/src/component/valuechooser/index.js similarity index 100% rename from src/component/valuechooser/index.js rename to packages/fineui/src/component/valuechooser/index.js diff --git a/src/component/valuechooser/pane.valuechooser.js b/packages/fineui/src/component/valuechooser/pane.valuechooser.js similarity index 100% rename from src/component/valuechooser/pane.valuechooser.js rename to packages/fineui/src/component/valuechooser/pane.valuechooser.js diff --git a/src/core/0.foundation.js b/packages/fineui/src/core/0.foundation.js similarity index 100% rename from src/core/0.foundation.js rename to packages/fineui/src/core/0.foundation.js diff --git a/src/core/1.lodash.js b/packages/fineui/src/core/1.lodash.js similarity index 100% rename from src/core/1.lodash.js rename to packages/fineui/src/core/1.lodash.js diff --git a/packages/fineui/src/core/2.base.js b/packages/fineui/src/core/2.base.js new file mode 100644 index 000000000..59e1817f1 --- /dev/null +++ b/packages/fineui/src/core/2.base.js @@ -0,0 +1,1637 @@ +/** + * 基本函数 + * Create By GUY 2014\11\17 + * + */ +import _ from "./1.lodash"; +import { Widget } from "./4.widget"; +import { createWidget } from "./5.inject"; +import { prepares, _global } from "./0.foundation"; +import { CRYPT_TYPE, aesDecrypt, aesEncrypt } from "./structure/aes"; +import { Date as DateEnum } from "./func/date"; + + +/** + * todo: 理论这么写,逻辑没问题,摇个人把这个 BI 干掉 + */ +const BI = { _ }; + +function traverse(func, context) { + return function (value, key, obj) { + return func.call(context, key, value, obj); + }; +} +function _apply(name) { + return function () { + return BI._[name](...arguments); + }; +} +function _applyFunc(name) { + return function () { + const args = Array.prototype.slice.call(arguments, 0); + args[1] = BI._.isFunction(args[1]) + ? traverse(args[1], args[2]) + : args[1]; + + return BI._[name](...args); + }; +} + +export function assert(v, is) { + if (isFunction(is)) { + if (!is(v)) { + throw new Error(`${v} error`); + } else { + return true; + } + } + if (!isArray(is)) { + is = [is]; + } + if (!deepContains(is, v)) { + throw new Error(`${v} error`); + } + + return true; +} + +export function warn(message) { + console.warn(message); +} + +export function UUID() { + const f = [ + "0", + "1", + "2", + "3", + "4", + "5", + "6", + "7", + "8", + "9", + "a", + "b", + "c", + "d", + "e", + "f" + ]; + let str = ""; + for (let i = 0; i < 16; i++) { + const r = _global.parseInt(f.length * Math.random(), 10); + str += f[r]; + } + + return str; +} + +export function isWidget(widget) { + return widget instanceof Widget; +} + +export function createWidgets(items, options, context) { + if (!isArray(items)) { + throw new Error("items必须是数组", items); + } + if (isWidget(options)) { + context = options; + options = {}; + } else { + options || (options = {}); + } + + return map(flatten(items), (i, item) => + createWidget(item, deepClone(options), context) + ); +} + +export function createItems(data, innerAttr, outerAttr) { + innerAttr = isArray(innerAttr) + ? innerAttr + : makeArray(flatten(data).length, innerAttr || {}); + outerAttr = isArray(outerAttr) + ? outerAttr + : makeArray(flatten(data).length, outerAttr || {}); + + return map(data, (i, item) => { + if (isArray(item)) { + return createItems(item, innerAttr, outerAttr); + } + if (item instanceof Widget) { + return extend({}, innerAttr.shift(), outerAttr.shift(), { + type: null, + el: item, + }); + } + if (innerAttr[0] instanceof Widget) { + outerAttr.shift(); + + return extend({}, item, { + el: innerAttr.shift(), + }); + } + if (item.el instanceof Widget) { + innerAttr.shift(); + + return extend({}, outerAttr.shift(), { type: null }, item); + } + if (item.el) { + return extend({}, outerAttr.shift(), item, { + el: extend({}, innerAttr.shift(), item.el), + }); + } + + return extend({}, outerAttr.shift(), { + el: extend({}, innerAttr.shift(), item), + }); + }); +} + +// 用容器包装items +export function packageItems(items, layouts) { + for (let i = layouts.length - 1; i >= 0; i--) { + items = map(items, (k, it) => + extend({}, layouts[i], { + items: [ + extend({}, layouts[i].el, { + el: it, + }) + ], + }) + ); + } + + return items; +} + +export function formatEL(obj) { + if (obj && !obj.type && obj.el) { + return obj; + } + + return { + el: obj, + }; +} + +// 剥开EL +export function stripEL(obj) { + return (obj.type && obj) || obj.el || obj; +} + +export function trans2Element(widgets) { + return map(widgets, (i, wi) => wi.element); +} + +// 集合相关方法 +BI._.each( + [ + "where", + "findWhere", + "invoke", + "pluck", + "shuffle", + "sample", + "toArray", + "size" + ], + name => { + BI[name] = _apply(name); + } +); +BI._.each( + [ + "get", + "set", + "each", + "map", + "reduce", + "reduceRight", + "find", + "filter", + "reject", + "every", + "all", + "some", + "any", + "max", + "min", + "sortBy", + "groupBy", + "indexBy", + "countBy", + "partition", + "clamp" + ], + name => { + if (name === "any") { + BI[name] = _applyFunc("some"); + } else { + BI[name] = _applyFunc(name); + } + } +); +export const where = BI.where; +export const findWhere = BI.findWhere; +export const invoke = BI.invoke; +export const pluck = BI.pluck; +export const shuffle = BI.shuffle; +export const sample = BI.sample; +export const toArray = BI.toArray; +export const size = BI.size; +export const get = BI.get; +export const set = BI.set; +export const each = BI.each; +export const map = BI.map; +export const reduce = BI.reduce; +export const reduceRight = BI.reduceRight; +export const find = BI.find; +export const filter = BI.filter; +export const reject = BI.reject; +export const every = BI.every; +export const all = BI.all; +export const some = BI.some; +export const any = BI.any; +export const max = BI.max; +export const min = BI.min; +export const sortBy = BI.sortBy; +export const groupBy = BI.groupBy; +export const indexBy = BI.indexBy; +export const countBy = BI.countBy; +export const partition = BI.partition; +export const clamp = BI.clamp; + +// 数数 +export function count(from, to, predicate) { + let t; + if (predicate) { + for (t = from; t < to; t++) { + predicate(t); + } + } + + return to - from; +} + +// 倒数 +export function inverse(from, to, predicate) { + return count(to, from, predicate); +} + +export function firstKey(obj) { + let res = undefined; + any(obj, (key, value) => { + res = key; + + return true; + }); + + return res; +} + +export function lastKey(obj) { + let res = undefined; + each(obj, (key, value) => { + res = key; + + return true; + }); + + return res; +} + +export function firstObject(obj) { + let res = undefined; + any(obj, (key, value) => { + res = value; + + return true; + }); + + return res; +} + +export function lastObject(obj) { + let res = undefined; + each(obj, (key, value) => { + res = value; + + return true; + }); + + return res; +} + +export function concat(obj1, obj2) { + if (isKey(obj1)) { + return map([].slice.apply(arguments), (idx, v) => v).join(""); + } + if (isArray(obj1)) { + return BI._.concat.apply([], arguments); + } + if (isObject(obj1)) { + return extend.apply({}, arguments); + } +} + +export function backEach(obj, predicate, context) { + predicate = iteratee(predicate, context); + for (let index = obj.length - 1; index >= 0; index--) { + predicate(index, obj[index], obj); + } + + return false; +} + +export function backAny(obj, predicate, context) { + predicate = iteratee(predicate, context); + for (let index = obj.length - 1; index >= 0; index--) { + if (predicate(index, obj[index], obj)) { + return true; + } + } + + return false; +} + +export function backEvery(obj, predicate, context) { + predicate = iteratee(predicate, context); + for (let index = obj.length - 1; index >= 0; index--) { + if (!predicate(index, obj[index], obj)) { + return false; + } + } + + return true; +} + +export function backFindKey(obj, predicate, context) { + predicate = iteratee(predicate, context); + const objKeys = keys(obj); + let key; + for (let i = objKeys.length - 1; i >= 0; i--) { + key = objKeys[i]; + if (predicate(obj[key], key, obj)) { + return key; + } + } +} + +export function backFind(obj, predicate, context) { + let key; + if (isArray(obj)) { + key = findLastIndex(obj, predicate, context); + } else { + key = backFindKey(obj, predicate, context); + } + if (key !== void 0 && key !== -1) { + return obj[key]; + } +} + +export function remove(obj, target, context) { + const targetIsFunction = isFunction(target); + target = targetIsFunction || isArray(target) ? target : [target]; + let i; + if (isArray(obj)) { + for (i = 0; i < obj.length; i++) { + if ( + (targetIsFunction && + (target === obj[i] || + target.apply(context, [i, obj[i]]) === true)) || + (!targetIsFunction && contains(target, obj[i])) + ) { + obj.splice(i--, 1); + } + } + } else { + each(obj, (i, v) => { + if ( + (targetIsFunction && + (target === obj[i] || + target.apply(context, [i, obj[i]]) === true)) || + (!targetIsFunction && contains(target, obj[i])) + ) { + delete obj[i]; + } + }); + } +} + +export function removeAt(obj, index) { + index = isArray(index) ? index : [index]; + const objIsArray = isArray(obj); + let i; + for (i = 0; i < index.length; i++) { + if (objIsArray) { + obj[index[i]] = "$deleteIndex"; + } else { + delete obj[index[i]]; + } + } + if (objIsArray) { + remove(obj, "$deleteIndex"); + } +} + +export function string2Array(str) { + return str.split("&-&"); +} + +export function array2String(array) { + return array.join("&-&"); +} + +export function abc2Int(string) { + let idx = 0; + const start = "A", + str = string.toUpperCase(); + for (let i = 0, len = str.length; i < len; ++i) { + idx = str.charAt(i).charCodeAt(0) - start.charCodeAt(0) + 26 * idx + 1; + if ( + idx > + (2147483646 - str.charAt(i).charCodeAt(0) + start.charCodeAt(0)) / + 26 + ) { + return 0; + } + } + + return idx; +} + +export function int2Abc(num) { + const DIGITS = [ + "A", + "B", + "C", + "D", + "E", + "F", + "G", + "H", + "I", + "J", + "K", + "L", + "M", + "N", + "O", + "P", + "Q", + "R", + "S", + "T", + "U", + "V", + "W", + "X", + "Y", + "Z" + ]; + let idx = num, + str = ""; + if (num === 0) { + return ""; + } + while (idx !== 0) { + let t = idx % 26; + if (t === 0) { + t = 26; + } + str = DIGITS[t - 1] + str; + idx = (idx - t) / 26; + } + + return str; +} + +// 数组相关的方法 +BI._.each( + [ + "first", + "initial", + "last", + "rest", + "compact", + "flatten", + "without", + "union", + "intersection", + "difference", + "zip", + "unzip", + "object", + "indexOf", + "lastIndexOf", + "sortedIndex", + "range", + "take", + "takeRight", + "uniqBy" + ], + name => { + BI[name] = _apply(name); + } +); +BI._.each(["findIndex", "findLastIndex"], name => { + BI[name] = _applyFunc(name); +}); +export const first = BI.first; +export const initial = BI.initial; +export const last = BI.last; +export const rest = BI.rest; +export const compact = BI.compact; +export const flatten = BI.flatten; +export const without = BI.without; +export const union = BI.union; +export const intersection = BI.intersection; +export const difference = BI.difference; +export const zip = BI.zip; +export const unzip = BI.unzip; +export const object = BI.object; +export const indexOf = BI.indexOf; +export const lastIndexOf = BI.lastIndexOf; +export const sortedIndex = BI.sortedIndex; +export const range = BI.range; +export const take = BI.take; +export const takeRight = BI.takeRight; +export const uniqBy = BI.uniqBy; +export const findIndex = BI.findIndex; +export const findLastIndex = BI.findLastIndex; + +// 构建一个长度为length的数组 +export function makeArray(length, value) { + const res = []; + for (let i = 0; i < length; i++) { + if (isNull(value)) { + res.push(i); + } else { + res.push(deepClone(value)); + } + } + + return res; +} + +export function makeObject(array, value) { + const map = {}; + for (let i = 0; i < array.length; i++) { + if (isNull(value)) { + map[array[i]] = array[i]; + } else if (isFunction(value)) { + map[array[i]] = value(i, array[i]); + } else { + map[array[i]] = deepClone(value); + } + } + + return map; +} + +export function makeArrayByArray(array, value) { + const res = []; + if (!array) { + return res; + } + for (let i = 0, len = array.length; i < len; i++) { + if (isArray(array[i])) { + res.push(makeArrayByArray(array[i], value)); + } else { + res.push(deepClone(value)); + } + } + + return res; +} + +export function uniq(array, isSorted, iteratee, context) { + if (array === null) { + return []; + } + if (!isBoolean(isSorted)) { + context = iteratee; + iteratee = isSorted; + isSorted = false; + } + iteratee && (iteratee = traverse(iteratee, context)); + + return BI._uniq.call(BI._, array, isSorted, iteratee, context); +} + +// 对象相关方法 +BI._.each( + [ + "keys", + "allKeys", + "values", + "pairs", + "invert", + "create", + "functions", + "extend", + "extendOwn", + "defaults", + "clone", + "property", + "propertyOf", + "matcher", + "isEqual", + "isMatch", + "isEmpty", + "isElement", + "isNumber", + "isString", + "isArray", + "isObject", + "isPlainObject", + "isArguments", + "isFunction", + "isFinite", + "isBoolean", + "isDate", + "isRegExp", + "isError", + "isNaN", + "isUndefined", + "zipObject", + "cloneDeep", + "pickBy" + ], + name => { + BI[name] = _apply(name); + } +); +export const keys = BI.keys; +export const allKeys = BI.allKeys; +export const values = BI.values; +export const pairs = BI.pairs; +export const invert = BI.invert; +export const create = BI.create; +export const functions = BI.functions; +export const extend = BI.extend; +export const extendOwn = BI.extendOwn; +export const defaults = BI.defaults; +export const clone = BI.clone; +export const property = BI.property; +export const propertyOf = BI.propertyOf; +export const matcher = BI.matcher; +export const isEqual = BI.isEqual; +export const isMatch = BI.isMatch; +export const isEmpty = BI.isEmpty; +export const isElement = BI.isElement; +export const isNumber = BI.isNumber; +export const isString = BI.isString; +export const isArray = BI.isArray; +export const isObject = BI.isObject; +export const isPlainObject = BI.isPlainObject; +export const isArguments = BI.isArguments; +export const isFunction = BI.isFunction; +export const isFinite = BI.isFinite; +export const isBoolean = BI.isBoolean; +export const isDate = BI.isDate; +export const isRegExp = BI.isRegExp; +export const isError = BI.isError; +export const isNaN = BI.isNaN; +export const isUndefined = BI.isUndefined; +export const zipObject = BI.zipObject; +export const cloneDeep = BI.cloneDeep; +export const pickBy = BI.pickBy; + +BI._.each(["mapObject", "findKey", "pick", "omit", "tap"], name => { + BI[name] = _applyFunc(name); +}); +export const mapObject = BI.mapObject; +export const findKey = BI.findKey; +export const pick = BI.pick; +export const omit = BI.omit; +export const tap = BI.tap; + +export function inherit(sp, overrides) { + function sb() { + return sp.apply(this, arguments); + } + function F() {} + const spp = sp.prototype; + F.prototype = spp; + sb.prototype = new F(); + sb.superclass = spp; + extend(sb.prototype, overrides, { + superclass: sp, + }); + + return sb; +} + +export function init() { + // 先把准备环境准备好 + while (prepares && prepares.length > 0) { + prepares.shift()(); + } + while ( + _global.___fineuiExposedFunction && + _global.___fineuiExposedFunction.length > 0 + ) { + _global.___fineuiExposedFunction.shift()(); + } + BI.initialized = true; +} + +export function has(obj, keys) { + if (isArray(keys)) { + if (keys.length === 0) { + return false; + } + + return every(keys, (i, key) => BI._.has(obj, key)); + } + + return BI._.has(...arguments); +} + +export function freeze(value) { + // 在ES5中,如果这个方法的参数不是一个对象(一个原始值),那么它会导致 TypeError + // 在ES2015中,非对象参数将被视为要被冻结的普通对象,并被简单地返回 + if (Object.freeze && isObject(value)) { + return Object.freeze(value); + } + + return value; +} + +// 数字和字符串可以作为key +export function isKey(key) { + return isNumber(key) || (isString(key) && key.length > 0); +} + +// 忽略大小写的等于 +export function isCapitalEqual(a, b) { + a = isNull(a) ? a : `${a}`.toLowerCase(); + b = isNull(b) ? b : `${b}`.toLowerCase(); + + return isEqual(a, b); +} + +export function isWidthOrHeight(w) { + if (typeof w === "number") { + return w >= 0; + } else if (typeof w === "string") { + return ( + /^\d{1,3}(\.\d)?%$/.test(w) || + w === "auto" || + /^\d+(\.\d+)?px$/.test(w) || + /^calc/.test(w) + ); + } +} + +export function isNotNull(obj) { + return !isNull(obj); +} + +export function isNull(obj) { + return typeof obj === "undefined" || obj === null; +} + +export function isEmptyArray(arr) { + return isArray(arr) && isEmpty(arr); +} + +export function isNotEmptyArray(arr) { + return isArray(arr) && !isEmpty(arr); +} + +export function isEmptyObject(obj) { + return isEqual(obj, {}); +} + +export function isNotEmptyObject(obj) { + return isPlainObject(obj) && !isEmptyObject(obj); +} + +export function isWindow(obj) { + return obj !== null && obj === obj.window; +} + +export function isPromise(obj) { + return !!obj && (isObject(obj) || isFunction(obj)) && isFunction(obj.then); +} + +export const deepClone = BI._.cloneDeep; +export const deepExtend = BI._.merge; + +export function isDeepMatch(object, attrs) { + const attrsKeys = keys(attrs), + length = attrsKeys.length; + if (object === null) { + return !length; + } + const obj = Object(object); + for (let i = 0; i < length; i++) { + const key = attrsKeys[i]; + if (!isEqual(attrs[key], obj[key]) || !(key in obj)) { + return false; + } + } + + return true; +} + +export function contains(obj, target, fromIndex) { + if (!BI._.isArrayLike(obj)) obj = values(obj); + + return ( + indexOf(obj, target, typeof fromIndex === "number" && fromIndex) >= 0 + ); +} + +export function deepContains(obj, copy) { + if (isObject(copy)) { + return any(obj, (i, v) => isEqual(v, copy)); + } + + return contains(obj, copy); +} + +export function deepIndexOf(obj, target) { + for (let i = 0; i < obj.length; i++) { + if (isEqual(target, obj[i])) { + return i; + } + } + + return -1; +} + +export function deepRemove(obj, target) { + let done = false; + let i; + if (isArray(obj)) { + for (i = 0; i < obj.length; i++) { + if (isEqual(target, obj[i])) { + obj.splice(i--, 1); + done = true; + } + } + } else { + each(obj, (i, v) => { + if (isEqual(target, obj[i])) { + delete obj[i]; + done = true; + } + }); + } + + return done; +} + +export function deepWithout(obj, target) { + if (isArray(obj)) { + const result = []; + for (let i = 0; i < obj.length; i++) { + if (!isEqual(target, obj[i])) { + result.push(obj[i]); + } + } + + return result; + } + const result = {}; + each(obj, (i, v) => { + if (!isEqual(target, obj[i])) { + result[i] = v; + } + }); + + return result; +} + +export function deepUnique(array) { + const result = []; + each(array, (i, item) => { + if (!deepContains(result, item)) { + result.push(item); + } + }); + + return result; +} + +// 比较两个对象得出不一样的key值 +export function deepDiff(object, other) { + object || (object = {}); + other || (other = {}); + const result = []; + const used = []; + for (const b in object) { + if (has(object, b)) { + if (!isEqual(object[b], other[b])) { + result.push(b); + } + used.push(b); + } + } + for (const b in other) { + if (has(other, b) && !contains(used, b)) { + result.push(b); + } + } + + return result; +} + +// 通用方法 +BI._.each( + [ + "uniqueId", + "result", + "chain", + "iteratee", + "unescape", + "before", + "after", + "chunk" + ], + name => { + BI[name] = (...args) => BI._[name](...args); + } +); +export const uniqueId = BI.uniqueId; +export const result = BI.result; +export const chain = BI.chain; +export const iteratee = BI.iteratee; +export const unescape = BI.unescape; +export const before = BI.before; +export const after = BI.after; +export const chunk = BI.chunk; + +// 事件相关方法 +BI._.each( + [ + "bind", + "once", + "partial", + "debounce", + "throttle", + "delay", + "defer", + "wrap" + ], + name => { + BI[name] = (...args) => BI._[name](...args); + } +); +export const bind = BI.bind; +export const once = BI.once; +export const partial = BI.partial; +export const debounce = BI.debounce; +export const throttle = BI.throttle; +export const delay = BI.delay; +export const defer = BI.defer; +export const wrap = BI.wrap; + +export const nextTick = (function () { + const callbacks = []; + let pending = false; + let timerFunc = void 0; + + function nextTickHandler() { + pending = false; + const copies = callbacks.slice(0); + callbacks.length = 0; + for (let i = 0; i < copies.length; i++) { + copies[i](); + } + } + + if (typeof Promise !== "undefined") { + const p = Promise.resolve(); + timerFunc = function timerFunc() { + p.then(nextTickHandler); + }; + } else if (typeof MutationObserver !== "undefined") { + let counter = 1; + const observer = new MutationObserver(nextTickHandler); + const textNode = document.createTextNode(String(counter)); + observer.observe(textNode, { + characterData: true, + }); + timerFunc = function timerFunc() { + counter = (counter + 1) % 2; + textNode.data = String(counter); + }; + } else if (typeof setImmediate !== "undefined") { + timerFunc = function timerFunc() { + setImmediate(nextTickHandler); + }; + } else { + // Fallback to setTimeout. + timerFunc = function timerFunc() { + setTimeout(nextTickHandler, 0); + }; + } + + return function queueNextTick(cb) { + let _resolve = void 0; + const args = [].slice.call(arguments, 1); + callbacks.push(() => { + if (cb) { + try { + cb(...args); + } catch (e) { + console.error(e); + } + } else if (_resolve) { + _resolve(...args); + } + }); + if (!pending) { + pending = true; + timerFunc(); + } + // $flow-disable-line + if (!cb && typeof Promise !== "undefined") { + return new Promise((resolve, reject) => { + _resolve = resolve; + }); + } + }; +}()); + +// 数字相关方法 +BI._.each(["random"], name => { + BI[name] = _apply(name); +}); +export const random = BI.random; + +export function parseInt(number) { + let radix = 10; + if (/^0x/g.test(number)) { + radix = 16; + } + try { + return _global.parseInt(number, radix); + } catch (e) { + throw new Error(`${number}parse int error`); + } +} + +export function parseSafeInt(value) { + const MAX_SAFE_INTEGER = 9007199254740991; + + return value + ? clamp(parseInt(value), -MAX_SAFE_INTEGER, MAX_SAFE_INTEGER) + : value === 0 + ? value + : 0; +} + +export function parseFloat(number) { + try { + return _global.parseFloat(number); + } catch (e) { + throw new Error(`${number}parse float error`); + } +} + +export function isNaturalNumber(number) { + return /^\d+$/.test(number); +} + +export function isPositiveInteger(number) { + return /^\+?[1-9][0-9]*$/.test(number); +} + +export function isNegativeInteger(number) { + return /^-[1-9][0-9]*$/.test(number); +} + +export function isInteger(number) { + return /^-?\d+$/.test(number); +} + +export function isNumeric(number) { + return ( + !_global.isNaN(_global.parseFloat(number)) && _global.isFinite(number) + ); +} + +export function isFloat(number) { + return /^([+-]?)\d*\.\d+$/.test(number); +} + +export function isOdd(number) { + if (!isInteger(number)) { + return false; + } + + return (number & 1) === 1; +} + +export function isEven(number) { + if (!isInteger(number)) { + return false; + } + + return (number & 1) === 0; +} + +export function sum(array, iteratee, context) { + let sum = 0; + each(array, (i, item) => { + if (iteratee) { + sum += Number(iteratee.apply(context, [i, item])); + } else { + sum += Number(item); + } + }); + + return sum; +} + +export function average(array, iteratee, context) { + const sumResult = sum(array, iteratee, context); + + return sumResult / array.length; +} + +export function trim(...args) { + return BI._.trim(...args); +} + +export function toUpperCase(string) { + return `${string}`.toLocaleUpperCase(); +} + +export function toLowerCase(string) { + return `${string}`.toLocaleLowerCase(); +} + +export function isEndWithBlank(string) { + return /(\s|\u00A0)$/.test(string); +} + +export function isLiteral(exp) { + return /^\s?(true|false|-?[\d.]+|'[^']*'|"[^"]*")\s?$/.test(exp); +} + +export function stripQuotes(str) { + const a = str.charCodeAt(0); + const b = str.charCodeAt(str.length - 1); + + return a === b && (a === 0x22 || a === 0x27) ? str.slice(1, -1) : str; +} + +// background-color => backgroundColor +export function camelize(str) { + return str.replace(/-(.)/g, (_, character) => character.toUpperCase()); +} + +// backgroundColor => background-color +export function hyphenate(str) { + return str.replace(/([A-Z])/g, "-$1").toLowerCase(); +} + +export function isNotEmptyString(str) { + return isString(str) && !isEmpty(str); +} + +export function isEmptyString(str) { + return isString(str) && isEmpty(str); +} + +/** + * 通用解密方法 + * @param type 解密方式 + * @param text 文本 + * @param key 种子 + * @return {*} + */ +export function encrypt(type, text, key) { + switch (type) { + case CRYPT_TYPE.AES: + default: + return aesEncrypt(text, key); + } +} + +/** + * 通用解密方法 + * @param type 解密方式 + * @param text 文本 + * @param key 种子 + * @return {*} + */ +export function decrypt(type, text, key) { + switch (type) { + case CRYPT_TYPE.AES: + default: + return aesDecrypt(text, key); + } +} + +/** + * 对字符串中的'和\做编码处理 + * @static + * @param {String} string 要做编码处理的字符串 + * @return {String} 编码后的字符串 + */ +export function escape(string) { + return string.replace(/('|\\)/g, "\\$1"); +} + +/** + * 让字符串通过指定字符做补齐的函数 + * + * var s = BI.leftPad('123', 5, '0');//s的值为:'00123' + * + * @static + * @param {String} val 原始值 + * @param {Number} size 总共需要的位数 + * @param {String} ch 用于补齐的字符 + * @return {String} 补齐后的字符串 + */ +export function leftPad(val, size, ch) { + let result = String(val); + if (!ch) { + ch = " "; + } + while (result.length < size) { + result = ch + result; + } + + return result.toString(); +} + +/** + * 对字符串做替换的函数 + * + * var cls = 'my-class', text = 'Some text'; + * var res = BI.format('
{1}
', cls, text); + * //res的值为:'
Some text
'; + * + * @static + * @param {String} format 要做替换的字符串,替换字符串1,替换字符串2... + * @return {String} 做了替换后的字符串 + */ +export function format(format) { + const args = Array.prototype.slice.call(arguments, 1); + + return format.replace(/\{(\d+)\}/g, (m, i) => args[i]); +} + +/** + * 是否是闰年 + * @param year + * @returns {boolean} + */ +export function isLeapYear(year) { + return (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0; +} + +/** + * 检测是否在有效期 + * + * @param YY 年 + * @param MM 月 + * @param DD 日 + * @param minDate '1900-01-01' + * @param maxDate '2099-12-31' + * @returns {Array} 若无效返回无效状态,数组第一位为无效属性,第二位缺省为超下限,1为超上限 + */ +export function checkDateVoid(YY, MM, DD, minDate, maxDate) { + let back = []; + YY = YY | 0; + MM = MM | 0; + DD = DD | 0; + minDate = isString(minDate) ? minDate.match(/\d+/g) : minDate; + maxDate = isString(maxDate) ? maxDate.match(/\d+/g) : maxDate; + if (YY < minDate[0]) { + back = ["y"]; + } else if (YY > maxDate[0]) { + back = ["y", 1]; + } else if (YY >= minDate[0] && YY <= maxDate[0]) { + if (YY === minDate[0]) { + if (MM < minDate[1]) { + back = ["m"]; + } else if (MM === minDate[1]) { + if (DD < minDate[2]) { + back = ["d"]; + } + } + } + if (YY === maxDate[0]) { + if (MM > maxDate[1]) { + back = ["m", 1]; + } else if (MM === maxDate[1]) { + if (DD > maxDate[2]) { + back = ["d", 1]; + } + } + } + } + + return back; +} + +export function checkDateLegal(str) { + const ar = str.match(/\d+/g); + const YY = ar[0] | 0, + MM = ar[1] | 0, + DD = ar[2] | 0; + if (ar.length <= 1) { + return true; + } + if (ar.length <= 2) { + return MM >= 1 && MM <= 12; + } + const MD = DateEnum._MD.slice(0); + MD[1] = isLeapYear(YY) ? 29 : 28; + + return MM >= 1 && MM <= 12 && DD <= MD[MM - 1]; +} + +/** 解析日期时间字符串 + * + * @param str + * @param fmt + * @returns {Date|Date} + * 年月日缺省值为当前日期, 时分秒缺省值为0 + */ +export function parseDateTime(str, fmt) { + const today = getDate(); + let y; + let m; + let d; + // wei : 对于fmt为‘YYYYMM’或者‘YYYYMMdd’的格式,str的值为类似'201111'的形式,因为年月之间没有分隔符,所以正则表达式分割无效,导致bug7376。 + const a = str.split(/\W+/); + if (fmt.toLowerCase() === "%y%x" || fmt.toLowerCase() === "%y%x%d") { + const yearlength = 4; + const otherlength = 2; + a[0] = str.substring(0, yearlength); + a[1] = str.substring(yearlength, yearlength + otherlength); + a[2] = str.substring( + yearlength + otherlength, + yearlength + otherlength * 2 + ); + } + const b = fmt.match(/%./g); + let i = 0, + j = 0; + let hr = 0; + let min = 0; + let sec = 0; + for (i = 0; i < a.length; ++i) { + switch (b[i]) { + case "%d": + case "%e": + d = _global.parseInt(a[i], 10); + break; + + case "%X": + m = _global.parseInt(a[i], 10) - 1; + break; + case "%x": + m = _global.parseInt(a[i], 10) - 1; + break; + + case "%Y": + case "%y": + y = _global.parseInt(a[i], 10); + y < 100 && (y += y > 29 ? 1900 : 2000); + break; + + case "%b": + case "%B": + for (j = 0; j < 12; ++j) { + if ( + BI.getMonthName(j) + .substr(0, a[i].length) + .toLowerCase() === a[i].toLowerCase() + ) { + m = j; + break; + } + } + break; + + case "%H": + case "%I": + case "%k": + case "%l": + hr = _global.parseInt(a[i], 10); + break; + + case "%P": + case "%p": + if (/pm/i.test(a[i]) && hr < 12) { + hr += 12; + } else if (/am/i.test(a[i]) && hr >= 12) { + hr -= 12; + } + break; + case "%Q": + case "%q": + m = (_global.parseInt(a[i], 10) - 1) * 3; + break; + case "%M": + min = _global.parseInt(a[i], 10); + break; + case "%S": + sec = _global.parseInt(a[i], 10); + break; + default: + } + } + // if (!a[i]) { + // continue; + // } + if (_global.isNaN(y)) { + y = today.getFullYear(); + } + if (_global.isNaN(m)) { + m = today.getMonth(); + } + if (_global.isNaN(d)) { + d = today.getDate(); + } + if (_global.isNaN(hr)) { + hr = today.getHours(); + } + if (_global.isNaN(min)) { + min = today.getMinutes(); + } + if (_global.isNaN(sec)) { + sec = today.getSeconds(); + } + if (y !== 0) { + return getDate(y, m, d, hr, min, sec); + } + y = 0; + m = -1; + d = 0; + for (i = 0; i < a.length; ++i) { + if (a[i].search(/[a-zA-Z]+/) !== -1) { + let t = -1; + for (j = 0; j < 12; ++j) { + if ( + BI.getMonthName(j).substr(0, a[i].length).toLowerCase() === + a[i].toLowerCase() + ) { + t = j; + break; + } + } + if (t !== -1) { + if (m !== -1) { + d = m + 1; + } + m = t; + } + } else if (_global.parseInt(a[i], 10) <= 12 && m === -1) { + m = a[i] - 1; + } else if (_global.parseInt(a[i], 10) > 31 && y === 0) { + y = _global.parseInt(a[i], 10); + y < 100 && (y += y > 29 ? 1900 : 2000); + } else if (d === 0) { + d = a[i]; + } + } + if (y === 0) { + y = today.getFullYear(); + } + if (m === -1) { + m = today.getMonth(); + } + if (m !== -1 && d !== 0) { + return getDate(y, m, d, hr, min, sec); + } + + return today; +} + +export function getDate(...args) { + const length = args.length; + let dt; + switch (length) { + // new Date() + case 0: + dt = new Date(); + break; + // new Date(long) + case 1: + dt = new Date(args[0]); + break; + // new Date(year, month) + case 2: + dt = new Date(args[0], args[1]); + break; + // new Date(year, month, day) + case 3: + dt = new Date(args[0], args[1], args[2]); + break; + // new Date(year, month, day, hour) + case 4: + dt = new Date(args[0], args[1], args[2], args[3]); + break; + // new Date(year, month, day, hour, minute) + case 5: + dt = new Date(args[0], args[1], args[2], args[3], args[4]); + break; + // new Date(year, month, day, hour, minute, second) + case 6: + dt = new Date(args[0], args[1], args[2], args[3], args[4], args[5]); + break; + // new Date(year, month, day, hour, minute, second, millisecond) + case 7: + dt = new Date( + args[0], + args[1], + args[2], + args[3], + args[4], + args[5], + args[6] + ); + break; + default: + dt = new Date(); + break; + } + if ( + isNotNull(BI.timeZone) && + (arguments.length === 0 || + (arguments.length === 1 && isNumber(arguments[0]))) + ) { + const localTime = dt.getTime(); + // BI-33791 1901年以前的东8区标准是GMT+0805, 统一无论是什么时间,都以整的0800这样的为基准 + const localOffset = dt.getTimezoneOffset() * 60000; // 获得当地时间偏移的毫秒数 + const utc = localTime + localOffset; // utc即GMT时间标准时区 + + return new Date(utc + BI.timeZone); // + Pool.timeZone.offset); + } + + return dt; +} + +export function getTime() { + const length = arguments.length; + const args = arguments; + let dt; + switch (length) { + // new Date() + case 0: + dt = new Date(); + break; + // new Date(long) + case 1: + dt = new Date(args[0]); + break; + // new Date(year, month) + case 2: + dt = new Date(args[0], args[1]); + break; + // new Date(year, month, day) + case 3: + dt = new Date(args[0], args[1], args[2]); + break; + // new Date(year, month, day, hour) + case 4: + dt = new Date(args[0], args[1], args[2], args[3]); + break; + // new Date(year, month, day, hour, minute) + case 5: + dt = new Date(args[0], args[1], args[2], args[3], args[4]); + break; + // new Date(year, month, day, hour, minute, second) + case 6: + dt = new Date(args[0], args[1], args[2], args[3], args[4], args[5]); + break; + // new Date(year, month, day, hour, minute, second, millisecond) + case 7: + dt = new Date( + args[0], + args[1], + args[2], + args[3], + args[4], + args[5], + args[6] + ); + break; + default: + dt = new Date(); + break; + } + if (isNotNull(BI.timeZone)) { + // BI-33791 1901年以前的东8区标准是GMT+0805, 统一无论是什么时间,都以整的0800这样的为基准 + return ( + dt.getTime() - BI.timeZone - new Date().getTimezoneOffset() * 60000 + ); + } + + return dt.getTime(); +} + diff --git a/src/core/3.ob.js b/packages/fineui/src/core/3.ob.js similarity index 100% rename from src/core/3.ob.js rename to packages/fineui/src/core/3.ob.js diff --git a/packages/fineui/src/core/4.widget.js b/packages/fineui/src/core/4.widget.js new file mode 100644 index 000000000..2e5fae77d --- /dev/null +++ b/packages/fineui/src/core/4.widget.js @@ -0,0 +1,1192 @@ +/** + * Widget超类 + * @class Widget + * @extends OB + * + * @cfg {JSON} options 配置属性 + */ + +import $ from "jquery"; +import { + isFunction, + isArray, + each, + extend, + isPlainObject, + isNull, + uniqueId, + isWidget, + isWidthOrHeight, + isKey, + remove, + any, + isNotNull +} from "./2.base"; +import { OB } from "./3.ob"; +import { Providers, _lazyCreateWidget } from "./5.inject"; +import { DOM } from "./utils"; +import { Events, emptyFn, pixFormat } from "./constant"; +import { Plugin } from "./6.plugin"; +import { _global } from "./0.foundation"; +import { SystemProvider } from "./system"; + +const cancelAnimationFrame = + _global.cancelAnimationFrame || + _global.webkitCancelAnimationFrame || + _global.mozCancelAnimationFrame || + _global.oCancelAnimationFrame || + _global.msCancelAnimationFrame || + _global.clearTimeout; + +const requestAnimationFrame = + _global.requestAnimationFrame || + _global.webkitRequestAnimationFrame || + _global.mozRequestAnimationFrame || + _global.oRequestAnimationFrame || + _global.msRequestAnimationFrame || + _global.setTimeout; + +function callLifeHook(self, life) { + let hooks = [], + hook; + hook = self[life]; + if (hook) { + hooks = hooks.concat(isArray(hook) ? hook : [hook]); + } + hook = self.options[life]; + if (hook) { + hooks = hooks.concat(isArray(hook) ? hook : [hook]); + } + each(hooks, (i, hook) => { + hook.call(self); + }); +} + +export class Widget extends OB { + _defaultConfig() { + return extend(super._defaultConfig(), { + root: false, + tagName: "div", + attributes: null, + data: null, + key: null, + + tag: null, + disabled: false, + invisible: false, + animation: "", + animationDuring: 0, + invalid: false, + baseCls: "", + extraCls: "", + cls: "", + css: null + + // vdom: false + }); + } + + _constructor() {} + + // 覆盖父类的_constructor方法,widget不走ob的生命周期 + _constructed() { + if (this.setup) { + pushTarget(this); + const delegate = this.setup(this.options); + if (isPlainObject(delegate)) { + // 如果setup返回一个json,即对外暴露的方法 + extend(this, delegate); + } else { + this.render = delegate; + } + popTarget(); + } + } + + _lazyConstructor() { + if (!this.__constructed) { + this.__constructed = true; + this._init(); + this._initRef(); + } + } + + // // 生命周期函数 + // beforeInit = null; + + // beforeRender = null; + + // beforeCreate = null + + // created = null + + // render = null + + // beforeMount = null + + // mounted = null + // // 不想重写mounted时用 + // _mounted = null + + // shouldUpdate = null + + // update = null + + // beforeUpdate = null + + // updated = null + + // beforeDestroy = null + + // destroyed = null + // // 不想重写destroyed时用 + // _destroyed = null + + _init() { + super._init(...arguments); + this._initVisual(); + this._initState(); + this._initRender(); + } + + _initRender() { + let initCallbackCalled = false; + let renderCallbackCalled = false; + + const init = () => { + // 加个保险 + if (initCallbackCalled === true) { + _global.console && + console.error( + "组件: 请检查beforeInit内部的写法,callback只能执行一次" + ); + + return; + } + initCallbackCalled = true; + + const render = () => { + // 加个保险 + if (renderCallbackCalled === true) { + _global.console && + console.error( + "组件: 请检查beforeRender内部的写法,callback只能执行一次" + ); + + return; + } + renderCallbackCalled = true; + this._render(); + this.__afterRender(); + }; + + if (this.options.beforeRender || this.beforeRender) { + this.__async = true; + const beforeRenderResult = ( + this.options.beforeRender || this.beforeRender + ).call(this, render); + if (beforeRenderResult instanceof Promise) { + beforeRenderResult.then(render).catch((e) => { + _global.console && console.error(e); + render(); + }); + } + } else { + this._render(); + this.__afterRender(); + } + }; + + if (this.options.beforeInit || this.beforeInit) { + this.__asking = true; + const beforeInitResult = ( + this.options.beforeInit || this.beforeInit + ).call(this, init); + if (beforeInitResult instanceof Promise) { + beforeInitResult.then(init).catch((e) => { + _global.console && console.error(e); + init(); + }); + } + } else { + init(); + } + } + + __afterRender() { + pushTarget(this); + const async = this.__async; + this.__async = false; + if (async && this._isMounted) { + callLifeHook(this, "beforeMount"); + this._mount(); + callLifeHook(this, "mounted"); + this.fireEvent(Events.MOUNT); + } else { + this._mount(); + } + popTarget(); + } + + _render() { + this.__asking = false; + pushTarget(this); + callLifeHook(this, "beforeCreate"); + this._initElement(); + this._initEffects(); + callLifeHook(this, "created"); + popTarget(); + } + + _initCurrent() { + const o = this.options; + this._initElementWidth(); + this._initElementHeight(); + if (o._baseCls || o.baseCls || o.extraCls) { + this.element.addClass( + `${o._baseCls || ""} ${o.baseCls || ""} ${o.extraCls || ""}` + ); + } + if (o.cls) { + if (isFunction(o.cls)) { + let cls = this.__watch(o.cls, (context, newValue) => { + this.element.removeClass(cls).addClass((cls = newValue)); + }); + this.element.addClass(cls); + } else { + this.element.addClass(o.cls); + } + } + // if (o.key != null) { + // this.element.attr("key", o.key); + // } + if (o.attributes) { + this.element.attr(o.attributes); + } + if (o.data) { + this.element.data(o.data); + } + if (o.css) { + if (isFunction(o.css)) { + let css = this.__watch(o.css, (context, newValue) => { + for (const k in css) { + if (isNull(newValue[k])) { + newValue[k] = ""; + } + } + this.element.css((css = newValue)); + }); + this.element.css(css); + } else { + this.element.css(o.css); + } + } + } + + __watch(getter, handler, options) { + if (_global.Fix) { + this._watchers = this._watchers || []; + const watcher = new Fix.Watcher( + null, + () => getter.call(this, this), + (handler && + ((v) => { + handler.call(this, this, v); + })) || + emptyFn, + extend({ deep: true }, options) + ); + this._watchers.push(() => { + watcher.teardown(); + }); + + return watcher.value; + } else { + return getter(); + } + } + + /** + * 初始化根节点 + * @private + */ + _initRoot() { + const o = this.options; + this.widgetName = o.widgetName || uniqueId("widget"); + this._isRoot = o.root; + this._children = {}; + if (isWidget(o.element)) { + this.element = this.options.element.element; + this._parent = o.element; + this._parent._children && + this._parent.addWidget(this.widgetName, this); + } else if (o.element) { + this.element = Widget._renderEngine.createElement(this); + this._isRoot = true; + } else { + this.element = Widget._renderEngine.createElement(this); + } + this.element._isWidget = true; + // const widgets = this.element.data("__widgets") || []; + // widgets.push(this); + // this.element.data("__widgets", widgets); + this._initCurrent(); + } + + _initElementWidth() { + const o = this.options; + if (isWidthOrHeight(o.width)) { + this.element.css("width", pixFormat(o.width)); + } + } + + _initElementHeight() { + const o = this.options; + if (isWidthOrHeight(o.height)) { + this.element.css("height", pixFormat(o.height)); + } + } + + _initVisual() { + const o = this.options; + if (o.invisible) { + const invisible = (o.invisible = isFunction(o.invisible) + ? this.__watch(o.invisible, (context, newValue) => { + this.setVisible(!newValue); + }) + : o.invisible); + if (invisible) { + // 用display属性做显示和隐藏,否则jquery会在显示时将display设为block会覆盖掉display:flex属性 + this.__setElementVisible(false); + } + } + } + + _initEffects() { + const o = this.options; + if (o.disabled || o.invalid) { + if (this.options.disabled) { + const disabled = (o.disabled = isFunction(o.disabled) + ? this.__watch(o.disabled, (context, newValue) => { + this.setEnable(!newValue); + }) + : o.disabled); + if (disabled) { + this.setEnable(false); + } + } + if (this.options.invalid) { + const invalid = (o.invalid = isFunction(o.invalid) + ? this.__watch(o.invalid, (context, newValue) => { + this.setValid(!newValue); + }) + : o.invalid); + if (invalid) { + this.setValid(false); + } + } + } + if (o.effect) { + if (isArray(o.effect)) { + if (isArray(o.effect[0])) { + each(o.effect, (i, effect) => { + this.__watch(effect[0], effect[1]); + }); + } else { + this.__watch(o.effect[0], o.effect[1]); + } + } else { + this.__watch(o.effect); + } + } + } + + _initState() { + this._isMounted = false; + this._isDestroyed = false; + } + + __initWatch() { + // initWatch拦截的方法 + } + + _initElement() { + this.__isMounting = true; + // 当开启worker模式时,可以通过$render来实现另一种效果 + const workerMode = + Providers.getProvider(SystemProvider.xtype).getWorkerMode(); + const render = isFunction(this.options.render) + ? this.options.render + : workerMode + ? this.$render || this.render + : this.render; + let els = render && render.call(this); + els = this.options.configRender + ? this.options.configRender.call(this, els) + : els; + els = Plugin.getRender(this.options.type, els); + if (isPlainObject(els)) { + els = [els]; + } + this.__initWatch(); + if (isArray(els)) { + each(els, (i, el) => { + if (el) { + _lazyCreateWidget(el, { + element: this + }); + } + }); + } + } + + _setParent(parent) { + this._parent = parent; + } + + /** + * + * @param force 是否强制挂载子节点 + * @param deep 子节点是否也是按照当前force处理 + * @param lifeHook 生命周期钩子触不触发,默认触发 + * @param predicate 递归每个widget的回调 + * @param layer 组件层级 + * @returns {boolean} + * @private + */ + _mount(force, deep, lifeHook, predicate, layer) { + if ( + !force && + (this._isMounted || + !this.isVisible() || + this.__asking === true || + !( + this._isRoot === true || + (this._parent && this._parent._isMounted === true) + )) + ) { + return false; + } + layer = layer || 0; + lifeHook !== false && + !this.__async && + callLifeHook(this, "beforeMount"); + this._isMounted = true; + this.__isMounting = false; + for (const key in this._children) { + const child = this._children[key]; + child._mount && + child._mount( + deep ? force : false, + deep, + lifeHook, + predicate, + layer + 1 + ); + } + if (this._parent) { + if (!this._parent.isEnabled()) { + this._setEnable(false); + } + if (!this._parent.isValid()) { + this._setValid(false); + } + } + this._mountChildren && this._mountChildren(); + if (layer === 0) { + // mounted里面会执行scrollTo之类的方法,如果放宏任务里会闪 + // setTimeout(function () { + this.__afterMount(lifeHook, predicate); + // }, 0); + } + + return true; + } + + __afterMount(lifeHook, predicate) { + if (this._isMounted) { + for (const key in this._children) { + const child = this._children[key]; + child.__afterMount && child.__afterMount(lifeHook, predicate); + } + if (lifeHook !== false && !this.__async) { + callLifeHook(this, "_mounted"); + callLifeHook(this, "mounted"); + this.fireEvent(Events.MOUNT); + } + predicate && predicate(this); + } + } + + // _mountChildren = null; + + _update(nextProps, shouldUpdate) { + callLifeHook(this, "beforeUpdate"); + let res; + if (shouldUpdate) { + res = this.update && this.update(nextProps, shouldUpdate); + } + callLifeHook(this, "updated"); + + return res; + } + + isMounted() { + return this._isMounted; + } + + isDestroyed() { + return this._isDestroyed; + } + + setWidth(w) { + this.options.width = w; + this._initElementWidth(); + } + + setHeight(h) { + this.options.height = h; + this._initElementHeight(); + } + + _setEnable(enable) { + if (enable === true) { + this.options._disabled = false; + } else if (enable === false) { + this.options._disabled = true; + } + // 递归将所有子组件使能 + each(this._children, (i, child) => { + !child._manualSetEnable && + child._setEnable && + child._setEnable(enable); + }); + } + + _setValid(valid) { + if (valid === true) { + this.options._invalid = false; + } else if (valid === false) { + this.options._invalid = true; + } + // 递归将所有子组件使有效 + each(this._children, (i, child) => { + !child._manualSetValid && child._setValid && child._setValid(valid); + }); + } + + _setVisible(visible) { + if (visible === true) { + this.options.invisible = false; + } else if (visible === false) { + this.options.invisible = true; + } + } + + setEnable(enable) { + this._manualSetEnable = true; + this.options.disabled = !enable; + this._setEnable(enable); + if (enable === true) { + this.element.removeClass("base-disabled disabled"); + } else if (enable === false) { + this.element.addClass("base-disabled disabled"); + } + } + + __setElementVisible(visible) { + this.element.css("display", visible ? "" : "none"); + } + + _innerSetVisible(visible) { + const o = this.options; + const lastVisible = !o.invisible; + this._setVisible(visible); + if (visible === true) { + // 用this.element.show()会把display属性改成block + this.__setElementVisible(true); + this._mount(); + if (o.animation && !lastVisible) { + this.element + .removeClass(`${o.animation}-leave`) + .removeClass(`${o.animation}-leave-active`) + .addClass(`${o.animation}-enter`); + if (this._requestAnimationFrame) { + cancelAnimationFrame(this._requestAnimationFrame); + } + this._requestAnimationFrame = () => { + this.element.addClass(`${o.animation}-enter-active`); + }; + requestAnimationFrame(this._requestAnimationFrame); + if (this._animationDuring) { + clearTimeout(this._animationDuring); + } + this._animationDuring = setTimeout(() => { + this.element + .removeClass(`${o.animation}-enter`) + .removeClass(`${o.animation}-enter-active`); + }, o.animationDuring); + } + } else if (visible === false) { + if (o.animation && lastVisible) { + this.element + .removeClass(`${o.animation}-enter`) + .removeClass(`${o.animation}-enter-active`) + .addClass(`${o.animation}-leave`); + if (this._requestAnimationFrame) { + cancelAnimationFrame(this._requestAnimationFrame); + } + this._requestAnimationFrame = () => { + this.element.addClass(`${o.animation}-leave-active`); + }; + requestAnimationFrame(this._requestAnimationFrame); + if (this._animationDuring) { + clearTimeout(this._animationDuring); + } + this._animationDuring = setTimeout(() => { + this.element + .removeClass(`${o.animation}-leave`) + .removeClass(`${o.animation}-leave-active`); + this.__setElementVisible(false); + }, o.animationDuring); + } else { + this.__setElementVisible(false); + } + } + } + + setVisible(visible) { + this._innerSetVisible(visible); + this.fireEvent(Events.VIEW, visible); + } + + setValid(valid) { + this._manualSetValid = true; + this.options.invalid = !valid; + this._setValid(valid); + if (valid === true) { + this.element.removeClass("base-invalid invalid"); + } else if (valid === false) { + this.element.addClass("base-invalid invalid"); + } + } + + doBehavior() { + const args = arguments; + // 递归将所有子组件使有效 + each(this._children, (i, child) => { + child.doBehavior && child.doBehavior(...args); + }); + } + + getWidth() { + return this.options.width; + } + + getHeight() { + return this.options.height; + } + + addWidget(name, widget) { + const self = this; + if (name instanceof Widget) { + widget = name; + name = widget.getName(); + } + if (isKey(name)) { + name = `${name}`; + } + name = name || widget.getName() || uniqueId("widget"); + if (this._children[name]) { + throw new Error("组件:组件名已存在,不能进行添加"); + } + widget._setParent && widget._setParent(this); + widget.on(Events.DESTROY, function () { + // TODO: self待删 + remove(self._children, this); + }); + + return (this._children[name] = widget); + } + + getWidgetByName(name) { + if (!isKey(name) || name === this.getName()) { + return this; + } + name = `${name}`; + let widget = void 0; + const other = {}; + any(this._children, (i, wi) => { + if (i === name) { + widget = wi; + + return true; + } + other[i] = wi; + }); + if (!widget) { + any(other, (i, wi) => (widget = wi.getWidgetByName(i))); + } + + return widget; + } + + removeWidget(nameOrWidget) { + if (isWidget(nameOrWidget)) { + remove(this._children, nameOrWidget); + } else { + delete this._children[nameOrWidget]; + } + } + + hasWidget(name) { + return isNotNull(this._children[name]); + } + + getName() { + return this.widgetName; + } + + setTag(tag) { + this.options.tag = tag; + } + + getTag() { + return this.options.tag; + } + + attr(key, value) { + if (isPlainObject(key)) { + each(key, (k, v) => this.attr(k, v)); + + return; + } + if (isNotNull(value)) { + this.options[key] = value; + } + + return this.options[key]; + } + + css(name, value) { + return this.element.css(name, value); + } + + getText() {} + + setText(text) {} + + getValue() {} + + setValue(value) {} + + isEnabled() { + return this.options.disabled === true ? false : !this.options._disabled; + } + + isValid() { + return this.options.invalid === true ? false : !this.options._invalid; + } + + isVisible() { + return !this.options.invisible; + } + + disable() { + this.setEnable(false); + } + + enable() { + this.setEnable(true); + } + + valid() { + this.setValid(true); + } + + invalid() { + this.setValid(false); + } + + invisible() { + this.setVisible(false); + } + + visible() { + this.setVisible(true); + } + + __d() { + each(this._children, (i, widget) => { + widget && widget._unMount && widget._unMount(); + }); + this._children = {}; + } + + // 主要是因为_destroy已经提供了protected方法 + __destroy() { + callLifeHook(this, "beforeDestroy"); + this.beforeDestroy = null; + this.__d(); + this._parent = null; + this._isMounted = false; + callLifeHook(this, "_destroyed"); + callLifeHook(this, "destroyed"); + this.destroyed = null; + this._isDestroyed = true; + // this._purgeRef(); // 清除ref的时机还是要仔细考虑一下 + } + + _unMount() { + this._assetMounted(); + this.__destroy(); + this.fireEvent(Events.UNMOUNT); + this.purgeListeners(); + } + + _assetMounted() { + if (!this.isVisible()) { + this._setVisible(true); + this._mount(false, false, false); + this._setVisible(false); + } + } + + _empty() { + this._assetMounted(); + each(this._children, (i, widget) => { + widget && widget._unMount && widget._unMount(); + }); + this._children = {}; + this.element.empty(); + } + + isolate() { + if (this._parent) { + this._parent.removeWidget(this); + } + DOM.hang([this]); + } + + empty() { + this._empty(); + } + + // 默认的reset方法就是干掉重来 + reset() { + // 还在异步状态的不需要执行reset + if (this.__async === true || this.__asking === true) { + return; + } + // if (this.options.vdom) { + // const vnode = this._renderVNode(); + // patchVNode(this.vnode, vnode); + // this.vnode = vnode; + // return; + // } + // this._isMounted = false; + // this.purgeListeners(); + + // 去掉组件绑定的watcher + each(this._watchers, (i, unwatches) => { + unwatches = isArray(unwatches) ? unwatches : [unwatches]; + each(unwatches, (j, unwatch) => { + unwatch(); + }); + }); + this._watchers && (this._watchers = []); + this._assetMounted(); + this.__d(); + this.element.empty(); + this.element.unbind(); + this._initCurrent(); + this._init(); + // this._initRef(); + } + + _destroy() { + this._assetMounted(); + this.__destroy(); + this.element.destroy(); + this.purgeListeners(); + } + + destroy() { + const o = this.options; + this._assetMounted(); + this.__destroy(); + if (o.animation) { + this._innerSetVisible(false); + setTimeout(() => this.element.destroy(), o.animationDuring); + } else { + this.element.destroy(); + } + this.fireEvent(Events.UNMOUNT); + this.fireEvent(Events.DESTROY); + this._purgeRef(); + this.purgeListeners(); + } +} + +let context = null, + current = null; +const contextStack = [], + currentStack = []; + +Widget.pushContext = function (_context) { + if (context) contextStack.push(context); + Widget.context = context = _context; +}; + +Widget.popContext = function () { + Widget.context = context = contextStack.pop(); +}; + +Widget.execWithContext = function (context, execFunc) { + Widget.pushContext(context); + try { + execFunc(); + } catch (e) { + throw e; + } finally { + Widget.popContext(); + } +}; + +function pushTarget(_current) { + if (current) currentStack.push(current); + Widget.current = current = _current; +} + +function popTarget() { + Widget.current = current = currentStack.pop(); +} + +export function useStore(_store) { + if (current && current.store) { + return current.store; + } + if (current && current.$storeDelegate) { + return current.$storeDelegate; + } + if (current) { + const currentStore = current._store; + const delegate = {}; + let origin; + if (_global.Proxy) { + const proxy = new Proxy(delegate, { + get(target, key) { + return Reflect.get(origin, key); + }, + set(target, key, value) { + return Reflect.set(origin, key, value); + } + }); + current._store = function () { + origin = (_store || currentStore).apply(this, arguments); + delegate.$delegate = origin; + + return origin; + }; + current.$storeDelegate = proxy; + + return current.$storeDelegate; + } + current._store = function () { + const st = (_store || currentStore).apply(this, arguments); + extend(delegate, st); + + return st; + }; + current.$storeDelegate = delegate; + + return current.$storeDelegate; + } +} + +export function useContext(inject) { + // 通过组件找最近的store + let vm = Widget.findStore(Widget.current || Widget.context); + if (vm) { + if (inject) { + if (vm.$$computed && inject in vm.$$computed) { + return vm; + } + if (vm.$$state && inject in vm.$$state) { + return vm; + } + if (vm.$$model && inject in vm.$$model) { + return vm; + } + while (vm) { + if (vm.$$context && inject in vm.$$context) { + return vm; + } + vm = vm._parent; + } + + return null; + } + } + + return vm; +} + +export function watch(vm, watch, handler) { + // 必须要保证组件当前环境存在 + if (Widget.current) { + if (vm instanceof BI.Model) { + const watchers = []; + if (isKey(watch)) { + const k = watch; + watch = {}; + watch[k] = handler; + } + for (const key in watch) { + const innerHandler = watch[key]; + if (isArray(handler)) { + for (let i = 0; i < handler.length; i++) { + watchers.push( + Fix.watch(vm.model, key, innerHandler, { + store: vm + }) + ); + } + } else { + watchers.push( + Fix.watch(vm.model, key, innerHandler, { + store: vm + }) + ); + } + } + // vm中一定有_widget + Widget.current._watchers || (Widget.current._watchers = []); + Widget.current._watchers = + Widget.current._watchers.concat(watchers); + + return; + } + handler = watch; + watch = vm; + Widget.current.$watchDelayCallbacks || + (Widget.current.$watchDelayCallbacks = []); + Widget.current.$watchDelayCallbacks.push([watch, handler]); + } +} + +export function onBeforeMount(beforeMount) { + if (current) { + if (current.__isMounting) { + beforeMount(); + + return; + } + if (!current.beforeMount) { + current.beforeMount = []; + } else if (!isArray(current.beforeMount)) { + current.beforeMount = [current.beforeMount]; + } + current.beforeMount.push(beforeMount); + } +} + +export function onMounted(mounted) { + if (current) { + if (current._isMounted && !this.__async) { + mounted(); + + return; + } + if (!current.mounted) { + current.mounted = []; + } else if (!isArray(current.mounted)) { + current.mounted = [current.mounted]; + } + current.mounted.push(mounted); + } +} + +export function onBeforeUnmount(beforeDestroy) { + if (current) { + if (!current.beforeDestroy) { + current.beforeDestroy = []; + } else if (!isArray(current.beforeDestroy)) { + current.beforeDestroy = [current.beforeDestroy]; + } + current.beforeDestroy.push(beforeDestroy); + } +} + +export function onUnmounted(destroyed) { + if (current) { + if (!current.destroyed) { + current.destroyed = []; + } else if (!isArray(current.destroyed)) { + current.destroyed = [current.destroyed]; + } + current.destroyed.push(destroyed); + } +} + +Widget.registerRenderEngine = function (engine) { + Widget._renderEngine = engine; +}; +Widget.registerRenderEngine({ + createElement(widget) { + if (isWidget(widget)) { + const o = widget.options; + if (o.element) { + return $(o.element); + } + if (o.tagName) { + return $(document.createElement(o.tagName)); + } + + return $(document.createDocumentFragment()); + } + + return $(widget); + }, + createFragment() { + return document.createDocumentFragment(); + } +}); + +export function mount(widget, container, predicate, hydrate) { + if (hydrate === true) { + // 将widget的element元素都挂载好,并建立相互关系 + widget.element.data("__widgets", [widget]); + const res = widget._mount(true, false, false, function (w) { + each(w._children, (i, child) => { + let ws = child.element.data("__widgets"); + if (!ws) { + ws = []; + } + ws.push(child); + child.element.data("__widgets", ws); + }); + predicate && predicate.apply(this, arguments); + }); + // 将新的dom树属性(事件等)patch到已存在的dom上 + const c = Widget._renderEngine.createElement; + DOM.patchProps(widget.element, c(c(container).children()[0])); + + const triggerLifeHook = (w) => { + w.beforeMount && w.beforeMount(); + w.mounted && w.mounted(); + each(w._children, (i, child) => { + triggerLifeHook(child); + }); + }; + // 最后触发组件树生命周期函数 + triggerLifeHook(widget); + + return res; + } + if (container) { + Widget._renderEngine.createElement(container).append(widget.element); + } + + return widget._mount(true, false, false, predicate); +} diff --git a/packages/fineui/src/core/5.inject.js b/packages/fineui/src/core/5.inject.js new file mode 100644 index 000000000..282ba270c --- /dev/null +++ b/packages/fineui/src/core/5.inject.js @@ -0,0 +1,528 @@ +import { isFunction, isNull, isNotNull, isArray, each, isWidget, extend, init, isEmpty, remove } from "./2.base"; +import { OB } from "./3.ob"; +import { Widget } from "./4.widget"; +import { Plugin } from "./6.plugin"; +import { aspect } from "./structure"; +import { Events } from "./constant"; +import { _global } from "./0.foundation"; +import { SystemProvider } from "./system"; + +const moduleInjection = {}, moduleInjectionMap = { + components: {}, + constants: {}, + stores: {}, + services: {}, + models: {}, + providers: {}, +}; + +export function module(xtype, cls) { + if (isNotNull(moduleInjection[xtype])) { + _global.console && console.error(`module: [${xtype}] 已经注册过了`); + } else { + if (isFunction(cls)) { + cls = cls(); + } + for (const k in moduleInjectionMap) { + if (cls[k]) { + for (const key in cls[k]) { + if (!moduleInjectionMap[k]) { + continue; + } + if (!moduleInjectionMap[k][key]) { + moduleInjectionMap[k][key] = []; + } + moduleInjectionMap[k][key].push({ + version: cls[k][key], + moduleId: xtype, + }); + } + } + } + moduleInjection[xtype] = cls; + } + + return () => Modules.getModule(xtype); +} + +const constantInjection = {}; +export function constant(xtype, cls) { + if (isNotNull(constantInjection[xtype])) { + _global.console && console.error(`constant: [${xtype}]已经注册过了`); + } else { + constantInjection[xtype] = cls; + } + + return () => Constants.getConstant(xtype); +} + +const modelInjection = {}; +export function model(xtype, cls) { + if (isNotNull(modelInjection[xtype])) { + _global.console && console.error(`model: [${xtype}] 已经注册过了`); + } else { + modelInjection[xtype] = cls; + } + + return config => Models.getModel(xtype, config); +} + +const storeInjection = {}; +export function store(xtype, cls) { + if (isNotNull(storeInjection[xtype])) { + _global.console && console.error(`store: [${xtype}] 已经注册过了`); + } else { + storeInjection[xtype] = cls; + } + + return config => Stores.getStore(xtype, config); +} + +const serviceInjection = {}; +export function service(xtype, cls) { + if ((serviceInjection[xtype])) { + _global.console && console.error(`service: [${xtype}] 已经注册过了`); + } + + serviceInjection[xtype] = cls; + + return config => Services.getService(xtype, config); +} + +const providerInjection = {}; +export function provider(xtype, cls) { + if ((providerInjection[xtype])) { + _global.console && console.error(`provider: [${xtype}] 已经注册过了`); + } else { + providerInjection[xtype] = cls; + } + + return config => Providers.getProvider(xtype, config); +} + +const configFunctions = OB.configFunctions = {}; +const runConfigFunction = (type, configFn) => { + if (!type || !configFunctions[type]) { + return false; + } + + let queue = []; + if (configFn) { + queue = configFunctions[type].filter(conf => conf.fn === configFn); + configFunctions[type] = configFunctions[type].filter(conf => conf.fn !== configFn); + } else { + queue = configFunctions[type]; + delete configFunctions[type]; + } + + const dependencies = Providers.getProvider(SystemProvider.xtype).getDependencies(); + const modules = moduleInjectionMap.components[type] + || moduleInjectionMap.constants[type] + || moduleInjectionMap.services[type] + || moduleInjectionMap.stores[type] + || moduleInjectionMap.models[type] + || moduleInjectionMap.providers[type]; + for (let i = 0; i < queue.length; i++) { + const conf = queue[i]; + const version = conf.opt.version; + const fn = conf.fn; + if (modules && version) { + let findVersion = false; + let module; + for (let j = 0; j < modules.length; j++) { + module = modules[j]; + if (module && dependencies[module.moduleId] && module.version === version) { + const minVersion = dependencies[module.moduleId].minVersion, + maxVersion = dependencies[module.moduleId].maxVersion; + if (minVersion && (moduleInjection[module.moduleId].version || version) < minVersion) { + findVersion = true; + break; + } + if (maxVersion && (moduleInjection[module.moduleId].version || version) > maxVersion) { + findVersion = true; + break; + } + } + } + if (findVersion === true) { + _global.console && console.error(`moduleId: [${module.moduleId}] 接口: [${type}] 接口版本: [${version}] 已过期,版本要求为:`, dependencies[module.moduleId], "=>", moduleInjection[module.moduleId]); + continue; + } + } + if (constantInjection[type]) { + constantInjection[type] = fn(constantInjection[type]); + continue; + } + if (providerInjection[type]) { + if (!providers[type]) { + providers[type] = new providerInjection[type](); + } + if (providerInstance[type]) { + delete providerInstance[type]; + } + fn(providers[type]); + continue; + } + Plugin.configWidget(type, fn, conf.opt); + } +}; + +export function config(type, configFn, opt) { + if (isFunction(type)) { + opt = configFn; + configFn = type; + type = SystemProvider.xtype; + } + opt = opt || {}; + + // 系统配置直接执行 + if (SystemProvider.xtype === type) { + if (!providers[type]) { + providers[type] = new providerInjection[type](); + } + // 如果config被重新配置的话,需要删除掉之前的实例 + if (providerInstance[type]) { + delete providerInstance[type]; + } + + return configFn(providers[type]); + } + + if (!configFunctions[type]) { + configFunctions[type] = []; + } + configFunctions[type].push({ + fn: configFn, + opt, + }); + + if (opt.immediately) { + return runConfigFunction(type, configFn); + } +} + +export function getReference(type, fn) { + return Plugin.registerObject(type, fn); +} + +const actions = {}; +const globalAction = []; +export function action(type, actionFn) { + if (isFunction(type)) { + globalAction.push(type); + + return () => { + remove(globalAction, idx => globalAction.indexOf(actionFn) === idx); + }; + } + if (!actions[type]) { + actions[type] = []; + } + actions[type].push(actionFn); + + return () => { + remove(actions[type], idx => actions[type].indexOf(actionFn) === idx); + if (actions[type].length === 0) { + delete actions[type]; + } + }; +} + +const points = {}; +export function point(type, action, pointFn, after) { + if (!points[type]) { + points[type] = {}; + } + if (!points[type][action]) { + points[type][action] = {}; + } + if (!points[type][action][after ? "after" : "before"]) { + points[type][action][after ? "after" : "before"] = []; + } + points[type][action][after ? "after" : "before"].push(pointFn); +} + +export const Modules = { + getModule (type) { + if (!moduleInjection[type]) { + _global.console && console.error(`module: [${type}] 未定义`); + } + + return moduleInjection[type]; + }, + getAllModules () { + return moduleInjection; + }, +}; + +export const Constants = { + getConstant (type) { + if (isNull(constantInjection[type])) { + _global.console && console.error(`constant: [${type}] 未定义`); + } + runConfigFunction(type); + + return isFunction(constantInjection[type]) ? constantInjection[type]() : constantInjection[type]; + }, +}; + +function callPoint(inst, types) { + types = isArray(types) ? types : [types]; + each(types, (idx, type) => { + if (points[type]) { + for (const action in points[type]) { + const bfns = points[type][action].before; + if (bfns) { + aspect.before(inst, action, (function (bfns) { + return function () { + for (let i = 0, len = bfns.length; i < len; i++) { + try { + bfns[i].apply(inst, arguments); + } catch (e) { + _global.console && console.error(e); + } + } + }; + }(bfns))); + } + const afns = points[type][action].after; + if (afns) { + aspect.after(inst, action, (function (afns) { + return function () { + for (let i = 0, len = afns.length; i < len; i++) { + try { + afns[i].apply(inst, arguments); + } catch (e) { + _global.console && console.error(e); + } + } + }; + }(afns))); + } + } + } + }); +} + +export const Models = { + getModel (type, config) { + if (!modelInjection[type]) { + _global.console && console.error(`model: [${type}] 未定义`); + } + runConfigFunction(type); + const inst = new modelInjection[type](config); + inst._constructor && inst._constructor(config); + inst.mixins && callPoint(inst, inst.mixins); + callPoint(inst, type); + + return inst; + }, +}; + +const stores = {}; +export const Stores = { + getStore (type, config) { + if (!storeInjection[type]) { + _global.console && console.error(`store: [${type}] 未定义`); + } + if (stores[type]) { + return stores[type]; + } + const inst = stores[type] = new storeInjection[type](config); + inst._constructor && inst._constructor(config, () => { + delete stores[type]; + }); + callPoint(inst, type); + + return inst; + }, +}; + +const services = {}; +export const Services = { + getService: (type, config) => { + if (!serviceInjection[type]) { + _global.console && console.error(`service: [${type}] 未定义`); + } + if (services[type]) { + return services[type]; + } + services[type] = new serviceInjection[type](config); + callPoint(services[type], type); + + return services[type]; + }, +}; + +const providers = {}, + providerInstance = {}; +export const Providers = { + getProvider: (type, config) => { + if (!providerInjection[type]) { + _global.console && console.error(`provider: [${type}] 未定义`); + } + runConfigFunction(type); + if (!providers[type]) { + providers[type] = new providerInjection[type](); + } + if (!providerInstance[type] && providers[type].$get) { + providerInstance[type] = new (providers[type].$get())(config); + } + + return providerInstance[type]; + }, +}; + +export const Actions = { + runAction (type, event, config) { + each(actions[type], (i, act) => { + try { + act(event, config); + } catch (e) { + _global.console && console.error(e); + } + }); + }, + runGlobalAction () { + const args = [].slice.call(arguments); + each(globalAction, (i, act) => { + try { + act(...args); + } catch (e) { + _global.console && console.error(e); + } + }); + }, +}; + +const kv = {}; +export function shortcut(xtype, cls) { + if (isNotNull(kv[xtype])) { + _global.console && console.error(`组件: [${xtype}] 已经注册过了`); + } + if (cls) { + cls.xtype = xtype; + } + kv[xtype] = cls; +} + +export const component = shortcut; + +// 根据配置属性生成widget +const createRealWidget = (config, context, lazy) => { + const Cls = isFunction(config.type) ? config.type : kv[config.type]; + + if (!Cls) { + throw new Error(`组件: [${config.type}] 未定义`); + } + let pushed = false; + const widget = new Cls(); + widget._context = Widget.context || context; + if (!Widget.context && context) { + pushed = true; + Widget.pushContext(context); + } + callPoint(widget, config.type); + widget._initProps(config); + widget._initRoot(); + widget._constructed(); + // if (!lazy || config.element || config.root) { + widget._lazyConstructor(); + // } + pushed && Widget.popContext(); + + return widget; +}; + +export function createWidget(item, options, context, lazy) { + item || (item = {}); + if (isWidget(options)) { + context = options; + options = {}; + } else { + options || (options = {}); + } + + let el, w; + if (item.type || options.type) { + el = extend({}, options, item); + } else if (item.el && (item.el.type || options.type)) { + el = extend({}, options, item.el); + } + let elType; + if (el) { + elType = (el.type && el.type.xtype) || el.type; + runConfigFunction(elType); + } + + // 先把准备环境准备好 + init(); + + if (isEmpty(item) && isEmpty(options)) { + return createWidget({ + type: "bi.layout", + }); + } + if (isWidget(item)) { + return item; + } + if (el) { + w = Plugin.getWidget(elType, el); + const wType = (w.type && w.type.xtype) || w.type; + if (wType === elType) { + if (Plugin.hasObject(elType)) { + if (!w.listeners || isArray(w.listeners)) { + w.listeners = (w.listeners || []).concat([{ + eventName: Events.MOUNT, + action: () => { + Plugin.getObject(elType, this); + }, + }]); + } else { + w.listeners[Events.MOUNT] = [ + () => { + Plugin.getObject(elType, this); + } + ].concat(w.listeners[Events.MOUNT] || []); + } + } + + return createRealWidget(w, context, lazy); + } + + return createWidget(w, options, context, lazy); + } + if (isWidget(item.el)) { + return item.el; + } + throw new Error("组件:无法根据item创建组件", item); +} + +export function _lazyCreateWidget (item, options, context) { + return createWidget(item, options, context, true); +} + +export function createElement() { + const widget = createWidget.apply(this, arguments); + + return widget.element; +} + +export function getResource(type, config) { + if (isNotNull(constantInjection[type])) { + return Constants.getConstant(type); + } + if (modelInjection[type]) { + return Models.getModel(type, config); + } + if (storeInjection[type]) { + return Stores.getStore(type, config); + } + if (serviceInjection[type]) { + return Services.getService(type, config); + } + if (providerInjection[type]) { + return Providers.getProvider(type, config); + } + throw new Error(`未知类型: [${type}] 未定义`); +} diff --git a/src/core/6.plugin.js b/packages/fineui/src/core/6.plugin.js similarity index 100% rename from src/core/6.plugin.js rename to packages/fineui/src/core/6.plugin.js diff --git a/src/core/__test__/alias.test.js b/packages/fineui/src/core/__test__/alias.test.js similarity index 100% rename from src/core/__test__/alias.test.js rename to packages/fineui/src/core/__test__/alias.test.js diff --git a/src/core/__test__/base.test.js b/packages/fineui/src/core/__test__/base.test.js similarity index 100% rename from src/core/__test__/base.test.js rename to packages/fineui/src/core/__test__/base.test.js diff --git a/src/core/__test__/context.test.js b/packages/fineui/src/core/__test__/context.test.js similarity index 100% rename from src/core/__test__/context.test.js rename to packages/fineui/src/core/__test__/context.test.js diff --git a/src/core/__test__/widget.test.js b/packages/fineui/src/core/__test__/widget.test.js similarity index 100% rename from src/core/__test__/widget.test.js rename to packages/fineui/src/core/__test__/widget.test.js diff --git a/src/core/action/action.js b/packages/fineui/src/core/action/action.js similarity index 100% rename from src/core/action/action.js rename to packages/fineui/src/core/action/action.js diff --git a/src/core/action/action.show.js b/packages/fineui/src/core/action/action.show.js similarity index 100% rename from src/core/action/action.show.js rename to packages/fineui/src/core/action/action.show.js diff --git a/src/core/action/index.js b/packages/fineui/src/core/action/index.js similarity index 100% rename from src/core/action/index.js rename to packages/fineui/src/core/action/index.js diff --git a/src/core/behavior/0.behavior.js b/packages/fineui/src/core/behavior/0.behavior.js similarity index 100% rename from src/core/behavior/0.behavior.js rename to packages/fineui/src/core/behavior/0.behavior.js diff --git a/src/core/behavior/behavior.highlight.js b/packages/fineui/src/core/behavior/behavior.highlight.js similarity index 100% rename from src/core/behavior/behavior.highlight.js rename to packages/fineui/src/core/behavior/behavior.highlight.js diff --git a/src/core/behavior/behavior.redmark.js b/packages/fineui/src/core/behavior/behavior.redmark.js similarity index 100% rename from src/core/behavior/behavior.redmark.js rename to packages/fineui/src/core/behavior/behavior.redmark.js diff --git a/src/core/behavior/index.js b/packages/fineui/src/core/behavior/index.js similarity index 100% rename from src/core/behavior/index.js rename to packages/fineui/src/core/behavior/index.js diff --git a/src/core/constant/events.js b/packages/fineui/src/core/constant/events.js similarity index 100% rename from src/core/constant/events.js rename to packages/fineui/src/core/constant/events.js diff --git a/src/core/constant/index.js b/packages/fineui/src/core/constant/index.js similarity index 100% rename from src/core/constant/index.js rename to packages/fineui/src/core/constant/index.js diff --git a/src/core/constant/var.js b/packages/fineui/src/core/constant/var.js similarity index 100% rename from src/core/constant/var.js rename to packages/fineui/src/core/constant/var.js diff --git a/src/core/controller/0.controller.js b/packages/fineui/src/core/controller/0.controller.js similarity index 100% rename from src/core/controller/0.controller.js rename to packages/fineui/src/core/controller/0.controller.js diff --git a/src/core/controller/controller.broadcast.js b/packages/fineui/src/core/controller/controller.broadcast.js similarity index 100% rename from src/core/controller/controller.broadcast.js rename to packages/fineui/src/core/controller/controller.broadcast.js diff --git a/src/core/controller/controller.bubbles.js b/packages/fineui/src/core/controller/controller.bubbles.js similarity index 100% rename from src/core/controller/controller.bubbles.js rename to packages/fineui/src/core/controller/controller.bubbles.js diff --git a/src/core/controller/controller.drawer.js b/packages/fineui/src/core/controller/controller.drawer.js similarity index 100% rename from src/core/controller/controller.drawer.js rename to packages/fineui/src/core/controller/controller.drawer.js diff --git a/packages/fineui/src/core/controller/controller.layer.js b/packages/fineui/src/core/controller/controller.layer.js new file mode 100644 index 000000000..7364a3ee2 --- /dev/null +++ b/packages/fineui/src/core/controller/controller.layer.js @@ -0,0 +1,201 @@ +/** + * 弹出层面板控制器, z-index在10w层级 + * + * Created by GUY on 2015/6/24. + */ +import { Controller } from "./0.controller"; +import { isNull, isNotNull, each, keys, isWidget, isNotEmptyString, extend, bind, uniqueId } from "../2.base"; +import { Widget } from "../4.widget"; +import { createWidget } from "../5.inject"; +import { zIndex_layer } from "../constant"; +import { DOM } from "../utils"; +// import { Resizers } from "../../base/0.base"; + +export class LayerController extends Controller { + constructor() { + super(); + this._constructor(); + } + + props = { + render: "body", + } + + init() { + this.layerManager = {}; + this.layouts = {}; + this.zindex = zIndex_layer; + } + + _initResizer() { + // this.resizer = Resizers.add(`layerController${uniqueId()}`, bind(this._resize, this)); + } + + _resize() { + each(this.layouts, (i, layer) => { + if (layer.element.is(":visible")) { + layer.element.trigger("__resize__"); + } + }); + } + + make(name, container, op, context) { + if (isWidget(container)) { + op = op || {}; + op.container = container; + } else { + context = op; + op = container; + } + + return this.create(name, null, op, context); + } + + create(name, from, op, context) { + isNull(this.resizer) && this._initResizer(); + if (this.has(name)) { + return this.get(name); + } + op || (op = {}); + const offset = op.offset || {}; + let w = from; + if (isWidget(from)) { + w = from.element; + } + if (isNotEmptyString(w)) { + w = Widget._renderEngine.createElement(w); + } + if (this.has(name)) { + return this.get(name); + } + const widget = createWidget((op.render || {}), extend({ + type: "bi.layout", + }, op), context); + const layout = createWidget({ + type: "bi.absolute", + invisible: true, + items: [ + { + el: widget, + left: 0, + right: 0, + top: 0, + bottom: 0, + } + ], + }, context); + createWidget({ + type: "bi.absolute", + element: op.container || this.options.render, + items: [ + { + el: layout, + left: offset.left || 0, + right: offset.right || 0, + top: offset.top || 0, + bottom: offset.bottom || 0, + } + ], + }); + if (w) { + layout.element.addClass("bi-popup-view"); + + function getComputedPosition() { + const css = { + left: w.offset().left + (offset.left || 0), + top: w.offset().top + (offset.top || 0), + width: offset.width || (w.outerWidth() - (offset.left || 0) - (offset.right || 0)) || "", + height: offset.height || (w.outerHeight() - (offset.top || 0) - (offset.bottom || 0)) || "", + }; + + const { top, left, scaleY, scaleX } = DOM.getPositionRelativeContainingBlockRect(layout.element[0]); + + css.top = (css.top - top) / scaleY; + css.left = (css.left - left) / scaleX; + + return css; + } + + + layout.element.css(getComputedPosition()); + layout.element.on("__resize__", () => { + w.is(":visible") && + layout.element.css(getComputedPosition()); + }); + } + this.add(name, widget, layout); + + return widget; + } + + show(name, callback) { + if (!this.has(name)) { + return this; + } + this._getLayout(name).visible(); + this._getLayout(name).element.css("z-index", this.zindex++).show(0, callback).trigger("__resize__"); + + return this; + } + + hide(name, callback) { + if (!this.has(name)) { + return this; + } + this._getLayout(name).invisible(); + this._getLayout(name).element.hide(0, callback); + + return this; + } + + isVisible(name) { + return this.has(name) && this._getLayout(name).isVisible(); + } + + add(name, layer, layout) { + if (this.has(name)) { + throw new Error("不能创建同名的Layer"); + } + layout.setVisible(false); + this.layerManager[name] = layer; + this.layouts[name] = layout; + layout.element.css("z-index", this.zindex++); + + return this; + } + + _getLayout(name) { + return this.layouts[name]; + } + + get(name) { + return this.layerManager[name]; + } + + has(name) { + return isNotNull(this.layerManager[name]); + } + + remove(name) { + if (!this.has(name)) { + return this; + } + this.layerManager[name].destroy(); + this.layouts[name].destroy(); + delete this.layerManager[name]; + delete this.layouts[name]; + + return this; + } + + removeAll() { + each(keys(this.layerManager), (index, name) => { + this.layerManager[name].destroy(); + this.layouts[name].destroy(); + }); + this.layerManager = {}; + this.layouts = {}; + + return this; + } +} diff --git a/src/core/controller/controller.masker.js b/packages/fineui/src/core/controller/controller.masker.js similarity index 100% rename from src/core/controller/controller.masker.js rename to packages/fineui/src/core/controller/controller.masker.js diff --git a/src/core/controller/controller.popover.js b/packages/fineui/src/core/controller/controller.popover.js similarity index 100% rename from src/core/controller/controller.popover.js rename to packages/fineui/src/core/controller/controller.popover.js diff --git a/src/core/controller/controller.resizer.js b/packages/fineui/src/core/controller/controller.resizer.js similarity index 100% rename from src/core/controller/controller.resizer.js rename to packages/fineui/src/core/controller/controller.resizer.js diff --git a/src/core/controller/controller.tooltips.js b/packages/fineui/src/core/controller/controller.tooltips.js similarity index 100% rename from src/core/controller/controller.tooltips.js rename to packages/fineui/src/core/controller/controller.tooltips.js diff --git a/src/core/controller/index.js b/packages/fineui/src/core/controller/index.js similarity index 100% rename from src/core/controller/index.js rename to packages/fineui/src/core/controller/index.js diff --git a/src/core/controller/popper.js b/packages/fineui/src/core/controller/popper.js similarity index 100% rename from src/core/controller/popper.js rename to packages/fineui/src/core/controller/popper.js diff --git a/src/core/decorator.js b/packages/fineui/src/core/decorator.js similarity index 100% rename from src/core/decorator.js rename to packages/fineui/src/core/decorator.js diff --git a/src/core/element/element.js b/packages/fineui/src/core/element/element.js similarity index 100% rename from src/core/element/element.js rename to packages/fineui/src/core/element/element.js diff --git a/src/core/element/index.js b/packages/fineui/src/core/element/index.js similarity index 100% rename from src/core/element/index.js rename to packages/fineui/src/core/element/index.js diff --git a/src/core/element/plugins/attr.js b/packages/fineui/src/core/element/plugins/attr.js similarity index 100% rename from src/core/element/plugins/attr.js rename to packages/fineui/src/core/element/plugins/attr.js diff --git a/src/core/element/plugins/class.js b/packages/fineui/src/core/element/plugins/class.js similarity index 100% rename from src/core/element/plugins/class.js rename to packages/fineui/src/core/element/plugins/class.js diff --git a/src/core/element/plugins/css.js b/packages/fineui/src/core/element/plugins/css.js similarity index 100% rename from src/core/element/plugins/css.js rename to packages/fineui/src/core/element/plugins/css.js diff --git a/src/core/element/plugins/data.js b/packages/fineui/src/core/element/plugins/data.js similarity index 100% rename from src/core/element/plugins/data.js rename to packages/fineui/src/core/element/plugins/data.js diff --git a/src/core/element/plugins/empty.js b/packages/fineui/src/core/element/plugins/empty.js similarity index 100% rename from src/core/element/plugins/empty.js rename to packages/fineui/src/core/element/plugins/empty.js diff --git a/src/core/element/plugins/event.js b/packages/fineui/src/core/element/plugins/event.js similarity index 100% rename from src/core/element/plugins/event.js rename to packages/fineui/src/core/element/plugins/event.js diff --git a/src/core/element/plugins/html.js b/packages/fineui/src/core/element/plugins/html.js similarity index 100% rename from src/core/element/plugins/html.js rename to packages/fineui/src/core/element/plugins/html.js diff --git a/src/core/element/plugins/index.js b/packages/fineui/src/core/element/plugins/index.js similarity index 100% rename from src/core/element/plugins/index.js rename to packages/fineui/src/core/element/plugins/index.js diff --git a/src/core/element/plugins/keywordMark.js b/packages/fineui/src/core/element/plugins/keywordMark.js similarity index 100% rename from src/core/element/plugins/keywordMark.js rename to packages/fineui/src/core/element/plugins/keywordMark.js diff --git a/src/core/element/plugins/renderToHtml.js b/packages/fineui/src/core/element/plugins/renderToHtml.js similarity index 100% rename from src/core/element/plugins/renderToHtml.js rename to packages/fineui/src/core/element/plugins/renderToHtml.js diff --git a/src/core/element/plugins/renderToString.js b/packages/fineui/src/core/element/plugins/renderToString.js similarity index 100% rename from src/core/element/plugins/renderToString.js rename to packages/fineui/src/core/element/plugins/renderToString.js diff --git a/src/core/element/plugins/text.js b/packages/fineui/src/core/element/plugins/text.js similarity index 100% rename from src/core/element/plugins/text.js rename to packages/fineui/src/core/element/plugins/text.js diff --git a/src/core/element/plugins/val.js b/packages/fineui/src/core/element/plugins/val.js similarity index 100% rename from src/core/element/plugins/val.js rename to packages/fineui/src/core/element/plugins/val.js diff --git a/src/core/func/__test__/date.test.js b/packages/fineui/src/core/func/__test__/date.test.js similarity index 100% rename from src/core/func/__test__/date.test.js rename to packages/fineui/src/core/func/__test__/date.test.js diff --git a/src/core/func/__test__/function.test.js b/packages/fineui/src/core/func/__test__/function.test.js similarity index 100% rename from src/core/func/__test__/function.test.js rename to packages/fineui/src/core/func/__test__/function.test.js diff --git a/src/core/func/__test__/string.test.js b/packages/fineui/src/core/func/__test__/string.test.js similarity index 100% rename from src/core/func/__test__/string.test.js rename to packages/fineui/src/core/func/__test__/string.test.js diff --git a/src/core/func/alias.js b/packages/fineui/src/core/func/alias.js similarity index 100% rename from src/core/func/alias.js rename to packages/fineui/src/core/func/alias.js diff --git a/src/core/func/array.js b/packages/fineui/src/core/func/array.js similarity index 100% rename from src/core/func/array.js rename to packages/fineui/src/core/func/array.js diff --git a/src/core/func/date.js b/packages/fineui/src/core/func/date.js similarity index 100% rename from src/core/func/date.js rename to packages/fineui/src/core/func/date.js diff --git a/src/core/func/function.js b/packages/fineui/src/core/func/function.js similarity index 100% rename from src/core/func/function.js rename to packages/fineui/src/core/func/function.js diff --git a/src/core/func/index.js b/packages/fineui/src/core/func/index.js similarity index 100% rename from src/core/func/index.js rename to packages/fineui/src/core/func/index.js diff --git a/src/core/func/number.js b/packages/fineui/src/core/func/number.js similarity index 100% rename from src/core/func/number.js rename to packages/fineui/src/core/func/number.js diff --git a/src/core/func/string.js b/packages/fineui/src/core/func/string.js similarity index 100% rename from src/core/func/string.js rename to packages/fineui/src/core/func/string.js diff --git a/src/core/h.js b/packages/fineui/src/core/h.js similarity index 100% rename from src/core/h.js rename to packages/fineui/src/core/h.js diff --git a/packages/fineui/src/core/index.js b/packages/fineui/src/core/index.js new file mode 100644 index 000000000..b754913f6 --- /dev/null +++ b/packages/fineui/src/core/index.js @@ -0,0 +1,41 @@ +export * from './system'; +export { Plugin } from './6.plugin'; +export { StyleLoaderManager } from './loader/loader.style'; +export { ShowListener } from './listener/listener.show'; +export { useInWorker } from './worker'; +export { Element } from './element'; + +export { Controller } from './controller/0.controller'; +export { BroadcastController } from './controller/controller.broadcast'; +export { BubblesController } from './controller/controller.bubbles'; +export { DrawerController } from './controller/controller.drawer'; +export { LayerController } from './controller/controller.layer'; +export { MaskersController } from './controller/controller.masker'; +export { PopoverController } from './controller/controller.popover'; +export { ResizeController } from './controller/controller.resizer'; +export { TooltipsController } from './controller/controller.tooltips'; + +export * from './4.widget'; +export * from './2.base'; +export * from './3.ob'; + +export * from './5.inject'; +export * from './6.plugin'; + +export * from './action'; +// export * from "./behavior"; +// export * from "./controller"; +export * from './func'; +export * from './structure'; +export * from './h'; +export * from './constant'; +export * from './logic'; +export * from './wrapper'; +export * from './platform/web'; +export * from './utils'; + +export { shortcut, provider, store, model, mixin, mixins } from './decorator'; + +import _ from './1.lodash'; + +export { _ }; diff --git a/src/core/listener/listener.show.js b/packages/fineui/src/core/listener/listener.show.js similarity index 100% rename from src/core/listener/listener.show.js rename to packages/fineui/src/core/listener/listener.show.js diff --git a/src/core/loader/loader.style.js b/packages/fineui/src/core/loader/loader.style.js similarity index 100% rename from src/core/loader/loader.style.js rename to packages/fineui/src/core/loader/loader.style.js diff --git a/src/core/logic/index.js b/packages/fineui/src/core/logic/index.js similarity index 100% rename from src/core/logic/index.js rename to packages/fineui/src/core/logic/index.js diff --git a/src/core/logic/logic.js b/packages/fineui/src/core/logic/logic.js similarity index 100% rename from src/core/logic/logic.js rename to packages/fineui/src/core/logic/logic.js diff --git a/src/core/logic/logic.layout.js b/packages/fineui/src/core/logic/logic.layout.js similarity index 100% rename from src/core/logic/logic.layout.js rename to packages/fineui/src/core/logic/logic.layout.js diff --git a/src/core/platform/index.js b/packages/fineui/src/core/platform/index.js similarity index 100% rename from src/core/platform/index.js rename to packages/fineui/src/core/platform/index.js diff --git a/src/core/platform/web/config.js b/packages/fineui/src/core/platform/web/config.js similarity index 100% rename from src/core/platform/web/config.js rename to packages/fineui/src/core/platform/web/config.js diff --git a/src/core/platform/web/detectElementResize.js b/packages/fineui/src/core/platform/web/detectElementResize.js similarity index 100% rename from src/core/platform/web/detectElementResize.js rename to packages/fineui/src/core/platform/web/detectElementResize.js diff --git a/src/core/platform/web/function.js b/packages/fineui/src/core/platform/web/function.js similarity index 100% rename from src/core/platform/web/function.js rename to packages/fineui/src/core/platform/web/function.js diff --git a/src/core/platform/web/index.js b/packages/fineui/src/core/platform/web/index.js similarity index 100% rename from src/core/platform/web/index.js rename to packages/fineui/src/core/platform/web/index.js diff --git a/src/core/platform/web/jquery/__test__/fn.test.js b/packages/fineui/src/core/platform/web/jquery/__test__/fn.test.js similarity index 100% rename from src/core/platform/web/jquery/__test__/fn.test.js rename to packages/fineui/src/core/platform/web/jquery/__test__/fn.test.js diff --git a/src/core/platform/web/jquery/_jquery.js b/packages/fineui/src/core/platform/web/jquery/_jquery.js similarity index 100% rename from src/core/platform/web/jquery/_jquery.js rename to packages/fineui/src/core/platform/web/jquery/_jquery.js diff --git a/src/core/platform/web/jquery/event.js b/packages/fineui/src/core/platform/web/jquery/event.js similarity index 100% rename from src/core/platform/web/jquery/event.js rename to packages/fineui/src/core/platform/web/jquery/event.js diff --git a/src/core/platform/web/jquery/fn.js b/packages/fineui/src/core/platform/web/jquery/fn.js similarity index 100% rename from src/core/platform/web/jquery/fn.js rename to packages/fineui/src/core/platform/web/jquery/fn.js diff --git a/src/core/platform/web/jquery/index.js b/packages/fineui/src/core/platform/web/jquery/index.js similarity index 100% rename from src/core/platform/web/jquery/index.js rename to packages/fineui/src/core/platform/web/jquery/index.js diff --git a/src/core/platform/web/jquery/jquery.mousewheel.js b/packages/fineui/src/core/platform/web/jquery/jquery.mousewheel.js similarity index 100% rename from src/core/platform/web/jquery/jquery.mousewheel.js rename to packages/fineui/src/core/platform/web/jquery/jquery.mousewheel.js diff --git a/src/core/platform/web/load.js b/packages/fineui/src/core/platform/web/load.js similarity index 100% rename from src/core/platform/web/load.js rename to packages/fineui/src/core/platform/web/load.js diff --git a/src/core/structure/aes.js b/packages/fineui/src/core/structure/aes.js similarity index 100% rename from src/core/structure/aes.js rename to packages/fineui/src/core/structure/aes.js diff --git a/src/core/structure/aspect.js b/packages/fineui/src/core/structure/aspect.js similarity index 100% rename from src/core/structure/aspect.js rename to packages/fineui/src/core/structure/aspect.js diff --git a/src/core/structure/base64.js b/packages/fineui/src/core/structure/base64.js similarity index 100% rename from src/core/structure/base64.js rename to packages/fineui/src/core/structure/base64.js diff --git a/src/core/structure/cache.js b/packages/fineui/src/core/structure/cache.js similarity index 100% rename from src/core/structure/cache.js rename to packages/fineui/src/core/structure/cache.js diff --git a/src/core/structure/cellSizeAndPositionManager.js b/packages/fineui/src/core/structure/cellSizeAndPositionManager.js similarity index 100% rename from src/core/structure/cellSizeAndPositionManager.js rename to packages/fineui/src/core/structure/cellSizeAndPositionManager.js diff --git a/src/core/structure/heap.js b/packages/fineui/src/core/structure/heap.js similarity index 100% rename from src/core/structure/heap.js rename to packages/fineui/src/core/structure/heap.js diff --git a/src/core/structure/index.js b/packages/fineui/src/core/structure/index.js similarity index 100% rename from src/core/structure/index.js rename to packages/fineui/src/core/structure/index.js diff --git a/src/core/structure/linkedHashMap.js b/packages/fineui/src/core/structure/linkedHashMap.js similarity index 100% rename from src/core/structure/linkedHashMap.js rename to packages/fineui/src/core/structure/linkedHashMap.js diff --git a/src/core/structure/lru.js b/packages/fineui/src/core/structure/lru.js similarity index 100% rename from src/core/structure/lru.js rename to packages/fineui/src/core/structure/lru.js diff --git a/src/core/structure/prefixIntervalTree.js b/packages/fineui/src/core/structure/prefixIntervalTree.js similarity index 100% rename from src/core/structure/prefixIntervalTree.js rename to packages/fineui/src/core/structure/prefixIntervalTree.js diff --git a/src/core/structure/queue.js b/packages/fineui/src/core/structure/queue.js similarity index 100% rename from src/core/structure/queue.js rename to packages/fineui/src/core/structure/queue.js diff --git a/src/core/structure/sectionManager.js b/packages/fineui/src/core/structure/sectionManager.js similarity index 100% rename from src/core/structure/sectionManager.js rename to packages/fineui/src/core/structure/sectionManager.js diff --git a/src/core/structure/tree.js b/packages/fineui/src/core/structure/tree.js similarity index 100% rename from src/core/structure/tree.js rename to packages/fineui/src/core/structure/tree.js diff --git a/src/core/structure/vector.js b/packages/fineui/src/core/structure/vector.js similarity index 100% rename from src/core/structure/vector.js rename to packages/fineui/src/core/structure/vector.js diff --git a/packages/fineui/src/core/system.js b/packages/fineui/src/core/system.js new file mode 100644 index 000000000..e4c316633 --- /dev/null +++ b/packages/fineui/src/core/system.js @@ -0,0 +1,154 @@ +/** + * @author windy + * @version 2.0 + * Created by windy on 2021/6/30 + */ +import { prepares } from "./0.foundation"; +import { deepExtend, extend } from "./2.base"; +import { OB } from "./3.ob"; +import { Providers } from "./5.inject"; +import { provider } from "./decorator"; +import { isIE as checkIE } from "./platform/web"; + +// 系统参数常量 +const system = { + dependencies: {}, + layoutOptimize: false, + responsiveMode: false, + workerMode: false, + size: { + // 尺寸 + // 通用尺寸 + TOOL_BAR_HEIGHT: 24, + LIST_ITEM_HEIGHT: 24, + TRIGGER_HEIGHT: 24, + TOAST_TOP: 10, + H_GAP_SIZE: "M", + V_GAP_SIZE: "S", + }, + loadingCreator(config) { + const loadingSize = (config ? config.loadingSize : "small") || "small"; + + const isIE = checkIE(); + + function getSize(v) { + return Math.ceil(v / (loadingSize === "small" ? 2 : 1)); + } + + return { + type: "bi.horizontal", + cls: `bi-loading-widget${isIE ? " wave-loading hack" : ""}`, + height: getSize(60), + width: getSize(60), + hgap: getSize(10), + vgap: 2.5, + items: isIE ? [] : [{ + type: "bi.layout", + cls: "animate-rect rect1", + height: getSize(50), + width: getSize(5), + }, { + type: "bi.layout", + cls: "animate-rect rect2", + height: getSize(50), + width: getSize(5), + }, { + type: "bi.layout", + cls: "animate-rect rect3", + height: getSize(50), + width: getSize(5), + }], + }; + }, +}; + +// 具体尺寸还没定,先写着 +const sizeMap = { + S: 10, + M: 20, + L: 24, +}; + +class SystemProviderOB extends OB { + getSize () { + const size = system.size; + const H_GAP_SIZE = sizeMap[size.H_GAP_SIZE]; + const V_GAP_SIZE = sizeMap[size.V_GAP_SIZE]; + + return extend({}, size, { + H_GAP_SIZE, + V_GAP_SIZE, + }); + } + + getResponsiveMode () { + return system.responsiveMode; + } + + getWorkerMode () { + return system.workerMode; + } + + getLayoutOptimize () { + return system.layoutOptimize; + } + + getDependencies () { + return system.dependencies; + } + + getLoading(config) { + return system.loadingCreator(config); + } +} + +@provider() +export class SystemProvider { + static xtype = "bi.provider.system"; + + SYSTEM = system; + + setSize(opt) { + deepExtend(system, { size: opt }); + } + + setResponsiveMode(mode) { + system.responsiveMode = !!mode; + } + + setWorkerMode(mode) { + system.workerMode = !!mode; + } + + setLayoutOptimize(layoutOptimize) { + system.layoutOptimize = layoutOptimize; + } + + addDependency(moduleId, minVersion, maxVersion) { + system.dependencies[moduleId] = { + min: minVersion, + max: maxVersion, + }; + } + + addDependencies(moduleConfig) { + extend(system.dependencies, moduleConfig); + } + + setLoadingCreator = function(creator) { + system.loadingCreator = creator; + }; + + $get() { + return SystemProviderOB; + } +} + +export const SIZE_CONSANTS = {}; +// 不再增加线型的配置了,之后不维护前置版本直接删掉,都用实线连接线 +export const STYLE_CONSTANTS = {}; + +prepares.push(() => { + extend(SIZE_CONSANTS, Providers.getProvider(SystemProvider.xtype).getSize()); + STYLE_CONSTANTS.LINK_LINE_TYPE = SIZE_CONSANTS.LIST_ITEM_HEIGHT === 24 ? "dashed" : "solid"; +}); diff --git a/src/core/utils/__test__/aes.test.js b/packages/fineui/src/core/utils/__test__/aes.test.js similarity index 100% rename from src/core/utils/__test__/aes.test.js rename to packages/fineui/src/core/utils/__test__/aes.test.js diff --git a/src/core/utils/chinesePY.js b/packages/fineui/src/core/utils/chinesePY.js similarity index 100% rename from src/core/utils/chinesePY.js rename to packages/fineui/src/core/utils/chinesePY.js diff --git a/src/core/utils/color.js b/packages/fineui/src/core/utils/color.js similarity index 100% rename from src/core/utils/color.js rename to packages/fineui/src/core/utils/color.js diff --git a/packages/fineui/src/core/utils/dom.js b/packages/fineui/src/core/utils/dom.js new file mode 100644 index 000000000..2b8fb0790 --- /dev/null +++ b/packages/fineui/src/core/utils/dom.js @@ -0,0 +1,788 @@ +/** + * 对DOM操作的通用函数 + */ +import { Widget } from "../4.widget" +import { each, isEmpty, isNull } from "../2.base"; +import $ from "jquery"; + +export function ready(fn) { + Widget._renderEngine.createElement(document).ready(fn); +} + +export function patchProps(fromElement, toElement) { + const elemData = $._data(fromElement[0]); + const events = elemData.events; + each(events, (eventKey, event) => { + each(event, (i, handler) => { + toElement.on(eventKey + (handler.namespace ? (`.${handler.namespace}`) : ""), handler); + }); + }); + const fromChildren = fromElement.children(), toChildren = toElement.children(); + if (fromChildren.length !== toChildren.length) { + throw new Error("不匹配"); + } + each(fromChildren, (i, child) => { + patchProps($(child), $(toChildren[i])); + }); + each(fromElement.data("__widgets"), (i, widget) => { + widget.element = toElement; + }); +} + +/** + * 把dom数组或元素悬挂起来,使其不对html产生影响 + * @param dom + */ +export function hang(doms) { + if (isEmpty(doms)) { + return; + } + const frag = Widget._renderEngine.createFragment(); + each(doms, (i, dom) => { + dom instanceof Widget && (dom = dom.element); + dom instanceof $ && dom[0] && frag.appendChild(dom[0]); + }); + + return frag; +} + +export function isExist(obj) { + return Widget._renderEngine.createElement("body").find(obj.element).length > 0; +} + +// 预加载图片 +export function preloadImages(srcArray, onload) { + let count = 0; + const images = []; + + function complete() { + count++; + if (count >= srcArray.length) { + onload(); + } + } + + each(srcArray, (i, src) => { + images[i] = new Image(); + images[i].src = src; + images[i].onload = function () { + complete(); + }; + images[i].onerror = function () { + complete(); + }; + }); +} + +export function getTextSizeWidth(text, fontSize = 12) { + const span = Widget._renderEngine.createElement("").addClass("text-width-span").appendTo("body"); + + fontSize = `${fontSize}px`; + + span.css("font-size", fontSize).text(text); + + const width = span.width(); + span.remove(); + + return width; +} + +export function getTextSizeHeight(text, fontSize = 12) { + const span = Widget._renderEngine.createElement("").addClass("text-width-span").appendTo("body"); + + fontSize = `${fontSize}px`; + + span.css("font-size", fontSize).text(text); + + const height = span.height(); + span.remove(); + + return height; +} + +// 获取滚动条的宽度,页面display: none时候获取到的为0 +let _scrollWidth = null; + +export function getScrollWidth() { + if (isNull(_scrollWidth) || _scrollWidth === 0) { + const ul = Widget._renderEngine.createElement("
").width(50).height(50) + .css({ + position: "absolute", + top: "-9999px", + overflow: "scroll", + }) + .appendTo("body"); + _scrollWidth = ul[0].offsetWidth - ul[0].clientWidth; + ul.destroy(); + } + + return _scrollWidth; +} + +export function getImage(param, fillStyle, backgroundColor) { + const canvas = document.createElement("canvas"); + const ratio = 2; + Widget._renderEngine.createElement("body").append(canvas); + + const ctx = canvas.getContext("2d"); + ctx.font = "12px Helvetica Neue,Arial,PingFang SC,Hiragino Sans GB,Microsoft YaHei,微软雅黑,Heiti,黑体,sans-serif"; + const w = ctx.measureText(param).width + 4; + canvas.width = w * ratio; + canvas.height = 16 * ratio; + ctx.font = `${12 * ratio}px Helvetica Neue,Arial,PingFang SC,Hiragino Sans GB,Microsoft YaHei,微软雅黑,Heiti,黑体,sans-serif`; + ctx.fillStyle = fillStyle || "#3685f2"; + ctx.textBaseline = "middle"; + // ctx.fillStyle = "#EAF2FD"; + ctx.fillText(param, 2 * ratio, 9 * ratio); + Widget._renderEngine.createElement(canvas).destroy(); + const backColor = backgroundColor || "rgba(54, 133, 242, 0.1)"; + + // IE可以放大缩小所以要固定最大最小宽高 + return { + width: w, + height: 16, + src: canvas.toDataURL("image/png"), + style: `background-color: ${backColor};vertical-align: middle; margin: 0 1px; width:${w}px;height: 16px; max-width:${w}px;max-height: 16px; min-width:${w}px;min-height: 16px`, + param, + }; +} + +export function getLeftPosition(combo, popup, extraWidth, container) { + const el = combo.element; + const popupEl = popup.element; + const elRect = el[0].getBoundingClientRect(); + const popupElRect = popupEl[0].getBoundingClientRect(); + const containerRect = container ? container.getBoundingClientRect() : { left: 0 }; + + return { + left: elRect.left - containerRect.left - popupElRect.width - (extraWidth || 0), + }; +} + +export function getInnerLeftPosition(combo, popup, extraWidth) { + return { + left: combo.element.offset().left + (extraWidth || 0), + }; +} + +export function getRightPosition(combo, popup, extraWidth, container) { + const el = combo.element; + const elRect = el[0].getBoundingClientRect(); + const containerRect = container ? container.getBoundingClientRect() : { left: 0 }; + + return { + left: elRect.left + elRect.width - containerRect.left + (extraWidth || 0), + }; +} + +export function getInnerRightPosition(combo, popup, extraWidth) { + const el = combo.element, viewBounds = popup.element.bounds(); + + return { + left: el.offset().left + el.outerWidth() - viewBounds.width - (extraWidth || 0), + }; +} + +export function getTopPosition(combo, popup, extraHeight, container) { + const el = combo.element; + const popupEl = popup.element; + const elRect = el[0].getBoundingClientRect(); + const popupElRect = popupEl[0].getBoundingClientRect(); + const containerRect = container ? container.getBoundingClientRect() : { top: 0 }; + + return { + top: elRect.top - containerRect.top - popupElRect.height - (extraHeight || 0), + }; +} + +export function getBottomPosition(combo, popup, extraHeight, container) { + const el = combo.element; + const elRect = el[0].getBoundingClientRect(); + const containerRect = container ? container.getBoundingClientRect() : { top: 0 }; + + return { + top: elRect.top - containerRect.top + elRect.height + (extraHeight || 0), + }; +} + +export function isLeftSpaceEnough(combo, popup, extraWidth) { + return getLeftPosition(combo, popup, extraWidth).left >= 0; +} + +export function isInnerLeftSpaceEnough(combo, popup, extraWidth) { + const viewBounds = popup.element.bounds(), + windowBounds = Widget._renderEngine.createElement("body").bounds(); + + return getInnerLeftPosition(combo, popup, extraWidth).left + viewBounds.width <= windowBounds.width; +} + +export function isRightSpaceEnough(combo, popup, extraWidth) { + const viewBounds = popup.element[0].getBoundingClientRect(), + viewportBounds = document.documentElement.getBoundingClientRect(); + + return getRightPosition(combo, popup, extraWidth).left + viewBounds.width <= viewportBounds.width; +} + +export function isInnerRightSpaceEnough(combo, popup, extraWidth) { + return getInnerRightPosition(combo, popup, extraWidth).left >= 0; +} + +export function isTopSpaceEnough(combo, popup, extraHeight) { + return getTopPosition(combo, popup, extraHeight).top >= 0; +} + +export function isBottomSpaceEnough(combo, popup, extraHeight) { + const viewBounds = popup.element[0].getBoundingClientRect(), + viewportBounds = document.documentElement.getBoundingClientRect(); + + return getBottomPosition(combo, popup, extraHeight).top + viewBounds.height <= viewportBounds.height; +} + +export function isRightSpaceLarger(combo) { + const comboBounds = combo.element[0].getBoundingClientRect(), + viewportBounds = document.documentElement.getBoundingClientRect(); + + return viewportBounds.width - comboBounds.right >= comboBounds.left; +} + +export function isBottomSpaceLarger(combo) { + const comboBounds = combo.element[0].getBoundingClientRect(), + viewportBounds = document.documentElement.getBoundingClientRect(); + + return viewportBounds.height - comboBounds.bottom >= comboBounds.top; +} + +export function _getLeftAlignPosition(combo, popup, extraWidth, container) { + const comboRect = combo.element[0].getBoundingClientRect(), + popupRect = popup.element[0].getBoundingClientRect(), + viewportRect = document.documentElement.getBoundingClientRect(), + containerRect = container ? container.getBoundingClientRect() : { left: 0 }; + let left = comboRect.left - containerRect.left + extraWidth; + + if (comboRect.left + popupRect.width > viewportRect.width) { + left = viewportRect.width - popupRect.width - containerRect.left; + } + + return left; +} + +export function getLeftAlignPosition(combo, popup, extraWidth, container) { + let left = _getLeftAlignPosition(combo, popup, extraWidth, container); + let dir = ""; + // 如果放不下,优先使用RightAlign, 如果RightAlign也放不下, 再使用left=0 + const containerRect = container ? container.getBoundingClientRect() : { left: 0 }; + if (left + containerRect.left < 0) { + left = _getRightAlignPosition(combo, popup, extraWidth); + dir = "left"; + } + if (left + containerRect.left < 0) { + left = 0 - containerRect.left; + } + + return { + left, + dir: dir || "right", + }; +} + +export function getLeftAdaptPosition(combo, popup, extraWidth, container) { + if (isLeftSpaceEnough(combo, popup, extraWidth, container)) { + return getLeftPosition(combo, popup, extraWidth, container); + } + + return { + left: 0, + }; +} + +export function _getRightAlignPosition(combo, popup, extraWidth, container) { + const comboBounds = combo.element[0].getBoundingClientRect(), + viewBounds = popup.element[0].getBoundingClientRect(), + containerRect = container ? container.getBoundingClientRect() : { left: 0 }; + + return comboBounds.left + comboBounds.width - viewBounds.width - extraWidth - containerRect.left; +} + +export function getRightAlignPosition(combo, popup, extraWidth, container) { + let left = _getRightAlignPosition(combo, popup, extraWidth, container); + let dir = ""; + // 如果放不下,优先使用LeftAlign, 如果LeftAlign也放不下, 再使用left=0 + if (left < 0) { + left = _getLeftAlignPosition(combo, popup, extraWidth, container); + dir = "right"; + } + if (left < 0) { + left = 0; + } + + return { + left, + dir: dir || "left", + }; +} + +export function getRightAdaptPosition(combo, popup, extraWidth, container) { + if (isRightSpaceEnough(combo, popup, extraWidth, container)) { + return getRightPosition(combo, popup, extraWidth, container); + } + + return { + left: document.documentElement.getBoundingClientRect().width - popup.element[0].getBoundingClientRect().width - container.getBoundingClientRect().left, + }; +} + +export function getTopAlignPosition(combo, popup, extraHeight, needAdaptHeight, container) { + const comboBounds = combo.element[0].getBoundingClientRect(), + popupBounds = popup.element[0].getBoundingClientRect(), + viewportBounds = document.documentElement.getBoundingClientRect(), + containerBounds = container ? container.getBoundingClientRect() : { top: 0 }; + let top, adaptHeight, dir; + if (isBottomSpaceEnough(combo, popup, -1 * comboBounds.height + extraHeight)) { + top = comboBounds.top - containerBounds.top + extraHeight; + } else if (needAdaptHeight) { + top = comboBounds.top - containerBounds.top + extraHeight; + adaptHeight = viewportBounds.height - comboBounds.top; + } else if (isTopSpaceEnough(combo, popup, -1 * comboBounds.height + extraHeight)) { + // 下方空间不足且不允许调整高度的情况下,优先使用上对齐 + top = comboBounds.top + comboBounds.height - popupBounds.height - containerBounds.top - extraHeight; + dir = "top"; + } else { + top = viewportBounds.height - popupBounds.height; + if (top < extraHeight) { + adaptHeight = viewportBounds.height - extraHeight; + } + } + if (top < extraHeight) { + top = extraHeight; + } + + return adaptHeight ? { + top, + adaptHeight, + dir: dir || "bottom", + } : { + top, + dir: dir || "bottom", + }; +} + +export function getTopAdaptPosition(combo, popup, extraHeight, needAdaptHeight, positionRelativeElement) { + const comboBounds = combo.element[0].getBoundingClientRect(), + popupBounds = popup.element[0].getBoundingClientRect(), + positionRelativeElementRect = positionRelativeElement.getBoundingClientRect(), + viewportBounds = document.documentElement.getBoundingClientRect(); + if (isTopSpaceEnough(combo, popup, extraHeight)) { + return getTopPosition(combo, popup, extraHeight); + } + if (needAdaptHeight) { + return { + top: 0 - positionRelativeElementRect.top, + adaptHeight: comboBounds.top - extraHeight, + }; + } + if (popupBounds.height + extraHeight > viewportBounds.height) { + return { + top: 0 - positionRelativeElementRect.top, + adaptHeight: viewportBounds.height - extraHeight, + }; + } + + return { + top: 0 - positionRelativeElementRect.top, + }; +} + +export function getBottomAlignPosition(combo, popup, extraHeight, needAdaptHeight, container) { + const comboBounds = combo.element[0].getBoundingClientRect(), + popupBounds = popup.element[0].getBoundingClientRect(), + windowBounds = Widget._renderEngine.createElement("body").bounds(), + containerBounds = container ? container.getBoundingClientRect() : { top: 0 }; + let top, adaptHeight, dir; + if (isTopSpaceEnough(combo, popup, -1 * comboBounds.height + extraHeight)) { + top = comboBounds.top + comboBounds.height - containerBounds.top - popupBounds.height; + } else if (needAdaptHeight) { + top = 0 - containerBounds.top; + adaptHeight = comboBounds.top + comboBounds.height - extraHeight; + } else if (isBottomSpaceEnough(combo, popup, -1 * comboBounds.height + extraHeight)) { + // 上方空间不足且不允许调整高度的情况下,优先使用下对齐 + top = comboBounds.top - containerBounds.top + extraHeight; + dir = "bottom"; + } else { + top = 0; + if (popupBounds.height + extraHeight > windowBounds.height) { + adaptHeight = windowBounds.height - extraHeight; + } + } + if (top + containerBounds.top < 0) { + top = 0; + } + + return adaptHeight ? { + top, + adaptHeight, + dir: dir || "top", + } : { + top, + dir: dir || "top", + }; +} + +export function getBottomAdaptPosition(combo, popup, extraHeight, needAdaptHeight, positionRelativeElement) { + const comboBounds = combo.element[0].getBoundingClientRect(), + popupBounds = popup.element[0].getBoundingClientRect(), + viewportBounds = document.documentElement.getBoundingClientRect(), + positionRelativeElementRect = positionRelativeElement.getBoundingClientRect(); + if (isBottomSpaceEnough(combo, popup, extraHeight)) { + return getBottomPosition(combo, popup, extraHeight, positionRelativeElement); + } + if (needAdaptHeight) { + return { + top: comboBounds.top + comboBounds.height + extraHeight - positionRelativeElementRect.top, + adaptHeight: viewportBounds.height - comboBounds.top - comboBounds.height - extraHeight, + }; + } + if (popupBounds.height + extraHeight > viewportBounds.height) { + return { + top: extraHeight - positionRelativeElementRect.top, + adaptHeight: viewportBounds.height - extraHeight, + }; + } + + return { + top: viewportBounds.height - popupBounds.height - extraHeight - positionRelativeElementRect.top, + }; +} + +export function getCenterAdaptPosition(combo, popup, positionRelativeElement) { + const comboRect = combo.element[0].getBoundingClientRect(), + popupRect = popup.element[0].getBoundingClientRect(), + positionRelativeElementRect = positionRelativeElement.getBoundingClientRect(), + viewportBounds = document.documentElement.getBoundingClientRect(); + let left; + if (comboRect.left + comboRect.width / 2 + popupRect.width / 2 > viewportBounds.width) { + left = viewportBounds.width - popupRect.width - positionRelativeElementRect.left; + } else { + left = comboRect.left + (comboRect.width - popupRect.width) / 2 - positionRelativeElementRect.left; + } + if (left + positionRelativeElementRect.left < 0) { + left = 0; + } + + return { + left, + }; +} + +export function getMiddleAdaptPosition(combo, popup, positionRelativeElement) { + const comboRect = combo.element[0].getBoundingClientRect(), + popupRect = popup.element[0].getBoundingClientRect(), + positionRelativeElementRect = positionRelativeElement.getBoundingClientRect(), + viewportBounds = document.documentElement.getBoundingClientRect(); + + let top; + if (comboRect.top + comboRect.height / 2 + popupRect.height / 2 > viewportBounds.height) { + top = viewportBounds.height - popupRect.height - positionRelativeElementRect.top; + } else { + top = comboRect.top + (comboRect.height - popupRect.height) / 2 - positionRelativeElementRect.top; + } + if (top + positionRelativeElementRect.top < 0) { + top = 0; + } + + return { + top, + }; +} + +export function getComboPositionByDirections(combo, popup, extraWidth, extraHeight, needAdaptHeight, directions, container) { + extraWidth || (extraWidth = 0); + extraHeight || (extraHeight = 0); + let i, direct; + const leftRight = [], topBottom = [], innerLeftRight = []; + let isNeedAdaptHeight = false, tbFirst = false, lrFirst = false; + let left, top, pos, firstDir = directions[0]; + for (i = 0; i < directions.length; i++) { + direct = directions[i]; + switch (direct) { + case "left": + leftRight.push(direct); + break; + case "right": + leftRight.push(direct); + break; + case "top": + topBottom.push(direct); + break; + case "bottom": + topBottom.push(direct); + break; + case "innerLeft": + innerLeftRight.push(direct); + break; + case "innerRight": + innerLeftRight.push(direct); + break; + default: + break; + } + } + for (i = 0; i < directions.length; i++) { + let tW, tH; + direct = directions[i]; + switch (direct) { + case "left": + if (!isNeedAdaptHeight) { + tW = tbFirst ? extraHeight : extraWidth, tH = tbFirst ? 0 : extraHeight; + if (isLeftSpaceEnough(combo, popup, tW)) { + left = getLeftPosition(combo, popup, tW, container).left; + if (topBottom[0] === "bottom") { + pos = getTopAlignPosition(combo, popup, tH, needAdaptHeight, container); + } else { + pos = getBottomAlignPosition(combo, popup, tH, needAdaptHeight, container); + } + pos.dir = `left,${pos.dir}`; + if (tbFirst) { + pos.change = "left"; + } + pos.left = left; + + return pos; + } + } + lrFirst = true; + break; + case "right": + if (!isNeedAdaptHeight) { + tW = tbFirst ? extraHeight : extraWidth, tH = tbFirst ? extraWidth : extraHeight; + if (isRightSpaceEnough(combo, popup, tW)) { + left = getRightPosition(combo, popup, tW, container).left; + if (topBottom[0] === "bottom") { + pos = getTopAlignPosition(combo, popup, tH, needAdaptHeight, container); + } else { + pos = getBottomAlignPosition(combo, popup, tH, needAdaptHeight, container); + } + pos.dir = `right,${pos.dir}`; + if (tbFirst) { + pos.change = "right"; + } + pos.left = left; + + return pos; + } + } + lrFirst = true; + break; + case "top": + tW = lrFirst ? extraHeight : extraWidth, tH = lrFirst ? extraWidth : extraHeight; + if (isTopSpaceEnough(combo, popup, tH)) { + top = getTopPosition(combo, popup, tH, container).top; + if (leftRight[0] === "right") { + pos = getLeftAlignPosition(combo, popup, tW, container); + } else { + pos = getRightAlignPosition(combo, popup, tW, container); + } + pos.dir = `top,${pos.dir}`; + if (lrFirst) { + pos.change = "top"; + } + pos.top = top; + + return pos; + } + if (needAdaptHeight) { + isNeedAdaptHeight = true; + } + tbFirst = true; + break; + case "bottom": + tW = lrFirst ? extraHeight : extraWidth, tH = lrFirst ? extraWidth : extraHeight; + if (isBottomSpaceEnough(combo, popup, tH)) { + top = getBottomPosition(combo, popup, tH, container).top; + if (leftRight[0] === "right") { + pos = getLeftAlignPosition(combo, popup, tW, container); + } else { + pos = getRightAlignPosition(combo, popup, tW, container); + } + pos.dir = `bottom,${pos.dir}`; + if (lrFirst) { + pos.change = "bottom"; + } + pos.top = top; + + return pos; + } + if (needAdaptHeight) { + isNeedAdaptHeight = true; + } + tbFirst = true; + break; + case "innerLeft": + if (!isNeedAdaptHeight) { + tW = tbFirst ? extraHeight : extraWidth, tH = tbFirst ? 0 : extraHeight; + if (isInnerLeftSpaceEnough(combo, popup, tW)) { + left = getInnerLeftPosition(combo, popup, tW).left; + if (topBottom[0] === "bottom") { + pos = getTopAlignPosition(combo, popup, tH, needAdaptHeight); + } else { + pos = getBottomAlignPosition(combo, popup, tH, needAdaptHeight); + } + pos.dir = `innerLeft,${pos.dir}`; + if (tbFirst) { + pos.change = "innerLeft"; + } + pos.left = left; + + return pos; + } + } + lrFirst = true; + break; + case "innerRight": + if (!isNeedAdaptHeight) { + tW = tbFirst ? extraHeight : extraWidth, tH = tbFirst ? extraWidth : extraHeight; + if (isInnerRightSpaceEnough(combo, popup, tW)) { + left = getInnerRightPosition(combo, popup, tW).left; + if (topBottom[0] === "bottom") { + pos = getTopAlignPosition(combo, popup, tH, needAdaptHeight); + } else { + pos = getBottomAlignPosition(combo, popup, tH, needAdaptHeight); + } + pos.dir = `innerLeft,${pos.dir}`; + if (tbFirst) { + pos.change = "innerRight"; + } + pos.left = left; + + return pos; + } + } + break; + default: + break; + } + } + + // 此处为四个方向放不下时挑空间最大的方向去放置, 也就是说我设置了弹出方向为"bottom,left", + // 最后发现实际弹出方向可能是"top,left",那么此时外界获取popup的方向应该是"top,left" + switch (directions[0]) { + case "left": + case "right": + if (isRightSpaceLarger(combo)) { + left = getRightAdaptPosition(combo, popup, extraWidth, container).left; + firstDir = "right"; + } else { + left = getLeftAdaptPosition(combo, popup, extraWidth, container).left; + firstDir = "left"; + } + if (topBottom[0] === "bottom") { + pos = getTopAlignPosition(combo, popup, extraHeight, needAdaptHeight); + pos.left = left; + pos.dir = `${firstDir},${pos.dir}`; + + return pos; + } + pos = getBottomAlignPosition(combo, popup, extraHeight, needAdaptHeight); + pos.left = left; + pos.dir = `${firstDir},${pos.dir}`; + + return pos; + default : + if (isBottomSpaceLarger(combo)) { + top = getBottomAdaptPosition(combo, popup, extraHeight, needAdaptHeight, container).top; + firstDir = "bottom"; + } else { + top = getTopAdaptPosition(combo, popup, extraHeight, needAdaptHeight, container).top; + firstDir = "top"; + } + if (leftRight[0] === "right") { + pos = getLeftAlignPosition(combo, popup, extraWidth, container); + pos.top = top; + pos.dir = `${firstDir},${pos.dir}`; + + return pos; + } + pos = getRightAlignPosition(combo, popup, extraWidth, container); + pos.top = top; + pos.dir = `${firstDir},${pos.dir}`; + + return pos; + } +} + + +export function getComboPosition(combo, popup, extraWidth, extraHeight, needAdaptHeight, directions, offsetStyle, positionRelativeElement) { + extraWidth || (extraWidth = 0); + extraHeight || (extraHeight = 0); + const viewportBounds = document.documentElement.getBoundingClientRect(); + const maxHeight = Math.min(popup.attr("maxHeight") || viewportBounds.height, viewportBounds.height); + popup.resetHeight && popup.resetHeight(maxHeight); + const position = getComboPositionByDirections(combo, popup, extraWidth, extraHeight, needAdaptHeight, directions || ["bottom", "top", "right", "left"], positionRelativeElement); + switch (offsetStyle) { + case "center": + if (position.change) { + const p = getMiddleAdaptPosition(combo, popup, positionRelativeElement); + position.top = p.top; + } else { + const p = getCenterAdaptPosition(combo, popup, positionRelativeElement); + position.left = p.left; + } + break; + case "middle": + if (position.change) { + const p = getCenterAdaptPosition(combo, popup, positionRelativeElement); + position.left = p.left; + } else { + const p = getMiddleAdaptPosition(combo, popup, positionRelativeElement); + position.top = p.top; + } + break; + default: + break; + } + if (needAdaptHeight === true) { + popup.resetHeight && popup.resetHeight(Math.min(viewportBounds.height - position.top - (positionRelativeElement ? positionRelativeElement.getBoundingClientRect().top : 0), maxHeight)); + } + + return position; +} + +/** + * 获取position:fixed相对定位的元素 + */ +export function getPositionRelativeContainingBlock(element) { + if (["html", "body", "#document"].indexOf((element.nodeName || "").toLowerCase()) >= 0) { + // $FlowFixMe[incompatible-return]: assume body is always available + return element.ownerDocument.body; + } + + function isExcept(node) { + const _computedStyle = getComputedStyle(node); + const transform = _computedStyle.transform; + const perspective = _computedStyle.perspective; + const filter = _computedStyle.filter; + const willChange = _computedStyle["will-change"]; + + return [transform, perspective, filter].some(value => value !== "none") || (willChange === "transform"); + } + + if (isExcept(element)) { + return element; + } + + return getPositionRelativeContainingBlock(element.parentNode); +} + +/** + * 获取position:fixed相对定位的元素的clientRect + */ +export function getPositionRelativeContainingBlockRect(element) { + const positionRelativeElement = getPositionRelativeContainingBlock(element); + const rect = positionRelativeElement.getBoundingClientRect(); + const { top, right, bottom, left, width, height, x, y } = positionRelativeElement.getBoundingClientRect(); + + return { + top, right, bottom, left, width, height, x, y, + scaleX: rect.width / positionRelativeElement.offsetWidth, + scaleY: rect.height / positionRelativeElement.offsetHeight, + }; +} diff --git a/src/core/utils/events/eventlistener.js b/packages/fineui/src/core/utils/events/eventlistener.js similarity index 100% rename from src/core/utils/events/eventlistener.js rename to packages/fineui/src/core/utils/events/eventlistener.js diff --git a/src/core/utils/events/index.js b/packages/fineui/src/core/utils/events/index.js similarity index 100% rename from src/core/utils/events/index.js rename to packages/fineui/src/core/utils/events/index.js diff --git a/src/core/utils/events/mousemovetracker.js b/packages/fineui/src/core/utils/events/mousemovetracker.js similarity index 100% rename from src/core/utils/events/mousemovetracker.js rename to packages/fineui/src/core/utils/events/mousemovetracker.js diff --git a/src/core/utils/events/wheelhandler.js b/packages/fineui/src/core/utils/events/wheelhandler.js similarity index 100% rename from src/core/utils/events/wheelhandler.js rename to packages/fineui/src/core/utils/events/wheelhandler.js diff --git a/src/core/utils/i18n.js b/packages/fineui/src/core/utils/i18n.js similarity index 100% rename from src/core/utils/i18n.js rename to packages/fineui/src/core/utils/i18n.js diff --git a/src/core/utils/index.js b/packages/fineui/src/core/utils/index.js similarity index 100% rename from src/core/utils/index.js rename to packages/fineui/src/core/utils/index.js diff --git a/packages/fineui/src/core/version.js b/packages/fineui/src/core/version.js new file mode 100644 index 000000000..6900e8235 --- /dev/null +++ b/packages/fineui/src/core/version.js @@ -0,0 +1,2 @@ +// BI.version = "2.0"; +export const version = "2.0" \ No newline at end of file diff --git a/src/core/worker.js b/packages/fineui/src/core/worker.js similarity index 100% rename from src/core/worker.js rename to packages/fineui/src/core/worker.js diff --git a/src/core/wrapper/index.js b/packages/fineui/src/core/wrapper/index.js similarity index 100% rename from src/core/wrapper/index.js rename to packages/fineui/src/core/wrapper/index.js diff --git a/packages/fineui/src/core/wrapper/layout.js b/packages/fineui/src/core/wrapper/layout.js new file mode 100644 index 000000000..288d586eb --- /dev/null +++ b/packages/fineui/src/core/wrapper/layout.js @@ -0,0 +1,821 @@ +import { isNull, isFunction, each, stripEL, keys, isArray, contains, isKey, isOdd, isWidget, isNotNull, has } from "../2.base"; +import { Widget } from "../4.widget"; +import { _lazyCreateWidget, Providers } from "../5.inject"; +import { shortcut } from "../decorator"; +import { pixFormat, Events } from "../constant"; +import { SystemProvider } from "../system"; + +/** + * 布局容器类 + * + * @cfg {JSON} options 配置属性 + * @cfg {Boolean} [options.scrollable=false] 子组件超出容器边界之后是否会出现滚动条 + * @cfg {Boolean} [options.scrollx=false] 子组件超出容器边界之后是否会出现横向滚动条 + * @cfg {Boolean} [options.scrolly=false] 子组件超出容器边界之后是否会出现纵向滚动条 + */ +@shortcut() +export class Layout extends Widget { + static xtype = "bi.layout"; + + props() { + return { + scrollable: null, // true, false, null + scrollx: false, // true, false + scrolly: false, // true, false + items: [], + innerHgap: 0, + innerVgap: 0, + }; + } + + render() { + const o = this.options; + this._init4Margin(); + this._init4Scroll(); + if (isFunction(o.columnSize)) { + const columnSizeFn = o.columnSize; + o.columnSize = this.__watch(columnSizeFn, (context, newValue) => { + o.columnSize = newValue; + this.resize(); + }); + } + if (isFunction(o.rowSize)) { + const rowSizeFn = o.rowSize; + o.rowSize = this.__watch(rowSizeFn, (context, newValue) => { + o.rowSize = newValue; + this.resize(); + }); + } + } + + _init4Margin() { + if (this.options.top) { + this.element.css("top", pixFormat(this.options.top)); + } + if (this.options.left) { + this.element.css("left", pixFormat(this.options.left)); + } + if (this.options.bottom) { + this.element.css("bottom", pixFormat(this.options.bottom)); + } + if (this.options.right) { + this.element.css("right", pixFormat(this.options.right)); + } + } + + _init4Scroll() { + switch (this.options.scrollable) { + case true: + case "xy": + this.element.css("overflow", "auto"); + + return; + case false: + this.element.css("overflow", "hidden"); + + return; + case "x": + this.element.css({ + "overflow-x": "auto", + "overflow-y": "hidden", + }); + + return; + case "y": + this.element.css({ + "overflow-x": "hidden", + "overflow-y": "auto", + }); + + return; + default : + break; + } + if (this.options.scrollx) { + this.element.css({ + "overflow-x": "auto", + "overflow-y": "hidden", + }); + + return; + } + if (this.options.scrolly) { + this.element.css({ + "overflow-x": "hidden", + "overflow-y": "auto", + }); + } + } + + appendFragment(frag) { + this.element.append(frag); + } + + _mountChildren() { + const frag = Widget._renderEngine.createFragment(); + let hasChild = false; + for (const key in this._children) { + const child = this._children[key]; + if (child.element !== this.element) { + frag.appendChild(child.element[0]); + hasChild = true; + } + } + if (hasChild === true) { + this.appendFragment(frag); + } + } + + _getChildName(index) { + return `${index}`; + } + + _addElement(i, item, context, widget) { + let w; + if (widget) { + return widget; + } + if (!this.hasWidget(this._getChildName(i))) { + w = _lazyCreateWidget(item, context); + w.on(Events.DESTROY, () => { + each(this._children, (name, child) => { + if (child === w) { + delete this._children[name]; + this.removeItemAt(name | 0); + } + }); + }); + this.addWidget(this._getChildName(i), w); + } else { + w = this.getWidgetByName(this._getChildName(i)); + } + + return w; + } + + _newElement(i, item, context) { + const w = _lazyCreateWidget(item, context); + w.on(Events.DESTROY, () => { + each(this._children, (name, child) => { + if (child === w) { + delete this._children[name]; + this.removeItemAt(name | 0); + } + }); + }); + + return this._addElement(i, item, context, w); + } + + _getOptions(item) { + if (item instanceof Widget) { + item = item.options; + } + item = stripEL(item); + if (item instanceof Widget) { + item = item.options; + } + + return item; + } + + _compare(item1, item2) { + // 不比较函数 + const eq = (a, b, aStack, bStack) => { + if (a === b) { + return a !== 0 || 1 / a === 1 / b; + } + if (isNull(a) || isNull(b)) { + return a === b; + } + const className = Object.prototype.toString.call(a); + switch (className) { + case "[object RegExp]": + case "[object String]": + return `${a}` === `${b}`; + case "[object Number]": + if (+a !== +a) { + return +b !== +b; + } + + return +a === 0 ? 1 / +a === 1 / b : +a === +b; + case "[object Date]": + case "[object Boolean]": + return +a === +b; + default: + } + + const areArrays = className === "[object Array]"; + if (!areArrays) { + if (isFunction(a) && isFunction(b)) { + return true; + } + a = this._getOptions(a); + b = this._getOptions(b); + } + + aStack = aStack || []; + bStack = bStack || []; + let length = aStack.length; + while (length--) { + if (aStack[length] === a) { + return bStack[length] === b; + } + } + + aStack.push(a); + bStack.push(b); + + if (areArrays) { + length = a.length; + if (length !== b.length) { + return false; + } + while (length--) { + if (!eq(a[length], b[length], aStack, bStack)) { + return false; + } + } + } else { + const aKeys = keys(a); + let key; + length = aKeys.length; + if (keys(b).length !== length) { + return false; + } + while (length--) { + key = aKeys[length]; + if (!(has(b, key) && eq(a[key], b[key], aStack, bStack))) { + return false; + } + } + } + aStack.pop(); + bStack.pop(); + + return true; + }; + + return eq(item1, item2); + } + + _getWrapper() { + return this.element; + } + + // 不依赖于this.options.items进行更新 + _updateItemAt(oldIndex, newIndex, item) { + const del = this._children[this._getChildName(oldIndex)]; + const w = this._newElement(newIndex, item); + // 需要有个地方临时存一下新建的组件,否则如果直接使用newIndex的话,newIndex位置的元素可能会被用到 + this._children[`${this._getChildName(newIndex)}-temp`] = w; + const nextSibling = del.element.next(); + if (nextSibling.length > 0) { + Widget._renderEngine.createElement(nextSibling).before(w.element); + } else { + w.element.appendTo(this._getWrapper()); + } + del._destroy(); + w._mount(); + + return true; + } + + _addItemAt(index, item) { + for (let i = this.options.items.length; i > index; i--) { + this._children[this._getChildName(i)] = this._children[this._getChildName(i - 1)]; + } + delete this._children[this._getChildName(index)]; + this.options.items.splice(index, 0, item); + } + + _removeItemAt(index) { + for (let i = index; i < this.options.items.length - 1; i++) { + this._children[this._getChildName(i)] = this._children[this._getChildName(i + 1)]; + } + delete this._children[this._getChildName(this.options.items.length - 1)]; + this.options.items.splice(index, 1); + } + + _clearGap(w) { + w.element.css({ + "margin-top": "", + "margin-bottom": "", + "margin-left": "", + "margin-right": "", + }); + } + + _optimiseGap(gap) { + return (gap > 0 && gap < 1) ? `${(gap * 100).toFixed(1)}%` : pixFormat(gap); + } + + _optimiseItemLgap(item) { + if (Providers.getProvider(SystemProvider.xtype).getLayoutOptimize()) { + return ((!item.type && item.el) ? ((item._lgap || 0) + (item.lgap || 0)) : item._lgap) || 0; + } + + return (item._lgap || 0) + (item.lgap || 0); + } + _optimiseItemRgap(item) { + if (Providers.getProvider(SystemProvider.xtype).getLayoutOptimize()) { + return ((!item.type && item.el) ? ((item._rgap || 0) + (item.rgap || 0)) : item._rgap) || 0; + } + + return (item._rgap || 0) + (item.rgap || 0); + } + _optimiseItemTgap(item) { + if (Providers.getProvider(SystemProvider.xtype).getLayoutOptimize()) { + return ((!item.type && item.el) ? ((item._tgap || 0) + (item.tgap || 0)) : item._tgap) || 0; + } + + return (item._tgap || 0) + (item.tgap || 0); + } + _optimiseItemBgap(item) { + if (Providers.getProvider(SystemProvider.xtype).getLayoutOptimize()) { + return ((!item.type && item.el) ? ((item._bgap || 0) + (item.bgap || 0)) : item._bgap) || 0; + } + + return (item._bgap || 0) + (item.bgap || 0); + } + _optimiseItemHgap(item) { + if (Providers.getProvider(SystemProvider.xtype).getLayoutOptimize()) { + return ((!item.type && item.el) ? ((item._hgap || 0) + (item.hgap || 0)) : item._hgap) || 0; + } + + return (item._hgap || 0) + (item.hgap || 0); + } + _optimiseItemVgap(item) { + if (Providers.getProvider(SystemProvider.xtype).getLayoutOptimize()) { + return ((!item.type && item.el) ? ((item._vgap || 0) + (item.vgap || 0)) : item._vgap) || 0; + } + + return (item._vgap || 0) + (item.vgap || 0); + } + + _handleGap(w, item, hIndex, vIndex) { + const o = this.options; + let innerLgap, innerRgap, innerTgap, innerBgap; + if (isNull(vIndex)) { + innerTgap = innerBgap = o.innerVgap; + innerLgap = hIndex === 0 ? o.innerHgap : 0; + innerRgap = hIndex === o.items.length - 1 ? o.innerHgap : 0; + } else { + innerLgap = innerRgap = o.innerHgap; + innerTgap = vIndex === 0 ? o.innerVgap : 0; + innerBgap = vIndex === o.items.length - 1 ? o.innerVgap : 0; + } + if (o.vgap + o.tgap + innerTgap + this._optimiseItemTgap(item) + this._optimiseItemVgap(item) !== 0) { + const top = ((isNull(vIndex) || vIndex === 0) ? o.vgap : 0) + o.tgap + innerTgap + this._optimiseItemTgap(item) + this._optimiseItemVgap(item); + w.element.css({ + "margin-top": this._optimiseGap(top), + }); + } + if (o.hgap + o.lgap + innerLgap + this._optimiseItemLgap(item) + this._optimiseItemHgap(item) !== 0) { + const left = ((isNull(hIndex) || hIndex === 0) ? o.hgap : 0) + o.lgap + innerLgap + this._optimiseItemLgap(item) + this._optimiseItemHgap(item); + w.element.css({ + "margin-left": this._optimiseGap(left), + }); + } + if (o.hgap + o.rgap + innerRgap + this._optimiseItemRgap(item) + this._optimiseItemHgap(item) !== 0) { + const right = o.hgap + o.rgap + innerRgap + this._optimiseItemRgap(item) + this._optimiseItemHgap(item); + w.element.css({ + "margin-right": this._optimiseGap(right), + }); + } + if (o.vgap + o.bgap + innerBgap + this._optimiseItemBgap(item) + this._optimiseItemVgap(item) !== 0) { + const bottom = o.vgap + o.bgap + innerBgap + this._optimiseItemBgap(item) + this._optimiseItemVgap(item); + w.element.css({ + "margin-bottom": this._optimiseGap(bottom), + }); + } + } + + // 横向换纵向 + _handleReverseGap(w, item, index) { + const o = this.options; + const innerLgap = o.innerHgap; + const innerRgap = o.innerHgap; + const innerTgap = index === 0 ? o.innerVgap : 0; + const innerBgap = index === o.items.length - 1 ? o.innerVgap : 0; + if (o.vgap + o.tgap + innerTgap + this._optimiseItemTgap(item) + this._optimiseItemVgap(item) !== 0) { + const top = (index === 0 ? o.vgap : 0) + (index === 0 ? o.tgap : 0) + innerTgap + this._optimiseItemTgap(item) + this._optimiseItemVgap(item); + w.element.css({ + "margin-top": this._optimiseGap(top), + }); + } + if (o.hgap + o.lgap + innerLgap + this._optimiseItemLgap(item) + this._optimiseItemHgap(item) !== 0) { + const left = o.hgap + o.lgap + innerLgap + this._optimiseItemLgap(item) + this._optimiseItemHgap(item); + w.element.css({ + "margin-left": this._optimiseGap(left), + }); + } + if (o.hgap + o.rgap + innerRgap + this._optimiseItemRgap(item) + this._optimiseItemHgap(item) !== 0) { + const right = o.hgap + o.rgap + innerRgap + this._optimiseItemRgap(item) + this._optimiseItemHgap(item); + w.element.css({ + "margin-right": this._optimiseGap(right), + }); + } + // 这里的代码是关键 + if (o.vgap + o.hgap + o.bgap + innerBgap + this._optimiseItemBgap(item) + this._optimiseItemVgap(item) !== 0) { + const bottom = (index === o.items.length - 1 ? o.vgap : o.hgap) + (index === o.items.length - 1 ? o.bgap : 0) + innerBgap + this._optimiseItemBgap(item) + this._optimiseItemVgap(item); + w.element.css({ + "margin-bottom": this._optimiseGap(bottom), + }); + } + } + + /** + * 添加一个子组件到容器中 + * @param {JSON/Widget} item 子组件 + */ + addItem(item) { + return this.addItemAt(this.options.items.length, item); + } + + prependItem(item) { + return this.addItemAt(0, item); + } + + addItemAt(index, item) { + if (index < 0 || index > this.options.items.length) { + return; + } + this._addItemAt(index, item); + const w = this._addElement(index, item); + // addItemAt 还是用之前的找上个兄弟节点向后插入的方式 + if (index > 0) { + this._children[this._getChildName(index - 1)].element.after(w.element); + } else { + w.element.prependTo(this._getWrapper()); + } + w._mount(); + + return w; + } + + removeItemAt(indexes) { + indexes = isArray(indexes) ? indexes : [indexes]; + const deleted = []; + const newItems = [], newChildren = {}; + for (let i = 0, len = this.options.items.length; i < len; i++) { + const child = this._children[this._getChildName(i)]; + if (contains(indexes, i)) { + child && deleted.push(child); + } else { + newChildren[this._getChildName(newItems.length)] = child; + newItems.push(this.options.items[i]); + } + } + this.options.items = newItems; + this._children = newChildren; + each(deleted, (i, c) => { + c._destroy(); + }); + } + + shouldUpdateItem(index, item) { + const child = this._children[this._getChildName(index)]; + if (!child || !child.shouldUpdate) { + return null; + } + + return child.shouldUpdate(this._getOptions(item)); + } + + addItems(items, context) { + const o = this.options; + const fragment = Widget._renderEngine.createFragment(); + const added = []; + each(items, (i, item) => { + const w = this._addElement(o.items.length, item, context); + this._children[this._getChildName(o.items.length)] = w; + o.items.push(item); + added.push(w); + fragment.appendChild(w.element[0]); + }); + if (this._isMounted) { + this._getWrapper().append(fragment); + each(added, (i, w) => { + w._mount(); + }); + } + } + + prependItems(items, context) { + items = items || []; + const fragment = Widget._renderEngine.createFragment(); + const added = []; + for (let i = items.length - 1; i >= 0; i--) { + this._addItemAt(0, items[i]); + const w = this._addElement(0, items[i], context); + this._children[this._getChildName(0)] = w; + this.options.items.unshift(items[i]); + added.push(w); + fragment.appendChild(w.element[0]); + } + if (this._isMounted) { + this._getWrapper().prepend(fragment); + each(added, (i, w) => { + w._mount(); + }); + } + } + + getValue() { + let value = [], child; + each(this.options.items, i => { + child = this._children[this._getChildName(i)]; + if (child) { + let v = child.getValue(); + v = isArray(v) ? v : [v]; + value = value.concat(v); + } + }); + + return value; + } + + setValue(v) { + let child; + each(this.options.items, i => { + child = this._children[this._getChildName(i)]; + child && child.setValue(v); + }); + } + + setText(v) { + let child; + each(this.options.items, i => { + child = this._children[this._getChildName(i)]; + child && child.setText(v); + }); + } + + patchItem(oldVnode, vnode, oldIndex, newIndex) { + const shouldUpdate = this.shouldUpdateItem(oldIndex, vnode); + const child = this._children[this._getChildName(oldIndex)]; + if (shouldUpdate) { + this._children[`${this._getChildName(newIndex)}-temp`] = child; + + return child._update(this._getOptions(vnode), shouldUpdate); + } + if (shouldUpdate === null && !this._compare(oldVnode, vnode)) { + // if (child.update) { + // return child.update(this._getOptions(vnode)); + // } + return this._updateItemAt(oldIndex, newIndex, vnode); + } + } + + updateChildren(oldCh, newCh, context) { + let oldStartIdx = 0, newStartIdx = 0; + let oldEndIdx = oldCh.length - 1; + let oldStartVnode = oldCh[0]; + let oldEndVnode = oldCh[oldEndIdx]; + let newEndIdx = newCh.length - 1; + let newStartVnode = newCh[0]; + let newEndVnode = newCh[newEndIdx]; + let before; + let updated; + const children = {}; + + const sameVnode = (vnode1, vnode2, oldIndex, newIndex) => { + vnode1 = this._getOptions(vnode1); + vnode2 = this._getOptions(vnode2); + if (isKey(vnode1.key)) { + return vnode1.key === vnode2.key; + } + if (oldIndex >= 0) { + return oldIndex === newIndex; + } + }; + + const addNode = (vnode, index, context) => { + const opt = this._getOptions(vnode); + const key = isNull(opt.key) ? index : opt.key; + children[key] = this._newElement(index, vnode, context); + + return children[key]; + }; + + const addVnodes = (before, vnodes, startIdx, endIdx, context) => { + for (; startIdx <= endIdx; ++startIdx) { + const node = addNode(vnodes[startIdx], startIdx, context); + insertBefore(node, before, false, startIdx); + } + }; + + const removeVnodes = (vnodes, startIdx, endIdx) => { + for (; startIdx <= endIdx; ++startIdx) { + const ch = vnodes[startIdx]; + if (isNotNull(ch)) { + const node = this._getOptions(ch); + const key = isNull(node.key) ? startIdx : node.key; + children[key]._destroy(); + } + } + }; + + const insertBefore = (insert, before, isNext, index) => { + insert = this._getOptions(insert); + before = before && this._getOptions(before); + const insertKey = isKey(insert.key) ? insert.key : index; + if (before && children[before.key]) { + const beforeKey = isKey(before.key) ? before.key : index; + let next; + if (isNext) { + next = children[beforeKey].element.next(); + } else { + next = children[beforeKey].element; + } + if (next.length > 0) { + next.before(children[insertKey].element); + } else { + this._getWrapper().append(children[insertKey].element); + } + } else { + this._getWrapper().append(children[insertKey].element); + } + }; + + const findOldVnode = (vnodes, vNode, beginIdx, endIdx) => { + let i, found, findIndex; + for (i = beginIdx; i <= endIdx; ++i) { + if (vnodes[i] && sameVnode(vnodes[i], vNode)) { + found = vnodes[i]; + findIndex = i; + } + } + + return [found, findIndex]; + }; + + each(oldCh, (i, child) => { + child = this._getOptions(child); + const key = isNull(child.key) ? i : child.key; + if (isKey(key)) { + children[key] = this._children[this._getChildName(i)]; + } + }); + + while (oldStartIdx <= oldEndIdx && newStartIdx <= newEndIdx) { + if (isNull(oldStartVnode)) { + oldStartVnode = oldCh[++oldStartIdx]; + } else if (isNull(oldEndVnode)) { + oldEndVnode = oldCh[--oldEndIdx]; + } else if (sameVnode(oldStartVnode, newStartVnode, oldStartIdx, newStartIdx)) { + const willUpdate = this.patchItem(oldStartVnode, newStartVnode, oldStartIdx, newStartIdx); + updated = willUpdate || updated; + children[isNull(oldStartVnode.key) ? oldStartIdx : oldStartVnode.key] = willUpdate ? this._children[`${this._getChildName(newStartIdx)}-temp`] : this._children[this._getChildName(oldStartIdx)]; + oldStartVnode = oldCh[++oldStartIdx]; + newStartVnode = newCh[++newStartIdx]; + } else if (sameVnode(oldEndVnode, newEndVnode, oldEndIdx, newEndIdx)) { + const willUpdate = this.patchItem(oldEndVnode, newEndVnode, oldEndIdx, newEndIdx); + updated = willUpdate || updated; + children[isNull(oldEndVnode.key) ? oldEndIdx : oldEndVnode.key] = willUpdate ? this._children[`${this._getChildName(newEndIdx)}-temp`] : this._children[this._getChildName(oldEndIdx)]; + oldEndVnode = oldCh[--oldEndIdx]; + newEndVnode = newCh[--newEndIdx]; + } else if (sameVnode(oldStartVnode, newEndVnode)) { + const willUpdate = this.patchItem(oldStartVnode, newEndVnode, oldStartIdx, newStartIdx); + updated = willUpdate || updated; + children[isNull(oldStartVnode.key) ? oldStartIdx : oldStartVnode.key] = willUpdate ? this._children[`${this._getChildName(newStartIdx)}-temp`] : this._children[this._getChildName(oldStartIdx)]; + insertBefore(oldStartVnode, oldEndVnode, true); + oldStartVnode = oldCh[++oldStartIdx]; + newEndVnode = newCh[--newEndIdx]; + } else if (sameVnode(oldEndVnode, newStartVnode)) { + const willUpdate = this.patchItem(oldEndVnode, newStartVnode, oldEndIdx, newEndIdx); + updated = willUpdate || updated; + children[isNull(oldEndVnode) ? oldEndIdx : oldEndVnode.key] = willUpdate ? this._children[`${this._getChildName(newEndIdx)}-temp`] : this._children[this._getChildName(oldEndIdx)]; + insertBefore(oldEndVnode, oldStartVnode); + oldEndVnode = oldCh[--oldEndIdx]; + newStartVnode = newCh[++newStartIdx]; + } else { + const sameOldVnode = findOldVnode(oldCh, newStartVnode, oldStartIdx, oldEndIdx); + if (isNull(sameOldVnode[0])) { // 不存在就把新的放到左边 + const node = addNode(newStartVnode, newStartIdx, context); + insertBefore(node, oldStartVnode); + } else { // 如果新节点在旧节点区间中存在就复用一下 + const sameOldIndex = sameOldVnode[1]; + const willUpdate = this.patchItem(sameOldVnode[0], newStartVnode, sameOldIndex, newStartIdx); + updated = willUpdate || updated; + children[isNull(sameOldVnode[0].key) ? newStartIdx : sameOldVnode[0].key] = willUpdate ? this._children[`${this._getChildName(newStartIdx)}-temp`] : this._children[this._getChildName(sameOldIndex)]; + oldCh[sameOldIndex] = undefined; + insertBefore(sameOldVnode[0], oldStartVnode); + } + newStartVnode = newCh[++newStartIdx]; + } + } + if (oldStartIdx > oldEndIdx) { + before = isNull(newCh[newEndIdx + 1]) ? null : newCh[newEndIdx + 1]; + addVnodes(before, newCh, newStartIdx, newEndIdx, context); + } else if (newStartIdx > newEndIdx) { + removeVnodes(oldCh, oldStartIdx, oldEndIdx); + } + + this._children = {}; + each(newCh, (i, child) => { + const node = this._getOptions(child); + const key = isNull(node.key) ? i : node.key; + children[key]._setParent && children[key]._setParent(this); + children[key]._mount(); + this._children[this._getChildName(i)] = children[key]; + }); + + return updated; + } + + forceUpdate(opt) { + if (this._isMounted) { + each(this._children, (i, c) => { + c.destroy(); + }); + this._children = {}; + this._isMounted = false; + } + this.options.items = opt.items; + this.stroke(opt.items); + this._mount(); + } + + update(opt) { + const o = this.options; + const items = opt.items || []; + const context = opt.context; + const oldItems = o.items; + this.options.items = items; + + return this.updateChildren(oldItems, items, context); + } + + stroke(items, options) { + options = options || {}; + each(items, (i, item) => { + item && this._addElement(i, item, options.context); + }); + } + + getRowColumnCls(rowIndex, colIndex, lastRowIndex, lastColIndex) { + let cls = ""; + if (rowIndex === 0) { + cls += " first-row"; + } else if (rowIndex === lastRowIndex) { + cls += " last-row"; + } + if (colIndex === 0) { + cls += " first-col"; + } else if (colIndex === lastColIndex) { + cls += " last-col"; + } + isOdd(rowIndex + 1) ? (cls += " odd-row") : (cls += " even-row"); + isOdd(colIndex + 1) ? (cls += " odd-col") : (cls += " even-col"); + cls += " center-element"; + + return cls; + } + + removeWidget(nameOrWidget) { + let removeIndex; + if (isWidget(nameOrWidget)) { + each(this._children, (name, child) => { + if (child === nameOrWidget) { + removeIndex = name; + } + }); + } else { + removeIndex = nameOrWidget; + } + if (removeIndex) { + this._removeItemAt(removeIndex | 0); + } + } + + empty() { + super.empty(...arguments); + this.options.items = []; + } + + destroy() { + super.destroy(...arguments); + this.options.items = []; + } + + populate(items, options) { + items = items || []; + options = options || {}; + if (this._isMounted) { + this.update({ + items, + context: options.context, + }); + + return; + } + this.options.items = items; + this.stroke(items, options); + } + + resize() { + this.stroke(this.options.items); + } +} diff --git a/src/core/wrapper/layout/adapt/absolute.center.js b/packages/fineui/src/core/wrapper/layout/adapt/absolute.center.js similarity index 100% rename from src/core/wrapper/layout/adapt/absolute.center.js rename to packages/fineui/src/core/wrapper/layout/adapt/absolute.center.js diff --git a/src/core/wrapper/layout/adapt/absolute.horizontal.js b/packages/fineui/src/core/wrapper/layout/adapt/absolute.horizontal.js similarity index 100% rename from src/core/wrapper/layout/adapt/absolute.horizontal.js rename to packages/fineui/src/core/wrapper/layout/adapt/absolute.horizontal.js diff --git a/src/core/wrapper/layout/adapt/absolute.leftrightvertical.js b/packages/fineui/src/core/wrapper/layout/adapt/absolute.leftrightvertical.js similarity index 100% rename from src/core/wrapper/layout/adapt/absolute.leftrightvertical.js rename to packages/fineui/src/core/wrapper/layout/adapt/absolute.leftrightvertical.js diff --git a/src/core/wrapper/layout/adapt/absolute.vertical.js b/packages/fineui/src/core/wrapper/layout/adapt/absolute.vertical.js similarity index 100% rename from src/core/wrapper/layout/adapt/absolute.vertical.js rename to packages/fineui/src/core/wrapper/layout/adapt/absolute.vertical.js diff --git a/src/core/wrapper/layout/adapt/adapt.center.js b/packages/fineui/src/core/wrapper/layout/adapt/adapt.center.js similarity index 100% rename from src/core/wrapper/layout/adapt/adapt.center.js rename to packages/fineui/src/core/wrapper/layout/adapt/adapt.center.js diff --git a/src/core/wrapper/layout/adapt/adapt.horizontal.js b/packages/fineui/src/core/wrapper/layout/adapt/adapt.horizontal.js similarity index 100% rename from src/core/wrapper/layout/adapt/adapt.horizontal.js rename to packages/fineui/src/core/wrapper/layout/adapt/adapt.horizontal.js diff --git a/src/core/wrapper/layout/adapt/adapt.leftrightvertical.js b/packages/fineui/src/core/wrapper/layout/adapt/adapt.leftrightvertical.js similarity index 100% rename from src/core/wrapper/layout/adapt/adapt.leftrightvertical.js rename to packages/fineui/src/core/wrapper/layout/adapt/adapt.leftrightvertical.js diff --git a/src/core/wrapper/layout/adapt/adapt.table.js b/packages/fineui/src/core/wrapper/layout/adapt/adapt.table.js similarity index 100% rename from src/core/wrapper/layout/adapt/adapt.table.js rename to packages/fineui/src/core/wrapper/layout/adapt/adapt.table.js diff --git a/src/core/wrapper/layout/adapt/adapt.vertical.js b/packages/fineui/src/core/wrapper/layout/adapt/adapt.vertical.js similarity index 100% rename from src/core/wrapper/layout/adapt/adapt.vertical.js rename to packages/fineui/src/core/wrapper/layout/adapt/adapt.vertical.js diff --git a/src/core/wrapper/layout/adapt/auto.horizontal.js b/packages/fineui/src/core/wrapper/layout/adapt/auto.horizontal.js similarity index 100% rename from src/core/wrapper/layout/adapt/auto.horizontal.js rename to packages/fineui/src/core/wrapper/layout/adapt/auto.horizontal.js diff --git a/src/core/wrapper/layout/adapt/index.js b/packages/fineui/src/core/wrapper/layout/adapt/index.js similarity index 100% rename from src/core/wrapper/layout/adapt/index.js rename to packages/fineui/src/core/wrapper/layout/adapt/index.js diff --git a/src/core/wrapper/layout/adapt/inline.center.js b/packages/fineui/src/core/wrapper/layout/adapt/inline.center.js similarity index 100% rename from src/core/wrapper/layout/adapt/inline.center.js rename to packages/fineui/src/core/wrapper/layout/adapt/inline.center.js diff --git a/src/core/wrapper/layout/adapt/inline.horizontal.js b/packages/fineui/src/core/wrapper/layout/adapt/inline.horizontal.js similarity index 100% rename from src/core/wrapper/layout/adapt/inline.horizontal.js rename to packages/fineui/src/core/wrapper/layout/adapt/inline.horizontal.js diff --git a/src/core/wrapper/layout/adapt/inline.vertical.js b/packages/fineui/src/core/wrapper/layout/adapt/inline.vertical.js similarity index 100% rename from src/core/wrapper/layout/adapt/inline.vertical.js rename to packages/fineui/src/core/wrapper/layout/adapt/inline.vertical.js diff --git a/src/core/wrapper/layout/fill/auto.vtape.js b/packages/fineui/src/core/wrapper/layout/fill/auto.vtape.js similarity index 100% rename from src/core/wrapper/layout/fill/auto.vtape.js rename to packages/fineui/src/core/wrapper/layout/fill/auto.vtape.js diff --git a/src/core/wrapper/layout/fill/fill.horizontal.js b/packages/fineui/src/core/wrapper/layout/fill/fill.horizontal.js similarity index 100% rename from src/core/wrapper/layout/fill/fill.horizontal.js rename to packages/fineui/src/core/wrapper/layout/fill/fill.horizontal.js diff --git a/src/core/wrapper/layout/fill/fill.vertical.js b/packages/fineui/src/core/wrapper/layout/fill/fill.vertical.js similarity index 100% rename from src/core/wrapper/layout/fill/fill.vertical.js rename to packages/fineui/src/core/wrapper/layout/fill/fill.vertical.js diff --git a/src/core/wrapper/layout/fill/float.fill.horizontal.js b/packages/fineui/src/core/wrapper/layout/fill/float.fill.horizontal.js similarity index 100% rename from src/core/wrapper/layout/fill/float.fill.horizontal.js rename to packages/fineui/src/core/wrapper/layout/fill/float.fill.horizontal.js diff --git a/src/core/wrapper/layout/fill/index.js b/packages/fineui/src/core/wrapper/layout/fill/index.js similarity index 100% rename from src/core/wrapper/layout/fill/index.js rename to packages/fineui/src/core/wrapper/layout/fill/index.js diff --git a/src/core/wrapper/layout/flex/flex.center.js b/packages/fineui/src/core/wrapper/layout/flex/flex.center.js similarity index 100% rename from src/core/wrapper/layout/flex/flex.center.js rename to packages/fineui/src/core/wrapper/layout/flex/flex.center.js diff --git a/src/core/wrapper/layout/flex/flex.horizontal.center.js b/packages/fineui/src/core/wrapper/layout/flex/flex.horizontal.center.js similarity index 100% rename from src/core/wrapper/layout/flex/flex.horizontal.center.js rename to packages/fineui/src/core/wrapper/layout/flex/flex.horizontal.center.js diff --git a/src/core/wrapper/layout/flex/flex.horizontal.js b/packages/fineui/src/core/wrapper/layout/flex/flex.horizontal.js similarity index 100% rename from src/core/wrapper/layout/flex/flex.horizontal.js rename to packages/fineui/src/core/wrapper/layout/flex/flex.horizontal.js diff --git a/src/core/wrapper/layout/flex/flex.leftrightvertical.center.js b/packages/fineui/src/core/wrapper/layout/flex/flex.leftrightvertical.center.js similarity index 100% rename from src/core/wrapper/layout/flex/flex.leftrightvertical.center.js rename to packages/fineui/src/core/wrapper/layout/flex/flex.leftrightvertical.center.js diff --git a/src/core/wrapper/layout/flex/flex.vertical.center.js b/packages/fineui/src/core/wrapper/layout/flex/flex.vertical.center.js similarity index 100% rename from src/core/wrapper/layout/flex/flex.vertical.center.js rename to packages/fineui/src/core/wrapper/layout/flex/flex.vertical.center.js diff --git a/src/core/wrapper/layout/flex/flex.vertical.js b/packages/fineui/src/core/wrapper/layout/flex/flex.vertical.js similarity index 100% rename from src/core/wrapper/layout/flex/flex.vertical.js rename to packages/fineui/src/core/wrapper/layout/flex/flex.vertical.js diff --git a/src/core/wrapper/layout/flex/index.js b/packages/fineui/src/core/wrapper/layout/flex/index.js similarity index 100% rename from src/core/wrapper/layout/flex/index.js rename to packages/fineui/src/core/wrapper/layout/flex/index.js diff --git a/src/core/wrapper/layout/flex/wrapper/flex.wrapper.center.js b/packages/fineui/src/core/wrapper/layout/flex/wrapper/flex.wrapper.center.js similarity index 100% rename from src/core/wrapper/layout/flex/wrapper/flex.wrapper.center.js rename to packages/fineui/src/core/wrapper/layout/flex/wrapper/flex.wrapper.center.js diff --git a/src/core/wrapper/layout/flex/wrapper/flex.wrapper.horizontal.center.js b/packages/fineui/src/core/wrapper/layout/flex/wrapper/flex.wrapper.horizontal.center.js similarity index 100% rename from src/core/wrapper/layout/flex/wrapper/flex.wrapper.horizontal.center.js rename to packages/fineui/src/core/wrapper/layout/flex/wrapper/flex.wrapper.horizontal.center.js diff --git a/src/core/wrapper/layout/flex/wrapper/flex.wrapper.horizontal.js b/packages/fineui/src/core/wrapper/layout/flex/wrapper/flex.wrapper.horizontal.js similarity index 100% rename from src/core/wrapper/layout/flex/wrapper/flex.wrapper.horizontal.js rename to packages/fineui/src/core/wrapper/layout/flex/wrapper/flex.wrapper.horizontal.js diff --git a/src/core/wrapper/layout/flex/wrapper/flex.wrapper.vertical.center.js b/packages/fineui/src/core/wrapper/layout/flex/wrapper/flex.wrapper.vertical.center.js similarity index 100% rename from src/core/wrapper/layout/flex/wrapper/flex.wrapper.vertical.center.js rename to packages/fineui/src/core/wrapper/layout/flex/wrapper/flex.wrapper.vertical.center.js diff --git a/src/core/wrapper/layout/flex/wrapper/flex.wrapper.vertical.js b/packages/fineui/src/core/wrapper/layout/flex/wrapper/flex.wrapper.vertical.js similarity index 100% rename from src/core/wrapper/layout/flex/wrapper/flex.wrapper.vertical.js rename to packages/fineui/src/core/wrapper/layout/flex/wrapper/flex.wrapper.vertical.js diff --git a/src/core/wrapper/layout/flex/wrapper/index.js b/packages/fineui/src/core/wrapper/layout/flex/wrapper/index.js similarity index 100% rename from src/core/wrapper/layout/flex/wrapper/index.js rename to packages/fineui/src/core/wrapper/layout/flex/wrapper/index.js diff --git a/src/core/wrapper/layout/float/float.absolute.center.js b/packages/fineui/src/core/wrapper/layout/float/float.absolute.center.js similarity index 100% rename from src/core/wrapper/layout/float/float.absolute.center.js rename to packages/fineui/src/core/wrapper/layout/float/float.absolute.center.js diff --git a/src/core/wrapper/layout/float/float.absolute.horizontal.js b/packages/fineui/src/core/wrapper/layout/float/float.absolute.horizontal.js similarity index 100% rename from src/core/wrapper/layout/float/float.absolute.horizontal.js rename to packages/fineui/src/core/wrapper/layout/float/float.absolute.horizontal.js diff --git a/src/core/wrapper/layout/float/float.absolute.leftrightvertical.js b/packages/fineui/src/core/wrapper/layout/float/float.absolute.leftrightvertical.js similarity index 100% rename from src/core/wrapper/layout/float/float.absolute.leftrightvertical.js rename to packages/fineui/src/core/wrapper/layout/float/float.absolute.leftrightvertical.js diff --git a/src/core/wrapper/layout/float/float.absolute.vertical.js b/packages/fineui/src/core/wrapper/layout/float/float.absolute.vertical.js similarity index 100% rename from src/core/wrapper/layout/float/float.absolute.vertical.js rename to packages/fineui/src/core/wrapper/layout/float/float.absolute.vertical.js diff --git a/src/core/wrapper/layout/float/float.horizontal.js b/packages/fineui/src/core/wrapper/layout/float/float.horizontal.js similarity index 100% rename from src/core/wrapper/layout/float/float.horizontal.js rename to packages/fineui/src/core/wrapper/layout/float/float.horizontal.js diff --git a/src/core/wrapper/layout/float/index.js b/packages/fineui/src/core/wrapper/layout/float/index.js similarity index 100% rename from src/core/wrapper/layout/float/index.js rename to packages/fineui/src/core/wrapper/layout/float/index.js diff --git a/src/core/wrapper/layout/index.js b/packages/fineui/src/core/wrapper/layout/index.js similarity index 100% rename from src/core/wrapper/layout/index.js rename to packages/fineui/src/core/wrapper/layout/index.js diff --git a/src/core/wrapper/layout/layout.absolute.js b/packages/fineui/src/core/wrapper/layout/layout.absolute.js similarity index 100% rename from src/core/wrapper/layout/layout.absolute.js rename to packages/fineui/src/core/wrapper/layout/layout.absolute.js diff --git a/src/core/wrapper/layout/layout.adaptive.js b/packages/fineui/src/core/wrapper/layout/layout.adaptive.js similarity index 100% rename from src/core/wrapper/layout/layout.adaptive.js rename to packages/fineui/src/core/wrapper/layout/layout.adaptive.js diff --git a/src/core/wrapper/layout/layout.border.js b/packages/fineui/src/core/wrapper/layout/layout.border.js similarity index 100% rename from src/core/wrapper/layout/layout.border.js rename to packages/fineui/src/core/wrapper/layout/layout.border.js diff --git a/src/core/wrapper/layout/layout.card.js b/packages/fineui/src/core/wrapper/layout/layout.card.js similarity index 100% rename from src/core/wrapper/layout/layout.card.js rename to packages/fineui/src/core/wrapper/layout/layout.card.js diff --git a/src/core/wrapper/layout/layout.default.js b/packages/fineui/src/core/wrapper/layout/layout.default.js similarity index 100% rename from src/core/wrapper/layout/layout.default.js rename to packages/fineui/src/core/wrapper/layout/layout.default.js diff --git a/src/core/wrapper/layout/layout.division.js b/packages/fineui/src/core/wrapper/layout/layout.division.js similarity index 100% rename from src/core/wrapper/layout/layout.division.js rename to packages/fineui/src/core/wrapper/layout/layout.division.js diff --git a/src/core/wrapper/layout/layout.flow.js b/packages/fineui/src/core/wrapper/layout/layout.flow.js similarity index 100% rename from src/core/wrapper/layout/layout.flow.js rename to packages/fineui/src/core/wrapper/layout/layout.flow.js diff --git a/src/core/wrapper/layout/layout.grid.js b/packages/fineui/src/core/wrapper/layout/layout.grid.js similarity index 100% rename from src/core/wrapper/layout/layout.grid.js rename to packages/fineui/src/core/wrapper/layout/layout.grid.js diff --git a/src/core/wrapper/layout/layout.horizontal.js b/packages/fineui/src/core/wrapper/layout/layout.horizontal.js similarity index 100% rename from src/core/wrapper/layout/layout.horizontal.js rename to packages/fineui/src/core/wrapper/layout/layout.horizontal.js diff --git a/src/core/wrapper/layout/layout.inline.js b/packages/fineui/src/core/wrapper/layout/layout.inline.js similarity index 100% rename from src/core/wrapper/layout/layout.inline.js rename to packages/fineui/src/core/wrapper/layout/layout.inline.js diff --git a/src/core/wrapper/layout/layout.lattice.js b/packages/fineui/src/core/wrapper/layout/layout.lattice.js similarity index 100% rename from src/core/wrapper/layout/layout.lattice.js rename to packages/fineui/src/core/wrapper/layout/layout.lattice.js diff --git a/src/core/wrapper/layout/layout.table.js b/packages/fineui/src/core/wrapper/layout/layout.table.js similarity index 100% rename from src/core/wrapper/layout/layout.table.js rename to packages/fineui/src/core/wrapper/layout/layout.table.js diff --git a/src/core/wrapper/layout/layout.tape.js b/packages/fineui/src/core/wrapper/layout/layout.tape.js similarity index 100% rename from src/core/wrapper/layout/layout.tape.js rename to packages/fineui/src/core/wrapper/layout/layout.tape.js diff --git a/src/core/wrapper/layout/layout.td.js b/packages/fineui/src/core/wrapper/layout/layout.td.js similarity index 100% rename from src/core/wrapper/layout/layout.td.js rename to packages/fineui/src/core/wrapper/layout/layout.td.js diff --git a/src/core/wrapper/layout/layout.vertical.js b/packages/fineui/src/core/wrapper/layout/layout.vertical.js similarity index 100% rename from src/core/wrapper/layout/layout.vertical.js rename to packages/fineui/src/core/wrapper/layout/layout.vertical.js diff --git a/src/core/wrapper/layout/layout.window.js b/packages/fineui/src/core/wrapper/layout/layout.window.js similarity index 100% rename from src/core/wrapper/layout/layout.window.js rename to packages/fineui/src/core/wrapper/layout/layout.window.js diff --git a/src/core/wrapper/layout/middle/index.js b/packages/fineui/src/core/wrapper/layout/middle/index.js similarity index 100% rename from src/core/wrapper/layout/middle/index.js rename to packages/fineui/src/core/wrapper/layout/middle/index.js diff --git a/src/core/wrapper/layout/middle/middle.center.js b/packages/fineui/src/core/wrapper/layout/middle/middle.center.js similarity index 100% rename from src/core/wrapper/layout/middle/middle.center.js rename to packages/fineui/src/core/wrapper/layout/middle/middle.center.js diff --git a/src/core/wrapper/layout/middle/middle.float.center.js b/packages/fineui/src/core/wrapper/layout/middle/middle.float.center.js similarity index 100% rename from src/core/wrapper/layout/middle/middle.float.center.js rename to packages/fineui/src/core/wrapper/layout/middle/middle.float.center.js diff --git a/src/core/wrapper/layout/middle/middle.horizontal.js b/packages/fineui/src/core/wrapper/layout/middle/middle.horizontal.js similarity index 100% rename from src/core/wrapper/layout/middle/middle.horizontal.js rename to packages/fineui/src/core/wrapper/layout/middle/middle.horizontal.js diff --git a/src/core/wrapper/layout/middle/middle.vertical.js b/packages/fineui/src/core/wrapper/layout/middle/middle.vertical.js similarity index 100% rename from src/core/wrapper/layout/middle/middle.vertical.js rename to packages/fineui/src/core/wrapper/layout/middle/middle.vertical.js diff --git a/src/core/wrapper/layout/responsive/index.js b/packages/fineui/src/core/wrapper/layout/responsive/index.js similarity index 100% rename from src/core/wrapper/layout/responsive/index.js rename to packages/fineui/src/core/wrapper/layout/responsive/index.js diff --git a/src/core/wrapper/layout/responsive/responsive.flex.horizontal.js b/packages/fineui/src/core/wrapper/layout/responsive/responsive.flex.horizontal.js similarity index 100% rename from src/core/wrapper/layout/responsive/responsive.flex.horizontal.js rename to packages/fineui/src/core/wrapper/layout/responsive/responsive.flex.horizontal.js diff --git a/src/core/wrapper/layout/responsive/responsive.flex.wrapper.horizontal.js b/packages/fineui/src/core/wrapper/layout/responsive/responsive.flex.wrapper.horizontal.js similarity index 100% rename from src/core/wrapper/layout/responsive/responsive.flex.wrapper.horizontal.js rename to packages/fineui/src/core/wrapper/layout/responsive/responsive.flex.wrapper.horizontal.js diff --git a/src/core/wrapper/layout/responsive/responsive.inline.js b/packages/fineui/src/core/wrapper/layout/responsive/responsive.inline.js similarity index 100% rename from src/core/wrapper/layout/responsive/responsive.inline.js rename to packages/fineui/src/core/wrapper/layout/responsive/responsive.inline.js diff --git a/src/core/wrapper/layout/sticky/index.js b/packages/fineui/src/core/wrapper/layout/sticky/index.js similarity index 100% rename from src/core/wrapper/layout/sticky/index.js rename to packages/fineui/src/core/wrapper/layout/sticky/index.js diff --git a/src/core/wrapper/layout/sticky/sticky.horizontal.js b/packages/fineui/src/core/wrapper/layout/sticky/sticky.horizontal.js similarity index 100% rename from src/core/wrapper/layout/sticky/sticky.horizontal.js rename to packages/fineui/src/core/wrapper/layout/sticky/sticky.horizontal.js diff --git a/src/core/wrapper/layout/sticky/sticky.vertical.js b/packages/fineui/src/core/wrapper/layout/sticky/sticky.vertical.js similarity index 100% rename from src/core/wrapper/layout/sticky/sticky.vertical.js rename to packages/fineui/src/core/wrapper/layout/sticky/sticky.vertical.js diff --git a/src/fix/fix.compact.js b/packages/fineui/src/fix/fix.compact.js similarity index 100% rename from src/fix/fix.compact.js rename to packages/fineui/src/fix/fix.compact.js diff --git a/src/fix/fix.js b/packages/fineui/src/fix/fix.js similarity index 100% rename from src/fix/fix.js rename to packages/fineui/src/fix/fix.js diff --git a/src/fix/index.js b/packages/fineui/src/fix/index.js similarity index 100% rename from src/fix/index.js rename to packages/fineui/src/fix/index.js diff --git a/packages/fineui/src/index.js b/packages/fineui/src/index.js new file mode 100644 index 000000000..65b0a003d --- /dev/null +++ b/packages/fineui/src/index.js @@ -0,0 +1,17 @@ +// sideEffects +import "./polyfill"; +import "./core/platform/web/jquery"; +import "./core/system"; + +import _jquery from "jquery"; + +export * from "./core"; +export * from "./base"; +export * from "./case"; +export * from "./widget"; +export * from "./component"; +export * from "./fix"; +export * from "./router"; + +export const jQuery = _jquery; +export const $ = _jquery; diff --git a/src/less/base/colorchooser/colorchooser.popup.less b/packages/fineui/src/less/base/colorchooser/colorchooser.popup.less similarity index 100% rename from src/less/base/colorchooser/colorchooser.popup.less rename to packages/fineui/src/less/base/colorchooser/colorchooser.popup.less diff --git a/src/less/base/colorchooser/colorchooser.trigger.less b/packages/fineui/src/less/base/colorchooser/colorchooser.trigger.less similarity index 100% rename from src/less/base/colorchooser/colorchooser.trigger.less rename to packages/fineui/src/less/base/colorchooser/colorchooser.trigger.less diff --git a/src/less/base/colorchooser/colorpicker/button.colorpicker.less b/packages/fineui/src/less/base/colorchooser/colorpicker/button.colorpicker.less similarity index 100% rename from src/less/base/colorchooser/colorpicker/button.colorpicker.less rename to packages/fineui/src/less/base/colorchooser/colorpicker/button.colorpicker.less diff --git a/src/less/base/colorchooser/colorpicker/button.colorshow.less b/packages/fineui/src/less/base/colorchooser/colorpicker/button.colorshow.less similarity index 100% rename from src/less/base/colorchooser/colorpicker/button.colorshow.less rename to packages/fineui/src/less/base/colorchooser/colorpicker/button.colorshow.less diff --git a/src/less/base/colorchooser/colorpicker/editor.colorpicker.less b/packages/fineui/src/less/base/colorchooser/colorpicker/editor.colorpicker.less similarity index 100% rename from src/less/base/colorchooser/colorpicker/editor.colorpicker.less rename to packages/fineui/src/less/base/colorchooser/colorpicker/editor.colorpicker.less diff --git a/src/less/base/colorchooser/farbtastic/farbtastic.less b/packages/fineui/src/less/base/colorchooser/farbtastic/farbtastic.less similarity index 100% rename from src/less/base/colorchooser/farbtastic/farbtastic.less rename to packages/fineui/src/less/base/colorchooser/farbtastic/farbtastic.less diff --git a/src/less/base/combo/combo.bubble.less b/packages/fineui/src/less/base/combo/combo.bubble.less similarity index 100% rename from src/less/base/combo/combo.bubble.less rename to packages/fineui/src/less/base/combo/combo.bubble.less diff --git a/src/less/base/combo/combo.less b/packages/fineui/src/less/base/combo/combo.less similarity index 100% rename from src/less/base/combo/combo.less rename to packages/fineui/src/less/base/combo/combo.less diff --git a/src/less/base/combo/combo.searchtextvalue.less b/packages/fineui/src/less/base/combo/combo.searchtextvalue.less similarity index 100% rename from src/less/base/combo/combo.searchtextvalue.less rename to packages/fineui/src/less/base/combo/combo.searchtextvalue.less diff --git a/src/less/base/combo/combo.textvalue.icon.less b/packages/fineui/src/less/base/combo/combo.textvalue.icon.less similarity index 100% rename from src/less/base/combo/combo.textvalue.icon.less rename to packages/fineui/src/less/base/combo/combo.textvalue.icon.less diff --git a/src/less/base/combo/combo.textvalue.less b/packages/fineui/src/less/base/combo/combo.textvalue.less similarity index 100% rename from src/less/base/combo/combo.textvalue.less rename to packages/fineui/src/less/base/combo/combo.textvalue.less diff --git a/src/less/base/combo/combo.textvaluecheck.less b/packages/fineui/src/less/base/combo/combo.textvaluecheck.less similarity index 100% rename from src/less/base/combo/combo.textvaluecheck.less rename to packages/fineui/src/less/base/combo/combo.textvaluecheck.less diff --git a/src/less/base/combo/combo.textvaluedownlist.less b/packages/fineui/src/less/base/combo/combo.textvaluedownlist.less similarity index 100% rename from src/less/base/combo/combo.textvaluedownlist.less rename to packages/fineui/src/less/base/combo/combo.textvaluedownlist.less diff --git a/src/less/base/combo/popup.bubble.bar.less b/packages/fineui/src/less/base/combo/popup.bubble.bar.less similarity index 100% rename from src/less/base/combo/popup.bubble.bar.less rename to packages/fineui/src/less/base/combo/popup.bubble.bar.less diff --git a/src/less/base/combo/popup.bubble.less b/packages/fineui/src/less/base/combo/popup.bubble.less similarity index 100% rename from src/less/base/combo/popup.bubble.less rename to packages/fineui/src/less/base/combo/popup.bubble.less diff --git a/src/less/base/editor/editor.search.less b/packages/fineui/src/less/base/editor/editor.search.less similarity index 100% rename from src/less/base/editor/editor.search.less rename to packages/fineui/src/less/base/editor/editor.search.less diff --git a/src/less/base/editor/editor.search.small.less b/packages/fineui/src/less/base/editor/editor.search.small.less similarity index 100% rename from src/less/base/editor/editor.search.small.less rename to packages/fineui/src/less/base/editor/editor.search.small.less diff --git a/src/less/base/foundation/bi.message.less b/packages/fineui/src/less/base/foundation/bi.message.less similarity index 100% rename from src/less/base/foundation/bi.message.less rename to packages/fineui/src/less/base/foundation/bi.message.less diff --git a/src/less/base/layer/layer.multiselect.less b/packages/fineui/src/less/base/layer/layer.multiselect.less similarity index 100% rename from src/less/base/layer/layer.multiselect.less rename to packages/fineui/src/less/base/layer/layer.multiselect.less diff --git a/src/less/base/layer/panel.less b/packages/fineui/src/less/base/layer/panel.less similarity index 100% rename from src/less/base/layer/panel.less rename to packages/fineui/src/less/base/layer/panel.less diff --git a/src/less/base/loader/sort.list.less b/packages/fineui/src/less/base/loader/sort.list.less similarity index 100% rename from src/less/base/loader/sort.list.less rename to packages/fineui/src/less/base/loader/sort.list.less diff --git a/src/less/base/pager/pager.all.count.less b/packages/fineui/src/less/base/pager/pager.all.count.less similarity index 100% rename from src/less/base/pager/pager.all.count.less rename to packages/fineui/src/less/base/pager/pager.all.count.less diff --git a/src/less/base/pager/pager.direction.less b/packages/fineui/src/less/base/pager/pager.direction.less similarity index 100% rename from src/less/base/pager/pager.direction.less rename to packages/fineui/src/less/base/pager/pager.direction.less diff --git a/src/less/base/pager/pager.less b/packages/fineui/src/less/base/pager/pager.less similarity index 100% rename from src/less/base/pager/pager.less rename to packages/fineui/src/less/base/pager/pager.less diff --git a/src/less/base/pane.less b/packages/fineui/src/less/base/pane.less similarity index 100% rename from src/less/base/pane.less rename to packages/fineui/src/less/base/pane.less diff --git a/src/less/base/segment/button.segment.less b/packages/fineui/src/less/base/segment/button.segment.less similarity index 100% rename from src/less/base/segment/button.segment.less rename to packages/fineui/src/less/base/segment/button.segment.less diff --git a/src/less/base/segment/segment.less b/packages/fineui/src/less/base/segment/segment.less similarity index 100% rename from src/less/base/segment/segment.less rename to packages/fineui/src/less/base/segment/segment.less diff --git a/src/less/base/single/button/button.half.less b/packages/fineui/src/less/base/single/button/button.half.less similarity index 100% rename from src/less/base/single/button/button.half.less rename to packages/fineui/src/less/base/single/button/button.half.less diff --git a/src/less/base/single/button/button.less b/packages/fineui/src/less/base/single/button/button.less similarity index 100% rename from src/less/base/single/button/button.less rename to packages/fineui/src/less/base/single/button/button.less diff --git a/src/less/base/single/button/switch.less b/packages/fineui/src/less/base/single/button/switch.less similarity index 100% rename from src/less/base/single/button/switch.less rename to packages/fineui/src/less/base/single/button/switch.less diff --git a/src/less/base/single/editor/editor.multifile.less b/packages/fineui/src/less/base/single/editor/editor.multifile.less similarity index 100% rename from src/less/base/single/editor/editor.multifile.less rename to packages/fineui/src/less/base/single/editor/editor.multifile.less diff --git a/src/less/base/single/editor/editor.textarea.less b/packages/fineui/src/less/base/single/editor/editor.textarea.less similarity index 100% rename from src/less/base/single/editor/editor.textarea.less rename to packages/fineui/src/less/base/single/editor/editor.textarea.less diff --git a/src/less/base/single/html.less b/packages/fineui/src/less/base/single/html.less similarity index 100% rename from src/less/base/single/html.less rename to packages/fineui/src/less/base/single/html.less diff --git a/src/less/base/single/input/checkbox.less b/packages/fineui/src/less/base/single/input/checkbox.less similarity index 100% rename from src/less/base/single/input/checkbox.less rename to packages/fineui/src/less/base/single/input/checkbox.less diff --git a/src/less/base/single/input/file.less b/packages/fineui/src/less/base/single/input/file.less similarity index 100% rename from src/less/base/single/input/file.less rename to packages/fineui/src/less/base/single/input/file.less diff --git a/src/less/base/single/input/input.less b/packages/fineui/src/less/base/single/input/input.less similarity index 100% rename from src/less/base/single/input/input.less rename to packages/fineui/src/less/base/single/input/input.less diff --git a/src/less/base/single/input/radio.less b/packages/fineui/src/less/base/single/input/radio.less similarity index 100% rename from src/less/base/single/input/radio.less rename to packages/fineui/src/less/base/single/input/radio.less diff --git a/src/less/base/single/instruction.less b/packages/fineui/src/less/base/single/instruction.less similarity index 100% rename from src/less/base/single/instruction.less rename to packages/fineui/src/less/base/single/instruction.less diff --git a/src/less/base/single/label.less b/packages/fineui/src/less/base/single/label.less similarity index 100% rename from src/less/base/single/label.less rename to packages/fineui/src/less/base/single/label.less diff --git a/src/less/base/single/text.less b/packages/fineui/src/less/base/single/text.less similarity index 100% rename from src/less/base/single/text.less rename to packages/fineui/src/less/base/single/text.less diff --git a/src/less/base/single/tip/tip.bubble.less b/packages/fineui/src/less/base/single/tip/tip.bubble.less similarity index 100% rename from src/less/base/single/tip/tip.bubble.less rename to packages/fineui/src/less/base/single/tip/tip.bubble.less diff --git a/src/less/base/single/tip/tip.less b/packages/fineui/src/less/base/single/tip/tip.less similarity index 100% rename from src/less/base/single/tip/tip.less rename to packages/fineui/src/less/base/single/tip/tip.less diff --git a/src/less/base/single/tip/tip.toast.less b/packages/fineui/src/less/base/single/tip/tip.toast.less similarity index 100% rename from src/less/base/single/tip/tip.toast.less rename to packages/fineui/src/less/base/single/tip/tip.toast.less diff --git a/src/less/base/single/tip/tip.tooltip.less b/packages/fineui/src/less/base/single/tip/tip.tooltip.less similarity index 100% rename from src/less/base/single/tip/tip.tooltip.less rename to packages/fineui/src/less/base/single/tip/tip.tooltip.less diff --git a/src/less/base/tree/tree.branch.less b/packages/fineui/src/less/base/tree/tree.branch.less similarity index 100% rename from src/less/base/tree/tree.branch.less rename to packages/fineui/src/less/base/tree/tree.branch.less diff --git a/src/less/base/tree/tree.display.less b/packages/fineui/src/less/base/tree/tree.display.less similarity index 100% rename from src/less/base/tree/tree.display.less rename to packages/fineui/src/less/base/tree/tree.display.less diff --git a/src/less/base/tree/tree.expander.less b/packages/fineui/src/less/base/tree/tree.expander.less similarity index 100% rename from src/less/base/tree/tree.expander.less rename to packages/fineui/src/less/base/tree/tree.expander.less diff --git a/src/less/base/tree/tree.list.display.less b/packages/fineui/src/less/base/tree/tree.list.display.less similarity index 100% rename from src/less/base/tree/tree.list.display.less rename to packages/fineui/src/less/base/tree/tree.list.display.less diff --git a/src/less/base/tree/ztree.less b/packages/fineui/src/less/base/tree/ztree.less similarity index 100% rename from src/less/base/tree/ztree.less rename to packages/fineui/src/less/base/tree/ztree.less diff --git a/src/less/base/trigger/trigger.less b/packages/fineui/src/less/base/trigger/trigger.less similarity index 100% rename from src/less/base/trigger/trigger.less rename to packages/fineui/src/less/base/trigger/trigger.less diff --git a/src/less/base/trigger/trigger.searchtextvalue.less b/packages/fineui/src/less/base/trigger/trigger.searchtextvalue.less similarity index 100% rename from src/less/base/trigger/trigger.searchtextvalue.less rename to packages/fineui/src/less/base/trigger/trigger.searchtextvalue.less diff --git a/src/less/base/trigger/trigger.selecttext.less b/packages/fineui/src/less/base/trigger/trigger.selecttext.less similarity index 100% rename from src/less/base/trigger/trigger.selecttext.less rename to packages/fineui/src/less/base/trigger/trigger.selecttext.less diff --git a/src/less/base/trigger/trigger.selecttextsmall.less b/packages/fineui/src/less/base/trigger/trigger.selecttextsmall.less similarity index 100% rename from src/less/base/trigger/trigger.selecttextsmall.less rename to packages/fineui/src/less/base/trigger/trigger.selecttextsmall.less diff --git a/src/less/base/trigger/trigger.text.less b/packages/fineui/src/less/base/trigger/trigger.text.less similarity index 100% rename from src/less/base/trigger/trigger.text.less rename to packages/fineui/src/less/base/trigger/trigger.text.less diff --git a/src/less/base/view/drawer.less b/packages/fineui/src/less/base/view/drawer.less similarity index 100% rename from src/less/base/view/drawer.less rename to packages/fineui/src/less/base/view/drawer.less diff --git a/src/less/base/view/popover.less b/packages/fineui/src/less/base/view/popover.less similarity index 100% rename from src/less/base/view/popover.less rename to packages/fineui/src/less/base/view/popover.less diff --git a/src/less/base/view/popupview.less b/packages/fineui/src/less/base/view/popupview.less similarity index 100% rename from src/less/base/view/popupview.less rename to packages/fineui/src/less/base/view/popupview.less diff --git a/src/less/box-model.less b/packages/fineui/src/less/box-model.less similarity index 100% rename from src/less/box-model.less rename to packages/fineui/src/less/box-model.less diff --git a/src/less/case/tree/tree.item.less b/packages/fineui/src/less/case/tree/tree.item.less similarity index 100% rename from src/less/case/tree/tree.item.less rename to packages/fineui/src/less/case/tree/tree.item.less diff --git a/src/less/component/form/form.less b/packages/fineui/src/less/component/form/form.less similarity index 100% rename from src/less/component/form/form.less rename to packages/fineui/src/less/component/form/form.less diff --git a/src/less/core/normalize.less b/packages/fineui/src/less/core/normalize.less similarity index 100% rename from src/less/core/normalize.less rename to packages/fineui/src/less/core/normalize.less diff --git a/src/less/core/normalize2.less b/packages/fineui/src/less/core/normalize2.less similarity index 100% rename from src/less/core/normalize2.less rename to packages/fineui/src/less/core/normalize2.less diff --git a/src/less/core/utils/animation.less b/packages/fineui/src/less/core/utils/animation.less similarity index 100% rename from src/less/core/utils/animation.less rename to packages/fineui/src/less/core/utils/animation.less diff --git a/src/less/core/utils/common.less b/packages/fineui/src/less/core/utils/common.less similarity index 100% rename from src/less/core/utils/common.less rename to packages/fineui/src/less/core/utils/common.less diff --git a/src/less/core/utils/cursor.less b/packages/fineui/src/less/core/utils/cursor.less similarity index 100% rename from src/less/core/utils/cursor.less rename to packages/fineui/src/less/core/utils/cursor.less diff --git a/src/less/core/utils/list-item.less b/packages/fineui/src/less/core/utils/list-item.less similarity index 100% rename from src/less/core/utils/list-item.less rename to packages/fineui/src/less/core/utils/list-item.less diff --git a/src/less/core/utils/motion/fade.less b/packages/fineui/src/less/core/utils/motion/fade.less similarity index 100% rename from src/less/core/utils/motion/fade.less rename to packages/fineui/src/less/core/utils/motion/fade.less diff --git a/src/less/core/utils/motion/move.less b/packages/fineui/src/less/core/utils/motion/move.less similarity index 100% rename from src/less/core/utils/motion/move.less rename to packages/fineui/src/less/core/utils/motion/move.less diff --git a/src/less/core/utils/motion/slide.less b/packages/fineui/src/less/core/utils/motion/slide.less similarity index 100% rename from src/less/core/utils/motion/slide.less rename to packages/fineui/src/less/core/utils/motion/slide.less diff --git a/src/less/core/utils/motion/zoom.less b/packages/fineui/src/less/core/utils/motion/zoom.less similarity index 100% rename from src/less/core/utils/motion/zoom.less rename to packages/fineui/src/less/core/utils/motion/zoom.less diff --git a/src/less/core/utils/position.less b/packages/fineui/src/less/core/utils/position.less similarity index 100% rename from src/less/core/utils/position.less rename to packages/fineui/src/less/core/utils/position.less diff --git a/src/less/core/utils/size.less b/packages/fineui/src/less/core/utils/size.less similarity index 100% rename from src/less/core/utils/size.less rename to packages/fineui/src/less/core/utils/size.less diff --git a/src/less/core/utils/sizing.less b/packages/fineui/src/less/core/utils/sizing.less similarity index 100% rename from src/less/core/utils/sizing.less rename to packages/fineui/src/less/core/utils/sizing.less diff --git a/src/less/core/utils/typographic.less b/packages/fineui/src/less/core/utils/typographic.less similarity index 100% rename from src/less/core/utils/typographic.less rename to packages/fineui/src/less/core/utils/typographic.less diff --git a/src/less/core/wrapper/flex.horizontal.less b/packages/fineui/src/less/core/wrapper/flex.horizontal.less similarity index 100% rename from src/less/core/wrapper/flex.horizontal.less rename to packages/fineui/src/less/core/wrapper/flex.horizontal.less diff --git a/src/less/core/wrapper/flex.vertical.less b/packages/fineui/src/less/core/wrapper/flex.vertical.less similarity index 100% rename from src/less/core/wrapper/flex.vertical.less rename to packages/fineui/src/less/core/wrapper/flex.vertical.less diff --git a/src/less/core/wrapper/flex.wrapper.horizontal.less b/packages/fineui/src/less/core/wrapper/flex.wrapper.horizontal.less similarity index 100% rename from src/less/core/wrapper/flex.wrapper.horizontal.less rename to packages/fineui/src/less/core/wrapper/flex.wrapper.horizontal.less diff --git a/src/less/core/wrapper/flex.wrapper.vertical.less b/packages/fineui/src/less/core/wrapper/flex.wrapper.vertical.less similarity index 100% rename from src/less/core/wrapper/flex.wrapper.vertical.less rename to packages/fineui/src/less/core/wrapper/flex.wrapper.vertical.less diff --git a/src/less/core/wrapper/float.absolute.less b/packages/fineui/src/less/core/wrapper/float.absolute.less similarity index 100% rename from src/less/core/wrapper/float.absolute.less rename to packages/fineui/src/less/core/wrapper/float.absolute.less diff --git a/src/less/core/wrapper/inline.less b/packages/fineui/src/less/core/wrapper/inline.less similarity index 100% rename from src/less/core/wrapper/inline.less rename to packages/fineui/src/less/core/wrapper/inline.less diff --git a/src/less/core/wrapper/inline.old.less b/packages/fineui/src/less/core/wrapper/inline.old.less similarity index 100% rename from src/less/core/wrapper/inline.old.less rename to packages/fineui/src/less/core/wrapper/inline.old.less diff --git a/src/less/core/wrapper/table.less b/packages/fineui/src/less/core/wrapper/table.less similarity index 100% rename from src/less/core/wrapper/table.less rename to packages/fineui/src/less/core/wrapper/table.less diff --git a/src/less/image.less b/packages/fineui/src/less/image.less similarity index 100% rename from src/less/image.less rename to packages/fineui/src/less/image.less diff --git a/src/less/index.less b/packages/fineui/src/less/index.less similarity index 100% rename from src/less/index.less rename to packages/fineui/src/less/index.less diff --git a/src/less/lib/background.less b/packages/fineui/src/less/lib/background.less similarity index 100% rename from src/less/lib/background.less rename to packages/fineui/src/less/lib/background.less diff --git a/src/less/lib/colors.less b/packages/fineui/src/less/lib/colors.less similarity index 100% rename from src/less/lib/colors.less rename to packages/fineui/src/less/lib/colors.less diff --git a/src/less/lib/constant.less b/packages/fineui/src/less/lib/constant.less similarity index 100% rename from src/less/lib/constant.less rename to packages/fineui/src/less/lib/constant.less diff --git a/src/less/lib/font.less b/packages/fineui/src/less/lib/font.less similarity index 100% rename from src/less/lib/font.less rename to packages/fineui/src/less/lib/font.less diff --git a/src/less/lib/icon.less b/packages/fineui/src/less/lib/icon.less similarity index 100% rename from src/less/lib/icon.less rename to packages/fineui/src/less/lib/icon.less diff --git a/src/less/lib/theme-modern.less b/packages/fineui/src/less/lib/theme-modern.less similarity index 100% rename from src/less/lib/theme-modern.less rename to packages/fineui/src/less/lib/theme-modern.less diff --git a/src/less/lib/theme.less b/packages/fineui/src/less/lib/theme.less similarity index 100% rename from src/less/lib/theme.less rename to packages/fineui/src/less/lib/theme.less diff --git a/src/less/motion.less b/packages/fineui/src/less/motion.less similarity index 100% rename from src/less/motion.less rename to packages/fineui/src/less/motion.less diff --git a/src/less/position.less b/packages/fineui/src/less/position.less similarity index 100% rename from src/less/position.less rename to packages/fineui/src/less/position.less diff --git a/src/less/resource/app.less b/packages/fineui/src/less/resource/app.less similarity index 100% rename from src/less/resource/app.less rename to packages/fineui/src/less/resource/app.less diff --git a/src/less/resource/background.less b/packages/fineui/src/less/resource/background.less similarity index 100% rename from src/less/resource/background.less rename to packages/fineui/src/less/resource/background.less diff --git a/src/less/resource/font.less b/packages/fineui/src/less/resource/font.less similarity index 100% rename from src/less/resource/font.less rename to packages/fineui/src/less/resource/font.less diff --git a/src/less/resource/icon.less b/packages/fineui/src/less/resource/icon.less similarity index 100% rename from src/less/resource/icon.less rename to packages/fineui/src/less/resource/icon.less diff --git a/src/less/theme/dark.less b/packages/fineui/src/less/theme/dark.less similarity index 100% rename from src/less/theme/dark.less rename to packages/fineui/src/less/theme/dark.less diff --git a/src/less/theme/default.less b/packages/fineui/src/less/theme/default.less similarity index 100% rename from src/less/theme/default.less rename to packages/fineui/src/less/theme/default.less diff --git a/src/less/theme/light.less b/packages/fineui/src/less/theme/light.less similarity index 100% rename from src/less/theme/light.less rename to packages/fineui/src/less/theme/light.less diff --git a/src/less/typographic.less b/packages/fineui/src/less/typographic.less similarity index 100% rename from src/less/typographic.less rename to packages/fineui/src/less/typographic.less diff --git a/src/less/var.less b/packages/fineui/src/less/var.less similarity index 100% rename from src/less/var.less rename to packages/fineui/src/less/var.less diff --git a/src/less/visual.less b/packages/fineui/src/less/visual.less similarity index 100% rename from src/less/visual.less rename to packages/fineui/src/less/visual.less diff --git a/src/less/widget/date/trigger.date.less b/packages/fineui/src/less/widget/date/trigger.date.less similarity index 100% rename from src/less/widget/date/trigger.date.less rename to packages/fineui/src/less/widget/date/trigger.date.less diff --git a/src/less/widget/downlist/popup.downlist.less b/packages/fineui/src/less/widget/downlist/popup.downlist.less similarity index 100% rename from src/less/widget/downlist/popup.downlist.less rename to packages/fineui/src/less/widget/downlist/popup.downlist.less diff --git a/src/less/widget/dynamicdatecombo/dynamicdatepopup.less b/packages/fineui/src/less/widget/dynamicdatecombo/dynamicdatepopup.less similarity index 100% rename from src/less/widget/dynamicdatecombo/dynamicdatepopup.less rename to packages/fineui/src/less/widget/dynamicdatecombo/dynamicdatepopup.less diff --git a/src/less/widget/dynamicdatecombo/dynamicdatetime.combo.less b/packages/fineui/src/less/widget/dynamicdatecombo/dynamicdatetime.combo.less similarity index 100% rename from src/less/widget/dynamicdatecombo/dynamicdatetime.combo.less rename to packages/fineui/src/less/widget/dynamicdatecombo/dynamicdatetime.combo.less diff --git a/src/less/widget/dynamicdatecombo/dynamicdatetimepopup.less b/packages/fineui/src/less/widget/dynamicdatecombo/dynamicdatetimepopup.less similarity index 100% rename from src/less/widget/dynamicdatecombo/dynamicdatetimepopup.less rename to packages/fineui/src/less/widget/dynamicdatecombo/dynamicdatetimepopup.less diff --git a/src/less/widget/intervalslider/intervalslider.label.less b/packages/fineui/src/less/widget/intervalslider/intervalslider.label.less similarity index 100% rename from src/less/widget/intervalslider/intervalslider.label.less rename to packages/fineui/src/less/widget/intervalslider/intervalslider.label.less diff --git a/src/less/widget/intervalslider/intervalslider.less b/packages/fineui/src/less/widget/intervalslider/intervalslider.less similarity index 100% rename from src/less/widget/intervalslider/intervalslider.less rename to packages/fineui/src/less/widget/intervalslider/intervalslider.less diff --git a/src/less/widget/month/trigger.month.less b/packages/fineui/src/less/widget/month/trigger.month.less similarity index 100% rename from src/less/widget/month/trigger.month.less rename to packages/fineui/src/less/widget/month/trigger.month.less diff --git a/src/less/widget/multilayerselecttree/multilayerselecttree.combo.less b/packages/fineui/src/less/widget/multilayerselecttree/multilayerselecttree.combo.less similarity index 100% rename from src/less/widget/multilayerselecttree/multilayerselecttree.combo.less rename to packages/fineui/src/less/widget/multilayerselecttree/multilayerselecttree.combo.less diff --git a/src/less/widget/multilayerselecttree/multilayerselecttree.leveltree.less b/packages/fineui/src/less/widget/multilayerselecttree/multilayerselecttree.leveltree.less similarity index 100% rename from src/less/widget/multilayerselecttree/multilayerselecttree.leveltree.less rename to packages/fineui/src/less/widget/multilayerselecttree/multilayerselecttree.leveltree.less diff --git a/src/less/widget/multilayersingletree/multilayersingletree.combo.less b/packages/fineui/src/less/widget/multilayersingletree/multilayersingletree.combo.less similarity index 100% rename from src/less/widget/multilayersingletree/multilayersingletree.combo.less rename to packages/fineui/src/less/widget/multilayersingletree/multilayersingletree.combo.less diff --git a/src/less/widget/multilayersingletree/multilayersingletree.leveltree.less b/packages/fineui/src/less/widget/multilayersingletree/multilayersingletree.leveltree.less similarity index 100% rename from src/less/widget/multilayersingletree/multilayersingletree.leveltree.less rename to packages/fineui/src/less/widget/multilayersingletree/multilayersingletree.leveltree.less diff --git a/src/less/widget/multiselect/check/multiselect.check.pane.less b/packages/fineui/src/less/widget/multiselect/check/multiselect.check.pane.less similarity index 100% rename from src/less/widget/multiselect/check/multiselect.check.pane.less rename to packages/fineui/src/less/widget/multiselect/check/multiselect.check.pane.less diff --git a/src/less/widget/multiselect/multiselect.combo.less b/packages/fineui/src/less/widget/multiselect/multiselect.combo.less similarity index 100% rename from src/less/widget/multiselect/multiselect.combo.less rename to packages/fineui/src/less/widget/multiselect/multiselect.combo.less diff --git a/src/less/widget/multiselect/multiselect.insert.combo.less b/packages/fineui/src/less/widget/multiselect/multiselect.insert.combo.less similarity index 100% rename from src/less/widget/multiselect/multiselect.insert.combo.less rename to packages/fineui/src/less/widget/multiselect/multiselect.insert.combo.less diff --git a/src/less/widget/multiselect/search/multiselect.search.pane.less b/packages/fineui/src/less/widget/multiselect/search/multiselect.search.pane.less similarity index 100% rename from src/less/widget/multiselect/search/multiselect.search.pane.less rename to packages/fineui/src/less/widget/multiselect/search/multiselect.search.pane.less diff --git a/src/less/widget/multiselect/trigger/button.checkselected.less b/packages/fineui/src/less/widget/multiselect/trigger/button.checkselected.less similarity index 100% rename from src/less/widget/multiselect/trigger/button.checkselected.less rename to packages/fineui/src/less/widget/multiselect/trigger/button.checkselected.less diff --git a/src/less/widget/multistringlist/multistringlist.insert.less b/packages/fineui/src/less/widget/multistringlist/multistringlist.insert.less similarity index 100% rename from src/less/widget/multistringlist/multistringlist.insert.less rename to packages/fineui/src/less/widget/multistringlist/multistringlist.insert.less diff --git a/src/less/widget/multistringlist/multistringlist.less b/packages/fineui/src/less/widget/multistringlist/multistringlist.less similarity index 100% rename from src/less/widget/multistringlist/multistringlist.less rename to packages/fineui/src/less/widget/multistringlist/multistringlist.less diff --git a/src/less/widget/multitree/check/multi.tree.check.pane.less b/packages/fineui/src/less/widget/multitree/check/multi.tree.check.pane.less similarity index 100% rename from src/less/widget/multitree/check/multi.tree.check.pane.less rename to packages/fineui/src/less/widget/multitree/check/multi.tree.check.pane.less diff --git a/src/less/widget/multitree/multi.tree.combo.less b/packages/fineui/src/less/widget/multitree/multi.tree.combo.less similarity index 100% rename from src/less/widget/multitree/multi.tree.combo.less rename to packages/fineui/src/less/widget/multitree/multi.tree.combo.less diff --git a/src/less/widget/multitree/popup.multi.tree.less b/packages/fineui/src/less/widget/multitree/popup.multi.tree.less similarity index 100% rename from src/less/widget/multitree/popup.multi.tree.less rename to packages/fineui/src/less/widget/multitree/popup.multi.tree.less diff --git a/src/less/widget/multitree/trigger/multi.tree.button.checkselected.less b/packages/fineui/src/less/widget/multitree/trigger/multi.tree.button.checkselected.less similarity index 100% rename from src/less/widget/multitree/trigger/multi.tree.button.checkselected.less rename to packages/fineui/src/less/widget/multitree/trigger/multi.tree.button.checkselected.less diff --git a/src/less/widget/numbereditor/number.editor.less b/packages/fineui/src/less/widget/numbereditor/number.editor.less similarity index 100% rename from src/less/widget/numbereditor/number.editor.less rename to packages/fineui/src/less/widget/numbereditor/number.editor.less diff --git a/src/less/widget/numberinterval/numberinterval.less b/packages/fineui/src/less/widget/numberinterval/numberinterval.less similarity index 100% rename from src/less/widget/numberinterval/numberinterval.less rename to packages/fineui/src/less/widget/numberinterval/numberinterval.less diff --git a/src/less/widget/quarter/trigger.quarter.less b/packages/fineui/src/less/widget/quarter/trigger.quarter.less similarity index 100% rename from src/less/widget/quarter/trigger.quarter.less rename to packages/fineui/src/less/widget/quarter/trigger.quarter.less diff --git a/src/less/widget/searchmultiselect/searchmultiselect.less b/packages/fineui/src/less/widget/searchmultiselect/searchmultiselect.less similarity index 100% rename from src/less/widget/searchmultiselect/searchmultiselect.less rename to packages/fineui/src/less/widget/searchmultiselect/searchmultiselect.less diff --git a/src/less/widget/singleselect/search/singleselect.search.pane.less b/packages/fineui/src/less/widget/singleselect/search/singleselect.search.pane.less similarity index 100% rename from src/less/widget/singleselect/search/singleselect.search.pane.less rename to packages/fineui/src/less/widget/singleselect/search/singleselect.search.pane.less diff --git a/src/less/widget/singleselect/singleselect.combo.less b/packages/fineui/src/less/widget/singleselect/singleselect.combo.less similarity index 100% rename from src/less/widget/singleselect/singleselect.combo.less rename to packages/fineui/src/less/widget/singleselect/singleselect.combo.less diff --git a/src/less/widget/singleslider/singlelider.label.less b/packages/fineui/src/less/widget/singleslider/singlelider.label.less similarity index 100% rename from src/less/widget/singleslider/singlelider.label.less rename to packages/fineui/src/less/widget/singleslider/singlelider.label.less diff --git a/src/less/widget/singleslider/singlelider.normal.less b/packages/fineui/src/less/widget/singleslider/singlelider.normal.less similarity index 100% rename from src/less/widget/singleslider/singlelider.normal.less rename to packages/fineui/src/less/widget/singleslider/singlelider.normal.less diff --git a/src/less/widget/singleslider/singleslider.less b/packages/fineui/src/less/widget/singleslider/singleslider.less similarity index 100% rename from src/less/widget/singleslider/singleslider.less rename to packages/fineui/src/less/widget/singleslider/singleslider.less diff --git a/src/less/widget/singleslider/slider/widget.slider.less b/packages/fineui/src/less/widget/singleslider/slider/widget.slider.less similarity index 100% rename from src/less/widget/singleslider/slider/widget.slider.less rename to packages/fineui/src/less/widget/singleslider/slider/widget.slider.less diff --git a/src/less/widget/singleslider/track/widget.track.less b/packages/fineui/src/less/widget/singleslider/track/widget.track.less similarity index 100% rename from src/less/widget/singleslider/track/widget.track.less rename to packages/fineui/src/less/widget/singleslider/track/widget.track.less diff --git a/src/less/widget/timecombo/timecombo.less b/packages/fineui/src/less/widget/timecombo/timecombo.less similarity index 100% rename from src/less/widget/timecombo/timecombo.less rename to packages/fineui/src/less/widget/timecombo/timecombo.less diff --git a/src/less/widget/timeinterval/dateinterval.less b/packages/fineui/src/less/widget/timeinterval/dateinterval.less similarity index 100% rename from src/less/widget/timeinterval/dateinterval.less rename to packages/fineui/src/less/widget/timeinterval/dateinterval.less diff --git a/src/less/widget/timeinterval/timeinterval.less b/packages/fineui/src/less/widget/timeinterval/timeinterval.less similarity index 100% rename from src/less/widget/timeinterval/timeinterval.less rename to packages/fineui/src/less/widget/timeinterval/timeinterval.less diff --git a/src/less/widget/year/popup.year.less b/packages/fineui/src/less/widget/year/popup.year.less similarity index 100% rename from src/less/widget/year/popup.year.less rename to packages/fineui/src/less/widget/year/popup.year.less diff --git a/src/less/widget/year/trigger.year.less b/packages/fineui/src/less/widget/year/trigger.year.less similarity index 100% rename from src/less/widget/year/trigger.year.less rename to packages/fineui/src/less/widget/year/trigger.year.less diff --git a/src/less/widget/yearinterval/yearinterval.less b/packages/fineui/src/less/widget/yearinterval/yearinterval.less similarity index 100% rename from src/less/widget/yearinterval/yearinterval.less rename to packages/fineui/src/less/widget/yearinterval/yearinterval.less diff --git a/src/less/widget/yearmonth/popup.yearmonth.less b/packages/fineui/src/less/widget/yearmonth/popup.yearmonth.less similarity index 100% rename from src/less/widget/yearmonth/popup.yearmonth.less rename to packages/fineui/src/less/widget/yearmonth/popup.yearmonth.less diff --git a/src/less/widget/yearmonthinterval/yearmonthinterval.less b/packages/fineui/src/less/widget/yearmonthinterval/yearmonthinterval.less similarity index 100% rename from src/less/widget/yearmonthinterval/yearmonthinterval.less rename to packages/fineui/src/less/widget/yearmonthinterval/yearmonthinterval.less diff --git a/src/less/widget/yearquarter/popup.yearquarter.less b/packages/fineui/src/less/widget/yearquarter/popup.yearquarter.less similarity index 100% rename from src/less/widget/yearquarter/popup.yearquarter.less rename to packages/fineui/src/less/widget/yearquarter/popup.yearquarter.less diff --git a/src/less/widget/yearquarterinterval/yearquarterinterval.less b/packages/fineui/src/less/widget/yearquarterinterval/yearquarterinterval.less similarity index 100% rename from src/less/widget/yearquarterinterval/yearquarterinterval.less rename to packages/fineui/src/less/widget/yearquarterinterval/yearquarterinterval.less diff --git a/src/polyfill/event.js b/packages/fineui/src/polyfill/event.js similarity index 100% rename from src/polyfill/event.js rename to packages/fineui/src/polyfill/event.js diff --git a/src/polyfill/index.js b/packages/fineui/src/polyfill/index.js similarity index 100% rename from src/polyfill/index.js rename to packages/fineui/src/polyfill/index.js diff --git a/src/polyfill/number.js b/packages/fineui/src/polyfill/number.js similarity index 100% rename from src/polyfill/number.js rename to packages/fineui/src/polyfill/number.js diff --git a/src/polyfill/sort.js b/packages/fineui/src/polyfill/sort.js similarity index 100% rename from src/polyfill/sort.js rename to packages/fineui/src/polyfill/sort.js diff --git a/src/router/0.router.js b/packages/fineui/src/router/0.router.js similarity index 100% rename from src/router/0.router.js rename to packages/fineui/src/router/0.router.js diff --git a/src/router/index.js b/packages/fineui/src/router/index.js similarity index 100% rename from src/router/index.js rename to packages/fineui/src/router/index.js diff --git a/packages/fineui/src/router/router.js b/packages/fineui/src/router/router.js new file mode 100644 index 000000000..f58c8402b --- /dev/null +++ b/packages/fineui/src/router/router.js @@ -0,0 +1,3143 @@ +import { nextTick, shortcut, Widget, isNotNull, each } from '@/core'; +import { Tab } from '@/base'; +import { Router } from './0.router'; +import { Fix } from '../fix'; + +function assert(condition, message) { + if (!condition) { + throw new Error(`[vue-router] ${message}`); + } +} + +function warn(condition, message) { + if (!condition) { + typeof console !== 'undefined' && console.warn(`[vue-router] ${message}`); + } +} + +function extend(a, b) { + for (const key in b) { + a[key] = b[key]; + } + + return a; +} + +/* */ + +const encodeReserveRE = /[!'()*]/g; +const encodeReserveReplacer = function (c) { + return `%${c.charCodeAt(0).toString(16)}`; +}; +const commaRE = /%2C/g; + +// fixed encodeURIComponent which is more conformant to RFC3986: +// - escapes [!'()*] +// - preserve commas +const encode = function (str) { + return encodeURIComponent(str).replace(encodeReserveRE, encodeReserveReplacer).replace(commaRE, ','); +}; + +function decode(str) { + try { + return decodeURIComponent(str); + } catch (err) { + { + warn(false, `Error decoding "${str}". Leaving it intact.`); + } + } + + return str; +} + +function resolveQuery(query, extraQuery, _parseQuery) { + if (extraQuery === void 0) extraQuery = {}; + + const parse = _parseQuery || parseQuery; + let parsedQuery; + try { + parsedQuery = parse(query || ''); + } catch (e) { + warn(false, e.message); + parsedQuery = {}; + } + for (const key in extraQuery) { + const value = extraQuery[key]; + parsedQuery[key] = Array.isArray(value) ? value.map(castQueryParamValue) : castQueryParamValue(value); + } + + return parsedQuery; +} + +var castQueryParamValue = function (value) { + return value == null || typeof value === 'object' ? value : String(value); +}; + +function parseQuery(query) { + const res = {}; + + query = query.trim().replace(/^(\?|#|&)/, ''); + + if (!query) { + return res; + } + + query.split('&').forEach(param => { + const parts = param.replace(/\+/g, ' ').split('='); + const key = decode(parts.shift()); + const val = parts.length > 0 ? decode(parts.join('=')) : null; + + if (res[key] === undefined) { + res[key] = val; + } else if (Array.isArray(res[key])) { + res[key].push(val); + } else { + res[key] = [res[key], val]; + } + }); + + return res; +} + +function stringifyQuery(obj) { + const res = obj + ? Object.keys(obj) + .map(key => { + const val = obj[key]; + + if (val === undefined) { + return ''; + } + + if (val === null) { + return encode(key); + } + + if (Array.isArray(val)) { + const result = []; + val.forEach(val2 => { + if (val2 === undefined) { + return; + } + if (val2 === null) { + result.push(encode(key)); + } else { + result.push(`${encode(key)}=${encode(val2)}`); + } + }); + + return result.join('&'); + } + + return `${encode(key)}=${encode(val)}`; + }) + .filter(x => x.length > 0) + .join('&') + : null; + + return res ? `?${res}` : ''; +} + +/* */ + +const trailingSlashRE = /\/?$/; + +function createRoute(record, location, redirectedFrom, router) { + const stringifyQuery = router && router.options.stringifyQuery; + + let query = location.query || {}; + try { + query = clone(query); + } catch (e) {} + + const route = { + name: location.name || (record && record.name), + meta: (record && record.meta) || {}, + path: location.path || '/', + hash: location.hash || '', + query, + params: location.params || {}, + fullPath: getFullPath(location, stringifyQuery), + matched: record ? formatMatch(record) : [], + }; + if (redirectedFrom) { + route.redirectedFrom = getFullPath(redirectedFrom, stringifyQuery); + } + + return Object.freeze(route); +} + +function clone(value) { + if (Array.isArray(value)) { + return value.map(clone); + } else if (value && typeof value === 'object') { + const res = {}; + for (const key in value) { + res[key] = clone(value[key]); + } + + return res; + } else { + return value; + } +} + +// the starting route that represents the initial state +const START = createRoute(null, { + path: '/', +}); + +function formatMatch(record) { + const res = []; + while (record) { + res.unshift(record); + record = record.parent; + } + + return res; +} + +function getFullPath(ref, _stringifyQuery) { + const path = ref.path; + let query = ref.query; + if (query === void 0) query = {}; + let hash = ref.hash; + if (hash === void 0) hash = ''; + + const stringify = _stringifyQuery || stringifyQuery; + + return (path || '/') + stringify(query) + hash; +} + +function isSameRoute(a, b, onlyPath) { + if (b === START) { + return a === b; + } else if (!b) { + return false; + } else if (a.path && b.path) { + return ( + a.path.replace(trailingSlashRE, '') === b.path.replace(trailingSlashRE, '') && + (onlyPath || (a.hash === b.hash && isObjectEqual(a.query, b.query))) + ); + } else if (a.name && b.name) { + return ( + a.name === b.name && + (onlyPath || (a.hash === b.hash && isObjectEqual(a.query, b.query) && isObjectEqual(a.params, b.params))) + ); + } else { + return false; + } +} + +function isObjectEqual(a, b) { + if (a === void 0) a = {}; + if (b === void 0) b = {}; + + // handle null value #1566 + if (!a || !b) { + return a === b; + } + const aKeys = Object.keys(a).sort(); + const bKeys = Object.keys(b).sort(); + if (aKeys.length !== bKeys.length) { + return false; + } + + return aKeys.every((key, i) => { + const aVal = a[key]; + const bKey = bKeys[i]; + if (bKey !== key) { + return false; + } + const bVal = b[key]; + // query values can be null and undefined + if (aVal == null || bVal == null) { + return aVal === bVal; + } + // check nested equality + if (typeof aVal === 'object' && typeof bVal === 'object') { + return isObjectEqual(aVal, bVal); + } + + return String(aVal) === String(bVal); + }); +} + +function isIncludedRoute(current, target) { + return ( + current.path.replace(trailingSlashRE, '/').indexOf(target.path.replace(trailingSlashRE, '/')) === 0 && + (!target.hash || current.hash === target.hash) && + queryIncludes(current.query, target.query) + ); +} + +function queryIncludes(current, target) { + for (const key in target) { + if (!(key in current)) { + return false; + } + } + + return true; +} + +function handleRouteEntered(route) { + for (let i = 0; i < route.matched.length; i++) { + const record = route.matched[i]; + for (const name in record.instances) { + const instance = record.instances[name]; + const cbs = record.enteredCbs[name]; + if (!instance || !cbs) { + continue; + } + delete record.enteredCbs[name]; + for (let i$1 = 0; i$1 < cbs.length; i$1++) { + if (!instance._isBeingDestroyed) { + cbs[i$1](instance); + } + } + } + } +} + +// var View = { +// name: 'RouterView', +// functional: true, +// props: { +// name: { +// type: String, +// default: 'default' +// } +// }, +// render: function render (_, ref) { +// var props = ref.props; +// var children = ref.children; +// var parent = ref.parent; +// var data = ref.data; + +// // used by devtools to display a router-view badge +// data.routerView = true; + +// // directly use parent context's createElement() function +// // so that components rendered by router-view can resolve named slots +// var h = parent.$createElement; +// var name = props.name; +// var route = parent.$route; +// var cache = parent._routerViewCache || (parent._routerViewCache = {}); + +// // determine current view depth, also check to see if the tree +// // has been toggled inactive but kept-alive. +// var depth = 0; +// var inactive = false; +// while (parent && parent._routerRoot !== parent) { +// var vnodeData = parent.$vnode ? parent.$vnode.data : {}; +// if (vnodeData.routerView) { +// depth++; +// } +// if (vnodeData.keepAlive && parent._directInactive && parent._inactive) { +// inactive = true; +// } +// parent = parent.$parent; +// } +// data.routerViewDepth = depth; + +// // render previous view if the tree is inactive and kept-alive +// if (inactive) { +// var cachedData = cache[name]; +// var cachedComponent = cachedData && cachedData.component; +// if (cachedComponent) { +// // #2301 +// // pass props +// if (cachedData.configProps) { +// fillPropsinData(cachedComponent, data, cachedData.route, cachedData.configProps); +// } +// return h(cachedComponent, data, children) +// } else { +// // render previous empty view +// return h() +// } +// } + +// var matched = route.matched[depth]; +// var component = matched && matched.components[name]; + +// // render empty node if no matched route or no config component +// if (!matched || !component) { +// cache[name] = null; +// return h() +// } + +// // cache component +// cache[name] = { component: component }; + +// // attach instance registration hook +// // this will be called in the instance's injected lifecycle hooks +// data.registerRouteInstance = function (vm, val) { +// // val could be undefined for unregistration +// var current = matched.instances[name]; +// if ( +// (val && current !== vm) || +// (!val && current === vm) +// ) { +// matched.instances[name] = val; +// } +// } + +// // also register instance in prepatch hook +// // in case the same component instance is reused across different routes +// ;(data.hook || (data.hook = {})).prepatch = function (_, vnode) { +// matched.instances[name] = vnode.componentInstance; +// }; + +// // register instance in init hook +// // in case kept-alive component be actived when routes changed +// data.hook.init = function (vnode) { +// if (vnode.data.keepAlive && +// vnode.componentInstance && +// vnode.componentInstance !== matched.instances[name] +// ) { +// matched.instances[name] = vnode.componentInstance; +// } + +// // if the route transition has already been confirmed then we weren't +// // able to call the cbs during confirmation as the component was not +// // registered yet, so we call it here. +// handleRouteEntered(route); +// }; + +// var configProps = matched.props && matched.props[name]; +// // save route and configProps in cache +// if (configProps) { +// extend(cache[name], { +// route: route, +// configProps: configProps +// }); +// fillPropsinData(component, data, route, configProps); +// } + +// return h(component, data, children) +// } +// }; + +// function fillPropsinData (component, data, route, configProps) { +// // resolve props +// var propsToPass = data.props = resolveProps(route, configProps); +// if (propsToPass) { +// // clone to prevent mutation +// propsToPass = data.props = extend({}, propsToPass); +// // pass non-declared props as attrs +// var attrs = data.attrs = data.attrs || {}; +// for (var key in propsToPass) { +// if (!component.props || !(key in component.props)) { +// attrs[key] = propsToPass[key]; +// delete propsToPass[key]; +// } +// } +// } +// } + +// function resolveProps (route, config) { +// switch (typeof config) { +// case 'undefined': +// return +// case 'object': +// return config +// case 'function': +// return config(route) +// case 'boolean': +// return config ? route.params : undefined +// default: +// { +// warn( +// false, +// "props in \"" + (route.path) + "\" is a " + (typeof config) + ", " + +// "expecting an object, function or boolean." +// ); +// } +// } +// } + +/* */ + +function resolvePath(relative, base, append) { + const firstChar = relative.charAt(0); + if (firstChar === '/') { + return relative; + } + + if (firstChar === '?' || firstChar === '#') { + return base + relative; + } + + const stack = base.split('/'); + + // remove trailing segment if: + // - not appending + // - appending to trailing slash (last segment is empty) + if (!append || !stack[stack.length - 1]) { + stack.pop(); + } + + // resolve relative path + const segments = relative.replace(/^\//, '').split('/'); + for (let i = 0; i < segments.length; i++) { + const segment = segments[i]; + if (segment === '..') { + stack.pop(); + } else if (segment !== '.') { + stack.push(segment); + } + } + + // ensure leading slash + if (stack[0] !== '') { + stack.unshift(''); + } + + return stack.join('/'); +} + +function parsePath(path) { + let hash = ''; + let query = ''; + + const hashIndex = path.indexOf('#'); + if (hashIndex >= 0) { + hash = path.slice(hashIndex); + path = path.slice(0, hashIndex); + } + + const queryIndex = path.indexOf('?'); + if (queryIndex >= 0) { + query = path.slice(queryIndex + 1); + path = path.slice(0, queryIndex); + } + + return { + path, + query, + hash, + }; +} + +function cleanPath(path) { + return path.replace(/\/\//g, '/'); +} + +const isarray = + Array.isArray || + function (arr) { + return Object.prototype.toString.call(arr) == '[object Array]'; + }; + +/** + * Expose `pathToRegexp`. + */ +const pathToRegexp_1 = pathToRegexp; +const parse_1 = parse; +const compile_1 = compile; +const tokensToFunction_1 = tokensToFunction; +const tokensToRegExp_1 = tokensToRegExp; + +/** + * The main path matching regexp utility. + * + * @type {RegExp} + */ +const PATH_REGEXP = new RegExp( + [ + // Match escaped characters that would otherwise appear in future matches. + // This allows the user to escape special characters that won't transform. + '(\\\\.)', + // Match Express-style parameters and un-named parameters with a prefix + // and optional suffixes. Matches appear as: + // + // "/:test(\\d+)?" => ["/", "test", "\d+", undefined, "?", undefined] + // "/route(\\d+)" => [undefined, undefined, undefined, "\d+", undefined, undefined] + // "/*" => ["/", undefined, undefined, undefined, undefined, "*"] + '([\\/.])?(?:(?:\\:(\\w+)(?:\\(((?:\\\\.|[^\\\\()])+)\\))?|\\(((?:\\\\.|[^\\\\()])+)\\))([+*?])?|(\\*))', + ].join('|'), + 'g' +); + +/** + * Parse a string for the raw tokens. + * + * @param {string} str + * @param {Object=} options + * @return {!Array} + */ +function parse(str, options) { + const tokens = []; + let key = 0; + let index = 0; + let path = ''; + const defaultDelimiter = (options && options.delimiter) || '/'; + let res; + + while ((res = PATH_REGEXP.exec(str)) != null) { + const m = res[0]; + const escaped = res[1]; + const offset = res.index; + path += str.slice(index, offset); + index = offset + m.length; + + // Ignore already escaped sequences. + if (escaped) { + path += escaped[1]; + continue; + } + + const next = str[index]; + const prefix = res[2]; + const name = res[3]; + const capture = res[4]; + const group = res[5]; + const modifier = res[6]; + const asterisk = res[7]; + + // Push the current path onto the tokens. + if (path) { + tokens.push(path); + path = ''; + } + + const partial = prefix != null && next != null && next !== prefix; + const repeat = modifier === '+' || modifier === '*'; + const optional = modifier === '?' || modifier === '*'; + const delimiter = res[2] || defaultDelimiter; + const pattern = capture || group; + + tokens.push({ + name: name || key++, + prefix: prefix || '', + delimiter, + optional, + repeat, + partial, + asterisk: !!asterisk, + pattern: pattern ? escapeGroup(pattern) : asterisk ? '.*' : `[^${escapeString(delimiter)}]+?`, + }); + } + + // Match any characters still remaining. + if (index < str.length) { + path += str.substr(index); + } + + // If the path exists, push it onto the end. + if (path) { + tokens.push(path); + } + + return tokens; +} + +/** + * Compile a string to a template function for the path. + * + * @param {string} str + * @param {Object=} options + * @return {!function(Object=, Object=)} + */ +function compile(str, options) { + return tokensToFunction(parse(str, options), options); +} + +/** + * Prettier encoding of URI path segments. + * + * @param {string} + * @return {string} + */ +function encodeURIComponentPretty(str) { + return encodeURI(str).replace(/[\/?#]/g, c => `%${c.charCodeAt(0).toString(16).toUpperCase()}`); +} + +/** + * Encode the asterisk parameter. Similar to `pretty`, but allows slashes. + * + * @param {string} + * @return {string} + */ +function encodeAsterisk(str) { + return encodeURI(str).replace(/[?#]/g, c => `%${c.charCodeAt(0).toString(16).toUpperCase()}`); +} + +/** + * Expose a method for transforming tokens into the path function. + */ +function tokensToFunction(tokens, options) { + // Compile all the tokens into regexps. + const matches = new Array(tokens.length); + + // Compile all the patterns before compilation. + for (let i = 0; i < tokens.length; i++) { + if (typeof tokens[i] === 'object') { + matches[i] = new RegExp(`^(?:${tokens[i].pattern})$`, flags(options)); + } + } + + return function (obj, opts) { + let path = ''; + const data = obj || {}; + const options = opts || {}; + const encode = options.pretty ? encodeURIComponentPretty : encodeURIComponent; + + for (let i = 0; i < tokens.length; i++) { + const token = tokens[i]; + + if (typeof token === 'string') { + path += token; + + continue; + } + + const value = data[token.name]; + var segment; + + if (value == null) { + if (token.optional) { + // Prepend partial segment prefixes. + if (token.partial) { + path += token.prefix; + } + + continue; + } else { + throw new TypeError(`Expected "${token.name}" to be defined`); + } + } + + if (isarray(value)) { + if (!token.repeat) { + throw new TypeError( + `Expected "${token.name}" to not repeat, but received \`${JSON.stringify(value)}\`` + ); + } + + if (value.length === 0) { + if (token.optional) { + continue; + } else { + throw new TypeError(`Expected "${token.name}" to not be empty`); + } + } + + for (let j = 0; j < value.length; j++) { + segment = encode(value[j]); + + if (!matches[i].test(segment)) { + throw new TypeError( + `Expected all "${token.name}" to match "${token.pattern}", but received \`${JSON.stringify( + segment + )}\`` + ); + } + + path += (j === 0 ? token.prefix : token.delimiter) + segment; + } + + continue; + } + + segment = token.asterisk ? encodeAsterisk(value) : encode(value); + + if (!matches[i].test(segment)) { + throw new TypeError(`Expected "${token.name}" to match "${token.pattern}", but received "${segment}"`); + } + + path += token.prefix + segment; + } + + return path; + }; +} + +/** + * Escape a regular expression string. + * + * @param {string} str + * @return {string} + */ +function escapeString(str) { + return str.replace(/([.+*?=^!:${}()[\]|\/\\])/g, '\\$1'); +} + +/** + * Escape the capturing group by escaping special characters and meaning. + * + * @param {string} group + * @return {string} + */ +function escapeGroup(group) { + return group.replace(/([=!:$\/()])/g, '\\$1'); +} + +/** + * Attach the keys as a property of the regexp. + * + * @param {!RegExp} re + * @param {Array} keys + * @return {!RegExp} + */ +function attachKeys(re, keys) { + re.keys = keys; + + return re; +} + +/** + * Get the flags for a regexp from the options. + * + * @param {Object} options + * @return {string} + */ +function flags(options) { + return options && options.sensitive ? '' : 'i'; +} + +/** + * Pull out keys from a regexp. + * + * @param {!RegExp} path + * @param {!Array} keys + * @return {!RegExp} + */ +function regexpToRegexp(path, keys) { + // Use a negative lookahead to match only capturing groups. + const groups = path.source.match(/\((?!\?)/g); + + if (groups) { + for (let i = 0; i < groups.length; i++) { + keys.push({ + name: i, + prefix: null, + delimiter: null, + optional: false, + repeat: false, + partial: false, + asterisk: false, + pattern: null, + }); + } + } + + return attachKeys(path, keys); +} + +/** + * Transform an array into a regexp. + * + * @param {!Array} path + * @param {Array} keys + * @param {!Object} options + * @return {!RegExp} + */ +function arrayToRegexp(path, keys, options) { + const parts = []; + + for (let i = 0; i < path.length; i++) { + parts.push(pathToRegexp(path[i], keys, options).source); + } + + const regexp = new RegExp(`(?:${parts.join('|')})`, flags(options)); + + return attachKeys(regexp, keys); +} + +/** + * Create a path regexp from string input. + * + * @param {string} path + * @param {!Array} keys + * @param {!Object} options + * @return {!RegExp} + */ +function stringToRegexp(path, keys, options) { + return tokensToRegExp(parse(path, options), keys, options); +} + +/** + * Expose a function for taking tokens and returning a RegExp. + * + * @param {!Array} tokens + * @param {(Array|Object)=} keys + * @param {Object=} options + * @return {!RegExp} + */ +function tokensToRegExp(tokens, keys, options) { + if (!isarray(keys)) { + options = /** @type {!Object} */ (keys || options); + keys = []; + } + + options = options || {}; + + const strict = options.strict; + const end = options.end !== false; + let route = ''; + + // Iterate over the tokens and create our regexp string. + for (let i = 0; i < tokens.length; i++) { + const token = tokens[i]; + + if (typeof token === 'string') { + route += escapeString(token); + } else { + const prefix = escapeString(token.prefix); + let capture = `(?:${token.pattern})`; + + keys.push(token); + + if (token.repeat) { + capture += `(?:${prefix}${capture})*`; + } + + if (token.optional) { + if (!token.partial) { + capture = `(?:${prefix}(${capture}))?`; + } else { + capture = `${prefix}(${capture})?`; + } + } else { + capture = `${prefix}(${capture})`; + } + + route += capture; + } + } + + const delimiter = escapeString(options.delimiter || '/'); + const endsWithDelimiter = route.slice(-delimiter.length) === delimiter; + + // In non-strict mode we allow a slash at the end of match. If the path to + // match already ends with a slash, we remove it for consistency. The slash + // is valid at the end of a path match, not in the middle. This is important + // in non-ending mode, where "/test/" shouldn't match "/test//route". + if (!strict) { + route = `${endsWithDelimiter ? route.slice(0, -delimiter.length) : route}(?:${delimiter}(?=$))?`; + } + + if (end) { + route += '$'; + } else { + // In non-ending mode, we need the capturing groups to match as much as + // possible by using a positive lookahead to the end or next path segment. + route += strict && endsWithDelimiter ? '' : `(?=${delimiter}|$)`; + } + + return attachKeys(new RegExp(`^${route}`, flags(options)), keys); +} + +/** + * Normalize the given path string, returning a regular expression. + * + * An empty array can be passed in for the keys, which will hold the + * placeholder key descriptions. For example, using `/user/:id`, `keys` will + * contain `[{ name: 'id', delimiter: '/', optional: false, repeat: false }]`. + * + * @param {(string|RegExp|Array)} path + * @param {(Array|Object)=} keys + * @param {Object=} options + * @return {!RegExp} + */ +function pathToRegexp(path, keys, options) { + if (!isarray(keys)) { + options = /** @type {!Object} */ (keys || options); + keys = []; + } + + options = options || {}; + + if (path instanceof RegExp) { + return regexpToRegexp(path, /** @type {!Array} */ (keys)); + } + + if (isarray(path)) { + return arrayToRegexp(/** @type {!Array} */ (path), /** @type {!Array} */ (keys), options); + } + + return stringToRegexp(/** @type {string} */ (path), /** @type {!Array} */ (keys), options); +} +pathToRegexp_1.parse = parse_1; +pathToRegexp_1.compile = compile_1; +pathToRegexp_1.tokensToFunction = tokensToFunction_1; +pathToRegexp_1.tokensToRegExp = tokensToRegExp_1; + +/* */ + +// $flow-disable-line +const regexpCompileCache = Object.create(null); + +function fillParams(path, params, routeMsg) { + params = params || {}; + try { + const filler = regexpCompileCache[path] || (regexpCompileCache[path] = pathToRegexp_1.compile(path)); + + // Fix #2505 resolving asterisk routes { name: 'not-found', params: { pathMatch: '/not-found' }} + // and fix #3106 so that you can work with location descriptor object having params.pathMatch equal to empty string + if (typeof params.pathMatch === 'string') { + params[0] = params.pathMatch; + } + + return filler(params, { pretty: true }); + } catch (e) { + { + // Fix #3072 no warn if `pathMatch` is string + warn(typeof params.pathMatch === 'string', `missing param for ${routeMsg}: ${e.message}`); + } + + return ''; + } finally { + // delete the 0 if it was added + delete params[0]; + } +} + +/* */ + +function normalizeLocation(raw, current, append, router) { + let next = typeof raw === 'string' ? { path: raw } : raw; + // named target + if (next._normalized) { + return next; + } else if (next.name) { + next = extend({}, raw); + const params = next.params; + if (params && typeof params === 'object') { + next.params = extend({}, params); + } + + return next; + } + + // relative params + if (!next.path && next.params && current) { + next = extend({}, next); + next._normalized = true; + const params$1 = extend(extend({}, current.params), next.params); + if (current.name) { + next.name = current.name; + next.params = params$1; + } else if (current.matched.length) { + const rawPath = current.matched[current.matched.length - 1].path; + next.path = fillParams(rawPath, params$1, `path ${current.path}`); + } else { + warn(false, 'relative params navigation requires a current route.'); + } + + return next; + } + + const parsedPath = parsePath(next.path || ''); + const basePath = (current && current.path) || '/'; + const path = parsedPath.path ? resolvePath(parsedPath.path, basePath, append || next.append) : basePath; + + const query = resolveQuery(parsedPath.query, next.query, router && router.options.parseQuery); + + let hash = next.hash || parsedPath.hash; + if (hash && hash.charAt(0) !== '#') { + hash = `#${hash}`; + } + + return { + _normalized: true, + path, + query, + hash, + }; +} + +// var toTypes = [String, Object]; +// var eventTypes = [String, Array]; + +// var noop = function () {}; + +// var warnedCustomSlot; +// var warnedTagProp; +// var warnedEventProp; + +// var Link = { +// name: 'RouterLink', +// props: { +// to: { +// type: toTypes, +// required: true +// }, +// tag: { +// type: String, +// default: 'a' +// }, +// custom: Boolean, +// exact: Boolean, +// exactPath: Boolean, +// append: Boolean, +// replace: Boolean, +// activeClass: String, +// exactActiveClass: String, +// ariaCurrentValue: { +// type: String, +// default: 'page' +// }, +// event: { +// type: eventTypes, +// default: 'click' +// } +// }, +// render: function render (h) { +// var this$1 = this; + +// var router = this.$router; +// var current = this.$route; +// var ref = router.resolve( +// this.to, +// current, +// this.append +// ); +// var location = ref.location; +// var route = ref.route; +// var href = ref.href; + +// var classes = {}; +// var globalActiveClass = router.options.linkActiveClass; +// var globalExactActiveClass = router.options.linkExactActiveClass; +// // Support global empty active class +// var activeClassFallback = +// globalActiveClass == null ? 'router-link-active' : globalActiveClass; +// var exactActiveClassFallback = +// globalExactActiveClass == null +// ? 'router-link-exact-active' +// : globalExactActiveClass; +// var activeClass = +// this.activeClass == null ? activeClassFallback : this.activeClass; +// var exactActiveClass = +// this.exactActiveClass == null +// ? exactActiveClassFallback +// : this.exactActiveClass; + +// var compareTarget = route.redirectedFrom +// ? createRoute(null, normalizeLocation(route.redirectedFrom), null, router) +// : route; + +// classes[exactActiveClass] = isSameRoute(current, compareTarget, this.exactPath); +// classes[activeClass] = this.exact || this.exactPath +// ? classes[exactActiveClass] +// : isIncludedRoute(current, compareTarget); + +// var ariaCurrentValue = classes[exactActiveClass] ? this.ariaCurrentValue : null; + +// var handler = function (e) { +// if (guardEvent(e)) { +// if (this$1.replace) { +// router.replace(location, noop); +// } else { +// router.push(location, noop); +// } +// } +// }; + +// var on = { click: guardEvent }; +// if (Array.isArray(this.event)) { +// this.event.forEach(function (e) { +// on[e] = handler; +// }); +// } else { +// on[this.event] = handler; +// } + +// var data = { class: classes }; + +// var scopedSlot = +// !this.$scopedSlots.$hasNormal && +// this.$scopedSlots.default && +// this.$scopedSlots.default({ +// href: href, +// route: route, +// navigate: handler, +// isActive: classes[activeClass], +// isExactActive: classes[exactActiveClass] +// }); + +// if (scopedSlot) { +// if (!this.custom) { +// !warnedCustomSlot && warn(false, 'In Vue Router 4, the v-slot API will by default wrap its content with an element. Use the custom prop to remove this warning:\n\n'); +// warnedCustomSlot = true; +// } +// if (scopedSlot.length === 1) { +// return scopedSlot[0] +// } else if (scopedSlot.length > 1 || !scopedSlot.length) { +// { +// warn( +// false, +// (" with to=\"" + (this.to) + "\" is trying to use a scoped slot but it didn't provide exactly one child. Wrapping the content with a span element.") +// ); +// } +// return scopedSlot.length === 0 ? h() : h('span', {}, scopedSlot) +// } +// } + +// { +// if ('tag' in this.$options.propsData && !warnedTagProp) { +// warn( +// false, +// "'s tag prop is deprecated and has been removed in Vue Router 4. Use the v-slot API to remove this warning: https://next.router.vuejs.org/guide/migration/#removal-of-event-and-tag-props-in-router-link." +// ); +// warnedTagProp = true; +// } +// if ('event' in this.$options.propsData && !warnedEventProp) { +// warn( +// false, +// "'s event prop is deprecated and has been removed in Vue Router 4. Use the v-slot API to remove this warning: https://next.router.vuejs.org/guide/migration/#removal-of-event-and-tag-props-in-router-link." +// ); +// warnedEventProp = true; +// } +// } + +// if (this.tag === 'a') { +// data.on = on; +// data.attrs = { href: href, 'aria-current': ariaCurrentValue }; +// } else { +// // find the first child and apply listener and href +// var a = findAnchor(this.$slots.default); +// if (a) { +// // in case the is a static node +// a.isStatic = false; +// var aData = (a.data = extend({}, a.data)); +// aData.on = aData.on || {}; +// // transform existing events in both objects into arrays so we can push later +// for (var event in aData.on) { +// var handler$1 = aData.on[event]; +// if (event in on) { +// aData.on[event] = Array.isArray(handler$1) ? handler$1 : [handler$1]; +// } +// } +// // append new listeners for router-link +// for (var event$1 in on) { +// if (event$1 in aData.on) { +// // on[event] is always a function +// aData.on[event$1].push(on[event$1]); +// } else { +// aData.on[event$1] = handler; +// } +// } + +// var aAttrs = (a.data.attrs = extend({}, a.data.attrs)); +// aAttrs.href = href; +// aAttrs['aria-current'] = ariaCurrentValue; +// } else { +// // doesn't have child, apply listener to self +// data.on = on; +// } +// } + +// return h(this.tag, data, this.$slots.default) +// } +// }; + +function guardEvent(e) { + // don't redirect with control keys + if (e.metaKey || e.altKey || e.ctrlKey || e.shiftKey) { + return; + } + // don't redirect when preventDefault called + if (e.defaultPrevented) { + return; + } + // don't redirect on right click + if (e.button !== undefined && e.button !== 0) { + return; + } + // don't redirect if `target="_blank"` + if (e.currentTarget && e.currentTarget.getAttribute) { + const target = e.currentTarget.getAttribute('target'); + if (/\b_blank\b/i.test(target)) { + return; + } + } + // this may be a Weex event which doesn't have this method + if (e.preventDefault) { + e.preventDefault(); + } + + return true; +} + +function findAnchor(children) { + if (children) { + let child; + for (let i = 0; i < children.length; i++) { + child = children[i]; + if (child.tag === 'a') { + return child; + } + if (child.children && (child = findAnchor(child.children))) { + return child; + } + } + } +} + +// var _Vue; + +// function install (Vue) { +// if (install.installed && _Vue === Vue) { return } +// install.installed = true; + +// _Vue = Vue; + +// var isDef = function (v) { return v !== undefined; }; + +// var registerInstance = function (vm, callVal) { +// var i = vm.$options._parentVnode; +// if (isDef(i) && isDef(i = i.data) && isDef(i = i.registerRouteInstance)) { +// i(vm, callVal); +// } +// }; + +// Vue.mixin({ +// beforeCreate: function beforeCreate () { +// if (isDef(this.$options.router)) { +// this._routerRoot = this; +// this._router = this.$options.router; +// this._router.init(this); +// Vue.util.defineReactive(this, '_route', this._router.history.current); +// } else { +// this._routerRoot = (this.$parent && this.$parent._routerRoot) || this; +// } +// registerInstance(this, this); +// }, +// destroyed: function destroyed () { +// registerInstance(this); +// } +// }); + +// Object.defineProperty(Vue.prototype, '$router', { +// get: function get () { return this._routerRoot._router } +// }); + +// Object.defineProperty(Vue.prototype, '$route', { +// get: function get () { return this._routerRoot._route } +// }); + +// Vue.component('RouterView', View); +// Vue.component('RouterLink', Link); + +// var strats = Vue.config.optionMergeStrategies; +// // use the same hook merging strategy for route hooks +// strats.beforeRouteEnter = strats.beforeRouteLeave = strats.beforeRouteUpdate = strats.created; +// } + +/* */ + +const inBrowser = typeof window !== 'undefined'; + +/* */ + +function createRouteMap(routes, oldPathList, oldPathMap, oldNameMap, parentRoute) { + // the path list is used to control path matching priority + const pathList = oldPathList || []; + // $flow-disable-line + const pathMap = oldPathMap || Object.create(null); + // $flow-disable-line + const nameMap = oldNameMap || Object.create(null); + + routes.forEach(route => { + addRouteRecord(pathList, pathMap, nameMap, route, parentRoute); + }); + + // ensure wildcard routes are always at the end + for (let i = 0, l = pathList.length; i < l; i++) { + if (pathList[i] === '*') { + pathList.push(pathList.splice(i, 1)[0]); + l--; + i--; + } + } + + { + // warn if routes do not include leading slashes + const found = pathList + // check for missing leading slash + .filter(path => path && path.charAt(0) !== '*' && path.charAt(0) !== '/'); + + if (found.length > 0) { + const pathNames = found.map(path => `- ${path}`).join('\n'); + warn( + false, + `Non-nested routes must include a leading slash character. Fix the following routes: \n${pathNames}` + ); + } + } + + return { + pathList, + pathMap, + nameMap, + }; +} + +function addRouteRecord(pathList, pathMap, nameMap, route, parent, matchAs) { + const path = route.path; + const name = route.name; + { + assert(path != null, '"path" is required in a route configuration.'); + assert( + typeof route.component !== 'string', + `route config "component" for path: ${String(path || name)} cannot be a ` + + 'string id. Use an actual component instead.' + ); + + warn( + // eslint-disable-next-line no-control-regex + !/[^\u0000-\u007F]+/.test(path), + `Route with path "${path}" contains unencoded characters, make sure ` + + 'your path is correctly encoded before passing it to the router. Use ' + + 'encodeURI to encode static segments of your path.' + ); + } + + const pathToRegexpOptions = route.pathToRegexpOptions || {}; + const normalizedPath = normalizePath(path, parent, pathToRegexpOptions.strict); + + if (typeof route.caseSensitive === 'boolean') { + pathToRegexpOptions.sensitive = route.caseSensitive; + } + + const record = { + path: normalizedPath, + regex: compileRouteRegex(normalizedPath, pathToRegexpOptions), + components: route.components || { default: route.component }, + alias: route.alias ? (typeof route.alias === 'string' ? [route.alias] : route.alias) : [], + instances: {}, + enteredCbs: {}, + name, + parent, + matchAs, + redirect: route.redirect, + beforeEnter: route.beforeEnter, + meta: route.meta || {}, + props: route.props == null ? {} : route.components ? route.props : { default: route.props }, + }; + + if (route.children) { + // Warn if route is named, does not redirect and has a default child route. + // If users navigate to this route by name, the default child will + // not be rendered (GH Issue #629) + { + if (route.name && !route.redirect && route.children.some(child => /^\/?$/.test(child.path))) { + warn( + false, + `Named Route '${route.name}' has a default child route. ` + + `When navigating to this named route (:to="{name: '${route.name}'"), ` + + 'the default child route will not be rendered. Remove the name from ' + + 'this route and use the name of the default child route for named ' + + 'links instead.' + ); + } + } + route.children.forEach(child => { + const childMatchAs = matchAs ? cleanPath(`${matchAs}/${child.path}`) : undefined; + addRouteRecord(pathList, pathMap, nameMap, child, record, childMatchAs); + }); + } + + if (!pathMap[record.path]) { + pathList.push(record.path); + pathMap[record.path] = record; + } + + if (route.alias !== undefined) { + const aliases = Array.isArray(route.alias) ? route.alias : [route.alias]; + for (let i = 0; i < aliases.length; ++i) { + const alias = aliases[i]; + if (alias === path) { + warn( + false, + `Found an alias with the same value as the path: "${path}". You have to remove that alias. It will be ignored in development.` + ); + // skip in dev to make it work + continue; + } + + const aliasRoute = { + path: alias, + children: route.children, + }; + addRouteRecord( + pathList, + pathMap, + nameMap, + aliasRoute, + parent, + record.path || '/' // matchAs + ); + } + } + + if (name) { + if (!nameMap[name]) { + nameMap[name] = record; + } else if (!matchAs) { + warn(false, `${'Duplicate named routes definition: ' + '{ name: "'}${name}", path: "${record.path}" }`); + } + } +} + +function compileRouteRegex(path, pathToRegexpOptions) { + const regex = pathToRegexp_1(path, [], pathToRegexpOptions); + { + const keys = Object.create(null); + regex.keys.forEach(key => { + warn(!keys[key.name], `Duplicate param keys in route with path: "${path}"`); + keys[key.name] = true; + }); + } + + return regex; +} + +function normalizePath(path, parent, strict) { + if (!strict) { + path = path.replace(/\/$/, ''); + } + if (path[0] === '/') { + return path; + } + if (parent == null) { + return path; + } + + return cleanPath(`${parent.path}/${path}`); +} + +/* */ + +function createMatcher(routes, router) { + const ref = createRouteMap(routes); + const pathList = ref.pathList; + const pathMap = ref.pathMap; + const nameMap = ref.nameMap; + + function addRoutes(routes) { + createRouteMap(routes, pathList, pathMap, nameMap); + } + + function addRoute(parentOrRoute, route) { + const parent = typeof parentOrRoute !== 'object' ? nameMap[parentOrRoute] : undefined; + // $flow-disable-line + createRouteMap([route || parentOrRoute], pathList, pathMap, nameMap, parent); + + // add aliases of parent + if (parent && parent.alias.length) { + createRouteMap( + // $flow-disable-line route is defined if parent is + parent.alias.map(alias => { + return { path: alias, children: [route] }; + }), + pathList, + pathMap, + nameMap, + parent + ); + } + } + + function getRoutes() { + return pathList.map(path => pathMap[path]); + } + + function match(raw, currentRoute, redirectedFrom) { + const location = normalizeLocation(raw, currentRoute, false, router); + const name = location.name; + + if (name) { + const record = nameMap[name]; + { + warn(record, `Route with name '${name}' does not exist`); + } + if (!record) { + return _createRoute(null, location); + } + const paramNames = record.regex.keys.filter(key => !key.optional).map(key => key.name); + + if (typeof location.params !== 'object') { + location.params = {}; + } + + if (currentRoute && typeof currentRoute.params === 'object') { + for (const key in currentRoute.params) { + if (!(key in location.params) && paramNames.indexOf(key) > -1) { + location.params[key] = currentRoute.params[key]; + } + } + } + + location.path = fillParams(record.path, location.params, `named route "${name}"`); + + return _createRoute(record, location, redirectedFrom); + } else if (location.path) { + location.params = {}; + for (let i = 0; i < pathList.length; i++) { + const path = pathList[i]; + const record$1 = pathMap[path]; + if (matchRoute(record$1.regex, location.path, location.params)) { + return _createRoute(record$1, location, redirectedFrom); + } + } + } + // no match + return _createRoute(null, location); + } + + function redirect(record, location) { + const originalRedirect = record.redirect; + let redirect = + typeof originalRedirect === 'function' + ? originalRedirect(createRoute(record, location, null, router)) + : originalRedirect; + + if (typeof redirect === 'string') { + redirect = { path: redirect }; + } + + if (!redirect || typeof redirect !== 'object') { + { + warn(false, `invalid redirect option: ${JSON.stringify(redirect)}`); + } + + return _createRoute(null, location); + } + + const re = redirect; + const name = re.name; + const path = re.path; + let query = location.query; + let hash = location.hash; + let params = location.params; + query = re.hasOwnProperty('query') ? re.query : query; + hash = re.hasOwnProperty('hash') ? re.hash : hash; + params = re.hasOwnProperty('params') ? re.params : params; + + if (name) { + // resolved named direct + const targetRecord = nameMap[name]; + { + assert(targetRecord, `redirect failed: named route "${name}" not found.`); + } + + return match( + { + _normalized: true, + name, + query, + hash, + params, + }, + undefined, + location + ); + } else if (path) { + // 1. resolve relative redirect + const rawPath = resolveRecordPath(path, record); + // 2. resolve params + const resolvedPath = fillParams(rawPath, params, `redirect route with path "${rawPath}"`); + // 3. rematch with existing query and hash + return match( + { + _normalized: true, + path: resolvedPath, + query, + hash, + }, + undefined, + location + ); + } else { + { + warn(false, `invalid redirect option: ${JSON.stringify(redirect)}`); + } + + return _createRoute(null, location); + } + } + + function alias(record, location, matchAs) { + const aliasedPath = fillParams(matchAs, location.params, `aliased route with path "${matchAs}"`); + const aliasedMatch = match({ + _normalized: true, + path: aliasedPath, + }); + if (aliasedMatch) { + const matched = aliasedMatch.matched; + const aliasedRecord = matched[matched.length - 1]; + location.params = aliasedMatch.params; + + return _createRoute(aliasedRecord, location); + } + + return _createRoute(null, location); + } + + function _createRoute(record, location, redirectedFrom) { + if (record && record.redirect) { + return redirect(record, redirectedFrom || location); + } + if (record && record.matchAs) { + return alias(record, location, record.matchAs); + } + + return createRoute(record, location, redirectedFrom, router); + } + + return { + match, + addRoute, + getRoutes, + addRoutes, + }; +} + +function matchRoute(regex, path, params) { + const m = path.match(regex); + + if (!m) { + return false; + } else if (!params) { + return true; + } + + for (let i = 1, len = m.length; i < len; ++i) { + const key = regex.keys[i - 1]; + if (key) { + // Fix #1994: using * with props: true generates a param named 0 + params[key.name || 'pathMatch'] = typeof m[i] === 'string' ? decode(m[i]) : m[i]; + } + } + + return true; +} + +function resolveRecordPath(path, record) { + return resolvePath(path, record.parent ? record.parent.path : '/', true); +} + +/* */ + +// use User Timing api (if present) for more accurate key precision +const Time = inBrowser && window.performance && window.performance.now ? window.performance : Date; + +function genStateKey() { + return Time.now().toFixed(3); +} + +let _key = genStateKey(); + +function getStateKey() { + return _key; +} + +function setStateKey(key) { + return (_key = key); +} + +/* */ + +const positionStore = Object.create(null); + +function setupScroll() { + // Prevent browser scroll behavior on History popstate + if ('scrollRestoration' in window.history) { + window.history.scrollRestoration = 'manual'; + } + // Fix for #1585 for Firefox + // Fix for #2195 Add optional third attribute to workaround a bug in safari https://bugs.webkit.org/show_bug.cgi?id=182678 + // Fix for #2774 Support for apps loaded from Windows file shares not mapped to network drives: replaced location.origin with + // window.location.protocol + '//' + window.location.host + // location.host contains the port and location.hostname doesn't + const protocolAndPath = `${window.location.protocol}//${window.location.host}`; + const absolutePath = window.location.href.replace(protocolAndPath, ''); + // preserve existing history state as it could be overriden by the user + const stateCopy = extend({}, window.history.state); + stateCopy.key = getStateKey(); + window.history.replaceState(stateCopy, '', absolutePath); + window.addEventListener('popstate', handlePopState); + + return function () { + window.removeEventListener('popstate', handlePopState); + }; +} + +function handleScroll(router, to, from, isPop) { + if (!router.app) { + return; + } + + const behavior = router.options.scrollBehavior; + if (!behavior) { + return; + } + + { + assert(typeof behavior === 'function', 'scrollBehavior must be a function'); + } + + // wait until re-render finishes before scrolling + nextTick(() => { + const position = getScrollPosition(); + const shouldScroll = behavior.call(router, to, from, isPop ? position : null); + + if (!shouldScroll) { + return; + } + + if (typeof shouldScroll.then === 'function') { + shouldScroll + .then(shouldScroll => { + scrollToPosition(shouldScroll, position); + }) + .catch(err => { + { + assert(false, err.toString()); + } + }); + } else { + scrollToPosition(shouldScroll, position); + } + }); +} + +function saveScrollPosition() { + const key = getStateKey(); + if (key) { + positionStore[key] = { + x: window.pageXOffset, + y: window.pageYOffset, + }; + } +} + +function handlePopState(e) { + saveScrollPosition(); + if (e.state && e.state.key) { + setStateKey(e.state.key); + } +} + +function getScrollPosition() { + const key = getStateKey(); + if (key) { + return positionStore[key]; + } +} + +function getElementPosition(el, offset) { + const docEl = document.documentElement; + const docRect = docEl.getBoundingClientRect(); + const elRect = el.getBoundingClientRect(); + + return { + x: elRect.left - docRect.left - offset.x, + y: elRect.top - docRect.top - offset.y, + }; +} + +function isValidPosition(obj) { + return isNumber(obj.x) || isNumber(obj.y); +} + +function normalizePosition(obj) { + return { + x: isNumber(obj.x) ? obj.x : window.pageXOffset, + y: isNumber(obj.y) ? obj.y : window.pageYOffset, + }; +} + +function normalizeOffset(obj) { + return { + x: isNumber(obj.x) ? obj.x : 0, + y: isNumber(obj.y) ? obj.y : 0, + }; +} + +function isNumber(v) { + return typeof v === 'number'; +} + +const hashStartsWithNumberRE = /^#\d/; + +function scrollToPosition(shouldScroll, position) { + const isObject = typeof shouldScroll === 'object'; + if (isObject && typeof shouldScroll.selector === 'string') { + // getElementById would still fail if the selector contains a more complicated query like #main[data-attr] + // but at the same time, it doesn't make much sense to select an element with an id and an extra selector + const el = hashStartsWithNumberRE.test(shouldScroll.selector) // $flow-disable-line + ? document.getElementById(shouldScroll.selector.slice(1)) // $flow-disable-line + : document.querySelector(shouldScroll.selector); + + if (el) { + let offset = shouldScroll.offset && typeof shouldScroll.offset === 'object' ? shouldScroll.offset : {}; + offset = normalizeOffset(offset); + position = getElementPosition(el, offset); + } else if (isValidPosition(shouldScroll)) { + position = normalizePosition(shouldScroll); + } + } else if (isObject && isValidPosition(shouldScroll)) { + position = normalizePosition(shouldScroll); + } + + if (position) { + // $flow-disable-line + if ('scrollBehavior' in document.documentElement.style) { + window.scrollTo({ + left: position.x, + top: position.y, + // $flow-disable-line + behavior: shouldScroll.behavior, + }); + } else { + window.scrollTo(position.x, position.y); + } + } +} + +/* */ + +const supportsPushState = + inBrowser && + (function () { + const ua = window.navigator.userAgent; + + if ( + (ua.indexOf('Android 2.') !== -1 || ua.indexOf('Android 4.0') !== -1) && + ua.indexOf('Mobile Safari') !== -1 && + ua.indexOf('Chrome') === -1 && + ua.indexOf('Windows Phone') === -1 + ) { + return false; + } + + return window.history && typeof window.history.pushState === 'function'; + })(); + +function pushState(url, replace) { + saveScrollPosition(); + // try...catch the pushState call to get around Safari + // DOM Exception 18 where it limits to 100 pushState calls + const history = window.history; + try { + if (replace) { + // preserve existing history state as it could be overriden by the user + const stateCopy = extend({}, history.state); + stateCopy.key = getStateKey(); + history.replaceState(stateCopy, '', url); + } else { + history.pushState({ key: setStateKey(genStateKey()) }, '', url); + } + } catch (e) { + window.location[replace ? 'replace' : 'assign'](url); + } +} + +function replaceState(url) { + pushState(url, true); +} + +/* */ + +function runQueue(queue, fn, cb) { + var step = function (index) { + if (index >= queue.length) { + cb(); + } else { + if (queue[index]) { + fn(queue[index], () => { + step(index + 1); + }); + } else { + step(index + 1); + } + } + }; + step(0); +} + +// When changing thing, also edit router.d.ts +const NavigationFailureType = { + redirected: 2, + aborted: 4, + cancelled: 8, + duplicated: 16, +}; + +function createNavigationRedirectedError(from, to) { + return createRouterError( + from, + to, + NavigationFailureType.redirected, + `Redirected when going from "${from.fullPath}" to "${stringifyRoute(to)}" via a navigation guard.` + ); +} + +function createNavigationDuplicatedError(from, to) { + const error = createRouterError( + from, + to, + NavigationFailureType.duplicated, + `Avoided redundant navigation to current location: "${from.fullPath}".` + ); + // backwards compatible with the first introduction of Errors + error.name = 'NavigationDuplicated'; + + return error; +} + +function createNavigationCancelledError(from, to) { + return createRouterError( + from, + to, + NavigationFailureType.cancelled, + `Navigation cancelled from "${from.fullPath}" to "${to.fullPath}" with a new navigation.` + ); +} + +function createNavigationAbortedError(from, to) { + return createRouterError( + from, + to, + NavigationFailureType.aborted, + `Navigation aborted from "${from.fullPath}" to "${to.fullPath}" via a navigation guard.` + ); +} + +function createRouterError(from, to, type, message) { + const error = new Error(message); + error._isRouter = true; + error.from = from; + error.to = to; + error.type = type; + + return error; +} + +const propertiesToLog = ['params', 'query', 'hash']; + +function stringifyRoute(to) { + if (typeof to === 'string') { + return to; + } + if ('path' in to) { + return to.path; + } + const location = {}; + propertiesToLog.forEach(key => { + if (key in to) { + location[key] = to[key]; + } + }); + + return JSON.stringify(location, null, 2); +} + +function isError(err) { + return Object.prototype.toString.call(err).indexOf('Error') > -1; +} + +function isNavigationFailure(err, errorType) { + return isError(err) && err._isRouter && (errorType == null || err.type === errorType); +} + +/* */ + +function resolveAsyncComponents(matched) { + return function (to, from, next) { + let hasAsync = false; + let pending = 0; + let error = null; + + flatMapComponents(matched, (def, _, match, key) => { + // if it's a function and doesn't have cid attached, + // assume it's an async component resolve function. + // we are not using Vue's default async resolving mechanism because + // we want to halt the navigation until the incoming component has been + // resolved. + if (typeof def === 'function' && def.cid === undefined) { + hasAsync = true; + pending++; + + const resolve = once(resolvedDef => { + if (isESModule(resolvedDef)) { + resolvedDef = resolvedDef.default; + } + // save resolved on async factory in case it's used elsewhere + def.resolved = resolvedDef; + match.components[key] = resolvedDef; + pending--; + if (pending <= 0) { + next(); + } + }); + + const reject = once(reason => { + const msg = `Failed to resolve async component ${key}: ${reason}`; + warn(false, msg); + if (!error) { + error = isError(reason) ? reason : new Error(msg); + next(error); + } + }); + + let res; + try { + res = def(resolve, reject); + } catch (e) { + reject(e); + } + if (res) { + if (typeof res.then === 'function') { + res.then(resolve, reject); + } else { + // new syntax in Vue 2.3 + const comp = res.component; + if (comp && typeof comp.then === 'function') { + comp.then(resolve, reject); + } + } + } + } + }); + + if (!hasAsync) { + next(); + } + }; +} + +function flatMapComponents(matched, fn) { + return flatten( + matched.map(m => Object.keys(m.components).map(key => fn(m.components[key], m.instances[key], m, key))) + ); +} + +function flatten(arr) { + return Array.prototype.concat.apply([], arr); +} + +const hasSymbol = typeof Symbol === 'function' && typeof Symbol.toStringTag === 'symbol'; + +function isESModule(obj) { + return obj.__esModule || (hasSymbol && obj[Symbol.toStringTag] === 'Module'); +} + +// in Webpack 2, require.ensure now also returns a Promise +// so the resolve/reject functions may get called an extra time +// if the user uses an arrow function shorthand that happens to +// return that Promise. +function once(fn) { + let called = false; + + return function () { + let args = [], + len = arguments.length; + while (len--) args[len] = arguments[len]; + + if (called) { + return; + } + called = true; + + return fn.apply(this, args); + }; +} + +/* */ + +const History = function History(router, base) { + this.router = router; + this.base = normalizeBase(base); + // start with a route object that stands for "nowhere" + this.current = START; + this.pending = null; + this.ready = false; + this.readyCbs = []; + this.readyErrorCbs = []; + this.errorCbs = []; + this.listeners = []; +}; + +History.prototype.listen = function listen(cb) { + this.cb = cb; +}; + +History.prototype.onReady = function onReady(cb, errorCb) { + if (this.ready) { + cb(); + } else { + this.readyCbs.push(cb); + if (errorCb) { + this.readyErrorCbs.push(errorCb); + } + } +}; + +History.prototype.onError = function onError(errorCb) { + this.errorCbs.push(errorCb); +}; + +History.prototype.transitionTo = function transitionTo(location, onComplete, onAbort) { + const this$1 = this; + + let route; + // catch redirect option https://github.com/vuejs/vue-router/issues/3201 + try { + route = this.router.match(location, this.current); + } catch (e) { + this.errorCbs.forEach(cb => { + cb(e); + }); + // Exception should still be thrown + throw e; + } + const prev = this.current; + this.confirmTransition( + route, + () => { + this$1.updateRoute(route); + onComplete && onComplete(route); + this$1.ensureURL(); + this$1.router.afterHooks.forEach(hook => { + hook && hook(route, prev); + }); + + // fire ready cbs once + if (!this$1.ready) { + this$1.ready = true; + this$1.readyCbs.forEach(cb => { + cb(route); + }); + } + }, + err => { + if (onAbort) { + onAbort(err); + } + if (err && !this$1.ready) { + // Initial redirection should not mark the history as ready yet + // because it's triggered by the redirection instead + // https://github.com/vuejs/vue-router/issues/3225 + // https://github.com/vuejs/vue-router/issues/3331 + if (!isNavigationFailure(err, NavigationFailureType.redirected) || prev !== START) { + this$1.ready = true; + this$1.readyErrorCbs.forEach(cb => { + cb(err); + }); + } + } + } + ); +}; + +History.prototype.confirmTransition = function confirmTransition(route, onComplete, onAbort) { + const this$1 = this; + + const current = this.current; + this.pending = route; + const abort = function (err) { + // changed after adding errors with + // https://github.com/vuejs/vue-router/pull/3047 before that change, + // redirect and aborted navigation would produce an err == null + if (!isNavigationFailure(err) && isError(err)) { + if (this$1.errorCbs.length) { + this$1.errorCbs.forEach(cb => { + cb(err); + }); + } else { + warn(false, 'uncaught error during route navigation:'); + console.error(err); + } + } + onAbort && onAbort(err); + }; + const lastRouteIndex = route.matched.length - 1; + const lastCurrentIndex = current.matched.length - 1; + if ( + isSameRoute(route, current) && + // in the case the route map has been dynamically appended to + lastRouteIndex === lastCurrentIndex && + route.matched[lastRouteIndex] === current.matched[lastCurrentIndex] + ) { + this.ensureURL(); + + return; + } + + const ref = resolveQueue(this.current.matched, route.matched); + const updated = ref.updated; + const deactivated = ref.deactivated; + const activated = ref.activated; + + const queue = [].concat( + // in-component leave guards + extractLeaveGuards(deactivated), + // global before hooks + this.router.beforeHooks, + // in-component update hooks + extractUpdateHooks(updated), + // in-config enter guards + activated.map(m => m.beforeEnter), + // async components + resolveAsyncComponents(activated) + ); + + const iterator = function (hook, next) { + if (this$1.pending !== route) { + return abort(createNavigationCancelledError(current, route)); + } + try { + hook(route, current, to => { + if (to === false) { + // next(false) -> abort navigation, ensure current URL + this$1.ensureURL(true); + abort(createNavigationAbortedError(current, route)); + } else if (isError(to)) { + this$1.ensureURL(true); + abort(to); + } else if ( + typeof to === 'string' || + (typeof to === 'object' && (typeof to.path === 'string' || typeof to.name === 'string')) + ) { + // next('/') or next({ path: '/' }) -> redirect + abort(createNavigationRedirectedError(current, route)); + if (typeof to === 'object' && to.replace) { + this$1.replace(to); + } else { + this$1.push(to); + } + } else { + // confirm transition and pass on the value + next(to); + } + }); + } catch (e) { + abort(e); + } + }; + + runQueue(queue, iterator, () => { + // wait until async components are resolved before + // extracting in-component enter guards + const enterGuards = extractEnterGuards(activated); + const queue = enterGuards.concat(this$1.router.resolveHooks); + runQueue(queue, iterator, () => { + if (this$1.pending !== route) { + return abort(createNavigationCancelledError(current, route)); + } + this$1.pending = null; + onComplete(route); + if (this$1.router.app) { + nextTick(() => { + handleRouteEntered(route); + }); + } + }); + }); +}; + +History.prototype.updateRoute = function updateRoute(route) { + this.current = route; + this.cb && this.cb(route); +}; + +History.prototype.setupListeners = function setupListeners() { + // Default implementation is empty +}; + +History.prototype.teardown = function teardown() { + // clean up event listeners + // https://github.com/vuejs/vue-router/issues/2341 + this.listeners.forEach(cleanupListener => { + cleanupListener(); + }); + this.listeners = []; + + // reset current history route + // https://github.com/vuejs/vue-router/issues/3294 + this.current = START; + this.pending = null; +}; + +function normalizeBase(base) { + if (!base) { + if (inBrowser) { + // respect tag + const baseEl = document.querySelector('base'); + base = (baseEl && baseEl.getAttribute('href')) || '/'; + // strip full URL origin + base = base.replace(/^https?:\/\/[^\/]+/, ''); + } else { + base = '/'; + } + } + // make sure there's the starting slash + if (base.charAt(0) !== '/') { + base = `/${base}`; + } + // remove trailing slash + return base.replace(/\/$/, ''); +} + +function resolveQueue(current, next) { + let i; + const max = Math.max(current.length, next.length); + for (i = 0; i < max; i++) { + if (current[i] !== next[i]) { + break; + } + } + + return { + updated: next.slice(0, i), + activated: next.slice(i), + deactivated: current.slice(i), + }; +} + +function extractGuards(records, name, bind, reverse) { + const guards = flatMapComponents(records, (def, instance, match, key) => { + const guard = extractGuard(def, name); + if (guard) { + return Array.isArray(guard) + ? guard.map(guard => bind(guard, instance, match, key)) + : bind(guard, instance, match, key); + } + }); + + return flatten(reverse ? guards.reverse() : guards); +} + +function extractGuard(def, key) { + if (typeof def !== 'function') { + // extend now so that global mixins are applied. + // def = _Vue.extend(def); + } + + return def[key]; +} + +function extractLeaveGuards(deactivated) { + return extractGuards(deactivated, 'beforeRouteLeave', bindGuard, true); +} + +function extractUpdateHooks(updated) { + return extractGuards(updated, 'beforeRouteUpdate', bindGuard); +} + +function bindGuard(guard, instance) { + if (instance) { + return function boundRouteGuard() { + return guard.apply(instance, arguments); + }; + } +} + +function extractEnterGuards(activated) { + return extractGuards(activated, 'beforeRouteEnter', (guard, _, match, key) => bindEnterGuard(guard, match, key)); +} + +function bindEnterGuard(guard, match, key) { + return function routeEnterGuard(to, from, next) { + return guard(to, from, cb => { + if (typeof cb === 'function') { + if (!match.enteredCbs[key]) { + match.enteredCbs[key] = []; + } + match.enteredCbs[key].push(cb); + } + next(cb); + }); + }; +} + +/* */ + +const HTML5History = /* @__PURE__*/ (function (History) { + function HTML5History(router, base) { + History.call(this, router, base); + + this._startLocation = getLocation(this.base); + } + + if (History) HTML5History.__proto__ = History; + HTML5History.prototype = Object.create(History && History.prototype); + HTML5History.prototype.constructor = HTML5History; + + HTML5History.prototype.setupListeners = function setupListeners() { + const this$1 = this; + + if (this.listeners.length > 0) { + return; + } + + const router = this.router; + const expectScroll = router.options.scrollBehavior; + const supportsScroll = supportsPushState && expectScroll; + + if (supportsScroll) { + this.listeners.push(setupScroll()); + } + + const handleRoutingEvent = function () { + const current = this$1.current; + + // Avoiding first `popstate` event dispatched in some browsers but first + // history route not updated since async guard at the same time. + const location = getLocation(this$1.base); + if (this$1.current === START && location === this$1._startLocation) { + return; + } + + this$1.transitionTo(location, route => { + if (supportsScroll) { + handleScroll(router, route, current, true); + } + }); + }; + window.addEventListener('popstate', handleRoutingEvent); + this.listeners.push(() => { + window.removeEventListener('popstate', handleRoutingEvent); + }); + }; + + HTML5History.prototype.go = function go(n) { + window.history.go(n); + }; + + HTML5History.prototype.push = function push(location, onComplete, onAbort) { + const this$1 = this; + + const ref = this; + const fromRoute = ref.current; + this.transitionTo( + location, + route => { + pushState(cleanPath(this$1.base + route.fullPath)); + handleScroll(this$1.router, route, fromRoute, false); + onComplete && onComplete(route); + }, + onAbort + ); + }; + + HTML5History.prototype.replace = function replace(location, onComplete, onAbort) { + const this$1 = this; + + const ref = this; + const fromRoute = ref.current; + this.transitionTo( + location, + route => { + replaceState(cleanPath(this$1.base + route.fullPath)); + handleScroll(this$1.router, route, fromRoute, false); + onComplete && onComplete(route); + }, + onAbort + ); + }; + + HTML5History.prototype.ensureURL = function ensureURL(push) { + if (getLocation(this.base) !== this.current.fullPath) { + const current = cleanPath(this.base + this.current.fullPath); + push ? pushState(current) : replaceState(current); + } + }; + + HTML5History.prototype.getCurrentLocation = function getCurrentLocation() { + return getLocation(this.base); + }; + + return HTML5History; +})(History); + +function getLocation(base) { + let path = window.location.pathname; + const pathLowerCase = path.toLowerCase(); + const baseLowerCase = base.toLowerCase(); + // base="/a" shouldn't turn path="/app" into "/a/pp" + // https://github.com/vuejs/vue-router/issues/3555 + // so we ensure the trailing slash in the base + if (base && (pathLowerCase === baseLowerCase || pathLowerCase.indexOf(cleanPath(`${baseLowerCase}/`)) === 0)) { + path = path.slice(base.length); + } + + return (path || '/') + window.location.search + window.location.hash; +} + +/* */ + +const HashHistory = /* @__PURE__*/ (function (History) { + function HashHistory(router, base, fallback) { + History.call(this, router, base); + // check history fallback deeplinking + if (fallback && checkFallback(this.base)) { + return; + } + ensureSlash(); + } + + if (History) HashHistory.__proto__ = History; + HashHistory.prototype = Object.create(History && History.prototype); + HashHistory.prototype.constructor = HashHistory; + + // this is delayed until the app mounts + // to avoid the hashchange listener being fired too early + HashHistory.prototype.setupListeners = function setupListeners() { + const this$1 = this; + + if (this.listeners.length > 0) { + return; + } + + const router = this.router; + const expectScroll = router.options.scrollBehavior; + const supportsScroll = supportsPushState && expectScroll; + + if (supportsScroll) { + this.listeners.push(setupScroll()); + } + + const handleRoutingEvent = function () { + const current = this$1.current; + if (!ensureSlash()) { + return; + } + this$1.transitionTo(getHash(), route => { + if (supportsScroll) { + handleScroll(this$1.router, route, current, true); + } + if (!supportsPushState) { + replaceHash(route.fullPath); + } + }); + }; + const eventType = supportsPushState ? 'popstate' : 'hashchange'; + window.addEventListener(eventType, handleRoutingEvent); + this.listeners.push(() => { + window.removeEventListener(eventType, handleRoutingEvent); + }); + }; + + HashHistory.prototype.push = function push(location, onComplete, onAbort) { + const this$1 = this; + + const ref = this; + const fromRoute = ref.current; + this.transitionTo( + location, + route => { + pushHash(route.fullPath); + handleScroll(this$1.router, route, fromRoute, false); + onComplete && onComplete(route); + }, + onAbort + ); + }; + + HashHistory.prototype.replace = function replace(location, onComplete, onAbort) { + const this$1 = this; + + const ref = this; + const fromRoute = ref.current; + this.transitionTo( + location, + route => { + replaceHash(route.fullPath); + handleScroll(this$1.router, route, fromRoute, false); + onComplete && onComplete(route); + }, + onAbort + ); + }; + + HashHistory.prototype.go = function go(n) { + window.history.go(n); + }; + + HashHistory.prototype.ensureURL = function ensureURL(push) { + const current = this.current.fullPath; + if (getHash() !== current) { + push ? pushHash(current) : replaceHash(current); + } + }; + + HashHistory.prototype.getCurrentLocation = function getCurrentLocation() { + return getHash(); + }; + + return HashHistory; +})(History); + +function checkFallback(base) { + const location = getLocation(base); + if (!/^\/#/.test(location)) { + window.location.replace(cleanPath(`${base}/#${location}`)); + + return true; + } +} + +function ensureSlash() { + const path = getHash(); + if (path.charAt(0) === '/') { + return true; + } + replaceHash(`/${path}`); + + return false; +} + +function getHash() { + // We can't use window.location.hash here because it's not + // consistent across browsers - Firefox will pre-decode it! + let href = window.location.href; + const index = href.indexOf('#'); + // empty path + if (index < 0) { + return ''; + } + + href = href.slice(index + 1); + + return href; +} + +function getUrl(path) { + const href = window.location.href; + const i = href.indexOf('#'); + const base = i >= 0 ? href.slice(0, i) : href; + + return `${base}#${path}`; +} + +function pushHash(path) { + if (supportsPushState) { + pushState(getUrl(path)); + } else { + window.location.hash = path; + } +} + +function replaceHash(path) { + if (supportsPushState) { + replaceState(getUrl(path)); + } else { + window.location.replace(getUrl(path)); + } +} + +/* */ + +const AbstractHistory = /* @__PURE__*/ (function (History) { + function AbstractHistory(router, base) { + History.call(this, router, base); + this.stack = []; + this.index = -1; + } + + if (History) AbstractHistory.__proto__ = History; + AbstractHistory.prototype = Object.create(History && History.prototype); + AbstractHistory.prototype.constructor = AbstractHistory; + + AbstractHistory.prototype.push = function push(location, onComplete, onAbort) { + const this$1 = this; + + this.transitionTo( + location, + route => { + this$1.stack = this$1.stack.slice(0, this$1.index + 1).concat(route); + this$1.index++; + onComplete && onComplete(route); + }, + onAbort + ); + }; + + AbstractHistory.prototype.replace = function replace(location, onComplete, onAbort) { + const this$1 = this; + + this.transitionTo( + location, + route => { + this$1.stack = this$1.stack.slice(0, this$1.index).concat(route); + onComplete && onComplete(route); + }, + onAbort + ); + }; + + AbstractHistory.prototype.go = function go(n) { + const this$1 = this; + + const targetIndex = this.index + n; + if (targetIndex < 0 || targetIndex >= this.stack.length) { + return; + } + const route = this.stack[targetIndex]; + this.confirmTransition( + route, + () => { + const prev = this$1.current; + this$1.index = targetIndex; + this$1.updateRoute(route); + this$1.router.afterHooks.forEach(hook => { + hook && hook(route, prev); + }); + }, + err => { + if (isNavigationFailure(err, NavigationFailureType.duplicated)) { + this$1.index = targetIndex; + } + } + ); + }; + + AbstractHistory.prototype.getCurrentLocation = function getCurrentLocation() { + const current = this.stack[this.stack.length - 1]; + + return current ? current.fullPath : '/'; + }; + + AbstractHistory.prototype.ensureURL = function ensureURL() { + // noop + }; + + return AbstractHistory; +})(History); + +/* */ + +const VueRouter = function VueRouter(options) { + if (options === void 0) options = {}; + + this.app = null; + this.apps = []; + this.options = options; + this.beforeHooks = []; + this.resolveHooks = []; + this.afterHooks = []; + this.matcher = createMatcher(options.routes || [], this); + + let mode = options.mode || 'hash'; + this.fallback = mode === 'history' && !supportsPushState && options.fallback !== false; + if (this.fallback) { + mode = 'hash'; + } + if (!inBrowser) { + mode = 'abstract'; + } + this.mode = mode; + + switch (mode) { + case 'history': + this.history = new HTML5History(this, options.base); + break; + case 'hash': + this.history = new HashHistory(this, options.base, this.fallback); + break; + case 'abstract': + this.history = new AbstractHistory(this, options.base); + break; + default: { + assert(false, `invalid mode: ${mode}`); + } + } +}; + +const prototypeAccessors = { currentRoute: { configurable: true } }; + +VueRouter.prototype.match = function match(raw, current, redirectedFrom) { + return this.matcher.match(raw, current, redirectedFrom); +}; + +prototypeAccessors.currentRoute.get = function () { + return this.history && this.history.current; +}; + +VueRouter.prototype.init = function init(app /* Vue component instance */) { + const this$1 = this; + + this.apps.push(app); + + // set up app destroyed handler + // https://github.com/vuejs/vue-router/issues/2639 + app.once('hook:destroyed', () => { + // clean out app from this.apps array once destroyed + const index = this$1.apps.indexOf(app); + if (index > -1) { + this$1.apps.splice(index, 1); + } + // ensure we still have a main app or null if no apps + // we do not release the router so it can be reused + if (this$1.app === app) { + this$1.app = this$1.apps[0] || null; + } + + if (!this$1.app) { + this$1.history.teardown(); + } + }); + + // main app previously initialized + // return as we don't need to set up new history listener + if (this.app) { + return; + } + + this.app = app; + + const history = this.history; + + if (history instanceof HTML5History || history instanceof HashHistory) { + const handleInitialScroll = function (routeOrError) { + const from = history.current; + const expectScroll = this$1.options.scrollBehavior; + const supportsScroll = supportsPushState && expectScroll; + + if (supportsScroll && 'fullPath' in routeOrError) { + handleScroll(this$1, routeOrError, from, false); + } + }; + const setupListeners = function (routeOrError) { + history.setupListeners(); + handleInitialScroll(routeOrError); + }; + history.transitionTo(history.getCurrentLocation(), setupListeners, setupListeners); + } + + history.listen(route => { + this$1.apps.forEach(app => { + app._router.history.current = route; + }); + }); +}; + +VueRouter.prototype.beforeEach = function beforeEach(fn) { + return registerHook(this.beforeHooks, fn); +}; + +VueRouter.prototype.beforeResolve = function beforeResolve(fn) { + return registerHook(this.resolveHooks, fn); +}; + +VueRouter.prototype.afterEach = function afterEach(fn) { + return registerHook(this.afterHooks, fn); +}; + +VueRouter.prototype.onReady = function onReady(cb, errorCb) { + this.history.onReady(cb, errorCb); +}; + +VueRouter.prototype.onError = function onError(errorCb) { + this.history.onError(errorCb); +}; + +VueRouter.prototype.push = function push(location, onComplete, onAbort) { + const this$1 = this; + + // $flow-disable-line + if (!onComplete && !onAbort && typeof Promise !== 'undefined') { + return new Promise((resolve, reject) => { + this$1.history.push(location, resolve, reject); + }); + } else { + this.history.push(location, onComplete, onAbort); + } +}; + +VueRouter.prototype.replace = function replace(location, onComplete, onAbort) { + const this$1 = this; + + // $flow-disable-line + if (!onComplete && !onAbort && typeof Promise !== 'undefined') { + return new Promise((resolve, reject) => { + this$1.history.replace(location, resolve, reject); + }); + } else { + this.history.replace(location, onComplete, onAbort); + } +}; + +VueRouter.prototype.go = function go(n) { + this.history.go(n); +}; + +VueRouter.prototype.back = function back() { + this.go(-1); +}; + +VueRouter.prototype.forward = function forward() { + this.go(1); +}; + +VueRouter.prototype.getMatchedComponents = function getMatchedComponents(to) { + const route = to ? (to.matched ? to : this.resolve(to).route) : this.currentRoute; + if (!route) { + return []; + } + + return [].concat.apply( + [], + route.matched.map(m => Object.keys(m.components).map(key => m.components[key])) + ); +}; + +VueRouter.prototype.resolve = function resolve(to, current, append) { + current = current || this.history.current; + const location = normalizeLocation(to, current, append, this); + const route = this.match(location, current); + const fullPath = route.redirectedFrom || route.fullPath; + const base = this.history.base; + const href = createHref(base, fullPath, this.mode); + + return { + location, + route, + href, + // for backwards compat + normalizedTo: location, + resolved: route, + }; +}; + +VueRouter.prototype.getRoutes = function getRoutes() { + return this.matcher.getRoutes(); +}; + +VueRouter.prototype.addRoute = function addRoute(parentOrRoute, route) { + this.matcher.addRoute(parentOrRoute, route); + if (this.history.current !== START) { + this.history.transitionTo(this.history.getCurrentLocation()); + } +}; + +Object.defineProperties(VueRouter.prototype, prototypeAccessors); + +function registerHook(list, fn) { + list.push(fn); + + return function () { + const i = list.indexOf(fn); + if (i > -1) { + list.splice(i, 1); + } + }; +} + +function createHref(base, fullPath, mode) { + const path = mode === 'hash' ? `#${fullPath}` : fullPath; + + return base ? cleanPath(`${base}/${path}`) : path; +} + +// VueRouter.install = install; +VueRouter.version = '3.5.2'; +VueRouter.isNavigationFailure = isNavigationFailure; +VueRouter.NavigationFailureType = NavigationFailureType; +VueRouter.START_LOCATION = START; + +let $router; +const cbs = []; +@shortcut() +export class RouterWidget extends Widget { + static xtype = 'bi.router'; + + init() { + this.$router = + this._router = + Router.$router = + $router = + new VueRouter({ + mode: this.options.mode, + routes: this.options.routes, + base: this.options.base, + }); + Fix.defineReactiveProperty(Router.$router.history, 'current'); + this.$router.beforeEach((to, from, next) => { + if (to.matched.length === 0) { + // 如果上级也未匹配到路由则跳转主页面,如果上级能匹配到则转上级路由 + from.path ? next({ path: from.path }) : next('/'); + } else { + // 如果匹配到正确跳转 + next(); + } + }); + this.$router.afterEach(() => { + cbs.forEach(cb => { + cb(); + }); + }); + this.$router.init(this); + } +} + +@shortcut() +export class RouterView extends Widget { + static xtype = 'bi.router_view'; + + props = { + baseCls: 'bi-router-view', + deps: 0, + name: 'default', + }; + created() { + const self = this, + o = this.options; + cbs.push( + (this._callbackListener = function () { + const current = $router.history.current; + // 匹配的路径名(/component/:id) + let matchedPath = current.matched[o.deps] && current.matched[o.deps].path; + const component = current.matched[o.deps] && current.matched[o.deps].components[o.name]; + + if (isNotNull(component)) { + if (matchedPath) { + each(current.params, (key, value) => { + // 把 :id 替换成具体的值(/component/demo.td) + matchedPath = matchedPath.replace(`:${key}`, value); + }); + } + self.tab.setSelect(matchedPath || '/'); + } + }) + ); + // "bi.router_view"是由"bi.tab"实现的,cardCreator是一个异步过程,在"bi.router_view"创建之前,cbs里不会有创建子组件的方法,在初始化路由时,没法直接渲染到子组件,所以这里手动加了一次调用 + this._callbackListener(); + } + + render() { + const self = this, + o = this.options; + + return { + type: Tab.xtype, + ref(_ref) { + self.tab = _ref; + }, + single: o.single, // 是不是单页面 + keepAlives: o.keepAlives, + logic: { + dynamic: false, + }, + showIndex: false, + cardCreator(v) { + return $router.history.current.matched[o.deps].components[o.name]; + }, + }; + } + + destroyed() { + // BI.remove方法会把第二个参数当迭代器执行导致方法多执行一遍 + cbs.splice(cbs.indexOf(this._callbackListener), 1); + } +} + +Router.isSameRoute = isSameRoute; diff --git a/src/third/sort.gb2312.js b/packages/fineui/src/third/sort.gb2312.js similarity index 100% rename from src/third/sort.gb2312.js rename to packages/fineui/src/third/sort.gb2312.js diff --git a/src/widget/collapse/collapse.js b/packages/fineui/src/widget/collapse/collapse.js similarity index 100% rename from src/widget/collapse/collapse.js rename to packages/fineui/src/widget/collapse/collapse.js diff --git a/src/widget/date/calendar/combo.month.date.js b/packages/fineui/src/widget/date/calendar/combo.month.date.js similarity index 100% rename from src/widget/date/calendar/combo.month.date.js rename to packages/fineui/src/widget/date/calendar/combo.month.date.js diff --git a/src/widget/date/calendar/combo.year.date.js b/packages/fineui/src/widget/date/calendar/combo.year.date.js similarity index 100% rename from src/widget/date/calendar/combo.year.date.js rename to packages/fineui/src/widget/date/calendar/combo.year.date.js diff --git a/src/widget/date/calendar/index.js b/packages/fineui/src/widget/date/calendar/index.js similarity index 100% rename from src/widget/date/calendar/index.js rename to packages/fineui/src/widget/date/calendar/index.js diff --git a/src/widget/date/calendar/picker.date.js b/packages/fineui/src/widget/date/calendar/picker.date.js similarity index 100% rename from src/widget/date/calendar/picker.date.js rename to packages/fineui/src/widget/date/calendar/picker.date.js diff --git a/src/widget/date/calendar/picker.year.js b/packages/fineui/src/widget/date/calendar/picker.year.js similarity index 100% rename from src/widget/date/calendar/picker.year.js rename to packages/fineui/src/widget/date/calendar/picker.year.js diff --git a/src/widget/date/calendar/popup.calendar.date.js b/packages/fineui/src/widget/date/calendar/popup.calendar.date.js similarity index 100% rename from src/widget/date/calendar/popup.calendar.date.js rename to packages/fineui/src/widget/date/calendar/popup.calendar.date.js diff --git a/src/widget/date/calendar/popup.month.js b/packages/fineui/src/widget/date/calendar/popup.month.js similarity index 100% rename from src/widget/date/calendar/popup.month.js rename to packages/fineui/src/widget/date/calendar/popup.month.js diff --git a/src/widget/date/calendar/popup.year.js b/packages/fineui/src/widget/date/calendar/popup.year.js similarity index 100% rename from src/widget/date/calendar/popup.year.js rename to packages/fineui/src/widget/date/calendar/popup.year.js diff --git a/src/widget/date/calendar/trigger.triangle.date.js b/packages/fineui/src/widget/date/calendar/trigger.triangle.date.js similarity index 100% rename from src/widget/date/calendar/trigger.triangle.date.js rename to packages/fineui/src/widget/date/calendar/trigger.triangle.date.js diff --git a/src/widget/date/index.js b/packages/fineui/src/widget/date/index.js similarity index 100% rename from src/widget/date/index.js rename to packages/fineui/src/widget/date/index.js diff --git a/src/widget/datepane/__test__/datepane.test.js b/packages/fineui/src/widget/datepane/__test__/datepane.test.js similarity index 100% rename from src/widget/datepane/__test__/datepane.test.js rename to packages/fineui/src/widget/datepane/__test__/datepane.test.js diff --git a/src/widget/datepane/card.static.datepane.js b/packages/fineui/src/widget/datepane/card.static.datepane.js similarity index 100% rename from src/widget/datepane/card.static.datepane.js rename to packages/fineui/src/widget/datepane/card.static.datepane.js diff --git a/src/widget/datepane/datepane.js b/packages/fineui/src/widget/datepane/datepane.js similarity index 100% rename from src/widget/datepane/datepane.js rename to packages/fineui/src/widget/datepane/datepane.js diff --git a/src/widget/datepane/index.js b/packages/fineui/src/widget/datepane/index.js similarity index 100% rename from src/widget/datepane/index.js rename to packages/fineui/src/widget/datepane/index.js diff --git a/src/widget/datetime/__test__/datetime.test.js b/packages/fineui/src/widget/datetime/__test__/datetime.test.js similarity index 100% rename from src/widget/datetime/__test__/datetime.test.js rename to packages/fineui/src/widget/datetime/__test__/datetime.test.js diff --git a/src/widget/datetime/datetime.combo.js b/packages/fineui/src/widget/datetime/datetime.combo.js similarity index 100% rename from src/widget/datetime/datetime.combo.js rename to packages/fineui/src/widget/datetime/datetime.combo.js diff --git a/src/widget/datetime/datetime.popup.js b/packages/fineui/src/widget/datetime/datetime.popup.js similarity index 100% rename from src/widget/datetime/datetime.popup.js rename to packages/fineui/src/widget/datetime/datetime.popup.js diff --git a/src/widget/datetime/datetime.trigger.js b/packages/fineui/src/widget/datetime/datetime.trigger.js similarity index 100% rename from src/widget/datetime/datetime.trigger.js rename to packages/fineui/src/widget/datetime/datetime.trigger.js diff --git a/src/widget/datetime/index.js b/packages/fineui/src/widget/datetime/index.js similarity index 100% rename from src/widget/datetime/index.js rename to packages/fineui/src/widget/datetime/index.js diff --git a/src/widget/datetimepane/__test__/datetimepane.test.js b/packages/fineui/src/widget/datetimepane/__test__/datetimepane.test.js similarity index 100% rename from src/widget/datetimepane/__test__/datetimepane.test.js rename to packages/fineui/src/widget/datetimepane/__test__/datetimepane.test.js diff --git a/src/widget/datetimepane/card.static.datetimepane.js b/packages/fineui/src/widget/datetimepane/card.static.datetimepane.js similarity index 100% rename from src/widget/datetimepane/card.static.datetimepane.js rename to packages/fineui/src/widget/datetimepane/card.static.datetimepane.js diff --git a/src/widget/datetimepane/datetimepane.js b/packages/fineui/src/widget/datetimepane/datetimepane.js similarity index 100% rename from src/widget/datetimepane/datetimepane.js rename to packages/fineui/src/widget/datetimepane/datetimepane.js diff --git a/src/widget/datetimepane/index.js b/packages/fineui/src/widget/datetimepane/index.js similarity index 100% rename from src/widget/datetimepane/index.js rename to packages/fineui/src/widget/datetimepane/index.js diff --git a/src/widget/downlist/__test__/downlist.test.js b/packages/fineui/src/widget/downlist/__test__/downlist.test.js similarity index 100% rename from src/widget/downlist/__test__/downlist.test.js rename to packages/fineui/src/widget/downlist/__test__/downlist.test.js diff --git a/src/widget/downlist/combo.downlist.js b/packages/fineui/src/widget/downlist/combo.downlist.js similarity index 100% rename from src/widget/downlist/combo.downlist.js rename to packages/fineui/src/widget/downlist/combo.downlist.js diff --git a/src/widget/downlist/group.downlist.js b/packages/fineui/src/widget/downlist/group.downlist.js similarity index 100% rename from src/widget/downlist/group.downlist.js rename to packages/fineui/src/widget/downlist/group.downlist.js diff --git a/src/widget/downlist/index.js b/packages/fineui/src/widget/downlist/index.js similarity index 100% rename from src/widget/downlist/index.js rename to packages/fineui/src/widget/downlist/index.js diff --git a/src/widget/downlist/item.downlist.js b/packages/fineui/src/widget/downlist/item.downlist.js similarity index 100% rename from src/widget/downlist/item.downlist.js rename to packages/fineui/src/widget/downlist/item.downlist.js diff --git a/src/widget/downlist/item.downlistgroup.js b/packages/fineui/src/widget/downlist/item.downlistgroup.js similarity index 100% rename from src/widget/downlist/item.downlistgroup.js rename to packages/fineui/src/widget/downlist/item.downlistgroup.js diff --git a/src/widget/downlist/popup.downlist.js b/packages/fineui/src/widget/downlist/popup.downlist.js similarity index 100% rename from src/widget/downlist/popup.downlist.js rename to packages/fineui/src/widget/downlist/popup.downlist.js diff --git a/src/widget/dynamicdate/__test__/dynamicdate.test.js b/packages/fineui/src/widget/dynamicdate/__test__/dynamicdate.test.js similarity index 100% rename from src/widget/dynamicdate/__test__/dynamicdate.test.js rename to packages/fineui/src/widget/dynamicdate/__test__/dynamicdate.test.js diff --git a/src/widget/dynamicdate/dynamicdate.caculate.js b/packages/fineui/src/widget/dynamicdate/dynamicdate.caculate.js similarity index 100% rename from src/widget/dynamicdate/dynamicdate.caculate.js rename to packages/fineui/src/widget/dynamicdate/dynamicdate.caculate.js diff --git a/src/widget/dynamicdate/dynamicdate.card.js b/packages/fineui/src/widget/dynamicdate/dynamicdate.card.js similarity index 100% rename from src/widget/dynamicdate/dynamicdate.card.js rename to packages/fineui/src/widget/dynamicdate/dynamicdate.card.js diff --git a/src/widget/dynamicdate/dynamicdate.combo.js b/packages/fineui/src/widget/dynamicdate/dynamicdate.combo.js similarity index 100% rename from src/widget/dynamicdate/dynamicdate.combo.js rename to packages/fineui/src/widget/dynamicdate/dynamicdate.combo.js diff --git a/src/widget/dynamicdate/dynamicdate.param.item.js b/packages/fineui/src/widget/dynamicdate/dynamicdate.param.item.js similarity index 100% rename from src/widget/dynamicdate/dynamicdate.param.item.js rename to packages/fineui/src/widget/dynamicdate/dynamicdate.param.item.js diff --git a/src/widget/dynamicdate/dynamicdate.popup.js b/packages/fineui/src/widget/dynamicdate/dynamicdate.popup.js similarity index 100% rename from src/widget/dynamicdate/dynamicdate.popup.js rename to packages/fineui/src/widget/dynamicdate/dynamicdate.popup.js diff --git a/src/widget/dynamicdate/dynamicdate.trigger.js b/packages/fineui/src/widget/dynamicdate/dynamicdate.trigger.js similarity index 100% rename from src/widget/dynamicdate/dynamicdate.trigger.js rename to packages/fineui/src/widget/dynamicdate/dynamicdate.trigger.js diff --git a/src/widget/dynamicdate/index.js b/packages/fineui/src/widget/dynamicdate/index.js similarity index 100% rename from src/widget/dynamicdate/index.js rename to packages/fineui/src/widget/dynamicdate/index.js diff --git a/src/widget/dynamicdatetime/__test__/dynamicdatetime.test.js b/packages/fineui/src/widget/dynamicdatetime/__test__/dynamicdatetime.test.js similarity index 100% rename from src/widget/dynamicdatetime/__test__/dynamicdatetime.test.js rename to packages/fineui/src/widget/dynamicdatetime/__test__/dynamicdatetime.test.js diff --git a/src/widget/dynamicdatetime/dynamicdatetime.combo.js b/packages/fineui/src/widget/dynamicdatetime/dynamicdatetime.combo.js similarity index 100% rename from src/widget/dynamicdatetime/dynamicdatetime.combo.js rename to packages/fineui/src/widget/dynamicdatetime/dynamicdatetime.combo.js diff --git a/src/widget/dynamicdatetime/dynamicdatetime.popup.js b/packages/fineui/src/widget/dynamicdatetime/dynamicdatetime.popup.js similarity index 100% rename from src/widget/dynamicdatetime/dynamicdatetime.popup.js rename to packages/fineui/src/widget/dynamicdatetime/dynamicdatetime.popup.js diff --git a/src/widget/dynamicdatetime/dynamicdatetime.timeselect.js b/packages/fineui/src/widget/dynamicdatetime/dynamicdatetime.timeselect.js similarity index 100% rename from src/widget/dynamicdatetime/dynamicdatetime.timeselect.js rename to packages/fineui/src/widget/dynamicdatetime/dynamicdatetime.timeselect.js diff --git a/src/widget/dynamicdatetime/dynamicdatetime.trigger.js b/packages/fineui/src/widget/dynamicdatetime/dynamicdatetime.trigger.js similarity index 100% rename from src/widget/dynamicdatetime/dynamicdatetime.trigger.js rename to packages/fineui/src/widget/dynamicdatetime/dynamicdatetime.trigger.js diff --git a/src/widget/dynamicdatetime/index.js b/packages/fineui/src/widget/dynamicdatetime/index.js similarity index 100% rename from src/widget/dynamicdatetime/index.js rename to packages/fineui/src/widget/dynamicdatetime/index.js diff --git a/src/widget/editor/__test__/editor.search.test.js b/packages/fineui/src/widget/editor/__test__/editor.search.test.js similarity index 100% rename from src/widget/editor/__test__/editor.search.test.js rename to packages/fineui/src/widget/editor/__test__/editor.search.test.js diff --git a/src/widget/editor/__test__/editor.text.test.js b/packages/fineui/src/widget/editor/__test__/editor.text.test.js similarity index 100% rename from src/widget/editor/__test__/editor.text.test.js rename to packages/fineui/src/widget/editor/__test__/editor.text.test.js diff --git a/src/widget/editor/editor.search.js b/packages/fineui/src/widget/editor/editor.search.js similarity index 100% rename from src/widget/editor/editor.search.js rename to packages/fineui/src/widget/editor/editor.search.js diff --git a/src/widget/editor/editor.search.small.js b/packages/fineui/src/widget/editor/editor.search.small.js similarity index 100% rename from src/widget/editor/editor.search.small.js rename to packages/fineui/src/widget/editor/editor.search.small.js diff --git a/src/widget/editor/editor.text.js b/packages/fineui/src/widget/editor/editor.text.js similarity index 100% rename from src/widget/editor/editor.text.js rename to packages/fineui/src/widget/editor/editor.text.js diff --git a/src/widget/editor/editor.text.small.js b/packages/fineui/src/widget/editor/editor.text.small.js similarity index 100% rename from src/widget/editor/editor.text.small.js rename to packages/fineui/src/widget/editor/editor.text.small.js diff --git a/src/widget/editor/index.js b/packages/fineui/src/widget/editor/index.js similarity index 100% rename from src/widget/editor/index.js rename to packages/fineui/src/widget/editor/index.js diff --git a/packages/fineui/src/widget/index.js b/packages/fineui/src/widget/index.js new file mode 100644 index 000000000..b378d16ad --- /dev/null +++ b/packages/fineui/src/widget/index.js @@ -0,0 +1,40 @@ +export { Collapse } from "./collapse/collapse"; +export { SelectTreeExpander } from "./selecttree/selecttree.expander"; +export { SelectTreeCombo } from "./selecttree/selecttree.combo"; +export { SingleTreeCombo } from "./singletree/singletree.combo"; +export { MultiTreeCombo } from "./multitree/multi.tree.combo"; +export { MultiTreeInsertCombo } from "./multitree/multi.tree.insert.combo"; +export { MultiTreeListCombo } from "./multitree/multi.tree.list.combo"; +export { NumberEditor } from "./numbereditor/number.editor"; +export { NumberInterval } from "./numberinterval/numberinterval"; +export { YearMonthInterval } from "./yearmonthinterval/yearmonthinterval"; +export { YearQuarterInterval } from "./yearquarterinterval/yearquarterinterval"; +export { YearInterval } from "./yearinterval/yearinterval"; + +export * from "./date/calendar"; +export * from "./dynamicdate"; +export * from "./datepane"; +export * from "./datetime"; +export * from "./datetimepane"; +export * from "./dynamicdatetime"; +export * from "./time"; +export * from "./timeinterval"; +export * from "./editor"; +export * from "./yearmonth"; +export * from "./multiselect"; +export * from "./multiselectlist"; +export * from "./downlist"; +export * from "./singleslider"; +export * from "./intervalslider"; +export * from "./year"; +export * from "./multilayersingletree"; +export * from "./multilayerselecttree"; +export * from "./searchmultitextvaluecombo"; +export * from "./singleselect"; +export * from "./multilayerdownlist"; +export * from "./yearquarter"; +export * from "./textvaluedownlistcombo"; +export * from "./searchmultitextvaluecombo"; +export * from "./multiselecttree/multiselecttree"; +export * from "./selecttree/selecttree.popup"; +export * from "./singletree/singletree.popup"; diff --git a/src/widget/intervalslider/__test__/accuratecalculation.test.js b/packages/fineui/src/widget/intervalslider/__test__/accuratecalculation.test.js similarity index 100% rename from src/widget/intervalslider/__test__/accuratecalculation.test.js rename to packages/fineui/src/widget/intervalslider/__test__/accuratecalculation.test.js diff --git a/src/widget/intervalslider/__test__/intervalslider.test.js b/packages/fineui/src/widget/intervalslider/__test__/intervalslider.test.js similarity index 100% rename from src/widget/intervalslider/__test__/intervalslider.test.js rename to packages/fineui/src/widget/intervalslider/__test__/intervalslider.test.js diff --git a/src/widget/intervalslider/index.js b/packages/fineui/src/widget/intervalslider/index.js similarity index 100% rename from src/widget/intervalslider/index.js rename to packages/fineui/src/widget/intervalslider/index.js diff --git a/src/widget/intervalslider/intervalslider.js b/packages/fineui/src/widget/intervalslider/intervalslider.js similarity index 100% rename from src/widget/intervalslider/intervalslider.js rename to packages/fineui/src/widget/intervalslider/intervalslider.js diff --git a/src/widget/intervalslider/model.accuratecalculation.js b/packages/fineui/src/widget/intervalslider/model.accuratecalculation.js similarity index 100% rename from src/widget/intervalslider/model.accuratecalculation.js rename to packages/fineui/src/widget/intervalslider/model.accuratecalculation.js diff --git a/src/widget/multilayerdownlist/__test__/downlist.test.js b/packages/fineui/src/widget/multilayerdownlist/__test__/downlist.test.js similarity index 100% rename from src/widget/multilayerdownlist/__test__/downlist.test.js rename to packages/fineui/src/widget/multilayerdownlist/__test__/downlist.test.js diff --git a/src/widget/multilayerdownlist/combo.downlist.js b/packages/fineui/src/widget/multilayerdownlist/combo.downlist.js similarity index 100% rename from src/widget/multilayerdownlist/combo.downlist.js rename to packages/fineui/src/widget/multilayerdownlist/combo.downlist.js diff --git a/src/widget/multilayerdownlist/index.js b/packages/fineui/src/widget/multilayerdownlist/index.js similarity index 100% rename from src/widget/multilayerdownlist/index.js rename to packages/fineui/src/widget/multilayerdownlist/index.js diff --git a/src/widget/multilayerdownlist/popup.downlist.js b/packages/fineui/src/widget/multilayerdownlist/popup.downlist.js similarity index 100% rename from src/widget/multilayerdownlist/popup.downlist.js rename to packages/fineui/src/widget/multilayerdownlist/popup.downlist.js diff --git a/src/widget/multilayerselecttree/__test__/multilayerselecttree.combo.test.js b/packages/fineui/src/widget/multilayerselecttree/__test__/multilayerselecttree.combo.test.js similarity index 100% rename from src/widget/multilayerselecttree/__test__/multilayerselecttree.combo.test.js rename to packages/fineui/src/widget/multilayerselecttree/__test__/multilayerselecttree.combo.test.js diff --git a/src/widget/multilayerselecttree/index.js b/packages/fineui/src/widget/multilayerselecttree/index.js similarity index 100% rename from src/widget/multilayerselecttree/index.js rename to packages/fineui/src/widget/multilayerselecttree/index.js diff --git a/src/widget/multilayerselecttree/multilayerselecttree.combo.js b/packages/fineui/src/widget/multilayerselecttree/multilayerselecttree.combo.js similarity index 100% rename from src/widget/multilayerselecttree/multilayerselecttree.combo.js rename to packages/fineui/src/widget/multilayerselecttree/multilayerselecttree.combo.js diff --git a/src/widget/multilayerselecttree/multilayerselecttree.insert.search.pane.js b/packages/fineui/src/widget/multilayerselecttree/multilayerselecttree.insert.search.pane.js similarity index 100% rename from src/widget/multilayerselecttree/multilayerselecttree.insert.search.pane.js rename to packages/fineui/src/widget/multilayerselecttree/multilayerselecttree.insert.search.pane.js diff --git a/src/widget/multilayerselecttree/multilayerselecttree.leveltree.js b/packages/fineui/src/widget/multilayerselecttree/multilayerselecttree.leveltree.js similarity index 100% rename from src/widget/multilayerselecttree/multilayerselecttree.leveltree.js rename to packages/fineui/src/widget/multilayerselecttree/multilayerselecttree.leveltree.js diff --git a/src/widget/multilayerselecttree/multilayerselecttree.popup.js b/packages/fineui/src/widget/multilayerselecttree/multilayerselecttree.popup.js similarity index 100% rename from src/widget/multilayerselecttree/multilayerselecttree.popup.js rename to packages/fineui/src/widget/multilayerselecttree/multilayerselecttree.popup.js diff --git a/src/widget/multilayerselecttree/multilayerselecttree.trigger.js b/packages/fineui/src/widget/multilayerselecttree/multilayerselecttree.trigger.js similarity index 100% rename from src/widget/multilayerselecttree/multilayerselecttree.trigger.js rename to packages/fineui/src/widget/multilayerselecttree/multilayerselecttree.trigger.js diff --git a/src/widget/multilayersingletree/__test__/multilayersingletree.combo.test.js b/packages/fineui/src/widget/multilayersingletree/__test__/multilayersingletree.combo.test.js similarity index 100% rename from src/widget/multilayersingletree/__test__/multilayersingletree.combo.test.js rename to packages/fineui/src/widget/multilayersingletree/__test__/multilayersingletree.combo.test.js diff --git a/src/widget/multilayersingletree/index.js b/packages/fineui/src/widget/multilayersingletree/index.js similarity index 100% rename from src/widget/multilayersingletree/index.js rename to packages/fineui/src/widget/multilayersingletree/index.js diff --git a/src/widget/multilayersingletree/multilayersingletree.combo.js b/packages/fineui/src/widget/multilayersingletree/multilayersingletree.combo.js similarity index 100% rename from src/widget/multilayersingletree/multilayersingletree.combo.js rename to packages/fineui/src/widget/multilayersingletree/multilayersingletree.combo.js diff --git a/src/widget/multilayersingletree/multilayersingletree.insert.search.pane.js b/packages/fineui/src/widget/multilayersingletree/multilayersingletree.insert.search.pane.js similarity index 100% rename from src/widget/multilayersingletree/multilayersingletree.insert.search.pane.js rename to packages/fineui/src/widget/multilayersingletree/multilayersingletree.insert.search.pane.js diff --git a/src/widget/multilayersingletree/multilayersingletree.leveltree.js b/packages/fineui/src/widget/multilayersingletree/multilayersingletree.leveltree.js similarity index 100% rename from src/widget/multilayersingletree/multilayersingletree.leveltree.js rename to packages/fineui/src/widget/multilayersingletree/multilayersingletree.leveltree.js diff --git a/src/widget/multilayersingletree/multilayersingletree.popup.js b/packages/fineui/src/widget/multilayersingletree/multilayersingletree.popup.js similarity index 100% rename from src/widget/multilayersingletree/multilayersingletree.popup.js rename to packages/fineui/src/widget/multilayersingletree/multilayersingletree.popup.js diff --git a/src/widget/multilayersingletree/multilayersingletree.trigger.js b/packages/fineui/src/widget/multilayersingletree/multilayersingletree.trigger.js similarity index 100% rename from src/widget/multilayersingletree/multilayersingletree.trigger.js rename to packages/fineui/src/widget/multilayersingletree/multilayersingletree.trigger.js diff --git a/src/widget/multiselect/__test__/multiselect.loader.nobar.test.js b/packages/fineui/src/widget/multiselect/__test__/multiselect.loader.nobar.test.js similarity index 100% rename from src/widget/multiselect/__test__/multiselect.loader.nobar.test.js rename to packages/fineui/src/widget/multiselect/__test__/multiselect.loader.nobar.test.js diff --git a/src/widget/multiselect/__test__/multiselect.loader.test.js b/packages/fineui/src/widget/multiselect/__test__/multiselect.loader.test.js similarity index 100% rename from src/widget/multiselect/__test__/multiselect.loader.test.js rename to packages/fineui/src/widget/multiselect/__test__/multiselect.loader.test.js diff --git a/src/widget/multiselect/__test__/multiselectcombo.test.js b/packages/fineui/src/widget/multiselect/__test__/multiselectcombo.test.js similarity index 100% rename from src/widget/multiselect/__test__/multiselectcombo.test.js rename to packages/fineui/src/widget/multiselect/__test__/multiselectcombo.test.js diff --git a/src/widget/multiselect/__test__/multiselectinsert.combo.test.js b/packages/fineui/src/widget/multiselect/__test__/multiselectinsert.combo.test.js similarity index 100% rename from src/widget/multiselect/__test__/multiselectinsert.combo.test.js rename to packages/fineui/src/widget/multiselect/__test__/multiselectinsert.combo.test.js diff --git a/src/widget/multiselect/check/multiselect.check.pane.js b/packages/fineui/src/widget/multiselect/check/multiselect.check.pane.js similarity index 100% rename from src/widget/multiselect/check/multiselect.check.pane.js rename to packages/fineui/src/widget/multiselect/check/multiselect.check.pane.js diff --git a/src/widget/multiselect/check/multiselect.display.js b/packages/fineui/src/widget/multiselect/check/multiselect.display.js similarity index 100% rename from src/widget/multiselect/check/multiselect.display.js rename to packages/fineui/src/widget/multiselect/check/multiselect.display.js diff --git a/src/widget/multiselect/index.js b/packages/fineui/src/widget/multiselect/index.js similarity index 100% rename from src/widget/multiselect/index.js rename to packages/fineui/src/widget/multiselect/index.js diff --git a/src/widget/multiselect/loader.js b/packages/fineui/src/widget/multiselect/loader.js similarity index 100% rename from src/widget/multiselect/loader.js rename to packages/fineui/src/widget/multiselect/loader.js diff --git a/src/widget/multiselect/multiselect.combo.js b/packages/fineui/src/widget/multiselect/multiselect.combo.js similarity index 100% rename from src/widget/multiselect/multiselect.combo.js rename to packages/fineui/src/widget/multiselect/multiselect.combo.js diff --git a/src/widget/multiselect/multiselect.combo.nobar.js b/packages/fineui/src/widget/multiselect/multiselect.combo.nobar.js similarity index 100% rename from src/widget/multiselect/multiselect.combo.nobar.js rename to packages/fineui/src/widget/multiselect/multiselect.combo.nobar.js diff --git a/src/widget/multiselect/multiselect.insert.combo.js b/packages/fineui/src/widget/multiselect/multiselect.insert.combo.js similarity index 100% rename from src/widget/multiselect/multiselect.insert.combo.js rename to packages/fineui/src/widget/multiselect/multiselect.insert.combo.js diff --git a/src/widget/multiselect/multiselect.insert.combo.nobar.js b/packages/fineui/src/widget/multiselect/multiselect.insert.combo.nobar.js similarity index 100% rename from src/widget/multiselect/multiselect.insert.combo.nobar.js rename to packages/fineui/src/widget/multiselect/multiselect.insert.combo.nobar.js diff --git a/src/widget/multiselect/multiselect.insert.trigger.js b/packages/fineui/src/widget/multiselect/multiselect.insert.trigger.js similarity index 100% rename from src/widget/multiselect/multiselect.insert.trigger.js rename to packages/fineui/src/widget/multiselect/multiselect.insert.trigger.js diff --git a/src/widget/multiselect/multiselect.loader.js b/packages/fineui/src/widget/multiselect/multiselect.loader.js similarity index 100% rename from src/widget/multiselect/multiselect.loader.js rename to packages/fineui/src/widget/multiselect/multiselect.loader.js diff --git a/src/widget/multiselect/multiselect.loader.nobar.js b/packages/fineui/src/widget/multiselect/multiselect.loader.nobar.js similarity index 100% rename from src/widget/multiselect/multiselect.loader.nobar.js rename to packages/fineui/src/widget/multiselect/multiselect.loader.nobar.js diff --git a/src/widget/multiselect/multiselect.popup.view.js b/packages/fineui/src/widget/multiselect/multiselect.popup.view.js similarity index 100% rename from src/widget/multiselect/multiselect.popup.view.js rename to packages/fineui/src/widget/multiselect/multiselect.popup.view.js diff --git a/src/widget/multiselect/multiselect.popup.view.nobar.js b/packages/fineui/src/widget/multiselect/multiselect.popup.view.nobar.js similarity index 100% rename from src/widget/multiselect/multiselect.popup.view.nobar.js rename to packages/fineui/src/widget/multiselect/multiselect.popup.view.nobar.js diff --git a/src/widget/multiselect/multiselect.trigger.js b/packages/fineui/src/widget/multiselect/multiselect.trigger.js similarity index 100% rename from src/widget/multiselect/multiselect.trigger.js rename to packages/fineui/src/widget/multiselect/multiselect.trigger.js diff --git a/src/widget/multiselect/search/multiselect.search.insert.pane.js b/packages/fineui/src/widget/multiselect/search/multiselect.search.insert.pane.js similarity index 100% rename from src/widget/multiselect/search/multiselect.search.insert.pane.js rename to packages/fineui/src/widget/multiselect/search/multiselect.search.insert.pane.js diff --git a/src/widget/multiselect/search/multiselect.search.loader.js b/packages/fineui/src/widget/multiselect/search/multiselect.search.loader.js similarity index 100% rename from src/widget/multiselect/search/multiselect.search.loader.js rename to packages/fineui/src/widget/multiselect/search/multiselect.search.loader.js diff --git a/src/widget/multiselect/search/multiselect.search.pane.js b/packages/fineui/src/widget/multiselect/search/multiselect.search.pane.js similarity index 100% rename from src/widget/multiselect/search/multiselect.search.pane.js rename to packages/fineui/src/widget/multiselect/search/multiselect.search.pane.js diff --git a/src/widget/multiselect/trigger/button.checkselected.js b/packages/fineui/src/widget/multiselect/trigger/button.checkselected.js similarity index 100% rename from src/widget/multiselect/trigger/button.checkselected.js rename to packages/fineui/src/widget/multiselect/trigger/button.checkselected.js diff --git a/src/widget/multiselect/trigger/editor.multiselect.js b/packages/fineui/src/widget/multiselect/trigger/editor.multiselect.js similarity index 100% rename from src/widget/multiselect/trigger/editor.multiselect.js rename to packages/fineui/src/widget/multiselect/trigger/editor.multiselect.js diff --git a/src/widget/multiselect/trigger/editor/editor.patch.js b/packages/fineui/src/widget/multiselect/trigger/editor/editor.patch.js similarity index 100% rename from src/widget/multiselect/trigger/editor/editor.patch.js rename to packages/fineui/src/widget/multiselect/trigger/editor/editor.patch.js diff --git a/src/widget/multiselect/trigger/searcher.multiselect.insert.js b/packages/fineui/src/widget/multiselect/trigger/searcher.multiselect.insert.js similarity index 100% rename from src/widget/multiselect/trigger/searcher.multiselect.insert.js rename to packages/fineui/src/widget/multiselect/trigger/searcher.multiselect.insert.js diff --git a/src/widget/multiselect/trigger/searcher.multiselect.js b/packages/fineui/src/widget/multiselect/trigger/searcher.multiselect.js similarity index 100% rename from src/widget/multiselect/trigger/searcher.multiselect.js rename to packages/fineui/src/widget/multiselect/trigger/searcher.multiselect.js diff --git a/src/widget/multiselect/trigger/switcher.checkselected.js b/packages/fineui/src/widget/multiselect/trigger/switcher.checkselected.js similarity index 100% rename from src/widget/multiselect/trigger/switcher.checkselected.js rename to packages/fineui/src/widget/multiselect/trigger/switcher.checkselected.js diff --git a/src/widget/multiselectlist/__test__/multiselect.insert.nobar.test.js b/packages/fineui/src/widget/multiselectlist/__test__/multiselect.insert.nobar.test.js similarity index 100% rename from src/widget/multiselectlist/__test__/multiselect.insert.nobar.test.js rename to packages/fineui/src/widget/multiselectlist/__test__/multiselect.insert.nobar.test.js diff --git a/src/widget/multiselectlist/__test__/multiselectlist.insert.test.js b/packages/fineui/src/widget/multiselectlist/__test__/multiselectlist.insert.test.js similarity index 100% rename from src/widget/multiselectlist/__test__/multiselectlist.insert.test.js rename to packages/fineui/src/widget/multiselectlist/__test__/multiselectlist.insert.test.js diff --git a/src/widget/multiselectlist/index.js b/packages/fineui/src/widget/multiselectlist/index.js similarity index 100% rename from src/widget/multiselectlist/index.js rename to packages/fineui/src/widget/multiselectlist/index.js diff --git a/src/widget/multiselectlist/multiselectlist.insert.js b/packages/fineui/src/widget/multiselectlist/multiselectlist.insert.js similarity index 100% rename from src/widget/multiselectlist/multiselectlist.insert.js rename to packages/fineui/src/widget/multiselectlist/multiselectlist.insert.js diff --git a/src/widget/multiselectlist/multiselectlist.insert.nobar.js b/packages/fineui/src/widget/multiselectlist/multiselectlist.insert.nobar.js similarity index 100% rename from src/widget/multiselectlist/multiselectlist.insert.nobar.js rename to packages/fineui/src/widget/multiselectlist/multiselectlist.insert.nobar.js diff --git a/src/widget/multiselectlist/multiselectlist.js b/packages/fineui/src/widget/multiselectlist/multiselectlist.js similarity index 100% rename from src/widget/multiselectlist/multiselectlist.js rename to packages/fineui/src/widget/multiselectlist/multiselectlist.js diff --git a/src/widget/multiselecttree/multiselecttree.js b/packages/fineui/src/widget/multiselecttree/multiselecttree.js similarity index 100% rename from src/widget/multiselecttree/multiselecttree.js rename to packages/fineui/src/widget/multiselecttree/multiselecttree.js diff --git a/src/widget/multiselecttree/multiselecttree.popup.js b/packages/fineui/src/widget/multiselecttree/multiselecttree.popup.js similarity index 100% rename from src/widget/multiselecttree/multiselecttree.popup.js rename to packages/fineui/src/widget/multiselecttree/multiselecttree.popup.js diff --git a/src/widget/multitree/check/multi.tree.check.pane.js b/packages/fineui/src/widget/multitree/check/multi.tree.check.pane.js similarity index 100% rename from src/widget/multitree/check/multi.tree.check.pane.js rename to packages/fineui/src/widget/multitree/check/multi.tree.check.pane.js diff --git a/src/widget/multitree/multi.tree.combo.js b/packages/fineui/src/widget/multitree/multi.tree.combo.js similarity index 100% rename from src/widget/multitree/multi.tree.combo.js rename to packages/fineui/src/widget/multitree/multi.tree.combo.js diff --git a/src/widget/multitree/multi.tree.insert.combo.js b/packages/fineui/src/widget/multitree/multi.tree.insert.combo.js similarity index 100% rename from src/widget/multitree/multi.tree.insert.combo.js rename to packages/fineui/src/widget/multitree/multi.tree.insert.combo.js diff --git a/src/widget/multitree/multi.tree.list.combo.js b/packages/fineui/src/widget/multitree/multi.tree.list.combo.js similarity index 100% rename from src/widget/multitree/multi.tree.list.combo.js rename to packages/fineui/src/widget/multitree/multi.tree.list.combo.js diff --git a/src/widget/multitree/multi.tree.popup.js b/packages/fineui/src/widget/multitree/multi.tree.popup.js similarity index 100% rename from src/widget/multitree/multi.tree.popup.js rename to packages/fineui/src/widget/multitree/multi.tree.popup.js diff --git a/src/widget/multitree/trigger/multi.tree.button.checkselected.js b/packages/fineui/src/widget/multitree/trigger/multi.tree.button.checkselected.js similarity index 100% rename from src/widget/multitree/trigger/multi.tree.button.checkselected.js rename to packages/fineui/src/widget/multitree/trigger/multi.tree.button.checkselected.js diff --git a/src/widget/multitree/trigger/multi.tree.search.insert.pane.js b/packages/fineui/src/widget/multitree/trigger/multi.tree.search.insert.pane.js similarity index 100% rename from src/widget/multitree/trigger/multi.tree.search.insert.pane.js rename to packages/fineui/src/widget/multitree/trigger/multi.tree.search.insert.pane.js diff --git a/src/widget/multitree/trigger/multi.tree.search.pane.js b/packages/fineui/src/widget/multitree/trigger/multi.tree.search.pane.js similarity index 100% rename from src/widget/multitree/trigger/multi.tree.search.pane.js rename to packages/fineui/src/widget/multitree/trigger/multi.tree.search.pane.js diff --git a/src/widget/multitree/trigger/searcher.list.multi.tree.js b/packages/fineui/src/widget/multitree/trigger/searcher.list.multi.tree.js similarity index 100% rename from src/widget/multitree/trigger/searcher.list.multi.tree.js rename to packages/fineui/src/widget/multitree/trigger/searcher.list.multi.tree.js diff --git a/src/widget/multitree/trigger/searcher.multi.tree.js b/packages/fineui/src/widget/multitree/trigger/searcher.multi.tree.js similarity index 100% rename from src/widget/multitree/trigger/searcher.multi.tree.js rename to packages/fineui/src/widget/multitree/trigger/searcher.multi.tree.js diff --git a/src/widget/numbereditor/number.editor.js b/packages/fineui/src/widget/numbereditor/number.editor.js similarity index 100% rename from src/widget/numbereditor/number.editor.js rename to packages/fineui/src/widget/numbereditor/number.editor.js diff --git a/src/widget/numberinterval/__test__/numberinterval.test.js b/packages/fineui/src/widget/numberinterval/__test__/numberinterval.test.js similarity index 100% rename from src/widget/numberinterval/__test__/numberinterval.test.js rename to packages/fineui/src/widget/numberinterval/__test__/numberinterval.test.js diff --git a/src/widget/numberinterval/numberinterval.js b/packages/fineui/src/widget/numberinterval/numberinterval.js similarity index 100% rename from src/widget/numberinterval/numberinterval.js rename to packages/fineui/src/widget/numberinterval/numberinterval.js diff --git a/src/widget/numberinterval/singleeditor/single.editor.js b/packages/fineui/src/widget/numberinterval/singleeditor/single.editor.js similarity index 100% rename from src/widget/numberinterval/singleeditor/single.editor.js rename to packages/fineui/src/widget/numberinterval/singleeditor/single.editor.js diff --git a/src/widget/searchmultitextvaluecombo/__test__/multitextvalue.combo.search.test.js b/packages/fineui/src/widget/searchmultitextvaluecombo/__test__/multitextvalue.combo.search.test.js similarity index 100% rename from src/widget/searchmultitextvaluecombo/__test__/multitextvalue.combo.search.test.js rename to packages/fineui/src/widget/searchmultitextvaluecombo/__test__/multitextvalue.combo.search.test.js diff --git a/src/widget/searchmultitextvaluecombo/index.js b/packages/fineui/src/widget/searchmultitextvaluecombo/index.js similarity index 100% rename from src/widget/searchmultitextvaluecombo/index.js rename to packages/fineui/src/widget/searchmultitextvaluecombo/index.js diff --git a/src/widget/searchmultitextvaluecombo/multitextvalue.combo.search.js b/packages/fineui/src/widget/searchmultitextvaluecombo/multitextvalue.combo.search.js similarity index 100% rename from src/widget/searchmultitextvaluecombo/multitextvalue.combo.search.js rename to packages/fineui/src/widget/searchmultitextvaluecombo/multitextvalue.combo.search.js diff --git a/src/widget/searchmultitextvaluecombo/multitextvalue.combo.trigger.search.js b/packages/fineui/src/widget/searchmultitextvaluecombo/multitextvalue.combo.trigger.search.js similarity index 100% rename from src/widget/searchmultitextvaluecombo/multitextvalue.combo.trigger.search.js rename to packages/fineui/src/widget/searchmultitextvaluecombo/multitextvalue.combo.trigger.search.js diff --git a/src/widget/searchmultitextvaluecombo/multitextvalue.loader.search.js b/packages/fineui/src/widget/searchmultitextvaluecombo/multitextvalue.loader.search.js similarity index 100% rename from src/widget/searchmultitextvaluecombo/multitextvalue.loader.search.js rename to packages/fineui/src/widget/searchmultitextvaluecombo/multitextvalue.loader.search.js diff --git a/src/widget/searchmultitextvaluecombo/multitextvalue.popup.view.search.js b/packages/fineui/src/widget/searchmultitextvaluecombo/multitextvalue.popup.view.search.js similarity index 100% rename from src/widget/searchmultitextvaluecombo/multitextvalue.popup.view.search.js rename to packages/fineui/src/widget/searchmultitextvaluecombo/multitextvalue.popup.view.search.js diff --git a/src/widget/searchmultitextvaluecombo/trigger/searcher.multitextvalue.js b/packages/fineui/src/widget/searchmultitextvaluecombo/trigger/searcher.multitextvalue.js similarity index 100% rename from src/widget/searchmultitextvaluecombo/trigger/searcher.multitextvalue.js rename to packages/fineui/src/widget/searchmultitextvaluecombo/trigger/searcher.multitextvalue.js diff --git a/src/widget/selecttree/__test__/selecttree.combo.test.js b/packages/fineui/src/widget/selecttree/__test__/selecttree.combo.test.js similarity index 100% rename from src/widget/selecttree/__test__/selecttree.combo.test.js rename to packages/fineui/src/widget/selecttree/__test__/selecttree.combo.test.js diff --git a/src/widget/selecttree/selecttree.combo.js b/packages/fineui/src/widget/selecttree/selecttree.combo.js similarity index 100% rename from src/widget/selecttree/selecttree.combo.js rename to packages/fineui/src/widget/selecttree/selecttree.combo.js diff --git a/src/widget/selecttree/selecttree.expander.js b/packages/fineui/src/widget/selecttree/selecttree.expander.js similarity index 100% rename from src/widget/selecttree/selecttree.expander.js rename to packages/fineui/src/widget/selecttree/selecttree.expander.js diff --git a/src/widget/selecttree/selecttree.popup.js b/packages/fineui/src/widget/selecttree/selecttree.popup.js similarity index 100% rename from src/widget/selecttree/selecttree.popup.js rename to packages/fineui/src/widget/selecttree/selecttree.popup.js diff --git a/src/widget/singleselect/__test__/singleselect.combo.test.js b/packages/fineui/src/widget/singleselect/__test__/singleselect.combo.test.js similarity index 100% rename from src/widget/singleselect/__test__/singleselect.combo.test.js rename to packages/fineui/src/widget/singleselect/__test__/singleselect.combo.test.js diff --git a/src/widget/singleselect/__test__/singleselect.insert.combo.test.js b/packages/fineui/src/widget/singleselect/__test__/singleselect.insert.combo.test.js similarity index 100% rename from src/widget/singleselect/__test__/singleselect.insert.combo.test.js rename to packages/fineui/src/widget/singleselect/__test__/singleselect.insert.combo.test.js diff --git a/src/widget/singleselect/index.js b/packages/fineui/src/widget/singleselect/index.js similarity index 100% rename from src/widget/singleselect/index.js rename to packages/fineui/src/widget/singleselect/index.js diff --git a/src/widget/singleselect/search/index.js b/packages/fineui/src/widget/singleselect/search/index.js similarity index 100% rename from src/widget/singleselect/search/index.js rename to packages/fineui/src/widget/singleselect/search/index.js diff --git a/src/widget/singleselect/search/singleselect.search.loader.js b/packages/fineui/src/widget/singleselect/search/singleselect.search.loader.js similarity index 100% rename from src/widget/singleselect/search/singleselect.search.loader.js rename to packages/fineui/src/widget/singleselect/search/singleselect.search.loader.js diff --git a/src/widget/singleselect/search/singleselect.search.pane.insert.js b/packages/fineui/src/widget/singleselect/search/singleselect.search.pane.insert.js similarity index 100% rename from src/widget/singleselect/search/singleselect.search.pane.insert.js rename to packages/fineui/src/widget/singleselect/search/singleselect.search.pane.insert.js diff --git a/src/widget/singleselect/search/singleselect.search.pane.js b/packages/fineui/src/widget/singleselect/search/singleselect.search.pane.js similarity index 100% rename from src/widget/singleselect/search/singleselect.search.pane.js rename to packages/fineui/src/widget/singleselect/search/singleselect.search.pane.js diff --git a/src/widget/singleselect/singleselect.combo.js b/packages/fineui/src/widget/singleselect/singleselect.combo.js similarity index 100% rename from src/widget/singleselect/singleselect.combo.js rename to packages/fineui/src/widget/singleselect/singleselect.combo.js diff --git a/src/widget/singleselect/singleselect.insert.combo.js b/packages/fineui/src/widget/singleselect/singleselect.insert.combo.js similarity index 100% rename from src/widget/singleselect/singleselect.insert.combo.js rename to packages/fineui/src/widget/singleselect/singleselect.insert.combo.js diff --git a/src/widget/singleselect/singleselect.list.js b/packages/fineui/src/widget/singleselect/singleselect.list.js similarity index 100% rename from src/widget/singleselect/singleselect.list.js rename to packages/fineui/src/widget/singleselect/singleselect.list.js diff --git a/src/widget/singleselect/singleselect.loader.js b/packages/fineui/src/widget/singleselect/singleselect.loader.js similarity index 100% rename from src/widget/singleselect/singleselect.loader.js rename to packages/fineui/src/widget/singleselect/singleselect.loader.js diff --git a/src/widget/singleselect/singleselect.popup.view.js b/packages/fineui/src/widget/singleselect/singleselect.popup.view.js similarity index 100% rename from src/widget/singleselect/singleselect.popup.view.js rename to packages/fineui/src/widget/singleselect/singleselect.popup.view.js diff --git a/src/widget/singleselect/singleselect.trigger.js b/packages/fineui/src/widget/singleselect/singleselect.trigger.js similarity index 100% rename from src/widget/singleselect/singleselect.trigger.js rename to packages/fineui/src/widget/singleselect/singleselect.trigger.js diff --git a/src/widget/singleselect/singleselectlist.insert.js b/packages/fineui/src/widget/singleselect/singleselectlist.insert.js similarity index 100% rename from src/widget/singleselect/singleselectlist.insert.js rename to packages/fineui/src/widget/singleselect/singleselectlist.insert.js diff --git a/src/widget/singleselect/trigger/editor.singleselect.js b/packages/fineui/src/widget/singleselect/trigger/editor.singleselect.js similarity index 100% rename from src/widget/singleselect/trigger/editor.singleselect.js rename to packages/fineui/src/widget/singleselect/trigger/editor.singleselect.js diff --git a/src/widget/singleselect/trigger/index.js b/packages/fineui/src/widget/singleselect/trigger/index.js similarity index 100% rename from src/widget/singleselect/trigger/index.js rename to packages/fineui/src/widget/singleselect/trigger/index.js diff --git a/src/widget/singleselect/trigger/searcher.singleselect.js b/packages/fineui/src/widget/singleselect/trigger/searcher.singleselect.js similarity index 100% rename from src/widget/singleselect/trigger/searcher.singleselect.js rename to packages/fineui/src/widget/singleselect/trigger/searcher.singleselect.js diff --git a/src/widget/singleslider/__test__/singleslider.test.js b/packages/fineui/src/widget/singleslider/__test__/singleslider.test.js similarity index 100% rename from src/widget/singleslider/__test__/singleslider.test.js rename to packages/fineui/src/widget/singleslider/__test__/singleslider.test.js diff --git a/src/widget/singleslider/button/editor.sign.text.js b/packages/fineui/src/widget/singleslider/button/editor.sign.text.js similarity index 100% rename from src/widget/singleslider/button/editor.sign.text.js rename to packages/fineui/src/widget/singleslider/button/editor.sign.text.js diff --git a/src/widget/singleslider/button/iconbutton.slider.js b/packages/fineui/src/widget/singleslider/button/iconbutton.slider.js similarity index 100% rename from src/widget/singleslider/button/iconbutton.slider.js rename to packages/fineui/src/widget/singleslider/button/iconbutton.slider.js diff --git a/src/widget/singleslider/index.js b/packages/fineui/src/widget/singleslider/index.js similarity index 100% rename from src/widget/singleslider/index.js rename to packages/fineui/src/widget/singleslider/index.js diff --git a/src/widget/singleslider/singleslider.js b/packages/fineui/src/widget/singleslider/singleslider.js similarity index 100% rename from src/widget/singleslider/singleslider.js rename to packages/fineui/src/widget/singleslider/singleslider.js diff --git a/src/widget/singleslider/singleslider.label.js b/packages/fineui/src/widget/singleslider/singleslider.label.js similarity index 100% rename from src/widget/singleslider/singleslider.label.js rename to packages/fineui/src/widget/singleslider/singleslider.label.js diff --git a/src/widget/singleslider/singleslider.normal.js b/packages/fineui/src/widget/singleslider/singleslider.normal.js similarity index 100% rename from src/widget/singleslider/singleslider.normal.js rename to packages/fineui/src/widget/singleslider/singleslider.normal.js diff --git a/src/widget/singletree/__test__/singletree.combo.test.js b/packages/fineui/src/widget/singletree/__test__/singletree.combo.test.js similarity index 100% rename from src/widget/singletree/__test__/singletree.combo.test.js rename to packages/fineui/src/widget/singletree/__test__/singletree.combo.test.js diff --git a/src/widget/singletree/singletree.combo.js b/packages/fineui/src/widget/singletree/singletree.combo.js similarity index 100% rename from src/widget/singletree/singletree.combo.js rename to packages/fineui/src/widget/singletree/singletree.combo.js diff --git a/src/widget/singletree/singletree.popup.js b/packages/fineui/src/widget/singletree/singletree.popup.js similarity index 100% rename from src/widget/singletree/singletree.popup.js rename to packages/fineui/src/widget/singletree/singletree.popup.js diff --git a/src/widget/singletree/singletree.trigger.js b/packages/fineui/src/widget/singletree/singletree.trigger.js similarity index 100% rename from src/widget/singletree/singletree.trigger.js rename to packages/fineui/src/widget/singletree/singletree.trigger.js diff --git a/src/widget/textvaluedownlistcombo/__test__/combo.textvaluedownlist.test.js b/packages/fineui/src/widget/textvaluedownlistcombo/__test__/combo.textvaluedownlist.test.js similarity index 100% rename from src/widget/textvaluedownlistcombo/__test__/combo.textvaluedownlist.test.js rename to packages/fineui/src/widget/textvaluedownlistcombo/__test__/combo.textvaluedownlist.test.js diff --git a/src/widget/textvaluedownlistcombo/combo.textvaluedownlist.js b/packages/fineui/src/widget/textvaluedownlistcombo/combo.textvaluedownlist.js similarity index 100% rename from src/widget/textvaluedownlistcombo/combo.textvaluedownlist.js rename to packages/fineui/src/widget/textvaluedownlistcombo/combo.textvaluedownlist.js diff --git a/src/widget/textvaluedownlistcombo/index.js b/packages/fineui/src/widget/textvaluedownlistcombo/index.js similarity index 100% rename from src/widget/textvaluedownlistcombo/index.js rename to packages/fineui/src/widget/textvaluedownlistcombo/index.js diff --git a/src/widget/textvaluedownlistcombo/trigger.textvaluedownlist.js b/packages/fineui/src/widget/textvaluedownlistcombo/trigger.textvaluedownlist.js similarity index 100% rename from src/widget/textvaluedownlistcombo/trigger.textvaluedownlist.js rename to packages/fineui/src/widget/textvaluedownlistcombo/trigger.textvaluedownlist.js diff --git a/src/widget/time/__test__/time.combo.test.js b/packages/fineui/src/widget/time/__test__/time.combo.test.js similarity index 100% rename from src/widget/time/__test__/time.combo.test.js rename to packages/fineui/src/widget/time/__test__/time.combo.test.js diff --git a/src/widget/time/datetime.popup.js b/packages/fineui/src/widget/time/datetime.popup.js similarity index 100% rename from src/widget/time/datetime.popup.js rename to packages/fineui/src/widget/time/datetime.popup.js diff --git a/src/widget/time/index.js b/packages/fineui/src/widget/time/index.js similarity index 100% rename from src/widget/time/index.js rename to packages/fineui/src/widget/time/index.js diff --git a/src/widget/time/time.combo.js b/packages/fineui/src/widget/time/time.combo.js similarity index 100% rename from src/widget/time/time.combo.js rename to packages/fineui/src/widget/time/time.combo.js diff --git a/src/widget/time/time.trigger.js b/packages/fineui/src/widget/time/time.trigger.js similarity index 100% rename from src/widget/time/time.trigger.js rename to packages/fineui/src/widget/time/time.trigger.js diff --git a/src/widget/timeinterval/__test__/timeinterval.test.js b/packages/fineui/src/widget/timeinterval/__test__/timeinterval.test.js similarity index 100% rename from src/widget/timeinterval/__test__/timeinterval.test.js rename to packages/fineui/src/widget/timeinterval/__test__/timeinterval.test.js diff --git a/src/widget/timeinterval/dateinterval.js b/packages/fineui/src/widget/timeinterval/dateinterval.js similarity index 100% rename from src/widget/timeinterval/dateinterval.js rename to packages/fineui/src/widget/timeinterval/dateinterval.js diff --git a/src/widget/timeinterval/index.js b/packages/fineui/src/widget/timeinterval/index.js similarity index 100% rename from src/widget/timeinterval/index.js rename to packages/fineui/src/widget/timeinterval/index.js diff --git a/src/widget/timeinterval/timeinterval.js b/packages/fineui/src/widget/timeinterval/timeinterval.js similarity index 100% rename from src/widget/timeinterval/timeinterval.js rename to packages/fineui/src/widget/timeinterval/timeinterval.js diff --git a/src/widget/timeinterval/timeperiods.js b/packages/fineui/src/widget/timeinterval/timeperiods.js similarity index 100% rename from src/widget/timeinterval/timeperiods.js rename to packages/fineui/src/widget/timeinterval/timeperiods.js diff --git a/src/widget/year/__test__/combo.year.test.js b/packages/fineui/src/widget/year/__test__/combo.year.test.js similarity index 100% rename from src/widget/year/__test__/combo.year.test.js rename to packages/fineui/src/widget/year/__test__/combo.year.test.js diff --git a/src/widget/year/card.dynamic.year.js b/packages/fineui/src/widget/year/card.dynamic.year.js similarity index 100% rename from src/widget/year/card.dynamic.year.js rename to packages/fineui/src/widget/year/card.dynamic.year.js diff --git a/src/widget/year/card.year.js b/packages/fineui/src/widget/year/card.year.js similarity index 100% rename from src/widget/year/card.year.js rename to packages/fineui/src/widget/year/card.year.js diff --git a/src/widget/year/combo.year.js b/packages/fineui/src/widget/year/combo.year.js similarity index 100% rename from src/widget/year/combo.year.js rename to packages/fineui/src/widget/year/combo.year.js diff --git a/src/widget/year/index.js b/packages/fineui/src/widget/year/index.js similarity index 100% rename from src/widget/year/index.js rename to packages/fineui/src/widget/year/index.js diff --git a/src/widget/year/popup.year.js b/packages/fineui/src/widget/year/popup.year.js similarity index 100% rename from src/widget/year/popup.year.js rename to packages/fineui/src/widget/year/popup.year.js diff --git a/src/widget/year/trigger.year.js b/packages/fineui/src/widget/year/trigger.year.js similarity index 100% rename from src/widget/year/trigger.year.js rename to packages/fineui/src/widget/year/trigger.year.js diff --git a/src/widget/yearinterval/yearinterval.js b/packages/fineui/src/widget/yearinterval/yearinterval.js similarity index 100% rename from src/widget/yearinterval/yearinterval.js rename to packages/fineui/src/widget/yearinterval/yearinterval.js diff --git a/src/widget/yearmonth/__test__/combo.yearmonth.test.js b/packages/fineui/src/widget/yearmonth/__test__/combo.yearmonth.test.js similarity index 100% rename from src/widget/yearmonth/__test__/combo.yearmonth.test.js rename to packages/fineui/src/widget/yearmonth/__test__/combo.yearmonth.test.js diff --git a/src/widget/yearmonth/card.dynamic.yearmonth.js b/packages/fineui/src/widget/yearmonth/card.dynamic.yearmonth.js similarity index 100% rename from src/widget/yearmonth/card.dynamic.yearmonth.js rename to packages/fineui/src/widget/yearmonth/card.dynamic.yearmonth.js diff --git a/src/widget/yearmonth/card.static.yearmonth.js b/packages/fineui/src/widget/yearmonth/card.static.yearmonth.js similarity index 100% rename from src/widget/yearmonth/card.static.yearmonth.js rename to packages/fineui/src/widget/yearmonth/card.static.yearmonth.js diff --git a/src/widget/yearmonth/combo.yearmonth.js b/packages/fineui/src/widget/yearmonth/combo.yearmonth.js similarity index 100% rename from src/widget/yearmonth/combo.yearmonth.js rename to packages/fineui/src/widget/yearmonth/combo.yearmonth.js diff --git a/src/widget/yearmonth/index.js b/packages/fineui/src/widget/yearmonth/index.js similarity index 100% rename from src/widget/yearmonth/index.js rename to packages/fineui/src/widget/yearmonth/index.js diff --git a/src/widget/yearmonth/popup.yearmonth.js b/packages/fineui/src/widget/yearmonth/popup.yearmonth.js similarity index 100% rename from src/widget/yearmonth/popup.yearmonth.js rename to packages/fineui/src/widget/yearmonth/popup.yearmonth.js diff --git a/src/widget/yearmonth/trigger.yearmonth.js b/packages/fineui/src/widget/yearmonth/trigger.yearmonth.js similarity index 100% rename from src/widget/yearmonth/trigger.yearmonth.js rename to packages/fineui/src/widget/yearmonth/trigger.yearmonth.js diff --git a/src/widget/yearmonthinterval/__test__/yearmonthinterval.test.js b/packages/fineui/src/widget/yearmonthinterval/__test__/yearmonthinterval.test.js similarity index 100% rename from src/widget/yearmonthinterval/__test__/yearmonthinterval.test.js rename to packages/fineui/src/widget/yearmonthinterval/__test__/yearmonthinterval.test.js diff --git a/src/widget/yearmonthinterval/yearmonthinterval.js b/packages/fineui/src/widget/yearmonthinterval/yearmonthinterval.js similarity index 100% rename from src/widget/yearmonthinterval/yearmonthinterval.js rename to packages/fineui/src/widget/yearmonthinterval/yearmonthinterval.js diff --git a/src/widget/yearquarter/__test__/combo.yearquarter.test.js b/packages/fineui/src/widget/yearquarter/__test__/combo.yearquarter.test.js similarity index 100% rename from src/widget/yearquarter/__test__/combo.yearquarter.test.js rename to packages/fineui/src/widget/yearquarter/__test__/combo.yearquarter.test.js diff --git a/src/widget/yearquarter/card.dynamic.yearquarter.js b/packages/fineui/src/widget/yearquarter/card.dynamic.yearquarter.js similarity index 100% rename from src/widget/yearquarter/card.dynamic.yearquarter.js rename to packages/fineui/src/widget/yearquarter/card.dynamic.yearquarter.js diff --git a/src/widget/yearquarter/card.static.yearquarter.js b/packages/fineui/src/widget/yearquarter/card.static.yearquarter.js similarity index 100% rename from src/widget/yearquarter/card.static.yearquarter.js rename to packages/fineui/src/widget/yearquarter/card.static.yearquarter.js diff --git a/src/widget/yearquarter/combo.yearquarter.js b/packages/fineui/src/widget/yearquarter/combo.yearquarter.js similarity index 100% rename from src/widget/yearquarter/combo.yearquarter.js rename to packages/fineui/src/widget/yearquarter/combo.yearquarter.js diff --git a/src/widget/yearquarter/index.js b/packages/fineui/src/widget/yearquarter/index.js similarity index 100% rename from src/widget/yearquarter/index.js rename to packages/fineui/src/widget/yearquarter/index.js diff --git a/src/widget/yearquarter/popup.yearquarter.js b/packages/fineui/src/widget/yearquarter/popup.yearquarter.js similarity index 100% rename from src/widget/yearquarter/popup.yearquarter.js rename to packages/fineui/src/widget/yearquarter/popup.yearquarter.js diff --git a/src/widget/yearquarter/trigger.yearquarter.js b/packages/fineui/src/widget/yearquarter/trigger.yearquarter.js similarity index 100% rename from src/widget/yearquarter/trigger.yearquarter.js rename to packages/fineui/src/widget/yearquarter/trigger.yearquarter.js diff --git a/src/widget/yearquarterinterval/yearquarterinterval.js b/packages/fineui/src/widget/yearquarterinterval/yearquarterinterval.js similarity index 100% rename from src/widget/yearquarterinterval/yearquarterinterval.js rename to packages/fineui/src/widget/yearquarterinterval/yearquarterinterval.js diff --git a/packages/fineui/tsconfig.json b/packages/fineui/tsconfig.json new file mode 100644 index 000000000..c4d27c622 --- /dev/null +++ b/packages/fineui/tsconfig.json @@ -0,0 +1,26 @@ +{ + "compilerOptions": { + "sourceMap": true, + "target": "es2017", + "module": "es2015", + "moduleResolution": "node", + "lib": ["es2017", "dom"], + "declaration": true, + "experimentalDecorators": true, + "outDir": "./type/lib", + "baseUrl": ".", + // "strict": true, + "strictNullChecks": true, + "noImplicitAny": true, + "noImplicitThis": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noImplicitReturns": true, + "noFallthroughCasesInSwitch": true, + "emitDeclarationOnly": true, + "paths": { + "@": ["src"] + } + }, + "include": ["typescript/*.ts", "typescript/**/*.ts", "types/*.d.ts", "src/*.js", "src/**/*.js"] +} diff --git a/types/globals.d.ts b/packages/fineui/types/globals.d.ts similarity index 100% rename from types/globals.d.ts rename to packages/fineui/types/globals.d.ts diff --git a/typescript/base/a/a.ts b/packages/fineui/typescript/base/a/a.ts similarity index 100% rename from typescript/base/a/a.ts rename to packages/fineui/typescript/base/a/a.ts diff --git a/typescript/base/base.ts b/packages/fineui/typescript/base/base.ts similarity index 100% rename from typescript/base/base.ts rename to packages/fineui/typescript/base/base.ts diff --git a/typescript/base/combination/combo.ts b/packages/fineui/typescript/base/combination/combo.ts similarity index 100% rename from typescript/base/combination/combo.ts rename to packages/fineui/typescript/base/combination/combo.ts diff --git a/typescript/base/combination/expander.ts b/packages/fineui/typescript/base/combination/expander.ts similarity index 100% rename from typescript/base/combination/expander.ts rename to packages/fineui/typescript/base/combination/expander.ts diff --git a/typescript/base/combination/group.button.ts b/packages/fineui/typescript/base/combination/group.button.ts similarity index 100% rename from typescript/base/combination/group.button.ts rename to packages/fineui/typescript/base/combination/group.button.ts diff --git a/typescript/base/combination/group.virtual.ts b/packages/fineui/typescript/base/combination/group.virtual.ts similarity index 100% rename from typescript/base/combination/group.virtual.ts rename to packages/fineui/typescript/base/combination/group.virtual.ts diff --git a/typescript/base/combination/loader.ts b/packages/fineui/typescript/base/combination/loader.ts similarity index 100% rename from typescript/base/combination/loader.ts rename to packages/fineui/typescript/base/combination/loader.ts diff --git a/typescript/base/combination/searcher.ts b/packages/fineui/typescript/base/combination/searcher.ts similarity index 100% rename from typescript/base/combination/searcher.ts rename to packages/fineui/typescript/base/combination/searcher.ts diff --git a/typescript/base/combination/switcher.ts b/packages/fineui/typescript/base/combination/switcher.ts similarity index 100% rename from typescript/base/combination/switcher.ts rename to packages/fineui/typescript/base/combination/switcher.ts diff --git a/typescript/base/combination/tab.ts b/packages/fineui/typescript/base/combination/tab.ts similarity index 100% rename from typescript/base/combination/tab.ts rename to packages/fineui/typescript/base/combination/tab.ts diff --git a/typescript/base/combination/tree.button.ts b/packages/fineui/typescript/base/combination/tree.button.ts similarity index 100% rename from typescript/base/combination/tree.button.ts rename to packages/fineui/typescript/base/combination/tree.button.ts diff --git a/typescript/base/foundation/message.ts b/packages/fineui/typescript/base/foundation/message.ts similarity index 100% rename from typescript/base/foundation/message.ts rename to packages/fineui/typescript/base/foundation/message.ts diff --git a/typescript/base/layer/layer.popover.ts b/packages/fineui/typescript/base/layer/layer.popover.ts similarity index 100% rename from typescript/base/layer/layer.popover.ts rename to packages/fineui/typescript/base/layer/layer.popover.ts diff --git a/typescript/base/layer/layer.popup.ts b/packages/fineui/typescript/base/layer/layer.popup.ts similarity index 100% rename from typescript/base/layer/layer.popup.ts rename to packages/fineui/typescript/base/layer/layer.popup.ts diff --git a/typescript/base/list/listview.ts b/packages/fineui/typescript/base/list/listview.ts similarity index 100% rename from typescript/base/list/listview.ts rename to packages/fineui/typescript/base/list/listview.ts diff --git a/typescript/base/list/virtualgrouplist.ts b/packages/fineui/typescript/base/list/virtualgrouplist.ts similarity index 100% rename from typescript/base/list/virtualgrouplist.ts rename to packages/fineui/typescript/base/list/virtualgrouplist.ts diff --git a/typescript/base/list/virtuallist.ts b/packages/fineui/typescript/base/list/virtuallist.ts similarity index 100% rename from typescript/base/list/virtuallist.ts rename to packages/fineui/typescript/base/list/virtuallist.ts diff --git a/typescript/base/pager/pager.ts b/packages/fineui/typescript/base/pager/pager.ts similarity index 100% rename from typescript/base/pager/pager.ts rename to packages/fineui/typescript/base/pager/pager.ts diff --git a/typescript/base/pane.ts b/packages/fineui/typescript/base/pane.ts similarity index 100% rename from typescript/base/pane.ts rename to packages/fineui/typescript/base/pane.ts diff --git a/typescript/base/single/button/button.basic.ts b/packages/fineui/typescript/base/single/button/button.basic.ts similarity index 100% rename from typescript/base/single/button/button.basic.ts rename to packages/fineui/typescript/base/single/button/button.basic.ts diff --git a/typescript/base/single/button/button.node.ts b/packages/fineui/typescript/base/single/button/button.node.ts similarity index 100% rename from typescript/base/single/button/button.node.ts rename to packages/fineui/typescript/base/single/button/button.node.ts diff --git a/typescript/base/single/button/buttons/button.icon.ts b/packages/fineui/typescript/base/single/button/buttons/button.icon.ts similarity index 100% rename from typescript/base/single/button/buttons/button.icon.ts rename to packages/fineui/typescript/base/single/button/buttons/button.icon.ts diff --git a/typescript/base/single/button/buttons/button.image.ts b/packages/fineui/typescript/base/single/button/buttons/button.image.ts similarity index 100% rename from typescript/base/single/button/buttons/button.image.ts rename to packages/fineui/typescript/base/single/button/buttons/button.image.ts diff --git a/typescript/base/single/button/buttons/button.text.ts b/packages/fineui/typescript/base/single/button/buttons/button.text.ts similarity index 100% rename from typescript/base/single/button/buttons/button.text.ts rename to packages/fineui/typescript/base/single/button/buttons/button.text.ts diff --git a/typescript/base/single/button/buttons/button.ts b/packages/fineui/typescript/base/single/button/buttons/button.ts similarity index 100% rename from typescript/base/single/button/buttons/button.ts rename to packages/fineui/typescript/base/single/button/buttons/button.ts diff --git a/typescript/base/single/button/listitem/blankicontextitem.ts b/packages/fineui/typescript/base/single/button/listitem/blankicontextitem.ts similarity index 100% rename from typescript/base/single/button/listitem/blankicontextitem.ts rename to packages/fineui/typescript/base/single/button/listitem/blankicontextitem.ts diff --git a/typescript/base/single/button/listitem/icontexticonitem.ts b/packages/fineui/typescript/base/single/button/listitem/icontexticonitem.ts similarity index 100% rename from typescript/base/single/button/listitem/icontexticonitem.ts rename to packages/fineui/typescript/base/single/button/listitem/icontexticonitem.ts diff --git a/typescript/base/single/button/listitem/icontextitem.ts b/packages/fineui/typescript/base/single/button/listitem/icontextitem.ts similarity index 100% rename from typescript/base/single/button/listitem/icontextitem.ts rename to packages/fineui/typescript/base/single/button/listitem/icontextitem.ts diff --git a/typescript/base/single/button/node/textnode.ts b/packages/fineui/typescript/base/single/button/node/textnode.ts similarity index 100% rename from typescript/base/single/button/node/textnode.ts rename to packages/fineui/typescript/base/single/button/node/textnode.ts diff --git a/typescript/base/single/editor/editor.textarea.ts b/packages/fineui/typescript/base/single/editor/editor.textarea.ts similarity index 100% rename from typescript/base/single/editor/editor.textarea.ts rename to packages/fineui/typescript/base/single/editor/editor.textarea.ts diff --git a/typescript/base/single/editor/editor.ts b/packages/fineui/typescript/base/single/editor/editor.ts similarity index 100% rename from typescript/base/single/editor/editor.ts rename to packages/fineui/typescript/base/single/editor/editor.ts diff --git a/typescript/base/single/html/html.ts b/packages/fineui/typescript/base/single/html/html.ts similarity index 100% rename from typescript/base/single/html/html.ts rename to packages/fineui/typescript/base/single/html/html.ts diff --git a/typescript/base/single/icon/icon.ts b/packages/fineui/typescript/base/single/icon/icon.ts similarity index 100% rename from typescript/base/single/icon/icon.ts rename to packages/fineui/typescript/base/single/icon/icon.ts diff --git a/typescript/base/single/iframe/iframe.ts b/packages/fineui/typescript/base/single/iframe/iframe.ts similarity index 100% rename from typescript/base/single/iframe/iframe.ts rename to packages/fineui/typescript/base/single/iframe/iframe.ts diff --git a/typescript/base/single/img/img.ts b/packages/fineui/typescript/base/single/img/img.ts similarity index 100% rename from typescript/base/single/img/img.ts rename to packages/fineui/typescript/base/single/img/img.ts diff --git a/typescript/base/single/input/checkbox.ts b/packages/fineui/typescript/base/single/input/checkbox.ts similarity index 100% rename from typescript/base/single/input/checkbox.ts rename to packages/fineui/typescript/base/single/input/checkbox.ts diff --git a/typescript/base/single/input/input.ts b/packages/fineui/typescript/base/single/input/input.ts similarity index 100% rename from typescript/base/single/input/input.ts rename to packages/fineui/typescript/base/single/input/input.ts diff --git a/typescript/base/single/input/radio/radio.ts b/packages/fineui/typescript/base/single/input/radio/radio.ts similarity index 100% rename from typescript/base/single/input/radio/radio.ts rename to packages/fineui/typescript/base/single/input/radio/radio.ts diff --git a/typescript/base/single/label/abstract.label.ts b/packages/fineui/typescript/base/single/label/abstract.label.ts similarity index 100% rename from typescript/base/single/label/abstract.label.ts rename to packages/fineui/typescript/base/single/label/abstract.label.ts diff --git a/typescript/base/single/label/html.label.ts b/packages/fineui/typescript/base/single/label/html.label.ts similarity index 100% rename from typescript/base/single/label/html.label.ts rename to packages/fineui/typescript/base/single/label/html.label.ts diff --git a/typescript/base/single/label/icon.label.ts b/packages/fineui/typescript/base/single/label/icon.label.ts similarity index 100% rename from typescript/base/single/label/icon.label.ts rename to packages/fineui/typescript/base/single/label/icon.label.ts diff --git a/typescript/base/single/label/label.ts b/packages/fineui/typescript/base/single/label/label.ts similarity index 100% rename from typescript/base/single/label/label.ts rename to packages/fineui/typescript/base/single/label/label.ts diff --git a/typescript/base/single/single.ts b/packages/fineui/typescript/base/single/single.ts similarity index 100% rename from typescript/base/single/single.ts rename to packages/fineui/typescript/base/single/single.ts diff --git a/typescript/base/single/text.ts b/packages/fineui/typescript/base/single/text.ts similarity index 100% rename from typescript/base/single/text.ts rename to packages/fineui/typescript/base/single/text.ts diff --git a/typescript/base/single/trigger/trigger.ts b/packages/fineui/typescript/base/single/trigger/trigger.ts similarity index 100% rename from typescript/base/single/trigger/trigger.ts rename to packages/fineui/typescript/base/single/trigger/trigger.ts diff --git a/typescript/base/tree/customtree.ts b/packages/fineui/typescript/base/tree/customtree.ts similarity index 100% rename from typescript/base/tree/customtree.ts rename to packages/fineui/typescript/base/tree/customtree.ts diff --git a/typescript/base/tree/ztree/asynctree.ts b/packages/fineui/typescript/base/tree/ztree/asynctree.ts similarity index 100% rename from typescript/base/tree/ztree/asynctree.ts rename to packages/fineui/typescript/base/tree/ztree/asynctree.ts diff --git a/typescript/base/tree/ztree/list/listasynctree.ts b/packages/fineui/typescript/base/tree/ztree/list/listasynctree.ts similarity index 100% rename from typescript/base/tree/ztree/list/listasynctree.ts rename to packages/fineui/typescript/base/tree/ztree/list/listasynctree.ts diff --git a/typescript/base/tree/ztree/list/listtreeview.ts b/packages/fineui/typescript/base/tree/ztree/list/listtreeview.ts similarity index 100% rename from typescript/base/tree/ztree/list/listtreeview.ts rename to packages/fineui/typescript/base/tree/ztree/list/listtreeview.ts diff --git a/typescript/base/tree/ztree/treeview.ts b/packages/fineui/typescript/base/tree/ztree/treeview.ts similarity index 100% rename from typescript/base/tree/ztree/treeview.ts rename to packages/fineui/typescript/base/tree/ztree/treeview.ts diff --git a/typescript/bundle.ts b/packages/fineui/typescript/bundle.ts similarity index 100% rename from typescript/bundle.ts rename to packages/fineui/typescript/bundle.ts diff --git a/typescript/case/button/icon/icon.change.ts b/packages/fineui/typescript/case/button/icon/icon.change.ts similarity index 100% rename from typescript/case/button/icon/icon.change.ts rename to packages/fineui/typescript/case/button/icon/icon.change.ts diff --git a/typescript/case/button/icon/icon.trigger.ts b/packages/fineui/typescript/case/button/icon/icon.trigger.ts similarity index 100% rename from typescript/case/button/icon/icon.trigger.ts rename to packages/fineui/typescript/case/button/icon/icon.trigger.ts diff --git a/typescript/case/button/icon/iconhalf/icon.half.image.ts b/packages/fineui/typescript/case/button/icon/iconhalf/icon.half.image.ts similarity index 100% rename from typescript/case/button/icon/iconhalf/icon.half.image.ts rename to packages/fineui/typescript/case/button/icon/iconhalf/icon.half.image.ts diff --git a/typescript/case/button/icon/iconhalf/icon.half.ts b/packages/fineui/typescript/case/button/icon/iconhalf/icon.half.ts similarity index 100% rename from typescript/case/button/icon/iconhalf/icon.half.ts rename to packages/fineui/typescript/case/button/icon/iconhalf/icon.half.ts diff --git a/typescript/case/button/item.multiselect.ts b/packages/fineui/typescript/case/button/item.multiselect.ts similarity index 100% rename from typescript/case/button/item.multiselect.ts rename to packages/fineui/typescript/case/button/item.multiselect.ts diff --git a/typescript/case/button/item.singleselect.radio.ts b/packages/fineui/typescript/case/button/item.singleselect.radio.ts similarity index 100% rename from typescript/case/button/item.singleselect.radio.ts rename to packages/fineui/typescript/case/button/item.singleselect.radio.ts diff --git a/typescript/case/button/item.singleselect.ts b/packages/fineui/typescript/case/button/item.singleselect.ts similarity index 100% rename from typescript/case/button/item.singleselect.ts rename to packages/fineui/typescript/case/button/item.singleselect.ts diff --git a/typescript/case/button/node/node.icon.arrow.ts b/packages/fineui/typescript/case/button/node/node.icon.arrow.ts similarity index 100% rename from typescript/case/button/node/node.icon.arrow.ts rename to packages/fineui/typescript/case/button/node/node.icon.arrow.ts diff --git a/typescript/case/button/switch.ts b/packages/fineui/typescript/case/button/switch.ts similarity index 100% rename from typescript/case/button/switch.ts rename to packages/fineui/typescript/case/button/switch.ts diff --git a/typescript/case/button/treeitem/item.first.treeleaf.ts b/packages/fineui/typescript/case/button/treeitem/item.first.treeleaf.ts similarity index 100% rename from typescript/case/button/treeitem/item.first.treeleaf.ts rename to packages/fineui/typescript/case/button/treeitem/item.first.treeleaf.ts diff --git a/typescript/case/button/treeitem/item.last.treeleaf.ts b/packages/fineui/typescript/case/button/treeitem/item.last.treeleaf.ts similarity index 100% rename from typescript/case/button/treeitem/item.last.treeleaf.ts rename to packages/fineui/typescript/case/button/treeitem/item.last.treeleaf.ts diff --git a/typescript/case/button/treeitem/item.mid.treeleaf.ts b/packages/fineui/typescript/case/button/treeitem/item.mid.treeleaf.ts similarity index 100% rename from typescript/case/button/treeitem/item.mid.treeleaf.ts rename to packages/fineui/typescript/case/button/treeitem/item.mid.treeleaf.ts diff --git a/typescript/case/checkbox/check.arrownode.ts b/packages/fineui/typescript/case/checkbox/check.arrownode.ts similarity index 100% rename from typescript/case/checkbox/check.arrownode.ts rename to packages/fineui/typescript/case/checkbox/check.arrownode.ts diff --git a/typescript/case/colorchooser/colorchooser.popup.hex.ts b/packages/fineui/typescript/case/colorchooser/colorchooser.popup.hex.ts similarity index 100% rename from typescript/case/colorchooser/colorchooser.popup.hex.ts rename to packages/fineui/typescript/case/colorchooser/colorchooser.popup.hex.ts diff --git a/typescript/case/colorchooser/colorchooser.simple.ts b/packages/fineui/typescript/case/colorchooser/colorchooser.simple.ts similarity index 100% rename from typescript/case/colorchooser/colorchooser.simple.ts rename to packages/fineui/typescript/case/colorchooser/colorchooser.simple.ts diff --git a/typescript/case/colorchooser/colorchooser.ts b/packages/fineui/typescript/case/colorchooser/colorchooser.ts similarity index 100% rename from typescript/case/colorchooser/colorchooser.ts rename to packages/fineui/typescript/case/colorchooser/colorchooser.ts diff --git a/typescript/case/combo/bubblecombo/combo.bubble.ts b/packages/fineui/typescript/case/combo/bubblecombo/combo.bubble.ts similarity index 100% rename from typescript/case/combo/bubblecombo/combo.bubble.ts rename to packages/fineui/typescript/case/combo/bubblecombo/combo.bubble.ts diff --git a/typescript/case/combo/bubblecombo/popup.bubble.ts b/packages/fineui/typescript/case/combo/bubblecombo/popup.bubble.ts similarity index 100% rename from typescript/case/combo/bubblecombo/popup.bubble.ts rename to packages/fineui/typescript/case/combo/bubblecombo/popup.bubble.ts diff --git a/typescript/case/combo/combo.textvalue.ts b/packages/fineui/typescript/case/combo/combo.textvalue.ts similarity index 100% rename from typescript/case/combo/combo.textvalue.ts rename to packages/fineui/typescript/case/combo/combo.textvalue.ts diff --git a/typescript/case/combo/combo.textvaluesmall.ts b/packages/fineui/typescript/case/combo/combo.textvaluesmall.ts similarity index 100% rename from typescript/case/combo/combo.textvaluesmall.ts rename to packages/fineui/typescript/case/combo/combo.textvaluesmall.ts diff --git a/typescript/case/combo/editoriconcheckcombo/combo.editiconcheck.ts b/packages/fineui/typescript/case/combo/editoriconcheckcombo/combo.editiconcheck.ts similarity index 100% rename from typescript/case/combo/editoriconcheckcombo/combo.editiconcheck.ts rename to packages/fineui/typescript/case/combo/editoriconcheckcombo/combo.editiconcheck.ts diff --git a/typescript/case/combo/iconcombo/combo.icon.ts b/packages/fineui/typescript/case/combo/iconcombo/combo.icon.ts similarity index 100% rename from typescript/case/combo/iconcombo/combo.icon.ts rename to packages/fineui/typescript/case/combo/iconcombo/combo.icon.ts diff --git a/typescript/case/combo/icontextvaluecombo/combo.icontextvalue.ts b/packages/fineui/typescript/case/combo/icontextvaluecombo/combo.icontextvalue.ts similarity index 100% rename from typescript/case/combo/icontextvaluecombo/combo.icontextvalue.ts rename to packages/fineui/typescript/case/combo/icontextvaluecombo/combo.icontextvalue.ts diff --git a/typescript/case/combo/popup.textvalue.ts b/packages/fineui/typescript/case/combo/popup.textvalue.ts similarity index 100% rename from typescript/case/combo/popup.textvalue.ts rename to packages/fineui/typescript/case/combo/popup.textvalue.ts diff --git a/typescript/case/combo/searchtextvaluecombo/combo.searchtextvalue.ts b/packages/fineui/typescript/case/combo/searchtextvaluecombo/combo.searchtextvalue.ts similarity index 100% rename from typescript/case/combo/searchtextvaluecombo/combo.searchtextvalue.ts rename to packages/fineui/typescript/case/combo/searchtextvaluecombo/combo.searchtextvalue.ts diff --git a/typescript/case/combo/textvaluecheckcombo/combo.textvaluecheck.ts b/packages/fineui/typescript/case/combo/textvaluecheckcombo/combo.textvaluecheck.ts similarity index 100% rename from typescript/case/combo/textvaluecheckcombo/combo.textvaluecheck.ts rename to packages/fineui/typescript/case/combo/textvaluecheckcombo/combo.textvaluecheck.ts diff --git a/typescript/case/combo/textvaluecheckcombo/popup.textvaluecheck.ts b/packages/fineui/typescript/case/combo/textvaluecheckcombo/popup.textvaluecheck.ts similarity index 100% rename from typescript/case/combo/textvaluecheckcombo/popup.textvaluecheck.ts rename to packages/fineui/typescript/case/combo/textvaluecheckcombo/popup.textvaluecheck.ts diff --git a/typescript/case/editor/editor.shelter.ts b/packages/fineui/typescript/case/editor/editor.shelter.ts similarity index 100% rename from typescript/case/editor/editor.shelter.ts rename to packages/fineui/typescript/case/editor/editor.shelter.ts diff --git a/typescript/case/editor/editor.sign.ts b/packages/fineui/typescript/case/editor/editor.sign.ts similarity index 100% rename from typescript/case/editor/editor.sign.ts rename to packages/fineui/typescript/case/editor/editor.sign.ts diff --git a/typescript/case/editor/editor.state.ts b/packages/fineui/typescript/case/editor/editor.state.ts similarity index 100% rename from typescript/case/editor/editor.state.ts rename to packages/fineui/typescript/case/editor/editor.state.ts diff --git a/typescript/case/layer/layer.multipopup.ts b/packages/fineui/typescript/case/layer/layer.multipopup.ts similarity index 100% rename from typescript/case/layer/layer.multipopup.ts rename to packages/fineui/typescript/case/layer/layer.multipopup.ts diff --git a/typescript/case/layer/pane.list.ts b/packages/fineui/typescript/case/layer/pane.list.ts similarity index 100% rename from typescript/case/layer/pane.list.ts rename to packages/fineui/typescript/case/layer/pane.list.ts diff --git a/typescript/case/linersegment/linear.segment.ts b/packages/fineui/typescript/case/linersegment/linear.segment.ts similarity index 100% rename from typescript/case/linersegment/linear.segment.ts rename to packages/fineui/typescript/case/linersegment/linear.segment.ts diff --git a/typescript/case/list/list.select.ts b/packages/fineui/typescript/case/list/list.select.ts similarity index 100% rename from typescript/case/list/list.select.ts rename to packages/fineui/typescript/case/list/list.select.ts diff --git a/typescript/case/pager/pager.all.count.ts b/packages/fineui/typescript/case/pager/pager.all.count.ts similarity index 100% rename from typescript/case/pager/pager.all.count.ts rename to packages/fineui/typescript/case/pager/pager.all.count.ts diff --git a/typescript/case/pager/pager.direction.ts b/packages/fineui/typescript/case/pager/pager.direction.ts similarity index 100% rename from typescript/case/pager/pager.direction.ts rename to packages/fineui/typescript/case/pager/pager.direction.ts diff --git a/typescript/case/segment/segment.ts b/packages/fineui/typescript/case/segment/segment.ts similarity index 100% rename from typescript/case/segment/segment.ts rename to packages/fineui/typescript/case/segment/segment.ts diff --git a/typescript/case/toolbar/toolbar.multiselect.ts b/packages/fineui/typescript/case/toolbar/toolbar.multiselect.ts similarity index 100% rename from typescript/case/toolbar/toolbar.multiselect.ts rename to packages/fineui/typescript/case/toolbar/toolbar.multiselect.ts diff --git a/typescript/case/trigger/trigger.text.select.ts b/packages/fineui/typescript/case/trigger/trigger.text.select.ts similarity index 100% rename from typescript/case/trigger/trigger.text.select.ts rename to packages/fineui/typescript/case/trigger/trigger.text.select.ts diff --git a/typescript/case/trigger/trigger.text.ts b/packages/fineui/typescript/case/trigger/trigger.text.ts similarity index 100% rename from typescript/case/trigger/trigger.text.ts rename to packages/fineui/typescript/case/trigger/trigger.text.ts diff --git a/typescript/component/allvaluechooser/abstract.allvaluechooser.ts b/packages/fineui/typescript/component/allvaluechooser/abstract.allvaluechooser.ts similarity index 100% rename from typescript/component/allvaluechooser/abstract.allvaluechooser.ts rename to packages/fineui/typescript/component/allvaluechooser/abstract.allvaluechooser.ts diff --git a/typescript/component/allvaluechooser/combo.allvaluechooser.ts b/packages/fineui/typescript/component/allvaluechooser/combo.allvaluechooser.ts similarity index 100% rename from typescript/component/allvaluechooser/combo.allvaluechooser.ts rename to packages/fineui/typescript/component/allvaluechooser/combo.allvaluechooser.ts diff --git a/typescript/component/allvaluemultitextvaluecombo/allvalue.multitextvalue.combo.ts b/packages/fineui/typescript/component/allvaluemultitextvaluecombo/allvalue.multitextvalue.combo.ts similarity index 100% rename from typescript/component/allvaluemultitextvaluecombo/allvalue.multitextvalue.combo.ts rename to packages/fineui/typescript/component/allvaluemultitextvaluecombo/allvalue.multitextvalue.combo.ts diff --git a/typescript/component/form/form.ts b/packages/fineui/typescript/component/form/form.ts similarity index 100% rename from typescript/component/form/form.ts rename to packages/fineui/typescript/component/form/form.ts diff --git a/typescript/component/treevaluechooser/abstract.treevaluechooser.list.ts b/packages/fineui/typescript/component/treevaluechooser/abstract.treevaluechooser.list.ts similarity index 100% rename from typescript/component/treevaluechooser/abstract.treevaluechooser.list.ts rename to packages/fineui/typescript/component/treevaluechooser/abstract.treevaluechooser.list.ts diff --git a/typescript/component/treevaluechooser/abstract.treevaluechooser.ts b/packages/fineui/typescript/component/treevaluechooser/abstract.treevaluechooser.ts similarity index 100% rename from typescript/component/treevaluechooser/abstract.treevaluechooser.ts rename to packages/fineui/typescript/component/treevaluechooser/abstract.treevaluechooser.ts diff --git a/typescript/component/treevaluechooser/combo.listtreevaluechooser.ts b/packages/fineui/typescript/component/treevaluechooser/combo.listtreevaluechooser.ts similarity index 100% rename from typescript/component/treevaluechooser/combo.listtreevaluechooser.ts rename to packages/fineui/typescript/component/treevaluechooser/combo.listtreevaluechooser.ts diff --git a/typescript/component/treevaluechooser/combo.treevaluechooser.insert.ts b/packages/fineui/typescript/component/treevaluechooser/combo.treevaluechooser.insert.ts similarity index 100% rename from typescript/component/treevaluechooser/combo.treevaluechooser.insert.ts rename to packages/fineui/typescript/component/treevaluechooser/combo.treevaluechooser.insert.ts diff --git a/typescript/component/treevaluechooser/combo.treevaluechooser.ts b/packages/fineui/typescript/component/treevaluechooser/combo.treevaluechooser.ts similarity index 100% rename from typescript/component/treevaluechooser/combo.treevaluechooser.ts rename to packages/fineui/typescript/component/treevaluechooser/combo.treevaluechooser.ts diff --git a/typescript/component/treevaluechooser/pane.treevaluechooser.ts b/packages/fineui/typescript/component/treevaluechooser/pane.treevaluechooser.ts similarity index 100% rename from typescript/component/treevaluechooser/pane.treevaluechooser.ts rename to packages/fineui/typescript/component/treevaluechooser/pane.treevaluechooser.ts diff --git a/typescript/core/action/action.show.ts b/packages/fineui/typescript/core/action/action.show.ts similarity index 100% rename from typescript/core/action/action.show.ts rename to packages/fineui/typescript/core/action/action.show.ts diff --git a/typescript/core/action/action.ts b/packages/fineui/typescript/core/action/action.ts similarity index 100% rename from typescript/core/action/action.ts rename to packages/fineui/typescript/core/action/action.ts diff --git a/typescript/core/base.ts b/packages/fineui/typescript/core/base.ts similarity index 100% rename from typescript/core/base.ts rename to packages/fineui/typescript/core/base.ts diff --git a/typescript/core/behavior/behavior.highlight.ts b/packages/fineui/typescript/core/behavior/behavior.highlight.ts similarity index 100% rename from typescript/core/behavior/behavior.highlight.ts rename to packages/fineui/typescript/core/behavior/behavior.highlight.ts diff --git a/typescript/core/behavior/behavior.redmark.ts b/packages/fineui/typescript/core/behavior/behavior.redmark.ts similarity index 100% rename from typescript/core/behavior/behavior.redmark.ts rename to packages/fineui/typescript/core/behavior/behavior.redmark.ts diff --git a/typescript/core/behavior/behavior.ts b/packages/fineui/typescript/core/behavior/behavior.ts similarity index 100% rename from typescript/core/behavior/behavior.ts rename to packages/fineui/typescript/core/behavior/behavior.ts diff --git a/typescript/core/controller/controller.broadcast.ts b/packages/fineui/typescript/core/controller/controller.broadcast.ts similarity index 100% rename from typescript/core/controller/controller.broadcast.ts rename to packages/fineui/typescript/core/controller/controller.broadcast.ts diff --git a/typescript/core/controller/controller.layer.ts b/packages/fineui/typescript/core/controller/controller.layer.ts similarity index 100% rename from typescript/core/controller/controller.layer.ts rename to packages/fineui/typescript/core/controller/controller.layer.ts diff --git a/typescript/core/controller/controller.ts b/packages/fineui/typescript/core/controller/controller.ts similarity index 100% rename from typescript/core/controller/controller.ts rename to packages/fineui/typescript/core/controller/controller.ts diff --git a/typescript/core/decorator/decorator.ts b/packages/fineui/typescript/core/decorator/decorator.ts similarity index 100% rename from typescript/core/decorator/decorator.ts rename to packages/fineui/typescript/core/decorator/decorator.ts diff --git a/typescript/core/func/array.ts b/packages/fineui/typescript/core/func/array.ts similarity index 100% rename from typescript/core/func/array.ts rename to packages/fineui/typescript/core/func/array.ts diff --git a/typescript/core/func/date.ts b/packages/fineui/typescript/core/func/date.ts similarity index 100% rename from typescript/core/func/date.ts rename to packages/fineui/typescript/core/func/date.ts diff --git a/typescript/core/func/function.ts b/packages/fineui/typescript/core/func/function.ts similarity index 100% rename from typescript/core/func/function.ts rename to packages/fineui/typescript/core/func/function.ts diff --git a/typescript/core/func/index.ts b/packages/fineui/typescript/core/func/index.ts similarity index 100% rename from typescript/core/func/index.ts rename to packages/fineui/typescript/core/func/index.ts diff --git a/typescript/core/func/number.ts b/packages/fineui/typescript/core/func/number.ts similarity index 100% rename from typescript/core/func/number.ts rename to packages/fineui/typescript/core/func/number.ts diff --git a/typescript/core/func/string.ts b/packages/fineui/typescript/core/func/string.ts similarity index 100% rename from typescript/core/func/string.ts rename to packages/fineui/typescript/core/func/string.ts diff --git a/typescript/core/i18n.ts b/packages/fineui/typescript/core/i18n.ts similarity index 100% rename from typescript/core/i18n.ts rename to packages/fineui/typescript/core/i18n.ts diff --git a/typescript/core/inject.ts b/packages/fineui/typescript/core/inject.ts similarity index 100% rename from typescript/core/inject.ts rename to packages/fineui/typescript/core/inject.ts diff --git a/typescript/core/ob.ts b/packages/fineui/typescript/core/ob.ts similarity index 100% rename from typescript/core/ob.ts rename to packages/fineui/typescript/core/ob.ts diff --git a/typescript/core/platform/web/detectElementResize.ts b/packages/fineui/typescript/core/platform/web/detectElementResize.ts similarity index 100% rename from typescript/core/platform/web/detectElementResize.ts rename to packages/fineui/typescript/core/platform/web/detectElementResize.ts diff --git a/typescript/core/platform/web/dom.ts b/packages/fineui/typescript/core/platform/web/dom.ts similarity index 100% rename from typescript/core/platform/web/dom.ts rename to packages/fineui/typescript/core/platform/web/dom.ts diff --git a/typescript/core/platform/web/eventListener.ts b/packages/fineui/typescript/core/platform/web/eventListener.ts similarity index 100% rename from typescript/core/platform/web/eventListener.ts rename to packages/fineui/typescript/core/platform/web/eventListener.ts diff --git a/typescript/core/platform/web/function.ts b/packages/fineui/typescript/core/platform/web/function.ts similarity index 100% rename from typescript/core/platform/web/function.ts rename to packages/fineui/typescript/core/platform/web/function.ts diff --git a/typescript/core/platform/web/index.ts b/packages/fineui/typescript/core/platform/web/index.ts similarity index 100% rename from typescript/core/platform/web/index.ts rename to packages/fineui/typescript/core/platform/web/index.ts diff --git a/typescript/core/platform/web/load.ts b/packages/fineui/typescript/core/platform/web/load.ts similarity index 100% rename from typescript/core/platform/web/load.ts rename to packages/fineui/typescript/core/platform/web/load.ts diff --git a/typescript/core/plugin.ts b/packages/fineui/typescript/core/plugin.ts similarity index 100% rename from typescript/core/plugin.ts rename to packages/fineui/typescript/core/plugin.ts diff --git a/typescript/core/utils/aes.ts b/packages/fineui/typescript/core/utils/aes.ts similarity index 100% rename from typescript/core/utils/aes.ts rename to packages/fineui/typescript/core/utils/aes.ts diff --git a/typescript/core/utils/aspect.ts b/packages/fineui/typescript/core/utils/aspect.ts similarity index 100% rename from typescript/core/utils/aspect.ts rename to packages/fineui/typescript/core/utils/aspect.ts diff --git a/typescript/core/utils/base64.ts b/packages/fineui/typescript/core/utils/base64.ts similarity index 100% rename from typescript/core/utils/base64.ts rename to packages/fineui/typescript/core/utils/base64.ts diff --git a/typescript/core/utils/cache.ts b/packages/fineui/typescript/core/utils/cache.ts similarity index 100% rename from typescript/core/utils/cache.ts rename to packages/fineui/typescript/core/utils/cache.ts diff --git a/typescript/core/utils/cellSizeAndPositionManager.ts b/packages/fineui/typescript/core/utils/cellSizeAndPositionManager.ts similarity index 100% rename from typescript/core/utils/cellSizeAndPositionManager.ts rename to packages/fineui/typescript/core/utils/cellSizeAndPositionManager.ts diff --git a/typescript/core/utils/chinesePY.ts b/packages/fineui/typescript/core/utils/chinesePY.ts similarity index 100% rename from typescript/core/utils/chinesePY.ts rename to packages/fineui/typescript/core/utils/chinesePY.ts diff --git a/typescript/core/utils/events/mousemovetracker.ts b/packages/fineui/typescript/core/utils/events/mousemovetracker.ts similarity index 100% rename from typescript/core/utils/events/mousemovetracker.ts rename to packages/fineui/typescript/core/utils/events/mousemovetracker.ts diff --git a/typescript/core/utils/events/wheelhandler.ts b/packages/fineui/typescript/core/utils/events/wheelhandler.ts similarity index 100% rename from typescript/core/utils/events/wheelhandler.ts rename to packages/fineui/typescript/core/utils/events/wheelhandler.ts diff --git a/typescript/core/utils/heap.ts b/packages/fineui/typescript/core/utils/heap.ts similarity index 100% rename from typescript/core/utils/heap.ts rename to packages/fineui/typescript/core/utils/heap.ts diff --git a/typescript/core/utils/index.ts b/packages/fineui/typescript/core/utils/index.ts similarity index 100% rename from typescript/core/utils/index.ts rename to packages/fineui/typescript/core/utils/index.ts diff --git a/typescript/core/utils/linkedHashMap.ts b/packages/fineui/typescript/core/utils/linkedHashMap.ts similarity index 100% rename from typescript/core/utils/linkedHashMap.ts rename to packages/fineui/typescript/core/utils/linkedHashMap.ts diff --git a/typescript/core/utils/lru.ts b/packages/fineui/typescript/core/utils/lru.ts similarity index 100% rename from typescript/core/utils/lru.ts rename to packages/fineui/typescript/core/utils/lru.ts diff --git a/typescript/core/utils/prefixIntervalTree.ts b/packages/fineui/typescript/core/utils/prefixIntervalTree.ts similarity index 100% rename from typescript/core/utils/prefixIntervalTree.ts rename to packages/fineui/typescript/core/utils/prefixIntervalTree.ts diff --git a/typescript/core/utils/queue.ts b/packages/fineui/typescript/core/utils/queue.ts similarity index 100% rename from typescript/core/utils/queue.ts rename to packages/fineui/typescript/core/utils/queue.ts diff --git a/typescript/core/utils/sectionManager.ts b/packages/fineui/typescript/core/utils/sectionManager.ts similarity index 100% rename from typescript/core/utils/sectionManager.ts rename to packages/fineui/typescript/core/utils/sectionManager.ts diff --git a/typescript/core/utils/tree.ts b/packages/fineui/typescript/core/utils/tree.ts similarity index 100% rename from typescript/core/utils/tree.ts rename to packages/fineui/typescript/core/utils/tree.ts diff --git a/typescript/core/utils/vector.ts b/packages/fineui/typescript/core/utils/vector.ts similarity index 100% rename from typescript/core/utils/vector.ts rename to packages/fineui/typescript/core/utils/vector.ts diff --git a/typescript/core/var.ts b/packages/fineui/typescript/core/var.ts similarity index 100% rename from typescript/core/var.ts rename to packages/fineui/typescript/core/var.ts diff --git a/typescript/core/widget.ts b/packages/fineui/typescript/core/widget.ts similarity index 100% rename from typescript/core/widget.ts rename to packages/fineui/typescript/core/widget.ts diff --git a/typescript/core/worker/action/worker.action.ts b/packages/fineui/typescript/core/worker/action/worker.action.ts similarity index 100% rename from typescript/core/worker/action/worker.action.ts rename to packages/fineui/typescript/core/worker/action/worker.action.ts diff --git a/typescript/core/worker/controller/worker.controller.ts b/packages/fineui/typescript/core/worker/controller/worker.controller.ts similarity index 100% rename from typescript/core/worker/controller/worker.controller.ts rename to packages/fineui/typescript/core/worker/controller/worker.controller.ts diff --git a/typescript/core/worker/controller/worker.main_thread.controller.ts b/packages/fineui/typescript/core/worker/controller/worker.main_thread.controller.ts similarity index 100% rename from typescript/core/worker/controller/worker.main_thread.controller.ts rename to packages/fineui/typescript/core/worker/controller/worker.main_thread.controller.ts diff --git a/typescript/core/worker/controller/worker.worker_thread.controller.ts b/packages/fineui/typescript/core/worker/controller/worker.worker_thread.controller.ts similarity index 100% rename from typescript/core/worker/controller/worker.worker_thread.controller.ts rename to packages/fineui/typescript/core/worker/controller/worker.worker_thread.controller.ts diff --git a/typescript/core/worker/worker.channel.ts b/packages/fineui/typescript/core/worker/worker.channel.ts similarity index 100% rename from typescript/core/worker/worker.channel.ts rename to packages/fineui/typescript/core/worker/worker.channel.ts diff --git a/typescript/core/worker/worker.core.ts b/packages/fineui/typescript/core/worker/worker.core.ts similarity index 100% rename from typescript/core/worker/worker.core.ts rename to packages/fineui/typescript/core/worker/worker.core.ts diff --git a/typescript/core/worker/worker.main_thread.ts b/packages/fineui/typescript/core/worker/worker.main_thread.ts similarity index 100% rename from typescript/core/worker/worker.main_thread.ts rename to packages/fineui/typescript/core/worker/worker.main_thread.ts diff --git a/typescript/core/worker/worker.worker_thread.ts b/packages/fineui/typescript/core/worker/worker.worker_thread.ts similarity index 100% rename from typescript/core/worker/worker.worker_thread.ts rename to packages/fineui/typescript/core/worker/worker.worker_thread.ts diff --git a/typescript/core/worker/workers.ts b/packages/fineui/typescript/core/worker/workers.ts similarity index 100% rename from typescript/core/worker/workers.ts rename to packages/fineui/typescript/core/worker/workers.ts diff --git a/typescript/core/wrapper/layout.ts b/packages/fineui/typescript/core/wrapper/layout.ts similarity index 100% rename from typescript/core/wrapper/layout.ts rename to packages/fineui/typescript/core/wrapper/layout.ts diff --git a/typescript/core/wrapper/layout/adapt/absolute.center.ts b/packages/fineui/typescript/core/wrapper/layout/adapt/absolute.center.ts similarity index 100% rename from typescript/core/wrapper/layout/adapt/absolute.center.ts rename to packages/fineui/typescript/core/wrapper/layout/adapt/absolute.center.ts diff --git a/typescript/core/wrapper/layout/adapt/adapt.center.ts b/packages/fineui/typescript/core/wrapper/layout/adapt/adapt.center.ts similarity index 100% rename from typescript/core/wrapper/layout/adapt/adapt.center.ts rename to packages/fineui/typescript/core/wrapper/layout/adapt/adapt.center.ts diff --git a/typescript/core/wrapper/layout/adapt/adapt.horizontal.ts b/packages/fineui/typescript/core/wrapper/layout/adapt/adapt.horizontal.ts similarity index 100% rename from typescript/core/wrapper/layout/adapt/adapt.horizontal.ts rename to packages/fineui/typescript/core/wrapper/layout/adapt/adapt.horizontal.ts diff --git a/typescript/core/wrapper/layout/adapt/adapt.leftrightvertical.ts b/packages/fineui/typescript/core/wrapper/layout/adapt/adapt.leftrightvertical.ts similarity index 100% rename from typescript/core/wrapper/layout/adapt/adapt.leftrightvertical.ts rename to packages/fineui/typescript/core/wrapper/layout/adapt/adapt.leftrightvertical.ts diff --git a/typescript/core/wrapper/layout/adapt/adapt.leftvertical.ts b/packages/fineui/typescript/core/wrapper/layout/adapt/adapt.leftvertical.ts similarity index 100% rename from typescript/core/wrapper/layout/adapt/adapt.leftvertical.ts rename to packages/fineui/typescript/core/wrapper/layout/adapt/adapt.leftvertical.ts diff --git a/typescript/core/wrapper/layout/adapt/adapt.table.ts b/packages/fineui/typescript/core/wrapper/layout/adapt/adapt.table.ts similarity index 100% rename from typescript/core/wrapper/layout/adapt/adapt.table.ts rename to packages/fineui/typescript/core/wrapper/layout/adapt/adapt.table.ts diff --git a/typescript/core/wrapper/layout/adapt/adapt.vertical.ts b/packages/fineui/typescript/core/wrapper/layout/adapt/adapt.vertical.ts similarity index 100% rename from typescript/core/wrapper/layout/adapt/adapt.vertical.ts rename to packages/fineui/typescript/core/wrapper/layout/adapt/adapt.vertical.ts diff --git a/typescript/core/wrapper/layout/adapt/auto.horizontal.ts b/packages/fineui/typescript/core/wrapper/layout/adapt/auto.horizontal.ts similarity index 100% rename from typescript/core/wrapper/layout/adapt/auto.horizontal.ts rename to packages/fineui/typescript/core/wrapper/layout/adapt/auto.horizontal.ts diff --git a/typescript/core/wrapper/layout/adapt/float.horizontal.ts b/packages/fineui/typescript/core/wrapper/layout/adapt/float.horizontal.ts similarity index 100% rename from typescript/core/wrapper/layout/adapt/float.horizontal.ts rename to packages/fineui/typescript/core/wrapper/layout/adapt/float.horizontal.ts diff --git a/typescript/core/wrapper/layout/adapt/inline.vertical.ts b/packages/fineui/typescript/core/wrapper/layout/adapt/inline.vertical.ts similarity index 100% rename from typescript/core/wrapper/layout/adapt/inline.vertical.ts rename to packages/fineui/typescript/core/wrapper/layout/adapt/inline.vertical.ts diff --git a/typescript/core/wrapper/layout/fill/fill.horizontal.ts b/packages/fineui/typescript/core/wrapper/layout/fill/fill.horizontal.ts similarity index 100% rename from typescript/core/wrapper/layout/fill/fill.horizontal.ts rename to packages/fineui/typescript/core/wrapper/layout/fill/fill.horizontal.ts diff --git a/typescript/core/wrapper/layout/fill/fill.vertical.ts b/packages/fineui/typescript/core/wrapper/layout/fill/fill.vertical.ts similarity index 100% rename from typescript/core/wrapper/layout/fill/fill.vertical.ts rename to packages/fineui/typescript/core/wrapper/layout/fill/fill.vertical.ts diff --git a/typescript/core/wrapper/layout/layout.absolute.ts b/packages/fineui/typescript/core/wrapper/layout/layout.absolute.ts similarity index 100% rename from typescript/core/wrapper/layout/layout.absolute.ts rename to packages/fineui/typescript/core/wrapper/layout/layout.absolute.ts diff --git a/typescript/core/wrapper/layout/layout.adaptive.ts b/packages/fineui/typescript/core/wrapper/layout/layout.adaptive.ts similarity index 100% rename from typescript/core/wrapper/layout/layout.adaptive.ts rename to packages/fineui/typescript/core/wrapper/layout/layout.adaptive.ts diff --git a/typescript/core/wrapper/layout/layout.card.ts b/packages/fineui/typescript/core/wrapper/layout/layout.card.ts similarity index 100% rename from typescript/core/wrapper/layout/layout.card.ts rename to packages/fineui/typescript/core/wrapper/layout/layout.card.ts diff --git a/typescript/core/wrapper/layout/layout.default.ts b/packages/fineui/typescript/core/wrapper/layout/layout.default.ts similarity index 100% rename from typescript/core/wrapper/layout/layout.default.ts rename to packages/fineui/typescript/core/wrapper/layout/layout.default.ts diff --git a/typescript/core/wrapper/layout/layout.flow.ts b/packages/fineui/typescript/core/wrapper/layout/layout.flow.ts similarity index 100% rename from typescript/core/wrapper/layout/layout.flow.ts rename to packages/fineui/typescript/core/wrapper/layout/layout.flow.ts diff --git a/typescript/core/wrapper/layout/layout.grid.ts b/packages/fineui/typescript/core/wrapper/layout/layout.grid.ts similarity index 100% rename from typescript/core/wrapper/layout/layout.grid.ts rename to packages/fineui/typescript/core/wrapper/layout/layout.grid.ts diff --git a/typescript/core/wrapper/layout/layout.horizontal.ts b/packages/fineui/typescript/core/wrapper/layout/layout.horizontal.ts similarity index 100% rename from typescript/core/wrapper/layout/layout.horizontal.ts rename to packages/fineui/typescript/core/wrapper/layout/layout.horizontal.ts diff --git a/typescript/core/wrapper/layout/layout.table.ts b/packages/fineui/typescript/core/wrapper/layout/layout.table.ts similarity index 100% rename from typescript/core/wrapper/layout/layout.table.ts rename to packages/fineui/typescript/core/wrapper/layout/layout.table.ts diff --git a/typescript/core/wrapper/layout/layout.tape.ts b/packages/fineui/typescript/core/wrapper/layout/layout.tape.ts similarity index 100% rename from typescript/core/wrapper/layout/layout.tape.ts rename to packages/fineui/typescript/core/wrapper/layout/layout.tape.ts diff --git a/typescript/core/wrapper/layout/layout.td.ts b/packages/fineui/typescript/core/wrapper/layout/layout.td.ts similarity index 100% rename from typescript/core/wrapper/layout/layout.td.ts rename to packages/fineui/typescript/core/wrapper/layout/layout.td.ts diff --git a/typescript/core/wrapper/layout/layout.vertical.ts b/packages/fineui/typescript/core/wrapper/layout/layout.vertical.ts similarity index 100% rename from typescript/core/wrapper/layout/layout.vertical.ts rename to packages/fineui/typescript/core/wrapper/layout/layout.vertical.ts diff --git a/typescript/core/wrapper/layout/middle/middle.center.ts b/packages/fineui/typescript/core/wrapper/layout/middle/middle.center.ts similarity index 100% rename from typescript/core/wrapper/layout/middle/middle.center.ts rename to packages/fineui/typescript/core/wrapper/layout/middle/middle.center.ts diff --git a/typescript/core/wrapper/layout/middle/middle.float.center.ts b/packages/fineui/typescript/core/wrapper/layout/middle/middle.float.center.ts similarity index 100% rename from typescript/core/wrapper/layout/middle/middle.float.center.ts rename to packages/fineui/typescript/core/wrapper/layout/middle/middle.float.center.ts diff --git a/typescript/core/wrapper/layout/sticky/sticky.horizontal.ts b/packages/fineui/typescript/core/wrapper/layout/sticky/sticky.horizontal.ts similarity index 100% rename from typescript/core/wrapper/layout/sticky/sticky.horizontal.ts rename to packages/fineui/typescript/core/wrapper/layout/sticky/sticky.horizontal.ts diff --git a/typescript/core/wrapper/layout/sticky/sticky.vertical.ts b/packages/fineui/typescript/core/wrapper/layout/sticky/sticky.vertical.ts similarity index 100% rename from typescript/core/wrapper/layout/sticky/sticky.vertical.ts rename to packages/fineui/typescript/core/wrapper/layout/sticky/sticky.vertical.ts diff --git a/typescript/index.ts b/packages/fineui/typescript/index.ts similarity index 100% rename from typescript/index.ts rename to packages/fineui/typescript/index.ts diff --git a/typescript/router/router.ts b/packages/fineui/typescript/router/router.ts similarity index 100% rename from typescript/router/router.ts rename to packages/fineui/typescript/router/router.ts diff --git a/typescript/shims-tsx.ts b/packages/fineui/typescript/shims-tsx.ts similarity index 100% rename from typescript/shims-tsx.ts rename to packages/fineui/typescript/shims-tsx.ts diff --git a/typescript/widget/collapse/collapse.ts b/packages/fineui/typescript/widget/collapse/collapse.ts similarity index 100% rename from typescript/widget/collapse/collapse.ts rename to packages/fineui/typescript/widget/collapse/collapse.ts diff --git a/typescript/widget/date/calendar/popup.calendar.date.ts b/packages/fineui/typescript/widget/date/calendar/popup.calendar.date.ts similarity index 100% rename from typescript/widget/date/calendar/popup.calendar.date.ts rename to packages/fineui/typescript/widget/date/calendar/popup.calendar.date.ts diff --git a/typescript/widget/datepane/datepane.ts b/packages/fineui/typescript/widget/datepane/datepane.ts similarity index 100% rename from typescript/widget/datepane/datepane.ts rename to packages/fineui/typescript/widget/datepane/datepane.ts diff --git a/typescript/widget/datetime/datetime.combo.ts b/packages/fineui/typescript/widget/datetime/datetime.combo.ts similarity index 100% rename from typescript/widget/datetime/datetime.combo.ts rename to packages/fineui/typescript/widget/datetime/datetime.combo.ts diff --git a/typescript/widget/datetimepane/datetimepane.ts b/packages/fineui/typescript/widget/datetimepane/datetimepane.ts similarity index 100% rename from typescript/widget/datetimepane/datetimepane.ts rename to packages/fineui/typescript/widget/datetimepane/datetimepane.ts diff --git a/typescript/widget/downlist/combo.downlist.ts b/packages/fineui/typescript/widget/downlist/combo.downlist.ts similarity index 100% rename from typescript/widget/downlist/combo.downlist.ts rename to packages/fineui/typescript/widget/downlist/combo.downlist.ts diff --git a/typescript/widget/downlist/item.downlistgroup.ts b/packages/fineui/typescript/widget/downlist/item.downlistgroup.ts similarity index 100% rename from typescript/widget/downlist/item.downlistgroup.ts rename to packages/fineui/typescript/widget/downlist/item.downlistgroup.ts diff --git a/typescript/widget/downlist/popup.downlist.ts b/packages/fineui/typescript/widget/downlist/popup.downlist.ts similarity index 100% rename from typescript/widget/downlist/popup.downlist.ts rename to packages/fineui/typescript/widget/downlist/popup.downlist.ts diff --git a/typescript/widget/dynamicdate/dynamicdate.combo.ts b/packages/fineui/typescript/widget/dynamicdate/dynamicdate.combo.ts similarity index 100% rename from typescript/widget/dynamicdate/dynamicdate.combo.ts rename to packages/fineui/typescript/widget/dynamicdate/dynamicdate.combo.ts diff --git a/typescript/widget/dynamicdatetime/dynamicdatetime.combo.ts b/packages/fineui/typescript/widget/dynamicdatetime/dynamicdatetime.combo.ts similarity index 100% rename from typescript/widget/dynamicdatetime/dynamicdatetime.combo.ts rename to packages/fineui/typescript/widget/dynamicdatetime/dynamicdatetime.combo.ts diff --git a/typescript/widget/editor/editor.multifile.ts b/packages/fineui/typescript/widget/editor/editor.multifile.ts similarity index 100% rename from typescript/widget/editor/editor.multifile.ts rename to packages/fineui/typescript/widget/editor/editor.multifile.ts diff --git a/typescript/widget/editor/editor.search.ts b/packages/fineui/typescript/widget/editor/editor.search.ts similarity index 100% rename from typescript/widget/editor/editor.search.ts rename to packages/fineui/typescript/widget/editor/editor.search.ts diff --git a/typescript/widget/editor/editor.text.small.ts b/packages/fineui/typescript/widget/editor/editor.text.small.ts similarity index 100% rename from typescript/widget/editor/editor.text.small.ts rename to packages/fineui/typescript/widget/editor/editor.text.small.ts diff --git a/typescript/widget/editor/editor.text.ts b/packages/fineui/typescript/widget/editor/editor.text.ts similarity index 100% rename from typescript/widget/editor/editor.text.ts rename to packages/fineui/typescript/widget/editor/editor.text.ts diff --git a/typescript/widget/intervalslider/intervalslider.ts b/packages/fineui/typescript/widget/intervalslider/intervalslider.ts similarity index 100% rename from typescript/widget/intervalslider/intervalslider.ts rename to packages/fineui/typescript/widget/intervalslider/intervalslider.ts diff --git a/typescript/widget/multilayerdownlist/multilayerdownlist.combo.ts b/packages/fineui/typescript/widget/multilayerdownlist/multilayerdownlist.combo.ts similarity index 100% rename from typescript/widget/multilayerdownlist/multilayerdownlist.combo.ts rename to packages/fineui/typescript/widget/multilayerdownlist/multilayerdownlist.combo.ts diff --git a/typescript/widget/multilayerdownlist/multilayerdownlist.popup.ts b/packages/fineui/typescript/widget/multilayerdownlist/multilayerdownlist.popup.ts similarity index 100% rename from typescript/widget/multilayerdownlist/multilayerdownlist.popup.ts rename to packages/fineui/typescript/widget/multilayerdownlist/multilayerdownlist.popup.ts diff --git a/typescript/widget/multilayerselecttree/multilayerselecttree.combo.ts b/packages/fineui/typescript/widget/multilayerselecttree/multilayerselecttree.combo.ts similarity index 100% rename from typescript/widget/multilayerselecttree/multilayerselecttree.combo.ts rename to packages/fineui/typescript/widget/multilayerselecttree/multilayerselecttree.combo.ts diff --git a/typescript/widget/multilayerselecttree/multilayerselecttree.leveltree.ts b/packages/fineui/typescript/widget/multilayerselecttree/multilayerselecttree.leveltree.ts similarity index 100% rename from typescript/widget/multilayerselecttree/multilayerselecttree.leveltree.ts rename to packages/fineui/typescript/widget/multilayerselecttree/multilayerselecttree.leveltree.ts diff --git a/typescript/widget/multilayerselecttree/multilayerselecttree.popup.ts b/packages/fineui/typescript/widget/multilayerselecttree/multilayerselecttree.popup.ts similarity index 100% rename from typescript/widget/multilayerselecttree/multilayerselecttree.popup.ts rename to packages/fineui/typescript/widget/multilayerselecttree/multilayerselecttree.popup.ts diff --git a/typescript/widget/multilayersingletree/multilayersingletree.combo.ts b/packages/fineui/typescript/widget/multilayersingletree/multilayersingletree.combo.ts similarity index 100% rename from typescript/widget/multilayersingletree/multilayersingletree.combo.ts rename to packages/fineui/typescript/widget/multilayersingletree/multilayersingletree.combo.ts diff --git a/typescript/widget/multilayersingletree/multilayersingletree.leveltree.ts b/packages/fineui/typescript/widget/multilayersingletree/multilayersingletree.leveltree.ts similarity index 100% rename from typescript/widget/multilayersingletree/multilayersingletree.leveltree.ts rename to packages/fineui/typescript/widget/multilayersingletree/multilayersingletree.leveltree.ts diff --git a/typescript/widget/multilayersingletree/multilayersingletree.popup.ts b/packages/fineui/typescript/widget/multilayersingletree/multilayersingletree.popup.ts similarity index 100% rename from typescript/widget/multilayersingletree/multilayersingletree.popup.ts rename to packages/fineui/typescript/widget/multilayersingletree/multilayersingletree.popup.ts diff --git a/typescript/widget/multiselect/multiselect.combo.ts b/packages/fineui/typescript/widget/multiselect/multiselect.combo.ts similarity index 100% rename from typescript/widget/multiselect/multiselect.combo.ts rename to packages/fineui/typescript/widget/multiselect/multiselect.combo.ts diff --git a/typescript/widget/multiselect/multiselect.insert.combo.ts b/packages/fineui/typescript/widget/multiselect/multiselect.insert.combo.ts similarity index 100% rename from typescript/widget/multiselect/multiselect.insert.combo.ts rename to packages/fineui/typescript/widget/multiselect/multiselect.insert.combo.ts diff --git a/typescript/widget/multiselectlist/multiselectlist.insert.ts b/packages/fineui/typescript/widget/multiselectlist/multiselectlist.insert.ts similarity index 100% rename from typescript/widget/multiselectlist/multiselectlist.insert.ts rename to packages/fineui/typescript/widget/multiselectlist/multiselectlist.insert.ts diff --git a/typescript/widget/multiselecttree/multiselecttree.ts b/packages/fineui/typescript/widget/multiselecttree/multiselecttree.ts similarity index 100% rename from typescript/widget/multiselecttree/multiselecttree.ts rename to packages/fineui/typescript/widget/multiselecttree/multiselecttree.ts diff --git a/typescript/widget/multitree/multi.tree.combo.ts b/packages/fineui/typescript/widget/multitree/multi.tree.combo.ts similarity index 100% rename from typescript/widget/multitree/multi.tree.combo.ts rename to packages/fineui/typescript/widget/multitree/multi.tree.combo.ts diff --git a/typescript/widget/multitree/multi.tree.insert.combo.ts b/packages/fineui/typescript/widget/multitree/multi.tree.insert.combo.ts similarity index 100% rename from typescript/widget/multitree/multi.tree.insert.combo.ts rename to packages/fineui/typescript/widget/multitree/multi.tree.insert.combo.ts diff --git a/typescript/widget/multitree/multi.tree.list.combo.ts b/packages/fineui/typescript/widget/multitree/multi.tree.list.combo.ts similarity index 100% rename from typescript/widget/multitree/multi.tree.list.combo.ts rename to packages/fineui/typescript/widget/multitree/multi.tree.list.combo.ts diff --git a/typescript/widget/multitree/multi.tree.popup.ts b/packages/fineui/typescript/widget/multitree/multi.tree.popup.ts similarity index 100% rename from typescript/widget/multitree/multi.tree.popup.ts rename to packages/fineui/typescript/widget/multitree/multi.tree.popup.ts diff --git a/typescript/widget/numbereditor/numbereditor.ts b/packages/fineui/typescript/widget/numbereditor/numbereditor.ts similarity index 100% rename from typescript/widget/numbereditor/numbereditor.ts rename to packages/fineui/typescript/widget/numbereditor/numbereditor.ts diff --git a/typescript/widget/numberinterval/numberinterval.ts b/packages/fineui/typescript/widget/numberinterval/numberinterval.ts similarity index 100% rename from typescript/widget/numberinterval/numberinterval.ts rename to packages/fineui/typescript/widget/numberinterval/numberinterval.ts diff --git a/typescript/widget/selecttree/selecttree.expander.ts b/packages/fineui/typescript/widget/selecttree/selecttree.expander.ts similarity index 100% rename from typescript/widget/selecttree/selecttree.expander.ts rename to packages/fineui/typescript/widget/selecttree/selecttree.expander.ts diff --git a/typescript/widget/singleselect/singleselect.combo.ts b/packages/fineui/typescript/widget/singleselect/singleselect.combo.ts similarity index 100% rename from typescript/widget/singleselect/singleselect.combo.ts rename to packages/fineui/typescript/widget/singleselect/singleselect.combo.ts diff --git a/typescript/widget/singleselect/singleselect.insert.combo.ts b/packages/fineui/typescript/widget/singleselect/singleselect.insert.combo.ts similarity index 100% rename from typescript/widget/singleselect/singleselect.insert.combo.ts rename to packages/fineui/typescript/widget/singleselect/singleselect.insert.combo.ts diff --git a/typescript/widget/singleselect/singleselectlist.insert.ts b/packages/fineui/typescript/widget/singleselect/singleselectlist.insert.ts similarity index 100% rename from typescript/widget/singleselect/singleselectlist.insert.ts rename to packages/fineui/typescript/widget/singleselect/singleselectlist.insert.ts diff --git a/typescript/widget/textvaluedownlistcombo/combo.textvaluedownlist.ts b/packages/fineui/typescript/widget/textvaluedownlistcombo/combo.textvaluedownlist.ts similarity index 100% rename from typescript/widget/textvaluedownlistcombo/combo.textvaluedownlist.ts rename to packages/fineui/typescript/widget/textvaluedownlistcombo/combo.textvaluedownlist.ts diff --git a/typescript/widget/time/time.combo.ts b/packages/fineui/typescript/widget/time/time.combo.ts similarity index 100% rename from typescript/widget/time/time.combo.ts rename to packages/fineui/typescript/widget/time/time.combo.ts diff --git a/typescript/widget/timeinterval/dateinterval.ts b/packages/fineui/typescript/widget/timeinterval/dateinterval.ts similarity index 100% rename from typescript/widget/timeinterval/dateinterval.ts rename to packages/fineui/typescript/widget/timeinterval/dateinterval.ts diff --git a/typescript/widget/timeinterval/timeinterval.ts b/packages/fineui/typescript/widget/timeinterval/timeinterval.ts similarity index 100% rename from typescript/widget/timeinterval/timeinterval.ts rename to packages/fineui/typescript/widget/timeinterval/timeinterval.ts diff --git a/typescript/widget/year/combo.year.ts b/packages/fineui/typescript/widget/year/combo.year.ts similarity index 100% rename from typescript/widget/year/combo.year.ts rename to packages/fineui/typescript/widget/year/combo.year.ts diff --git a/typescript/widget/year/popup.year.ts b/packages/fineui/typescript/widget/year/popup.year.ts similarity index 100% rename from typescript/widget/year/popup.year.ts rename to packages/fineui/typescript/widget/year/popup.year.ts diff --git a/typescript/widget/yearmonth/combo.yearmonth.ts b/packages/fineui/typescript/widget/yearmonth/combo.yearmonth.ts similarity index 100% rename from typescript/widget/yearmonth/combo.yearmonth.ts rename to packages/fineui/typescript/widget/yearmonth/combo.yearmonth.ts diff --git a/typescript/widget/yearmonth/popup.yearmonth.ts b/packages/fineui/typescript/widget/yearmonth/popup.yearmonth.ts similarity index 100% rename from typescript/widget/yearmonth/popup.yearmonth.ts rename to packages/fineui/typescript/widget/yearmonth/popup.yearmonth.ts diff --git a/typescript/widget/yearmonthinterval/yearmonthinterval.ts b/packages/fineui/typescript/widget/yearmonthinterval/yearmonthinterval.ts similarity index 100% rename from typescript/widget/yearmonthinterval/yearmonthinterval.ts rename to packages/fineui/typescript/widget/yearmonthinterval/yearmonthinterval.ts diff --git a/typescript/widget/yearquarter/combo.yearquarter.ts b/packages/fineui/typescript/widget/yearquarter/combo.yearquarter.ts similarity index 100% rename from typescript/widget/yearquarter/combo.yearquarter.ts rename to packages/fineui/typescript/widget/yearquarter/combo.yearquarter.ts diff --git a/packages/fineui/webpack.prod.js b/packages/fineui/webpack.prod.js new file mode 100644 index 000000000..074fea17a --- /dev/null +++ b/packages/fineui/webpack.prod.js @@ -0,0 +1,77 @@ +const HtmlWebpackPlugin = require('html-webpack-plugin'); +const path = require('path'); + +module.exports = { + mode: 'production', + entry: './src/index.js', + devServer: { + port: 3000, + liveReload: true, + }, + devtool: 'hidden-source-map', + module: { + rules: [ + { + test: /\.js$/, + exclude: /node_modules/, + use: { + loader: 'babel-loader', + }, + }, + { + test: /\.(css|less)$/, + use: [ + MiniCssExtractPlugin.loader, + { + loader: 'css-loader', + options: { + url: false, + }, + }, + { + loader: 'postcss-loader', + options: { + plugins: [autoprefixer], + }, + }, + { + loader: 'less-loader', + options: { + relativeUrls: false, + modifyVars: lessVariables, + }, + }, + ], + }, + ], + }, + resolve: { + extensions: ['.js', '.ts'], + alias: { + '@': path.resolve(__dirname, '../src'), + }, + }, + plugins: [ + new MiniCssExtractPlugin({ + path: dirs.DEST, + filename: '[name].css', + }), + new ForkTsCheckerWebpackPlugin({}), + new OptimizeCssAssetsPlugin({ + assetNameRegExp: /\.css$/g, + cssProcessor: require('cssnano'), + cssProcessorPluginOptions: { + preset: [ + 'default', + { + discardComments: { + removeAll: true, + }, + normalizeUnicode: false, + }, + ], + }, + canPrint: true, + }), + ], +}; diff --git a/plugins/webpack-fui-worker-plugin/constants.js b/plugins/webpack-fui-worker-plugin/constants.js deleted file mode 100644 index 7b80ac3dc..000000000 --- a/plugins/webpack-fui-worker-plugin/constants.js +++ /dev/null @@ -1,9 +0,0 @@ -const WorkerPluginName = 'FuiWorkerPlugin'; -const WorkerLoaderName = 'FuiWorkerWorkerLoader'; -const FileNamePrefix = 'worker-'; - -module.exports = { - WorkerPluginName, - WorkerLoaderName, - FileNamePrefix, -}; diff --git a/plugins/webpack-fui-worker-plugin/index.js b/plugins/webpack-fui-worker-plugin/index.js deleted file mode 100644 index 2fa9b3ed0..000000000 --- a/plugins/webpack-fui-worker-plugin/index.js +++ /dev/null @@ -1,79 +0,0 @@ -/* - * worker-plugin - */ - -const path = require('path'); -const webpack = require('webpack'); -const { WorkerPluginName } = require('./constants'); -const ModuleFilenameHelpers = require('webpack/lib/ModuleFilenameHelpers'); - -class FuiWorkerPlugin { - constructor(options = {}) { - this.options = options; - } - - apply(compiler) { - // 为主线程构建添加 __WORKER__ 环境变量, 构建中区分不同线程源码, 实现代码拆减 - compiler.hooks.afterPlugins.tap(WorkerPluginName, compiler => { - new webpack.DefinePlugin({ - // __WORKER__ 表示当前所在线程是否是 worker 线程 - // 主线程构建中为 false - __WORKER__: false, - }).apply(compiler); - }); - - // 添加自定义的worker entry-loader - compiler.hooks.afterResolvers.tap(WorkerPluginName, compiler => { - /** - * https://webpack.js.org/configuration/resolve/#resolveloader - * 使用 resolveloader 添加自定义的 worker loader - */ - if (!compiler.options.resolveLoader) { - compiler.options.resolveLoader = { - alias: {}, - }; - } - if (!compiler.options.resolveLoader.alias) { - compiler.options.resolveLoader.alias = {}; - } - - // 动态添加 worker 的 worker-loader, 命名为 "fui-worker" - compiler.options.resolveLoader.alias['fui-worker'] = path.resolve(__dirname, './worker-loader.js'); - }); - - // 将FuiWorkerPlugin的参数传递给fui-worker loader - compiler.hooks.compilation.tap(WorkerPluginName, compilation => { - compilation.hooks.normalModuleLoader.tap(WorkerPluginName, (context, module) => { - // 仅提供给fui-worker - const fuiLoader = module.loaders.find(loader => loader.loader.indexOf('fui-worker') !== -1); - - if (fuiLoader) { - const resource = module.resource; - - if (!resource) return; - - // fui-worker通过options读取 - context.options = context.options || {}; - - const index = resource.indexOf('?'); - - if (ModuleFilenameHelpers.matchObject( - this.options, - index < 0 ? resource : resource.substr(0, index) - )) { - for (const key of Object.keys(this.options)) { - // 忽略关键属性 - if (key === "include" || key === "exclude" || key === "test") { - continue; - } - - context.options[key] = this.options[key]; - } - } - } - }) - }) - } -} - -module.exports = FuiWorkerPlugin; diff --git a/plugins/webpack-fui-worker-plugin/worker-loader.js b/plugins/webpack-fui-worker-plugin/worker-loader.js deleted file mode 100644 index d07756e01..000000000 --- a/plugins/webpack-fui-worker-plugin/worker-loader.js +++ /dev/null @@ -1,135 +0,0 @@ -/* - * fui-worker worker-loader - */ - -const webpack = require('webpack'); -const loaderUtils = require('loader-utils'); -const SingleEntryPlugin = require('webpack/lib/SingleEntryPlugin'); -const { WorkerLoaderName, FileNamePrefix } = require('./constants'); -const { resolve } = require('path'); - -// 正常 loader 处理逻辑 -function loader() { - const callback = this.async(); - this.cacheable(false); - - // 过滤掉当前的 worker-loader, 保留 worker 侧构建需要的其他 loader(babel-loader/ts-loader 等) - const otherLoaders = this.loaders.filter((loader, index) => { - if (index === this.loaderIndex) { - return false; - } - - return true; - }); - /** - * 拼接构建需要的 loader 字符串, 用于指定 childCompiler 的构建 loader - * 比如: /path/to/babel-loader/lib/index.js!/path/to/ts-loader/index.js! - */ - const loaderPath = otherLoaders.reduce((pre, loader) => `${pre}${loader.path}!`, ''); - - /** - * worker 独立构建的 entry - * 构建 loader + worker 源码入口文件路径 - * - * https://webpack.js.org/concepts/loaders/#inline - * `!!` 实现在 childCompiler 中忽略其他所有 loader, 只保留主构建的 loader - * 不然 worker 入口在 childCompiler 中会继续由 worker-loader 处理, 造成死循环 - */ - const workerEntry = `!!${loaderPath}${this.resourcePath}`; - - // 把资源纳入构建流程的依赖, 实现 dev 模式下的 watch - this.addDependency(workerEntry); - - // 生成的 service 独立 bundle 名称 - const entryFileName = `${FileNamePrefix}index`; - - // 获取传递给 loader 的 options - const options = Object.assign(loaderUtils.getOptions(this) || {}, this.options); - - // 创建 childCompiler, 用于实现 worker 构建为独立 js 资源 - const childCompiler = this._compilation.createChildCompiler(WorkerLoaderName, { - globalObject: 'this', - }); - childCompiler.context = this._compiler.context; - - // 指定独立构建的 entry 和生成 js 资源名称 - new SingleEntryPlugin(this.context, workerEntry, entryFileName).apply(childCompiler); - - // 设置 worker 侧的环境变量 - new webpack.DefinePlugin({ - __WORKER__: true, - }).apply(childCompiler); - - // 添加 window 全局对象, 映射为 worker 线程全局对象 self - // 如果在 worker 源码中添加, 可能没有前置到所有引用模块前 - new webpack.BannerPlugin({ - banner: 'self.window = self;', - raw: true, - entryOnly: true, - }).apply(childCompiler); - - // 去除源码中的less css引用 - const regExp = /\.(css|less)$/; - - new webpack.NormalModuleReplacementPlugin( - regExp, - result => { - if (regExp.test(result.request)) { - result.request = resolve(__dirname, './empty.js'); - } - - if (regExp.test(result.resource)) { - result.resource = resolve(__dirname, './empty.js'); - } - }, - ).apply(childCompiler); - - const subCache = `subcache ${__dirname} ${workerEntry}`; - childCompiler.hooks.compilation.tap(WorkerLoaderName, compilation => { - if (compilation.cache) { - if (!compilation.cache[subCache]) compilation.cache[subCache] = {}; - compilation.cache = compilation.cache[subCache]; - } - }); - - childCompiler.runAsChild((error, entries, compilation) => { - if (!error && compilation.errors && compilation.errors.length) { - // eslint-disable-next-line no-param-reassign - error = compilation.errors[0]; - } - - // compatible with Array (v4) and Set (v5) prototypes - const entry = entries && entries[0] && entries[0].files.values().next().value; - if (!error && !entry) { - // eslint-disable-next-line no-param-reassign - error = Error(`${WorkerLoaderName}, no entry for ${workerEntry}`); - } - - if (error) { - return callback(error); - } - - // 支持blob url形式 - return options.inline - ? callback( - null, - // 插入代码的转译和压缩由主构建配置的 babel/ts loader 处理, 不需要 worker-worker 来处理 - // 添加 @ts-nocheck 避免 ts-check 报错 - // 修复export const 下 const不会被转译的问题 - // safari浏览器下blob需指定type - `// @ts-nocheck - export default window.URL.createObjectURL(new Blob([${JSON.stringify(compilation.assets[entry].source())}], { type: 'text/javascript' })); - ` - ) - : callback( - null, - `// @ts-nocheck - export default __webpack_public_path__ + ${JSON.stringify(entry)}; - ` - ) - }); - - return; -} - -module.exports = loader; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml new file mode 100644 index 000000000..f6bd75b75 --- /dev/null +++ b/pnpm-lock.yaml @@ -0,0 +1,5045 @@ +lockfileVersion: 5.4 + +importers: + + .: + specifiers: + '@babel/cli': ^7.21.0 + '@babel/core': ^7.21.0 + '@babel/runtime': ^7.21.0 + '@fui/babel-preset-fineui': ^3.0.1 + babel-loader: ^9.1.2 + babel-plugin-module-resolver: ^5.0.0 + css-loader: ^6.7.3 + html-webpack-plugin: ^5.5.0 + less: ^4.1.3 + less-loader: ^11.1.0 + npm-run-all: ^4.1.5 + style-loader: ^3.3.1 + typescript: ^4.9.5 + webpack: ^5.75.0 + webpack-bundle-analyzer: ^4.8.0 + webpack-cli: ^5.0.1 + webpack-dev-server: ^4.11.1 + devDependencies: + '@babel/cli': 7.21.0_@babel+core@7.21.0 + '@babel/core': 7.21.0 + '@babel/runtime': 7.21.0 + '@fui/babel-preset-fineui': 3.0.1_wrscgf77uttxqznv3myecs4fba + babel-loader: 9.1.2_tkx7iv5lytdmlhrwm4n6r336ei + babel-plugin-module-resolver: 5.0.0 + css-loader: 6.7.3_webpack@5.76.0 + html-webpack-plugin: 5.5.0_webpack@5.76.0 + less: 4.1.3 + less-loader: 11.1.0_less@4.1.3+webpack@5.76.0 + npm-run-all: 4.1.5 + style-loader: 3.3.1_webpack@5.76.0 + typescript: 4.9.5 + webpack: 5.76.0_webpack-cli@5.0.1 + webpack-bundle-analyzer: 4.8.0 + webpack-cli: 5.0.1_jkfmkh54fty5hi5ax7xfrvyyji + webpack-dev-server: 4.11.1_66fuqojgvlon52mqukkfkspvqe + + packages/demo: + specifiers: + '@fui/core': workspace:^2.0.20230208163847 + dependencies: + '@fui/core': link:../fineui + + packages/fineui: + specifiers: + '@babel/core': ^7.21.0 + '@juggle/resize-observer': ^3.4.0 + '@popperjs/core': 2.11.6 + '@types/yargs': 17.0.13 + jquery: 3.6.3 + yargs: 17.6.2 + dependencies: + '@babel/core': 7.21.0 + '@juggle/resize-observer': 3.4.0 + '@popperjs/core': 2.11.6 + '@types/yargs': 17.0.13 + jquery: 3.6.3 + yargs: 17.6.2 + +packages: + + /@ampproject/remapping/2.2.0: + resolution: {integrity: sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==} + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/gen-mapping': 0.1.1 + '@jridgewell/trace-mapping': 0.3.17 + + /@babel/cli/7.21.0_@babel+core@7.21.0: + resolution: {integrity: sha512-xi7CxyS8XjSyiwUGCfwf+brtJxjW1/ZTcBUkP10xawIEXLX5HzLn+3aXkgxozcP2UhRhtKTmQurw9Uaes7jZrA==} + engines: {node: '>=6.9.0'} + hasBin: true + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.0 + '@jridgewell/trace-mapping': 0.3.17 + commander: 4.1.1 + convert-source-map: 1.9.0 + fs-readdir-recursive: 1.1.0 + glob: 7.2.3 + make-dir: 2.1.0 + slash: 2.0.0 + optionalDependencies: + '@nicolo-ribaudo/chokidar-2': 2.1.8-no-fsevents.3 + chokidar: 3.5.3 + dev: true + + /@babel/code-frame/7.18.6: + resolution: {integrity: sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/highlight': 7.18.6 + + /@babel/compat-data/7.21.0: + resolution: {integrity: sha512-gMuZsmsgxk/ENC3O/fRw5QY8A9/uxQbbCEypnLIiYYc/qVJtEV7ouxC3EllIIwNzMqAQee5tanFabWsUOutS7g==} + engines: {node: '>=6.9.0'} + + /@babel/core/7.21.0: + resolution: {integrity: sha512-PuxUbxcW6ZYe656yL3EAhpy7qXKq0DmYsrJLpbB8XrsCP9Nm+XCg9XFMb5vIDliPD7+U/+M+QJlH17XOcB7eXA==} + engines: {node: '>=6.9.0'} + dependencies: + '@ampproject/remapping': 2.2.0 + '@babel/code-frame': 7.18.6 + '@babel/generator': 7.21.1 + '@babel/helper-compilation-targets': 7.20.7_@babel+core@7.21.0 + '@babel/helper-module-transforms': 7.21.2 + '@babel/helpers': 7.21.0 + '@babel/parser': 7.21.2 + '@babel/template': 7.20.7 + '@babel/traverse': 7.21.2 + '@babel/types': 7.21.2 + convert-source-map: 1.9.0 + debug: 4.3.4 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.0 + transitivePeerDependencies: + - supports-color + + /@babel/generator/7.21.1: + resolution: {integrity: sha512-1lT45bAYlQhFn/BHivJs43AiW2rg3/UbLyShGfF3C0KmHvO5fSghWd5kBJy30kpRRucGzXStvnnCFniCR2kXAA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.21.2 + '@jridgewell/gen-mapping': 0.3.2 + '@jridgewell/trace-mapping': 0.3.17 + jsesc: 2.5.2 + + /@babel/helper-annotate-as-pure/7.18.6: + resolution: {integrity: sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.21.2 + dev: true + + /@babel/helper-builder-binary-assignment-operator-visitor/7.18.9: + resolution: {integrity: sha512-yFQ0YCHoIqarl8BCRwBL8ulYUaZpz3bNsA7oFepAzee+8/+ImtADXNOmO5vJvsPff3qi+hvpkY/NYBTrBQgdNw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-explode-assignable-expression': 7.18.6 + '@babel/types': 7.21.2 + dev: true + + /@babel/helper-compilation-targets/7.20.7_@babel+core@7.21.0: + resolution: {integrity: sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/compat-data': 7.21.0 + '@babel/core': 7.21.0 + '@babel/helper-validator-option': 7.21.0 + browserslist: 4.21.5 + lru-cache: 5.1.1 + semver: 6.3.0 + + /@babel/helper-create-class-features-plugin/7.21.0_@babel+core@7.21.0: + resolution: {integrity: sha512-Q8wNiMIdwsv5la5SPxNYzzkPnjgC0Sy0i7jLkVOCdllu/xcVNkr3TeZzbHBJrj+XXRqzX5uCyCoV9eu6xUG7KQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.21.0 + '@babel/helper-annotate-as-pure': 7.18.6 + '@babel/helper-environment-visitor': 7.18.9 + '@babel/helper-function-name': 7.21.0 + '@babel/helper-member-expression-to-functions': 7.21.0 + '@babel/helper-optimise-call-expression': 7.18.6 + '@babel/helper-replace-supers': 7.20.7 + '@babel/helper-skip-transparent-expression-wrappers': 7.20.0 + '@babel/helper-split-export-declaration': 7.18.6 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/helper-create-regexp-features-plugin/7.21.0_@babel+core@7.21.0: + resolution: {integrity: sha512-N+LaFW/auRSWdx7SHD/HiARwXQju1vXTW4fKr4u5SgBUTm51OKEjKgj+cs00ggW3kEvNqwErnlwuq7Y3xBe4eg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.21.0 + '@babel/helper-annotate-as-pure': 7.18.6 + regexpu-core: 5.3.1 + dev: true + + /@babel/helper-define-map/7.18.6: + resolution: {integrity: sha512-XSOjXUDG7KODvtURN1p29hGHa4RFgqBQELuBowUOBt3alf2Ny/oNFJygS4yCXwM0vMoqLDjE1O7wSmocUmQ3Kg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-function-name': 7.21.0 + '@babel/types': 7.21.2 + dev: true + + /@babel/helper-define-polyfill-provider/0.3.3_@babel+core@7.21.0: + resolution: {integrity: sha512-z5aQKU4IzbqCC1XH0nAqfsFLMVSo22SBKUc0BxGrLkolTdPTructy0ToNnlO2zA4j9Q/7pjMZf0DSY+DSTYzww==} + peerDependencies: + '@babel/core': ^7.4.0-0 + dependencies: + '@babel/core': 7.21.0 + '@babel/helper-compilation-targets': 7.20.7_@babel+core@7.21.0 + '@babel/helper-plugin-utils': 7.20.2 + debug: 4.3.4 + lodash.debounce: 4.0.8 + resolve: 1.22.1 + semver: 6.3.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/helper-environment-visitor/7.18.9: + resolution: {integrity: sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==} + engines: {node: '>=6.9.0'} + + /@babel/helper-explode-assignable-expression/7.18.6: + resolution: {integrity: sha512-eyAYAsQmB80jNfg4baAtLeWAQHfHFiR483rzFK+BhETlGZaQC9bsfrugfXDCbRHLQbIA7U5NxhhOxN7p/dWIcg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.21.2 + dev: true + + /@babel/helper-function-name/7.21.0: + resolution: {integrity: sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/template': 7.20.7 + '@babel/types': 7.21.2 + + /@babel/helper-hoist-variables/7.18.6: + resolution: {integrity: sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.21.2 + + /@babel/helper-member-expression-to-functions/7.21.0: + resolution: {integrity: sha512-Muu8cdZwNN6mRRNG6lAYErJ5X3bRevgYR2O8wN0yn7jJSnGDu6eG59RfT29JHxGUovyfrh6Pj0XzmR7drNVL3Q==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.21.2 + dev: true + + /@babel/helper-module-imports/7.18.6: + resolution: {integrity: sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.21.2 + + /@babel/helper-module-transforms/7.21.2: + resolution: {integrity: sha512-79yj2AR4U/Oqq/WOV7Lx6hUjau1Zfo4cI+JLAVYeMV5XIlbOhmjEk5ulbTc9fMpmlojzZHkUUxAiK+UKn+hNQQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-environment-visitor': 7.18.9 + '@babel/helper-module-imports': 7.18.6 + '@babel/helper-simple-access': 7.20.2 + '@babel/helper-split-export-declaration': 7.18.6 + '@babel/helper-validator-identifier': 7.19.1 + '@babel/template': 7.20.7 + '@babel/traverse': 7.21.2 + '@babel/types': 7.21.2 + transitivePeerDependencies: + - supports-color + + /@babel/helper-optimise-call-expression/7.18.6: + resolution: {integrity: sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.21.2 + dev: true + + /@babel/helper-plugin-utils/7.20.2: + resolution: {integrity: sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/helper-remap-async-to-generator/7.18.9_@babel+core@7.21.0: + resolution: {integrity: sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.21.0 + '@babel/helper-annotate-as-pure': 7.18.6 + '@babel/helper-environment-visitor': 7.18.9 + '@babel/helper-wrap-function': 7.20.5 + '@babel/types': 7.21.2 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/helper-replace-supers/7.20.7: + resolution: {integrity: sha512-vujDMtB6LVfNW13jhlCrp48QNslK6JXi7lQG736HVbHz/mbf4Dc7tIRh1Xf5C0rF7BP8iiSxGMCmY6Ci1ven3A==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-environment-visitor': 7.18.9 + '@babel/helper-member-expression-to-functions': 7.21.0 + '@babel/helper-optimise-call-expression': 7.18.6 + '@babel/template': 7.20.7 + '@babel/traverse': 7.21.2 + '@babel/types': 7.21.2 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/helper-simple-access/7.20.2: + resolution: {integrity: sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.21.2 + + /@babel/helper-skip-transparent-expression-wrappers/7.20.0: + resolution: {integrity: sha512-5y1JYeNKfvnT8sZcK9DVRtpTbGiomYIHviSP3OQWmDPU3DeH4a1ZlT/N2lyQ5P8egjcRaT/Y9aNqUxK0WsnIIg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.21.2 + dev: true + + /@babel/helper-split-export-declaration/7.18.6: + resolution: {integrity: sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.21.2 + + /@babel/helper-string-parser/7.19.4: + resolution: {integrity: sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==} + engines: {node: '>=6.9.0'} + + /@babel/helper-validator-identifier/7.19.1: + resolution: {integrity: sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==} + engines: {node: '>=6.9.0'} + + /@babel/helper-validator-option/7.21.0: + resolution: {integrity: sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ==} + engines: {node: '>=6.9.0'} + + /@babel/helper-wrap-function/7.20.5: + resolution: {integrity: sha512-bYMxIWK5mh+TgXGVqAtnu5Yn1un+v8DDZtqyzKRLUzrh70Eal2O3aZ7aPYiMADO4uKlkzOiRiZ6GX5q3qxvW9Q==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-function-name': 7.21.0 + '@babel/template': 7.20.7 + '@babel/traverse': 7.21.2 + '@babel/types': 7.21.2 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/helpers/7.21.0: + resolution: {integrity: sha512-XXve0CBtOW0pd7MRzzmoyuSj0e3SEzj8pgyFxnTT1NJZL38BD1MK7yYrm8yefRPIDvNNe14xR4FdbHwpInD4rA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/template': 7.20.7 + '@babel/traverse': 7.21.2 + '@babel/types': 7.21.2 + transitivePeerDependencies: + - supports-color + + /@babel/highlight/7.18.6: + resolution: {integrity: sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-validator-identifier': 7.19.1 + chalk: 2.4.2 + js-tokens: 4.0.0 + + /@babel/parser/7.21.2: + resolution: {integrity: sha512-URpaIJQwEkEC2T9Kn+Ai6Xe/02iNaVCuT/PtoRz3GPVJVDpPd7mLo+VddTbhCRU9TXqW5mSrQfXZyi8kDKOVpQ==} + engines: {node: '>=6.0.0'} + hasBin: true + dependencies: + '@babel/types': 7.21.2 + + /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/7.18.6_@babel+core@7.21.0: + resolution: {integrity: sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.21.0 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/7.20.7_@babel+core@7.21.0: + resolution: {integrity: sha512-sbr9+wNE5aXMBBFBICk01tt7sBf2Oc9ikRFEcem/ZORup9IMUdNhW7/wVLEbbtlWOsEubJet46mHAL2C8+2jKQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.13.0 + dependencies: + '@babel/core': 7.21.0 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/helper-skip-transparent-expression-wrappers': 7.20.0 + '@babel/plugin-proposal-optional-chaining': 7.21.0_@babel+core@7.21.0 + dev: true + + /@babel/plugin-proposal-async-generator-functions/7.20.7_@babel+core@7.21.0: + resolution: {integrity: sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.0 + '@babel/helper-environment-visitor': 7.18.9 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/helper-remap-async-to-generator': 7.18.9_@babel+core@7.21.0 + '@babel/plugin-syntax-async-generators': 7.8.4_@babel+core@7.21.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-proposal-class-properties/7.18.6_@babel+core@7.21.0: + resolution: {integrity: sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.0 + '@babel/helper-create-class-features-plugin': 7.21.0_@babel+core@7.21.0 + '@babel/helper-plugin-utils': 7.20.2 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-proposal-class-properties/7.5.0_@babel+core@7.21.0: + resolution: {integrity: sha512-9L/JfPCT+kShiiTTzcnBJ8cOwdKVmlC1RcCf9F0F9tERVrM4iWtWnXtjWCRqNm2la2BxO1MPArWNsU9zsSJWSQ==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.0 + '@babel/helper-create-class-features-plugin': 7.21.0_@babel+core@7.21.0 + '@babel/helper-plugin-utils': 7.20.2 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-proposal-class-static-block/7.21.0_@babel+core@7.21.0: + resolution: {integrity: sha512-XP5G9MWNUskFuP30IfFSEFB0Z6HzLIUcjYM4bYOPHXl7eiJ9HFv8tWj6TXTN5QODiEhDZAeI4hLok2iHFFV4hw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.12.0 + dependencies: + '@babel/core': 7.21.0 + '@babel/helper-create-class-features-plugin': 7.21.0_@babel+core@7.21.0 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/plugin-syntax-class-static-block': 7.14.5_@babel+core@7.21.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-proposal-decorators/7.4.4_@babel+core@7.21.0: + resolution: {integrity: sha512-z7MpQz3XC/iQJWXH9y+MaWcLPNSMY9RQSthrLzak8R8hCj0fuyNk+Dzi9kfNe/JxxlWQ2g7wkABbgWjW36MTcw==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.0 + '@babel/helper-create-class-features-plugin': 7.21.0_@babel+core@7.21.0 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/plugin-syntax-decorators': 7.21.0_@babel+core@7.21.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-proposal-dynamic-import/7.18.6_@babel+core@7.21.0: + resolution: {integrity: sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.0 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/plugin-syntax-dynamic-import': 7.8.3_@babel+core@7.21.0 + dev: true + + /@babel/plugin-proposal-export-namespace-from/7.18.9_@babel+core@7.21.0: + resolution: {integrity: sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.0 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/plugin-syntax-export-namespace-from': 7.8.3_@babel+core@7.21.0 + dev: true + + /@babel/plugin-proposal-json-strings/7.18.6_@babel+core@7.21.0: + resolution: {integrity: sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.0 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/plugin-syntax-json-strings': 7.8.3_@babel+core@7.21.0 + dev: true + + /@babel/plugin-proposal-logical-assignment-operators/7.20.7_@babel+core@7.21.0: + resolution: {integrity: sha512-y7C7cZgpMIjWlKE5T7eJwp+tnRYM89HmRvWM5EQuB5BoHEONjmQ8lSNmBUwOyy/GFRsohJED51YBF79hE1djug==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.0 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4_@babel+core@7.21.0 + dev: true + + /@babel/plugin-proposal-nullish-coalescing-operator/7.18.6_@babel+core@7.21.0: + resolution: {integrity: sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.0 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3_@babel+core@7.21.0 + dev: true + + /@babel/plugin-proposal-numeric-separator/7.18.6_@babel+core@7.21.0: + resolution: {integrity: sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.0 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/plugin-syntax-numeric-separator': 7.10.4_@babel+core@7.21.0 + dev: true + + /@babel/plugin-proposal-object-rest-spread/7.20.7_@babel+core@7.21.0: + resolution: {integrity: sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/compat-data': 7.21.0 + '@babel/core': 7.21.0 + '@babel/helper-compilation-targets': 7.20.7_@babel+core@7.21.0 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/plugin-syntax-object-rest-spread': 7.8.3_@babel+core@7.21.0 + '@babel/plugin-transform-parameters': 7.20.7_@babel+core@7.21.0 + dev: true + + /@babel/plugin-proposal-optional-catch-binding/7.18.6_@babel+core@7.21.0: + resolution: {integrity: sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.0 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/plugin-syntax-optional-catch-binding': 7.8.3_@babel+core@7.21.0 + dev: true + + /@babel/plugin-proposal-optional-chaining/7.21.0_@babel+core@7.21.0: + resolution: {integrity: sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.0 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/helper-skip-transparent-expression-wrappers': 7.20.0 + '@babel/plugin-syntax-optional-chaining': 7.8.3_@babel+core@7.21.0 + dev: true + + /@babel/plugin-proposal-private-methods/7.18.6_@babel+core@7.21.0: + resolution: {integrity: sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.0 + '@babel/helper-create-class-features-plugin': 7.21.0_@babel+core@7.21.0 + '@babel/helper-plugin-utils': 7.20.2 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-proposal-private-property-in-object/7.21.0_@babel+core@7.21.0: + resolution: {integrity: sha512-ha4zfehbJjc5MmXBlHec1igel5TJXXLDDRbuJ4+XT2TJcyD9/V1919BA8gMvsdHcNMBy4WBUBiRb3nw/EQUtBw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.0 + '@babel/helper-annotate-as-pure': 7.18.6 + '@babel/helper-create-class-features-plugin': 7.21.0_@babel+core@7.21.0 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/plugin-syntax-private-property-in-object': 7.14.5_@babel+core@7.21.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-proposal-unicode-property-regex/7.18.6_@babel+core@7.21.0: + resolution: {integrity: sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==} + engines: {node: '>=4'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.0 + '@babel/helper-create-regexp-features-plugin': 7.21.0_@babel+core@7.21.0 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-syntax-async-generators/7.8.4_@babel+core@7.21.0: + resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.0 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-syntax-class-properties/7.12.13_@babel+core@7.21.0: + resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.0 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-syntax-class-static-block/7.14.5_@babel+core@7.21.0: + resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.0 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-syntax-decorators/7.21.0_@babel+core@7.21.0: + resolution: {integrity: sha512-tIoPpGBR8UuM4++ccWN3gifhVvQu7ZizuR1fklhRJrd5ewgbkUS+0KVFeWWxELtn18NTLoW32XV7zyOgIAiz+w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.0 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-syntax-dynamic-import/7.8.3_@babel+core@7.21.0: + resolution: {integrity: sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.0 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-syntax-export-namespace-from/7.8.3_@babel+core@7.21.0: + resolution: {integrity: sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.0 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-syntax-json-strings/7.8.3_@babel+core@7.21.0: + resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.0 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-syntax-jsx/7.18.6_@babel+core@7.21.0: + resolution: {integrity: sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.0 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-syntax-logical-assignment-operators/7.10.4_@babel+core@7.21.0: + resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.0 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-syntax-nullish-coalescing-operator/7.8.3_@babel+core@7.21.0: + resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.0 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-syntax-numeric-separator/7.10.4_@babel+core@7.21.0: + resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.0 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-syntax-object-rest-spread/7.8.3_@babel+core@7.21.0: + resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.0 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-syntax-optional-catch-binding/7.8.3_@babel+core@7.21.0: + resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.0 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-syntax-optional-chaining/7.8.3_@babel+core@7.21.0: + resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.0 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-syntax-private-property-in-object/7.14.5_@babel+core@7.21.0: + resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.0 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-syntax-top-level-await/7.14.5_@babel+core@7.21.0: + resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.0 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-syntax-typescript/7.20.0_@babel+core@7.21.0: + resolution: {integrity: sha512-rd9TkG+u1CExzS4SM1BlMEhMXwFLKVjOAFFCDx9PbX5ycJWDoWMcwdJH9RhkPu1dOgn5TrxLot/Gx6lWFuAUNQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.0 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-transform-arrow-functions/7.20.7_@babel+core@7.21.0: + resolution: {integrity: sha512-3poA5E7dzDomxj9WXWwuD6A5F3kc7VXwIJO+E+J8qtDtS+pXPAhrgEyh+9GBwBgPq1Z+bB+/JD60lp5jsN7JPQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.0 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-transform-async-to-generator/7.20.7_@babel+core@7.21.0: + resolution: {integrity: sha512-Uo5gwHPT9vgnSXQxqGtpdufUiWp96gk7yiP4Mp5bm1QMkEmLXBO7PAGYbKoJ6DhAwiNkcHFBol/x5zZZkL/t0Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.0 + '@babel/helper-module-imports': 7.18.6 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/helper-remap-async-to-generator': 7.18.9_@babel+core@7.21.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-transform-block-scoped-functions/7.18.6_@babel+core@7.21.0: + resolution: {integrity: sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.0 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-transform-block-scoping/7.21.0_@babel+core@7.21.0: + resolution: {integrity: sha512-Mdrbunoh9SxwFZapeHVrwFmri16+oYotcZysSzhNIVDwIAb1UV+kvnxULSYq9J3/q5MDG+4X6w8QVgD1zhBXNQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.0 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-transform-classes/7.21.0_@babel+core@7.21.0: + resolution: {integrity: sha512-RZhbYTCEUAe6ntPehC4hlslPWosNHDox+vAs4On/mCLRLfoDVHf6hVEd7kuxr1RnHwJmxFfUM3cZiZRmPxJPXQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.0 + '@babel/helper-annotate-as-pure': 7.18.6 + '@babel/helper-compilation-targets': 7.20.7_@babel+core@7.21.0 + '@babel/helper-environment-visitor': 7.18.9 + '@babel/helper-function-name': 7.21.0 + '@babel/helper-optimise-call-expression': 7.18.6 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/helper-replace-supers': 7.20.7 + '@babel/helper-split-export-declaration': 7.18.6 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-transform-classes/7.5.5_@babel+core@7.21.0: + resolution: {integrity: sha512-U2htCNK/6e9K7jGyJ++1p5XRU+LJjrwtoiVn9SzRlDT2KubcZ11OOwy3s24TjHxPgxNwonCYP7U2K51uVYCMDg==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.0 + '@babel/helper-annotate-as-pure': 7.18.6 + '@babel/helper-define-map': 7.18.6 + '@babel/helper-function-name': 7.21.0 + '@babel/helper-optimise-call-expression': 7.18.6 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/helper-replace-supers': 7.20.7 + '@babel/helper-split-export-declaration': 7.18.6 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-transform-computed-properties/7.20.7_@babel+core@7.21.0: + resolution: {integrity: sha512-Lz7MvBK6DTjElHAmfu6bfANzKcxpyNPeYBGEafyA6E5HtRpjpZwU+u7Qrgz/2OR0z+5TvKYbPdphfSaAcZBrYQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.0 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/template': 7.20.7 + dev: true + + /@babel/plugin-transform-destructuring/7.20.7_@babel+core@7.21.0: + resolution: {integrity: sha512-Xwg403sRrZb81IVB79ZPqNQME23yhugYVqgTxAhT99h485F4f+GMELFhhOsscDUB7HCswepKeCKLn/GZvUKoBA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.0 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-transform-dotall-regex/7.18.6_@babel+core@7.21.0: + resolution: {integrity: sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.0 + '@babel/helper-create-regexp-features-plugin': 7.21.0_@babel+core@7.21.0 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-transform-duplicate-keys/7.18.9_@babel+core@7.21.0: + resolution: {integrity: sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.0 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-transform-exponentiation-operator/7.18.6_@babel+core@7.21.0: + resolution: {integrity: sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.0 + '@babel/helper-builder-binary-assignment-operator-visitor': 7.18.9 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-transform-for-of/7.21.0_@babel+core@7.21.0: + resolution: {integrity: sha512-LlUYlydgDkKpIY7mcBWvyPPmMcOphEyYA27Ef4xpbh1IiDNLr0kZsos2nf92vz3IccvJI25QUwp86Eo5s6HmBQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.0 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-transform-function-name/7.18.9_@babel+core@7.21.0: + resolution: {integrity: sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.0 + '@babel/helper-compilation-targets': 7.20.7_@babel+core@7.21.0 + '@babel/helper-function-name': 7.21.0 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-transform-literals/7.18.9_@babel+core@7.21.0: + resolution: {integrity: sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.0 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-transform-member-expression-literals/7.18.6_@babel+core@7.21.0: + resolution: {integrity: sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.0 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-transform-modules-amd/7.20.11_@babel+core@7.21.0: + resolution: {integrity: sha512-NuzCt5IIYOW0O30UvqktzHYR2ud5bOWbY0yaxWZ6G+aFzOMJvrs5YHNikrbdaT15+KNO31nPOy5Fim3ku6Zb5g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.0 + '@babel/helper-module-transforms': 7.21.2 + '@babel/helper-plugin-utils': 7.20.2 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-transform-modules-commonjs/7.21.2_@babel+core@7.21.0: + resolution: {integrity: sha512-Cln+Yy04Gxua7iPdj6nOV96smLGjpElir5YwzF0LBPKoPlLDNJePNlrGGaybAJkd0zKRnOVXOgizSqPYMNYkzA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.0 + '@babel/helper-module-transforms': 7.21.2 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/helper-simple-access': 7.20.2 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-transform-modules-commonjs/7.6.0_@babel+core@7.21.0: + resolution: {integrity: sha512-Ma93Ix95PNSEngqomy5LSBMAQvYKVe3dy+JlVJSHEXZR5ASL9lQBedMiCyVtmTLraIDVRE3ZjTZvmXXD2Ozw3g==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.0 + '@babel/helper-module-transforms': 7.21.2 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/helper-simple-access': 7.20.2 + babel-plugin-dynamic-import-node: 2.3.3 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-transform-modules-systemjs/7.20.11_@babel+core@7.21.0: + resolution: {integrity: sha512-vVu5g9BPQKSFEmvt2TA4Da5N+QVS66EX21d8uoOihC+OCpUoGvzVsXeqFdtAEfVa5BILAeFt+U7yVmLbQnAJmw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.0 + '@babel/helper-hoist-variables': 7.18.6 + '@babel/helper-module-transforms': 7.21.2 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/helper-validator-identifier': 7.19.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-transform-modules-umd/7.18.6_@babel+core@7.21.0: + resolution: {integrity: sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.0 + '@babel/helper-module-transforms': 7.21.2 + '@babel/helper-plugin-utils': 7.20.2 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-transform-named-capturing-groups-regex/7.20.5_@babel+core@7.21.0: + resolution: {integrity: sha512-mOW4tTzi5iTLnw+78iEq3gr8Aoq4WNRGpmSlrogqaiCBoR1HFhpU4JkpQFOHfeYx3ReVIFWOQJS4aZBRvuZ6mA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.21.0 + '@babel/helper-create-regexp-features-plugin': 7.21.0_@babel+core@7.21.0 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-transform-new-target/7.18.6_@babel+core@7.21.0: + resolution: {integrity: sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.0 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-transform-object-super/7.18.6_@babel+core@7.21.0: + resolution: {integrity: sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.0 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/helper-replace-supers': 7.20.7 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-transform-parameters/7.20.7_@babel+core@7.21.0: + resolution: {integrity: sha512-WiWBIkeHKVOSYPO0pWkxGPfKeWrCJyD3NJ53+Lrp/QMSZbsVPovrVl2aWZ19D/LTVnaDv5Ap7GJ/B2CTOZdrfA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.0 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-transform-property-literals/7.18.6_@babel+core@7.21.0: + resolution: {integrity: sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.0 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-transform-proto-to-assign/7.5.5_@babel+core@7.21.0: + resolution: {integrity: sha512-1vlFiFiIfKXBVm2SJtPr65x7NUAv4Sa3qhBbH4TnSXaUTDQnOSf+W8vNq3BNliaI28kwT8aD3rMTTsEryJpDZw==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.0 + '@babel/helper-plugin-utils': 7.20.2 + lodash: 4.17.21 + dev: true + + /@babel/plugin-transform-react-display-name/7.18.6_@babel+core@7.21.0: + resolution: {integrity: sha512-TV4sQ+T013n61uMoygyMRm+xf04Bd5oqFpv2jAEQwSZ8NwQA7zeRPg1LMVg2PWi3zWBz+CLKD+v5bcpZ/BS0aA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.0 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-transform-react-jsx-development/7.18.6_@babel+core@7.21.0: + resolution: {integrity: sha512-SA6HEjwYFKF7WDjWcMcMGUimmw/nhNRDWxr+KaLSCrkD/LMDBvWRmHAYgE1HDeF8KUuI8OAu+RT6EOtKxSW2qA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.0 + '@babel/plugin-transform-react-jsx': 7.21.0_@babel+core@7.21.0 + dev: true + + /@babel/plugin-transform-react-jsx/7.13.12_@babel+core@7.21.0: + resolution: {integrity: sha512-jcEI2UqIcpCqB5U5DRxIl0tQEProI2gcu+g8VTIqxLO5Iidojb4d77q+fwGseCvd8af/lJ9masp4QWzBXFE2xA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.0 + '@babel/helper-annotate-as-pure': 7.18.6 + '@babel/helper-module-imports': 7.18.6 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/plugin-syntax-jsx': 7.18.6_@babel+core@7.21.0 + '@babel/types': 7.21.2 + dev: true + + /@babel/plugin-transform-react-jsx/7.21.0_@babel+core@7.21.0: + resolution: {integrity: sha512-6OAWljMvQrZjR2DaNhVfRz6dkCAVV+ymcLUmaf8bccGOHn2v5rHJK3tTpij0BuhdYWP4LLaqj5lwcdlpAAPuvg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.0 + '@babel/helper-annotate-as-pure': 7.18.6 + '@babel/helper-module-imports': 7.18.6 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/plugin-syntax-jsx': 7.18.6_@babel+core@7.21.0 + '@babel/types': 7.21.2 + dev: true + + /@babel/plugin-transform-react-pure-annotations/7.18.6_@babel+core@7.21.0: + resolution: {integrity: sha512-I8VfEPg9r2TRDdvnHgPepTKvuRomzA8+u+nhY7qSI1fR2hRNebasZEETLyM5mAUr0Ku56OkXJ0I7NHJnO6cJiQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.0 + '@babel/helper-annotate-as-pure': 7.18.6 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-transform-regenerator/7.20.5_@babel+core@7.21.0: + resolution: {integrity: sha512-kW/oO7HPBtntbsahzQ0qSE3tFvkFwnbozz3NWFhLGqH75vLEg+sCGngLlhVkePlCs3Jv0dBBHDzCHxNiFAQKCQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.0 + '@babel/helper-plugin-utils': 7.20.2 + regenerator-transform: 0.15.1 + dev: true + + /@babel/plugin-transform-reserved-words/7.18.6_@babel+core@7.21.0: + resolution: {integrity: sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.0 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-transform-runtime/7.19.6_@babel+core@7.21.0: + resolution: {integrity: sha512-PRH37lz4JU156lYFW1p8OxE5i7d6Sl/zV58ooyr+q1J1lnQPyg5tIiXlIwNVhJaY4W3TmOtdc8jqdXQcB1v5Yw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.0 + '@babel/helper-module-imports': 7.18.6 + '@babel/helper-plugin-utils': 7.20.2 + babel-plugin-polyfill-corejs2: 0.3.3_@babel+core@7.21.0 + babel-plugin-polyfill-corejs3: 0.6.0_@babel+core@7.21.0 + babel-plugin-polyfill-regenerator: 0.4.1_@babel+core@7.21.0 + semver: 6.3.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-transform-shorthand-properties/7.18.6_@babel+core@7.21.0: + resolution: {integrity: sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.0 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-transform-spread/7.20.7_@babel+core@7.21.0: + resolution: {integrity: sha512-ewBbHQ+1U/VnH1fxltbJqDeWBU1oNLG8Dj11uIv3xVf7nrQu0bPGe5Rf716r7K5Qz+SqtAOVswoVunoiBtGhxw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.0 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/helper-skip-transparent-expression-wrappers': 7.20.0 + dev: true + + /@babel/plugin-transform-sticky-regex/7.18.6_@babel+core@7.21.0: + resolution: {integrity: sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.0 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-transform-template-literals/7.18.9_@babel+core@7.21.0: + resolution: {integrity: sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.0 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-transform-typeof-symbol/7.18.9_@babel+core@7.21.0: + resolution: {integrity: sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.0 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-transform-typescript/7.21.0_@babel+core@7.21.0: + resolution: {integrity: sha512-xo///XTPp3mDzTtrqXoBlK9eiAYW3wv9JXglcn/u1bi60RW11dEUxIgA8cbnDhutS1zacjMRmAwxE0gMklLnZg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.0 + '@babel/helper-create-class-features-plugin': 7.21.0_@babel+core@7.21.0 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/plugin-syntax-typescript': 7.20.0_@babel+core@7.21.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-transform-unicode-escapes/7.18.10_@babel+core@7.21.0: + resolution: {integrity: sha512-kKAdAI+YzPgGY/ftStBFXTI1LZFju38rYThnfMykS+IXy8BVx+res7s2fxf1l8I35DV2T97ezo6+SGrXz6B3iQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.0 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-transform-unicode-regex/7.18.6_@babel+core@7.21.0: + resolution: {integrity: sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.0 + '@babel/helper-create-regexp-features-plugin': 7.21.0_@babel+core@7.21.0 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/preset-env/7.16.11_@babel+core@7.21.0: + resolution: {integrity: sha512-qcmWG8R7ZW6WBRPZK//y+E3Cli151B20W1Rv7ln27vuPaXU/8TKms6jFdiJtF7UDTxcrb7mZd88tAeK9LjdT8g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/compat-data': 7.21.0 + '@babel/core': 7.21.0 + '@babel/helper-compilation-targets': 7.20.7_@babel+core@7.21.0 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/helper-validator-option': 7.21.0 + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.18.6_@babel+core@7.21.0 + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.20.7_@babel+core@7.21.0 + '@babel/plugin-proposal-async-generator-functions': 7.20.7_@babel+core@7.21.0 + '@babel/plugin-proposal-class-properties': 7.18.6_@babel+core@7.21.0 + '@babel/plugin-proposal-class-static-block': 7.21.0_@babel+core@7.21.0 + '@babel/plugin-proposal-dynamic-import': 7.18.6_@babel+core@7.21.0 + '@babel/plugin-proposal-export-namespace-from': 7.18.9_@babel+core@7.21.0 + '@babel/plugin-proposal-json-strings': 7.18.6_@babel+core@7.21.0 + '@babel/plugin-proposal-logical-assignment-operators': 7.20.7_@babel+core@7.21.0 + '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6_@babel+core@7.21.0 + '@babel/plugin-proposal-numeric-separator': 7.18.6_@babel+core@7.21.0 + '@babel/plugin-proposal-object-rest-spread': 7.20.7_@babel+core@7.21.0 + '@babel/plugin-proposal-optional-catch-binding': 7.18.6_@babel+core@7.21.0 + '@babel/plugin-proposal-optional-chaining': 7.21.0_@babel+core@7.21.0 + '@babel/plugin-proposal-private-methods': 7.18.6_@babel+core@7.21.0 + '@babel/plugin-proposal-private-property-in-object': 7.21.0_@babel+core@7.21.0 + '@babel/plugin-proposal-unicode-property-regex': 7.18.6_@babel+core@7.21.0 + '@babel/plugin-syntax-async-generators': 7.8.4_@babel+core@7.21.0 + '@babel/plugin-syntax-class-properties': 7.12.13_@babel+core@7.21.0 + '@babel/plugin-syntax-class-static-block': 7.14.5_@babel+core@7.21.0 + '@babel/plugin-syntax-dynamic-import': 7.8.3_@babel+core@7.21.0 + '@babel/plugin-syntax-export-namespace-from': 7.8.3_@babel+core@7.21.0 + '@babel/plugin-syntax-json-strings': 7.8.3_@babel+core@7.21.0 + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4_@babel+core@7.21.0 + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3_@babel+core@7.21.0 + '@babel/plugin-syntax-numeric-separator': 7.10.4_@babel+core@7.21.0 + '@babel/plugin-syntax-object-rest-spread': 7.8.3_@babel+core@7.21.0 + '@babel/plugin-syntax-optional-catch-binding': 7.8.3_@babel+core@7.21.0 + '@babel/plugin-syntax-optional-chaining': 7.8.3_@babel+core@7.21.0 + '@babel/plugin-syntax-private-property-in-object': 7.14.5_@babel+core@7.21.0 + '@babel/plugin-syntax-top-level-await': 7.14.5_@babel+core@7.21.0 + '@babel/plugin-transform-arrow-functions': 7.20.7_@babel+core@7.21.0 + '@babel/plugin-transform-async-to-generator': 7.20.7_@babel+core@7.21.0 + '@babel/plugin-transform-block-scoped-functions': 7.18.6_@babel+core@7.21.0 + '@babel/plugin-transform-block-scoping': 7.21.0_@babel+core@7.21.0 + '@babel/plugin-transform-classes': 7.21.0_@babel+core@7.21.0 + '@babel/plugin-transform-computed-properties': 7.20.7_@babel+core@7.21.0 + '@babel/plugin-transform-destructuring': 7.20.7_@babel+core@7.21.0 + '@babel/plugin-transform-dotall-regex': 7.18.6_@babel+core@7.21.0 + '@babel/plugin-transform-duplicate-keys': 7.18.9_@babel+core@7.21.0 + '@babel/plugin-transform-exponentiation-operator': 7.18.6_@babel+core@7.21.0 + '@babel/plugin-transform-for-of': 7.21.0_@babel+core@7.21.0 + '@babel/plugin-transform-function-name': 7.18.9_@babel+core@7.21.0 + '@babel/plugin-transform-literals': 7.18.9_@babel+core@7.21.0 + '@babel/plugin-transform-member-expression-literals': 7.18.6_@babel+core@7.21.0 + '@babel/plugin-transform-modules-amd': 7.20.11_@babel+core@7.21.0 + '@babel/plugin-transform-modules-commonjs': 7.21.2_@babel+core@7.21.0 + '@babel/plugin-transform-modules-systemjs': 7.20.11_@babel+core@7.21.0 + '@babel/plugin-transform-modules-umd': 7.18.6_@babel+core@7.21.0 + '@babel/plugin-transform-named-capturing-groups-regex': 7.20.5_@babel+core@7.21.0 + '@babel/plugin-transform-new-target': 7.18.6_@babel+core@7.21.0 + '@babel/plugin-transform-object-super': 7.18.6_@babel+core@7.21.0 + '@babel/plugin-transform-parameters': 7.20.7_@babel+core@7.21.0 + '@babel/plugin-transform-property-literals': 7.18.6_@babel+core@7.21.0 + '@babel/plugin-transform-regenerator': 7.20.5_@babel+core@7.21.0 + '@babel/plugin-transform-reserved-words': 7.18.6_@babel+core@7.21.0 + '@babel/plugin-transform-shorthand-properties': 7.18.6_@babel+core@7.21.0 + '@babel/plugin-transform-spread': 7.20.7_@babel+core@7.21.0 + '@babel/plugin-transform-sticky-regex': 7.18.6_@babel+core@7.21.0 + '@babel/plugin-transform-template-literals': 7.18.9_@babel+core@7.21.0 + '@babel/plugin-transform-typeof-symbol': 7.18.9_@babel+core@7.21.0 + '@babel/plugin-transform-unicode-escapes': 7.18.10_@babel+core@7.21.0 + '@babel/plugin-transform-unicode-regex': 7.18.6_@babel+core@7.21.0 + '@babel/preset-modules': 0.1.5_@babel+core@7.21.0 + '@babel/types': 7.21.2 + babel-plugin-polyfill-corejs2: 0.3.3_@babel+core@7.21.0 + babel-plugin-polyfill-corejs3: 0.5.3_@babel+core@7.21.0 + babel-plugin-polyfill-regenerator: 0.3.1_@babel+core@7.21.0 + core-js-compat: 3.29.0 + semver: 6.3.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/preset-modules/0.1.5_@babel+core@7.21.0: + resolution: {integrity: sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.0 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/plugin-proposal-unicode-property-regex': 7.18.6_@babel+core@7.21.0 + '@babel/plugin-transform-dotall-regex': 7.18.6_@babel+core@7.21.0 + '@babel/types': 7.21.2 + esutils: 2.0.3 + dev: true + + /@babel/preset-react/7.13.13_@babel+core@7.21.0: + resolution: {integrity: sha512-gx+tDLIE06sRjKJkVtpZ/t3mzCDOnPG+ggHZG9lffUbX8+wC739x20YQc9V35Do6ZAxaUc/HhVHIiOzz5MvDmA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.0 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/helper-validator-option': 7.21.0 + '@babel/plugin-transform-react-display-name': 7.18.6_@babel+core@7.21.0 + '@babel/plugin-transform-react-jsx': 7.13.12_@babel+core@7.21.0 + '@babel/plugin-transform-react-jsx-development': 7.18.6_@babel+core@7.21.0 + '@babel/plugin-transform-react-pure-annotations': 7.18.6_@babel+core@7.21.0 + dev: true + + /@babel/preset-typescript/7.3.3_@babel+core@7.21.0: + resolution: {integrity: sha512-mzMVuIP4lqtn4du2ynEfdO0+RYcslwrZiJHXu4MGaC1ctJiW2fyaeDrtjJGs7R/KebZ1sgowcIoWf4uRpEfKEg==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.0 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/plugin-transform-typescript': 7.21.0_@babel+core@7.21.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/regjsgen/0.8.0: + resolution: {integrity: sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==} + dev: true + + /@babel/runtime/7.21.0: + resolution: {integrity: sha512-xwII0//EObnq89Ji5AKYQaRYiW/nZ3llSv29d49IuxPhKbtJoLP+9QUUZ4nVragQVtaVGeZrpB+ZtG/Pdy/POw==} + engines: {node: '>=6.9.0'} + dependencies: + regenerator-runtime: 0.13.11 + dev: true + + /@babel/template/7.20.7: + resolution: {integrity: sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.18.6 + '@babel/parser': 7.21.2 + '@babel/types': 7.21.2 + + /@babel/traverse/7.21.2: + resolution: {integrity: sha512-ts5FFU/dSUPS13tv8XiEObDu9K+iagEKME9kAbaP7r0Y9KtZJZ+NGndDvWoRAYNpeWafbpFeki3q9QoMD6gxyw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.18.6 + '@babel/generator': 7.21.1 + '@babel/helper-environment-visitor': 7.18.9 + '@babel/helper-function-name': 7.21.0 + '@babel/helper-hoist-variables': 7.18.6 + '@babel/helper-split-export-declaration': 7.18.6 + '@babel/parser': 7.21.2 + '@babel/types': 7.21.2 + debug: 4.3.4 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + + /@babel/types/7.21.2: + resolution: {integrity: sha512-3wRZSs7jiFaB8AjxiiD+VqN5DTG2iRvJGQ+qYFrs/654lg6kGTQWIOFjlBo5RaXuAZjBmP3+OQH4dmhqiiyYxw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-string-parser': 7.19.4 + '@babel/helper-validator-identifier': 7.19.1 + to-fast-properties: 2.0.0 + + /@discoveryjs/json-ext/0.5.7: + resolution: {integrity: sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==} + engines: {node: '>=10.0.0'} + dev: true + + /@fui/babel-preset-fineui/3.0.1_wrscgf77uttxqznv3myecs4fba: + resolution: {integrity: sha512-gEb/w9UhdDQdIJ5WYPuekj4D/a1Y4bqD0XEMpfJEfceeOqXvzFaXL+GAa7N9YFkVz1QWq5eURxTRw/QA8M9ICQ==} + peerDependencies: + '@babel/core': ^7.0.0-0 + '@babel/runtime': ^7.20.1 + dependencies: + '@babel/core': 7.21.0 + '@babel/plugin-proposal-class-properties': 7.5.0_@babel+core@7.21.0 + '@babel/plugin-proposal-decorators': 7.4.4_@babel+core@7.21.0 + '@babel/plugin-transform-classes': 7.5.5_@babel+core@7.21.0 + '@babel/plugin-transform-modules-commonjs': 7.6.0_@babel+core@7.21.0 + '@babel/plugin-transform-proto-to-assign': 7.5.5_@babel+core@7.21.0 + '@babel/plugin-transform-react-jsx': 7.13.12_@babel+core@7.21.0 + '@babel/plugin-transform-runtime': 7.19.6_@babel+core@7.21.0 + '@babel/preset-env': 7.16.11_@babel+core@7.21.0 + '@babel/preset-react': 7.13.13_@babel+core@7.21.0 + '@babel/preset-typescript': 7.3.3_@babel+core@7.21.0 + '@babel/runtime': 7.21.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@jridgewell/gen-mapping/0.1.1: + resolution: {integrity: sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==} + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/set-array': 1.1.2 + '@jridgewell/sourcemap-codec': 1.4.14 + + /@jridgewell/gen-mapping/0.3.2: + resolution: {integrity: sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==} + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/set-array': 1.1.2 + '@jridgewell/sourcemap-codec': 1.4.14 + '@jridgewell/trace-mapping': 0.3.17 + + /@jridgewell/resolve-uri/3.1.0: + resolution: {integrity: sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==} + engines: {node: '>=6.0.0'} + + /@jridgewell/set-array/1.1.2: + resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} + engines: {node: '>=6.0.0'} + + /@jridgewell/source-map/0.3.2: + resolution: {integrity: sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==} + dependencies: + '@jridgewell/gen-mapping': 0.3.2 + '@jridgewell/trace-mapping': 0.3.17 + dev: true + + /@jridgewell/sourcemap-codec/1.4.14: + resolution: {integrity: sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==} + + /@jridgewell/trace-mapping/0.3.17: + resolution: {integrity: sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==} + dependencies: + '@jridgewell/resolve-uri': 3.1.0 + '@jridgewell/sourcemap-codec': 1.4.14 + + /@juggle/resize-observer/3.4.0: + resolution: {integrity: sha512-dfLbk+PwWvFzSxwk3n5ySL0hfBog779o8h68wK/7/APo/7cgyWp5jcXockbxdk5kFRkbeXWm4Fbi9FrdN381sA==} + dev: false + + /@leichtgewicht/ip-codec/2.0.4: + resolution: {integrity: sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==} + dev: true + + /@nicolo-ribaudo/chokidar-2/2.1.8-no-fsevents.3: + resolution: {integrity: sha512-s88O1aVtXftvp5bCPB7WnmXc5IwOZZ7YPuwNPt+GtOOXpPvad1LfbmjYv+qII7zP6RU2QGnqve27dnLycEnyEQ==} + requiresBuild: true + dev: true + optional: true + + /@polka/url/1.0.0-next.21: + resolution: {integrity: sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g==} + dev: true + + /@popperjs/core/2.11.6: + resolution: {integrity: sha512-50/17A98tWUfQ176raKiOGXuYpLyyVMkxxG6oylzL3BPOlA6ADGdK7EYunSa4I064xerltq9TGXs8HmOk5E+vw==} + dev: false + + /@types/body-parser/1.19.2: + resolution: {integrity: sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==} + dependencies: + '@types/connect': 3.4.35 + '@types/node': 18.15.0 + dev: true + + /@types/bonjour/3.5.10: + resolution: {integrity: sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw==} + dependencies: + '@types/node': 18.15.0 + dev: true + + /@types/connect-history-api-fallback/1.3.5: + resolution: {integrity: sha512-h8QJa8xSb1WD4fpKBDcATDNGXghFj6/3GRWG6dhmRcu0RX1Ubasur2Uvx5aeEwlf0MwblEC2bMzzMQntxnw/Cw==} + dependencies: + '@types/express-serve-static-core': 4.17.33 + '@types/node': 18.15.0 + dev: true + + /@types/connect/3.4.35: + resolution: {integrity: sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==} + dependencies: + '@types/node': 18.15.0 + dev: true + + /@types/eslint-scope/3.7.4: + resolution: {integrity: sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==} + dependencies: + '@types/eslint': 8.21.1 + '@types/estree': 0.0.51 + dev: true + + /@types/eslint/8.21.1: + resolution: {integrity: sha512-rc9K8ZpVjNcLs8Fp0dkozd5Pt2Apk1glO4Vgz8ix1u6yFByxfqo5Yavpy65o+93TAe24jr7v+eSBtFLvOQtCRQ==} + dependencies: + '@types/estree': 0.0.51 + '@types/json-schema': 7.0.11 + dev: true + + /@types/estree/0.0.51: + resolution: {integrity: sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==} + dev: true + + /@types/express-serve-static-core/4.17.33: + resolution: {integrity: sha512-TPBqmR/HRYI3eC2E5hmiivIzv+bidAfXofM+sbonAGvyDhySGw9/PQZFt2BLOrjUUR++4eJVpx6KnLQK1Fk9tA==} + dependencies: + '@types/node': 18.15.0 + '@types/qs': 6.9.7 + '@types/range-parser': 1.2.4 + dev: true + + /@types/express/4.17.17: + resolution: {integrity: sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q==} + dependencies: + '@types/body-parser': 1.19.2 + '@types/express-serve-static-core': 4.17.33 + '@types/qs': 6.9.7 + '@types/serve-static': 1.15.1 + dev: true + + /@types/html-minifier-terser/6.1.0: + resolution: {integrity: sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==} + dev: true + + /@types/http-proxy/1.17.10: + resolution: {integrity: sha512-Qs5aULi+zV1bwKAg5z1PWnDXWmsn+LxIvUGv6E2+OOMYhclZMO+OXd9pYVf2gLykf2I7IV2u7oTHwChPNsvJ7g==} + dependencies: + '@types/node': 18.15.0 + dev: true + + /@types/json-schema/7.0.11: + resolution: {integrity: sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==} + dev: true + + /@types/mime/3.0.1: + resolution: {integrity: sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA==} + dev: true + + /@types/node/18.15.0: + resolution: {integrity: sha512-z6nr0TTEOBGkzLGmbypWOGnpSpSIBorEhC4L+4HeQ2iezKCi4f77kyslRwvHeNitymGQ+oFyIWGP96l/DPSV9w==} + dev: true + + /@types/qs/6.9.7: + resolution: {integrity: sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==} + dev: true + + /@types/range-parser/1.2.4: + resolution: {integrity: sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==} + dev: true + + /@types/retry/0.12.0: + resolution: {integrity: sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==} + dev: true + + /@types/serve-index/1.9.1: + resolution: {integrity: sha512-d/Hs3nWDxNL2xAczmOVZNj92YZCS6RGxfBPjKzuu/XirCgXdpKEb88dYNbrYGint6IVWLNP+yonwVAuRC0T2Dg==} + dependencies: + '@types/express': 4.17.17 + dev: true + + /@types/serve-static/1.15.1: + resolution: {integrity: sha512-NUo5XNiAdULrJENtJXZZ3fHtfMolzZwczzBbnAeBbqBwG+LaG6YaJtuwzwGSQZ2wsCrxjEhNNjAkKigy3n8teQ==} + dependencies: + '@types/mime': 3.0.1 + '@types/node': 18.15.0 + dev: true + + /@types/sockjs/0.3.33: + resolution: {integrity: sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw==} + dependencies: + '@types/node': 18.15.0 + dev: true + + /@types/ws/8.5.4: + resolution: {integrity: sha512-zdQDHKUgcX/zBc4GrwsE/7dVdAD8JR4EuiAXiiUhhfyIJXXb2+PrGshFyeXWQPMmmZ2XxgaqclgpIC7eTXc1mg==} + dependencies: + '@types/node': 18.15.0 + dev: true + + /@types/yargs-parser/21.0.0: + resolution: {integrity: sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==} + dev: false + + /@types/yargs/17.0.13: + resolution: {integrity: sha512-9sWaruZk2JGxIQU+IhI1fhPYRcQ0UuTNuKuCW9bR5fp7qi2Llf7WDzNa17Cy7TKnh3cdxDOiyTu6gaLS0eDatg==} + dependencies: + '@types/yargs-parser': 21.0.0 + dev: false + + /@webassemblyjs/ast/1.11.1: + resolution: {integrity: sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==} + dependencies: + '@webassemblyjs/helper-numbers': 1.11.1 + '@webassemblyjs/helper-wasm-bytecode': 1.11.1 + dev: true + + /@webassemblyjs/floating-point-hex-parser/1.11.1: + resolution: {integrity: sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==} + dev: true + + /@webassemblyjs/helper-api-error/1.11.1: + resolution: {integrity: sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==} + dev: true + + /@webassemblyjs/helper-buffer/1.11.1: + resolution: {integrity: sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==} + dev: true + + /@webassemblyjs/helper-numbers/1.11.1: + resolution: {integrity: sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==} + dependencies: + '@webassemblyjs/floating-point-hex-parser': 1.11.1 + '@webassemblyjs/helper-api-error': 1.11.1 + '@xtuc/long': 4.2.2 + dev: true + + /@webassemblyjs/helper-wasm-bytecode/1.11.1: + resolution: {integrity: sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==} + dev: true + + /@webassemblyjs/helper-wasm-section/1.11.1: + resolution: {integrity: sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==} + dependencies: + '@webassemblyjs/ast': 1.11.1 + '@webassemblyjs/helper-buffer': 1.11.1 + '@webassemblyjs/helper-wasm-bytecode': 1.11.1 + '@webassemblyjs/wasm-gen': 1.11.1 + dev: true + + /@webassemblyjs/ieee754/1.11.1: + resolution: {integrity: sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==} + dependencies: + '@xtuc/ieee754': 1.2.0 + dev: true + + /@webassemblyjs/leb128/1.11.1: + resolution: {integrity: sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==} + dependencies: + '@xtuc/long': 4.2.2 + dev: true + + /@webassemblyjs/utf8/1.11.1: + resolution: {integrity: sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==} + dev: true + + /@webassemblyjs/wasm-edit/1.11.1: + resolution: {integrity: sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==} + dependencies: + '@webassemblyjs/ast': 1.11.1 + '@webassemblyjs/helper-buffer': 1.11.1 + '@webassemblyjs/helper-wasm-bytecode': 1.11.1 + '@webassemblyjs/helper-wasm-section': 1.11.1 + '@webassemblyjs/wasm-gen': 1.11.1 + '@webassemblyjs/wasm-opt': 1.11.1 + '@webassemblyjs/wasm-parser': 1.11.1 + '@webassemblyjs/wast-printer': 1.11.1 + dev: true + + /@webassemblyjs/wasm-gen/1.11.1: + resolution: {integrity: sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==} + dependencies: + '@webassemblyjs/ast': 1.11.1 + '@webassemblyjs/helper-wasm-bytecode': 1.11.1 + '@webassemblyjs/ieee754': 1.11.1 + '@webassemblyjs/leb128': 1.11.1 + '@webassemblyjs/utf8': 1.11.1 + dev: true + + /@webassemblyjs/wasm-opt/1.11.1: + resolution: {integrity: sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==} + dependencies: + '@webassemblyjs/ast': 1.11.1 + '@webassemblyjs/helper-buffer': 1.11.1 + '@webassemblyjs/wasm-gen': 1.11.1 + '@webassemblyjs/wasm-parser': 1.11.1 + dev: true + + /@webassemblyjs/wasm-parser/1.11.1: + resolution: {integrity: sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==} + dependencies: + '@webassemblyjs/ast': 1.11.1 + '@webassemblyjs/helper-api-error': 1.11.1 + '@webassemblyjs/helper-wasm-bytecode': 1.11.1 + '@webassemblyjs/ieee754': 1.11.1 + '@webassemblyjs/leb128': 1.11.1 + '@webassemblyjs/utf8': 1.11.1 + dev: true + + /@webassemblyjs/wast-printer/1.11.1: + resolution: {integrity: sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==} + dependencies: + '@webassemblyjs/ast': 1.11.1 + '@xtuc/long': 4.2.2 + dev: true + + /@webpack-cli/configtest/2.0.1_66fuqojgvlon52mqukkfkspvqe: + resolution: {integrity: sha512-njsdJXJSiS2iNbQVS0eT8A/KPnmyH4pv1APj2K0d1wrZcBLw+yppxOy4CGqa0OxDJkzfL/XELDhD8rocnIwB5A==} + engines: {node: '>=14.15.0'} + peerDependencies: + webpack: 5.x.x + webpack-cli: 5.x.x + dependencies: + webpack: 5.76.0_webpack-cli@5.0.1 + webpack-cli: 5.0.1_jkfmkh54fty5hi5ax7xfrvyyji + dev: true + + /@webpack-cli/info/2.0.1_66fuqojgvlon52mqukkfkspvqe: + resolution: {integrity: sha512-fE1UEWTwsAxRhrJNikE7v4EotYflkEhBL7EbajfkPlf6E37/2QshOy/D48Mw8G5XMFlQtS6YV42vtbG9zBpIQA==} + engines: {node: '>=14.15.0'} + peerDependencies: + webpack: 5.x.x + webpack-cli: 5.x.x + dependencies: + webpack: 5.76.0_webpack-cli@5.0.1 + webpack-cli: 5.0.1_jkfmkh54fty5hi5ax7xfrvyyji + dev: true + + /@webpack-cli/serve/2.0.1_nekbz7mv5jjnaufwg2vs32i4fu: + resolution: {integrity: sha512-0G7tNyS+yW8TdgHwZKlDWYXFA6OJQnoLCQvYKkQP0Q2X205PSQ6RNUj0M+1OB/9gRQaUZ/ccYfaxd0nhaWKfjw==} + engines: {node: '>=14.15.0'} + peerDependencies: + webpack: 5.x.x + webpack-cli: 5.x.x + webpack-dev-server: '*' + peerDependenciesMeta: + webpack-dev-server: + optional: true + dependencies: + webpack: 5.76.0_webpack-cli@5.0.1 + webpack-cli: 5.0.1_jkfmkh54fty5hi5ax7xfrvyyji + webpack-dev-server: 4.11.1_66fuqojgvlon52mqukkfkspvqe + dev: true + + /@xtuc/ieee754/1.2.0: + resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==} + dev: true + + /@xtuc/long/4.2.2: + resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==} + dev: true + + /accepts/1.3.8: + resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} + engines: {node: '>= 0.6'} + dependencies: + mime-types: 2.1.35 + negotiator: 0.6.3 + dev: true + + /acorn-import-assertions/1.8.0_acorn@8.8.2: + resolution: {integrity: sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==} + peerDependencies: + acorn: ^8 + dependencies: + acorn: 8.8.2 + dev: true + + /acorn-walk/8.2.0: + resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==} + engines: {node: '>=0.4.0'} + dev: true + + /acorn/8.8.2: + resolution: {integrity: sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==} + engines: {node: '>=0.4.0'} + hasBin: true + dev: true + + /ajv-formats/2.1.1: + resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==} + peerDependenciesMeta: + ajv: + optional: true + dependencies: + ajv: 8.12.0 + dev: true + + /ajv-keywords/3.5.2_ajv@6.12.6: + resolution: {integrity: sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==} + peerDependencies: + ajv: ^6.9.1 + dependencies: + ajv: 6.12.6 + dev: true + + /ajv-keywords/5.1.0_ajv@8.12.0: + resolution: {integrity: sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==} + peerDependencies: + ajv: ^8.8.2 + dependencies: + ajv: 8.12.0 + fast-deep-equal: 3.1.3 + dev: true + + /ajv/6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + dev: true + + /ajv/8.12.0: + resolution: {integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==} + dependencies: + fast-deep-equal: 3.1.3 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + uri-js: 4.4.1 + dev: true + + /ansi-html-community/0.0.8: + resolution: {integrity: sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==} + engines: {'0': node >= 0.8.0} + hasBin: true + dev: true + + /ansi-regex/5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + /ansi-styles/3.2.1: + resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} + engines: {node: '>=4'} + dependencies: + color-convert: 1.9.3 + + /ansi-styles/4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + dependencies: + color-convert: 2.0.1 + + /anymatch/3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + dev: true + + /array-flatten/1.1.1: + resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} + dev: true + + /array-flatten/2.1.2: + resolution: {integrity: sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==} + dev: true + + /available-typed-arrays/1.0.5: + resolution: {integrity: sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==} + engines: {node: '>= 0.4'} + dev: true + + /babel-loader/9.1.2_tkx7iv5lytdmlhrwm4n6r336ei: + resolution: {integrity: sha512-mN14niXW43tddohGl8HPu5yfQq70iUThvFL/4QzESA7GcZoC0eVOhvWdQ8+3UlSjaDE9MVtsW9mxDY07W7VpVA==} + engines: {node: '>= 14.15.0'} + peerDependencies: + '@babel/core': ^7.12.0 + webpack: '>=5' + dependencies: + '@babel/core': 7.21.0 + find-cache-dir: 3.3.2 + schema-utils: 4.0.0 + webpack: 5.76.0_webpack-cli@5.0.1 + dev: true + + /babel-plugin-dynamic-import-node/2.3.3: + resolution: {integrity: sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==} + dependencies: + object.assign: 4.1.4 + dev: true + + /babel-plugin-module-resolver/5.0.0: + resolution: {integrity: sha512-g0u+/ChLSJ5+PzYwLwP8Rp8Rcfowz58TJNCe+L/ui4rpzE/mg//JVX0EWBUYoxaextqnwuGHzfGp2hh0PPV25Q==} + engines: {node: '>= 16'} + dependencies: + find-babel-config: 2.0.0 + glob: 8.1.0 + pkg-up: 3.1.0 + reselect: 4.1.7 + resolve: 1.22.1 + dev: true + + /babel-plugin-polyfill-corejs2/0.3.3_@babel+core@7.21.0: + resolution: {integrity: sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/compat-data': 7.21.0 + '@babel/core': 7.21.0 + '@babel/helper-define-polyfill-provider': 0.3.3_@babel+core@7.21.0 + semver: 6.3.0 + transitivePeerDependencies: + - supports-color + dev: true + + /babel-plugin-polyfill-corejs3/0.5.3_@babel+core@7.21.0: + resolution: {integrity: sha512-zKsXDh0XjnrUEW0mxIHLfjBfnXSMr5Q/goMe/fxpQnLm07mcOZiIZHBNWCMx60HmdvjxfXcalac0tfFg0wqxyw==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.0 + '@babel/helper-define-polyfill-provider': 0.3.3_@babel+core@7.21.0 + core-js-compat: 3.29.0 + transitivePeerDependencies: + - supports-color + dev: true + + /babel-plugin-polyfill-corejs3/0.6.0_@babel+core@7.21.0: + resolution: {integrity: sha512-+eHqR6OPcBhJOGgsIar7xoAB1GcSwVUA3XjAd7HJNzOXT4wv6/H7KIdA/Nc60cvUlDbKApmqNvD1B1bzOt4nyA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.0 + '@babel/helper-define-polyfill-provider': 0.3.3_@babel+core@7.21.0 + core-js-compat: 3.29.0 + transitivePeerDependencies: + - supports-color + dev: true + + /babel-plugin-polyfill-regenerator/0.3.1_@babel+core@7.21.0: + resolution: {integrity: sha512-Y2B06tvgHYt1x0yz17jGkGeeMr5FeKUu+ASJ+N6nB5lQ8Dapfg42i0OVrf8PNGJ3zKL4A23snMi1IRwrqqND7A==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.0 + '@babel/helper-define-polyfill-provider': 0.3.3_@babel+core@7.21.0 + transitivePeerDependencies: + - supports-color + dev: true + + /babel-plugin-polyfill-regenerator/0.4.1_@babel+core@7.21.0: + resolution: {integrity: sha512-NtQGmyQDXjQqQ+IzRkBVwEOz9lQ4zxAQZgoAYEtU9dJjnl1Oc98qnN7jcp+bE7O7aYzVpavXE3/VKXNzUbh7aw==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.0 + '@babel/helper-define-polyfill-provider': 0.3.3_@babel+core@7.21.0 + transitivePeerDependencies: + - supports-color + dev: true + + /balanced-match/1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + dev: true + + /batch/0.6.1: + resolution: {integrity: sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==} + dev: true + + /binary-extensions/2.2.0: + resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} + engines: {node: '>=8'} + dev: true + + /body-parser/1.20.1: + resolution: {integrity: sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + dependencies: + bytes: 3.1.2 + content-type: 1.0.5 + debug: 2.6.9 + depd: 2.0.0 + destroy: 1.2.0 + http-errors: 2.0.0 + iconv-lite: 0.4.24 + on-finished: 2.4.1 + qs: 6.11.0 + raw-body: 2.5.1 + type-is: 1.6.18 + unpipe: 1.0.0 + transitivePeerDependencies: + - supports-color + dev: true + + /bonjour-service/1.1.0: + resolution: {integrity: sha512-LVRinRB3k1/K0XzZ2p58COnWvkQknIY6sf0zF2rpErvcJXpMBttEPQSxK+HEXSS9VmpZlDoDnQWv8ftJT20B0Q==} + dependencies: + array-flatten: 2.1.2 + dns-equal: 1.0.0 + fast-deep-equal: 3.1.3 + multicast-dns: 7.2.5 + dev: true + + /boolbase/1.0.0: + resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} + dev: true + + /brace-expansion/1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + dev: true + + /brace-expansion/2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + dependencies: + balanced-match: 1.0.2 + dev: true + + /braces/3.0.2: + resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} + engines: {node: '>=8'} + dependencies: + fill-range: 7.0.1 + dev: true + + /browserslist/4.21.5: + resolution: {integrity: sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + dependencies: + caniuse-lite: 1.0.30001464 + electron-to-chromium: 1.4.327 + node-releases: 2.0.10 + update-browserslist-db: 1.0.10_browserslist@4.21.5 + + /buffer-from/1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + dev: true + + /bytes/3.0.0: + resolution: {integrity: sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==} + engines: {node: '>= 0.8'} + dev: true + + /bytes/3.1.2: + resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} + engines: {node: '>= 0.8'} + dev: true + + /call-bind/1.0.2: + resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==} + dependencies: + function-bind: 1.1.1 + get-intrinsic: 1.2.0 + dev: true + + /camel-case/4.1.2: + resolution: {integrity: sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==} + dependencies: + pascal-case: 3.1.2 + tslib: 2.5.0 + dev: true + + /caniuse-lite/1.0.30001464: + resolution: {integrity: sha512-oww27MtUmusatpRpCGSOneQk2/l5czXANDSFvsc7VuOQ86s3ANhZetpwXNf1zY/zdfP63Xvjz325DAdAoES13g==} + + /chalk/2.4.2: + resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} + engines: {node: '>=4'} + dependencies: + ansi-styles: 3.2.1 + escape-string-regexp: 1.0.5 + supports-color: 5.5.0 + + /chalk/4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + dev: true + + /chokidar/3.5.3: + resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} + engines: {node: '>= 8.10.0'} + requiresBuild: true + dependencies: + anymatch: 3.1.3 + braces: 3.0.2 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.2 + dev: true + + /chrome-trace-event/1.0.3: + resolution: {integrity: sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==} + engines: {node: '>=6.0'} + dev: true + + /clean-css/5.3.2: + resolution: {integrity: sha512-JVJbM+f3d3Q704rF4bqQ5UUyTtuJ0JRKNbTKVEeujCCBoMdkEi+V+e8oktO9qGQNSvHrFTM6JZRXrUvGR1czww==} + engines: {node: '>= 10.0'} + dependencies: + source-map: 0.6.1 + dev: true + + /cliui/8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + dev: false + + /clone-deep/4.0.1: + resolution: {integrity: sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==} + engines: {node: '>=6'} + dependencies: + is-plain-object: 2.0.4 + kind-of: 6.0.3 + shallow-clone: 3.0.1 + dev: true + + /color-convert/1.9.3: + resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + dependencies: + color-name: 1.1.3 + + /color-convert/2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + dependencies: + color-name: 1.1.4 + + /color-name/1.1.3: + resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + + /color-name/1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + /colorette/2.0.19: + resolution: {integrity: sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==} + dev: true + + /commander/2.20.3: + resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} + dev: true + + /commander/4.1.1: + resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} + engines: {node: '>= 6'} + dev: true + + /commander/7.2.0: + resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==} + engines: {node: '>= 10'} + dev: true + + /commander/8.3.0: + resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==} + engines: {node: '>= 12'} + dev: true + + /commander/9.5.0: + resolution: {integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==} + engines: {node: ^12.20.0 || >=14} + dev: true + + /commondir/1.0.1: + resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} + dev: true + + /compressible/2.0.18: + resolution: {integrity: sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==} + engines: {node: '>= 0.6'} + dependencies: + mime-db: 1.52.0 + dev: true + + /compression/1.7.4: + resolution: {integrity: sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==} + engines: {node: '>= 0.8.0'} + dependencies: + accepts: 1.3.8 + bytes: 3.0.0 + compressible: 2.0.18 + debug: 2.6.9 + on-headers: 1.0.2 + safe-buffer: 5.1.2 + vary: 1.1.2 + transitivePeerDependencies: + - supports-color + dev: true + + /concat-map/0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + dev: true + + /connect-history-api-fallback/2.0.0: + resolution: {integrity: sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==} + engines: {node: '>=0.8'} + dev: true + + /content-disposition/0.5.4: + resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} + engines: {node: '>= 0.6'} + dependencies: + safe-buffer: 5.2.1 + dev: true + + /content-type/1.0.5: + resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} + engines: {node: '>= 0.6'} + dev: true + + /convert-source-map/1.9.0: + resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} + + /cookie-signature/1.0.6: + resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==} + dev: true + + /cookie/0.5.0: + resolution: {integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==} + engines: {node: '>= 0.6'} + dev: true + + /copy-anything/2.0.6: + resolution: {integrity: sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw==} + dependencies: + is-what: 3.14.1 + dev: true + + /core-js-compat/3.29.0: + resolution: {integrity: sha512-ScMn3uZNAFhK2DGoEfErguoiAHhV2Ju+oJo/jK08p7B3f3UhocUrCCkTvnZaiS+edl5nlIoiBXKcwMc6elv4KQ==} + dependencies: + browserslist: 4.21.5 + dev: true + + /core-util-is/1.0.3: + resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + dev: true + + /cross-spawn/6.0.5: + resolution: {integrity: sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==} + engines: {node: '>=4.8'} + dependencies: + nice-try: 1.0.5 + path-key: 2.0.1 + semver: 5.7.1 + shebang-command: 1.2.0 + which: 1.3.1 + dev: true + + /cross-spawn/7.0.3: + resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + engines: {node: '>= 8'} + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + dev: true + + /css-loader/6.7.3_webpack@5.76.0: + resolution: {integrity: sha512-qhOH1KlBMnZP8FzRO6YCH9UHXQhVMcEGLyNdb7Hv2cpcmJbW0YrddO+tG1ab5nT41KpHIYGsbeHqxB9xPu1pKQ==} + engines: {node: '>= 12.13.0'} + peerDependencies: + webpack: ^5.0.0 + dependencies: + icss-utils: 5.1.0_postcss@8.4.21 + postcss: 8.4.21 + postcss-modules-extract-imports: 3.0.0_postcss@8.4.21 + postcss-modules-local-by-default: 4.0.0_postcss@8.4.21 + postcss-modules-scope: 3.0.0_postcss@8.4.21 + postcss-modules-values: 4.0.0_postcss@8.4.21 + postcss-value-parser: 4.2.0 + semver: 7.3.8 + webpack: 5.76.0_webpack-cli@5.0.1 + dev: true + + /css-select/4.3.0: + resolution: {integrity: sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==} + dependencies: + boolbase: 1.0.0 + css-what: 6.1.0 + domhandler: 4.3.1 + domutils: 2.8.0 + nth-check: 2.1.1 + dev: true + + /css-what/6.1.0: + resolution: {integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==} + engines: {node: '>= 6'} + dev: true + + /cssesc/3.0.0: + resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} + engines: {node: '>=4'} + hasBin: true + dev: true + + /debug/2.6.9: + resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.0.0 + dev: true + + /debug/3.2.7: + resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.2 + dev: true + optional: true + + /debug/4.3.4: + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.2 + + /default-gateway/6.0.3: + resolution: {integrity: sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==} + engines: {node: '>= 10'} + dependencies: + execa: 5.1.1 + dev: true + + /define-lazy-prop/2.0.0: + resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} + engines: {node: '>=8'} + dev: true + + /define-properties/1.2.0: + resolution: {integrity: sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==} + engines: {node: '>= 0.4'} + dependencies: + has-property-descriptors: 1.0.0 + object-keys: 1.1.1 + dev: true + + /depd/1.1.2: + resolution: {integrity: sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==} + engines: {node: '>= 0.6'} + dev: true + + /depd/2.0.0: + resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} + engines: {node: '>= 0.8'} + dev: true + + /destroy/1.2.0: + resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + dev: true + + /detect-node/2.1.0: + resolution: {integrity: sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==} + dev: true + + /dns-equal/1.0.0: + resolution: {integrity: sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg==} + dev: true + + /dns-packet/5.4.0: + resolution: {integrity: sha512-EgqGeaBB8hLiHLZtp/IbaDQTL8pZ0+IvwzSHA6d7VyMDM+B9hgddEMa9xjK5oYnw0ci0JQ6g2XCD7/f6cafU6g==} + engines: {node: '>=6'} + dependencies: + '@leichtgewicht/ip-codec': 2.0.4 + dev: true + + /dom-converter/0.2.0: + resolution: {integrity: sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==} + dependencies: + utila: 0.4.0 + dev: true + + /dom-serializer/1.4.1: + resolution: {integrity: sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==} + dependencies: + domelementtype: 2.3.0 + domhandler: 4.3.1 + entities: 2.2.0 + dev: true + + /domelementtype/2.3.0: + resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} + dev: true + + /domhandler/4.3.1: + resolution: {integrity: sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==} + engines: {node: '>= 4'} + dependencies: + domelementtype: 2.3.0 + dev: true + + /domutils/2.8.0: + resolution: {integrity: sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==} + dependencies: + dom-serializer: 1.4.1 + domelementtype: 2.3.0 + domhandler: 4.3.1 + dev: true + + /dot-case/3.0.4: + resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==} + dependencies: + no-case: 3.0.4 + tslib: 2.5.0 + dev: true + + /duplexer/0.1.2: + resolution: {integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==} + dev: true + + /ee-first/1.1.1: + resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} + dev: true + + /electron-to-chromium/1.4.327: + resolution: {integrity: sha512-DIk2H4g/3ZhjgiABJjVdQvUdMlSABOsjeCm6gmUzIdKxAuFrGiJ8QXMm3i09grZdDBMC/d8MELMrdwYRC0+YHg==} + + /emoji-regex/8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + dev: false + + /encodeurl/1.0.2: + resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} + engines: {node: '>= 0.8'} + dev: true + + /enhanced-resolve/5.12.0: + resolution: {integrity: sha512-QHTXI/sZQmko1cbDoNAa3mJ5qhWUUNAq3vR0/YiD379fWQrcfuoX1+HW2S0MTt7XmoPLapdaDKUtelUSPic7hQ==} + engines: {node: '>=10.13.0'} + dependencies: + graceful-fs: 4.2.10 + tapable: 2.2.1 + dev: true + + /entities/2.2.0: + resolution: {integrity: sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==} + dev: true + + /envinfo/7.8.1: + resolution: {integrity: sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw==} + engines: {node: '>=4'} + hasBin: true + dev: true + + /errno/0.1.8: + resolution: {integrity: sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==} + hasBin: true + requiresBuild: true + dependencies: + prr: 1.0.1 + dev: true + optional: true + + /error-ex/1.3.2: + resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + dependencies: + is-arrayish: 0.2.1 + dev: true + + /es-abstract/1.21.1: + resolution: {integrity: sha512-QudMsPOz86xYz/1dG1OuGBKOELjCh99IIWHLzy5znUB6j8xG2yMA7bfTV86VSqKF+Y/H08vQPR+9jyXpuC6hfg==} + engines: {node: '>= 0.4'} + dependencies: + available-typed-arrays: 1.0.5 + call-bind: 1.0.2 + es-set-tostringtag: 2.0.1 + es-to-primitive: 1.2.1 + function-bind: 1.1.1 + function.prototype.name: 1.1.5 + get-intrinsic: 1.2.0 + get-symbol-description: 1.0.0 + globalthis: 1.0.3 + gopd: 1.0.1 + has: 1.0.3 + has-property-descriptors: 1.0.0 + has-proto: 1.0.1 + has-symbols: 1.0.3 + internal-slot: 1.0.5 + is-array-buffer: 3.0.2 + is-callable: 1.2.7 + is-negative-zero: 2.0.2 + is-regex: 1.1.4 + is-shared-array-buffer: 1.0.2 + is-string: 1.0.7 + is-typed-array: 1.1.10 + is-weakref: 1.0.2 + object-inspect: 1.12.3 + object-keys: 1.1.1 + object.assign: 4.1.4 + regexp.prototype.flags: 1.4.3 + safe-regex-test: 1.0.0 + string.prototype.trimend: 1.0.6 + string.prototype.trimstart: 1.0.6 + typed-array-length: 1.0.4 + unbox-primitive: 1.0.2 + which-typed-array: 1.1.9 + dev: true + + /es-module-lexer/0.9.3: + resolution: {integrity: sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==} + dev: true + + /es-set-tostringtag/2.0.1: + resolution: {integrity: sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==} + engines: {node: '>= 0.4'} + dependencies: + get-intrinsic: 1.2.0 + has: 1.0.3 + has-tostringtag: 1.0.0 + dev: true + + /es-to-primitive/1.2.1: + resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} + engines: {node: '>= 0.4'} + dependencies: + is-callable: 1.2.7 + is-date-object: 1.0.5 + is-symbol: 1.0.4 + dev: true + + /escalade/3.1.1: + resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} + engines: {node: '>=6'} + + /escape-html/1.0.3: + resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + dev: true + + /escape-string-regexp/1.0.5: + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} + engines: {node: '>=0.8.0'} + + /eslint-scope/5.1.1: + resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} + engines: {node: '>=8.0.0'} + dependencies: + esrecurse: 4.3.0 + estraverse: 4.3.0 + dev: true + + /esrecurse/4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + dependencies: + estraverse: 5.3.0 + dev: true + + /estraverse/4.3.0: + resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} + engines: {node: '>=4.0'} + dev: true + + /estraverse/5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + dev: true + + /esutils/2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + dev: true + + /etag/1.8.1: + resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} + engines: {node: '>= 0.6'} + dev: true + + /eventemitter3/4.0.7: + resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} + dev: true + + /events/3.3.0: + resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} + engines: {node: '>=0.8.x'} + dev: true + + /execa/5.1.1: + resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} + engines: {node: '>=10'} + dependencies: + cross-spawn: 7.0.3 + get-stream: 6.0.1 + human-signals: 2.1.0 + is-stream: 2.0.1 + merge-stream: 2.0.0 + npm-run-path: 4.0.1 + onetime: 5.1.2 + signal-exit: 3.0.7 + strip-final-newline: 2.0.0 + dev: true + + /express/4.18.2: + resolution: {integrity: sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==} + engines: {node: '>= 0.10.0'} + dependencies: + accepts: 1.3.8 + array-flatten: 1.1.1 + body-parser: 1.20.1 + content-disposition: 0.5.4 + content-type: 1.0.5 + cookie: 0.5.0 + cookie-signature: 1.0.6 + debug: 2.6.9 + depd: 2.0.0 + encodeurl: 1.0.2 + escape-html: 1.0.3 + etag: 1.8.1 + finalhandler: 1.2.0 + fresh: 0.5.2 + http-errors: 2.0.0 + merge-descriptors: 1.0.1 + methods: 1.1.2 + on-finished: 2.4.1 + parseurl: 1.3.3 + path-to-regexp: 0.1.7 + proxy-addr: 2.0.7 + qs: 6.11.0 + range-parser: 1.2.1 + safe-buffer: 5.2.1 + send: 0.18.0 + serve-static: 1.15.0 + setprototypeof: 1.2.0 + statuses: 2.0.1 + type-is: 1.6.18 + utils-merge: 1.0.1 + vary: 1.1.2 + transitivePeerDependencies: + - supports-color + dev: true + + /fast-deep-equal/3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + dev: true + + /fast-json-stable-stringify/2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + dev: true + + /fastest-levenshtein/1.0.16: + resolution: {integrity: sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==} + engines: {node: '>= 4.9.1'} + dev: true + + /faye-websocket/0.11.4: + resolution: {integrity: sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==} + engines: {node: '>=0.8.0'} + dependencies: + websocket-driver: 0.7.4 + dev: true + + /fill-range/7.0.1: + resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} + engines: {node: '>=8'} + dependencies: + to-regex-range: 5.0.1 + dev: true + + /finalhandler/1.2.0: + resolution: {integrity: sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==} + engines: {node: '>= 0.8'} + dependencies: + debug: 2.6.9 + encodeurl: 1.0.2 + escape-html: 1.0.3 + on-finished: 2.4.1 + parseurl: 1.3.3 + statuses: 2.0.1 + unpipe: 1.0.0 + transitivePeerDependencies: + - supports-color + dev: true + + /find-babel-config/2.0.0: + resolution: {integrity: sha512-dOKT7jvF3hGzlW60Gc3ONox/0rRZ/tz7WCil0bqA1In/3I8f1BctpXahRnEKDySZqci7u+dqq93sZST9fOJpFw==} + engines: {node: '>=16.0.0'} + dependencies: + json5: 2.2.3 + path-exists: 4.0.0 + dev: true + + /find-cache-dir/3.3.2: + resolution: {integrity: sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==} + engines: {node: '>=8'} + dependencies: + commondir: 1.0.1 + make-dir: 3.1.0 + pkg-dir: 4.2.0 + dev: true + + /find-up/3.0.0: + resolution: {integrity: sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==} + engines: {node: '>=6'} + dependencies: + locate-path: 3.0.0 + dev: true + + /find-up/4.1.0: + resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} + engines: {node: '>=8'} + dependencies: + locate-path: 5.0.0 + path-exists: 4.0.0 + dev: true + + /follow-redirects/1.15.2: + resolution: {integrity: sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + dev: true + + /for-each/0.3.3: + resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} + dependencies: + is-callable: 1.2.7 + dev: true + + /forwarded/0.2.0: + resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} + engines: {node: '>= 0.6'} + dev: true + + /fresh/0.5.2: + resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} + engines: {node: '>= 0.6'} + dev: true + + /fs-monkey/1.0.3: + resolution: {integrity: sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q==} + dev: true + + /fs-readdir-recursive/1.1.0: + resolution: {integrity: sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA==} + dev: true + + /fs.realpath/1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + dev: true + + /fsevents/2.3.2: + resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /function-bind/1.1.1: + resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} + dev: true + + /function.prototype.name/1.1.5: + resolution: {integrity: sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.21.1 + functions-have-names: 1.2.3 + dev: true + + /functions-have-names/1.2.3: + resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} + dev: true + + /gensync/1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + + /get-caller-file/2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + dev: false + + /get-intrinsic/1.2.0: + resolution: {integrity: sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==} + dependencies: + function-bind: 1.1.1 + has: 1.0.3 + has-symbols: 1.0.3 + dev: true + + /get-stream/6.0.1: + resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} + engines: {node: '>=10'} + dev: true + + /get-symbol-description/1.0.0: + resolution: {integrity: sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + get-intrinsic: 1.2.0 + dev: true + + /glob-parent/5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + dependencies: + is-glob: 4.0.3 + dev: true + + /glob-to-regexp/0.4.1: + resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} + dev: true + + /glob/7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + dev: true + + /glob/8.1.0: + resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} + engines: {node: '>=12'} + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 5.1.6 + once: 1.4.0 + dev: true + + /globals/11.12.0: + resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} + engines: {node: '>=4'} + + /globalthis/1.0.3: + resolution: {integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==} + engines: {node: '>= 0.4'} + dependencies: + define-properties: 1.2.0 + dev: true + + /gopd/1.0.1: + resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} + dependencies: + get-intrinsic: 1.2.0 + dev: true + + /graceful-fs/4.2.10: + resolution: {integrity: sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==} + dev: true + + /gzip-size/6.0.0: + resolution: {integrity: sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==} + engines: {node: '>=10'} + dependencies: + duplexer: 0.1.2 + dev: true + + /handle-thing/2.0.1: + resolution: {integrity: sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==} + dev: true + + /has-bigints/1.0.2: + resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} + dev: true + + /has-flag/3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} + + /has-flag/4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + dev: true + + /has-property-descriptors/1.0.0: + resolution: {integrity: sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==} + dependencies: + get-intrinsic: 1.2.0 + dev: true + + /has-proto/1.0.1: + resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==} + engines: {node: '>= 0.4'} + dev: true + + /has-symbols/1.0.3: + resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} + engines: {node: '>= 0.4'} + dev: true + + /has-tostringtag/1.0.0: + resolution: {integrity: sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==} + engines: {node: '>= 0.4'} + dependencies: + has-symbols: 1.0.3 + dev: true + + /has/1.0.3: + resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} + engines: {node: '>= 0.4.0'} + dependencies: + function-bind: 1.1.1 + dev: true + + /he/1.2.0: + resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} + hasBin: true + dev: true + + /hosted-git-info/2.8.9: + resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} + dev: true + + /hpack.js/2.1.6: + resolution: {integrity: sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==} + dependencies: + inherits: 2.0.4 + obuf: 1.1.2 + readable-stream: 2.3.8 + wbuf: 1.7.3 + dev: true + + /html-entities/2.3.3: + resolution: {integrity: sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA==} + dev: true + + /html-minifier-terser/6.1.0: + resolution: {integrity: sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==} + engines: {node: '>=12'} + hasBin: true + dependencies: + camel-case: 4.1.2 + clean-css: 5.3.2 + commander: 8.3.0 + he: 1.2.0 + param-case: 3.0.4 + relateurl: 0.2.7 + terser: 5.16.6 + dev: true + + /html-webpack-plugin/5.5.0_webpack@5.76.0: + resolution: {integrity: sha512-sy88PC2cRTVxvETRgUHFrL4No3UxvcH8G1NepGhqaTT+GXN2kTamqasot0inS5hXeg1cMbFDt27zzo9p35lZVw==} + engines: {node: '>=10.13.0'} + peerDependencies: + webpack: ^5.20.0 + dependencies: + '@types/html-minifier-terser': 6.1.0 + html-minifier-terser: 6.1.0 + lodash: 4.17.21 + pretty-error: 4.0.0 + tapable: 2.2.1 + webpack: 5.76.0_webpack-cli@5.0.1 + dev: true + + /htmlparser2/6.1.0: + resolution: {integrity: sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==} + dependencies: + domelementtype: 2.3.0 + domhandler: 4.3.1 + domutils: 2.8.0 + entities: 2.2.0 + dev: true + + /http-deceiver/1.2.7: + resolution: {integrity: sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==} + dev: true + + /http-errors/1.6.3: + resolution: {integrity: sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==} + engines: {node: '>= 0.6'} + dependencies: + depd: 1.1.2 + inherits: 2.0.3 + setprototypeof: 1.1.0 + statuses: 1.5.0 + dev: true + + /http-errors/2.0.0: + resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} + engines: {node: '>= 0.8'} + dependencies: + depd: 2.0.0 + inherits: 2.0.4 + setprototypeof: 1.2.0 + statuses: 2.0.1 + toidentifier: 1.0.1 + dev: true + + /http-parser-js/0.5.8: + resolution: {integrity: sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==} + dev: true + + /http-proxy-middleware/2.0.6_@types+express@4.17.17: + resolution: {integrity: sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==} + engines: {node: '>=12.0.0'} + peerDependencies: + '@types/express': ^4.17.13 + peerDependenciesMeta: + '@types/express': + optional: true + dependencies: + '@types/express': 4.17.17 + '@types/http-proxy': 1.17.10 + http-proxy: 1.18.1 + is-glob: 4.0.3 + is-plain-obj: 3.0.0 + micromatch: 4.0.5 + transitivePeerDependencies: + - debug + dev: true + + /http-proxy/1.18.1: + resolution: {integrity: sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==} + engines: {node: '>=8.0.0'} + dependencies: + eventemitter3: 4.0.7 + follow-redirects: 1.15.2 + requires-port: 1.0.0 + transitivePeerDependencies: + - debug + dev: true + + /human-signals/2.1.0: + resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} + engines: {node: '>=10.17.0'} + dev: true + + /iconv-lite/0.4.24: + resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} + engines: {node: '>=0.10.0'} + dependencies: + safer-buffer: 2.1.2 + dev: true + + /iconv-lite/0.6.3: + resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} + engines: {node: '>=0.10.0'} + dependencies: + safer-buffer: 2.1.2 + dev: true + optional: true + + /icss-utils/5.1.0_postcss@8.4.21: + resolution: {integrity: sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: ^8.1.0 + dependencies: + postcss: 8.4.21 + dev: true + + /image-size/0.5.5: + resolution: {integrity: sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==} + engines: {node: '>=0.10.0'} + hasBin: true + requiresBuild: true + dev: true + optional: true + + /import-local/3.1.0: + resolution: {integrity: sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==} + engines: {node: '>=8'} + hasBin: true + dependencies: + pkg-dir: 4.2.0 + resolve-cwd: 3.0.0 + dev: true + + /inflight/1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + dev: true + + /inherits/2.0.3: + resolution: {integrity: sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==} + dev: true + + /inherits/2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + dev: true + + /internal-slot/1.0.5: + resolution: {integrity: sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==} + engines: {node: '>= 0.4'} + dependencies: + get-intrinsic: 1.2.0 + has: 1.0.3 + side-channel: 1.0.4 + dev: true + + /interpret/3.1.1: + resolution: {integrity: sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==} + engines: {node: '>=10.13.0'} + dev: true + + /ipaddr.js/1.9.1: + resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} + engines: {node: '>= 0.10'} + dev: true + + /ipaddr.js/2.0.1: + resolution: {integrity: sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng==} + engines: {node: '>= 10'} + dev: true + + /is-array-buffer/3.0.2: + resolution: {integrity: sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==} + dependencies: + call-bind: 1.0.2 + get-intrinsic: 1.2.0 + is-typed-array: 1.1.10 + dev: true + + /is-arrayish/0.2.1: + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + dev: true + + /is-bigint/1.0.4: + resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} + dependencies: + has-bigints: 1.0.2 + dev: true + + /is-binary-path/2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + dependencies: + binary-extensions: 2.2.0 + dev: true + + /is-boolean-object/1.1.2: + resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + has-tostringtag: 1.0.0 + dev: true + + /is-callable/1.2.7: + resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} + engines: {node: '>= 0.4'} + dev: true + + /is-core-module/2.11.0: + resolution: {integrity: sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==} + dependencies: + has: 1.0.3 + dev: true + + /is-date-object/1.0.5: + resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: 1.0.0 + dev: true + + /is-docker/2.2.1: + resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} + engines: {node: '>=8'} + hasBin: true + dev: true + + /is-extglob/2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + dev: true + + /is-fullwidth-code-point/3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + dev: false + + /is-glob/4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + dependencies: + is-extglob: 2.1.1 + dev: true + + /is-negative-zero/2.0.2: + resolution: {integrity: sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==} + engines: {node: '>= 0.4'} + dev: true + + /is-number-object/1.0.7: + resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: 1.0.0 + dev: true + + /is-number/7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + dev: true + + /is-plain-obj/3.0.0: + resolution: {integrity: sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==} + engines: {node: '>=10'} + dev: true + + /is-plain-object/2.0.4: + resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==} + engines: {node: '>=0.10.0'} + dependencies: + isobject: 3.0.1 + dev: true + + /is-regex/1.1.4: + resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + has-tostringtag: 1.0.0 + dev: true + + /is-shared-array-buffer/1.0.2: + resolution: {integrity: sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==} + dependencies: + call-bind: 1.0.2 + dev: true + + /is-stream/2.0.1: + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} + engines: {node: '>=8'} + dev: true + + /is-string/1.0.7: + resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: 1.0.0 + dev: true + + /is-symbol/1.0.4: + resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} + engines: {node: '>= 0.4'} + dependencies: + has-symbols: 1.0.3 + dev: true + + /is-typed-array/1.1.10: + resolution: {integrity: sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==} + engines: {node: '>= 0.4'} + dependencies: + available-typed-arrays: 1.0.5 + call-bind: 1.0.2 + for-each: 0.3.3 + gopd: 1.0.1 + has-tostringtag: 1.0.0 + dev: true + + /is-weakref/1.0.2: + resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} + dependencies: + call-bind: 1.0.2 + dev: true + + /is-what/3.14.1: + resolution: {integrity: sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==} + dev: true + + /is-wsl/2.2.0: + resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} + engines: {node: '>=8'} + dependencies: + is-docker: 2.2.1 + dev: true + + /isarray/1.0.0: + resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + dev: true + + /isexe/2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + dev: true + + /isobject/3.0.1: + resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==} + engines: {node: '>=0.10.0'} + dev: true + + /jest-worker/27.5.1: + resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} + engines: {node: '>= 10.13.0'} + dependencies: + '@types/node': 18.15.0 + merge-stream: 2.0.0 + supports-color: 8.1.1 + dev: true + + /jquery/3.6.3: + resolution: {integrity: sha512-bZ5Sy3YzKo9Fyc8wH2iIQK4JImJ6R0GWI9kL1/k7Z91ZBNgkRXE6U0JfHIizZbort8ZunhSI3jw9I6253ahKfg==} + dev: false + + /js-tokens/4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + /jsesc/0.5.0: + resolution: {integrity: sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==} + hasBin: true + dev: true + + /jsesc/2.5.2: + resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} + engines: {node: '>=4'} + hasBin: true + + /json-parse-better-errors/1.0.2: + resolution: {integrity: sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==} + dev: true + + /json-parse-even-better-errors/2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + dev: true + + /json-schema-traverse/0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + dev: true + + /json-schema-traverse/1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + dev: true + + /json5/2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + + /kind-of/6.0.3: + resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} + engines: {node: '>=0.10.0'} + dev: true + + /klona/2.0.6: + resolution: {integrity: sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==} + engines: {node: '>= 8'} + dev: true + + /less-loader/11.1.0_less@4.1.3+webpack@5.76.0: + resolution: {integrity: sha512-C+uDBV7kS7W5fJlUjq5mPBeBVhYpTIm5gB09APT9o3n/ILeaXVsiSFTbZpTJCJwQ/Crczfn3DmfQFwxYusWFug==} + engines: {node: '>= 14.15.0'} + peerDependencies: + less: ^3.5.0 || ^4.0.0 + webpack: ^5.0.0 + dependencies: + klona: 2.0.6 + less: 4.1.3 + webpack: 5.76.0_webpack-cli@5.0.1 + dev: true + + /less/4.1.3: + resolution: {integrity: sha512-w16Xk/Ta9Hhyei0Gpz9m7VS8F28nieJaL/VyShID7cYvP6IL5oHeL6p4TXSDJqZE/lNv0oJ2pGVjJsRkfwm5FA==} + engines: {node: '>=6'} + hasBin: true + dependencies: + copy-anything: 2.0.6 + parse-node-version: 1.0.1 + tslib: 2.5.0 + optionalDependencies: + errno: 0.1.8 + graceful-fs: 4.2.10 + image-size: 0.5.5 + make-dir: 2.1.0 + mime: 1.6.0 + needle: 3.2.0 + source-map: 0.6.1 + transitivePeerDependencies: + - supports-color + dev: true + + /load-json-file/4.0.0: + resolution: {integrity: sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==} + engines: {node: '>=4'} + dependencies: + graceful-fs: 4.2.10 + parse-json: 4.0.0 + pify: 3.0.0 + strip-bom: 3.0.0 + dev: true + + /loader-runner/4.3.0: + resolution: {integrity: sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==} + engines: {node: '>=6.11.5'} + dev: true + + /locate-path/3.0.0: + resolution: {integrity: sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==} + engines: {node: '>=6'} + dependencies: + p-locate: 3.0.0 + path-exists: 3.0.0 + dev: true + + /locate-path/5.0.0: + resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} + engines: {node: '>=8'} + dependencies: + p-locate: 4.1.0 + dev: true + + /lodash.debounce/4.0.8: + resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} + dev: true + + /lodash/4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + dev: true + + /lower-case/2.0.2: + resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} + dependencies: + tslib: 2.5.0 + dev: true + + /lru-cache/5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + dependencies: + yallist: 3.1.1 + + /lru-cache/6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} + dependencies: + yallist: 4.0.0 + dev: true + + /make-dir/2.1.0: + resolution: {integrity: sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==} + engines: {node: '>=6'} + dependencies: + pify: 4.0.1 + semver: 5.7.1 + dev: true + + /make-dir/3.1.0: + resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} + engines: {node: '>=8'} + dependencies: + semver: 6.3.0 + dev: true + + /media-typer/0.3.0: + resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} + engines: {node: '>= 0.6'} + dev: true + + /memfs/3.4.13: + resolution: {integrity: sha512-omTM41g3Skpvx5dSYeZIbXKcXoAVc/AoMNwn9TKx++L/gaen/+4TTttmu8ZSch5vfVJ8uJvGbroTsIlslRg6lg==} + engines: {node: '>= 4.0.0'} + dependencies: + fs-monkey: 1.0.3 + dev: true + + /memorystream/0.3.1: + resolution: {integrity: sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==} + engines: {node: '>= 0.10.0'} + dev: true + + /merge-descriptors/1.0.1: + resolution: {integrity: sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==} + dev: true + + /merge-stream/2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + dev: true + + /methods/1.1.2: + resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} + engines: {node: '>= 0.6'} + dev: true + + /micromatch/4.0.5: + resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} + engines: {node: '>=8.6'} + dependencies: + braces: 3.0.2 + picomatch: 2.3.1 + dev: true + + /mime-db/1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + dev: true + + /mime-types/2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + dependencies: + mime-db: 1.52.0 + dev: true + + /mime/1.6.0: + resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} + engines: {node: '>=4'} + hasBin: true + dev: true + + /mimic-fn/2.1.0: + resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} + engines: {node: '>=6'} + dev: true + + /minimalistic-assert/1.0.1: + resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==} + dev: true + + /minimatch/3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + dependencies: + brace-expansion: 1.1.11 + dev: true + + /minimatch/5.1.6: + resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} + engines: {node: '>=10'} + dependencies: + brace-expansion: 2.0.1 + dev: true + + /mrmime/1.0.1: + resolution: {integrity: sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw==} + engines: {node: '>=10'} + dev: true + + /ms/2.0.0: + resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} + dev: true + + /ms/2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + + /ms/2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + dev: true + + /multicast-dns/7.2.5: + resolution: {integrity: sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==} + hasBin: true + dependencies: + dns-packet: 5.4.0 + thunky: 1.1.0 + dev: true + + /nanoid/3.3.4: + resolution: {integrity: sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + dev: true + + /needle/3.2.0: + resolution: {integrity: sha512-oUvzXnyLiVyVGoianLijF9O/RecZUf7TkBfimjGrLM4eQhXyeJwM6GeAWccwfQ9aa4gMCZKqhAOuLaMIcQxajQ==} + engines: {node: '>= 4.4.x'} + hasBin: true + requiresBuild: true + dependencies: + debug: 3.2.7 + iconv-lite: 0.6.3 + sax: 1.2.4 + transitivePeerDependencies: + - supports-color + dev: true + optional: true + + /negotiator/0.6.3: + resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} + engines: {node: '>= 0.6'} + dev: true + + /neo-async/2.6.2: + resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} + dev: true + + /nice-try/1.0.5: + resolution: {integrity: sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==} + dev: true + + /no-case/3.0.4: + resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} + dependencies: + lower-case: 2.0.2 + tslib: 2.5.0 + dev: true + + /node-forge/1.3.1: + resolution: {integrity: sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==} + engines: {node: '>= 6.13.0'} + dev: true + + /node-releases/2.0.10: + resolution: {integrity: sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==} + + /normalize-package-data/2.5.0: + resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} + dependencies: + hosted-git-info: 2.8.9 + resolve: 1.22.1 + semver: 5.7.1 + validate-npm-package-license: 3.0.4 + dev: true + + /normalize-path/3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + dev: true + + /npm-run-all/4.1.5: + resolution: {integrity: sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ==} + engines: {node: '>= 4'} + hasBin: true + dependencies: + ansi-styles: 3.2.1 + chalk: 2.4.2 + cross-spawn: 6.0.5 + memorystream: 0.3.1 + minimatch: 3.1.2 + pidtree: 0.3.1 + read-pkg: 3.0.0 + shell-quote: 1.8.0 + string.prototype.padend: 3.1.4 + dev: true + + /npm-run-path/4.0.1: + resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} + engines: {node: '>=8'} + dependencies: + path-key: 3.1.1 + dev: true + + /nth-check/2.1.1: + resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} + dependencies: + boolbase: 1.0.0 + dev: true + + /object-inspect/1.12.3: + resolution: {integrity: sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==} + dev: true + + /object-keys/1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} + dev: true + + /object.assign/4.1.4: + resolution: {integrity: sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + has-symbols: 1.0.3 + object-keys: 1.1.1 + dev: true + + /obuf/1.1.2: + resolution: {integrity: sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==} + dev: true + + /on-finished/2.4.1: + resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} + engines: {node: '>= 0.8'} + dependencies: + ee-first: 1.1.1 + dev: true + + /on-headers/1.0.2: + resolution: {integrity: sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==} + engines: {node: '>= 0.8'} + dev: true + + /once/1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + dependencies: + wrappy: 1.0.2 + dev: true + + /onetime/5.1.2: + resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} + engines: {node: '>=6'} + dependencies: + mimic-fn: 2.1.0 + dev: true + + /open/8.4.2: + resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} + engines: {node: '>=12'} + dependencies: + define-lazy-prop: 2.0.0 + is-docker: 2.2.1 + is-wsl: 2.2.0 + dev: true + + /opener/1.5.2: + resolution: {integrity: sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==} + hasBin: true + dev: true + + /p-limit/2.3.0: + resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} + engines: {node: '>=6'} + dependencies: + p-try: 2.2.0 + dev: true + + /p-locate/3.0.0: + resolution: {integrity: sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==} + engines: {node: '>=6'} + dependencies: + p-limit: 2.3.0 + dev: true + + /p-locate/4.1.0: + resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} + engines: {node: '>=8'} + dependencies: + p-limit: 2.3.0 + dev: true + + /p-retry/4.6.2: + resolution: {integrity: sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==} + engines: {node: '>=8'} + dependencies: + '@types/retry': 0.12.0 + retry: 0.13.1 + dev: true + + /p-try/2.2.0: + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} + engines: {node: '>=6'} + dev: true + + /param-case/3.0.4: + resolution: {integrity: sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==} + dependencies: + dot-case: 3.0.4 + tslib: 2.5.0 + dev: true + + /parse-json/4.0.0: + resolution: {integrity: sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==} + engines: {node: '>=4'} + dependencies: + error-ex: 1.3.2 + json-parse-better-errors: 1.0.2 + dev: true + + /parse-node-version/1.0.1: + resolution: {integrity: sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==} + engines: {node: '>= 0.10'} + dev: true + + /parseurl/1.3.3: + resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} + engines: {node: '>= 0.8'} + dev: true + + /pascal-case/3.1.2: + resolution: {integrity: sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==} + dependencies: + no-case: 3.0.4 + tslib: 2.5.0 + dev: true + + /path-exists/3.0.0: + resolution: {integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==} + engines: {node: '>=4'} + dev: true + + /path-exists/4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + dev: true + + /path-is-absolute/1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + dev: true + + /path-key/2.0.1: + resolution: {integrity: sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==} + engines: {node: '>=4'} + dev: true + + /path-key/3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + dev: true + + /path-parse/1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + dev: true + + /path-to-regexp/0.1.7: + resolution: {integrity: sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==} + dev: true + + /path-type/3.0.0: + resolution: {integrity: sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==} + engines: {node: '>=4'} + dependencies: + pify: 3.0.0 + dev: true + + /picocolors/1.0.0: + resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + + /picomatch/2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + dev: true + + /pidtree/0.3.1: + resolution: {integrity: sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA==} + engines: {node: '>=0.10'} + hasBin: true + dev: true + + /pify/3.0.0: + resolution: {integrity: sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==} + engines: {node: '>=4'} + dev: true + + /pify/4.0.1: + resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} + engines: {node: '>=6'} + dev: true + + /pkg-dir/4.2.0: + resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} + engines: {node: '>=8'} + dependencies: + find-up: 4.1.0 + dev: true + + /pkg-up/3.1.0: + resolution: {integrity: sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==} + engines: {node: '>=8'} + dependencies: + find-up: 3.0.0 + dev: true + + /postcss-modules-extract-imports/3.0.0_postcss@8.4.21: + resolution: {integrity: sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: ^8.1.0 + dependencies: + postcss: 8.4.21 + dev: true + + /postcss-modules-local-by-default/4.0.0_postcss@8.4.21: + resolution: {integrity: sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: ^8.1.0 + dependencies: + icss-utils: 5.1.0_postcss@8.4.21 + postcss: 8.4.21 + postcss-selector-parser: 6.0.11 + postcss-value-parser: 4.2.0 + dev: true + + /postcss-modules-scope/3.0.0_postcss@8.4.21: + resolution: {integrity: sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: ^8.1.0 + dependencies: + postcss: 8.4.21 + postcss-selector-parser: 6.0.11 + dev: true + + /postcss-modules-values/4.0.0_postcss@8.4.21: + resolution: {integrity: sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: ^8.1.0 + dependencies: + icss-utils: 5.1.0_postcss@8.4.21 + postcss: 8.4.21 + dev: true + + /postcss-selector-parser/6.0.11: + resolution: {integrity: sha512-zbARubNdogI9j7WY4nQJBiNqQf3sLS3wCP4WfOidu+p28LofJqDH1tcXypGrcmMHhDk2t9wGhCsYe/+szLTy1g==} + engines: {node: '>=4'} + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + dev: true + + /postcss-value-parser/4.2.0: + resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} + dev: true + + /postcss/8.4.21: + resolution: {integrity: sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg==} + engines: {node: ^10 || ^12 || >=14} + dependencies: + nanoid: 3.3.4 + picocolors: 1.0.0 + source-map-js: 1.0.2 + dev: true + + /pretty-error/4.0.0: + resolution: {integrity: sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==} + dependencies: + lodash: 4.17.21 + renderkid: 3.0.0 + dev: true + + /process-nextick-args/2.0.1: + resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + dev: true + + /proxy-addr/2.0.7: + resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} + engines: {node: '>= 0.10'} + dependencies: + forwarded: 0.2.0 + ipaddr.js: 1.9.1 + dev: true + + /prr/1.0.1: + resolution: {integrity: sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==} + dev: true + optional: true + + /punycode/2.3.0: + resolution: {integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==} + engines: {node: '>=6'} + dev: true + + /qs/6.11.0: + resolution: {integrity: sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==} + engines: {node: '>=0.6'} + dependencies: + side-channel: 1.0.4 + dev: true + + /randombytes/2.1.0: + resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} + dependencies: + safe-buffer: 5.2.1 + dev: true + + /range-parser/1.2.1: + resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} + engines: {node: '>= 0.6'} + dev: true + + /raw-body/2.5.1: + resolution: {integrity: sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==} + engines: {node: '>= 0.8'} + dependencies: + bytes: 3.1.2 + http-errors: 2.0.0 + iconv-lite: 0.4.24 + unpipe: 1.0.0 + dev: true + + /read-pkg/3.0.0: + resolution: {integrity: sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==} + engines: {node: '>=4'} + dependencies: + load-json-file: 4.0.0 + normalize-package-data: 2.5.0 + path-type: 3.0.0 + dev: true + + /readable-stream/2.3.8: + resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} + dependencies: + core-util-is: 1.0.3 + inherits: 2.0.4 + isarray: 1.0.0 + process-nextick-args: 2.0.1 + safe-buffer: 5.1.2 + string_decoder: 1.1.1 + util-deprecate: 1.0.2 + dev: true + + /readable-stream/3.6.1: + resolution: {integrity: sha512-+rQmrWMYGA90yenhTYsLWAsLsqVC8osOw6PKE1HDYiO0gdPeKe/xDHNzIAIn4C91YQ6oenEhfYqqc1883qHbjQ==} + engines: {node: '>= 6'} + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + dev: true + + /readdirp/3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + dependencies: + picomatch: 2.3.1 + dev: true + + /rechoir/0.8.0: + resolution: {integrity: sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==} + engines: {node: '>= 10.13.0'} + dependencies: + resolve: 1.22.1 + dev: true + + /regenerate-unicode-properties/10.1.0: + resolution: {integrity: sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ==} + engines: {node: '>=4'} + dependencies: + regenerate: 1.4.2 + dev: true + + /regenerate/1.4.2: + resolution: {integrity: sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==} + dev: true + + /regenerator-runtime/0.13.11: + resolution: {integrity: sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==} + dev: true + + /regenerator-transform/0.15.1: + resolution: {integrity: sha512-knzmNAcuyxV+gQCufkYcvOqX/qIIfHLv0u5x79kRxuGojfYVky1f15TzZEu2Avte8QGepvUNTnLskf8E6X6Vyg==} + dependencies: + '@babel/runtime': 7.21.0 + dev: true + + /regexp.prototype.flags/1.4.3: + resolution: {integrity: sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + functions-have-names: 1.2.3 + dev: true + + /regexpu-core/5.3.1: + resolution: {integrity: sha512-nCOzW2V/X15XpLsK2rlgdwrysrBq+AauCn+omItIz4R1pIcmeot5zvjdmOBRLzEH/CkC6IxMJVmxDe3QcMuNVQ==} + engines: {node: '>=4'} + dependencies: + '@babel/regjsgen': 0.8.0 + regenerate: 1.4.2 + regenerate-unicode-properties: 10.1.0 + regjsparser: 0.9.1 + unicode-match-property-ecmascript: 2.0.0 + unicode-match-property-value-ecmascript: 2.1.0 + dev: true + + /regjsparser/0.9.1: + resolution: {integrity: sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==} + hasBin: true + dependencies: + jsesc: 0.5.0 + dev: true + + /relateurl/0.2.7: + resolution: {integrity: sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==} + engines: {node: '>= 0.10'} + dev: true + + /renderkid/3.0.0: + resolution: {integrity: sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==} + dependencies: + css-select: 4.3.0 + dom-converter: 0.2.0 + htmlparser2: 6.1.0 + lodash: 4.17.21 + strip-ansi: 6.0.1 + dev: true + + /require-directory/2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + dev: false + + /require-from-string/2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + dev: true + + /requires-port/1.0.0: + resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} + dev: true + + /reselect/4.1.7: + resolution: {integrity: sha512-Zu1xbUt3/OPwsXL46hvOOoQrap2azE7ZQbokq61BQfiXvhewsKDwhMeZjTX9sX0nvw1t/U5Audyn1I9P/m9z0A==} + dev: true + + /resolve-cwd/3.0.0: + resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==} + engines: {node: '>=8'} + dependencies: + resolve-from: 5.0.0 + dev: true + + /resolve-from/5.0.0: + resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} + engines: {node: '>=8'} + dev: true + + /resolve/1.22.1: + resolution: {integrity: sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==} + hasBin: true + dependencies: + is-core-module: 2.11.0 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + dev: true + + /retry/0.13.1: + resolution: {integrity: sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==} + engines: {node: '>= 4'} + dev: true + + /rimraf/3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + hasBin: true + dependencies: + glob: 7.2.3 + dev: true + + /safe-buffer/5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + dev: true + + /safe-buffer/5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + dev: true + + /safe-regex-test/1.0.0: + resolution: {integrity: sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==} + dependencies: + call-bind: 1.0.2 + get-intrinsic: 1.2.0 + is-regex: 1.1.4 + dev: true + + /safer-buffer/2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + dev: true + + /sax/1.2.4: + resolution: {integrity: sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==} + dev: true + optional: true + + /schema-utils/3.1.1: + resolution: {integrity: sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==} + engines: {node: '>= 10.13.0'} + dependencies: + '@types/json-schema': 7.0.11 + ajv: 6.12.6 + ajv-keywords: 3.5.2_ajv@6.12.6 + dev: true + + /schema-utils/4.0.0: + resolution: {integrity: sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==} + engines: {node: '>= 12.13.0'} + dependencies: + '@types/json-schema': 7.0.11 + ajv: 8.12.0 + ajv-formats: 2.1.1 + ajv-keywords: 5.1.0_ajv@8.12.0 + dev: true + + /select-hose/2.0.0: + resolution: {integrity: sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==} + dev: true + + /selfsigned/2.1.1: + resolution: {integrity: sha512-GSL3aowiF7wa/WtSFwnUrludWFoNhftq8bUkH9pkzjpN2XSPOAYEgg6e0sS9s0rZwgJzJiQRPU18A6clnoW5wQ==} + engines: {node: '>=10'} + dependencies: + node-forge: 1.3.1 + dev: true + + /semver/5.7.1: + resolution: {integrity: sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==} + hasBin: true + dev: true + + /semver/6.3.0: + resolution: {integrity: sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==} + hasBin: true + + /semver/7.3.8: + resolution: {integrity: sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==} + engines: {node: '>=10'} + hasBin: true + dependencies: + lru-cache: 6.0.0 + dev: true + + /send/0.18.0: + resolution: {integrity: sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==} + engines: {node: '>= 0.8.0'} + dependencies: + debug: 2.6.9 + depd: 2.0.0 + destroy: 1.2.0 + encodeurl: 1.0.2 + escape-html: 1.0.3 + etag: 1.8.1 + fresh: 0.5.2 + http-errors: 2.0.0 + mime: 1.6.0 + ms: 2.1.3 + on-finished: 2.4.1 + range-parser: 1.2.1 + statuses: 2.0.1 + transitivePeerDependencies: + - supports-color + dev: true + + /serialize-javascript/6.0.1: + resolution: {integrity: sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==} + dependencies: + randombytes: 2.1.0 + dev: true + + /serve-index/1.9.1: + resolution: {integrity: sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==} + engines: {node: '>= 0.8.0'} + dependencies: + accepts: 1.3.8 + batch: 0.6.1 + debug: 2.6.9 + escape-html: 1.0.3 + http-errors: 1.6.3 + mime-types: 2.1.35 + parseurl: 1.3.3 + transitivePeerDependencies: + - supports-color + dev: true + + /serve-static/1.15.0: + resolution: {integrity: sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==} + engines: {node: '>= 0.8.0'} + dependencies: + encodeurl: 1.0.2 + escape-html: 1.0.3 + parseurl: 1.3.3 + send: 0.18.0 + transitivePeerDependencies: + - supports-color + dev: true + + /setprototypeof/1.1.0: + resolution: {integrity: sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==} + dev: true + + /setprototypeof/1.2.0: + resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + dev: true + + /shallow-clone/3.0.1: + resolution: {integrity: sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==} + engines: {node: '>=8'} + dependencies: + kind-of: 6.0.3 + dev: true + + /shebang-command/1.2.0: + resolution: {integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==} + engines: {node: '>=0.10.0'} + dependencies: + shebang-regex: 1.0.0 + dev: true + + /shebang-command/2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + dependencies: + shebang-regex: 3.0.0 + dev: true + + /shebang-regex/1.0.0: + resolution: {integrity: sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==} + engines: {node: '>=0.10.0'} + dev: true + + /shebang-regex/3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + dev: true + + /shell-quote/1.8.0: + resolution: {integrity: sha512-QHsz8GgQIGKlRi24yFc6a6lN69Idnx634w49ay6+jA5yFh7a1UY+4Rp6HPx/L/1zcEDPEij8cIsiqR6bQsE5VQ==} + dev: true + + /side-channel/1.0.4: + resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} + dependencies: + call-bind: 1.0.2 + get-intrinsic: 1.2.0 + object-inspect: 1.12.3 + dev: true + + /signal-exit/3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + dev: true + + /sirv/1.0.19: + resolution: {integrity: sha512-JuLThK3TnZG1TAKDwNIqNq6QA2afLOCcm+iE8D1Kj3GA40pSPsxQjjJl0J8X3tsR7T+CP1GavpzLwYkgVLWrZQ==} + engines: {node: '>= 10'} + dependencies: + '@polka/url': 1.0.0-next.21 + mrmime: 1.0.1 + totalist: 1.1.0 + dev: true + + /slash/2.0.0: + resolution: {integrity: sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==} + engines: {node: '>=6'} + dev: true + + /sockjs/0.3.24: + resolution: {integrity: sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==} + dependencies: + faye-websocket: 0.11.4 + uuid: 8.3.2 + websocket-driver: 0.7.4 + dev: true + + /source-map-js/1.0.2: + resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} + engines: {node: '>=0.10.0'} + dev: true + + /source-map-support/0.5.21: + resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + dev: true + + /source-map/0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + dev: true + + /spdx-correct/3.2.0: + resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} + dependencies: + spdx-expression-parse: 3.0.1 + spdx-license-ids: 3.0.12 + dev: true + + /spdx-exceptions/2.3.0: + resolution: {integrity: sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==} + dev: true + + /spdx-expression-parse/3.0.1: + resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} + dependencies: + spdx-exceptions: 2.3.0 + spdx-license-ids: 3.0.12 + dev: true + + /spdx-license-ids/3.0.12: + resolution: {integrity: sha512-rr+VVSXtRhO4OHbXUiAF7xW3Bo9DuuF6C5jH+q/x15j2jniycgKbxU09Hr0WqlSLUs4i4ltHGXqTe7VHclYWyA==} + dev: true + + /spdy-transport/3.0.0: + resolution: {integrity: sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==} + dependencies: + debug: 4.3.4 + detect-node: 2.1.0 + hpack.js: 2.1.6 + obuf: 1.1.2 + readable-stream: 3.6.1 + wbuf: 1.7.3 + transitivePeerDependencies: + - supports-color + dev: true + + /spdy/4.0.2: + resolution: {integrity: sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==} + engines: {node: '>=6.0.0'} + dependencies: + debug: 4.3.4 + handle-thing: 2.0.1 + http-deceiver: 1.2.7 + select-hose: 2.0.0 + spdy-transport: 3.0.0 + transitivePeerDependencies: + - supports-color + dev: true + + /statuses/1.5.0: + resolution: {integrity: sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==} + engines: {node: '>= 0.6'} + dev: true + + /statuses/2.0.1: + resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} + engines: {node: '>= 0.8'} + dev: true + + /string-width/4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + dev: false + + /string.prototype.padend/3.1.4: + resolution: {integrity: sha512-67otBXoksdjsnXXRUq+KMVTdlVRZ2af422Y0aTyTjVaoQkGr3mxl2Bc5emi7dOQ3OGVVQQskmLEWwFXwommpNw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.21.1 + dev: true + + /string.prototype.trimend/1.0.6: + resolution: {integrity: sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.21.1 + dev: true + + /string.prototype.trimstart/1.0.6: + resolution: {integrity: sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.21.1 + dev: true + + /string_decoder/1.1.1: + resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + dependencies: + safe-buffer: 5.1.2 + dev: true + + /string_decoder/1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + dependencies: + safe-buffer: 5.2.1 + dev: true + + /strip-ansi/6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + dependencies: + ansi-regex: 5.0.1 + + /strip-bom/3.0.0: + resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} + engines: {node: '>=4'} + dev: true + + /strip-final-newline/2.0.0: + resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} + engines: {node: '>=6'} + dev: true + + /style-loader/3.3.1_webpack@5.76.0: + resolution: {integrity: sha512-GPcQ+LDJbrcxHORTRes6Jy2sfvK2kS6hpSfI/fXhPt+spVzxF6LJ1dHLN9zIGmVaaP044YKaIatFaufENRiDoQ==} + engines: {node: '>= 12.13.0'} + peerDependencies: + webpack: ^5.0.0 + dependencies: + webpack: 5.76.0_webpack-cli@5.0.1 + dev: true + + /supports-color/5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} + dependencies: + has-flag: 3.0.0 + + /supports-color/7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + dependencies: + has-flag: 4.0.0 + dev: true + + /supports-color/8.1.1: + resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} + engines: {node: '>=10'} + dependencies: + has-flag: 4.0.0 + dev: true + + /supports-preserve-symlinks-flag/1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + dev: true + + /tapable/2.2.1: + resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} + engines: {node: '>=6'} + dev: true + + /terser-webpack-plugin/5.3.7_webpack@5.76.0: + resolution: {integrity: sha512-AfKwIktyP7Cu50xNjXF/6Qb5lBNzYaWpU6YfoX3uZicTx0zTy0stDDCsvjDapKsSDvOeWo5MEq4TmdBy2cNoHw==} + engines: {node: '>= 10.13.0'} + peerDependencies: + '@swc/core': '*' + esbuild: '*' + uglify-js: '*' + webpack: ^5.1.0 + peerDependenciesMeta: + '@swc/core': + optional: true + esbuild: + optional: true + uglify-js: + optional: true + dependencies: + '@jridgewell/trace-mapping': 0.3.17 + jest-worker: 27.5.1 + schema-utils: 3.1.1 + serialize-javascript: 6.0.1 + terser: 5.16.6 + webpack: 5.76.0_webpack-cli@5.0.1 + dev: true + + /terser/5.16.6: + resolution: {integrity: sha512-IBZ+ZQIA9sMaXmRZCUMDjNH0D5AQQfdn4WUjHL0+1lF4TP1IHRJbrhb6fNaXWikrYQTSkb7SLxkeXAiy1p7mbg==} + engines: {node: '>=10'} + hasBin: true + dependencies: + '@jridgewell/source-map': 0.3.2 + acorn: 8.8.2 + commander: 2.20.3 + source-map-support: 0.5.21 + dev: true + + /thunky/1.1.0: + resolution: {integrity: sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==} + dev: true + + /to-fast-properties/2.0.0: + resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} + engines: {node: '>=4'} + + /to-regex-range/5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + dependencies: + is-number: 7.0.0 + dev: true + + /toidentifier/1.0.1: + resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} + engines: {node: '>=0.6'} + dev: true + + /totalist/1.1.0: + resolution: {integrity: sha512-gduQwd1rOdDMGxFG1gEvhV88Oirdo2p+KjoYFU7k2g+i7n6AFFbDQ5kMPUsW0pNbfQsB/cwXvT1i4Bue0s9g5g==} + engines: {node: '>=6'} + dev: true + + /tslib/2.5.0: + resolution: {integrity: sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==} + dev: true + + /type-is/1.6.18: + resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} + engines: {node: '>= 0.6'} + dependencies: + media-typer: 0.3.0 + mime-types: 2.1.35 + dev: true + + /typed-array-length/1.0.4: + resolution: {integrity: sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==} + dependencies: + call-bind: 1.0.2 + for-each: 0.3.3 + is-typed-array: 1.1.10 + dev: true + + /typescript/4.9.5: + resolution: {integrity: sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==} + engines: {node: '>=4.2.0'} + hasBin: true + dev: true + + /unbox-primitive/1.0.2: + resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} + dependencies: + call-bind: 1.0.2 + has-bigints: 1.0.2 + has-symbols: 1.0.3 + which-boxed-primitive: 1.0.2 + dev: true + + /unicode-canonical-property-names-ecmascript/2.0.0: + resolution: {integrity: sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==} + engines: {node: '>=4'} + dev: true + + /unicode-match-property-ecmascript/2.0.0: + resolution: {integrity: sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==} + engines: {node: '>=4'} + dependencies: + unicode-canonical-property-names-ecmascript: 2.0.0 + unicode-property-aliases-ecmascript: 2.1.0 + dev: true + + /unicode-match-property-value-ecmascript/2.1.0: + resolution: {integrity: sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==} + engines: {node: '>=4'} + dev: true + + /unicode-property-aliases-ecmascript/2.1.0: + resolution: {integrity: sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==} + engines: {node: '>=4'} + dev: true + + /unpipe/1.0.0: + resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} + engines: {node: '>= 0.8'} + dev: true + + /update-browserslist-db/1.0.10_browserslist@4.21.5: + resolution: {integrity: sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + dependencies: + browserslist: 4.21.5 + escalade: 3.1.1 + picocolors: 1.0.0 + + /uri-js/4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + dependencies: + punycode: 2.3.0 + dev: true + + /util-deprecate/1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + dev: true + + /utila/0.4.0: + resolution: {integrity: sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==} + dev: true + + /utils-merge/1.0.1: + resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} + engines: {node: '>= 0.4.0'} + dev: true + + /uuid/8.3.2: + resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} + hasBin: true + dev: true + + /validate-npm-package-license/3.0.4: + resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} + dependencies: + spdx-correct: 3.2.0 + spdx-expression-parse: 3.0.1 + dev: true + + /vary/1.1.2: + resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} + engines: {node: '>= 0.8'} + dev: true + + /watchpack/2.4.0: + resolution: {integrity: sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==} + engines: {node: '>=10.13.0'} + dependencies: + glob-to-regexp: 0.4.1 + graceful-fs: 4.2.10 + dev: true + + /wbuf/1.7.3: + resolution: {integrity: sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==} + dependencies: + minimalistic-assert: 1.0.1 + dev: true + + /webpack-bundle-analyzer/4.8.0: + resolution: {integrity: sha512-ZzoSBePshOKhr+hd8u6oCkZVwpVaXgpw23ScGLFpR6SjYI7+7iIWYarjN6OEYOfRt8o7ZyZZQk0DuMizJ+LEIg==} + engines: {node: '>= 10.13.0'} + hasBin: true + dependencies: + '@discoveryjs/json-ext': 0.5.7 + acorn: 8.8.2 + acorn-walk: 8.2.0 + chalk: 4.1.2 + commander: 7.2.0 + gzip-size: 6.0.0 + lodash: 4.17.21 + opener: 1.5.2 + sirv: 1.0.19 + ws: 7.5.9 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + dev: true + + /webpack-cli/5.0.1_jkfmkh54fty5hi5ax7xfrvyyji: + resolution: {integrity: sha512-S3KVAyfwUqr0Mo/ur3NzIp6jnerNpo7GUO6so51mxLi1spqsA17YcMXy0WOIJtBSnj748lthxC6XLbNKh/ZC+A==} + engines: {node: '>=14.15.0'} + hasBin: true + peerDependencies: + '@webpack-cli/generators': '*' + webpack: 5.x.x + webpack-bundle-analyzer: '*' + webpack-dev-server: '*' + peerDependenciesMeta: + '@webpack-cli/generators': + optional: true + webpack-bundle-analyzer: + optional: true + webpack-dev-server: + optional: true + dependencies: + '@discoveryjs/json-ext': 0.5.7 + '@webpack-cli/configtest': 2.0.1_66fuqojgvlon52mqukkfkspvqe + '@webpack-cli/info': 2.0.1_66fuqojgvlon52mqukkfkspvqe + '@webpack-cli/serve': 2.0.1_nekbz7mv5jjnaufwg2vs32i4fu + colorette: 2.0.19 + commander: 9.5.0 + cross-spawn: 7.0.3 + envinfo: 7.8.1 + fastest-levenshtein: 1.0.16 + import-local: 3.1.0 + interpret: 3.1.1 + rechoir: 0.8.0 + webpack: 5.76.0_webpack-cli@5.0.1 + webpack-bundle-analyzer: 4.8.0 + webpack-dev-server: 4.11.1_66fuqojgvlon52mqukkfkspvqe + webpack-merge: 5.8.0 + dev: true + + /webpack-dev-middleware/5.3.3_webpack@5.76.0: + resolution: {integrity: sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA==} + engines: {node: '>= 12.13.0'} + peerDependencies: + webpack: ^4.0.0 || ^5.0.0 + dependencies: + colorette: 2.0.19 + memfs: 3.4.13 + mime-types: 2.1.35 + range-parser: 1.2.1 + schema-utils: 4.0.0 + webpack: 5.76.0_webpack-cli@5.0.1 + dev: true + + /webpack-dev-server/4.11.1_66fuqojgvlon52mqukkfkspvqe: + resolution: {integrity: sha512-lILVz9tAUy1zGFwieuaQtYiadImb5M3d+H+L1zDYalYoDl0cksAB1UNyuE5MMWJrG6zR1tXkCP2fitl7yoUJiw==} + engines: {node: '>= 12.13.0'} + hasBin: true + peerDependencies: + webpack: ^4.37.0 || ^5.0.0 + webpack-cli: '*' + peerDependenciesMeta: + webpack-cli: + optional: true + dependencies: + '@types/bonjour': 3.5.10 + '@types/connect-history-api-fallback': 1.3.5 + '@types/express': 4.17.17 + '@types/serve-index': 1.9.1 + '@types/serve-static': 1.15.1 + '@types/sockjs': 0.3.33 + '@types/ws': 8.5.4 + ansi-html-community: 0.0.8 + bonjour-service: 1.1.0 + chokidar: 3.5.3 + colorette: 2.0.19 + compression: 1.7.4 + connect-history-api-fallback: 2.0.0 + default-gateway: 6.0.3 + express: 4.18.2 + graceful-fs: 4.2.10 + html-entities: 2.3.3 + http-proxy-middleware: 2.0.6_@types+express@4.17.17 + ipaddr.js: 2.0.1 + open: 8.4.2 + p-retry: 4.6.2 + rimraf: 3.0.2 + schema-utils: 4.0.0 + selfsigned: 2.1.1 + serve-index: 1.9.1 + sockjs: 0.3.24 + spdy: 4.0.2 + webpack: 5.76.0_webpack-cli@5.0.1 + webpack-cli: 5.0.1_jkfmkh54fty5hi5ax7xfrvyyji + webpack-dev-middleware: 5.3.3_webpack@5.76.0 + ws: 8.12.1 + transitivePeerDependencies: + - bufferutil + - debug + - supports-color + - utf-8-validate + dev: true + + /webpack-merge/5.8.0: + resolution: {integrity: sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q==} + engines: {node: '>=10.0.0'} + dependencies: + clone-deep: 4.0.1 + wildcard: 2.0.0 + dev: true + + /webpack-sources/3.2.3: + resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==} + engines: {node: '>=10.13.0'} + dev: true + + /webpack/5.76.0_webpack-cli@5.0.1: + resolution: {integrity: sha512-l5sOdYBDunyf72HW8dF23rFtWq/7Zgvt/9ftMof71E/yUb1YLOBmTgA2K4vQthB3kotMrSj609txVE0dnr2fjA==} + engines: {node: '>=10.13.0'} + hasBin: true + peerDependencies: + webpack-cli: '*' + peerDependenciesMeta: + webpack-cli: + optional: true + dependencies: + '@types/eslint-scope': 3.7.4 + '@types/estree': 0.0.51 + '@webassemblyjs/ast': 1.11.1 + '@webassemblyjs/wasm-edit': 1.11.1 + '@webassemblyjs/wasm-parser': 1.11.1 + acorn: 8.8.2 + acorn-import-assertions: 1.8.0_acorn@8.8.2 + browserslist: 4.21.5 + chrome-trace-event: 1.0.3 + enhanced-resolve: 5.12.0 + es-module-lexer: 0.9.3 + eslint-scope: 5.1.1 + events: 3.3.0 + glob-to-regexp: 0.4.1 + graceful-fs: 4.2.10 + json-parse-even-better-errors: 2.3.1 + loader-runner: 4.3.0 + mime-types: 2.1.35 + neo-async: 2.6.2 + schema-utils: 3.1.1 + tapable: 2.2.1 + terser-webpack-plugin: 5.3.7_webpack@5.76.0 + watchpack: 2.4.0 + webpack-cli: 5.0.1_jkfmkh54fty5hi5ax7xfrvyyji + webpack-sources: 3.2.3 + transitivePeerDependencies: + - '@swc/core' + - esbuild + - uglify-js + dev: true + + /websocket-driver/0.7.4: + resolution: {integrity: sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==} + engines: {node: '>=0.8.0'} + dependencies: + http-parser-js: 0.5.8 + safe-buffer: 5.2.1 + websocket-extensions: 0.1.4 + dev: true + + /websocket-extensions/0.1.4: + resolution: {integrity: sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==} + engines: {node: '>=0.8.0'} + dev: true + + /which-boxed-primitive/1.0.2: + resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} + dependencies: + is-bigint: 1.0.4 + is-boolean-object: 1.1.2 + is-number-object: 1.0.7 + is-string: 1.0.7 + is-symbol: 1.0.4 + dev: true + + /which-typed-array/1.1.9: + resolution: {integrity: sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==} + engines: {node: '>= 0.4'} + dependencies: + available-typed-arrays: 1.0.5 + call-bind: 1.0.2 + for-each: 0.3.3 + gopd: 1.0.1 + has-tostringtag: 1.0.0 + is-typed-array: 1.1.10 + dev: true + + /which/1.3.1: + resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} + hasBin: true + dependencies: + isexe: 2.0.0 + dev: true + + /which/2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + dependencies: + isexe: 2.0.0 + dev: true + + /wildcard/2.0.0: + resolution: {integrity: sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==} + dev: true + + /wrap-ansi/7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + dev: false + + /wrappy/1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + dev: true + + /ws/7.5.9: + resolution: {integrity: sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==} + engines: {node: '>=8.3.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + dev: true + + /ws/8.12.1: + resolution: {integrity: sha512-1qo+M9Ba+xNhPB+YTWUlK6M17brTut5EXbcBaMRN5pH5dFrXz7lzz1ChFSUq3bOUl8yEvSenhHmYUNJxFzdJew==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + dev: true + + /y18n/5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + dev: false + + /yallist/3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + + /yallist/4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + dev: true + + /yargs-parser/21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + dev: false + + /yargs/17.6.2: + resolution: {integrity: sha512-1/9UrdHjDZc0eOU0HxOHoS78C69UD3JRMvzlJ7S79S2nTaWRA/whGCTV8o9e/N/1Va9YIV7Q4sOxD8VV4pCWOw==} + engines: {node: '>=12'} + dependencies: + cliui: 8.0.1 + escalade: 3.1.1 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 21.1.1 + dev: false diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml new file mode 100644 index 000000000..ee102735a --- /dev/null +++ b/pnpm-workspace.yaml @@ -0,0 +1,2 @@ +packages: + - "packages/*" diff --git a/private/less/app.less b/private/less/app.less deleted file mode 100644 index dd4d62029..000000000 --- a/private/less/app.less +++ /dev/null @@ -1,2 +0,0 @@ -@import "../../src/less/resource/app.less"; -@import "var.less"; diff --git a/private/less/background.less b/private/less/background.less deleted file mode 100644 index 0897148ea..000000000 --- a/private/less/background.less +++ /dev/null @@ -1,2 +0,0 @@ -@import "../../src/less/resource/background.less"; -@import "var.less"; diff --git a/private/less/font.less b/private/less/font.less deleted file mode 100644 index d7399c46e..000000000 --- a/private/less/font.less +++ /dev/null @@ -1,2 +0,0 @@ -@import "../../src/less/resource/font.less"; -@import "var.less"; diff --git a/private/less/icon.less b/private/less/icon.less deleted file mode 100644 index 8aa44a2ae..000000000 --- a/private/less/icon.less +++ /dev/null @@ -1,5 +0,0 @@ -@import "../../src/less/resource/icon.less"; -@import "var.less"; - - - diff --git a/private/less/var.less b/private/less/var.less deleted file mode 100644 index c427442d3..000000000 --- a/private/less/var.less +++ /dev/null @@ -1,4 +0,0 @@ -@webUrl: './'; -@fontUrl: '@{webUrl}font/'; //图片的基本地址 -@imageUrl: '@{webUrl}images/1x/'; //图片的基本地址 -@image2xUrl: '@{webUrl}images/2x/'; //2倍图片的基本地址 diff --git a/public/js/index.js b/public/js/index.js deleted file mode 100644 index e69de29bb..000000000 diff --git a/public/less/app.less b/public/less/app.less deleted file mode 100644 index dd4d62029..000000000 --- a/public/less/app.less +++ /dev/null @@ -1,2 +0,0 @@ -@import "../../src/less/resource/app.less"; -@import "var.less"; diff --git a/public/less/background.less b/public/less/background.less deleted file mode 100644 index 0897148ea..000000000 --- a/public/less/background.less +++ /dev/null @@ -1,2 +0,0 @@ -@import "../../src/less/resource/background.less"; -@import "var.less"; diff --git a/public/less/font.less b/public/less/font.less deleted file mode 100644 index d7399c46e..000000000 --- a/public/less/font.less +++ /dev/null @@ -1,2 +0,0 @@ -@import "../../src/less/resource/font.less"; -@import "var.less"; diff --git a/public/less/icon.less b/public/less/icon.less deleted file mode 100644 index 8aa44a2ae..000000000 --- a/public/less/icon.less +++ /dev/null @@ -1,5 +0,0 @@ -@import "../../src/less/resource/icon.less"; -@import "var.less"; - - - diff --git a/public/less/var.less b/public/less/var.less deleted file mode 100644 index 88ff90275..000000000 --- a/public/less/var.less +++ /dev/null @@ -1,4 +0,0 @@ -@webUrl: 'https://fine-design-storage.oss-cn-shanghai.aliyuncs.com/fineui/2.0/'; -@fontUrl: '@{webUrl}font/'; //图片的基本地址 -@imageUrl: '@{webUrl}images/1x/'; //图片的基本地址 -@image2xUrl: '@{webUrl}images/2x/'; //2倍图片的基本地址 diff --git a/publish.bat b/publish.bat deleted file mode 100644 index c174aa424..000000000 --- a/publish.bat +++ /dev/null @@ -1 +0,0 @@ -npm run publishToPrivate \ No newline at end of file diff --git a/publish.sh b/publish.sh deleted file mode 100644 index c174aa424..000000000 --- a/publish.sh +++ /dev/null @@ -1 +0,0 @@ -npm run publishToPrivate \ No newline at end of file diff --git a/rollup.config.js b/rollup.config.js deleted file mode 100644 index fe5699412..000000000 --- a/rollup.config.js +++ /dev/null @@ -1,65 +0,0 @@ -const babel = require("@rollup/plugin-babel"); -const alias = require("@rollup/plugin-alias"); -const resolve = require("@rollup/plugin-node-resolve"); -const commonjs = require("@rollup/plugin-commonjs"); -const sizes = require("rollup-plugin-sizes"); -const path = require("path"); - -module.exports = [ - { - input: path.resolve(__dirname, "src/index.js"), - output: [ - { - file: "dist/fineui.esm.js", - format: "esm", - sourcemap: true, - } - ], - plugins: [ - alias({ - entries: [ - { find: "@", replacement: path.resolve(__dirname, "src") } - ] - }), - resolve(), - babel({ - babelHelpers: "inline", - plugins: [ - ["@babel/plugin-proposal-decorators", { legacy: true }] - ] - }), - commonjs() - ] - }, - { - input: path.resolve(__dirname, "src/bundle.js"), - output: [ - { - file: "dist/fineui.min.js", - sourcemap: true, - format: "umd" - } - ], - plugins: [ - alias({ - entries: [ - { find: "@", replacement: path.resolve(__dirname, "src") } - ] - }), - resolve(), - babel({ - babelHelpers: "inline", - plugins: [ - ["@babel/plugin-proposal-decorators", { legacy: true }] - ] - }), - // babel({ - // babelHelpers: "runtime", - // presets: [babelConfig] - // }), - commonjs(), - sizes(), - // terser() - ] - } -]; diff --git a/script/code.static.js b/script/code.static.js new file mode 100644 index 000000000..526f97788 --- /dev/null +++ b/script/code.static.js @@ -0,0 +1,89 @@ +/** + * @file 各模块文件数量统计脚本(从 BI 搬过来的) + */ +let fs = require('fs'); +let path = require('path'); + +const rootPath = path.resolve(__dirname, '../packages'); +// 获取所有的模块名 +const modules = fs.readdirSync(rootPath); +const result = []; + +let jsFileCount = 0; +let tsFileCount = 0; +let tsxFileCount = 0; + +const file = async filePath => { + if ( + filePath.endsWith('.js') && + filePath.indexOf('/dist/') < 0 && + filePath.indexOf('/webpack/') < 0 && + filePath.indexOf('/webui-bi/private/') < 0 + ) { + console.log(jsFileCount + ':' + path.normalize(filePath)); + jsFileCount++; + } + if (filePath.endsWith('.ts')) { + tsFileCount++; + } + if (filePath.endsWith('.tsx')) { + tsxFileCount++; + } +}; + +const reset = () => { + jsFileCount = 0; + tsFileCount = 0; + tsxFileCount = 0; +}; + +// 递归所有文件夹统计 +const codeStat = async (pt, lineFun) => { + let files = fs.readdirSync(pt); + files + .map(file => { + return `${pt}/${file}`; + }) + .forEach(file => { + let stat = fs.statSync(file); + if (stat.isDirectory()) { + if ( + file.indexOf('__test__') > -1 || + file.indexOf('__point__') > -1 || + file.indexOf('third') > -1 || + file.indexOf('__e2e__') > -1 || + file.indexOf('__integration__') > -1 || + file.indexOf('node_modules') > -1 + ) { + return; + } + codeStat(file, lineFun); + return; + } + if (file.indexOf('.DS_Store') > -1) { + return; + } + lineFun(file); + }); +}; + +const statisticFile = () => { + modules.forEach(i => { + codeStat(`${rootPath}/${i}/src`, file); + result.push({ + name: i, + jsFileCount, + tsFileCount, + tsxFileCount, + allFileCount: jsFileCount + tsFileCount + tsxFileCount, + }); + reset(); + }); + + console.table(result); +}; + +statisticFile(); +module.exports = { + statisticFile, +}; diff --git a/script/lib/fui.component.json b/script/lib/fui.component.json new file mode 100644 index 000000000..fd25ca2dc --- /dev/null +++ b/script/lib/fui.component.json @@ -0,0 +1,398 @@ +{ + "bi.pane": "Pane", + "bi.button": "Button", + "bi.horizontal": "HorizontalLayout", + "bi.horizontal_adapt": "HorizontalAdaptLayout", + "bi.popup_view": "PopupView", + "bi.collection_view": "CollectionView", + "bi.grid_view": "GridView", + "bi.list_view": "ListView", + "bi.bubble": "Bubble", + "bi.virtual_list": "VirtualList", + "bi.combo": "Combo", + "bi.expander": "Expander", + "bi.button_group": "ButtonGroup", + "bi.combo_group": "ComboGroup", + "bi.virtual_group": "VirtualGroup", + "bi.loader": "Loader", + "bi.navigation": "Navigation", + "bi.searcher": "Searcher", + "bi.switcher": "Switcher", + "bi.tab": "Tab", + "bi.button_tree": "ButtonTree", + "bi.context": "Context", + "bi.el": "EL", + "bi.bar_popover": "BarPopover", + "bi.searcher_view": "SearcherView", + "bi.single": "Single", + "bi.text": "Text", + "bi.a": "A", + "bi.loading_bar": "LoadingBar", + "bi.basic_button": "BasicButton", + "bi.node_button": "NodeButton", + "bi.icon_button": "IconButton", + "bi.image_button": "ImageButton", + "bi.text_button": "TextButton", + "bi.blank_icon_icon_text_item": "BlankIconIconTextItem", + "bi.blank_icon_text_icon_item": "BlankIconTextIconItem", + "bi.blank_icon_text_item": "BlankIconTextItem", + "bi.icon_text_icon_item": "IconTextIconItem", + "bi.icon_text_item": "IconTextItem", + "bi.text_icon_item": "TextIconItem", + "bi.text_item": "TextItem", + "bi.icon_text_icon_node": "IconTextIconNode", + "bi.icon_text_node": "IconTextNode", + "bi.text_icon_node": "TextIconNode", + "bi.text_node": "TextNode", + "bi.editor": "Editor", + "bi.multifile_editor": "MultifileEditor", + "bi.textarea_editor": "TextAreaEditor", + "bi.html": "Html", + "bi.icon": "Icon", + "bi.iframe": "Iframe", + "bi.img": "Img", + "bi.image_checkbox": "ImageCheckbox", + "bi.checkbox": "Checkbox", + "bi.file": "File", + "bi.input": "Input", + "bi.image_radio": "ImageRadio", + "bi.radio": "Radio", + "bi.instruction": "Instruction", + "bi.html_label": "HtmlLabel", + "bi.icon_label": "IconLabel", + "bi.label": "Label", + "bi.link": "Link", + "bi.pure_text": "PureText", + "bi.custom_tree": "CustomTree", + "bi.icon_change_button": "IconChangeButton", + "bi.trigger_icon_button": "TriggerIconButton", + "bi.half_icon_button": "HalfIconButton", + "bi.half_button": "HalfButton", + "bi.multi_select_item": "MultiSelectItem", + "bi.single_select_icon_text_item": "SingleSelectIconTextItem", + "bi.single_select_item": "SingleSelectItem", + "bi.single_select_radio_item": "SingleSelectRadioItem", + "bi.arrow_group_node": "ArrowNode", + "bi.icon_arrow_node": "IconArrowNode", + "bi.multilayer_icon_arrow_node": "MultiLayerIconArrowNode", + "bi.plus_group_node": "PlusGroupNode", + "bi.tree_node_switcher": "TreeNodeSwitcher", + "bi.tree_node": "BasicTreeNode", + "bi.first_plus_group_node": "FirstPlusGroupNode", + "bi.mid_plus_group_node": "MidPlusGroupNode", + "bi.last_plus_group_node": "LastPlusGroupNode", + "bi.switch": "Switch", + "bi.icon_tree_leaf_item": "IconTreeLeafItem", + "bi.multilayer_icon_tree_leaf_item": "MultiLayerIconTreeLeafItem", + "bi.tree_item": "BasicTreeItem", + "bi.first_tree_leaf_item": "FirstTreeLeafItem", + "bi.mid_tree_leaf_item": "MidTreeLeafItem", + "bi.last_tree_leaf_item": "LastTreeLeafItem", + "bi.root_tree_leaf_item": "RootTreeLeafItem", + "bi.calendar": "Calendar", + "bi.year_calendar": "YearCalendar", + "bi.arrow_group_node_checkbox": "ArrowTreeGroupNodeCheckbox", + "bi.checking_mark_node": "CheckingMarkNode", + "bi.first_tree_node_checkbox": "FirstTreeNodeCheckbox", + "bi.last_tree_node_checkbox": "LastTreeNodeCheckbox", + "bi.mid_tree_node_checkbox": "MidTreeNodeCheckbox", + "bi.tree_node_checkbox": "TreeNodeCheckbox", + "bi.custom_color_chooser": "CustomColorChooser", + "bi.color_chooser": "ColorChooser", + "bi.hex_color_chooser_popup": "HexColorChooserPopup", + "bi.simple_hex_color_chooser_popup": "SimpleHexColorChooserPopup", + "bi.color_chooser_popup": "ColorChooserPopup", + "bi.simple_color_chooser_popup": "SimpleColorChooserPopup", + "bi.simple_color_chooser": "SimpleColorChooser", + "bi.color_chooser_trigger": "ColorChooserTrigger", + "bi.long_color_chooser_trigger": "LongColorChooserTrigger", + "bi.color_picker_button": "ColorPickerButton", + "bi.color_picker_show_button": "ColorChooserShowButton", + "bi.hex_color_picker": "HexColorPicker", + "bi.color_picker": "ColorPicker", + "bi.hex_color_picker_editor": "HexColorPickerEditor", + "bi.simple_hex_color_picker_editor": "SimpleHexColorPickerEditor", + "bi.color_picker_editor": "ColorPickerEditor", + "bi.simple_color_picker_editor": "SimpleColorPickerEditor", + "bi.farbtastic": "Farbtastic", + "bi.bubble_combo": "BubbleCombo", + "bi.bubble_popup_view": "BubblePopupView", + "bi.bubble_bar_popup_view": "BubblePopupBarView", + "bi.text_bubble_bar_popup_view": "TextBubblePopupBarView", + "bi.editor_icon_check_combo": "EditorIconCheckCombo", + "bi.icon_combo": "IconCombo", + "bi.icon_combo_popup": "IconComboPopup", + "bi.icon_combo_trigger": "IconComboTrigger", + "bi.icon_text_value_combo": "IconTextValueCombo", + "bi.icon_text_value_combo_popup": "IconTextValueComboPopup", + "bi.search_text_value_combo": "SearchTextValueCombo", + "bi.search_text_value_combo_popup": "SearchTextValueComboPopup", + "bi.search_text_value_trigger": "SearchTextValueTrigger", + "bi.text_value_check_combo": "TextValueCheckCombo", + "bi.text_value_check_combo_popup": "TextValueCheckComboPopup", + "bi.text_value_combo": "TextValueCombo", + "bi.small_text_value_combo": "SmallTextValueCombo", + "bi.text_value_combo_popup": "TextValueComboPopup", + "bi.clear_editor": "ClearEditor", + "bi.default_text_editor": "DefaultTextEditor", + "bi.shelter_editor": "ShelterEditor", + "bi.sign_editor": "SignEditor", + "bi.state_editor": "StateEditor", + "bi.simple_state_editor": "SimpleStateEditor", + "bi.multi_popup_view": "MultiPopupView", + "bi.popup_panel": "PopupPanel", + "bi.list_pane": "ListPane", + "bi.panel": "Panel", + "bi.linear_segment_button": "LinearSegmentButton", + "bi.linear_segment": "LinearSegment", + "bi.select_list": "SelectList", + "bi.lazy_loader": "LazyLoader", + "bi.list_loader": "ListLoader", + "bi.sort_list": "SortList", + "bi.all_count_pager": "AllCountPager", + "bi.detail_pager": "DetailPager", + "bi.direction_pager": "DirectionPager", + "bi.segment_button": "SegmentButton", + "bi.segment": "Segment", + "bi.multi_select_bar": "MultiSelectBar", + "bi.level_tree": "LevelTree", + "bi.tree_expander": "TreeExpander", + "bi.tree_expander.popup": "TreeExpanderPopup", + "bi.editor_trigger": "EditorTrigger", + "bi.icon_trigger": "IconTrigger", + "bi.icon_text_trigger": "IconTextTrigger", + "bi.select_icon_text_trigger": "SelectIconTextTrigger", + "bi.text_trigger": "TextTrigger", + "bi.select_text_trigger": "SelectTextTrigger", + "bi.small_select_text_trigger": "SmallSelectTextTrigger", + "bi.small_text_trigger": "SmallTextTrigger", + "bi.async_tree": "Asynctree", + "bi.list_async_tree": "Listasynctree", + "bi.list_part_tree": "ListPartTree", + "bi.list_tree_view": "Listtreeview", + "bi.part_tree": "PartTree", + "bi.display_tree": "DisplayTree", + "bi.list_display_tree": "ListDisplayTree", + "bi.simple_tree": "SimpleTreeView", + "bi.tree_view": "TreeView", + "bi.all_value_chooser_combo": "AllValueChooserCombo", + "bi.all_value_chooser_pane": "AllValueChooserPane", + "bi.all_value_multi_text_value_combo": "AllValueMultiTextValueCombo", + "bi.form_field": "FormField", + "bi.custom_form": "Form", + "bi.list_tree_value_chooser_insert_combo": "ListTreeValueChooserInsertCombo", + "bi.tree_value_chooser_insert_combo": "TreeValueChooserInsertCombo", + "bi.tree_value_chooser_combo": "TreeValueChooserCombo", + "bi.tree_value_chooser_pane": "TreeValueChooserPane", + "bi.value_chooser_insert_combo": "ValueChooserInsertCombo", + "bi.value_chooser_combo": "ValueChooserCombo", + "bi.value_chooser_no_bar_combo": "ValueChooserNoBarCombo", + "bi.value_chooser_pane": "ValueChooserPane", + "bi.absolute_horizontal_adapt": "AbsoluteHorizontalLayout", + "bi.absolute_left_right_vertical_adapt": "AbsoluteLeftRightVerticalAdaptLayout", + "bi.absolute_right_vertical_adapt": "AbsoluteRightVerticalAdaptLayout", + "bi.absolute_vertical_adapt": "AbsoluteVerticalLayout", + "bi.center_adapt": "CenterAdaptLayout", + "bi.left_right_vertical_adapt": "LeftRightVerticalAdaptLayout", + "bi.left_vertical_adapt": "LeftVerticalAdaptLayout", + "bi.right_vertical_adapt": "RightVerticalAdaptLayout", + "bi.table_adapt": "TableAdaptLayout", + "bi.vertical_adapt": "VerticalAdaptLayout", + "bi.horizontal_auto": "HorizontalAutoLayout", + "bi.inline_center_adapt": "InlineCenterAdaptLayout", + "bi.inline_horizontal_adapt": "InlineHorizontalAdaptLayout", + "bi.inline_vertical_adapt": "InlineVerticalAdaptLayout", + "bi.vtape_auto": "AutoVerticalTapeLayout", + "bi.horizontal_float_fill": "FloatHorizontalFillLayout", + "bi.flex_center_adapt": "FlexCenterLayout", + "bi.flex_horizontal_adapt": "FlexHorizontalCenter", + "bi.flex_horizontal_center_adapt": "FlexHorizontalCenterAdapt", + "bi.flex_horizontal": "FlexHorizontalLayout", + "bi.flex_left_right_vertical_adapt": "FlexLeftRightVerticalAdaptLayout", + "bi.flex_vertical_adapt": "FlexVerticalCenter", + "bi.flex_vertical_center_adapt": "FlexVerticalCenterAdapt", + "bi.flex_vertical": "FlexVerticalLayout", + "bi.flex_scrollable_center_adapt": "FlexWrapperCenterLayout", + "bi.flex_scrollable_horizontal_adapt": "FlexWrapperHorizontalCenter", + "bi.flex_scrollable_horizontal_center_adapt": "FlexWrapperHorizontalCenterAdapt", + "bi.flex_scrollable_horizontal": "FlexWrapperHorizontalLayout", + "bi.flex_scrollable_vertical_adapt": "FlexWrapperVerticalCenter", + "bi.flex_scrollable_vertical_center_adapt": "FlexWrapperVerticalCenterAdapt", + "bi.flex_scrollable_vertical": "FlexWrapperVerticalLayout", + "bi.absolute_center_float": "FloatAbsoluteCenterLayout", + "bi.absolute_horizontal_float": "FloatAbsoluteHorizontalLayout", + "bi.absolute_left_right_vertical_float": "FloatAbsoluteLeftRightVerticalAdaptLayout", + "bi.absolute_right_vertical_float": "FloatAbsoluteRightVerticalAdaptLayout", + "bi.absolute_vertical_float": "FloatAbsoluteVerticalLayout", + "bi.horizontal_float": "FloatHorizontalLayout", + "bi.absolute": "AbsoluteLayout", + "bi.adaptive": "AdaptiveLayout", + "bi.border": "BorderLayout", + "bi.card": "CardLayout", + "bi.default": "DefaultLayout", + "bi.division": "DivisionLayout", + "bi.left": "FloatLeftLayout", + "bi.right": "FloatRightLayout", + "bi.grid": "GridLayout", + "bi.inline": "InlineLayout", + "bi.lattice": "LatticeLayout", + "bi.table": "TableLayout", + "bi.htape": "HTapeLayout", + "bi.vtape": "VTapeLayout", + "bi.td": "TdLayout", + "bi.vertical": "VerticalLayout", + "bi.window": "WindowLayout", + "bi.center": "CenterLayout", + "bi.float_center": "FloatCenterLayout", + "bi.horizontal_center": "HorizontalCenterLayout", + "bi.vertical_center": "VerticalCenterLayout", + "bi.responsive_flex_horizontal": "ResponsiveFlexHorizontalLayout", + "bi.responsive_flex_scrollable_horizontal": "ResponsiveFlexWrapperHorizontalLayout", + "bi.responsive_inline": "ResponsiveInlineLayout", + "bi.horizontal_sticky": "HorizontalStickyLayout", + "bi.vertical_sticky": "VerticalStickyLayout", + "bi.layout": "Layout", + "bi.router": "RouterWidget", + "bi.router_view": "RouterView", + "bi.collapse": "Collapse", + "bi.month_date_combo": "MonthDateCombo", + "bi.year_date_combo": "YearDateCombo", + "bi.date_picker": "DatePicker", + "bi.year_picker": "YearPicker", + "bi.date_calendar_popup": "DateCalendarPopup", + "bi.month_popup": "MonthPopup", + "bi.year_popup": "YearPopup", + "bi.date_triangle_trigger": "DateTriangleTrigger", + "bi.static_date_pane_card": "StaticDatePaneCard", + "bi.dynamic_date_pane": "DynamicDatePane", + "bi.date_time_combo": "DateTimeCombo", + "bi.date_time_popup": "DateTimePopup", + "bi.date_time_trigger": "DateTimeTrigger", + "bi.static_date_time_pane_card": "StaticDateTimePaneCard", + "bi.dynamic_date_time_pane": "DynamicDateTimePane", + "bi.down_list_combo": "DownListCombo", + "bi.down_list_group": "DownListGroup", + "bi.down_list_item": "DownListItem", + "bi.down_list_group_item": "DownListGroupItem", + "bi.down_list_popup": "DownListPopup", + "bi.dynamic_date_card": "DynamicDateCard", + "bi.dynamic_date_combo": "DynamicDateCombo", + "bi.dynamic_date_param_item": "DynamicDateParamItem", + "bi.dynamic_date_popup": "DynamicDatePopup", + "bi.dynamic_date_trigger": "DynamicDateTrigger", + "bi.dynamic_date_time_combo": "DynamicDateTimeCombo", + "bi.dynamic_date_time_popup": "DynamicDateTimePopup", + "bi.dynamic_date_time_select": "DynamicDateTimeSelect", + "bi.dynamic_date_time_trigger": "DynamicDateTimeTrigger", + "bi.search_editor": "SearchEditor", + "bi.small_search_editor": "SmallSearchEditor", + "bi.text_editor": "TextEditor", + "bi.small_text_editor": "SmallTextEditor", + "bi.interval_slider": "IntervalSlider", + "bi.multi_layer_down_list_combo": "MultiLayerDownListCombo", + "bi.multi_layer_down_list_popup": "MultiLayerDownListPopup", + "bi.multilayer_select_tree_combo": "MultiLayerSelectTreeCombo", + "bi.multilayer_select_tree_insert_search_pane": "MultiLayerSelectTreeInsertSearchPane", + "bi.multilayer_select_level_tree": "MultiLayerSelectLevelTree", + "bi.multilayer_select_tree_popup": "MultiLayerSelectTreePopup", + "bi.multilayer_select_tree_trigger": "MultiLayerSelectTreeTrigger", + "bi.multilayer_single_tree_combo": "MultiLayerSingleTreeCombo", + "bi.multilayer_single_tree_insert_search_pane": "MultiLayerSingleTreeInsertSearchPane", + "bi.multilayer_single_level_tree": "MultiLayerSingleLevelTree", + "bi.multilayer_single_tree_popup": "MultiLayerSingleTreePopup", + "bi.multilayer_single_tree_trigger": "MultiLayerSingleTreeTrigger", + "bi.multi_select_check_pane": "MultiSelectCheckPane", + "bi.display_selected_list": "DisplaySelectedList", + "bi.multi_select_inner_loader": "MultiSelectInnerLoader", + "bi.multi_select_combo": "MultiSelectCombo", + "bi.multi_select_no_bar_combo": "MultiSelectNoBarCombo", + "bi.multi_select_insert_combo": "MultiSelectInsertCombo", + "bi.multi_select_insert_no_bar_combo": "MultiSelectInsertNoBarCombo", + "bi.multi_select_insert_trigger": "MultiSelectInsertTrigger", + "bi.multi_select_loader": "MultiSelectLoader", + "bi.multi_select_no_bar_loader": "MultiSelectNoBarLoader", + "bi.multi_select_popup_view": "MultiSelectPopupView", + "bi.multi_select_no_bar_popup_view": "MultiSelectNoBarPopupView", + "bi.multi_select_trigger": "MultiSelectTrigger", + "bi.multi_select_search_insert_pane": "MultiSelectSearchInsertPane", + "bi.multi_select_search_loader": "MultiSelectSearchLoader", + "bi.multi_select_search_pane": "MultiSelectSearchPane", + "bi.multi_select_check_selected_button": "MultiSelectCheckSelectedButton", + "bi.select_patch_editor": "SelectPatchEditor", + "bi.multi_select_editor": "MultiSelectEditor", + "bi.multi_select_insert_searcher": "MultiSelectInsertSearcher", + "bi.multi_select_searcher": "MultiSelectSearcher", + "bi.multi_select_check_selected_switcher": "MultiSelectCheckSelectedSwitcher", + "bi.multi_select_insert_list": "MultiSelectInsertList", + "bi.multi_select_insert_no_bar_list": "MultiSelectInsertNoBarList", + "bi.multi_select_list": "MultiSelectList", + "bi.multi_select_tree": "MultiSelectTree", + "bi.multi_select_tree_popup": "MultiSelectTreePopup", + "bi.multi_tree_check_pane": "MultiTreeCheckPane", + "bi.multi_tree_combo": "MultiTreeCombo", + "bi.multi_tree_insert_combo": "MultiTreeInsertCombo", + "bi.multi_tree_list_combo": "MultiTreeListCombo", + "bi.multi_tree_popup_view": "MultiTreePopup", + "bi.multi_tree_check_selected_button": "MultiTreeCheckSelectedButton", + "bi.multi_tree_search_insert_pane": "MultiTreeSearchInsertPane", + "bi.multi_tree_search_pane": "MultiTreeSearchPane", + "bi.multi_list_tree_searcher": "MultiListTreeSearcher", + "bi.multi_tree_searcher": "MultiTreeSearcher", + "bi.number_editor": "NumberEditor", + "bi.number_interval": "NumberInterval", + "bi.number_interval_single_editor": "NumberIntervalSingleEidtor", + "bi.search_multi_text_value_combo": "SearchMultiTextValueCombo", + "bi.search_multi_select_trigger": "SearchMultiSelectTrigger", + "bi.search_multi_select_loader": "SearchMultiSelectLoader", + "bi.search_multi_select_popup_view": "SearchMultiSelectPopupView", + "bi.search_multi_select_searcher": "SearchMultiSelectSearcher", + "bi.select_tree_combo": "SelectTreeCombo", + "bi.select_tree_expander": "SelectTreeExpander", + "bi.select_level_tree": "SelectTreePopup", + "bi.single_select_search_loader": "SingleSelectSearchLoader", + "bi.single_select_search_insert_pane": "SingleSelectSearchInsertPane", + "bi.single_select_search_pane": "SingleSelectSearchPane", + "bi.single_select_combo": "SingleSelectCombo", + "bi.single_select_insert_combo": "SingleSelectInsertCombo", + "bi.single_select_list": "SingleSelectList", + "bi.single_select_loader": "SingleSelectLoader", + "bi.single_select_popup_view": "SingleSelectPopupView", + "bi.single_select_trigger": "SingleSelectTrigger", + "bi.single_select_insert_list": "SingleSelectInsertList", + "bi.single_select_editor": "SingleSelectEditor", + "bi.single_select_searcher": "SingleSelectSearcher", + "bi.sign_text_editor": "SignTextEditor", + "bi.single_slider_button": "SliderIconButton", + "bi.single_slider": "SingleSlider", + "bi.single_slider_label": "SingleSliderLabel", + "bi.single_slider_normal": "SingleSliderNormal", + "bi.single_tree_combo": "SingleTreeCombo", + "bi.single_level_tree": "SingleTreePopup", + "bi.single_tree_trigger": "SingleTreeTrigger", + "bi.text_value_down_list_combo": "TextValueDownListCombo", + "bi.down_list_select_text_trigger": "DownListSelectTextTrigger", + "bi.time_popup": "TimePopup", + "bi.time_combo": "TimeCombo", + "bi.time_trigger": "TimeTrigger", + "bi.date_interval": "DateInterval", + "bi.time_interval": "TimeInterval", + "bi.time_periods": "TimePeriods", + "bi.dynamic_year_card": "DynamicYearCard", + "bi.static_year_card": "StaticYearCard", + "bi.dynamic_year_combo": "DynamicYearCombo", + "bi.dynamic_year_popup": "DynamicYearPopup", + "bi.dynamic_year_trigger": "DynamicYearTrigger", + "bi.year_interval": "YearInterval", + "bi.dynamic_year_month_card": "DynamicYearMonthCard", + "bi.static_year_month_card": "StaticYearMonthCard", + "bi.dynamic_year_month_combo": "DynamicYearMonthCombo", + "bi.dynamic_year_month_popup": "DynamicYearMonthPopup", + "bi.dynamic_year_month_trigger": "DynamicYearMonthTrigger", + "bi.year_month_interval": "YearMonthInterval", + "bi.dynamic_year_quarter_card": "DynamicYearQuarterCard", + "bi.static_year_quarter_card": "StaticYearQuarterCard", + "bi.dynamic_year_quarter_combo": "DynamicYearQuarterCombo", + "bi.dynamic_year_quarter_popup": "DynamicYearQuarterPopup", + "bi.dynamic_year_quarter_trigger": "DynamicYearQuarterTrigger", + "bi.year_quarter_interval": "YearQuarterInterval" +} diff --git a/script/lib/fui.export.txt b/script/lib/fui.export.txt new file mode 100644 index 000000000..b4fa01d49 --- /dev/null +++ b/script/lib/fui.export.txt @@ -0,0 +1,789 @@ +$ +$import +A +AbsoluteCenterLayout +AbsoluteHorizontalLayout +AbsoluteLayout +AbsoluteLeftRightVerticalAdaptLayout +AbsoluteRightVerticalAdaptLayout +AbsoluteVerticalLayout +AbstractLabel +AccurateCalculationModel +Action +ActionFactory +Actions +AdaptiveLayout +AllCountPager +AllValueMultiTextValueCombo +ArrowNode +ArrowTreeGroupNodeCheckbox +Asynctree +AutoVerticalTapeLayout +Axis +BarPopover +BasicButton +BasicTreeItem +BasicTreeNode +Behavior +BehaviorFactory +BlankIconIconTextItem +BlankIconTextIconItem +BlankIconTextItem +BlankSplitChar +BorderLayout +BroadcastController +Broadcasts +Bubble +BubbleCombo +BubblePopupBarView +BubblePopupView +Bubbles +BubblesController +Button +ButtonGroup +ButtonTree +CRYPT_TYPE +Cache +Calendar +CalendarDateItem +CardLayout +CellSizeAndPositionManager +CenterAdaptLayout +CenterLayout +Checkbox +CheckingMarkNode +ClearEditor +Collapse +CollectionView +ColorChooser +ColorChooserPopup +ColorChooserShowButton +ColorChooserTrigger +ColorPicker +ColorPickerButton +ColorPickerEditor +Combo +ComboGroup +Constants +Controller +CustomColorChooser +CustomTree +DOM +Date +DateCalendarPopup +DateInterval +DatePicker +DateTimeCombo +DateTimePopup +DateTimeTrigger +DateTriangleTrigger +DefaultLayout +DefaultTextEditor +DetailPager +Direction +DirectionPager +DisplayTree +DivisionLayout +DownListCombo +DownListGroup +DownListGroupItem +DownListItem +DownListPopup +DownListSelectTextTrigger +Drawer +DrawerController +Drawers +DynamicDateCard +DynamicDateCombo +DynamicDateHelper +DynamicDatePane +DynamicDateParamItem +DynamicDatePopup +DynamicDateTimeCombo +DynamicDateTimePane +DynamicDateTimePopup +DynamicDateTimeSelect +DynamicDateTimeTrigger +DynamicDateTrigger +DynamicYearCard +DynamicYearCombo +DynamicYearMonthCard +DynamicYearMonthCombo +DynamicYearMonthPopup +DynamicYearMonthTrigger +DynamicYearPopup +DynamicYearQuarterCard +DynamicYearQuarterCombo +DynamicYearQuarterPopup +DynamicYearQuarterTrigger +DynamicYearTrigger +EVENT_BLUR +EVENT_RESPONSE_TIME +Editor +EditorIconCheckCombo +EditorTrigger +Element +EventListener +Events +Expander +Farbtastic +File +FirstPlusGroupNode +FirstTreeLeafItem +FirstTreeNodeCheckbox +Fix +FlexCenterLayout +FlexHorizontalCenter +FlexHorizontalCenterAdapt +FlexHorizontalLayout +FlexLeftRightVerticalAdaptLayout +FlexVerticalCenter +FlexVerticalCenterAdapt +FlexVerticalLayout +FlexWrapperCenterLayout +FlexWrapperHorizontalCenter +FlexWrapperHorizontalCenterAdapt +FlexWrapperHorizontalLayout +FlexWrapperVerticalCenter +FlexWrapperVerticalCenterAdapt +FlexWrapperVerticalLayout +FloatAbsoluteCenterLayout +FloatAbsoluteHorizontalLayout +FloatAbsoluteLeftRightVerticalAdaptLayout +FloatAbsoluteRightVerticalAdaptLayout +FloatAbsoluteVerticalLayout +FloatCenterLayout +FloatHorizontalFillLayout +FloatHorizontalLayout +FloatLeftLayout +FloatRightLayout +Fragment +Func +GridLayout +GridView +HTapeLayout +HalfButton +HalfIconButton +Heap +HexColorChooserPopup +HexColorPicker +HexColorPickerEditor +HighlightBehavior +HorizontalAdaptLayout +HorizontalAlign +HorizontalAutoLayout +HorizontalCenterLayout +HorizontalFillLayout +HorizontalFillLayoutLogic +HorizontalLayout +HorizontalLayoutLogic +HorizontalStickyLayout +Html +HtmlLabel +Icon +IconArrowNode +IconButton +IconChangeButton +IconCombo +IconComboPopup +IconComboTrigger +IconLabel +IconTextIconItem +IconTextIconNode +IconTextItem +IconTextNode +IconTextTrigger +IconTextValueCombo +IconTextValueComboPopup +IconTreeLeafItem +IconTrigger +Iframe +ImageButton +ImageCheckbox +ImageRadio +Img +InlineCenterAdaptLayout +InlineHorizontalAdaptLayout +InlineLayout +InlineVerticalAdaptLayout +Input +Instruction +IntervalSlider +Key +KeyCode +LRU +Label +LastPlusGroupNode +LastTreeLeafItem +LastTreeNodeCheckbox +LatticeLayout +LayerController +Layers +Layout +LazyLoader +LeftRightVerticalAdaptLayout +LeftVerticalAdaptLayout +LevelTree +LinearSegment +LinearSegmentButton +Link +LinkHashMap +ListDisplayTree +ListLoader +ListPane +ListPartTree +ListView +Listasynctree +Listtreeview +Loader +LoadingBar +Logic +LogicFactory +LongColorChooserTrigger +MAX +MIN +Maskers +MaskersController +MidPlusGroupNode +MidTreeLeafItem +MidTreeNodeCheckbox +Model +Models +Modules +MonthDateCombo +MonthPopup +MouseMoveTracker +Msg +MultiLayerDownListCombo +MultiLayerDownListPopup +MultiLayerIconArrowNode +MultiLayerIconTreeLeafItem +MultiLayerSelectLevelTree +MultiLayerSelectTreeCombo +MultiLayerSingleLevelTree +MultiLayerSingleTreeCombo +MultiLayerSingleTreeInsertSearchPane +MultiLayerSingleTreePopup +MultiLayerSingleTreeTrigger +MultiPopupView +MultiSelectBar +MultiSelectCheckSelectedSwitcher +MultiSelectCombo +MultiSelectEditor +MultiSelectInsertCombo +MultiSelectInsertList +MultiSelectInsertNoBarCombo +MultiSelectInsertNoBarList +MultiSelectItem +MultiSelectList +MultiSelectNoBarCombo +MultiSelectPopupView +MultiSelectSearchPane +MultiSelectSearcher +MultiSelectTrigger +MultiTreeCombo +MultiTreeInsertCombo +MultiTreeListCombo +MultifileEditor +Navigation +Node +NodeButton +NumberEditor +NumberInterval +OB +Pager +Pane +Panel +PartTree +Plugin +PlusGroupNode +Popover +PopoverController +Popovers +PopupPanel +PopupView +PrefixIntervalTree +Providers +PureText +Queue +Radio +RedMarkBehavior +Region +ResizeController +ResizeDetector +Resizers +ResponsiveFlexHorizontalLayout +ResponsiveFlexWrapperHorizontalLayout +ResponsiveInlineLayout +RightVerticalAdaptLayout +RootTreeLeafItem +Router +RouterView +RouterWidget +SIZE_CONSANTS +STYLE_CONSTANTS +ScalingCellSizeAndPositionManager +SearchEditor +SearchMultiSelectLoader +SearchMultiSelectPopupView +SearchMultiSelectSearcher +SearchMultiSelectTrigger +SearchMultiTextValueCombo +SearchTextValueCombo +SearchTextValueComboPopup +SearchTextValueTrigger +Searcher +SearcherView +SectionManager +Segment +SegmentButton +SelectIconTextTrigger +SelectList +SelectPatchEditor +SelectTextTrigger +SelectTreeCombo +SelectTreeExpander +Selection +Services +ShelterEditor +ShowAction +ShowListener +SignEditor +SignTextEditor +SimpleColorChooser +SimpleColorChooserPopup +SimpleColorPickerEditor +SimpleHexColorChooserPopup +SimpleHexColorPickerEditor +SimpleStateEditor +SimpleTreeView +Single +SingleSelectCombo +SingleSelectEditor +SingleSelectIconTextItem +SingleSelectInsertCombo +SingleSelectInsertList +SingleSelectItem +SingleSelectList +SingleSelectLoader +SingleSelectPopupView +SingleSelectRadioItem +SingleSelectSearchInsertPane +SingleSelectSearchLoader +SingleSelectSearchPane +SingleSelectSearcher +SingleSelectTrigger +SingleSlider +SingleSliderLabel +SingleSliderNormal +SingleTreeCombo +SliderIconButton +SmallSearchEditor +SmallSelectTextTrigger +SmallTextEditor +SmallTextTrigger +SmallTextValueCombo +SortList +StartOfWeek +StateEditor +StaticDatePaneCard +StaticDateTimePaneCard +StaticYearCard +StaticYearMonthCard +StaticYearQuarterCard +Status +Stores +StyleLoaderManager +StyleLoaders +Switch +Switcher +SystemProvider +Tab +TableAdaptLayout +TableLayout +TableLayoutLogic +TdLayout +Text +TextAreaEditor +TextBubblePopupBarView +TextButton +TextEditor +TextIconItem +TextIconNode +TextItem +TextNode +TextTrigger +TextValueCheckCombo +TextValueCheckComboPopup +TextValueCombo +TextValueComboPopup +TextValueDownListCombo +TimeCombo +TimeInterval +TimePeriods +TimePopup +TimeTrigger +Tip +Toast +Tooltip +Tooltips +TooltipsController +Tree +TreeExpander +TreeExpanderPopup +TreeNodeCheckbox +TreeNodeSwitcher +TreeRenderPageService +TreeRenderScrollService +TreeView +Trigger +TriggerIconButton +UUID +VTapeLayout +Vector +VerticalAdaptLayout +VerticalAlign +VerticalCenterLayout +VerticalFillLayout +VerticalLayout +VerticalLayoutLogic +VerticalStickyLayout +VirtualGroup +VirtualGroupList +VirtualList +WheelHandler +Widget +WindowLayout +YearCalendar +YearDateCombo +YearInterval +YearMonthInterval +YearPicker +YearPopup +YearQuarterInterval +_ +_lazyCreateWidget +abc2Int +action +add +addI18n +addI18nFormatter +aesDecrypt +aesEncrypt +after +afterFunc +all +allIndexOf +allKeys +allvaluechooser +any +appendQuery +array2String +aspect +assert +average +backAny +backEach +backEvery +backFind +backFindKey +before +beforeFunc +bind +camelize +chain +changeI18n +checkDateLegal +checkDateVoid +chunk +cjkDecode +cjkEncode +cjkEncodeDO +clamp +clone +cloneDeep +compact +component +concat +config +constant +contains +contentFormat +count +countBy +create +createDistinctName +createElement +createItems +createWidget +createWidgets +date2Str +debounce +decode +decodeURIComponent +decrypt +deepClone +deepContains +deepDiff +deepExtend +deepIndexOf +deepRemove +deepUnique +deepWithout +defaults +defer +delay +difference +div +each +empty +emptyFn +emptyStr +encode +encodeURIComponent +encrypt +endWith +escape +every +extend +extendOwn +filter +find +findIndex +findKey +findLastIndex +findWhere +first +firstKey +firstObject +flatten +form +format +formatEL +freeze +functions +get +getDate +getDayOfYear +getEncodeURL +getFullDayName +getGBWidth +getIEVersion +getLastDateOfMont +getLastDateOfMonth +getMinimumFontSize +getMonthDays +getMonthName +getOffsetDate +getOffsetMonth +getOffsetQuarter +getQuarter +getQuarterEndDate +getQuarterName +getQuarterStartDate +getQuarterStartMonth +getQuery +getReference +getResource +getSafariVersion +getSearchResult +getShortDayName +getSortedResult +getTime +getTimezone +getWeekEndDate +getWeekNumber +getWeekStartDate +groupBy +h +has +history +htmlDecode +htmlEncode +hyphenate +i18nText +indexBy +indexOf +inherit +init +initial +int2Abc +intersection +inverse +invert +invoke +isArguments +isArray +isBoolean +isCapitalEqual +isChrome +isDate +isDeepMatch +isEdge +isElement +isEmpty +isEmptyArray +isEmptyObject +isEmptyString +isEndWithBlank +isEqual +isError +isEven +isFinite +isFireFox +isFloat +isFunction +isIE +isIE9Below +isInteger +isKey +isKhtml +isLeapYear +isLiteral +isMac +isMatch +isNaN +isNaturalNumber +isNegativeInteger +isNotEmptyArray +isNotEmptyObject +isNotEmptyString +isNotNull +isNull +isNumber +isNumeric +isObject +isOdd +isOpera +isPlainObject +isPositiveInteger +isPromise +isRegExp +isSafari +isString +isSupportCss3 +isUndefined +isWidget +isWidthOrHeight +isWindow +isWindows +iteratee +jQuery +jsonDecode +jsonEncode +keys +last +lastIndexOf +lastKey +lastObject +leftPad +makeArray +makeArrayByArray +makeFirstPY +makeObject +map +mapObject +matcher +max +min +model +module +mount +mul +nextTick +object +object2Date +object2Number +object2Time +omit +onBeforeMount +onBeforeUnmount +onMounted +onUnmounted +once +packageItems +pairs +parseDateTime +parseFloat +parseFmt +parseInt +parseSafeInt +partial +partition +perfectStart +pick +pickBy +pixFormat +pixRatio +pixUnit +pluck +point +print +property +propertyOf +provider +pushArray +pushDistinct +pushDistinctArray +random +range +reduce +reduceRight +reject +remove +removeAt +replaceAll +rest +result +sample +service +set +shortcut +shuffle +size +some +sortBy +sortedIndex +specialCharsMap +startWith +store +str2Date +string2Array +stripEL +stripQuotes +sub +sum +take +takeRight +tap +throttle +toArray +toLowerCase +toPix +toUpperCase +trans2Element +treeValueChooser +trim +unescape +union +uniq +uniqBy +uniqueId +unzip +useContext +useInWorker +useStore +valueChooser +values +warn +watch +where +without +wrap +zIndex_layer +zIndex_masker +zIndex_popover +zIndex_popup +zIndex_tip +zip +zipObject \ No newline at end of file diff --git a/script/lib/utils.js b/script/lib/utils.js new file mode 100644 index 000000000..35b103acf --- /dev/null +++ b/script/lib/utils.js @@ -0,0 +1,24 @@ +const fs = require("fs"); +const path = require("path"); + +const defaultConfig = { + handler: () => {}, + filter: filePath => filePath.endsWith(".js"), +}; + +function tranvase(filePath, config) { + const { handler, filter } = Object.assign(defaultConfig, config); + if (fs.statSync(filePath).isDirectory()) { + fs.readdirSync(filePath).forEach(fileName => { + tranvase(path.resolve(filePath, fileName), config); + }); + } else if (filter(filePath)) { + handler(filePath); + } +} + +function getFuiExports() {} + +function getFuiComponent() {} + +module.exports = { tranvase, getFuiComponent, getFuiExports }; diff --git a/script/rename.js b/script/rename.js new file mode 100644 index 000000000..ec5d4691f --- /dev/null +++ b/script/rename.js @@ -0,0 +1,17 @@ +/** + * 将 FineUI 模块名从 fineui 改成 @fui/core + */ +const { tranvase } = require("./lib/utils"); +const fs = require("fs"); + +const config = { + handler: filePath => { + let content = fs.readFileSync(filePath).toString(); + content = content.replace(/(?<=from ["|'])fineui(?=["|'])/g, str => { + return "@fui/core"; + }); + fs.writeFileSync(filePath, content); + }, +}; + +tranvase(process.argv[2], config); diff --git a/server.js b/server.js deleted file mode 100644 index a9fd0cede..000000000 --- a/server.js +++ /dev/null @@ -1,13 +0,0 @@ -/*eslint no-console:0 */ -'use strict'; -const express = require('express'); -const open = require('open'); -const fs=require("fs"); -const app = express(); -const port = 3000; - -app.use(express.static("./")); -app.listen(port, function() { - console.log("server start"); - open('http://localhost:' + port + '/index.html'); -}); diff --git a/src/base/0.base.js b/src/base/0.base.js deleted file mode 100644 index d79ca192d..000000000 --- a/src/base/0.base.js +++ /dev/null @@ -1,23 +0,0 @@ -import { - BroadcastController, - BubblesController, - DrawerController, - LayerController, - MaskersController, - PopoverController, - ResizeController, - TooltipsController, - StyleLoaderManager -} from "../core"; - -const Resizers = new ResizeController(); -const Layers = new LayerController(); -const Maskers = new MaskersController(); -const Bubbles = new BubblesController(); -const Tooltips = new TooltipsController(); -const Popovers = new PopoverController(); -const Drawers = new DrawerController(); -const Broadcasts = new BroadcastController(); -const StyleLoaders = new StyleLoaderManager(); - -export { Resizers, Layers, Maskers, Bubbles, Tooltips, Popovers, Drawers, Broadcasts, StyleLoaders }; diff --git a/src/base/1.pane.js b/src/base/1.pane.js deleted file mode 100644 index 3342edb75..000000000 --- a/src/base/1.pane.js +++ /dev/null @@ -1,160 +0,0 @@ -import { - AbsoluteCenterLayout, - CenterAdaptLayout, - HorizontalAdaptLayout, - VerticalLayout, - Widget, - shortcut, - isNotEmptyString, - extend, - isNull, - isEmpty, - createWidget, - Providers, - i18nText, - emptyFn -} from "@/core"; -import { Label, Text } from "./single"; -import { Layers } from "@/base/0.base"; - -/** - * 当没有元素时有提示信息的view - * - * Created by GUY on 2015/9/8. - * @class Pane - * @extends Widget - * @abstract - */ - -@shortcut() -export class Pane extends Widget { - static xtype = "bi.pane"; - static EVENT_LOADED = "EVENT_LOADED"; - static EVENT_LOADING = "EVENT_LOADING"; - - _defaultConfig() { - return extend(super._defaultConfig(), { - _baseCls: "bi-pane", - tipText: i18nText("BI-No_Selected_Item"), - loadingText: "", - loadingSize: "small", - overlap: true, - onLoaded: emptyFn, - }); - } - - _assertTip() { - if (!this._tipText) { - createWidget({ - type: AbsoluteCenterLayout.xtype, - element: this, - items: [ - { - type: Label.xtype, - ref: _ref => { - this._tipText = _ref; - }, - cls: "bi-tips", - text: this.options.tipText, - height: 25, - } - ], - }); - } - } - - loading() { - const o = this.options; - const loadingAnimation = createWidget( - Providers.getProvider("bi.provider.system").getLoading({ - loadingSize: o.loadingSize, - context: this, - }) - ); - // pane在同步方式下由items决定tipText的显示与否 - // loading的异步情况下由loaded后对面板的populate的时机决定 - this.setTipVisible(false); - if (o.overlap === true) { - if (!Layers.has(`${this.getName()}-loading`)) { - createWidget({ - type: CenterAdaptLayout.xtype, - cls: "loading-container", - items: this._getLoadingTipItems(loadingAnimation), - element: Layers.make(`${this.getName()}-loading`, this), - }); - } - Layers.show(`${this.getName()}-loading`); - } else if (isNull(this._loading)) { - loadingAnimation.element.css("zIndex", 1); - createWidget({ - type: CenterAdaptLayout.xtype, - element: this, - cls: "loading-container", - items: this._getLoadingTipItems(loadingAnimation), - }); - } - this.fireEvent(Pane.EVENT_LOADING); - this.element.addClass("loading-status"); - } - - _getSize(v) { - return Math.ceil(v / (this.options.loadingSize === "small" ? 2 : 1)); - } - - _getLoadingTipItems(loadingTip) { - const o = this.options; - const loadingTipItems = [ - { - type: HorizontalAdaptLayout.xtype, - items: [loadingTip], - } - ]; - isNotEmptyString(o.loadingText) && - loadingTipItems.push({ - type: Text.xtype, - text: o.loadingText, - tgap: this._getSize(10), - }); - - return [ - { - type: VerticalLayout.xtype, - ref: _ref => { - this._loading = _ref; - }, - items: loadingTipItems, - } - ]; - } - - loaded() { - Layers.remove(`${this.getName()}-loading`); - this._loading && this._loading.destroy(); - this.options.onLoaded(); - this.fireEvent(Pane.EVENT_LOADED); - this.element.removeClass("loading-status"); - } - - check() { - this.setTipVisible(isEmpty(this.options.items)); - } - - setTipVisible(b) { - if (b === true) { - this._assertTip(); - this._tipText && this._tipText.setVisible(true); - } else { - this._tipText && this._tipText.setVisible(false); - } - } - - setTipText(text) { - this._assertTip(); - this._tipText.setText(text); - } - - populate(items) { - this.options.items = items || []; - this.check(); - } -} diff --git a/src/base/pager/pager.js b/src/base/pager/pager.js deleted file mode 100644 index c775e4ac9..000000000 --- a/src/base/pager/pager.js +++ /dev/null @@ -1,346 +0,0 @@ -import { - HorizontalLayout, - Widget, - shortcut, - extend, - emptyFn, - result, - isKey, - createWidget, - map, - stripEL, - formatEL, - Controller, - Events, - MIN, - MAX -} from "@/core"; -import { Label } from "../single"; -import { ButtonGroup } from "../combination"; - -/** - * 分页控件 - * - * Created by GUY on 2015/8/31. - * @class Pager - * @extends Widget - */ - -@shortcut() -export class Pager extends Widget { - _defaultConfig() { - return extend(super._defaultConfig(...arguments), { - baseCls: "bi-pager", - behaviors: {}, - layouts: [ - { - type: HorizontalLayout.xtype, - hgap: 10, - vgap: 0, - } - ], - - dynamicShow: true, // 是否动态显示上一页、下一页、首页、尾页, 若为false,则指对其设置使能状态 - // dynamicShow为false时以下两个有用 - dynamicShowFirstLast: false, // 是否动态显示首页、尾页 - dynamicShowPrevNext: false, // 是否动态显示上一页、下一页 - pages: false, // 总页数 - curr: () => 1, // 初始化当前页 - groups: 0, // 连续显示分页数 - jump: emptyFn, // 分页的回调函数 - first: false, // 是否显示首页 - last: false, // 是否显示尾页 - prev: "上一页", - next: "下一页", - - firstPage: 1, - lastPage: () => - // 在万不得已时才会调用这个函数获取最后一页的页码, 主要作用于setValue方法 - 1, - hasPrev: emptyFn, // pages不可用时有效 - hasNext: emptyFn, // pages不可用时有效 - }); - } - - static xtype = "bi.pager"; - static EVENT_CHANGE = "EVENT_CHANGE"; - static EVENT_AFTER_POPULATE = "EVENT_AFTER_POPULATE"; - render() { - this.currPage = result(this.options, "curr"); - // 翻页太灵敏 - // this._lock = false; - // this._debouce = debounce(function () { - // self._lock = false; - // }, 300); - this._populate(); - } - - _populate() { - const o = this.options, - view = [], - dict = {}; - const { dynamicShow, dynamicShowPrevNext, hasPrev, dynamicShowFirstLast, hasNext, behaviors, layouts, jump } = - this.options; - this.empty(); - const pages = result(o, "pages"); - const curr = result(this, "currPage"); - let groups = result(o, "groups"); - let first = result(o, "first"); - let last = result(o, "last"); - const prev = result(o, "prev"); - const next = result(o, "next"); - - if (pages === false) { - groups = 0; - first = false; - last = false; - } else { - groups > pages && (groups = pages); - } - - // 计算当前组 - dict.index = Math.ceil((curr + (groups > 1 && groups !== pages ? 1 : 0)) / (groups === 0 ? 1 : groups)); - - // 当前页非首页,则输出上一页 - if (((!dynamicShow && !dynamicShowPrevNext) || curr > 1) && prev !== false) { - if (isKey(prev)) { - view.push({ - text: prev, - value: "prev", - disabled: pages === false ? hasPrev(curr) === false : !(curr > 1 && prev !== false), - }); - } else { - view.push({ - el: extend( - { - disabled: pages === false ? hasPrev(curr) === false : !(curr > 1 && prev !== false), - }, - prev - ), - }); - } - } - - // 当前组非首组,则输出首页 - if (((!dynamicShow && !dynamicShowFirstLast) || (dict.index > 1 && groups !== 0)) && first) { - view.push({ - text: first, - value: "first", - disabled: !(dict.index > 1 && groups !== 0), - }); - if (dict.index > 1 && groups !== 0 && groups !== pages - 1) { - view.push({ - type: Label.xtype, - cls: "page-ellipsis", - text: "\u2026", - }); - } - } - - // 输出当前页组 - dict.poor = Math.floor((groups - 1) / 2); - dict.start = dict.index > 1 ? curr - dict.poor : 1; - dict.end = - dict.index > 1 - ? (function () { - const max = curr + (groups - dict.poor - 1); - - return max > pages ? pages : max; - }()) - : groups; - if (dict.end - dict.start < groups - 1) { - // 最后一组状态 - dict.start = dict.end - groups + 1; - } - let s = dict.start, - e = dict.end; - if (first && last && dict.index > 1 && groups !== 0 && pages > groups && dict.end < pages && groups !== 0) { - s++; - e--; - } - for (; s <= e; s++) { - if (s === curr) { - view.push({ - text: s, - value: s, - selected: true, - }); - } else { - view.push({ - text: s, - value: s, - }); - } - } - - // 总页数大于连续分页数,且当前组最大页小于总页,输出尾页 - if (((!dynamicShow && !dynamicShowFirstLast) || (pages > groups && dict.end < pages && groups !== 0)) && last) { - if (pages > groups && dict.end < pages && groups !== 0 && groups !== pages - 1) { - view.push({ - type: Label.xtype, - cls: "page-ellipsis", - text: "\u2026", - }); - } - view.push({ - text: last, - value: "last", - disabled: !(pages > groups && dict.end < pages && groups !== 0), - }); - } - - // 当前页不为尾页时,输出下一页 - dict.flow = !prev && groups === 0; - if ((!dynamicShow && !dynamicShowPrevNext && next) || (curr !== pages && next) || dict.flow) { - view.push( - (function () { - if (isKey(next)) { - if (pages === false) { - return { text: next, value: "next", disabled: hasNext(curr) === false }; - } - - return dict.flow && curr === pages - ? { text: next, value: "next", disabled: true } - : { text: next, value: "next", disabled: !((curr !== pages && next) || dict.flow) }; - } - - return { - el: extend( - { - disabled: - pages === false - ? hasNext(curr) === false - : !((curr !== pages && next) || dict.flow), - }, - next - ), - }; - })() - ); - } - - this.button_group = createWidget({ - type: ButtonGroup.xtype, - element: this, - items: map(view, (idx, v) => { - v = extend( - { - cls: "bi-list-item-select bi-border-radius", - height: 23, - hgap: v.el ? 0 : 10, - stopPropagation: true, - }, - stripEL(v) - ); - - return formatEL(v); - }), - behaviors, - layouts, - }); - this.button_group.on(Controller.EVENT_CHANGE, (type, value, obj, ...args) => { - // if (self._lock === true) { - // return; - // } - // self._lock = true; - // self._debouce(); - if (type === Events.CLICK) { - const v = this.button_group.getValue()[0]; - switch (v) { - case "first": - this.currPage = 1; - break; - case "last": - this.currPage = pages; - break; - case "prev": - this.currPage--; - break; - case "next": - this.currPage++; - break; - default: - this.currPage = v; - break; - } - jump.apply(this, [ - { - pages, - curr: this.currPage, - } - ]); - this._populate(); - this.fireEvent(Pager.EVENT_CHANGE, obj); - } - this.fireEvent(Controller.EVENT_CHANGE, type, value, obj, ...args); - }); - this.fireEvent(Pager.EVENT_AFTER_POPULATE); - } - - getCurrentPage() { - return this.currPage; - } - - setAllPages(pages) { - this.options.pages = pages; - this._populate(); - } - - hasPrev(v) { - v || (v = 1); - const { pages, hasPrev } = this.options; - - return pages === false ? hasPrev(v) : v > 1; - } - - hasNext(v) { - v || (v = 1); - const { pages, hasNext } = this.options; - - return pages === false ? hasNext(v) : v < pages; - } - - setValue(v) { - const o = this.options; - const { pages } = this.options; - v = v || 0; - v = v < 1 ? 1 : v; - if (pages === false) { - const lastPage = result(o, "lastPage"); - let firstPage = 1; - this.currPage = - v > lastPage ? lastPage : ((firstPage = result(o, "firstPage")), v < firstPage ? firstPage : v); - } else { - v = v > pages ? pages : v; - this.currPage = v; - } - this._populate(); - } - - getValue() { - const val = this.button_group.getValue()[0]; - switch (val) { - case "prev": - return -1; - case "next": - return 1; - case "first": - return MIN; - case "last": - return MAX; - default: - return val; - } - } - - attr(key, value) { - super.attr(...arguments); - if (key === "curr") { - this.currPage = result(this.options, "curr"); - } - } - - populate() { - this._populate(); - } -} diff --git a/src/case/ztree/treeview.js b/src/case/ztree/treeview.js deleted file mode 100644 index 080821f0f..000000000 --- a/src/case/ztree/treeview.js +++ /dev/null @@ -1,618 +0,0 @@ -import { - cjkEncodeDO, - Controller, - createWidget, - emptyFn, - Events, - extend, - UUID, - isNotNull, - jsonEncode, - delay, - each, - replaceAll, - isUndefined, - isNotEmptyArray, - deepClone, - map, - Tree, - isNull, - shortcut, - VerticalLayout, - Layout, - DefaultLayout, - some, - Widget, - STYLE_CONSTANTS -} from "@/core"; -import { Msg, Pane, LoadingBar, Text } from "@/base"; -import $ from "jquery"; - -@shortcut() -export class TreeView extends Pane { - static xtype = "bi.tree_view"; - static REQ_TYPE_INIT_DATA = 1; - static REQ_TYPE_ADJUST_DATA = 2; - static REQ_TYPE_SELECT_DATA = 3; - static REQ_TYPE_GET_SELECTED_DATA = 4; - static EVENT_CHANGE = "EVENT_CHANGE"; - static EVENT_INIT = Events.INIT; - static EVENT_AFTERINIT = Events.AFTERINIT; - - _defaultConfig() { - return extend(super._defaultConfig(...arguments), { - _baseCls: "bi-tree", - paras: { - selectedValues: {}, - }, - itemsCreator: emptyFn, - showLine: true, - }); - } - - _init() { - super._init(...arguments); - const o = this.options; - this._stop = false; - - this._createTree(); - this.tip = createWidget({ - type: LoadingBar.xtype, - invisible: true, - handler: () => this._loadMore(), - }); - createWidget({ - type: VerticalLayout.xtype, - scrollable: true, - scrolly: false, - element: this, - items: [this.tip], - }); - if (isNotNull(o.value)) { - this.setSelectedValue(o.value); - } - } - - _createTree() { - this.id = `bi-tree${UUID()}`; - if (this.nodes) { - this.nodes.destroy(); - } - if (this.tree) { - this.tree.destroy(); - } - this.tree = createWidget({ - type: Layout.xtype, - element: ``, - }); - createWidget({ - type: DefaultLayout.xtype, - element: this, - items: [this.tree], - }); - } - - // 选择节点触发方法 - _selectTreeNode(treeId, treeNode) { - this.fireEvent(Controller.EVENT_CHANGE, Events.CLICK, treeNode, this); - this.fireEvent(TreeView.EVENT_CHANGE, treeNode, this); - } - - // 配置属性 - _configSetting() { - const paras = this.options.paras; - const self = this; - const o = this.options; - const setting = { - async: { - enable: true, - url: getUrl, - autoParam: ["id", "name"], // 节点展开异步请求自动提交id和name - otherParam: cjkEncodeDO(paras), // 静态参数 - }, - check: { - enable: true, - }, - data: { - key: { - title: "title", - name: "text", // 节点的name属性替换成text - }, - simpleData: { - enable: true, // 可以穿id,pid属性的对象数组 - }, - }, - view: { - showIcon: false, - expandSpeed: "", - nameIsHTML: true, // 节点可以用html标签代替 - dblClickExpand: false, - showLine: o.showLine, - }, - callback: { - beforeExpand, - onAsyncSuccess, - onAsyncError, - beforeCheck, - onCheck, - onExpand, - onCollapse, - onClick, - }, - }; - const className = "dark", - perTime = 100; - - function onClick(event, treeId, treeNode) { - // 当前点击节点的状态是半选,且为true_part, 则将其改为false_part,使得点击半选后切换到的是全选 - let checked = treeNode.checked; - const status = treeNode.getCheckStatus(); - if (status.half === true && status.checked === true) { - checked = false; - } - // 更新此node的check状态, 影响父子关联,并调用beforeCheck和onCheck回调 - self.nodes.checkNode(treeNode, !checked, true, true); - } - - function getUrl(treeId, treeNode) { - const parentNode = self._getParentValues(treeNode); - treeNode.times = treeNode.times || 1; - const param = `id=${treeNode.id}×=${treeNode.times++}&parentValues= ${_global.encodeURIComponent( - jsonEncode(parentNode) - )}&checkState=${_global.encodeURIComponent(jsonEncode(treeNode.getCheckStatus()))}`; - - return `&${param}`; - } - - function beforeExpand(treeId, treeNode) { - if (!treeNode.isAjaxing) { - if (!treeNode.children) { - treeNode.times = 1; - ajaxGetNodes(treeNode, "refresh"); - } - - return true; - } - Msg.toast("Please Wait。", { - level: "warning", - }); // 不展开节点,也不触发onExpand事件 - - return false; - } - - function onAsyncSuccess(event, treeId, treeNode, msg) { - treeNode.halfCheck = false; - if (!msg || msg.length === 0 || /^[\s,\S]*<\/html>$/gi.test(msg) || self._stop) { - return; - } - const zTree = self.nodes; - const totalCount = treeNode.count || 0; - - // 尝试去获取下一组节点,若获取值为空数组,表示获取完成 - // TODO by GUY - if (treeNode.children.length > totalCount) { - treeNode.count = treeNode.children.length; - delay(() => { - ajaxGetNodes(treeNode); - }, perTime); - } else { - // treeNode.icon = ""; - zTree.updateNode(treeNode); - zTree.selectNode(treeNode.children[0]); - // className = (className === "dark" ? "":"dark"); - } - } - - function onAsyncError(event, treeId, treeNode, XMLHttpRequest, textStatus, errorThrown) { - const zTree = self.nodes; - Msg.toast("Error!", "warning"); - // treeNode.icon = ""; - // zTree.updateNode(treeNode); - } - - function ajaxGetNodes(treeNode, reloadType) { - const zTree = self.nodes; - if (reloadType === "refresh") { - zTree.updateNode(treeNode); // 刷新一下当前节点,如果treeNode.xxx被改了的话 - } - zTree.reAsyncChildNodes(treeNode, reloadType, true); // 强制加载子节点,reloadType === refresh为先清空再加载,否则为追加到现有子节点之后 - } - - function beforeCheck(treeId, treeNode) { - if (treeNode.disabled) { - return false; - } - // 下面主动修改了node的halfCheck属性, 节点属性的判断依赖halfCheck,改之前就获取一下 - const status = treeNode.getCheckStatus(); - treeNode.halfCheck = false; - if (treeNode.checked === true) { - // 将展开的节点halfCheck设为false,解决展开节点存在halfCheck=true的情况 guy - // 所有的半选状态都需要取消halfCheck=true的情况 - function track(children) { - each(children, (i, ch) => { - if (ch.halfCheck === true) { - ch.halfCheck = false; - track(ch.children); - } - }); - } - - track(treeNode.children); - const treeObj = self.nodes; - const nodes = treeObj.getSelectedNodes(); - $.each(nodes, (index, node) => { - node.halfCheck = false; - }); - } - // 当前点击节点的状态是半选,且为true_part, 则将其改为false_part,使得点击半选后切换到的是全选 - if (status.half === true && status.checked === true) { - treeNode.checked = false; - } - } - - function onCheck(event, treeId, treeNode) { - if (treeNode.disabled) { - return false; - } - self._selectTreeNode(treeId, treeNode); - } - - function onExpand(event, treeId, treeNode) { - treeNode.halfCheck = false; - } - - function onCollapse(event, treeId, treeNode) {} - - return setting; - } - - _getParentValues(treeNode) { - if (!treeNode.getParentNode()) { - return []; - } - const parentNode = treeNode.getParentNode(); - let result = this._getParentValues(parentNode); - result = result.concat([this._getNodeValue(parentNode)]); - - return result; - } - - _getNodeValue(node) { - // 去除标红 - return isUndefined(node.value) ? replaceAll(node.text.replace(/<[^>]+>/g, ""), " ", " ") : node.value; - } - - // 获取半选框值 - _getHalfSelectedValues(map, node) { - const self = this; - const checkState = node.getCheckStatus(); - // 将未选的去掉 - if (checkState.checked === false && checkState.half === false) { - return; - } - // 如果节点已展开,并且是半选 - if (isNotEmptyArray(node.children) && checkState.half === true) { - const children = node.children; - each(children, (i, ch) => { - self._getHalfSelectedValues(map, ch); - }); - - return; - } - const parent = node.parentValues || self._getParentValues(node); - const path = parent.concat(this._getNodeValue(node)); - // 当前节点是全选的,因为上面的判断已经排除了不选和半选 - if (isNotEmptyArray(node.children) || checkState.half === false) { - this._buildTree(map, path); - - return; - } - // 剩下的就是半选不展开的节点,因为不知道里面是什么情况,所以借助selectedValues(这个是完整的选中情况) - const storeValues = deepClone(this.options.paras.selectedValues); - const treeNode = this._getTree(storeValues, path); - this._addTreeNode(map, parent, this._getNodeValue(node), treeNode); - } - - // 获取的是以values最后一个节点为根的子树 - _getTree(map, values) { - let cur = map; - some(values, (i, value) => { - if (cur[value] == null) { - return true; - } - cur = cur[value]; - }); - - return cur; - } - - // 以values为path一路向里补充map, 并在末尾节点添加key: value节点 - _addTreeNode(map, values, key, value) { - let cur = map; - each(values, (i, value) => { - if (cur[value] == null) { - cur[value] = {}; - } - cur = cur[value]; - }); - cur[key] = value; - } - - // 构造树节点 - _buildTree(map, values) { - let cur = map; - each(values, (i, value) => { - if (cur[value] == null) { - cur[value] = {}; - } - cur = cur[value]; - }); - } - - // 获取选中的值 - _getSelectedValues() { - const self = this; - const hashMap = {}; - const rootNoots = this.nodes.getNodes(); - track(rootNoots); // 可以看到这个方法没有递归调用,所以在_getHalfSelectedValues中需要关心全选的节点 - function track(nodes) { - each(nodes, (i, node) => { - const checkState = node.getCheckStatus(); - if (checkState.checked === true || checkState.half === true) { - if (checkState.half === true) { - self._getHalfSelectedValues(hashMap, node); - } else { - const parentValues = node.parentValues || self._getParentValues(node); - const values = parentValues.concat([self._getNodeValue(node)]); - self._buildTree(hashMap, values); - } - } - }); - } - - return hashMap; - } - - // 处理节点 - _dealWidthNodes(nodes) { - const self = this, - o = this.options; - const ns = Tree.arrayFormat(nodes); - - return map(ns, (i, n) => { - const newNode = extend({}, n); - newNode.isParent = newNode.isParent || newNode.parent; - // n.value = BI.isUndefined(n.value) ? n.text : n.value; - // n.text = BI.isUndefined(n.text) ? n.value : n.text; - // if (n.text === null) { - // n.text = ""; - // } - if (isNull(newNode.title)) { - newNode.title = newNode.text; - } - if (newNode.disabled) { - newNode.title = newNode.warningTitle || newNode.title; - } - const text = createWidget( - extend( - { - cls: "tree-node-text", - tagName: "span", - whiteSpace: "nowrap", - root: true, - keyword: o.paras.keyword, - }, - newNode, - { - type: Text.xtype, - text: replaceAll(newNode.text, "\n", " "), - } - ) - ); - const fragment = Widget._renderEngine.createElement("
"); - fragment.append(text.element[0]); - newNode.text = fragment.html(); - // // 处理标红 - // if (BI.isNotNull(n.text)) { - // if (BI.isKey(o.paras.keyword)) { - // n.text = $("
").__textKeywordMarked__(BI.Text.formatText(n.text + ""), o.paras.keyword, n.py).html(); - // } else { - // n.text = BI.htmlEncode(BI.Text.formatText(n.text + "")); - // } - // } - - return newNode; - }); - } - - _loadMore() { - const self = this, - o = this.options; - this.tip.setLoading(); - const op = extend({}, o.paras, { - times: ++this.times, - }); - o.itemsCreator(op, res => { - if (self._stop === true) { - return; - } - const hasNext = !!res.hasNext, - nodes = res.items || []; - - if (!hasNext) { - self.tip.setEnd(); - } else { - self.tip.setLoaded(); - } - if (nodes.length > 0) { - self.nodes.addNodes(null, self._dealWidthNodes(nodes)); - } - }); - } - - // 生成树内部方法 - _initTree(setting) { - const self = this, - o = this.options; - self.fireEvent(Events.INIT); - this.times = 1; - const tree = this.tree; - tree.empty(); - this.loading(); - this.tip.setVisible(false); - - function callback(nodes) { - if (self._stop === true) { - return; - } - self.nodes = $.fn.zTree.init(tree.element, setting, nodes); - } - - const op = extend({}, o.paras, { - times: 1, - }); - - o.itemsCreator(op, res => { - if (self._stop === true) { - return; - } - const hasNext = !!res.hasNext, - nodes = res.items || []; - if (nodes.length > 0) { - callback(self._dealWidthNodes(nodes)); - } - self.setTipVisible(nodes.length <= 0); - self.loaded(); - if (!hasNext) { - self.tip.invisible(); - } else { - self.tip.setLoaded(); - } - op.times === 1 && self.fireEvent(Events.AFTERINIT); - }); - } - - // 构造树结构, - initTree(nodes, setting) { - const defaultSetting = { - async: { - enable: false, - }, - check: { - enable: false, - }, - data: { - key: { - title: "title", - name: "text", - }, - simpleData: { - enable: true, - }, - }, - view: { - showIcon: false, - expandSpeed: "", - nameIsHTML: true, - }, - callback: {}, - }; - this.nodes = $.fn.zTree.init(this.tree.element, setting || defaultSetting, nodes); - } - - start() { - this._stop = false; - } - - stop() { - this._stop = true; - } - - // 生成树方法 - stroke(config) { - delete this.options.keyword; - extend(this.options.paras, config); - const setting = this._configSetting(); - this._createTree(); - this.start(); - this._initTree(setting); - } - - populate() { - this.stroke(...arguments); - } - - hasChecked() { - const treeObj = this.nodes; - - return treeObj.getCheckedNodes(true).length > 0; - } - - checkAll(checked) { - function setNode(children) { - each(children, (i, child) => { - child.halfCheck = false; - setNode(child.children); - }); - } - - if (!this.nodes) { - return; - } - - each(this.nodes.getNodes(), (i, node) => { - node.halfCheck = false; - setNode(node.children); - }); - this.nodes.checkAllNodes(checked); - } - - expandAll(flag) { - this.nodes && this.nodes.expandAll(flag); - } - - // 设置树节点的状态 - setValue(value, param) { - this.checkAll(false); - this.updateValue(value, param); - this.refresh(); - } - - setSelectedValue(value) { - this.options.paras.selectedValues = deepClone(value || {}); - } - - updateValue(values, param) { - if (!this.nodes) { - return; - } - param || (param = "value"); - const treeObj = this.nodes; - each(values, (v, op) => { - const nodes = treeObj.getNodesByParam(param, v, null); - each(nodes, (j, node) => { - extend(node, { checked: true }, op); - treeObj.updateNode(node); - }); - }); - } - - refresh() { - this.nodes && this.nodes.refresh(); - } - - getValue() { - if (!this.nodes) { - return null; - } - - return this._getSelectedValues(); - } - - destroyed() { - this.stop(); - this.nodes && this.nodes.destroy(); - } -} diff --git a/src/component/index.js b/src/component/index.js deleted file mode 100644 index 97b0ba2c6..000000000 --- a/src/component/index.js +++ /dev/null @@ -1,21 +0,0 @@ -export * as allvaluechooser from "./allvaluechooser"; -export * as form from "./form"; -export * as valueChooser from "./valuechooser"; -export * as treeValueChooser from "./treevaluechooser"; -export { AllValueMultiTextValueCombo } from "./allvaluemultitextvaluecombo/allvalue.multitextvalue.combo"; - -// Object.assign(BI, { -// ...allvaluechooser, -// ...form, -// ...valueChooser, -// ......treeValueChooser, -// AllValueMultiTextValueCombo, -// }); - -// export * from "./allvaluechooser"; -// export * from "./form"; -// export * from "./valuechooser"; -// export * from "./treevaluechooser"; -// export { -// AllValueMultiTextValueCombo -// }; diff --git a/src/core/2.base.js b/src/core/2.base.js deleted file mode 100644 index dce352030..000000000 --- a/src/core/2.base.js +++ /dev/null @@ -1,1636 +0,0 @@ -/** - * 基本函数 - * Create By GUY 2014\11\17 - * - */ -import _ from "./1.lodash"; -import { Widget } from "./4.widget"; -import { createWidget } from "./5.inject"; -import { prepares, _global } from "./0.foundation"; -import { CRYPT_TYPE, aesDecrypt, aesEncrypt } from "./structure/aes"; - - -/** - * todo: 理论这么写,逻辑没问题,摇个人把这个 BI 干掉 - */ -const BI = { _ }; - -function traverse(func, context) { - return function (value, key, obj) { - return func.call(context, key, value, obj); - }; -} -function _apply(name) { - return function () { - return BI._[name](...arguments); - }; -} -function _applyFunc(name) { - return function () { - const args = Array.prototype.slice.call(arguments, 0); - args[1] = BI._.isFunction(args[1]) - ? traverse(args[1], args[2]) - : args[1]; - - return BI._[name](...args); - }; -} - -export function assert(v, is) { - if (isFunction(is)) { - if (!is(v)) { - throw new Error(`${v} error`); - } else { - return true; - } - } - if (!isArray(is)) { - is = [is]; - } - if (!deepContains(is, v)) { - throw new Error(`${v} error`); - } - - return true; -} - -export function warn(message) { - console.warn(message); -} - -export function UUID() { - const f = [ - "0", - "1", - "2", - "3", - "4", - "5", - "6", - "7", - "8", - "9", - "a", - "b", - "c", - "d", - "e", - "f" - ]; - let str = ""; - for (let i = 0; i < 16; i++) { - const r = _global.parseInt(f.length * Math.random(), 10); - str += f[r]; - } - - return str; -} - -export function isWidget(widget) { - return widget instanceof Widget; -} - -export function createWidgets(items, options, context) { - if (!isArray(items)) { - throw new Error("items必须是数组", items); - } - if (isWidget(options)) { - context = options; - options = {}; - } else { - options || (options = {}); - } - - return map(flatten(items), (i, item) => - createWidget(item, deepClone(options), context) - ); -} - -export function createItems(data, innerAttr, outerAttr) { - innerAttr = isArray(innerAttr) - ? innerAttr - : makeArray(flatten(data).length, innerAttr || {}); - outerAttr = isArray(outerAttr) - ? outerAttr - : makeArray(flatten(data).length, outerAttr || {}); - - return map(data, (i, item) => { - if (isArray(item)) { - return createItems(item, innerAttr, outerAttr); - } - if (item instanceof Widget) { - return extend({}, innerAttr.shift(), outerAttr.shift(), { - type: null, - el: item, - }); - } - if (innerAttr[0] instanceof Widget) { - outerAttr.shift(); - - return extend({}, item, { - el: innerAttr.shift(), - }); - } - if (item.el instanceof Widget) { - innerAttr.shift(); - - return extend({}, outerAttr.shift(), { type: null }, item); - } - if (item.el) { - return extend({}, outerAttr.shift(), item, { - el: extend({}, innerAttr.shift(), item.el), - }); - } - - return extend({}, outerAttr.shift(), { - el: extend({}, innerAttr.shift(), item), - }); - }); -} - -// 用容器包装items -export function packageItems(items, layouts) { - for (let i = layouts.length - 1; i >= 0; i--) { - items = map(items, (k, it) => - extend({}, layouts[i], { - items: [ - extend({}, layouts[i].el, { - el: it, - }) - ], - }) - ); - } - - return items; -} - -export function formatEL(obj) { - if (obj && !obj.type && obj.el) { - return obj; - } - - return { - el: obj, - }; -} - -// 剥开EL -export function stripEL(obj) { - return (obj.type && obj) || obj.el || obj; -} - -export function trans2Element(widgets) { - return map(widgets, (i, wi) => wi.element); -} - -// 集合相关方法 -BI._.each( - [ - "where", - "findWhere", - "invoke", - "pluck", - "shuffle", - "sample", - "toArray", - "size" - ], - name => { - BI[name] = _apply(name); - } -); -BI._.each( - [ - "get", - "set", - "each", - "map", - "reduce", - "reduceRight", - "find", - "filter", - "reject", - "every", - "all", - "some", - "any", - "max", - "min", - "sortBy", - "groupBy", - "indexBy", - "countBy", - "partition", - "clamp" - ], - name => { - if (name === "any") { - BI[name] = _applyFunc("some"); - } else { - BI[name] = _applyFunc(name); - } - } -); -export const where = BI.where; -export const findWhere = BI.findWhere; -export const invoke = BI.invoke; -export const pluck = BI.pluck; -export const shuffle = BI.shuffle; -export const sample = BI.sample; -export const toArray = BI.toArray; -export const size = BI.size; -export const get = BI.get; -export const set = BI.set; -export const each = BI.each; -export const map = BI.map; -export const reduce = BI.reduce; -export const reduceRight = BI.reduceRight; -export const find = BI.find; -export const filter = BI.filter; -export const reject = BI.reject; -export const every = BI.every; -export const all = BI.all; -export const some = BI.some; -export const any = BI.any; -export const max = BI.max; -export const min = BI.min; -export const sortBy = BI.sortBy; -export const groupBy = BI.groupBy; -export const indexBy = BI.indexBy; -export const countBy = BI.countBy; -export const partition = BI.partition; -export const clamp = BI.clamp; - -// 数数 -export function count(from, to, predicate) { - let t; - if (predicate) { - for (t = from; t < to; t++) { - predicate(t); - } - } - - return to - from; -} - -// 倒数 -export function inverse(from, to, predicate) { - return count(to, from, predicate); -} - -export function firstKey(obj) { - let res = undefined; - any(obj, (key, value) => { - res = key; - - return true; - }); - - return res; -} - -export function lastKey(obj) { - let res = undefined; - each(obj, (key, value) => { - res = key; - - return true; - }); - - return res; -} - -export function firstObject(obj) { - let res = undefined; - any(obj, (key, value) => { - res = value; - - return true; - }); - - return res; -} - -export function lastObject(obj) { - let res = undefined; - each(obj, (key, value) => { - res = value; - - return true; - }); - - return res; -} - -export function concat(obj1, obj2) { - if (isKey(obj1)) { - return map([].slice.apply(arguments), (idx, v) => v).join(""); - } - if (isArray(obj1)) { - return BI._.concat.apply([], arguments); - } - if (isObject(obj1)) { - return extend.apply({}, arguments); - } -} - -export function backEach(obj, predicate, context) { - predicate = iteratee(predicate, context); - for (let index = obj.length - 1; index >= 0; index--) { - predicate(index, obj[index], obj); - } - - return false; -} - -export function backAny(obj, predicate, context) { - predicate = iteratee(predicate, context); - for (let index = obj.length - 1; index >= 0; index--) { - if (predicate(index, obj[index], obj)) { - return true; - } - } - - return false; -} - -export function backEvery(obj, predicate, context) { - predicate = iteratee(predicate, context); - for (let index = obj.length - 1; index >= 0; index--) { - if (!predicate(index, obj[index], obj)) { - return false; - } - } - - return true; -} - -export function backFindKey(obj, predicate, context) { - predicate = iteratee(predicate, context); - const objKeys = keys(obj); - let key; - for (let i = objKeys.length - 1; i >= 0; i--) { - key = objKeys[i]; - if (predicate(obj[key], key, obj)) { - return key; - } - } -} - -export function backFind(obj, predicate, context) { - let key; - if (isArray(obj)) { - key = findLastIndex(obj, predicate, context); - } else { - key = backFindKey(obj, predicate, context); - } - if (key !== void 0 && key !== -1) { - return obj[key]; - } -} - -export function remove(obj, target, context) { - const targetIsFunction = isFunction(target); - target = targetIsFunction || isArray(target) ? target : [target]; - let i; - if (isArray(obj)) { - for (i = 0; i < obj.length; i++) { - if ( - (targetIsFunction && - (target === obj[i] || - target.apply(context, [i, obj[i]]) === true)) || - (!targetIsFunction && contains(target, obj[i])) - ) { - obj.splice(i--, 1); - } - } - } else { - each(obj, (i, v) => { - if ( - (targetIsFunction && - (target === obj[i] || - target.apply(context, [i, obj[i]]) === true)) || - (!targetIsFunction && contains(target, obj[i])) - ) { - delete obj[i]; - } - }); - } -} - -export function removeAt(obj, index) { - index = isArray(index) ? index : [index]; - const objIsArray = isArray(obj); - let i; - for (i = 0; i < index.length; i++) { - if (objIsArray) { - obj[index[i]] = "$deleteIndex"; - } else { - delete obj[index[i]]; - } - } - if (objIsArray) { - remove(obj, "$deleteIndex"); - } -} - -export function string2Array(str) { - return str.split("&-&"); -} - -export function array2String(array) { - return array.join("&-&"); -} - -export function abc2Int(string) { - let idx = 0; - const start = "A", - str = string.toUpperCase(); - for (let i = 0, len = str.length; i < len; ++i) { - idx = str.charAt(i).charCodeAt(0) - start.charCodeAt(0) + 26 * idx + 1; - if ( - idx > - (2147483646 - str.charAt(i).charCodeAt(0) + start.charCodeAt(0)) / - 26 - ) { - return 0; - } - } - - return idx; -} - -export function int2Abc(num) { - const DIGITS = [ - "A", - "B", - "C", - "D", - "E", - "F", - "G", - "H", - "I", - "J", - "K", - "L", - "M", - "N", - "O", - "P", - "Q", - "R", - "S", - "T", - "U", - "V", - "W", - "X", - "Y", - "Z" - ]; - let idx = num, - str = ""; - if (num === 0) { - return ""; - } - while (idx !== 0) { - let t = idx % 26; - if (t === 0) { - t = 26; - } - str = DIGITS[t - 1] + str; - idx = (idx - t) / 26; - } - - return str; -} - -// 数组相关的方法 -BI._.each( - [ - "first", - "initial", - "last", - "rest", - "compact", - "flatten", - "without", - "union", - "intersection", - "difference", - "zip", - "unzip", - "object", - "indexOf", - "lastIndexOf", - "sortedIndex", - "range", - "take", - "takeRight", - "uniqBy" - ], - name => { - BI[name] = _apply(name); - } -); -BI._.each(["findIndex", "findLastIndex"], name => { - BI[name] = _applyFunc(name); -}); -export const first = BI.first; -export const initial = BI.initial; -export const last = BI.last; -export const rest = BI.rest; -export const compact = BI.compact; -export const flatten = BI.flatten; -export const without = BI.without; -export const union = BI.union; -export const intersection = BI.intersection; -export const difference = BI.difference; -export const zip = BI.zip; -export const unzip = BI.unzip; -export const object = BI.object; -export const indexOf = BI.indexOf; -export const lastIndexOf = BI.lastIndexOf; -export const sortedIndex = BI.sortedIndex; -export const range = BI.range; -export const take = BI.take; -export const takeRight = BI.takeRight; -export const uniqBy = BI.uniqBy; -export const findIndex = BI.findIndex; -export const findLastIndex = BI.findLastIndex; - -// 构建一个长度为length的数组 -export function makeArray(length, value) { - const res = []; - for (let i = 0; i < length; i++) { - if (isNull(value)) { - res.push(i); - } else { - res.push(deepClone(value)); - } - } - - return res; -} - -export function makeObject(array, value) { - const map = {}; - for (let i = 0; i < array.length; i++) { - if (isNull(value)) { - map[array[i]] = array[i]; - } else if (isFunction(value)) { - map[array[i]] = value(i, array[i]); - } else { - map[array[i]] = deepClone(value); - } - } - - return map; -} - -export function makeArrayByArray(array, value) { - const res = []; - if (!array) { - return res; - } - for (let i = 0, len = array.length; i < len; i++) { - if (isArray(array[i])) { - res.push(makeArrayByArray(array[i], value)); - } else { - res.push(deepClone(value)); - } - } - - return res; -} - -export function uniq(array, isSorted, iteratee, context) { - if (array === null) { - return []; - } - if (!isBoolean(isSorted)) { - context = iteratee; - iteratee = isSorted; - isSorted = false; - } - iteratee && (iteratee = traverse(iteratee, context)); - - return BI._uniq.call(BI._, array, isSorted, iteratee, context); -} - -// 对象相关方法 -BI._.each( - [ - "keys", - "allKeys", - "values", - "pairs", - "invert", - "create", - "functions", - "extend", - "extendOwn", - "defaults", - "clone", - "property", - "propertyOf", - "matcher", - "isEqual", - "isMatch", - "isEmpty", - "isElement", - "isNumber", - "isString", - "isArray", - "isObject", - "isPlainObject", - "isArguments", - "isFunction", - "isFinite", - "isBoolean", - "isDate", - "isRegExp", - "isError", - "isNaN", - "isUndefined", - "zipObject", - "cloneDeep", - "pickBy" - ], - name => { - BI[name] = _apply(name); - } -); -export const keys = BI.keys; -export const allKeys = BI.allKeys; -export const values = BI.values; -export const pairs = BI.pairs; -export const invert = BI.invert; -export const create = BI.create; -export const functions = BI.functions; -export const extend = BI.extend; -export const extendOwn = BI.extendOwn; -export const defaults = BI.defaults; -export const clone = BI.clone; -export const property = BI.property; -export const propertyOf = BI.propertyOf; -export const matcher = BI.matcher; -export const isEqual = BI.isEqual; -export const isMatch = BI.isMatch; -export const isEmpty = BI.isEmpty; -export const isElement = BI.isElement; -export const isNumber = BI.isNumber; -export const isString = BI.isString; -export const isArray = BI.isArray; -export const isObject = BI.isObject; -export const isPlainObject = BI.isPlainObject; -export const isArguments = BI.isArguments; -export const isFunction = BI.isFunction; -export const isFinite = BI.isFinite; -export const isBoolean = BI.isBoolean; -export const isDate = BI.isDate; -export const isRegExp = BI.isRegExp; -export const isError = BI.isError; -export const isNaN = BI.isNaN; -export const isUndefined = BI.isUndefined; -export const zipObject = BI.zipObject; -export const cloneDeep = BI.cloneDeep; -export const pickBy = BI.pickBy; - -BI._.each(["mapObject", "findKey", "pick", "omit", "tap"], name => { - BI[name] = _applyFunc(name); -}); -export const mapObject = BI.mapObject; -export const findKey = BI.findKey; -export const pick = BI.pick; -export const omit = BI.omit; -export const tap = BI.tap; - -export function inherit(sp, overrides) { - function sb() { - return sp.apply(this, arguments); - } - function F() {} - const spp = sp.prototype; - F.prototype = spp; - sb.prototype = new F(); - sb.superclass = spp; - extend(sb.prototype, overrides, { - superclass: sp, - }); - - return sb; -} - -export function init() { - // 先把准备环境准备好 - while (prepares && prepares.length > 0) { - prepares.shift()(); - } - while ( - _global.___fineuiExposedFunction && - _global.___fineuiExposedFunction.length > 0 - ) { - _global.___fineuiExposedFunction.shift()(); - } - BI.initialized = true; -} - -export function has(obj, keys) { - if (isArray(keys)) { - if (keys.length === 0) { - return false; - } - - return every(keys, (i, key) => BI._.has(obj, key)); - } - - return BI._.has(...arguments); -} - -export function freeze(value) { - // 在ES5中,如果这个方法的参数不是一个对象(一个原始值),那么它会导致 TypeError - // 在ES2015中,非对象参数将被视为要被冻结的普通对象,并被简单地返回 - if (Object.freeze && isObject(value)) { - return Object.freeze(value); - } - - return value; -} - -// 数字和字符串可以作为key -export function isKey(key) { - return isNumber(key) || (isString(key) && key.length > 0); -} - -// 忽略大小写的等于 -export function isCapitalEqual(a, b) { - a = isNull(a) ? a : `${a}`.toLowerCase(); - b = isNull(b) ? b : `${b}`.toLowerCase(); - - return isEqual(a, b); -} - -export function isWidthOrHeight(w) { - if (typeof w === "number") { - return w >= 0; - } else if (typeof w === "string") { - return ( - /^\d{1,3}(\.\d)?%$/.test(w) || - w === "auto" || - /^\d+(\.\d+)?px$/.test(w) || - /^calc/.test(w) - ); - } -} - -export function isNotNull(obj) { - return !isNull(obj); -} - -export function isNull(obj) { - return typeof obj === "undefined" || obj === null; -} - -export function isEmptyArray(arr) { - return isArray(arr) && isEmpty(arr); -} - -export function isNotEmptyArray(arr) { - return isArray(arr) && !isEmpty(arr); -} - -export function isEmptyObject(obj) { - return isEqual(obj, {}); -} - -export function isNotEmptyObject(obj) { - return isPlainObject(obj) && !isEmptyObject(obj); -} - -export function isWindow(obj) { - return obj !== null && obj === obj.window; -} - -export function isPromise(obj) { - return !!obj && (isObject(obj) || isFunction(obj)) && isFunction(obj.then); -} - -export const deepClone = BI._.cloneDeep; -export const deepExtend = BI._.merge; - -export function isDeepMatch(object, attrs) { - const attrsKeys = keys(attrs), - length = attrsKeys.length; - if (object === null) { - return !length; - } - const obj = Object(object); - for (let i = 0; i < length; i++) { - const key = attrsKeys[i]; - if (!isEqual(attrs[key], obj[key]) || !(key in obj)) { - return false; - } - } - - return true; -} - -export function contains(obj, target, fromIndex) { - if (!BI._.isArrayLike(obj)) obj = values(obj); - - return ( - indexOf(obj, target, typeof fromIndex === "number" && fromIndex) >= 0 - ); -} - -export function deepContains(obj, copy) { - if (isObject(copy)) { - return any(obj, (i, v) => isEqual(v, copy)); - } - - return contains(obj, copy); -} - -export function deepIndexOf(obj, target) { - for (let i = 0; i < obj.length; i++) { - if (isEqual(target, obj[i])) { - return i; - } - } - - return -1; -} - -export function deepRemove(obj, target) { - let done = false; - let i; - if (isArray(obj)) { - for (i = 0; i < obj.length; i++) { - if (isEqual(target, obj[i])) { - obj.splice(i--, 1); - done = true; - } - } - } else { - each(obj, (i, v) => { - if (isEqual(target, obj[i])) { - delete obj[i]; - done = true; - } - }); - } - - return done; -} - -export function deepWithout(obj, target) { - if (isArray(obj)) { - const result = []; - for (let i = 0; i < obj.length; i++) { - if (!isEqual(target, obj[i])) { - result.push(obj[i]); - } - } - - return result; - } - const result = {}; - each(obj, (i, v) => { - if (!isEqual(target, obj[i])) { - result[i] = v; - } - }); - - return result; -} - -export function deepUnique(array) { - const result = []; - each(array, (i, item) => { - if (!deepContains(result, item)) { - result.push(item); - } - }); - - return result; -} - -// 比较两个对象得出不一样的key值 -export function deepDiff(object, other) { - object || (object = {}); - other || (other = {}); - const result = []; - const used = []; - for (const b in object) { - if (has(object, b)) { - if (!isEqual(object[b], other[b])) { - result.push(b); - } - used.push(b); - } - } - for (const b in other) { - if (has(other, b) && !contains(used, b)) { - result.push(b); - } - } - - return result; -} - -// 通用方法 -BI._.each( - [ - "uniqueId", - "result", - "chain", - "iteratee", - "unescape", - "before", - "after", - "chunk" - ], - name => { - BI[name] = (...args) => BI._[name](...args); - } -); -export const uniqueId = BI.uniqueId; -export const result = BI.result; -export const chain = BI.chain; -export const iteratee = BI.iteratee; -export const unescape = BI.unescape; -export const before = BI.before; -export const after = BI.after; -export const chunk = BI.chunk; - -// 事件相关方法 -BI._.each( - [ - "bind", - "once", - "partial", - "debounce", - "throttle", - "delay", - "defer", - "wrap" - ], - name => { - BI[name] = (...args) => BI._[name](...args); - } -); -export const bind = BI.bind; -export const once = BI.once; -export const partial = BI.partial; -export const debounce = BI.debounce; -export const throttle = BI.throttle; -export const delay = BI.delay; -export const defer = BI.defer; -export const wrap = BI.wrap; - -export const nextTick = (function () { - const callbacks = []; - let pending = false; - let timerFunc = void 0; - - function nextTickHandler() { - pending = false; - const copies = callbacks.slice(0); - callbacks.length = 0; - for (let i = 0; i < copies.length; i++) { - copies[i](); - } - } - - if (typeof Promise !== "undefined") { - const p = Promise.resolve(); - timerFunc = function timerFunc() { - p.then(nextTickHandler); - }; - } else if (typeof MutationObserver !== "undefined") { - let counter = 1; - const observer = new MutationObserver(nextTickHandler); - const textNode = document.createTextNode(String(counter)); - observer.observe(textNode, { - characterData: true, - }); - timerFunc = function timerFunc() { - counter = (counter + 1) % 2; - textNode.data = String(counter); - }; - } else if (typeof setImmediate !== "undefined") { - timerFunc = function timerFunc() { - setImmediate(nextTickHandler); - }; - } else { - // Fallback to setTimeout. - timerFunc = function timerFunc() { - setTimeout(nextTickHandler, 0); - }; - } - - return function queueNextTick(cb) { - let _resolve = void 0; - const args = [].slice.call(arguments, 1); - callbacks.push(() => { - if (cb) { - try { - cb(...args); - } catch (e) { - console.error(e); - } - } else if (_resolve) { - _resolve(...args); - } - }); - if (!pending) { - pending = true; - timerFunc(); - } - // $flow-disable-line - if (!cb && typeof Promise !== "undefined") { - return new Promise((resolve, reject) => { - _resolve = resolve; - }); - } - }; -}()); - -// 数字相关方法 -BI._.each(["random"], name => { - BI[name] = _apply(name); -}); -export const random = BI.random; - -export function parseInt(number) { - let radix = 10; - if (/^0x/g.test(number)) { - radix = 16; - } - try { - return _global.parseInt(number, radix); - } catch (e) { - throw new Error(`${number}parse int error`); - } -} - -export function parseSafeInt(value) { - const MAX_SAFE_INTEGER = 9007199254740991; - - return value - ? clamp(parseInt(value), -MAX_SAFE_INTEGER, MAX_SAFE_INTEGER) - : value === 0 - ? value - : 0; -} - -export function parseFloat(number) { - try { - return _global.parseFloat(number); - } catch (e) { - throw new Error(`${number}parse float error`); - } -} - -export function isNaturalNumber(number) { - return /^\d+$/.test(number); -} - -export function isPositiveInteger(number) { - return /^\+?[1-9][0-9]*$/.test(number); -} - -export function isNegativeInteger(number) { - return /^-[1-9][0-9]*$/.test(number); -} - -export function isInteger(number) { - return /^-?\d+$/.test(number); -} - -export function isNumeric(number) { - return ( - !_global.isNaN(_global.parseFloat(number)) && _global.isFinite(number) - ); -} - -export function isFloat(number) { - return /^([+-]?)\d*\.\d+$/.test(number); -} - -export function isOdd(number) { - if (!isInteger(number)) { - return false; - } - - return (number & 1) === 1; -} - -export function isEven(number) { - if (!isInteger(number)) { - return false; - } - - return (number & 1) === 0; -} - -export function sum(array, iteratee, context) { - let sum = 0; - each(array, (i, item) => { - if (iteratee) { - sum += Number(iteratee.apply(context, [i, item])); - } else { - sum += Number(item); - } - }); - - return sum; -} - -export function average(array, iteratee, context) { - const sumResult = sum(array, iteratee, context); - - return sumResult / array.length; -} - -export function trim(...args) { - return BI._.trim(...args); -} - -export function toUpperCase(string) { - return `${string}`.toLocaleUpperCase(); -} - -export function toLowerCase(string) { - return `${string}`.toLocaleLowerCase(); -} - -export function isEndWithBlank(string) { - return /(\s|\u00A0)$/.test(string); -} - -export function isLiteral(exp) { - return /^\s?(true|false|-?[\d.]+|'[^']*'|"[^"]*")\s?$/.test(exp); -} - -export function stripQuotes(str) { - const a = str.charCodeAt(0); - const b = str.charCodeAt(str.length - 1); - - return a === b && (a === 0x22 || a === 0x27) ? str.slice(1, -1) : str; -} - -// background-color => backgroundColor -export function camelize(str) { - return str.replace(/-(.)/g, (_, character) => character.toUpperCase()); -} - -// backgroundColor => background-color -export function hyphenate(str) { - return str.replace(/([A-Z])/g, "-$1").toLowerCase(); -} - -export function isNotEmptyString(str) { - return isString(str) && !isEmpty(str); -} - -export function isEmptyString(str) { - return isString(str) && isEmpty(str); -} - -/** - * 通用解密方法 - * @param type 解密方式 - * @param text 文本 - * @param key 种子 - * @return {*} - */ -export function encrypt(type, text, key) { - switch (type) { - case CRYPT_TYPE.AES: - default: - return aesEncrypt(text, key); - } -} - -/** - * 通用解密方法 - * @param type 解密方式 - * @param text 文本 - * @param key 种子 - * @return {*} - */ -export function decrypt(type, text, key) { - switch (type) { - case CRYPT_TYPE.AES: - default: - return aesDecrypt(text, key); - } -} - -/** - * 对字符串中的'和\做编码处理 - * @static - * @param {String} string 要做编码处理的字符串 - * @return {String} 编码后的字符串 - */ -export function escape(string) { - return string.replace(/('|\\)/g, "\\$1"); -} - -/** - * 让字符串通过指定字符做补齐的函数 - * - * var s = BI.leftPad('123', 5, '0');//s的值为:'00123' - * - * @static - * @param {String} val 原始值 - * @param {Number} size 总共需要的位数 - * @param {String} ch 用于补齐的字符 - * @return {String} 补齐后的字符串 - */ -export function leftPad(val, size, ch) { - let result = String(val); - if (!ch) { - ch = " "; - } - while (result.length < size) { - result = ch + result; - } - - return result.toString(); -} - -/** - * 对字符串做替换的函数 - * - * var cls = 'my-class', text = 'Some text'; - * var res = BI.format('
{1}
', cls, text); - * //res的值为:'
Some text
'; - * - * @static - * @param {String} format 要做替换的字符串,替换字符串1,替换字符串2... - * @return {String} 做了替换后的字符串 - */ -export function format(format) { - const args = Array.prototype.slice.call(arguments, 1); - - return format.replace(/\{(\d+)\}/g, (m, i) => args[i]); -} - -/** - * 是否是闰年 - * @param year - * @returns {boolean} - */ -export function isLeapYear(year) { - return (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0; -} - -/** - * 检测是否在有效期 - * - * @param YY 年 - * @param MM 月 - * @param DD 日 - * @param minDate '1900-01-01' - * @param maxDate '2099-12-31' - * @returns {Array} 若无效返回无效状态,数组第一位为无效属性,第二位缺省为超下限,1为超上限 - */ -export function checkDateVoid(YY, MM, DD, minDate, maxDate) { - let back = []; - YY = YY | 0; - MM = MM | 0; - DD = DD | 0; - minDate = isString(minDate) ? minDate.match(/\d+/g) : minDate; - maxDate = isString(maxDate) ? maxDate.match(/\d+/g) : maxDate; - if (YY < minDate[0]) { - back = ["y"]; - } else if (YY > maxDate[0]) { - back = ["y", 1]; - } else if (YY >= minDate[0] && YY <= maxDate[0]) { - if (YY === minDate[0]) { - if (MM < minDate[1]) { - back = ["m"]; - } else if (MM === minDate[1]) { - if (DD < minDate[2]) { - back = ["d"]; - } - } - } - if (YY === maxDate[0]) { - if (MM > maxDate[1]) { - back = ["m", 1]; - } else if (MM === maxDate[1]) { - if (DD > maxDate[2]) { - back = ["d", 1]; - } - } - } - } - - return back; -} - -export function checkDateLegal(str) { - const ar = str.match(/\d+/g); - const YY = ar[0] | 0, - MM = ar[1] | 0, - DD = ar[2] | 0; - if (ar.length <= 1) { - return true; - } - if (ar.length <= 2) { - return MM >= 1 && MM <= 12; - } - const MD = BI.Date._MD.slice(0); - MD[1] = isLeapYear(YY) ? 29 : 28; - - return MM >= 1 && MM <= 12 && DD <= MD[MM - 1]; -} - -/** 解析日期时间字符串 - * - * @param str - * @param fmt - * @returns {Date|Date} - * 年月日缺省值为当前日期, 时分秒缺省值为0 - */ -export function parseDateTime(str, fmt) { - const today = BI.getDate(); - let y; - let m; - let d; - // wei : 对于fmt为‘YYYYMM’或者‘YYYYMMdd’的格式,str的值为类似'201111'的形式,因为年月之间没有分隔符,所以正则表达式分割无效,导致bug7376。 - const a = str.split(/\W+/); - if (fmt.toLowerCase() === "%y%x" || fmt.toLowerCase() === "%y%x%d") { - const yearlength = 4; - const otherlength = 2; - a[0] = str.substring(0, yearlength); - a[1] = str.substring(yearlength, yearlength + otherlength); - a[2] = str.substring( - yearlength + otherlength, - yearlength + otherlength * 2 - ); - } - const b = fmt.match(/%./g); - let i = 0, - j = 0; - let hr = 0; - let min = 0; - let sec = 0; - for (i = 0; i < a.length; ++i) { - switch (b[i]) { - case "%d": - case "%e": - d = _global.parseInt(a[i], 10); - break; - - case "%X": - m = _global.parseInt(a[i], 10) - 1; - break; - case "%x": - m = _global.parseInt(a[i], 10) - 1; - break; - - case "%Y": - case "%y": - y = _global.parseInt(a[i], 10); - y < 100 && (y += y > 29 ? 1900 : 2000); - break; - - case "%b": - case "%B": - for (j = 0; j < 12; ++j) { - if ( - BI.getMonthName(j) - .substr(0, a[i].length) - .toLowerCase() === a[i].toLowerCase() - ) { - m = j; - break; - } - } - break; - - case "%H": - case "%I": - case "%k": - case "%l": - hr = _global.parseInt(a[i], 10); - break; - - case "%P": - case "%p": - if (/pm/i.test(a[i]) && hr < 12) { - hr += 12; - } else if (/am/i.test(a[i]) && hr >= 12) { - hr -= 12; - } - break; - case "%Q": - case "%q": - m = (_global.parseInt(a[i], 10) - 1) * 3; - break; - case "%M": - min = _global.parseInt(a[i], 10); - break; - case "%S": - sec = _global.parseInt(a[i], 10); - break; - default: - } - } - // if (!a[i]) { - // continue; - // } - if (_global.isNaN(y)) { - y = today.getFullYear(); - } - if (_global.isNaN(m)) { - m = today.getMonth(); - } - if (_global.isNaN(d)) { - d = today.getDate(); - } - if (_global.isNaN(hr)) { - hr = today.getHours(); - } - if (_global.isNaN(min)) { - min = today.getMinutes(); - } - if (_global.isNaN(sec)) { - sec = today.getSeconds(); - } - if (y !== 0) { - return BI.getDate(y, m, d, hr, min, sec); - } - y = 0; - m = -1; - d = 0; - for (i = 0; i < a.length; ++i) { - if (a[i].search(/[a-zA-Z]+/) !== -1) { - let t = -1; - for (j = 0; j < 12; ++j) { - if ( - BI.getMonthName(j).substr(0, a[i].length).toLowerCase() === - a[i].toLowerCase() - ) { - t = j; - break; - } - } - if (t !== -1) { - if (m !== -1) { - d = m + 1; - } - m = t; - } - } else if (_global.parseInt(a[i], 10) <= 12 && m === -1) { - m = a[i] - 1; - } else if (_global.parseInt(a[i], 10) > 31 && y === 0) { - y = _global.parseInt(a[i], 10); - y < 100 && (y += y > 29 ? 1900 : 2000); - } else if (d === 0) { - d = a[i]; - } - } - if (y === 0) { - y = today.getFullYear(); - } - if (m === -1) { - m = today.getMonth(); - } - if (m !== -1 && d !== 0) { - return BI.getDate(y, m, d, hr, min, sec); - } - - return today; -} - -export function getDate(...args) { - const length = args.length; - let dt; - switch (length) { - // new Date() - case 0: - dt = new Date(); - break; - // new Date(long) - case 1: - dt = new Date(args[0]); - break; - // new Date(year, month) - case 2: - dt = new Date(args[0], args[1]); - break; - // new Date(year, month, day) - case 3: - dt = new Date(args[0], args[1], args[2]); - break; - // new Date(year, month, day, hour) - case 4: - dt = new Date(args[0], args[1], args[2], args[3]); - break; - // new Date(year, month, day, hour, minute) - case 5: - dt = new Date(args[0], args[1], args[2], args[3], args[4]); - break; - // new Date(year, month, day, hour, minute, second) - case 6: - dt = new Date(args[0], args[1], args[2], args[3], args[4], args[5]); - break; - // new Date(year, month, day, hour, minute, second, millisecond) - case 7: - dt = new Date( - args[0], - args[1], - args[2], - args[3], - args[4], - args[5], - args[6] - ); - break; - default: - dt = new Date(); - break; - } - if ( - isNotNull(BI.timeZone) && - (arguments.length === 0 || - (arguments.length === 1 && isNumber(arguments[0]))) - ) { - const localTime = dt.getTime(); - // BI-33791 1901年以前的东8区标准是GMT+0805, 统一无论是什么时间,都以整的0800这样的为基准 - const localOffset = dt.getTimezoneOffset() * 60000; // 获得当地时间偏移的毫秒数 - const utc = localTime + localOffset; // utc即GMT时间标准时区 - - return new Date(utc + BI.timeZone); // + Pool.timeZone.offset); - } - - return dt; -} - -export function getTime() { - const length = arguments.length; - const args = arguments; - let dt; - switch (length) { - // new Date() - case 0: - dt = new Date(); - break; - // new Date(long) - case 1: - dt = new Date(args[0]); - break; - // new Date(year, month) - case 2: - dt = new Date(args[0], args[1]); - break; - // new Date(year, month, day) - case 3: - dt = new Date(args[0], args[1], args[2]); - break; - // new Date(year, month, day, hour) - case 4: - dt = new Date(args[0], args[1], args[2], args[3]); - break; - // new Date(year, month, day, hour, minute) - case 5: - dt = new Date(args[0], args[1], args[2], args[3], args[4]); - break; - // new Date(year, month, day, hour, minute, second) - case 6: - dt = new Date(args[0], args[1], args[2], args[3], args[4], args[5]); - break; - // new Date(year, month, day, hour, minute, second, millisecond) - case 7: - dt = new Date( - args[0], - args[1], - args[2], - args[3], - args[4], - args[5], - args[6] - ); - break; - default: - dt = new Date(); - break; - } - if (isNotNull(BI.timeZone)) { - // BI-33791 1901年以前的东8区标准是GMT+0805, 统一无论是什么时间,都以整的0800这样的为基准 - return ( - dt.getTime() - BI.timeZone - new Date().getTimezoneOffset() * 60000 - ); - } - - return dt.getTime(); -} - diff --git a/src/core/4.widget.js b/src/core/4.widget.js deleted file mode 100644 index 63e831577..000000000 --- a/src/core/4.widget.js +++ /dev/null @@ -1,1191 +0,0 @@ -/** - * Widget超类 - * @class Widget - * @extends OB - * - * @cfg {JSON} options 配置属性 - */ - -import $ from "jquery"; -import { - isFunction, - isArray, - each, - extend, - isPlainObject, - isNull, - uniqueId, - isWidget, - isWidthOrHeight, - isKey, - remove, - any, - isNotNull -} from "./2.base"; -import { OB } from "./3.ob"; -import { Providers, _lazyCreateWidget } from "./5.inject"; -import { DOM } from "./utils"; -import { Events, emptyFn, pixFormat } from "./constant"; -import { Plugin } from "./6.plugin"; -import { _global } from "./0.foundation"; - -const cancelAnimationFrame = - _global.cancelAnimationFrame || - _global.webkitCancelAnimationFrame || - _global.mozCancelAnimationFrame || - _global.oCancelAnimationFrame || - _global.msCancelAnimationFrame || - _global.clearTimeout; - -const requestAnimationFrame = - _global.requestAnimationFrame || - _global.webkitRequestAnimationFrame || - _global.mozRequestAnimationFrame || - _global.oRequestAnimationFrame || - _global.msRequestAnimationFrame || - _global.setTimeout; - -function callLifeHook(self, life) { - let hooks = [], - hook; - hook = self[life]; - if (hook) { - hooks = hooks.concat(isArray(hook) ? hook : [hook]); - } - hook = self.options[life]; - if (hook) { - hooks = hooks.concat(isArray(hook) ? hook : [hook]); - } - each(hooks, (i, hook) => { - hook.call(self); - }); -} - -export class Widget extends OB { - _defaultConfig() { - return extend(super._defaultConfig(), { - root: false, - tagName: "div", - attributes: null, - data: null, - key: null, - - tag: null, - disabled: false, - invisible: false, - animation: "", - animationDuring: 0, - invalid: false, - baseCls: "", - extraCls: "", - cls: "", - css: null - - // vdom: false - }); - } - - _constructor() {} - - // 覆盖父类的_constructor方法,widget不走ob的生命周期 - _constructed() { - if (this.setup) { - pushTarget(this); - const delegate = this.setup(this.options); - if (isPlainObject(delegate)) { - // 如果setup返回一个json,即对外暴露的方法 - extend(this, delegate); - } else { - this.render = delegate; - } - popTarget(); - } - } - - _lazyConstructor() { - if (!this.__constructed) { - this.__constructed = true; - this._init(); - this._initRef(); - } - } - - // // 生命周期函数 - // beforeInit = null; - - // beforeRender = null; - - // beforeCreate = null - - // created = null - - // render = null - - // beforeMount = null - - // mounted = null - // // 不想重写mounted时用 - // _mounted = null - - // shouldUpdate = null - - // update = null - - // beforeUpdate = null - - // updated = null - - // beforeDestroy = null - - // destroyed = null - // // 不想重写destroyed时用 - // _destroyed = null - - _init() { - super._init(...arguments); - this._initVisual(); - this._initState(); - this._initRender(); - } - - _initRender() { - let initCallbackCalled = false; - let renderCallbackCalled = false; - - const init = () => { - // 加个保险 - if (initCallbackCalled === true) { - _global.console && - console.error( - "组件: 请检查beforeInit内部的写法,callback只能执行一次" - ); - - return; - } - initCallbackCalled = true; - - const render = () => { - // 加个保险 - if (renderCallbackCalled === true) { - _global.console && - console.error( - "组件: 请检查beforeRender内部的写法,callback只能执行一次" - ); - - return; - } - renderCallbackCalled = true; - this._render(); - this.__afterRender(); - }; - - if (this.options.beforeRender || this.beforeRender) { - this.__async = true; - const beforeRenderResult = ( - this.options.beforeRender || this.beforeRender - ).call(this, render); - if (beforeRenderResult instanceof Promise) { - beforeRenderResult.then(render).catch((e) => { - _global.console && console.error(e); - render(); - }); - } - } else { - this._render(); - this.__afterRender(); - } - }; - - if (this.options.beforeInit || this.beforeInit) { - this.__asking = true; - const beforeInitResult = ( - this.options.beforeInit || this.beforeInit - ).call(this, init); - if (beforeInitResult instanceof Promise) { - beforeInitResult.then(init).catch((e) => { - _global.console && console.error(e); - init(); - }); - } - } else { - init(); - } - } - - __afterRender() { - pushTarget(this); - const async = this.__async; - this.__async = false; - if (async && this._isMounted) { - callLifeHook(this, "beforeMount"); - this._mount(); - callLifeHook(this, "mounted"); - this.fireEvent(Events.MOUNT); - } else { - this._mount(); - } - popTarget(); - } - - _render() { - this.__asking = false; - pushTarget(this); - callLifeHook(this, "beforeCreate"); - this._initElement(); - this._initEffects(); - callLifeHook(this, "created"); - popTarget(); - } - - _initCurrent() { - const o = this.options; - this._initElementWidth(); - this._initElementHeight(); - if (o._baseCls || o.baseCls || o.extraCls) { - this.element.addClass( - `${o._baseCls || ""} ${o.baseCls || ""} ${o.extraCls || ""}` - ); - } - if (o.cls) { - if (isFunction(o.cls)) { - let cls = this.__watch(o.cls, (context, newValue) => { - this.element.removeClass(cls).addClass((cls = newValue)); - }); - this.element.addClass(cls); - } else { - this.element.addClass(o.cls); - } - } - // if (o.key != null) { - // this.element.attr("key", o.key); - // } - if (o.attributes) { - this.element.attr(o.attributes); - } - if (o.data) { - this.element.data(o.data); - } - if (o.css) { - if (isFunction(o.css)) { - let css = this.__watch(o.css, (context, newValue) => { - for (const k in css) { - if (isNull(newValue[k])) { - newValue[k] = ""; - } - } - this.element.css((css = newValue)); - }); - this.element.css(css); - } else { - this.element.css(o.css); - } - } - } - - __watch(getter, handler, options) { - if (_global.Fix) { - this._watchers = this._watchers || []; - const watcher = new Fix.Watcher( - null, - () => getter.call(this, this), - (handler && - ((v) => { - handler.call(this, this, v); - })) || - emptyFn, - extend({ deep: true }, options) - ); - this._watchers.push(() => { - watcher.teardown(); - }); - - return watcher.value; - } else { - return getter(); - } - } - - /** - * 初始化根节点 - * @private - */ - _initRoot() { - const o = this.options; - this.widgetName = o.widgetName || uniqueId("widget"); - this._isRoot = o.root; - this._children = {}; - if (isWidget(o.element)) { - this.element = this.options.element.element; - this._parent = o.element; - this._parent._children && - this._parent.addWidget(this.widgetName, this); - } else if (o.element) { - this.element = Widget._renderEngine.createElement(this); - this._isRoot = true; - } else { - this.element = Widget._renderEngine.createElement(this); - } - this.element._isWidget = true; - // const widgets = this.element.data("__widgets") || []; - // widgets.push(this); - // this.element.data("__widgets", widgets); - this._initCurrent(); - } - - _initElementWidth() { - const o = this.options; - if (isWidthOrHeight(o.width)) { - this.element.css("width", pixFormat(o.width)); - } - } - - _initElementHeight() { - const o = this.options; - if (isWidthOrHeight(o.height)) { - this.element.css("height", pixFormat(o.height)); - } - } - - _initVisual() { - const o = this.options; - if (o.invisible) { - const invisible = (o.invisible = isFunction(o.invisible) - ? this.__watch(o.invisible, (context, newValue) => { - this.setVisible(!newValue); - }) - : o.invisible); - if (invisible) { - // 用display属性做显示和隐藏,否则jquery会在显示时将display设为block会覆盖掉display:flex属性 - this.__setElementVisible(false); - } - } - } - - _initEffects() { - const o = this.options; - if (o.disabled || o.invalid) { - if (this.options.disabled) { - const disabled = (o.disabled = isFunction(o.disabled) - ? this.__watch(o.disabled, (context, newValue) => { - this.setEnable(!newValue); - }) - : o.disabled); - if (disabled) { - this.setEnable(false); - } - } - if (this.options.invalid) { - const invalid = (o.invalid = isFunction(o.invalid) - ? this.__watch(o.invalid, (context, newValue) => { - this.setValid(!newValue); - }) - : o.invalid); - if (invalid) { - this.setValid(false); - } - } - } - if (o.effect) { - if (isArray(o.effect)) { - if (isArray(o.effect[0])) { - each(o.effect, (i, effect) => { - this.__watch(effect[0], effect[1]); - }); - } else { - this.__watch(o.effect[0], o.effect[1]); - } - } else { - this.__watch(o.effect); - } - } - } - - _initState() { - this._isMounted = false; - this._isDestroyed = false; - } - - __initWatch() { - // initWatch拦截的方法 - } - - _initElement() { - this.__isMounting = true; - // 当开启worker模式时,可以通过$render来实现另一种效果 - const workerMode = - Providers.getProvider("bi.provider.system").getWorkerMode(); - const render = isFunction(this.options.render) - ? this.options.render - : workerMode - ? this.$render || this.render - : this.render; - let els = render && render.call(this); - els = this.options.configRender - ? this.options.configRender.call(this, els) - : els; - els = Plugin.getRender(this.options.type, els); - if (isPlainObject(els)) { - els = [els]; - } - this.__initWatch(); - if (isArray(els)) { - each(els, (i, el) => { - if (el) { - _lazyCreateWidget(el, { - element: this - }); - } - }); - } - } - - _setParent(parent) { - this._parent = parent; - } - - /** - * - * @param force 是否强制挂载子节点 - * @param deep 子节点是否也是按照当前force处理 - * @param lifeHook 生命周期钩子触不触发,默认触发 - * @param predicate 递归每个widget的回调 - * @param layer 组件层级 - * @returns {boolean} - * @private - */ - _mount(force, deep, lifeHook, predicate, layer) { - if ( - !force && - (this._isMounted || - !this.isVisible() || - this.__asking === true || - !( - this._isRoot === true || - (this._parent && this._parent._isMounted === true) - )) - ) { - return false; - } - layer = layer || 0; - lifeHook !== false && - !this.__async && - callLifeHook(this, "beforeMount"); - this._isMounted = true; - this.__isMounting = false; - for (const key in this._children) { - const child = this._children[key]; - child._mount && - child._mount( - deep ? force : false, - deep, - lifeHook, - predicate, - layer + 1 - ); - } - if (this._parent) { - if (!this._parent.isEnabled()) { - this._setEnable(false); - } - if (!this._parent.isValid()) { - this._setValid(false); - } - } - this._mountChildren && this._mountChildren(); - if (layer === 0) { - // mounted里面会执行scrollTo之类的方法,如果放宏任务里会闪 - // setTimeout(function () { - this.__afterMount(lifeHook, predicate); - // }, 0); - } - - return true; - } - - __afterMount(lifeHook, predicate) { - if (this._isMounted) { - for (const key in this._children) { - const child = this._children[key]; - child.__afterMount && child.__afterMount(lifeHook, predicate); - } - if (lifeHook !== false && !this.__async) { - callLifeHook(this, "_mounted"); - callLifeHook(this, "mounted"); - this.fireEvent(Events.MOUNT); - } - predicate && predicate(this); - } - } - - // _mountChildren = null; - - _update(nextProps, shouldUpdate) { - callLifeHook(this, "beforeUpdate"); - let res; - if (shouldUpdate) { - res = this.update && this.update(nextProps, shouldUpdate); - } - callLifeHook(this, "updated"); - - return res; - } - - isMounted() { - return this._isMounted; - } - - isDestroyed() { - return this._isDestroyed; - } - - setWidth(w) { - this.options.width = w; - this._initElementWidth(); - } - - setHeight(h) { - this.options.height = h; - this._initElementHeight(); - } - - _setEnable(enable) { - if (enable === true) { - this.options._disabled = false; - } else if (enable === false) { - this.options._disabled = true; - } - // 递归将所有子组件使能 - each(this._children, (i, child) => { - !child._manualSetEnable && - child._setEnable && - child._setEnable(enable); - }); - } - - _setValid(valid) { - if (valid === true) { - this.options._invalid = false; - } else if (valid === false) { - this.options._invalid = true; - } - // 递归将所有子组件使有效 - each(this._children, (i, child) => { - !child._manualSetValid && child._setValid && child._setValid(valid); - }); - } - - _setVisible(visible) { - if (visible === true) { - this.options.invisible = false; - } else if (visible === false) { - this.options.invisible = true; - } - } - - setEnable(enable) { - this._manualSetEnable = true; - this.options.disabled = !enable; - this._setEnable(enable); - if (enable === true) { - this.element.removeClass("base-disabled disabled"); - } else if (enable === false) { - this.element.addClass("base-disabled disabled"); - } - } - - __setElementVisible(visible) { - this.element.css("display", visible ? "" : "none"); - } - - _innerSetVisible(visible) { - const o = this.options; - const lastVisible = !o.invisible; - this._setVisible(visible); - if (visible === true) { - // 用this.element.show()会把display属性改成block - this.__setElementVisible(true); - this._mount(); - if (o.animation && !lastVisible) { - this.element - .removeClass(`${o.animation}-leave`) - .removeClass(`${o.animation}-leave-active`) - .addClass(`${o.animation}-enter`); - if (this._requestAnimationFrame) { - cancelAnimationFrame(this._requestAnimationFrame); - } - this._requestAnimationFrame = () => { - this.element.addClass(`${o.animation}-enter-active`); - }; - requestAnimationFrame(this._requestAnimationFrame); - if (this._animationDuring) { - clearTimeout(this._animationDuring); - } - this._animationDuring = setTimeout(() => { - this.element - .removeClass(`${o.animation}-enter`) - .removeClass(`${o.animation}-enter-active`); - }, o.animationDuring); - } - } else if (visible === false) { - if (o.animation && lastVisible) { - this.element - .removeClass(`${o.animation}-enter`) - .removeClass(`${o.animation}-enter-active`) - .addClass(`${o.animation}-leave`); - if (this._requestAnimationFrame) { - cancelAnimationFrame(this._requestAnimationFrame); - } - this._requestAnimationFrame = () => { - this.element.addClass(`${o.animation}-leave-active`); - }; - requestAnimationFrame(this._requestAnimationFrame); - if (this._animationDuring) { - clearTimeout(this._animationDuring); - } - this._animationDuring = setTimeout(() => { - this.element - .removeClass(`${o.animation}-leave`) - .removeClass(`${o.animation}-leave-active`); - this.__setElementVisible(false); - }, o.animationDuring); - } else { - this.__setElementVisible(false); - } - } - } - - setVisible(visible) { - this._innerSetVisible(visible); - this.fireEvent(Events.VIEW, visible); - } - - setValid(valid) { - this._manualSetValid = true; - this.options.invalid = !valid; - this._setValid(valid); - if (valid === true) { - this.element.removeClass("base-invalid invalid"); - } else if (valid === false) { - this.element.addClass("base-invalid invalid"); - } - } - - doBehavior() { - const args = arguments; - // 递归将所有子组件使有效 - each(this._children, (i, child) => { - child.doBehavior && child.doBehavior(...args); - }); - } - - getWidth() { - return this.options.width; - } - - getHeight() { - return this.options.height; - } - - addWidget(name, widget) { - const self = this; - if (name instanceof Widget) { - widget = name; - name = widget.getName(); - } - if (isKey(name)) { - name = `${name}`; - } - name = name || widget.getName() || uniqueId("widget"); - if (this._children[name]) { - throw new Error("组件:组件名已存在,不能进行添加"); - } - widget._setParent && widget._setParent(this); - widget.on(Events.DESTROY, function () { - // TODO: self待删 - remove(self._children, this); - }); - - return (this._children[name] = widget); - } - - getWidgetByName(name) { - if (!isKey(name) || name === this.getName()) { - return this; - } - name = `${name}`; - let widget = void 0; - const other = {}; - any(this._children, (i, wi) => { - if (i === name) { - widget = wi; - - return true; - } - other[i] = wi; - }); - if (!widget) { - any(other, (i, wi) => (widget = wi.getWidgetByName(i))); - } - - return widget; - } - - removeWidget(nameOrWidget) { - if (isWidget(nameOrWidget)) { - remove(this._children, nameOrWidget); - } else { - delete this._children[nameOrWidget]; - } - } - - hasWidget(name) { - return isNotNull(this._children[name]); - } - - getName() { - return this.widgetName; - } - - setTag(tag) { - this.options.tag = tag; - } - - getTag() { - return this.options.tag; - } - - attr(key, value) { - if (isPlainObject(key)) { - each(key, (k, v) => this.attr(k, v)); - - return; - } - if (isNotNull(value)) { - this.options[key] = value; - } - - return this.options[key]; - } - - css(name, value) { - return this.element.css(name, value); - } - - getText() {} - - setText(text) {} - - getValue() {} - - setValue(value) {} - - isEnabled() { - return this.options.disabled === true ? false : !this.options._disabled; - } - - isValid() { - return this.options.invalid === true ? false : !this.options._invalid; - } - - isVisible() { - return !this.options.invisible; - } - - disable() { - this.setEnable(false); - } - - enable() { - this.setEnable(true); - } - - valid() { - this.setValid(true); - } - - invalid() { - this.setValid(false); - } - - invisible() { - this.setVisible(false); - } - - visible() { - this.setVisible(true); - } - - __d() { - each(this._children, (i, widget) => { - widget && widget._unMount && widget._unMount(); - }); - this._children = {}; - } - - // 主要是因为_destroy已经提供了protected方法 - __destroy() { - callLifeHook(this, "beforeDestroy"); - this.beforeDestroy = null; - this.__d(); - this._parent = null; - this._isMounted = false; - callLifeHook(this, "_destroyed"); - callLifeHook(this, "destroyed"); - this.destroyed = null; - this._isDestroyed = true; - // this._purgeRef(); // 清除ref的时机还是要仔细考虑一下 - } - - _unMount() { - this._assetMounted(); - this.__destroy(); - this.fireEvent(Events.UNMOUNT); - this.purgeListeners(); - } - - _assetMounted() { - if (!this.isVisible()) { - this._setVisible(true); - this._mount(false, false, false); - this._setVisible(false); - } - } - - _empty() { - this._assetMounted(); - each(this._children, (i, widget) => { - widget && widget._unMount && widget._unMount(); - }); - this._children = {}; - this.element.empty(); - } - - isolate() { - if (this._parent) { - this._parent.removeWidget(this); - } - DOM.hang([this]); - } - - empty() { - this._empty(); - } - - // 默认的reset方法就是干掉重来 - reset() { - // 还在异步状态的不需要执行reset - if (this.__async === true || this.__asking === true) { - return; - } - // if (this.options.vdom) { - // const vnode = this._renderVNode(); - // patchVNode(this.vnode, vnode); - // this.vnode = vnode; - // return; - // } - // this._isMounted = false; - // this.purgeListeners(); - - // 去掉组件绑定的watcher - each(this._watchers, (i, unwatches) => { - unwatches = isArray(unwatches) ? unwatches : [unwatches]; - each(unwatches, (j, unwatch) => { - unwatch(); - }); - }); - this._watchers && (this._watchers = []); - this._assetMounted(); - this.__d(); - this.element.empty(); - this.element.unbind(); - this._initCurrent(); - this._init(); - // this._initRef(); - } - - _destroy() { - this._assetMounted(); - this.__destroy(); - this.element.destroy(); - this.purgeListeners(); - } - - destroy() { - const o = this.options; - this._assetMounted(); - this.__destroy(); - if (o.animation) { - this._innerSetVisible(false); - setTimeout(() => this.element.destroy(), o.animationDuring); - } else { - this.element.destroy(); - } - this.fireEvent(Events.UNMOUNT); - this.fireEvent(Events.DESTROY); - this._purgeRef(); - this.purgeListeners(); - } -} - -let context = null, - current = null; -const contextStack = [], - currentStack = []; - -Widget.pushContext = function (_context) { - if (context) contextStack.push(context); - Widget.context = context = _context; -}; - -Widget.popContext = function () { - Widget.context = context = contextStack.pop(); -}; - -Widget.execWithContext = function (context, execFunc) { - Widget.pushContext(context); - try { - execFunc(); - } catch (e) { - throw e; - } finally { - Widget.popContext(); - } -}; - -function pushTarget(_current) { - if (current) currentStack.push(current); - Widget.current = current = _current; -} - -function popTarget() { - Widget.current = current = currentStack.pop(); -} - -export function useStore(_store) { - if (current && current.store) { - return current.store; - } - if (current && current.$storeDelegate) { - return current.$storeDelegate; - } - if (current) { - const currentStore = current._store; - const delegate = {}; - let origin; - if (_global.Proxy) { - const proxy = new Proxy(delegate, { - get(target, key) { - return Reflect.get(origin, key); - }, - set(target, key, value) { - return Reflect.set(origin, key, value); - } - }); - current._store = function () { - origin = (_store || currentStore).apply(this, arguments); - delegate.$delegate = origin; - - return origin; - }; - current.$storeDelegate = proxy; - - return current.$storeDelegate; - } - current._store = function () { - const st = (_store || currentStore).apply(this, arguments); - extend(delegate, st); - - return st; - }; - current.$storeDelegate = delegate; - - return current.$storeDelegate; - } -} - -export function useContext(inject) { - // 通过组件找最近的store - let vm = Widget.findStore(Widget.current || Widget.context); - if (vm) { - if (inject) { - if (vm.$$computed && inject in vm.$$computed) { - return vm; - } - if (vm.$$state && inject in vm.$$state) { - return vm; - } - if (vm.$$model && inject in vm.$$model) { - return vm; - } - while (vm) { - if (vm.$$context && inject in vm.$$context) { - return vm; - } - vm = vm._parent; - } - - return null; - } - } - - return vm; -} - -export function watch(vm, watch, handler) { - // 必须要保证组件当前环境存在 - if (Widget.current) { - if (vm instanceof BI.Model) { - const watchers = []; - if (isKey(watch)) { - const k = watch; - watch = {}; - watch[k] = handler; - } - for (const key in watch) { - const innerHandler = watch[key]; - if (isArray(handler)) { - for (let i = 0; i < handler.length; i++) { - watchers.push( - Fix.watch(vm.model, key, innerHandler, { - store: vm - }) - ); - } - } else { - watchers.push( - Fix.watch(vm.model, key, innerHandler, { - store: vm - }) - ); - } - } - // vm中一定有_widget - Widget.current._watchers || (Widget.current._watchers = []); - Widget.current._watchers = - Widget.current._watchers.concat(watchers); - - return; - } - handler = watch; - watch = vm; - Widget.current.$watchDelayCallbacks || - (Widget.current.$watchDelayCallbacks = []); - Widget.current.$watchDelayCallbacks.push([watch, handler]); - } -} - -export function onBeforeMount(beforeMount) { - if (current) { - if (current.__isMounting) { - beforeMount(); - - return; - } - if (!current.beforeMount) { - current.beforeMount = []; - } else if (!isArray(current.beforeMount)) { - current.beforeMount = [current.beforeMount]; - } - current.beforeMount.push(beforeMount); - } -} - -export function onMounted(mounted) { - if (current) { - if (current._isMounted && !this.__async) { - mounted(); - - return; - } - if (!current.mounted) { - current.mounted = []; - } else if (!isArray(current.mounted)) { - current.mounted = [current.mounted]; - } - current.mounted.push(mounted); - } -} - -export function onBeforeUnmount(beforeDestroy) { - if (current) { - if (!current.beforeDestroy) { - current.beforeDestroy = []; - } else if (!isArray(current.beforeDestroy)) { - current.beforeDestroy = [current.beforeDestroy]; - } - current.beforeDestroy.push(beforeDestroy); - } -} - -export function onUnmounted(destroyed) { - if (current) { - if (!current.destroyed) { - current.destroyed = []; - } else if (!isArray(current.destroyed)) { - current.destroyed = [current.destroyed]; - } - current.destroyed.push(destroyed); - } -} - -Widget.registerRenderEngine = function (engine) { - Widget._renderEngine = engine; -}; -Widget.registerRenderEngine({ - createElement(widget) { - if (isWidget(widget)) { - const o = widget.options; - if (o.element) { - return $(o.element); - } - if (o.tagName) { - return $(document.createElement(o.tagName)); - } - - return $(document.createDocumentFragment()); - } - - return $(widget); - }, - createFragment() { - return document.createDocumentFragment(); - } -}); - -export function mount(widget, container, predicate, hydrate) { - if (hydrate === true) { - // 将widget的element元素都挂载好,并建立相互关系 - widget.element.data("__widgets", [widget]); - const res = widget._mount(true, false, false, function (w) { - each(w._children, (i, child) => { - let ws = child.element.data("__widgets"); - if (!ws) { - ws = []; - } - ws.push(child); - child.element.data("__widgets", ws); - }); - predicate && predicate.apply(this, arguments); - }); - // 将新的dom树属性(事件等)patch到已存在的dom上 - const c = Widget._renderEngine.createElement; - DOM.patchProps(widget.element, c(c(container).children()[0])); - - const triggerLifeHook = (w) => { - w.beforeMount && w.beforeMount(); - w.mounted && w.mounted(); - each(w._children, (i, child) => { - triggerLifeHook(child); - }); - }; - // 最后触发组件树生命周期函数 - triggerLifeHook(widget); - - return res; - } - if (container) { - Widget._renderEngine.createElement(container).append(widget.element); - } - - return widget._mount(true, false, false, predicate); -} diff --git a/src/core/5.inject.js b/src/core/5.inject.js deleted file mode 100644 index 7cad97339..000000000 --- a/src/core/5.inject.js +++ /dev/null @@ -1,527 +0,0 @@ -import { isFunction, isNull, isNotNull, isArray, each, isWidget, extend, init, isEmpty, remove } from "./2.base"; -import { OB } from "./3.ob"; -import { Widget } from "./4.widget"; -import { Plugin } from "./6.plugin"; -import { aspect } from "./structure"; -import { Events } from "./constant"; -import { _global } from "./0.foundation"; - -const moduleInjection = {}, moduleInjectionMap = { - components: {}, - constants: {}, - stores: {}, - services: {}, - models: {}, - providers: {}, -}; - -export function module(xtype, cls) { - if (isNotNull(moduleInjection[xtype])) { - _global.console && console.error(`module: [${xtype}] 已经注册过了`); - } else { - if (isFunction(cls)) { - cls = cls(); - } - for (const k in moduleInjectionMap) { - if (cls[k]) { - for (const key in cls[k]) { - if (!moduleInjectionMap[k]) { - continue; - } - if (!moduleInjectionMap[k][key]) { - moduleInjectionMap[k][key] = []; - } - moduleInjectionMap[k][key].push({ - version: cls[k][key], - moduleId: xtype, - }); - } - } - } - moduleInjection[xtype] = cls; - } - - return () => Modules.getModule(xtype); -} - -const constantInjection = {}; -export function constant(xtype, cls) { - if (isNotNull(constantInjection[xtype])) { - _global.console && console.error(`constant: [${xtype}]已经注册过了`); - } else { - constantInjection[xtype] = cls; - } - - return () => Constants.getConstant(xtype); -} - -const modelInjection = {}; -export function model(xtype, cls) { - if (isNotNull(modelInjection[xtype])) { - _global.console && console.error(`model: [${xtype}] 已经注册过了`); - } else { - modelInjection[xtype] = cls; - } - - return config => Models.getModel(xtype, config); -} - -const storeInjection = {}; -export function store(xtype, cls) { - if (isNotNull(storeInjection[xtype])) { - _global.console && console.error(`store: [${xtype}] 已经注册过了`); - } else { - storeInjection[xtype] = cls; - } - - return config => Stores.getStore(xtype, config); -} - -const serviceInjection = {}; -export function service(xtype, cls) { - if ((serviceInjection[xtype])) { - _global.console && console.error(`service: [${xtype}] 已经注册过了`); - } - - serviceInjection[xtype] = cls; - - return config => Services.getService(xtype, config); -} - -const providerInjection = {}; -export function provider(xtype, cls) { - if ((providerInjection[xtype])) { - _global.console && console.error(`provider: [${xtype}] 已经注册过了`); - } else { - providerInjection[xtype] = cls; - } - - return config => Providers.getProvider(xtype, config); -} - -const configFunctions = OB.configFunctions = {}; -const runConfigFunction = (type, configFn) => { - if (!type || !configFunctions[type]) { - return false; - } - - let queue = []; - if (configFn) { - queue = configFunctions[type].filter(conf => conf.fn === configFn); - configFunctions[type] = configFunctions[type].filter(conf => conf.fn !== configFn); - } else { - queue = configFunctions[type]; - delete configFunctions[type]; - } - - const dependencies = Providers.getProvider("bi.provider.system").getDependencies(); - const modules = moduleInjectionMap.components[type] - || moduleInjectionMap.constants[type] - || moduleInjectionMap.services[type] - || moduleInjectionMap.stores[type] - || moduleInjectionMap.models[type] - || moduleInjectionMap.providers[type]; - for (let i = 0; i < queue.length; i++) { - const conf = queue[i]; - const version = conf.opt.version; - const fn = conf.fn; - if (modules && version) { - let findVersion = false; - let module; - for (let j = 0; j < modules.length; j++) { - module = modules[j]; - if (module && dependencies[module.moduleId] && module.version === version) { - const minVersion = dependencies[module.moduleId].minVersion, - maxVersion = dependencies[module.moduleId].maxVersion; - if (minVersion && (moduleInjection[module.moduleId].version || version) < minVersion) { - findVersion = true; - break; - } - if (maxVersion && (moduleInjection[module.moduleId].version || version) > maxVersion) { - findVersion = true; - break; - } - } - } - if (findVersion === true) { - _global.console && console.error(`moduleId: [${module.moduleId}] 接口: [${type}] 接口版本: [${version}] 已过期,版本要求为:`, dependencies[module.moduleId], "=>", moduleInjection[module.moduleId]); - continue; - } - } - if (constantInjection[type]) { - constantInjection[type] = fn(constantInjection[type]); - continue; - } - if (providerInjection[type]) { - if (!providers[type]) { - providers[type] = new providerInjection[type](); - } - if (providerInstance[type]) { - delete providerInstance[type]; - } - fn(providers[type]); - continue; - } - Plugin.configWidget(type, fn, conf.opt); - } -}; - -export function config(type, configFn, opt) { - if (isFunction(type)) { - opt = configFn; - configFn = type; - type = "bi.provider.system"; - } - opt = opt || {}; - - // 系统配置直接执行 - if ("bi.provider.system" === type) { - if (!providers[type]) { - providers[type] = new providerInjection[type](); - } - // 如果config被重新配置的话,需要删除掉之前的实例 - if (providerInstance[type]) { - delete providerInstance[type]; - } - - return configFn(providers[type]); - } - - if (!configFunctions[type]) { - configFunctions[type] = []; - } - configFunctions[type].push({ - fn: configFn, - opt, - }); - - if (opt.immediately) { - return runConfigFunction(type, configFn); - } -} - -export function getReference(type, fn) { - return Plugin.registerObject(type, fn); -} - -const actions = {}; -const globalAction = []; -export function action(type, actionFn) { - if (isFunction(type)) { - globalAction.push(type); - - return () => { - remove(globalAction, idx => globalAction.indexOf(actionFn) === idx); - }; - } - if (!actions[type]) { - actions[type] = []; - } - actions[type].push(actionFn); - - return () => { - remove(actions[type], idx => actions[type].indexOf(actionFn) === idx); - if (actions[type].length === 0) { - delete actions[type]; - } - }; -} - -const points = {}; -export function point(type, action, pointFn, after) { - if (!points[type]) { - points[type] = {}; - } - if (!points[type][action]) { - points[type][action] = {}; - } - if (!points[type][action][after ? "after" : "before"]) { - points[type][action][after ? "after" : "before"] = []; - } - points[type][action][after ? "after" : "before"].push(pointFn); -} - -export const Modules = { - getModule (type) { - if (!moduleInjection[type]) { - _global.console && console.error(`module: [${type}] 未定义`); - } - - return moduleInjection[type]; - }, - getAllModules () { - return moduleInjection; - }, -}; - -export const Constants = { - getConstant (type) { - if (isNull(constantInjection[type])) { - _global.console && console.error(`constant: [${type}] 未定义`); - } - runConfigFunction(type); - - return isFunction(constantInjection[type]) ? constantInjection[type]() : constantInjection[type]; - }, -}; - -function callPoint(inst, types) { - types = isArray(types) ? types : [types]; - each(types, (idx, type) => { - if (points[type]) { - for (const action in points[type]) { - const bfns = points[type][action].before; - if (bfns) { - aspect.before(inst, action, (function (bfns) { - return function () { - for (let i = 0, len = bfns.length; i < len; i++) { - try { - bfns[i].apply(inst, arguments); - } catch (e) { - _global.console && console.error(e); - } - } - }; - }(bfns))); - } - const afns = points[type][action].after; - if (afns) { - aspect.after(inst, action, (function (afns) { - return function () { - for (let i = 0, len = afns.length; i < len; i++) { - try { - afns[i].apply(inst, arguments); - } catch (e) { - _global.console && console.error(e); - } - } - }; - }(afns))); - } - } - } - }); -} - -export const Models = { - getModel (type, config) { - if (!modelInjection[type]) { - _global.console && console.error(`model: [${type}] 未定义`); - } - runConfigFunction(type); - const inst = new modelInjection[type](config); - inst._constructor && inst._constructor(config); - inst.mixins && callPoint(inst, inst.mixins); - callPoint(inst, type); - - return inst; - }, -}; - -const stores = {}; -export const Stores = { - getStore (type, config) { - if (!storeInjection[type]) { - _global.console && console.error(`store: [${type}] 未定义`); - } - if (stores[type]) { - return stores[type]; - } - const inst = stores[type] = new storeInjection[type](config); - inst._constructor && inst._constructor(config, () => { - delete stores[type]; - }); - callPoint(inst, type); - - return inst; - }, -}; - -const services = {}; -export const Services = { - getService: (type, config) => { - if (!serviceInjection[type]) { - _global.console && console.error(`service: [${type}] 未定义`); - } - if (services[type]) { - return services[type]; - } - services[type] = new serviceInjection[type](config); - callPoint(services[type], type); - - return services[type]; - }, -}; - -const providers = {}, - providerInstance = {}; -export const Providers = { - getProvider: (type, config) => { - if (!providerInjection[type]) { - _global.console && console.error(`provider: [${type}] 未定义`); - } - runConfigFunction(type); - if (!providers[type]) { - providers[type] = new providerInjection[type](); - } - if (!providerInstance[type] && providers[type].$get) { - providerInstance[type] = new (providers[type].$get())(config); - } - - return providerInstance[type]; - }, -}; - -export const Actions = { - runAction (type, event, config) { - each(actions[type], (i, act) => { - try { - act(event, config); - } catch (e) { - _global.console && console.error(e); - } - }); - }, - runGlobalAction () { - const args = [].slice.call(arguments); - each(globalAction, (i, act) => { - try { - act(...args); - } catch (e) { - _global.console && console.error(e); - } - }); - }, -}; - -const kv = {}; -export function shortcut(xtype, cls) { - if (isNotNull(kv[xtype])) { - _global.console && console.error(`组件: [${xtype}] 已经注册过了`); - } - if (cls) { - cls.xtype = xtype; - } - kv[xtype] = cls; -} - -export const component = shortcut; - -// 根据配置属性生成widget -const createRealWidget = (config, context, lazy) => { - const Cls = isFunction(config.type) ? config.type : kv[config.type]; - - if (!Cls) { - throw new Error(`组件: [${config.type}] 未定义`); - } - let pushed = false; - const widget = new Cls(); - widget._context = Widget.context || context; - if (!Widget.context && context) { - pushed = true; - Widget.pushContext(context); - } - callPoint(widget, config.type); - widget._initProps(config); - widget._initRoot(); - widget._constructed(); - // if (!lazy || config.element || config.root) { - widget._lazyConstructor(); - // } - pushed && Widget.popContext(); - - return widget; -}; - -export function createWidget(item, options, context, lazy) { - item || (item = {}); - if (isWidget(options)) { - context = options; - options = {}; - } else { - options || (options = {}); - } - - let el, w; - if (item.type || options.type) { - el = extend({}, options, item); - } else if (item.el && (item.el.type || options.type)) { - el = extend({}, options, item.el); - } - let elType; - if (el) { - elType = (el.type && el.type.xtype) || el.type; - runConfigFunction(elType); - } - - // 先把准备环境准备好 - init(); - - if (isEmpty(item) && isEmpty(options)) { - return createWidget({ - type: "bi.layout", - }); - } - if (isWidget(item)) { - return item; - } - if (el) { - w = Plugin.getWidget(elType, el); - const wType = (w.type && w.type.xtype) || w.type; - if (wType === elType) { - if (Plugin.hasObject(elType)) { - if (!w.listeners || isArray(w.listeners)) { - w.listeners = (w.listeners || []).concat([{ - eventName: Events.MOUNT, - action: () => { - Plugin.getObject(elType, this); - }, - }]); - } else { - w.listeners[Events.MOUNT] = [ - () => { - Plugin.getObject(elType, this); - } - ].concat(w.listeners[Events.MOUNT] || []); - } - } - - return createRealWidget(w, context, lazy); - } - - return createWidget(w, options, context, lazy); - } - if (isWidget(item.el)) { - return item.el; - } - throw new Error("组件:无法根据item创建组件", item); -} - -export function _lazyCreateWidget (item, options, context) { - return createWidget(item, options, context, true); -} - -export function createElement() { - const widget = createWidget.apply(this, arguments); - - return widget.element; -} - -export function getResource(type, config) { - if (isNotNull(constantInjection[type])) { - return Constants.getConstant(type); - } - if (modelInjection[type]) { - return Models.getModel(type, config); - } - if (storeInjection[type]) { - return Stores.getStore(type, config); - } - if (serviceInjection[type]) { - return Services.getService(type, config); - } - if (providerInjection[type]) { - return Providers.getProvider(type, config); - } - throw new Error(`未知类型: [${type}] 未定义`); -} diff --git a/src/core/controller/controller.layer.js b/src/core/controller/controller.layer.js deleted file mode 100644 index 2d24cd770..000000000 --- a/src/core/controller/controller.layer.js +++ /dev/null @@ -1,200 +0,0 @@ -/** - * 弹出层面板控制器, z-index在10w层级 - * - * Created by GUY on 2015/6/24. - */ -import { Controller } from "./0.controller"; -import { isNull, isNotNull, each, keys, isWidget, isNotEmptyString, extend, bind, uniqueId } from "../2.base"; -import { Widget } from "../4.widget"; -import { createWidget } from "../5.inject"; -import { zIndex_layer } from "../constant"; -import { DOM } from "../utils"; - -export class LayerController extends Controller { - constructor() { - super(); - this._constructor(); - } - - props = { - render: "body", - } - - init() { - this.layerManager = {}; - this.layouts = {}; - this.zindex = zIndex_layer; - } - - _initResizer() { - this.resizer = BI.Resizers.add(`layerController${uniqueId()}`, bind(this._resize, this)); - } - - _resize() { - each(this.layouts, (i, layer) => { - if (layer.element.is(":visible")) { - layer.element.trigger("__resize__"); - } - }); - } - - make(name, container, op, context) { - if (isWidget(container)) { - op = op || {}; - op.container = container; - } else { - context = op; - op = container; - } - - return this.create(name, null, op, context); - } - - create(name, from, op, context) { - isNull(this.resizer) && this._initResizer(); - if (this.has(name)) { - return this.get(name); - } - op || (op = {}); - const offset = op.offset || {}; - let w = from; - if (isWidget(from)) { - w = from.element; - } - if (isNotEmptyString(w)) { - w = Widget._renderEngine.createElement(w); - } - if (this.has(name)) { - return this.get(name); - } - const widget = createWidget((op.render || {}), extend({ - type: "bi.layout", - }, op), context); - const layout = createWidget({ - type: "bi.absolute", - invisible: true, - items: [ - { - el: widget, - left: 0, - right: 0, - top: 0, - bottom: 0, - } - ], - }, context); - createWidget({ - type: "bi.absolute", - element: op.container || this.options.render, - items: [ - { - el: layout, - left: offset.left || 0, - right: offset.right || 0, - top: offset.top || 0, - bottom: offset.bottom || 0, - } - ], - }); - if (w) { - layout.element.addClass("bi-popup-view"); - - function getComputedPosition() { - const css = { - left: w.offset().left + (offset.left || 0), - top: w.offset().top + (offset.top || 0), - width: offset.width || (w.outerWidth() - (offset.left || 0) - (offset.right || 0)) || "", - height: offset.height || (w.outerHeight() - (offset.top || 0) - (offset.bottom || 0)) || "", - }; - - const { top, left, scaleY, scaleX } = DOM.getPositionRelativeContainingBlockRect(layout.element[0]); - - css.top = (css.top - top) / scaleY; - css.left = (css.left - left) / scaleX; - - return css; - } - - - layout.element.css(getComputedPosition()); - layout.element.on("__resize__", () => { - w.is(":visible") && - layout.element.css(getComputedPosition()); - }); - } - this.add(name, widget, layout); - - return widget; - } - - show(name, callback) { - if (!this.has(name)) { - return this; - } - this._getLayout(name).visible(); - this._getLayout(name).element.css("z-index", this.zindex++).show(0, callback).trigger("__resize__"); - - return this; - } - - hide(name, callback) { - if (!this.has(name)) { - return this; - } - this._getLayout(name).invisible(); - this._getLayout(name).element.hide(0, callback); - - return this; - } - - isVisible(name) { - return this.has(name) && this._getLayout(name).isVisible(); - } - - add(name, layer, layout) { - if (this.has(name)) { - throw new Error("不能创建同名的Layer"); - } - layout.setVisible(false); - this.layerManager[name] = layer; - this.layouts[name] = layout; - layout.element.css("z-index", this.zindex++); - - return this; - } - - _getLayout(name) { - return this.layouts[name]; - } - - get(name) { - return this.layerManager[name]; - } - - has(name) { - return isNotNull(this.layerManager[name]); - } - - remove(name) { - if (!this.has(name)) { - return this; - } - this.layerManager[name].destroy(); - this.layouts[name].destroy(); - delete this.layerManager[name]; - delete this.layouts[name]; - - return this; - } - - removeAll() { - each(keys(this.layerManager), (index, name) => { - this.layerManager[name].destroy(); - this.layouts[name].destroy(); - }); - this.layerManager = {}; - this.layouts = {}; - - return this; - } -} diff --git a/src/core/index.js b/src/core/index.js deleted file mode 100644 index 134ab617d..000000000 --- a/src/core/index.js +++ /dev/null @@ -1,43 +0,0 @@ -export { Plugin } from "./6.plugin"; -export { StyleLoaderManager } from "./loader/loader.style"; -export { ShowListener } from "./listener/listener.show"; -export { useInWorker } from "./worker"; -export { Element } from "./element"; - -export { Controller } from "./controller/0.controller"; -export { BroadcastController } from "./controller/controller.broadcast"; -export { BubblesController } from "./controller/controller.bubbles"; -export { DrawerController } from "./controller/controller.drawer"; -export { LayerController } from "./controller/controller.layer"; -export { MaskersController } from "./controller/controller.masker"; -export { PopoverController } from "./controller/controller.popover"; -export { ResizeController } from "./controller/controller.resizer"; -export { TooltipsController } from "./controller/controller.tooltips"; - -export * from "./2.base"; -export * from "./3.ob"; -export * from "./4.widget"; - -export * from "./5.inject"; -export * from "./6.plugin"; -export * from "./system"; -export * from "./action"; -// export * from "./behavior"; -// export * from "./controller"; -export * from "./func"; -export * from "./structure"; -export * from "./h"; -export * from "./constant"; -export * from "./logic"; -export * from "./wrapper"; -export * from "./platform/web"; -export * from "./utils"; - - -export { shortcut, provider } from "./decorator"; - -import _ from "./1.lodash"; - -export { - _ -}; diff --git a/src/core/system.js b/src/core/system.js deleted file mode 100644 index 9ec00cc69..000000000 --- a/src/core/system.js +++ /dev/null @@ -1,154 +0,0 @@ -/** - * @author windy - * @version 2.0 - * Created by windy on 2021/6/30 - */ -import { prepares } from "./0.foundation"; -import { deepExtend, extend } from "./2.base"; -import { OB } from "./3.ob"; -import { Providers } from "./5.inject"; -import { provider } from "./decorator"; -import { isIE as checkIE } from "./platform/web"; - -// 系统参数常量 -const system = { - dependencies: {}, - layoutOptimize: false, - responsiveMode: false, - workerMode: false, - size: { - // 尺寸 - // 通用尺寸 - TOOL_BAR_HEIGHT: 24, - LIST_ITEM_HEIGHT: 24, - TRIGGER_HEIGHT: 24, - TOAST_TOP: 10, - H_GAP_SIZE: "M", - V_GAP_SIZE: "S", - }, - loadingCreator(config) { - const loadingSize = (config ? config.loadingSize : "small") || "small"; - - const isIE = checkIE(); - - function getSize(v) { - return Math.ceil(v / (loadingSize === "small" ? 2 : 1)); - } - - return { - type: "bi.horizontal", - cls: `bi-loading-widget${isIE ? " wave-loading hack" : ""}`, - height: getSize(60), - width: getSize(60), - hgap: getSize(10), - vgap: 2.5, - items: isIE ? [] : [{ - type: "bi.layout", - cls: "animate-rect rect1", - height: getSize(50), - width: getSize(5), - }, { - type: "bi.layout", - cls: "animate-rect rect2", - height: getSize(50), - width: getSize(5), - }, { - type: "bi.layout", - cls: "animate-rect rect3", - height: getSize(50), - width: getSize(5), - }], - }; - }, -}; - -// 具体尺寸还没定,先写着 -const sizeMap = { - S: 10, - M: 20, - L: 24, -}; - -class SystemProviderOB extends OB { - getSize () { - const size = system.size; - const H_GAP_SIZE = sizeMap[size.H_GAP_SIZE]; - const V_GAP_SIZE = sizeMap[size.V_GAP_SIZE]; - - return extend({}, size, { - H_GAP_SIZE, - V_GAP_SIZE, - }); - } - - getResponsiveMode () { - return system.responsiveMode; - } - - getWorkerMode () { - return system.workerMode; - } - - getLayoutOptimize () { - return system.layoutOptimize; - } - - getDependencies () { - return system.dependencies; - } - - getLoading(config) { - return system.loadingCreator(config); - } -} - -@provider() -export class SystemProvider { - static xtype = "bi.provider.system"; - - SYSTEM = system; - - setSize(opt) { - deepExtend(system, { size: opt }); - } - - setResponsiveMode(mode) { - system.responsiveMode = !!mode; - } - - setWorkerMode(mode) { - system.workerMode = !!mode; - } - - setLayoutOptimize(layoutOptimize) { - system.layoutOptimize = layoutOptimize; - } - - addDependency(moduleId, minVersion, maxVersion) { - system.dependencies[moduleId] = { - min: minVersion, - max: maxVersion, - }; - } - - addDependencies(moduleConfig) { - extend(system.dependencies, moduleConfig); - } - - setLoadingCreator = function(creator) { - system.loadingCreator = creator; - }; - - $get() { - return SystemProviderOB; - } -} - -export const SIZE_CONSANTS = {}; -// 不再增加线型的配置了,之后不维护前置版本直接删掉,都用实线连接线 -export const STYLE_CONSTANTS = {}; - -prepares.push(() => { - extend(SIZE_CONSANTS, Providers.getProvider("bi.provider.system").getSize()); - STYLE_CONSTANTS.LINK_LINE_TYPE = SIZE_CONSANTS.LIST_ITEM_HEIGHT === 24 ? "dashed" : "solid"; -}); diff --git a/src/core/utils/dom.js b/src/core/utils/dom.js deleted file mode 100644 index 390a0100b..000000000 --- a/src/core/utils/dom.js +++ /dev/null @@ -1,787 +0,0 @@ -/** - * 对DOM操作的通用函数 - */ -import { each, isEmpty, isNull } from "../2.base"; -import $ from "jquery"; - -export function ready(fn) { - BI.Widget._renderEngine.createElement(document).ready(fn); -} - -export function patchProps(fromElement, toElement) { - const elemData = $._data(fromElement[0]); - const events = elemData.events; - each(events, (eventKey, event) => { - each(event, (i, handler) => { - toElement.on(eventKey + (handler.namespace ? (`.${handler.namespace}`) : ""), handler); - }); - }); - const fromChildren = fromElement.children(), toChildren = toElement.children(); - if (fromChildren.length !== toChildren.length) { - throw new Error("不匹配"); - } - each(fromChildren, (i, child) => { - patchProps($(child), $(toChildren[i])); - }); - each(fromElement.data("__widgets"), (i, widget) => { - widget.element = toElement; - }); -} - -/** - * 把dom数组或元素悬挂起来,使其不对html产生影响 - * @param dom - */ -export function hang(doms) { - if (isEmpty(doms)) { - return; - } - const frag = BI.Widget._renderEngine.createFragment(); - each(doms, (i, dom) => { - dom instanceof BI.Widget && (dom = dom.element); - dom instanceof $ && dom[0] && frag.appendChild(dom[0]); - }); - - return frag; -} - -export function isExist(obj) { - return BI.Widget._renderEngine.createElement("body").find(obj.element).length > 0; -} - -// 预加载图片 -export function preloadImages(srcArray, onload) { - let count = 0; - const images = []; - - function complete() { - count++; - if (count >= srcArray.length) { - onload(); - } - } - - each(srcArray, (i, src) => { - images[i] = new Image(); - images[i].src = src; - images[i].onload = function () { - complete(); - }; - images[i].onerror = function () { - complete(); - }; - }); -} - -export function getTextSizeWidth(text, fontSize = 12) { - const span = BI.Widget._renderEngine.createElement("").addClass("text-width-span").appendTo("body"); - - fontSize = `${fontSize}px`; - - span.css("font-size", fontSize).text(text); - - const width = span.width(); - span.remove(); - - return width; -} - -export function getTextSizeHeight(text, fontSize = 12) { - const span = BI.Widget._renderEngine.createElement("").addClass("text-width-span").appendTo("body"); - - fontSize = `${fontSize}px`; - - span.css("font-size", fontSize).text(text); - - const height = span.height(); - span.remove(); - - return height; -} - -// 获取滚动条的宽度,页面display: none时候获取到的为0 -let _scrollWidth = null; - -export function getScrollWidth() { - if (isNull(_scrollWidth) || _scrollWidth === 0) { - const ul = BI.Widget._renderEngine.createElement("
").width(50).height(50) - .css({ - position: "absolute", - top: "-9999px", - overflow: "scroll", - }) - .appendTo("body"); - _scrollWidth = ul[0].offsetWidth - ul[0].clientWidth; - ul.destroy(); - } - - return _scrollWidth; -} - -export function getImage(param, fillStyle, backgroundColor) { - const canvas = document.createElement("canvas"); - const ratio = 2; - BI.Widget._renderEngine.createElement("body").append(canvas); - - const ctx = canvas.getContext("2d"); - ctx.font = "12px Helvetica Neue,Arial,PingFang SC,Hiragino Sans GB,Microsoft YaHei,微软雅黑,Heiti,黑体,sans-serif"; - const w = ctx.measureText(param).width + 4; - canvas.width = w * ratio; - canvas.height = 16 * ratio; - ctx.font = `${12 * ratio}px Helvetica Neue,Arial,PingFang SC,Hiragino Sans GB,Microsoft YaHei,微软雅黑,Heiti,黑体,sans-serif`; - ctx.fillStyle = fillStyle || "#3685f2"; - ctx.textBaseline = "middle"; - // ctx.fillStyle = "#EAF2FD"; - ctx.fillText(param, 2 * ratio, 9 * ratio); - BI.Widget._renderEngine.createElement(canvas).destroy(); - const backColor = backgroundColor || "rgba(54, 133, 242, 0.1)"; - - // IE可以放大缩小所以要固定最大最小宽高 - return { - width: w, - height: 16, - src: canvas.toDataURL("image/png"), - style: `background-color: ${backColor};vertical-align: middle; margin: 0 1px; width:${w}px;height: 16px; max-width:${w}px;max-height: 16px; min-width:${w}px;min-height: 16px`, - param, - }; -} - -export function getLeftPosition(combo, popup, extraWidth, container) { - const el = combo.element; - const popupEl = popup.element; - const elRect = el[0].getBoundingClientRect(); - const popupElRect = popupEl[0].getBoundingClientRect(); - const containerRect = container ? container.getBoundingClientRect() : { left: 0 }; - - return { - left: elRect.left - containerRect.left - popupElRect.width - (extraWidth || 0), - }; -} - -export function getInnerLeftPosition(combo, popup, extraWidth) { - return { - left: combo.element.offset().left + (extraWidth || 0), - }; -} - -export function getRightPosition(combo, popup, extraWidth, container) { - const el = combo.element; - const elRect = el[0].getBoundingClientRect(); - const containerRect = container ? container.getBoundingClientRect() : { left: 0 }; - - return { - left: elRect.left + elRect.width - containerRect.left + (extraWidth || 0), - }; -} - -export function getInnerRightPosition(combo, popup, extraWidth) { - const el = combo.element, viewBounds = popup.element.bounds(); - - return { - left: el.offset().left + el.outerWidth() - viewBounds.width - (extraWidth || 0), - }; -} - -export function getTopPosition(combo, popup, extraHeight, container) { - const el = combo.element; - const popupEl = popup.element; - const elRect = el[0].getBoundingClientRect(); - const popupElRect = popupEl[0].getBoundingClientRect(); - const containerRect = container ? container.getBoundingClientRect() : { top: 0 }; - - return { - top: elRect.top - containerRect.top - popupElRect.height - (extraHeight || 0), - }; -} - -export function getBottomPosition(combo, popup, extraHeight, container) { - const el = combo.element; - const elRect = el[0].getBoundingClientRect(); - const containerRect = container ? container.getBoundingClientRect() : { top: 0 }; - - return { - top: elRect.top - containerRect.top + elRect.height + (extraHeight || 0), - }; -} - -export function isLeftSpaceEnough(combo, popup, extraWidth) { - return getLeftPosition(combo, popup, extraWidth).left >= 0; -} - -export function isInnerLeftSpaceEnough(combo, popup, extraWidth) { - const viewBounds = popup.element.bounds(), - windowBounds = BI.Widget._renderEngine.createElement("body").bounds(); - - return getInnerLeftPosition(combo, popup, extraWidth).left + viewBounds.width <= windowBounds.width; -} - -export function isRightSpaceEnough(combo, popup, extraWidth) { - const viewBounds = popup.element[0].getBoundingClientRect(), - viewportBounds = document.documentElement.getBoundingClientRect(); - - return getRightPosition(combo, popup, extraWidth).left + viewBounds.width <= viewportBounds.width; -} - -export function isInnerRightSpaceEnough(combo, popup, extraWidth) { - return getInnerRightPosition(combo, popup, extraWidth).left >= 0; -} - -export function isTopSpaceEnough(combo, popup, extraHeight) { - return getTopPosition(combo, popup, extraHeight).top >= 0; -} - -export function isBottomSpaceEnough(combo, popup, extraHeight) { - const viewBounds = popup.element[0].getBoundingClientRect(), - viewportBounds = document.documentElement.getBoundingClientRect(); - - return getBottomPosition(combo, popup, extraHeight).top + viewBounds.height <= viewportBounds.height; -} - -export function isRightSpaceLarger(combo) { - const comboBounds = combo.element[0].getBoundingClientRect(), - viewportBounds = document.documentElement.getBoundingClientRect(); - - return viewportBounds.width - comboBounds.right >= comboBounds.left; -} - -export function isBottomSpaceLarger(combo) { - const comboBounds = combo.element[0].getBoundingClientRect(), - viewportBounds = document.documentElement.getBoundingClientRect(); - - return viewportBounds.height - comboBounds.bottom >= comboBounds.top; -} - -export function _getLeftAlignPosition(combo, popup, extraWidth, container) { - const comboRect = combo.element[0].getBoundingClientRect(), - popupRect = popup.element[0].getBoundingClientRect(), - viewportRect = document.documentElement.getBoundingClientRect(), - containerRect = container ? container.getBoundingClientRect() : { left: 0 }; - let left = comboRect.left - containerRect.left + extraWidth; - - if (comboRect.left + popupRect.width > viewportRect.width) { - left = viewportRect.width - popupRect.width - containerRect.left; - } - - return left; -} - -export function getLeftAlignPosition(combo, popup, extraWidth, container) { - let left = _getLeftAlignPosition(combo, popup, extraWidth, container); - let dir = ""; - // 如果放不下,优先使用RightAlign, 如果RightAlign也放不下, 再使用left=0 - const containerRect = container ? container.getBoundingClientRect() : { left: 0 }; - if (left + containerRect.left < 0) { - left = _getRightAlignPosition(combo, popup, extraWidth); - dir = "left"; - } - if (left + containerRect.left < 0) { - left = 0 - containerRect.left; - } - - return { - left, - dir: dir || "right", - }; -} - -export function getLeftAdaptPosition(combo, popup, extraWidth, container) { - if (isLeftSpaceEnough(combo, popup, extraWidth, container)) { - return getLeftPosition(combo, popup, extraWidth, container); - } - - return { - left: 0, - }; -} - -export function _getRightAlignPosition(combo, popup, extraWidth, container) { - const comboBounds = combo.element[0].getBoundingClientRect(), - viewBounds = popup.element[0].getBoundingClientRect(), - containerRect = container ? container.getBoundingClientRect() : { left: 0 }; - - return comboBounds.left + comboBounds.width - viewBounds.width - extraWidth - containerRect.left; -} - -export function getRightAlignPosition(combo, popup, extraWidth, container) { - let left = _getRightAlignPosition(combo, popup, extraWidth, container); - let dir = ""; - // 如果放不下,优先使用LeftAlign, 如果LeftAlign也放不下, 再使用left=0 - if (left < 0) { - left = _getLeftAlignPosition(combo, popup, extraWidth, container); - dir = "right"; - } - if (left < 0) { - left = 0; - } - - return { - left, - dir: dir || "left", - }; -} - -export function getRightAdaptPosition(combo, popup, extraWidth, container) { - if (isRightSpaceEnough(combo, popup, extraWidth, container)) { - return getRightPosition(combo, popup, extraWidth, container); - } - - return { - left: document.documentElement.getBoundingClientRect().width - popup.element[0].getBoundingClientRect().width - container.getBoundingClientRect().left, - }; -} - -export function getTopAlignPosition(combo, popup, extraHeight, needAdaptHeight, container) { - const comboBounds = combo.element[0].getBoundingClientRect(), - popupBounds = popup.element[0].getBoundingClientRect(), - viewportBounds = document.documentElement.getBoundingClientRect(), - containerBounds = container ? container.getBoundingClientRect() : { top: 0 }; - let top, adaptHeight, dir; - if (isBottomSpaceEnough(combo, popup, -1 * comboBounds.height + extraHeight)) { - top = comboBounds.top - containerBounds.top + extraHeight; - } else if (needAdaptHeight) { - top = comboBounds.top - containerBounds.top + extraHeight; - adaptHeight = viewportBounds.height - comboBounds.top; - } else if (isTopSpaceEnough(combo, popup, -1 * comboBounds.height + extraHeight)) { - // 下方空间不足且不允许调整高度的情况下,优先使用上对齐 - top = comboBounds.top + comboBounds.height - popupBounds.height - containerBounds.top - extraHeight; - dir = "top"; - } else { - top = viewportBounds.height - popupBounds.height; - if (top < extraHeight) { - adaptHeight = viewportBounds.height - extraHeight; - } - } - if (top < extraHeight) { - top = extraHeight; - } - - return adaptHeight ? { - top, - adaptHeight, - dir: dir || "bottom", - } : { - top, - dir: dir || "bottom", - }; -} - -export function getTopAdaptPosition(combo, popup, extraHeight, needAdaptHeight, positionRelativeElement) { - const comboBounds = combo.element[0].getBoundingClientRect(), - popupBounds = popup.element[0].getBoundingClientRect(), - positionRelativeElementRect = positionRelativeElement.getBoundingClientRect(), - viewportBounds = document.documentElement.getBoundingClientRect(); - if (isTopSpaceEnough(combo, popup, extraHeight)) { - return getTopPosition(combo, popup, extraHeight); - } - if (needAdaptHeight) { - return { - top: 0 - positionRelativeElementRect.top, - adaptHeight: comboBounds.top - extraHeight, - }; - } - if (popupBounds.height + extraHeight > viewportBounds.height) { - return { - top: 0 - positionRelativeElementRect.top, - adaptHeight: viewportBounds.height - extraHeight, - }; - } - - return { - top: 0 - positionRelativeElementRect.top, - }; -} - -export function getBottomAlignPosition(combo, popup, extraHeight, needAdaptHeight, container) { - const comboBounds = combo.element[0].getBoundingClientRect(), - popupBounds = popup.element[0].getBoundingClientRect(), - windowBounds = BI.Widget._renderEngine.createElement("body").bounds(), - containerBounds = container ? container.getBoundingClientRect() : { top: 0 }; - let top, adaptHeight, dir; - if (isTopSpaceEnough(combo, popup, -1 * comboBounds.height + extraHeight)) { - top = comboBounds.top + comboBounds.height - containerBounds.top - popupBounds.height; - } else if (needAdaptHeight) { - top = 0 - containerBounds.top; - adaptHeight = comboBounds.top + comboBounds.height - extraHeight; - } else if (isBottomSpaceEnough(combo, popup, -1 * comboBounds.height + extraHeight)) { - // 上方空间不足且不允许调整高度的情况下,优先使用下对齐 - top = comboBounds.top - containerBounds.top + extraHeight; - dir = "bottom"; - } else { - top = 0; - if (popupBounds.height + extraHeight > windowBounds.height) { - adaptHeight = windowBounds.height - extraHeight; - } - } - if (top + containerBounds.top < 0) { - top = 0; - } - - return adaptHeight ? { - top, - adaptHeight, - dir: dir || "top", - } : { - top, - dir: dir || "top", - }; -} - -export function getBottomAdaptPosition(combo, popup, extraHeight, needAdaptHeight, positionRelativeElement) { - const comboBounds = combo.element[0].getBoundingClientRect(), - popupBounds = popup.element[0].getBoundingClientRect(), - viewportBounds = document.documentElement.getBoundingClientRect(), - positionRelativeElementRect = positionRelativeElement.getBoundingClientRect(); - if (isBottomSpaceEnough(combo, popup, extraHeight)) { - return getBottomPosition(combo, popup, extraHeight, positionRelativeElement); - } - if (needAdaptHeight) { - return { - top: comboBounds.top + comboBounds.height + extraHeight - positionRelativeElementRect.top, - adaptHeight: viewportBounds.height - comboBounds.top - comboBounds.height - extraHeight, - }; - } - if (popupBounds.height + extraHeight > viewportBounds.height) { - return { - top: extraHeight - positionRelativeElementRect.top, - adaptHeight: viewportBounds.height - extraHeight, - }; - } - - return { - top: viewportBounds.height - popupBounds.height - extraHeight - positionRelativeElementRect.top, - }; -} - -export function getCenterAdaptPosition(combo, popup, positionRelativeElement) { - const comboRect = combo.element[0].getBoundingClientRect(), - popupRect = popup.element[0].getBoundingClientRect(), - positionRelativeElementRect = positionRelativeElement.getBoundingClientRect(), - viewportBounds = document.documentElement.getBoundingClientRect(); - let left; - if (comboRect.left + comboRect.width / 2 + popupRect.width / 2 > viewportBounds.width) { - left = viewportBounds.width - popupRect.width - positionRelativeElementRect.left; - } else { - left = comboRect.left + (comboRect.width - popupRect.width) / 2 - positionRelativeElementRect.left; - } - if (left + positionRelativeElementRect.left < 0) { - left = 0; - } - - return { - left, - }; -} - -export function getMiddleAdaptPosition(combo, popup, positionRelativeElement) { - const comboRect = combo.element[0].getBoundingClientRect(), - popupRect = popup.element[0].getBoundingClientRect(), - positionRelativeElementRect = positionRelativeElement.getBoundingClientRect(), - viewportBounds = document.documentElement.getBoundingClientRect(); - - let top; - if (comboRect.top + comboRect.height / 2 + popupRect.height / 2 > viewportBounds.height) { - top = viewportBounds.height - popupRect.height - positionRelativeElementRect.top; - } else { - top = comboRect.top + (comboRect.height - popupRect.height) / 2 - positionRelativeElementRect.top; - } - if (top + positionRelativeElementRect.top < 0) { - top = 0; - } - - return { - top, - }; -} - -export function getComboPositionByDirections(combo, popup, extraWidth, extraHeight, needAdaptHeight, directions, container) { - extraWidth || (extraWidth = 0); - extraHeight || (extraHeight = 0); - let i, direct; - const leftRight = [], topBottom = [], innerLeftRight = []; - let isNeedAdaptHeight = false, tbFirst = false, lrFirst = false; - let left, top, pos, firstDir = directions[0]; - for (i = 0; i < directions.length; i++) { - direct = directions[i]; - switch (direct) { - case "left": - leftRight.push(direct); - break; - case "right": - leftRight.push(direct); - break; - case "top": - topBottom.push(direct); - break; - case "bottom": - topBottom.push(direct); - break; - case "innerLeft": - innerLeftRight.push(direct); - break; - case "innerRight": - innerLeftRight.push(direct); - break; - default: - break; - } - } - for (i = 0; i < directions.length; i++) { - let tW, tH; - direct = directions[i]; - switch (direct) { - case "left": - if (!isNeedAdaptHeight) { - tW = tbFirst ? extraHeight : extraWidth, tH = tbFirst ? 0 : extraHeight; - if (isLeftSpaceEnough(combo, popup, tW)) { - left = getLeftPosition(combo, popup, tW, container).left; - if (topBottom[0] === "bottom") { - pos = getTopAlignPosition(combo, popup, tH, needAdaptHeight, container); - } else { - pos = getBottomAlignPosition(combo, popup, tH, needAdaptHeight, container); - } - pos.dir = `left,${pos.dir}`; - if (tbFirst) { - pos.change = "left"; - } - pos.left = left; - - return pos; - } - } - lrFirst = true; - break; - case "right": - if (!isNeedAdaptHeight) { - tW = tbFirst ? extraHeight : extraWidth, tH = tbFirst ? extraWidth : extraHeight; - if (isRightSpaceEnough(combo, popup, tW)) { - left = getRightPosition(combo, popup, tW, container).left; - if (topBottom[0] === "bottom") { - pos = getTopAlignPosition(combo, popup, tH, needAdaptHeight, container); - } else { - pos = getBottomAlignPosition(combo, popup, tH, needAdaptHeight, container); - } - pos.dir = `right,${pos.dir}`; - if (tbFirst) { - pos.change = "right"; - } - pos.left = left; - - return pos; - } - } - lrFirst = true; - break; - case "top": - tW = lrFirst ? extraHeight : extraWidth, tH = lrFirst ? extraWidth : extraHeight; - if (isTopSpaceEnough(combo, popup, tH)) { - top = getTopPosition(combo, popup, tH, container).top; - if (leftRight[0] === "right") { - pos = getLeftAlignPosition(combo, popup, tW, container); - } else { - pos = getRightAlignPosition(combo, popup, tW, container); - } - pos.dir = `top,${pos.dir}`; - if (lrFirst) { - pos.change = "top"; - } - pos.top = top; - - return pos; - } - if (needAdaptHeight) { - isNeedAdaptHeight = true; - } - tbFirst = true; - break; - case "bottom": - tW = lrFirst ? extraHeight : extraWidth, tH = lrFirst ? extraWidth : extraHeight; - if (isBottomSpaceEnough(combo, popup, tH)) { - top = getBottomPosition(combo, popup, tH, container).top; - if (leftRight[0] === "right") { - pos = getLeftAlignPosition(combo, popup, tW, container); - } else { - pos = getRightAlignPosition(combo, popup, tW, container); - } - pos.dir = `bottom,${pos.dir}`; - if (lrFirst) { - pos.change = "bottom"; - } - pos.top = top; - - return pos; - } - if (needAdaptHeight) { - isNeedAdaptHeight = true; - } - tbFirst = true; - break; - case "innerLeft": - if (!isNeedAdaptHeight) { - tW = tbFirst ? extraHeight : extraWidth, tH = tbFirst ? 0 : extraHeight; - if (isInnerLeftSpaceEnough(combo, popup, tW)) { - left = getInnerLeftPosition(combo, popup, tW).left; - if (topBottom[0] === "bottom") { - pos = getTopAlignPosition(combo, popup, tH, needAdaptHeight); - } else { - pos = getBottomAlignPosition(combo, popup, tH, needAdaptHeight); - } - pos.dir = `innerLeft,${pos.dir}`; - if (tbFirst) { - pos.change = "innerLeft"; - } - pos.left = left; - - return pos; - } - } - lrFirst = true; - break; - case "innerRight": - if (!isNeedAdaptHeight) { - tW = tbFirst ? extraHeight : extraWidth, tH = tbFirst ? extraWidth : extraHeight; - if (isInnerRightSpaceEnough(combo, popup, tW)) { - left = getInnerRightPosition(combo, popup, tW).left; - if (topBottom[0] === "bottom") { - pos = getTopAlignPosition(combo, popup, tH, needAdaptHeight); - } else { - pos = getBottomAlignPosition(combo, popup, tH, needAdaptHeight); - } - pos.dir = `innerLeft,${pos.dir}`; - if (tbFirst) { - pos.change = "innerRight"; - } - pos.left = left; - - return pos; - } - } - break; - default: - break; - } - } - - // 此处为四个方向放不下时挑空间最大的方向去放置, 也就是说我设置了弹出方向为"bottom,left", - // 最后发现实际弹出方向可能是"top,left",那么此时外界获取popup的方向应该是"top,left" - switch (directions[0]) { - case "left": - case "right": - if (isRightSpaceLarger(combo)) { - left = getRightAdaptPosition(combo, popup, extraWidth, container).left; - firstDir = "right"; - } else { - left = getLeftAdaptPosition(combo, popup, extraWidth, container).left; - firstDir = "left"; - } - if (topBottom[0] === "bottom") { - pos = getTopAlignPosition(combo, popup, extraHeight, needAdaptHeight); - pos.left = left; - pos.dir = `${firstDir},${pos.dir}`; - - return pos; - } - pos = getBottomAlignPosition(combo, popup, extraHeight, needAdaptHeight); - pos.left = left; - pos.dir = `${firstDir},${pos.dir}`; - - return pos; - default : - if (isBottomSpaceLarger(combo)) { - top = getBottomAdaptPosition(combo, popup, extraHeight, needAdaptHeight, container).top; - firstDir = "bottom"; - } else { - top = getTopAdaptPosition(combo, popup, extraHeight, needAdaptHeight, container).top; - firstDir = "top"; - } - if (leftRight[0] === "right") { - pos = getLeftAlignPosition(combo, popup, extraWidth, container); - pos.top = top; - pos.dir = `${firstDir},${pos.dir}`; - - return pos; - } - pos = getRightAlignPosition(combo, popup, extraWidth, container); - pos.top = top; - pos.dir = `${firstDir},${pos.dir}`; - - return pos; - } -} - - -export function getComboPosition(combo, popup, extraWidth, extraHeight, needAdaptHeight, directions, offsetStyle, positionRelativeElement) { - extraWidth || (extraWidth = 0); - extraHeight || (extraHeight = 0); - const viewportBounds = document.documentElement.getBoundingClientRect(); - const maxHeight = Math.min(popup.attr("maxHeight") || viewportBounds.height, viewportBounds.height); - popup.resetHeight && popup.resetHeight(maxHeight); - const position = getComboPositionByDirections(combo, popup, extraWidth, extraHeight, needAdaptHeight, directions || ["bottom", "top", "right", "left"], positionRelativeElement); - switch (offsetStyle) { - case "center": - if (position.change) { - const p = getMiddleAdaptPosition(combo, popup, positionRelativeElement); - position.top = p.top; - } else { - const p = getCenterAdaptPosition(combo, popup, positionRelativeElement); - position.left = p.left; - } - break; - case "middle": - if (position.change) { - const p = getCenterAdaptPosition(combo, popup, positionRelativeElement); - position.left = p.left; - } else { - const p = getMiddleAdaptPosition(combo, popup, positionRelativeElement); - position.top = p.top; - } - break; - default: - break; - } - if (needAdaptHeight === true) { - popup.resetHeight && popup.resetHeight(Math.min(viewportBounds.height - position.top - (positionRelativeElement ? positionRelativeElement.getBoundingClientRect().top : 0), maxHeight)); - } - - return position; -} - -/** - * 获取position:fixed相对定位的元素 - */ -export function getPositionRelativeContainingBlock(element) { - if (["html", "body", "#document"].indexOf((element.nodeName || "").toLowerCase()) >= 0) { - // $FlowFixMe[incompatible-return]: assume body is always available - return element.ownerDocument.body; - } - - function isExcept(node) { - const _computedStyle = getComputedStyle(node); - const transform = _computedStyle.transform; - const perspective = _computedStyle.perspective; - const filter = _computedStyle.filter; - const willChange = _computedStyle["will-change"]; - - return [transform, perspective, filter].some(value => value !== "none") || (willChange === "transform"); - } - - if (isExcept(element)) { - return element; - } - - return getPositionRelativeContainingBlock(element.parentNode); -} - -/** - * 获取position:fixed相对定位的元素的clientRect - */ -export function getPositionRelativeContainingBlockRect(element) { - const positionRelativeElement = getPositionRelativeContainingBlock(element); - const rect = positionRelativeElement.getBoundingClientRect(); - const { top, right, bottom, left, width, height, x, y } = positionRelativeElement.getBoundingClientRect(); - - return { - top, right, bottom, left, width, height, x, y, - scaleX: rect.width / positionRelativeElement.offsetWidth, - scaleY: rect.height / positionRelativeElement.offsetHeight, - }; -} diff --git a/src/core/version.js b/src/core/version.js deleted file mode 100644 index 88665e6e3..000000000 --- a/src/core/version.js +++ /dev/null @@ -1 +0,0 @@ -BI.version = "2.0"; diff --git a/src/core/wrapper/layout.js b/src/core/wrapper/layout.js deleted file mode 100644 index 66fa3f17e..000000000 --- a/src/core/wrapper/layout.js +++ /dev/null @@ -1,820 +0,0 @@ -import { isNull, isFunction, each, stripEL, keys, isArray, contains, isKey, isOdd, isWidget, isNotNull, has } from "../2.base"; -import { Widget } from "../4.widget"; -import { _lazyCreateWidget, Providers } from "../5.inject"; -import { shortcut } from "../decorator"; -import { pixFormat, Events } from "../constant"; - -/** - * 布局容器类 - * - * @cfg {JSON} options 配置属性 - * @cfg {Boolean} [options.scrollable=false] 子组件超出容器边界之后是否会出现滚动条 - * @cfg {Boolean} [options.scrollx=false] 子组件超出容器边界之后是否会出现横向滚动条 - * @cfg {Boolean} [options.scrolly=false] 子组件超出容器边界之后是否会出现纵向滚动条 - */ -@shortcut() -export class Layout extends Widget { - static xtype = "bi.layout"; - - props() { - return { - scrollable: null, // true, false, null - scrollx: false, // true, false - scrolly: false, // true, false - items: [], - innerHgap: 0, - innerVgap: 0, - }; - } - - render() { - const o = this.options; - this._init4Margin(); - this._init4Scroll(); - if (isFunction(o.columnSize)) { - const columnSizeFn = o.columnSize; - o.columnSize = this.__watch(columnSizeFn, (context, newValue) => { - o.columnSize = newValue; - this.resize(); - }); - } - if (isFunction(o.rowSize)) { - const rowSizeFn = o.rowSize; - o.rowSize = this.__watch(rowSizeFn, (context, newValue) => { - o.rowSize = newValue; - this.resize(); - }); - } - } - - _init4Margin() { - if (this.options.top) { - this.element.css("top", pixFormat(this.options.top)); - } - if (this.options.left) { - this.element.css("left", pixFormat(this.options.left)); - } - if (this.options.bottom) { - this.element.css("bottom", pixFormat(this.options.bottom)); - } - if (this.options.right) { - this.element.css("right", pixFormat(this.options.right)); - } - } - - _init4Scroll() { - switch (this.options.scrollable) { - case true: - case "xy": - this.element.css("overflow", "auto"); - - return; - case false: - this.element.css("overflow", "hidden"); - - return; - case "x": - this.element.css({ - "overflow-x": "auto", - "overflow-y": "hidden", - }); - - return; - case "y": - this.element.css({ - "overflow-x": "hidden", - "overflow-y": "auto", - }); - - return; - default : - break; - } - if (this.options.scrollx) { - this.element.css({ - "overflow-x": "auto", - "overflow-y": "hidden", - }); - - return; - } - if (this.options.scrolly) { - this.element.css({ - "overflow-x": "hidden", - "overflow-y": "auto", - }); - } - } - - appendFragment(frag) { - this.element.append(frag); - } - - _mountChildren() { - const frag = Widget._renderEngine.createFragment(); - let hasChild = false; - for (const key in this._children) { - const child = this._children[key]; - if (child.element !== this.element) { - frag.appendChild(child.element[0]); - hasChild = true; - } - } - if (hasChild === true) { - this.appendFragment(frag); - } - } - - _getChildName(index) { - return `${index}`; - } - - _addElement(i, item, context, widget) { - let w; - if (widget) { - return widget; - } - if (!this.hasWidget(this._getChildName(i))) { - w = _lazyCreateWidget(item, context); - w.on(Events.DESTROY, () => { - each(this._children, (name, child) => { - if (child === w) { - delete this._children[name]; - this.removeItemAt(name | 0); - } - }); - }); - this.addWidget(this._getChildName(i), w); - } else { - w = this.getWidgetByName(this._getChildName(i)); - } - - return w; - } - - _newElement(i, item, context) { - const w = _lazyCreateWidget(item, context); - w.on(Events.DESTROY, () => { - each(this._children, (name, child) => { - if (child === w) { - delete this._children[name]; - this.removeItemAt(name | 0); - } - }); - }); - - return this._addElement(i, item, context, w); - } - - _getOptions(item) { - if (item instanceof Widget) { - item = item.options; - } - item = stripEL(item); - if (item instanceof Widget) { - item = item.options; - } - - return item; - } - - _compare(item1, item2) { - // 不比较函数 - const eq = (a, b, aStack, bStack) => { - if (a === b) { - return a !== 0 || 1 / a === 1 / b; - } - if (isNull(a) || isNull(b)) { - return a === b; - } - const className = Object.prototype.toString.call(a); - switch (className) { - case "[object RegExp]": - case "[object String]": - return `${a}` === `${b}`; - case "[object Number]": - if (+a !== +a) { - return +b !== +b; - } - - return +a === 0 ? 1 / +a === 1 / b : +a === +b; - case "[object Date]": - case "[object Boolean]": - return +a === +b; - default: - } - - const areArrays = className === "[object Array]"; - if (!areArrays) { - if (isFunction(a) && isFunction(b)) { - return true; - } - a = this._getOptions(a); - b = this._getOptions(b); - } - - aStack = aStack || []; - bStack = bStack || []; - let length = aStack.length; - while (length--) { - if (aStack[length] === a) { - return bStack[length] === b; - } - } - - aStack.push(a); - bStack.push(b); - - if (areArrays) { - length = a.length; - if (length !== b.length) { - return false; - } - while (length--) { - if (!eq(a[length], b[length], aStack, bStack)) { - return false; - } - } - } else { - const aKeys = keys(a); - let key; - length = aKeys.length; - if (keys(b).length !== length) { - return false; - } - while (length--) { - key = aKeys[length]; - if (!(has(b, key) && eq(a[key], b[key], aStack, bStack))) { - return false; - } - } - } - aStack.pop(); - bStack.pop(); - - return true; - }; - - return eq(item1, item2); - } - - _getWrapper() { - return this.element; - } - - // 不依赖于this.options.items进行更新 - _updateItemAt(oldIndex, newIndex, item) { - const del = this._children[this._getChildName(oldIndex)]; - const w = this._newElement(newIndex, item); - // 需要有个地方临时存一下新建的组件,否则如果直接使用newIndex的话,newIndex位置的元素可能会被用到 - this._children[`${this._getChildName(newIndex)}-temp`] = w; - const nextSibling = del.element.next(); - if (nextSibling.length > 0) { - Widget._renderEngine.createElement(nextSibling).before(w.element); - } else { - w.element.appendTo(this._getWrapper()); - } - del._destroy(); - w._mount(); - - return true; - } - - _addItemAt(index, item) { - for (let i = this.options.items.length; i > index; i--) { - this._children[this._getChildName(i)] = this._children[this._getChildName(i - 1)]; - } - delete this._children[this._getChildName(index)]; - this.options.items.splice(index, 0, item); - } - - _removeItemAt(index) { - for (let i = index; i < this.options.items.length - 1; i++) { - this._children[this._getChildName(i)] = this._children[this._getChildName(i + 1)]; - } - delete this._children[this._getChildName(this.options.items.length - 1)]; - this.options.items.splice(index, 1); - } - - _clearGap(w) { - w.element.css({ - "margin-top": "", - "margin-bottom": "", - "margin-left": "", - "margin-right": "", - }); - } - - _optimiseGap(gap) { - return (gap > 0 && gap < 1) ? `${(gap * 100).toFixed(1)}%` : pixFormat(gap); - } - - _optimiseItemLgap(item) { - if (Providers.getProvider("bi.provider.system").getLayoutOptimize()) { - return ((!item.type && item.el) ? ((item._lgap || 0) + (item.lgap || 0)) : item._lgap) || 0; - } - - return (item._lgap || 0) + (item.lgap || 0); - } - _optimiseItemRgap(item) { - if (Providers.getProvider("bi.provider.system").getLayoutOptimize()) { - return ((!item.type && item.el) ? ((item._rgap || 0) + (item.rgap || 0)) : item._rgap) || 0; - } - - return (item._rgap || 0) + (item.rgap || 0); - } - _optimiseItemTgap(item) { - if (Providers.getProvider("bi.provider.system").getLayoutOptimize()) { - return ((!item.type && item.el) ? ((item._tgap || 0) + (item.tgap || 0)) : item._tgap) || 0; - } - - return (item._tgap || 0) + (item.tgap || 0); - } - _optimiseItemBgap(item) { - if (Providers.getProvider("bi.provider.system").getLayoutOptimize()) { - return ((!item.type && item.el) ? ((item._bgap || 0) + (item.bgap || 0)) : item._bgap) || 0; - } - - return (item._bgap || 0) + (item.bgap || 0); - } - _optimiseItemHgap(item) { - if (Providers.getProvider("bi.provider.system").getLayoutOptimize()) { - return ((!item.type && item.el) ? ((item._hgap || 0) + (item.hgap || 0)) : item._hgap) || 0; - } - - return (item._hgap || 0) + (item.hgap || 0); - } - _optimiseItemVgap(item) { - if (Providers.getProvider("bi.provider.system").getLayoutOptimize()) { - return ((!item.type && item.el) ? ((item._vgap || 0) + (item.vgap || 0)) : item._vgap) || 0; - } - - return (item._vgap || 0) + (item.vgap || 0); - } - - _handleGap(w, item, hIndex, vIndex) { - const o = this.options; - let innerLgap, innerRgap, innerTgap, innerBgap; - if (isNull(vIndex)) { - innerTgap = innerBgap = o.innerVgap; - innerLgap = hIndex === 0 ? o.innerHgap : 0; - innerRgap = hIndex === o.items.length - 1 ? o.innerHgap : 0; - } else { - innerLgap = innerRgap = o.innerHgap; - innerTgap = vIndex === 0 ? o.innerVgap : 0; - innerBgap = vIndex === o.items.length - 1 ? o.innerVgap : 0; - } - if (o.vgap + o.tgap + innerTgap + this._optimiseItemTgap(item) + this._optimiseItemVgap(item) !== 0) { - const top = ((isNull(vIndex) || vIndex === 0) ? o.vgap : 0) + o.tgap + innerTgap + this._optimiseItemTgap(item) + this._optimiseItemVgap(item); - w.element.css({ - "margin-top": this._optimiseGap(top), - }); - } - if (o.hgap + o.lgap + innerLgap + this._optimiseItemLgap(item) + this._optimiseItemHgap(item) !== 0) { - const left = ((isNull(hIndex) || hIndex === 0) ? o.hgap : 0) + o.lgap + innerLgap + this._optimiseItemLgap(item) + this._optimiseItemHgap(item); - w.element.css({ - "margin-left": this._optimiseGap(left), - }); - } - if (o.hgap + o.rgap + innerRgap + this._optimiseItemRgap(item) + this._optimiseItemHgap(item) !== 0) { - const right = o.hgap + o.rgap + innerRgap + this._optimiseItemRgap(item) + this._optimiseItemHgap(item); - w.element.css({ - "margin-right": this._optimiseGap(right), - }); - } - if (o.vgap + o.bgap + innerBgap + this._optimiseItemBgap(item) + this._optimiseItemVgap(item) !== 0) { - const bottom = o.vgap + o.bgap + innerBgap + this._optimiseItemBgap(item) + this._optimiseItemVgap(item); - w.element.css({ - "margin-bottom": this._optimiseGap(bottom), - }); - } - } - - // 横向换纵向 - _handleReverseGap(w, item, index) { - const o = this.options; - const innerLgap = o.innerHgap; - const innerRgap = o.innerHgap; - const innerTgap = index === 0 ? o.innerVgap : 0; - const innerBgap = index === o.items.length - 1 ? o.innerVgap : 0; - if (o.vgap + o.tgap + innerTgap + this._optimiseItemTgap(item) + this._optimiseItemVgap(item) !== 0) { - const top = (index === 0 ? o.vgap : 0) + (index === 0 ? o.tgap : 0) + innerTgap + this._optimiseItemTgap(item) + this._optimiseItemVgap(item); - w.element.css({ - "margin-top": this._optimiseGap(top), - }); - } - if (o.hgap + o.lgap + innerLgap + this._optimiseItemLgap(item) + this._optimiseItemHgap(item) !== 0) { - const left = o.hgap + o.lgap + innerLgap + this._optimiseItemLgap(item) + this._optimiseItemHgap(item); - w.element.css({ - "margin-left": this._optimiseGap(left), - }); - } - if (o.hgap + o.rgap + innerRgap + this._optimiseItemRgap(item) + this._optimiseItemHgap(item) !== 0) { - const right = o.hgap + o.rgap + innerRgap + this._optimiseItemRgap(item) + this._optimiseItemHgap(item); - w.element.css({ - "margin-right": this._optimiseGap(right), - }); - } - // 这里的代码是关键 - if (o.vgap + o.hgap + o.bgap + innerBgap + this._optimiseItemBgap(item) + this._optimiseItemVgap(item) !== 0) { - const bottom = (index === o.items.length - 1 ? o.vgap : o.hgap) + (index === o.items.length - 1 ? o.bgap : 0) + innerBgap + this._optimiseItemBgap(item) + this._optimiseItemVgap(item); - w.element.css({ - "margin-bottom": this._optimiseGap(bottom), - }); - } - } - - /** - * 添加一个子组件到容器中 - * @param {JSON/Widget} item 子组件 - */ - addItem(item) { - return this.addItemAt(this.options.items.length, item); - } - - prependItem(item) { - return this.addItemAt(0, item); - } - - addItemAt(index, item) { - if (index < 0 || index > this.options.items.length) { - return; - } - this._addItemAt(index, item); - const w = this._addElement(index, item); - // addItemAt 还是用之前的找上个兄弟节点向后插入的方式 - if (index > 0) { - this._children[this._getChildName(index - 1)].element.after(w.element); - } else { - w.element.prependTo(this._getWrapper()); - } - w._mount(); - - return w; - } - - removeItemAt(indexes) { - indexes = isArray(indexes) ? indexes : [indexes]; - const deleted = []; - const newItems = [], newChildren = {}; - for (let i = 0, len = this.options.items.length; i < len; i++) { - const child = this._children[this._getChildName(i)]; - if (contains(indexes, i)) { - child && deleted.push(child); - } else { - newChildren[this._getChildName(newItems.length)] = child; - newItems.push(this.options.items[i]); - } - } - this.options.items = newItems; - this._children = newChildren; - each(deleted, (i, c) => { - c._destroy(); - }); - } - - shouldUpdateItem(index, item) { - const child = this._children[this._getChildName(index)]; - if (!child || !child.shouldUpdate) { - return null; - } - - return child.shouldUpdate(this._getOptions(item)); - } - - addItems(items, context) { - const o = this.options; - const fragment = Widget._renderEngine.createFragment(); - const added = []; - each(items, (i, item) => { - const w = this._addElement(o.items.length, item, context); - this._children[this._getChildName(o.items.length)] = w; - o.items.push(item); - added.push(w); - fragment.appendChild(w.element[0]); - }); - if (this._isMounted) { - this._getWrapper().append(fragment); - each(added, (i, w) => { - w._mount(); - }); - } - } - - prependItems(items, context) { - items = items || []; - const fragment = Widget._renderEngine.createFragment(); - const added = []; - for (let i = items.length - 1; i >= 0; i--) { - this._addItemAt(0, items[i]); - const w = this._addElement(0, items[i], context); - this._children[this._getChildName(0)] = w; - this.options.items.unshift(items[i]); - added.push(w); - fragment.appendChild(w.element[0]); - } - if (this._isMounted) { - this._getWrapper().prepend(fragment); - each(added, (i, w) => { - w._mount(); - }); - } - } - - getValue() { - let value = [], child; - each(this.options.items, i => { - child = this._children[this._getChildName(i)]; - if (child) { - let v = child.getValue(); - v = isArray(v) ? v : [v]; - value = value.concat(v); - } - }); - - return value; - } - - setValue(v) { - let child; - each(this.options.items, i => { - child = this._children[this._getChildName(i)]; - child && child.setValue(v); - }); - } - - setText(v) { - let child; - each(this.options.items, i => { - child = this._children[this._getChildName(i)]; - child && child.setText(v); - }); - } - - patchItem(oldVnode, vnode, oldIndex, newIndex) { - const shouldUpdate = this.shouldUpdateItem(oldIndex, vnode); - const child = this._children[this._getChildName(oldIndex)]; - if (shouldUpdate) { - this._children[`${this._getChildName(newIndex)}-temp`] = child; - - return child._update(this._getOptions(vnode), shouldUpdate); - } - if (shouldUpdate === null && !this._compare(oldVnode, vnode)) { - // if (child.update) { - // return child.update(this._getOptions(vnode)); - // } - return this._updateItemAt(oldIndex, newIndex, vnode); - } - } - - updateChildren(oldCh, newCh, context) { - let oldStartIdx = 0, newStartIdx = 0; - let oldEndIdx = oldCh.length - 1; - let oldStartVnode = oldCh[0]; - let oldEndVnode = oldCh[oldEndIdx]; - let newEndIdx = newCh.length - 1; - let newStartVnode = newCh[0]; - let newEndVnode = newCh[newEndIdx]; - let before; - let updated; - const children = {}; - - const sameVnode = (vnode1, vnode2, oldIndex, newIndex) => { - vnode1 = this._getOptions(vnode1); - vnode2 = this._getOptions(vnode2); - if (isKey(vnode1.key)) { - return vnode1.key === vnode2.key; - } - if (oldIndex >= 0) { - return oldIndex === newIndex; - } - }; - - const addNode = (vnode, index, context) => { - const opt = this._getOptions(vnode); - const key = isNull(opt.key) ? index : opt.key; - children[key] = this._newElement(index, vnode, context); - - return children[key]; - }; - - const addVnodes = (before, vnodes, startIdx, endIdx, context) => { - for (; startIdx <= endIdx; ++startIdx) { - const node = addNode(vnodes[startIdx], startIdx, context); - insertBefore(node, before, false, startIdx); - } - }; - - const removeVnodes = (vnodes, startIdx, endIdx) => { - for (; startIdx <= endIdx; ++startIdx) { - const ch = vnodes[startIdx]; - if (isNotNull(ch)) { - const node = this._getOptions(ch); - const key = isNull(node.key) ? startIdx : node.key; - children[key]._destroy(); - } - } - }; - - const insertBefore = (insert, before, isNext, index) => { - insert = this._getOptions(insert); - before = before && this._getOptions(before); - const insertKey = isKey(insert.key) ? insert.key : index; - if (before && children[before.key]) { - const beforeKey = isKey(before.key) ? before.key : index; - let next; - if (isNext) { - next = children[beforeKey].element.next(); - } else { - next = children[beforeKey].element; - } - if (next.length > 0) { - next.before(children[insertKey].element); - } else { - this._getWrapper().append(children[insertKey].element); - } - } else { - this._getWrapper().append(children[insertKey].element); - } - }; - - const findOldVnode = (vnodes, vNode, beginIdx, endIdx) => { - let i, found, findIndex; - for (i = beginIdx; i <= endIdx; ++i) { - if (vnodes[i] && sameVnode(vnodes[i], vNode)) { - found = vnodes[i]; - findIndex = i; - } - } - - return [found, findIndex]; - }; - - each(oldCh, (i, child) => { - child = this._getOptions(child); - const key = isNull(child.key) ? i : child.key; - if (isKey(key)) { - children[key] = this._children[this._getChildName(i)]; - } - }); - - while (oldStartIdx <= oldEndIdx && newStartIdx <= newEndIdx) { - if (isNull(oldStartVnode)) { - oldStartVnode = oldCh[++oldStartIdx]; - } else if (isNull(oldEndVnode)) { - oldEndVnode = oldCh[--oldEndIdx]; - } else if (sameVnode(oldStartVnode, newStartVnode, oldStartIdx, newStartIdx)) { - const willUpdate = this.patchItem(oldStartVnode, newStartVnode, oldStartIdx, newStartIdx); - updated = willUpdate || updated; - children[isNull(oldStartVnode.key) ? oldStartIdx : oldStartVnode.key] = willUpdate ? this._children[`${this._getChildName(newStartIdx)}-temp`] : this._children[this._getChildName(oldStartIdx)]; - oldStartVnode = oldCh[++oldStartIdx]; - newStartVnode = newCh[++newStartIdx]; - } else if (sameVnode(oldEndVnode, newEndVnode, oldEndIdx, newEndIdx)) { - const willUpdate = this.patchItem(oldEndVnode, newEndVnode, oldEndIdx, newEndIdx); - updated = willUpdate || updated; - children[isNull(oldEndVnode.key) ? oldEndIdx : oldEndVnode.key] = willUpdate ? this._children[`${this._getChildName(newEndIdx)}-temp`] : this._children[this._getChildName(oldEndIdx)]; - oldEndVnode = oldCh[--oldEndIdx]; - newEndVnode = newCh[--newEndIdx]; - } else if (sameVnode(oldStartVnode, newEndVnode)) { - const willUpdate = this.patchItem(oldStartVnode, newEndVnode, oldStartIdx, newStartIdx); - updated = willUpdate || updated; - children[isNull(oldStartVnode.key) ? oldStartIdx : oldStartVnode.key] = willUpdate ? this._children[`${this._getChildName(newStartIdx)}-temp`] : this._children[this._getChildName(oldStartIdx)]; - insertBefore(oldStartVnode, oldEndVnode, true); - oldStartVnode = oldCh[++oldStartIdx]; - newEndVnode = newCh[--newEndIdx]; - } else if (sameVnode(oldEndVnode, newStartVnode)) { - const willUpdate = this.patchItem(oldEndVnode, newStartVnode, oldEndIdx, newEndIdx); - updated = willUpdate || updated; - children[isNull(oldEndVnode) ? oldEndIdx : oldEndVnode.key] = willUpdate ? this._children[`${this._getChildName(newEndIdx)}-temp`] : this._children[this._getChildName(oldEndIdx)]; - insertBefore(oldEndVnode, oldStartVnode); - oldEndVnode = oldCh[--oldEndIdx]; - newStartVnode = newCh[++newStartIdx]; - } else { - const sameOldVnode = findOldVnode(oldCh, newStartVnode, oldStartIdx, oldEndIdx); - if (isNull(sameOldVnode[0])) { // 不存在就把新的放到左边 - const node = addNode(newStartVnode, newStartIdx, context); - insertBefore(node, oldStartVnode); - } else { // 如果新节点在旧节点区间中存在就复用一下 - const sameOldIndex = sameOldVnode[1]; - const willUpdate = this.patchItem(sameOldVnode[0], newStartVnode, sameOldIndex, newStartIdx); - updated = willUpdate || updated; - children[isNull(sameOldVnode[0].key) ? newStartIdx : sameOldVnode[0].key] = willUpdate ? this._children[`${this._getChildName(newStartIdx)}-temp`] : this._children[this._getChildName(sameOldIndex)]; - oldCh[sameOldIndex] = undefined; - insertBefore(sameOldVnode[0], oldStartVnode); - } - newStartVnode = newCh[++newStartIdx]; - } - } - if (oldStartIdx > oldEndIdx) { - before = isNull(newCh[newEndIdx + 1]) ? null : newCh[newEndIdx + 1]; - addVnodes(before, newCh, newStartIdx, newEndIdx, context); - } else if (newStartIdx > newEndIdx) { - removeVnodes(oldCh, oldStartIdx, oldEndIdx); - } - - this._children = {}; - each(newCh, (i, child) => { - const node = this._getOptions(child); - const key = isNull(node.key) ? i : node.key; - children[key]._setParent && children[key]._setParent(this); - children[key]._mount(); - this._children[this._getChildName(i)] = children[key]; - }); - - return updated; - } - - forceUpdate(opt) { - if (this._isMounted) { - each(this._children, (i, c) => { - c.destroy(); - }); - this._children = {}; - this._isMounted = false; - } - this.options.items = opt.items; - this.stroke(opt.items); - this._mount(); - } - - update(opt) { - const o = this.options; - const items = opt.items || []; - const context = opt.context; - const oldItems = o.items; - this.options.items = items; - - return this.updateChildren(oldItems, items, context); - } - - stroke(items, options) { - options = options || {}; - each(items, (i, item) => { - item && this._addElement(i, item, options.context); - }); - } - - getRowColumnCls(rowIndex, colIndex, lastRowIndex, lastColIndex) { - let cls = ""; - if (rowIndex === 0) { - cls += " first-row"; - } else if (rowIndex === lastRowIndex) { - cls += " last-row"; - } - if (colIndex === 0) { - cls += " first-col"; - } else if (colIndex === lastColIndex) { - cls += " last-col"; - } - isOdd(rowIndex + 1) ? (cls += " odd-row") : (cls += " even-row"); - isOdd(colIndex + 1) ? (cls += " odd-col") : (cls += " even-col"); - cls += " center-element"; - - return cls; - } - - removeWidget(nameOrWidget) { - let removeIndex; - if (isWidget(nameOrWidget)) { - each(this._children, (name, child) => { - if (child === nameOrWidget) { - removeIndex = name; - } - }); - } else { - removeIndex = nameOrWidget; - } - if (removeIndex) { - this._removeItemAt(removeIndex | 0); - } - } - - empty() { - super.empty(...arguments); - this.options.items = []; - } - - destroy() { - super.destroy(...arguments); - this.options.items = []; - } - - populate(items, options) { - items = items || []; - options = options || {}; - if (this._isMounted) { - this.update({ - items, - context: options.context, - }); - - return; - } - this.options.items = items; - this.stroke(items, options); - } - - resize() { - this.stroke(this.options.items); - } -} diff --git a/src/index.js b/src/index.js deleted file mode 100644 index 5858f7041..000000000 --- a/src/index.js +++ /dev/null @@ -1,16 +0,0 @@ -// sideEffects -import "./polyfill"; -import "./core/platform/web/jquery"; - -import _jquery from "jquery"; - -export * from "./core"; -export * from "./base"; -export * from "./case"; -export * from "./widget"; -export * from "./component"; -export * from "./fix"; -export * from "./router"; - -export const jQuery = _jquery; -export const $ = _jquery; diff --git a/src/router/router.js b/src/router/router.js deleted file mode 100644 index 554fe5e0c..000000000 --- a/src/router/router.js +++ /dev/null @@ -1,3378 +0,0 @@ -import { nextTick, shortcut, Widget } from "@/core"; -import { Router } from "./0.router"; -import { Fix } from "../fix"; - -function assert(condition, message) { - if (!condition) { - throw new Error(`[vue-router] ${message}`); - } -} - -function warn(condition, message) { - if (!condition) { - typeof console !== "undefined" && - console.warn(`[vue-router] ${message}`); - } -} - -function extend(a, b) { - for (const key in b) { - a[key] = b[key]; - } - - return a; -} - -/* */ - -const encodeReserveRE = /[!'()*]/g; -const encodeReserveReplacer = function (c) { - return `%${c.charCodeAt(0).toString(16)}`; -}; -const commaRE = /%2C/g; - -// fixed encodeURIComponent which is more conformant to RFC3986: -// - escapes [!'()*] -// - preserve commas -const encode = function (str) { - return encodeURIComponent(str) - .replace(encodeReserveRE, encodeReserveReplacer) - .replace(commaRE, ","); -}; - -function decode(str) { - try { - return decodeURIComponent(str); - } catch (err) { - { - warn(false, `Error decoding "${str}". Leaving it intact.`); - } - } - - return str; -} - -function resolveQuery(query, extraQuery, _parseQuery) { - if (extraQuery === void 0) extraQuery = {}; - - const parse = _parseQuery || parseQuery; - let parsedQuery; - try { - parsedQuery = parse(query || ""); - } catch (e) { - warn(false, e.message); - parsedQuery = {}; - } - for (const key in extraQuery) { - const value = extraQuery[key]; - parsedQuery[key] = Array.isArray(value) - ? value.map(castQueryParamValue) - : castQueryParamValue(value); - } - - return parsedQuery; -} - -var castQueryParamValue = function (value) { - return value == null || typeof value === "object" ? value : String(value); -}; - -function parseQuery(query) { - const res = {}; - - query = query.trim().replace(/^(\?|#|&)/, ""); - - if (!query) { - return res; - } - - query.split("&").forEach((param) => { - const parts = param.replace(/\+/g, " ").split("="); - const key = decode(parts.shift()); - const val = parts.length > 0 ? decode(parts.join("=")) : null; - - if (res[key] === undefined) { - res[key] = val; - } else if (Array.isArray(res[key])) { - res[key].push(val); - } else { - res[key] = [res[key], val]; - } - }); - - return res; -} - -function stringifyQuery(obj) { - const res = obj - ? Object.keys(obj) - .map((key) => { - const val = obj[key]; - - if (val === undefined) { - return ""; - } - - if (val === null) { - return encode(key); - } - - if (Array.isArray(val)) { - const result = []; - val.forEach((val2) => { - if (val2 === undefined) { - return; - } - if (val2 === null) { - result.push(encode(key)); - } else { - result.push(`${encode(key)}=${encode(val2)}`); - } - }); - - return result.join("&"); - } - - return `${encode(key)}=${encode(val)}`; - }) - .filter((x) => x.length > 0) - .join("&") - : null; - - return res ? `?${res}` : ""; -} - -/* */ - -const trailingSlashRE = /\/?$/; - -function createRoute(record, location, redirectedFrom, router) { - const stringifyQuery = router && router.options.stringifyQuery; - - let query = location.query || {}; - try { - query = clone(query); - } catch (e) {} - - const route = { - name: location.name || (record && record.name), - meta: (record && record.meta) || {}, - path: location.path || "/", - hash: location.hash || "", - query, - params: location.params || {}, - fullPath: getFullPath(location, stringifyQuery), - matched: record ? formatMatch(record) : [] - }; - if (redirectedFrom) { - route.redirectedFrom = getFullPath(redirectedFrom, stringifyQuery); - } - - return Object.freeze(route); -} - -function clone(value) { - if (Array.isArray(value)) { - return value.map(clone); - } else if (value && typeof value === "object") { - const res = {}; - for (const key in value) { - res[key] = clone(value[key]); - } - - return res; - } else { - return value; - } -} - -// the starting route that represents the initial state -const START = createRoute(null, { - path: "/" -}); - -function formatMatch(record) { - const res = []; - while (record) { - res.unshift(record); - record = record.parent; - } - - return res; -} - -function getFullPath(ref, _stringifyQuery) { - const path = ref.path; - let query = ref.query; - if (query === void 0) query = {}; - let hash = ref.hash; - if (hash === void 0) hash = ""; - - const stringify = _stringifyQuery || stringifyQuery; - - return (path || "/") + stringify(query) + hash; -} - -function isSameRoute(a, b, onlyPath) { - if (b === START) { - return a === b; - } else if (!b) { - return false; - } else if (a.path && b.path) { - return ( - a.path.replace(trailingSlashRE, "") === - b.path.replace(trailingSlashRE, "") && - (onlyPath || (a.hash === b.hash && isObjectEqual(a.query, b.query))) - ); - } else if (a.name && b.name) { - return ( - a.name === b.name && - (onlyPath || - (a.hash === b.hash && - isObjectEqual(a.query, b.query) && - isObjectEqual(a.params, b.params))) - ); - } else { - return false; - } -} - -function isObjectEqual(a, b) { - if (a === void 0) a = {}; - if (b === void 0) b = {}; - - // handle null value #1566 - if (!a || !b) { - return a === b; - } - const aKeys = Object.keys(a).sort(); - const bKeys = Object.keys(b).sort(); - if (aKeys.length !== bKeys.length) { - return false; - } - - return aKeys.every((key, i) => { - const aVal = a[key]; - const bKey = bKeys[i]; - if (bKey !== key) { - return false; - } - const bVal = b[key]; - // query values can be null and undefined - if (aVal == null || bVal == null) { - return aVal === bVal; - } - // check nested equality - if (typeof aVal === "object" && typeof bVal === "object") { - return isObjectEqual(aVal, bVal); - } - - return String(aVal) === String(bVal); - }); -} - -function isIncludedRoute(current, target) { - return ( - current.path - .replace(trailingSlashRE, "/") - .indexOf(target.path.replace(trailingSlashRE, "/")) === 0 && - (!target.hash || current.hash === target.hash) && - queryIncludes(current.query, target.query) - ); -} - -function queryIncludes(current, target) { - for (const key in target) { - if (!(key in current)) { - return false; - } - } - - return true; -} - -function handleRouteEntered(route) { - for (let i = 0; i < route.matched.length; i++) { - const record = route.matched[i]; - for (const name in record.instances) { - const instance = record.instances[name]; - const cbs = record.enteredCbs[name]; - if (!instance || !cbs) { - continue; - } - delete record.enteredCbs[name]; - for (let i$1 = 0; i$1 < cbs.length; i$1++) { - if (!instance._isBeingDestroyed) { - cbs[i$1](instance); - } - } - } - } -} - -// var View = { -// name: 'RouterView', -// functional: true, -// props: { -// name: { -// type: String, -// default: 'default' -// } -// }, -// render: function render (_, ref) { -// var props = ref.props; -// var children = ref.children; -// var parent = ref.parent; -// var data = ref.data; - -// // used by devtools to display a router-view badge -// data.routerView = true; - -// // directly use parent context's createElement() function -// // so that components rendered by router-view can resolve named slots -// var h = parent.$createElement; -// var name = props.name; -// var route = parent.$route; -// var cache = parent._routerViewCache || (parent._routerViewCache = {}); - -// // determine current view depth, also check to see if the tree -// // has been toggled inactive but kept-alive. -// var depth = 0; -// var inactive = false; -// while (parent && parent._routerRoot !== parent) { -// var vnodeData = parent.$vnode ? parent.$vnode.data : {}; -// if (vnodeData.routerView) { -// depth++; -// } -// if (vnodeData.keepAlive && parent._directInactive && parent._inactive) { -// inactive = true; -// } -// parent = parent.$parent; -// } -// data.routerViewDepth = depth; - -// // render previous view if the tree is inactive and kept-alive -// if (inactive) { -// var cachedData = cache[name]; -// var cachedComponent = cachedData && cachedData.component; -// if (cachedComponent) { -// // #2301 -// // pass props -// if (cachedData.configProps) { -// fillPropsinData(cachedComponent, data, cachedData.route, cachedData.configProps); -// } -// return h(cachedComponent, data, children) -// } else { -// // render previous empty view -// return h() -// } -// } - -// var matched = route.matched[depth]; -// var component = matched && matched.components[name]; - -// // render empty node if no matched route or no config component -// if (!matched || !component) { -// cache[name] = null; -// return h() -// } - -// // cache component -// cache[name] = { component: component }; - -// // attach instance registration hook -// // this will be called in the instance's injected lifecycle hooks -// data.registerRouteInstance = function (vm, val) { -// // val could be undefined for unregistration -// var current = matched.instances[name]; -// if ( -// (val && current !== vm) || -// (!val && current === vm) -// ) { -// matched.instances[name] = val; -// } -// } - -// // also register instance in prepatch hook -// // in case the same component instance is reused across different routes -// ;(data.hook || (data.hook = {})).prepatch = function (_, vnode) { -// matched.instances[name] = vnode.componentInstance; -// }; - -// // register instance in init hook -// // in case kept-alive component be actived when routes changed -// data.hook.init = function (vnode) { -// if (vnode.data.keepAlive && -// vnode.componentInstance && -// vnode.componentInstance !== matched.instances[name] -// ) { -// matched.instances[name] = vnode.componentInstance; -// } - -// // if the route transition has already been confirmed then we weren't -// // able to call the cbs during confirmation as the component was not -// // registered yet, so we call it here. -// handleRouteEntered(route); -// }; - -// var configProps = matched.props && matched.props[name]; -// // save route and configProps in cache -// if (configProps) { -// extend(cache[name], { -// route: route, -// configProps: configProps -// }); -// fillPropsinData(component, data, route, configProps); -// } - -// return h(component, data, children) -// } -// }; - -// function fillPropsinData (component, data, route, configProps) { -// // resolve props -// var propsToPass = data.props = resolveProps(route, configProps); -// if (propsToPass) { -// // clone to prevent mutation -// propsToPass = data.props = extend({}, propsToPass); -// // pass non-declared props as attrs -// var attrs = data.attrs = data.attrs || {}; -// for (var key in propsToPass) { -// if (!component.props || !(key in component.props)) { -// attrs[key] = propsToPass[key]; -// delete propsToPass[key]; -// } -// } -// } -// } - -// function resolveProps (route, config) { -// switch (typeof config) { -// case 'undefined': -// return -// case 'object': -// return config -// case 'function': -// return config(route) -// case 'boolean': -// return config ? route.params : undefined -// default: -// { -// warn( -// false, -// "props in \"" + (route.path) + "\" is a " + (typeof config) + ", " + -// "expecting an object, function or boolean." -// ); -// } -// } -// } - -/* */ - -function resolvePath(relative, base, append) { - const firstChar = relative.charAt(0); - if (firstChar === "/") { - return relative; - } - - if (firstChar === "?" || firstChar === "#") { - return base + relative; - } - - const stack = base.split("/"); - - // remove trailing segment if: - // - not appending - // - appending to trailing slash (last segment is empty) - if (!append || !stack[stack.length - 1]) { - stack.pop(); - } - - // resolve relative path - const segments = relative.replace(/^\//, "").split("/"); - for (let i = 0; i < segments.length; i++) { - const segment = segments[i]; - if (segment === "..") { - stack.pop(); - } else if (segment !== ".") { - stack.push(segment); - } - } - - // ensure leading slash - if (stack[0] !== "") { - stack.unshift(""); - } - - return stack.join("/"); -} - -function parsePath(path) { - let hash = ""; - let query = ""; - - const hashIndex = path.indexOf("#"); - if (hashIndex >= 0) { - hash = path.slice(hashIndex); - path = path.slice(0, hashIndex); - } - - const queryIndex = path.indexOf("?"); - if (queryIndex >= 0) { - query = path.slice(queryIndex + 1); - path = path.slice(0, queryIndex); - } - - return { - path, - query, - hash - }; -} - -function cleanPath(path) { - return path.replace(/\/\//g, "/"); -} - -const isarray = - Array.isArray || - function (arr) { - return Object.prototype.toString.call(arr) == "[object Array]"; - }; - -/** - * Expose `pathToRegexp`. - */ -const pathToRegexp_1 = pathToRegexp; -const parse_1 = parse; -const compile_1 = compile; -const tokensToFunction_1 = tokensToFunction; -const tokensToRegExp_1 = tokensToRegExp; - -/** - * The main path matching regexp utility. - * - * @type {RegExp} - */ -const PATH_REGEXP = new RegExp( - [ - // Match escaped characters that would otherwise appear in future matches. - // This allows the user to escape special characters that won't transform. - "(\\\\.)", - // Match Express-style parameters and un-named parameters with a prefix - // and optional suffixes. Matches appear as: - // - // "/:test(\\d+)?" => ["/", "test", "\d+", undefined, "?", undefined] - // "/route(\\d+)" => [undefined, undefined, undefined, "\d+", undefined, undefined] - // "/*" => ["/", undefined, undefined, undefined, undefined, "*"] - "([\\/.])?(?:(?:\\:(\\w+)(?:\\(((?:\\\\.|[^\\\\()])+)\\))?|\\(((?:\\\\.|[^\\\\()])+)\\))([+*?])?|(\\*))" - ].join("|"), - "g" -); - -/** - * Parse a string for the raw tokens. - * - * @param {string} str - * @param {Object=} options - * @return {!Array} - */ -function parse(str, options) { - const tokens = []; - let key = 0; - let index = 0; - let path = ""; - const defaultDelimiter = (options && options.delimiter) || "/"; - let res; - - while ((res = PATH_REGEXP.exec(str)) != null) { - const m = res[0]; - const escaped = res[1]; - const offset = res.index; - path += str.slice(index, offset); - index = offset + m.length; - - // Ignore already escaped sequences. - if (escaped) { - path += escaped[1]; - continue; - } - - const next = str[index]; - const prefix = res[2]; - const name = res[3]; - const capture = res[4]; - const group = res[5]; - const modifier = res[6]; - const asterisk = res[7]; - - // Push the current path onto the tokens. - if (path) { - tokens.push(path); - path = ""; - } - - const partial = prefix != null && next != null && next !== prefix; - const repeat = modifier === "+" || modifier === "*"; - const optional = modifier === "?" || modifier === "*"; - const delimiter = res[2] || defaultDelimiter; - const pattern = capture || group; - - tokens.push({ - name: name || key++, - prefix: prefix || "", - delimiter, - optional, - repeat, - partial, - asterisk: !!asterisk, - pattern: pattern - ? escapeGroup(pattern) - : asterisk - ? ".*" - : `[^${escapeString(delimiter)}]+?` - }); - } - - // Match any characters still remaining. - if (index < str.length) { - path += str.substr(index); - } - - // If the path exists, push it onto the end. - if (path) { - tokens.push(path); - } - - return tokens; -} - -/** - * Compile a string to a template function for the path. - * - * @param {string} str - * @param {Object=} options - * @return {!function(Object=, Object=)} - */ -function compile(str, options) { - return tokensToFunction(parse(str, options), options); -} - -/** - * Prettier encoding of URI path segments. - * - * @param {string} - * @return {string} - */ -function encodeURIComponentPretty(str) { - return encodeURI(str).replace( - /[\/?#]/g, - (c) => `%${c.charCodeAt(0).toString(16).toUpperCase()}` - ); -} - -/** - * Encode the asterisk parameter. Similar to `pretty`, but allows slashes. - * - * @param {string} - * @return {string} - */ -function encodeAsterisk(str) { - return encodeURI(str).replace( - /[?#]/g, - (c) => `%${c.charCodeAt(0).toString(16).toUpperCase()}` - ); -} - -/** - * Expose a method for transforming tokens into the path function. - */ -function tokensToFunction(tokens, options) { - // Compile all the tokens into regexps. - const matches = new Array(tokens.length); - - // Compile all the patterns before compilation. - for (let i = 0; i < tokens.length; i++) { - if (typeof tokens[i] === "object") { - matches[i] = new RegExp( - `^(?:${tokens[i].pattern})$`, - flags(options) - ); - } - } - - return function (obj, opts) { - let path = ""; - const data = obj || {}; - const options = opts || {}; - const encode = options.pretty - ? encodeURIComponentPretty - : encodeURIComponent; - - for (let i = 0; i < tokens.length; i++) { - const token = tokens[i]; - - if (typeof token === "string") { - path += token; - - continue; - } - - const value = data[token.name]; - var segment; - - if (value == null) { - if (token.optional) { - // Prepend partial segment prefixes. - if (token.partial) { - path += token.prefix; - } - - continue; - } else { - throw new TypeError( - `Expected "${token.name}" to be defined` - ); - } - } - - if (isarray(value)) { - if (!token.repeat) { - throw new TypeError( - `Expected "${ - token.name - }" to not repeat, but received \`${JSON.stringify( - value - )}\`` - ); - } - - if (value.length === 0) { - if (token.optional) { - continue; - } else { - throw new TypeError( - `Expected "${token.name}" to not be empty` - ); - } - } - - for (let j = 0; j < value.length; j++) { - segment = encode(value[j]); - - if (!matches[i].test(segment)) { - throw new TypeError( - `Expected all "${token.name}" to match "${ - token.pattern - }", but received \`${JSON.stringify(segment)}\`` - ); - } - - path += - (j === 0 ? token.prefix : token.delimiter) + segment; - } - - continue; - } - - segment = token.asterisk ? encodeAsterisk(value) : encode(value); - - if (!matches[i].test(segment)) { - throw new TypeError( - `Expected "${token.name}" to match "${token.pattern}", but received "${segment}"` - ); - } - - path += token.prefix + segment; - } - - return path; - }; -} - -/** - * Escape a regular expression string. - * - * @param {string} str - * @return {string} - */ -function escapeString(str) { - return str.replace(/([.+*?=^!:${}()[\]|\/\\])/g, "\\$1"); -} - -/** - * Escape the capturing group by escaping special characters and meaning. - * - * @param {string} group - * @return {string} - */ -function escapeGroup(group) { - return group.replace(/([=!:$\/()])/g, "\\$1"); -} - -/** - * Attach the keys as a property of the regexp. - * - * @param {!RegExp} re - * @param {Array} keys - * @return {!RegExp} - */ -function attachKeys(re, keys) { - re.keys = keys; - - return re; -} - -/** - * Get the flags for a regexp from the options. - * - * @param {Object} options - * @return {string} - */ -function flags(options) { - return options && options.sensitive ? "" : "i"; -} - -/** - * Pull out keys from a regexp. - * - * @param {!RegExp} path - * @param {!Array} keys - * @return {!RegExp} - */ -function regexpToRegexp(path, keys) { - // Use a negative lookahead to match only capturing groups. - const groups = path.source.match(/\((?!\?)/g); - - if (groups) { - for (let i = 0; i < groups.length; i++) { - keys.push({ - name: i, - prefix: null, - delimiter: null, - optional: false, - repeat: false, - partial: false, - asterisk: false, - pattern: null - }); - } - } - - return attachKeys(path, keys); -} - -/** - * Transform an array into a regexp. - * - * @param {!Array} path - * @param {Array} keys - * @param {!Object} options - * @return {!RegExp} - */ -function arrayToRegexp(path, keys, options) { - const parts = []; - - for (let i = 0; i < path.length; i++) { - parts.push(pathToRegexp(path[i], keys, options).source); - } - - const regexp = new RegExp(`(?:${parts.join("|")})`, flags(options)); - - return attachKeys(regexp, keys); -} - -/** - * Create a path regexp from string input. - * - * @param {string} path - * @param {!Array} keys - * @param {!Object} options - * @return {!RegExp} - */ -function stringToRegexp(path, keys, options) { - return tokensToRegExp(parse(path, options), keys, options); -} - -/** - * Expose a function for taking tokens and returning a RegExp. - * - * @param {!Array} tokens - * @param {(Array|Object)=} keys - * @param {Object=} options - * @return {!RegExp} - */ -function tokensToRegExp(tokens, keys, options) { - if (!isarray(keys)) { - options = /** @type {!Object} */ (keys || options); - keys = []; - } - - options = options || {}; - - const strict = options.strict; - const end = options.end !== false; - let route = ""; - - // Iterate over the tokens and create our regexp string. - for (let i = 0; i < tokens.length; i++) { - const token = tokens[i]; - - if (typeof token === "string") { - route += escapeString(token); - } else { - const prefix = escapeString(token.prefix); - let capture = `(?:${token.pattern})`; - - keys.push(token); - - if (token.repeat) { - capture += `(?:${prefix}${capture})*`; - } - - if (token.optional) { - if (!token.partial) { - capture = `(?:${prefix}(${capture}))?`; - } else { - capture = `${prefix}(${capture})?`; - } - } else { - capture = `${prefix}(${capture})`; - } - - route += capture; - } - } - - const delimiter = escapeString(options.delimiter || "/"); - const endsWithDelimiter = route.slice(-delimiter.length) === delimiter; - - // In non-strict mode we allow a slash at the end of match. If the path to - // match already ends with a slash, we remove it for consistency. The slash - // is valid at the end of a path match, not in the middle. This is important - // in non-ending mode, where "/test/" shouldn't match "/test//route". - if (!strict) { - route = `${ - endsWithDelimiter ? route.slice(0, -delimiter.length) : route - }(?:${delimiter}(?=$))?`; - } - - if (end) { - route += "$"; - } else { - // In non-ending mode, we need the capturing groups to match as much as - // possible by using a positive lookahead to the end or next path segment. - route += strict && endsWithDelimiter ? "" : `(?=${delimiter}|$)`; - } - - return attachKeys(new RegExp(`^${route}`, flags(options)), keys); -} - -/** - * Normalize the given path string, returning a regular expression. - * - * An empty array can be passed in for the keys, which will hold the - * placeholder key descriptions. For example, using `/user/:id`, `keys` will - * contain `[{ name: 'id', delimiter: '/', optional: false, repeat: false }]`. - * - * @param {(string|RegExp|Array)} path - * @param {(Array|Object)=} keys - * @param {Object=} options - * @return {!RegExp} - */ -function pathToRegexp(path, keys, options) { - if (!isarray(keys)) { - options = /** @type {!Object} */ (keys || options); - keys = []; - } - - options = options || {}; - - if (path instanceof RegExp) { - return regexpToRegexp(path, /** @type {!Array} */ (keys)); - } - - if (isarray(path)) { - return arrayToRegexp( - /** @type {!Array} */ (path), - /** @type {!Array} */ (keys), - options - ); - } - - return stringToRegexp( - /** @type {string} */ (path), - /** @type {!Array} */ (keys), - options - ); -} -pathToRegexp_1.parse = parse_1; -pathToRegexp_1.compile = compile_1; -pathToRegexp_1.tokensToFunction = tokensToFunction_1; -pathToRegexp_1.tokensToRegExp = tokensToRegExp_1; - -/* */ - -// $flow-disable-line -const regexpCompileCache = Object.create(null); - -function fillParams(path, params, routeMsg) { - params = params || {}; - try { - const filler = - regexpCompileCache[path] || - (regexpCompileCache[path] = pathToRegexp_1.compile(path)); - - // Fix #2505 resolving asterisk routes { name: 'not-found', params: { pathMatch: '/not-found' }} - // and fix #3106 so that you can work with location descriptor object having params.pathMatch equal to empty string - if (typeof params.pathMatch === "string") { - params[0] = params.pathMatch; - } - - return filler(params, { pretty: true }); - } catch (e) { - { - // Fix #3072 no warn if `pathMatch` is string - warn( - typeof params.pathMatch === "string", - `missing param for ${routeMsg}: ${e.message}` - ); - } - - return ""; - } finally { - // delete the 0 if it was added - delete params[0]; - } -} - -/* */ - -function normalizeLocation(raw, current, append, router) { - let next = typeof raw === "string" ? { path: raw } : raw; - // named target - if (next._normalized) { - return next; - } else if (next.name) { - next = extend({}, raw); - const params = next.params; - if (params && typeof params === "object") { - next.params = extend({}, params); - } - - return next; - } - - // relative params - if (!next.path && next.params && current) { - next = extend({}, next); - next._normalized = true; - const params$1 = extend(extend({}, current.params), next.params); - if (current.name) { - next.name = current.name; - next.params = params$1; - } else if (current.matched.length) { - const rawPath = current.matched[current.matched.length - 1].path; - next.path = fillParams(rawPath, params$1, `path ${current.path}`); - } else { - warn(false, "relative params navigation requires a current route."); - } - - return next; - } - - const parsedPath = parsePath(next.path || ""); - const basePath = (current && current.path) || "/"; - const path = parsedPath.path - ? resolvePath(parsedPath.path, basePath, append || next.append) - : basePath; - - const query = resolveQuery( - parsedPath.query, - next.query, - router && router.options.parseQuery - ); - - let hash = next.hash || parsedPath.hash; - if (hash && hash.charAt(0) !== "#") { - hash = `#${hash}`; - } - - return { - _normalized: true, - path, - query, - hash - }; -} - -// var toTypes = [String, Object]; -// var eventTypes = [String, Array]; - -// var noop = function () {}; - -// var warnedCustomSlot; -// var warnedTagProp; -// var warnedEventProp; - -// var Link = { -// name: 'RouterLink', -// props: { -// to: { -// type: toTypes, -// required: true -// }, -// tag: { -// type: String, -// default: 'a' -// }, -// custom: Boolean, -// exact: Boolean, -// exactPath: Boolean, -// append: Boolean, -// replace: Boolean, -// activeClass: String, -// exactActiveClass: String, -// ariaCurrentValue: { -// type: String, -// default: 'page' -// }, -// event: { -// type: eventTypes, -// default: 'click' -// } -// }, -// render: function render (h) { -// var this$1 = this; - -// var router = this.$router; -// var current = this.$route; -// var ref = router.resolve( -// this.to, -// current, -// this.append -// ); -// var location = ref.location; -// var route = ref.route; -// var href = ref.href; - -// var classes = {}; -// var globalActiveClass = router.options.linkActiveClass; -// var globalExactActiveClass = router.options.linkExactActiveClass; -// // Support global empty active class -// var activeClassFallback = -// globalActiveClass == null ? 'router-link-active' : globalActiveClass; -// var exactActiveClassFallback = -// globalExactActiveClass == null -// ? 'router-link-exact-active' -// : globalExactActiveClass; -// var activeClass = -// this.activeClass == null ? activeClassFallback : this.activeClass; -// var exactActiveClass = -// this.exactActiveClass == null -// ? exactActiveClassFallback -// : this.exactActiveClass; - -// var compareTarget = route.redirectedFrom -// ? createRoute(null, normalizeLocation(route.redirectedFrom), null, router) -// : route; - -// classes[exactActiveClass] = isSameRoute(current, compareTarget, this.exactPath); -// classes[activeClass] = this.exact || this.exactPath -// ? classes[exactActiveClass] -// : isIncludedRoute(current, compareTarget); - -// var ariaCurrentValue = classes[exactActiveClass] ? this.ariaCurrentValue : null; - -// var handler = function (e) { -// if (guardEvent(e)) { -// if (this$1.replace) { -// router.replace(location, noop); -// } else { -// router.push(location, noop); -// } -// } -// }; - -// var on = { click: guardEvent }; -// if (Array.isArray(this.event)) { -// this.event.forEach(function (e) { -// on[e] = handler; -// }); -// } else { -// on[this.event] = handler; -// } - -// var data = { class: classes }; - -// var scopedSlot = -// !this.$scopedSlots.$hasNormal && -// this.$scopedSlots.default && -// this.$scopedSlots.default({ -// href: href, -// route: route, -// navigate: handler, -// isActive: classes[activeClass], -// isExactActive: classes[exactActiveClass] -// }); - -// if (scopedSlot) { -// if (!this.custom) { -// !warnedCustomSlot && warn(false, 'In Vue Router 4, the v-slot API will by default wrap its content with an element. Use the custom prop to remove this warning:\n\n'); -// warnedCustomSlot = true; -// } -// if (scopedSlot.length === 1) { -// return scopedSlot[0] -// } else if (scopedSlot.length > 1 || !scopedSlot.length) { -// { -// warn( -// false, -// (" with to=\"" + (this.to) + "\" is trying to use a scoped slot but it didn't provide exactly one child. Wrapping the content with a span element.") -// ); -// } -// return scopedSlot.length === 0 ? h() : h('span', {}, scopedSlot) -// } -// } - -// { -// if ('tag' in this.$options.propsData && !warnedTagProp) { -// warn( -// false, -// "'s tag prop is deprecated and has been removed in Vue Router 4. Use the v-slot API to remove this warning: https://next.router.vuejs.org/guide/migration/#removal-of-event-and-tag-props-in-router-link." -// ); -// warnedTagProp = true; -// } -// if ('event' in this.$options.propsData && !warnedEventProp) { -// warn( -// false, -// "'s event prop is deprecated and has been removed in Vue Router 4. Use the v-slot API to remove this warning: https://next.router.vuejs.org/guide/migration/#removal-of-event-and-tag-props-in-router-link." -// ); -// warnedEventProp = true; -// } -// } - -// if (this.tag === 'a') { -// data.on = on; -// data.attrs = { href: href, 'aria-current': ariaCurrentValue }; -// } else { -// // find the first child and apply listener and href -// var a = findAnchor(this.$slots.default); -// if (a) { -// // in case the is a static node -// a.isStatic = false; -// var aData = (a.data = extend({}, a.data)); -// aData.on = aData.on || {}; -// // transform existing events in both objects into arrays so we can push later -// for (var event in aData.on) { -// var handler$1 = aData.on[event]; -// if (event in on) { -// aData.on[event] = Array.isArray(handler$1) ? handler$1 : [handler$1]; -// } -// } -// // append new listeners for router-link -// for (var event$1 in on) { -// if (event$1 in aData.on) { -// // on[event] is always a function -// aData.on[event$1].push(on[event$1]); -// } else { -// aData.on[event$1] = handler; -// } -// } - -// var aAttrs = (a.data.attrs = extend({}, a.data.attrs)); -// aAttrs.href = href; -// aAttrs['aria-current'] = ariaCurrentValue; -// } else { -// // doesn't have child, apply listener to self -// data.on = on; -// } -// } - -// return h(this.tag, data, this.$slots.default) -// } -// }; - -function guardEvent(e) { - // don't redirect with control keys - if (e.metaKey || e.altKey || e.ctrlKey || e.shiftKey) { - return; - } - // don't redirect when preventDefault called - if (e.defaultPrevented) { - return; - } - // don't redirect on right click - if (e.button !== undefined && e.button !== 0) { - return; - } - // don't redirect if `target="_blank"` - if (e.currentTarget && e.currentTarget.getAttribute) { - const target = e.currentTarget.getAttribute("target"); - if (/\b_blank\b/i.test(target)) { - return; - } - } - // this may be a Weex event which doesn't have this method - if (e.preventDefault) { - e.preventDefault(); - } - - return true; -} - -function findAnchor(children) { - if (children) { - let child; - for (let i = 0; i < children.length; i++) { - child = children[i]; - if (child.tag === "a") { - return child; - } - if (child.children && (child = findAnchor(child.children))) { - return child; - } - } - } -} - -// var _Vue; - -// function install (Vue) { -// if (install.installed && _Vue === Vue) { return } -// install.installed = true; - -// _Vue = Vue; - -// var isDef = function (v) { return v !== undefined; }; - -// var registerInstance = function (vm, callVal) { -// var i = vm.$options._parentVnode; -// if (isDef(i) && isDef(i = i.data) && isDef(i = i.registerRouteInstance)) { -// i(vm, callVal); -// } -// }; - -// Vue.mixin({ -// beforeCreate: function beforeCreate () { -// if (isDef(this.$options.router)) { -// this._routerRoot = this; -// this._router = this.$options.router; -// this._router.init(this); -// Vue.util.defineReactive(this, '_route', this._router.history.current); -// } else { -// this._routerRoot = (this.$parent && this.$parent._routerRoot) || this; -// } -// registerInstance(this, this); -// }, -// destroyed: function destroyed () { -// registerInstance(this); -// } -// }); - -// Object.defineProperty(Vue.prototype, '$router', { -// get: function get () { return this._routerRoot._router } -// }); - -// Object.defineProperty(Vue.prototype, '$route', { -// get: function get () { return this._routerRoot._route } -// }); - -// Vue.component('RouterView', View); -// Vue.component('RouterLink', Link); - -// var strats = Vue.config.optionMergeStrategies; -// // use the same hook merging strategy for route hooks -// strats.beforeRouteEnter = strats.beforeRouteLeave = strats.beforeRouteUpdate = strats.created; -// } - -/* */ - -const inBrowser = typeof window !== "undefined"; - -/* */ - -function createRouteMap( - routes, - oldPathList, - oldPathMap, - oldNameMap, - parentRoute -) { - // the path list is used to control path matching priority - const pathList = oldPathList || []; - // $flow-disable-line - const pathMap = oldPathMap || Object.create(null); - // $flow-disable-line - const nameMap = oldNameMap || Object.create(null); - - routes.forEach((route) => { - addRouteRecord(pathList, pathMap, nameMap, route, parentRoute); - }); - - // ensure wildcard routes are always at the end - for (let i = 0, l = pathList.length; i < l; i++) { - if (pathList[i] === "*") { - pathList.push(pathList.splice(i, 1)[0]); - l--; - i--; - } - } - - { - // warn if routes do not include leading slashes - const found = pathList - // check for missing leading slash - .filter( - (path) => - path && path.charAt(0) !== "*" && path.charAt(0) !== "/" - ); - - if (found.length > 0) { - const pathNames = found.map((path) => `- ${path}`).join("\n"); - warn( - false, - `Non-nested routes must include a leading slash character. Fix the following routes: \n${pathNames}` - ); - } - } - - return { - pathList, - pathMap, - nameMap - }; -} - -function addRouteRecord(pathList, pathMap, nameMap, route, parent, matchAs) { - const path = route.path; - const name = route.name; - { - assert(path != null, '"path" is required in a route configuration.'); - assert( - typeof route.component !== "string", - `route config "component" for path: ${String( - path || name - )} cannot be a ` + "string id. Use an actual component instead." - ); - - warn( - // eslint-disable-next-line no-control-regex - !/[^\u0000-\u007F]+/.test(path), - `Route with path "${path}" contains unencoded characters, make sure ` + - "your path is correctly encoded before passing it to the router. Use " + - "encodeURI to encode static segments of your path." - ); - } - - const pathToRegexpOptions = route.pathToRegexpOptions || {}; - const normalizedPath = normalizePath( - path, - parent, - pathToRegexpOptions.strict - ); - - if (typeof route.caseSensitive === "boolean") { - pathToRegexpOptions.sensitive = route.caseSensitive; - } - - const record = { - path: normalizedPath, - regex: compileRouteRegex(normalizedPath, pathToRegexpOptions), - components: route.components || { default: route.component }, - alias: route.alias - ? typeof route.alias === "string" - ? [route.alias] - : route.alias - : [], - instances: {}, - enteredCbs: {}, - name, - parent, - matchAs, - redirect: route.redirect, - beforeEnter: route.beforeEnter, - meta: route.meta || {}, - props: - route.props == null - ? {} - : route.components - ? route.props - : { default: route.props } - }; - - if (route.children) { - // Warn if route is named, does not redirect and has a default child route. - // If users navigate to this route by name, the default child will - // not be rendered (GH Issue #629) - { - if ( - route.name && - !route.redirect && - route.children.some((child) => /^\/?$/.test(child.path)) - ) { - warn( - false, - `Named Route '${route.name}' has a default child route. ` + - `When navigating to this named route (:to="{name: '${route.name}'"), ` + - "the default child route will not be rendered. Remove the name from " + - "this route and use the name of the default child route for named " + - "links instead." - ); - } - } - route.children.forEach((child) => { - const childMatchAs = matchAs - ? cleanPath(`${matchAs}/${child.path}`) - : undefined; - addRouteRecord( - pathList, - pathMap, - nameMap, - child, - record, - childMatchAs - ); - }); - } - - if (!pathMap[record.path]) { - pathList.push(record.path); - pathMap[record.path] = record; - } - - if (route.alias !== undefined) { - const aliases = Array.isArray(route.alias) - ? route.alias - : [route.alias]; - for (let i = 0; i < aliases.length; ++i) { - const alias = aliases[i]; - if (alias === path) { - warn( - false, - `Found an alias with the same value as the path: "${path}". You have to remove that alias. It will be ignored in development.` - ); - // skip in dev to make it work - continue; - } - - const aliasRoute = { - path: alias, - children: route.children - }; - addRouteRecord( - pathList, - pathMap, - nameMap, - aliasRoute, - parent, - record.path || "/" // matchAs - ); - } - } - - if (name) { - if (!nameMap[name]) { - nameMap[name] = record; - } else if (!matchAs) { - warn( - false, - `${ - "Duplicate named routes definition: " + '{ name: "' - }${name}", path: "${record.path}" }` - ); - } - } -} - -function compileRouteRegex(path, pathToRegexpOptions) { - const regex = pathToRegexp_1(path, [], pathToRegexpOptions); - { - const keys = Object.create(null); - regex.keys.forEach((key) => { - warn( - !keys[key.name], - `Duplicate param keys in route with path: "${path}"` - ); - keys[key.name] = true; - }); - } - - return regex; -} - -function normalizePath(path, parent, strict) { - if (!strict) { - path = path.replace(/\/$/, ""); - } - if (path[0] === "/") { - return path; - } - if (parent == null) { - return path; - } - - return cleanPath(`${parent.path}/${path}`); -} - -/* */ - -function createMatcher(routes, router) { - const ref = createRouteMap(routes); - const pathList = ref.pathList; - const pathMap = ref.pathMap; - const nameMap = ref.nameMap; - - function addRoutes(routes) { - createRouteMap(routes, pathList, pathMap, nameMap); - } - - function addRoute(parentOrRoute, route) { - const parent = - typeof parentOrRoute !== "object" - ? nameMap[parentOrRoute] - : undefined; - // $flow-disable-line - createRouteMap( - [route || parentOrRoute], - pathList, - pathMap, - nameMap, - parent - ); - - // add aliases of parent - if (parent && parent.alias.length) { - createRouteMap( - // $flow-disable-line route is defined if parent is - parent.alias.map((alias) => { - return { path: alias, children: [route] }; - }), - pathList, - pathMap, - nameMap, - parent - ); - } - } - - function getRoutes() { - return pathList.map((path) => pathMap[path]); - } - - function match(raw, currentRoute, redirectedFrom) { - const location = normalizeLocation(raw, currentRoute, false, router); - const name = location.name; - - if (name) { - const record = nameMap[name]; - { - warn(record, `Route with name '${name}' does not exist`); - } - if (!record) { - return _createRoute(null, location); - } - const paramNames = record.regex.keys - .filter((key) => !key.optional) - .map((key) => key.name); - - if (typeof location.params !== "object") { - location.params = {}; - } - - if (currentRoute && typeof currentRoute.params === "object") { - for (const key in currentRoute.params) { - if ( - !(key in location.params) && - paramNames.indexOf(key) > -1 - ) { - location.params[key] = currentRoute.params[key]; - } - } - } - - location.path = fillParams( - record.path, - location.params, - `named route "${name}"` - ); - - return _createRoute(record, location, redirectedFrom); - } else if (location.path) { - location.params = {}; - for (let i = 0; i < pathList.length; i++) { - const path = pathList[i]; - const record$1 = pathMap[path]; - if ( - matchRoute(record$1.regex, location.path, location.params) - ) { - return _createRoute(record$1, location, redirectedFrom); - } - } - } - // no match - return _createRoute(null, location); - } - - function redirect(record, location) { - const originalRedirect = record.redirect; - let redirect = - typeof originalRedirect === "function" - ? originalRedirect(createRoute(record, location, null, router)) - : originalRedirect; - - if (typeof redirect === "string") { - redirect = { path: redirect }; - } - - if (!redirect || typeof redirect !== "object") { - { - warn( - false, - `invalid redirect option: ${JSON.stringify(redirect)}` - ); - } - - return _createRoute(null, location); - } - - const re = redirect; - const name = re.name; - const path = re.path; - let query = location.query; - let hash = location.hash; - let params = location.params; - query = re.hasOwnProperty("query") ? re.query : query; - hash = re.hasOwnProperty("hash") ? re.hash : hash; - params = re.hasOwnProperty("params") ? re.params : params; - - if (name) { - // resolved named direct - const targetRecord = nameMap[name]; - { - assert( - targetRecord, - `redirect failed: named route "${name}" not found.` - ); - } - - return match( - { - _normalized: true, - name, - query, - hash, - params - }, - undefined, - location - ); - } else if (path) { - // 1. resolve relative redirect - const rawPath = resolveRecordPath(path, record); - // 2. resolve params - const resolvedPath = fillParams( - rawPath, - params, - `redirect route with path "${rawPath}"` - ); - // 3. rematch with existing query and hash - return match( - { - _normalized: true, - path: resolvedPath, - query, - hash - }, - undefined, - location - ); - } else { - { - warn( - false, - `invalid redirect option: ${JSON.stringify(redirect)}` - ); - } - - return _createRoute(null, location); - } - } - - function alias(record, location, matchAs) { - const aliasedPath = fillParams( - matchAs, - location.params, - `aliased route with path "${matchAs}"` - ); - const aliasedMatch = match({ - _normalized: true, - path: aliasedPath - }); - if (aliasedMatch) { - const matched = aliasedMatch.matched; - const aliasedRecord = matched[matched.length - 1]; - location.params = aliasedMatch.params; - - return _createRoute(aliasedRecord, location); - } - - return _createRoute(null, location); - } - - function _createRoute(record, location, redirectedFrom) { - if (record && record.redirect) { - return redirect(record, redirectedFrom || location); - } - if (record && record.matchAs) { - return alias(record, location, record.matchAs); - } - - return createRoute(record, location, redirectedFrom, router); - } - - return { - match, - addRoute, - getRoutes, - addRoutes - }; -} - -function matchRoute(regex, path, params) { - const m = path.match(regex); - - if (!m) { - return false; - } else if (!params) { - return true; - } - - for (let i = 1, len = m.length; i < len; ++i) { - const key = regex.keys[i - 1]; - if (key) { - // Fix #1994: using * with props: true generates a param named 0 - params[key.name || "pathMatch"] = - typeof m[i] === "string" ? decode(m[i]) : m[i]; - } - } - - return true; -} - -function resolveRecordPath(path, record) { - return resolvePath(path, record.parent ? record.parent.path : "/", true); -} - -/* */ - -// use User Timing api (if present) for more accurate key precision -const Time = - inBrowser && window.performance && window.performance.now - ? window.performance - : Date; - -function genStateKey() { - return Time.now().toFixed(3); -} - -let _key = genStateKey(); - -function getStateKey() { - return _key; -} - -function setStateKey(key) { - return (_key = key); -} - -/* */ - -const positionStore = Object.create(null); - -function setupScroll() { - // Prevent browser scroll behavior on History popstate - if ("scrollRestoration" in window.history) { - window.history.scrollRestoration = "manual"; - } - // Fix for #1585 for Firefox - // Fix for #2195 Add optional third attribute to workaround a bug in safari https://bugs.webkit.org/show_bug.cgi?id=182678 - // Fix for #2774 Support for apps loaded from Windows file shares not mapped to network drives: replaced location.origin with - // window.location.protocol + '//' + window.location.host - // location.host contains the port and location.hostname doesn't - const protocolAndPath = `${window.location.protocol}//${window.location.host}`; - const absolutePath = window.location.href.replace(protocolAndPath, ""); - // preserve existing history state as it could be overriden by the user - const stateCopy = extend({}, window.history.state); - stateCopy.key = getStateKey(); - window.history.replaceState(stateCopy, "", absolutePath); - window.addEventListener("popstate", handlePopState); - - return function () { - window.removeEventListener("popstate", handlePopState); - }; -} - -function handleScroll(router, to, from, isPop) { - if (!router.app) { - return; - } - - const behavior = router.options.scrollBehavior; - if (!behavior) { - return; - } - - { - assert( - typeof behavior === "function", - "scrollBehavior must be a function" - ); - } - - // wait until re-render finishes before scrolling - nextTick(() => { - const position = getScrollPosition(); - const shouldScroll = behavior.call( - router, - to, - from, - isPop ? position : null - ); - - if (!shouldScroll) { - return; - } - - if (typeof shouldScroll.then === "function") { - shouldScroll - .then((shouldScroll) => { - scrollToPosition(shouldScroll, position); - }) - .catch((err) => { - { - assert(false, err.toString()); - } - }); - } else { - scrollToPosition(shouldScroll, position); - } - }); -} - -function saveScrollPosition() { - const key = getStateKey(); - if (key) { - positionStore[key] = { - x: window.pageXOffset, - y: window.pageYOffset - }; - } -} - -function handlePopState(e) { - saveScrollPosition(); - if (e.state && e.state.key) { - setStateKey(e.state.key); - } -} - -function getScrollPosition() { - const key = getStateKey(); - if (key) { - return positionStore[key]; - } -} - -function getElementPosition(el, offset) { - const docEl = document.documentElement; - const docRect = docEl.getBoundingClientRect(); - const elRect = el.getBoundingClientRect(); - - return { - x: elRect.left - docRect.left - offset.x, - y: elRect.top - docRect.top - offset.y - }; -} - -function isValidPosition(obj) { - return isNumber(obj.x) || isNumber(obj.y); -} - -function normalizePosition(obj) { - return { - x: isNumber(obj.x) ? obj.x : window.pageXOffset, - y: isNumber(obj.y) ? obj.y : window.pageYOffset - }; -} - -function normalizeOffset(obj) { - return { - x: isNumber(obj.x) ? obj.x : 0, - y: isNumber(obj.y) ? obj.y : 0 - }; -} - -function isNumber(v) { - return typeof v === "number"; -} - -const hashStartsWithNumberRE = /^#\d/; - -function scrollToPosition(shouldScroll, position) { - const isObject = typeof shouldScroll === "object"; - if (isObject && typeof shouldScroll.selector === "string") { - // getElementById would still fail if the selector contains a more complicated query like #main[data-attr] - // but at the same time, it doesn't make much sense to select an element with an id and an extra selector - const el = hashStartsWithNumberRE.test(shouldScroll.selector) // $flow-disable-line - ? document.getElementById(shouldScroll.selector.slice(1)) // $flow-disable-line - : document.querySelector(shouldScroll.selector); - - if (el) { - let offset = - shouldScroll.offset && typeof shouldScroll.offset === "object" - ? shouldScroll.offset - : {}; - offset = normalizeOffset(offset); - position = getElementPosition(el, offset); - } else if (isValidPosition(shouldScroll)) { - position = normalizePosition(shouldScroll); - } - } else if (isObject && isValidPosition(shouldScroll)) { - position = normalizePosition(shouldScroll); - } - - if (position) { - // $flow-disable-line - if ("scrollBehavior" in document.documentElement.style) { - window.scrollTo({ - left: position.x, - top: position.y, - // $flow-disable-line - behavior: shouldScroll.behavior - }); - } else { - window.scrollTo(position.x, position.y); - } - } -} - -/* */ - -const supportsPushState = - inBrowser && - (function () { - const ua = window.navigator.userAgent; - - if ( - (ua.indexOf("Android 2.") !== -1 || - ua.indexOf("Android 4.0") !== -1) && - ua.indexOf("Mobile Safari") !== -1 && - ua.indexOf("Chrome") === -1 && - ua.indexOf("Windows Phone") === -1 - ) { - return false; - } - - return window.history && typeof window.history.pushState === "function"; - })(); - -function pushState(url, replace) { - saveScrollPosition(); - // try...catch the pushState call to get around Safari - // DOM Exception 18 where it limits to 100 pushState calls - const history = window.history; - try { - if (replace) { - // preserve existing history state as it could be overriden by the user - const stateCopy = extend({}, history.state); - stateCopy.key = getStateKey(); - history.replaceState(stateCopy, "", url); - } else { - history.pushState({ key: setStateKey(genStateKey()) }, "", url); - } - } catch (e) { - window.location[replace ? "replace" : "assign"](url); - } -} - -function replaceState(url) { - pushState(url, true); -} - -/* */ - -function runQueue(queue, fn, cb) { - var step = function (index) { - if (index >= queue.length) { - cb(); - } else { - if (queue[index]) { - fn(queue[index], () => { - step(index + 1); - }); - } else { - step(index + 1); - } - } - }; - step(0); -} - -// When changing thing, also edit router.d.ts -const NavigationFailureType = { - redirected: 2, - aborted: 4, - cancelled: 8, - duplicated: 16 -}; - -function createNavigationRedirectedError(from, to) { - return createRouterError( - from, - to, - NavigationFailureType.redirected, - `Redirected when going from "${from.fullPath}" to "${stringifyRoute( - to - )}" via a navigation guard.` - ); -} - -function createNavigationDuplicatedError(from, to) { - const error = createRouterError( - from, - to, - NavigationFailureType.duplicated, - `Avoided redundant navigation to current location: "${from.fullPath}".` - ); - // backwards compatible with the first introduction of Errors - error.name = "NavigationDuplicated"; - - return error; -} - -function createNavigationCancelledError(from, to) { - return createRouterError( - from, - to, - NavigationFailureType.cancelled, - `Navigation cancelled from "${from.fullPath}" to "${to.fullPath}" with a new navigation.` - ); -} - -function createNavigationAbortedError(from, to) { - return createRouterError( - from, - to, - NavigationFailureType.aborted, - `Navigation aborted from "${from.fullPath}" to "${to.fullPath}" via a navigation guard.` - ); -} - -function createRouterError(from, to, type, message) { - const error = new Error(message); - error._isRouter = true; - error.from = from; - error.to = to; - error.type = type; - - return error; -} - -const propertiesToLog = ["params", "query", "hash"]; - -function stringifyRoute(to) { - if (typeof to === "string") { - return to; - } - if ("path" in to) { - return to.path; - } - const location = {}; - propertiesToLog.forEach((key) => { - if (key in to) { - location[key] = to[key]; - } - }); - - return JSON.stringify(location, null, 2); -} - -function isError(err) { - return Object.prototype.toString.call(err).indexOf("Error") > -1; -} - -function isNavigationFailure(err, errorType) { - return ( - isError(err) && - err._isRouter && - (errorType == null || err.type === errorType) - ); -} - -/* */ - -function resolveAsyncComponents(matched) { - return function (to, from, next) { - let hasAsync = false; - let pending = 0; - let error = null; - - flatMapComponents(matched, (def, _, match, key) => { - // if it's a function and doesn't have cid attached, - // assume it's an async component resolve function. - // we are not using Vue's default async resolving mechanism because - // we want to halt the navigation until the incoming component has been - // resolved. - if (typeof def === "function" && def.cid === undefined) { - hasAsync = true; - pending++; - - const resolve = once((resolvedDef) => { - if (isESModule(resolvedDef)) { - resolvedDef = resolvedDef.default; - } - // save resolved on async factory in case it's used elsewhere - def.resolved = resolvedDef; - match.components[key] = resolvedDef; - pending--; - if (pending <= 0) { - next(); - } - }); - - const reject = once((reason) => { - const msg = `Failed to resolve async component ${key}: ${reason}`; - warn(false, msg); - if (!error) { - error = isError(reason) ? reason : new Error(msg); - next(error); - } - }); - - let res; - try { - res = def(resolve, reject); - } catch (e) { - reject(e); - } - if (res) { - if (typeof res.then === "function") { - res.then(resolve, reject); - } else { - // new syntax in Vue 2.3 - const comp = res.component; - if (comp && typeof comp.then === "function") { - comp.then(resolve, reject); - } - } - } - } - }); - - if (!hasAsync) { - next(); - } - }; -} - -function flatMapComponents(matched, fn) { - return flatten( - matched.map((m) => - Object.keys(m.components).map((key) => - fn(m.components[key], m.instances[key], m, key) - ) - ) - ); -} - -function flatten(arr) { - return Array.prototype.concat.apply([], arr); -} - -const hasSymbol = - typeof Symbol === "function" && typeof Symbol.toStringTag === "symbol"; - -function isESModule(obj) { - return ( - obj.__esModule || (hasSymbol && obj[Symbol.toStringTag] === "Module") - ); -} - -// in Webpack 2, require.ensure now also returns a Promise -// so the resolve/reject functions may get called an extra time -// if the user uses an arrow function shorthand that happens to -// return that Promise. -function once(fn) { - let called = false; - - return function () { - let args = [], - len = arguments.length; - while (len--) args[len] = arguments[len]; - - if (called) { - return; - } - called = true; - - return fn.apply(this, args); - }; -} - -/* */ - -const History = function History(router, base) { - this.router = router; - this.base = normalizeBase(base); - // start with a route object that stands for "nowhere" - this.current = START; - this.pending = null; - this.ready = false; - this.readyCbs = []; - this.readyErrorCbs = []; - this.errorCbs = []; - this.listeners = []; -}; - -History.prototype.listen = function listen(cb) { - this.cb = cb; -}; - -History.prototype.onReady = function onReady(cb, errorCb) { - if (this.ready) { - cb(); - } else { - this.readyCbs.push(cb); - if (errorCb) { - this.readyErrorCbs.push(errorCb); - } - } -}; - -History.prototype.onError = function onError(errorCb) { - this.errorCbs.push(errorCb); -}; - -History.prototype.transitionTo = function transitionTo( - location, - onComplete, - onAbort -) { - const this$1 = this; - - let route; - // catch redirect option https://github.com/vuejs/vue-router/issues/3201 - try { - route = this.router.match(location, this.current); - } catch (e) { - this.errorCbs.forEach((cb) => { - cb(e); - }); - // Exception should still be thrown - throw e; - } - const prev = this.current; - this.confirmTransition( - route, - () => { - this$1.updateRoute(route); - onComplete && onComplete(route); - this$1.ensureURL(); - this$1.router.afterHooks.forEach((hook) => { - hook && hook(route, prev); - }); - - // fire ready cbs once - if (!this$1.ready) { - this$1.ready = true; - this$1.readyCbs.forEach((cb) => { - cb(route); - }); - } - }, - (err) => { - if (onAbort) { - onAbort(err); - } - if (err && !this$1.ready) { - // Initial redirection should not mark the history as ready yet - // because it's triggered by the redirection instead - // https://github.com/vuejs/vue-router/issues/3225 - // https://github.com/vuejs/vue-router/issues/3331 - if ( - !isNavigationFailure( - err, - NavigationFailureType.redirected - ) || - prev !== START - ) { - this$1.ready = true; - this$1.readyErrorCbs.forEach((cb) => { - cb(err); - }); - } - } - } - ); -}; - -History.prototype.confirmTransition = function confirmTransition( - route, - onComplete, - onAbort -) { - const this$1 = this; - - const current = this.current; - this.pending = route; - const abort = function (err) { - // changed after adding errors with - // https://github.com/vuejs/vue-router/pull/3047 before that change, - // redirect and aborted navigation would produce an err == null - if (!isNavigationFailure(err) && isError(err)) { - if (this$1.errorCbs.length) { - this$1.errorCbs.forEach((cb) => { - cb(err); - }); - } else { - warn(false, "uncaught error during route navigation:"); - console.error(err); - } - } - onAbort && onAbort(err); - }; - const lastRouteIndex = route.matched.length - 1; - const lastCurrentIndex = current.matched.length - 1; - if ( - isSameRoute(route, current) && - // in the case the route map has been dynamically appended to - lastRouteIndex === lastCurrentIndex && - route.matched[lastRouteIndex] === current.matched[lastCurrentIndex] - ) { - this.ensureURL(); - - return; - } - - const ref = resolveQueue(this.current.matched, route.matched); - const updated = ref.updated; - const deactivated = ref.deactivated; - const activated = ref.activated; - - const queue = [].concat( - // in-component leave guards - extractLeaveGuards(deactivated), - // global before hooks - this.router.beforeHooks, - // in-component update hooks - extractUpdateHooks(updated), - // in-config enter guards - activated.map((m) => m.beforeEnter), - // async components - resolveAsyncComponents(activated) - ); - - const iterator = function (hook, next) { - if (this$1.pending !== route) { - return abort(createNavigationCancelledError(current, route)); - } - try { - hook(route, current, (to) => { - if (to === false) { - // next(false) -> abort navigation, ensure current URL - this$1.ensureURL(true); - abort(createNavigationAbortedError(current, route)); - } else if (isError(to)) { - this$1.ensureURL(true); - abort(to); - } else if ( - typeof to === "string" || - (typeof to === "object" && - (typeof to.path === "string" || - typeof to.name === "string")) - ) { - // next('/') or next({ path: '/' }) -> redirect - abort(createNavigationRedirectedError(current, route)); - if (typeof to === "object" && to.replace) { - this$1.replace(to); - } else { - this$1.push(to); - } - } else { - // confirm transition and pass on the value - next(to); - } - }); - } catch (e) { - abort(e); - } - }; - - runQueue(queue, iterator, () => { - // wait until async components are resolved before - // extracting in-component enter guards - const enterGuards = extractEnterGuards(activated); - const queue = enterGuards.concat(this$1.router.resolveHooks); - runQueue(queue, iterator, () => { - if (this$1.pending !== route) { - return abort(createNavigationCancelledError(current, route)); - } - this$1.pending = null; - onComplete(route); - if (this$1.router.app) { - nextTick(() => { - handleRouteEntered(route); - }); - } - }); - }); -}; - -History.prototype.updateRoute = function updateRoute(route) { - this.current = route; - this.cb && this.cb(route); -}; - -History.prototype.setupListeners = function setupListeners() { - // Default implementation is empty -}; - -History.prototype.teardown = function teardown() { - // clean up event listeners - // https://github.com/vuejs/vue-router/issues/2341 - this.listeners.forEach((cleanupListener) => { - cleanupListener(); - }); - this.listeners = []; - - // reset current history route - // https://github.com/vuejs/vue-router/issues/3294 - this.current = START; - this.pending = null; -}; - -function normalizeBase(base) { - if (!base) { - if (inBrowser) { - // respect tag - const baseEl = document.querySelector("base"); - base = (baseEl && baseEl.getAttribute("href")) || "/"; - // strip full URL origin - base = base.replace(/^https?:\/\/[^\/]+/, ""); - } else { - base = "/"; - } - } - // make sure there's the starting slash - if (base.charAt(0) !== "/") { - base = `/${base}`; - } - // remove trailing slash - return base.replace(/\/$/, ""); -} - -function resolveQueue(current, next) { - let i; - const max = Math.max(current.length, next.length); - for (i = 0; i < max; i++) { - if (current[i] !== next[i]) { - break; - } - } - - return { - updated: next.slice(0, i), - activated: next.slice(i), - deactivated: current.slice(i) - }; -} - -function extractGuards(records, name, bind, reverse) { - const guards = flatMapComponents(records, (def, instance, match, key) => { - const guard = extractGuard(def, name); - if (guard) { - return Array.isArray(guard) - ? guard.map((guard) => bind(guard, instance, match, key)) - : bind(guard, instance, match, key); - } - }); - - return flatten(reverse ? guards.reverse() : guards); -} - -function extractGuard(def, key) { - if (typeof def !== "function") { - // extend now so that global mixins are applied. - // def = _Vue.extend(def); - } - - return def[key]; -} - -function extractLeaveGuards(deactivated) { - return extractGuards(deactivated, "beforeRouteLeave", bindGuard, true); -} - -function extractUpdateHooks(updated) { - return extractGuards(updated, "beforeRouteUpdate", bindGuard); -} - -function bindGuard(guard, instance) { - if (instance) { - return function boundRouteGuard() { - return guard.apply(instance, arguments); - }; - } -} - -function extractEnterGuards(activated) { - return extractGuards( - activated, - "beforeRouteEnter", - (guard, _, match, key) => bindEnterGuard(guard, match, key) - ); -} - -function bindEnterGuard(guard, match, key) { - return function routeEnterGuard(to, from, next) { - return guard(to, from, (cb) => { - if (typeof cb === "function") { - if (!match.enteredCbs[key]) { - match.enteredCbs[key] = []; - } - match.enteredCbs[key].push(cb); - } - next(cb); - }); - }; -} - -/* */ - -const HTML5History = /* @__PURE__*/ (function (History) { - function HTML5History(router, base) { - History.call(this, router, base); - - this._startLocation = getLocation(this.base); - } - - if (History) HTML5History.__proto__ = History; - HTML5History.prototype = Object.create(History && History.prototype); - HTML5History.prototype.constructor = HTML5History; - - HTML5History.prototype.setupListeners = function setupListeners() { - const this$1 = this; - - if (this.listeners.length > 0) { - return; - } - - const router = this.router; - const expectScroll = router.options.scrollBehavior; - const supportsScroll = supportsPushState && expectScroll; - - if (supportsScroll) { - this.listeners.push(setupScroll()); - } - - const handleRoutingEvent = function () { - const current = this$1.current; - - // Avoiding first `popstate` event dispatched in some browsers but first - // history route not updated since async guard at the same time. - const location = getLocation(this$1.base); - if ( - this$1.current === START && - location === this$1._startLocation - ) { - return; - } - - this$1.transitionTo(location, (route) => { - if (supportsScroll) { - handleScroll(router, route, current, true); - } - }); - }; - window.addEventListener("popstate", handleRoutingEvent); - this.listeners.push(() => { - window.removeEventListener("popstate", handleRoutingEvent); - }); - }; - - HTML5History.prototype.go = function go(n) { - window.history.go(n); - }; - - HTML5History.prototype.push = function push(location, onComplete, onAbort) { - const this$1 = this; - - const ref = this; - const fromRoute = ref.current; - this.transitionTo( - location, - (route) => { - pushState(cleanPath(this$1.base + route.fullPath)); - handleScroll(this$1.router, route, fromRoute, false); - onComplete && onComplete(route); - }, - onAbort - ); - }; - - HTML5History.prototype.replace = function replace( - location, - onComplete, - onAbort - ) { - const this$1 = this; - - const ref = this; - const fromRoute = ref.current; - this.transitionTo( - location, - (route) => { - replaceState(cleanPath(this$1.base + route.fullPath)); - handleScroll(this$1.router, route, fromRoute, false); - onComplete && onComplete(route); - }, - onAbort - ); - }; - - HTML5History.prototype.ensureURL = function ensureURL(push) { - if (getLocation(this.base) !== this.current.fullPath) { - const current = cleanPath(this.base + this.current.fullPath); - push ? pushState(current) : replaceState(current); - } - }; - - HTML5History.prototype.getCurrentLocation = function getCurrentLocation() { - return getLocation(this.base); - }; - - return HTML5History; -})(History); - -function getLocation(base) { - let path = window.location.pathname; - const pathLowerCase = path.toLowerCase(); - const baseLowerCase = base.toLowerCase(); - // base="/a" shouldn't turn path="/app" into "/a/pp" - // https://github.com/vuejs/vue-router/issues/3555 - // so we ensure the trailing slash in the base - if ( - base && - (pathLowerCase === baseLowerCase || - pathLowerCase.indexOf(cleanPath(`${baseLowerCase}/`)) === 0) - ) { - path = path.slice(base.length); - } - - return (path || "/") + window.location.search + window.location.hash; -} - -/* */ - -const HashHistory = /* @__PURE__*/ (function (History) { - function HashHistory(router, base, fallback) { - History.call(this, router, base); - // check history fallback deeplinking - if (fallback && checkFallback(this.base)) { - return; - } - ensureSlash(); - } - - if (History) HashHistory.__proto__ = History; - HashHistory.prototype = Object.create(History && History.prototype); - HashHistory.prototype.constructor = HashHistory; - - // this is delayed until the app mounts - // to avoid the hashchange listener being fired too early - HashHistory.prototype.setupListeners = function setupListeners() { - const this$1 = this; - - if (this.listeners.length > 0) { - return; - } - - const router = this.router; - const expectScroll = router.options.scrollBehavior; - const supportsScroll = supportsPushState && expectScroll; - - if (supportsScroll) { - this.listeners.push(setupScroll()); - } - - const handleRoutingEvent = function () { - const current = this$1.current; - if (!ensureSlash()) { - return; - } - this$1.transitionTo(getHash(), (route) => { - if (supportsScroll) { - handleScroll(this$1.router, route, current, true); - } - if (!supportsPushState) { - replaceHash(route.fullPath); - } - }); - }; - const eventType = supportsPushState ? "popstate" : "hashchange"; - window.addEventListener(eventType, handleRoutingEvent); - this.listeners.push(() => { - window.removeEventListener(eventType, handleRoutingEvent); - }); - }; - - HashHistory.prototype.push = function push(location, onComplete, onAbort) { - const this$1 = this; - - const ref = this; - const fromRoute = ref.current; - this.transitionTo( - location, - (route) => { - pushHash(route.fullPath); - handleScroll(this$1.router, route, fromRoute, false); - onComplete && onComplete(route); - }, - onAbort - ); - }; - - HashHistory.prototype.replace = function replace( - location, - onComplete, - onAbort - ) { - const this$1 = this; - - const ref = this; - const fromRoute = ref.current; - this.transitionTo( - location, - (route) => { - replaceHash(route.fullPath); - handleScroll(this$1.router, route, fromRoute, false); - onComplete && onComplete(route); - }, - onAbort - ); - }; - - HashHistory.prototype.go = function go(n) { - window.history.go(n); - }; - - HashHistory.prototype.ensureURL = function ensureURL(push) { - const current = this.current.fullPath; - if (getHash() !== current) { - push ? pushHash(current) : replaceHash(current); - } - }; - - HashHistory.prototype.getCurrentLocation = function getCurrentLocation() { - return getHash(); - }; - - return HashHistory; -})(History); - -function checkFallback(base) { - const location = getLocation(base); - if (!/^\/#/.test(location)) { - window.location.replace(cleanPath(`${base}/#${location}`)); - - return true; - } -} - -function ensureSlash() { - const path = getHash(); - if (path.charAt(0) === "/") { - return true; - } - replaceHash(`/${path}`); - - return false; -} - -function getHash() { - // We can't use window.location.hash here because it's not - // consistent across browsers - Firefox will pre-decode it! - let href = window.location.href; - const index = href.indexOf("#"); - // empty path - if (index < 0) { - return ""; - } - - href = href.slice(index + 1); - - return href; -} - -function getUrl(path) { - const href = window.location.href; - const i = href.indexOf("#"); - const base = i >= 0 ? href.slice(0, i) : href; - - return `${base}#${path}`; -} - -function pushHash(path) { - if (supportsPushState) { - pushState(getUrl(path)); - } else { - window.location.hash = path; - } -} - -function replaceHash(path) { - if (supportsPushState) { - replaceState(getUrl(path)); - } else { - window.location.replace(getUrl(path)); - } -} - -/* */ - -const AbstractHistory = /* @__PURE__*/ (function (History) { - function AbstractHistory(router, base) { - History.call(this, router, base); - this.stack = []; - this.index = -1; - } - - if (History) AbstractHistory.__proto__ = History; - AbstractHistory.prototype = Object.create(History && History.prototype); - AbstractHistory.prototype.constructor = AbstractHistory; - - AbstractHistory.prototype.push = function push( - location, - onComplete, - onAbort - ) { - const this$1 = this; - - this.transitionTo( - location, - (route) => { - this$1.stack = this$1.stack - .slice(0, this$1.index + 1) - .concat(route); - this$1.index++; - onComplete && onComplete(route); - }, - onAbort - ); - }; - - AbstractHistory.prototype.replace = function replace( - location, - onComplete, - onAbort - ) { - const this$1 = this; - - this.transitionTo( - location, - (route) => { - this$1.stack = this$1.stack - .slice(0, this$1.index) - .concat(route); - onComplete && onComplete(route); - }, - onAbort - ); - }; - - AbstractHistory.prototype.go = function go(n) { - const this$1 = this; - - const targetIndex = this.index + n; - if (targetIndex < 0 || targetIndex >= this.stack.length) { - return; - } - const route = this.stack[targetIndex]; - this.confirmTransition( - route, - () => { - const prev = this$1.current; - this$1.index = targetIndex; - this$1.updateRoute(route); - this$1.router.afterHooks.forEach((hook) => { - hook && hook(route, prev); - }); - }, - (err) => { - if ( - isNavigationFailure(err, NavigationFailureType.duplicated) - ) { - this$1.index = targetIndex; - } - } - ); - }; - - AbstractHistory.prototype.getCurrentLocation = - function getCurrentLocation() { - const current = this.stack[this.stack.length - 1]; - - return current ? current.fullPath : "/"; - }; - - AbstractHistory.prototype.ensureURL = function ensureURL() { - // noop - }; - - return AbstractHistory; -})(History); - -/* */ - -const VueRouter = function VueRouter(options) { - if (options === void 0) options = {}; - - this.app = null; - this.apps = []; - this.options = options; - this.beforeHooks = []; - this.resolveHooks = []; - this.afterHooks = []; - this.matcher = createMatcher(options.routes || [], this); - - let mode = options.mode || "hash"; - this.fallback = - mode === "history" && !supportsPushState && options.fallback !== false; - if (this.fallback) { - mode = "hash"; - } - if (!inBrowser) { - mode = "abstract"; - } - this.mode = mode; - - switch (mode) { - case "history": - this.history = new HTML5History(this, options.base); - break; - case "hash": - this.history = new HashHistory(this, options.base, this.fallback); - break; - case "abstract": - this.history = new AbstractHistory(this, options.base); - break; - default: { - assert(false, `invalid mode: ${mode}`); - } - } -}; - -const prototypeAccessors = { currentRoute: { configurable: true } }; - -VueRouter.prototype.match = function match(raw, current, redirectedFrom) { - return this.matcher.match(raw, current, redirectedFrom); -}; - -prototypeAccessors.currentRoute.get = function () { - return this.history && this.history.current; -}; - -VueRouter.prototype.init = function init(app /* Vue component instance */) { - const this$1 = this; - - this.apps.push(app); - - // set up app destroyed handler - // https://github.com/vuejs/vue-router/issues/2639 - app.once("hook:destroyed", () => { - // clean out app from this.apps array once destroyed - const index = this$1.apps.indexOf(app); - if (index > -1) { - this$1.apps.splice(index, 1); - } - // ensure we still have a main app or null if no apps - // we do not release the router so it can be reused - if (this$1.app === app) { - this$1.app = this$1.apps[0] || null; - } - - if (!this$1.app) { - this$1.history.teardown(); - } - }); - - // main app previously initialized - // return as we don't need to set up new history listener - if (this.app) { - return; - } - - this.app = app; - - const history = this.history; - - if (history instanceof HTML5History || history instanceof HashHistory) { - const handleInitialScroll = function (routeOrError) { - const from = history.current; - const expectScroll = this$1.options.scrollBehavior; - const supportsScroll = supportsPushState && expectScroll; - - if (supportsScroll && "fullPath" in routeOrError) { - handleScroll(this$1, routeOrError, from, false); - } - }; - const setupListeners = function (routeOrError) { - history.setupListeners(); - handleInitialScroll(routeOrError); - }; - history.transitionTo( - history.getCurrentLocation(), - setupListeners, - setupListeners - ); - } - - history.listen((route) => { - this$1.apps.forEach((app) => { - app._router.history.current = route; - }); - }); -}; - -VueRouter.prototype.beforeEach = function beforeEach(fn) { - return registerHook(this.beforeHooks, fn); -}; - -VueRouter.prototype.beforeResolve = function beforeResolve(fn) { - return registerHook(this.resolveHooks, fn); -}; - -VueRouter.prototype.afterEach = function afterEach(fn) { - return registerHook(this.afterHooks, fn); -}; - -VueRouter.prototype.onReady = function onReady(cb, errorCb) { - this.history.onReady(cb, errorCb); -}; - -VueRouter.prototype.onError = function onError(errorCb) { - this.history.onError(errorCb); -}; - -VueRouter.prototype.push = function push(location, onComplete, onAbort) { - const this$1 = this; - - // $flow-disable-line - if (!onComplete && !onAbort && typeof Promise !== "undefined") { - return new Promise((resolve, reject) => { - this$1.history.push(location, resolve, reject); - }); - } else { - this.history.push(location, onComplete, onAbort); - } -}; - -VueRouter.prototype.replace = function replace(location, onComplete, onAbort) { - const this$1 = this; - - // $flow-disable-line - if (!onComplete && !onAbort && typeof Promise !== "undefined") { - return new Promise((resolve, reject) => { - this$1.history.replace(location, resolve, reject); - }); - } else { - this.history.replace(location, onComplete, onAbort); - } -}; - -VueRouter.prototype.go = function go(n) { - this.history.go(n); -}; - -VueRouter.prototype.back = function back() { - this.go(-1); -}; - -VueRouter.prototype.forward = function forward() { - this.go(1); -}; - -VueRouter.prototype.getMatchedComponents = function getMatchedComponents(to) { - const route = to - ? to.matched - ? to - : this.resolve(to).route - : this.currentRoute; - if (!route) { - return []; - } - - return [].concat.apply( - [], - route.matched.map((m) => - Object.keys(m.components).map((key) => m.components[key]) - ) - ); -}; - -VueRouter.prototype.resolve = function resolve(to, current, append) { - current = current || this.history.current; - const location = normalizeLocation(to, current, append, this); - const route = this.match(location, current); - const fullPath = route.redirectedFrom || route.fullPath; - const base = this.history.base; - const href = createHref(base, fullPath, this.mode); - - return { - location, - route, - href, - // for backwards compat - normalizedTo: location, - resolved: route - }; -}; - -VueRouter.prototype.getRoutes = function getRoutes() { - return this.matcher.getRoutes(); -}; - -VueRouter.prototype.addRoute = function addRoute(parentOrRoute, route) { - this.matcher.addRoute(parentOrRoute, route); - if (this.history.current !== START) { - this.history.transitionTo(this.history.getCurrentLocation()); - } -}; - -Object.defineProperties(VueRouter.prototype, prototypeAccessors); - -function registerHook(list, fn) { - list.push(fn); - - return function () { - const i = list.indexOf(fn); - if (i > -1) { - list.splice(i, 1); - } - }; -} - -function createHref(base, fullPath, mode) { - const path = mode === "hash" ? `#${fullPath}` : fullPath; - - return base ? cleanPath(`${base}/${path}`) : path; -} - -// VueRouter.install = install; -VueRouter.version = "3.5.2"; -VueRouter.isNavigationFailure = isNavigationFailure; -VueRouter.NavigationFailureType = NavigationFailureType; -VueRouter.START_LOCATION = START; - -let $router; -const cbs = []; -@shortcut() -export class RouterWidget extends Widget { - static xtype = "bi.router"; - - init() { - this.$router = - this._router = - Router.$router = - $router = - new VueRouter({ - mode: this.options.mode, - routes: this.options.routes, - base: this.options.base - }); - Fix.defineReactiveProperty(Router.$router.history, "current"); - this.$router.beforeEach((to, from, next) => { - if (to.matched.length === 0) { - // 如果上级也未匹配到路由则跳转主页面,如果上级能匹配到则转上级路由 - from.path ? next({ path: from.path }) : next("/"); - } else { - // 如果匹配到正确跳转 - next(); - } - }); - this.$router.afterEach(() => { - cbs.forEach((cb) => { - cb(); - }); - }); - this.$router.init(this); - } -} - -@shortcut() -export class RouterView extends Widget { - static xtype = "bi.router_view"; - - props = { - baseCls: "bi-router-view", - deps: 0, - name: "default" - }; - created() { - const self = this, - o = this.options; - cbs.push( - (this._callbackListener = function () { - const current = $router.history.current; - // 匹配的路径名(/component/:id) - let matchedPath = - current.matched[o.deps] && current.matched[o.deps].path; - const component = - current.matched[o.deps] && - current.matched[o.deps].components[o.name]; - - if (BI.isNotNull(component)) { - if (matchedPath) { - BI.each(current.params, (key, value) => { - // 把 :id 替换成具体的值(/component/demo.td) - matchedPath = matchedPath.replace(`:${key}`, value); - }); - } - self.tab.setSelect(matchedPath || "/"); - } - }) - ); - // "bi.router_view"是由"bi.tab"实现的,cardCreator是一个异步过程,在"bi.router_view"创建之前,cbs里不会有创建子组件的方法,在初始化路由时,没法直接渲染到子组件,所以这里手动加了一次调用 - this._callbackListener(); - } - - render() { - const self = this, - o = this.options; - - return { - type: "bi.tab", - ref(_ref) { - self.tab = _ref; - }, - single: o.single, // 是不是单页面 - keepAlives: o.keepAlives, - logic: { - dynamic: false - }, - showIndex: false, - cardCreator(v) { - return $router.history.current.matched[o.deps].components[ - o.name - ]; - } - }; - } - - destroyed() { - // BI.remove方法会把第二个参数当迭代器执行导致方法多执行一遍 - cbs.splice(cbs.indexOf(this._callbackListener), 1); - } -} - -Router.isSameRoute = isSameRoute; diff --git a/src/widget/index.js b/src/widget/index.js deleted file mode 100644 index 2cdd59ea2..000000000 --- a/src/widget/index.js +++ /dev/null @@ -1,37 +0,0 @@ -export { Collapse } from "./collapse/collapse"; -export { SelectTreeExpander } from "./selecttree/selecttree.expander"; -export { SelectTreeCombo } from "./selecttree/selecttree.combo"; -export { SingleTreeCombo } from "./singletree/singletree.combo"; -export { MultiTreeCombo } from "./multitree/multi.tree.combo"; -export { MultiTreeInsertCombo } from "./multitree/multi.tree.insert.combo"; -export { MultiTreeListCombo } from "./multitree/multi.tree.list.combo"; -export { NumberEditor } from "./numbereditor/number.editor"; -export { NumberInterval } from "./numberinterval/numberinterval"; -export { YearMonthInterval } from "./yearmonthinterval/yearmonthinterval"; -export { YearQuarterInterval } from "./yearquarterinterval/yearquarterinterval"; -export { YearInterval } from "./yearinterval/yearinterval"; - -export * from "./date/calendar"; -export * from "./dynamicdate"; -export * from "./datepane"; -export * from "./datetime"; -export * from "./datetimepane"; -export * from "./dynamicdatetime"; -export * from "./time"; -export * from "./timeinterval"; -export * from "./editor"; -export * from "./yearmonth"; -export * from "./multiselect"; -export * from "./multiselectlist"; -export * from "./downlist"; -export * from "./singleslider"; -export * from "./intervalslider"; -export * from "./year"; -export * from "./multilayersingletree"; -export * from "./multilayerselecttree"; -export * from "./searchmultitextvaluecombo"; -export * from "./singleselect"; -export * from "./multilayerdownlist"; -export * from "./yearquarter"; -export * from "./textvaluedownlistcombo"; -export * from "./searchmultitextvaluecombo"; diff --git a/template/index.html b/template/index.html deleted file mode 100644 index f37fddb06..000000000 --- a/template/index.html +++ /dev/null @@ -1,46 +0,0 @@ - - - - - - - - Demo - - - - - - -
- - - - diff --git a/tsconfig.json b/tsconfig.json deleted file mode 100644 index 5ee3e9369..000000000 --- a/tsconfig.json +++ /dev/null @@ -1,46 +0,0 @@ -{ - "compilerOptions": { - "sourceMap": true, - "target": "es2017", - "module": "es2015", - "moduleResolution": "node", - "lib": [ - "es2017", - "dom" - ], - "declaration": true, - "experimentalDecorators": true, - "outDir": "./dist/lib", - "baseUrl": ".", - // "strict": true, - "strictNullChecks": true, - "noImplicitAny": true, - "noImplicitThis": true, - "noUnusedLocals": true, - "noUnusedParameters": true, - "noImplicitReturns": true, - "noFallthroughCasesInSwitch": true, - "emitDeclarationOnly": true, - "allowJs": true, - "paths": { - "@/*": ["./src/*"] - } - }, - "include": [ - "typescript/*.ts", - "typescript/**/*.ts", - "types/*.d.ts", - "src/*.js", - "src/**/*.js", - "examples/*.js", - "examples/**/*.js", - "demo/*/*/*/*/*.js", - "demo/*/*/*/*.js", - "demo/*/*/*.js", - "demo/*/*.js", - ], - "exclude": [ - "src/router/router.js", - "src/core/0.foundation.js", - ] -} \ No newline at end of file diff --git a/ui/js/index.js b/ui/js/index.js deleted file mode 100644 index e69de29bb..000000000 diff --git a/ui/less/app.less b/ui/less/app.less deleted file mode 100644 index 27e4631e7..000000000 --- a/ui/less/app.less +++ /dev/null @@ -1,2 +0,0 @@ -@import "../../src/less/resource/app.less"; -@import "var.less"; diff --git a/ui/less/background.less b/ui/less/background.less deleted file mode 100644 index a6cbde36b..000000000 --- a/ui/less/background.less +++ /dev/null @@ -1,2 +0,0 @@ -@import "../../src/less/resource/background.less"; -@import "var.less"; diff --git a/ui/less/font.less b/ui/less/font.less deleted file mode 100644 index d7399c46e..000000000 --- a/ui/less/font.less +++ /dev/null @@ -1,2 +0,0 @@ -@import "../../src/less/resource/font.less"; -@import "var.less"; diff --git a/ui/less/icon.less b/ui/less/icon.less deleted file mode 100644 index 8aa44a2ae..000000000 --- a/ui/less/icon.less +++ /dev/null @@ -1,5 +0,0 @@ -@import "../../src/less/resource/icon.less"; -@import "var.less"; - - - diff --git a/ui/less/var.less b/ui/less/var.less deleted file mode 100644 index c89fa87cc..000000000 --- a/ui/less/var.less +++ /dev/null @@ -1,5 +0,0 @@ -@webUrl: 'resources?path=/com/fr/web/ui/'; - -@fontUrl: '@{webUrl}font/'; //图片的基本地址 -@imageUrl: '@{webUrl}images/1x/'; //图片的基本地址 -@image2xUrl: '@{webUrl}images/2x/'; //2倍图片的基本地址 diff --git a/webpack/attachments.js b/webpack/attachments.js deleted file mode 100644 index 542b3fa10..000000000 --- a/webpack/attachments.js +++ /dev/null @@ -1,274 +0,0 @@ -const { sync, uniq } = require("./utils"); - -const fixJs = "./dist/fix/fix.js"; -const fixProxyJs = './dist/fix/fix.proxy.js'; -const fixCompact = "./dist/fix/fix.compact.js"; -const workerCompact = './dist/fix/worker.compact.js'; -const lodashJs = "src/core/1.lodash.js"; -const jqueryJs = "src/core/platform/web/jquery/_jquery.js"; -const popperJs = "src/core/controller/popper.js"; - -const runtimePolyfill = ["core-js/stable"]; - -const basicAttachmentMap = { - polyfill: sync([ - "src/core/0.foundation.js", - "src/polyfill/index.js", - ]).concat(runtimePolyfill), - core: sync([ - "src/less/core/**/*.less", - "src/less/theme/**/*.less", - // lodashJs, - // jqueryJs, - // popperJs, - "src/core/conflict.js", - "src/bundle.js", - // "src/core/**/*.js", - // "src/data/**/*.js", - ]), - // 最基础的控件 - base: sync([ - "src/less/base/**/*.less", - // "src/third/**/*.js", - // "src/base/**/*.js", - ]), - // 实现好的一些基础实例 - "case": sync([ - // "src/case/**/*.js", - "src/less/case/**/*.less", - ]), - widget: sync([ - "src/less/widget/**/*.less", - "src/less/component/**/*.less", - // "src/widget/**/*.js", - // "src/component/**/*.js", - ]), - router: sync([ - "src/router/index.js", - ]), - core_without_platform: sync([ - "src/core/0.foundation.js", - lodashJs, - "src/core/index.js", - // "src/data/**/*.js", - ], [ - "src/core/platform/index.js", - "src/core/controller/index.js", - ]), - core_without_normalize: sync( - ["src/less/core/**/*.less", "src/less/theme/**/*.less"], ["src/less/core/normalize.less", "src/less/core/normalize2.less"] - ), - core_without_conflict: sync([ - "src/less/core/**/*.less", - "src/less/theme/**/*.less", - lodashJs, - "src/core/index.js", - // "src/data/**/*.js", - ], [ - "src/core/conflict.js", - ]), - resource: sync(["src/less/resource/**/*.less"]), - font: sync(["public/less/font.less"]), - ts: ['./typescript/bundle.ts'], - ui: sync([ - 'ui/less/app.less', - 'ui/less/*.less', - 'ui/js/index.js', - ]), - config: sync(["demo/version.js", "i18n/i18n.cn.js"]), - utils: sync([ - "src/core/0.foundation.js", - lodashJs, - "src/core/constant/index.js", - "src/core/func/index.js", - "src/core/2.base.js", - "src/core/3.ob.js", - "src/core/5.inject.js", - "src/core/utils/index.js", - "i18n/i18n.cn.js", - "_mobile/date.i18n.cn.js", - // "src/data/**/*.js", - ]), - fix: [fixJs], - fixProxy: [fixProxyJs], - less: sync([ - "src/less/core/**/*.less", - "src/less/theme/**/*.less", - "src/less/base/**/*.less", - "src/less/case/**/*.less", - "src/less/widget/**/*.less", - "src/less/component/**/*.less", - ]), -}; - -const bundle = [].concat( - basicAttachmentMap.polyfill, - basicAttachmentMap.core, - basicAttachmentMap.fix, - basicAttachmentMap.base, - basicAttachmentMap.case, - basicAttachmentMap.widget, - sync(["public/less/app.less", "public/less/**/*.less"]), - [fixCompact, workerCompact], - basicAttachmentMap.router, - sync(["public/js/index.js", "public/js/index.js", "i18n/i18n.cn.js"]), - basicAttachmentMap.ts, -); - -const bundleCss = [].concat( - basicAttachmentMap.less, - sync(["public/less/app.less", "public/less/**/*.less"]), -); - -// const bundleModern = [].concat( -// sync(["src/less/modern.less"]), -// sync(["public/modern/app.less", "public/modern/**/*.less"]), -// ); - -const coreJs = [].concat( - basicAttachmentMap.polyfill, - basicAttachmentMap.core, - basicAttachmentMap.fix, - basicAttachmentMap.base, - basicAttachmentMap.case, - basicAttachmentMap.widget, - ['./dist/fix/fix.compact.js'], - basicAttachmentMap.router, - basicAttachmentMap.ts, -); - -const resource = sync(["private/less/app.less", "private/less/**/*.less"]); - -const config = sync(["public/js/index.js", "public/js/index.js", "i18n/i18n.cn.js"]); - -const bundleWithoutNormalize = [].concat( - basicAttachmentMap.core_without_normalize, - sync([ - "src/less/base/**/*.less", - "src/less/case/**/*.less", - "src/less/widget/**/*.less", - "src/less/component/**/*.less", - "public/less/**/*.less", - // ts的less - ], [ - "public/less/app.less", - ]), -); - -const fineuiWithoutNormalize = [].concat( - basicAttachmentMap.core_without_normalize, - sync([ - "src/less/base/**/*.less", - "src/less/case/**/*.less", - "src/less/widget/**/*.less", - "src/less/component/**/*.less", - 'ui/less/app.less', - 'ui/less/**/*.less', - ]), -); - -const fineui = [].concat( - basicAttachmentMap.polyfill, - basicAttachmentMap.core, - basicAttachmentMap.fix, - basicAttachmentMap.base, - basicAttachmentMap.case, - basicAttachmentMap.widget, - basicAttachmentMap.router, - [fixCompact, workerCompact], - basicAttachmentMap.ui, - basicAttachmentMap.ts, -); - -const fineuiWithoutConflict = [].concat( - basicAttachmentMap.polyfill, - basicAttachmentMap.core_without_conflict, - basicAttachmentMap.fix, - basicAttachmentMap.base, - basicAttachmentMap.case, - basicAttachmentMap.widget, - basicAttachmentMap.router, - [fixCompact, workerCompact], - basicAttachmentMap.ui, - basicAttachmentMap.ts, -); - -// const fineuiModern = [].concat( -// sync(["src/less/modern.less"]), -// sync([ -// 'ui/modern/app.less', -// 'ui/modern/**/*.less', -// ]), -// ); - -const fineuiProxy = [].concat( - basicAttachmentMap.polyfill, - basicAttachmentMap.core, - basicAttachmentMap.fixProxy, - basicAttachmentMap.base, - basicAttachmentMap.case, - basicAttachmentMap.widget, - basicAttachmentMap.router, - [fixCompact, workerCompact], - basicAttachmentMap.ui, - basicAttachmentMap.ts, -); - -const fineuiWithoutJqueryAndPolyfillJs = [].concat( - runtimePolyfill, - sync([ - "src/core/0.foundation.js", - lodashJs, - "src/core/index.js", - // "src/data/**/*.js", - ], [ - "src/core/platform/index.js", - ]), - basicAttachmentMap.fix, - sync([ - "src/base/index.js", - "src/case/index.js", - ], [ - "src/base/single/input/file.js", - "src/case/ztree/index.js", - ]), - basicAttachmentMap.widget, - sync([fixCompact, workerCompact, "ui/js/index.js"]), - basicAttachmentMap.ts, -); - -const demo = [].concat( - basicAttachmentMap.polyfill, - basicAttachmentMap.core, - basicAttachmentMap.fix, - basicAttachmentMap.config, - basicAttachmentMap.base, - basicAttachmentMap.case, - basicAttachmentMap.widget, - basicAttachmentMap.router, - sync(["public/less/app.less", "public/less/**/*.less"]), - [fixCompact, workerCompact], - basicAttachmentMap.ts, - sync(["demo/less/*.less", "demo/less/**/*.less", "demo/app.js", "demo/js/index.js", "demo/config.js"]), -); - -module.exports = { - fix: fixJs, - fixProxy: fixProxyJs, - lodash: lodashJs, - font: basicAttachmentMap.font, - bundle: uniq(bundle), - fineuiWithoutNormalize: uniq(fineuiWithoutNormalize), - fineuiWithoutConflict: uniq(fineuiWithoutConflict), - bundleWithoutNormalize: uniq(bundleWithoutNormalize), - fineui: uniq(fineui), - fineuiProxy: uniq(fineuiProxy), - fineuiWithoutJqueryAndPolyfillJs: uniq(fineuiWithoutJqueryAndPolyfillJs), - utils: uniq(basicAttachmentMap.utils), - demo: uniq(demo), - coreWithoutPlatform: uniq(basicAttachmentMap.core_without_platform), - coreJs: uniq(coreJs), - resource: uniq((resource)), - config: uniq(config), - bundleCss: uniq(bundleCss), -}; diff --git a/webpack/components.js b/webpack/components.js deleted file mode 100644 index ea6530f9a..000000000 --- a/webpack/components.js +++ /dev/null @@ -1,37 +0,0 @@ -const basicAttachmentMap = { - single: ["src/base/single/index.js"], - layer: ["src/base/layer/index.js"], - pane: ["src/base/1.pane.js"], - button_group: ["src/base/combination/group.button.js"], - buttons: ["src/case/button/index.js"], - checkboxes: ["src/case/checkbox/index.js"], - combos: ["src/case/combo/index.js"], - editors: ["src/case/editor/index.js"], - triggers: ["src/case/trigger/index.js"], - calendar: ["src/case/calendar/index.js"], - color_chooser: ["src/case/colorchooser/index.js"], - segment: ["src/case/segment/index.js"], - linear_segment: ["src/case/linearsegment/index.js"], - date: ["src/widget/date/index.js"], - down_list: ["src/widget/downlist/index.js"], - text_value_down_list_combo: ["src/widget/textvaluedownlistcombo/index.js"], -}; - -module.exports = { - single: basicAttachmentMap.single, - layer: basicAttachmentMap.layer, - pane: basicAttachmentMap.pane, - button_group: basicAttachmentMap.button_group, - buttons: basicAttachmentMap.buttons, - checkboxes: basicAttachmentMap.checkboxes, - combos: basicAttachmentMap.combos, - editors: basicAttachmentMap.editors, - triggers: basicAttachmentMap.triggers, - calendar: basicAttachmentMap.calendar, - color_chooser: basicAttachmentMap.color_chooser, - segment: basicAttachmentMap.segment, - linear_segment: basicAttachmentMap.linear_segment, - date: basicAttachmentMap.date, - down_list: basicAttachmentMap.down_list, - text_value_down_list_combo: basicAttachmentMap.text_value_down_list_combo, -}; diff --git a/webpack/dirs.js b/webpack/dirs.js deleted file mode 100644 index 512645e97..000000000 --- a/webpack/dirs.js +++ /dev/null @@ -1,16 +0,0 @@ -const path = require("path"); -module.exports = { - DEST: path.resolve(__dirname, "../dist"), - NODE_MODULES: path.resolve(__dirname, "../node_modules"), - PRIVATE: path.resolve(__dirname, "../private"), - BABEL_CONFIG: path.resolve(__dirname, "../babel.config.js"), - TYPESCRIPT: path.resolve(__dirname, "../typescript"), - ROUTER: path.resolve(__dirname, "../src/router"), - SRC: path.resolve(__dirname, "../src"), - DEMO: path.resolve(__dirname, "../demo"), - PUBLIC: path.resolve(__dirname, "../public"), - I18N: path.resolve(__dirname, "../i18n"), - UI: path.resolve(__dirname, "../ui"), - MOBILE: path.resolve(__dirname, "../_mobile"), - FIX: path.resolve(__dirname, "../dist/fix"), -}; diff --git a/webpack/utils.js b/webpack/utils.js deleted file mode 100644 index 7ed3de515..000000000 --- a/webpack/utils.js +++ /dev/null @@ -1,24 +0,0 @@ -const path = require('path'); -const glob = require('glob'); - -// const glob = require('fast-glob'); - -function uniq(names) { - return [...new Set(names)]; -} - -const globalExcludes = [ - "**/*/__test__/*.js", -]; - -function sync(patterns, excludes = []) { - const ignore = globalExcludes.concat(excludes).map(pattern => path.join(__dirname, "../", pattern).replace(/\\/g, '/')); - - return patterns.map(pattern => glob.sync(path.join(__dirname, "../", pattern).replace(/\\/g, '/'), { ignore })).flat(); -} - - -module.exports = { - sync, - uniq, -}; diff --git a/webpack/webpack.common.js b/webpack/webpack.common.js deleted file mode 100644 index eb9cb71d6..000000000 --- a/webpack/webpack.common.js +++ /dev/null @@ -1,119 +0,0 @@ -const MiniCssExtractPlugin = require('mini-css-extract-plugin'); -const autoprefixer = require('autoprefixer'); -const path = require('path'); -const fs = require('fs'); - -const dirs = require('./dirs'); - -const attachments = require('./attachments'); - -let lessVariables = {}; - -if (process.env.LESS_CONFIG_PATH) { - const lessConfigPath = path.isAbsolute(process.env.LESS_CONFIG_PATH) - ? process.env.LESS_CONFIG_PATH - : path.resolve(__dirname, '../', process.env.LESS_CONFIG_PATH); - - lessVariables = fs.existsSync(lessConfigPath) - ? require(lessConfigPath) || {} - : {}; -} - -module.exports = { - entry: { - demo: attachments.demo, - // 用于启动dev模式时,工程引用调试 - fineui: attachments.fineui, - "fineui.proxy": attachments.fineuiProxy, - }, - externals: { - lodash: '_', - underscore: '_', - }, - resolve: { - mainFields: ['module', 'main'], - extensions: ['.js', '.ts'], - alias: { - "@": path.resolve(__dirname, '../src'), - }, - }, - module: { - rules: [ - { - test: /\.(jsx?|tsx?)$/i, - include: [ - dirs.NODE_MODULES, - dirs.PRIVATE, - dirs.PUBLIC, - dirs.MOBILE, - dirs.DEMO, - dirs.I18N, - dirs.UI, - dirs.FIX, - dirs.TYPESCRIPT, - dirs.SRC, - ], - exclude: /node_modules(\/|\\)core-js/, - use: [ - { - loader: 'babel-loader', - options: { - configFile: dirs.BABEL_CONFIG, - }, - }, - ], - }, - // { - // test: /\.js$/, - // include: [path.resolve(__dirname, '../', attachments.lodash)], - // use: [ - // { - // loader: 'script-loader', - // }, - // ], - // }, - { - test: path.resolve(__dirname, '../', attachments.fix), - use: [ - { - loader: 'expose-loader', - options: 'Fix', - }, - ], - }, { - test: path.resolve(__dirname, '../', attachments.fixProxy), - use: [ - { - loader: 'expose-loader', - options: 'Fix', - }, - ], - }, - { - test: /\.(css|less)$/, - use: [ - MiniCssExtractPlugin.loader, - { - loader: 'css-loader', - options: { - url: false, - }, - }, - { - loader: 'postcss-loader', - options: { - plugins: [autoprefixer], - }, - }, - { - loader: 'less-loader', - options: { - relativeUrls: false, - modifyVars: lessVariables, - }, - }, - ], - }, - ], - }, -}; diff --git a/webpack/webpack.css.js b/webpack/webpack.css.js deleted file mode 100644 index 0028f7a26..000000000 --- a/webpack/webpack.css.js +++ /dev/null @@ -1,20 +0,0 @@ -const merge = require("webpack-merge"); - -const dirs = require("./dirs"); - -const common = require("./webpack.prod.js"); -common.entry = {}; - -const attachments = require("./attachments"); - -module.exports = merge.smart(common, { - mode: "production", - entry: { - [`2.0/${process.env.LESS_FILE_NAME}.min`]: attachments.bundleCss, - }, - - output: { - path: dirs.DEST, - filename: "[name].js", - }, -}); diff --git a/webpack/webpack.dev.js b/webpack/webpack.dev.js deleted file mode 100644 index 9e5a21432..000000000 --- a/webpack/webpack.dev.js +++ /dev/null @@ -1,79 +0,0 @@ -const merge = require("webpack-merge"); -const path = require("path"); -const MiniCssExtractPlugin = require("mini-css-extract-plugin"); -const HtmlWebpackPlugin = require("html-webpack-plugin"); -const ForkTsCheckerWebpackPlugin = require("fork-ts-checker-webpack-plugin"); -const OptimizeCssAssetsPlugin = require("optimize-css-assets-webpack-plugin"); - -const dirs = require("./dirs"); - -const common = require("./webpack.common.js"); - -const ModuleDependencyWarning = require("webpack/lib/ModuleDependencyWarning"); - -class IgnoreNotFoundExportPlugin { - apply(compiler) { - const messageRegExp = /export '.*'( \(reexported as '.*'\))? was not found in/; - function doneHook(stats) { - stats.compilation.warnings = stats.compilation.warnings.filter(warn => { - if (warn instanceof ModuleDependencyWarning && messageRegExp.test(warn.message)) { - return false; - } - - return true; - }); - } - if (compiler.hooks) { - compiler.hooks.done.tap("IgnoreNotFoundExportPlugin", doneHook); - } else { - compiler.plugin("done", doneHook); - } - } -} - -module.exports = merge(common, { - devtool: "inline-source-map", - output: { - path: dirs.DEST, - filename: "[name].js", - publicPath: '/', - }, - devServer: { - contentBase: path.join(__dirname, ".."), - port: 9001, - liveReload: true, - historyApiFallback: { - rewrites: [ - { from: /.*/, to: '/index.html' }, - ], - }, - }, - plugins: [ - new MiniCssExtractPlugin({ - path: dirs.DEST, - filename: "[name].css", - }), - new HtmlWebpackPlugin({ - template: path.resolve(__dirname, "../template/index.html"), - chunks: ["demo"], - chunksSortMode: "manual", - }), - new ForkTsCheckerWebpackPlugin({ - watch: ["./typescript"], - }), - new OptimizeCssAssetsPlugin({ - assetNameRegExp: /\.css$/g, - cssProcessor: require("cssnano"), - cssProcessorPluginOptions: { - preset: ["default", { - discardComments: { - removeAll: true, - }, - normalizeUnicode: false, - }], - }, - canPrint: true, - }), - new IgnoreNotFoundExportPlugin(), - ], -}); diff --git a/webpack/webpack.prod.js b/webpack/webpack.prod.js deleted file mode 100644 index a48a8c17f..000000000 --- a/webpack/webpack.prod.js +++ /dev/null @@ -1,127 +0,0 @@ -const webpack = require("webpack"); -const merge = require("webpack-merge"); -const MiniCssExtractPlugin = require("mini-css-extract-plugin"); -const ForkTsCheckerWebpackPlugin = require("fork-ts-checker-webpack-plugin"); -const OptimizeCssAssetsPlugin = require("optimize-css-assets-webpack-plugin"); -const TerserJsPlugin = require("terser-webpack-plugin"); - -const dirs = require("./dirs"); - -const common = require("./webpack.common.js"); - -const attachments = require("./attachments"); -const components = require("./components"); - -const childProcess = require('child_process'); - -function git(command) { - return childProcess - .execSync(`git ${command}`) - .toString() - .trim(); -} - -module.exports = merge.smart(common, { - mode: "production", - entry: { - font: attachments.font, - "fineui.min": attachments.fineui, - "fineui_without_normalize.min": attachments.fineuiWithoutNormalize, - "fineui_without_conflict.min": attachments.fineuiWithoutConflict, - "fineui.proxy.min": attachments.fineuiProxy, - "core_without_platform": attachments.coreWithoutPlatform, - utils: attachments.utils, - "utils.min": attachments.utils, - "fineui_without_jquery_polyfill": attachments.fineuiWithoutJqueryAndPolyfillJs, - "fineui_without_jquery_polyfill.min": attachments.fineuiWithoutJqueryAndPolyfillJs, - "2.0/fineui": attachments.bundle, - "2.0/fineui.min": attachments.bundle, - "2.0/fineui_without_normalize": attachments.bundleWithoutNormalize, - "2.0/fineui_without_normalize.min": attachments.bundleWithoutNormalize, - "2.0/core_without_platform": attachments.coreWithoutPlatform, - "2.0/core_without_platform.min": attachments.coreWithoutPlatform, - core: attachments.coreJs, - resource: attachments.resource, - "lib/single": components.single, - "lib/layers": components.layer, - "lib/pane": components.pane, - "lib/button_group": components.button_group, - "lib/buttons": components.buttons, - "lib/checkboxes": components.checkboxes, - "lib/combos": components.combos, - "lib/editors": components.editors, - "lib/triggers": components.triggers, - "lib/calendar": components.calendar, - "lib/color_chooser": components.color_chooser, - "lib/segment": components.segment, - "lib/linear_segment": components.linear_segment, - "lib/date": components.date, - "lib/down_list": components.down_list, - "lib/text_value_down_list_combo": components.text_value_down_list_combo, - }, - optimization: { - minimizer: [ - new TerserJsPlugin({ - include: /\.min/, - parallel: true, - sourceMap: true, - terserOptions: { - output: { - comments: false - } - } - }), - new webpack.BannerPlugin({ - banner: `time: ${new Date().toLocaleString()}; branch: ${git( - 'name-rev --name-only HEAD' - )} commit: ${git( - 'rev-parse HEAD' - )}` - }) - ] - }, - - devtool: "hidden-source-map", - - output: { - path: dirs.DEST, - filename: "[name].js" - }, - - plugins: [ - new MiniCssExtractPlugin({ - path: dirs.DEST, - filename: "[name].css" - }), - new ForkTsCheckerWebpackPlugin({}), - new OptimizeCssAssetsPlugin({ - assetNameRegExp: /\.css$/g, - cssProcessor: require("cssnano"), - cssProcessorPluginOptions: { - preset: ["default", { - discardComments: { - removeAll: true - }, - normalizeUnicode: false - }] - }, - canPrint: true - }) - ], - - module: { - rules: [ - { - test: /\.(css|less)$/, - use: [ - { - loader: "postcss-loader", - options: { - plugins: [] - } - } - ] - } - ] - } -});

tJN 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�d3o)rzbOP$VOC?M;j;jtY<6 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