@easyquery/ui 7.2.4 → 7.2.5-rc01
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/easyquery.ui.cjs.js +14443 -0
- package/dist/easyquery.ui.esm.js +14383 -0
- package/dist/types/i18n/text_resources.d.ts +1 -0
- package/dist/{lib → types}/views/view.d.ts +3 -1
- package/dist/{lib → types}/widgets/query_panel.d.ts +2 -1
- package/dist/{lib → types}/widgets/queryname_widget.d.ts +1 -0
- package/dist/{lib → types}/widgets/renderers/querypanel/subquery_expression_renderer.d.ts +2 -4
- package/package.json +16 -54
- package/api-eq-community.js +0 -15
- package/dist/assets/css/aggr-settings.css +0 -242
- package/dist/assets/css/easychart.css +0 -73
- package/dist/assets/css/easyfacets.css +0 -280
- package/dist/assets/css/easyquery-mobile.css +0 -267
- package/dist/assets/css/easyquery.css +0 -1712
- package/dist/assets/css/eq-icons-default.css +0 -140
- package/dist/assets/css/eq-icons-files.css +0 -138
- package/dist/assets/css/eqview.css +0 -596
- package/dist/assets/css/images/ExportCSV.png +0 -0
- package/dist/assets/css/images/ExportExel.png +0 -0
- package/dist/assets/css/images/aggr_settings_cancel.png +0 -0
- package/dist/assets/css/images/aggr_settings_func.png +0 -0
- package/dist/assets/css/images/aggr_settings_group.png +0 -0
- package/dist/assets/css/images/ajax-loader.gif +0 -0
- package/dist/assets/css/images/chart-settings.png +0 -0
- package/dist/assets/css/images/checkbox_checked.png +0 -0
- package/dist/assets/css/images/checkbox_unchecked.png +0 -0
- package/dist/assets/css/images/clearButton.png +0 -0
- package/dist/assets/css/images/colbtn-aggrfunc.png +0 -0
- package/dist/assets/css/images/condbtn-addcondition.png +0 -0
- package/dist/assets/css/images/condbtn-addpredicate.png +0 -0
- package/dist/assets/css/images/condbtn-delete.png +0 -0
- package/dist/assets/css/images/condbtn-disabled.png +0 -0
- package/dist/assets/css/images/condbtn-enabled.png +0 -0
- package/dist/assets/css/images/condbtn-menu.png +0 -0
- package/dist/assets/css/images/condbtn-param.png +0 -0
- package/dist/assets/css/images/eqjs-ep-add-columns-hover.png +0 -0
- package/dist/assets/css/images/eqjs-ep-add-columns.png +0 -0
- package/dist/assets/css/images/eqjs-ep-add-cond-hover.png +0 -0
- package/dist/assets/css/images/eqjs-ep-add-cond.png +0 -0
- package/dist/assets/css/images/eqjs-ep-deselect-all-hover.png +0 -0
- package/dist/assets/css/images/eqjs-ep-deselect-all.png +0 -0
- package/dist/assets/css/images/eqjs-ep-select-all-hover.png +0 -0
- package/dist/assets/css/images/eqjs-ep-select-all.png +0 -0
- package/dist/assets/css/images/eqjs-fb-header-icon.png +0 -0
- package/dist/assets/css/images/execute.png +0 -0
- package/dist/assets/css/images/loadButton.png +0 -0
- package/dist/assets/css/images/logo.png +0 -0
- package/dist/assets/css/images/node-close.png +0 -0
- package/dist/assets/css/images/node-open.png +0 -0
- package/dist/assets/css/images/saveButton.png +0 -0
- package/dist/assets/css/images/sorting_asc.png +0 -0
- package/dist/assets/css/images/sorting_desc.png +0 -0
- package/dist/assets/css/images/sorting_none.png +0 -0
- package/dist/assets/css/images/ve-loader.gif +0 -0
- package/dist/browser/eq.community.css.map +0 -1
- package/dist/browser/eq.community.js +0 -34645
- package/dist/browser/eq.community.js.map +0 -1
- package/dist/browser/eq.community.min.js +0 -2
- package/dist/browser/eq.community.min.js.LICENSE.txt +0 -11
- package/dist/browser/eq.community.min.js.map +0 -1
- package/dist/browser/eq.core.css +0 -4564
- package/dist/browser/eq.core.min.css +0 -3
- package/dist/browser/eq.view.css +0 -607
- package/dist/browser/eq.view.css.map +0 -1
- package/dist/browser/eq.view.min.css +0 -1
- package/dist/bundles/easyquery.ui.js +0 -23068
- package/dist/bundles/easyquery.ui.js.map +0 -1
- package/dist/bundles/easyquery.ui.min.js +0 -3
- package/dist/bundles/easyquery.ui.min.js.LICENSE.txt +0 -3
- package/dist/bundles/easyquery.ui.min.js.map +0 -1
- package/dist/lib/dialog/aggr_settings_dialog.js +0 -107
- package/dist/lib/dialog/aggr_settings_dialog.js.map +0 -1
- package/dist/lib/dialog/export_dialog.js +0 -64
- package/dist/lib/dialog/export_dialog.js.map +0 -1
- package/dist/lib/extensions.d.ts +0 -7
- package/dist/lib/extensions.js +0 -14
- package/dist/lib/extensions.js.map +0 -1
- package/dist/lib/facets/chart_facet.js +0 -241
- package/dist/lib/facets/chart_facet.js.map +0 -1
- package/dist/lib/facets/datatable_facet.js +0 -72
- package/dist/lib/facets/datatable_facet.js.map +0 -1
- package/dist/lib/facets/pivot_table_facet.js +0 -699
- package/dist/lib/facets/pivot_table_facet.js.map +0 -1
- package/dist/lib/facets/result_facet.js +0 -247
- package/dist/lib/facets/result_facet.js.map +0 -1
- package/dist/lib/i18n/text_resources.js +0 -261
- package/dist/lib/i18n/text_resources.js.map +0 -1
- package/dist/lib/public_api.js +0 -93
- package/dist/lib/public_api.js.map +0 -1
- package/dist/lib/types/facet_type.js +0 -7
- package/dist/lib/types/facet_type.js.map +0 -1
- package/dist/lib/types/qp_editable_part.js +0 -17
- package/dist/lib/types/qp_editable_part.js.map +0 -1
- package/dist/lib/utils/browser_utils.js +0 -59
- package/dist/lib/utils/browser_utils.js.map +0 -1
- package/dist/lib/utils/display_format_parser.js +0 -62
- package/dist/lib/utils/display_format_parser.js.map +0 -1
- package/dist/lib/utils/dropdown.js +0 -58
- package/dist/lib/utils/dropdown.js.map +0 -1
- package/dist/lib/utils/popup_menu.js +0 -1260
- package/dist/lib/utils/popup_menu.js.map +0 -1
- package/dist/lib/utils/utils.js +0 -47
- package/dist/lib/utils/utils.js.map +0 -1
- package/dist/lib/views/adv_search_view.js +0 -713
- package/dist/lib/views/adv_search_view.js.map +0 -1
- package/dist/lib/views/data_filter_view.js +0 -80
- package/dist/lib/views/data_filter_view.js.map +0 -1
- package/dist/lib/views/html_data_filter_view.js +0 -45
- package/dist/lib/views/html_data_filter_view.js.map +0 -1
- package/dist/lib/views/report_view.js +0 -733
- package/dist/lib/views/report_view.js.map +0 -1
- package/dist/lib/views/view.js +0 -534
- package/dist/lib/views/view.js.map +0 -1
- package/dist/lib/views/view_options.js +0 -2
- package/dist/lib/views/view_options.js.map +0 -1
- package/dist/lib/widgets/aggregation_bar.js +0 -146
- package/dist/lib/widgets/aggregation_bar.js.map +0 -1
- package/dist/lib/widgets/charts/chart_type.js +0 -16
- package/dist/lib/widgets/charts/chart_type.js.map +0 -1
- package/dist/lib/widgets/charts/chart_widget.js +0 -385
- package/dist/lib/widgets/charts/chart_widget.js.map +0 -1
- package/dist/lib/widgets/charts/chart_widget_chartjs.js +0 -187
- package/dist/lib/widgets/charts/chart_widget_chartjs.js.map +0 -1
- package/dist/lib/widgets/charts/chart_widget_google.js +0 -166
- package/dist/lib/widgets/charts/chart_widget_google.js.map +0 -1
- package/dist/lib/widgets/columns_bar.js +0 -687
- package/dist/lib/widgets/columns_bar.js.map +0 -1
- package/dist/lib/widgets/columns_panel.js +0 -721
- package/dist/lib/widgets/columns_panel.js.map +0 -1
- package/dist/lib/widgets/easy_grid_widget.js +0 -169
- package/dist/lib/widgets/easy_grid_widget.js.map +0 -1
- package/dist/lib/widgets/entities_panel.js +0 -623
- package/dist/lib/widgets/entities_panel.js.map +0 -1
- package/dist/lib/widgets/eq_result_html_grid.js +0 -186
- package/dist/lib/widgets/eq_result_html_grid.js.map +0 -1
- package/dist/lib/widgets/export_widget.js +0 -58
- package/dist/lib/widgets/export_widget.js.map +0 -1
- package/dist/lib/widgets/facet_container.js +0 -54
- package/dist/lib/widgets/facet_container.js.map +0 -1
- package/dist/lib/widgets/filter_bar.js +0 -260
- package/dist/lib/widgets/filter_bar.js.map +0 -1
- package/dist/lib/widgets/grid.js +0 -80
- package/dist/lib/widgets/grid.js.map +0 -1
- package/dist/lib/widgets/html_content_widget.js +0 -72
- package/dist/lib/widgets/html_content_widget.js.map +0 -1
- package/dist/lib/widgets/locale_widget.js +0 -80
- package/dist/lib/widgets/locale_widget.js.map +0 -1
- package/dist/lib/widgets/manage_drilldown_widget.js +0 -156
- package/dist/lib/widgets/manage_drilldown_widget.js.map +0 -1
- package/dist/lib/widgets/process_widget.js +0 -51
- package/dist/lib/widgets/process_widget.js.map +0 -1
- package/dist/lib/widgets/query_panel.js +0 -676
- package/dist/lib/widgets/query_panel.js.map +0 -1
- package/dist/lib/widgets/queryname_widget.js +0 -110
- package/dist/lib/widgets/queryname_widget.js.map +0 -1
- package/dist/lib/widgets/renderers/aggr_settings/aggr_settings_renderer.js +0 -430
- package/dist/lib/widgets/renderers/aggr_settings/aggr_settings_renderer.js.map +0 -1
- package/dist/lib/widgets/renderers/base_element_renderer.js +0 -64
- package/dist/lib/widgets/renderers/base_element_renderer.js.map +0 -1
- package/dist/lib/widgets/renderers/columnsbar/aggrfunc_column_renderer_cb.js +0 -50
- package/dist/lib/widgets/renderers/columnsbar/aggrfunc_column_renderer_cb.js.map +0 -1
- package/dist/lib/widgets/renderers/columnsbar/attr_column_renderer_cb.js +0 -86
- package/dist/lib/widgets/renderers/columnsbar/attr_column_renderer_cb.js.map +0 -1
- package/dist/lib/widgets/renderers/columnsbar/column_renderer_cb.js +0 -532
- package/dist/lib/widgets/renderers/columnsbar/column_renderer_cb.js.map +0 -1
- package/dist/lib/widgets/renderers/columnsbar/editable_column_renderer_cb.js +0 -102
- package/dist/lib/widgets/renderers/columnsbar/editable_column_renderer_cb.js.map +0 -1
- package/dist/lib/widgets/renderers/columnspanel/aggrfunc_column_renderer_cp.js +0 -173
- package/dist/lib/widgets/renderers/columnspanel/aggrfunc_column_renderer_cp.js.map +0 -1
- package/dist/lib/widgets/renderers/columnspanel/attr_column_renderer_cp.js +0 -193
- package/dist/lib/widgets/renderers/columnspanel/attr_column_renderer_cp.js.map +0 -1
- package/dist/lib/widgets/renderers/columnspanel/column_renderer_cp.js +0 -811
- package/dist/lib/widgets/renderers/columnspanel/column_renderer_cp.js.map +0 -1
- package/dist/lib/widgets/renderers/columnspanel/editable_column_renderer_cp.js +0 -277
- package/dist/lib/widgets/renderers/columnspanel/editable_column_renderer_cp.js.map +0 -1
- package/dist/lib/widgets/renderers/dropdown_renderer.js +0 -43
- package/dist/lib/widgets/renderers/dropdown_renderer.js.map +0 -1
- package/dist/lib/widgets/renderers/querypanel/addrow_renderer.js +0 -88
- package/dist/lib/widgets/renderers/querypanel/addrow_renderer.js.map +0 -1
- package/dist/lib/widgets/renderers/querypanel/attribute_expression_renderer.js +0 -72
- package/dist/lib/widgets/renderers/querypanel/attribute_expression_renderer.js.map +0 -1
- package/dist/lib/widgets/renderers/querypanel/bind_to_parent_column_expression_renderer.js +0 -42
- package/dist/lib/widgets/renderers/querypanel/bind_to_parent_column_expression_renderer.js.map +0 -1
- package/dist/lib/widgets/renderers/querypanel/condition_group_renderer.js +0 -232
- package/dist/lib/widgets/renderers/querypanel/condition_group_renderer.js.map +0 -1
- package/dist/lib/widgets/renderers/querypanel/condition_renderer.js +0 -510
- package/dist/lib/widgets/renderers/querypanel/condition_renderer.js.map +0 -1
- package/dist/lib/widgets/renderers/querypanel/datetime_expression_render.js +0 -109
- package/dist/lib/widgets/renderers/querypanel/datetime_expression_render.js.map +0 -1
- package/dist/lib/widgets/renderers/querypanel/expression_renderer.js +0 -92
- package/dist/lib/widgets/renderers/querypanel/expression_renderer.js.map +0 -1
- package/dist/lib/widgets/renderers/querypanel/input_expression_renderer.js +0 -166
- package/dist/lib/widgets/renderers/querypanel/input_expression_renderer.js.map +0 -1
- package/dist/lib/widgets/renderers/querypanel/list_expression_renderer.js +0 -318
- package/dist/lib/widgets/renderers/querypanel/list_expression_renderer.js.map +0 -1
- package/dist/lib/widgets/renderers/querypanel/operator_renderer.js +0 -96
- package/dist/lib/widgets/renderers/querypanel/operator_renderer.js.map +0 -1
- package/dist/lib/widgets/renderers/querypanel/subquery_expression_renderer.js +0 -238
- package/dist/lib/widgets/renderers/querypanel/subquery_expression_renderer.js.map +0 -1
- package/dist/lib/widgets/renderers/querypanel/text_renderer.js +0 -37
- package/dist/lib/widgets/renderers/querypanel/text_renderer.js.map +0 -1
- package/dist/lib/widgets/renderers/sortingbar/column_renderer_sb.js +0 -173
- package/dist/lib/widgets/renderers/sortingbar/column_renderer_sb.js.map +0 -1
- package/dist/lib/widgets/result_facets_panel.js +0 -504
- package/dist/lib/widgets/result_facets_panel.js.map +0 -1
- package/dist/lib/widgets/sorting_bar.js +0 -334
- package/dist/lib/widgets/sorting_bar.js.map +0 -1
- package/dist/lib/widgets/statement_panel.js +0 -61
- package/dist/lib/widgets/statement_panel.js.map +0 -1
- package/dist/lib/widgets/widget_options.js +0 -2
- package/dist/lib/widgets/widget_options.js.map +0 -1
- package/styles-eq-core.js +0 -10
- package/styles-eq-view.js +0 -1
- package/tsconfig.json +0 -23
- package/webpack.config.js +0 -181
- /package/dist/{lib → types}/dialog/aggr_settings_dialog.d.ts +0 -0
- /package/dist/{lib → types}/dialog/export_dialog.d.ts +0 -0
- /package/dist/{lib/i18n/text_resources.d.ts → types/extensions.d.ts} +0 -0
- /package/dist/{lib → types}/facets/chart_facet.d.ts +0 -0
- /package/dist/{lib → types}/facets/datatable_facet.d.ts +0 -0
- /package/dist/{lib → types}/facets/pivot_table_facet.d.ts +0 -0
- /package/dist/{lib → types}/facets/result_facet.d.ts +0 -0
- /package/dist/{lib → types}/public_api.d.ts +0 -0
- /package/dist/{lib → types}/types/facet_type.d.ts +0 -0
- /package/dist/{lib → types}/types/qp_editable_part.d.ts +0 -0
- /package/dist/{lib → types}/utils/browser_utils.d.ts +0 -0
- /package/dist/{lib → types}/utils/display_format_parser.d.ts +0 -0
- /package/dist/{lib → types}/utils/dropdown.d.ts +0 -0
- /package/dist/{lib → types}/utils/popup_menu.d.ts +0 -0
- /package/dist/{lib → types}/utils/utils.d.ts +0 -0
- /package/dist/{lib → types}/views/adv_search_view.d.ts +0 -0
- /package/dist/{lib → types}/views/data_filter_view.d.ts +0 -0
- /package/dist/{lib → types}/views/html_data_filter_view.d.ts +0 -0
- /package/dist/{lib → types}/views/report_view.d.ts +0 -0
- /package/dist/{lib → types}/views/view_options.d.ts +0 -0
- /package/dist/{lib → types}/widgets/aggregation_bar.d.ts +0 -0
- /package/dist/{lib → types}/widgets/charts/chart_type.d.ts +0 -0
- /package/dist/{lib → types}/widgets/charts/chart_widget.d.ts +0 -0
- /package/dist/{lib → types}/widgets/charts/chart_widget_chartjs.d.ts +0 -0
- /package/dist/{lib → types}/widgets/charts/chart_widget_google.d.ts +0 -0
- /package/dist/{lib → types}/widgets/columns_bar.d.ts +0 -0
- /package/dist/{lib → types}/widgets/columns_panel.d.ts +0 -0
- /package/dist/{lib → types}/widgets/easy_grid_widget.d.ts +0 -0
- /package/dist/{lib → types}/widgets/entities_panel.d.ts +0 -0
- /package/dist/{lib → types}/widgets/eq_result_html_grid.d.ts +0 -0
- /package/dist/{lib → types}/widgets/export_widget.d.ts +0 -0
- /package/dist/{lib → types}/widgets/facet_container.d.ts +0 -0
- /package/dist/{lib → types}/widgets/filter_bar.d.ts +0 -0
- /package/dist/{lib → types}/widgets/grid.d.ts +0 -0
- /package/dist/{lib → types}/widgets/html_content_widget.d.ts +0 -0
- /package/dist/{lib → types}/widgets/locale_widget.d.ts +0 -0
- /package/dist/{lib → types}/widgets/manage_drilldown_widget.d.ts +0 -0
- /package/dist/{lib → types}/widgets/process_widget.d.ts +0 -0
- /package/dist/{lib → types}/widgets/renderers/aggr_settings/aggr_settings_renderer.d.ts +0 -0
- /package/dist/{lib → types}/widgets/renderers/base_element_renderer.d.ts +0 -0
- /package/dist/{lib → types}/widgets/renderers/columnsbar/aggrfunc_column_renderer_cb.d.ts +0 -0
- /package/dist/{lib → types}/widgets/renderers/columnsbar/attr_column_renderer_cb.d.ts +0 -0
- /package/dist/{lib → types}/widgets/renderers/columnsbar/column_renderer_cb.d.ts +0 -0
- /package/dist/{lib → types}/widgets/renderers/columnsbar/editable_column_renderer_cb.d.ts +0 -0
- /package/dist/{lib → types}/widgets/renderers/columnspanel/aggrfunc_column_renderer_cp.d.ts +0 -0
- /package/dist/{lib → types}/widgets/renderers/columnspanel/attr_column_renderer_cp.d.ts +0 -0
- /package/dist/{lib → types}/widgets/renderers/columnspanel/column_renderer_cp.d.ts +0 -0
- /package/dist/{lib → types}/widgets/renderers/columnspanel/editable_column_renderer_cp.d.ts +0 -0
- /package/dist/{lib → types}/widgets/renderers/dropdown_renderer.d.ts +0 -0
- /package/dist/{lib → types}/widgets/renderers/querypanel/addrow_renderer.d.ts +0 -0
- /package/dist/{lib → types}/widgets/renderers/querypanel/attribute_expression_renderer.d.ts +0 -0
- /package/dist/{lib → types}/widgets/renderers/querypanel/bind_to_parent_column_expression_renderer.d.ts +0 -0
- /package/dist/{lib → types}/widgets/renderers/querypanel/condition_group_renderer.d.ts +0 -0
- /package/dist/{lib → types}/widgets/renderers/querypanel/condition_renderer.d.ts +0 -0
- /package/dist/{lib → types}/widgets/renderers/querypanel/datetime_expression_render.d.ts +0 -0
- /package/dist/{lib → types}/widgets/renderers/querypanel/expression_renderer.d.ts +0 -0
- /package/dist/{lib → types}/widgets/renderers/querypanel/input_expression_renderer.d.ts +0 -0
- /package/dist/{lib → types}/widgets/renderers/querypanel/list_expression_renderer.d.ts +0 -0
- /package/dist/{lib → types}/widgets/renderers/querypanel/operator_renderer.d.ts +0 -0
- /package/dist/{lib → types}/widgets/renderers/querypanel/text_renderer.d.ts +0 -0
- /package/dist/{lib → types}/widgets/renderers/sortingbar/column_renderer_sb.d.ts +0 -0
- /package/dist/{lib → types}/widgets/result_facets_panel.d.ts +0 -0
- /package/dist/{lib → types}/widgets/sorting_bar.d.ts +0 -0
- /package/dist/{lib → types}/widgets/statement_panel.d.ts +0 -0
- /package/dist/{lib → types}/widgets/widget_options.d.ts +0 -0
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"easyquery.ui.min.js","mappings":"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","sources":["webpack://easyqueryUI/webpack/universalModuleDefinition","webpack://easyqueryUI/./src/utils/browser_utils.ts","webpack://easyqueryUI/./src/utils/utils.ts","webpack://easyqueryUI/../../easydata/easydata.js/packs/core/dist/lib/types/data_type.js","webpack://easyqueryUI/../../easydata/easydata.js/packs/core/dist/lib/types/entity_attr_kind.js","webpack://easyqueryUI/../../easydata/easydata.js/packs/core/dist/lib/types/editor_tag.js","webpack://easyqueryUI/../../easydata/easydata.js/packs/core/dist/lib/http/http_method.js","webpack://easyqueryUI/../../easydata/easydata.js/packs/core/dist/lib/http/http_request.js","webpack://easyqueryUI/../../easydata/easydata.js/packs/core/dist/lib/i18n/i18n.js","webpack://easyqueryUI/../../easydata/easydata.js/packs/core/dist/lib/utils/utils.js","webpack://easyqueryUI/../../easydata/easydata.js/packs/core/dist/lib/http/http_action_result.js","webpack://easyqueryUI/../../easydata/easydata.js/packs/core/dist/lib/http/http_client.js","webpack://easyqueryUI/../../easydata/easydata.js/packs/core/dist/lib/data/data_column.js","webpack://easyqueryUI/../../easydata/easydata.js/packs/core/dist/lib/meta/meta_entity.js","webpack://easyqueryUI/../../easydata/easydata.js/packs/core/dist/lib/meta/value_editor.js","webpack://easyqueryUI/../../easydata/easydata.js/packs/core/dist/lib/data/aggr_settings.js","webpack://easyqueryUI/../../easydata/easydata.js/packs/core/dist/lib/meta/meta_data.js","webpack://easyqueryUI/../../easydata/easydata.js/packs/core/dist/lib/utils/liquid.js","webpack://easyqueryUI/../../easydata/easydata.js/packs/core/dist/lib/data/data_row.js","webpack://easyqueryUI/../../easydata/easydata.js/packs/core/dist/lib/data/easy_data_table.js","webpack://easyqueryUI/../../easydata/easydata.js/packs/core/dist/lib/utils/easy_guid.js","webpack://easyqueryUI/../../easydata/easydata.js/packs/core/dist/lib/event/event_emitter.js","webpack://easyqueryUI/../../easydata/easydata.js/packs/core/dist/lib/i18n/load_default_locale_settings.js","webpack://easyqueryUI/../../easydata/easydata.js/packs/core/dist/lib/public_api.js","webpack://easyqueryUI/../../easydata/easydata.js/packs/ui/dist/lib/utils/ui-utils.js","webpack://easyqueryUI/../../easydata/easydata.js/packs/ui/dist/lib/utils/dom_elem_builder.js","webpack://easyqueryUI/../../easydata/easydata.js/packs/ui/dist/lib/utils/mask.js","webpack://easyqueryUI/../../easydata/easydata.js/packs/ui/dist/lib/utils/drag_manager.js","webpack://easyqueryUI/../../easydata/easydata.js/packs/ui/dist/lib/grid/easy_grid_options.js","webpack://easyqueryUI/../../easydata/easydata.js/packs/ui/dist/lib/grid/easy_grid_cell_renderer.js","webpack://easyqueryUI/../../easydata/easydata.js/packs/ui/dist/lib/grid/easy_grid_columns.js","webpack://easyqueryUI/../../easydata/easydata.js/packs/ui/dist/lib/dialogs/dialog_service.js","webpack://easyqueryUI/../../easydata/easydata.js/packs/ui/dist/lib/grid/easy_grid.js","webpack://easyqueryUI/../../easydata/easydata.js/packs/ui/dist/lib/datetimepicker/calendar.js","webpack://easyqueryUI/../../easydata/easydata.js/packs/ui/dist/lib/datetimepicker/date_time_picker.js","webpack://easyqueryUI/../../easydata/easydata.js/packs/ui/dist/lib/datetimepicker/default_calendar.js","webpack://easyqueryUI/../../easydata/easydata.js/packs/ui/dist/lib/datetimepicker/time_picker.js","webpack://easyqueryUI/../../easydata/easydata.js/packs/ui/dist/lib/datetimepicker/default_time_picker.js","webpack://easyqueryUI/../../easydata/easydata.js/packs/ui/dist/lib/datetimepicker/default_date_time_picker.js","webpack://easyqueryUI/../../easydata/easydata.js/packs/ui/dist/lib/dialogs/default_dialog_service.js","webpack://easyqueryUI/../../easydata/easydata.js/packs/ui/dist/lib/i18n/text_resources.js","webpack://easyqueryUI/../../easydata/easydata.js/packs/ui/dist/lib/public_api.js","webpack://easyqueryUI/../../easydata/easydata.js/packs/ui/dist/lib/utils/browser_utils.js","webpack://easyqueryUI/external umd \"easyqueryCore\"","webpack://easyqueryUI/webpack/bootstrap","webpack://easyqueryUI/webpack/runtime/define property getters","webpack://easyqueryUI/webpack/runtime/hasOwnProperty shorthand","webpack://easyqueryUI/webpack/runtime/make namespace object","webpack://easyqueryUI/./src/widgets/renderers/columnspanel/column_renderer_cp.ts","webpack://easyqueryUI/./src/widgets/entities_panel.ts","webpack://easyqueryUI/./src/utils/popup_menu.ts","webpack://easyqueryUI/./src/utils/display_format_parser.ts","webpack://easyqueryUI/./src/types/qp_editable_part.ts","webpack://easyqueryUI/./src/widgets/renderers/columnspanel/attr_column_renderer_cp.ts","webpack://easyqueryUI/./src/widgets/renderers/columnspanel/aggrfunc_column_renderer_cp.ts","webpack://easyqueryUI/./src/widgets/renderers/columnspanel/editable_column_renderer_cp.ts","webpack://easyqueryUI/./src/widgets/columns_panel.ts","webpack://easyqueryUI/./src/widgets/renderers/columnsbar/column_renderer_cb.ts","webpack://easyqueryUI/./src/widgets/renderers/columnsbar/attr_column_renderer_cb.ts","webpack://easyqueryUI/./src/widgets/renderers/columnsbar/aggrfunc_column_renderer_cb.ts","webpack://easyqueryUI/./src/widgets/renderers/columnsbar/editable_column_renderer_cb.ts","webpack://easyqueryUI/./src/widgets/columns_bar.ts","webpack://easyqueryUI/./src/widgets/renderers/sortingbar/column_renderer_sb.ts","webpack://easyqueryUI/./src/widgets/sorting_bar.ts","webpack://easyqueryUI/./src/widgets/renderers/querypanel/text_renderer.ts","webpack://easyqueryUI/./src/widgets/renderers/querypanel/condition_renderer.ts","webpack://easyqueryUI/./src/utils/dropdown.ts","webpack://easyqueryUI/./src/types/facet_type.ts","webpack://easyqueryUI/./src/widgets/renderers/querypanel/condition_group_renderer.ts","webpack://easyqueryUI/./src/widgets/renderers/base_element_renderer.ts","webpack://easyqueryUI/./src/widgets/renderers/querypanel/expression_renderer.ts","webpack://easyqueryUI/./src/widgets/renderers/querypanel/input_expression_renderer.ts","webpack://easyqueryUI/./src/widgets/renderers/querypanel/list_expression_renderer.ts","webpack://easyqueryUI/./src/widgets/renderers/querypanel/attribute_expression_renderer.ts","webpack://easyqueryUI/./src/widgets/renderers/dropdown_renderer.ts","webpack://easyqueryUI/./src/widgets/renderers/querypanel/addrow_renderer.ts","webpack://easyqueryUI/./src/widgets/renderers/querypanel/operator_renderer.ts","webpack://easyqueryUI/./src/widgets/renderers/querypanel/datetime_expression_render.ts","webpack://easyqueryUI/./src/widgets/renderers/querypanel/subquery_expression_renderer.ts","webpack://easyqueryUI/./src/widgets/renderers/querypanel/bind_to_parent_column_expression_renderer.ts","webpack://easyqueryUI/./src/widgets/query_panel.ts","webpack://easyqueryUI/./src/widgets/filter_bar.ts","webpack://easyqueryUI/./src/widgets/html_content_widget.ts","webpack://easyqueryUI/./src/widgets/eq_result_html_grid.ts","webpack://easyqueryUI/./src/widgets/grid.ts","webpack://easyqueryUI/./src/widgets/easy_grid_widget.ts","webpack://easyqueryUI/./src/widgets/statement_panel.ts","webpack://easyqueryUI/./src/widgets/process_widget.ts","webpack://easyqueryUI/./src/widgets/manage_drilldown_widget.ts","webpack://easyqueryUI/./src/dialog/export_dialog.ts","webpack://easyqueryUI/./src/widgets/charts/chart_type.ts","webpack://easyqueryUI/./src/facets/result_facet.ts","webpack://easyqueryUI/./src/facets/pivot_table_facet.ts","webpack://easyqueryUI/./src/widgets/charts/chart_widget.ts","webpack://easyqueryUI/./src/widgets/charts/chart_widget_chartjs.ts","webpack://easyqueryUI/./src/widgets/charts/chart_widget_google.ts","webpack://easyqueryUI/./src/facets/chart_facet.ts","webpack://easyqueryUI/./src/facets/datatable_facet.ts","webpack://easyqueryUI/./src/widgets/facet_container.ts","webpack://easyqueryUI/./src/widgets/result_facets_panel.ts","webpack://easyqueryUI/./src/widgets/export_widget.ts","webpack://easyqueryUI/./src/widgets/renderers/aggr_settings/aggr_settings_renderer.ts","webpack://easyqueryUI/./src/dialog/aggr_settings_dialog.ts","webpack://easyqueryUI/./src/widgets/aggregation_bar.ts","webpack://easyqueryUI/./src/widgets/locale_widget.ts","webpack://easyqueryUI/./src/widgets/queryname_widget.ts","webpack://easyqueryUI/./src/views/view.ts","webpack://easyqueryUI/./src/views/adv_search_view.ts","webpack://easyqueryUI/./src/views/data_filter_view.ts","webpack://easyqueryUI/./src/views/html_data_filter_view.ts","webpack://easyqueryUI/./src/views/report_view.ts","webpack://easyqueryUI/./src/i18n/text_resources.ts","webpack://easyqueryUI/./src/extensions.ts","webpack://easyqueryUI/./src/public_api.ts"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory(require(\"easyqueryCore\"));\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine(\"easyqueryUI\", [\"easyqueryCore\"], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"easyqueryUI\"] = factory(require(\"easyqueryCore\"));\n\telse\n\t\troot[\"easyqueryUI\"] = factory(root[\"easyqueryCore\"]);\n})(self, function(__WEBPACK_EXTERNAL_MODULE__388__) {\nreturn ","import { eqCssMobile } from './utils';\r\n\r\nexport namespace browserUtils {\r\n let _isFirefox: boolean = null;\r\n\r\n let _isIE: boolean = null;\r\n\r\n export function isIE(): boolean {\r\n return eval('/*@cc_on!@*/false || !!document.documentMode');\r\n }\r\n\r\n export function isFirefox(): boolean {\r\n if (_isFirefox === null) {\r\n const ua = navigator.userAgent;\r\n _isFirefox = ua.toLowerCase().indexOf('firefox') > -1;\r\n }\r\n\r\n return _isFirefox;\r\n }\r\n\r\n let _detectedIsMobileMode: boolean = false;\r\n let _isMobileMode: boolean = undefined;\r\n let detectIsMobileMode = () => {\r\n const oldValue = isMobileMode();\r\n\r\n _detectedIsMobileMode = window.matchMedia('only screen and (max-width: 840px)').matches \r\n || window.matchMedia('only screen and (max-height: 420px)').matches;\r\n\r\n const newValue = isMobileMode();\r\n\r\n if (newValue !== oldValue && mobileModeChangeHandler) {\r\n mobileModeChangeHandler(newValue);\r\n }\r\n } \r\n \r\n detectIsMobileMode();\r\n window.addEventListener('resize', () => detectIsMobileMode());\r\n \r\n export function isMobileMode(): boolean {\r\n if (_isMobileMode !== undefined) {\r\n return _isMobileMode;\r\n }\r\n else {\r\n return _detectedIsMobileMode;\r\n }\r\n }\r\n \r\n export function setIsMobileMode(value: boolean | undefined) {\r\n const oldValue = isMobileMode();\r\n\r\n _isMobileMode = value;\r\n\r\n const newValue = isMobileMode();\r\n\r\n if (newValue !== oldValue && mobileModeChangeHandler) {\r\n mobileModeChangeHandler(newValue);\r\n }\r\n } \r\n\r\n let mobileModeChangeHandler: (newValue: boolean) => void;\r\n export function onMobileModeChanged(callback: (newValue: boolean) => void) {\r\n mobileModeChangeHandler = callback;\r\n }\r\n\r\n export function getMobileCssClass(): string | null {\r\n return isMobileMode() ? eqCssMobile : null;\r\n }\r\n}","import { domel } from '@easydata/ui';\r\n\r\nexport function getViewportSize() {\r\n const width = Math.max(document.documentElement.clientWidth || 0, window.innerWidth || 0);\r\n const height = Math.max(document.documentElement.clientHeight || 0, window.innerHeight || 0);\r\n\r\n return {\r\n width: width,\r\n height: height\r\n }\r\n}\r\n\r\nexport function findHighestZIndex(elem: HTMLElement) {\r\n let highest = 0;\r\n while (elem !== null ) {\r\n const zindex = document.defaultView.getComputedStyle(elem, null)\r\n .getPropertyValue(\"z-index\");\r\n if (zindex != 'auto') {\r\n const numZIndex = parseInt(zindex);\r\n if (numZIndex > highest) {\r\n highest = numZIndex;\r\n }\r\n }\r\n elem = elem.parentElement;\r\n }\r\n \r\n\r\n return highest;\r\n}\r\n\r\n\r\n// simetimes setting focus in the main thread doesn't work correctly (in Firefox). So we need to 'hack' it.\r\nexport function safeFocus(element: HTMLElement) {\r\n setTimeout(_ => {\r\n if (element) {\r\n element.focus();\r\n }\r\n }, 100)\r\n}\r\n\r\nexport const eqCssPrefix = 'eqjs';\r\nexport const eqCssMobile = 'eqjs-mobile';\r\n\r\n\r\nexport function makeElementMaximizable(element: HTMLDivElement) {\r\n domel(element)\r\n .addClass(`${eqCssPrefix}-maximizable`)\r\n .addChild('div', b => {\r\n b.addClass(`${eqCssPrefix}-max-button`)\r\n .on('click', (e) => {\r\n e.preventDefault();\r\n\r\n domel(element)\r\n .toggleClass(`${eqCssPrefix}-maximized`);\r\n\r\n })\r\n })\r\n}","/** Represents the common types of the data. */\nexport var DataType;\n(function (DataType) {\n /** Unknown type value*/\n DataType[DataType[\"Unknown\"] = 0] = \"Unknown\";\n /** String value*/\n DataType[DataType[\"String\"] = 1] = \"String\";\n /** 8-bit integer value */\n DataType[DataType[\"Byte\"] = 2] = \"Byte\";\n /** 16-bit integer value */\n DataType[DataType[\"Word\"] = 3] = \"Word\";\n /** 32-bit integer value */\n DataType[DataType[\"Int32\"] = 4] = \"Int32\";\n /** 64-bit integer value */\n DataType[DataType[\"Int64\"] = 5] = \"Int64\";\n /** Boolean value */\n DataType[DataType[\"Bool\"] = 6] = \"Bool\";\n /** Floating-point numeric value */\n DataType[DataType[\"Float\"] = 7] = \"Float\";\n /** Money value */\n DataType[DataType[\"Currency\"] = 8] = \"Currency\";\n /** Binary-coded decimal value */\n DataType[DataType[\"BCD\"] = 9] = \"BCD\";\n /** Date value */\n DataType[DataType[\"Date\"] = 10] = \"Date\";\n /** Time value */\n DataType[DataType[\"Time\"] = 11] = \"Time\";\n /** Date and time value */\n DataType[DataType[\"DateTime\"] = 12] = \"DateTime\";\n /** Autoincrement 32-bit integer value */\n DataType[DataType[\"Autoinc\"] = 13] = \"Autoinc\";\n /** MEMO value (text with unlimited length) */\n DataType[DataType[\"Memo\"] = 14] = \"Memo\";\n /** BLOB value (any data with unlimited length) */\n DataType[DataType[\"Blob\"] = 15] = \"Blob\";\n /** Fixed character value */\n DataType[DataType[\"FixedChar\"] = 16] = \"FixedChar\";\n /** The unique identifier */\n DataType[DataType[\"Guid\"] = 17] = \"Guid\";\n /*-------- Spatial data types ----------*/\n /** Any geometry data */\n DataType[DataType[\"Geometry\"] = 18] = \"Geometry\";\n /** Any data that represents some geography objects</summary> */\n DataType[DataType[\"Geography\"] = 19] = \"Geography\";\n})(DataType || (DataType = {}));\n//# sourceMappingURL=data_type.js.map","export var EntityAttrKind;\n(function (EntityAttrKind) {\n EntityAttrKind[EntityAttrKind[\"Data\"] = 0] = \"Data\";\n EntityAttrKind[EntityAttrKind[\"Virtual\"] = 1] = \"Virtual\";\n EntityAttrKind[EntityAttrKind[\"Lookup\"] = 2] = \"Lookup\";\n})(EntityAttrKind || (EntityAttrKind = {}));\n//# sourceMappingURL=entity_attr_kind.js.map","export var EditorTag = {\n /** Unknown tag value */\n Unknown: \"Unknown\",\n /** Edit tag value */\n Edit: \"EDIT\",\n /** DateTime tag value */\n DateTime: \"DATETIME\",\n /** List tag value */\n List: \"LIST\",\n /** CustomList tag value */\n CustomList: \"CUSTOMLIST\",\n /** File tag value */\n File: \"FILE\"\n};\n//# sourceMappingURL=editor_tag.js.map","export var HttpMethod;\n(function (HttpMethod) {\n HttpMethod[\"Trace\"] = \"TRACE\";\n HttpMethod[\"Options\"] = \"OPTIONS\";\n HttpMethod[\"Get\"] = \"GET\";\n HttpMethod[\"Put\"] = \"PUT\";\n HttpMethod[\"Post\"] = \"POST\";\n HttpMethod[\"Delete\"] = \"DELETE\";\n})(HttpMethod || (HttpMethod = {}));\n//# sourceMappingURL=http_method.js.map","var HttpRequest = /** @class */ (function () {\n function HttpRequest(xhr, descriptor) {\n this.xhr = xhr;\n this.method = descriptor.method;\n this.url = descriptor.url;\n this.headers = descriptor.headers;\n this.queryParams = descriptor.queryParams;\n this.data = descriptor.data;\n }\n HttpRequest.prototype.setHeader = function (name, value) {\n this.headers[name] = value;\n };\n HttpRequest.prototype.setQueryParam = function (name, value) {\n this.queryParams[name] = value;\n };\n HttpRequest.prototype.getXMLHttpRequest = function () {\n return this.xhr;\n };\n HttpRequest.prototype.getResponseHeaders = function () {\n if (this.xhr.readyState == this.xhr.HEADERS_RECEIVED) {\n var headers = this.xhr.getAllResponseHeaders();\n var arr = headers.trim().split(/[\\r\\n]+/);\n // Create a map of header names to values\n var headerMap = {};\n for (var _i = 0, arr_1 = arr; _i < arr_1.length; _i++) {\n var line = arr_1[_i];\n var parts = line.split(': ');\n var header = parts.shift();\n var value = parts.join(': ');\n headerMap[header] = value;\n }\n return headerMap;\n }\n return {};\n };\n HttpRequest.prototype.open = function () {\n var _this = this;\n if (this.xhr.readyState !== this.xhr.UNSENT)\n return;\n var url = this.url;\n if (this.queryParams && Object.keys(this.queryParams).length > 0) {\n url += encodeURI('?' + Object.keys(this.queryParams)\n .map(function (param) { return param + '=' + _this.queryParams[param]; })\n .join('&'));\n }\n this.xhr.open(this.method, url, true);\n this.xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest');\n for (var header in this.headers) {\n this.xhr.setRequestHeader(header, this.headers[header]);\n }\n };\n HttpRequest.prototype.abort = function () {\n this.xhr.abort();\n };\n return HttpRequest;\n}());\nexport { HttpRequest };\n//# sourceMappingURL=http_request.js.map","import { DataType } from '../types/data_type';\nimport { utils } from '../utils/utils';\n/**\n * Contains internatialization functionality.\n */\nexport var i18n;\n(function (i18n) {\n var englishUSLocaleSettings = {\n shortDateFormat: 'MM/dd/yyyy',\n longDateFormat: 'dd MMM, yyyy',\n editDateFormat: 'MM/dd/yyyy',\n shortTimeFormat: 'HH:mm',\n editTimeFormat: 'HH:mm',\n longTimeFormat: 'HH:mm:ss',\n shortMonthNames: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n longMonthNames: ['January', 'February', 'March', 'April', 'May', 'June',\n 'July', 'August', 'September', 'October', 'November', 'December'],\n shortWeekDayNames: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n longWeekDayNames: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n decimalSeparator: '.',\n currency: 'USD'\n };\n var defaultLocale = {\n localeId: 'en-US',\n englishName: 'English',\n displayName: 'English',\n texts: {\n ButtonOK: 'OK',\n ButtonCancel: 'Cancel',\n Yes: 'Yes',\n No: 'No',\n True: 'True',\n False: 'False'\n },\n settings: englishUSLocaleSettings\n };\n var allLocales = {\n 'en-US': defaultLocale\n };\n var currentLocale;\n var mappers = [];\n function mapInfo(info) {\n for (var _i = 0, mappers_1 = mappers; _i < mappers_1.length; _i++) {\n var mapper = mappers_1[_i];\n mapper(info);\n }\n }\n function addMapper(mapper) {\n mappers.push(mapper);\n }\n i18n.addMapper = addMapper;\n /**\n * Gets added locales with their names.\n * @returns The locales.\n */\n function getLocales() {\n var result = [];\n for (var locale in allLocales) {\n result.push({\n locale: locale,\n englishName: allLocales[locale].englishName,\n displayName: allLocales[locale].displayName\n });\n }\n return result.sort(function (a, b) {\n if (a.englishName > b.englishName) {\n return 1;\n }\n else if (a.englishName === b.englishName) {\n return 0;\n }\n return -1;\n });\n }\n i18n.getLocales = getLocales;\n /**\n * Gets the current locale ID.\n * @returns The locale.\n */\n function getCurrentLocale() {\n return currentLocale.localeId;\n }\n i18n.getCurrentLocale = getCurrentLocale;\n /**\n * Sets the curent locale.\n * @deprecated Use setCurrentLocale instead\n * @param l The locale.\n */\n function setLocale(l) {\n console.warn('This method is deprecated. Use setCurrentLocale instead');\n setCurrentLocale(l);\n }\n i18n.setLocale = setLocale;\n /**\n * Sets the curent locale.\n * @param localeId The locale.\n */\n function setCurrentLocale(localeId) {\n var newLocale = allLocales[localeId];\n if (newLocale) {\n utils.assignDeep(currentLocale, newLocale);\n }\n else {\n currentLocale.englishName = localeId;\n currentLocale.displayName = localeId;\n currentLocale.texts = utils.assignDeep({}, defaultLocale.texts);\n }\n currentLocale.localeId = localeId;\n }\n i18n.setCurrentLocale = setCurrentLocale;\n /**\n * Returns localized text by the key defined in parameter.\n * Here we get the text of the resource string assigned to CmdClickToAddCondition key:\n *\n ```\n const text = i18n.getText('CmdClickToAddCondition')\n ```\n * @param args The keys of the resource string.\n * @returns Text of the resource defined by key or null if the key is not found\n *\n */\n function getText() {\n var args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n var textsObj = currentLocale.texts;\n var resText = '';\n if (args && args.length) {\n var argLength = args.length;\n for (var i = 0; i < argLength; i++) {\n resText = textsObj[args[i]];\n if (typeof resText === 'object') {\n textsObj = resText;\n }\n else {\n break;\n }\n }\n }\n return resText;\n }\n i18n.getText = getText;\n function getLocaleSettings() {\n return currentLocale.settings;\n }\n i18n.getLocaleSettings = getLocaleSettings;\n function getOneLocaleSetting(key) {\n return currentLocale.settings[key];\n }\n i18n.getOneLocaleSetting = getOneLocaleSetting;\n function getShortMonthName(monthNum) {\n var settings = getLocaleSettings();\n if (monthNum > 0 && monthNum < 13) {\n return settings.shortMonthNames[monthNum - 1];\n }\n else {\n throw 'Wrong month number: ' + monthNum;\n }\n }\n i18n.getShortMonthName = getShortMonthName;\n function getLongMonthName(monthNum) {\n var settings = getLocaleSettings();\n if (monthNum > 0 && monthNum < 13) {\n return settings.longMonthNames[monthNum - 1];\n }\n else {\n throw 'Wrong month number: ' + monthNum;\n }\n }\n i18n.getLongMonthName = getLongMonthName;\n function getShortWeekDayName(dayNum) {\n var settings = getLocaleSettings();\n if (dayNum > 0 && dayNum < 8) {\n return settings.shortWeekDayNames.length >= dayNum\n ? settings.shortWeekDayNames[dayNum - 1]\n : dayNum.toString();\n }\n else {\n throw 'Wrong month number: ' + dayNum;\n }\n }\n i18n.getShortWeekDayName = getShortWeekDayName;\n function getLongWeekDayName(dayNum) {\n var settings = getLocaleSettings();\n if (dayNum > 0 && dayNum < 8) {\n return settings.longWeekDayNames.length >= dayNum\n ? settings.longWeekDayNames[dayNum - 1]\n : dayNum.toString();\n }\n else {\n throw 'Wrong month number: ' + dayNum;\n }\n }\n i18n.getLongWeekDayName = getLongWeekDayName;\n /**\n * Updates the locale settings (date/time formats, separators, etc) for the specified locale.\n * @param settingsToUpdate a LocaleSettings object\n */\n function updateLocaleSettings(settingsToUpdate) {\n if (!currentLocale.settings) {\n currentLocale.settings = utils.assignDeep({}, englishUSLocaleSettings);\n }\n currentLocale.settings = utils.assignDeep(currentLocale.settings, settingsToUpdate);\n }\n i18n.updateLocaleSettings = updateLocaleSettings;\n /**\n * Updates the texts for the current locale\n * @param texts A plain JS object that contains textual resources\n */\n function updateLocaleTexts(texts) {\n if (typeof texts !== 'object') {\n console.error('Wrong parameter type in updateLocaleTexts function call.' +\n 'The first parameter (localeId) is not necessary. Use updateLocaleTexts(texts) instead');\n return;\n }\n mapInfo({ localeId: currentLocale.localeId, texts: texts });\n utils.assignDeep(currentLocale.texts, texts);\n }\n i18n.updateLocaleTexts = updateLocaleTexts;\n function updateDefaultTexts(texts) {\n for (var localeId in allLocales) {\n var locale = allLocales[localeId];\n locale.texts = utils.assignDeep({}, texts, locale.texts);\n }\n currentLocale.texts = utils.assignDeep({}, texts, currentLocale.texts);\n }\n i18n.updateDefaultTexts = updateDefaultTexts;\n /**\n * Updates the information for the specified locale.\n * @param localeId The locale ID (like 'en', 'de', 'uk', etc).\n * If the locale does exist yet - it will be added\n * @param localeInfo a LocaleInfo object that contains the locale settings and textual resources\n */\n function updateLocaleInfo(localeId, localeData) {\n mapInfo(localeData);\n var localeInfoToUpdate = currentLocale;\n if (localeId) {\n if (!localeData.localeId) {\n localeData.localeId = localeId;\n }\n localeInfoToUpdate = allLocales[localeId];\n if (!localeInfoToUpdate) {\n localeInfoToUpdate = utils.assignDeep({}, defaultLocale);\n allLocales[localeId] = localeInfoToUpdate;\n }\n }\n utils.assignDeep(localeInfoToUpdate, localeData);\n }\n i18n.updateLocaleInfo = updateLocaleInfo;\n /**\n * Adds the locale.\n * @param localeId The locale ID (like 'en', 'de', 'uk', etc).\n * If the locale does exist yet - it will be created\n * @param localeInfo - a LocaleInfo object that contains the locale settings and textual resources\n */\n function addLocale(localeId, localeInfo) {\n updateLocaleInfo(localeId, localeInfo);\n }\n i18n.addLocale = addLocale;\n /**\n * Overwrites some locale settings (date/time formats) with the formats used in browser's current language\n */\n function determineSettingsByLocale(localeId) {\n var now = new Date(2020, 5, 7, 19, 34, 56, 88);\n var dateOptions = { year: 'numeric', month: 'numeric', day: 'numeric' };\n var timeOptions = { hour: 'numeric', minute: 'numeric', second: 'numeric' };\n var dateStr = now.toLocaleDateString(localeId, dateOptions);\n var timeStr = now.toLocaleTimeString(localeId, timeOptions);\n var dateFormat = dateStr\n .replace('07', 'dd')\n .replace('7', 'd')\n .replace('06', 'MM')\n .replace('6', 'M')\n .replace('2020', 'yyyy')\n .replace('20', 'yy');\n var timeFormat = timeStr\n .replace('19', 'HH')\n .replace('07', 'hh')\n .replace('7', 'h')\n .replace('34', 'mm')\n .replace('56', 'ss')\n .replace('PM', 'tt');\n if (!currentLocale.settings) {\n currentLocale.settings = {};\n }\n var localeSettings = {\n shortDateFormat: dateFormat,\n shortTimeFormat: timeFormat\n };\n updateLocaleSettings(localeSettings);\n }\n function loadBrowserLocaleSettings() {\n var lang = typeof navigator === 'object' ? navigator.language : undefined;\n determineSettingsByLocale(lang);\n }\n function resetLocales() {\n if (!currentLocale) {\n currentLocale = utils.assignDeep({}, defaultLocale);\n loadBrowserLocaleSettings();\n }\n }\n i18n.resetLocales = resetLocales;\n function dateTimeToStr(dateTime, dataType, format) {\n if (format) {\n if (format == 'd') {\n format = buildShortDateTimeFormat(DataType.Date);\n }\n else if (format == 'D') {\n format = buildLongDateTimeFormat(DataType.Date);\n }\n else if (format == 'f') {\n format = buildShortDateTimeFormat(DataType.DateTime);\n }\n else if (format == 'F') {\n format = buildLongDateTimeFormat(DataType.DateTime);\n }\n }\n else {\n format = buildShortDateTimeFormat(dataType);\n }\n return utils.dateTimeToStr(dateTime, format);\n }\n i18n.dateTimeToStr = dateTimeToStr;\n function buildShortDateTimeFormat(dataType) {\n var localeSettings = getLocaleSettings();\n var format;\n switch (dataType) {\n case DataType.Date:\n format = localeSettings.shortDateFormat;\n break;\n case DataType.Time:\n format = localeSettings.shortTimeFormat;\n break;\n default:\n format = localeSettings.shortDateFormat + ' ' + localeSettings.shortTimeFormat;\n break;\n }\n return format;\n }\n function buildLongDateTimeFormat(dataType) {\n var localeSettings = getLocaleSettings();\n var format;\n switch (dataType) {\n case DataType.Date:\n format = localeSettings.longDateFormat;\n break;\n case DataType.Time:\n format = localeSettings.longTimeFormat;\n break;\n default:\n format = localeSettings.longDateFormat + ' ' + localeSettings.longTimeFormat;\n break;\n }\n return format;\n }\n function numberToStr(number, format) {\n if (format && format.length > 0) {\n var type = format.charAt(0).toUpperCase();\n if (type === 'S') {\n return formatWithSequence(number, format.slice(1));\n }\n else if (['D', 'F', 'C'].indexOf(type) >= 0) {\n var locale = getCurrentLocale();\n return number.toLocaleString(locale, getNumberFormatOptions(format));\n }\n else {\n return convertWithMask(Math.trunc(number), format);\n }\n }\n var localeSettings = getLocaleSettings();\n return utils.numberToStr(number, localeSettings.decimalSeparator);\n }\n i18n.numberToStr = numberToStr;\n function booleanToStr(bool, format) {\n if (format && format.length > 0) {\n var type = format.charAt(0).toUpperCase();\n if (type === 'S') {\n var values = format.slice(1).split('|');\n if (values.length > 1) {\n var value = values[(bool) ? 1 : 0];\n return i18n.getText(value) || value;\n }\n }\n }\n return \"\".concat(bool);\n }\n i18n.booleanToStr = booleanToStr;\n var cachedSequenceFormats = {};\n function formatWithSequence(number, format) {\n if (!cachedSequenceFormats[format]) {\n // parse and save in cache format values \n var values_2 = format.split('|')\n .filter(function (v) { return v.length > 0; })\n .map(function (v) { return v.split('='); });\n cachedSequenceFormats[format] = {};\n if (values_2.length > 0) {\n if (values_2[0].length > 1) {\n for (var _i = 0, values_1 = values_2; _i < values_1.length; _i++) {\n var value = values_1[_i];\n cachedSequenceFormats[format][Number.parseInt(value[1])] = value[0];\n }\n }\n else {\n values_2.forEach(function (value, index) {\n cachedSequenceFormats[format][index] = value[0];\n });\n }\n }\n }\n var values = cachedSequenceFormats[format];\n if (values[number] !== undefined) {\n var value = values[number];\n return i18n.getText(value) || value;\n }\n return number.toString();\n }\n function convertWithMask(number, mask) {\n var value = number.toString();\n var result = '';\n var index = value.length - 1;\n for (var i = mask.length - 1; i >= 0; i--) {\n var ch = mask.charAt(i);\n if (ch === '#' || ch === '0') {\n if (index >= 0) {\n result += value.charAt(index);\n index--;\n }\n else {\n if (ch === '0') {\n result += 0;\n }\n }\n }\n else {\n result += ch;\n }\n }\n return result.split('').reverse().join('');\n }\n function getNumberFormatOptions(format) {\n var localeSettings = getLocaleSettings();\n var type = format[0].toUpperCase();\n var digits = (format.length > 1)\n ? Number.parseInt(format.slice(1))\n : type == 'D' ? 1 : 2;\n switch (type) {\n case 'D':\n return {\n style: 'decimal',\n useGrouping: false,\n minimumIntegerDigits: digits\n };\n case 'C':\n return {\n style: 'currency',\n currency: localeSettings.currency,\n minimumFractionDigits: digits\n };\n default:\n return {\n style: 'decimal',\n minimumFractionDigits: digits,\n maximumFractionDigits: digits\n };\n }\n }\n})(i18n || (i18n = {}));\n//# sourceMappingURL=i18n.js.map","import { DataType } from '../types/data_type';\nimport { i18n } from '../i18n/i18n';\nexport var utils;\n(function (utils) {\n function getAllDataTypes() {\n return Object.values(DataType).filter(function (item) { return typeof item === \"number\"; });\n }\n utils.getAllDataTypes = getAllDataTypes;\n function getDateDataTypes() {\n return [DataType.Time, DataType.Date, DataType.DateTime];\n }\n utils.getDateDataTypes = getDateDataTypes;\n function getStringDataTypes() {\n return [DataType.String, DataType.Memo, DataType.FixedChar];\n }\n utils.getStringDataTypes = getStringDataTypes;\n var _numericTypes = [DataType.Byte, DataType.Word, DataType.Int32,\n DataType.Int64, DataType.Float, DataType.Currency, DataType.Autoinc];\n function getNumericDataTypes() {\n return _numericTypes;\n }\n utils.getNumericDataTypes = getNumericDataTypes;\n var _intTypes = [DataType.Byte, DataType.Word, DataType.Int32, DataType.Int64, DataType.Autoinc];\n //-------------- object functions -------------------\n /**\n * Copy the content of all objests passed in `args` parameters into `target`\n * and returns the result\n * NB: This function copies only the first level properties.\n * For a deep copy please use `assignDeep`\n * @param target - the target object\n * @param args - an array of the source objects\n */\n function assign(target) {\n var args = [];\n for (var _i = 1; _i < arguments.length; _i++) {\n args[_i - 1] = arguments[_i];\n }\n for (var i = 0; i < args.length; i++) {\n var source = args[i];\n if (source) {\n for (var key in source) {\n if (source.hasOwnProperty(key)) {\n target[key] = source[key];\n }\n }\n }\n }\n return target;\n }\n utils.assign = assign;\n /**\n * Copy the content of all objests passed in `args` parameters into `target`\n * and returns the result\n * NB: This function make a deep copy -\n * so `assignDeep` will be called recursively for all object properties\n * on the first level.\n * @param target - the target object\n * @param sources - an array of the source objects\n */\n function assignDeep(target) {\n var sources = [];\n for (var _i = 1; _i < arguments.length; _i++) {\n sources[_i - 1] = arguments[_i];\n }\n return assignDeepCore(new WeakMap(), target, sources);\n }\n utils.assignDeep = assignDeep;\n function assignDeepCore(hashSet, target, sources) {\n if (!target) {\n target = {};\n }\n for (var _i = 0, sources_1 = sources; _i < sources_1.length; _i++) {\n var source = sources_1[_i];\n if (source) {\n for (var key in source) {\n if (source.hasOwnProperty(key)) {\n var sourceVal = source[key];\n if (sourceVal !== null && typeof sourceVal === 'object') {\n if (hashSet.has(sourceVal)) {\n target[key] = hashSet.get(sourceVal);\n }\n else {\n if (Array.isArray(sourceVal)) {\n target[key] = createArrayFrom(sourceVal);\n hashSet.set(sourceVal, target[key]);\n }\n else {\n if (typeof target[key] == 'undefined' || target[key] == null) {\n target[key] = Object.create(Object.getPrototypeOf(sourceVal));\n }\n hashSet.set(sourceVal, target[key]);\n assignDeepCore(hashSet, target[key], [sourceVal]);\n }\n }\n }\n else {\n target[key] = sourceVal;\n }\n }\n }\n }\n }\n return target;\n }\n function getIfDefined(value, defaultValue) {\n return (typeof value !== 'undefined') ? value : defaultValue;\n }\n utils.getIfDefined = getIfDefined;\n function IsDefinedAndNotNull(value) {\n return typeof value !== 'undefined' && value !== null;\n }\n utils.IsDefinedAndNotNull = IsDefinedAndNotNull;\n function copyArrayTo(collection1, collection2) {\n var len1 = collection1.length;\n var len2 = collection2.length;\n for (var i = 0; i < len1 && i < len2; i++) {\n collection2[i] = collection1[i];\n }\n }\n utils.copyArrayTo = copyArrayTo;\n function createArrayFrom(collection) {\n var result = [];\n for (var _i = 0, collection_1 = collection; _i < collection_1.length; _i++) {\n var item = collection_1[_i];\n result.push(item);\n }\n return result;\n }\n utils.createArrayFrom = createArrayFrom;\n /**\n * Searches an array of the objects which implement ItemWithId by ID\n * Returs the found object or null.\n * @param array\n * @param id\n */\n function findItemById(array, id) {\n var arrLength = array.length;\n for (var idx = 0; idx < arrLength; idx++) {\n if (array[idx].id === id)\n return array[idx];\n }\n return null;\n }\n utils.findItemById = findItemById;\n function findItemIndexById(array, id) {\n var arrLength = array.length;\n for (var idx = 0; idx < arrLength; idx++) {\n if (array[idx].id === id)\n return idx;\n }\n return -1;\n }\n utils.findItemIndexById = findItemIndexById;\n /**\n * Searches an array of the objects which implement ItemWithId by ID\n * Returs the index of the found element, or -1 if nothing was found.\n * @param array\n * @param id\n */\n function indexOfArrayItem(arr, item) {\n if (arr.indexOf) {\n return arr.indexOf(item);\n }\n else {\n var len = arr.length;\n for (var i = 0; i < len; i++) {\n if (item == arr[i]) {\n return i;\n }\n }\n return -1;\n }\n }\n utils.indexOfArrayItem = indexOfArrayItem;\n /**\n * Moves an item in some array to a new position\n * @param array\n * @param index1\n * @param index2\n */\n function moveArrayItem(array, index1, index2) {\n if (index1 >= array.length) {\n throw 'Index out of bounds: ' + index1;\n }\n if (index2 >= array.length) {\n index2 = array.length - 1;\n }\n var item = array.splice(index1, 1)[0];\n array.splice(index2, 0, item);\n }\n utils.moveArrayItem = moveArrayItem;\n /**\n * Searches for a particular item in the array are removes that item if found.\n * @param arr\n * @param value\n */\n function removeArrayItem(arr, value) {\n var index = arr.indexOf(value);\n if (index != -1) {\n return arr.splice(index, 1)[0];\n }\n }\n utils.removeArrayItem = removeArrayItem;\n function insertArrayItem(arr, index, value) {\n arr.splice(index, 0, value);\n }\n utils.insertArrayItem = insertArrayItem;\n function fillArray(arr, value, start, end) {\n if (start === void 0) { start = 0; }\n var len = arr.length >>> 0;\n var relativeStart = start >> 0;\n var k = relativeStart < 0 ?\n Math.max(len + relativeStart, 0) :\n Math.min(relativeStart, len);\n var relativeEnd = end === undefined ?\n len : end >> 0;\n var final = relativeEnd < 0 ?\n Math.max(len + relativeEnd, 0) :\n Math.min(relativeEnd, len);\n while (k < final) {\n arr[k] = value;\n k++;\n }\n return arr;\n }\n utils.fillArray = fillArray;\n //------------ DOM utils ------------\n /**\n * Calculates the shift on which we need to move our element horizontally\n * to find current window\n * @param absLeft\n * @param width\n */\n function shiftToFitWindow(absLeft, width) {\n var body = document.getElementsByTagName('body')[0];\n var winWidth = window.innerWidth || document.documentElement.clientWidth || body.clientWidth;\n var absRight = absLeft + width;\n var shift = 0;\n if (absRight > winWidth) {\n shift = winWidth - absRight - 10;\n if (absLeft + shift < 0) {\n shift = 10 - absLeft;\n }\n }\n return shift;\n }\n utils.shiftToFitWindow = shiftToFitWindow;\n /**\n * Returns `true` if the value passed in the parameter is an object\n * @param val\n */\n function isObject(val) {\n if (val === null) {\n return false;\n }\n return ((typeof val === 'function') || (typeof val === 'object'));\n }\n utils.isObject = isObject;\n /**\n * Returns `true` if the `DataType` value passed in the parameter\n * represents some numeric type\n * @param dtype\n */\n function isNumericType(dtype) {\n var index = _numericTypes.indexOf(dtype);\n return (index >= 0);\n }\n utils.isNumericType = isNumericType;\n /**\n * Returns `true` if the `DataType` value passed in the parameter\n * represents some numeric type\n * @param dtype\n */\n function isIntType(dtype) {\n var index = _intTypes.indexOf(dtype);\n return (index >= 0);\n }\n utils.isIntType = isIntType;\n /**\n * Returns `true` if the value passed in the parameter is an a numeric value\n * @param val\n */\n function isNumeric(val) {\n return !isNaN(parseFloat(val)) && isFinite(val);\n }\n utils.isNumeric = isNumeric;\n /**\n * Returns `true` if two data types passed in parameters\n * are compatible - so it's safe to copy the values between\n * two expressions with these two types\n * @param type1\n * @param type2\n */\n function areCompatibleDataTypes(type1, type2) {\n return typeof type1 == \"undefined\" || typeof type2 == \"undefined\" || type1 == DataType.Unknown || type2 == DataType.Unknown\n || (type1 == type2) || (type1 == DataType.Date && type2 == DataType.DateTime)\n || (type1 == DataType.DateTime && type2 == DataType.Date);\n }\n utils.areCompatibleDataTypes = areCompatibleDataTypes;\n /**\n * Returns `true` if the property with named `propName`\n * in the object `obj` has some value\n * @param obj\n * @param propName\n */\n function isPropSet(obj, propName) {\n return obj[propName] || obj[propName.toLowerCase()] || obj[propName.toUpperCase()];\n }\n utils.isPropSet = isPropSet;\n //-------------- ID generator -----------\n var prefixIdLen = 4;\n var symbols = \"0123456789abcdefghijklmnopqrstuvwxyz\";\n var magicTicks = 636712160627685350;\n /**\n * Generates an unique ID\n */\n function generateId(prefix) {\n if (!prefix) {\n prefix = 'easy';\n }\n var prfx = (prefix.length > prefixIdLen) ? squeezeMoniker(prefix, prefixIdLen) : prefix;\n if (prfx && prfx.length > 0) {\n prfx += \"-\";\n }\n //adding 3 random symbols\n var randCharPart = symbols[getRandomInt(0, symbols.length)] +\n symbols[getRandomInt(0, symbols.length)] +\n symbols[getRandomInt(0, symbols.length)];\n var randInt = getRandomInt(0, 10000);\n //generating main ID part \n //it's a 36-base representation of some random number based on current value of ticks\n var ticksNum36 = intToNumBase(getNowTicks() - magicTicks - randInt);\n return prfx + randCharPart + ticksNum36;\n }\n utils.generateId = generateId;\n function intToNumBase(value, targetBase) {\n if (targetBase === void 0) { targetBase = 36; }\n var buffer = '';\n var rest = value;\n do {\n buffer = symbols[rest % targetBase] + buffer;\n rest = Math.floor(rest /= targetBase);\n } while (rest > 0);\n return buffer;\n }\n function squeezeMoniker(str, maxlen) {\n var parts = str.split('-');\n var pml = 1;\n var ptt = maxlen;\n if (parts.length < maxlen) {\n pml = maxlen / parts.length;\n ptt = parts.length;\n }\n var result = \"\";\n for (var i = 0; i < ptt; i++) {\n result += squeeze(parts[i], pml);\n }\n return result;\n }\n function squeeze(str, maxlen) {\n var len = str.length;\n if (len > maxlen) {\n var step = len / maxlen;\n var result = \"\";\n result += str[0];\n var nextIndex = step;\n var ch = void 0;\n for (var i = 1; i < len; i++) {\n ch = str[i];\n if (i + 1 > nextIndex) {\n result += ch;\n nextIndex += step;\n }\n }\n return result;\n }\n else {\n return str;\n }\n }\n function replaceAtString(str, index, replacement) {\n return str.substring(0, index) + replacement + str.substring(index + replacement.length);\n }\n function getRandomInt(min, max) {\n return Math.floor(Math.random() * (max - min)) + min;\n }\n function getNowTicks() {\n return (621355968e9 + (new Date()).getTime() * 1e4);\n }\n function safeParseInt(str) {\n var res = parseInt(str);\n if (isNaN(res))\n throw \"\\\"\".concat(str, \"\\\" is not a valid number\");\n return res;\n }\n function getDaysInMonth(month, year) {\n return new Date(year, month + 1, 0).getDate();\n }\n // ------------- date/time functions -------------------\n // TO DO: improve to process all datetime cases\n function strToDateTime(value, format) {\n if (!value || value.length == 0)\n return new Date();\n var normalizedValue = value.replace(/[^a-zA-Z0-9_]/g, '-');\n var normalizedFormat = format.replace(/[^a-zA-Z0-9_]/g, '-');\n var formatItems = normalizedFormat.split('-');\n var dateItems = normalizedValue.split('-');\n var monthIndex = formatItems.indexOf(\"MM\");\n var dayIndex = formatItems.indexOf(\"dd\");\n var yearIndex = formatItems.indexOf(\"yyyy\");\n var hourIndex = formatItems.indexOf(\"HH\");\n var minutesIndex = formatItems.indexOf(\"mm\");\n var secondsIndex = formatItems.indexOf(\"ss\");\n var today = new Date();\n try {\n var year = yearIndex > -1 && yearIndex < dateItems.length\n ? safeParseInt(dateItems[yearIndex])\n : today.getFullYear();\n var month = monthIndex > -1 && monthIndex < dateItems.length\n ? safeParseInt(dateItems[monthIndex]) - 1\n : today.getMonth() - 1;\n if (month > 11)\n throw '';\n var day = dayIndex > -1 && dayIndex < dateItems.length\n ? safeParseInt(dateItems[dayIndex])\n : today.getDate();\n if (day > getDaysInMonth(month, year))\n throw '';\n var hour = hourIndex > -1 && hourIndex < dateItems.length\n ? safeParseInt(dateItems[hourIndex])\n : 0;\n if (hour > 23)\n throw '';\n var minute = minutesIndex > -1 && minutesIndex < dateItems.length\n ? safeParseInt(dateItems[minutesIndex])\n : 0;\n if (minute > 59)\n throw '';\n var second = secondsIndex > -1 && secondsIndex < dateItems.length\n ? safeParseInt(dateItems[secondsIndex])\n : 0;\n if (second > 59)\n throw '';\n return new Date(year, month, day, hour, minute, second);\n }\n catch (_a) {\n throw \"\".concat(value, \" is not a valid date.\");\n }\n }\n utils.strToDateTime = strToDateTime;\n function strToTime(str) {\n var timeItems = str.split(':');\n try {\n var hour = timeItems.length > 0 ? safeParseInt(timeItems[0]) : 0;\n if (hour > 23)\n throw '';\n var minute = timeItems.length > 1 ? safeParseInt(timeItems[1]) : 0;\n if (minute > 59)\n throw '';\n var second = timeItems.length > 1 ? safeParseInt(timeItems[1]) : 0;\n if (second > 59)\n throw '';\n return new Date(0, 0, 0, hour, minute, second);\n }\n catch (_a) {\n throw \"\".concat(str, \" is not a valid time.\");\n }\n }\n utils.strToTime = strToTime;\n var DT_FORMAT_RGEX = /\\[([^\\]]+)]|y{2,4}|M{1,4}|d{1,2}|H{1,2}|h{1,2}|m{2}|s{2}|t{2}/g;\n /**\n * Returns string representation of the date/time value according to the custom format (second parameter)\n * The format is compatible with the one used in .NET: https://docs.microsoft.com/en-us/dotnet/standard/base-types/custom-date-and-time-format-strings\n * @param date\n * @param format\n */\n function dateTimeToStr(date, format) {\n var year = date.getFullYear();\n var yearStr = year.toString();\n var month = date.getMonth() + 1;\n var day = date.getDate();\n var hour = date.getHours();\n var minute = date.getMinutes();\n var second = date.getSeconds();\n var hour12 = hour % 12 || 12; //the remainder of the division by 12. Or 12 if it's 0\n var isPm = hour > 11;\n var matches = {\n yyyy: yearStr,\n yy: yearStr.substring(yearStr.length - 2),\n MMMM: i18n.getLongMonthName(month),\n MMM: i18n.getShortMonthName(month),\n MM: (month < 10) ? '0' + month : month.toString(),\n M: month.toString(),\n dd: (day < 10) ? '0' + day : day.toString(),\n d: day.toString(),\n HH: (hour < 10) ? '0' + hour : hour.toString(),\n H: hour.toString(),\n hh: (hour12 < 10) ? '0' + hour12 : hour12.toString(),\n h: hour12.toString(),\n tt: isPm ? 'PM' : 'AM',\n mm: (minute < 10) ? '0' + minute : minute.toString(),\n ss: (second < 10) ? '0' + second : second.toString()\n };\n return format.replace(DT_FORMAT_RGEX, function (match, $1) {\n return $1 || matches[match];\n });\n }\n utils.dateTimeToStr = dateTimeToStr;\n /**\n * Converts a numeric value to the string taking into the account the decimal separator\n * @param value - the number to convert\n * @param decimalSeparator - the symbol that represents decimal separator. If not specified the function gets the one from the current locale settings.\n */\n function numberToStr(number, decimalSeparator) {\n decimalSeparator = decimalSeparator || i18n.getLocaleSettings().decimalSeparator;\n return number.toString().replace('.', decimalSeparator);\n }\n utils.numberToStr = numberToStr;\n})(utils || (utils = {}));\n//# sourceMappingURL=utils.js.map","var HttpActionResult = /** @class */ (function () {\n function HttpActionResult(request, promise) {\n this.request = request;\n this.promise = promise;\n }\n HttpActionResult.prototype.getPromise = function () {\n return this.promise;\n };\n HttpActionResult.prototype.getRequest = function () {\n return this.request;\n };\n HttpActionResult.prototype.then = function (onfulfilled, onrejected) {\n return this.promise.then(onfulfilled, onrejected);\n };\n HttpActionResult.prototype.catch = function (onrejected) {\n return this.promise.catch(onrejected);\n };\n HttpActionResult.prototype.finally = function (onfinally) {\n return this.promise.finally(onfinally);\n };\n return HttpActionResult;\n}());\nexport { HttpActionResult };\n//# sourceMappingURL=http_action_result.js.map","var __extends = (this && this.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n if (typeof b !== \"function\" && b !== null)\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar __assign = (this && this.__assign) || function () {\n __assign = Object.assign || function(t) {\n for (var s, i = 1, n = arguments.length; i < n; i++) {\n s = arguments[i];\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\n t[p] = s[p];\n }\n return t;\n };\n return __assign.apply(this, arguments);\n};\nimport { utils } from '../utils/utils';\nimport { HttpActionResult } from './http_action_result';\nimport { HttpMethod } from './http_method';\nimport { HttpRequest } from './http_request';\nvar HttpResponseError = /** @class */ (function (_super) {\n __extends(HttpResponseError, _super);\n function HttpResponseError(status, message) {\n var _this = _super.call(this, message) || this;\n _this.status = status;\n return _this;\n }\n return HttpResponseError;\n}(Error));\nexport { HttpResponseError };\nvar HttpClient = /** @class */ (function () {\n function HttpClient() {\n this.defaultHeaders = {};\n this.customPayload = undefined;\n }\n Object.defineProperty(HttpClient.prototype, \"responseBody\", {\n /** Gets the response body for the latest request */\n get: function () {\n return this._responseBody;\n },\n enumerable: false,\n configurable: true\n });\n HttpClient.prototype.get = function (url, options) {\n return this.send(HttpMethod.Get, url, null, options);\n };\n HttpClient.prototype.post = function (url, data, options) {\n return this.send(HttpMethod.Post, url, data, options);\n };\n HttpClient.prototype.put = function (url, data, options) {\n return this.send(HttpMethod.Put, url, data, options);\n };\n HttpClient.prototype.delete = function (url, data, options) {\n return this.send(HttpMethod.Delete, url, data, options);\n };\n HttpClient.prototype.send = function (method, url, data, options) {\n var _this = this;\n options = options || {};\n var dataType = options.dataType || 'json';\n var contentType = options.contentType || (dataType !== 'form-data')\n ? 'application/json'\n : null;\n if (data && dataType != 'form-data' && this.customPayload) {\n data.data = utils.assignDeep(data.data || {}, this.customPayload);\n }\n var XHR = ('onload' in new XMLHttpRequest())\n ? XMLHttpRequest\n : window[\"XDomainRequest\"]; //IE support\n var xhr = new XHR();\n var desc = {\n method: method,\n url: url,\n headers: __assign(__assign({}, this.defaultHeaders), options.headers || {}),\n queryParams: options.queryParams || {},\n data: data\n };\n if (contentType)\n desc.headers['Content-Type'] = contentType;\n var request = new HttpRequest(xhr, desc);\n if (this.beforeEachRequest) {\n console.warn(\"HttpClient: 'beforeEachRequest' is deprecated and will be removed in future updates.\\n Use 'onRequest' instead\");\n this.beforeEachRequest(request);\n }\n if (this.onRequest) {\n this.onRequest(request);\n }\n var dataToSend = (request.data && typeof request.data !== 'string'\n && dataType == 'json')\n ? JSON.stringify(request.data)\n : request.data;\n request.open();\n return new HttpActionResult(request, new Promise(function (resolve, reject) {\n if (options.responseType)\n xhr.responseType = options.responseType;\n xhr.onerror = function (error) {\n reject(new HttpResponseError(xhr.status, xhr.responseText));\n };\n xhr.onreadystatechange = function () {\n if (xhr.readyState != 4)\n return; //we process only the state change to DONE(4)\n var responseContentType = xhr.getResponseHeader('Content-Type') || '';\n var status = xhr.status;\n if (status === 0) {\n reject(new HttpResponseError(status, \"Network error or the request was aborted\"));\n }\n else if (status >= 200 && status < 400) {\n //Success\n var responseObj = (xhr.responseType === 'arraybuffer' || xhr.responseType === 'blob')\n ? xhr.response\n : (responseContentType.indexOf('application/json') == 0\n ? JSON.parse(xhr.responseText)\n : xhr.responseText);\n _this._responseBody = responseObj;\n if (_this.onResponse) {\n _this.onResponse(xhr);\n }\n resolve(responseObj);\n }\n else {\n //Error\n var rtPromise = (xhr.responseType === 'arraybuffer' || xhr.responseType === 'blob')\n ? HttpClient.decodeArrayBuffer(xhr.response)\n : Promise.resolve(xhr.responseText);\n rtPromise.then(function (responseText) {\n var responseObj = (responseContentType.indexOf('application/json') == 0)\n ? JSON.parse(responseText)\n : responseText;\n _this._responseBody = responseObj;\n var message = responseObj.message ||\n (status == 404\n ? \"No such endpoint: \".concat(url)\n : responseObj);\n reject(new HttpResponseError(status, message));\n });\n }\n };\n xhr.send(dataToSend);\n }));\n };\n HttpClient.decodeArrayBuffer = function (uintArray) {\n var reader = new FileReader();\n return new Promise(function (resolve) {\n reader.onloadend = function () {\n if (reader.readyState == FileReader.DONE) {\n resolve(reader.result);\n }\n };\n reader.readAsText(new Blob([uintArray]));\n });\n };\n return HttpClient;\n}());\nexport { HttpClient };\n//# sourceMappingURL=http_client.js.map","import { DataType } from '../types/data_type';\nimport { utils } from '../utils/utils';\nexport var ColumnAlignment;\n(function (ColumnAlignment) {\n ColumnAlignment[ColumnAlignment[\"None\"] = 0] = \"None\";\n ColumnAlignment[ColumnAlignment[\"Left\"] = 1] = \"Left\";\n ColumnAlignment[ColumnAlignment[\"Center\"] = 2] = \"Center\";\n ColumnAlignment[ColumnAlignment[\"Right\"] = 3] = \"Right\";\n})(ColumnAlignment || (ColumnAlignment = {}));\nvar DataColumn = /** @class */ (function () {\n function DataColumn(desc) {\n if (!desc)\n throw Error(\"Options are required\");\n if (!desc.id)\n throw Error(\"Field Id is required\");\n if (!desc.label)\n throw Error(\"Label is required\");\n this.id = desc.id;\n this.type = utils.getIfDefined(desc.type, DataType.String);\n this.label = desc.label;\n this.originAttrId = desc.originAttrId;\n this.isAggr = desc.isAggr || false;\n this.displayFormat = desc.dfmt;\n this.groupFooterColumnTemplate = desc.gfct;\n this.style = desc.style || {};\n this.description = desc.description;\n this.calculatedWidth = 0;\n }\n return DataColumn;\n}());\nexport { DataColumn };\nvar DataColumnList = /** @class */ (function () {\n function DataColumnList() {\n this.items = [];\n this.mapper = {};\n this._dateColumnIdx = [];\n }\n Object.defineProperty(DataColumnList.prototype, \"count\", {\n get: function () {\n return this.items.length;\n },\n enumerable: false,\n configurable: true\n });\n DataColumnList.prototype.add = function (colOrDesc) {\n var col;\n if (colOrDesc instanceof DataColumn) {\n col = colOrDesc;\n }\n else {\n col = new DataColumn(colOrDesc);\n }\n var index = this.items.length;\n this.items.push(col);\n this.mapper[col.id] = index;\n if ([DataType.Date, DataType.DateTime, DataType.Time].indexOf(col.type) >= 0) {\n this._dateColumnIdx.push(index);\n }\n return index;\n };\n DataColumnList.prototype.updateDateColumnIdx = function () {\n this._dateColumnIdx = this.getItems()\n .filter(function (col) { return [DataType.Date, DataType.DateTime, DataType.Time].indexOf(col.type) >= 0; })\n .map(function (col, index) { return index; });\n };\n DataColumnList.prototype.put = function (index, col) {\n if (index >= 0 && index < this.count) {\n this.items[index] = col;\n this.updateDateColumnIdx();\n }\n };\n DataColumnList.prototype.move = function (col, newIndex) {\n var oldIndex = this.items.indexOf(col);\n if (oldIndex >= 0 && oldIndex != newIndex) {\n utils.moveArrayItem(this.items, oldIndex, newIndex);\n this.updateDateColumnIdx();\n }\n };\n DataColumnList.prototype.get = function (index) {\n if (index >= 0 && index < this.count) {\n return this.items[index];\n }\n else {\n return null;\n }\n };\n DataColumnList.prototype.getIndex = function (id) {\n return this.mapper[id];\n };\n DataColumnList.prototype.getItems = function () {\n return this.items;\n };\n DataColumnList.prototype.getDateColumnIndexes = function () {\n return this._dateColumnIdx;\n };\n DataColumnList.prototype.removeAt = function (index) {\n var col = this.get(index);\n this.items.splice(index, 1);\n var removeDate = this._dateColumnIdx.indexOf(index);\n if (removeDate >= 0) {\n this._dateColumnIdx.splice(removeDate, 1);\n }\n delete this.mapper[col.id];\n };\n DataColumnList.prototype.clear = function () {\n this.items = [];\n this._dateColumnIdx = [];\n this.mapper = {};\n };\n return DataColumnList;\n}());\nexport { DataColumnList };\n//# sourceMappingURL=data_column.js.map","import { DataType } from '../types/data_type';\nimport { EntityAttrKind } from '../types/entity_attr_kind';\nimport { utils } from '../utils/utils';\n/**\n * Represents one entity.\n */\nvar MetaEntity = /** @class */ (function () {\n /** The default constructor. */\n function MetaEntity(parent) {\n /** Returns false if this entity is read-only */\n this.isEditable = true;\n this.name = \"\";\n this.caption = \"\";\n this.description = \"\";\n this.parent = parent;\n this.attributes = new Array();\n this.subEntities = new Array();\n }\n /**\n * Loads entity from its JSON representation object.\n * @param model The Data Model.\n * @param dto The JSON representation object.\n */\n MetaEntity.prototype.loadFromData = function (model, dto) {\n if (dto) {\n this.id = dto.id;\n this.name = dto.name;\n this.captionPlural = dto.namePlur;\n this.caption = dto.name;\n this.description = dto.desc;\n if (typeof (dto.ied) !== 'undefined')\n this.isEditable = dto.ied;\n this.subEntities = new Array();\n if (dto.ents) {\n for (var i = 0; i < dto.ents.length; i++) {\n var newEntity = model.createEntity(this);\n newEntity.loadFromData(model, dto.ents[i]);\n this.subEntities.push(newEntity);\n }\n }\n this.attributes = new Array();\n if (dto.attrs) {\n for (var i = 0; i < dto.attrs.length; i++) {\n var newAttr = model.createEntityAttr(this);\n newAttr.loadFromData(model, dto.attrs[i]);\n this.attributes.push(newAttr);\n }\n }\n }\n };\n MetaEntity.prototype.scan = function (processAttribute, processEntity) {\n var opts = { stop: false };\n var internalProcessEntity = function (entity) {\n if (processEntity)\n processEntity(entity, opts);\n if (entity.attributes) {\n var attrCount = entity.attributes.length;\n for (var i = 0; (i < attrCount) && !opts.stop; i++) {\n var attr = entity.attributes[i];\n if (processAttribute) {\n processAttribute(attr, opts);\n }\n if (opts.stop)\n return;\n }\n }\n if (entity.subEntities) {\n var subEntityCount = entity.subEntities.length;\n for (var i = 0; (i < subEntityCount) && !opts.stop; i++) {\n internalProcessEntity(entity.subEntities[i]);\n }\n }\n };\n internalProcessEntity(this);\n };\n MetaEntity.prototype.getFirstPrimaryAttr = function () {\n return this.getPrimaryAttrs()[0];\n };\n MetaEntity.prototype.getPrimaryAttrs = function () {\n return this.attributes.filter(function (attr) { return attr.isPrimaryKey; });\n };\n return MetaEntity;\n}());\nexport { MetaEntity };\nvar MetaEntityAttr = /** @class */ (function () {\n /** The default constructor. */\n function MetaEntityAttr(entity) {\n this.id = \"\";\n this.caption = \"{Unrecognized attribute}\";\n this.dataType = DataType.String;\n this.size = 0;\n this.isPrimaryKey = false;\n this.isForeignKey = false;\n this.isNullable = true;\n this.showOnView = true;\n this.isEditable = true;\n this.showOnCreate = true;\n this.showOnEdit = true;\n this.showInLookup = false;\n this.lookupAttr = \"\";\n this.expr = \"\";\n this.entity = entity;\n this.kind = EntityAttrKind.Data;\n }\n /**\n * Loads entity attribute from JSON representation object.\n * @param model The Data Model.\n * @param dto The JSON representation object.\n */\n MetaEntityAttr.prototype.loadFromData = function (model, dto) {\n if (dto) {\n this.id = dto.id;\n this.description = dto.desc;\n this.caption = dto.cptn;\n this.dataType = dto.dtype;\n this.isPrimaryKey = dto.ipk;\n this.isForeignKey = dto.ifk;\n this.size = dto.size;\n this.lookupAttr = dto.lattr;\n this.lookupEntity = dto.lent;\n this.dataAttr = dto.dattr;\n this.lookupDataAttr = dto.ldattr;\n var isDataType = utils.getDateDataTypes().indexOf(this.dataType);\n this.defaultValue = dto.defVal && isDataType ? new Date(dto.defVal) : dto.defVal;\n this.isNullable = utils.getIfDefined(dto.nul, this.isNullable);\n this.isEditable = utils.getIfDefined(dto.ied, this.isEditable);\n this.showOnView = utils.getIfDefined(dto.ivis || dto.sov, this.showOnView);\n this.showOnCreate = utils.getIfDefined(dto.soc, this.showOnCreate);\n this.showOnEdit = utils.getIfDefined(dto.soe, this.showOnEdit);\n this.showInLookup = utils.getIfDefined(dto.sil, this.showInLookup);\n this.kind = dto.kind;\n this.displayFormat = dto.dfmt;\n if (dto.udata)\n this.userData = dto.udata;\n if (dto.edtr) {\n this.defaultEditor = model.getEditorById(dto.edtr) || model.createValueEditor();\n }\n }\n };\n return MetaEntityAttr;\n}());\nexport { MetaEntityAttr };\n//# sourceMappingURL=meta_entity.js.map","import { EditorTag } from '../types/editor_tag';\nimport { DataType } from '../types/data_type';\n/**\n * Represents a value editor.\n */\nvar ValueEditor = /** @class */ (function () {\n /** The default constructor. */\n function ValueEditor() {\n this.id = \"\";\n this.tag = EditorTag.Unknown;\n this.resType = DataType.Unknown;\n this.defValue = \"\";\n }\n /**\n * Loads value editor from its JSON representation object.\n * @param data The JSON representation object.\n */\n ValueEditor.prototype.loadFromData = function (data) {\n if (data) {\n this.id = data.id;\n this.tag = data.tag;\n this.defValue = data.defval;\n this.resType = data.rtype;\n this.accept = data.accept;\n this.multiline = data.multiline;\n if (data.subType) {\n this.resType = data.subType;\n }\n if (data.name) {\n this.name = data.name;\n }\n if (data.values) {\n this.values = data.values;\n }\n }\n };\n ValueEditor.prototype.getValueText = function (value) {\n var result = \"\";\n if (!this.values)\n return result;\n if (Array.isArray(value)) {\n for (var _i = 0, _a = this.values; _i < _a.length; _i++) {\n var item = _a[_i];\n if (value.indexOf(item.id) >= 0) {\n result += item.text + ',';\n }\n }\n }\n else {\n for (var _b = 0, _c = this.values; _b < _c.length; _b++) {\n var item = _c[_b];\n if (item.id === value) {\n result += item.text + ',';\n }\n }\n }\n if (result) {\n result = result.substring(0, result.length - 1);\n }\n return result;\n };\n return ValueEditor;\n}());\nexport { ValueEditor };\n//# sourceMappingURL=value_editor.js.map","var __assign = (this && this.__assign) || function () {\n __assign = Object.assign || function(t) {\n for (var s, i = 1, n = arguments.length; i < n; i++) {\n s = arguments[i];\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\n t[p] = s[p];\n }\n return t;\n };\n return __assign.apply(this, arguments);\n};\n/**\n * Defines aggregations settings for the current context.\n * Group, aggregate columns, grand totals, etc.\n */\nvar AggregationSettings = /** @class */ (function () {\n function AggregationSettings(colStore) {\n this.colStore = colStore;\n this.aggregates = [];\n this.groups = [];\n this.useGrandTotals = false;\n this.useRecordCount = false;\n this._caseSensitiveGroups = false;\n this.COUNT_FIELD_NAME = 'GRPRECCNT';\n }\n Object.defineProperty(AggregationSettings.prototype, \"caseSensitiveGroups\", {\n get: function () {\n return this._caseSensitiveGroups;\n },\n set: function (value) {\n this._caseSensitiveGroups = value;\n this.updateCompareProc();\n },\n enumerable: false,\n configurable: true\n });\n AggregationSettings.prototype.updateCompareProc = function () {\n this.compareValues = this._caseSensitiveGroups\n ? this.strictCompare\n : this.caseInsensitiveCompare;\n };\n AggregationSettings.prototype.addGroup = function (settings) {\n var cols = settings.columns || this.colStore.getColumnIds(settings.from, settings.to);\n if (!this.colStore.validateColumns(cols))\n throw \"Invalid columns: \" + cols;\n if (this.hasColumnsInUse(cols))\n throw \"Can't add same columns to different groups/aggregates\";\n this.groups.push(__assign({ columns: cols }, settings));\n return this;\n };\n AggregationSettings.prototype.addAggregateColumn = function (colIndexOrId, funcId) {\n var colId = typeof colIndexOrId == 'string'\n ? colIndexOrId\n : this.colStore.getColumnIds(colIndexOrId, colIndexOrId)[0];\n if (this.hasColumnsInUse([colId]) || !this.colStore.validateAggregate(colId, funcId))\n throw 'Invalid aggregation function for the column: ' + colId;\n this.aggregates.push({ colId: colId, funcId: funcId });\n return this;\n };\n AggregationSettings.prototype.addGrandTotals = function () {\n this.useGrandTotals = true;\n return this;\n };\n AggregationSettings.prototype.addCounts = function () {\n this.useRecordCount = true;\n return this;\n };\n AggregationSettings.prototype.getGroups = function () {\n var _this = this;\n var cols = [];\n var mappedGrops = this.groups.map(function (grp) {\n cols = cols.concat(grp.columns);\n return __assign(__assign({}, grp), { columns: Array.from(cols), aggregates: Array.from(_this.aggregates) });\n });\n return mappedGrops;\n };\n AggregationSettings.prototype.getInternalGroups = function () {\n return this.groups;\n };\n AggregationSettings.prototype.lastGroup = function () {\n var groups = this.getGroups();\n return groups[groups.length - 1];\n };\n AggregationSettings.prototype.getAggregates = function () {\n return this.aggregates;\n };\n AggregationSettings.prototype.hasAggregates = function () {\n return this.aggregates.length > 0;\n };\n AggregationSettings.prototype.hasGroups = function () {\n return this.groups.length > 0;\n };\n AggregationSettings.prototype.hasGrandTotals = function () {\n return this.useGrandTotals;\n };\n AggregationSettings.prototype.hasRecordCount = function () {\n return this.useRecordCount;\n };\n AggregationSettings.prototype.isEmpty = function () {\n return !(this.hasAggregates() || this.hasGroups() ||\n this.hasAggregates() || this.hasRecordCount());\n };\n AggregationSettings.prototype.drop = function () {\n console.warn('\"drop()\" method is obsolete. Use \"clear()\" instead');\n this.clear();\n };\n AggregationSettings.prototype.clear = function () {\n this.groups = [];\n this.aggregates = [];\n this.useGrandTotals = false;\n this.useRecordCount = false;\n this.caseSensitiveGroups = false;\n return this;\n };\n /**\n * Checks if all columns from the list passed in the parameter are \"unused\".\n * Here \"unused column\" means a column that is included neither in any group nor in the aggregates list.\n * @param cols - the array of column IDs\n * @returns true if all columns in the list are not used anywhere, othervise - fals\n */\n AggregationSettings.prototype.hasColumnsInUse = function (cols) {\n for (var _i = 0, _a = this.groups; _i < _a.length; _i++) {\n var group = _a[_i];\n var interCols = group.columns\n .filter(function (c) { return cols.indexOf(c) >= 0; });\n if (interCols.length > 0)\n return true;\n }\n for (var _b = 0, _c = this.aggregates; _b < _c.length; _b++) {\n var aggr = _c[_b];\n if (cols.indexOf(aggr.colId) >= 0)\n return true;\n }\n return false;\n };\n AggregationSettings.prototype.needAggrCalculation = function () {\n return (this.hasAggregates() || this.hasRecordCount())\n && (this.hasGrandTotals() || this.hasGroups());\n };\n AggregationSettings.prototype.saveToData = function () {\n return {\n groups: Array.from(this.groups),\n ugt: this.useGrandTotals,\n urc: this.useRecordCount,\n csg: this.caseSensitiveGroups,\n aggregates: Array.from(this.aggregates)\n };\n };\n AggregationSettings.prototype.loadFromData = function (data) {\n if (data) {\n if (typeof data.ugt !== 'undefined')\n this.useGrandTotals = data.ugt;\n if (typeof data.urc !== 'undefined')\n this.useRecordCount = data.urc;\n if (typeof data.csg !== 'undefined')\n this.caseSensitiveGroups = data.csg;\n if (data.groups) {\n this.groups = Array.from(data.groups);\n }\n if (data.aggregates) {\n this.aggregates = Array.from(data.aggregates);\n }\n }\n };\n AggregationSettings.prototype.buildGroupKey = function (group, row) {\n var caseInsensitive = !this.caseSensitiveGroups;\n var result = {};\n if (group) {\n for (var _i = 0, _a = group.columns; _i < _a.length; _i++) {\n var colId = _a[_i];\n var keyVal = row.getValue(colId);\n if (caseInsensitive && typeof (keyVal) === 'string') {\n keyVal = keyVal.toLowerCase();\n }\n result[colId] = keyVal;\n }\n }\n return result;\n };\n //returns true if value1 == value2\n AggregationSettings.prototype.strictCompare = function (value1, value2) {\n if (value1 instanceof Date) {\n return value1.getTime() === value2.getTime();\n }\n else\n return value1 === value2;\n };\n //makes a case insensative comparision of two values and return true if there are equal\n AggregationSettings.prototype.caseInsensitiveCompare = function (value1, value2) {\n if (value1 instanceof Date) {\n return value1.getTime() === value2.getTime();\n }\n else {\n var val1 = (typeof value1 === 'string') ? value1.toLowerCase() : value1;\n var val2 = (typeof value2 === 'string') ? value2.toLowerCase() : value2;\n return val1 === val2;\n }\n };\n return AggregationSettings;\n}());\nexport { AggregationSettings };\n//# sourceMappingURL=aggr_settings.js.map","import { i18n } from '../i18n/i18n';\nimport { utils } from '../utils/utils';\nimport { EditorTag } from '../types/editor_tag';\nimport { DataType } from '../types/data_type';\nimport { MetaEntity, MetaEntityAttr } from './meta_entity';\nimport { ValueEditor } from './value_editor';\n/**\n * Represents a data model\n */\nvar MetaData = /** @class */ (function () {\n /** The default constructor. */\n function MetaData() {\n this.mainEntity = null;\n this.id = '__none';\n this.name = 'Empty model';\n this.rootEntity = this.createEntity();\n this.displayFormats = new Map();\n }\n /**\n * Gets the main entity of model\n * @return The main entity.\n */\n MetaData.prototype.getMainEntity = function () {\n return this.mainEntity;\n };\n MetaData.prototype.createEntity = function (parent) {\n return new MetaEntity(parent);\n };\n MetaData.prototype.createEntityAttr = function (parent) {\n return new MetaEntityAttr(parent);\n };\n MetaData.prototype.createValueEditor = function () {\n return new ValueEditor();\n };\n /**\n * Loads data model from JSON.\n * @param stringJson The JSON string.\n */\n MetaData.prototype.loadFromJSON = function (stringJson) {\n var model = JSON.parse(stringJson);\n this.loadFromData(model);\n };\n /**\n * Loads data model from its JSON representation object.\n * @param data The JSON representation object.\n */\n MetaData.prototype.loadFromData = function (data) {\n this.id = data.id;\n this.name = data.name;\n this.version = data.vers;\n //Editors\n this.editors = new Array();\n if (data.editors) {\n for (var i = 0; i < data.editors.length; i++) {\n var newEditor = this.createValueEditor();\n newEditor.loadFromData(data.editors[i]);\n this.editors.push(newEditor);\n }\n }\n //rootEntity\n this.rootEntity.loadFromData(this, data.entroot);\n //DataFormats\n this.displayFormats = new Map();\n if (data.displayFormats) {\n for (var dtypeStr in data.displayFormats) {\n var dtype = DataType[dtypeStr];\n var formats = data.displayFormats[dtypeStr] || new Array();\n this.displayFormats.set(dtype, formats);\n }\n }\n };\n /**\n * Gets the display formats.\n * @returns The display formats.\n */\n MetaData.prototype.getDisplayFormats = function () {\n return this.displayFormats;\n };\n /**\n * Gets the display formats for type\n * @param type The type\n * @returns An array of display formats\n */\n MetaData.prototype.getDisplayFormatsForType = function (type) {\n if (this.displayFormats.has(type)) {\n return this.displayFormats.get(type);\n }\n return [];\n };\n /**\n * Gets the default display format for the provided type\n * @param type The type\n * @returns The default type format or null\n */\n MetaData.prototype.getDefaultFormat = function (type) {\n if (this.displayFormats.has(type)) {\n return this.displayFormats.get(type).filter(function (f) { return f.isdef; })[0];\n }\n return null;\n };\n /**\n * Sets data to data model.\n * @param model Its JSON representation object or JSON string.\n */\n MetaData.prototype.setData = function (model) {\n if (typeof model === 'string') {\n this.loadFromJSON(model);\n }\n else {\n this.loadFromData(model);\n }\n };\n /**\n * Checks wether the data model is empty.\n * @returns `true` if the data model is empty, otherwise `false`.\n */\n MetaData.prototype.isEmpty = function () {\n return this.rootEntity.subEntities.length === 0 && this.rootEntity.attributes.length === 0;\n };\n /**\n * Gets ID of the data model.\n * @returns The ID.\n */\n MetaData.prototype.getId = function () {\n return this.id;\n };\n /**\n * Gets name of the data model.\n * @returns The name.\n */\n MetaData.prototype.getName = function () {\n return this.name;\n };\n /**\n * Gets root entity of the data model.\n * @returns The root entity.\n */\n MetaData.prototype.getRootEntity = function () {\n return this.rootEntity;\n };\n /**\n * Finds editor by its ID.\n * @param editorId The editor ID.\n * @returns The value editor or `null`.\n */\n MetaData.prototype.getEditorById = function (editorId) {\n for (var _i = 0, _a = this.editors; _i < _a.length; _i++) {\n var editor = _a[_i];\n if (editor.id === editorId) {\n return editor;\n }\n }\n return null;\n };\n /**\n * Gets entity attribute by its ID.\n * This function runs through all attributes inside specified model (it's root entity and all its sub-entities).\n * @param attrId The attribute ID.\n * @returns The attribute or `null`.\n */\n MetaData.prototype.getAttributeById = function (attrId) {\n var attr = this.getEntityAttrById(this.getRootEntity(), attrId);\n if (!attr) {\n return null;\n }\n return attr;\n };\n /**\n * Checks wether attribute contains such property.\n * @param attrId The attribute ID.\n * @param propName The property name.\n * @returns `true` if the attribute contains the property, otherwise `false`.\n */\n MetaData.prototype.checkAttrProperty = function (attrId, propName) {\n var attribute = this.getAttributeById(attrId);\n if (attribute) {\n if (typeof attribute[propName] === 'undefined') {\n throw 'No such property: ' + propName;\n }\n if (attribute[propName]) {\n return true;\n }\n else if (attribute.lookupAttr) {\n attrId = attribute.lookupAttr;\n attribute = this.getAttributeById(attrId);\n return attribute && attribute[propName];\n }\n else {\n return false;\n }\n }\n else\n return false;\n };\n /**\n * Gets entity attribute by its ID.\n * This function runs through all attributes inside specified entity and all its sub-entities.\n * @param entity\n * @param attrId\n * @returns The attribute or `null`.\n */\n MetaData.prototype.getEntityAttrById = function (entity, attrId) {\n var idx;\n if (entity.attributes) {\n var attrCount = entity.attributes.length;\n for (idx = 0; idx < attrCount; idx++) {\n if (entity.attributes[idx].id == attrId) {\n return entity.attributes[idx];\n }\n }\n }\n var res;\n if (entity.subEntities) {\n var subEntityCount = entity.subEntities.length;\n for (idx = 0; idx < subEntityCount; idx++) {\n res = this.getEntityAttrById(entity.subEntities[idx], attrId);\n if (res)\n return res;\n }\n }\n return null;\n };\n MetaData.prototype.listByEntityWithFilter = function (entity, filterFunc) {\n var result = new Array();\n var caption;\n var ent = null;\n if (entity.subEntities) {\n var subEntityCount = entity.subEntities.length;\n for (var entIdx = 0; entIdx < subEntityCount; entIdx++) {\n ent = entity.subEntities[entIdx];\n if (!filterFunc || filterFunc(ent, null)) {\n caption = i18n.getText('Entities', ent.name);\n if (!caption) {\n caption = ent.caption;\n }\n var newEnt = utils.assign(this.createEntity(), { id: ent.name, text: caption, items: [], isEntity: true });\n newEnt.items = this.listByEntityWithFilter(ent, filterFunc);\n if (newEnt.items.length > 0)\n result.push(newEnt);\n }\n }\n }\n var attr = null;\n if (entity.attributes) {\n var attrCount = entity.attributes.length;\n for (var attrIdx = 0; attrIdx < attrCount; attrIdx++) {\n attr = entity.attributes[attrIdx];\n if (!filterFunc || filterFunc(entity, attr)) {\n caption = i18n.getText('Attributes', attr.id);\n if (!caption)\n caption = attr.caption;\n var newEnt = utils.assign(this.createEntity(), { id: attr.id, text: caption, dataType: attr.dataType });\n result.push(newEnt);\n }\n }\n }\n return result;\n };\n MetaData.prototype.listByEntity = function (entity, opts, filterFunc) {\n opts = opts || {};\n var resultEntities = [];\n var resultAttributes = [];\n var caption;\n var ent = null;\n if (entity.subEntities) {\n var subEntityCount = entity.subEntities.length;\n for (var entIdx = 0; entIdx < subEntityCount; entIdx++) {\n ent = entity.subEntities[entIdx];\n if (!filterFunc || filterFunc(ent, null)) {\n caption = i18n.getText('Entities', ent.name) || ent.caption;\n var newEnt = utils.assign(this.createEntity(), {\n id: ent.name,\n text: caption,\n items: [],\n isEntity: true,\n description: ent.description\n });\n var newOpts = utils.assign({}, opts);\n newOpts.includeRootData = false;\n newEnt.items = this.listByEntity(ent, newOpts, filterFunc);\n if (newEnt.items.length > 0) {\n resultEntities.push(newEnt);\n }\n }\n }\n }\n var attr = null;\n if (entity.attributes) {\n var attrCount = entity.attributes.length;\n for (var attrIdx = 0; attrIdx < attrCount; attrIdx++) {\n attr = entity.attributes[attrIdx];\n if (!filterFunc || filterFunc(entity, attr)) {\n caption = i18n.getText('Attributes', attr.id) || attr.caption;\n resultAttributes.push(utils.assign(this.createEntityAttr(entity), {\n id: attr.id, text: caption,\n dataType: attr.dataType, lookupAttr: attr.lookupAttr,\n description: attr.description\n }));\n }\n }\n }\n var sortCheck = function (a, b) {\n if (a.text.toLowerCase() == b.text.toLowerCase()) {\n return 0;\n }\n if (a.text.toLowerCase() > b.text.toLowerCase()) {\n return 1;\n }\n return -1;\n };\n if (opts.sortEntities) {\n resultEntities.sort(sortCheck);\n resultAttributes.sort(sortCheck);\n }\n var result;\n if (!opts.attrPlacement || opts.attrPlacement == 0) {\n result = resultEntities.concat(resultAttributes);\n }\n else {\n result = resultAttributes.concat(resultEntities);\n }\n if (opts.attrPlacement == 2) {\n result.sort(sortCheck);\n }\n if (opts.includeRootData) {\n caption = i18n.getText('Entities', entity.name);\n if (!caption)\n caption = entity.caption;\n return { id: entity.name, text: caption, items: result };\n }\n else {\n return result;\n }\n };\n /**\n * Clears data model.\n */\n MetaData.prototype.clear = function () {\n this.rootEntity = this.createEntity();\n this.editors = [];\n this.version = '';\n };\n /**\n * Add default value editors.\n */\n MetaData.prototype.addDefaultValueEditors = function () {\n var ve;\n ve = this.addOrUpdateValueEditor('_DTE', EditorTag.Edit, DataType.String);\n ve.defValue = '';\n this.addOrUpdateValueEditor('_DPDE', EditorTag.DateTime, DataType.DateTime);\n this.addOrUpdateValueEditor('_DPTE', EditorTag.DateTime, DataType.DateTime);\n };\n /**\n * Add or update a value editor.\n * @param id The id.\n * @param tag The tag.\n * @param resType The result type.\n * @returns The value editor.\n */\n MetaData.prototype.addOrUpdateValueEditor = function (id, tag, resType) {\n var ve = utils.findItemById(this.editors, id);\n if (!ve) {\n ve = this.createValueEditor();\n ve.id = id;\n this.editors.push(ve);\n }\n ve.tag = tag;\n ve.resType = resType;\n return ve;\n };\n /**\n * Gets entities tree.\n * @param opts The options.\n * @param filterFunc The filter function.\n * Takes two parameters, Entity and EntityAttr (second parameter will be null for entities), and returns boolean (true if the corresponding entity or attribute).\n * @returns The tree of the entities and their attributes according to options and the filter function\n */\n MetaData.prototype.getEntitiesTree = function (opts, filterFunc) {\n return this.listByEntity(this.getRootEntity(), opts, filterFunc);\n };\n /**\n * Gets entities tree due to filter.\n * @param filterFunc The filter function.\n * Takes two parameters, Entity and EntityAttr (second parameter will be null for entities), and returns boolean (true if the corresponding entity or attribute).\n * @returns The tree of the entities and their attributes according to the filter function\n */\n MetaData.prototype.getEntitiesTreeWithFilter = function (filterFunc) {\n return this.listByEntityWithFilter(this.getRootEntity(), filterFunc);\n };\n /**\n * Finds full entity path by attribute\n * @param attrId The attribute id.\n * @param sep The separator.\n * @returns The path.\n */\n MetaData.prototype.getFullEntityPathByAttr = function (attrId, sep) {\n sep = sep || ' ';\n return this.getEntityPathByAttr(this.getRootEntity(), attrId, sep, true);\n };\n /**\n * Finds entity path by attribute\n * @param entity The entity.\n * @param attrId The attribute id.\n * @param sep The separator.\n * @param root The root option.\n * @returns The path.\n */\n MetaData.prototype.getEntityPathByAttr = function (entity, attrId, sep, root) {\n if (!entity)\n return '';\n sep = sep || ' ';\n var entityCaption = '';\n if (entity.caption && !root) {\n var entityText = i18n.getText('Entities', entity.caption);\n entityCaption = entityText ? entityText : entity.caption;\n }\n if (entity.attributes) {\n var attrCount = entity.attributes.length;\n for (var i = 0; i < attrCount; i++) {\n if (entity.attributes[i].id == attrId) {\n return entityCaption;\n }\n }\n }\n if (entity.subEntities) {\n var subEntityCount = entity.subEntities.length;\n for (var i = 0; i < subEntityCount; i++) {\n var ent = entity.subEntities[i];\n var res = this.getEntityPathByAttr(ent, attrId, sep, false);\n if (res !== '') {\n if (entityCaption !== '')\n res = entityCaption + sep + res;\n return res;\n }\n }\n }\n return '';\n };\n /**\n * Gets the attribute text.\n * @param attr The attribute.\n * @param format The format.\n * @returns Formatted text.\n */\n MetaData.prototype.getAttributeText = function (attr, format) {\n var attrText = i18n.getText('Attributes', attr.id);\n if (!attrText) {\n attrText = attr.caption;\n }\n if (!format) {\n return attrText;\n }\n var result = '';\n var entityPath = this.getFullEntityPathByAttr(attr.id, ' ');\n if (entityPath) {\n result = format.replace(new RegExp('{attr}', 'g'), attrText);\n result = result.replace(new RegExp('{entity}', 'g'), entityPath);\n }\n else {\n result = attrText;\n }\n return result.trim();\n };\n /**\n * Scans model's entity tree and calls the callback functions for each attribute and entity.\n * @param processAttribute The callback function which is called for each attribute in model's entity tree.\n * The processed attribute is passed in the first function parameter.\n * @param processEntity The callback function which is called for each entity in tree.\n * The processed entity is passed in the first function parameter.\n */\n MetaData.prototype.runThroughEntities = function (processAttribute, processEntity) {\n this.getRootEntity().scan(processAttribute, processEntity);\n };\n /**\n * Finds first attribute by filter.\n * @param filterFunc The filter function. Takes EntityAttr object in parameter and returns boolean\n */\n MetaData.prototype.getFirstAttributeByFilter = function (filterFunc) {\n var res = null;\n this.runThroughEntities(function (attr, opts) {\n if (filterFunc(attr)) {\n opts.stop = true;\n res = attr;\n }\n }, null);\n return res;\n };\n return MetaData;\n}());\nexport { MetaData };\n//# sourceMappingURL=meta_data.js.map","export var liquid;\n(function (liquid) {\n function renderLiquidTemplate(template, vars) {\n var result = template;\n if (vars) {\n for (var v in vars) {\n var liquidVarRegexp = new RegExp('\\{\\{' + v + '\\}\\}', 'g');\n result = result.replace(liquidVarRegexp, vars[v]);\n }\n }\n return result;\n }\n liquid.renderLiquidTemplate = renderLiquidTemplate;\n})(liquid || (liquid = {}));\n//# sourceMappingURL=liquid.js.map","var DataRow = /** @class */ (function () {\n function DataRow(columns, values) {\n this.columns = columns;\n this.values = values;\n }\n DataRow.prototype.toArray = function () {\n return Array.from(this.values);\n };\n DataRow.prototype.size = function () {\n return this.values.length;\n };\n DataRow.prototype.getValue = function (colIdOrIndex) {\n var index;\n if (typeof colIdOrIndex === \"string\") {\n index = this.columns.getIndex(colIdOrIndex);\n if (index === undefined) {\n throw new RangeError(\"No column with id '\".concat(colIdOrIndex, \"'\"));\n }\n }\n else {\n index = colIdOrIndex;\n }\n if (index >= this.values.length)\n throw new RangeError(\"Out of range: \" + index);\n return this.values[index];\n };\n DataRow.prototype.setValue = function (colIdOrIndex, value) {\n var index;\n if (typeof colIdOrIndex === \"string\") {\n index = this.columns.getIndex(colIdOrIndex);\n if (index === undefined) {\n throw new RangeError(\"No column with id '\".concat(colIdOrIndex, \"'\"));\n }\n }\n else {\n index = colIdOrIndex;\n }\n if (index >= this.values.length)\n throw new RangeError(\"Out of range: \" + index);\n this.values[index] = value;\n };\n return DataRow;\n}());\nexport { DataRow };\n//# sourceMappingURL=data_row.js.map","import { DataColumnList } from './data_column';\nimport { DataRow } from './data_row';\nimport { DataType } from '../types/data_type';\nimport { utils } from '../utils/utils';\nvar EasyDataTable = /** @class */ (function () {\n function EasyDataTable(options) {\n this._chunkSize = 1000;\n this._elasticChunks = false;\n this.cachedRows = [];\n this.total = 0;\n this.loader = null;\n this.needTotal = true;\n this.isInMemory = false;\n options = options || {};\n this._chunkSize = options.chunkSize || this._chunkSize;\n this._elasticChunks = options.elasticChunks || this._elasticChunks;\n this.loader = options.loader;\n if (typeof options.inMemory !== 'undefined') {\n this.isInMemory = options.inMemory;\n }\n if (this.isInMemory) {\n this.needTotal = false;\n }\n this._columns = new DataColumnList();\n this.onUpdate = options.onUpdate;\n if (options.columns) {\n for (var _i = 0, _a = options.columns; _i < _a.length; _i++) {\n var colDesc = _a[_i];\n this._columns.add(colDesc);\n }\n }\n if (options.rows) {\n for (var _b = 0, _c = options.rows; _b < _c.length; _b++) {\n var rowData = _c[_b];\n var row = this.createRow(rowData);\n this.addRow(row);\n }\n }\n this.needTotal = !this._elasticChunks;\n }\n Object.defineProperty(EasyDataTable.prototype, \"columns\", {\n get: function () {\n return this._columns;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(EasyDataTable.prototype, \"chunkSize\", {\n get: function () {\n return this._chunkSize;\n },\n set: function (value) {\n this._chunkSize = value;\n this.total = 0;\n this.needTotal = !this.elasticChunks;\n this.cachedRows = [];\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(EasyDataTable.prototype, \"elasticChunks\", {\n get: function () {\n return this._elasticChunks;\n },\n set: function (value) {\n this._elasticChunks = value;\n this.total = 0;\n this.needTotal = !this.elasticChunks;\n this.cachedRows = [];\n },\n enumerable: false,\n configurable: true\n });\n EasyDataTable.prototype.getRows = function (params) {\n var _this = this;\n var fromIndex = 0, count = this._chunkSize;\n if (params) {\n if ('page' in params) {\n fromIndex = params.pageSize * (params.page - 1);\n count = params.pageSize;\n }\n else {\n fromIndex = params.offset;\n count = params.limit;\n }\n }\n var endIndex = fromIndex + count; //the first index of the next page\n //if we don't calculate total on this request\n if (!this.needTotal && !this.elasticChunks) {\n if (fromIndex >= this.total) {\n return Promise.resolve([]);\n }\n if (endIndex > this.total) {\n endIndex = this.total;\n }\n }\n if (this.isInMemory && endIndex > this.cachedRows.length) {\n endIndex = this.cachedRows.length;\n }\n var allChunksCached = endIndex <= this.cachedRows.length;\n if (allChunksCached) {\n return Promise.resolve(this.cachedRows.slice(fromIndex, endIndex));\n }\n //if loader is not defined\n if (!this.loader) {\n throw \"Loader is not defined. Can't get the rows from \".concat(fromIndex, \" to \").concat(endIndex);\n }\n // we need total only for the first request\n var needTotal = this.needTotal;\n if (this.needTotal) {\n this.needTotal = false;\n }\n var offset = this.cachedRows.length;\n var limit = endIndex - offset;\n if (limit < this._chunkSize) {\n limit = this._chunkSize;\n }\n var resultPromise = this.loader.loadChunk({\n offset: offset,\n limit: limit,\n needTotal: needTotal\n })\n .then(function (result) {\n if (needTotal) {\n _this.total = result.total;\n }\n Array.prototype.push.apply(_this.cachedRows, result.table.getCachedRows());\n if (endIndex > _this.cachedRows.length) {\n endIndex = _this.cachedRows.length;\n }\n if (_this.elasticChunks) {\n var count_1 = result.table.getCachedCount();\n if (count_1 < limit) {\n _this.total = _this.cachedRows.length;\n }\n }\n _this.fireUpdated();\n return _this.cachedRows.slice(fromIndex, endIndex);\n });\n return resultPromise;\n };\n EasyDataTable.prototype.getRow = function (index) {\n return this.getRows({ offset: index, limit: 1 })\n .then(function (rows) { return rows.length > 0 ? rows[0] : null; });\n };\n EasyDataTable.prototype.getTotal = function () {\n return this.total;\n };\n EasyDataTable.prototype.setTotal = function (total) {\n this.total = total;\n this.needTotal = false;\n };\n EasyDataTable.prototype.getCachedCount = function () {\n return this.cachedRows.length;\n };\n EasyDataTable.prototype.clear = function () {\n this.columns.clear();\n this.cachedRows = [];\n this.total = 0;\n this.needTotal = !this._elasticChunks;\n this.fireUpdated();\n };\n EasyDataTable.prototype.createRow = function (dataOrRow) {\n var _this = this;\n var dateIdx = this._columns.getDateColumnIndexes();\n var values = new Array(this._columns.count);\n var getValue = dataOrRow instanceof DataRow\n ? function (colId) { return dataOrRow.getValue(colId); }\n : function (colId) { return dataOrRow[colId]; };\n if (dataOrRow) {\n this.columns.getItems().forEach(function (column) {\n var value = getValue(column.id);\n var index = _this.columns.getIndex(column.id);\n values[index] = (dateIdx.indexOf(index) >= 0)\n ? _this.mapDate(value, column.type)\n : value;\n });\n }\n return new DataRow(this._columns, values);\n };\n EasyDataTable.prototype.mapDate = function (value, dtype) {\n if (value) {\n var result = new Date(value);\n if (isNaN(result.getTime())\n && dtype == DataType.Time) {\n result = utils.strToTime(value);\n }\n return result;\n }\n return null;\n };\n EasyDataTable.prototype.addRow = function (rowOrValues) {\n var newRow;\n if (Array.isArray(rowOrValues)) {\n var values = rowOrValues;\n var dateIdx = this._columns.getDateColumnIndexes();\n if (dateIdx.length > 0) {\n for (var _i = 0, dateIdx_1 = dateIdx; _i < dateIdx_1.length; _i++) {\n var idx = dateIdx_1[_i];\n if (values[idx]) {\n values[idx] = this.mapDate(values[idx], this._columns.get(idx).type);\n }\n }\n }\n newRow = new DataRow(this._columns, values);\n }\n else {\n newRow = this.createRow(rowOrValues);\n }\n this.cachedRows.push(newRow);\n var cachedTotal = this.getCachedCount();\n if (cachedTotal > this.total) {\n this.total = cachedTotal;\n }\n return newRow;\n };\n EasyDataTable.prototype.getCachedRows = function () {\n return this.cachedRows;\n };\n EasyDataTable.prototype.totalIsKnown = function () {\n if (this.elasticChunks) {\n var count = this.getCachedCount();\n return count === this.total;\n }\n return !this.needTotal;\n };\n EasyDataTable.prototype.fireUpdated = function () {\n if (this.onUpdate) {\n this.onUpdate(this);\n }\n };\n return EasyDataTable;\n}());\nexport { EasyDataTable };\n//# sourceMappingURL=easy_data_table.js.map","/**\n * EasyData representation of GUID.\n */\nvar EasyGuid = /** @class */ (function () {\n function EasyGuid() {\n }\n /**\n * Generates new GUID.\n * @returns The string representation of GUID.\n */\n EasyGuid.newGuid = function () {\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {\n var r = Math.random() * 16 | 0, v = c == 'x' ? r : (r & 0x3 | 0x8);\n return v.toString(16);\n });\n };\n return EasyGuid;\n}());\nexport { EasyGuid };\n//# sourceMappingURL=easy_guid.js.map","import { EasyGuid } from '../utils/easy_guid';\n/**\n * The representation of event emitter.\n */\nvar EventEmitter = /** @class */ (function () {\n /**\n * The default constructor.\n * @param source The source.\n */\n function EventEmitter(source) {\n this.silentMode = 0;\n this.events = new Array();\n this.source = source;\n }\n /**\n * Subscries to the event.\n * @param eventType The event type.\n * @param callback The callback.\n * @returns The subscribtion ID.\n */\n EventEmitter.prototype.subscribe = function (eventType, callback) {\n var event = this.getEventRecByType(eventType);\n var eventCallback = {\n id: EasyGuid.newGuid(),\n callback: callback\n };\n if (event) {\n event.eventCallbacks.push(eventCallback);\n }\n else {\n event = {\n type: eventType,\n eventCallbacks: new Array(eventCallback)\n };\n this.events.push(event);\n }\n return eventCallback.id;\n };\n /**\n * Unsubsribes from the event.\n * @param eventType The event type.\n * @param callbackId The subscribtion ID.\n */\n EventEmitter.prototype.unsubscribe = function (eventType, callbackId) {\n var event = this.getEventRecByType(eventType);\n if (event) {\n var index = -1;\n for (index = 0; index < event.eventCallbacks.length; index++) {\n if (event.eventCallbacks[index].id === callbackId) {\n break;\n }\n }\n if (index >= 0) {\n event.eventCallbacks.splice(index, 1);\n }\n }\n };\n /**\n * Fires the event.\n * @param eventType The event type.\n * @param data The event data.\n * @param postpone The postpone.\n * @param force To fire force. If value is `true`, ignores silent mode.\n */\n EventEmitter.prototype.fire = function (eventType, data, postpone, force) {\n if (postpone === void 0) { postpone = 0; }\n if (force === void 0) { force = false; }\n if (this.silentMode && !force) {\n return;\n }\n var eventRec = this.getEventRecByType(eventType);\n if (eventRec) {\n var eqevent_1 = {\n type: eventType,\n source: this.source,\n data: data\n };\n var emitAllFunc = function () {\n for (var _i = 0, _a = eventRec.eventCallbacks; _i < _a.length; _i++) {\n var callback = _a[_i];\n callback.callback(eqevent_1);\n }\n };\n if (postpone > 0) {\n setTimeout(emitAllFunc, postpone);\n }\n else {\n emitAllFunc();\n }\n }\n };\n /**\n * Enters to silent mode.\n */\n EventEmitter.prototype.enterSilentMode = function () {\n this.silentMode++;\n };\n /**\n * Exits from silent mode.\n */\n EventEmitter.prototype.exitSilentMode = function () {\n if (this.silentMode) {\n this.silentMode--;\n }\n };\n /**\n * Checks if emitter is in silent mode.\n * @return `true`, if silent mode is enable.\n */\n EventEmitter.prototype.isSilent = function () {\n return this.silentMode > 0;\n };\n EventEmitter.prototype.getEventRecByType = function (eventType) {\n for (var _i = 0, _a = this.events; _i < _a.length; _i++) {\n var event_1 = _a[_i];\n if (event_1.type == eventType) {\n return event_1;\n }\n }\n return null;\n };\n return EventEmitter;\n}());\nexport { EventEmitter };\n//# sourceMappingURL=event_emitter.js.map","import { i18n } from './i18n';\ni18n.resetLocales();\n//# sourceMappingURL=load_default_locale_settings.js.map","//types\nexport * from './types/data_type';\nexport * from './types/entity_attr_kind';\nexport * from './types/editor_tag';\n//http\nexport * from './http/http_method';\nexport * from './http/http_request';\nexport * from './http/http_client';\n//meta data dto\nexport * from './meta/dto/meta_data_dto';\nexport * from './meta/dto/meta_entity_dto';\nexport * from './meta/dto/value_editor_dto';\n//meta data\nexport * from './meta/meta_data';\nexport * from './meta/meta_entity';\nexport * from './meta/value_editor';\n//data\nexport * from './data/aggr_structures';\nexport * from './data/aggr_settings';\nexport * from './data/data_column';\nexport * from './data/data_loader';\nexport * from './data/data_row';\nexport * from './data/easy_data_table';\n//event\nexport * from './event/event_emitter';\n//i18n\nexport * from './i18n/i18n';\n//utils\nexport * from './utils/easy_guid';\nexport * from './utils/string_utils';\nexport * from './utils/utils';\nexport * from './utils/liquid';\nimport './i18n/load_default_locale_settings';\nif (typeof Object.values !== 'function') {\n Object.values = function (obj) {\n return Object.keys(obj).map(function (key) { return obj[key]; });\n };\n}\nif (typeof Math.trunc !== 'function') {\n Math.trunc = function (x) {\n if (isNaN(x)) {\n return NaN;\n }\n if (x > 0) {\n return Math.floor(x);\n }\n return Math.ceil(x);\n };\n}\n//# sourceMappingURL=public_api.js.map","import { browserUtils } from './browser_utils';\n/**\n * Wraps all the elements inside \"parent\" by \"wrapper\" element\n * @param parent The element to add wrapper to.\n * @param wrapper The element that will wrap child elements.\n */\nexport function wrapInner(parent, wrapper) {\n parent.appendChild(wrapper);\n while (parent.firstChild !== wrapper) {\n wrapper.appendChild(parent.firstChild);\n }\n}\n/**\n * Creates ands adds a new [[HTMLElement]] to \"parent\"\n * @param parent The element to add new element to.\n * @param tag Html tag of the new element.\n * @param options The options. In particular, options.cssClass sets the new element class.\n * @returns New element.\n */\nexport function addElement(parent, tag, options) {\n var element = document.createElement(tag);\n var opts = options || {};\n if (opts.cssClass) {\n element.className = opts.cssClass;\n }\n parent.appendChild(element);\n return element;\n}\n/**\n * Adds css class to the html element.\n * @param element The element to add css class to.\n * @param className The name of the css class to be added.\n */\nexport function addCssClass(element, className) {\n element.className = (element.className)\n ? element.className + ' ' + className\n : className;\n}\n/**\n * Hides the html element.\n * @param element The element to be hidden.\n */\nexport function hideElement(element) {\n element.style.display = 'none';\n}\n/**\n * Shows the html element.\n * @param element The element to be shown.\n * @param display The value of \"display\" style to be set. Default value is \"block\".\n */\nexport function showElement(element, display) {\n if (!display) {\n display = '';\n }\n element.style.display = display;\n}\n/**\n * Hides the \"first\" element and shows the \"second\".\n * @param first The element to be hidden.\n * @param second The element to be shown.\n * @param options The options. The following options are applied:\n * - display - the value of \"display\" style to be set. Default value is \"block\"\n * - duration - the duration of fading in and out\n * - complete - the callback to be called when toggle is complete\n */\nexport function toggleVisibility(first, second, options) {\n if (!options) {\n options = {};\n }\n if (!options.display) {\n options.display = '';\n }\n if (!options.duration) {\n options.duration = 200;\n }\n //TODO: later we need to make it fading in and out\n hideElement(first);\n showElement(second, options.display);\n if (options.complete) {\n options.complete();\n }\n}\n/**\n * Checks if element is visible\n * @param element The element to check.\n * @returns `true` if visible, otherwise - `false`.\n */\nexport function isVisible(element) {\n return element.style.display != 'none'\n && element.offsetWidth != 0\n && element.offsetHeight != 0;\n}\nexport function createBrowserEvent(eventName) {\n var event;\n if (typeof (Event) === 'function') {\n event = new Event(eventName);\n }\n else {\n event = document.createEvent('Event');\n event.initEvent(eventName, true, true);\n }\n return event;\n}\nexport function getViewportSize() {\n var width = Math.max(document.documentElement.clientWidth || 0, window.innerWidth || 0);\n var height = Math.max(document.documentElement.clientHeight || 0, window.innerHeight || 0);\n return {\n width: width,\n height: height\n };\n}\nexport function getDocSize() {\n if (browserUtils.IsIE())\n return getWinSize();\n var width = Math.max(document.documentElement.clientWidth, document.body.clientWidth || 0);\n var height = Math.max(document.documentElement.clientHeight, document.body.clientHeight || 0);\n return {\n width: width,\n height: height\n };\n}\nexport function getScrollPos() {\n var body = document.body;\n var docElem = document.documentElement;\n return {\n top: window.pageYOffset || docElem.scrollTop || body.scrollTop,\n left: window.pageXOffset || docElem.scrollLeft || body.scrollLeft\n };\n}\nexport function getElementAbsolutePos(element) {\n var res = { x: 0, y: 0 };\n if (element !== null) {\n var position = offset(element);\n res = { x: position.left, y: position.top };\n }\n return res;\n}\nfunction offset(element) {\n var defaultBoundingClientRect = { top: 0, right: 0, bottom: 0, left: 0, width: 0, height: 0 };\n var box;\n try {\n box = element.getBoundingClientRect();\n }\n catch (_a) {\n box = defaultBoundingClientRect;\n }\n var body = document.body;\n var docElem = document.documentElement;\n var scollPos = getScrollPos();\n var scrollTop = scollPos.top;\n var scrollLeft = scollPos.left;\n var clientTop = docElem.clientTop || body.clientTop || 0;\n var clientLeft = docElem.clientLeft || body.clientLeft || 0;\n var top = box.top + scrollTop - clientTop;\n var left = box.left + scrollLeft - clientLeft;\n return { top: Math.round(top), left: Math.round(left) };\n}\nexport function getWinSize() {\n return {\n width: window.innerWidth,\n height: window.innerHeight\n };\n}\nexport function slideDown(target, duration, callback) {\n target.style.removeProperty('display');\n var display = window.getComputedStyle(target).display;\n if (display === 'none')\n display = 'block';\n target.style.display = display;\n var height = target.offsetHeight;\n target.style.overflow = 'hidden';\n target.style.height = 0 + 'px';\n target.style.paddingTop = 0 + 'px';\n target.style.paddingBottom = 0 + 'px';\n target.style.marginTop = 0 + 'px';\n target.style.marginBottom = 0 + 'px';\n target.offsetHeight;\n target.style.boxSizing = 'border-box';\n target.style.transitionProperty = \"height, margin, padding\";\n target.style.transitionDuration = duration + 'ms';\n target.style.height = height + 'px';\n target.style.removeProperty('padding-top');\n target.style.removeProperty('padding-bottom');\n target.style.removeProperty('margin-top');\n target.style.removeProperty('margin-bottom');\n window.setTimeout(function () {\n target.style.removeProperty('height');\n target.style.removeProperty('overflow');\n target.style.removeProperty('transition-duration');\n target.style.removeProperty('transition-property');\n target.style.removeProperty('box-sizing');\n if (callback) {\n callback();\n }\n }, duration);\n}\nexport function slideUp(target, duration, callback) {\n target.style.transitionProperty = 'height, margin, padding';\n target.style.transitionDuration = duration + 'ms';\n target.style.boxSizing = 'border-box';\n target.style.height = target.offsetHeight + 'px';\n target.offsetHeight;\n target.style.overflow = 'hidden';\n target.style.height = 0 + 'px';\n target.style.paddingTop = 0 + 'px';\n target.style.paddingBottom = 0 + 'px';\n target.style.marginTop = 0 + 'px';\n target.style.marginBottom = 0 + 'px';\n window.setTimeout(function () {\n target.style.display = 'none';\n target.style.removeProperty('height');\n target.style.removeProperty('padding-top');\n target.style.removeProperty('padding-bottom');\n target.style.removeProperty('margin-top');\n target.style.removeProperty('margin-bottom');\n target.style.removeProperty('overflow');\n target.style.removeProperty('transition-duration');\n target.style.removeProperty('transition-property');\n target.style.removeProperty('box-sizing');\n if (callback) {\n callback();\n }\n }, duration);\n}\nexport var eqCssPrefix = 'eqjs';\nexport var eqCssMobile = 'eqjs-mobile';\n//# sourceMappingURL=ui-utils.js.map","var __extends = (this && this.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n if (typeof b !== \"function\" && b !== null)\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\n if (ar || !(i in from)) {\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\n ar[i] = from[i];\n }\n }\n return to.concat(ar || Array.prototype.slice.call(from));\n};\nimport { mask } from './mask';\nvar DomElementBuilder = /** @class */ (function () {\n function DomElementBuilder(tag, parent) {\n if (typeof tag === \"string\") {\n this.element = document.createElement(tag);\n }\n else {\n this.element = tag;\n }\n if (parent && this.element.parentElement !== parent) {\n parent.appendChild(this.element);\n }\n }\n DomElementBuilder.prototype.addChild = function (tag, childBuilder) {\n var builder = domel(tag, this.element);\n if (childBuilder) {\n childBuilder(builder);\n }\n return this;\n };\n DomElementBuilder.prototype.addChildElement = function (element) {\n if (element) {\n this.element.appendChild(element);\n }\n return this;\n };\n DomElementBuilder.prototype.attr = function (attrId, attrValue) {\n this.element.setAttribute(attrId, attrValue);\n return this;\n };\n DomElementBuilder.prototype.id = function (value) {\n return this.attr(\"id\", value);\n };\n DomElementBuilder.prototype.focus = function () {\n this.element.focus();\n return this;\n };\n DomElementBuilder.prototype.title = function (value) {\n return this.attr('title', value);\n };\n DomElementBuilder.prototype.data = function (dataId, dataValue) {\n if (dataValue === void 0) { dataValue = null; }\n if (dataValue === null) {\n this.element.removeAttribute('data-' + dataId);\n return this;\n }\n else {\n return this.attr('data-' + dataId, dataValue);\n }\n };\n DomElementBuilder.prototype.show = function () {\n return this.removeStyle('display');\n };\n DomElementBuilder.prototype.hide = function (toHide) {\n if (toHide === void 0) { toHide = true; }\n return (toHide) ? this.setStyle('display', 'none') : this;\n };\n DomElementBuilder.prototype.visible = function (isVisible) {\n if (isVisible === void 0) { isVisible = true; }\n return isVisible ? this.setStyle('visibility', 'visible') : this.setStyle('visibility', 'hidden');\n };\n DomElementBuilder.prototype.isVisible = function () {\n return !!(this.element.offsetWidth || this.element.offsetHeight || this.element.getClientRects().length);\n };\n DomElementBuilder.prototype.addClass = function (className) {\n var classNames = [];\n for (var _i = 1; _i < arguments.length; _i++) {\n classNames[_i - 1] = arguments[_i];\n }\n if (className) {\n var fullList = __spreadArray(__spreadArray([], className.trim().split(\" \"), true), classNames, true);\n for (var i = 0; i < fullList.length; i++)\n this.element.classList.add(fullList[i]);\n }\n return this;\n };\n DomElementBuilder.prototype.removeClass = function (className) {\n var classNames = [];\n for (var _i = 1; _i < arguments.length; _i++) {\n classNames[_i - 1] = arguments[_i];\n }\n if (className) {\n var fullList = __spreadArray(__spreadArray([], className.trim().split(\" \"), true), classNames, true);\n for (var i = 0; i < fullList.length; i++)\n this.element.classList.remove(fullList[i]);\n }\n return this;\n };\n DomElementBuilder.prototype.toggleClass = function (className, force) {\n if (force === void 0) { force = undefined; }\n if (className) {\n this.element.classList.toggle(className, force);\n }\n return this;\n };\n DomElementBuilder.prototype.on = function (eventType, listener) {\n var eventTypes = eventType.split(' ');\n for (var i = 0; i < eventTypes.length; i++) {\n this.element.addEventListener(eventTypes[i], listener);\n }\n return this;\n };\n DomElementBuilder.prototype.off = function (eventType, listener) {\n var eventTypes = eventType.split(' ');\n for (var i = 0; i < eventTypes.length; i++) {\n this.element.removeEventListener(eventTypes[i], listener);\n }\n return this;\n };\n DomElementBuilder.prototype.setStyle = function (styleId, styleValue) {\n this.element.style.setProperty(styleId, styleValue);\n return this;\n };\n DomElementBuilder.prototype.removeStyle = function (styleId) {\n this.element.style.removeProperty(styleId);\n return this;\n };\n DomElementBuilder.prototype.text = function (text) {\n this.element.innerText = text;\n return this;\n };\n DomElementBuilder.prototype.html = function (html) {\n this.element.innerHTML = html;\n return this;\n };\n DomElementBuilder.prototype.clear = function () {\n var oldElem = this.element;\n this.element = document.createElement(this.element.tagName);\n oldElem.replaceWith(this.element);\n };\n DomElementBuilder.prototype.addText = function (text) {\n var textEl = document.createTextNode(text);\n this.element.appendChild(textEl);\n return this;\n };\n DomElementBuilder.prototype.addHtml = function (html) {\n this.element.innerHTML += html;\n return this;\n };\n DomElementBuilder.prototype.toDOM = function () {\n return this.element;\n };\n DomElementBuilder.prototype.appendTo = function (parent) {\n if (parent) {\n parent.appendChild(this.element);\n }\n return this;\n };\n return DomElementBuilder;\n}());\nexport { DomElementBuilder };\nvar DomTextAreaElementBuilder = /** @class */ (function (_super) {\n __extends(DomTextAreaElementBuilder, _super);\n function DomTextAreaElementBuilder(element, parent) {\n var _this = this;\n if (element) {\n _this = _super.call(this, element, parent) || this;\n }\n else {\n _this = _super.call(this, \"textarea\", parent) || this;\n }\n return _this;\n }\n DomTextAreaElementBuilder.prototype.name = function (value) {\n this.element.name = value;\n return this;\n };\n DomTextAreaElementBuilder.prototype.rows = function (rows) {\n this.element.rows = rows;\n return this;\n };\n DomTextAreaElementBuilder.prototype.cols = function (cols) {\n this.element.cols = cols;\n return this;\n };\n DomTextAreaElementBuilder.prototype.value = function (value) {\n this.element.value = value;\n return this;\n };\n return DomTextAreaElementBuilder;\n}(DomElementBuilder));\nexport { DomTextAreaElementBuilder };\nvar DomInputElementBuilder = /** @class */ (function (_super) {\n __extends(DomInputElementBuilder, _super);\n function DomInputElementBuilder(element, parent) {\n var _this = this;\n if (element) {\n _this = _super.call(this, element, parent) || this;\n }\n else {\n _this = _super.call(this, \"input\", parent) || this;\n }\n return _this;\n }\n DomInputElementBuilder.prototype.name = function (value) {\n this.element.name = value;\n return this;\n };\n DomInputElementBuilder.prototype.type = function (value) {\n this.element.type = value;\n return this;\n };\n DomInputElementBuilder.prototype.size = function (value) {\n this.element.size = value;\n return this;\n };\n DomInputElementBuilder.prototype.value = function (value) {\n if (value instanceof Date) {\n this.element.valueAsDate = value;\n }\n else if (typeof value === \"number\") {\n this.element.valueAsNumber = value;\n }\n else {\n this.element.value = value;\n }\n return this;\n };\n DomInputElementBuilder.prototype.mask = function (maskPattern) {\n mask(this.element, maskPattern);\n return this;\n };\n return DomInputElementBuilder;\n}(DomElementBuilder));\nexport { DomInputElementBuilder };\nvar DomSelectElementBuilder = /** @class */ (function (_super) {\n __extends(DomSelectElementBuilder, _super);\n function DomSelectElementBuilder(element, parent) {\n var _this = this;\n if (element) {\n _this = _super.call(this, element, parent) || this;\n }\n else {\n _this = _super.call(this, \"select\", parent) || this;\n }\n return _this;\n }\n DomSelectElementBuilder.prototype.addOption = function (value) {\n var option = document.createElement('option');\n if (typeof value === \"string\") {\n option.value = value;\n option.innerHTML = value;\n }\n else {\n option.value = value.value;\n option.innerHTML = value.title || value.value;\n option.selected = value.selected || false;\n }\n this.element.appendChild(option);\n return this;\n };\n DomSelectElementBuilder.prototype.value = function (value) {\n this.element.value = value;\n return this;\n };\n return DomSelectElementBuilder;\n}(DomElementBuilder));\nexport { DomSelectElementBuilder };\nexport function domel(tag, parent) {\n if (tag === \"div\" || tag instanceof HTMLDivElement) {\n return new DomElementBuilder(tag, parent);\n }\n if (tag === \"span\" || tag instanceof HTMLSpanElement) {\n return new DomElementBuilder(tag, parent);\n }\n else if (tag === \"a\" || tag instanceof HTMLAnchorElement) {\n return new DomElementBuilder(tag, parent);\n }\n else if (tag === \"button\" || tag instanceof HTMLButtonElement) {\n return new DomElementBuilder(tag, parent);\n }\n else if (tag === \"img\" || tag instanceof HTMLImageElement) {\n return new DomElementBuilder(tag, parent);\n }\n else if (tag === \"input\" || tag instanceof HTMLInputElement) {\n return new DomInputElementBuilder(tag instanceof HTMLInputElement ? tag : null, parent);\n }\n else if (tag === \"textarea\" || tag instanceof HTMLTextAreaElement) {\n return new DomTextAreaElementBuilder(tag instanceof HTMLTextAreaElement ? tag : null, parent);\n }\n else if (tag === \"select\" || tag instanceof HTMLSelectElement) {\n return new DomSelectElementBuilder(tag instanceof HTMLSelectElement ? tag : null, parent);\n }\n return new DomElementBuilder(tag, parent);\n}\n//# sourceMappingURL=dom_elem_builder.js.map","export function mask(input, maskPattern) {\n var d = { 9: '[0-9]', a: '[a-z]' };\n var mask = maskPattern.split('');\n var keyDownHandler = function (e) {\n // backspace key or delete key\n if (e.keyCode === 8 || e.keyCode === 46) {\n e.preventDefault();\n var mskd = [];\n var startSelection = input.selectionStart;\n if (startSelection == 0)\n return;\n var selection = startSelection;\n var onlyLodash = true;\n for (var index = mask.length - 1; index >= 0; index--) {\n var el = mask[index];\n if (d[el]) {\n var t = new RegExp(d[el], 'i').test(input.value.charAt(index));\n if (t && index != startSelection - 1) {\n onlyLodash = false;\n }\n if (index === startSelection - 1)\n selection--;\n mskd.push(t && index != startSelection - 1\n ? input.value.charAt(index)\n : '_');\n }\n else {\n if (index === selection - 1)\n selection--;\n if (startSelection - 1 === index)\n startSelection--;\n mskd.push(el);\n }\n }\n input.value = !onlyLodash ? mskd.reverse().join('') : '';\n input.selectionStart = input.selectionEnd = selection < 0 ? 0 : selection;\n var event_1 = document.createEvent('Event');\n event_1.initEvent('input', true, true);\n input.dispatchEvent(event_1);\n }\n };\n var keyPressHandler = function (e) {\n var char = String.fromCharCode(e.charCode);\n if (char) {\n e.preventDefault();\n var mskd_1 = [];\n var selectionStart_1 = input.selectionStart;\n var selection_1 = selectionStart_1;\n mask.forEach(function (el, index) {\n if (d[el]) {\n var ch = (index != selectionStart_1)\n ? input.value.charAt(index)\n : char;\n var t = new RegExp(d[el], 'i').test(ch);\n mskd_1.push(t ? ch : '_');\n if (t && selectionStart_1 === index)\n selection_1++;\n }\n else {\n mskd_1.push(el);\n if (selection_1 === index)\n selection_1++;\n if (selectionStart_1 === index)\n selectionStart_1++;\n }\n });\n input.value = mskd_1.join('');\n input.selectionStart = input.selectionEnd = selection_1;\n var event_2 = document.createEvent('Event');\n event_2.initEvent('input', true, true);\n input.dispatchEvent(event_2);\n }\n };\n var inputHandler = function (e) {\n if (e.type === 'focus' && input.value !== '')\n return;\n var mskd = [];\n var startSelection = input.selectionStart;\n mask.forEach(function (el, index) {\n if (d[el]) {\n var t = new RegExp(d[el], 'i').test(input.value.charAt(index));\n mskd.push(t ? input.value.charAt(index) : '_');\n }\n else {\n mskd.push(el);\n }\n });\n input.value = mskd.join('');\n input.selectionStart = input.selectionEnd = startSelection;\n };\n input.addEventListener('keydown', keyDownHandler);\n input.addEventListener('keypress', keyPressHandler);\n input.addEventListener('input', inputHandler);\n input.addEventListener('focus', inputHandler);\n}\n//# sourceMappingURL=mask.js.map","import { utils } from '@easydata/core';\nimport { getElementAbsolutePos } from './ui-utils';\nimport { domel } from '../utils/dom_elem_builder';\nvar touchEventIsDefined = typeof TouchEvent !== 'undefined';\nexport var DropEffect;\n(function (DropEffect) {\n DropEffect[\"None\"] = \"none\";\n DropEffect[\"Allow\"] = \"allow\";\n DropEffect[\"Forbid\"] = \"forbid\";\n})(DropEffect || (DropEffect = {}));\nvar EqDragEvent = /** @class */ (function () {\n function EqDragEvent(item, dragImage, sourceEvent) {\n this.dropEffect = DropEffect.Allow;\n this.pageX = 0;\n this.pageY = 0;\n this.item = item;\n this.dragImage = dragImage;\n this.data = item.data;\n this.sourceEvent = sourceEvent;\n if (sourceEvent && sourceEvent instanceof MouseEvent) {\n this.pageX = sourceEvent.pageX,\n this.pageY = sourceEvent.pageY;\n }\n if (sourceEvent && touchEventIsDefined && sourceEvent instanceof TouchEvent\n && sourceEvent.touches[0]) {\n this.pageX = sourceEvent.touches[0].pageX,\n this.pageY = sourceEvent.touches[0].pageY;\n }\n }\n return EqDragEvent;\n}());\nexport { EqDragEvent };\nvar Position = /** @class */ (function () {\n function Position(ev) {\n if (ev && ev instanceof MouseEvent) {\n this.x = ev.pageX,\n this.y = ev.pageY;\n }\n if (ev && touchEventIsDefined && ev instanceof TouchEvent && ev.touches[0]) {\n this.x = ev.touches[0].pageX,\n this.y = ev.touches[0].pageY;\n }\n }\n return Position;\n}());\nvar DragManager = /** @class */ (function () {\n function DragManager() {\n this.delta = 5;\n this.draggableItem = null;\n this.dragImage = null;\n this.finishedSuccessfully = false;\n this.mouseDownPosition = null;\n this.containerDescriptors = [];\n this.containerDescriptorIndex = -1;\n this.dropEffect = DropEffect.None;\n this.classPrefix = 'eqjs-drop';\n this.DRAG_DISABLED_ATTR = 'drag-disabled';\n }\n DragManager.prototype.registerDraggableItem = function (descriptor) {\n var _this = this;\n var element = descriptor.element;\n if (!element) {\n throw Error(\"Element in draggle item is null or undefined\");\n }\n element.ondragstart = function () {\n return false;\n };\n var detectDragging = function (ev) {\n if (element.hasAttribute(_this.DRAG_DISABLED_ATTR)) {\n return;\n }\n ev.preventDefault();\n if (ev instanceof MouseEvent) {\n ev.stopPropagation();\n }\n var cursorPosition = new Position(ev);\n if (Math.abs(cursorPosition.x - _this.mouseDownPosition.x) > _this.delta\n || Math.abs(cursorPosition.y - _this.mouseDownPosition.y) > _this.delta) {\n startDragging(ev);\n }\n };\n var mouseMoveEventListener = function (ev) {\n _this.mouseMoveDragListener(ev);\n };\n var startDragging = function (ev) {\n ev.preventDefault();\n ev.stopPropagation();\n element.removeEventListener('mousemove', detectDragging);\n element.removeEventListener('touchmove', detectDragging);\n _this.finishedSuccessfully = false;\n if (descriptor.beforeDragStart)\n descriptor.beforeDragStart();\n _this.dragImage = domel('div')\n .setStyle('position', 'absolute')\n .setStyle('z-index', '65530')\n .toDOM();\n document.body.appendChild(_this.dragImage);\n _this.dragImage.appendChild(element.cloneNode(true));\n if (descriptor.renderer) {\n descriptor.renderer(_this.dragImage);\n }\n _this.dropEffect = DropEffect.None;\n _this.updateCusror(_this.dropEffect);\n _this.updateImageClass(_this.dropEffect);\n _this.draggableItem = {\n element: element,\n scope: descriptor.scope,\n data: descriptor.data\n };\n _this.updateDragItemPosition(ev);\n var event = new EqDragEvent(_this.draggableItem, _this.dragImage, ev);\n event.dropEffect = _this.dropEffect;\n if (descriptor.onDragStart) {\n descriptor.onDragStart(event);\n }\n if (_this.dropEffect !== event.dropEffect) {\n _this.dropEffect = event.dropEffect;\n _this.updateImageClass(_this.dropEffect);\n }\n document.addEventListener('mousemove', mouseMoveEventListener, true);\n document.addEventListener('touchmove', mouseMoveEventListener, true);\n };\n var mouseDownListener = function (ev) {\n if (touchEventIsDefined && ev instanceof TouchEvent) {\n ev.preventDefault();\n }\n _this.mouseDownPosition = new Position(ev);\n element.addEventListener('mousemove', detectDragging);\n element.addEventListener('touchmove', detectDragging);\n document.addEventListener('mouseup', mouseUpListener);\n document.addEventListener('touchend', mouseUpListener);\n };\n element.addEventListener('mousedown', mouseDownListener);\n element.addEventListener('touchstart', mouseDownListener);\n var mouseUpListener = function (ev) {\n _this.mouseDownPosition = null;\n element.removeEventListener('mousemove', detectDragging);\n element.removeEventListener('touchmove', detectDragging);\n document.removeEventListener('mousemove', mouseMoveEventListener, true);\n document.removeEventListener('touchmove', mouseMoveEventListener, true);\n if (_this.draggableItem) {\n endDraggind(ev);\n }\n };\n var endDraggind = function (ev) {\n try {\n if (_this.containerDescriptorIndex >= 0) {\n var dropContDesc = _this.containerDescriptors[_this.containerDescriptorIndex];\n var container = {\n element: dropContDesc.element,\n scopes: dropContDesc.scopes,\n data: dropContDesc.data\n };\n var event_1 = new EqDragEvent(_this.draggableItem, _this.dragImage, ev);\n try {\n if (container.scopes.indexOf(_this.draggableItem.scope) >= 0\n && _this.dropEffect === DropEffect.Allow) {\n _this.finishedSuccessfully = true;\n if (dropContDesc.onDrop) {\n dropContDesc.onDrop(container, event_1);\n }\n }\n }\n finally {\n if (dropContDesc.onDragLeave) {\n dropContDesc.onDragLeave(container, event_1);\n }\n }\n }\n }\n finally {\n try {\n var event_2 = new EqDragEvent(_this.draggableItem, _this.dragImage, ev);\n event_2.data.finishedSuccessfully = _this.finishedSuccessfully;\n if (descriptor.onDragEnd) {\n descriptor.onDragEnd(event_2);\n }\n }\n finally {\n _this.draggableItem = null;\n if (_this.dragImage && _this.dragImage.parentElement) {\n _this.dragImage.parentElement.removeChild(_this.dragImage);\n }\n _this.dragImage = null;\n _this.finishedSuccessfully = false;\n document.removeEventListener('mouseup', mouseUpListener);\n document.removeEventListener('touchend', mouseUpListener);\n }\n }\n };\n };\n DragManager.prototype.registerDropContainer = function (descriptor) {\n var element = descriptor.element;\n if (!element) {\n throw Error(\"Element in drop container is null or undefined\");\n }\n this.containerDescriptors.push(descriptor);\n };\n DragManager.prototype.removeDropContainer = function (descriptorOrSlot) {\n var descs = this.containerDescriptors\n .filter(function (desc) { return desc === descriptorOrSlot\n || desc.element == descriptorOrSlot; });\n if (descs) {\n for (var _i = 0, descs_1 = descs; _i < descs_1.length; _i++) {\n var desc = descs_1[_i];\n utils.removeArrayItem(this.containerDescriptors, desc);\n }\n }\n };\n DragManager.prototype.mouseMoveDragListener = function (ev) {\n if (ev instanceof MouseEvent) {\n ev.preventDefault();\n }\n ev.stopPropagation();\n this.updateDragItemPosition(ev);\n if (this.containerDescriptorIndex == -1) {\n for (var i = 0; i < this.containerDescriptors.length; i++) {\n var descriptor = this.containerDescriptors[i];\n if (this.detectDragEnterEvent(descriptor.element, ev)) {\n this.containerDescriptorIndex = i;\n break;\n }\n }\n if (this.containerDescriptorIndex >= 0) {\n this.dragEnterEvent(ev);\n }\n }\n else {\n var descriptor = this.containerDescriptors[this.containerDescriptorIndex];\n if (this.detectDragLeaveEvent(descriptor.element, ev)) {\n this.dragLeaveEvent(ev);\n this.containerDescriptorIndex = -1;\n }\n }\n if (this.containerDescriptorIndex >= 0) {\n var descriptor = this.containerDescriptors[this.containerDescriptorIndex];\n var container = {\n element: descriptor.element,\n scopes: descriptor.scopes,\n data: descriptor.data\n };\n if (container.scopes.indexOf(this.draggableItem.scope) >= 0) {\n var event_3 = new EqDragEvent(this.draggableItem, this.dragImage, ev);\n event_3.dropEffect = this.dropEffect;\n if (descriptor.onDragOver) {\n descriptor.onDragOver(container, event_3);\n }\n }\n }\n };\n DragManager.prototype.updateCusror = function (dropEffect) {\n switch (dropEffect) {\n case DropEffect.Allow:\n this.setCursorStyle(this.dragImage, 'grabbing');\n break;\n case DropEffect.Forbid:\n this.setCursorStyle(this.dragImage, 'no-drop');\n break;\n default:\n this.setCursorStyle(this.dragImage, 'grabbing');\n break;\n }\n };\n DragManager.prototype.updateImageClass = function (dropEffect) {\n this.dragImage.classList.remove(\"\".concat(this.classPrefix, \"-allow\"));\n this.dragImage.classList.remove(\"\".concat(this.classPrefix, \"-forbid\"));\n this.dragImage.classList.remove(\"\".concat(this.classPrefix, \"-none\"));\n switch (dropEffect) {\n case DropEffect.Allow:\n this.dragImage.classList.add(\"\".concat(this.classPrefix, \"-allow\"));\n break;\n case DropEffect.None:\n this.dragImage.classList.add(\"\".concat(this.classPrefix, \"-none\"));\n break;\n case DropEffect.Forbid:\n this.dragImage.classList.add(\"\".concat(this.classPrefix, \"-forbid\"));\n break;\n default:\n this.dragImage.classList.add(\"\".concat(this.classPrefix, \"-none\"));\n break;\n }\n };\n DragManager.prototype.setCursorStyle = function (element, cursor) {\n if (element) {\n element.style.cursor = cursor;\n for (var i = 0; i < element.children.length; i++) {\n this.setCursorStyle(element.children[i], cursor);\n }\n }\n };\n DragManager.prototype.updateDragItemPosition = function (ev) {\n if (this.dragImage) {\n var pos = new Position(ev);\n this.dragImage.style.top = (pos.y - this.dragImage.offsetHeight / 2) + 'px';\n this.dragImage.style.left = (pos.x - this.dragImage.offsetWidth / 2) + 'px';\n }\n };\n DragManager.prototype.dragEnterEvent = function (ev) {\n var descriptor = this.containerDescriptors[this.containerDescriptorIndex];\n var container = {\n element: descriptor.element,\n scopes: descriptor.scopes,\n data: descriptor.data\n };\n if (container.scopes.indexOf(this.draggableItem.scope) >= 0) {\n var event_4 = new EqDragEvent(this.draggableItem, this.dragImage, ev);\n event_4.dropEffect = DropEffect.Allow;\n if (descriptor.onDragEnter) {\n descriptor.onDragEnter(container, event_4);\n }\n this.dropEffect = event_4.dropEffect;\n this.updateCusror(this.dropEffect);\n this.updateImageClass(this.dropEffect);\n }\n else {\n if (this.dropEffect !== DropEffect.Forbid) {\n this.dropEffect = DropEffect.None;\n this.updateCusror(this.dropEffect);\n this.updateImageClass(this.dropEffect);\n }\n }\n };\n DragManager.prototype.dragLeaveEvent = function (ev) {\n var descriptor = this.containerDescriptors[this.containerDescriptorIndex];\n var container = {\n element: descriptor.element,\n scopes: descriptor.scopes,\n data: descriptor.data\n };\n if (container.scopes.indexOf(this.draggableItem.scope) >= 0) {\n var event_5 = new EqDragEvent(this.draggableItem, this.dragImage, ev);\n event_5.dropEffect = DropEffect.None;\n if (descriptor.onDragLeave) {\n descriptor.onDragLeave(container, event_5);\n }\n this.dropEffect = event_5.dropEffect;\n this.updateCusror(this.dropEffect);\n this.updateImageClass(this.dropEffect);\n }\n };\n DragManager.prototype.detectDragEnterEvent = function (container, ev) {\n var containerPos = getElementAbsolutePos(container);\n var pos = new Position(ev);\n if (pos.y < containerPos.y || pos.y > containerPos.y + container.offsetHeight) {\n return false;\n }\n if (pos.x < containerPos.x || pos.x > containerPos.x + container.offsetWidth) {\n return false;\n }\n return true;\n };\n DragManager.prototype.detectDragLeaveEvent = function (container, ev) {\n var containerPos = getElementAbsolutePos(container);\n var pos = new Position(ev);\n if (pos.y > containerPos.y && pos.y < containerPos.y + container.offsetHeight\n && pos.x > containerPos.x && pos.x < containerPos.x + container.offsetWidth) {\n return false;\n }\n return true;\n };\n return DragManager;\n}());\nexport { DragManager };\n//global variable\nexport var eqDragManager = new DragManager();\n//# sourceMappingURL=drag_manager.js.map","export var AutoResizeColumns;\n(function (AutoResizeColumns) {\n AutoResizeColumns[AutoResizeColumns[\"Always\"] = 0] = \"Always\";\n AutoResizeColumns[AutoResizeColumns[\"Once\"] = 1] = \"Once\";\n AutoResizeColumns[AutoResizeColumns[\"Never\"] = 2] = \"Never\";\n})(AutoResizeColumns || (AutoResizeColumns = {}));\n//# sourceMappingURL=easy_grid_options.js.map","import { i18n, DataType } from '@easydata/core';\nimport { GridColumnAlign } from './easy_grid_columns';\nvar cssPrefix = \"keg\";\nexport var DFMT_REGEX = /{0:(.*?)}/g;\nexport var CellRendererType;\n(function (CellRendererType) {\n CellRendererType[CellRendererType[\"STRING\"] = 1] = \"STRING\";\n CellRendererType[CellRendererType[\"NUMBER\"] = 2] = \"NUMBER\";\n CellRendererType[CellRendererType[\"DATETIME\"] = 3] = \"DATETIME\";\n CellRendererType[CellRendererType[\"BOOL\"] = 4] = \"BOOL\";\n})(CellRendererType || (CellRendererType = {}));\nvar StringCellRendererDefault = function (value, column, cellValueElement, rowElement) {\n var text = value ? value.toString().replace(/\\n/g, '\\u21B5 ') : '';\n cellValueElement.innerText = text;\n cellValueElement.title = text;\n if (column.align == GridColumnAlign.NONE) {\n cellValueElement.classList.add(\"\".concat(cssPrefix, \"-cell-value-align-left\"));\n }\n};\nvar NumberCellRendererDefault = function (value, column, cellValueElement, rowElement) {\n var strValue = (value || '').toString();\n if (typeof value == 'number') {\n if (column.dataColumn && column.dataColumn.displayFormat\n && DFMT_REGEX.test(column.dataColumn.displayFormat)) {\n strValue = column.dataColumn.displayFormat.replace(DFMT_REGEX, function (_, $1) {\n return i18n.numberToStr(value, $1);\n });\n }\n else {\n strValue = value.toLocaleString();\n }\n }\n cellValueElement.innerText = strValue;\n cellValueElement.title = strValue;\n if (column.align == GridColumnAlign.NONE) {\n cellValueElement.classList.add(\"\".concat(cssPrefix, \"-cell-value-align-right\"));\n }\n};\nvar DateTimeCellRendererDefault = function (value, column, cellValueElement, rowElement) {\n var isDate = Object.prototype.toString.call(value) === '[object Date]';\n var strValue = (value || '').toString();\n if (isDate) {\n if (column.dataColumn && column.dataColumn.displayFormat\n && DFMT_REGEX.test(column.dataColumn.displayFormat)) {\n strValue = column.dataColumn.displayFormat.replace(DFMT_REGEX, function (_, $1) {\n return i18n.dateTimeToStr(value, column.type, $1);\n });\n }\n else {\n var locale = i18n.getCurrentLocale();\n var timeOptions = { hour: 'numeric', minute: 'numeric', second: 'numeric' };\n switch (column.type) {\n case DataType.Date:\n strValue = value.toLocaleDateString(locale);\n break;\n case DataType.Time:\n strValue = value.toLocaleTimeString(locale, timeOptions);\n break;\n case DataType.DateTime:\n strValue = \"\".concat(value.toLocaleDateString(locale), \" \").concat(value.toLocaleTimeString(locale, timeOptions));\n break;\n }\n }\n }\n cellValueElement.innerText = strValue;\n cellValueElement.title = strValue;\n if (column.align == GridColumnAlign.NONE) {\n cellValueElement.classList.add(\"\".concat(cssPrefix, \"-cell-value-align-right\"));\n }\n};\nvar BoolCellRendererDefault = function (value, column, cellValueElement, rowElement) {\n if (column.dataColumn && column.dataColumn.displayFormat\n && DFMT_REGEX.test(column.dataColumn.displayFormat)) {\n var strValue = column.dataColumn.displayFormat.replace(DFMT_REGEX, function (_, $1) {\n return i18n.booleanToStr(value, $1);\n });\n return StringCellRendererDefault(strValue, column, cellValueElement, rowElement);\n }\n else {\n cellValueElement.classList.add(\"\".concat(cssPrefix, \"-cell-value-bool\"));\n cellValueElement.classList.add(\"\".concat(cssPrefix, \"-\").concat(value ? 'cell-value-true' : 'cell-value-false'));\n }\n};\nvar GridCellRendererStore = /** @class */ (function () {\n function GridCellRendererStore(options) {\n this.renderers = {};\n this.defaultRenderers = {};\n this.registerRenderer('StringDefault', StringCellRendererDefault);\n this.setDefaultRenderer(CellRendererType.STRING, StringCellRendererDefault);\n this.registerRenderer('NumberDefault', NumberCellRendererDefault);\n this.setDefaultRenderer(CellRendererType.NUMBER, NumberCellRendererDefault);\n this.registerRenderer('DateTimeDefault', DateTimeCellRendererDefault);\n this.setDefaultRenderer(CellRendererType.DATETIME, DateTimeCellRendererDefault);\n this.registerRenderer('BoolDefault', BoolCellRendererDefault);\n this.setDefaultRenderer(CellRendererType.BOOL, BoolCellRendererDefault);\n }\n GridCellRendererStore.prototype.getDefaultRenderer = function (columnType) {\n var cellType = this.getCellType(columnType);\n return this.defaultRenderers[CellRendererType[cellType]];\n };\n GridCellRendererStore.prototype.getDefaultRendererByType = function (rendererType) {\n return this.defaultRenderers[CellRendererType[rendererType]];\n };\n GridCellRendererStore.prototype.setDefaultRenderer = function (cellType, renderer) {\n if (renderer) {\n this.defaultRenderers[CellRendererType[cellType]] = renderer;\n }\n };\n GridCellRendererStore.prototype.getRenderer = function (name) {\n return this.renderers[name];\n };\n GridCellRendererStore.prototype.registerRenderer = function (name, renderer) {\n this.renderers[name] = renderer;\n };\n GridCellRendererStore.prototype.getCellType = function (dataType) {\n switch (dataType) {\n case DataType.Autoinc:\n case DataType.Byte:\n case DataType.Word:\n case DataType.Currency:\n case DataType.Float:\n case DataType.Int32:\n case DataType.Int64:\n return CellRendererType.NUMBER;\n case DataType.Date:\n case DataType.DateTime:\n case DataType.Time:\n return CellRendererType.DATETIME;\n case DataType.Bool:\n return CellRendererType.BOOL;\n default:\n return CellRendererType.STRING;\n }\n };\n return GridCellRendererStore;\n}());\nexport { GridCellRendererStore };\n//# sourceMappingURL=easy_grid_cell_renderer.js.map","import { utils, ColumnAlignment } from '@easydata/core';\nimport { CellRendererType } from \"./easy_grid_cell_renderer\";\nvar DEFAULT_WIDTH_STRING = 250;\nvar ROW_NUM_WIDTH = 60;\nexport var GridColumnAlign;\n(function (GridColumnAlign) {\n GridColumnAlign[GridColumnAlign[\"NONE\"] = 1] = \"NONE\";\n GridColumnAlign[GridColumnAlign[\"LEFT\"] = 2] = \"LEFT\";\n GridColumnAlign[GridColumnAlign[\"CENTER\"] = 3] = \"CENTER\";\n GridColumnAlign[GridColumnAlign[\"RIGHT\"] = 4] = \"RIGHT\";\n})(GridColumnAlign || (GridColumnAlign = {}));\nfunction MapAlignment(alignment) {\n switch (alignment) {\n case ColumnAlignment.Left:\n return GridColumnAlign.LEFT;\n case ColumnAlignment.Center:\n return GridColumnAlign.CENTER;\n case ColumnAlignment.Right:\n return GridColumnAlign.RIGHT;\n default:\n return GridColumnAlign.NONE;\n }\n}\nvar GridColumn = /** @class */ (function () {\n function GridColumn(column, grid, isRowNum) {\n if (isRowNum === void 0) { isRowNum = false; }\n this._label = null;\n this._description = null;\n //public left: number;\n this.align = GridColumnAlign.NONE;\n this.isVisible = true;\n this.isRowNum = false;\n this.dataColumn = column;\n this.grid = grid;\n var widthOptions = grid.options.columnWidths || {};\n if (column) {\n if (column.style.alignment) {\n this.align = MapAlignment(column.style.alignment);\n }\n this.width = (widthOptions && widthOptions[this.type]) ? widthOptions[this.type].default : DEFAULT_WIDTH_STRING;\n this.cellRenderer = this.grid.cellRendererStore.getDefaultRenderer(column.type);\n this._description = column.description;\n }\n else if (isRowNum) {\n this.isRowNum = true;\n this.width = (widthOptions && widthOptions.rowNumColumn) ? widthOptions.rowNumColumn.default : ROW_NUM_WIDTH;\n this._label = '';\n this.cellRenderer = this.grid.cellRendererStore.getDefaultRendererByType(CellRendererType.NUMBER);\n }\n if (grid && grid.options && grid.options.onGetCellRenderer) {\n this.cellRenderer = grid.options.onGetCellRenderer(this, this.cellRenderer) || this.cellRenderer;\n }\n }\n Object.defineProperty(GridColumn.prototype, \"label\", {\n get: function () {\n return this._label ? this._label : this.isRowNum ? '' : this.dataColumn.label;\n },\n set: function (value) {\n this._label = this.label;\n },\n enumerable: false,\n configurable: true\n });\n ;\n Object.defineProperty(GridColumn.prototype, \"description\", {\n /** Get column description. */\n get: function () {\n return this._description;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(GridColumn.prototype, \"type\", {\n get: function () {\n return this.dataColumn ? this.dataColumn.type : null;\n },\n enumerable: false,\n configurable: true\n });\n return GridColumn;\n}());\nexport { GridColumn };\nvar GridColumnList = /** @class */ (function () {\n function GridColumnList(columnList, grid) {\n this.items = [];\n this.grid = grid;\n this.sync(columnList);\n }\n GridColumnList.prototype.sync = function (columnList, hasRowNumCol) {\n if (hasRowNumCol === void 0) { hasRowNumCol = true; }\n this.clear();\n var rowNumCol = new GridColumn(null, this.grid, true);\n this.add(rowNumCol);\n if (!hasRowNumCol) {\n rowNumCol.isVisible = false;\n }\n if (columnList) {\n for (var _i = 0, _a = columnList.getItems(); _i < _a.length; _i++) {\n var column = _a[_i];\n var col = new GridColumn(column, this.grid);\n if (this.grid.options.onSyncGridColumn) {\n this.grid.options.onSyncGridColumn(col);\n }\n this.add(col);\n }\n }\n };\n Object.defineProperty(GridColumnList.prototype, \"count\", {\n get: function () {\n return this.items.length;\n },\n enumerable: false,\n configurable: true\n });\n GridColumnList.prototype.add = function (col) {\n var index = this.items.length;\n this.items.push(col);\n return index;\n };\n GridColumnList.prototype.put = function (index, col) {\n if (index >= 0 && index < this.items.length) {\n this.items[index] = col;\n }\n };\n GridColumnList.prototype.move = function (col, newIndex) {\n var oldIndex = this.items.indexOf(col);\n if (oldIndex >= 0 && oldIndex != newIndex)\n utils.moveArrayItem(this.items, oldIndex, newIndex);\n };\n GridColumnList.prototype.get = function (index) {\n if (index >= 0 && index < this.items.length) {\n return this.items[index];\n }\n else {\n return null;\n }\n };\n // public getIndex(name: string) : number {\n // return this.mapper[name];\n // }\n GridColumnList.prototype.getItems = function () {\n return this.items;\n };\n GridColumnList.prototype.removeAt = function (index) {\n var col = this.get(index);\n this.items.splice(index, 1);\n //delete this.mapper[col.name];\n };\n GridColumnList.prototype.clear = function () {\n this.items = [];\n //this.mapper = {};\n };\n return GridColumnList;\n}());\nexport { GridColumnList };\n//# sourceMappingURL=easy_grid_columns.js.map","export var DialogFooterAlignment;\n(function (DialogFooterAlignment) {\n DialogFooterAlignment[DialogFooterAlignment[\"Left\"] = 1] = \"Left\";\n DialogFooterAlignment[DialogFooterAlignment[\"Center\"] = 2] = \"Center\";\n DialogFooterAlignment[DialogFooterAlignment[\"Right\"] = 3] = \"Right\";\n})(DialogFooterAlignment || (DialogFooterAlignment = {}));\n//# sourceMappingURL=dialog_service.js.map","var __assign = (this && this.__assign) || function () {\n __assign = Object.assign || function(t) {\n for (var s, i = 1, n = arguments.length; i < n; i++) {\n s = arguments[i];\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\n t[p] = s[p];\n }\n return t;\n };\n return __assign.apply(this, arguments);\n};\nvar __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\n if (ar || !(i in from)) {\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\n ar[i] = from[i];\n }\n }\n return to.concat(ar || Array.prototype.slice.call(from));\n};\nimport { EventEmitter, DataRow, utils, i18n, DataType } from '@easydata/core';\nimport { eqDragManager, DropEffect } from '../utils/drag_manager';\nimport { domel } from '../utils/dom_elem_builder';\nimport { getElementAbsolutePos, eqCssPrefix } from '../utils/ui-utils';\nimport { AutoResizeColumns } from './easy_grid_options';\nimport { GridColumnList, GridColumnAlign } from './easy_grid_columns';\nimport { GridCellRendererStore } from './easy_grid_cell_renderer';\nvar DEFAULT_ROW_HEIGHT = 36;\nvar DEFAULT_ROW_COUNT = 15;\n/** Represents a grid widget with columns rows, paging, custom rendering and more */\nvar EasyGrid = /** @class */ (function () {\n /** Creates and initializes all internal properties of the grid object */\n function EasyGrid(options) {\n this.cssPrefix = \"keg\";\n this.pagination = { page: 1, pageSize: 30, total: 0 };\n this.paginationOptions = {\n maxButtonCount: 10,\n useBootstrap: false //true\n };\n this.defaultDataGridOptions = {\n slot: null,\n dataTable: null,\n fixHeightOnFirstRender: false,\n syncGridColumns: true,\n useRowNumeration: true,\n allowDragDrop: false,\n aggregates: {\n settings: null,\n calculator: null\n },\n paging: {\n enabled: true,\n pageSize: 30,\n pageSizeItems: [20, 30, 50, 100, 200]\n },\n columnWidths: {\n autoResize: AutoResizeColumns.Always,\n stringColumns: {\n min: 100,\n max: 500,\n default: 250\n },\n numberColumns: {\n min: 60,\n default: 120\n },\n boolColumns: {\n min: 50,\n default: 80\n },\n dateColumns: {\n min: 80,\n default: 200\n },\n otherColumns: {\n min: 100,\n max: 500,\n default: 250\n },\n rowNumColumn: {\n min: 40,\n default: 60\n }\n },\n showPlusButton: false,\n viewportRowsCount: null,\n showActiveRow: true\n };\n this.rowsOnPagePromise = null;\n this.containerInitialHeight = 0;\n this.firstRender = true;\n this.prevRowTotals = null;\n this.landingIndex = -1;\n this.landingSlot = domel('div')\n .addClass(\"\".concat(this.cssPrefix, \"-col-landing-slot\"))\n .addChildElement(domel('div')\n .toDOM())\n .toDOM();\n this._activeRowIndex = -1;\n if (options && options.paging) {\n options.paging = utils.assign(this.defaultDataGridOptions.paging, options.paging);\n }\n this.options = this.mergeOptions(options);\n this.processColumnWidthsOptions();\n if (!this.options.slot)\n throw Error('\"slot\" parameter is required to initialize EasyDataGrid');\n if (!this.options.dataTable)\n throw Error('\"dataTable\" parameter is required to initialize EasyDataGrid');\n this.dataTable = options.dataTable;\n this.eventEmitter = new EventEmitter(this);\n this.cellRendererStore = new GridCellRendererStore(options);\n this.columns = new GridColumnList(this.dataTable.columns, this);\n this.setSlot(this.options.slot);\n this.init(this.options);\n }\n EasyGrid.prototype.mergeOptions = function (options) {\n var colWidthOptions = utils.assignDeep({}, this.defaultDataGridOptions.columnWidths, options.columnWidths);\n var pagingOptions = utils.assignDeep({}, this.defaultDataGridOptions.paging, options.paging);\n var result = utils.assign({}, this.defaultDataGridOptions, options);\n result.columnWidths = colWidthOptions;\n result.paging = pagingOptions;\n return result;\n };\n EasyGrid.prototype.processColumnWidthsOptions = function () {\n var widthOptions = this.options.columnWidths;\n if (!widthOptions)\n return;\n //string columns\n utils.getStringDataTypes().forEach(function (dataType) {\n widthOptions[dataType] = __assign(__assign({}, widthOptions.stringColumns), widthOptions[dataType]);\n });\n //numeric columns\n utils.getNumericDataTypes().forEach(function (dataType) {\n widthOptions[dataType] = __assign(__assign({}, widthOptions.numberColumns), widthOptions[dataType]);\n });\n //bool columns\n widthOptions[DataType.Bool] = __assign(__assign({}, widthOptions.boolColumns), widthOptions[DataType.Bool]);\n //date columns\n utils.getDateDataTypes().forEach(function (dataType) {\n widthOptions[dataType] = __assign(__assign({}, widthOptions.dateColumns), widthOptions[dataType]);\n });\n //other columns\n var knownTypes = __spreadArray(__spreadArray(__spreadArray(__spreadArray([], utils.getStringDataTypes(), true), utils.getNumericDataTypes(), true), utils.getDateDataTypes(), true), [\n DataType.Bool\n ], false);\n utils.getAllDataTypes().forEach(function (dataType) {\n if (!(dataType in knownTypes)) {\n widthOptions[dataType] = __assign(__assign({}, widthOptions.otherColumns), widthOptions[dataType]);\n }\n });\n widthOptions[DataType.Unknown] = widthOptions.otherColumns;\n };\n EasyGrid.prototype.setSlot = function (slot) {\n if (typeof slot === 'string') {\n if (slot.length) {\n if (slot[0] === '#') {\n this.slot = document.getElementById(slot.substring(1));\n }\n else if (slot[0] === '.') {\n var result = document.getElementsByClassName(slot.substring(1));\n if (result.length)\n this.slot = result[0];\n }\n else {\n throw Error('Unrecognized slot parameter ' +\n '(Must be id, class or HTMLElement): ' + slot);\n }\n }\n }\n else {\n this.slot = slot;\n }\n };\n /** Initializes grid widget according to the options passed in the parameter */\n EasyGrid.prototype.init = function (options) {\n var _this = this;\n if (options.onInit) {\n this.addEventListener('init', options.onInit);\n }\n if (options.onRowClick) {\n this.addEventListener('rowClick', options.onRowClick);\n }\n if (options.onRowDbClick) {\n this.addEventListener('rowDbClick', options.onRowDbClick);\n }\n if (options.onPlusButtonClick) {\n this.addEventListener('plusButtonClick', options.onPlusButtonClick);\n }\n if (options.onColumnChanged) {\n this.addEventListener('columnChanged', options.onColumnChanged);\n }\n if (options.onColumnDeleted) {\n this.addEventListener('columnDeleted', options.onColumnDeleted);\n }\n if (options.onColumnMoved) {\n this.addEventListener('columnMoved', options.onColumnMoved);\n }\n if (options.onPageChanged) {\n this.addEventListener('pageChanged', options.onPageChanged);\n }\n if (options.onActiveRowChanged) {\n this.addEventListener('activeRowChanged', options.onActiveRowChanged);\n }\n this.addEventListener('pageChanged', function (ev) { return _this.activeRowIndex = -1; });\n utils.assignDeep(this.paginationOptions, options.pagination);\n this.pagination.pageSize = this.options.paging.pageSize\n || this.pagination.pageSize;\n if (this.options.allowDragDrop) {\n eqDragManager.registerDropContainer({\n element: this.slot,\n scopes: [\"gridColumnMove\"],\n onDragEnter: function (_, ev) {\n _this.slot.classList.add(\"\".concat(eqCssPrefix, \"-drophover\"));\n _this.showLandingSlot(ev.pageX, ev.pageY);\n },\n onDragOver: function (_, ev) {\n _this.showLandingSlot(ev.pageX, ev.pageY);\n },\n onDragLeave: function (_, ev) {\n ev.dropEffect = DropEffect.Forbid;\n _this.slot.classList.remove(\"\".concat(eqCssPrefix, \"-drophover\"));\n _this.hideLandingSlot();\n },\n onDrop: function (_, ev) {\n _this.dataTable.columns.move(ev.data.column, _this.landingIndex);\n _this.refresh();\n _this.fireEvent({\n type: 'columnMoved',\n columnId: ev.data.column.id,\n newIndex: _this.landingIndex\n });\n }\n });\n }\n this.refresh();\n this.fireEvent('init');\n };\n /** Fires a grid event. You can pass either an event type\n * (like 'init', 'rowClick', 'pageChanged', etc )\n * or a ready-to-use grid event object\n * */\n EasyGrid.prototype.fireEvent = function (event) {\n if (typeof event === \"string\") {\n this.eventEmitter.fire(event);\n }\n else {\n this.eventEmitter.fire(event.type, event);\n }\n };\n /** Allows to set the data (represented by a EasyDataTable object)\n * or to replace the existing one associated with the grid */\n EasyGrid.prototype.setData = function (data) {\n this.dataTable = data;\n this.clear();\n this.refresh();\n };\n /** Returns the EasyDataTable object associated with the grid via `setData()` call */\n EasyGrid.prototype.getData = function () {\n return this.dataTable;\n };\n /** Gets the list of grid columns */\n EasyGrid.prototype.getColumns = function () {\n return this.columns;\n };\n /** This function is called when the grid is destroyed */\n EasyGrid.prototype.destroy = function () {\n this.slot.innerHTML = \"\";\n };\n /** Clears the current DOM object and re-renders everything from the scratch */\n EasyGrid.prototype.refresh = function () {\n this.clearDOM();\n this.render();\n };\n EasyGrid.prototype.clearDOM = function () {\n this.slot.innerHTML = '';\n };\n /** Clears all DOM object in the grid and return it to its initial state */\n EasyGrid.prototype.clear = function () {\n this.pagination.page = 1;\n this.clearDOM();\n };\n /** Renders the grid */\n EasyGrid.prototype.render = function () {\n var _this = this;\n if (!this.hasData() && !this.options.showPlusButton)\n return;\n this.containerInitialHeight = this.slot.clientHeight;\n this.rootDiv = document.createElement('div');\n this.rootDiv.style.width = '100%';\n this.rootDiv.classList.add(\"\".concat(this.cssPrefix, \"-root\"));\n this.columns.sync(this.dataTable.columns, this.options.useRowNumeration);\n this.renderHeader();\n this.rootDiv.appendChild(this.headerDiv);\n this.renderBody();\n this.rootDiv.appendChild(this.bodyDiv);\n this.renderFooter();\n this.rootDiv.appendChild(this.footerDiv);\n var gridContainer = document.createElement('div');\n gridContainer.classList.add(\"\".concat(this.cssPrefix, \"-container\"));\n gridContainer.appendChild(this.rootDiv);\n this.slot.appendChild(gridContainer);\n var needAutoResize = this.options.columnWidths.autoResize !== AutoResizeColumns.Never;\n if (this.rowsOnPagePromise) {\n this.rowsOnPagePromise\n .then(function () { return _this.updateHeight(); })\n .then(function () {\n _this.firstRender = false;\n _this.rowsOnPagePromise = null;\n });\n }\n else {\n setTimeout(function () {\n _this.updateHeight()\n .then(function () {\n _this.firstRender = false;\n if (needAutoResize) {\n _this.resizeColumns();\n }\n });\n }, 100);\n }\n };\n EasyGrid.prototype.updateHeight = function () {\n var _this = this;\n return new Promise(function (resolve) {\n if (_this.options.viewportRowsCount) {\n var firstRow = _this.bodyCellContainerDiv.firstElementChild;\n var rowHeight = firstRow ? firstRow.offsetHeight : DEFAULT_ROW_HEIGHT;\n var rowCount = _this.options.viewportRowsCount; // || DEFAULT_ROW_COUNT;\n var viewportHeight_1 = rowHeight * rowCount;\n domel(_this.bodyViewportDiv)\n .setStyle('height', \"\".concat(viewportHeight_1, \"px\"));\n setTimeout(function () {\n var sbHeight = _this.bodyViewportDiv.offsetHeight - _this.bodyViewportDiv.clientHeight;\n viewportHeight_1 = viewportHeight_1 + sbHeight;\n domel(_this.bodyViewportDiv)\n .setStyle('height', \"\".concat(viewportHeight_1, \"px\"));\n resolve();\n }, 100);\n return;\n }\n else if (_this.containerInitialHeight > 0) {\n // comment for now since it does not work in all cases\n // const bodyHeight = this.containerInitialHeight - this.headerDiv.offsetHeight - this.footerDiv.offsetHeight;\n // domel(this.bodyDiv)\n // .setStyle('height', `${bodyHeight}px`);\n }\n resolve();\n })\n .then(function () {\n if (_this.options.fixHeightOnFirstRender && _this.firstRender) {\n _this.slot.style.height = \"\".concat(_this.slot.offsetHeight, \"px\");\n }\n });\n };\n EasyGrid.prototype.getContainerWidth = function () {\n return this.columns.getItems()\n .filter(function (col) { return col.isVisible; })\n .map(function (col) { return col.width; })\n .reduce(function (sum, current) { return sum + current; });\n };\n EasyGrid.prototype.renderHeader = function () {\n var _this = this;\n this.headerDiv = domel('div')\n .addClass(\"\".concat(this.cssPrefix, \"-header\"))\n .toDOM();\n this.headerViewportDiv = domel('div', this.headerDiv)\n .addClass(\"\".concat(this.cssPrefix, \"-header-viewport\"))\n .toDOM();\n this.headerCellContainerDiv = domel('div', this.headerViewportDiv)\n .addClass(\"\".concat(this.cssPrefix, \"-header-cell-container\"))\n .toDOM();\n this.headerRowDiv = domel('div', this.headerCellContainerDiv)\n .addClass(\"\".concat(this.cssPrefix, \"-header-row\"))\n .toDOM();\n this.columns.getItems().forEach(function (column, index) {\n if (!column.isVisible) {\n return;\n }\n var hd = _this.renderColumnHeader(column, index);\n _this.headerRowDiv.appendChild(hd);\n if (column.isRowNum) {\n domel(hd)\n .addChildElement(_this.renderHeaderButtons());\n }\n });\n var containerWidth = this.getContainerWidth();\n domel(this.headerCellContainerDiv)\n .setStyle('width', \"\".concat(containerWidth, \"px\"));\n };\n EasyGrid.prototype.hasData = function () {\n return this.dataTable.columns.count > 0;\n };\n EasyGrid.prototype.renderColumnHeader = function (column, index) {\n var _this = this;\n var colBuilder = domel('div')\n .addClass(\"\".concat(this.cssPrefix, \"-header-cell\"))\n .data('col-idx', \"\".concat(index))\n .setStyle('width', \"\".concat(column.width, \"px\"));\n if (column.dataColumn) {\n colBuilder\n .data('col-id', \"\".concat(column.dataColumn.id));\n }\n var colDiv = colBuilder.toDOM();\n domel('div', colDiv)\n .addClass(\"\".concat(this.cssPrefix, \"-header-cell-resize\"));\n if (!column.isRowNum) {\n domel('div', colDiv)\n .addClass(\"\".concat(this.cssPrefix, \"-header-cell-label\"))\n .text(column.label);\n }\n if (column.description) {\n domel('div', colDiv)\n .addClass('question-mark')\n .title(column.description);\n }\n if (this.options.allowDragDrop) {\n eqDragManager.registerDraggableItem({\n element: colDiv,\n scope: \"gridColumnMove\",\n data: { column: column },\n renderer: function (dragImage) {\n dragImage.innerHTML = '';\n var attrLabel = document.createElement('div');\n attrLabel.innerText = column.label;\n dragImage.classList.add(\"\".concat(_this.cssPrefix, \"-sortable-helper\"));\n dragImage.appendChild(attrLabel);\n },\n onDragStart: function (ev) {\n ev.dropEffect = DropEffect.Allow;\n }\n });\n }\n return colDiv;\n };\n EasyGrid.prototype.renderBody = function () {\n var _this = this;\n this.bodyDiv = domel('div')\n .addClass(\"\".concat(this.cssPrefix, \"-body\"))\n .toDOM();\n this.bodyViewportDiv = domel('div', this.bodyDiv)\n .addClass(\"\".concat(this.cssPrefix, \"-body-viewport\"))\n .attr('tabIndex', '0')\n .toDOM();\n this.bodyCellContainerDiv = domel('div', this.bodyViewportDiv)\n .addClass(\"\".concat(this.cssPrefix, \"-cell-container\"))\n .toDOM();\n var showAggrs = this.canShowAggregates();\n if (this.dataTable) {\n this.showProgress();\n this.rowsOnPagePromise = this.getRowsToRender()\n .then(function (rows) {\n _this.pagination.total = _this.dataTable.getTotal();\n _this.hideProgress();\n //prevent double rendering (bad solution, we have to figure out how to avoid this behavior properly)\n _this.bodyCellContainerDiv.innerHTML = '';\n _this.prevRowTotals = null;\n var rowsToRender = 0;\n if (rows.length) {\n var groups_1 = showAggrs\n ? _this.options.aggregates.settings.getGroups()\n : [];\n rowsToRender = (rows.length < _this.pagination.pageSize)\n ? rows.length\n : _this.pagination.pageSize;\n rows.forEach(function (row, index) {\n if (showAggrs)\n _this.updateTotalsState(groups_1, row);\n //we don't actually render the last row\n if (index < rowsToRender) {\n var tr = _this.renderRow(row, index);\n _this.bodyCellContainerDiv.appendChild(tr);\n }\n });\n var showGrandTotalsOnEachPage = _this.options.aggregates && _this.options.aggregates.showGrandTotalsOnEachPage;\n if (showAggrs && (_this.isLastPage() || showGrandTotalsOnEachPage)) {\n var row = new DataRow(_this.dataTable.columns, new Array(_this.dataTable.columns.count));\n _this.updateTotalsState(groups_1, row, true);\n }\n }\n var needAutoResize = _this.options.columnWidths.autoResize !== AutoResizeColumns.Never;\n if (needAutoResize) {\n _this.resizeColumns();\n }\n else {\n var containerWidth = _this.getContainerWidth();\n domel(_this.bodyCellContainerDiv)\n .setStyle('width', \"\".concat(containerWidth, \"px\"));\n }\n return rowsToRender;\n })\n .catch(function (error) { console.error(error); return 0; });\n }\n this.bodyViewportDiv.addEventListener('scroll', function (ev) {\n domel(_this.headerViewportDiv)\n .setStyle('margin-left', \"-\".concat(_this.bodyViewportDiv.scrollLeft, \"px\"));\n });\n this.bodyViewportDiv.addEventListener('keydown', this.onViewportKeydown.bind(this));\n };\n EasyGrid.prototype.isLastPage = function () {\n if (this.dataTable.elasticChunks) {\n return this.dataTable.totalIsKnown()\n && (this.pagination.page * this.pagination.pageSize) >= this.pagination.total;\n }\n return this.pagination.page * this.pagination.pageSize >= this.pagination.total;\n };\n EasyGrid.prototype.canShowAggregates = function () {\n if (!this.options || !this.options.aggregates || !this.options.aggregates.settings)\n return false;\n var aggrSettings = this.options.aggregates.settings;\n var result = (aggrSettings.hasAggregates() || aggrSettings.hasRecordCount())\n && (aggrSettings.hasGroups() || aggrSettings.hasGrandTotals());\n return result;\n };\n EasyGrid.prototype.updateTotalsState = function (groups, newRow, isLast) {\n if (isLast === void 0) { isLast = false; }\n var aggrSettings = this.options.aggregates.settings;\n if (this.prevRowTotals && aggrSettings.hasGroups()) {\n var changeLevel = -1;\n for (var level = 1; level <= groups.length; level++) {\n var group = groups[level - 1];\n for (var _i = 0, _a = group.columns; _i < _a.length; _i++) {\n var col = _a[_i];\n if (!aggrSettings.compareValues(this.prevRowTotals.getValue(col), newRow.getValue(col))) {\n changeLevel = level;\n break;\n }\n }\n if (changeLevel !== -1)\n break;\n }\n if (changeLevel !== -1) {\n for (var level = groups.length; level >= changeLevel; level--) {\n var row = new DataRow(this.dataTable.columns, this.prevRowTotals.toArray());\n var tr = this.renderTotalsRow(level, row);\n this.bodyCellContainerDiv.appendChild(tr);\n }\n }\n }\n if (isLast && aggrSettings.hasGrandTotals() && aggrSettings.hasAggregates()) {\n var tr = this.renderTotalsRow(0, newRow);\n this.bodyCellContainerDiv.appendChild(tr);\n }\n this.prevRowTotals = newRow;\n };\n EasyGrid.prototype.applyGroupColumnTemplate = function (template, value, count) {\n var result = template.replace(/{{\\s*GroupValue\\s*}}/g, value ? \"\".concat(value) : '-');\n result = result.replace(/{{\\s*GroupCount\\s*}}/g, count ? \"\".concat(count) : '-');\n return result;\n };\n EasyGrid.prototype.renderTotalsRow = function (level, row) {\n var _this = this;\n var aggrSettings = this.options.aggregates.settings;\n var group = (level > 0)\n ? aggrSettings.getGroups()[level - 1]\n : { columns: [], aggregates: aggrSettings.getAggregates() };\n var rowBuilder = domel('div')\n .addClass(\"\".concat(this.cssPrefix, \"-row\"))\n .addClass(\"\".concat(this.cssPrefix, \"-row-totals\"))\n .addClass(\"\".concat(this.cssPrefix, \"-totals-lv\").concat(level))\n .data('totals-level', \"\".concat(level))\n .attr('tabindex', '-1');\n var rowElement = rowBuilder.toDOM();\n this.columns.getItems().forEach(function (column, index) {\n if (!column.isVisible) {\n return;\n }\n var val = '';\n var colIndex = !column.isRowNum\n ? _this.dataTable.columns.getIndex(column.dataColumn.id)\n : -1;\n if (!column.isRowNum && column.dataColumn) {\n if (group.columns.indexOf(column.dataColumn.id) >= 0) {\n val = row.getValue(colIndex);\n }\n ;\n }\n if (colIndex == _this.dataTable.columns.count - 1) {\n val = '. . . . . .';\n }\n rowElement.appendChild(_this.renderCell(column, index, val, rowElement));\n });\n var aggrContainer = this.options.aggregates.calculator.getAggrContainer();\n var aggrCols = aggrSettings.getAggregates().map(function (c) { return c.colId; });\n var key = aggrSettings.buildGroupKey(group, row);\n aggrContainer.getAggregateData(level, key)\n .then(function (values) {\n for (var _i = 0, aggrCols_1 = aggrCols; _i < aggrCols_1.length; _i++) {\n var aggrColId = aggrCols_1[_i];\n row.setValue(aggrColId, values[aggrColId]);\n }\n rowElement.innerHTML = '';\n _this.columns.getItems().forEach(function (column, index) {\n if (!column.isVisible) {\n return;\n }\n var val = '';\n var colIndex = !column.isRowNum\n ? _this.dataTable.columns.getIndex(column.dataColumn.id)\n : -1;\n if (!column.isRowNum) {\n var isLastGroupColumn = false;\n if (column.dataColumn) {\n var groupColIndex = group.columns.indexOf(column.dataColumn.id);\n var aggrColIndex = aggrCols.indexOf(column.dataColumn.id);\n if (level > 0) {\n isLastGroupColumn = groupColIndex == group.columns.length - 1;\n }\n else {\n //if it's a grand total row consider first column as the last group column\n isLastGroupColumn = colIndex == 0;\n }\n if (groupColIndex >= 0 || aggrColIndex >= 0) {\n val = row.getValue(colIndex);\n }\n ;\n }\n var groupFooterTemplate = '';\n if (level > 0) {\n groupFooterTemplate = column.dataColumn.groupFooterColumnTemplate;\n //set the default template for the last grouping column\n if (!groupFooterTemplate && aggrSettings.hasRecordCount() && isLastGroupColumn) {\n groupFooterTemplate = '{{GroupValue}} ({{GroupCount}})';\n }\n }\n if (groupFooterTemplate) {\n var cellDiv_1 = _this.renderCell(column, index, val, rowElement);\n var innerCell = cellDiv_1.firstChild;\n val = innerCell.innerHTML;\n val = _this.applyGroupColumnTemplate(groupFooterTemplate, val, values[aggrSettings.COUNT_FIELD_NAME]);\n }\n }\n var cellDiv = _this.renderCell(column, index, val, rowElement);\n rowElement.appendChild(cellDiv);\n });\n })\n .catch(function (error) { return console.error(error); });\n return rowElement;\n };\n EasyGrid.prototype.onViewportKeydown = function (ev) {\n if (this.options.showActiveRow) {\n var rowCount = this.bodyCellContainerDiv.querySelectorAll(\".\".concat(this.cssPrefix, \"-row\")).length;\n var newValue = void 0;\n switch (ev.key) {\n case 'ArrowLeft':\n break;\n case 'ArrowRight':\n break;\n case 'ArrowUp':\n ev.preventDefault();\n newValue = this.activeRowIndex < 0 || this.activeRowIndex >= rowCount ? rowCount - 1 : this.activeRowIndex - 1;\n this.activeRowIndex = newValue >= 0 ? newValue : 0;\n break;\n case 'ArrowDown':\n ev.preventDefault();\n newValue = this.activeRowIndex < 0 || this.activeRowIndex >= rowCount ? 0 : this.activeRowIndex + 1;\n this.activeRowIndex = newValue < rowCount ? newValue : rowCount - 1;\n break;\n }\n }\n };\n EasyGrid.prototype.ensureRowVisibility = function (rowOrIndex) {\n var row = typeof rowOrIndex === 'number'\n ? this.getDataRow(rowOrIndex)\n : rowOrIndex;\n if (row) {\n var rowRect = row.getBoundingClientRect();\n var viewportRect = this.bodyViewportDiv.getBoundingClientRect();\n var rowTop = rowRect.top - viewportRect.top;\n var rowBottom = rowRect.bottom - viewportRect.top;\n var viewportHeight = this.bodyViewportDiv.clientHeight;\n var windowHeight = window.innerHeight || document.documentElement.clientHeight;\n if (rowTop > 0 &&\n rowBottom <= viewportHeight &&\n rowRect.top > 0 &&\n rowRect.bottom < windowHeight) {\n return;\n }\n if (rowTop < 0) {\n this.bodyViewportDiv.scrollTop = this.bodyViewportDiv.scrollTop + rowTop;\n }\n else if (rowBottom > viewportHeight) {\n this.bodyViewportDiv.scrollTop = this.bodyViewportDiv.scrollTop + rowBottom - viewportHeight;\n }\n rowRect = row.getBoundingClientRect();\n if (rowRect.top < 0) {\n document.documentElement.scrollTop = document.documentElement.scrollTop + rowRect.top;\n }\n else if (rowRect.bottom > windowHeight) {\n document.documentElement.scrollTop = document.documentElement.scrollTop + rowRect.bottom - windowHeight;\n }\n }\n };\n /** Returns a promise with the list of the rows to render on one page.\n * The list contains pageSize+1 row to make it possible\n * to render the totals row (if it appears to be on the edge between pages)\n */\n EasyGrid.prototype.getRowsToRender = function () {\n if (this.options.paging.enabled === false) {\n return Promise.resolve(this.dataTable.getCachedRows());\n }\n return this.dataTable.getRows({\n offset: (this.pagination.page - 1) * this.pagination.pageSize,\n limit: this.pagination.pageSize + 1\n })\n .catch(function (error) {\n console.error(error);\n return [];\n });\n };\n EasyGrid.prototype.renderFooter = function () {\n var _this = this;\n this.footerDiv = domel('div')\n .addClass(\"\".concat(this.cssPrefix, \"-footer\"))\n .toDOM();\n if (this.rowsOnPagePromise) {\n this.rowsOnPagePromise.then(function (count) {\n _this.footerDiv.innerHTML = '';\n _this.footerPaginateDiv = _this.renderPageNavigator();\n _this.footerDiv.appendChild(_this.footerPaginateDiv);\n var pageInfoBlock = _this.renderPageInfoBlock(count);\n _this.footerDiv.appendChild(pageInfoBlock);\n });\n }\n };\n EasyGrid.prototype.renderPageInfoBlock = function (count) {\n var pageInfoDiv = domel('div')\n .addClass(\"\".concat(this.cssPrefix, \"-page-info\"))\n .toDOM();\n var rowCount = this.dataTable.getTotal();\n if (rowCount > 0) {\n var fistPageRecordNum = count\n ? (this.pagination.page - 1) * this.pagination.pageSize + 1\n : 0;\n var lastPageRecordNum = count\n ? fistPageRecordNum + count - 1\n : 0;\n var totalStr = this.dataTable.getTotal().toString();\n if (this.dataTable.elasticChunks) {\n var count_1 = this.dataTable.getCachedCount();\n var total = this.dataTable.getTotal();\n if (count_1 !== total)\n totalStr = '?';\n }\n pageInfoDiv.innerHTML = i18n.getText('GridPageInfo')\n .replace('{FirstPageRecordNum}', \"<span>\".concat(fistPageRecordNum.toString(), \"</span>\"))\n .replace('{LastPageRecordNum}', \"<span>\".concat(lastPageRecordNum.toString(), \"</span>\"))\n .replace('{Total}', \"<span>\".concat(totalStr, \"</span>\"));\n }\n return pageInfoDiv;\n };\n EasyGrid.prototype.showProgress = function () {\n };\n EasyGrid.prototype.hideProgress = function () {\n };\n EasyGrid.prototype.getLocalIndexByGlobal = function (index) {\n if (this.pagination) {\n return index % this.pagination.pageSize;\n }\n else {\n return index;\n }\n };\n EasyGrid.prototype.getGlobalIndexByLocal = function (index) {\n if (this.pagination) {\n return (this.pagination.page - 1) * this.pagination.pageSize + index;\n }\n else {\n return index;\n }\n };\n EasyGrid.prototype.renderRow = function (row, index) {\n var _this = this;\n var indexGlobal = this.getGlobalIndexByLocal(index);\n var rowBuilder = domel('div')\n .addClass(\"\".concat(this.cssPrefix, \"-row\"))\n .addClass(\"\".concat(this.cssPrefix, \"-row-\").concat(index % 2 == 1 ? 'odd' : 'even'))\n .data('row-idx', \"\".concat(indexGlobal))\n .attr('tabindex', '-1')\n .on('click', function (ev) {\n _this.activeRowIndex = index;\n _this.fireEvent({\n type: 'rowClick',\n row: row,\n rowIndex: index,\n sourceEvent: ev\n });\n })\n .on('dblclick', function (ev) {\n _this.fireEvent({\n type: 'rowDbClick',\n row: row,\n rowIndex: index,\n sourceEvent: ev\n });\n });\n if (index == 0) {\n rowBuilder.addClass(\"\".concat(this.cssPrefix, \"-row-first\"));\n }\n var rowElement = rowBuilder.toDOM();\n if (this.options.showActiveRow && index == this.activeRowIndex) {\n rowBuilder.addClass(\"\".concat(this.cssPrefix, \"-row-active\"));\n }\n this.columns.getItems().forEach(function (column, index) {\n if (!column.isVisible) {\n return;\n }\n var colindex = column.isRowNum ? -1 : _this.dataTable.columns.getIndex(column.dataColumn.id);\n var val = column.isRowNum ? indexGlobal + 1 : row.getValue(colindex);\n rowElement.appendChild(_this.renderCell(column, index, val, rowElement));\n });\n return rowElement;\n };\n EasyGrid.prototype.renderCell = function (column, colIndex, value, rowElement) {\n var builder = domel('div')\n .addClass(\"\".concat(this.cssPrefix, \"-cell\"))\n .data('col-idx', \"\".concat(colIndex))\n .attr('tabindex', '-1')\n .setStyle('width', \"\".concat(column.width, \"px\"));\n if (column.align == GridColumnAlign.LEFT) {\n builder.addClass(\"\".concat(this.cssPrefix, \"-cell-align-left\"));\n }\n else if (column.align == GridColumnAlign.RIGHT) {\n builder.addClass(\"\".concat(this.cssPrefix, \"-cell-align-right\"));\n }\n else if (column.align == GridColumnAlign.CENTER) {\n builder.addClass(\"\".concat(this.cssPrefix, \"-cell-align-center\"));\n }\n var cellElement = builder.toDOM();\n var valueCell = cellElement.appendChild(domel('div')\n .addClass(\"\".concat(this.cssPrefix, \"-cell-value\"))\n .toDOM());\n if (column.cellRenderer) {\n column.cellRenderer(value, column, valueCell, rowElement);\n }\n return cellElement;\n };\n /** Sets current grid pages (if paging is used) */\n EasyGrid.prototype.setPage = function (page) {\n this.pagination.page = page;\n this.fireEvent({ type: \"pageChanged\", page: page });\n this.refresh();\n this.bodyViewportDiv.focus();\n };\n EasyGrid.prototype.renderPageNavigator = function () {\n var _this = this;\n var paginateDiv = document.createElement('div');\n paginateDiv.className = \"\".concat(this.cssPrefix, \"-pagination-wrapper\");\n var rowCount = this.dataTable.getTotal();\n if (this.options.paging && this.options.paging.enabled && rowCount > 0) {\n var prefix_1 = this.paginationOptions.useBootstrap ? '' : \"\".concat(this.cssPrefix, \"-\");\n var buttonClickHandler_1 = function (ev) {\n var element = ev.target;\n if (element.hasAttribute('data-page')) {\n var page = parseInt(element.getAttribute('data-page'));\n _this.setPage(page);\n }\n };\n var renderPageCell = function (pageIndex, content, disabled, extreme, active) {\n var li = document.createElement('li');\n li.className = \"\".concat(prefix_1, \"page-item\");\n if (!extreme) {\n if (active) {\n li.className += ' active';\n }\n var a_1 = document.createElement('a');\n a_1.setAttribute('href', 'javascript:void(0)');\n a_1.innerHTML = content || pageIndex.toString();\n a_1.setAttribute(\"data-page\", \"\".concat(pageIndex));\n a_1.className = \"\".concat(prefix_1, \"page-link\");\n a_1.addEventListener(\"click\", buttonClickHandler_1);\n li.appendChild(a_1);\n return li;\n }\n var a = document.createElement('span');\n a.setAttribute('aria-hidden', 'true');\n a.className = \"\".concat(prefix_1, \"page-link\");\n if (disabled) {\n li.className += ' disabled';\n }\n else {\n if (_this.paginationOptions.useBootstrap) {\n a = document.createElement('a');\n a.setAttribute('href', 'javascript:void(0)');\n a.setAttribute(\"data-page\", \"\".concat(pageIndex));\n }\n else {\n var newA = document.createElement('a');\n newA.setAttribute('href', 'javascript:void(0)');\n newA.setAttribute('data-page', \"\".concat(pageIndex));\n a = newA;\n }\n a.className = \"\".concat(prefix_1, \"page-link\");\n a.addEventListener(\"click\", buttonClickHandler_1);\n }\n a.innerHTML = content;\n li.appendChild(a);\n return li;\n };\n if (this.dataTable.elasticChunks) {\n var pageIndex = this.pagination.page || 1;\n var ul = document.createElement('ul');\n ul.className = \"\".concat(prefix_1, \"pagination\");\n var cell = renderPageCell(pageIndex - 1, '«', pageIndex == 1, true, false);\n ul.appendChild(cell);\n cell = renderPageCell(pageIndex + 1, '»', this.isLastPage(), true, false);\n ul.appendChild(cell);\n paginateDiv.appendChild(ul);\n }\n else {\n if (this.pagination.total > this.pagination.pageSize) {\n var pageIndex = this.pagination.page || 1;\n var pageCount = Math.ceil(this.pagination.total / this.pagination.pageSize) || 1;\n var maxButtonCount = this.paginationOptions.maxButtonCount || 10;\n var zeroBasedIndex = pageIndex - 1;\n var firstPageIndex = zeroBasedIndex - (zeroBasedIndex % maxButtonCount) + 1;\n var lastPageIndex = firstPageIndex + maxButtonCount - 1;\n if (lastPageIndex > pageCount) {\n lastPageIndex = pageCount;\n }\n var ul = document.createElement('ul');\n ul.className = \"\".concat(prefix_1, \"pagination\");\n var cell = renderPageCell(firstPageIndex - 1, '«', firstPageIndex == 1, true, false);\n ul.appendChild(cell);\n for (var i = firstPageIndex; i <= lastPageIndex; i++) {\n cell = renderPageCell(i, i.toString(), false, false, i == pageIndex);\n ul.appendChild(cell);\n }\n cell = renderPageCell(lastPageIndex + 1, '»', lastPageIndex == pageCount, true, false);\n ul.appendChild(cell);\n paginateDiv.appendChild(ul);\n }\n }\n if (this.options.paging.allowPageSizeChange) {\n var selectChangeHandler = function (ev) {\n var newValue = parseInt(ev.target.value);\n _this.pagination.pageSize = newValue;\n _this.pagination.page = 1;\n _this.refresh();\n };\n var pageSizes = document.createElement('div');\n pageSizes.className = \"\".concat(this.cssPrefix, \"-page-sizes\");\n var selectSize = document.createElement('div');\n selectSize.className = \"kfrm-select \".concat(this.cssPrefix, \"-page-sizes-select\");\n pageSizes.appendChild(selectSize);\n var sel_1 = document.createElement('select');\n var selOptions = this.options.paging.pageSizeItems || [];\n var selSet = new Set(selOptions);\n selSet.add(this.options.paging.pageSize || 20);\n Array.from(selSet).forEach(function (el) {\n var option = document.createElement(\"option\");\n option.value = el.toString();\n option.text = el.toString();\n sel_1.appendChild(option);\n });\n sel_1.value = (this.pagination.pageSize || 20).toString();\n selectSize.appendChild(sel_1);\n sel_1.addEventListener('change', selectChangeHandler);\n var labelDiv = document.createElement('div');\n labelDiv.className = \"\".concat(this.cssPrefix, \"-page-sizes-label\");\n pageSizes.appendChild(labelDiv);\n var label = document.createElement('span');\n label.innerText = i18n.getText('GridItemsPerPage');\n labelDiv.appendChild(label);\n paginateDiv.appendChild(pageSizes);\n }\n }\n return paginateDiv;\n };\n EasyGrid.prototype.addEventListener = function (eventType, handler) {\n return this.eventEmitter.subscribe(eventType, function (event) { return handler(event.data); });\n };\n EasyGrid.prototype.removeEventListener = function (eventType, handlerId) {\n this.eventEmitter.unsubscribe(eventType, handlerId);\n };\n EasyGrid.prototype.renderHeaderButtons = function () {\n var _this = this;\n if (this.options.showPlusButton) {\n return domel('div')\n .addClass(\"\".concat(this.cssPrefix, \"-header-btn-plus\"))\n .title(this.options.plusButtonTitle || 'Add')\n .addChild('a', function (builder) { return builder\n .attr('href', 'javascript:void(0)')\n .on('click', function (e) {\n e.preventDefault();\n _this.fireEvent({\n type: 'plusButtonClick',\n sourceEvent: e\n });\n }); })\n .toDOM();\n }\n return domel('span')\n .addText('#')\n .toDOM();\n };\n EasyGrid.prototype.showLandingSlot = function (pageX, pageY) {\n var colElems = this.headerRowDiv.querySelectorAll(\"[class*=\".concat(this.cssPrefix, \"-table-col]\"));\n var cols = [];\n for (var i = 1; i < colElems.length; i++) {\n var rowElem = colElems[i];\n if (rowElem.style.display === 'none')\n continue;\n cols.push(rowElem);\n }\n if (cols.length === 0) {\n this.landingIndex = 0;\n this.headerRowDiv.appendChild(this.landingSlot);\n return;\n }\n var landingPos = getElementAbsolutePos(this.landingSlot);\n if (pageX >= landingPos.x && pageX <= landingPos.x + this.landingSlot.offsetWidth) {\n return;\n }\n var newLandingIndex = this.landingIndex;\n for (var _i = 0, cols_1 = cols; _i < cols_1.length; _i++) {\n var col = cols_1[_i];\n var colPos = getElementAbsolutePos(col);\n var width = col.offsetWidth;\n if (pageX > colPos.x && pageX < colPos.x + width) {\n // -1 as we don't need to count add button here\n newLandingIndex = parseInt(col.getAttribute('data-col-idx')) - 1;\n }\n }\n if (newLandingIndex != this.landingIndex) {\n this.landingIndex = newLandingIndex;\n if (this.landingIndex < cols.length) {\n this.headerRowDiv.insertBefore(this.landingSlot, cols[this.landingIndex]);\n }\n else {\n this.headerRowDiv.appendChild(this.landingSlot);\n }\n }\n };\n EasyGrid.prototype.hideLandingSlot = function () {\n var _this = this;\n this.landingIndex = -1;\n setTimeout(function () {\n if (_this.landingSlot.parentElement) {\n _this.landingSlot.parentElement.removeChild(_this.landingSlot);\n }\n }, 10);\n };\n Object.defineProperty(EasyGrid.prototype, \"activeRowIndex\", {\n get: function () {\n return this._activeRowIndex;\n },\n set: function (value) {\n if (value !== this._activeRowIndex) {\n var oldValue = this._activeRowIndex;\n this._activeRowIndex = value;\n this.updateActiveRow();\n this.fireEvent({\n type: 'activeRowChanged',\n oldValue: oldValue,\n newValue: this.activeRowIndex,\n rowIndex: this.getGlobalIndexByLocal(this.activeRowIndex)\n });\n }\n },\n enumerable: false,\n configurable: true\n });\n EasyGrid.prototype.updateActiveRow = function () {\n var _this = this;\n if (this.options.showActiveRow) {\n var rows = this.bodyCellContainerDiv.querySelectorAll(\"[class*=\".concat(this.cssPrefix, \"-row-active]\"));\n rows.forEach(function (el) { el.classList.remove(\"\".concat(_this.cssPrefix, \"-row-active\")); });\n var activeRow = this.getActiveRow();\n if (activeRow) {\n activeRow.classList.add(\"\".concat(this.cssPrefix, \"-row-active\"));\n this.ensureRowVisibility(this.activeRowIndex);\n }\n }\n };\n EasyGrid.prototype.getActiveRow = function () {\n return this.getDataRow(this.activeRowIndex);\n };\n EasyGrid.prototype.getDataRow = function (index) {\n var rows = Array.from(this.bodyCellContainerDiv.querySelectorAll(\".\".concat(this.cssPrefix, \"-row:not(.\").concat(this.cssPrefix, \"-row-totals)\")));\n if (index >= 0 && index < rows.length)\n return rows[index];\n return null;\n };\n /** Makes the grid focused for keyboard events */\n EasyGrid.prototype.focus = function () {\n this.bodyViewportDiv.focus();\n };\n /** Resizes columns according to the data they represent */\n EasyGrid.prototype.resizeColumns = function () {\n if (this.options.columnWidths.autoResize === AutoResizeColumns.Never)\n return;\n var containerWidth = this.bodyCellContainerDiv.style.width;\n this.bodyCellContainerDiv.style.visibility = 'hidden';\n this.bodyCellContainerDiv.style.width = '1px';\n //this.headerRowDiv.style.visibility = 'hidden';\n this.headerRowDiv.style.width = '1px';\n var sumWidth = 0;\n var columns = this.columns.getItems();\n var headerCells = this.headerCellContainerDiv.querySelectorAll(\".\".concat(this.cssPrefix, \"-header-cell\"));\n var headerIdx = 0;\n var _loop_1 = function (idx) {\n var column = columns[idx];\n if (!column.isVisible)\n return \"continue\";\n var calculatedWidth = this_1.options.columnWidths.autoResize !== AutoResizeColumns.Always && column.dataColumn\n ? column.dataColumn.calculatedWidth\n : 0;\n var cellValues = this_1.bodyCellContainerDiv.querySelectorAll(\".\".concat(this_1.cssPrefix, \"-cell[data-col-idx=\\\"\").concat(idx, \"\\\"] > .\").concat(this_1.cssPrefix, \"-cell-value\"));\n var maxWidth = 0;\n if (calculatedWidth > 0) {\n sumWidth += calculatedWidth;\n column.width = calculatedWidth;\n cellValues.forEach(function (value) {\n value.parentElement.style.width = \"\".concat(calculatedWidth, \"px\");\n });\n headerCells[headerIdx].style.width = \"\".concat(calculatedWidth, \"px\");\n }\n else {\n if (cellValues.length == 0) {\n headerCells[headerIdx].style.width = null;\n headerCells[headerIdx].style.whiteSpace = 'nowrap';\n }\n maxWidth = headerCells[headerIdx].offsetWidth;\n if (cellValues.length > 0) {\n cellValues.forEach(function (value) {\n value.parentElement.style.width = null;\n var width = value.parentElement.offsetWidth;\n if (width > maxWidth) {\n maxWidth = width;\n }\n });\n maxWidth += 3;\n var maxOption = column.isRowNum\n ? this_1.options.columnWidths.rowNumColumn.max || 500\n : this_1.options.columnWidths[column.dataColumn.type].max || 2000;\n var minOption = column.isRowNum\n ? this_1.options.columnWidths.rowNumColumn.min || 0\n : this_1.options.columnWidths[column.dataColumn.type].min || 20;\n if (maxWidth > maxOption) {\n maxWidth = maxOption;\n }\n if (maxWidth < minOption) {\n maxWidth = minOption;\n }\n if (utils.isNumericType(column.type)) {\n //increase the calculated width in 1.3 times for numeric columns\n maxWidth = Math.round(maxWidth * 1.3);\n }\n sumWidth += maxWidth;\n column.width = maxWidth;\n cellValues.forEach(function (value) {\n value.parentElement.style.width = \"\".concat(maxWidth, \"px\");\n });\n headerCells[headerIdx].style.width = \"\".concat(maxWidth, \"px\");\n if (column.dataColumn) {\n column.dataColumn.calculatedWidth = maxWidth;\n }\n }\n else {\n sumWidth += maxWidth;\n }\n }\n headerIdx++;\n };\n var this_1 = this;\n for (var idx = 0; idx < this.columns.count; idx++) {\n _loop_1(idx);\n }\n if (sumWidth > 0) {\n this.bodyCellContainerDiv.style.width = \"\".concat(sumWidth, \"px\");\n this.headerCellContainerDiv.style.width = \"\".concat(sumWidth, \"px\");\n }\n else {\n this.bodyCellContainerDiv.style.width = containerWidth;\n this.headerCellContainerDiv.style.width = containerWidth;\n }\n this.bodyCellContainerDiv.style.visibility = null;\n this.headerRowDiv.removeAttribute('style');\n };\n return EasyGrid;\n}());\nexport { EasyGrid };\n//# sourceMappingURL=easy_grid.js.map","var Calendar = /** @class */ (function () {\n function Calendar(slot, options) {\n this.slot = slot;\n this.options = options || {};\n if (!this.options.yearRange) {\n this.options.yearRange = 'c-10:c+10';\n }\n }\n Object.defineProperty(Calendar.prototype, \"cssPrefix\", {\n get: function () {\n return 'kdtp-cal';\n },\n enumerable: false,\n configurable: true\n });\n Calendar.prototype.setDate = function (date) {\n this.currentDate = new Date(date);\n };\n Calendar.prototype.getDate = function () {\n return new Date(this.currentDate);\n };\n Calendar.prototype.dateChanged = function (apply) {\n if (this.options.onDateChanged) {\n this.options.onDateChanged(this.currentDate, apply);\n }\n };\n return Calendar;\n}());\nexport { Calendar };\n//# sourceMappingURL=calendar.js.map","import { getElementAbsolutePos } from '../utils/ui-utils';\nvar DateTimePicker = /** @class */ (function () {\n function DateTimePicker(options) {\n this.calendar = null;\n this.timePicker = null;\n this.options = options;\n this.render();\n }\n Object.defineProperty(DateTimePicker.prototype, \"cssPrefix\", {\n get: function () {\n return 'kdtp';\n },\n enumerable: false,\n configurable: true\n });\n DateTimePicker.prototype.setDateTime = function (dateTime) {\n this.currentDateTime = new Date(dateTime);\n if (this.calendar) {\n this.calendar.setDate(this.currentDateTime);\n }\n if (this.timePicker) {\n this.timePicker.setTime(this.currentDateTime);\n }\n };\n DateTimePicker.prototype.getDateTime = function () {\n return new Date(this.currentDateTime);\n };\n DateTimePicker.prototype.render = function () {\n var _this = this;\n if (this.options.showCalendar) {\n this.calendar = this.createCalendar({\n yearRange: this.options.yearRange,\n showDateTimeInput: this.options.showDateTimeInput,\n timePickerIsUsed: this.options.showTimePicker,\n oneClickDateSelection: this.options.oneClickDateSelection,\n onDateChanged: function (date, apply) {\n _this.currentDateTime = date;\n if (_this.timePicker) {\n _this.timePicker.setTime(_this.currentDateTime);\n }\n if (_this.options.showTimePicker) {\n _this.dateTimeChanged();\n }\n if (apply) {\n _this.apply(_this.currentDateTime);\n }\n }\n });\n if (this.calendar)\n this.calendar.render();\n }\n if (this.options.showTimePicker) {\n this.timePicker = this.createTimePicker({\n onTimeChanged: function (time) {\n _this.currentDateTime.setHours(time.getHours());\n _this.currentDateTime.setMinutes(time.getMinutes());\n if (_this.calendar) {\n _this.calendar.setDate(_this.currentDateTime);\n }\n _this.dateTimeChanged();\n }\n });\n if (this.timePicker)\n this.timePicker.render();\n }\n this.setDateTime(new Date());\n };\n DateTimePicker.prototype.createCalendar = function (options) {\n return null;\n };\n DateTimePicker.prototype.createTimePicker = function (options) {\n return null;\n };\n DateTimePicker.prototype.show = function (anchor) {\n if (this.options.beforeShow) {\n this.options.beforeShow();\n }\n var pos = getElementAbsolutePos(anchor || document.body);\n this.slot.style.top = pos.y + anchor.clientHeight + 'px';\n this.slot.style.left = pos.x + 'px';\n };\n DateTimePicker.prototype.apply = function (date) {\n if (this.options.onApply) {\n this.options.onApply(date);\n }\n this.destroy();\n };\n DateTimePicker.prototype.cancel = function () {\n if (this.options.onCancel) {\n this.options.onCancel();\n }\n this.destroy();\n };\n DateTimePicker.prototype.destroy = function () {\n if (this.slot && this.slot.parentElement) {\n this.slot.parentElement.removeChild(this.slot);\n }\n };\n DateTimePicker.prototype.dateTimeChanged = function () {\n if (this.options.onDateTimeChanged) {\n this.options.onDateTimeChanged(this.currentDateTime);\n }\n };\n return DateTimePicker;\n}());\nexport { DateTimePicker };\n//# sourceMappingURL=date_time_picker.js.map","var __extends = (this && this.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n if (typeof b !== \"function\" && b !== null)\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nimport { i18n, utils as dataUtils } from '@easydata/core';\nimport { domel } from '../utils/dom_elem_builder';\nimport { Calendar } from './calendar';\nvar DefaultCalendar = /** @class */ (function (_super) {\n __extends(DefaultCalendar, _super);\n function DefaultCalendar(slot, options) {\n var _this = _super.call(this, slot, options) || this;\n _this.daysOfWeek = [\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\"];\n _this.months = [\"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\", \"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\"];\n _this.calendarBody = null;\n _this.isManualInputChanging = false;\n for (var i = 0; i < _this.daysOfWeek.length; i++) {\n _this.daysOfWeek[i] = i18n.getShortWeekDayName(i + 1);\n }\n for (var i = 0; i < _this.months.length; i++) {\n _this.months[i] = i18n.getLongMonthName(i + 1);\n }\n return _this;\n }\n DefaultCalendar.prototype.setDate = function (date) {\n _super.prototype.setDate.call(this, date);\n this.selectedMonth = this.currentDate.getMonth();\n this.selectedYear = this.currentDate.getFullYear();\n this.rerenderMonth();\n };\n DefaultCalendar.prototype.render = function () {\n var _this = this;\n var header = domel('div', this.slot)\n .addClass(\"\".concat(this.cssPrefix, \"-header\"));\n if (this.options.showDateTimeInput) {\n header\n .addChildElement(this.renderManualDateInput());\n }\n else {\n header\n .addChild('span', function (builder) { return _this.headerTextElem = builder.toDOM(); });\n }\n domel(this.slot)\n .addChildElement(this.renderCalendarButtons());\n this.calendarBody = domel('div', this.slot)\n .addClass(\"\".concat(this.cssPrefix, \"-body\"))\n .toDOM();\n };\n DefaultCalendar.prototype.getInputDateFormat = function () {\n var settings = i18n.getLocaleSettings();\n return (this.options.timePickerIsUsed)\n ? \"\".concat(settings.editDateFormat, \" \").concat(settings.editTimeFormat)\n : settings.editDateFormat;\n };\n DefaultCalendar.prototype.renderManualDateInput = function () {\n var _this = this;\n var format = this.getInputDateFormat();\n var builder = domel('input')\n .attr('placeholder', format)\n .addClass(\"\".concat(this.cssPrefix, \"-header-input\"));\n builder\n .mask(format.replace('yyyy', '9999')\n .replace('MM', '99')\n .replace('dd', '99')\n .replace('HH', '99')\n .replace('mm', '99')\n .replace('ss', '99'))\n .on('input', function (ev) {\n builder.removeClass('error');\n try {\n _this.isManualInputChanging = true;\n var newDate = dataUtils.strToDateTime(_this.manualInputElem.value, format);\n _this.currentDate = newDate;\n _this.jump(_this.currentDate.getFullYear(), _this.currentDate.getMonth());\n _this.dateChanged(false);\n }\n catch (e) {\n builder.addClass('error');\n }\n finally {\n _this.isManualInputChanging = false;\n }\n })\n .on('keydown', function (ev) {\n if (ev.keyCode === 13) {\n ev.preventDefault();\n ev.stopPropagation();\n if (_this.manualInputElem.className.indexOf('error') < 0\n && !_this.isManualInputChanging)\n _this.dateChanged(true);\n }\n })\n .on('focus', function () {\n setTimeout(function () {\n _this.manualInputElem.selectionStart = 0;\n _this.manualInputElem.selectionEnd = 0;\n }, 50);\n });\n this.manualInputElem = builder.toDOM();\n return this.manualInputElem;\n };\n DefaultCalendar.prototype.updateDisplayedDateValue = function () {\n if (this.manualInputElem) {\n if (!this.isManualInputChanging) {\n var format = this.getInputDateFormat();\n this.manualInputElem.value = dataUtils.dateTimeToStr(this.currentDate, format);\n this.manualInputElem.focus();\n }\n }\n else if (this.headerTextElem) {\n var locale = i18n.getCurrentLocale();\n this.headerTextElem.innerText = this.currentDate.toLocaleString(locale == 'en' ? undefined : locale, {\n year: 'numeric',\n month: 'long',\n day: 'numeric',\n });\n }\n };\n DefaultCalendar.prototype.renderCalendarButtons = function () {\n var _this = this;\n var builder = domel('nav')\n .addClass(\"\".concat(this.cssPrefix, \"-nav\"))\n .addChild('div', function (builder) { return builder\n .addClass(\"\".concat(_this.cssPrefix, \"-nav-prev\"))\n .on('click', function () {\n _this.prev();\n })\n .addChild('span', function (builder) { return builder.html('‹'); }); })\n .addChild('div', function (builder) { return builder\n .addClass(\"\".concat(_this.cssPrefix, \"-nav-selectors\"))\n .addChild('div', function (builder) { return builder\n .addClass(\"\".concat(_this.cssPrefix, \"-nav-month\"))\n .addChild('select', function (builder) {\n builder\n .on('change', function () {\n _this.jump(_this.selectedYear, parseInt(_this.selectMonthElem.value));\n });\n var _loop_1 = function (i) {\n builder.addChild('option', function (builder) { return builder\n .attr('value', i.toString())\n .text(_this.months[i]); });\n };\n for (var i = 0; i < _this.months.length; i++) {\n _loop_1(i);\n }\n _this.selectMonthElem = builder.toDOM();\n }); })\n .addChild('div', function (builder) { return builder\n .addClass(\"\".concat(_this.cssPrefix, \"-nav-year\"))\n .addChild('select', function (builder) { return _this.selectYearElem = builder\n .on('change', function () {\n _this.jump(parseInt(_this.selectYearElem.value), _this.selectedMonth);\n })\n .toDOM(); }); }); })\n .addChild('div', function (builder) { return builder\n .addClass(\"\".concat(_this.cssPrefix, \"-nav-next\"))\n .on('click', function () {\n _this.next();\n })\n .addChild('span', function (builder) { return builder.html('›'); }); });\n return builder.toDOM();\n };\n DefaultCalendar.prototype.prev = function () {\n this.selectedYear = (this.selectedMonth === 0) ? this.selectedYear - 1 : this.selectedYear;\n this.selectedMonth = (this.selectedMonth === 0) ? 11 : this.selectedMonth - 1;\n this.rerenderMonth();\n };\n DefaultCalendar.prototype.next = function () {\n this.selectedYear = (this.selectedMonth === 11) ? this.selectedYear + 1 : this.selectedYear;\n this.selectedMonth = (this.selectedMonth + 1) % 12;\n this.rerenderMonth();\n };\n DefaultCalendar.prototype.rerenderSelectYear = function () {\n var match = /c-(\\d*):c\\+(\\d*)/g.exec(this.options.yearRange);\n var minusYear = 0;\n var plusYear = 1;\n if (match !== null) {\n minusYear = parseInt(match[1]);\n plusYear = parseInt(match[2]);\n }\n this.selectYearElem.innerHTML = '';\n for (var i = 0; i <= minusYear + plusYear; i++) {\n var op = document.createElement(\"option\");\n var year = this.selectedYear - minusYear + i;\n op.value = year.toString();\n op.innerText = year.toString();\n this.selectYearElem.appendChild(op);\n }\n };\n DefaultCalendar.prototype.jump = function (year, month) {\n this.selectedYear = year;\n this.selectedMonth = month;\n this.rerenderMonth();\n };\n DefaultCalendar.prototype.rerenderMonth = function () {\n var _this = this;\n //header text\n this.updateDisplayedDateValue();\n this.rerenderSelectYear();\n var firstDay = (new Date(this.selectedYear, this.selectedMonth)).getDay();\n var daysInMonth = new Date(this.selectedYear, this.selectedMonth + 1, 0).getDate();\n this.calendarBody.innerHTML = \"\";\n this.selectYearElem.value = this.selectedYear.toString();\n this.selectMonthElem.value = this.selectedMonth.toString();\n this.daysOfWeek.forEach(function (day, idx) {\n domel('div', _this.calendarBody)\n .addClass(\"\".concat(_this.cssPrefix, \"-weekday\"))\n .addClass(idx == 0 || idx == 6 ? \"\".concat(_this.cssPrefix, \"-weekend\") : '')\n .text(day);\n });\n // Add empty cells before first day\n for (var i = 0; i < firstDay; i++) {\n domel('div', this.calendarBody)\n .addClass(\"\".concat(this.cssPrefix, \"-day-empty\"));\n }\n // Add all month days\n var today = new Date();\n for (var day = 1; day <= daysInMonth; day++) {\n var builder = domel('div', this.calendarBody)\n .addClass(\"\".concat(this.cssPrefix, \"-day\"))\n .attr('data-date', day.toString())\n .text(day.toString())\n .on('click', function (e) {\n _this.currentDate.setFullYear(_this.selectedYear);\n _this.currentDate.setMonth(_this.selectedMonth);\n _this.currentDate.setDate(parseInt(e.target.getAttribute('data-date')));\n _this.dateChanged(_this.options.oneClickDateSelection);\n });\n if (day === today.getDate() && this.selectedYear === today.getFullYear() && this.selectedMonth === today.getMonth()) {\n builder.addClass(\"\".concat(this.cssPrefix, \"-day-current\"));\n }\n if (day === this.currentDate.getDate() && this.selectedYear === this.currentDate.getFullYear() && this.selectedMonth === this.currentDate.getMonth()) {\n builder.addClass(\"\".concat(this.cssPrefix, \"-day-selected\"));\n }\n var dayOfWeek = (firstDay + day - 1) % 7;\n if (dayOfWeek == 0 || dayOfWeek == 6) {\n builder.addClass(\"\".concat(this.cssPrefix, \"-weekend\"));\n }\n }\n // Add empty cells after last day\n var cellsDrawnInLastRow = (firstDay + daysInMonth) % 7;\n var cellsToDraw = cellsDrawnInLastRow == 0 ? 0 : 7 - cellsDrawnInLastRow;\n for (var i = 0; i < cellsToDraw; i++) {\n domel('div', this.calendarBody)\n .addClass(\"\".concat(this.cssPrefix, \"-day-empty\"));\n }\n };\n DefaultCalendar.prototype.dateChanged = function (apply) {\n _super.prototype.dateChanged.call(this, apply);\n this.rerenderMonth();\n };\n return DefaultCalendar;\n}(Calendar));\nexport { DefaultCalendar };\n//# sourceMappingURL=default_calendar.js.map","var TimePicker = /** @class */ (function () {\n function TimePicker(slot, options) {\n this.slot = slot;\n this.options = options || {};\n }\n Object.defineProperty(TimePicker.prototype, \"cssPrefix\", {\n get: function () {\n return 'kdtp-tp';\n },\n enumerable: false,\n configurable: true\n });\n TimePicker.prototype.setTime = function (time) {\n this.currentTime = new Date(time);\n };\n TimePicker.prototype.getTime = function () {\n return new Date(this.currentTime);\n };\n TimePicker.prototype.timeChanged = function () {\n if (this.options.onTimeChanged) {\n this.options.onTimeChanged(this.currentTime);\n }\n };\n return TimePicker;\n}());\nexport { TimePicker };\n//# sourceMappingURL=time_picker.js.map","var __extends = (this && this.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n if (typeof b !== \"function\" && b !== null)\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nimport { i18n } from '@easydata/core';\nimport { domel } from '../utils/dom_elem_builder';\nimport { TimePicker } from './time_picker';\nvar DefaultTimePicker = /** @class */ (function (_super) {\n __extends(DefaultTimePicker, _super);\n function DefaultTimePicker() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n DefaultTimePicker.prototype.setTime = function (time) {\n _super.prototype.setTime.call(this, time);\n this.updateDisplayedTime();\n this.hoursInput.valueAsNumber = time.getHours();\n this.minutesInput.valueAsNumber = time.getMinutes();\n };\n DefaultTimePicker.prototype.render = function () {\n var _this = this;\n domel('div', this.slot)\n .addClass(\"\".concat(this.cssPrefix, \"-time\"))\n .addChild('span', function (builder) { return _this.timeText = builder.toDOM(); })\n .toDOM();\n var slidersBuilder = domel('div', this.slot)\n .addClass(\"\".concat(this.cssPrefix, \"-sliders\"));\n slidersBuilder\n .addChild('div', function (builder) { return builder\n .addClass(\"\".concat(_this.cssPrefix, \"-time-row\"))\n .title('Hours')\n .addChild('input', function (builder) { return _this.hoursInput = builder\n .addClass(\"\".concat(_this.cssPrefix, \"-input-hours\"))\n .type('range')\n .attr('min', '0')\n .attr('max', '23')\n .attr('step', '1')\n .on('input', function (e) {\n _this.currentTime.setHours(_this.hoursInput.valueAsNumber);\n _this.updateDisplayedTime();\n _this.timeChanged();\n })\n .toDOM(); }); });\n slidersBuilder\n .addChild('div', function (builder) { return builder\n .addClass(\"\".concat(_this.cssPrefix, \"-time-row\"))\n .title('Minutes')\n .addChild('input', function (builder) { return _this.minutesInput = builder\n .addClass(\"\".concat(_this.cssPrefix, \"-input-minutes\"))\n .type('range')\n .attr('min', '0')\n .attr('max', '59')\n .attr('step', '1')\n .on('input', function (e) {\n _this.currentTime.setMinutes(_this.minutesInput.valueAsNumber);\n _this.updateDisplayedTime();\n _this.timeChanged();\n })\n .toDOM(); }); });\n return this.slot;\n };\n DefaultTimePicker.prototype.updateDisplayedTime = function () {\n var locale = i18n.getCurrentLocale();\n var timeToDraw = this.currentTime.toLocaleString(locale == 'en' ? undefined : locale, {\n hour: \"numeric\",\n minute: \"numeric\"\n });\n this.timeText.innerText = timeToDraw;\n };\n return DefaultTimePicker;\n}(TimePicker));\nexport { DefaultTimePicker };\n//# sourceMappingURL=default_time_picker.js.map","var __extends = (this && this.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n if (typeof b !== \"function\" && b !== null)\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nimport { i18n } from '@easydata/core';\nimport { domel } from '../utils/dom_elem_builder';\nimport { DateTimePicker } from './date_time_picker';\nimport { DefaultCalendar } from './default_calendar';\nimport { DefaultTimePicker } from './default_time_picker';\nimport { getElementAbsolutePos } from '../utils/ui-utils';\nvar DefaultDateTimePicker = /** @class */ (function (_super) {\n __extends(DefaultDateTimePicker, _super);\n function DefaultDateTimePicker() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n DefaultDateTimePicker.prototype.render = function () {\n var _this = this;\n var sb = domel('div', document.body)\n .addClass(\"\".concat(this.cssPrefix))\n .attr('tabIndex', '0')\n .setStyle('position', 'absolute')\n .setStyle('top', '-1000px')\n .setStyle('left', '-1000px')\n .on('keydown', function (ev) {\n if (ev.keyCode === 27) { // ESC is pressed\n _this.cancel();\n }\n else if (ev.keyCode === 13) { // Enter is pressed\n _this.apply(_this.getDateTime());\n }\n return false;\n });\n if (this.options.zIndex) {\n sb.setStyle('z-index', \"\".concat(this.options.zIndex));\n }\n this.slot = sb.toDOM();\n _super.prototype.render.call(this);\n this.renderButtons();\n this.globalMouseDownHandler = function (e) {\n var event = window.event || e;\n var o = event.srcElement || event.target;\n var isOutside = !_this.slot.contains(event.target);\n if (isOutside) {\n document.removeEventListener('mousedown', _this.globalMouseDownHandler, true);\n _this.cancel();\n }\n return true;\n };\n };\n DefaultDateTimePicker.prototype.renderButtons = function () {\n var _this = this;\n var builder = domel('div', this.slot)\n .addClass(\"\".concat(this.cssPrefix, \"-buttons\"))\n .addChild('button', function (b) { return _this.nowButton = b\n .addClass(\"\".concat(_this.cssPrefix, \"-button \").concat(_this.cssPrefix, \"-button-now\"))\n .text(i18n.getText('ButtonNow'))\n .on('click', function () {\n _this.setDateTime(new Date());\n _this.dateTimeChanged();\n return false;\n })\n .toDOM(); });\n if (this.options.showTimePicker || !this.options.oneClickDateSelection) {\n builder.addChild('button', function (b) { return _this.submitButton = b\n .addClass(\"\".concat(_this.cssPrefix, \"-button \").concat(_this.cssPrefix, \"-button-apply\"))\n .text(i18n.getText('ButtonApply'))\n .on('click', function () {\n _this.apply(_this.getDateTime());\n return false;\n })\n .toDOM(); });\n }\n builder.addChild('button', function (b) { return _this.submitButton = b\n .addClass(\"\".concat(_this.cssPrefix, \"-button \").concat(_this.cssPrefix, \"-button-cancel\"))\n .text(i18n.getText('ButtonCancel'))\n .on('click', function () {\n _this.cancel();\n return false;\n })\n .toDOM(); });\n };\n DefaultDateTimePicker.prototype.createCalendar = function (options) {\n this.calendarSlot =\n domel('div', this.slot)\n .addClass(\"\".concat(this.cssPrefix, \"-cal\"))\n .toDOM();\n return new DefaultCalendar(this.calendarSlot, options);\n };\n DefaultDateTimePicker.prototype.createTimePicker = function (options) {\n this.timePickerSlot =\n domel('div', this.slot)\n .addClass(\"\".concat(this.cssPrefix, \"-tp\"))\n .toDOM();\n return new DefaultTimePicker(this.timePickerSlot, options);\n };\n DefaultDateTimePicker.prototype.show = function (anchor) {\n var _this = this;\n if (this.options.showDateTimeInput) {\n if (this.options.beforeShow) {\n this.options.beforeShow();\n }\n var anchorPos = getElementAbsolutePos(anchor || document.body);\n var parentPos = getElementAbsolutePos(anchor ? anchor.parentElement || anchor : document.body);\n this.slot.style.top = parentPos.y + 'px';\n this.slot.style.left = anchorPos.x + 'px';\n }\n else {\n _super.prototype.show.call(this, anchor);\n this.slot.focus();\n }\n setTimeout(function () {\n document.addEventListener('mousedown', _this.globalMouseDownHandler, true);\n }, 1);\n };\n return DefaultDateTimePicker;\n}(DateTimePicker));\nexport { DefaultDateTimePicker };\n//# sourceMappingURL=default_date_time_picker.js.map","var __extends = (this && this.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n if (typeof b !== \"function\" && b !== null)\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nimport { i18n, utils, liquid } from '@easydata/core';\nimport { DialogFooterAlignment } from './dialog_service';\nimport { domel } from '../utils/dom_elem_builder';\nvar cssPrefix = \"kdlg\";\nexport var DefaultDialogService = /** @class */ (function () {\n function DefaultDialogService() {\n }\n DefaultDialogService.prototype.openConfirm = function (title, content, callback) {\n var _this = this;\n var template = \"<div id=\\\"\".concat(cssPrefix, \"-dialog-confirm\\\">\").concat(content, \"</div>\");\n var options = {\n title: title,\n closable: false,\n submitable: true,\n cancelable: true,\n body: template\n };\n if (callback) {\n options.onSubmit = function () {\n callback(true);\n };\n options.onCancel = function () {\n callback(false);\n };\n this.open(options);\n return;\n }\n return new Promise(function (resolve) {\n options.onSubmit = function () {\n resolve(true);\n };\n options.onCancel = function () {\n resolve(false);\n };\n _this.open(options);\n });\n };\n DefaultDialogService.prototype.openPrompt = function (title, content, defVal, callback) {\n var _this = this;\n var template = \"<div id=\\\"\".concat(cssPrefix, \"-dialog-form\\\" class=\\\"kfrm-form\\\">\\n <div class=\\\"kfrm-fields label-above\\\">\\n <label for=\\\"\").concat(cssPrefix, \"-dialog-form-input\\\" id=\\\"\").concat(cssPrefix, \"-dialog-form-content\\\">\").concat(content, \"</label>\\n <input type=\\\"text\\\" name=\\\"\").concat(cssPrefix, \"-dialog-form-input\\\" id=\\\"\").concat(cssPrefix, \"-dialog-form-input\\\" />\\n </div>\\n </div>\");\n var options = {\n title: title,\n submitable: true,\n closable: true,\n cancelable: true,\n submitOnEnter: true,\n body: template,\n arrangeParents: false,\n beforeOpen: function () {\n var input = document.getElementById(\"\".concat(cssPrefix, \"-dialog-form-input\"));\n if (defVal) {\n input.value = defVal;\n }\n input.focus();\n }\n };\n var processInput = function (callback) {\n var input = document.getElementById(\"\".concat(cssPrefix, \"-dialog-form-input\"));\n var result = input.value;\n if (result && result.replace(/\\s/g, '').length > 0) {\n callback(result);\n return true;\n }\n input.classList.add('eqjs-invalid');\n return false;\n };\n if (callback) {\n options.onSubmit = function () {\n return processInput(callback);\n };\n options.onCancel = function () {\n callback(\"\");\n };\n this.open(options);\n return;\n }\n return new Promise(function (resolve) {\n options.onSubmit = function () {\n return processInput(resolve);\n };\n options.onCancel = function () {\n resolve(\"\");\n };\n _this.open(options);\n });\n };\n DefaultDialogService.prototype.open = function (options, data) {\n var _this = this;\n var dialog = new DefaultDialog(options, data);\n var onDestroy = options.onDestroy;\n options.onDestroy = function (dlg) {\n _this.untrack(dlg);\n onDestroy && onDestroy(dlg);\n };\n dialog.open();\n this.track(dialog);\n return dialog;\n };\n DefaultDialogService.prototype.createSet = function (options) {\n return new DefaultDialogSet(options, this);\n };\n DefaultDialogService.prototype.untrack = function (dlg) {\n var index = DefaultDialogService.openDialogs.indexOf(dlg);\n if (index >= 0) {\n DefaultDialogService.openDialogs.splice(index, 1);\n }\n };\n DefaultDialogService.prototype.track = function (dlg) {\n DefaultDialogService.openDialogs.push(dlg);\n };\n DefaultDialogService.prototype.openProgress = function (options) {\n var _this = this;\n var dialog = new DefaultProgressDialog(options);\n var onDestroy = options.onDestroy;\n options.onDestroy = function (dlg) {\n _this.untrack(dlg);\n onDestroy && onDestroy(dlg);\n };\n dialog.open();\n this.track(dialog);\n return dialog;\n };\n DefaultDialogService.prototype.getAllDialogs = function () {\n return Array.from(DefaultDialogService.openDialogs);\n };\n DefaultDialogService.prototype.closeAllDialogs = function () {\n for (var _i = 0, _a = Array.from(DefaultDialogService.openDialogs); _i < _a.length; _i++) {\n var dialog = _a[_i];\n dialog.close();\n }\n };\n DefaultDialogService.openDialogs = [];\n return DefaultDialogService;\n}());\nvar DefaultDialog = /** @class */ (function () {\n function DefaultDialog(options, data) {\n var _this = this;\n this.options = options;\n this.submitHandler = function (token) {\n if (_this.options.onSubmit && _this.options.onSubmit(_this, token) === false) {\n return false;\n }\n _this.destroy();\n return true;\n };\n this.cancelHandler = function () {\n if (_this.options.onCancel) {\n _this.options.onCancel(_this);\n }\n _this.destroy();\n };\n this.keydownHandler = function (ev) {\n if (ev.keyCode == 13 && _this.isActiveDialog()) {\n ev.preventDefault();\n ev.stopPropagation();\n if (_this.submitHandler()) {\n window.removeEventListener('keydown', _this.keydownHandler, false);\n return false;\n }\n }\n return true;\n };\n this.dialogId = utils.generateId('dlg');\n this.data = data;\n this.slot =\n domel('div', document.body)\n .attr('tab-index', '-1')\n .data('dialog-id', this.dialogId)\n .addClass(\"\".concat(cssPrefix, \"-modal\"), 'is-active')\n .focus()\n .addChild('div', function (b) { return b\n .addClass('kdlg-modal-background'); })\n .addChild('div', function (b) { return _this.windowElement = b\n .addClass(\"\".concat(cssPrefix, \"-modal-window\"))\n .addChild('header', function (b) {\n _this.headerElement = b\n .addClass(\"\".concat(cssPrefix, \"-header\"))\n .addChild('p', function (b) { return b\n .addClass(\"\".concat(cssPrefix, \"-header-title\"))\n .addText(options.title); })\n .toDOM();\n if (options.closable !== false)\n b.addChild('button', function (b) { return b\n .addClass(\"\".concat(cssPrefix, \"-modal-close\"))\n .on('click', function () {\n _this.cancelHandler();\n })\n .focus(); });\n })\n .addChild('div', function (b) {\n b.addClass(\"\".concat(cssPrefix, \"-alert-container\"));\n _this.alertElement = b.toDOM();\n })\n .addChild('section', function (b) {\n _this.bodyElement = b\n .addClass(\"\".concat(cssPrefix, \"-body\"))\n .toDOM();\n if (typeof options.body === 'string') {\n var html = liquid.renderLiquidTemplate(options.body, data);\n b.addHtml(html);\n }\n else {\n b.addChildElement(options.body);\n }\n })\n .addChild('footer', function (b) {\n var alignClass = null;\n if (options.footerAlignment && options.footerAlignment == DialogFooterAlignment.Center) {\n alignClass = 'align-center';\n }\n else {\n alignClass = 'align-right';\n }\n _this.footerElement = b\n .addClass(\"\".concat(cssPrefix, \"-footer\"))\n .toDOM();\n b.addClass(alignClass);\n if (options.submitable === false)\n return;\n b.addChild('button', function (bb) {\n bb.id(_this.dialogId + '-btn-submit')\n .addClass('kfrm-button', 'is-info')\n .addText(options.submitButtonText || i18n.getText('ButtonOK'));\n if (options.recaptchaSiteKey) {\n bb.data('sitekey', options.recaptchaSiteKey);\n bb.addClass('g-recaptcha');\n bb.on('click', function (e) {\n if (grecaptcha) {\n grecaptcha.ready(function () {\n grecaptcha.execute(options.recaptchaSiteKey, { action: 'submit' })\n .then(function (token) {\n _this.submitHandler(token);\n });\n });\n }\n else {\n _this.submitHandler();\n }\n });\n }\n else {\n bb.on('click', function (e) {\n _this.submitHandler();\n });\n }\n bb.focus();\n });\n if (options.cancelable !== false)\n b.addChild('button', function (bb) { return bb\n .id(_this.dialogId + '-btn-cancel')\n .addClass('kfrm-button')\n .addText(options.cancelButtonText || i18n.getText('ButtonCancel'))\n .on('click', function (e) {\n _this.cancelHandler();\n }); });\n })\n .toDOM(); })\n .toDOM();\n }\n DefaultDialog.prototype.getData = function () {\n return this.data;\n };\n DefaultDialog.prototype.getRootElement = function () {\n return this.slot;\n };\n DefaultDialog.prototype.getSubmitButtonElement = function () {\n return document.getElementById(this.dialogId + '-btn-submit');\n };\n DefaultDialog.prototype.getCancelButtonElement = function () {\n return document.getElementById(this.dialogId + '-btn-cancel');\n };\n DefaultDialog.prototype.open = function () {\n var _this = this;\n if (this.options.beforeOpen) {\n this.options.beforeOpen(this);\n }\n domel(this.slot).show();\n if (this.options.arrangeParents) {\n this.arrangeParents(true);\n }\n var windowDiv = this.slot\n .querySelector(\".\".concat(cssPrefix, \"-modal-window\"));\n if (this.options.height) {\n windowDiv.style.height = typeof this.options.height === 'string'\n ? this.options.height\n : \"\".concat(this.options.height, \"px\");\n }\n if (this.options.width) {\n windowDiv.style.width = typeof this.options.width === 'string'\n ? this.options.width\n : \"\".concat(this.options.width, \"px\");\n }\n if (this.options.submitOnEnter) {\n window.addEventListener('keydown', this.keydownHandler, false);\n }\n //clear alert on change in any input element \n this.slot.querySelectorAll('input')\n .forEach(function (element) {\n return element.addEventListener('input', function () {\n _this.clearAlert();\n if (_this.options.onInput) {\n _this.options.onInput(_this);\n }\n });\n });\n if (this.options.onShow) {\n this.options.onShow(this);\n }\n };\n DefaultDialog.prototype.submit = function () {\n this.submitHandler();\n };\n DefaultDialog.prototype.cancel = function () {\n this.cancelHandler();\n };\n DefaultDialog.prototype.close = function () {\n this.destroy();\n };\n DefaultDialog.prototype.disableButtons = function () {\n var buttons = this.slot.querySelectorAll('button');\n buttons.forEach(function (button) { return button.disabled = true; });\n };\n DefaultDialog.prototype.enableButtons = function () {\n var buttons = this.slot.querySelectorAll('button');\n buttons.forEach(function (button) { return button.disabled = false; });\n };\n DefaultDialog.prototype.showAlert = function (text, reason, replace) {\n var alert = domel('div')\n .addClass(\"\".concat(cssPrefix, \"-alert \").concat(reason || ''))\n .addChild('span', function (b) { return b\n .addClass(\"\".concat(cssPrefix, \"-alert-closebtn\"))\n .text('×')\n .on('click', function (ev) {\n var alert = ev.target.parentElement;\n alert.parentElement.removeChild(alert);\n }); })\n .addText(text)\n .toDOM();\n if (replace === true) {\n this.clearAlert();\n }\n this.alertElement.appendChild(alert);\n };\n DefaultDialog.prototype.clearAlert = function () {\n this.alertElement.innerHTML = '';\n };\n DefaultDialog.prototype.destroy = function () {\n var elem = document.querySelectorAll(\"[data-dialog-id=\\\"\".concat(this.dialogId, \"\\\"]\"));\n if (elem.length <= 0)\n return;\n if (this.options.arrangeParents) {\n this.arrangeParents(false);\n }\n document.body.removeChild(this.slot);\n if (this.options.submitOnEnter) {\n window.removeEventListener('keydown', this.keydownHandler, false);\n }\n if (this.options.onDestroy) {\n this.options.onDestroy(this);\n }\n };\n DefaultDialog.prototype.isActiveDialog = function () {\n var windowDivs = document.documentElement.querySelectorAll('.kdlg-modal');\n return windowDivs[windowDivs.length - 1] === this.slot;\n };\n DefaultDialog.prototype.arrangeParents = function (turnOn) {\n var windowDivs = document.documentElement.querySelectorAll('.kdlg-modal-window');\n for (var i = 0; i < windowDivs.length - 1; i++) {\n if (turnOn) {\n var offset = i == 0 ? 20 : i * 40 + 20;\n domel(windowDivs[i])\n .setStyle('margin-top', \"\".concat(offset, \"px\"))\n .setStyle('margin-left', \"\".concat(offset, \"px\"));\n }\n else {\n domel(windowDivs[i])\n .removeStyle('margin-top')\n .removeStyle('margin-left');\n }\n }\n };\n return DefaultDialog;\n}());\nexport { DefaultDialog };\nvar DefaultProgressDialog = /** @class */ (function (_super) {\n __extends(DefaultProgressDialog, _super);\n function DefaultProgressDialog(options, data) {\n var _this = this;\n var contentElement;\n var progressElement;\n var body = domel('div')\n .addChild('div', function (b) { return contentElement = b\n .text(options.content || '')\n .toDOM(); })\n .addChild('div', function (b) {\n b\n .addClass(\"\".concat(cssPrefix, \"-progress-line\"))\n .addChild('div', function (b) {\n progressElement = b\n .addClass('fill')\n .toDOM();\n if (options.determinated) {\n b.setStyle('width', '0%');\n }\n else {\n b.addClass('indeterminate');\n }\n });\n })\n .toDOM();\n _this = _super.call(this, {\n title: options.title,\n body: body,\n beforeOpen: options.beforeOpen,\n onSubmit: options.onSubmit,\n width: options.width,\n height: options.height,\n submitable: false,\n cancelable: false,\n closable: false,\n onDestroy: options.onDestroy\n }, data) || this;\n _this.contentElement = contentElement;\n _this.progressElement = progressElement;\n return _this;\n }\n DefaultProgressDialog.prototype.updateContent = function (content) {\n this.contentElement.innerText = content;\n };\n DefaultProgressDialog.prototype.updateProgress = function (progress) {\n var _this = this;\n progress = this.in01(progress);\n this.progressElement.style.width = \"\".concat(progress * 100, \"%\");\n if (progress === 1) {\n // postpone for 0.5s for smooth closing\n setTimeout(function () {\n _this.submit();\n }, 500);\n }\n };\n DefaultProgressDialog.prototype.in01 = function (num) {\n if (num > 1)\n return 1;\n if (num < 0)\n return 0;\n return num;\n };\n return DefaultProgressDialog;\n}(DefaultDialog));\nexport { DefaultProgressDialog };\nvar DefaultDialogSet = /** @class */ (function () {\n function DefaultDialogSet(options, dialogService) {\n this.options = options;\n this.dialogService = dialogService;\n this.currentDialog = null;\n this.currentIndex = 0;\n this.options = options;\n this.dialogService = dialogService;\n }\n DefaultDialogSet.prototype.getCurrent = function () {\n return this.currentDialog;\n };\n DefaultDialogSet.prototype.openNext = function (data) {\n return this.open(this.currentIndex + 1, data);\n };\n DefaultDialogSet.prototype.openPrev = function (data) {\n return this.open(this.currentIndex - 1, data);\n };\n DefaultDialogSet.prototype.open = function (page, data) {\n if (page < 0) {\n this.currentIndex = 0;\n }\n else if (page >= this.options.length) {\n this.currentIndex = this.options.length - 1;\n }\n else {\n this.currentIndex = page;\n }\n if (this.currentDialog) {\n try {\n this.currentDialog.close();\n }\n catch (e) { }\n }\n var dlgOptions = this.options[this.currentIndex];\n this.currentDialog = this.dialogService.open(dlgOptions, data);\n return this.currentDialog;\n };\n DefaultDialogSet.prototype.close = function () {\n if (this.currentDialog) {\n this.currentDialog.close();\n this.currentDialog = null;\n }\n };\n return DefaultDialogSet;\n}());\nexport { DefaultDialogSet };\n//# sourceMappingURL=default_dialog_service.js.map","import { i18n } from '@easydata/core';\nfunction addEasyDataUITexts() {\n i18n.updateDefaultTexts({\n GridPageInfo: '{FirstPageRecordNum} - {LastPageRecordNum} of {Total} records',\n GridItemsPerPage: 'items per page',\n ButtonOK: \"OK\",\n ButtonCancel: \"Cancel\",\n ButtonApply: 'Apply',\n ButtonNow: 'Now',\n LblTotal: 'Total'\n });\n}\naddEasyDataUITexts();\n//# sourceMappingURL=text_resources.js.map","// grid\nexport * from './grid/easy_grid';\nexport * from './grid/easy_grid_events';\nexport * from './grid/easy_grid_options';\nexport * from './grid/easy_grid_columns';\nexport * from './grid/easy_grid_cell_renderer';\n//datetimepicker\nexport * from './datetimepicker/calendar';\nexport * from './datetimepicker/date_time_picker';\nexport * from './datetimepicker/date_time_picker_options';\nexport * from './datetimepicker/default_calendar';\nexport * from './datetimepicker/default_date_time_picker';\nexport * from './datetimepicker/default_time_picker';\nexport * from './datetimepicker/time_picker';\n// utils\nexport * from './utils/browser_utils';\nexport * from './utils/dom_elem_builder';\nexport * from './utils/drag_manager';\nexport * from './utils/mask';\nexport * from './utils/ui-utils';\n//dialogs\nexport * from './dialogs/default_dialog_service';\nexport * from './dialogs/dialog_service';\nimport './i18n/text_resources';\nimport { DefaultDialogService } from './dialogs/default_dialog_service';\n// export dialogs to use outside of context as global\nvar dialogs = new DefaultDialogService();\nexport { dialogs };\n//# sourceMappingURL=public_api.js.map","export var browserUtils;\n(function (browserUtils) {\n var _isFirefox = null;\n var _isIE = null;\n function IsIE() {\n // return eval('/*@cc_on!@*/false || !!document.documentMode');\n if (_isIE === null) {\n var ua = navigator.userAgent;\n /* MSIE used to detect old browsers and Trident used to newer ones*/\n _isIE = ua.indexOf(\"MSIE \") > -1 || ua.indexOf(\"Trident/\") > -1;\n }\n return _isIE;\n }\n browserUtils.IsIE = IsIE;\n function IsEdge() {\n return !IsIE() && eval('!!window.StyleMedia');\n }\n browserUtils.IsEdge = IsEdge;\n function IsFirefox() {\n if (_isFirefox === null) {\n var ua = navigator.userAgent;\n _isFirefox = ua.toLowerCase().indexOf('firefox') > -1;\n }\n return _isFirefox;\n }\n browserUtils.IsFirefox = IsFirefox;\n var _detectedIsMobileMode = false;\n var _isMobileMode = undefined;\n var detectIsMobileMode = function () {\n var oldValue = isMobileMode();\n _detectedIsMobileMode = window.matchMedia('only screen and (max-width: 840px)').matches\n || window.matchMedia('only screen and (max-height: 420px)').matches;\n var newValue = isMobileMode();\n if (newValue !== oldValue && mobileModeChangeHandler) {\n mobileModeChangeHandler(newValue);\n }\n };\n detectIsMobileMode();\n window.addEventListener('resize', function () { return detectIsMobileMode(); });\n function isMobileMode() {\n if (_isMobileMode !== undefined) {\n return _isMobileMode;\n }\n else {\n return _detectedIsMobileMode;\n }\n }\n browserUtils.isMobileMode = isMobileMode;\n function setIsMobileMode(value) {\n var oldValue = isMobileMode();\n _isMobileMode = value;\n var newValue = isMobileMode();\n if (newValue !== oldValue && mobileModeChangeHandler) {\n mobileModeChangeHandler(newValue);\n }\n }\n browserUtils.setIsMobileMode = setIsMobileMode;\n var mobileModeChangeHandler;\n function onMobileModeChanged(callback) {\n mobileModeChangeHandler = callback;\n }\n browserUtils.onMobileModeChanged = onMobileModeChanged;\n function getMobileCssClass() {\n return isMobileMode() ? 'k-mobile' : null;\n }\n browserUtils.getMobileCssClass = getMobileCssClass;\n})(browserUtils || (browserUtils = {}));\n//# sourceMappingURL=browser_utils.js.map","module.exports = __WEBPACK_EXTERNAL_MODULE__388__;","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// define getter functions for harmony exports\n__webpack_require__.d = function(exports, definition) {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); }","// define __esModule on exports\n__webpack_require__.r = function(exports) {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","import { \r\n SortDirection, \r\n QueryColumn, QueryChangeAction, \r\n i18n\r\n} from '@easyquery/core';\r\n\r\nimport { \r\n eqDragManager, DropEffect, \r\n createBrowserEvent, domel \r\n} from '@easydata/ui';\r\n\r\nimport { eqCssPrefix } from '../../../utils/utils';\r\nimport { MenuItem, PopupMenu } from '../../../utils/popup_menu';\r\nimport { ColumnsPanel } from '../../columns_panel';\r\nimport { browserUtils } from '../../../utils/browser_utils';\r\nimport { safeFocus } from '../../../utils/utils';\r\n\r\nexport enum ColumnAction {\r\n Enable = 0,\r\n Delete = 1,\r\n Hidden = 2,\r\n SortingNone = 3,\r\n SortingAsc = 4,\r\n SortingDesc = 5,\r\n MoveTop = 6,\r\n MoveUp = 7,\r\n MoveDown = 8,\r\n MoveBottom = 9,\r\n Menu = 10,\r\n Type = 11,\r\n Format = 12\r\n}\r\n\r\nexport abstract class ColumnRendererCP {\r\n\r\n protected column: QueryColumn;\r\n protected panel: ColumnsPanel;\r\n protected functionMenu: PopupMenu = null;\r\n protected formatsMenu: PopupMenu = null;\r\n protected buttonMenu: PopupMenu = null;\r\n\r\n protected element: HTMLDivElement;\r\n\r\n private sortingButton: HTMLDivElement;\r\n\r\n protected isMouseOverBlock = false;\r\n \r\n protected keepShowingButtons = false;\r\n\r\n constructor(panel: ColumnsPanel, column: QueryColumn, slot?: HTMLDivElement) {\r\n this.panel = panel;\r\n this.column = column;\r\n this.element = slot;\r\n }\r\n\r\n protected get cssPrefix(): string {\r\n return 'eqjs-qc';\r\n }\r\n\r\n protected get columnEnabled(): boolean {\r\n return this.column.enabled;\r\n }\r\n\r\n protected set columnEnabled(value: boolean) {\r\n this.column.enabled = value;\r\n }\r\n\r\n public render(): HTMLDivElement { \r\n if (this.getButtonsToShow().indexOf(\"sorting\") >= 0 && this.columnEnabled) {\r\n this.sortingButton = this.renderSoringButton(this.column.sorting);\r\n if (this.column.sorting !== SortDirection.None) {\r\n this.sortingButton.style.display = 'block' \r\n }\r\n }\r\n \r\n const builder = domel('div');\r\n builder.data('id', this.column.id);\r\n\r\n if (this.element) {\r\n this.element.parentNode\r\n .replaceChild(builder.toDOM(), this.element);\r\n }\r\n \r\n this.element = builder.toDOM();\r\n \r\n if (this.panel.options.allowDragDrop && !browserUtils.isMobileMode()) { \r\n eqDragManager.registerDraggableItem({\r\n element: this.element,\r\n scope: \"entityAttrSort\",\r\n data: { column: this.column },\r\n beforeDragStart: () => {\r\n this.hideButtons();\r\n },\r\n renderer: (dragImage) => {\r\n dragImage.innerHTML = '';\r\n\r\n const attrLabel = document.createElement('span');\r\n attrLabel.innerText = this.column.caption;\r\n dragImage.classList.add('eqjs-sortable-helper');\r\n \r\n dragImage.appendChild(attrLabel);\r\n },\r\n onDragStart: (ev) => {\r\n this.element.style.display = 'none';\r\n ev.dropEffect = DropEffect.Allow;\r\n },\r\n onDragEnd: (ev) => {\r\n if (!ev.data.finishedSuccessfully) {\r\n this.element.style.removeProperty('display');\r\n } \r\n }\r\n });\r\n }\r\n\r\n if (this.isEditable()) {\r\n this.createFunctionMenu();\r\n this.createFormatsMenu();\r\n }\r\n this.createButtonMenu();\r\n\r\n builder\r\n .addClass(this.getClassesToAdd())\r\n .addClass(browserUtils.getMobileCssClass())\r\n .addChildElement(this.renderCheckbox())\r\n //start sort button\r\n .addChild('div', builder => builder\r\n .addClass(`${eqCssPrefix}-button-placeholder`, `${this.cssPrefix}-button-placeholder`, `${this.cssPrefix}-colelement`, \r\n `${this.cssPrefix}-sortbutton-placeholder`)\r\n .addChildElement(this.sortingButton)\r\n )\r\n // end sort button\r\n\r\n \r\n .addChildElement(this.renderExpressionBlock())\r\n\r\n if (this.panel.options.showColumnTitles !== false && !browserUtils.isMobileMode()) {\r\n builder\r\n .addChildElement(this.renderCaptionBlock())\r\n }\r\n\r\n builder\r\n //start buttons\r\n .addChild('div', builder => {\r\n builder\r\n .addClass(`${eqCssPrefix}-column-buttonsBlock`, `${this.cssPrefix}-buttonsBlock`)\r\n .addClass(browserUtils.getMobileCssClass());\r\n\r\n\r\n //start enable button\r\n if (this.getButtonsToShow().indexOf(\"enable\") >= 0 && !this.column.isReadOnly()) {\r\n builder.addChildElement(this.renderEnabledButton())\r\n }\r\n //end enable button\r\n\r\n //start aggr func button\r\n if (this.getButtonsToShow().indexOf(\"type\") >= 0 && this.columnEnabled) {\r\n builder.addChildElement(this.renderColumnTypeButton())\r\n }\r\n //end aggr func button\r\n\r\n //start format selector button\r\n if (this.getButtonsToShow().indexOf(\"format\") >= 0 && this.columnEnabled ) {\r\n builder.addChildElement(this.renderColumnFormatButton())\r\n }\r\n //end format selector button\r\n\r\n //start delete button\r\n if (this.getButtonsToShow().indexOf(\"delete\") >= 0 && !this.column.isReadOnly()) {\r\n builder.addChildElement(this.renderDeleteButton())\r\n }\r\n //end delete button\r\n\r\n //start menu button\r\n if (this.getButtonsToShow().indexOf(\"menu\") >= 0 && !this.column.isReadOnly()) {\r\n builder.addChildElement(this.renderMenuButton())\r\n }\r\n //end menu button\r\n })\r\n //end buttons \r\n\r\n if (!browserUtils.isMobileMode()) {\r\n //start event listeners\r\n builder\r\n .on('mouseenter', this.onMouseEnter.bind(this))\r\n .on('mouseleave', this.onMouseLeave.bind(this))\r\n //end event listeners\r\n }\r\n\r\n if (this.panel.options.accentActiveColumn || browserUtils.isMobileMode()) {\r\n builder\r\n .on('click', this.onMouseClick.bind(this)); //touchstart\r\n }\r\n\r\n if (this.panel.options.alwaysShowButtons) {\r\n this.showButtons();\r\n }\r\n\r\n \r\n return this.element;\r\n }\r\n\r\n private onMouseClick(ev: Event) {\r\n ev.stopPropagation();\r\n this.panel.toggleColumnPicked(this.column);\r\n this.adjustButtonsVisibility();\r\n if (!browserUtils.isMobileMode()) {\r\n this.element.dispatchEvent(createBrowserEvent(\"mouseenter\"));\r\n }\r\n\r\n return false;\r\n }\r\n\r\n public fireColumnChanged() {\r\n this.column.fireChangedEvent();\r\n }\r\n\r\n public refresh() {\r\n this.render();\r\n }\r\n\r\n protected abstract renderExpressionBlock(): HTMLDivElement;\r\n\r\n protected renderCaptionBlock(): HTMLDivElement {\r\n const builder = domel('div')\r\n .addClass(`${this.cssPrefix}-colelement`, `${this.cssPrefix}-captionelement`)\r\n .addClass(browserUtils.getMobileCssClass());\r\n\r\n if (this.isEditable()) {\r\n builder\r\n .addChild('a', builder => builder\r\n .attr('href', 'javascript:void(0)')\r\n .title(this.column.caption)\r\n .text(this.column.caption)\r\n .on('click', (ev) => { //touchstart \r\n ev.stopPropagation();\r\n\r\n const element = ev.target as HTMLElement;\r\n const inputEl = element.parentElement.querySelector('input') as HTMLInputElement;\r\n if (inputEl) {\r\n element.style.display = 'none';\r\n inputEl.style.removeProperty('display');\r\n inputEl.style.minWidth = `${element.clientWidth}`;\r\n inputEl.focus();\r\n this.element.setAttribute(eqDragManager.DRAG_DISABLED_ATTR, '');\r\n }\r\n\r\n return false;\r\n }) //TO DO:add localization and input field\r\n )\r\n .addChild('input', builder => builder\r\n .hide()\r\n .value(this.column.caption)\r\n .on('blur keydown', (ev) => { \r\n \r\n let isEndEvent = false;\r\n let save = true;\r\n\r\n if (ev instanceof KeyboardEvent) {\r\n // Enter\r\n if (ev.keyCode === 13) {\r\n isEndEvent = true;\r\n //ESC\r\n } else if (ev.keyCode === 27) {\r\n isEndEvent = true;\r\n save = false;\r\n }\r\n\r\n } else if (ev instanceof FocusEvent) {\r\n isEndEvent = true;\r\n }\r\n\r\n if (isEndEvent) {\r\n\r\n const inputEl = (ev.target as HTMLInputElement);\r\n const aEl = inputEl.parentElement.querySelector('a') as HTMLAnchorElement;\r\n if (aEl) {\r\n aEl.style.removeProperty('display');\r\n inputEl.style.display = 'none';\r\n }\r\n if (save && this.column.caption !== inputEl.value) {\r\n this.column.caption = inputEl.value;\r\n\r\n this.fireColumnChanged();\r\n } else {\r\n inputEl.value = this.column.caption;\r\n safeFocus(aEl);\r\n }\r\n\r\n this.element.removeAttribute(eqDragManager.DRAG_DISABLED_ATTR);\r\n }\r\n\r\n return true;\r\n \r\n })\r\n );\r\n } else {\r\n builder.addChild('span', b => {\r\n b.text(this.column.caption)\r\n .title(this.column.caption)\r\n });\r\n }\r\n\r\n return builder.toDOM();\r\n }\r\n\r\n protected renderSoringButton(sorting: SortDirection): HTMLDivElement {\r\n const sortButtonCssClass = `${eqCssPrefix}-column-sortbutton`;\r\n let sortButtonDirectionCssClass;\r\n switch (sorting) {\r\n case SortDirection.Ascending:\r\n sortButtonDirectionCssClass = `${sortButtonCssClass}-asc`;\r\n break;\r\n case SortDirection.Descending:\r\n sortButtonDirectionCssClass = `${sortButtonCssClass}-desc`;\r\n break;\r\n default:\r\n sortButtonDirectionCssClass = `${sortButtonCssClass}-none`;\r\n break;\r\n }\r\n\r\n if (!this.isEditable()) {\r\n if (sorting === SortDirection.Ascending \r\n || sorting === SortDirection.Descending)\r\n return domel('div')\r\n .addClass(sortButtonCssClass, `${eqCssPrefix}-button`, \r\n sortButtonDirectionCssClass)\r\n .title(i18n.getText('ButtonSorting'))\r\n .toDOM();\r\n\r\n return null;\r\n }\r\n \r\n return domel('div')\r\n .addClass(sortButtonCssClass, `${eqCssPrefix}-button`, sortButtonDirectionCssClass)\r\n .data(\"btnplaceholder\", \"\")\r\n .title(i18n.getText('ButtonSorting'))\r\n .attr('tabIndex', '0')\r\n .on('click', (ev) => { //touchstart\r\n \r\n ev.stopPropagation();\r\n\r\n this.keepShowingButtons = true;\r\n const menu = this.getUIS() ? this.panel.sortMenu || this.panel.moveMenu : this.panel.moveMenu;\r\n menu.showMenu({\r\n anchor: this.sortingButton,\r\n selectedIds: this.column.isHidden() ? ['IsHidden'] : null,\r\n itemSelectedCallback: (data, items) => {\r\n\r\n let action: ColumnAction;\r\n switch(data.id) {\r\n case \"IsHidden\":\r\n action = ColumnAction.Hidden;\r\n break;\r\n case \"MoveTop\":\r\n action = ColumnAction.MoveTop;\r\n break;\r\n case \"MoveDown\":\r\n action = ColumnAction.MoveDown;\r\n break;\r\n case \"MoveUp\":\r\n action = ColumnAction.MoveUp;\r\n break;\r\n case \"MoveBottom\":\r\n action = ColumnAction.MoveBottom;\r\n break;\r\n case \"None\":\r\n action = ColumnAction.SortingNone;\r\n break;\r\n case \"Ascending\":\r\n action = ColumnAction.SortingAsc;\r\n break;\r\n case \"Descending\":\r\n action = ColumnAction.SortingDesc;\r\n break;\r\n }\r\n \r\n this.buttonMenuHandler(action, null);\r\n },\r\n menuClosedCallback: () => { //called when menu is closed\r\n this.keepShowingButtons = false;\r\n if (!this.isMouseOverBlock) {\r\n this.leaveButtonBlock();\r\n }\r\n }\r\n });\r\n })\r\n .on('keypress', evt => { if ((evt as KeyboardEvent).keyCode == 13) { (evt.target as HTMLElement).click()}})\r\n .toDOM();\r\n }\r\n\r\n protected renderCheckbox(): HTMLElement {\r\n if (this.panel.options.showCheckboxes && !this.column.isReadOnly()) {\r\n return domel(\"div\")\r\n .title(i18n.getText('CmdToggleEnable'))\r\n .attr('tabIndex', '0')\r\n .addClass(`${this.cssPrefix}-colelement ${this.cssPrefix}-column-checkbox`)\r\n .addClass(`${ this.columnEnabled ? 'enabled' : '' }`)\r\n .on('click', () => {\r\n this.columnEnabled = !this.columnEnabled;\r\n this.column.fireChangedEvent();\r\n return false;\r\n })\r\n .on('keypress', evt => { if ([13, 32].includes((evt as KeyboardEvent).keyCode) ) { (evt.target as HTMLElement).click()}})\r\n .toDOM();\r\n }\r\n else {\r\n return null;\r\n }\r\n }\r\n\r\n protected renderDeleteButton(): HTMLDivElement {\r\n return domel('div')\r\n .addClass(`${eqCssPrefix}-button-placeholder`,`${this.cssPrefix}-button-placeholder`, \r\n `${this.cssPrefix}-deletebutton-placeholder`)\r\n .data(\"btnplaceholder\", \"\")\r\n .addChild('div', b => b\r\n .addClass(`${eqCssPrefix}-button`, `${eqCssPrefix}-column-button`, \r\n `${eqCssPrefix}-column-button-delete`)\r\n .title(i18n.getText('CmdDelete'))\r\n .attr('tabIndex', '0')\r\n .on('click', ev => this.buttonMenuHandler(ColumnAction.Delete, ev)) //touchstart\r\n .on('keypress', evt => { if ((evt as KeyboardEvent).keyCode == 13) { (evt.target as HTMLElement).click()}})\r\n )\r\n .toDOM()\r\n }\r\n\r\n protected renderMenuButton(): HTMLDivElement {\r\n return domel('div')\r\n .addClass(`${eqCssPrefix}-button-placeholder`,`${this.cssPrefix}-button-placeholder`, \r\n `${this.cssPrefix}-menubutton-placeholder`)\r\n .data(\"btnplaceholder\", \"\")\r\n .addChild('div', b => b\r\n .addClass(`${eqCssPrefix}-button`, `${eqCssPrefix}-column-button`, \r\n `${eqCssPrefix}-column-button-menu`)\r\n .title(i18n.getText('ButtonMenu'))\r\n .attr('tabIndex', '0')\r\n .on('click', evt => this.buttonMenuHandler(ColumnAction.Menu, evt)) //touchstart \r\n .on('keypress', evt => { if ((evt as KeyboardEvent).keyCode == 13) { (evt.target as HTMLElement).click()}})\r\n )\r\n .toDOM()\r\n }\r\n\r\n protected getClassesToAdd(): string {\r\n let result = \"\";\r\n\r\n result += this.columnEnabled ? '' : ` ${this.cssPrefix}-disabled`;\r\n if (this.columnEnabled) {\r\n result += this.column.isReadOnly() ? ` ${this.cssPrefix}-readonly` : '';\r\n }\r\n\r\n result += this.column.isHidden() ? ` ${this.cssPrefix}-hidden` : '';\r\n\r\n return result;\r\n }\r\n\r\n protected renderColumnTypeButton(): HTMLDivElement {\r\n return (this.isEditable() && this.panel.options.allowAggrColumns !== false)\r\n ? domel('div')\r\n .addClass(`${eqCssPrefix}-button-placeholder`, `${this.cssPrefix}-button-placeholder`,\r\n `${this.cssPrefix}-typebutton-placeholder`,`${this.cssPrefix}-button-active`)\r\n .data(\"btnplaceholder\", \"\")\r\n .addChild('div', b => b\r\n .addClass(`${eqCssPrefix}-button`, `${eqCssPrefix}-column-button`, \r\n `${eqCssPrefix}-column-button-type`)\r\n .title(i18n.getText('ButtonToAggr'))\r\n .attr('tabIndex', '0')\r\n .on('click', (ev) => { //touchstart \r\n ev.stopPropagation();\r\n\r\n this.keepShowingButtons = true;\r\n this.changeTypeHandler(ev); \r\n }) \r\n .on('keypress', evt => { if ((evt as KeyboardEvent).keyCode == 13) { (evt.target as HTMLElement).click()}})\r\n )\r\n .toDOM() \r\n : null;\r\n }\r\n\r\n\r\n protected renderColumnFormatButton(): HTMLDivElement {\r\n const formatItems = this.getFormatsMenuItems();\r\n return (this.isEditable() && this.panel.options.allowDisplayFormatChange !== false && formatItems.length > 1)\r\n ? domel('div')\r\n .addClass(`${eqCssPrefix}-button-placeholder`, `${this.cssPrefix}-button-placeholder`,\r\n `${this.cssPrefix}-formatbutton-placeholder`, `${this.cssPrefix}-button-active`)\r\n .data(\"btnplaceholder\", \"\")\r\n .addChild('div', b => b\r\n .addClass(`${eqCssPrefix}-button`, `${eqCssPrefix}-column-button`,\r\n `${eqCssPrefix}-column-button-format`)\r\n .title(i18n.getText('ButtonFormat'))\r\n .attr('tabIndex', '0')\r\n .on('click', (ev) => { //touchstart \r\n ev.stopPropagation();\r\n\r\n this.keepShowingButtons = true;\r\n this.changeFormatHandler(ev);\r\n\r\n })\r\n .on('keypress', evt => { if ((evt as KeyboardEvent).keyCode == 13) { (evt.target as HTMLElement).click() } })\r\n )\r\n .toDOM()\r\n : null;\r\n }\r\n\r\n\r\n protected renderEnabledButton(): HTMLDivElement {\r\n return domel('div')\r\n .addClass(`${eqCssPrefix}-button-placeholder`, `${this.cssPrefix}-button-placeholder`,\r\n `${this.cssPrefix}-enablebutton-placeholder`,`${this.cssPrefix}-button-active`)\r\n .data(\"btnplaceholder\", \"\")\r\n .addChild('div', b => b\r\n .addClass(`${eqCssPrefix}-button`, `${eqCssPrefix}-column-button`, `${eqCssPrefix}-column-button-enable`)\r\n .title(i18n.getText('CmdToggleEnable'))\r\n .addClass(this.columnEnabled ? 'enabled' : '')\r\n .attr('tabIndex', '0')\r\n .on('click',evt => this.buttonMenuHandler(ColumnAction.Enable, evt)) //touchstart\r\n .on('keypress', evt => { if ((evt as KeyboardEvent).keyCode == 13) { (evt.target as HTMLElement).click()}})\r\n ).toDOM()\r\n }\r\n\r\n\r\n protected isEditable(): boolean {\r\n return this.columnEnabled && !this.column.isReadOnly();\r\n }\r\n\r\n protected abstract changeTypeHandler(ev: Event);\r\n\r\n protected changeFormatHandler(ev: Event) {\r\n const formats = this.panel\r\n .getContext()\r\n .getModel()\r\n .getDisplayFormatsForType(this.column.getDataType());\r\n\r\n let itemId = '{0:__default}';\r\n if (formats.filter(f => f.format == this.column.displayFormat).length > 0) {\r\n itemId = this.column.displayFormat;\r\n }\r\n\r\n this.formatsMenu.showMenu({\r\n anchor: ev.target as HTMLElement,\r\n selectedIds: itemId,\r\n itemSelectedCallback: (data, items) => {\r\n if (data.id != itemId) {\r\n if (data.id == '{0:__default}') {\r\n this.column.displayFormat = '';\r\n }\r\n else {\r\n this.column.displayFormat = data.id;\r\n }\r\n\r\n this.column.fireChangedEvent();\r\n }\r\n\r\n return false;\r\n },\r\n menuClosedCallback: () => { //called when menu is closed\r\n this.keepShowingButtons = false;\r\n if (!this.isMouseOverBlock) {\r\n this.element.dispatchEvent(createBrowserEvent('mouseleave'));\r\n }\r\n }\r\n });\r\n }\r\n\r\n protected getUIS() {\r\n return this.panel\r\n .getContext().getModel()\r\n .checkAttrProperty(this.column.expr.value, \"useInSorting\");\r\n }\r\n\r\n private onMouseEnter(e: Event) {\r\n this.isMouseOverBlock = true;\r\n this.enterButtonBlock()\r\n e.stopPropagation();\r\n\r\n return false;\r\n }\r\n\r\n private onMouseLeave(e: Event) {\r\n this.isMouseOverBlock = false;\r\n this.leaveButtonBlock();\r\n e.stopPropagation();\r\n\r\n return false;\r\n }\r\n\r\n protected isColumnActive(): boolean {\r\n return this.element.classList.contains(\"active\");\r\n }\r\n\r\n protected hideButtons() {\r\n domel(this.element).data(\"show-buttons\", null);\r\n }\r\n\r\n protected showButtons() {\r\n domel(this.element).data(\"show-buttons\", \"\");\r\n }\r\n\r\n protected adjustButtonsVisibility() {\r\n if (this.panel.options.alwaysShowButtons || \r\n ((this.panel.options.accentActiveColumn || browserUtils.isMobileMode()) \r\n && this.isColumnActive())) {\r\n this.showButtons();\r\n }\r\n }\r\n\r\n protected enterButtonBlock() {\r\n this.showButtons();\r\n }\r\n\r\n protected leaveButtonBlock() {\r\n if (!this.keepShowingButtons && this.panel.options.alwaysShowButtons !== true && (!this.isColumnActive() || this.panel.options.accentActiveColumn != true)) {\r\n this.hideButtons();\r\n }\r\n }\r\n\r\n protected createFunctionMenu() {\r\n const items = [];\r\n const funcs = this.panel.getContext().getModel().getAggrFunctions();\r\n let funcAllowed = true;\r\n\r\n let item = null;\r\n\r\n const colDataType = this.column.getDataType();\r\n\r\n let funcCaption;\r\n\r\n for(const func of funcs) {\r\n if (!func) continue;\r\n\r\n const toInclude = func.getAppliedTypesOrDefault().indexOf(colDataType) >= 0;\r\n\r\n if (this.column.expr.func === func.id && !toInclude) {\r\n funcAllowed = false;\r\n }\r\n\r\n if (toInclude) {\r\n funcCaption = this.panel.getContext().getModel()\r\n .getAggrFunctionCaption(func.id);\r\n \r\n item = {\r\n id: func.id,\r\n text: funcCaption\r\n };\r\n\r\n items.push(item);\r\n }\r\n }\r\n\r\n if (!funcAllowed) {\r\n this.column.expr.func = items[0].id;\r\n }\r\n \r\n //Add \"Custom Expression\" menu\r\n const columnsPanel = this.panel;\r\n if (columnsPanel.areCustomExpressionsAllowed()) {\r\n item = {\r\n id: 'CustomSqlDivider',\r\n text: '---'\r\n };\r\n\r\n items.push(item);\r\n\r\n funcCaption = i18n.getText('CustomExpression');\r\n item = {\r\n id: 'CUSTOMSQL',\r\n text: funcCaption\r\n };\r\n\r\n items.push(item);\r\n }\r\n \r\n\r\n let menuId = this.column.id;\r\n if (menuId) {\r\n menuId += '-FunctionsMenu';\r\n }\r\n\r\n const menuOptions = {\r\n items: items,\r\n id: menuId,\r\n searchBoxAlwaysShown: false,\r\n domWriteItemsId: true //this.panel.options.domWriteItemsId\r\n };\r\n \r\n\r\n this.functionMenu = new PopupMenu(menuOptions);\r\n }\r\n\r\n protected createFormatsMenu() {\r\n if (this.panel.options.allowDisplayFormatChange == false) return;\r\n\r\n let menuId = this.column.id;\r\n if (menuId) {\r\n menuId += '-FormatsMenu';\r\n }\r\n\r\n const items = this.getFormatsMenuItems();\r\n const menuOptions = {\r\n items: items,\r\n id: menuId,\r\n searchBoxAlwaysShown: false,\r\n showSelected: true,\r\n domWriteItemsId: true //this.panel.options.domWriteItemsId\r\n };\r\n\r\n this.formatsMenu = new PopupMenu(menuOptions);\r\n }\r\n\r\n private getFormatsMenuItems(): MenuItem[] {\r\n const formats = this.panel.getContext().getModel()\r\n .getDisplayFormatsForType(this.column.getDataType());\r\n\r\n return [{ id: '{0:__default}', text: \"Default\" }]\r\n .concat(formats.map(format => ({ id: format.format, text: i18n.getText(\"DisplayFormats\", format.name) || format.name })));\r\n }\r\n\r\n protected getButtonsToShow(): Array<string> {\r\n return this.panel.options.buttons && Array.isArray(this.panel.options.buttons) ? this.panel.options.buttons : [\"enable\", \"delete\", \"type\", \"sorting\", \"format\"];\r\n }\r\n\r\n protected buttonMenuHandler(action: ColumnAction, evt?: Event) {\r\n switch (action) {\r\n case ColumnAction.Delete:\r\n const curQuery = this.column.getQuery();\r\n curQuery.removeColumn(this.column);\r\n curQuery.fireColumnsChangedEvent(QueryChangeAction.Delete, this.column);\r\n break;\r\n case ColumnAction.Enable:\r\n this.columnEnabled = !this.columnEnabled;\r\n this.fireColumnChanged();\r\n break;\r\n case ColumnAction.Hidden:\r\n this.column.setHidden(!this.column.isHidden());\r\n this.fireColumnChanged();\r\n break;\r\n \r\n case ColumnAction.MoveTop:\r\n this.panel.moveColumn(this.column, \"MoveTop\");\r\n break;\r\n case ColumnAction.MoveBottom:\r\n this.panel.moveColumn(this.column, \"MoveBottom\");\r\n break;\r\n case ColumnAction.MoveUp:\r\n this.panel.moveColumn(this.column, \"MoveUp\");\r\n break;\r\n case ColumnAction.MoveDown:\r\n this.panel.moveColumn(this.column, \"MoveDown\");\r\n break;\r\n \r\n case ColumnAction.SortingAsc:\r\n this.column.sorting = SortDirection.Ascending;\r\n this.column.fireChangedEvent();\r\n break;\r\n case ColumnAction.SortingDesc:\r\n this.column.sorting = SortDirection.Descending;\r\n this.column.fireChangedEvent();\r\n break;\r\n case ColumnAction.SortingNone:\r\n this.column.sorting = SortDirection.None;\r\n this.column.fireChangedEvent();\r\n break;\r\n\r\n case ColumnAction.Menu:\r\n const colMenu = this.buttonMenu;\r\n this.keepShowingButtons = true;\r\n colMenu.showMenu({\r\n anchor: evt ? evt.target as HTMLElement : null,\r\n selectedIds: this.getButtonMenuSelectedItems(),\r\n itemSelectedCallback: (item) => {\r\n let action: ColumnAction = item.id;\r\n switch(item.id) {\r\n case \"enable\":\r\n action = ColumnAction.Enable;\r\n break;\r\n case \"delete\":\r\n action = ColumnAction.Delete;\r\n break;\r\n case \"hidden\":\r\n action = ColumnAction.Hidden;\r\n break;\r\n case \"MoveTop\":\r\n action = ColumnAction.MoveTop;\r\n break;\r\n case \"MoveBottom\":\r\n action = ColumnAction.MoveBottom;\r\n break;\r\n case \"MoveUp\":\r\n action = ColumnAction.MoveUp;\r\n break;\r\n case \"MoveDown\":\r\n action = ColumnAction.MoveDown;\r\n break;\r\n case \"None\":\r\n action = ColumnAction.SortingNone;\r\n break;\r\n case \"Ascending\":\r\n action = ColumnAction.SortingAsc;\r\n break;\r\n case \"Descending\":\r\n action = ColumnAction.SortingAsc;\r\n break;\r\n }\r\n\r\n this.buttonMenuHandler(action, evt);\r\n },\r\n itemFilterCallback: (item) => {\r\n let result = this.columnEnabled || item.id === \"__group\" || item.id === \"enable\" || item.id === \"delete\";\r\n return result;\r\n },\r\n menuClosedCallback: () => { //called when menu is closed\r\n this.keepShowingButtons = false;\r\n if (!this.isMouseOverBlock)\r\n this.leaveButtonBlock();\r\n }\r\n\r\n });\r\n break;\r\n default:\r\n if (!this.processFormatsButtonMenuItems(action, evt))\r\n this.processExtraButtonMenuItems(action, evt);\r\n break;\r\n }\r\n\r\n evt && evt.stopPropagation();\r\n \r\n return false;\r\n }\r\n\r\n private createButtonMenu() {\r\n if (!this.buttonMenu) {\r\n let menuId = this.column.id;\r\n if (menuId) {\r\n menuId += '-ButtonMenu';\r\n }\r\n\r\n const common = [];\r\n common.push({\r\n id: \"enable\",\r\n text: i18n.getText('MenuEnable')\r\n });\r\n \r\n if (this.panel.options.allowHiddenColumns) {\r\n common.push({\r\n id: \"hidden\",\r\n text: i18n.getText('CmdHiddenColumn')\r\n })\r\n }\r\n \r\n common.push({\r\n id: \"delete\",\r\n text: i18n.getText('CmdDelete')\r\n });\r\n \r\n let items = [];\r\n \r\n items.push({\r\n id: '__group',\r\n text: ' ',\r\n items: common\r\n });\r\n \r\n const sortItems = this.panel.options.allowSorting ?\r\n [ \r\n ...this.panel.getSortMenuList(), \r\n ...this.panel.getMoveMenuList()\r\n ] :\r\n this.panel.getMoveMenuList();\r\n \r\n items.push({\r\n id: '__group',\r\n text: i18n.getText('CmdGroupSort'),\r\n items: sortItems\r\n })\r\n \r\n const extra = this.getExtraButtonMenuItems();\r\n\r\n if (extra && Array.isArray(extra)) {\r\n items = [...items, ...extra];\r\n }\r\n\r\n const formatItems = this.getFormatsMenuItems();\r\n if (formatItems.length > 1) {\r\n items.push({\r\n id: '__group',\r\n text: i18n.getText('CmdGroupFormat'),\r\n items: formatItems\r\n });\r\n }\r\n \r\n const menuOptions = {\r\n items: items,\r\n id: menuId,\r\n searchBoxAlwaysShown: false,\r\n domWriteItemsId: true, //this.panel.options.domWriteItemsId\r\n showSelected: true \r\n };\r\n\r\n this.buttonMenu = new PopupMenu(menuOptions);\r\n }\r\n }\r\n\r\n protected abstract getExtraButtonMenuItems(): Array<any>;\r\n\r\n protected abstract processExtraButtonMenuItems(action: ColumnAction | string, evt: Event): boolean;\r\n\r\n protected processFormatsButtonMenuItems(action: ColumnAction | string, evt: Event): boolean {\r\n const formats = this.panel\r\n .getContext().getModel()\r\n .getDisplayFormatsForType(this.column.getDataType());\r\n\r\n if (action == '{0:__default}') {\r\n this.column.displayFormat = '';\r\n }\r\n else if (formats.filter(f => f.format == action).length > 0) {\r\n this.column.displayFormat = action as string;\r\n }\r\n else {\r\n return false;\r\n }\r\n\r\n this.column.fireChangedEvent();\r\n return true;\r\n }\r\n\r\n protected getButtonMenuSelectedItems(): Array<string> {\r\n let arrSelected = [];\r\n if (this.columnEnabled) {\r\n arrSelected.push(\"enable\");\r\n };\r\n\r\n if (this.column.isHidden()) {\r\n arrSelected.push(\"hidden\");\r\n };\r\n\r\n const formats = this.panel\r\n .getContext()\r\n .getModel()\r\n .getDisplayFormatsForType(this.column.getDataType());\r\n\r\n let formatId = '{0:__default}';\r\n if (formats.filter(f => f.format == this.column.displayFormat).length > 0) {\r\n formatId = this.column.displayFormat;\r\n }\r\n\r\n arrSelected.push(formatId);\r\n\r\n return arrSelected;\r\n }\r\n}","import { i18n } from '@easydata/core';\r\nimport { utils as dataUtils } from '@easydata/core';\r\nimport { \r\n EqContext, Widget, WidgetGroup, \r\n ExprTag, QueryChangeEventData, QueryChangePart, QueryChangeAction \r\n} from '@easyquery/core';\r\n\r\nimport { eqDragManager, createBrowserEvent } from '@easydata/ui';\r\n\r\nimport { eqCssPrefix } from '../utils/utils'\r\nimport { browserUtils } from '../utils/browser_utils'\r\nimport { EntitiesPanelOptions } from './widget_options'\r\n\r\n/**\r\n * The entities panel wiget, implemented without JQuery.\r\n */\r\nexport class EntitiesPanel extends Widget {\r\n\r\n private panel: HTMLElement;\r\n private rootEntityBlock: HTMLElement;\r\n private entityTreeBlock: HTMLElement;\r\n private progressBlock: HTMLElement;\r\n private filterBoxBlock: HTMLElement;\r\n private filterBoxInput: HTMLInputElement;\r\n\r\n private options: EntitiesPanelOptions;\r\n\r\n protected get cssPrefix(): string {\r\n return 'eqjs-ep';\r\n }\r\n\r\n /**\r\n * The default constructor.\r\n * @param slot The html element.\r\n */\r\n constructor(slot: HTMLElement) {\r\n super(slot);\r\n\r\n this.group = WidgetGroup.Model | WidgetGroup.Query;\r\n this.panel = slot;\r\n }\r\n\r\n public getWidgetType(): string {\r\n return 'entitiesPanel';\r\n }\r\n\r\n /**\r\n * Initialize widget.\r\n * @param context The context. \r\n * @param options The options.\r\n */\r\n public init(context: EqContext, options?: EntitiesPanelOptions) {\r\n super.init(context, options);\r\n\r\n this.setOptions(options);\r\n this.renderProgressBlock();\r\n }\r\n\r\n /**\r\n * Refresh widget implementation\r\n */\r\n protected refreshCore() {\r\n this.render();\r\n if (this.options.syncWithColumns) {\r\n this.refreshCheckedStateByColumns();\r\n }\r\n }\r\n\r\n protected onProcessStartCore() {\r\n if (this.options.showIndicatorOnLoad) {\r\n if (!this.progressBlock.parentNode)\r\n this.panel.appendChild(this.progressBlock);\r\n }\r\n }\r\n \r\n protected onProcessEndCore() {\r\n if (this.options.showIndicatorOnLoad) {\r\n if (this.progressBlock.parentNode)\r\n this.panel.removeChild(this.progressBlock);\r\n }\r\n }\r\n\r\n protected destroyCore() {\r\n this.slot.innerHTML = '';\r\n }\r\n\r\n private setOptions(options: EntitiesPanelOptions) {\r\n\r\n this.options = {\r\n showToolbar: true,\r\n syncWithColumns: false,\r\n showSelectAllButton: false,\r\n showClearSelectionButton: true,\r\n showAddColumnButton: true,\r\n showAddConditionButton: true,\r\n showCheckboxes: true,\r\n showTooltips: true,\r\n draggableAttributes: true,\r\n showAttributes: { useInConditions: true, useInResult: true, useInSorting: false },\r\n showFilterBox: false,\r\n filterBoxMode: 0,\r\n showIndicatorOnLoad: true,\r\n attrPlacement: 0,\r\n sortEntities: false,\r\n autoClearSelection: true,\r\n entityRenderedCallback: null,\r\n attributeRenderedCallback: null,\r\n }\r\n\r\n if (options) {\r\n dataUtils.assignDeep(this.options, options);\r\n }\r\n\r\n if (this.queryChangedCallbackId) {\r\n const query = this.context.getQuery();\r\n query.removeChangedCallback(this.queryChangedCallbackId);\r\n }\r\n\r\n if (this.options.syncWithColumns) {\r\n const query = this.context.getQuery();\r\n this.queryChangedCallbackId = query.addChangedCallback((ev) => {\r\n const edata = ev.data as QueryChangeEventData;\r\n if (!edata || (edata.part != QueryChangePart.Columns && edata.part != QueryChangePart.All)) {\r\n return;\r\n }\r\n this.refreshCheckedStateByColumns();\r\n });\r\n }\r\n }\r\n\r\n private queryChangedCallbackId: string = null;\r\n\r\n private render() {\r\n let model = this.context.getModel();;\r\n\r\n this.clear();\r\n\r\n this.panel.classList.add(`${this.cssPrefix}-panel`);\r\n this.panel.classList.add(browserUtils.getMobileCssClass());\r\n\r\n this.rootEntityBlock = document.createElement('div');\r\n if (model != null && !model.isEmpty()) {\r\n let entTree = model.getEntitiesTree({\r\n addUIC: this.options.showAttributes.useInConditions,\r\n addUIR: this.options.showAttributes.useInResult,\r\n addUIS: this.options.showAttributes.useInSorting,\r\n attrPlacement: this.options.attrPlacement,\r\n sortEntities: this.options.sortEntities,\r\n includeRootData: true\r\n });\r\n\r\n this.entityTreeBlock = this.renderEntity(entTree, this.rootEntityBlock, 0);\r\n this.panel.appendChild(this.entityTreeBlock);\r\n }\r\n\r\n if (this.options.showFilterBox) {\r\n this.createFilterBox();\r\n }\r\n else {\r\n this.rootEntityBlock.style.top = '0';\r\n }\r\n\r\n if (this.options.showToolbar && !this.options.syncWithColumns) {\r\n this.createToolPanel();\r\n }\r\n else {\r\n this.rootEntityBlock.style.bottom = '0';\r\n }\r\n }\r\n\r\n private renderEntity(entity, block: HTMLElement, offset: number): HTMLElement {\r\n\r\n let entityBlock: HTMLElement;\r\n\r\n let entityNode = document.createElement('div');\r\n entityNode.classList.add(`${this.cssPrefix}-entity-node`);\r\n entityNode.classList.add(browserUtils.getMobileCssClass());\r\n\r\n let entityChildren = document.createElement('div');\r\n entityChildren.classList.add(`${this.cssPrefix}-entity-children`);\r\n entityChildren.classList.add(browserUtils.getMobileCssClass());\r\n\r\n let nodeLabel = document.createElement('label');\r\n nodeLabel.classList.add(`${this.cssPrefix}-entity-node-label`);\r\n\r\n let nodeInput = document.createElement('input');\r\n nodeInput.type = 'checkbox';\r\n nodeInput.title = entity.text;\r\n\r\n let nodeToggleButton = document.createElement('a');\r\n nodeToggleButton.href = 'javascript:void(0)';\r\n nodeToggleButton.title = `${i18n.getText(\"EntityToggle\")} ${entity.text}`;\r\n nodeToggleButton.classList.add(`${this.cssPrefix}-entity-node-button`);\r\n\r\n let attrNode: HTMLElement, attrLabel: HTMLLabelElement, attrInput: HTMLInputElement;\r\n\r\n let currentOffset = offset;\r\n\r\n let isAttributeInTree = (attrId: string, entityBlock: HTMLElement): boolean => {\r\n let res = entityBlock.querySelectorAll(`.${this.cssPrefix}-entity-attr[data-id=\"${attrId}\"]`);\r\n return res.length > 0;\r\n };\r\n\r\n if (block) {\r\n entityBlock = block;\r\n entityBlock.innerHTML = '';\r\n }\r\n else {\r\n entityBlock = document.createElement('div');\r\n }\r\n\r\n entityBlock.classList.add(`${this.cssPrefix}-entity`);\r\n entityBlock.classList.add(browserUtils.getMobileCssClass());\r\n\r\n if (entity.id && entity.id != \"\") {\r\n nodeLabel.innerText = entity.text;\r\n entityNode.appendChild(nodeLabel); //caption\r\n\r\n if (this.options.showCheckboxes) {\r\n nodeLabel.insertBefore(nodeInput, nodeLabel.firstChild)\r\n }\r\n\r\n entityNode.insertBefore(nodeToggleButton, entityNode.firstChild);\r\n\r\n if (this.options.showTooltips && entity.description) {\r\n nodeLabel.setAttribute('title', entity.description);\r\n }\r\n\r\n for (let i = 0; i < currentOffset; i++) {\r\n let divElem = document.createElement('div');\r\n divElem.classList.add(`${this.cssPrefix}-entity-offset`);\r\n\r\n entityNode.insertBefore(divElem, entityNode.firstChild);\r\n }\r\n\r\n entityBlock.appendChild(entityNode);\r\n entityChildren.hidden = true;\r\n\r\n currentOffset++;\r\n }\r\n\r\n let itemsLength = entity.items ? entity.items.length : 0;\r\n for (let i = 0; i < itemsLength; i++) {\r\n let item = entity.items[i];\r\n\r\n if (item.isEntity) {\r\n entityChildren.appendChild(this.renderEntity(item, null, currentOffset));\r\n }\r\n else {\r\n if (!item.lookupAttr || !(isAttributeInTree(item.lookupAttr, entityChildren))) {\r\n attrLabel = document.createElement('label');\r\n attrLabel.innerText = item.text;\r\n attrLabel.classList.add(`${this.cssPrefix}-entity-attr-label`);\r\n\r\n if (this.options.showCheckboxes) {\r\n attrInput = document.createElement('input');\r\n attrInput.type = 'checkbox';\r\n attrInput.title = item.text;\r\n attrLabel.insertBefore(attrInput, attrLabel.firstChild);\r\n\r\n if (this.options.syncWithColumns) {\r\n attrInput.addEventListener('change', (ev) => {\r\n const model = this.context.getModel();\r\n const query = this.context.getQuery();\r\n const checkbox = ev.currentTarget as HTMLInputElement;\r\n const attrId = checkbox.parentElement.parentElement.getAttribute('data-id');\r\n\r\n if (model.checkAttrProperty(attrId, \"useInResult\")) {\r\n if (checkbox.checked) {\r\n const attr = model.getAttributeById(attrId);\r\n const column = query.addColumn({\r\n attribute: attr\r\n });\r\n query.fireColumnsChangedEvent(QueryChangeAction.Add, column)\r\n }\r\n else {\r\n const columns = query.getColumns()\r\n .filter(col => col.expr.tag === ExprTag.EntityAttribute \r\n && col.expr.value === attrId);\r\n \r\n if (columns.length > 0) {\r\n query.removeColumn(columns[0])\r\n query.fireColumnsChangedEvent(QueryChangeAction.Delete, columns[0]);\r\n }\r\n \r\n }\r\n \r\n }\r\n });\r\n }\r\n }\r\n\r\n if (this.options.showTooltips && item.description) {\r\n attrLabel.setAttribute('title', item.description);\r\n }\r\n\r\n for (let j = 0; j < currentOffset + 1; j++) {\r\n let divElem = document.createElement('div');\r\n divElem.classList.add(`${this.cssPrefix}-entity-offset`);\r\n\r\n attrLabel.insertBefore(divElem, attrLabel.firstChild);\r\n }\r\n\r\n attrNode = document.createElement('div');\r\n attrNode.classList.add(`${this.cssPrefix}-entity-attr`);\r\n if (entityNode.innerHTML.length == 0) {\r\n attrNode.classList.add(`${this.cssPrefix}-entity-attr-root`);\r\n }\r\n\r\n attrNode.innerHTML = \"\";\r\n attrNode.appendChild(attrLabel);\r\n attrNode.setAttribute('data-id', item.id);\r\n\r\n if (this.options.draggableAttributes) {\r\n\r\n eqDragManager.registerDraggableItem({\r\n element: attrNode,\r\n scope: \"entityAttr\",\r\n data: {attrId: item.id},\r\n renderer: (dragImage) => {\r\n dragImage.innerHTML = '';\r\n\r\n const attrLabel = document.createElement('span');\r\n attrLabel.innerText = item.text;\r\n\r\n dragImage.appendChild(attrLabel);\r\n }\r\n });\r\n\r\n }\r\n\r\n if (this.options.attributeRenderedCallback) {\r\n this.options.attributeRenderedCallback(attrNode);\r\n }\r\n\r\n entityChildren.appendChild(attrNode);\r\n }\r\n }\r\n }\r\n\r\n if (entityChildren.innerHTML.length) {\r\n entityBlock.appendChild(entityChildren);\r\n\r\n nodeToggleButton.addEventListener('click', (event: MouseEvent) => {\r\n entityChildren.hidden = !entityChildren.hidden;\r\n let element = event.target as HTMLElement;\r\n let className = `${this.cssPrefix}-entity-node-button-open`;\r\n if (element.classList.contains(className)) {\r\n element.classList.remove(className);\r\n }\r\n else {\r\n element.classList.add(className);\r\n }\r\n\r\n event.preventDefault();\r\n });\r\n\r\n }\r\n\r\n if (entityChildren) {\r\n const checkboxes = entityChildren.querySelectorAll(`.${this.cssPrefix}-entity-attr > label > input`);\r\n for(let i = 0; i < checkboxes.length; i++) {\r\n const checkbox = checkboxes[i];\r\n checkbox.addEventListener('click', (event: Event) => {\r\n let element = event.target as HTMLInputElement;\r\n\r\n if (element.checked && !nodeInput.checked) {\r\n nodeInput.checked = true;\r\n }\r\n else if (entityChildren.querySelectorAll('input:checked').length === 0) {\r\n nodeInput.checked = false;\r\n }\r\n\r\n event.stopPropagation();\r\n });\r\n }\r\n }\r\n\r\n nodeInput.addEventListener('click', (event: MouseEvent) => {\r\n let element = event.target as HTMLInputElement;\r\n\r\n const entities = entityChildren.querySelectorAll('label input') as NodeListOf<HTMLInputElement>;\r\n\r\n for(let i = 0; i < entities.length; i++) {\r\n const entity = entities[i];\r\n entity.checked = element.checked;\r\n }\r\n\r\n\r\n if (this.options.syncWithColumns) {\r\n const query = this.context.getQuery();\r\n const model = this.context.getModel();\r\n\r\n const attrList = [];\r\n const attrElems = Array.from(entityChildren.querySelectorAll(`.${this.cssPrefix}-entity-attr`));\r\n for(const elem of attrElems) {\r\n const attrId = elem.getAttribute('data-id');\r\n\r\n if (model.checkAttrProperty(attrId, 'useInResult')) {\r\n attrList.push(attrId);\r\n }\r\n }\r\n\r\n if (element.checked) {\r\n for(const attrId of attrList) {\r\n query.addColumn({attributeId: attrId});\r\n }\r\n }\r\n else {\r\n const columns = query.getColumns()\r\n .filter(col => col.expr.tag === ExprTag.EntityAttribute \r\n && attrList.indexOf(col.expr.value) >= 0);\r\n query.removeColumns(columns, null);\r\n }\r\n\r\n query.fireColumnsChangedEvent();\r\n }\r\n\r\n event.stopPropagation();\r\n\r\n });\r\n\r\n if (block != this.rootEntityBlock && this.options.entityRenderedCallback) {\r\n this.options.entityRenderedCallback(entityBlock);\r\n }\r\n\r\n return entityBlock;\r\n }\r\n\r\n private createFilterBox() {\r\n this.filterBoxBlock = document.createElement('div');\r\n this.filterBoxBlock.classList.add(`${this.cssPrefix}-filter-box`);\r\n this.filterBoxBlock.classList.add(browserUtils.getMobileCssClass());\r\n\r\n this.filterBoxInput = document.createElement('input');\r\n this.filterBoxInput.classList.add(`${this.cssPrefix}-filter-box-input`);\r\n\r\n this.filterBoxInput.addEventListener('input', (e) => {\r\n const attrs = this.panel.querySelectorAll(`.${this.cssPrefix}-entity-attr`) as NodeListOf<HTMLElement>;\r\n for(let i = 0; i < attrs.length; i++) {\r\n const attr: HTMLElement = attrs[i];\r\n attr.hidden = !this.checkFilterAttribute(attr);\r\n }\r\n \r\n const entities = this.panel.querySelectorAll(`:scope > .${this.cssPrefix}-entity`) as NodeListOf<HTMLElement>;\r\n for(let i = 0; i < entities.length; i++) {\r\n const entity: HTMLElement = entities[i];\r\n\r\n let attrs = entity.querySelectorAll(`.${this.cssPrefix}-entity-attr`) as NodeListOf<HTMLElement>;\r\n let displayAttrCount = 0;\r\n for (let i = 0; i < attrs.length; i++) {\r\n if (attrs[i].style.display !== 'None') {\r\n displayAttrCount++;\r\n }\r\n }\r\n\r\n entity.hidden = displayAttrCount === 0;\r\n }\r\n\r\n if (this.filterBoxInput.value === '')\r\n this.collapseAll();\r\n else\r\n this.expandAll();\r\n\r\n });\r\n\r\n\r\n this.filterBoxBlock.appendChild(this.filterBoxInput);\r\n this.panel.insertBefore(this.filterBoxBlock, this.panel.firstChild);\r\n }\r\n\r\n private createToolPanel() {\r\n let defClass = `${this.cssPrefix}-tool-panel`;\r\n\r\n let toolPanelBlock = document.createElement('div');\r\n toolPanelBlock.classList.add(defClass);\r\n toolPanelBlock.classList.add(browserUtils.getMobileCssClass());\r\n\r\n let toolSelectAll = document.createElement('div');\r\n toolSelectAll.classList.add(`${defClass}-select-all`);\r\n toolSelectAll.title = 'Select all';\r\n\r\n let toolDeselectAll = document.createElement('div');\r\n toolDeselectAll.classList.add(`${defClass}-deselect-all`);\r\n toolDeselectAll.title = 'Clear selection';\r\n\r\n let toolAddColumns = document.createElement('div');\r\n toolAddColumns.classList.add(`${defClass}-add-columns`);\r\n toolAddColumns.title = 'Add column';\r\n\r\n let toolAddCond = document.createElement('div');\r\n toolAddCond.classList.add(`${defClass}-add-cond`);\r\n toolAddCond.title = 'Add condition';\r\n\r\n let toolLeftBlock = document.createElement('div');\r\n toolLeftBlock.classList.add(`${defClass}-left-side`);\r\n\r\n let toolRightBlock = document.createElement('div');\r\n toolRightBlock.classList.add(`${defClass}-right-side`);\r\n\r\n let model = this.context.getModel();\r\n\r\n if (this.options.showSelectAllButton) {\r\n toolSelectAll.title = i18n.getText(\"ButtonSelectAll\");\r\n toolLeftBlock.appendChild(toolSelectAll);\r\n\r\n toolSelectAll.addEventListener('click', () => {\r\n this.selectAll();\r\n });\r\n }\r\n\r\n if (this.options.showClearSelectionButton) {\r\n toolDeselectAll.title = i18n.getText(\"ButtonDeselectAll\");\r\n toolLeftBlock.appendChild(toolDeselectAll);\r\n\r\n toolDeselectAll.addEventListener('click', () => {\r\n this.deselectAll();\r\n });\r\n }\r\n\r\n if (this.options.showAddColumnButton) {\r\n toolAddColumns.title = i18n.getText(\"ButtonAddColumns\");\r\n toolRightBlock.appendChild(toolAddColumns);\r\n\r\n toolAddColumns.addEventListener('click', () => {\r\n const attrElements = this.panel.querySelectorAll(`.${this.cssPrefix}-entity-attr`) as NodeListOf<HTMLElement>;\r\n let attrList = [];\r\n let attrId: string;\r\n\r\n const query = this.context.getQuery();\r\n\r\n query.fireProcessEvent({\r\n source: self,\r\n status: \"start\"\r\n });\r\n\r\n for(let i = 0; i < attrElements.length; i++) {\r\n const attrElement = attrElements[i];\r\n let input = attrElement.getElementsByTagName('input')[0];\r\n \r\n if (input.checked) {\r\n attrId = attrElement.getAttribute('data-id');\r\n if (model.checkAttrProperty(attrId, \"useInResult\")) {\r\n attrList.push(attrId);\r\n }\r\n }\r\n }\r\n\r\n for (let attrId of attrList) {\r\n const attr = model.getAttributeById(attrId);\r\n query.addColumn({\r\n attribute: attr\r\n }, true);\r\n }\r\n \r\n query.fireChangedEvent();\r\n\r\n if (this.options.autoClearSelection) {\r\n this.deselectAll();\r\n }\r\n\r\n query.fireProcessEvent({\r\n source: self,\r\n status: \"finish\"\r\n });\r\n\r\n });\r\n }\r\n\r\n if (this.options.showAddConditionButton) {\r\n toolAddCond.title = i18n.getText(\"ButtonAddConditions\");\r\n toolRightBlock.appendChild(toolAddCond);\r\n\r\n toolAddCond.addEventListener('click', () => {\r\n let attrElements = this.panel.querySelectorAll(`.${this.cssPrefix}-entity-attr`) as NodeListOf<HTMLElement>;\r\n let attrList = [];\r\n let attrId: string;\r\n let query = this.context.getQuery();\r\n\r\n query.fireProcessEvent({\r\n source: self,\r\n status: \"start\"\r\n });\r\n\r\n for(let i = 0; i < attrElements.length; i++) {\r\n const attrElement = attrElements[i];\r\n let input = attrElement.getElementsByTagName('input')[0];\r\n \r\n if (input.checked) {\r\n attrId = attrElement.getAttribute('data-id');\r\n if (model.checkAttrProperty(attrId, \"useInConditions\")) {\r\n attrList.push(attrId);\r\n }\r\n }\r\n }\r\n\r\n for(let attrId of attrList) {\r\n query.addSimpleCondition({\r\n attributeId: attrId\r\n });\r\n \r\n }\r\n \r\n query.fireChangedEvent();\r\n\r\n if (this.options.autoClearSelection) {\r\n this.deselectAll();\r\n }\r\n\r\n query.fireProcessEvent({\r\n source: self,\r\n status: \"finish\"\r\n });\r\n });\r\n }\r\n\r\n toolPanelBlock.appendChild(toolLeftBlock);\r\n toolPanelBlock.appendChild(toolRightBlock);\r\n this.panel.appendChild(toolPanelBlock);\r\n }\r\n\r\n private checkFilterAttribute(attr: HTMLElement): boolean {\r\n const inputElem = attr.querySelector('label input') as HTMLInputElement;\r\n if (inputElem.checked) {\r\n return true;\r\n }\r\n\r\n const labelElem = attr.querySelector('label') as HTMLLabelElement;\r\n const attrCaption = labelElem.textContent;\r\n if (this.checkFilterText(attrCaption)) {\r\n return true;\r\n }\r\n\r\n const entityNode = attr.parentElement.parentElement.querySelector(`.${this.cssPrefix}-entity-node`) as HTMLElement;\r\n const entityCaption = (entityNode.querySelector('label') as HTMLLabelElement).textContent;\r\n if (this.checkFilterText(entityCaption)) {\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n private checkFilterText(value: string): boolean {\r\n let filterText = this.filterBoxInput.value;\r\n if (filterText == \"\") return true;\r\n if (this.options.filterBoxMode == 0 && value.toLowerCase().indexOf(filterText.toLowerCase()) >= 0) return true;\r\n if (this.options.filterBoxMode == 1 && value.toLowerCase().indexOf(filterText.toLowerCase()) == 0) return true;\r\n\r\n return false;\r\n }\r\n\r\n private refreshCheckedStateByColumns() {\r\n\r\n this.deselectAll();\r\n\r\n const query = this.context.getQuery();\r\n const exprColumns = query.getColumns()\r\n .filter(col => col.expr.tag === ExprTag.EntityAttribute);\r\n\r\n for(const column of exprColumns) {\r\n const attrNode = this.rootEntityBlock\r\n .querySelector(`.${this.cssPrefix}-entity-attr[data-id=\"${column.expr.value}\"]`);\r\n let checkbox = attrNode.querySelector(`label > input`) as HTMLInputElement;\r\n checkbox.checked = true;\r\n\r\n let entChildren = attrNode.parentElement;\r\n while (entChildren \r\n && entChildren.classList\r\n .contains(`${this.cssPrefix}-entity-children`)) {\r\n\r\n entChildren.hidden = false;\r\n const entElem = entChildren.parentElement;\r\n if (entElem && entChildren !== entElem.firstElementChild) {\r\n checkbox = entElem.firstElementChild\r\n .querySelector(`label > input`) as HTMLInputElement;\r\n checkbox.checked = true;\r\n\r\n entChildren = entElem.parentElement;\r\n }\r\n else {\r\n break;\r\n }\r\n }\r\n \r\n }\r\n }\r\n\r\n private expandAll() {\r\n for(let i =0; i < this.rootEntityBlock.childNodes.length; i++) {\r\n const child = this.rootEntityBlock.childNodes[0] as HTMLElement;\r\n const childs = child.querySelectorAll(`.${this.cssPrefix}-entity-children`) as NodeListOf<HTMLElement>;\r\n for(let j = 0; j < childs.length; j++) {\r\n const elem = childs[j];\r\n elem.hidden = false\r\n }\r\n }\r\n\r\n const nodeButtons = this.rootEntityBlock.querySelectorAll(`.${this.cssPrefix}-entity-node-button`) as NodeListOf<HTMLElement>;\r\n for(let i = 0; i < nodeButtons.length; i++) {\r\n const elem = nodeButtons[i];\r\n\r\n elem.classList.add(`${this.cssPrefix}-entity-node-button-open`);\r\n }\r\n\r\n }\r\n\r\n private collapseAll() {\r\n\r\n for(let i =0; i < this.rootEntityBlock.childNodes.length; i++) {\r\n const child = this.rootEntityBlock.childNodes[0] as HTMLElement;\r\n const childs = child.querySelectorAll(`.${this.cssPrefix}-entity-children`) as NodeListOf<HTMLElement>;\r\n for(let j = 0; j < childs.length; j++) {\r\n const elem = childs[j];\r\n elem.hidden = true\r\n }\r\n }\r\n\r\n const nodeButtons = this.rootEntityBlock.querySelectorAll(`.${this.cssPrefix}-entity-node-button`) as NodeListOf<HTMLElement>;\r\n for(let i = 0; i < nodeButtons.length; i++) {\r\n const elem = nodeButtons[i];\r\n\r\n elem.classList.remove(`${this.cssPrefix}-entity-node-button-open`);\r\n }\r\n }\r\n\r\n private selectAll() {\r\n const inputs = this.entityTreeBlock.querySelectorAll('input') as NodeListOf<HTMLInputElement>;\r\n for(let i = 0; i < inputs.length; i++) {\r\n const input = inputs[i];\r\n input.checked = true;\r\n }\r\n }\r\n\r\n private deselectAll() {\r\n const inputs = this.entityTreeBlock.querySelectorAll('input') as NodeListOf<HTMLInputElement>;\r\n for(let i = 0; i < inputs.length; i++) {\r\n const input = inputs[i];\r\n input.checked = false;\r\n }\r\n }\r\n\r\n private renderProgressBlock() {\r\n this.progressBlock = document.createElement('div');\r\n this.progressBlock.classList.add(`${eqCssPrefix}-progress-win8`);\r\n this.progressBlock.classList.add(browserUtils.getMobileCssClass());\r\n this.progressBlock.innerHTML = '<div class=\"wBall\" id=\"wBall_1\"><div class=\"wInnerBall\"></div></div><div class=\"wBall\" id=\"wBall_2\"><div class=\"wInnerBall\"></div></div><div class=\"wBall\" id=\"wBall_3\"><div class=\"wInnerBall\"></div></div><div class=\"wBall\" id=\"wBall_4\"><div class=\"wInnerBall\"></div></div><div class=\"wBall\" id=\"wBall_5\"><div class=\"wInnerBall\"></div></div>';\r\n }\r\n\r\n private clear() {\r\n this.panel.innerHTML = \"\";\r\n }\r\n}","import { i18n } from '@easydata/core';\r\nimport { utils as dataUtils } from '@easydata/core';\r\n\r\nimport { domel } from '@easydata/ui';\r\n\r\nimport { getElementAbsolutePos, getScrollPos, getWinSize, getViewportSize } from '@easydata/ui';\r\nimport { browserUtils } from './browser_utils';\r\nimport { findHighestZIndex } from './utils';\r\n\r\ninterface MenuLevelOptions {\r\n menu?: PopupMenu;\r\n parent?: MenuLevel;\r\n container?: HTMLElement;\r\n levelIndex?: number;\r\n levelDiv?: HTMLDivElement;\r\n domWriteItemsId?: boolean;\r\n menuId?: string;\r\n itemRenderedCallback?: (item: MenuItem, itemDiv: HTMLDivElement) => void;\r\n items?: MenuItem[];\r\n showSelected?: boolean;\r\n}\r\n\r\nclass MenuLevel { \r\n private parentMenu: PopupMenu;\r\n private parentLevel: MenuLevel;\r\n\r\n private parentElement: HTMLElement;\r\n private levelIndex: number;\r\n\r\n private searchDiv: HTMLDivElement;\r\n private searchBox: HTMLInputElement;\r\n\r\n private closeDiv: HTMLDivElement;\r\n\r\n private scrollDiv: HTMLDivElement;\r\n private domWriteItemsId: boolean;\r\n\r\n private menuId: string;\r\n private itemRenderedCallback: (item: any, itemDiv: HTMLDivElement) => void;\r\n\r\n private items: MenuItem[];\r\n private filteredItems: MenuItem[];\r\n private _applyItem: MenuItem;\r\n\r\n public get applyItem(): MenuItem {\r\n return this._applyItem;\r\n }\r\n \r\n private activeItem: MenuItem;\r\n private selectedItem: MenuItem;\r\n\r\n private initialized: boolean;\r\n\r\n private updated: number;\r\n\r\n private isFilteringMode = false;\r\n private showSelected = false;\r\n\r\n public applyBtn: HTMLButtonElement;\r\n public levelDiv: HTMLDivElement;\r\n\r\n protected get cssPrefix(): string {\r\n return 'eqjs-menu';\r\n }\r\n\r\n\r\n constructor(options: MenuLevelOptions){\r\n //menu, items, levelIndex\r\n this.parentMenu = options.menu || null;\r\n this.parentLevel = options.parent || null;\r\n this.parentElement = options.container || document.body;\r\n this.levelIndex = options.levelIndex || 0;\r\n this.levelDiv = null;\r\n this.domWriteItemsId = options.domWriteItemsId || false;\r\n this.menuId = options.menuId || '';\r\n this.itemRenderedCallback = options.itemRenderedCallback || null;\r\n\r\n //we need to define special \"apply\" item for this level\r\n this._applyItem = { id: null, text: null, itemDiv: null};\r\n\r\n this.items = options.items || [];\r\n this.activeItem = null;\r\n this.selectedItem = null;\r\n this.initialized = false;\r\n\r\n this.showSelected = options.showSelected;\r\n\r\n this.updated = 0;\r\n\r\n this.renderContent();\r\n }\r\n\r\n public getItems() : MenuItem[] {\r\n return this.items;\r\n }\r\n\r\n public setItems(items: MenuItem[]) {\r\n this.items = items;\r\n }\r\n\r\n public renderContent() {\r\n if (!this.items) {\r\n return;\r\n }\r\n\r\n const self = this;\r\n\r\n //define internal variables used in this function\r\n const itemBgColor = this.parentMenu.style.colors.bgON || \"white\";\r\n const itemFgColor = this.parentMenu.style.colors.fgON || \"black\";\r\n const itemOverBgColor = this.parentMenu.style.colors.bgOVER || \"LightSteelBlue\";\r\n const itemFontFamily = this.parentMenu.style.itemStyle.fontFamily || \"\";\r\n const itemFontSize = this.parentMenu.style.itemStyle.fontSize || \"14px\";\r\n\r\n const multiselect = this.parentMenu.options.multiselect;\r\n const isSubQuery = this.parentMenu.options.isSubQuery;\r\n\r\n //add base DIV element which is also used to show the shadow\r\n const baseDivBuilder = domel('div')\r\n .addClass(browserUtils.getMobileCssClass());\r\n\r\n\r\n if (this.parentMenu.options.useDefaultStyles) {\r\n baseDivBuilder\r\n .setStyle('backgroundColor', itemBgColor)\r\n .setStyle('border', '1px solid')\r\n .setStyle('borderColor', itemBgColor)\r\n .setStyle('backgroundColor', this.parentMenu.style.colors.border)\r\n .setStyle('margin', '-2px 2px 2px -2px')\r\n .setStyle('width', 'auto')\r\n .setStyle('height','auto');\r\n }\r\n\r\n baseDivBuilder\r\n .setStyle('z-index', this.parentMenu.zIndex)\r\n .setStyle('position', 'absolute')\r\n .setStyle('display', 'none');\r\n\r\n let baseDiv = baseDivBuilder.toDOM();\r\n baseDiv['menuLevel'] = this;\r\n\r\n const applyItem = this._applyItem;\r\n\r\n //if multiselect option is on - then we should add special \"apply\" item\r\n if (multiselect && this.levelIndex === 0 && this.parentMenu.options.hideButtons !== true) {\r\n const applyDiv = document.createElement(\"div\");\r\n applyDiv.classList.add(`${this.cssPrefix}-applyDiv`);\r\n applyDiv['menuItem'] = applyItem;\r\n\r\n this.applyBtn = document.createElement('button');\r\n\r\n if (this.parentMenu.options.useDefaultStyles) {\r\n applyDiv.style.borderBottom = '1px solid';\r\n applyDiv.style.padding = '5px';\r\n applyDiv.style.marginBottom = '5px';\r\n\r\n this.applyBtn.style.padding = '0 5px';\r\n this.applyBtn.style.cursor = \"pointer\";\r\n }\r\n\r\n const applyTextNode = document.createTextNode(this.parentMenu.options.buttons.submit);\r\n this.applyBtn.appendChild(applyTextNode);\r\n applyDiv.appendChild(this.applyBtn);\r\n\r\n //cancel btn\r\n const cancelBtn = document.createElement('button');\r\n cancelBtn.classList.add(`${this.cssPrefix}-cancel`);\r\n\r\n if (this.parentMenu.options.useDefaultStyles) {\r\n cancelBtn.style.padding = '0 5px';\r\n cancelBtn.style.cursor = 'pointer';\r\n cancelBtn.style.marginLeft = '15px';\r\n }\r\n\r\n const cancelText = document.createTextNode(this.parentMenu.options.buttons.cancel);\r\n cancelBtn.appendChild(cancelText);\r\n applyDiv.appendChild(cancelBtn);\r\n baseDiv.appendChild(applyDiv);\r\n applyItem.itemDiv = applyDiv;\r\n\r\n this.applyBtn.addEventListener('click', () => {\r\n this.submit(this._applyItem);\r\n });\r\n\r\n cancelBtn.addEventListener('click', () => {\r\n this.parentMenu.hideMenu();\r\n });\r\n }\r\n\r\n // if too many items - then we add a special \"search\" item\r\n // or there is an options to show always\r\n if (this.parentLevel == null \r\n && (this.parentMenu.options.searchBoxAlwaysShown || this.items.length >= this.parentMenu.options.showSearchBoxAfter)) {\r\n\r\n const searchDivBuilder = \r\n domel('div')\r\n .addClass(`${this.cssPrefix}-searchDiv`);\r\n\r\n if (this.parentMenu.options.useDefaultStyles) {\r\n searchDivBuilder\r\n .setStyle('border-bottom', '1px solid #666')\r\n .setStyle('background-color', itemBgColor)\r\n .setStyle('border-color', this.parentMenu.style.colors.border);\r\n\r\n if (itemFontFamily != \"\") { \r\n searchDivBuilder.setStyle('font-family', itemFontFamily); \r\n }\r\n\r\n searchDivBuilder\r\n .setStyle('font-size', itemFontSize)\r\n .setStyle('color', itemFgColor)\r\n .setStyle('cursor', 'pointer')\r\n .setStyle('text-align', 'left')\r\n .setStyle('padding', '5px');\r\n }\r\n\r\n const searchEditBoxBuilder = \r\n domel('input')\r\n .id('searchBox')\r\n .name('searchBox')\r\n .type('text')\r\n .size(16)\r\n .addClass(`${this.cssPrefix}-searchBox`)\r\n .on('input', (ev) => {\r\n this.deactivateItem(this.activeItem);\r\n this.renderItems(this.searchBox.value);\r\n })\r\n .on('keydown', (ev) => {\r\n let keyCode = (ev as KeyboardEvent).keyCode;\r\n switch (keyCode) {\r\n case 13: //enter\r\n if (this.activeItem) {\r\n this.activeItem.itemDiv.click();\r\n }\r\n break;\r\n\r\n case 38: // up\r\n this.moveActiveItemUp();\r\n break;\r\n \r\n case 40: // down\r\n this.moveActiveItemDown();\r\n break;\r\n\r\n case 39: // right\r\n if (!this.searchBox.value) {\r\n this.openSubLevel(this.activeItem);\r\n }\r\n break; \r\n } \r\n });\r\n\r\n if (this.parentMenu.options.useDefaultStyles) {\r\n searchEditBoxBuilder\r\n .setStyle('font-family', 'monospace')\r\n .setStyle('font-size', '8pt')\r\n .setStyle('width', '100%');\r\n }\r\n\r\n if (isSubQuery) {\r\n searchEditBoxBuilder.addClass('eqjs-dialog')\r\n }\r\n\r\n this.searchBox = searchEditBoxBuilder.toDOM();\r\n this.searchDiv = searchDivBuilder.toDOM();\r\n\r\n this.searchDiv.appendChild(this.searchBox);\r\n baseDiv.appendChild(this.searchDiv);\r\n\r\n }\r\n\r\n const scrollDiv = document.createElement(\"div\");\r\n scrollDiv.tabIndex = 1;\r\n domel(scrollDiv)\r\n .addClass(`${this.cssPrefix}-scrollDiv`)\r\n .addClass(browserUtils.getMobileCssClass());\r\n scrollDiv.style.overflowX = \"hidden\";\r\n scrollDiv.style.overflowY = \"auto\";\r\n scrollDiv.style.position = \"relative\";\r\n baseDiv.appendChild(scrollDiv);\r\n this.levelDiv = baseDiv;\r\n this.scrollDiv = scrollDiv;\r\n\r\n if (this.menuId) {\r\n this.levelDiv.id = this.menuId;\r\n }\r\n\r\n if (this.parentLevel) {\r\n this.levelDiv.style.zIndex\r\n = this.parentLevel.levelDiv.style.zIndex;\r\n }\r\n\r\n this.renderItems();\r\n\r\n const scrollDivKeyDownHandler = (event: KeyboardEvent) => {\r\n switch(event.which) {\r\n case 13: // enter\r\n if (this.parentMenu.options.multiselect) {\r\n this.parentMenu.getRootLevel().applyBtn.click();\r\n }\r\n else {\r\n if (this.activeItem) {\r\n this.activeItem.itemDiv.click();\r\n }\r\n }\r\n break;\r\n\r\n case 32: // space\r\n if (this.activeItem) {\r\n this.activeItem.itemDiv.click();\r\n }\r\n break;\r\n\r\n case 37: // left\r\n if (this.parentLevel && !this.isFilteringMode) {\r\n this.deactivateItem(this.activeItem);\r\n this.parentLevel.focus();\r\n }\r\n break;\r\n\r\n case 39: // right\r\n this.openSubLevel(this.activeItem);\r\n break;\r\n\r\n case 38: // up\r\n this.moveActiveItemUp();\r\n break;\r\n\r\n case 40: // down\r\n this.moveActiveItemDown();\r\n break;\r\n\r\n default: return; // exit this handler for other keys\r\n }\r\n event.preventDefault(); // prevent the default action (scroll / move caret) \r\n };\r\n\r\n scrollDiv.addEventListener(\"keydown\", scrollDivKeyDownHandler);\r\n\r\n if (browserUtils.isMobileMode()) {\r\n this.closeDiv = \r\n domel('div', baseDiv)\r\n .addClass('eqjs-menu-close-btn')\r\n .addText(i18n.getText('ButtonClose'))\r\n .on('click', () => {\r\n this.parentMenu.hideMenu();\r\n })\r\n .toDOM();\r\n\r\n }\r\n }\r\n\r\n private moveActiveItemDown() {\r\n const items = this.isFilteringMode ? this.filteredItems : this.items;\r\n\r\n if (this.activeItem) {\r\n const idx = items.indexOf(this.activeItem);\r\n if (idx < items.length - 1) {\r\n this.activateItem(items[idx + 1], false);\r\n }\r\n }\r\n else {\r\n this.activateItem(items[0], false);\r\n }\r\n }\r\n\r\n private moveActiveItemUp() {\r\n const items = this.isFilteringMode ? this.filteredItems : this.items;\r\n if (this.activeItem) {\r\n const idx = items.indexOf(this.activeItem);\r\n if (idx > 0) {\r\n this.activateItem(items[idx - 1], false);\r\n }\r\n }\r\n else {\r\n this.activateItem(items[items.length - 1], false);\r\n }\r\n }\r\n\r\n private openSubLevel(menuItem) {\r\n if (menuItem && menuItem.items && !this.isFilteringMode) {\r\n this.showSubLevel(menuItem);\r\n menuItem.subLevel.activateItem(menuItem.subLevel.items[0]);\r\n }\r\n }\r\n\r\n\r\n public focusScrollDiv() {\r\n this.scrollDiv.focus();\r\n }\r\n\r\n private turnCheckboxes(items: MenuItem[]) {\r\n //turn checkboxes on for selected items\r\n for (let i = 0; i < items.length; i++) {\r\n const item = items[i];\r\n if (item.itemCheckbox)\r\n item.itemCheckbox.checked = this.isItemSelected(item);\r\n if (item.items) {\r\n this.turnCheckboxes(item.items);\r\n }\r\n }\r\n }\r\n\r\n private isItemSelected(item) {\r\n if (item.items) {\r\n for (var i = 0; i < item.items.length; i++) {\r\n if (this.isItemSelected(item.items[i])) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n else {\r\n return item.selected;\r\n }\r\n }\r\n\r\n private setItemSelected(item, value) {\r\n if (item.items) {\r\n for (let i = 0; i < item.items.length; i++) {\r\n this.setItemSelected(item.items[i], value);\r\n }\r\n }\r\n else {\r\n item.selected = value;\r\n }\r\n }\r\n\r\n private submitItems(items, selectedItems) {\r\n for (let j = 0; j < items.length; j++) {\r\n if (items[j].items) {\r\n this.submitItems(items[j].items, selectedItems);\r\n }\r\n else {\r\n if (items[j].selected) {\r\n selectedItems.push(items[j]);\r\n }\r\n }\r\n }\r\n }\r\n\r\n private allSubitemsAreFiltered(items, filterCallback: (item: any) => boolean) {\r\n for (let i = 0; i < items.length; i++) {\r\n if (filterCallback(items[i])) \r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n private isItemDiv(element: HTMLElement) : boolean {\r\n return element['menuItem'] ? true : false;\r\n }\r\n\r\n private isLevelDiv(element: HTMLElement) : boolean {\r\n return element['menuLevel'] ? true : false;\r\n }\r\n\r\n private getMenuItem(element : HTMLElement | EventTarget) : any {\r\n let el = element as HTMLElement;\r\n while (!this.isItemDiv(el)) {\r\n if (this.isLevelDiv(el)) {\r\n throw \"Can't get menu item\";\r\n }\r\n el = el.parentElement;\r\n }\r\n\r\n return el['menuItem'];\r\n }\r\n\r\n private renderItemsWithoutFilter() {\r\n this.isFilteringMode = false;\r\n\r\n const scrollDiv = this.scrollDiv;\r\n\r\n const multiselect = this.parentMenu.options.multiselect;\r\n const activateOnMouseOver = this.parentMenu.options.activateOnMouseOver;\r\n\r\n const itemFgColor = this.parentMenu.style.colors.fgON || 'black';\r\n const itemOverBgColor = this.parentMenu.style.colors.bgOVER || 'LightSteelBlue';\r\n\r\n const itemFontSize = this.parentMenu.style.itemStyle.fontSize || '14px';\r\n const itemFilterCallback = this.parentMenu.getItemFilterCallback();\r\n\r\n scrollDiv.innerHTML = \"\";\r\n\r\n for (let i = 0; i < this.items.length; i++) {\r\n const item = this.items[i];\r\n if (!item || !item.text) continue;\r\n if (itemFilterCallback) {\r\n if (!itemFilterCallback(item)) continue;\r\n if (item.items && this.allSubitemsAreFiltered(item.items, itemFilterCallback)) continue;\r\n }\r\n\r\n item.data = (propName) => {\r\n return this[propName];\r\n };\r\n\r\n if (typeof (item.selected) == \"undefined\") {\r\n item.selected = false;\r\n }\r\n if (item.selected && this.selectedItem == null) {\r\n this.selectedItem = item;\r\n }\r\n const itemDiv = document.createElement(\"div\");\r\n domel(itemDiv)\r\n .addClass(`${this.cssPrefix}-itemDiv`)\r\n .addClass(browserUtils.getMobileCssClass());\r\n\r\n if (item.selected && this.showSelected && !multiselect) {\r\n itemDiv.classList.add(`${this.cssPrefix}-selected`)\r\n };\r\n\r\n if (this.domWriteItemsId && this.menuId) {\r\n itemDiv.id = 'item-' + this.menuId + '-' + item.id;\r\n }\r\n\r\n scrollDiv.appendChild(itemDiv);\r\n\r\n itemDiv['menuItem'] = item;\r\n itemDiv['menuLevel'] = this;\r\n item.itemDiv = itemDiv;\r\n if (this.parentMenu.options.useDefaultStyles) {\r\n itemDiv.style.fontSize = itemFontSize;\r\n itemDiv.style.color = itemFgColor;\r\n itemDiv.style.paddingLeft = \"15px\";\r\n itemDiv.style.paddingRight = \"6px\";\r\n itemDiv.style.cursor = \"pointer\";\r\n }\r\n\r\n if (item.text == '---') {\r\n itemDiv.appendChild(document.createElement('hr'));\r\n }\r\n else {\r\n if (multiselect) { \r\n var cb = document.createElement(\"input\");\r\n cb.type = \"checkbox\";\r\n cb.id = \"cb\" + item.id;\r\n cb.checked = this.isItemSelected(item);\r\n cb.defaultChecked = this.isItemSelected(item);\r\n itemDiv.appendChild(cb);\r\n item.itemCheckbox = cb;\r\n if (this.parentMenu.options.useDefaultStyles) {\r\n cb.style.margin = \"4px 10px 0 0\";\r\n cb.style.verticalAlign = \"top\";\r\n }\r\n }\r\n\r\n\r\n let itemText = item.text;\r\n if (this.parentMenu.options.showItemIds) {\r\n itemText = item.id + ':' + itemText;\r\n }\r\n const itemTextNode = document.createTextNode(itemText);\r\n itemDiv.appendChild(itemTextNode);\r\n\r\n if (item.items && item.items.length > 0) {\r\n itemDiv.classList.add(`${this.cssPrefix}-itemDiv-hasChildren`);\r\n\r\n const arrowSpan = document.createElement('span');\r\n arrowSpan.classList.add(`${this.cssPrefix}-itemDiv-arrow`);\r\n itemDiv.appendChild(arrowSpan);\r\n\r\n const arrowText = document.createTextNode('>');\r\n arrowSpan.appendChild(arrowText);\r\n }\r\n\r\n const itemClickHandler = (ev: MouseEvent) => {\r\n const menuItem = this.getMenuItem(ev.target);\r\n if (multiselect) {\r\n if (!menuItem.items || ev.target == menuItem.itemCheckbox) {\r\n const itemSelected = this.isItemSelected(menuItem);\r\n this.setItemSelected(menuItem, !itemSelected);\r\n menuItem.itemCheckbox.checked = !itemSelected;\r\n this.parentMenu.refreshCheckboxes();\r\n }\r\n else {\r\n this.activateItem(menuItem);\r\n }\r\n }\r\n else {\r\n this.activateItem(menuItem);\r\n this.submit(menuItem);\r\n }\r\n return false;\r\n };\r\n\r\n itemDiv.removeEventListener(\"click\", itemClickHandler);\r\n itemDiv.addEventListener('click', itemClickHandler);\r\n\r\n itemDiv.addEventListener('mouseenter', (ev) => {\r\n const item = this.getMenuItem(ev.target);\r\n this.parentMenu.isCursorInside = true;\r\n if (activateOnMouseOver) {\r\n this.activateItem(item);\r\n }\r\n });\r\n\r\n itemDiv.addEventListener('mouseleave', (ev) => {\r\n const item = this.getMenuItem(ev.target);\r\n this.parentMenu.isCursorInside = false;\r\n setTimeout(() => {\r\n if (!this.parentMenu.isCursorInside) {\r\n if (activateOnMouseOver && item == this.activeItem && !item.subLevel) {\r\n this.deactivateItem(item);\r\n }\r\n }\r\n }, 200);\r\n });\r\n }\r\n\r\n if (this.itemRenderedCallback) {\r\n this.itemRenderedCallback(this.menuId, itemDiv);\r\n }\r\n }\r\n }\r\n\r\n private renderItemsWithFilter(filter: string) {\r\n this.isFilteringMode = true;\r\n\r\n const scrollDiv = this.scrollDiv;\r\n scrollDiv.innerHTML = \"\";\r\n\r\n const filterSections = filter.split('>');\r\n const pureFilterTexts = filterSections.map(section => section.replace(/\\*/g, ''));\r\n\r\n const items = this.filterItems(this.items, filterSections);\r\n this.filteredItems = [];\r\n for (let i = 0; i < items.length; i++) {\r\n this.renderItemWithFilter(items[i], pureFilterTexts, 0);\r\n }\r\n }\r\n\r\n private matchesFilter(text: string, regexp?: RegExp) : boolean {\r\n if (text && regexp) {\r\n return regexp.test(text);\r\n }\r\n else {\r\n return true;\r\n }\r\n }\r\n\r\n private filterItems(items: MenuItem[], filterSections: string[]): MenuItem[] {\r\n const resultItems = [];\r\n const filter = filterSections.length > 0 ? filterSections[0] : '';\r\n const restFilterSections = filterSections.length > 1 ? filterSections.slice(1) : filterSections;\r\n const filterRegexp = filter ? new RegExp(filter.replace(/\\*/g, '.+?'), 'i') : null;\r\n for (let i = 0; i < items.length; i++) {\r\n const item = items[i];\r\n if (item.items) {\r\n const groupItem = dataUtils.assign({ }, item);\r\n const groupItemMatches = this.matchesFilter(item.text, filterRegexp);\r\n\r\n //if we have only one filter section (or an empty filter)\r\n if (filterSections.length < 2) {\r\n //if current group item matches the filter -> show all sub-items\r\n if (groupItemMatches && filterSections.length < 2) {\r\n groupItem.items = dataUtils.createArrayFrom(item.items);\r\n }\r\n else {\r\n groupItem.items = this.filterItems(item.items, restFilterSections); \r\n }\r\n }\r\n //if we have more than 1 filter section and there is a match -> filter sub-items as well\r\n else if (groupItemMatches) {\r\n groupItem.items = this.filterItems(item.items, restFilterSections);\r\n }\r\n //otherwise we skip this group at all\r\n else {\r\n groupItem.items = [];\r\n }\r\n\r\n if (groupItem.items.length > 0) {\r\n resultItems.push(groupItem) \r\n }\r\n } \r\n else {\r\n if (this.matchesFilter(item.text, filterRegexp)) {\r\n resultItems.push(item);\r\n }\r\n }\r\n }\r\n\r\n return resultItems;\r\n }\r\n\r\n private renderItemWithFilter(item: MenuItem, filterTexts: string[], level: number) {\r\n const scrollDiv = this.scrollDiv;\r\n\r\n const levelFilterText = level < filterTexts.length ? filterTexts[level] : filterTexts[filterTexts.length - 1]; \r\n\r\n const multiselect = this.parentMenu.options.multiselect;\r\n const activateOnMouseOver = this.parentMenu.options.activateOnMouseOver;\r\n\r\n const itemFgColor = this.parentMenu.style.colors.fgON || 'black';\r\n const itemOverBgColor = this.parentMenu.style.colors.bgOVER || 'LightSteelBlue';\r\n\r\n const itemFontSize = this.parentMenu.style.itemStyle.fontSize || '14px';\r\n const itemFilterCallback = this.parentMenu.getItemFilterCallback();\r\n\r\n if (!item || !item.text) return;\r\n if (itemFilterCallback) {\r\n if (!itemFilterCallback(item)) return;\r\n if (item.items && this.allSubitemsAreFiltered(item.items, itemFilterCallback)) return;\r\n }\r\n\r\n item.data = function (propName) {\r\n return this[propName];\r\n };\r\n\r\n if (typeof (item.selected) == \"undefined\") {\r\n item.selected = false;\r\n }\r\n if (item.selected && this.selectedItem == null) {\r\n this.selectedItem = item;\r\n }\r\n const itemDiv = document.createElement(\"div\");\r\n domel(itemDiv)\r\n .addClass(`${this.cssPrefix}-itemDiv`)\r\n .addClass(browserUtils.getMobileCssClass());\r\n\r\n itemDiv.style.marginLeft = `${level * 10}px`;\r\n\r\n if (item.selected && !multiselect) {\r\n itemDiv.classList.add(`${this.cssPrefix}-selected`)\r\n };\r\n\r\n if (this.domWriteItemsId && this.menuId) {\r\n itemDiv.id = 'item-' + this.menuId + '-' + item.id;\r\n }\r\n\r\n scrollDiv.appendChild(itemDiv);\r\n\r\n itemDiv['menuItem'] = item;\r\n itemDiv['menuLevel'] = this;\r\n item.itemDiv = itemDiv;\r\n if (this.parentMenu.options.useDefaultStyles) {\r\n itemDiv.style.fontSize = itemFontSize;\r\n itemDiv.style.color = itemFgColor;\r\n itemDiv.style.paddingLeft = \"15px\";\r\n itemDiv.style.paddingRight = \"6px\";\r\n itemDiv.style.cursor = \"pointer\";\r\n }\r\n\r\n if (item.text == '---') {\r\n itemDiv.appendChild(document.createElement('hr'));\r\n }\r\n else {\r\n if (multiselect) { \r\n var cb = document.createElement(\"input\");\r\n cb.type = \"checkbox\";\r\n cb.id = \"cb\" + item.id;\r\n cb.checked = this.isItemSelected(item);\r\n cb.defaultChecked = this.isItemSelected(item);\r\n itemDiv.appendChild(cb);\r\n item.itemCheckbox = cb;\r\n if (this.parentMenu.options.useDefaultStyles) {\r\n cb.style.margin = \"4px 10px 0 0\";\r\n cb.style.verticalAlign = \"top\";\r\n }\r\n }\r\n\r\n const itemText = document.createElement('span');\r\n itemText.innerHTML = this.highlightText(item.text, levelFilterText);\r\n itemDiv.appendChild(itemText);\r\n\r\n if (item.items && item.items.length > 0) {\r\n itemDiv.classList.add(`${this.cssPrefix}-itemDiv-filter-hasChildren`);\r\n }\r\n else {\r\n this.filteredItems.push(item);\r\n\r\n const itemClickHandler = (event: MouseEvent) => {\r\n if (multiselect) {\r\n if (!item.items || event.target == item.itemCheckbox) {\r\n const itemSelected = this.isItemSelected(item);\r\n this.setItemSelected(item, !itemSelected);\r\n item.itemCheckbox.checked = !itemSelected;\r\n this.parentMenu.refreshCheckboxes();\r\n }\r\n else {\r\n this.activateItem(item);\r\n }\r\n }\r\n else {\r\n this.activateItem(item);\r\n this.submit(item);\r\n }\r\n return false;\r\n };\r\n \r\n itemDiv.removeEventListener(\"click\", itemClickHandler);\r\n itemDiv.addEventListener('click', itemClickHandler);\r\n \r\n itemDiv.addEventListener('mouseenter', (ev) => {;\r\n this.parentMenu.isCursorInside = true;\r\n if (activateOnMouseOver) {\r\n this.activateItem(item);\r\n }\r\n });\r\n \r\n itemDiv.addEventListener('mouseleave', (ev) => {\r\n this.parentMenu.isCursorInside = false;\r\n setTimeout(() => {\r\n if (!this.parentMenu.isCursorInside) {\r\n if (activateOnMouseOver && item == this.activeItem && !item.subLevel) {\r\n this.deactivateItem(item);\r\n }\r\n }\r\n }, 200);\r\n });\r\n }\r\n }\r\n\r\n if (item.items) {\r\n for(let i = 0; i < item.items.length; i++) {\r\n this.renderItemWithFilter(item.items[i], filterTexts, level + 1);\r\n }\r\n }\r\n\r\n if (this.itemRenderedCallback) {\r\n this.itemRenderedCallback(this.menuId, itemDiv);\r\n }\r\n }\r\n\r\n private highlightText(content: string, text: string): string {\r\n if (text && text.length > 0) {\r\n const lowerText = text.toLowerCase();\r\n const lowerContent = content.toLowerCase();\r\n const insertValue1 = `<span class='eqjs-menu-itemDiv-highlight'>`;\r\n const insertValue2 = `</span>`;\r\n const startIndex = lowerContent.indexOf(lowerText);\r\n if (startIndex >= 0) {\r\n let pos = 0;\r\n const value = content;\r\n const indexInMas = [];\r\n while (true) {\r\n const index = lowerContent.indexOf(lowerText, pos);\r\n if (index >= 0) {\r\n indexInMas.push(index);\r\n pos = index + text.length;\r\n } else {\r\n pos++;\r\n }\r\n if (pos >= value.length - 1) {\r\n break;\r\n }\r\n }\r\n if (indexInMas.length > 0) {\r\n content = '';\r\n for (let i = 0; i < indexInMas.length; i++) {\r\n if (i === 0) {\r\n content += value.substring(0, indexInMas[i]);\r\n }\r\n \r\n content += insertValue1 + value.substring(indexInMas[i], indexInMas[i] + text.length) + insertValue2;\r\n \r\n if (i < indexInMas.length - 1) {\r\n content += value.substring(indexInMas[i] + text.length, indexInMas[i + 1]);\r\n } else {\r\n content += value.substring(indexInMas[i] + text.length);\r\n }\r\n \r\n }\r\n }\r\n }\r\n \r\n }\r\n\r\n return content;\r\n }\r\n\r\n\r\n private renderItems(filter?: string) {\r\n if (!filter && !browserUtils.isMobileMode()) {\r\n this.renderItemsWithoutFilter();\r\n } \r\n else {\r\n filter = filter || '';\r\n this.renderItemsWithFilter(filter.toLowerCase());\r\n }\r\n \r\n }\r\n\r\n public activateItem(menuItem, openSubLevel = true) {\r\n if (this.activeItem != null) {\r\n this.deactivateItem(this.activeItem);\r\n }\r\n this.activeItem = menuItem;\r\n\r\n const rowElement = menuItem.itemDiv as HTMLDivElement;\r\n rowElement.classList.add('active');\r\n\r\n if (this.parentMenu.options.useDefaultStyles) {\r\n const itemBgColor = this.parentMenu.style.colors.bgON;\r\n const itemFgColor = this.parentMenu.style.colors.fgON;\r\n const itemOverBgColor = this.parentMenu.style.colors.bgOVER;\r\n const itemOverFgColor = this.parentMenu.style.colors.fgOVER || \"\";\r\n\r\n const itemClass = this.parentMenu.style.itemClass || \"\";\r\n const itemClassOver = this.parentMenu.style.itemClassOver || \"\";\r\n\r\n if (itemClassOver != \"\") {\r\n rowElement.style.backgroundColor = \"\";\r\n rowElement.style.color = \"\";\r\n }\r\n else {\r\n rowElement.style.backgroundColor = itemOverBgColor;\r\n rowElement.style.color = itemOverFgColor;\r\n }\r\n }\r\n\r\n if (menuItem.items && !this.isFilteringMode && openSubLevel) {\r\n this.showSubLevel(menuItem);\r\n }\r\n }\r\n\r\n public deactivateItem(menuItem) {\r\n if (!menuItem) return; \r\n const rowElement = menuItem.itemDiv as HTMLElement;\r\n\r\n rowElement.classList.remove('active');\r\n\r\n if (this.parentMenu.options.useDefaultStyles) {\r\n const itemBgColor = this.parentMenu.style.colors.bgON;\r\n const itemFgColor = this.parentMenu.style.colors.fgON;\r\n\r\n const itemClass = this.parentMenu.style.itemClass || \"\";\r\n if (itemClass != \"\") {\r\n rowElement.style.backgroundColor = \"\";\r\n rowElement.style.color = \"\";\r\n }\r\n else {\r\n rowElement.style.backgroundColor = itemBgColor;\r\n rowElement.style.color = itemFgColor;\r\n }\r\n }\r\n\r\n if (menuItem.subLevel) {\r\n menuItem.subLevel.hide();\r\n }\r\n\r\n this.activeItem = null;\r\n }\r\n\r\n public showSubLevel(menuItem: MenuItem) {\r\n if (!menuItem.subLevel) {\r\n let levelId = '';\r\n if (this.menuId) {\r\n levelId = this.menuId + \"-\" + menuItem.id;\r\n }\r\n\r\n menuItem.subLevel = new MenuLevel({\r\n showSelected: this.showSelected,\r\n menu: this.parentMenu,\r\n parent: this,\r\n container: this.parentElement,\r\n items: menuItem.items,\r\n levelIndex: this.levelIndex + 1,\r\n domWriteItemsId: this.domWriteItemsId,\r\n menuId: levelId,\r\n itemRenderedCallback: this.itemRenderedCallback\r\n });\r\n }\r\n\r\n const pos = getElementAbsolutePos(menuItem.itemDiv);\r\n const scroll = getScrollPos();\r\n const winSize = getWinSize();\r\n\r\n //show menu to the side that have more space available\r\n const leftSpace = pos.x - scroll.left; \r\n const rightSpace = winSize.width - leftSpace - menuItem.itemDiv.offsetWidth;\r\n \r\n pos.x += (menuItem.itemDiv.offsetParent as HTMLElement).offsetWidth;\r\n pos.y += 1;\r\n menuItem.subLevel.showAt(pos.x, pos.y, true, true);\r\n\r\n menuItem.subLevel.levelDiv.style.width = '';\r\n menuItem.subLevel.levelDiv.style.right = '';\r\n if ((rightSpace >= menuItem.subLevel.levelDiv.offsetWidth) || (rightSpace >= leftSpace)) { //show level to the right\r\n if (rightSpace < menuItem.subLevel.levelDiv.offsetWidth) {\r\n menuItem.subLevel.levelDiv.style.right = -scroll.left + 'px'; \r\n }\r\n }\r\n else { //show level to the left\r\n if (leftSpace < menuItem.subLevel.levelDiv.offsetWidth) {\r\n menuItem.subLevel.levelDiv.style.left = scroll.left + 4 + 'px';\r\n }\r\n else {\r\n menuItem.subLevel.levelDiv.style.left = '';\r\n }\r\n menuItem.subLevel.levelDiv.style.right = getViewportSize().width - pos.x + menuItem.itemDiv.offsetWidth - 6 + 'px';\r\n }\r\n\r\n menuItem.subLevel.levelDiv.style.visibility = 'visible';\r\n menuItem.subLevel.focus();\r\n }\r\n\r\n public adjustTopPos(top: number) {\r\n const winSize = getWinSize();\r\n const levelBottom = top - getScrollPos().top + this.levelDiv.offsetHeight;\r\n\r\n let res = top;\r\n if (levelBottom > winSize.height - 5) {\r\n res -= levelBottom - winSize.height + 5;\r\n if (res < getScrollPos().top) { \r\n res = getScrollPos().top + 10; \r\n }\r\n }\r\n return res;\r\n }\r\n\r\n public showAt(x: number, y: number, adjustTopPos: boolean, hidden: boolean) {\r\n if (!this.items) {\r\n return;\r\n }\r\n\r\n this.initLevelDiv();\r\n\r\n //crocodile\r\n this.turnCheckboxes(this.items);\r\n\r\n this.renderItems();\r\n\r\n const levelStyle = this.levelDiv.style;\r\n if (hidden) {\r\n this.levelDiv.style.visibility = 'hidden'; \r\n }\r\n\r\n levelStyle.display = 'block';\r\n \r\n levelStyle.left = x + 'px';\r\n levelStyle.top = y + 'px';\r\n\r\n\r\n this.scrollDiv.style.width = \"auto\";\r\n this.scrollDiv.style.height = \"auto\";\r\n\r\n //adjusting level top position\r\n if (adjustTopPos) {\r\n y = this.adjustTopPos(y);\r\n levelStyle.top = y + 'px';\r\n }\r\n\r\n //setting minimal level width if it is defined\r\n let minItemWidth = this.parentMenu.minItemWidth;\r\n if (minItemWidth > 0 && this.scrollDiv.offsetWidth < minItemWidth) {\r\n for (let i = 0; i < this.items.length; i++) {\r\n this.items[i].itemDiv.style.width = minItemWidth + \"px\";\r\n }\r\n }\r\n\r\n let maxItemWidth = this.parentMenu.maxItemWidth;\r\n if (maxItemWidth > 0 && this.scrollDiv.offsetWidth > maxItemWidth) {\r\n for (let i = 0; i < this.items.length; i++) {\r\n this.items[i].itemDiv.style.width = maxItemWidth + \"px\";\r\n this.items[i].itemDiv.style.overflowX = \"hidden\";\r\n }\r\n }\r\n\r\n const winSize = getWinSize();\r\n\r\n //adjustinng maximum height of the menu level if it does not fit to browser window\r\n let maxHeight = winSize.height - (y - getScrollPos().top) - 15; //document.documentElement.scrollTop\r\n\r\n if (this.parentMenu.maxHeight > 0 && maxHeight > this.parentMenu.maxHeight) {\r\n maxHeight = this.parentMenu.maxHeight;\r\n }\r\n\r\n if (this._applyItem != null && this._applyItem.itemDiv != null) {\r\n maxHeight -= this._applyItem.itemDiv.offsetHeight + 5;\r\n }\r\n\r\n if (this.searchDiv != null) {\r\n maxHeight -= this.searchDiv.offsetHeight;\r\n }\r\n\r\n if (this.closeDiv != null) {\r\n maxHeight -= this.closeDiv.offsetHeight;\r\n }\r\n\r\n if (this.levelDiv.offsetHeight > maxHeight) {\r\n let newHeight = maxHeight;\r\n if (newHeight < 50) { newHeight = 50; }\r\n\r\n this.scrollDiv.style.height = newHeight + \"px\";\r\n }\r\n else {\r\n this.scrollDiv.style.height = \"auto\";\r\n }\r\n \r\n this.activeItem = null;\r\n }\r\n\r\n public focus() {\r\n window.setTimeout(() => {\r\n this.scrollDiv.focus();\r\n if (this.searchBox != null) {\r\n if (this.parentMenu.options.searchBoxAutoFocus) {\r\n this.searchBox.focus();\r\n }\r\n this.searchBox.value = \"\";\r\n }\r\n }, 100);\r\n }\r\n\r\n public hide() {\r\n if (this.activeItem !== null) {\r\n if (this.activeItem.subLevel) {\r\n this.activeItem.subLevel.hide();\r\n }\r\n }\r\n\r\n if (this.levelDiv) {\r\n var levelStyle = this.levelDiv.style;\r\n levelStyle.display = 'none';\r\n\r\n if (this.initialized) {\r\n this.parentElement.removeChild(this.levelDiv);\r\n this.initialized = false;\r\n }\r\n }\r\n }\r\n\r\n public initLevelDiv() {\r\n if (!this.initialized) {\r\n this.parentElement.appendChild(this.levelDiv);\r\n domel(this.levelDiv)\r\n .addClass(`${this.cssPrefix}-levelDiv`)\r\n .addClass(browserUtils.getMobileCssClass());\r\n this.initialized = true;\r\n }\r\n }\r\n\r\n public submit(menuItem: MenuItem) {\r\n if (menuItem != null) {\r\n if (!menuItem.items) {\r\n this.parentMenu.hideMenu();\r\n let selectedItems = [];\r\n if (menuItem == this._applyItem) {\r\n this.submitItems(this.items, selectedItems);\r\n }\r\n\r\n this.parentMenu.submitMenu(menuItem, selectedItems);\r\n }\r\n }\r\n }\r\n\r\n public remove() {\r\n //remove old level elements\r\n for (let i = 0; i < this.items.length; i++) {\r\n let item = this.items[i];\r\n if (item.subLevel) {\r\n item.subLevel.remove();\r\n }\r\n }\r\n\r\n if (this.levelDiv) {\r\n this.levelDiv.innerHTML = \"\";\r\n const parentNode = this.levelDiv.parentNode;\r\n if (parentNode != null) {\r\n parentNode.removeChild(this.levelDiv);\r\n }\r\n }\r\n\r\n this.levelDiv = null;\r\n }\r\n\r\n public update(newItems: MenuItem[]) {\r\n this.remove();\r\n\r\n //create new level\r\n this.items = newItems;\r\n this.activeItem = null;\r\n this.selectedItem = null;\r\n this._applyItem.itemDiv = null;\r\n this.initialized = false;\r\n this.updated++;\r\n\r\n this.renderContent();\r\n }\r\n\r\n public refreshCheckboxes() {\r\n for (var i = 0; i < this.items.length; i++) {\r\n var item = this.items[i];\r\n if (item.itemCheckbox) {\r\n item.itemCheckbox.checked = this.isItemSelected(item);\r\n }\r\n\r\n if (item.subLevel) {\r\n item.subLevel.refreshCheckboxes();\r\n }\r\n }\r\n }\r\n\r\n public refreshItems() {\r\n for (let i = 0; i < this.items.length; i++) {\r\n const item = this.items[i];\r\n if (item.itemDiv) {\r\n if (item.hidden) {\r\n item.itemDiv.style.display = \"none\";\r\n }\r\n else {\r\n item.itemDiv.style.display = \"block\";\r\n }\r\n }\r\n\r\n if (item.subLevel) {\r\n item.subLevel.refreshItems();\r\n }\r\n }\r\n }\r\n\r\n public findItem(searchedText: string) {\r\n const txt = searchedText.toLowerCase();\r\n\r\n for (let i = 0; i < this.items.length; i++) {\r\n const item = this.items[i];\r\n if (item.text.toLowerCase().indexOf(txt) == 0) {\r\n return item;\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n}\r\n\r\nexport interface MenuItem {\r\n id: string,\r\n text: string,\r\n selected?: boolean;\r\n data?: any,\r\n items?: MenuItem[]\r\n hidden?: boolean,\r\n subLevel?: MenuLevel,\r\n itemDiv?: HTMLElement,\r\n itemCheckbox?: HTMLInputElement,\r\n extra?: any\r\n}\r\n\r\nexport interface PopupMenuOptions {\r\n activateOnMouseOver?: boolean;\r\n searchBoxAutoFocus?: boolean;\r\n searchBoxAlwaysShown?: boolean;\r\n useDefaultStyles?: boolean;\r\n multiselect?: boolean;\r\n isSubQuery?: boolean;\r\n buttons?: {\r\n submit?: string;\r\n cancel?: string;\r\n },\r\n submitOnBlur?: boolean;\r\n hideButtons?: boolean;\r\n items?: MenuItem[];\r\n container?: HTMLElement;\r\n domWriteItemsId?: boolean;\r\n id?: string;\r\n itemRenderedCallback?: (item: any, itemDiv: HTMLDivElement) => void;\r\n itemFilterCallback?: (item: any) => boolean;\r\n itemSelectedCallback?: (item: any, selectedItems: any[]) => void;\r\n menuClosedCallback?: () => void;\r\n zIndex?: number;\r\n onMenuItemSelected?: boolean;\r\n selectedIds?: string[] | string;\r\n anchor?: HTMLElement;\r\n adjustHeight?: boolean;\r\n \r\n /** \r\n * If the number of items in drop down menu exceeds this number then a search box will be displayed. \r\n * Set this option to 0 if want to show the search box in any case \r\n */\r\n showSearchBoxAfter?: number;\r\n showSelected?: boolean;\r\n\r\n /** If true - the menu will show the ID for each item (e.g. {itemId}:{itemText}) */\r\n showItemIds?: boolean\r\n}\r\n\r\nexport class PopupMenu {\r\n private static lastMenuID = 0;\r\n\r\n public maxHeight: number;\r\n public minItemWidth: number;\r\n public maxItemWidth: number;\r\n public isCursorInside: boolean = false;\r\n public style: any;\r\n public zIndex: string;\r\n\r\n private itemFilterCallback: (item: any) => boolean;\r\n private itemSelectedCallback: (item: any, selectedItems: any[]) => void;\r\n private menuClosedCallback: () => void;\r\n\r\n private rootLevel: MenuLevel;\r\n\r\n private menuId: number;\r\n\r\n private mouseIsOverBlock: boolean = false;\r\n private mouseIsOverLink: boolean = false;\r\n private toId: string = null;\r\n\r\n private commandTemplate: string;\r\n private args: any[];\r\n\r\n private globalMouseDownHandler: (e: MouseEvent) => void;\r\n private menuKeyUpHandler: (e: KeyboardEvent) => void;\r\n\r\n private active: boolean = false;\r\n\r\n private ancorFocused: HTMLElement = null;\r\n\r\n protected get cssPrefix(): string {\r\n return 'eqjs-menu';\r\n }\r\n\r\n public options: PopupMenuOptions = {\r\n items: [],\r\n buttons: {\r\n submit: i18n.getText('ButtonApply'),\r\n cancel: i18n.getText('ButtonCancel')\r\n },\r\n itemFilterCallback : null,\r\n useDefaultStyles: false,\r\n multiselect: false,\r\n adjustHeight: true,\r\n showSearchBoxAfter: 30,\r\n activateOnMouseOver: true,\r\n container: document.body,\r\n domWriteItemsId: false,\r\n itemRenderedCallback: null,\r\n showItemIds: false\r\n };\r\n\r\n constructor(options?: PopupMenuOptions) {\r\n if (options) {\r\n dataUtils.assignDeep(this.options, options);\r\n }\r\n\r\n if (this.options.hideButtons) {\r\n this.options.submitOnBlur = true;\r\n }\r\n\r\n this.menuId = PopupMenu.lastMenuID++;\r\n\r\n this.updateProps();\r\n\r\n this.rootLevel = new MenuLevel({\r\n menu: this,\r\n items: this.options.items,\r\n levelIndex: 0,\r\n container: this.options.container,\r\n domWriteItemsId: this.options.domWriteItemsId,\r\n menuId: this.options.id,\r\n itemRenderedCallback: this.options.itemRenderedCallback,\r\n showSelected: this.options.showSelected,\r\n });\r\n\r\n this.rootLevel.levelDiv.classList.add(`${this.cssPrefix}-rootLevel`);\r\n if (this.options.zIndex)\r\n this.rootLevel.levelDiv.style.zIndex = `${this.options.zIndex}`;\r\n\r\n this.menuKeyUpHandler = (e: KeyboardEvent) => {\r\n if (e.which == 27) {\r\n this.hideMenu();\r\n e.stopImmediatePropagation();\r\n }\r\n };\r\n\r\n this.globalMouseDownHandler = (e: MouseEvent) => {\r\n if (!this.active) return true;\r\n let event = window.event || e;\r\n let o: any = event.srcElement || event.target;\r\n let isOutside = true;\r\n\r\n while (o) {\r\n if (o.tagName && o.tagName.toLowerCase() == 'div') {\r\n\r\n // it is added in renderContent of MenuLevel class\r\n if (o.menuLevel) {\r\n if (o.menuLevel.parentMenu == this) {\r\n isOutside = false;\r\n break;\r\n }\r\n }\r\n }\r\n o = o.parentNode || o.parentElement;\r\n }\r\n\r\n if (isOutside) {\r\n if (this.options.submitOnBlur) {\r\n this.rootLevel.submit(this.rootLevel.applyItem);\r\n }\r\n this.hideMenu();\r\n }\r\n \r\n return true;\r\n };\r\n\r\n\r\n this.render();\r\n }\r\n\r\n public getItems() : MenuItem[] {\r\n return this.rootLevel.getItems();\r\n }\r\n\r\n private updateProps() {\r\n this.style = {};\r\n this.style.colors = { border: \"#666666\", shadow: \"#888888\", bgON: \"white\", fgON: \"black\", bgOVER: \"#B6BDD2\", fgOVER: \"black\" };\r\n this.style.itemStyle = { fontSize: \"14px\" };\r\n\r\n this.minItemWidth = 0;\r\n this.maxItemWidth = 0;\r\n this.maxHeight = 0;\r\n this.zIndex = `${this.options.zIndex}`;\r\n\r\n this.commandTemplate = \"\";\r\n this.args = [];\r\n this.active = false;\r\n }\r\n\r\n private render() {\r\n\r\n }\r\n\r\n private clearItemsMenuProps(items: MenuItem[]) {\r\n if (!items) return;\r\n\r\n for (var i = 0; i < items.length; i++) {\r\n this.clearItemMenuProps(items[i]);\r\n }\r\n }\r\n\r\n private clearItemMenuProps(item) {\r\n //don't clear properties they belong this menu\r\n if (item.subLevel && item.subLevel.parentMenu == this) return;\r\n\r\n if (item.subLevel) {\r\n item.subLevel.remove();\r\n item.subLevel = null;\r\n }\r\n\r\n if (item.itemDiv) {\r\n item.itemDiv = null;\r\n }\r\n\r\n if (item.items) {\r\n this.clearItemsMenuProps(item.items);\r\n } \r\n }\r\n\r\n private setSelectedItems(items, selectedIds) {\r\n const itemsLength = items ? items.length : 0;\r\n for (let i = 0; i < itemsLength; i++) {\r\n const item = items[i];\r\n if (item.items) {\r\n this.setSelectedItems(item.items, selectedIds);\r\n }\r\n else {\r\n item.selected = selectedIds.indexOf(item.id) >= 0;\r\n }\r\n }\r\n }\r\n\r\n public getRootLevel(): MenuLevel {\r\n return this.rootLevel;\r\n }\r\n\r\n public getItemFilterCallback(): (item: MenuItem) => boolean {\r\n return this.itemFilterCallback;\r\n }\r\n \r\n public showMenu(options: PopupMenuOptions) {\r\n this.ancorFocused = options.anchor == document.activeElement ? options.anchor : null;\r\n\r\n this.clearItemsMenuProps(this.options.items);\r\n\r\n this.itemSelectedCallback = options.itemSelectedCallback || null;\r\n this.menuClosedCallback = options.menuClosedCallback || null;\r\n this.itemFilterCallback = options.itemFilterCallback || null;\r\n\r\n\r\n if (options.items) {\r\n this.options.items = options.items;\r\n this.rootLevel.setItems(options.items);\r\n }\r\n\r\n if (options.onMenuItemSelected) {\r\n this.options.onMenuItemSelected = options.onMenuItemSelected;\r\n }\r\n\r\n let selectedIds = options.selectedIds || null;\r\n if (selectedIds) {\r\n if (typeof selectedIds === \"string\") {\r\n selectedIds = selectedIds.split(\",\");\r\n }\r\n }\r\n else {\r\n selectedIds = [];\r\n }\r\n\r\n this.active = true;\r\n\r\n this.setSelectedItems(this.options.items, selectedIds);\r\n\r\n if (browserUtils.isMobileMode()) {\r\n this.rootLevel.showAt(0, 0, true, true);\r\n this.rootLevel.levelDiv.style.top = '0px';\r\n this.rootLevel.levelDiv.style.bottom = '0px';\r\n this.rootLevel.levelDiv.style.right = '0px';\r\n this.rootLevel.levelDiv.style.position = 'fixed';\r\n this.rootLevel.levelDiv.style.fontSize = '20px';\r\n } \r\n else {\r\n const anchor = options.anchor || document.documentElement;\r\n\r\n const srcPos = getElementAbsolutePos(anchor);\r\n \r\n const anchorHeight = anchor.offsetHeight;\r\n const anchorWidth = anchor.offsetWidth;\r\n \r\n const pos = {\r\n x: srcPos.x,\r\n y: srcPos.y + anchorHeight + 2\r\n };\r\n const scroll = getScrollPos();\r\n const winSize = getWinSize();\r\n \r\n //show menu to the side that have more space available\r\n const leftSpace = pos.x + anchorWidth - scroll.left;\r\n const rightSpace = winSize.width - leftSpace + anchorWidth;\r\n \r\n pos.x += 2;\r\n \r\n this.rootLevel.showAt(pos.x, pos.y, true, true);\r\n\r\n this.rootLevel.levelDiv.style.width = '';\r\n this.rootLevel.levelDiv.style.right = '';\r\n\r\n if (!this.rootLevel.levelDiv.style.zIndex) {\r\n // z-index is at least 10000 and more if anchor has bigger\r\n this.rootLevel.levelDiv.style.zIndex = `${Math.max(10000, findHighestZIndex(anchor) + 1)}`;\r\n }\r\n \r\n if ((rightSpace >= this.rootLevel.levelDiv.offsetWidth) || (rightSpace >= leftSpace)) {\r\n //show level to the right\r\n if (rightSpace < this.rootLevel.levelDiv.offsetWidth) {\r\n this.rootLevel.levelDiv.style.right = -scroll.left + 'px';\r\n }\r\n }\r\n else { \r\n //show level to the left\r\n if (leftSpace < this.rootLevel.levelDiv.offsetWidth) {\r\n this.rootLevel.levelDiv.style.left = scroll.left + 4 + 'px';\r\n }\r\n else {\r\n this.rootLevel.levelDiv.style.left = '';\r\n }\r\n this.rootLevel.levelDiv.style.right = getViewportSize().width - pos.x - anchorWidth + 'px';\r\n }\r\n\r\n this.rootLevel.levelDiv.style.fontSize = '14px';\r\n }\r\n \r\n\r\n this.rootLevel.levelDiv.style.visibility = 'visible';\r\n this.rootLevel.focus();\r\n\r\n document.addEventListener('keyup', this.menuKeyUpHandler);\r\n document.addEventListener('mousedown', this.globalMouseDownHandler, true);\r\n }\r\n\r\n public hideMenu() {\r\n document.removeEventListener('mousedown', this.globalMouseDownHandler, true);\r\n document.removeEventListener('keyup', this.menuKeyUpHandler);\r\n this.rootLevel.hide();\r\n \r\n if (this.ancorFocused) {\r\n this.ancorFocused.focus();\r\n }\r\n\r\n if (this.menuClosedCallback) {\r\n this.menuClosedCallback();\r\n }\r\n }\r\n\r\n public submitMenu(menuItem, selectedItems) {\r\n if (this.itemSelectedCallback) {\r\n this.itemSelectedCallback(menuItem, selectedItems);\r\n }\r\n }\r\n\r\n public knockMenuStyle (menu: HTMLElement) {\r\n menu.removeAttribute('style');\r\n const ul = menu.querySelectorAll('ul').item(0);\r\n var hasUlStyle = ul && ul.style ? true : false;\r\n\r\n if (hasUlStyle !== false) {\r\n ul.setAttribute('style', '');\r\n }\r\n }\r\n\r\n public refreshItems() {\r\n this.rootLevel.refreshItems();\r\n }\r\n\r\n public refreshCheckboxes() {\r\n this.rootLevel.refreshCheckboxes();\r\n }\r\n}","\r\nexport class DisplayFormatParser { \r\n private formatStr = '';\r\n private pos = 0;\r\n private token = 'text';\r\n private tokenText = '';\r\n\r\n public start(s: string) {\r\n this.formatStr = s;\r\n this.pos = 0;\r\n this.tokenText = '';\r\n }\r\n\r\n private skipSpaces() {\r\n while (this.pos < this.formatStr.length && this.formatStr.charAt(this.pos) === ' ') this.pos++;\r\n }\r\n\r\n public getToken() {\r\n return this.token;\r\n }\r\n\r\n public getTokenText() {\r\n return this.tokenText;\r\n }\r\n\r\n public next() {\r\n this.skipSpaces();\r\n if (this.pos >= this.formatStr.length) return false;\r\n\r\n let npos = 0;\r\n if (this.formatStr.charAt(this.pos) === '{') {\r\n npos = this.formatStr.indexOf('}', this.pos);\r\n if (npos < 0) return false;\r\n this.tokenText = this.formatStr.substring(this.pos, npos + 1);\r\n if (this.tokenText.indexOf('{expr') === 0 || this.tokenText.indexOf('{attr') === 0) {\r\n this.token = 'expression';\r\n }\r\n this.pos = npos + 1;\r\n }\r\n else if (this.formatStr.charAt(this.pos) === '[' && this.pos < this.formatStr.length - 1 && this.formatStr.charAt(this.pos + 1) === '[') {\r\n this.pos += 2;\r\n npos = this.formatStr.indexOf(']]', this.pos);\r\n this.token = 'function';\r\n this.tokenText = this.formatStr.substring(this.pos, npos);\r\n this.pos = npos + 2;\r\n }\r\n else {\r\n this.token = 'text';\r\n let npos1 = this.formatStr.indexOf('{', this.pos);\r\n if (npos1 < 0) npos1 = this.formatStr.length;\r\n let npos2 = this.formatStr.indexOf('[[', this.pos);\r\n if (npos2 < 0) npos2 = this.formatStr.length;\r\n npos = Math.min(npos1, npos2);\r\n this.tokenText = this.formatStr.substring(this.pos, npos).trim();\r\n this.pos = npos;\r\n }\r\n return true;\r\n }\r\n}","/**\r\n * Represents parts of Query Panel which can be editable \r\n */\r\nexport enum QPEditablePart {\r\n None = 0,\r\n Value = 1 << 0,\r\n Attribute = 1 << 1,\r\n Operator = 1 << 2,\r\n Addition = 1 << 3,\r\n Removal = 1 << 4,\r\n All = ~(~0 << 8),\r\n NoAddition = ~Addition,\r\n NoRemoval = ~Removal,\r\n FixedConditionList = Operator | Value\r\n}","import { i18n, DataType} from '@easydata/core';\r\nimport { ExprTag, EntityAttr } from '@easyquery/core';\r\n\r\nimport { createBrowserEvent, domel } from '@easydata/ui';\r\n\r\nimport { ColumnRendererCP, ColumnAction } from './column_renderer_cp';\r\n\r\nimport { browserUtils } from '../../../utils/browser_utils';\r\n\r\nexport class AttrColumnRendererCP extends ColumnRendererCP {\r\n protected getClassesToAdd(): string {\r\n return `${super.getClassesToAdd()} ${this.cssPrefix}-row ${this.cssPrefix}-row-column-entattr`;\r\n }\r\n\r\n protected renderExpressionBlock(): HTMLDivElement {\r\n return domel(\"div\")\r\n .addClass(`${this.cssPrefix}-expr-block`)\r\n .addClass(browserUtils.getMobileCssClass())\r\n .addChild('div', builder => builder\r\n .addClass(`${this.cssPrefix}-colelement`,`${this.cssPrefix}-attrelement`)\r\n .addClass(browserUtils.getMobileCssClass())\r\n .addChildElement(this.renderBaseExpression())\r\n )\r\n .toDOM();\r\n }\r\n\r\n protected getAttribute(): EntityAttr {\r\n const model = this.panel.getContext().getModel();\r\n return model.getAttributeByIdSafe(this.column.expr.value);\r\n }\r\n\r\n protected renderBaseExpression(): HTMLElement {\r\n const baseAttr = this.getAttribute();\r\n const attrCaption = this.panel.getContext().getAttributeTitle(baseAttr);\r\n\r\n if (this.isEditable()) {\r\n return domel('a')\r\n .attr('href', 'javascript:void(0)')\r\n .title(attrCaption)\r\n .text(attrCaption) //TO DO:add localization\r\n .on('click', (ev) => { \r\n ev.stopPropagation();\r\n\r\n this.panel.showEntitiesMenu({\r\n anchor: ev.target, \r\n selectedIds: null, \r\n itemSelectedCallback: this.baseExpressionItemSelectedCallback.bind(this),\r\n itemFilterCallback: item => item.id !== '__AddAll__'\r\n });\r\n\r\n return false;\r\n })\r\n .toDOM();\r\n }\r\n \r\n return domel('span')\r\n .text(attrCaption)\r\n .title(attrCaption)\r\n .toDOM();\r\n\r\n }\r\n\r\n protected baseExpressionItemSelectedCallback(data, item): boolean {\r\n const attrid = data.id;\r\n const context = this.panel.getContext();\r\n var attr = context.getModel().getAttributeById(attrid);\r\n this.updateBaseAttr(attr);\r\n this.column.caption = context.getDefaultColumnCaption(this.column);\r\n\r\n this.fireColumnChanged();\r\n return false;\r\n }\r\n\r\n protected updateBaseAttr(attr : EntityAttr) : void {\r\n this.column.expr.setValue(attr.id, true);\r\n this.column.expr.baseAttrId = attr.id;\r\n this.column.expr.dataType = attr.dataType;\r\n }\r\n\r\n protected getUIS(): boolean {\r\n const arg = this.column.expr.args[0];\r\n if (arg) {\r\n const model = this.panel.getContext().getModel();\r\n return model.checkAttrProperty(arg.value, \"useInSorting\");\r\n }\r\n else {\r\n return true;\r\n }\r\n }\r\n\r\n protected changeTypeHandler(ev: Event) {\r\n this.keepShowingButtons = true;\r\n this.functionMenu.showMenu({\r\n anchor: ev.target as HTMLElement,\r\n selectedIds: null,\r\n itemSelectedCallback: (data, items) => {\r\n this.processExtraButtonMenuItems(data.id, null);\r\n return false;\r\n },\r\n menuClosedCallback: () => { //called when menu is closed\r\n this.keepShowingButtons = false;\r\n if (!this.isMouseOverBlock) {\r\n this.element.dispatchEvent(createBrowserEvent('mouseleave'));\r\n }\r\n }\r\n });\r\n }\r\n\r\n protected changeTypeToCustomSql() {\r\n const query = this.column.getQuery();\r\n query.changeColumnType(this.column, ExprTag.CustomSql);\r\n\r\n const parentElement = this.element.parentElement;\r\n setTimeout(() => {\r\n //focus CustomSQL Edit\r\n const newElement = parentElement.querySelector(`div[data-id='${this.column.id}'] div[class*='${this.cssPrefix}-expr-block'] div[class*='${this.cssPrefix}-colelement'] a`);\r\n if (newElement)\r\n (newElement as HTMLElement).click();\r\n }, 500);\r\n\r\n this.fireColumnChanged();\r\n }\r\n\r\n protected changeTypeToAggr(funcId: string) {\r\n const query = this.column.getQuery();\r\n query.changeColumnType(this.column, ExprTag.AggregateFunction, { funcId : funcId });\r\n this.fireColumnChanged();\r\n }\r\n\r\n protected processExtraButtonMenuItems(action: ColumnAction | string, evt: Event): boolean {\r\n if (action === \"CUSTOMSQL\") {\r\n this.changeTypeToCustomSql();\r\n } else {\r\n this.changeTypeToAggr(action as string);\r\n }\r\n return true;\r\n }\r\n\r\n protected getExtraButtonMenuItems(): Array<any> {\r\n const items = [];\r\n const funcs = this.panel.getContext().getModel().getAggrFunctions();\r\n let toInclude = true;\r\n let funcAllowed = true;\r\n\r\n var item = null;\r\n\r\n const attribute = this.getAttribute();\r\n\r\n let funcCaption;\r\n\r\n for(const func of funcs) {\r\n toInclude = func.getAppliedTypesOrDefault().indexOf(attribute.dataType) >= 0;\r\n\r\n if (this.column.expr.func === func.id && !toInclude) {\r\n funcAllowed = false;\r\n }\r\n\r\n if (toInclude) {\r\n funcCaption = this.panel.getContext().getModel().getAggrFunctionCaption(func.id);\r\n item = {\r\n id: func.id,\r\n text: funcCaption\r\n };\r\n\r\n items.push(item);\r\n }\r\n }\r\n\r\n for (let idx = 0; idx < funcs.length; idx++) {\r\n if (!funcs[idx]) continue;\r\n\r\n }\r\n\r\n if (!funcAllowed) {\r\n this.column.expr.func = items[0].id;\r\n }\r\n \r\n //Add \"Custom Expression\" menu\r\n const columnsPanel = this.panel;\r\n if (columnsPanel.areCustomExpressionsAllowed()) {\r\n item = {\r\n id: 'CustomSqlDivider',\r\n text: '---'\r\n };\r\n\r\n items.push(item);\r\n\r\n funcCaption = i18n.getText('CustomExpression');\r\n item = {\r\n id: 'CUSTOMSQL',\r\n text: funcCaption\r\n };\r\n\r\n items.push(item);\r\n }\r\n \r\n return [{\r\n id: '__group',\r\n text: i18n.getText('ColTypeGroup'),\r\n items: items\r\n }]\r\n }\r\n}","import { i18n } from '@easydata/core';\r\n\r\nimport { ExprTag, EntityAttr } from '@easyquery/core';\r\nimport { domel } from '@easydata/ui';\r\n\r\nimport { DisplayFormatParser } from '../../../utils/display_format_parser';;\r\n\r\nimport { AttrColumnRendererCP } from './attr_column_renderer_cp';\r\nimport { browserUtils } from '../../../utils/browser_utils';\r\nimport { ColumnAction } from './column_renderer_cp';\r\n\r\nexport class AggrFuncColumnRendererCP extends AttrColumnRendererCP {\r\n\r\n private displayFormatParser = new DisplayFormatParser();\r\n \r\n protected getClassesToAdd(): string {\r\n return `${super.getClassesToAdd()} ${this.cssPrefix}-row ${this.cssPrefix}-row-column-aggr`;\r\n }\r\n\r\n protected getAttribute() : EntityAttr {\r\n return this.panel\r\n .getContext()\r\n .getModel()\r\n .getAttributeByIdSafe(this.column.expr.args[0].value);\r\n }\r\n\r\n protected renderExpressionBlock(): HTMLDivElement {\r\n const model = this.panel.getContext().getModel();\r\n \r\n const exprBlockBuilder = \r\n domel(\"div\")\r\n .addClass(`${this.cssPrefix}-expr-block`, `${this.cssPrefix}-expr-block-aggr`)\r\n .addClass(browserUtils.getMobileCssClass());\r\n\r\n const format = model.getAggrFunctionFormat(this.column.expr.func);\r\n if (!format || format === '') return;\r\n\r\n const arrFormat = this.parseDisplayFormat(format);\r\n if (arrFormat.length === 0) return;\r\n\r\n let item = null;\r\n const arrLength = arrFormat.length;\r\n for (let idx = 0; idx < arrLength; idx++) {\r\n item = arrFormat[idx];\r\n\r\n if (item.type === 1) {\r\n if (this.isEditable()) {\r\n const functionLink = \r\n domel('a')\r\n .attr('href', 'javascript:void(0)')\r\n .text(item.text)\r\n .on('click', (ev) => { //touchstart \r\n ev.stopPropagation();\r\n \r\n this.functionMenu.showMenu({\r\n anchor: functionLink.toDOM(),\r\n selectedIds: null,\r\n itemSelectedCallback: (data, items)=> {\r\n if (data.id === \"CUSTOMSQL\") {\r\n this.changeTypeToCustomSql();\r\n \r\n } else {\r\n this.column.expr.func = data.id;\r\n this.column.caption = '';\r\n this.fireColumnChanged();\r\n } \r\n }\r\n });\r\n \r\n });\r\n\r\n exprBlockBuilder\r\n .addChild('div', builder => builder\r\n .addClass(`${this.cssPrefix}-colelement`,`${this.cssPrefix}-aggrfuncelement`)\r\n .addClass(browserUtils.getMobileCssClass())\r\n .addChildElement(functionLink.toDOM())\r\n );\r\n } \r\n else {\r\n exprBlockBuilder\r\n .addChild('div', b => b\r\n .addClass(`${this.cssPrefix}-colelement`,`${this.cssPrefix}-aggrfuncelement`)\r\n .addClass(browserUtils.getMobileCssClass())\r\n .addChild('span', b => b\r\n .text(item.text)\r\n .title(item.text)\r\n )\r\n );\r\n } \r\n }\r\n else if (item.type === 2) {\r\n exprBlockBuilder\r\n .addChild('div', builder => builder\r\n .addClass(`${this.cssPrefix}-colelement`, `${this.cssPrefix}-attrelement`)\r\n .addClass(browserUtils.getMobileCssClass())\r\n .addChildElement(this.renderBaseExpression())\r\n );\r\n }\r\n else if (item.type === 3) {\r\n exprBlockBuilder\r\n .addChild('span', builder => builder\r\n .addClass(`${this.cssPrefix}-colelement`)\r\n .addClass(browserUtils.getMobileCssClass())\r\n .text(item.text)\r\n .title(item.text)\r\n );\r\n }\r\n }\r\n\r\n return exprBlockBuilder.toDOM();\r\n }\r\n\r\n protected renderColumnTypeButton() {\r\n const button = super.renderColumnTypeButton();\r\n if (button) {\r\n button.firstElementChild.classList.add('aggregated');\r\n button.firstElementChild.setAttribute('title', i18n.getText('ButtonToSimple'));\r\n }\r\n\r\n return button;\r\n }\r\n\r\n public changeTypeToSimple() {\r\n const query = this.column.getQuery();\r\n query.changeColumnType(this.column, ExprTag.EntityAttribute);\r\n this.fireColumnChanged(); \r\n }\r\n\r\n private parseDisplayFormat(format: string): string[] {\r\n if (!format) return [];\r\n\r\n let result = [];\r\n\r\n const parser = this.displayFormatParser;\r\n parser.start(format);\r\n\r\n while (parser.next()) {\r\n const token = parser.getToken();\r\n const tokenText = parser.getTokenText();\r\n\r\n if (token === 'function') {\r\n result.push({ type: 1, text: tokenText });\r\n }\r\n else if (token === 'expression') {\r\n result.push({ type: 2 });\r\n }\r\n else if (token === 'text') {\r\n result.push({ type: 3, text: tokenText });\r\n }\r\n }\r\n\r\n return result;\r\n }\r\n\r\n protected updateBaseAttr(attr : EntityAttr) : void {\r\n this.column.expr.args[0].setValue(attr.id, true);\r\n this.column.expr.baseAttrId = attr.id;\r\n }\r\n\r\n protected changeTypeHandler(ev: Event) {\r\n this.changeTypeToSimple();\r\n }\r\n\r\n protected processExtraButtonMenuItems(action: ColumnAction | string, evt: Event) {\r\n this.changeTypeToSimple();\r\n return true;\r\n }\r\n\r\n protected getExtraButtonMenuItems(): Array<any> {\r\n return [{\r\n id: '__group',\r\n text: i18n.getText('ColTypeGroup'),\r\n items: [{\r\n id: 'type',\r\n text: i18n.getText('ColTypeSimple')\r\n }]\r\n }]\r\n }\r\n}","import { i18n, DataType } from '@easydata/core';\r\nimport { ExprTag } from '@easyquery/core';\r\n\r\nimport { domel, eqDragManager } from '@easydata/ui';\r\n\r\nimport { AttrColumnRendererCP } from './attr_column_renderer_cp';\r\n\r\nimport { browserUtils } from '../../../utils/browser_utils';\r\nimport { ColumnAction } from './column_renderer_cp';\r\nimport { PopupMenu } from '../../../utils/popup_menu';\r\n\r\n\r\n\r\nclass EditableColumnRendererCP extends AttrColumnRendererCP { \r\n protected dataTypeMenu: PopupMenu = null;\r\n\r\n protected renderEnabledButton(): HTMLDivElement {\r\n const elem = super.renderEnabledButton();\r\n const child = elem.children[0] as HTMLElement;\r\n child.title = i18n.getText('CmdToggleEnableCustom');\r\n\r\n return elem;\r\n };\r\n\r\n protected getClassesToAdd(): string {\r\n return `${this.cssPrefix}-row ${this.cssPrefix}-row-column-entattr` + super.getClassesToAdd();\r\n }\r\n\r\n protected renderExpressionBlock(): HTMLDivElement {\r\n const exprBlock = domel(\"div\")\r\n .addClass(`${this.cssPrefix}-expr-block`)\r\n .addClass(browserUtils.getMobileCssClass())\r\n .toDOM();\r\n\r\n //Attribute element\r\n let builder = domel('div', exprBlock)\r\n .addClass(`${this.cssPrefix}-colelement`,`${this.cssPrefix}-attrelement`)\r\n .addClass(browserUtils.getMobileCssClass());\r\n\r\n if (this.isEditable()) {\r\n builder\r\n .addChild('a', b => b\r\n .attr('href', 'javascript:void(0)')\r\n .title(this.column.caption)\r\n .text(this.column.caption)\r\n .on('touchstart click', (ev) => {\r\n ev.stopPropagation();\r\n\r\n const element = ev.target as HTMLElement;\r\n const inputEl = element.parentElement.querySelector('input') as HTMLInputElement;\r\n if (inputEl) {\r\n element.style.display = 'none';\r\n inputEl.style.removeProperty('display');\r\n inputEl.style.width = `100%`;\r\n\r\n inputEl.focus();\r\n this.element.setAttribute(eqDragManager.DRAG_DISABLED_ATTR, '');\r\n }\r\n }) //TO DO:add localization and input field\r\n )\r\n .addChild('input', b => b\r\n .hide()\r\n .value(this.getColumnValue())\r\n .on('blur keydown', (ev) => {\r\n let isEndEvent = false;\r\n let save = true;\r\n\r\n if (ev instanceof KeyboardEvent) {\r\n // Enter\r\n if (ev.keyCode === 13) {\r\n isEndEvent = true;\r\n //ESC\r\n } else if (ev.keyCode === 27) {\r\n isEndEvent = true;\r\n save = false;\r\n }\r\n\r\n } \r\n else if (ev instanceof FocusEvent) {\r\n isEndEvent = true;\r\n }\r\n\r\n if (isEndEvent) {\r\n const inputEl = (ev.target as HTMLInputElement);\r\n const aEl = inputEl.parentElement.querySelector('a') as HTMLAnchorElement;\r\n if (aEl) {\r\n aEl.style.removeProperty('display');\r\n inputEl.style.display = 'none';\r\n }\r\n\r\n const colVal = this.getColumnValue();\r\n if (save && colVal !== inputEl.value) {\r\n this.setColumnValue(inputEl.value);\r\n this.fireColumnChanged();\r\n } \r\n else {\r\n inputEl.value = colVal;\r\n }\r\n\r\n this.element.removeAttribute(eqDragManager.DRAG_DISABLED_ATTR);\r\n }\r\n })\r\n ) \r\n } \r\n else {\r\n builder\r\n .addChild('span', b => {\r\n b.text(this.column.caption)\r\n .title(this.column.caption)\r\n });\r\n }\r\n\r\n // Colon element\r\n builder = domel('div', exprBlock)\r\n .addClass(`${this.cssPrefix}-colelement`)\r\n .addChild('span', b => {\r\n b.text(':')\r\n .title(':')\r\n });\r\n\r\n // DataType element\r\n builder = domel('div', exprBlock)\r\n .addClass(`${this.cssPrefix}-colelement`,`${this.cssPrefix}-attrelement`)\r\n .addClass(browserUtils.getMobileCssClass());\r\n\r\n if (this.isEditable()) {\r\n this.createDataTypeMenu();\r\n\r\n builder\r\n .addChild('a', dataTypeLink => dataTypeLink\r\n .attr('href', 'javascript:void(0)')\r\n .title(DataType[this.column.expr.dataType])\r\n .text(DataType[this.column.expr.dataType])\r\n .on('touchstart click', (ev) => {\r\n\r\n ev.stopPropagation();\r\n\r\n this.dataTypeMenu.showMenu({\r\n anchor: dataTypeLink.toDOM(),\r\n selectedIds: null,\r\n itemSelectedCallback: (data, items)=> {\r\n this.column.expr.dataType = data.id;\r\n this.fireColumnChanged();\r\n }\r\n });\r\n })\r\n )\r\n } else {\r\n this.column.expr.dataType\r\n builder\r\n .addChild('span', b => {\r\n b.text(DataType[this.column.expr.dataType])\r\n .title(DataType[this.column.expr.dataType])\r\n });\r\n }\r\n\r\n return exprBlock;\r\n }\r\n\r\n public changeTypeToSimple() {\r\n const query = this.column.getQuery();\r\n query.changeColumnType(this.column, ExprTag.EntityAttribute);\r\n this.fireColumnChanged();\r\n }\r\n \r\n protected getColumnValue() : string {\r\n return '';\r\n }\r\n\r\n protected setColumnValue(value : string) : void {\r\n }\r\n\r\n\r\n protected getUIS() {\r\n return true;\r\n }\r\n\r\n protected changeTypeHandler(ev: Event) {\r\n this.changeTypeToSimple();\r\n }\r\n\r\n protected processExtraButtonMenuItems(action: ColumnAction | string, evt?: Event) {\r\n this.changeTypeToSimple();\r\n return true;\r\n }\r\n\r\n protected createFunctionMenu() {\r\n // Nothing TO DO\r\n }\r\n\r\n protected getExtraButtonMenuItems(): Array<any> {\r\n return [{\r\n id: '__group',\r\n text: i18n.getText('ColTypeGroup'),\r\n items: [{\r\n id: 'type',\r\n text: i18n.getText('ColTypeSimple')\r\n }]\r\n }];\r\n }\r\n\r\n protected createDataTypeMenu() {\r\n const items = [];\r\n\r\n for (let typeItem in DataType) {\r\n if (!isNaN(Number(typeItem))) {\r\n const item = {\r\n id: typeItem,\r\n text: DataType[typeItem]\r\n };\r\n\r\n items.push(item);\r\n }\r\n }\r\n\r\n let menuId = this.column.id;\r\n if (menuId) {\r\n menuId += '-DataTypeMenu';\r\n }\r\n\r\n const menuOptions = {\r\n items: items,\r\n id: menuId,\r\n searchBoxAlwaysShown: false,\r\n domWriteItemsId: true\r\n };\r\n\r\n this.dataTypeMenu = new PopupMenu(menuOptions);\r\n }\r\n}\r\n\r\nexport class CustomSqlColumnRendererCP extends EditableColumnRendererCP {\r\n protected get columnEnabled(): boolean {\r\n return this.panel.areCustomExpressionsAllowed() ? this.column.enabled : false;\r\n }\r\n\r\n protected set columnEnabled(value: boolean) {\r\n if (this.panel.areCustomExpressionsAllowed()) {\r\n this.column.enabled = value;\r\n }\r\n else {\r\n this.column.enabled = false;\r\n }\r\n }\r\n\r\n protected renderColumnTypeButton() {\r\n const button = super.renderColumnTypeButton();\r\n if (button) {\r\n button.firstElementChild.classList.add('aggregated');\r\n button.firstElementChild.setAttribute('title', i18n.getText('ButtonToSimple'));\r\n }\r\n\r\n return button;\r\n }\r\n\r\n protected getColumnValue() : string {\r\n return this.column.expr.sql;\r\n }\r\n\r\n protected setColumnValue(value : string) : void {\r\n this.column.expr.sql = value;\r\n }\r\n\r\n protected getDefaultValue() {\r\n return this.column.expr.sql;\r\n }\r\n}\r\n\r\nexport class ConstColumnRendererCP extends EditableColumnRendererCP {\r\n protected renderColumnTypeButton() {\r\n const button = super.renderColumnTypeButton();\r\n if (button) {\r\n button.firstElementChild.classList.add('aggregated');\r\n button.firstElementChild.setAttribute('title', i18n.getText('ButtonToSimple'));\r\n }\r\n\r\n return button;\r\n }\r\n\r\n protected getColumnValue() : string {\r\n return this.column.expr.value;\r\n }\r\n\r\n protected setColumnValue(value : string) : void {\r\n this.column.expr.setValue(value);\r\n }\r\n \r\n protected getDefaultValue() {\r\n return this.column.expr.value;\r\n }\r\n}","import { i18n } from '@easydata/core';\r\nimport { utils as dataUtils } from '@easydata/core';\r\n\r\nimport {\r\n DataKind, EntityAttr,\r\n EqContext, Query, QueryColumn, \r\n SortDirection, ExprTag, \r\n Widget, WidgetGroup, \r\n QueryChangePart, QueryChangeAction, QueryChangeEventData\r\n} from '@easyquery/core';\r\n\r\nimport { \r\n eqDragManager, DropEffect, \r\n getElementAbsolutePos, domel \r\n} from '@easydata/ui'\r\n\r\nimport { ColumnsPanelOptions } from './widget_options';\r\n\r\nimport { PopupMenu, PopupMenuOptions } from '../utils/popup_menu';\r\n\r\nimport { eqCssPrefix, eqCssMobile} from '../utils/utils';\r\nimport { browserUtils } from '../utils/browser_utils';\r\n\r\nimport { ColumnRendererCP } from './renderers/columnspanel/column_renderer_cp';\r\nimport { AggrFuncColumnRendererCP } from './renderers/columnspanel/aggrfunc_column_renderer_cp';\r\nimport { ConstColumnRendererCP, CustomSqlColumnRendererCP } from './renderers/columnspanel/editable_column_renderer_cp';\r\nimport { AttrColumnRendererCP } from './renderers/columnspanel/attr_column_renderer_cp';\r\n\r\nexport class ColumnsPanel extends Widget {\r\n\r\n public options: ColumnsPanelOptions = {\r\n isSubQuery: false,\r\n activeColumn: null,\r\n showAddRow: true,\r\n showHeader: true,\r\n showColumnTitles: true,\r\n allowAggrColumns: true,\r\n allowDuplicates: true,\r\n allowCustomExpressions: false,\r\n allowSorting: true,\r\n attrElementFormat: '{entity} {attr}',\r\n\r\n titleElementFormat: null, \r\n\r\n buttons: null,\r\n alwaysShowButtons: false,\r\n accentActiveColumn: true,\r\n allowDragDrop: true,\r\n menuOptions: {\r\n showSearchBoxAfter: 30,\r\n searchBoxAutoFocus: true,\r\n activateOnMouseOver: true,\r\n adjustHeight: true,\r\n itemRenderedCallback: null\r\n },\r\n attrPlacement: 0,\r\n sortEntities: false,\r\n columnRenderedCallback: null,\r\n\r\n customExpressionText: 0,\r\n allowHiddenColumns: false,\r\n showAddAllForEntity: false,\r\n showIndicatorOnLoad: true\r\n };\r\n\r\n private headerElement: HTMLDivElement;\r\n private columnsBlock: HTMLDivElement;\r\n private addRowElement: HTMLDivElement;\r\n private progressBlock: HTMLElement;\r\n\r\n private entitiesMenu: PopupMenu;\r\n\r\n public sortMenu: PopupMenu;\r\n public moveMenu: PopupMenu;\r\n\r\n private queryEventCallbackId: string;\r\n\r\n protected get cssPrefix(): string {\r\n return 'eqjs-qc';\r\n }\r\n\r\n constructor(slot: HTMLElement) {\r\n\r\n super(slot);\r\n\r\n this.slot.classList.add(`${this.cssPrefix}-panel`);\r\n\r\n this.group = WidgetGroup.Query;\r\n }\r\n\r\n public getWidgetType(): string {\r\n return 'columnsPanel';\r\n }\r\n\r\n public init(context: EqContext, options?: ColumnsPanelOptions) {\r\n super.init(context, options);\r\n\r\n this.setOptions(options);\r\n this.renderProgressBlock();\r\n\r\n const model = context.getModel();\r\n\r\n this.detachQueryObserver();\r\n this.attachQueryObserver(); \r\n\r\n eqDragManager.removeDropContainer(this.slot);\r\n if (this.options.allowDragDrop) {\r\n eqDragManager.registerDropContainer({\r\n element: this.slot,\r\n scopes: [\"entityAttr\", \"entityAttrSort\"],\r\n onDragEnter: (container, ev) => {\r\n \r\n this.slot.classList.add(`${eqCssPrefix}-drophover`);\r\n if (ev.item.scope === \"entityAttrSort\") {\r\n this.showLandingSlot(ev.pageX, ev.pageY);\r\n }\r\n else {\r\n const attrId: string = ev.data.attrId;\r\n if (!model.checkAttrProperty(attrId, \"useInResult\")) {\r\n ev.dropEffect = DropEffect.Forbid; \r\n }\r\n\r\n ev.dragImage.classList.add('eqjs-sortable-helper');\r\n }\r\n },\r\n onDragOver: (container, ev) => {\r\n const attrId: string = ev.data.attrId;\r\n if (ev.item.scope === \"entityAttrSort\" || \r\n model.checkAttrProperty(attrId, \"useInResult\")) {\r\n this.showLandingSlot(ev.pageX, ev.pageY);\r\n }\r\n },\r\n onDragLeave: (container, ev) => {\r\n if (ev.item.scope === \"entityAttrSort\") {\r\n ev.dropEffect = DropEffect.Forbid;\r\n } \r\n else {\r\n ev.dragImage.classList.remove('eqjs-sortable-helper')\r\n ev.dragImage.style.removeProperty('width');\r\n }\r\n this.slot.classList.remove(`${eqCssPrefix}-drophover`);\r\n this.hideLandingSlot();\r\n },\r\n onDrop: (container, ev) => {\r\n if (ev.item.scope == \"entityAttrSort\") {\r\n const query = this.getQuery();\r\n const columns = query.getColumns();\r\n const index = columns.indexOf(ev.data.column);\r\n \r\n this.moveColumnCore(index, this.landingIndex);\r\n }\r\n else {\r\n const attrId: string = ev.data.attrId;\r\n this.addNewColumn(attrId, this.landingIndex);\r\n }\r\n }\r\n });\r\n } \r\n }\r\n\r\n protected renderBaseElements() {\r\n let minusHeight = 0;\r\n \r\n if (this.options.showHeader) {\r\n\r\n const headerBuilder = \r\n domel('div', this.slot)\r\n .hide()\r\n .addClass(`${this.cssPrefix}-header`)\r\n .addClass(browserUtils.getMobileCssClass())\r\n .addChild('div', builder => builder\r\n .addClass(`${this.cssPrefix}-header-expression`)\r\n .text(i18n.getText('HeaderExpression'))\r\n )\r\n \r\n if (this.options.showColumnTitles !== false) {\r\n headerBuilder\r\n .addChild('div', builder => builder\r\n .addClass(`${this.cssPrefix}-header-title`)\r\n .text(i18n.getText('HeaderTitle'))\r\n )\r\n }\r\n \r\n this.headerElement = headerBuilder.toDOM();\r\n\r\n minusHeight += this.headerElement.offsetHeight;\r\n\r\n }\r\n\r\n this.columnsBlock = \r\n domel('div', this.slot)\r\n .addClass(`${this.cssPrefix}-columns`)\r\n .addClass(browserUtils.getMobileCssClass())\r\n .toDOM();\r\n\r\n if (this.options.showAddRow) {\r\n this.addRowElement = \r\n domel('div', this.slot)\r\n .addClass(`${eqCssPrefix}-addrow`, `${this.cssPrefix}-addrow`, `${eqCssPrefix}-addrow-empty`)\r\n .addClass(browserUtils.getMobileCssClass())\r\n .addChild('a', builder => builder\r\n .attr('href', 'javascript:void(0)')\r\n .text(i18n.getText('CmdClickToAddColumn'))\r\n .on('click', (e) => {\r\n e.preventDefault();\r\n\r\n this.showEntitiesMenu({\r\n anchor: e.target, \r\n selectedIds: null, \r\n itemSelectedCallback: (data, items) => {\r\n if (data.id === '__AddAll__' && data.extra && Array.isArray(data.extra.ids)) {\r\n data.extra.ids.forEach(attrId => this.addNewColumn(attrId));\r\n }\r\n else {\r\n const attrid = data.id;\r\n this.addNewColumn(attrid);\r\n }\r\n return false;\r\n }\r\n });\r\n })\r\n )\r\n .toDOM();\r\n\r\n minusHeight += this.addRowElement.offsetHeight;\r\n }\r\n \r\n this.columnsBlock.style.maxHeight = `${this.slot.offsetHeight - minusHeight - 25}px`;\r\n\r\n }\r\n\r\n protected destroyCore() {\r\n eqDragManager.removeDropContainer(this.slot);\r\n this.detachQueryObserver();\r\n\r\n this.slot.innerHTML = '';\r\n }\r\n\r\n private attachQueryObserver() {\r\n const query = this.getQuery();\r\n\r\n this.queryEventCallbackId = query.addChangedCallback(event => {\r\n //if something has changed, and that change is related to columns\r\n const edata = event.data as QueryChangeEventData;\r\n if (!edata || (edata.part != QueryChangePart.Columns \r\n && edata.part != QueryChangePart.Aggregation\r\n && edata.part != QueryChangePart.All)) {\r\n return;\r\n }\r\n\r\n const focusedBefore = document.activeElement;\r\n const isFocusInside = this.slot.contains(focusedBefore) || focusedBefore == document.body;\r\n\r\n switch (edata.action) {\r\n case QueryChangeAction.Modify: {\r\n \r\n const columns = edata.changee as QueryColumn | QueryColumn[];\r\n\r\n const modifyColumn = (column: QueryColumn) => {\r\n const colEl = this.columnsBlock.querySelector(`div[data-id='${column.id}']`);\r\n\r\n if (colEl) {\r\n const renderer = this.getColumnRenderer(column, colEl as HTMLDivElement);\r\n if (renderer) {\r\n const newEl = renderer.render();\r\n\r\n if (isFocusInside) {\r\n const focusElem = newEl.querySelector('a') || newEl.querySelector('.eqjs-column-button');\r\n if (focusElem) {\r\n focusElem.focus();\r\n }\r\n }\r\n\r\n }\r\n }\r\n }\r\n\r\n if (Array.isArray(columns)) {\r\n columns.forEach((col) => modifyColumn(col));\r\n }\r\n else {\r\n modifyColumn(columns);\r\n }\r\n\r\n this.agjustHeaderVisibility();\r\n\r\n break;\r\n }\r\n case QueryChangeAction.Add: {\r\n const columns = edata.changee as QueryColumn | QueryColumn[];\r\n\r\n const addColumn = (column: QueryColumn) => {\r\n const index = query.getColumns().indexOf(column);\r\n const newEl = this.addColumnElement(column, index);\r\n \r\n if (isFocusInside) {\r\n const focusElem = newEl.querySelector('a');\r\n if (focusElem) {\r\n try {\r\n focusElem.focus();\r\n }\r\n catch {\r\n //do nothing\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (Array.isArray(columns)) {\r\n columns.forEach((col) => addColumn(col));\r\n }\r\n else {\r\n addColumn(columns);\r\n }\r\n \r\n this.agjustHeaderVisibility();\r\n break;\r\n }\r\n case QueryChangeAction.Delete: {\r\n const columns = edata.changee as QueryColumn | QueryColumn[];\r\n\r\n const deleteColumn = (column: QueryColumn) => {\r\n const colEl = this.columnsBlock.querySelector(`div[data-id='${column.id}']`);\r\n if (colEl) {\r\n const next = colEl.nextSibling;\r\n const prev = colEl.previousSibling;\r\n\r\n this.columnsBlock.removeChild(colEl);\r\n\r\n if (isFocusInside) {\r\n const focusCond = next || prev || this.addRowElement;\r\n const focusElem =(focusCond as HTMLElement).querySelector('a') || (focusCond as HTMLElement).querySelector('.eqjs-column-button');\r\n if (focusElem) {\r\n focusElem.focus();\r\n }\r\n }\r\n }\r\n }\r\n\r\n this.agjustHeaderVisibility();\r\n\r\n if (Array.isArray(columns)) {\r\n columns.forEach((col) => deleteColumn(col));\r\n }\r\n else {\r\n deleteColumn(columns);\r\n }\r\n\r\n break;\r\n }\r\n default:\r\n this.refresh();\r\n break;\r\n }\r\n });\r\n }\r\n\r\n private detachQueryObserver() {\r\n if (this.queryEventCallbackId) {\r\n const query = this.getQuery();\r\n query.removeChangedCallback(this.queryEventCallbackId);\r\n }\r\n }\r\n\r\n private getQuery(): Query {\r\n return this.getContext().getQuery();\r\n }\r\n\r\n private landingSlot: HTMLDivElement \r\n = domel('div')\r\n .addClass(`${this.cssPrefix}-col-landing-slot`)\r\n .addChildElement(\r\n domel('div')\r\n .toDOM())\r\n .toDOM();\r\n\r\n private landingIndex: number = -1;\r\n\r\n private showLandingSlot(pageX: number, pageY: number) {\r\n\r\n const rowElems = this.columnsBlock.querySelectorAll(`[class*=${this.cssPrefix}-row]`) as NodeListOf<HTMLElement>;\r\n const rows: HTMLElement[] = [];\r\n\r\n for(let i = 0; i < rowElems.length; i++) {\r\n\r\n const rowElem = rowElems[i];\r\n if (rowElem.style.display === 'none')\r\n continue;\r\n\r\n rows.push(rowElem)\r\n }\r\n\r\n if (rows.length === 0) {\r\n this.landingIndex = 0;\r\n this.columnsBlock.appendChild(this.landingSlot);\r\n return;\r\n }\r\n\r\n const landingPos = getElementAbsolutePos(this.landingSlot);\r\n if (pageY >= landingPos.y && pageY <= landingPos.y + this.landingSlot.offsetHeight) {\r\n return;\r\n }\r\n\r\n const firstRow = rows[0];\r\n const rowHeight = firstRow.offsetHeight;\r\n const absPos = getElementAbsolutePos(firstRow);\r\n\r\n let newLandingIndex = (pageY > absPos.y + rowHeight / 2) ? Math.round((pageY - absPos.y + rowHeight / 2) / rowHeight) : 0;\r\n if (newLandingIndex > rows.length) {\r\n newLandingIndex = rows.length;\r\n }\r\n\r\n if (newLandingIndex != this.landingIndex) {\r\n this.landingIndex = newLandingIndex;\r\n\r\n if (this.landingIndex < rows.length) {\r\n this.columnsBlock.insertBefore(this.landingSlot, rows[this.landingIndex]);\r\n }\r\n else {\r\n this.columnsBlock.appendChild(this.landingSlot);\r\n }\r\n\r\n this.landingSlot.scrollIntoView({block: \"center\", behavior: \"smooth\"}); \r\n }\r\n }\r\n\r\n private hideLandingSlot() {\r\n this.landingIndex = -1;\r\n setTimeout(() => {\r\n if (this.landingSlot.parentElement) {\r\n this.landingSlot.parentElement.removeChild(this.landingSlot);\r\n }\r\n }, 10);\r\n }\r\n\r\n private setOptions(options?: ColumnsPanelOptions) {\r\n dataUtils.assignDeep(this.options, options);\r\n \r\n this.context.options.allowCustomExpressions = options.allowCustomExpressions;\r\n\r\n if (options.attrElementFormat) {\r\n this.context.options.attributeFormat = options.attrElementFormat;\r\n }\r\n\r\n if (options.titleElementFormat) {\r\n this.context.options.columnTitleFormat = options.titleElementFormat;\r\n }\r\n\r\n if (browserUtils.isMobileMode()) {\r\n this.options.buttons = [\"menu\"];\r\n this.options.showHeader = false;\r\n }\r\n }\r\n\r\n protected onProcessStartCore() {\r\n if (this.options.showIndicatorOnLoad) {\r\n if (!this.progressBlock.parentNode)\r\n this.slot.appendChild(this.progressBlock);\r\n }\r\n }\r\n\r\n protected onProcessEndCore() {\r\n if (this.options.showIndicatorOnLoad) {\r\n if (this.progressBlock.parentNode)\r\n this.slot.removeChild(this.progressBlock);\r\n }\r\n }\r\n\r\n protected refreshCore() {\r\n this.clear();\r\n this.render();\r\n }\r\n\r\n private clear() {\r\n this.slot.innerHTML = \"\";\r\n }\r\n\r\n private render() {\r\n try {\r\n this.renderBaseElements();\r\n this.createEntitiesMenu();\r\n\r\n this.createColumnMenus();\r\n \r\n this.agjustHeaderVisibility();\r\n\r\n domel(this.slot)\r\n .removeClass(eqCssMobile)\r\n .addClass(browserUtils.getMobileCssClass());\r\n\r\n\r\n const query = this.context.getQuery();\r\n const columns = query.getColumns();\r\n for(let column of columns) {\r\n this.columnsBlock.appendChild(this.renderColumn(column));\r\n }\r\n }\r\n catch (err) {\r\n let error = err as any;\r\n this.context.throwError({\r\n action: \"ColumnsPanel rendering\",\r\n text: error.message,\r\n sourceError: error\r\n });\r\n }\r\n }\r\n\r\n private agjustHeaderVisibility() {\r\n if (this.headerElement) {\r\n const query = this.context.getQuery();\r\n const columns = query.getColumns();\r\n\r\n this.headerElement.style.display = (columns.length) ? '' : 'none';\r\n }\r\n }\r\n\r\n private renderColumn(column: QueryColumn): HTMLDivElement | null{\r\n const renderer = this.getColumnRenderer(column);\r\n if (renderer)\r\n return renderer.render(); \r\n \r\n return null;\r\n }\r\n\r\n public toggleColumnPicked(column: QueryColumn) {\r\n let el: HTMLElement;\r\n let isActive: boolean;\r\n if (column) {\r\n el = this.columnsBlock.querySelector(`div[data-id=${column.id}]`);\r\n if (el) {\r\n isActive = el.classList.contains('active');\r\n }\r\n }\r\n\r\n //clear 'active' in all rows\r\n const rows = this.columnsBlock.querySelectorAll(`.${this.cssPrefix}-row`);\r\n for(let i = 0; i < rows.length; i++) {\r\n const row = rows[i] as HTMLElement;\r\n domel(row)\r\n .removeClass('active')\r\n \r\n if (!this.options.alwaysShowButtons) {\r\n domel(row)\r\n .data(\"show-buttons\", null)\r\n }\r\n }\r\n\r\n if (el && !isActive) {\r\n domel(el)\r\n .addClass('active')\r\n .data(\"show-buttons\", \"\")\r\n }\r\n }\r\n\r\n public addNewColumn(attrs: string, index?: number): QueryColumn\r\n public addNewColumn(attrs: string[], index?: number): QueryColumn[]\r\n public addNewColumn(attrs: string | string[], index?: number): QueryColumn | QueryColumn[] {\r\n const model = this.getContext().getModel();\r\n const query = this.getQuery();\r\n\r\n if (Array.isArray(attrs)) {\r\n let col : QueryColumn = null;\r\n let cols : QueryColumn[] = [];\r\n for (let i = 0; i < attrs.length; i++) {\r\n col = query.addColumn({\r\n attributeId: attrs[i],\r\n index: index\r\n }, true)\r\n if (col) {\r\n cols.push(col);\r\n }\r\n }\r\n query.fireChangedEvent({\r\n part: QueryChangePart.Columns,\r\n action: QueryChangeAction.Add,\r\n changee: cols,\r\n source: this\r\n });\r\n return cols;\r\n }\r\n else {\r\n const col = query.addColumn({\r\n attributeId: attrs,\r\n index: index\r\n });\r\n \r\n return col;\r\n }\r\n }\r\n\r\n //adds one column to the panel on the specified position\r\n private addColumnElement(column: QueryColumn, index: number): HTMLDivElement {\r\n const rows = this.columnsBlock.querySelectorAll(`[class*=${this.cssPrefix}-row]`);\r\n\r\n const newColBlock = this.renderColumn(column);\r\n if (rows.length > 0) {\r\n if (index < rows.length) {\r\n this.columnsBlock.insertBefore(newColBlock, rows[index]);\r\n }\r\n else {\r\n this.columnsBlock.appendChild(newColBlock);\r\n this.scrollToBottom();\r\n }\r\n }\r\n else {\r\n this.columnsBlock.appendChild(newColBlock);\r\n this.scrollToBottom();\r\n }\r\n\r\n if (this.options.columnRenderedCallback) {\r\n this.options.columnRenderedCallback(newColBlock);\r\n }\r\n\r\n return newColBlock;\r\n }\r\n\r\n private scrollToBottom() {\r\n this.columnsBlock.scrollTop = this.columnsBlock.scrollHeight - this.columnsBlock.clientHeight;\r\n }\r\n\r\n private checkColumnsArray(cols: QueryColumn[]): QueryColumn[] {\r\n let i = 0, len = cols.length;\r\n const result = [];\r\n for (let i = 0; i < len; i++) {\r\n if (this.checkColumn(cols[i]))\r\n result.push(cols[i]);\r\n }\r\n return result;\r\n }\r\n\r\n private checkColumn(col: QueryColumn) {\r\n if (!this.options.allowDuplicates) {\r\n const query = this.getQuery();\r\n const columns = query.getColumns();\r\n \r\n for (let i = 0; i < columns.length; i++) {\r\n if ((col.expr.tag === ExprTag.EntityAttribute && columns[i].expr.tag === ExprTag.EntityAttribute\r\n || col.expr.tag === ExprTag.ParentEntityAttribute && columns[i].expr.tag === ExprTag.ParentEntityAttribute)\r\n && col.expr.value === columns[i].expr.value) {\r\n return null;\r\n }\r\n }\r\n }\r\n return col;\r\n }\r\n\r\n public getColumnsBlock(): HTMLElement {\r\n return this.columnsBlock;\r\n }\r\n\r\n\r\n private getColumnRenderer(column: QueryColumn, slot?: HTMLDivElement): ColumnRendererCP | null {\r\n switch(column.expr.tag) {\r\n case ExprTag.Constant:\r\n return new ConstColumnRendererCP(this, column, slot);\r\n case ExprTag.AggregateFunction:\r\n return new AggrFuncColumnRendererCP(this, column, slot);\r\n case ExprTag.CustomSql:\r\n return new CustomSqlColumnRendererCP(this, column, slot);\r\n default:\r\n return new AttrColumnRendererCP(this, column, slot);\r\n } \r\n\r\n return null;\r\n }\r\n\r\n public areCustomExpressionsAllowed(): boolean {\r\n const query = this.getQuery();\r\n return query.isEx() && this.getContext().options.allowCustomExpressions;\r\n }\r\n\r\n\r\n private addAllColumnsToEntitiesList(list: any[]) {\r\n const attrIds = list.filter(item => !item.isEntity).map(item => item.id);\r\n\r\n if (attrIds.length > 0) {\r\n list.unshift({\r\n id: '__AddAll__', \r\n text: i18n.getText('AddAllForEntityText'), \r\n extra: { \r\n ids: attrIds\r\n }\r\n })\r\n }\r\n\r\n list.forEach(item => {\r\n if (item.items) {\r\n this.addAllColumnsToEntitiesList(item.items);\r\n }\r\n })\r\n }\r\n\r\n private createEntitiesMenu() {\r\n const model = this.getContext().getModel();\r\n if (!model || model.isEmpty()) return null;\r\n\r\n let menuId = this.slot.id;\r\n if (menuId) {\r\n menuId += '-EntitiesMenu';\r\n }\r\n\r\n const entitiesList = model.getEntitiesTree({ addUIC: false, addUIR: true, addUIS: false, attrPlacement: this.options.attrPlacement, sortEntities: this.options.sortEntities });\r\n\r\n // add [Add all columns] items\r\n if (this.options.showAddAllForEntity) {\r\n this.addAllColumnsToEntitiesList(entitiesList);\r\n }\r\n\r\n const options: PopupMenuOptions = { \r\n id: menuId,\r\n items: entitiesList, \r\n adjustHeight: this.options.adjustEntitiesMenuHeight, \r\n domWriteItemsId: this.options.domWriteItemsId \r\n };\r\n\r\n dataUtils.assign(options, this.options.menuOptions);\r\n this.entitiesMenu = new PopupMenu(options);\r\n }\r\n\r\n public getSortMenuList() {\r\n return [\r\n { id: 'None', text: i18n.getText('CmdNotSorted') },\r\n { id: 'Ascending', text: i18n.getText('CmdAscending') },\r\n { id: 'Descending', text: i18n.getText('CmdDescending') },\r\n { id: '---', text: '---' }\r\n ];\r\n }\r\n\r\n public getMoveMenuList() {\r\n return [\r\n { id: 'MoveTop', text: i18n.getText('CmdMoveToFirst') },\r\n { id: 'MoveUp', text: i18n.getText('CmdMoveToPrev') },\r\n { id: 'MoveDown', text: i18n.getText('CmdMoveToNext') },\r\n { id: 'MoveBottom', text: i18n.getText('CmdMoveToLast') }\r\n ];\r\n }\r\n\r\n private createSortMenu() {\r\n const model = this.getContext().getModel();\r\n\r\n if (!model || model.isEmpty()) return null;\r\n\r\n let menuId = this.slot.id\r\n if (menuId) {\r\n menuId += '-SortMenu';\r\n }\r\n\r\n const items = this.getSortMenuList().concat(this.moveMenu.getItems());\r\n \r\n const menuOptions: any = { \r\n id: menuId, \r\n \"items\": items, \r\n domWriteItemsId: this.options.domWriteItemsId, \r\n showSelected: true \r\n };\r\n\r\n dataUtils.assign(menuOptions, this.options.menuOptions);\r\n\r\n menuOptions.searchBoxAlwaysShown = false;\r\n\r\n this.sortMenu = new PopupMenu(menuOptions);\r\n }\r\n\r\n private createMoveMenu() {\r\n const model = this.getContext().getModel();\r\n if (!model || model.isEmpty()) return null;\r\n\r\n let menuId = this.slot.id\r\n if (menuId) {\r\n menuId += '-MoveMenu';\r\n }\r\n\r\n const items = dataUtils.createArrayFrom(this.getMoveMenuList());\r\n\r\n if (this.options.allowHiddenColumns) {\r\n items.push({ id: '---', text: '---' });\r\n items.push({ id: 'IsHidden', text: i18n.getText('CmdHiddenColumn') });\r\n }\r\n\r\n const menuOptions:any = { \r\n \"items\": items, \r\n id: menuId, \r\n domWriteItemsId: this.options.domWriteItemsId, \r\n showSelected: true \r\n };\r\n\r\n dataUtils.assign(menuOptions, this.options.menuOptions);\r\n\r\n this.moveMenu = new PopupMenu(menuOptions);\r\n\r\n menuOptions.searchBoxAlwaysShown = false;\r\n }\r\n\r\n public showEntitiesMenu(menuOptions) {\r\n this.entitiesMenu.showMenu(menuOptions);\r\n }\r\n\r\n public moveColumn(column: QueryColumn, direction: string) {\r\n const query = this.getQuery();\r\n const columns = query.getColumns();\r\n const index = columns.indexOf(column);\r\n\r\n if (index >= 0) {\r\n switch (direction) {\r\n case 'MoveTop':\r\n if (index == 0) {\r\n return;\r\n }\r\n this.moveColumnCore(index, 0); \r\n break;\r\n case 'MoveUp':\r\n if (index == 0) {\r\n return;\r\n }\r\n this.moveColumnCore(index, index-1); \r\n break;\r\n case 'MoveDown':\r\n if (index == columns.length-1) {\r\n return;\r\n }\r\n this.moveColumnCore(index, index+1); \r\n break;\r\n case 'MoveBottom':\r\n if (index == columns.length-1) {\r\n return;\r\n }\r\n this.moveColumnCore(index, columns.length-1); \r\n break;\r\n };\r\n }\r\n }\r\n\r\n private moveColumnCore(index1: number, index2: number) {\r\n const query = this.getQuery();\r\n if (!query) return;\r\n\r\n const rows = this.columnsBlock.querySelectorAll(`[class*=${this.cssPrefix}-row]`);\r\n const colToMove = rows[index1];\r\n\r\n if (index2 == 0) {\r\n this.columnsBlock.insertBefore(colToMove, this.columnsBlock[0]);\r\n }\r\n else if (index2 > 0 && index2 < rows.length - 1) {\r\n if (index1 < index2) {\r\n this.columnsBlock.insertBefore(colToMove, rows[index2 + 1]);\r\n }\r\n else {\r\n this.columnsBlock.insertBefore(colToMove, rows[index2]);\r\n }\r\n }\r\n else {\r\n this.columnsBlock.appendChild(colToMove);\r\n }\r\n\r\n query.moveColumn(index1, index2);\r\n\r\n query.fireColumnsChangedEvent();\r\n }\r\n\r\n private createColumnMenus() {\r\n this.createMoveMenu();\r\n\r\n if (this.options.allowSorting) {\r\n this.createSortMenu();\r\n } \r\n }\r\n\r\n private renderProgressBlock() {\r\n this.progressBlock = document.createElement('div');\r\n this.progressBlock.classList.add(`${eqCssPrefix}-progress-win8`);\r\n this.progressBlock.classList.add(browserUtils.getMobileCssClass());\r\n this.progressBlock.innerHTML = '<div class=\"wBall\" id=\"wBall_1\"><div class=\"wInnerBall\"></div></div><div class=\"wBall\" id=\"wBall_2\"><div class=\"wInnerBall\"></div></div><div class=\"wBall\" id=\"wBall_3\"><div class=\"wInnerBall\"></div></div><div class=\"wBall\" id=\"wBall_4\"><div class=\"wInnerBall\"></div></div><div class=\"wBall\" id=\"wBall_5\"><div class=\"wInnerBall\"></div></div>';\r\n }\r\n\r\n}","import { i18n } from '@easydata/core';\r\n\r\nimport { \r\n QueryChangeAction, EntityAttr, \r\n SortDirection, QueryColumn, ExprTag \r\n} from '@easyquery/core';\r\n\r\nimport { \r\n eqDragManager, DropEffect, \r\n createBrowserEvent, domel \r\n} from '@easydata/ui';\r\n\r\nimport { eqCssPrefix } from '../../../utils/utils';\r\nimport { browserUtils } from '../../../utils/browser_utils'; \r\nimport { MenuItem, PopupMenu } from '../../../utils/popup_menu';\r\nimport { ColumnsBar } from '../../columns_bar';\r\n\r\nexport abstract class ColumnRendererCB {\r\n protected column: QueryColumn;\r\n protected bar: ColumnsBar;\r\n protected functionMenu: PopupMenu = null;\r\n protected formatsMenu: PopupMenu = null;\r\n\r\n protected element: HTMLDivElement;\r\n\r\n protected isMouseOverBlock = false;\r\n \r\n protected keepShowingButtons = false;\r\n\r\n constructor(panel: ColumnsBar, column: QueryColumn, slot?: HTMLDivElement) {\r\n this.bar = panel;\r\n this.column = column;\r\n \r\n this.element = slot;\r\n }\r\n\r\n protected get cssPrefix(): string {\r\n return 'eqjs-cb';\r\n }\r\n\r\n public render(): HTMLDivElement {\r\n const builder = domel('div');\r\n builder.data('id', this.column.id);\r\n\r\n if (this.element) {\r\n\r\n //to remove all event listeners\r\n this.element.parentNode\r\n .replaceChild(builder.toDOM(), this.element);\r\n }\r\n\r\n this.element = builder.toDOM();\r\n\r\n if (this.bar.options.allowDragDrop) {\r\n eqDragManager.registerDraggableItem({\r\n element: this.element,\r\n scope: \"entityAttrSort\",\r\n beforeDragStart: () => this.element.dispatchEvent(createBrowserEvent('mouseleave')),\r\n onDragStart: (ev) => {\r\n this.hideButtons();\r\n this.element.style.display = 'none';\r\n ev.dropEffect = DropEffect.Allow;\r\n }, \r\n onDragEnd: (ev) => {\r\n if (!ev.data.finishedSuccessfully) {\r\n this.element.removeAttribute('style');\r\n }\r\n },\r\n data: { column: this.column }\r\n }); \r\n }\r\n \r\n if (!this.column.isReadOnly()) {\r\n this.createFunctionMenu();\r\n this.createFormatsMenu();\r\n }\r\n\r\n builder\r\n .addClass(this.getClassesToAdd())\r\n .addClass(browserUtils.getMobileCssClass())\r\n .addChildElement(this.renderCaptionBlock())\r\n .addChildElement(this.renderSortingImage());\r\n\r\n if (!browserUtils.isMobileMode()) {\r\n builder\r\n .addChildElement(this.renderButtonsBlock())\r\n }\r\n \r\n //start event listeners\r\n builder\r\n .on('mouseenter', this.onMouseEnter.bind(this))\r\n .on('mouseleave', this.onMouseLeave.bind(this))\r\n //end event listeners\r\n\r\n if (this.bar.options.accentActiveColumn || browserUtils.isMobileMode()) {\r\n builder\r\n .on('touchstart click', this.onMouseClick.bind(this));\r\n }\r\n\r\n return this.element;\r\n }\r\n\r\n public fireColumnChanged() {\r\n this.column.fireChangedEvent();\r\n }\r\n\r\n public refresh() {\r\n this.render();\r\n }\r\n\r\n protected isEditable(): boolean {\r\n return this.column.enabled && !this.column.isReadOnly();\r\n }\r\n\r\n private tapedTwice = false;\r\n\r\n protected renderButtonsBlock(): HTMLDivElement {\r\n return domel('div', this.element)\r\n .addClass(`${eqCssPrefix}-column-buttonsBlock`, `${this.cssPrefix}-buttonsBlock`)\r\n .addChildElement(this.renderSortingButton())\r\n .addChildElement(this.renderColumnTypeButton())\r\n .addChildElement(this.renderColumnFormatButton())\r\n .addChildElement(this.renderDeleteButton())\r\n .toDOM();\r\n }\r\n\r\n protected renderCaptionBlock(): HTMLDivElement {\r\n const caption = this.column.caption;\r\n if (!this.isEditable()) {\r\n return domel('div')\r\n .addClass(`${this.cssPrefix}-colelement`, `${this.cssPrefix}-captionelement`)\r\n .addClass(browserUtils.getMobileCssClass())\r\n .addChild('div', b => b\r\n .title(caption)\r\n .text(caption)\r\n .attr('tabIndex', '0')\r\n )\r\n .toDOM()\r\n }\r\n\r\n const tapHandler = (ev: TouchEvent) => {\r\n if(!this.tapedTwice) {\r\n this.tapedTwice = true;\r\n setTimeout( () => { this.tapedTwice = false; }, 300 );\r\n }\r\n }\r\n\r\n let isFocused = false;\r\n domel(this.element).on('touchstart dblclick', ev => {\r\n if (ev instanceof TouchEvent && !this.tapedTwice) {\r\n tapHandler(ev);\r\n return true;\r\n }\r\n\r\n ev.stopPropagation();\r\n\r\n isFocused = this.element.querySelector('a') == document.activeElement;\r\n\r\n const inputEl = this.element.querySelector(`.${this.cssPrefix}-captionelement input`) as HTMLInputElement;\r\n const aEl = this.element.querySelector(`.${this.cssPrefix}-captionelement a`) as HTMLAnchorElement;\r\n if (inputEl) { \r\n inputEl.style.width = `${this.element.clientWidth}px`;\r\n aEl.style.display = 'none';\r\n inputEl.style.removeProperty('display');\r\n inputEl.focus();\r\n this.element.setAttribute(eqDragManager.DRAG_DISABLED_ATTR, '');\r\n }\r\n\r\n return false;\r\n }); //TO DO:add localization and input field);\r\n\r\n return domel('div')\r\n .addClass(`${this.cssPrefix}-colelement`, `${this.cssPrefix}-captionelement`)\r\n .addClass(browserUtils.getMobileCssClass())\r\n .addChild('a', builder => builder\r\n .attr('href', 'javascript:void(0)')\r\n .title(this.column.caption)\r\n .text(caption)\r\n .on('keydown', e => {\r\n const evt = e as KeyboardEvent;\r\n const isCtrlEnter = (evt.ctrlKey || evt.metaKey) && (evt.keyCode == 13 || evt.keyCode == 10)\r\n\r\n if (isCtrlEnter && this.isColumnActive()) {\r\n const clickEvent = document.createEvent ('MouseEvents');\r\n clickEvent.initEvent ('dblclick', true, true);\r\n this.element.dispatchEvent (clickEvent);\r\n evt.stopPropagation();\r\n\r\n return false;\r\n }\r\n\r\n return true;\r\n })\r\n )\r\n .addChild('input', builder => builder\r\n .hide()\r\n .value(this.column.caption)\r\n .on('blur keydown', (ev) => { \r\n let isEndEvent = false;\r\n let save = true;\r\n\r\n if (ev instanceof KeyboardEvent) {\r\n // Enter\r\n if (ev.keyCode === 13) {\r\n isEndEvent = true;\r\n //ESC\r\n } else if (ev.keyCode === 27) {\r\n isEndEvent = true;\r\n save = false;\r\n }\r\n \r\n } else if (ev instanceof FocusEvent) {\r\n isEndEvent = true;\r\n }\r\n\r\n if (isEndEvent) {\r\n\r\n const inputEl = (ev.target as HTMLInputElement);\r\n const aEl = inputEl.parentElement.querySelector('a') as HTMLAnchorElement;\r\n if (aEl) {\r\n aEl.style.removeProperty('display');\r\n inputEl.style.display = 'none';\r\n }\r\n if (save && this.column.caption !== inputEl.value) {\r\n this.column.caption = inputEl.value;\r\n \r\n this.fireColumnChanged();\r\n } else {\r\n inputEl.value = this.column.caption;\r\n }\r\n\r\n this.element.removeAttribute(eqDragManager.DRAG_DISABLED_ATTR);\r\n \r\n if (isFocused) {\r\n this.element.querySelector('a').focus();\r\n }\r\n }\r\n \r\n })\r\n )\r\n .toDOM();\r\n }\r\n\r\n protected renderSortingImage(): HTMLDivElement {\r\n const sortButtonCssClass = `${eqCssPrefix}-column-sortbutton`;\r\n let sortButtonDirectionCssClass = sortButtonCssClass;\r\n switch (this.column.sorting) {\r\n case SortDirection.Ascending:\r\n sortButtonDirectionCssClass = `${sortButtonCssClass}-asc`;\r\n break;\r\n case SortDirection.Descending:\r\n sortButtonDirectionCssClass = `${sortButtonCssClass}-desc`;\r\n break;\r\n }\r\n\r\n if (this.column.sorting == SortDirection.None) {\r\n return null\r\n }\r\n else {\r\n return domel('div')\r\n .addClass(`${this.cssPrefix}-colelement`, `${this.cssPrefix}-sortimage-placeholder`)\r\n .addClass(browserUtils.getMobileCssClass())\r\n .addChild('div', builder => builder\r\n .addClass(`${this.cssPrefix}-img-sorting`, sortButtonDirectionCssClass)\r\n .title(i18n.getText('ButtonSorting'))\r\n )\r\n\r\n .toDOM();\r\n }\r\n }\r\n\r\n public buttonSortingClickHandler(ev: Event, anchor: HTMLDivElement) {\r\n ev.stopPropagation();\r\n\r\n this.keepShowingButtons = true;\r\n const menu = this.getUIS() ? this.bar.sortMenu || this.bar.moveMenu : this.bar.moveMenu;\r\n menu.showMenu({\r\n anchor: anchor,\r\n selectedIds: null,\r\n itemSelectedCallback: (data, items) => {\r\n\r\n const strToSortDirection = (str: string) => {\r\n if (str == 'None') {\r\n return SortDirection.None;\r\n }\r\n else if (str == \"Ascending\") {\r\n return SortDirection.Ascending;\r\n }\r\n else if (str == \"Descending\") {\r\n return SortDirection.Descending;\r\n }\r\n };\r\n\r\n if (data.id == 'None' || data.id == \"Ascending\" || data.id == \"Descending\") {\r\n const query = this.bar.getQuery();\r\n this.column.sorting = strToSortDirection(data.id);\r\n this.column._sortIndex = query.getColumnSortIndex(this.column);\r\n\r\n this.fireColumnChanged();\r\n }\r\n else {\r\n this.bar.moveColumn(this.column, data.id);\r\n }\r\n },\r\n menuClosedCallback: () => { //called when menu is closed\r\n this.keepShowingButtons = false;\r\n if (!this.isMouseOverBlock) {\r\n this.leaveButtonBlock();\r\n }\r\n }\r\n });\r\n\r\n return false;\r\n }\r\n\r\n protected renderSortingButton(): HTMLDivElement {\r\n\r\n if (!this.isEditable()) {\r\n return null;\r\n }\r\n\r\n const builder = domel('div')\r\n .addClass(`${eqCssPrefix}-column-button`, `${eqCssPrefix}-column-sortbutton`, `${eqCssPrefix}-column-sortbutton-none`)\r\n .title(i18n.getText('ButtonSorting'))\r\n .attr('tabIndex', '0')\r\n .on('touchstart click', (ev) => this.buttonSortingClickHandler(ev, builder.toDOM()))\r\n .on('keypress', evt => { if ((evt as KeyboardEvent).keyCode == 13) { (evt.target as HTMLElement).click()}});\r\n\r\n return builder.toDOM();\r\n }\r\n\r\n public buttonDeleteClickHandler(ev: Event) {\r\n ev.stopPropagation();\r\n const query = this.bar.getQuery();\r\n query.removeColumn(this.column);\r\n query.fireColumnsChangedEvent(QueryChangeAction.Delete, this.column);\r\n return false;\r\n }\r\n\r\n protected renderDeleteButton(): HTMLDivElement {\r\n if (this.column.isReadOnly()) {\r\n return null;\r\n }\r\n\r\n return domel('div')\r\n .addClass(`${eqCssPrefix}-column-button`, `${eqCssPrefix}-column-button-delete`)\r\n .title(i18n.getText('CmdDelete'))\r\n .attr('tabIndex', '0')\r\n .on('touchstart click', (ev) => this.buttonDeleteClickHandler(ev))\r\n .on('keypress', evt => { if ((evt as KeyboardEvent).keyCode == 13) { (evt.target as HTMLElement).click()}})\r\n .toDOM();\r\n }\r\n protected getClassesToAdd(): string {\r\n let result = \"\";\r\n\r\n result += this.column.enabled ? '' : ` ${this.cssPrefix}-disabled`;\r\n if (this.column.enabled) {\r\n result += this.column.isReadOnly() ? ` ${this.cssPrefix}-readonly` : '';\r\n }\r\n\r\n return result;\r\n }\r\n\r\n public buttonTypeClickHandler(ev: Event) {\r\n ev.stopPropagation();\r\n\r\n this.keepShowingButtons = true;\r\n this.changeColumnTypeHandler(ev);\r\n return false;\r\n }\r\n\r\n public buttonFormatClickHandler(ev: Event) {\r\n ev.stopPropagation();\r\n\r\n this.keepShowingButtons = true;\r\n this.changeFormatHandler(ev);\r\n return false;\r\n }\r\n\r\n public formatButtonIsShown(): boolean {\r\n return this.bar.options.allowDisplayFormatChange !== false && \r\n this.bar\r\n .getContext()\r\n .getModel()\r\n .getDisplayFormatsForType(this.column.getDataType()).length > 0;\r\n }\r\n\r\n protected changeFormatHandler(ev: Event) {\r\n const formats = this.bar\r\n .getContext()\r\n .getModel()\r\n .getDisplayFormatsForType(this.column.getDataType());\r\n\r\n let itemId = '{0:__default}';\r\n if (formats.filter(f => f.format == this.column.displayFormat).length > 0) {\r\n itemId = this.column.displayFormat;\r\n }\r\n\r\n this.formatsMenu.showMenu({\r\n anchor: ev.target as HTMLElement,\r\n selectedIds: itemId,\r\n itemSelectedCallback: (data, items) => {\r\n\r\n if (data.id != itemId) {\r\n if (data.id == '{0:__default}') {\r\n this.column.displayFormat = '';\r\n }\r\n else {\r\n this.column.displayFormat = data.id;\r\n }\r\n\r\n this.column.fireChangedEvent();\r\n }\r\n\r\n return false;\r\n },\r\n menuClosedCallback: () => { //called when menu is closed\r\n this.keepShowingButtons = false;\r\n if (!this.isMouseOverBlock) {\r\n this.element.dispatchEvent(createBrowserEvent('mouseleave'));\r\n }\r\n }\r\n });\r\n }\r\n\r\n protected renderColumnTypeButton(): HTMLDivElement {\r\n if (!this.isEditable() || this.bar.options.allowAggrColumns === false) {\r\n return null;\r\n }\r\n\r\n return domel('div')\r\n .addClass(`${eqCssPrefix}-column-button`, `${eqCssPrefix}-column-button-type`)\r\n .title(i18n.getText('ButtonToAggr'))\r\n .attr('tabIndex', '0')\r\n .on('touchstart click', (ev) => this.buttonTypeClickHandler(ev))\r\n .on('keypress', evt => { if ((evt as KeyboardEvent).keyCode == 13) { (evt.target as HTMLElement).click()}})\r\n .toDOM();\r\n }\r\n\r\n protected renderColumnFormatButton(): HTMLDivElement {\r\n if (!this.isEditable() || !this.formatButtonIsShown()) {\r\n return null;\r\n }\r\n\r\n return domel('div')\r\n .addClass(`${eqCssPrefix}-column-button`, `${eqCssPrefix}-column-button-format`)\r\n .title(i18n.getText('ButtonFormat'))\r\n .attr('tabIndex', '0')\r\n .on('touchstart click', (ev) => this.buttonFormatClickHandler(ev))\r\n .on('keypress', evt => { if ((evt as KeyboardEvent).keyCode == 13) { (evt.target as HTMLElement).click() } })\r\n .toDOM();\r\n }\r\n\r\n protected abstract changeColumnTypeHandler(ev: Event); \r\n\r\n protected getUIS() {\r\n return this.bar\r\n .getContext().getModel()\r\n .checkAttrProperty(this.column.expr.value, \"useInSorting\");\r\n }\r\n\r\n private onMouseClick(ev: Event) {\r\n this.bar.toggleColumnPicked(this.column);\r\n this.adjustButtonsVisibility();\r\n }\r\n\r\n private onMouseEnter(e: Event) {\r\n if (browserUtils.isMobileMode()) return;\r\n\r\n this.isMouseOverBlock = true;\r\n this.enterButtonBlock()\r\n e.stopPropagation();\r\n\r\n return false;\r\n }\r\n\r\n private onMouseLeave(e: Event) {\r\n if (browserUtils.isMobileMode()) return;\r\n\r\n this.isMouseOverBlock = false;\r\n this.leaveButtonBlock();\r\n e.stopPropagation();\r\n\r\n return false;\r\n }\r\n\r\n protected isColumnActive(): boolean {\r\n return this.element.classList.contains(\"active\");\r\n }\r\n\r\n public onShowButtonsMobile: () => void;\r\n public onHideButtonsMobile: () => void;\r\n\r\n protected hideButtons() {\r\n if (browserUtils.isMobileMode()) {\r\n if (this.onHideButtonsMobile) {\r\n this.onHideButtonsMobile()\r\n }\r\n }\r\n else {\r\n domel(this.element).data(\"show-buttons\", null);\r\n }\r\n }\r\n\r\n protected showButtons() {\r\n if (browserUtils.isMobileMode()) {\r\n if (this.onShowButtonsMobile) {\r\n this.onShowButtonsMobile()\r\n }\r\n }\r\n else {\r\n domel(this.element).data(\"show-buttons\", \"\");\r\n }\r\n }\r\n\r\n protected adjustButtonsVisibility() {\r\n if (this.bar.options.alwaysShowButtons \r\n || ((this.bar.options.accentActiveColumn || browserUtils.isMobileMode()) \r\n && this.isColumnActive())\r\n ) {\r\n \r\n this.showButtons();\r\n }\r\n else {\r\n this.hideButtons();\r\n }\r\n }\r\n\r\n protected enterButtonBlock() {\r\n this.showButtons();\r\n }\r\n\r\n protected leaveButtonBlock() {\r\n if (this.bar.options.alwaysShowButtons != true && (!this.isColumnActive() || this.bar.options.accentActiveColumn != true)) {\r\n this.hideButtons();\r\n }\r\n }\r\n\r\n protected createFunctionMenu() {\r\n const items = [];\r\n const funcs = this.bar.getContext().getModel().getAggrFunctions();\r\n let funcAllowed = true;\r\n\r\n let item = null;\r\n\r\n const colDataType = this.column.getDataType();\r\n\r\n let funcCaption;\r\n\r\n for (const func of funcs) {\r\n if (!func) continue;\r\n\r\n const toInclude = func.getAppliedTypesOrDefault().indexOf(colDataType) >= 0;\r\n\r\n if (this.column.expr.func === func.id && !toInclude) {\r\n funcAllowed = false;\r\n }\r\n\r\n if (toInclude) {\r\n funcCaption = this.bar.getContext().getModel()\r\n .getAggrFunctionCaption(func.id);\r\n\r\n item = {\r\n id: func.id,\r\n text: funcCaption\r\n };\r\n\r\n items.push(item);\r\n }\r\n }\r\n\r\n\r\n if (!funcAllowed) {\r\n this.column.expr.func = items[0].id;\r\n }\r\n \r\n //Add \"Custom Expression\" menu\r\n const columnsPanel = this.bar;\r\n if (columnsPanel.areCustomExpressionsAllowed()) {\r\n item = {\r\n id: 'CustomSqlDivider',\r\n text: '---'\r\n };\r\n\r\n items.push(item);\r\n\r\n funcCaption = i18n.getText('CustomExpression');\r\n item = {\r\n id: 'CUSTOMSQL',\r\n text: funcCaption\r\n };\r\n\r\n items.push(item);\r\n }\r\n \r\n\r\n let menuId = this.element.id;\r\n if (menuId) {\r\n menuId += '-FunctionsMenu';\r\n }\r\n\r\n const menuOptions = {\r\n items: items,\r\n id: menuId,\r\n searchBoxAlwaysShown: false,\r\n domWriteItemsId: true //this.panel.options.domWriteItemsId\r\n };\r\n \r\n this.functionMenu = new PopupMenu(menuOptions);\r\n }\r\n\r\n protected createFormatsMenu() {\r\n if (this.bar.options.allowDisplayFormatChange == false) return;\r\n\r\n let menuId = this.column.id;\r\n if (menuId) {\r\n menuId += '-FormatsMenu';\r\n }\r\n\r\n const items = this.getFormatsMenuItems();\r\n const menuOptions = {\r\n items: items,\r\n id: menuId,\r\n searchBoxAlwaysShown: false,\r\n showSelected: true,\r\n domWriteItemsId: true //this.panel.options.domWriteItemsId\r\n };\r\n\r\n this.formatsMenu = new PopupMenu(menuOptions);\r\n }\r\n\r\n private getFormatsMenuItems(): MenuItem[] {\r\n\r\n const formats = this.bar.getContext().getModel()\r\n .getDisplayFormatsForType(this.column.getDataType());\r\n\r\n return [{ id: '{0:__default}', text: \"Default\" }]\r\n .concat(formats.map(format => ({ id: format.format, text: i18n.getText(\"DisplayFormats\", format.name) || format.name })));\r\n }\r\n}","\r\nimport { EntityAttr, ExprTag } from '@easyquery/core';\r\nimport { createBrowserEvent } from '@easydata/ui';\r\n\r\nimport { ColumnRendererCB } from './column_renderer_cb';\r\n\r\nexport class AttrColumnRendererCB extends ColumnRendererCB {\r\n protected getClassesToAdd(): string {\r\n return `${super.getClassesToAdd()} ${this.cssPrefix}-row ${this.cssPrefix}-row-column-entattr`;\r\n } \r\n \r\n protected baseExpressionItemSelectedCallback(data, item): boolean {\r\n const attrid = data.id;\r\n const context = this.bar.getContext();\r\n var attr = context.getModel().getAttributeById(attrid);\r\n this.updateBaseAttr(attr);\r\n this.column.caption = context.getDefaultColumnCaption(this.column);\r\n\r\n this.fireColumnChanged();\r\n return false;\r\n }\r\n\r\n protected updateBaseAttr(attr : EntityAttr) : void {\r\n this.column.expr.setValue(attr.id, true);\r\n this.column.expr.baseAttrId = attr.id;\r\n this.column.expr.dataType = attr.dataType;\r\n }\r\n\r\n protected getUIS(): boolean {\r\n const arg = this.column.expr.args[0];\r\n if (arg) {\r\n const model = this.bar.getContext().getModel();\r\n return model.checkAttrProperty(arg.value, \"useInSorting\");\r\n }\r\n else {\r\n return true;\r\n }\r\n }\r\n \r\n protected changeTypeToCustomSql() {\r\n const query = this.column.getQuery();\r\n query.changeColumnType(this.column, ExprTag.CustomSql);\r\n this.fireColumnChanged();\r\n }\r\n\r\n protected changeTypeToAggr(funcId: string) {\r\n const query = this.column.getQuery();\r\n query.changeColumnType(this.column, ExprTag.AggregateFunction, { funcId: funcId});\r\n this.fireColumnChanged();\r\n }\r\n\r\n protected changeColumnTypeHandler(ev: Event) {\r\n this.functionMenu.showMenu({\r\n anchor: ev.target as HTMLElement,\r\n selectedIds: null,\r\n itemSelectedCallback: (data, items) => {\r\n\r\n if (data.id == \"CUSTOMSQL\") {\r\n this.changeTypeToCustomSql();\r\n }\r\n else {\r\n this.changeTypeToAggr(data.id);\r\n }\r\n\r\n return false;\r\n },\r\n menuClosedCallback: () => { //called when menu is closed\r\n this.keepShowingButtons = false;\r\n if (!this.isMouseOverBlock) {\r\n this.element.dispatchEvent(createBrowserEvent('mouseleave'));\r\n }\r\n }\r\n });\r\n }\r\n}","import { i18n } from '@easydata/core';\r\nimport { ExprTag, EntityAttr } from '@easyquery/core';\r\n\r\nimport { AttrColumnRendererCB } from './attr_column_renderer_cb';\r\n\r\nexport class AggrFuncColumnRendererCB extends AttrColumnRendererCB { \r\n protected getClassesToAdd(): string {\r\n return `${super.getClassesToAdd()} ${this.cssPrefix}-row ${this.cssPrefix}-row-column-aggr`;\r\n }\r\n\r\n protected renderColumnTypeButton() {\r\n const button = super.renderColumnTypeButton();\r\n if (button) {\r\n button.classList.add('aggregated');\r\n button.title = i18n.getText('ButtonToSimple');\r\n }\r\n return button;\r\n }\r\n\r\n protected updateBaseAttr(attr : EntityAttr) : void {\r\n this.column.expr.args[0].setValue(attr.id, true);\r\n this.column.expr.baseAttrId = attr.id;\r\n }\r\n \r\n public changeTypeToSimple() {\r\n const query = this.column.getQuery();\r\n query.changeColumnType(this.column, ExprTag.EntityAttribute);\r\n this.fireColumnChanged(); \r\n }\r\n\r\n protected changeColumnTypeHandler(ev: Event) {\r\n this.changeTypeToSimple();\r\n }\r\n}","\r\nimport { i18n, ExprTag } from '@easyquery/core';\r\n\r\nimport { ColumnRendererCB } from './column_renderer_cb';\r\n\r\nexport class EditableColumnRendererCB extends ColumnRendererCB {\r\n protected getClassesToAdd(): string {\r\n return `${this.cssPrefix}-row ${this.cssPrefix}-row-column-entattr` + super.getClassesToAdd();\r\n }\r\n\r\n protected renderColumnTypeButton() {\r\n const button = super.renderColumnTypeButton();\r\n if (button) {\r\n button.classList.add('aggregated');\r\n button.title = i18n.getText('ButtonToSimple');\r\n }\r\n return button;\r\n }\r\n \r\n public changeTypeToSimple() {\r\n const query = this.column.getQuery();\r\n query.changeColumnType(this.column, ExprTag.EntityAttribute);\r\n this.fireColumnChanged();\r\n }\r\n \r\n protected getColumnValue() : string {\r\n return '';\r\n }\r\n\r\n protected setColumnValue(value : string) : void {\r\n }\r\n\r\n protected getUIS() {\r\n return true;\r\n }\r\n\r\n protected changeColumnTypeHandler(ev: Event) {\r\n this.changeTypeToSimple();\r\n }\r\n}\r\n\r\nexport class CustomSqlColumnRendererCB extends EditableColumnRendererCB {\r\n protected get columnEnabled(): boolean {\r\n return this.bar.areCustomExpressionsAllowed() ? this.column.enabled : false;\r\n }\r\n\r\n protected set columnEnabled(value: boolean) {\r\n if (this.bar.areCustomExpressionsAllowed()) {\r\n this.column.enabled = value;\r\n }\r\n else {\r\n this.column.enabled = false;\r\n }\r\n }\r\n\r\n protected getColumnValue() : string {\r\n return this.column.expr.sql;\r\n }\r\n\r\n protected setColumnValue(value : string) : void {\r\n this.column.expr.sql = value;\r\n }\r\n\r\n protected getDefaultValue() {\r\n return this.column.expr.sql;\r\n }\r\n}\r\n\r\nexport class ConstColumnRendererCB extends EditableColumnRendererCB {\r\n protected getColumnValue() : string {\r\n return this.column.expr.value;\r\n }\r\n\r\n protected setColumnValue(value : string) : void {\r\n this.column.expr.setValue(value);\r\n }\r\n \r\n protected getDefaultValue() {\r\n return this.column.expr.value;\r\n }\r\n}","import { i18n } from '@easydata/core';\r\nimport { utils as dataUtils } from '@easydata/core';\r\n\r\nimport {\r\n DataKind, ExprTag, EntityAttr, EqContext, \r\n Query, QueryColumn, SortDirection,\r\n QueryChangePart, QueryChangeAction,\r\n Widget,WidgetGroup, QueryChangeEventData\r\n} from '@easyquery/core';\r\n\r\nimport { \r\n eqDragManager, DropEffect, \r\n getElementAbsolutePos, domel\r\n } from '@easydata/ui';\r\n\r\nimport { PopupMenu, PopupMenuOptions } from '../utils/popup_menu';\r\nimport { eqCssPrefix} from '../utils/utils';\r\nimport { browserUtils } from '../utils/browser_utils';\r\n\r\nimport { ColumnsBarOptions } from './widget_options';\r\nimport { ColumnRendererCB } from './renderers/columnsbar/column_renderer_cb';\r\nimport { AggrFuncColumnRendererCB } from './renderers/columnsbar/aggrfunc_column_renderer_cb';\r\nimport { AttrColumnRendererCB } from './renderers/columnsbar/attr_column_renderer_cb';\r\nimport { ConstColumnRendererCB, CustomSqlColumnRendererCB } from './renderers/columnsbar/editable_column_renderer_cb';\r\n\r\nexport class ColumnsBar extends Widget {\r\n\r\n private static globalCounter: number = 0;\r\n\r\n public options: ColumnsBarOptions = {\r\n isSubQuery: false,\r\n activeColumn: null,\r\n showAddRow: true,\r\n showHeader: true,\r\n showColumnTitles: true,\r\n allowAggrColumns: true,\r\n allowDuplicates: true,\r\n allowCustomExpressions: false,\r\n allowSorting: true,\r\n alwaysShowButtons: false,\r\n accentActiveColumn: true,\r\n allowDragDrop: true,\r\n menuOptions: {\r\n showSearchBoxAfter: 30,\r\n searchBoxAutoFocus: true,\r\n activateOnMouseOver: true,\r\n adjustHeight: true,\r\n itemRenderedCallback: null\r\n },\r\n attrPlacement: 0,\r\n sortEntities: false,\r\n columnRenderedCallback: null,\r\n\r\n customExpressionText: 0, \r\n };\r\n\r\n private columnsBlock: HTMLDivElement;\r\n private addRowButton: HTMLDivElement;\r\n\r\n private columnButtonsBlockMobile: HTMLDivElement;\r\n private columnButtonsBlockMobileArrow: HTMLElement;\r\n private buttonsBlockSortingButton: HTMLDivElement;\r\n private buttonsBlockTypeButton: HTMLDivElement;\r\n private buttonsBlockFormatButton: HTMLDivElement;\r\n private buttonsBlockDeleteButton: HTMLDivElement;\r\n\r\n private entitiesMenu: PopupMenu;\r\n\r\n public sortMenu: PopupMenu;\r\n public moveMenu: PopupMenu;\r\n\r\n private queryEventCallbackId?: string;\r\n\r\n protected get cssPrefix(): string {\r\n return \"eqjs-cb\";\r\n }\r\n\r\n\r\n private customQuery?: Query;\r\n\r\n constructor(slot: HTMLElement, customQuery?: Query) {\r\n\r\n super(slot);\r\n\r\n domel(this.slot)\r\n .addClass(`${this.cssPrefix}-panel`)\r\n .addClass(browserUtils.getMobileCssClass());\r\n\r\n this.group = WidgetGroup.Query;\r\n\r\n this.customQuery = customQuery;\r\n }\r\n\r\n public getWidgetType(): string {\r\n return 'columnsBar';\r\n }\r\n\r\n public init(context: EqContext, options?: ColumnsBarOptions) {\r\n super.init(context, options);\r\n\r\n this.setOptions(options);\r\n\r\n if (options.attrElementFormat) {\r\n this.context.options.attributeFormat = options.attrElementFormat;\r\n }\r\n\r\n if (options.titleElementFormat) {\r\n this.context.options.columnTitleFormat = options.titleElementFormat;\r\n }\r\n\r\n this.detachQueryObserver();\r\n this.attachQueryObserver();\r\n \r\n eqDragManager.removeDropContainer(this.slot);\r\n if (this.options.allowDragDrop) {\r\n eqDragManager.registerDropContainer({\r\n element: this.slot,\r\n scopes: [\"entityAttrSort\"],\r\n onDragEnter: (container, ev) => {\r\n this.showLandingSlot(ev.pageX, ev.pageY);\r\n },\r\n onDragOver: (container, ev) => {\r\n this.showLandingSlot(ev.pageX, ev.pageY);\r\n },\r\n onDragLeave: (container, ev) => {\r\n ev.dropEffect = DropEffect.Forbid;\r\n this.hideLandingSlot();\r\n },\r\n onDrop: (container, ev) => {\r\n if (this.landingIndex >= 0) {\r\n const query = this.getQuery();\r\n const columns = query.getColumns();\r\n const index = columns.indexOf(ev.data.column);\r\n\r\n this.moveColumnCore(index, this.landingIndex);\r\n }\r\n else {\r\n ev.item.element.removeAttribute('style');\r\n }\r\n }\r\n });\r\n }\r\n }\r\n\r\n private attachQueryObserver() {\r\n const query = this.getQuery();\r\n\r\n this.queryEventCallbackId = query.addChangedCallback(event => {\r\n //if something has changed, and that change is related to columns\r\n const edata = event.data as QueryChangeEventData;\r\n if (!edata || (edata.part != QueryChangePart.Columns \r\n && edata.part != QueryChangePart.Aggregation \r\n && edata.part != QueryChangePart.All)) {\r\n return;\r\n }\r\n\r\n const focusedBefore = document.activeElement;\r\n const isFocusInside = this.slot.contains(focusedBefore) || focusedBefore == document.body;\r\n\r\n switch (edata.action) {\r\n case QueryChangeAction.Modify: {\r\n \r\n const columns = edata.changee as QueryColumn | QueryColumn[];\r\n\r\n const modifyColumn = (column: QueryColumn) => {\r\n\r\n const colEl = this.columnsBlock.querySelector(`div[data-id='${column.id}']`);\r\n\r\n if (colEl) {\r\n const newEl = this.renderColumn(column, colEl as HTMLDivElement);\r\n\r\n if (isFocusInside) {\r\n const focusElem = newEl.querySelector('a');\r\n if (focusElem) {\r\n focusElem.focus();\r\n }\r\n }\r\n\r\n }\r\n }\r\n \r\n if (Array.isArray(columns)) {\r\n columns.forEach((col) => modifyColumn(col));\r\n }\r\n else {\r\n modifyColumn(columns);\r\n }\r\n\r\n break;\r\n }\r\n case QueryChangeAction.Add: {\r\n const columns = edata.changee as QueryColumn | QueryColumn[];\r\n\r\n const addColumn = (column: QueryColumn) => {\r\n const index = query.getColumns().indexOf(column);\r\n this.addColumnElement(column, index);\r\n }\r\n\r\n if (Array.isArray(columns)) {\r\n columns.forEach((col) => addColumn(col));\r\n }\r\n else {\r\n addColumn(columns);\r\n }\r\n \r\n break;\r\n }\r\n case QueryChangeAction.Delete: {\r\n const columns = edata.changee as QueryColumn | QueryColumn[];\r\n const deleteColumn = (column: QueryColumn) => {\r\n const colEl = this.columnsBlock.querySelector(`div[data-id='${column.id}']`);\r\n if (colEl) {\r\n const next = colEl.nextSibling;\r\n const prev = colEl.previousSibling;\r\n\r\n this.columnsBlock.removeChild(colEl);\r\n\r\n if (isFocusInside) {\r\n const focusCond = next || prev || this.addRowButton;\r\n const focusElem =(focusCond as HTMLElement).querySelector('a');\r\n if (focusElem) {\r\n focusElem.focus();\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (Array.isArray(columns)) {\r\n columns.forEach((col) => deleteColumn(col));\r\n }\r\n else {\r\n deleteColumn(columns);\r\n }\r\n \r\n break;\r\n }\r\n default:\r\n this.refresh();\r\n break;\r\n }\r\n });\r\n }\r\n\r\n public getQuery() : Query {\r\n return this.customQuery \r\n ? this.customQuery \r\n : this.getContext().getQuery();\r\n }\r\n\r\n protected destroyCore() {\r\n eqDragManager.removeDropContainer(this.slot);\r\n this.detachQueryObserver();\r\n\r\n this.slot.innerHTML = '';\r\n }\r\n\r\n private detachQueryObserver() {\r\n if (this.queryEventCallbackId) {\r\n const query = this.getQuery();\r\n query.removeChangedCallback(this.queryEventCallbackId);\r\n }\r\n }\r\n\r\n private setOptions(options?: ColumnsBarOptions) {\r\n this.options = dataUtils.assignDeep(this.options, options);\r\n\r\n this.getContext().options.allowCustomExpressions = options.allowCustomExpressions;\r\n }\r\n\r\n private landingSlot: HTMLDivElement \r\n = domel('div')\r\n .addClass(`${eqCssPrefix}-highlight`)\r\n .toDOM();\r\n\r\n private landingIndex: number = -1;\r\n\r\n public showLandingSlot(pageX: number, pageY: number) {\r\n\r\n const elements = this.columnsBlock.querySelectorAll(`[class*=${this.cssPrefix}-row]`) as NodeListOf<HTMLElement>;\r\n const columnSlots: HTMLElement[] = [];\r\n for(let i = 0; i < elements.length; i++) {\r\n if (elements[i].style.display !== 'none') {\r\n columnSlots.push(elements[i]);\r\n }\r\n }\r\n\r\n if (columnSlots.length === 0) {\r\n this.landingIndex = 0;\r\n return;\r\n }\r\n\r\n const landingPos = getElementAbsolutePos(this.landingSlot);\r\n if (pageX >= landingPos.x && pageX <= landingPos.x + this.landingSlot.offsetWidth\r\n && pageY >= landingPos.y && pageY <= landingPos.y + this.landingSlot.offsetHeight ) {\r\n return;\r\n }\r\n\r\n let newLandingIndex = this.landingIndex;\r\n for(let i = 0; i < columnSlots.length; i++) {\r\n const colSlot = columnSlots[i];\r\n\r\n const absPos = getElementAbsolutePos(colSlot);\r\n const colWidth = colSlot.offsetWidth;\r\n const colHeight = colSlot.offsetHeight;\r\n\r\n const paddingWidth = 0.2 * colWidth;\r\n const paddingHeight = 2;\r\n\r\n if (pageX >= absPos.x + paddingWidth && pageX <= absPos.x + colWidth - paddingWidth\r\n && pageY >= absPos.y + paddingHeight && pageY <= absPos.y + colHeight - paddingHeight) {\r\n\r\n if (pageX > landingPos.x)\r\n newLandingIndex = i + 1;\r\n else \r\n newLandingIndex = i;\r\n \r\n break;\r\n }\r\n }\r\n\r\n if (newLandingIndex != this.landingIndex || this.landingSlot.parentElement) {\r\n this.landingIndex = newLandingIndex;\r\n\r\n if (this.landingIndex <= 0) {\r\n this.columnsBlock.insertBefore(this.landingSlot, columnSlots[0]);\r\n }\r\n if (this.landingIndex < columnSlots.length) {\r\n this.columnsBlock.insertBefore(this.landingSlot, columnSlots[this.landingIndex]);\r\n }\r\n else {\r\n this.columnsBlock.appendChild(this.landingSlot);\r\n }\r\n \r\n }\r\n\r\n }\r\n\r\n public hideLandingSlot() {\r\n this.landingIndex = -1;\r\n if (this.landingSlot.parentElement) {\r\n this.landingSlot.parentElement.removeChild(this.landingSlot);\r\n }\r\n }\r\n\r\n protected onProcessStartCore() {\r\n\r\n }\r\n\r\n protected onProcessEndCore() {\r\n\r\n }\r\n\r\n protected refreshCore() {\r\n this.clear();\r\n this.render();\r\n }\r\n\r\n private clear() {\r\n // if (this.addRowButton) {\r\n // this.addRowButton.innerHTML = \"\";\r\n // this.addRowButton.className = \"\";\r\n // }\r\n // this.columnsBlock.innerHTML = \"\";\r\n\r\n this.slot.innerHTML = '';\r\n }\r\n\r\n private renderAddRowButton() {\r\n domel(this.addRowButton)\r\n .addClass(`${eqCssPrefix}-addrow`, `${this.cssPrefix}-addrow`, `${eqCssPrefix}-addrow-empty`)\r\n .addClass(browserUtils.getMobileCssClass())\r\n .title(i18n.getText('CmdClickToAddColumn'))\r\n .addChild('a', builder => builder\r\n .attr('href', 'javascript:void(0)')\r\n .on('click', (e) => {\r\n e.preventDefault();\r\n \r\n this.showEntitiesMenu({\r\n anchor: e.target, \r\n selectedIds: null, \r\n itemSelectedCallback: (data, items) => {\r\n const attrid = data.id;\r\n this.addNewColumn(attrid);\r\n return false;\r\n }\r\n });\r\n })\r\n )\r\n\r\n if (browserUtils.isMobileMode()) {\r\n domel(this.columnsBlock)\r\n .addChildElement(this.addRowButton);\r\n }\r\n }\r\n\r\n private render() {\r\n this.createEntitiesMenu();\r\n\r\n if (this.options.allowSorting) {\r\n this.createSortMenu();\r\n } \r\n \r\n this.createMoveMenu();\r\n\r\n\r\n this.columnsBlock = \r\n domel('div')\r\n .addClass(`${this.cssPrefix}-columns`)\r\n .addClass(browserUtils.getMobileCssClass())\r\n .toDOM();\r\n \r\n if (this.options.showAddRow) {\r\n this.addRowButton = \r\n domel('div')\r\n .toDOM();\r\n \r\n if (browserUtils.isMobileMode()) {\r\n domel(this.columnsBlock)\r\n .addChildElement(this.addRowButton);\r\n }\r\n else {\r\n domel(this.slot)\r\n .addChildElement(this.addRowButton);\r\n }\r\n\r\n this.renderAddRowButton();\r\n }\r\n\r\n domel(this.slot)\r\n .addChildElement(this.columnsBlock)\r\n .addChildElement(this.renderColumnButtonsBlockMobile());\r\n\r\n const query = this.getQuery();\r\n const columns = query.getColumns();\r\n \r\n columns.forEach((column, index) => {\r\n const slot = this.renderColumn(column);\r\n this.columnsBlock.appendChild(slot);\r\n });\r\n }\r\n\r\n private currentActiveColumn: QueryColumn;\r\n private currentColumnRenderer: ColumnRendererCB;\r\n \r\n private renderColumnButtonsBlockMobile() {\r\n this.columnButtonsBlockMobileArrow = domel('i').toDOM();\r\n\r\n this.columnButtonsBlockMobile = domel('div')\r\n .addClass(`${this.cssPrefix}-column-buttonsBlock`)\r\n .addClass(browserUtils.getMobileCssClass())\r\n .addChildElement(this.columnButtonsBlockMobileArrow)\r\n .hide()\r\n .toDOM();\r\n\r\n this.buttonsBlockSortingButton = domel('div', this.columnButtonsBlockMobile)\r\n .addClass(`${this.cssPrefix}-column-button`, `${this.cssPrefix}-column-sortbutton-none`)\r\n .toDOM();\r\n domel(this.buttonsBlockSortingButton)\r\n .on('touchstart click', (ev) => {\r\n ev.stopPropagation();\r\n this.currentColumnRenderer.buttonSortingClickHandler.call(this.currentColumnRenderer, ev, this.buttonsBlockSortingButton);\r\n this.toggleColumnPicked(null);\r\n this.hideColumnButtonsMobile();\r\n\r\n return false;\r\n });\r\n\r\n this.buttonsBlockTypeButton = domel('div', this.columnButtonsBlockMobile)\r\n .addClass(`${this.cssPrefix}-column-button`, `${this.cssPrefix}-column-button-type`)\r\n .on('touchstart click', (ev) => {\r\n ev.stopPropagation();\r\n this.currentColumnRenderer.buttonTypeClickHandler.call(this.currentColumnRenderer, ev);\r\n this.toggleColumnPicked(null);\r\n this.hideColumnButtonsMobile();\r\n\r\n return false;\r\n })\r\n .toDOM()\r\n\r\n this.buttonsBlockFormatButton = domel('div', this.columnButtonsBlockMobile)\r\n .addClass(`${this.cssPrefix}-column-button`, `${this.cssPrefix}-column-button-format`)\r\n .on('touchstart click', (ev) => {\r\n ev.stopPropagation();\r\n this.currentColumnRenderer.buttonFormatClickHandler.call(this.currentColumnRenderer, ev);\r\n this.toggleColumnPicked(null);\r\n this.hideColumnButtonsMobile();\r\n\r\n return false;\r\n })\r\n .toDOM()\r\n \r\n this.buttonsBlockDeleteButton = domel('div', this.columnButtonsBlockMobile)\r\n .addClass(`${this.cssPrefix}-column-button`, `${this.cssPrefix}-column-button-delete`)\r\n .on('touchstart click', (ev) => {\r\n ev.stopPropagation();\r\n\r\n this.currentColumnRenderer.buttonDeleteClickHandler.call(this.currentColumnRenderer, ev);\r\n this.toggleColumnPicked(null);\r\n this.hideColumnButtonsMobile();\r\n\r\n return false;\r\n })\r\n .toDOM()\r\n\r\n\r\n domel('div', this.columnButtonsBlockMobile)\r\n .addClass(`${this.cssPrefix}-column-button-close-block`)\r\n .on('touchstart click', () => {\r\n this.toggleColumnPicked(null);\r\n this.hideColumnButtonsMobile();\r\n })\r\n\r\n return this.columnButtonsBlockMobile;\r\n }\r\n\r\n private showColumnButtonsMobile(column: QueryColumn, columnRenderer: ColumnRendererCB, columnElement: HTMLDivElement) {\r\n this.currentActiveColumn = column;\r\n this.currentColumnRenderer = columnRenderer;\r\n\r\n //calculate coordinates\r\n const rect = columnElement.getBoundingClientRect();\r\n const top = columnElement.offsetTop;\r\n const left = columnElement.offsetLeft;\r\n \r\n domel(this.columnButtonsBlockMobileArrow)\r\n .setStyle('left', (left + rect.width/2).toString() + 'px');\r\n\r\n if (rect.top > 100) {\r\n domel(this.columnButtonsBlockMobile)\r\n .removeClass('show-below')\r\n .setStyle('top', (top - rect.height).toString() + 'px');\r\n }\r\n else {\r\n domel(this.columnButtonsBlockMobile)\r\n .addClass('show-below')\r\n .setStyle('top', (top + rect.height).toString() + 'px')\r\n }\r\n\r\n\r\n //show/hide separate buttons\r\n if (column.enabled && !column.isReadOnly()) {\r\n domel(this.buttonsBlockSortingButton).show();\r\n domel(this.buttonsBlockTypeButton).show();\r\n if (columnRenderer.formatButtonIsShown()) {\r\n domel(this.buttonsBlockFormatButton).show();\r\n }\r\n else {\r\n domel(this.buttonsBlockFormatButton).hide();\r\n }\r\n }\r\n else {\r\n domel(this.buttonsBlockSortingButton).hide();\r\n domel(this.buttonsBlockTypeButton).hide();\r\n }\r\n\r\n //show\r\n if (column.isReadOnly()) {\r\n domel(this.columnButtonsBlockMobile).hide();\r\n }\r\n else {\r\n domel(this.columnButtonsBlockMobile).show();\r\n }\r\n }\r\n\r\n private hideColumnButtonsMobile() {\r\n domel(this.columnButtonsBlockMobile).hide();\r\n }\r\n\r\n private renderColumn(column: QueryColumn, elem?: HTMLDivElement): HTMLDivElement | null{\r\n const renderer = this.getColumnRenderer(column, elem);\r\n if (renderer) {\r\n const columnSlot = renderer.render();\r\n renderer.onShowButtonsMobile = () => {\r\n this.showColumnButtonsMobile(column, renderer, columnSlot);\r\n } \r\n\r\n renderer.onHideButtonsMobile = () => {\r\n this.hideColumnButtonsMobile();\r\n } \r\n\r\n return columnSlot;\r\n }\r\n\r\n return null;\r\n }\r\n\r\n \r\n private getColumnRenderer(column: QueryColumn, slot?: HTMLDivElement): ColumnRendererCB | null {\r\n switch (column.expr.tag) {\r\n case ExprTag.Constant:\r\n return new ConstColumnRendererCB(this, column, slot);\r\n case ExprTag.AggregateFunction:\r\n return new AggrFuncColumnRendererCB(this, column, slot);\r\n case ExprTag.CustomSql:\r\n return new CustomSqlColumnRendererCB(this, column, slot);\r\n default:\r\n return new AttrColumnRendererCB(this, column, slot);\r\n } \r\n\r\n return null;\r\n }\r\n\r\n public addNewColumn(attrs: string, index?: number): QueryColumn\r\n public addNewColumn(attrs: string[], index?: number): QueryColumn[]\r\n public addNewColumn(attrs: string | string[], index?: number): QueryColumn | QueryColumn[] {\r\n const model = this.getContext().getModel();\r\n const query = this.getQuery();\r\n\r\n if (Array.isArray(attrs)) {\r\n let col : QueryColumn = null;\r\n let cols : QueryColumn[] = [];\r\n for (let i = 0; i < attrs.length; i++) {\r\n col = query.addColumn({\r\n attributeId: attrs[i],\r\n index: index\r\n }, true)\r\n if (col) {\r\n cols.push(col);\r\n }\r\n }\r\n\r\n return cols;\r\n }\r\n else {\r\n const col = query.addColumn({\r\n attributeId: attrs,\r\n index: index\r\n });\r\n\r\n return col;\r\n }\r\n }\r\n\r\n public toggleColumnPicked(column: QueryColumn) {\r\n let el: HTMLElement;\r\n let isActive: boolean;\r\n if (column) {\r\n el = this.columnsBlock.querySelector(`div[data-id=${column.id}]`);\r\n if (el) {\r\n isActive = el.classList.contains('active');\r\n }\r\n }\r\n\r\n //clear 'active' in all rows\r\n const rows = this.columnsBlock.querySelectorAll(`.${this.cssPrefix}-row`);\r\n for(let i = 0; i < rows.length; i++) {\r\n const row = rows[i] as HTMLElement;\r\n domel(row)\r\n .removeClass('active')\r\n .data(\"show-buttons\", null)\r\n }\r\n\r\n if (el && !isActive) {\r\n domel(el)\r\n .addClass('active')\r\n .data(\"show-buttons\", \"\")\r\n }\r\n }\r\n\r\n //adds one column to the bar on the specified position\r\n private addColumnElement(column: QueryColumn, index: number) {\r\n const rows = this.columnsBlock.querySelectorAll(`[class*=${this.cssPrefix}-row]`);\r\n\r\n const newColBlock = this.renderColumn(column);\r\n if (rows.length > 0) {\r\n if (index < rows.length - 1) {\r\n this.columnsBlock.insertBefore(newColBlock, rows[index]);\r\n }\r\n else {\r\n this.columnsBlock.appendChild(newColBlock);\r\n }\r\n }\r\n else {\r\n this.columnsBlock.appendChild(newColBlock);\r\n }\r\n\r\n if (this.options.columnRenderedCallback) {\r\n this.options.columnRenderedCallback(newColBlock);\r\n }\r\n }\r\n\r\n private checkColumnsArray(cols: QueryColumn[]): QueryColumn[] {\r\n let i = 0, len = cols.length;\r\n const result = [];\r\n for (let i = 0; i < len; i++) {\r\n if (this.checkColumn(cols[i]))\r\n result.push(cols[i]);\r\n }\r\n return result;\r\n }\r\n\r\n private checkColumn(col: QueryColumn) {\r\n if (!this.options.allowDuplicates) {\r\n const query = this.getQuery();\r\n const columns = query.getColumns();\r\n \r\n const colJson = JSON.stringify(col.expr);\r\n for (let i = 0; i < columns.length; i++) {\r\n const qcolJson = JSON.stringify(columns[i].expr);\r\n if (qcolJson === colJson) {\r\n return null;\r\n }\r\n }\r\n }\r\n return col;\r\n }\r\n\r\n public getColumnsBlock(): HTMLElement {\r\n return this.columnsBlock;\r\n }\r\n\r\n public showEntitiesMenu(menuOptions) {\r\n this.entitiesMenu && this.entitiesMenu.showMenu(menuOptions);\r\n }\r\n\r\n private createEntitiesMenu() {\r\n const model = this.getContext().getModel();\r\n if (!model || model.isEmpty()) return null;\r\n\r\n let menuId = this.slot.id;\r\n if (menuId) {\r\n menuId += '-EntitiesMenu';\r\n }\r\n\r\n const entitiesList = model.getEntitiesTree({ addUIC: false, addUIR: true, addUIS: false, attrPlacement: this.options.attrPlacement, sortEntities: this.options.sortEntities });\r\n const options: PopupMenuOptions = { items: entitiesList, adjustHeight: this.options.adjustEntitiesMenuHeight, id: menuId, domWriteItemsId: this.options.domWriteItemsId }\r\n dataUtils.assign(options, this.options.menuOptions);\r\n this.entitiesMenu = new PopupMenu(options);\r\n }\r\n\r\n private sortMenuList = [\r\n { id: 'None', text: i18n.getText('CmdNotSorted') },\r\n { id: 'Ascending', text: i18n.getText('CmdAscending') },\r\n { id: 'Descending', text: i18n.getText('CmdDescending') },\r\n { id: '---', text: '---' }\r\n ];\r\n\r\n private moveMenuList = [\r\n { id: 'MoveTop', text: i18n.getText('CmdMoveToFirst') },\r\n { id: 'MoveUp', text: i18n.getText('CmdMoveToPrev') },\r\n { id: 'MoveDown', text: i18n.getText('CmdMoveToNext') },\r\n { id: 'MoveBottom', text: i18n.getText('CmdMoveToLast') }\r\n ];\r\n\r\n\r\n private createSortMenu() {\r\n const model = this.getContext().getModel();\r\n if (!model || model.isEmpty()) return null;\r\n\r\n let menuId = this.slot.id\r\n if (menuId) {\r\n menuId += '-SortMenu';\r\n }\r\n\r\n const items = this.sortMenuList.concat(this.moveMenuList);\r\n const menuOptions: any = { \"items\": items, id: menuId, domWriteItemsId: this.options.domWriteItemsId };\r\n\r\n dataUtils.assign(menuOptions, this.options.menuOptions);\r\n\r\n menuOptions.searchBoxAlwaysShown = false;\r\n\r\n this.sortMenu = new PopupMenu(menuOptions);\r\n }\r\n\r\n private createMoveMenu() {\r\n const model = this.getContext().getModel();\r\n if (!model || model.isEmpty()) return null;\r\n\r\n let menuId = this.slot.id\r\n if (menuId) {\r\n menuId += '-MoveMenu';\r\n }\r\n\r\n const items = this.moveMenuList;\r\n const menuOptions:any = { \"items\": items, id: menuId, domWriteItemsId: this.options.domWriteItemsId };\r\n\r\n dataUtils.assign(menuOptions, this.options.menuOptions);\r\n\r\n this.moveMenu = new PopupMenu(menuOptions);\r\n\r\n menuOptions.searchBoxAlwaysShown = false;\r\n }\r\n\r\n public moveColumn(column: QueryColumn, direction: string) {\r\n const query = this.getQuery();\r\n const columns = query.getColumns();\r\n const index = columns.indexOf(column);\r\n\r\n if (index >= 0) {\r\n switch (direction) {\r\n case 'MoveTop':\r\n if (index == 0) {\r\n return;\r\n }\r\n this.moveColumnCore(index, 0); \r\n break;\r\n case 'MoveUp':\r\n if (index == 0) {\r\n return;\r\n }\r\n this.moveColumnCore(index, index-1); \r\n break;\r\n case 'MoveDown':\r\n if (index == columns.length-1) {\r\n return;\r\n }\r\n this.moveColumnCore(index, index+1); \r\n break;\r\n case 'MoveBottom':\r\n if (index == columns.length-1) {\r\n return;\r\n }\r\n this.moveColumnCore(index, columns.length-1); \r\n break;\r\n };\r\n }\r\n }\r\n\r\n private moveColumnCore(index1: number, index2: number) {\r\n const query = this.getQuery();\r\n if (!query) return;\r\n\r\n const rows = this.columnsBlock.querySelectorAll(`[class*=${this.cssPrefix}-row]`);\r\n const colToMove = rows[index1];\r\n \r\n if (index2 <= 0) {\r\n this.columnsBlock.insertBefore(colToMove, this.columnsBlock[0]);\r\n }\r\n else if (index2 < rows.length) {\r\n this.columnsBlock.insertBefore(colToMove, rows[index2]);\r\n }\r\n else {\r\n this.columnsBlock.appendChild(colToMove);\r\n }\r\n\r\n query.moveColumn(index1, index2);\r\n query.fireColumnsChangedEvent(QueryChangeAction.All);\r\n }\r\n\r\n public areCustomExpressionsAllowed(): boolean {\r\n const query = this.getQuery();\r\n return query.isEx() && this.getContext().options.allowCustomExpressions;\r\n }\r\n\r\n}","import { i18n } from '@easydata/core';\r\nimport { \r\n QueryChangeAction, EntityAttr, \r\n SortDirection, QueryColumn\r\n} from '@easyquery/core';\r\n\r\nimport { eqDragManager, DropEffect,\r\n createBrowserEvent, domel } from '@easydata/ui';\r\n\r\nimport { eqCssPrefix } from '../../../utils/utils';\r\nimport { PopupMenu } from '../../../utils/popup_menu';\r\nimport { SortingBar } from '../../sorting_bar';\r\n\r\nimport { browserUtils } from '../../../utils/browser_utils';\r\n\r\nexport class ColumnRendererSB {\r\n protected column: QueryColumn;\r\n protected bar: SortingBar;\r\n protected functionMenu: PopupMenu = null;\r\n\r\n protected element: HTMLDivElement;\r\n\r\n protected isMouseOverBlock = false;\r\n \r\n protected keepShowingButtons = false;\r\n\r\n constructor(bar: SortingBar, column: QueryColumn, slot?: HTMLDivElement) {\r\n this.bar = bar;\r\n this.column = column;\r\n \r\n this.element = slot;\r\n }\r\n\r\n protected get cssPrefix(): string {\r\n return 'eqjs-sb';\r\n }\r\n\r\n public render(): HTMLDivElement {\r\n const builder = domel('div');\r\n builder.data('id', this.column.id);\r\n\r\n if (this.element) {\r\n //to remove all event listeners\r\n this.element.parentNode\r\n .replaceChild(builder.toDOM(), this.element);\r\n }\r\n\r\n this.element = builder.toDOM();\r\n\r\n if (this.bar.options.allowDragDrop) {\r\n eqDragManager.registerDraggableItem({\r\n element: this.element,\r\n scope: \"entityAttrSortSB\",\r\n beforeDragStart: () => this.element.dispatchEvent(createBrowserEvent('mouseleave')),\r\n onDragStart: (ev) => {\r\n this.element.style.display = 'none';\r\n ev.dropEffect = DropEffect.Allow;\r\n }, \r\n onDragEnd: (ev) => {\r\n if (!ev.data.finishedSuccessfully) {\r\n this.element.removeAttribute('style');\r\n }\r\n },\r\n data: { column: this.column }\r\n });\r\n }\r\n\r\n builder\r\n .addClass(this.getClassesToAdd())\r\n .addClass(browserUtils.getMobileCssClass())\r\n\r\n .addChildElement(this.renderCaptionBlock())\r\n\r\n if (this.isEditable()) {\r\n builder\r\n .addChildElement(this.renderSortingButton());\r\n }\r\n\r\n return this.element;\r\n }\r\n\r\n public fireColumnChanged() {\r\n this.column.fireChangedEvent();\r\n }\r\n\r\n public refresh() {\r\n this.render();\r\n }\r\n\r\n protected getAttribute(): EntityAttr {\r\n const model = this.bar.getContext().getModel();\r\n return model.getAttributeById(this.column.expr.value);\r\n }\r\n\r\n protected isEditable(): boolean {\r\n return this.column.enabled && !this.column.isReadOnly();\r\n }\r\n\r\n protected renderCaptionBlock(): HTMLDivElement {\r\n function getArrow(sd: SortDirection) {\r\n switch(sd) {\r\n case SortDirection.Ascending:\r\n return ' ↑';\r\n case SortDirection.Descending:\r\n return ' ↓';\r\n default:\r\n return '';\r\n }\r\n }\r\n\r\n let text = this.column.caption;\r\n if (!this.isEditable()) {\r\n text += getArrow(this.column.sorting);\r\n }\r\n\r\n return domel('div')\r\n .addClass(`${this.cssPrefix}-colelement`, `${this.cssPrefix}-captionelement`)\r\n .addClass(browserUtils.getMobileCssClass())\r\n .addChild('div', b => b\r\n .title(this.column.caption)\r\n .text(text)\r\n )\r\n .toDOM();\r\n }\r\n\r\n protected renderSortingButton(): HTMLDivElement {\r\n const sortButtonCssClass = `${eqCssPrefix}-column-sortbutton`;\r\n let sortButtonDirectionCssClass = sortButtonCssClass;\r\n switch (this.column.sorting) {\r\n case SortDirection.None:\r\n sortButtonDirectionCssClass = `${sortButtonCssClass}-none`;\r\n break;\r\n case SortDirection.Ascending:\r\n sortButtonDirectionCssClass = `${sortButtonCssClass}-asc`;\r\n break;\r\n case SortDirection.Descending:\r\n sortButtonDirectionCssClass = `${sortButtonCssClass}-desc`;\r\n break;\r\n }\r\n\r\n const builder = domel('div')\r\n .addClass(`${this.cssPrefix}-colelement`, `${this.cssPrefix}-sortimage-placeholder`)\r\n .addClass(browserUtils.getMobileCssClass())\r\n .addChild('div', builder => builder\r\n .addClass(`${this.cssPrefix}-img-sorting`, sortButtonDirectionCssClass)\r\n .title(i18n.getText('ButtonSorting'))\r\n )\r\n .on('touchstart click', (ev) => this.buttonSortingClickHandler(ev, builder.toDOM()));\r\n\r\n return builder.toDOM();\r\n }\r\n\r\n public buttonSortingClickHandler(ev: Event, anchor: HTMLDivElement) {\r\n ev.stopPropagation();\r\n\r\n this.keepShowingButtons = true;\r\n const menu = this.bar.sortMenu;\r\n menu.showMenu({\r\n anchor: anchor,\r\n selectedIds: null,\r\n itemSelectedCallback: (data, items) => {\r\n\r\n const strToSortDirection = (str: string) => {\r\n if (str == 'None') {\r\n return SortDirection.None;\r\n }\r\n else if (str == \"Ascending\") {\r\n return SortDirection.Ascending;\r\n }\r\n else if (str == \"Descending\") {\r\n return SortDirection.Descending;\r\n }\r\n };\r\n\r\n if (data.id == 'None' || data.id == \"Ascending\" || data.id == \"Descending\") {\r\n\r\n const query = this.bar.getContext().getQuery();\r\n\r\n if (this.column.isJustSorted() && data.id == 'None') {\r\n query.removeColumn(this.column);\r\n query.fireColumnsChangedEvent(QueryChangeAction.Delete, this.column, true);\r\n }\r\n else {\r\n this.column.sorting = strToSortDirection(data.id);\r\n this.column._sortIndex = query.getColumnSortIndex(this.column);\r\n this.fireColumnChanged();\r\n }\r\n \r\n }\r\n else {\r\n this.bar.moveColumn(this.column, data.id);\r\n }\r\n },\r\n menuClosedCallback: () => { \r\n this.keepShowingButtons = false;\r\n }\r\n });\r\n\r\n return false;\r\n }\r\n\r\n protected getClassesToAdd(): string {\r\n return `${this.cssPrefix}-row ${this.cssPrefix}-row-column-entattr`;\r\n }\r\n\r\n protected getUIS() {\r\n return this.bar\r\n .getContext().getModel()\r\n .checkAttrProperty(this.column.expr.value, \"useInSorting\");\r\n }\r\n}","import { i18n, utils as dataUtils } from '@easydata/core';\r\nimport { \r\n Widget, WidgetGroup, \r\n EqContext, Query, DataModel, QueryChangeAction, \r\n QueryChangeEventData, QueryChangePart, \r\n QueryColumn, SortDirection, ExprTag, EntityAttr \r\n} from '@easyquery/core';\r\n\r\nimport { \r\n eqDragManager, DropEffect, \r\n getElementAbsolutePos, domel\r\n } from '@easydata/ui';\r\n\r\nimport { eqCssPrefix } from '../utils/utils';\r\nimport { browserUtils } from '../utils/browser_utils';\r\nimport { PopupMenuOptions, PopupMenu } from '../utils/popup_menu';\r\n\r\nimport { SortingBarOptions } from './widget_options';\r\nimport { ColumnRendererSB } from './renderers/sortingbar/column_renderer_sb';\r\n\r\nexport class SortingBar extends Widget {\r\n\r\n protected get cssPrefix(): string {\r\n return \"eqjs-sb\";\r\n }\r\n\r\n public options: SortingBarOptions = {\r\n showAddRow: true,\r\n allowDragDrop: true,\r\n menuOptions: {\r\n showSearchBoxAfter: 30,\r\n searchBoxAutoFocus: true,\r\n activateOnMouseOver: true,\r\n adjustHeight: true,\r\n itemRenderedCallback: null\r\n },\r\n };\r\n\r\n private queryEventCallbackId?: string;\r\n\r\n private columnsBlock: HTMLDivElement;\r\n\r\n private addRowButton: HTMLDivElement;\r\n\r\n public sortMenu: PopupMenu;\r\n private entitiesMenu: PopupMenu;\r\n\r\n constructor(slot: HTMLElement) {\r\n super(slot);\r\n\r\n domel(this.slot)\r\n .addClass(`${this.cssPrefix}-panel`)\r\n .addClass(browserUtils.getMobileCssClass());\r\n\r\n this.group = WidgetGroup.Query;\r\n }\r\n\r\n public getWidgetType(): string {\r\n return 'sortingBar';\r\n }\r\n\r\n public init(context: EqContext, options?: SortingBarOptions) {\r\n super.init(context, options);\r\n\r\n this.setOptions(options);\r\n\r\n if (options.attrElementFormat) {\r\n this.context.options.attributeFormat = options.attrElementFormat;\r\n }\r\n\r\n if (options.titleElementFormat) {\r\n this.context.options.columnTitleFormat = options.titleElementFormat;\r\n }\r\n\r\n this.destroyCore();\r\n this.attachQueryObserver();\r\n\r\n eqDragManager.removeDropContainer(this.slot);\r\n if (this.options.allowDragDrop) {\r\n eqDragManager.registerDropContainer({\r\n element: this.slot,\r\n scopes: [\"entityAttrSortSB\"],\r\n onDragEnter: (container, ev) => {\r\n this.showLandingSlot(ev.pageX, ev.pageY);\r\n },\r\n onDragOver: (container, ev) => {\r\n this.showLandingSlot(ev.pageX, ev.pageY);\r\n },\r\n onDragLeave: (container, ev) => {\r\n ev.dropEffect = DropEffect.Forbid;\r\n this.hideLandingSlot();\r\n },\r\n onDrop: (container, ev) => {\r\n if (this.landingIndex >= 0) {\r\n const query = this.getQuery();\r\n query.setColumnSortIndex(ev.data.column, this.landingIndex);\r\n }\r\n else {\r\n ev.item.element.removeAttribute('style');\r\n }\r\n }\r\n });\r\n }\r\n }\r\n\r\n private setOptions(options?: SortingBarOptions) {\r\n dataUtils.assignDeep(this.options, options);\r\n }\r\n\r\n private attachQueryObserver() {\r\n const query = this.getQuery();\r\n\r\n this.queryEventCallbackId = query.addChangedCallback(event => {\r\n //if something has changed, and that change is related to columns\r\n const edata = event.data as QueryChangeEventData;\r\n if (!edata || (edata.part != QueryChangePart.SortingColumns \r\n && edata.part != QueryChangePart.Columns && edata.part != QueryChangePart.All)) {\r\n return;\r\n }\r\n\r\n this.refresh();\r\n });\r\n }\r\n\r\n private detachQueryObserver() {\r\n if (this.queryEventCallbackId) {\r\n const query = this.getQuery();\r\n query.removeChangedCallback(this.queryEventCallbackId);\r\n }\r\n }\r\n\r\n protected getQuery() : Query {\r\n return this.getContext().getQuery();\r\n }\r\n\r\n protected getModel() : DataModel {\r\n return this.getContext().getModel();\r\n }\r\n\r\n protected destroyCore() {\r\n this.detachQueryObserver();\r\n this.clear();\r\n }\r\n\r\n protected refreshCore() {\r\n this.clear();\r\n this.render();\r\n }\r\n\r\n private renderAddRowButton() {\r\n domel(this.addRowButton)\r\n .addClass(`${eqCssPrefix}-addrow`, `${this.cssPrefix}-addrow`, `${eqCssPrefix}-addrow-empty`)\r\n .addClass(browserUtils.getMobileCssClass())\r\n .title(i18n.getText('CmdClickToAddColumn'))\r\n .addChild('a', builder => builder\r\n .attr('href', 'javascript:void(0)')\r\n .on('click', (e) => {\r\n e.preventDefault();\r\n \r\n this.showEntitiesMenu({\r\n anchor: e.target, \r\n selectedIds: null, \r\n itemSelectedCallback: (data, items) => {\r\n const attrid = data.id;\r\n this.addNewColumn(attrid);\r\n return false;\r\n }\r\n });\r\n })\r\n )\r\n\r\n if (browserUtils.isMobileMode()) {\r\n domel(this.columnsBlock)\r\n .addChildElement(this.addRowButton);\r\n }\r\n }\r\n\r\n public showEntitiesMenu(menuOptions) {\r\n this.entitiesMenu.showMenu(menuOptions);\r\n }\r\n\r\n private createEntitiesMenu() {\r\n const model = this.getModel();\r\n if (!model || model.isEmpty()) return null;\r\n\r\n let menuId = this.slot.id;\r\n if (menuId) {\r\n menuId += '-EntitiesMenu';\r\n }\r\n\r\n const entitiesList = model.getEntitiesTree({ addUIC: false, addUIR: false, addUIS: true });\r\n const options: PopupMenuOptions = { items: entitiesList, \r\n adjustHeight: this.options.adjustEntitiesMenuHeight, id: menuId, domWriteItemsId: this.options.domWriteItemsId }\r\n \r\n this.entitiesMenu = new PopupMenu(options);\r\n }\r\n\r\n private sortMenuList = [\r\n { id: 'None', text: i18n.getText('CmdNotSorted') },\r\n { id: 'Ascending', text: i18n.getText('CmdAscending') },\r\n { id: 'Descending', text: i18n.getText('CmdDescending') },\r\n { id: '---', text: '---' },\r\n { id: 'MoveTop', text: i18n.getText('CmdMoveToFirst') },\r\n { id: 'MoveUp', text: i18n.getText('CmdMoveToPrev') },\r\n { id: 'MoveDown', text: i18n.getText('CmdMoveToNext') },\r\n { id: 'MoveBottom', text: i18n.getText('CmdMoveToLast') }\r\n ];\r\n\r\n private createSortMenu() {\r\n const model = this.getModel();\r\n if (!model || model.isEmpty()) return null;\r\n\r\n let menuId = this.slot.id\r\n if (menuId) {\r\n menuId += '-SortMenu';\r\n }\r\n\r\n const items = this.sortMenuList;\r\n const menuOptions: any = { \"items\": items, id: menuId };\r\n\r\n menuOptions.searchBoxAlwaysShown = false;\r\n\r\n this.sortMenu = new PopupMenu(menuOptions);\r\n }\r\n private render() {\r\n this.createEntitiesMenu();\r\n this.createSortMenu();\r\n\r\n this.columnsBlock = \r\n domel('div')\r\n .addClass(`${this.cssPrefix}-columns`)\r\n .addClass(browserUtils.getMobileCssClass())\r\n .toDOM();\r\n\r\n if (this.options.showAddRow) {\r\n this.addRowButton = \r\n domel('div')\r\n .toDOM();\r\n \r\n if (browserUtils.isMobileMode()) {\r\n domel(this.columnsBlock)\r\n .addChildElement(this.addRowButton);\r\n }\r\n else {\r\n domel(this.slot)\r\n .addChildElement(this.addRowButton);\r\n }\r\n\r\n this.renderAddRowButton();\r\n }\r\n\r\n domel(this.slot)\r\n .addChildElement(this.columnsBlock);\r\n\r\n const query = this.getQuery();\r\n const columns = query.getSortedColumns(); // .getColumns().concat(query.getJustSortedColumns());\r\n \r\n columns.forEach((column, index) => {\r\n const slot = this.renderColumn(column);\r\n this.columnsBlock.appendChild(slot);\r\n });\r\n }\r\n\r\n public addNewColumn(attrId: string): QueryColumn {\r\n const model = this.getModel();\r\n const query = this.getQuery();\r\n\r\n const col = query.addColumn({\r\n attributeId: attrId,\r\n justsorted: true,\r\n sorting: SortDirection.Ascending\r\n });\r\n\r\n query.fireChangedEvent({\r\n part: QueryChangePart.SortingColumns,\r\n action: QueryChangeAction.Add,\r\n changee: col,\r\n source: this\r\n });\r\n \r\n return col;\r\n }\r\n\r\n private renderColumn(column: QueryColumn, elem?: HTMLDivElement): HTMLDivElement | null{\r\n const renderer = new ColumnRendererSB(this, column, elem);\r\n if (renderer) {\r\n const columnSlot = renderer.render();\r\n return columnSlot;\r\n }\r\n\r\n return null;\r\n }\r\n\r\n private clear() {\r\n this.slot.innerHTML = '';\r\n }\r\n\r\n public moveColumn(column: QueryColumn, direction: string) {\r\n const query = this.getQuery();\r\n const columns = query.getSortedColumns();\r\n const index = query.getColumnSortIndex(column);\r\n\r\n if (index >= 0) {\r\n switch (direction) {\r\n case 'MoveTop':\r\n query.setColumnSortIndex(column, 0);\r\n break;\r\n case 'MoveUp':\r\n query.setColumnSortIndex(column, index > 0 ? index - 1 : 0);\r\n break;\r\n case 'MoveDown':\r\n query.setColumnSortIndex(column, index < columns.length - 1 ? index + 1 : columns.length - 1);\r\n break;\r\n case 'MoveBottom':\r\n query.setColumnSortIndex(column, columns.length - 1);\r\n break;\r\n };\r\n }\r\n }\r\n\r\n private landingSlot: HTMLDivElement \r\n = domel('div')\r\n .addClass(`${eqCssPrefix}-highlight`)\r\n .toDOM();\r\n\r\n private landingIndex: number = -1;\r\n\r\n public showLandingSlot(pageX: number, pageY: number) {\r\n\r\n const elements = this.columnsBlock.querySelectorAll(`[class*=${this.cssPrefix}-row]`) as NodeListOf<HTMLElement>;\r\n const columnSlots: HTMLElement[] = [];\r\n for(let i = 0; i < elements.length; i++) {\r\n if (elements[i].style.display !== 'none') {\r\n columnSlots.push(elements[i]);\r\n }\r\n }\r\n\r\n if (columnSlots.length === 0) {\r\n this.landingIndex = 0;\r\n return;\r\n }\r\n\r\n const landingPos = getElementAbsolutePos(this.landingSlot);\r\n if (pageX >= landingPos.x && pageX <= landingPos.x + this.landingSlot.offsetWidth\r\n && pageY >= landingPos.y && pageY <= landingPos.y + this.landingSlot.offsetHeight ) {\r\n return;\r\n }\r\n\r\n let newLandingIndex = this.landingIndex;\r\n for(let i = 0; i < columnSlots.length; i++) {\r\n const colSlot = columnSlots[i];\r\n\r\n const absPos = getElementAbsolutePos(colSlot);\r\n const colWidth = colSlot.offsetWidth;\r\n const colHeight = colSlot.offsetHeight;\r\n\r\n const paddingWidth = 0.2 * colWidth;\r\n const paddingHeight = 2;\r\n\r\n if (pageX >= absPos.x + paddingWidth && pageX <= absPos.x + colWidth - paddingWidth\r\n && pageY >= absPos.y + paddingHeight && pageY <= absPos.y + colHeight - paddingHeight) {\r\n\r\n if (pageX > landingPos.x)\r\n newLandingIndex = i + 1;\r\n else \r\n newLandingIndex = i;\r\n \r\n break;\r\n }\r\n }\r\n\r\n if (newLandingIndex != this.landingIndex || this.landingSlot.parentElement) {\r\n this.landingIndex = newLandingIndex;\r\n\r\n if (this.landingIndex <= 0) {\r\n this.columnsBlock.insertBefore(this.landingSlot, columnSlots[0]);\r\n }\r\n if (this.landingIndex < columnSlots.length) {\r\n this.columnsBlock.insertBefore(this.landingSlot, columnSlots[this.landingIndex]);\r\n }\r\n else {\r\n this.columnsBlock.appendChild(this.landingSlot);\r\n }\r\n \r\n }\r\n\r\n }\r\n\r\n public hideLandingSlot() {\r\n this.landingIndex = -1;\r\n if (this.landingSlot.parentElement) {\r\n this.landingSlot.parentElement.removeChild(this.landingSlot);\r\n }\r\n }\r\n\r\n}","import { domel } from '@easydata/ui';\r\n\r\nimport { QueryPanel } from '../../query_panel';\r\nimport { browserUtils } from '../../../utils/browser_utils';\r\n\r\nexport class TextRenderer {\r\n protected panel: QueryPanel;\r\n protected text: string;\r\n protected element: HTMLDivElement;\r\n\r\n protected get cssPrefix(): string {\r\n return 'eqjs-qp';\r\n }\r\n\r\n constructor(panel: QueryPanel, text: string, slot?: HTMLDivElement) {\r\n this.panel = panel;\r\n this.text = text;\r\n this.element = slot || domel('div').toDOM();\r\n }\r\n\r\n public refresh() {\r\n this.render();\r\n }\r\n\r\n public render(): HTMLDivElement {\r\n domel(this.element)\r\n .html('')\r\n .addClass(this.getClassesToAdd())\r\n .addClass(browserUtils.getMobileCssClass())\r\n .addChild('span', builder => builder\r\n .text(this.text)\r\n .title(this.text)\r\n )\r\n .toDOM();\r\n\r\n return this.element;\r\n }\r\n\r\n protected getClassesToAdd(): string {\r\n return `${this.cssPrefix}-condelement`;\r\n }\r\n\r\n}","import { i18n } from '@easydata/core';\r\nimport { utils as dataUtils } from '@easydata/core';\r\n\r\nimport {\r\n Condition,\r\n EntityAttr,\r\n SimpleConditionDescriptor,\r\n equtils,\r\n QueryChangeAction\r\n} from '@easyquery/core';\r\n\r\nimport { createBrowserEvent, domel } from '@easydata/ui';\r\n\r\nimport { QueryPanel } from '../../query_panel';\r\nimport { TextRenderer } from './text_renderer';\r\nimport { PopupMenu } from '../../../utils/popup_menu';\r\nimport { browserUtils } from '../../../utils/browser_utils';\r\nimport { QPEditablePart } from '../../../types/qp_editable_part';\r\n\r\nexport enum ConditionAction {\r\n AddCondition = 0, \r\n AddGroup = 1, \r\n Enable = 2,\r\n Delete = 4, \r\n Menu = 5,\r\n Parameterized = 6,\r\n InJoin = 7\r\n}\r\n\r\nexport abstract class ConditionRenderer {\r\n protected condition: Condition;\r\n protected panel: QueryPanel;\r\n protected element: HTMLDivElement;\r\n\r\n constructor(panel: QueryPanel, condition: Condition, slot?: HTMLDivElement) {\r\n this.panel = panel;\r\n this.condition = condition;\r\n this.element = slot || domel('div').toDOM();\r\n }\r\n\r\n protected get cssPrefix(): string {\r\n return 'eqjs-qp';\r\n }\r\n\r\n public refresh() {\r\n this.render();\r\n }\r\n\r\n protected clear() {\r\n if (this.element) {\r\n this.element.className = '';\r\n this.element.removeAttribute('data-id');\r\n this.element.removeAttribute('style');\r\n domel(this.element)\r\n .html('');\r\n }\r\n }\r\n\r\n public render(autoAppear?: boolean): HTMLDivElement {\r\n this.clear();\r\n\r\n //this.preRender();\r\n this.coreRender(autoAppear);\r\n\r\n if (this.panel.options.onConditionRendered) {\r\n this.panel.options.onConditionRendered(this.condition, this.element);\r\n }\r\n\r\n return this.element;\r\n }\r\n\r\n protected abstract coreRender(autoAppear?: boolean): void;\r\n\r\n protected abstract getClassesToAdd(): string;\r\n\r\n protected isEditable(): boolean {\r\n return this.condition.enabled && !this.condition.isReadOnly();\r\n }\r\n}\r\n\r\nexport class SimpleConditionRenderer extends ConditionRenderer {\r\n protected buttonsBlock: HTMLDivElement;\r\n protected isMouseOverBlock: boolean;\r\n protected keepShowingButtons: boolean;\r\n protected baseAttr: EntityAttr;\r\n\r\n protected getClassesToAdd(): string {\r\n let result = `${this.cssPrefix}-row ${this.cssPrefix}-row-condition`;\r\n result += this.condition.isInJoin() ? ` ${this.cssPrefix}-condition-injoin` : '';\r\n result += this.condition.isParameterized() ? ` ${this.cssPrefix}-condition-parameterized` : '';\r\n\r\n if (!browserUtils.isMobileMode()) {\r\n const level = this.condition.getLevel();\r\n\r\n if (level > 0)\r\n result += ` ${this.cssPrefix}-level-${level}`;\r\n }\r\n\r\n\r\n result += this.condition.enabled ? '' : ` ${this.cssPrefix}-disabled`;\r\n if (this.condition.enabled) {\r\n result += this.condition.isReadOnly() ? ` ${this.cssPrefix}-readonly` : '';\r\n }\r\n \r\n return result;\r\n }\r\n\r\n protected coreRender(autoAppear?: boolean): void {\r\n const model = this.panel.getContext().getModel();\r\n const operator = model.getOperatorById(this.condition.getOperatorId());\r\n\r\n const arrFormat = equtils.parseOperatorFormat(operator);\r\n\r\n let item = null;\r\n const arrLength = arrFormat.length;\r\n\r\n const builder = domel('div');\r\n if (this.element && this.element.parentNode) {\r\n this.element.parentNode\r\n .replaceChild(builder.toDOM(), this.element);\r\n }\r\n this.element = builder.toDOM();\r\n builder\r\n .addClass(this.getClassesToAdd())\r\n .addClass(browserUtils.getMobileCssClass())\r\n .data('id', this.condition.id)\r\n .data('condrow', '')\r\n .addChildElement(this.renderCheckbox())\r\n .addChildElement(this.renderConjunction());\r\n \r\n let mayAppear = autoAppear;\r\n\r\n const minLength = operator == model.nullOperator \r\n ? Math.min(arrLength, this.condition.expressions.length + 1)\r\n : arrLength;\r\n for (let idx = 0; idx < minLength; idx++) {\r\n item = arrFormat[idx];\r\n\r\n if (item.type === 'operator') {\r\n const renderer = this.panel.getOperatorRenderer(this.condition, item.text);\r\n if (renderer) {\r\n builder.addChildElement(renderer.render());\r\n }\r\n }\r\n else if (item.type === 'expression') {\r\n const toAppear = mayAppear && (item.index > 0);\r\n const exprRenderer = this.panel.getExpressionRenderer(this.condition.expressions[item.index]);\r\n if (exprRenderer) {\r\n const el = exprRenderer.render(toAppear);\r\n builder.addChildElement(el);\r\n setTimeout(() => {\r\n exprRenderer.adjustWidth();\r\n }, 100);\r\n }\r\n mayAppear = mayAppear && !toAppear;\r\n }\r\n else if (item.type === 'text') {\r\n builder.addChildElement(new TextRenderer(this.panel, item.text).render());\r\n }\r\n }\r\n\r\n if (this.panel.options.accentActiveCondition || browserUtils.isMobileMode()) {\r\n builder.on('click', ev => {\r\n ev.stopPropagation();\r\n this.panel.toggleConditionPicked(this.condition);\r\n this.adjustButtonsVisibility();\r\n if (!browserUtils.isMobileMode()) {\r\n this.element.dispatchEvent(createBrowserEvent(\"mouseenter\"));\r\n }\r\n\r\n return false;\r\n })\r\n }\r\n\r\n builder\r\n .addChildElement(this.renderButtonsBlock());\r\n\r\n if (!browserUtils.isMobileMode()) {\r\n builder\r\n .on('mouseenter', event => {\r\n this.isMouseOverBlock = true;\r\n this.enterButtonBlock();\r\n event.stopPropagation();\r\n return false;\r\n })\r\n .on('mouseleave', event => {\r\n this.isMouseOverBlock = false;\r\n if (!this.keepShowingButtons && domel(this.buttonsBlock).isVisible()) {\r\n this.leaveButtonBlock();\r\n }\r\n\r\n event.stopPropagation();\r\n return false;\r\n })\r\n }\r\n }\r\n\r\n protected setConditionParameterized(value: boolean) {\r\n this.condition.setParameterized(value);\r\n this.condition.fireChangedEvent();\r\n }\r\n\r\n protected setConditionInJoin(value: boolean) {\r\n this.condition.setInJoin(value);\r\n this.condition.fireChangedEvent();\r\n }\r\n\r\n protected getConditionMenu(): PopupMenu {\r\n return this.panel.getConditionMenu();\r\n }\r\n\r\n protected renderConjunction(): HTMLElement {\r\n const parent = this.condition.getParent();\r\n if (!parent) return null;\r\n\r\n const isFirstConditionInGroup = dataUtils.findItemIndexById(parent.getConditions(), this.condition.id) == 0;\r\n \r\n if (this.panel.options.showConjunctions && !isFirstConditionInGroup) {\r\n const linkTypeStr = equtils.linkTypeToStr(this.condition.getParent().linkType);\r\n const conjuctionText = i18n.getText(\"Conj\" + linkTypeStr);\r\n return domel(\"span\")\r\n .text(conjuctionText)\r\n .title(conjuctionText)\r\n .addClass(`${this.cssPrefix}-condelement ${this.cssPrefix}-condition-conjuction`)\r\n .toDOM();\r\n }\r\n\r\n return null;\r\n }\r\n\r\n protected renderCheckbox(): HTMLElement {\r\n if (this.panel.options.showCheckboxes && !this.condition.isReadOnly()) {\r\n return domel(\"div\")\r\n .title(i18n.getText('CmdToggleEnable'))\r\n .attr('tabIndex', '0')\r\n .addClass(`${this.cssPrefix}-condelement ${this.cssPrefix}-condition-checkbox`)\r\n .addClass(`${ this.condition.enabled ? 'enabled' : '' }`)\r\n .on('click', () => {\r\n this.condition.enabled = !this.condition.enabled;\r\n this.condition.fireChangedEvent();\r\n return false;\r\n })\r\n .on('keypress', evt => { if ([13, 32].includes((evt as KeyboardEvent).keyCode) ) { (evt.target as HTMLElement).click()}})\r\n .toDOM();\r\n }\r\n else {\r\n return null;\r\n }\r\n }\r\n\r\n protected isConditionActive(): boolean {\r\n return this.element.classList.contains(\"active\");\r\n }\r\n\r\n protected hideButtons() {\r\n domel(this.element).data(\"show-buttons\", null);\r\n }\r\n\r\n protected showButtons() {\r\n domel(this.element).data(\"show-buttons\", \"\");\r\n }\r\n\r\n protected adjustButtonsVisibility() {\r\n if (this.panel.options.alwaysShowButtonsInConditions \r\n || (this.panel.options.accentActiveCondition && this.isConditionActive())) {\r\n this.showButtons();\r\n }\r\n }\r\n\r\n protected enterButtonBlock() {\r\n this.showButtons();\r\n }\r\n\r\n protected leaveButtonBlock() {\r\n if (!this.panel.options.alwaysShowButtonsInConditions \r\n && (!this.isConditionActive() || !this.panel.options.accentActiveCondition)) {\r\n this.hideButtons();\r\n }\r\n }\r\n\r\n\r\n private conditionMenuHandler(action: ConditionAction, evt: Event) {\r\n switch (action) {\r\n case ConditionAction.AddCondition:\r\n if (!this.condition.isGroup()) return;\r\n\r\n const entMenu = this.panel.getEntitiesMenu();\r\n if (entMenu) {\r\n entMenu.showMenu({\r\n anchor: evt.target as HTMLElement, \r\n itemSelectedCallback: item => { \r\n const query = this.panel.getQuery();\r\n \r\n const descr: SimpleConditionDescriptor = {\r\n parent: this.condition,\r\n attributeId: item.id\r\n }\r\n \r\n const cond = query.addSimpleCondition(descr);\r\n \r\n if (cond) {\r\n query.fireConditionsChangedEvent(QueryChangeAction.Add, cond);\r\n }\r\n \r\n return false;\r\n }\r\n });\r\n }\r\n break;\r\n case ConditionAction.AddGroup:\r\n if (!this.condition.isGroup()) return;\r\n\r\n const query = this.panel.getQuery();\r\n const descr: SimpleConditionDescriptor = {\r\n parent: this.condition\r\n }\r\n \r\n const group = this.panel.getQuery().addConditionGroup(descr);\r\n \r\n if (group) {\r\n query.fireConditionsChangedEvent(QueryChangeAction.Add, group);\r\n }\r\n break;\r\n case ConditionAction.Enable:\r\n this.condition.enabled = !this.condition.enabled;\r\n this.condition.fireChangedEvent();\r\n break;\r\n case ConditionAction.Delete:\r\n const parent = this.condition.getParent();\r\n if (!parent) return;\r\n \r\n const conditions = parent.getConditions();\r\n const idx = conditions.indexOf(this.condition);\r\n if (idx >= 0) {\r\n conditions.splice(idx, 1);\r\n this.condition.getQuery().fireConditionsChangedEvent(QueryChangeAction.Delete, this.condition);\r\n }\r\n break;\r\n case ConditionAction.Menu:\r\n const condMenu = this.getConditionMenu();\r\n this.keepShowingButtons = true;\r\n condMenu.showMenu({\r\n anchor: evt.target as HTMLElement,\r\n selectedIds: this.getConditionMenuSelectedItems(),\r\n itemSelectedCallback: (item) => {\r\n let action: ConditionAction;\r\n switch(item.id) {\r\n case \"enable\":\r\n action = ConditionAction.Enable;\r\n break;\r\n case \"delete\":\r\n action = ConditionAction.Delete;\r\n break;\r\n case \"param\":\r\n action = ConditionAction.Parameterized;\r\n break;\r\n case \"inJoin\":\r\n action = ConditionAction.InJoin;\r\n break;\r\n case \"addCondition\":\r\n action = ConditionAction.AddCondition;\r\n break;\r\n case \"addGroup\":\r\n action = ConditionAction.AddGroup;\r\n break;\r\n }\r\n this.conditionMenuHandler(action, evt);\r\n },\r\n itemFilterCallback: (item) => {\r\n let result = this.condition.enabled || item.id === \"enable\" || item.id === \"delete\";\r\n if (item.id === \"enable\") {\r\n const parent = this.condition.getParent();\r\n result = result && parent && parent.enabled;\r\n }\r\n else if (item.id === \"delete\") {\r\n result = result && ((this.panel.options.editableParts & QPEditablePart.Removal) === QPEditablePart.Removal)\r\n }\r\n else if (item.id === \"addGroup\" || item.id === \"addCondition\") {\r\n result = result && ((this.panel.options.editableParts & QPEditablePart.Addition) === QPEditablePart.Addition)\r\n }\r\n \r\n return result;\r\n },\r\n menuClosedCallback: () => { //called when menu is closed\r\n this.keepShowingButtons = false;\r\n if (!this.isMouseOverBlock)\r\n this.leaveButtonBlock();\r\n }\r\n });\r\n\r\n break;\r\n case ConditionAction.Parameterized:\r\n this.condition.setParameterized(!this.condition.isParameterized());\r\n this.condition.fireChangedEvent();\r\n break;\r\n case ConditionAction.InJoin:\r\n this.condition.setInJoin(!this.condition.isInJoin());\r\n this.condition.fireChangedEvent();\r\n break;\r\n }\r\n\r\n evt.stopPropagation();\r\n return false;\r\n } \r\n\r\n protected getConditionMenuSelectedItems(): Array<string> {\r\n let arrSelected = [];\r\n if (this.condition.enabled) {\r\n arrSelected.push(\"enable\");\r\n };\r\n\r\n if (this.condition.isParameterized()) {\r\n arrSelected.push(\"param\");\r\n };\r\n\r\n if (this.condition.isInJoin()) {\r\n arrSelected.push(\"inJoin\");\r\n };\r\n\r\n return arrSelected;\r\n }\r\n\r\n protected renderButtonsBlock(): HTMLElement {\r\n const onButtonMouseEnter = (evt: Event) => {\r\n domel(evt.target as HTMLElement)\r\n .addClass(`${this.cssPrefix}-condition-button-active`)\r\n }\r\n\r\n const onButtonMouseLeave = (evt: Event) => {\r\n domel(evt.target as HTMLElement)\r\n .removeClass(`${this.cssPrefix}-condition-button-active`)\r\n }\r\n\r\n const builder = domel(\"div\")\r\n .addClass(`${this.cssPrefix}-condition-buttonsBlock`)\r\n .addClass(browserUtils.getMobileCssClass());\r\n\r\n this.buttonsBlock = builder.toDOM();\r\n\r\n if (this.condition.isReadOnly()) {\r\n return this.buttonsBlock;\r\n }\r\n\r\n const buttonsToShow = this.getButtonsToShow();\r\n\r\n if (buttonsToShow.indexOf(\"addCondition\") >= 0 && this.condition.enabled \r\n && ((this.panel.options.editableParts & QPEditablePart.Addition) == QPEditablePart.Addition)) {\r\n builder.addChild(\"div\", b => {\r\n b.addClass(`${this.cssPrefix}-button-placeholder`)\r\n .data(\"btnplaceholder\", \"\")\r\n .addChild(\"div\", b => {\r\n b.addClass(`${this.cssPrefix}-condition-button ${this.cssPrefix}-condition-button-addCondition`)\r\n .attr('tabIndex', '0')\r\n .data(\"button\", \"\")\r\n .title(i18n.getText('CmdAddCondition'))\r\n .on('click', evt => this.conditionMenuHandler(ConditionAction.AddCondition, evt))\r\n .on('keypress', evt => { if ((evt as KeyboardEvent).keyCode == 13) { (evt.target as HTMLElement).click()}})\r\n .on('mouseenter', onButtonMouseEnter)\r\n .on('mouseleave', onButtonMouseLeave)\r\n })\r\n })\r\n };\r\n\r\n const showAddGroupBtn = buttonsToShow.indexOf(\"addGroup\") >= 0 || buttonsToShow.indexOf(\"addPredicate\") >= 0;\r\n if (showAddGroupBtn && this.condition.enabled\r\n && ((this.panel.options.editableParts & QPEditablePart.Addition) == QPEditablePart.Addition)) {\r\n builder.addChild(\"div\", b => {\r\n b.addClass(`${this.cssPrefix}-button-placeholder`)\r\n .data(\"btnplaceholder\", \"\")\r\n .addChild(\"div\", b => {\r\n b.addClass(`${this.cssPrefix}-condition-button ${this.cssPrefix}-condition-button-addPredicate`)\r\n .attr('tabIndex', '0')\r\n .data(\"button\", \"\")\r\n .title(i18n.getText('CmdAddCondGroup'))\r\n .on('click', evt => this.conditionMenuHandler(ConditionAction.AddGroup, evt))\r\n .on('keypress', evt => { if ((evt as KeyboardEvent).keyCode == 13) { (evt.target as HTMLElement).click()}})\r\n .on('mouseenter', onButtonMouseEnter)\r\n .on('mouseleave', onButtonMouseLeave)\r\n })\r\n })\r\n };\r\n\r\n if (this.getButtonsToShow().indexOf(\"enable\") >= 0 && this.condition.getParent() && this.condition.getParent().enabled) {\r\n builder.addChild(\"div\", b => {\r\n b.addClass(`${this.cssPrefix}-button-placeholder`)\r\n .data(\"btnplaceholder\", \"\")\r\n .addChild(\"div\", b => {\r\n b.addClass(`${this.cssPrefix}-condition-button ${this.cssPrefix}-condition-button-enable`)\r\n .attr('tabIndex', '0')\r\n .data(\"button\", \"\")\r\n .title(i18n.getText('CmdToggleEnable'))\r\n .addClass(this.condition.enabled ? 'enabled' : '')\r\n .on('click', evt => this.conditionMenuHandler(ConditionAction.Enable, evt))\r\n .on('keypress', evt => { if ((evt as KeyboardEvent).keyCode == 13) { (evt.target as HTMLElement).click()}})\r\n .on('mouseenter', onButtonMouseEnter)\r\n .on('mouseleave', onButtonMouseLeave)\r\n })\r\n })\r\n };\r\n\r\n if (this.getButtonsToShow().indexOf(\"delete\") >= 0 && this.condition.getParent()\r\n && ((this.panel.options.editableParts & QPEditablePart.Removal) == QPEditablePart.Removal)) {\r\n builder.addChild(\"div\", b => {\r\n b.addClass(`${this.cssPrefix}-button-placeholder`)\r\n .data(\"btnplaceholder\", \"\")\r\n .addChild(\"div\", b => {\r\n b.addClass(`${this.cssPrefix}-condition-button ${this.cssPrefix}-condition-button-delete`)\r\n .attr('tabIndex', '0')\r\n .data(\"button\", \"\")\r\n .title(i18n.getText('CmdDelete'))\r\n .on('click', evt => this.conditionMenuHandler(ConditionAction.Delete, evt))\r\n .on('keypress', evt => { if ((evt as KeyboardEvent).keyCode == 13) { (evt.target as HTMLElement).click()}})\r\n .on('mouseenter', onButtonMouseEnter)\r\n .on('mouseleave', onButtonMouseLeave)\r\n })\r\n })\r\n };\r\n\r\n if (this.getButtonsToShow().indexOf(\"menu\") >= 0) {\r\n builder.addChild(\"div\", b => {\r\n b.addClass(`${this.cssPrefix}-button-placeholder`)\r\n .data(\"btnplaceholder\", \"\")\r\n .addChild(\"div\", b => {\r\n b.addClass(`${this.cssPrefix}-condition-button ${this.cssPrefix}-condition-button-menu`)\r\n .attr('tabIndex', '0')\r\n .data(\"button\", \"\")\r\n .title(i18n.getText('ButtonMenu'))\r\n .on('click', evt => this.conditionMenuHandler(ConditionAction.Menu, evt))\r\n\r\n if (!browserUtils.isMobileMode()) {\r\n b\r\n .on('keypress', evt => { if ((evt as KeyboardEvent).keyCode == 13) { (evt.target as HTMLElement).click()}})\r\n .on('mouseenter', onButtonMouseEnter)\r\n .on('mouseleave', onButtonMouseLeave)\r\n }\r\n })\r\n })\r\n };\r\n\r\n this.adjustButtonsVisibility();\r\n\r\n return this.buttonsBlock;\r\n }\r\n\r\n protected getButtonsToShow(): Array<string> {\r\n return this.panel.options.buttons && this.panel.options.buttons.condition && Array.isArray(this.panel.options.buttons.condition) ? this.panel.options.buttons.condition : [\"enable\", \"delete\"];\r\n }\r\n\r\n}\r\n","import { PopupMenu } from './popup_menu';\r\n\r\nimport { \r\n DomElementBuilder\r\n} from '@easydata/ui';\r\n\r\n\r\nexport class DomDropDownElementBuilder extends DomElementBuilder<HTMLAnchorElement> {\r\n protected _onGetMenu: () => PopupMenu;\r\n protected _onItemSelected: (id: string) => void;\r\n\r\n constructor(parent?: HTMLElement) {\r\n super('a', parent);\r\n\r\n this.attr('href', 'javascript:void(0)');\r\n this.on('click', ev => {\r\n ev.preventDefault();\r\n this.appear();\r\n return false;\r\n })\r\n }\r\n\r\n public onGetMenu(onGetMenu: () => PopupMenu){\r\n this._onGetMenu = onGetMenu;\r\n return this;\r\n }\r\n\r\n public onItemSelected(onItemSelected: (id: string) => void) {\r\n this._onItemSelected = onItemSelected;\r\n return this;\r\n }\r\n\r\n private appear(): void {\r\n const menu = this._onGetMenu ? this._onGetMenu() : null;\r\n if (menu) {\r\n menu.showMenu({\r\n anchor: this.element, \r\n itemSelectedCallback: item => { \r\n if (this._onItemSelected) {\r\n this._onItemSelected(item.id);\r\n }\r\n return false;\r\n }\r\n })\r\n }\r\n }\r\n}\r\n\r\n\r\nexport function dropdown(parent?: HTMLElement) {\r\n return new DomDropDownElementBuilder(parent);\r\n}\r\n","export enum FacetType {\r\n DataGrid = \"DATA_GRID\",\r\n Chart = \"CHART\",\r\n PivotTable = \"PIVOT_TABLE\"\r\n}","import { i18n } from '@easydata/core';\r\nimport { utils as dataUtils } from '@easydata/core';\r\n\r\nimport { Condition, eqconsts, equtils } from '@easyquery/core';\r\n\r\nimport { createBrowserEvent, DomElementBuilder, domel } from '@easydata/ui';\r\n\r\nimport { QueryPanel } from '../../query_panel';\r\nimport { ConditionRenderer, SimpleConditionRenderer } from './condition_renderer';\r\n\r\nimport { PopupMenu } from '../../../utils/popup_menu';\r\nimport { browserUtils } from '../../../utils/browser_utils';\r\nimport { dropdown } from '../../../utils/dropdown';\r\n\r\nexport class ConditionGroupRenderer extends ConditionRenderer {\r\n private isRoot: boolean;\r\n\r\n constructor(panel: QueryPanel, condition: Condition, slot?: HTMLDivElement) {\r\n super(panel, condition, slot);\r\n this.isRoot = !condition.getParent();\r\n }\r\n\r\n protected getClassesToAdd(): string {\r\n let result = `${this.cssPrefix}-group`;\r\n if (this.isRoot) {\r\n result += ` ${this.cssPrefix}-group-root`;\r\n }\r\n\r\n return result;\r\n }\r\n\r\n protected coreRender(autoAppear?: boolean): void {\r\n domel(this.element)\r\n .addClass(this.getClassesToAdd())\r\n .addClass(browserUtils.getMobileCssClass())\r\n .addChildElement(this.renderGroupRow())\r\n .addChildElement(this.renderConditions(autoAppear))\r\n .data('id', this.condition.id)\r\n .data('group', '');\r\n }\r\n\r\n protected renderGroupRow(): HTMLDivElement {\r\n if (this.isRoot && !this.panel.options.showRootRow) {\r\n return null;\r\n }\r\n else {\r\n return new ConditionGroupRowRenderer(this.panel, this.condition).render()\r\n }\r\n }\r\n\r\n protected renderConditions(autoAppear?: boolean): HTMLDivElement {\r\n const builder = domel('div');\r\n\r\n builder\r\n .addClass(`${this.cssPrefix}-conditions`)\r\n .addClass(`${browserUtils.getMobileCssClass()}`)\r\n .data('conditions', '')\r\n\r\n if (this.isRoot) {\r\n builder.addClass(`${this.cssPrefix}-conditions-root`);\r\n }\r\n\r\n this.condition.getConditions().forEach((condition, index, array) => {\r\n const renderer = this.panel.getConditionRenderer(condition);\r\n if (renderer) {\r\n builder.addChildElement(renderer.render(autoAppear && index == array.length - 1));\r\n }\r\n })\r\n\r\n return builder.toDOM();\r\n }\r\n}\r\n\r\nexport class ConditionGroupRowRenderer extends SimpleConditionRenderer {\r\n private isRoot: boolean;\r\n\r\n constructor(panel: QueryPanel, condition: Condition, slot?: HTMLDivElement) {\r\n super(panel, condition, slot);\r\n this.isRoot = !this.condition.getParent();\r\n }\r\n\r\n protected getButtonsToShow(): Array<string> {\r\n return this.panel.options.buttons && this.panel.options.buttons.group && Array.isArray(this.panel.options.buttons.group) ? this.panel.options.buttons.group : [\"addCondition\", \"addGroup\", \"enable\", \"delete\"];\r\n }\r\n\r\n protected getClassesToAdd(): string {\r\n let result: string;\r\n if (this.isRoot) {\r\n result = `${this.cssPrefix}-row ${this.cssPrefix}-row-group ${this.cssPrefix}-row-group-root`;\r\n } \r\n else {\r\n result = `${this.cssPrefix}-row ${this.cssPrefix}-row-group`;\r\n\r\n const level = this.condition.getLevel();\r\n if (level > 0)\r\n result += ` ${this.cssPrefix}-level-${level}`;\r\n\r\n result += this.condition.enabled ? '' : ` ${this.cssPrefix}-disabled`;\r\n if (this.condition.enabled) {\r\n result += this.condition.isReadOnly() ? ` ${this.cssPrefix}-readonly` : '';\r\n }\r\n }\r\n\r\n return result;\r\n }\r\n\r\n protected coreRender(autoAppear?: boolean): void {\r\n const builder = domel(this.element)\r\n .addClass(this.getClassesToAdd())\r\n .addClass(browserUtils.getMobileCssClass())\r\n .data('group-row', '')\r\n .addChildElement(this.renderCheckbox())\r\n .addChildElement(this.renderConjunction());\r\n\r\n const level = this.condition.getLevel();\r\n\r\n if (level > 0)\r\n builder.addClass(`${this.cssPrefix}-level-${level}`);\r\n \r\n this.buildGroupElements(builder, this.getGroupTitle());\r\n\r\n if (this.panel.options.accentActiveCondition) {\r\n builder.on('click', ev => {\r\n this.panel.toggleConditionPicked(this.condition);\r\n this.adjustButtonsVisibility();\r\n if (!browserUtils.isMobileMode()) {\r\n builder.toDOM().dispatchEvent(createBrowserEvent(\"mouseenter\"));\r\n }\r\n })\r\n }\r\n\r\n builder\r\n .addChildElement(this.renderButtonsBlock());\r\n \r\n if (!browserUtils.isMobileMode()) {\r\n builder\r\n .on('mouseenter', event => {\r\n this.isMouseOverBlock = true;\r\n this.enterButtonBlock();\r\n event.stopPropagation();\r\n return false;\r\n })\r\n .on('mouseleave', event => {\r\n this.isMouseOverBlock = false;\r\n if (!this.keepShowingButtons && domel(this.buttonsBlock).isVisible()) {\r\n this.leaveButtonBlock();\r\n }\r\n\r\n event.stopPropagation();\r\n return false;\r\n })\r\n }\r\n }\r\n\r\n\r\n protected getGroupTitle() : string {\r\n let result: string;\r\n if (this.isRoot && !browserUtils.isMobileMode()) {\r\n result = i18n.getText('RootConditionGroupTitle');\r\n if (!result) {\r\n //to support old text key\r\n result = i18n.getText('RootPredicateTitle');\r\n }\r\n }\r\n else {\r\n result = i18n.getText('ConditionGroupTitle');\r\n if (!result) {\r\n //to support old text key\r\n result = i18n.getText('PredicateTitle');\r\n }\r\n }\r\n return result;\r\n }\r\n\r\n private buildGroupElements(builder: DomElementBuilder<HTMLDivElement>, groupTitle : string) : void {\r\n const pos = groupTitle.indexOf('{lt}');\r\n \r\n if (pos < 0) { \r\n //invalid format\r\n builder.addText(i18n.getText('ErrIncorrectGroupTitleFormat'));\r\n builder.addClass(`${this.cssPrefix}-error`);\r\n }\r\n else {\r\n if (pos > 0) {\r\n builder.addChild('span', b => {\r\n b.addClass(`${this.cssPrefix}-grelement`)\r\n .addText(groupTitle.substring(0, pos));\r\n });\r\n }\r\n\r\n const linkTypeStr = equtils.linkTypeToStr(this.condition.linkType);\r\n let curType: eqconsts.ConstValue | null \r\n = dataUtils.findItemById(eqconsts.predicateLinkTypeList, linkTypeStr);\r\n if (!curType) {\r\n curType = eqconsts.predicateLinkTypeList[0];\r\n }\r\n\r\n if (this.isEditable()) {\r\n dropdown(builder.toDOM())\r\n .onGetMenu(() => this.getLinkTypeMenu())\r\n .onItemSelected(id => {\r\n this.condition.linkType = equtils.strToLinkType(id);\r\n this.condition.fireChangedEvent();\r\n })\r\n .addText(i18n.getText(curType.key))\r\n .title(i18n.getText(curType.key))\r\n .addClass(`${this.cssPrefix}-grelement`);\r\n }\r\n else {\r\n builder.addChild('span', b => {\r\n b.text(i18n.getText(curType.key))\r\n .title(i18n.getText(curType.key))\r\n .addClass(`${this.cssPrefix}-grelement`);\r\n })\r\n }\r\n\r\n builder.addChild('span', b => {\r\n b.addClass(`${this.cssPrefix}-grelement`)\r\n .addText(groupTitle.substring(pos + 4));\r\n });\r\n }\r\n }\r\n\r\n\r\n protected getConditionMenu(): PopupMenu {\r\n return this.panel.getConditionGroupMenu(this.condition.getParent() == null);\r\n }\r\n\r\n protected getLinkTypeMenu(): PopupMenu {\r\n return this.panel.getLinkTypeMenu();\r\n }\r\n\r\n protected renderConjunction(): HTMLElement {\r\n return this.isRoot? null : super.renderConjunction();\r\n }\r\n\r\n protected renderCheckbox(): HTMLElement {\r\n return this.isRoot? null : super.renderCheckbox();\r\n }\r\n\r\n protected leaveButtonBlock() {\r\n if (!this.panel.options.alwaysShowButtonsInGroups \r\n && (!this.isConditionActive() || !this.panel.options.accentActiveCondition)) \r\n {\r\n this.hideButtons();\r\n }\r\n }\r\n\r\n protected adjustButtonsVisibility() {\r\n if (this.panel.options.alwaysShowButtonsInGroups \r\n || (this.panel.options.accentActiveCondition && this.isConditionActive()))\r\n {\r\n this.showButtons();\r\n }\r\n }\r\n}\r\n","import { domel } from '@easydata/ui';\r\n\r\nimport { browserUtils } from '../../utils/browser_utils';\r\n\r\nexport abstract class BaseElementRenderer {\r\n protected element: HTMLDivElement;\r\n\r\n protected labelElement: HTMLElement;\r\n\r\n constructor(slot?: HTMLDivElement) {\r\n this.element = slot || domel('div').toDOM();\r\n }\r\n\r\n public refresh() {\r\n this.render();\r\n }\r\n\r\n public render(isEditMode: boolean = false): HTMLDivElement {\r\n this.labelElement = this.renderLabelElement();\r\n domel(this.element)\r\n .html('')\r\n .addClass(this.getClassesToAdd())\r\n .addClass(browserUtils.getMobileCssClass())\r\n .addChildElement(this.labelElement);\r\n\r\n if (this.isEditable()) {\r\n this.renderEditor();\r\n if (isEditMode) {\r\n setTimeout(() => this.showEditor(), 50);\r\n }\r\n }\r\n\r\n return this.element;\r\n }\r\n\r\n protected isEditable(): boolean {\r\n return true;\r\n }\r\n\r\n protected renderLabelElement(): HTMLElement {\r\n const displayedText = this.getLabelText();\r\n\r\n if (this.isEditable()) {\r\n return domel('a')\r\n .attr('href', 'javascript:void(0)')\r\n .title(displayedText)\r\n .text(displayedText)\r\n .on('click', (ev) => { //touchstart \r\n ev.preventDefault();\r\n this.showEditor();\r\n return false;\r\n })\r\n .toDOM();\r\n }\r\n else {\r\n return domel('span')\r\n .title(displayedText)\r\n .text(displayedText)\r\n .toDOM();\r\n }\r\n }\r\n\r\n protected abstract renderEditor(): void;\r\n\r\n protected getClassesToAdd(): string {\r\n return '';\r\n }\r\n\r\n protected getLabelText(): string {\r\n return this.getEmptyText();\r\n }\r\n\r\n protected getEmptyText(): string {\r\n return '<empty>';\r\n }\r\n\r\n protected abstract showEditor(): void;\r\n\r\n protected abstract closeEditor(): void;\r\n}\r\n\r\n","import { i18n } from '@easydata/core';\r\n\r\nimport {\r\n Expression,\r\n EqValueEditor,\r\n EqContext,\r\n ConditionPart\r\n} from '@easyquery/core'\r\n\r\nimport { QueryPanel } from '../../query_panel';\r\nimport { BaseElementRenderer } from '../base_element_renderer';\r\n\r\nexport abstract class ExpressionRenderer extends BaseElementRenderer {\r\n protected panel: QueryPanel;\r\n protected expression: Expression;\r\n protected valueEditor: EqValueEditor;\r\n\r\n protected get cssPrefix(): string {\r\n return 'eqjs-qp';\r\n }\r\n\r\n constructor(panel: QueryPanel, expression: Expression, valueEditor: EqValueEditor, slot?: HTMLDivElement) {\r\n super(slot);\r\n\r\n this.panel = panel;\r\n this.expression = expression;\r\n this.valueEditor = valueEditor;\r\n }\r\n\r\n public render(isEditMode: boolean = false): HTMLDivElement {\r\n super.render(isEditMode);\r\n\r\n if (this.panel.options.onExpressionRendered) {\r\n this.panel.options.onExpressionRendered(this.expression, this.element);\r\n }\r\n\r\n return this.element;\r\n }\r\n\r\n protected getContext() : EqContext {\r\n return this.panel.getContext();\r\n }\r\n\r\n protected isReadOnly() : boolean {\r\n const parent = this.expression.getParent();\r\n return !parent.enabled || parent.isReadOnly();\r\n }\r\n\r\n protected isEditable(): boolean {\r\n return !this.isReadOnly();\r\n }\r\n\r\n protected getClassesToAdd(): string {\r\n return `${this.cssPrefix}-condelement ${this.cssPrefix}-valueelement`;\r\n }\r\n\r\n protected getLabelText(): string {\r\n let result = !this.expression.isEmpty()\r\n ? this.expression.value\r\n : this.getEmptyText();\r\n return result;\r\n }\r\n\r\n protected getEmptyText(): string {\r\n return this.panel.options.emptyTextValue || i18n.getText('MsgEmptyScalarValue'); //'[enter value]';\r\n }\r\n\r\n protected setValue(value: string, silent?: boolean): void {\r\n this.expression.setValue(value);\r\n\r\n if (!silent) {\r\n this.expression.getParent().fireChangedEvent(ConditionPart.Value);\r\n }\r\n }\r\n\r\n protected getValue(): string {\r\n return this.expression.value;\r\n }\r\n\r\n protected validateInput(value: string): ValidationResult {\r\n return { success : true, value: value };\r\n }\r\n\r\n protected showValidationError(message: string, target?: EventTarget) : void {\r\n this.getContext().throwError({\r\n action: \"ui.validation\",\r\n \"text\": message\r\n });\r\n }\r\n\r\n protected isEmptyValue() {\r\n let v = this.getValue();\r\n return (typeof(v) === \"undefined\" || v === null || !v);\r\n }\r\n\r\n public adjustWidth(): void {\r\n }\r\n}\r\n\r\nexport interface ValidationResult {\r\n success : boolean;\r\n message? : string;\r\n value : string;\r\n}\r\n\r\n","import { i18n } from '@easydata/core';\r\nimport { utils as dataUtils } from '@easydata/core';\r\nimport { DataKind } from '@easyquery/core';\r\n\r\nimport { DomInputElementBuilder, domel } from '@easydata/ui'; \r\n\r\nimport { ExpressionRenderer, ValidationResult } from './expression_renderer';\r\nimport { QPEditablePart } from '../../../types/qp_editable_part';\r\nimport { browserUtils } from '../../../utils/browser_utils';\r\n\r\nexport class InputExpressionRenderer extends ExpressionRenderer {\r\n private inputElement: HTMLInputElement;\r\n private inputBuilder: DomInputElementBuilder;\r\n private dontProcessBlur: boolean;\r\n\r\n protected renderEditor(): void {\r\n this.inputBuilder = domel(\"input\")\r\n .hide()\r\n .addClass(`${this.cssPrefix}-ve-editbox`)\r\n .type('text')\r\n .on('blur', (ev) => {\r\n if (this.inputBuilder.isVisible() && !this.dontProcessBlur) {\r\n const validationResult = this.validateInput(this.inputElement.value);\r\n if (validationResult.success) {\r\n this.setValue(this.inputElement.value);\r\n this.closeEditor();\r\n }\r\n else {\r\n this.dontProcessBlur = true;\r\n this.inputElement.focus();\r\n setTimeout(() => { this.dontProcessBlur = false }, 200);\r\n this.showValidationError(validationResult.message, ev.target);\r\n }\r\n ev.stopPropagation();\r\n return false;\r\n }\r\n })\r\n .on('keydown', (ev) => {\r\n if ((ev as KeyboardEvent).keyCode === 27) { // ESC is pressed\r\n this.closeEditor();\r\n ev.stopPropagation();\r\n return false;\r\n }\r\n else if ((ev as KeyboardEvent).keyCode === 13) { // Enter is pressed\r\n if (this.inputBuilder.isVisible()) {\r\n this.dontProcessBlur = true;\r\n const validationResult = this.validateInput(this.inputElement.value);\r\n if (validationResult.success) {\r\n this.setValue(this.inputElement.value);\r\n this.closeEditor();\r\n this.dontProcessBlur = false;\r\n }\r\n else {\r\n this.inputElement.focus();\r\n this.showValidationError(validationResult.message, ev.target);\r\n setTimeout(() => { this.dontProcessBlur = false }, 200);\r\n }\r\n ev.stopPropagation();\r\n return false;\r\n }\r\n }\r\n });\r\n\r\n this.inputElement = this.inputBuilder.toDOM();\r\n\r\n domel(this.element)\r\n .addChildElement(this.inputElement);\r\n }\r\n\r\n protected showEditor(): void {\r\n const MIN_WIDTH = 200;\r\n\r\n if (!browserUtils.isMobileMode()) {\r\n let left = this.element.offsetLeft;\r\n let width = this.element.offsetWidth > MIN_WIDTH ? this.element.offsetWidth : MIN_WIDTH;\r\n let maxWidth = this.element.parentElement.clientWidth - left - 55;\r\n\r\n this.inputBuilder\r\n .removeStyle('left')\r\n .removeStyle('right');\r\n if (maxWidth < MIN_WIDTH) {\r\n this.inputBuilder\r\n .setStyle('right', '55px')\r\n .setStyle('width', `${MIN_WIDTH}px`);\r\n }\r\n else if (maxWidth < width) {\r\n this.inputBuilder\r\n .setStyle('left', `${left}px`)\r\n .setStyle('width', `${maxWidth}px`);\r\n }\r\n else {\r\n this.inputBuilder\r\n .setStyle('left', `${left}px`)\r\n .setStyle('width', `${width}px`);\r\n }\r\n }\r\n\r\n domel(this.labelElement).hide();\r\n this.inputBuilder\r\n .value(this.getValue())\r\n .show();\r\n this.inputElement.focus();\r\n }\r\n\r\n protected closeEditor(): void {\r\n this.inputBuilder.hide();\r\n domel(this.labelElement).show();\r\n this.labelElement.focus();\r\n }\r\n\r\n protected validateInput(inputValue : string) : ValidationResult {\r\n this.inputBuilder.removeClass(\"eqjs-invalid\");\r\n \r\n const result = {\r\n success: true,\r\n value: inputValue\r\n };\r\n\r\n if (this.expression.kind == DataKind.List) {\r\n this.validateListInput(inputValue, result);\r\n }\r\n else {\r\n this.validateScalarInput(inputValue, result);\r\n }\r\n\r\n return result;\r\n }\r\n\r\n protected validateListInput(inputValue: string, result: ValidationResult) : void {\r\n let inputValues = inputValue.split(/\\s*,\\s*/);\r\n for (let val of inputValues) {\r\n this.validateScalarInput(val, result);\r\n if (!result.success) {\r\n return;\r\n }\r\n }\r\n }\r\n\r\n protected validateScalarInput(inputValue: string, result: ValidationResult) : void {\r\n if (!inputValue)\r\n return;\r\n \r\n if (dataUtils.isNumericType(this.expression.dataType)) {\r\n let parsedVal = +inputValue;\r\n if (isNaN(parsedVal)) {\r\n result.success = false;\r\n result.message = '\"' + inputValue + '\" ' + i18n.getText('ErrNotNumber');\r\n }\r\n if (dataUtils.isIntType(this.expression.dataType) && parsedVal != parseInt(inputValue, 10)) {\r\n result.success = false;\r\n result.message = '\"' + inputValue + '\" ' + i18n.getText('ErrIncorrectInteger');\r\n }\r\n }\r\n }\r\n\r\n protected showValidationError(message: string, target?: EventTarget) : void {\r\n super.showValidationError(message, target);\r\n\r\n this.inputBuilder.addClass(\"eqjs-invalid\");\r\n }\r\n\r\n protected isEditable(): boolean {\r\n return super.isEditable() \r\n && ((this.panel.options.editableParts & QPEditablePart.Value) === QPEditablePart.Value)\r\n }\r\n\r\n}\r\n","import { i18n } from '@easydata/core';\r\nimport { utils as dataUtils } from '@easydata/core';\r\n\r\nimport { \r\n eqconsts, DataKind, ConditionPart,\r\n} from '@easyquery/core';\r\n\r\nimport { domel } from '@easydata/ui';\r\n\r\nimport { ExpressionRenderer } from './expression_renderer';\r\nimport { \r\n PopupMenu, \r\n PopupMenuOptions, \r\n MenuItem \r\n} from '../../../utils/popup_menu';\r\nimport { QPEditablePart } from '../../../types/qp_editable_part';\r\n\r\n\r\nexport class ListExpressionRenderer extends ExpressionRenderer {\r\n\r\n protected menu: PopupMenu | null;\r\n protected menuItemsList: MenuItem[] = [];\r\n\r\nprotected showWhenReady = false;\r\n\r\n protected isEditable(): boolean {\r\n return !this.isReadOnly()\r\n && ((this.panel.options.editableParts & QPEditablePart.Value) === QPEditablePart.Value)\r\n }\r\n \r\n protected setValue(value: string | string[], silent = false): boolean {\r\n const newValue = this.adjustNewValue(value);\r\n if (value !== this.expression.value) {\r\n const text = this.getValueText(value);\r\n this.expression.setContent(newValue, text);\r\n\r\n if (!silent) {\r\n this.expression.getParent().fireChangedEvent(ConditionPart.Value);\r\n }\r\n }\r\n \r\n return true;\r\n }\r\n\r\n protected getValueText(value: string | string[]): string {\r\n let result = \"\";\r\n\r\n if (Array.isArray(value)) {\r\n for(let item of this.menuItemsList) {\r\n if (value.indexOf(item.id) >= 0) {\r\n result += item.text + ',';\r\n }\r\n }\r\n } else {\r\n for(let item of this.menuItemsList) {\r\n if (item.id === value) {\r\n result += item.text + ',';\r\n }\r\n }\r\n }\r\n\r\n if (result) {\r\n result = result.substring(0, result.length - 1);\r\n }\r\n\r\n return result;\r\n }\r\n\r\n protected getEmptyText(): string {\r\n return this.panel.options.emptyTextList || i18n.getText('MsgEmptyListValue'); \r\n }\r\n\r\n protected getListName(): string {\r\n return this.valueEditor.name;\r\n }\r\n\r\n protected renderEditor(): void {\r\n this.fillMenuItemsList(() => {\r\n this.renderMenuBlock();\r\n });\r\n }\r\n\r\n protected getLabelText(): string {\r\n if (!this.expression.isEmpty()) {\r\n return this.expression.getText();\r\n }\r\n else {\r\n return this.getEmptyText();\r\n }\r\n }\r\n\r\n protected showLoader() {\r\n //NOTHING TO DO\r\n }\r\n\r\n protected hideLoader() {\r\n //NOTHING TO DO\r\n }\r\n\r\n protected showEditor() : void {\r\n if (this.menu) {\r\n this.menu.showMenu({\r\n anchor: this.labelElement, \r\n selectedIds: this.getValuesAsArray(),\r\n itemSelectedCallback: (item, selectedItems) => { \r\n if (!this.menu.options.multiselect) {\r\n this.setValue(item.id);\r\n }\r\n else if (selectedItems) {\r\n let selectedIds = [];\r\n let selLength = selectedItems.length;\r\n for (let i = 0; i < selLength; i++)\r\n selectedIds.push(selectedItems[i].id);\r\n\r\n this.setValue(selectedIds);\r\n } \r\n\r\n return false;\r\n }\r\n });\r\n } else {\r\n this.showWhenReady = true;\r\n this.showLoader();\r\n }\r\n } \r\n \r\n protected closeEditor() : void {\r\n this.menu.hideMenu();\r\n }\r\n\r\n protected renderMenuBlock() : void { \r\n let multiSelect = false;\r\n if (this.expression) {\r\n multiSelect = this.expression.kind === DataKind.List;\r\n }\r\n\r\n const queryPanel = this.panel;\r\n\r\n const options: PopupMenuOptions = {\r\n items: this.menuItemsList,\r\n multiselect: multiSelect,\r\n container: queryPanel ? queryPanel.options.menuContainer : null,\r\n showSelected: true,\r\n showItemIds: queryPanel ? queryPanel.options.showIdsForListItems : false\r\n };\r\n\r\n if (queryPanel) {\r\n dataUtils.assignDeep(options, queryPanel.options.menuOptions);\r\n };\r\n\r\n let menuId = this.element.id;\r\n if (menuId) {\r\n options.id = menuId + '-EditorMenu';\r\n }\r\n\r\n if (queryPanel) {\r\n options.domWriteItemsId = queryPanel.options.domWriteItemsId;\r\n };\r\n\r\n options.buttons = {\r\n submit : i18n.getText('ButtonApply'),\r\n cancel : i18n.getText('ButtonCancel') \r\n }\r\n\r\n this.menu = new PopupMenu(options);\r\n }\r\n\r\n protected getValuesAsArray(): string[] {\r\n if (this.expression.kind !== DataKind.List) {\r\n return [this.expression.value];\r\n }\r\n else {\r\n if (this.expression.value) {\r\n //splits value by ',' \r\n const res = this.expression.value.match(/\"[^\"\\\\]*(?:\\\\.[^\"\\\\]*)*\"|[^,]+/g);\r\n return res \r\n ? res.map(a => {\r\n if (a.charAt(0) == '\"' && a.charAt(a.length - 1) == '\"') {\r\n a = a.substring(1, a.length - 1);\r\n return a.replace(/\\\"/g, '\"');\r\n }\r\n else {\r\n return a;\r\n }\r\n })\r\n : [];\r\n }\r\n else \r\n return [];\r\n }\r\n }\r\n\r\n protected adjustNewValue(newValue: string | string[]): string { \r\n if (Array.isArray(newValue)) {\r\n return newValue.map((a) => {\r\n if (a.indexOf(',') >= 0) {\r\n a = a.replace(/\"/g, '\\\"');\r\n return '\"' + a + '\"';\r\n }\r\n else {\r\n return a;\r\n }\r\n }).join(',');\r\n }\r\n else {\r\n return newValue;\r\n }\r\n }\r\n\r\n protected fillMenuItemsList(onComplete?) {\r\n this.menuItemsList = this.valueEditor.values;\r\n\r\n if (onComplete) {\r\n onComplete();\r\n }\r\n }\r\n\r\n protected takeDefaultValue() {\r\n if (!this.menuItemsList) return;\r\n let itemLen = this.menuItemsList.length;\r\n let defValue = this.valueEditor.defValue;\r\n for (let i = 0; i < itemLen; i++) {\r\n let item = this.menuItemsList[i] as any;\r\n if (item.isDefault || defValue == item.id) {\r\n this.setValue(item.id, true);\r\n break; \r\n }\r\n }\r\n }\r\n}\r\n\r\nexport class CustomListExpressionRenderer extends ListExpressionRenderer {\r\n loaderElement: HTMLElement | null;\r\n\r\n private isLoading = false;\r\n\r\n private onClickTemp = null;\r\n\r\n protected renderEditor() {\r\n if (this.isLoading) return;\r\n\r\n this.isLoading = true;\r\n this.fillMenuItemsList(() => {\r\n this.isLoading = false;\r\n\r\n if (this.isEmptyValue()) {\r\n this.takeDefaultValue();\r\n }\r\n\r\n if (!this.expression.isEmpty() && this.expression._isDefaultValue) {\r\n const text = this.getValueText(this.expression.value);\r\n this.expression.setContent(this.expression.value, text);\r\n this.expression.getParent().fireChangedEvent();\r\n }\r\n\r\n this.renderMenuBlock();\r\n\r\n if (this.showWhenReady) {\r\n this.showWhenReady = false;\r\n this.hideLoader();\r\n this.showEditor();\r\n }\r\n });\r\n }\r\n\r\n protected showLoader() {\r\n this.labelElement.style.display = 'none';\r\n if (!this.loaderElement) {\r\n this.loaderElement = domel('div', this.element)\r\n .addClass(`${this.cssPrefix}-ve-loader`)\r\n .toDOM()\r\n }\r\n\r\n this.loaderElement.style.display = 'block';\r\n }\r\n\r\n protected hideLoader() {\r\n this.loaderElement.style.display = 'none';\r\n this.labelElement.removeAttribute('style');\r\n }\r\n\r\n protected fillMenuItemsList(onComplete) {\r\n const listName = this.getListName();\r\n const listRequestHandler = this.panel.getContext().getListRequestHandler();\r\n\r\n if (eqconsts.constLists[listName]) {\r\n this.menuItemsList = eqconsts.constLists[listName];\r\n if (onComplete) {\r\n onComplete();\r\n }\r\n }\r\n else if (listRequestHandler) {\r\n listRequestHandler({\r\n listName: listName,\r\n editorId: this.valueEditor.id,\r\n editorParams: this.valueEditor.extraParams,\r\n value: this.getValue()\r\n },\r\n (list) => { \r\n this.menuItemsList = list; \r\n if (onComplete) {\r\n onComplete();\r\n }\r\n }\r\n );\r\n }\r\n }\r\n}\r\n\r\nexport class SqlListExpressionRenderer extends CustomListExpressionRenderer {\r\n protected fillMenuItemsList(onComplete?) {\r\n const context = this.panel.getContext();\r\n const editor = this.valueEditor;\r\n const listRequestHandler = context.getListRequestHandler();\r\n if (listRequestHandler) {\r\n let requestData = { \r\n listName: \"SQL\", \r\n editorId: this.valueEditor.id,\r\n editorParams: this.valueEditor.extraParams,\r\n value: this.getValue()\r\n };\r\n\r\n //requestData.sql = editor.sql;\r\n listRequestHandler(requestData, (list) => {\r\n this.menuItemsList = list; \r\n if (onComplete) {\r\n onComplete();\r\n }\r\n });\r\n }\r\n }\r\n}\r\n","import { i18n } from '@easydata/core';\r\n\r\nimport { \r\n Expression,\r\n ConditionPart,\r\n} from '@easyquery/core';\r\n\r\nimport { domel } from '@easydata/ui';\r\n\r\nimport { ListExpressionRenderer } from './list_expression_renderer';\r\nimport { QueryPanel } from '../../query_panel'\r\nimport { PopupMenu } from '../../../utils/popup_menu';\r\nimport { browserUtils } from '../../../utils/browser_utils';\r\nimport { QPEditablePart } from '../../../types/qp_editable_part';\r\n\r\nexport class AttributeExpressionRenderer extends ListExpressionRenderer {\r\n\r\n constructor(panel: QueryPanel, expression: Expression, entitiesMenu: PopupMenu, slot?: HTMLDivElement) {\r\n super(panel, expression, null, slot);\r\n\r\n this.menu = entitiesMenu;\r\n }\r\n\r\n protected renderEditor(): void {\r\n //create menu\r\n }\r\n\r\n protected getLabelText(): string {\r\n const model = this.panel.getContext().getModel();\r\n const attrId = this.expression.value;\r\n const attrObj = attrId ? model.getAttributeByIdSafe(attrId) : null;\r\n const attrFormat = this.panel.options.attrElementFormat;\r\n return attrObj ? model.getAttributeText(attrObj, attrFormat) : this.getEmptyText();\r\n }\r\n\r\n protected setValue(value: string | string[], silent = false): boolean {\r\n silent = silent && value !== this.expression.value;\r\n\r\n const result = super.setValue(value, true);\r\n if (!silent) {\r\n this.expression.getParent().fireChangedEvent(ConditionPart.EntityAttr | ConditionPart.Operator);\r\n }\r\n \r\n return result;\r\n }\r\n\r\n protected isEditable(): boolean {\r\n return !this.isReadOnly()\r\n && ((this.panel.options.editableParts & QPEditablePart.Attribute) === QPEditablePart.Attribute)\r\n }\r\n\r\n protected getEmptyText(): string {\r\n return this.panel.options.emptyTextAttribute || i18n.getText('MsgEmptyAttrValue'); \r\n }\r\n\r\n protected getClassesToAdd(): string {\r\n return `${this.cssPrefix}-condelement ${this.cssPrefix}-attrelement`;\r\n }\r\n\r\n public adjustWidth(): void {\r\n if (browserUtils.isMobileMode()) {\r\n return;\r\n }\r\n\r\n const elWidth = this.element.clientWidth;\r\n const parWidth = this.element.parentElement.clientWidth;\r\n\r\n if (elWidth > parWidth / 2) {\r\n domel(this.element)\r\n .addClass(`${this.cssPrefix}-attrelement-wide`);\r\n }\r\n }\r\n\r\n}\r\n","import { \r\n PopupMenu\r\n} from '../../utils/popup_menu';\r\nimport { BaseElementRenderer } from './base_element_renderer';\r\n\r\n\r\nexport abstract class DropDownRenderer extends BaseElementRenderer {\r\n constructor(slot?: HTMLDivElement) {\r\n super(slot);\r\n }\r\n\r\n protected abstract itemSelected(id: string): void;\r\n \r\n protected abstract getMenu(): PopupMenu;\r\n\r\n protected showEditor(): void {\r\n const menu = this.getMenu();\r\n if (menu) {\r\n menu.showMenu({\r\n anchor: this.labelElement, \r\n itemSelectedCallback: item => { \r\n this.itemSelected(item.id);\r\n return false;\r\n }\r\n });\r\n }\r\n }\r\n\r\n protected closeEditor(): void {\r\n const menu = this.getMenu();\r\n if (menu) \r\n menu.hideMenu();\r\n }\r\n\r\n}","import { i18n } from '@easydata/core';\r\nimport { SimpleConditionDescriptor, QueryChangeAction } from '@easyquery/core';\r\n\r\nimport { domel } from '@easydata/ui';\r\n\r\nimport { QueryPanel } from '../../query_panel';\r\nimport { PopupMenu } from '../../../utils/popup_menu';\r\nimport { DropDownRenderer } from '../dropdown_renderer';\r\nimport { eqCssPrefix } from '../../../utils/utils';\r\nimport { QPEditablePart } from '../../../types/qp_editable_part';\r\n\r\nexport class AddRowRenderer extends DropDownRenderer {\r\n protected panel: QueryPanel;\r\n protected menu: PopupMenu;\r\n\r\n constructor(panel: QueryPanel, entitiesMenu: PopupMenu, slot?: HTMLDivElement) {\r\n super(slot);\r\n\r\n this.panel = panel;\r\n this.menu = entitiesMenu;\r\n }\r\n\r\n protected get cssPrefix(): string {\r\n return 'eqjs-qp';\r\n }\r\n\r\n protected getLabelText(): string {\r\n return i18n.getText('CmdClickToAddCondition');\r\n }\r\n\r\n protected getClassesToAdd(): string {\r\n return `${eqCssPrefix}-addrow ${this.cssPrefix}-addrow`;\r\n }\r\n\r\n protected isEditable(): boolean {\r\n return super.isEditable() \r\n && ((this.panel.options.editableParts & QPEditablePart.Addition) === QPEditablePart.Addition)\r\n }\r\n\r\n protected renderLabelElement(): HTMLElement {\r\n const displayedText = this.getLabelText();\r\n\r\n if (this.isEditable()) {\r\n this.labelElement = domel('a')\r\n .attr('href', 'javascript:void(0)')\r\n .title(displayedText)\r\n .text(displayedText)\r\n .on('click', (ev) => { //touchstart \r\n ev.preventDefault();\r\n this.showEditor();\r\n return false;\r\n })\r\n .toDOM();\r\n }\r\n else {\r\n this.labelElement = domel('div')\r\n .toDOM();\r\n }\r\n\r\n return this.labelElement;\r\n }\r\n\r\n protected renderEditor(): void {\r\n // do nothing - the menu is alredy created\r\n }\r\n\r\n protected itemSelected(id: string): void {\r\n const query = this.panel.getQuery();\r\n\r\n const descr: SimpleConditionDescriptor = {\r\n parent: query.getRootCondition(),\r\n attributeId: id\r\n }\r\n \r\n const cond = query.addSimpleCondition(descr);\r\n\r\n if (cond) {\r\n query.fireConditionsChangedEvent(QueryChangeAction.Add, cond);\r\n }\r\n }\r\n\r\n protected getMenu(): PopupMenu {\r\n return this.menu;\r\n }\r\n\r\n}","import { i18n } from '@easydata/core';\r\nimport { utils as dataUtils } from '@easydata/core';\r\n\r\nimport { \r\n Condition, Operator,\r\n DataKind, ConditionPart\r\n} from '@easyquery/core';\r\n\r\nimport { DropDownRenderer } from '../dropdown_renderer';\r\nimport { QueryPanel } from '../../query_panel';\r\nimport { PopupMenu, PopupMenuOptions } from '../../../utils/popup_menu';\r\nimport { QPEditablePart } from '../../../types/qp_editable_part';\r\n\r\nexport class OperatorRenderer extends DropDownRenderer {\r\n protected panel: QueryPanel;\r\n protected condition: Condition;\r\n protected displayedText: string;\r\n protected menu: PopupMenu;\r\n\r\n protected get cssPrefix(): string {\r\n return 'eqjs-qp';\r\n }\r\n\r\n constructor(panel: QueryPanel, condition: Condition, text: string, slot?: HTMLDivElement) {\r\n super(slot);\r\n\r\n this.panel = panel;\r\n this.condition = condition;\r\n this.displayedText = text;\r\n }\r\n\r\n protected renderEditor(): void {\r\n //create menu\r\n const model = this.panel.getContext().getModel();\r\n const query = this.panel.getQuery();\r\n\r\n const items = [];\r\n\r\n const isRelatedToSubQuery = (operator: Operator) : boolean => {\r\n return operator.defaultOperand.kind == DataKind.Query;\r\n\r\n }\r\n\r\n const attrId = (this.condition && this.condition.expressions && this.condition.expressions[0]) ? this.condition.expressions[0].value : null;\r\n const attr = attrId ? model.getAttributeById(this.condition.expressions[0].value) : null;\r\n if (attr && attr.operators) {\r\n attr.operators.forEach(operId => {\r\n\r\n const operator = model.getOperatorById(operId);\r\n const related = isRelatedToSubQuery(operator);\r\n\r\n if (!query.isEx() && related) {\r\n return;\r\n }\r\n\r\n if (operator && !(this.panel.options.isSubQuery && related)) {\r\n items.push({ \r\n id: operId, \r\n text: i18n.getText('Operators', operId, 'caption') || operator.caption\r\n });\r\n }\r\n });\r\n } \r\n\r\n const options: PopupMenuOptions = { \r\n items: items, \r\n adjustHeight: this.panel.options.adjustEntitiesMenuHeight, \r\n id: dataUtils.generateId('opmn'), \r\n domWriteItemsId: this.panel.options.domWriteItemsId \r\n };\r\n dataUtils.assign(options, this.panel.options.menuOptions);\r\n this.menu = new PopupMenu(options);\r\n }\r\n\r\n protected getLabelText(): string {\r\n return this.displayedText;\r\n }\r\n\r\n protected getEmptyText(): string {\r\n return this.panel.options.emptyTextOperator || i18n.getText('MsgEmptyOperator'); \r\n }\r\n\r\n protected getClassesToAdd(): string {\r\n return `${this.cssPrefix}-condelement ${this.cssPrefix}-operelement`;\r\n }\r\n\r\n protected isEditable(): boolean {\r\n return this.condition.enabled && !this.condition.isReadOnly()\r\n && ((this.panel.options.editableParts & QPEditablePart.Operator) === QPEditablePart.Operator)\r\n }\r\n\r\n protected itemSelected(id: string): void {\r\n this.condition.setOperatorId(id);\r\n this.condition.fireChangedEvent(ConditionPart.Operator);\r\n }\r\n\r\n protected getMenu(): PopupMenu {\r\n return this.menu;\r\n }\r\n}\r\n","import { i18n, DataType, utils as dataUtils } from '@easydata/core';\r\nimport { DateTimePicker, DefaultDateTimePicker, DateTimePickerOptions } from '@easydata/ui';\r\n\r\nimport { ExpressionRenderer } from './expression_renderer';\r\nimport { QPEditablePart } from '../../../types/qp_editable_part';\r\n\r\nexport class DateTimeExpressionRenderer extends ExpressionRenderer {\r\n private dtp: DateTimePicker = null;\r\n\r\n private internalDateFormat = 'yyyy-MM-dd';\r\n private internalTimeFormat = 'HH:mm';\r\n\r\n protected renderEditor(): void { \r\n } \r\n \r\n protected showEditor(): void {\r\n if (this.dtp)\r\n return;\r\n\r\n const pickerOptions: DateTimePickerOptions = {\r\n yearRange: this.panel.options.yearRange,\r\n showCalendar: this.expression.dataType !== DataType.Time,\r\n showTimePicker: this.expression.dataType !== DataType.Date,\r\n oneClickDateSelection: this.panel.options.oneClickDateSelection,\r\n showDateTimeInput: this.panel.options.showDateTimeInput,\r\n onApply: (dateTime: Date) => {\r\n const value = this.convertToInternalFormat(dateTime);\r\n this.setValue(value);\r\n \r\n this.dtp = null;\r\n setTimeout(() => this.labelElement.focus(), 100);\r\n },\r\n onCancel: ()=> {\r\n this.labelElement.innerText = this.getLabelText();\r\n this.dtp = null;\r\n setTimeout(() => this.labelElement.focus(), 100);\r\n },\r\n onDateTimeChanged: (dateTime: Date) => {\r\n const value = i18n.dateTimeToStr(dateTime, this.expression.dataType);\r\n this.labelElement.innerText = value;\r\n }\r\n };\r\n\r\n this.dtp = this.panel.options.dateTimePickerResolver \r\n ? this.panel.options.dateTimePickerResolver(pickerOptions)\r\n : new DefaultDateTimePicker(pickerOptions);\r\n\r\n const model = this.expression.getModel();\r\n const value = this.expression.value;\r\n let dateTime = new Date();\r\n if (this.expression.dataType != DataType.Time && model.isDateMacro(value)) {\r\n dateTime = model.getDateMacroValue(value);\r\n } else if (this.expression.dataType == DataType.Time && model.isTimeMacro(value)) {\r\n dateTime = model.getTimeMacroValue(value);\r\n } else {\r\n dateTime = this.convertFromInternalFormat(value);\r\n }\r\n\r\n this.dtp.setDateTime(dateTime);\r\n this.dtp.show(this.element);\r\n }\r\n \r\n protected closeEditor(): void {\r\n this.dtp.cancel();\r\n this.dtp = null;\r\n }\r\n\r\n protected getLabelText(): string {\r\n if (!this.expression.value)\r\n return this.getEmptyText();\r\n\r\n const defValue = '${{Today}}';\r\n const value = this.expression.value;\r\n const model = this.expression.getModel();\r\n if (!model) {\r\n throw new Error('DataModel is not defined for ' + this.expression.value);\r\n }\r\n if (model.isDateMacro(value) || model.isTimeMacro(value)) {\r\n let macroText = value.substring(3, value.length - 2);\r\n let res = i18n.getText(macroText);\r\n return res ? res : defValue;\r\n }\r\n const result = i18n.dateTimeToStr(this.convertFromInternalFormat(value), this.expression.dataType);\r\n return result;\r\n }\r\n\r\n protected isEditable(): boolean {\r\n return super.isEditable() \r\n && ((this.panel.options.editableParts & QPEditablePart.Value) === QPEditablePart.Value)\r\n }\r\n\r\n protected convertFromInternalFormat(dateTime: string): Date {\r\n return dataUtils.strToDateTime(dateTime, this.internalDateFormat + ' ' + this.internalTimeFormat);\r\n }\r\n\r\n protected convertToInternalFormat(dateTime: Date): string {\r\n return dataUtils.dateTimeToStr(dateTime, this.internalDateFormat + ' ' + this.internalTimeFormat);\r\n }\r\n}","import { i18n } from '@easydata/core';\r\nimport { utils as dataUtils } from '@easydata/core';\r\n\r\nimport {\r\n Entity, EntityAttr, \r\n QueryColumn, SortDirection, \r\n Expression, DataKind, ExprTag, \r\n Query, QueryChangeAction, Condition, ConditionPart \r\n} from '@easyquery/core';\r\n\r\nimport { domel } from '@easydata/ui';\r\n \r\nimport { ExpressionRenderer } from './expression_renderer';\r\nimport { PopupMenu, PopupMenuOptions } from '../../../utils/popup_menu';\r\nimport { QueryPanel } from '../../query_panel';\r\nimport { QPEditablePart } from '../../../types/qp_editable_part';\r\n\r\nexport class SubQueryExpressionRenderer extends ExpressionRenderer {\r\n\r\n protected dialogBlock: HTMLElement;\r\n protected dialogBackground: HTMLElement;\r\n protected dialogBlockBody: HTMLElement;\r\n protected columnBlock: HTMLElement;\r\n protected columnElement: HTMLElement;\r\n protected queryPanelBlock: HTMLElement;\r\n\r\n protected queryPanel: QueryPanel\r\n\r\n protected colEntitiesMenu: PopupMenu;\r\n protected colEntitiesList: Entity[];\r\n\r\n protected renderEditor(): void {\r\n\r\n this.dialogBlockBody = domel('div')\r\n .addClass(`kfrm-form`)\r\n //.setStyle('height', '100%')\r\n .toDOM();\r\n \r\n this.createEntitiesMenu();\r\n\r\n this.renderColumnBlock();\r\n this.renderQueryPanelBlock();\r\n } \r\n\r\n protected isEditable(): boolean {\r\n return super.isEditable() \r\n && ((this.panel.options.editableParts & QPEditablePart.Value) === QPEditablePart.Value)\r\n }\r\n\r\n protected setValue(value: string | Query, silent?: boolean) {\r\n if (value instanceof Query) {\r\n this.expression.subQuery = value;\r\n\r\n if (!silent) {\r\n this.expression.getParent().fireChangedEvent(ConditionPart.Value);\r\n }\r\n \r\n }\r\n }\r\n \r\n private createEntitiesMenu() {\r\n const model = this.getContext().getModel();\r\n const exprType = this.expression.dataType;\r\n\r\n this.colEntitiesList = model.getEntitiesTreeWithFilter((ent: Entity, attr: EntityAttr) => {\r\n if (attr) {\r\n return attr.useInConditions && attr.dataType === exprType;\r\n }\r\n else {\r\n //if it's entity\r\n return ent.attributes && ent.useInConditions;\r\n }\r\n });\r\n\r\n if (!model || model.isEmpty()) return null;\r\n\r\n let menuId = this.element.getAttribute('data-id');\r\n if (menuId) {\r\n menuId += '-SubColumnMenu';\r\n }\r\n\r\n const options: PopupMenuOptions = { \r\n items: this.colEntitiesList as any, \r\n adjustHeight: this.panel.options.adjustEntitiesMenuHeight, \r\n id: menuId, \r\n isSubQuery: true,\r\n domWriteItemsId: this.panel.options.domWriteItemsId \r\n }\r\n\r\n dataUtils.assign(options, this.panel.options.menuOptions);\r\n this.colEntitiesMenu = new PopupMenu(options);\r\n }\r\n\r\n private renderColumnBlock() {\r\n this.columnBlock = domel('div', this.dialogBlockBody)\r\n .addClass(`kfrm-field`)\r\n .addChild('label', b => b\r\n .addText(i18n.getText('SubQueryColumnTitle'))\r\n )\r\n .addChild('a', b => this.columnElement = b\r\n .attr('href', 'javascript:void(0)')\r\n .on('click', (e) => {\r\n this.colEntitiesMenu.showMenu({\r\n anchor: this.columnElement, \r\n selectedIds: null, \r\n itemSelectedCallback: (data, items) => {\r\n const attrId = data.id;\r\n this.setResultAttributeId(attrId);\r\n return false;\r\n }\r\n })\r\n })\r\n .toDOM()\r\n )\r\n .toDOM();\r\n }\r\n\r\n protected getEmptyText(): string {\r\n return this.panel.options.emptyTextValue || i18n.getText('MsgSubQueryValue');\r\n }\r\n\r\n private renderQueryPanelBlock() {\r\n const parentEl = domel('div', this.dialogBlockBody)\r\n .addClass(`kfrm-field`)\r\n .addChild('label', b => b\r\n .addText(i18n.getText('SubQueryQueryPanelCaption'))\r\n )\r\n .toDOM();\r\n\r\n this.queryPanelBlock = \r\n domel('div', parentEl)\r\n .toDOM();\r\n \r\n let qpId = this.element.getAttribute('data-id');\r\n if (qpId) {\r\n this.queryPanelBlock.id = qpId + '-SubQueryPanel';\r\n }\r\n }\r\n\r\n private setResultAttributeId(attrId: string) {\r\n let attrObj = this.getContext().getModel().getAttributeById(attrId);\r\n\r\n if (attrObj) {\r\n let subQuery = this.getSubQuery();\r\n\r\n let cols:QueryColumn[] = subQuery.getColumns();\r\n let column: QueryColumn;\r\n\r\n if (cols.length > 0) {\r\n column = cols[0];\r\n column.expr.setValue(attrId);\r\n column.expr.dataType = attrObj.dataType;\r\n column.fireChangedEvent();\r\n }\r\n else {\r\n column = subQuery.createColumn();\r\n column.sorting = SortDirection.None;\r\n column.sortIndex = -1;\r\n\r\n let expr = new Expression(column);\r\n expr.setValue(attrId);\r\n expr.tag = ExprTag.EntityAttribute\r\n expr.kind = DataKind.Attribute;\r\n expr.dataType = attrObj.dataType;\r\n\r\n column.expr = expr;\r\n\r\n cols.push(column);\r\n subQuery.fireColumnsChangedEvent(QueryChangeAction.Add, column);\r\n }\r\n\r\n\r\n this.columnElement.innerText = this.getAttributeText(attrObj);\r\n }\r\n }\r\n\r\n protected getSubQuery(): Query {\r\n return this.queryPanel.getQuery();\r\n }\r\n\r\n protected getAttributeText(attribute: EntityAttr): string {\r\n\r\n if (!attribute) \r\n return i18n.getText('SubQueryEmptyColumn');\r\n\r\n let attrText = i18n.getText('Attributes', attribute.id);\r\n if (!attrText)\r\n attrText = attribute.caption;\r\n\r\n\r\n let format = this.panel.options.attrElementFormat;\r\n if (!format) \r\n return attrText;\r\n\r\n let result = format.replace(new RegExp(\"{attr}\",'g'), attrText);\r\n let entityPath = this.getContext()\r\n .getModel()\r\n .getFullEntityPathByAttr(attribute.id, '.');\r\n\r\n return result.replace(new RegExp(\"{entity}\",'g'), entityPath);\r\n }\r\n \r\n protected showEditor(): void {\r\n const parentPanel = this.panel;\r\n const context = this.getContext();\r\n\r\n this.queryPanelBlock.innerHTML = \"\";\r\n\r\n const subQuery = context.createQuery();\r\n if (this.expression.subQuery) {\r\n subQuery.loadFromData(this.expression.subQuery.toJSONData())\r\n }\r\n\r\n let subOptions = dataUtils.assign({}, parentPanel.options);\r\n subOptions.isSubQuery = true;\r\n subOptions.showAddRow = true;\r\n subOptions.menuContainer = document.body;\r\n subOptions.menuOptions.isSubQuery = true;\r\n subOptions.entitiesListFilter = (listItems, listOptions) => {\r\n if (parentPanel.options.entitiesListFilter) {\r\n let subQueryPanelListOptions = listOptions || {};\r\n subQueryPanelListOptions.isSubQuery = true;\r\n parentPanel.options.entitiesListFilter(listItems, subQueryPanelListOptions);\r\n }\r\n };\r\n\r\n this.queryPanel = new QueryPanel(this.queryPanelBlock, subQuery);\r\n\r\n this.queryPanel.init(this.panel.getContext(), subOptions);\r\n\r\n let attrId = null;\r\n\r\n let cols = subQuery.getColumns();;\r\n\r\n if (cols.length == 0) {\r\n let condition: Condition = this.expression.getParent() as Condition;\r\n if (condition.expressions.length > 0) {\r\n let attrExpr = condition.expressions[0];\r\n attrId = (attrExpr.tag == ExprTag.EntityAttribute \r\n || attrExpr.kind == DataKind.Attribute) ? attrExpr.value : null;\r\n }\r\n }\r\n else {\r\n attrId = cols[0].expr.value;\r\n }\r\n\r\n if (attrId) {\r\n this.setResultAttributeId(attrId);\r\n }\r\n else {\r\n this.columnElement.innerText = i18n.getText(\"SubQueryEmptyColumn\");\r\n }\r\n \r\n this.queryPanel.refresh();\r\n\r\n const rootCondEl = this.queryPanelBlock.querySelector('.eqjs-qp-conditions-root');\r\n if (rootCondEl) {\r\n (rootCondEl as HTMLElement).style.minHeight = '100px';\r\n }\r\n\r\n const dialogService = this.panel\r\n .getContext()\r\n .getServices()\r\n .getDialogService();\r\n\r\n dialogService.open({\r\n title: i18n.getText('SubQueryDialogTitle'),\r\n body: this.dialogBlockBody,\r\n width: this.panel.options.subQueryDialogWidth,\r\n //height: this.panel.options.subQueryDialogHeight,\r\n closable: true,\r\n cancelable: true,\r\n onSubmit: () => {\r\n const value = this.queryPanel.getQuery();\r\n\r\n // validate subquery\r\n if (value.tryValidate({checkExpressions: true})) {\r\n this.setValue(value);\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n });\r\n }\r\n\r\n\r\n\r\n protected closeEditor(): void {\r\n \r\n }\r\n}","import { Condition, Expression, EqValueEditor, ExprTag } from \"@easyquery/core\";\r\nimport { CustomListExpressionRenderer } from \"./list_expression_renderer\";\r\nimport { QueryPanel } from \"../../query_panel\";\r\n\r\nexport class BindToParentColumnExpressionRenderer extends CustomListExpressionRenderer {\r\n \r\n constructor(panel: QueryPanel, expression: Expression, editor: EqValueEditor, slot?: HTMLDivElement) {\r\n super(panel, expression, editor, slot);\r\n\r\n this.expression.tag = ExprTag.ParentColumn;\r\n }\r\n\r\n protected fillMenuItemsList(onComplete?) {\r\n const query = this.panel.getQuery().getParentQuery();\r\n const parent = this.expression.getParent() as Condition;\r\n const attrDataType = parent.expressions[0].dataType;\r\n this.menuItemsList = query\r\n .getColumns()\r\n .filter(col => col.expr.dataType == attrDataType)\r\n .map(col =>{\r\n return { id: col.id, text: col.caption};\r\n });\r\n\r\n if (onComplete) {\r\n onComplete();\r\n }\r\n }\r\n \r\n}","import { i18n } from '@easydata/core';\r\nimport { DataType, utils as dataUtils } from '@easydata/core';\r\n\r\nimport { \r\n Widget, WidgetGroup, \r\n EqContext, eqconsts,\r\n Condition, CondTag, Expression, \r\n EqValueEditor, EqEditorTag, DataKind, \r\n Query, QueryChangeEventData, QueryChangePart, \r\n QueryChangeAction, SimpleConditionDescriptor, Entity, EntityAttr, ConditionPart\r\n} from '@easyquery/core';\r\n\r\nimport { domel } from '@easydata/ui';\r\n\r\nimport { eqDragManager, DropEffect } from '@easydata/ui'\r\n\r\nimport { QPEditablePart } from '../types/qp_editable_part';\r\n\r\nimport { QueryPanelOptions } from './widget_options';\r\nimport { PopupMenu, PopupMenuOptions } from '../utils/popup_menu';\r\nimport { ConditionRenderer, SimpleConditionRenderer } from './renderers/querypanel/condition_renderer';\r\nimport { ConditionGroupRenderer } from './renderers/querypanel/condition_group_renderer';\r\n\r\nimport { ExpressionRenderer } from './renderers/querypanel/expression_renderer';\r\nimport { InputExpressionRenderer } from './renderers/querypanel/input_expression_renderer';\r\nimport { AttributeExpressionRenderer } from './renderers/querypanel/attribute_expression_renderer';\r\nimport { AddRowRenderer } from './renderers/querypanel/addrow_renderer';\r\nimport { \r\n ListExpressionRenderer, \r\n SqlListExpressionRenderer, \r\n CustomListExpressionRenderer \r\n} from './renderers/querypanel/list_expression_renderer';\r\nimport { OperatorRenderer } from './renderers/querypanel/operator_renderer';\r\nimport { BaseElementRenderer } from './renderers/base_element_renderer';\r\nimport { DateTimeExpressionRenderer } from './renderers/querypanel/datetime_expression_render';\r\nimport { SubQueryExpressionRenderer } from './renderers/querypanel/subquery_expression_renderer';\r\nimport { eqCssPrefix, eqCssMobile, safeFocus } from '../utils/utils';\r\nimport { browserUtils } from '../utils/browser_utils';\r\nimport { BindToParentColumnExpressionRenderer } from './renderers/querypanel/bind_to_parent_column_expression_renderer';\r\n\r\n/**\r\n * The query panel wiget, implemented without JQuery.\r\n */\r\nexport class QueryPanel extends Widget {\r\n public options: QueryPanelOptions = {\r\n editableParts: QPEditablePart.All,\r\n isSubQuery: false,\r\n activeCondition: null,\r\n entitiesPopupHandler: null,\r\n entitiesListFilter: null,\r\n menuContainer: document.body,\r\n showRootRow: true,\r\n showAddRow: true,\r\n showCheckboxes: false,\r\n allowParameterization: false,\r\n allowInJoinConditions: false,\r\n showPoweredBy: false,\r\n buttons: {\r\n condition: null,\r\n group: null\r\n },\r\n alwaysShowButtonsInGroups: false,\r\n alwaysShowButtonsInConditions: false,\r\n showConjunctions: true,\r\n accentActiveCondition: true,\r\n activateRootOnStart: true,\r\n yearRange: 'c-10:c+10',\r\n oneClickDateSelection: true,\r\n showDateTimeInput: false,\r\n attrElementFormat: '{entity} {attr}',\r\n menuOptions: {\r\n showSearchBoxAfter: 30,\r\n searchBoxAutoFocus: true,\r\n activateOnMouseOver: true,\r\n itemRenderedCallback: null\r\n },\r\n allowDragDrop: true,\r\n attrPlacement: 0,\r\n sortEntities: false,\r\n subQueryDialogWidth: 600,\r\n subQueryDialogHeight: 300,\r\n dialogZIndex: 100000,\r\n numberListSeparators: [',', ';'],\r\n autoEditNewCondition: false,\r\n onConditionRendered: null,\r\n onGetConditionRenderer: null,\r\n onGetExpressionRenderer: null,\r\n onGetOperatorRenderer: null,\r\n onOperatorRendered: null,\r\n onGetAddRowRenderer: null,\r\n defaultQuery: null,\r\n showIndicatorOnLoad: true\r\n };\r\n\r\n private addRowElement: HTMLDivElement;\r\n private rootContainer: HTMLDivElement;\r\n private progressBlock: HTMLElement;\r\n\r\n private entitiesMenu: PopupMenu;\r\n private conditionMenu: PopupMenu;\r\n private groupMenu: PopupMenu;\r\n private rootGroupMenu: PopupMenu;\r\n private linkTypeMenu: PopupMenu;\r\n\r\n private queryEventCallbackId: string;\r\n\r\n private customQuery: Query = null;\r\n\r\n protected get cssPrefix(): string {\r\n return 'eqjs-qp';\r\n }\r\n\r\n /**\r\n * The default constructor.\r\n * @param slot The html element.\r\n */\r\n constructor(slot: HTMLElement, customQuery?: Query) {\r\n super(slot);\r\n\r\n if (!this.slot.classList.contains(`${this.cssPrefix}-panel`)) {\r\n this.slot.classList.add(`${this.cssPrefix}-panel`);\r\n }\r\n\r\n this.group = WidgetGroup.Query;\r\n\r\n if (customQuery) {\r\n this.customQuery = customQuery;\r\n }\r\n }\r\n\r\n public getWidgetType(): string {\r\n return 'queryPanel';\r\n }\r\n\r\n /**\r\n * Initialize widget.\r\n * @param context The context. \r\n * @param options The options.\r\n */\r\n public init(context: EqContext, options?: QueryPanelOptions) {\r\n super.init(context, options);\r\n\r\n this.setOptions(options);\r\n this.renderProgressBlock();\r\n\r\n //detach previously defined query observer (if any)\r\n this.detachQueryObserver();\r\n this.attachQueryObserver();\r\n\r\n eqDragManager.removeDropContainer(this.slot);\r\n if (this.options.allowDragDrop) {\r\n const model = this.getContext().getModel();\r\n eqDragManager.registerDropContainer({\r\n element: this.slot,\r\n scopes: [\"entityAttr\"],\r\n onDragEnter: (container, ev) => {\r\n \r\n this.slot.classList.add(`${eqCssPrefix}-drophover`);\r\n ev.dragImage.classList.add('eqjs-sortable-helper');\r\n\r\n this.showLandingSlot();\r\n\r\n const attrId: string = ev.data.attrId;\r\n if (!model.checkAttrProperty(attrId, \"useInConditions\")) {\r\n ev.dropEffect = DropEffect.Forbid; \r\n }\r\n },\r\n onDragOver: (container, ev) => {\r\n \r\n },\r\n onDragLeave: (container, ev) => {\r\n \r\n ev.dragImage.classList.remove('eqjs-sortable-helper')\r\n ev.dragImage.style.removeProperty('width');\r\n\r\n this.slot.classList.remove(`${eqCssPrefix}-drophover`);\r\n\r\n this.hideLangindSlot();\r\n\r\n },\r\n onDrop: (container, ev) => {\r\n const query = this.getQuery();\r\n\r\n const descr: SimpleConditionDescriptor = {\r\n parent: query.getRootCondition(),\r\n attributeId: ev.data.attrId\r\n }\r\n \r\n const cond = query.addSimpleCondition(descr);\r\n \r\n if (cond) {\r\n query.fireConditionsChangedEvent(QueryChangeAction.Add, cond);\r\n }\r\n }\r\n });\r\n }\r\n }\r\n\r\n protected destroyCore() {\r\n eqDragManager.removeDropContainer(this.slot);\r\n this.detachQueryObserver();\r\n\r\n this.slot.innerHTML = '';\r\n }\r\n\r\n public getEntitiesMenu(): PopupMenu {\r\n return this.entitiesMenu;\r\n }\r\n\r\n public getConditionMenu(): PopupMenu {\r\n return this.conditionMenu;\r\n }\r\n\r\n public getLinkTypeMenu(): PopupMenu {\r\n return this.linkTypeMenu;\r\n }\r\n\r\n public getConditionGroupMenu(isRoot: boolean = false): PopupMenu {\r\n return isRoot ? this.rootGroupMenu : this.groupMenu;\r\n }\r\n\r\n private attachQueryObserver() {\r\n const query = this.getQuery();\r\n\r\n this.queryEventCallbackId = query.addChangedCallback(event => {\r\n //if something has changed, and that change is related to conditions\r\n const edata = event.data as QueryChangeEventData;\r\n if (!edata || (edata.part != QueryChangePart.Conditions && edata.part != QueryChangePart.All)) {\r\n return;\r\n }\r\n\r\n const focusedBefore = document.activeElement;\r\n const isFocusInside = this.slot.contains(focusedBefore) || focusedBefore == document.body;\r\n\r\n switch (edata.action) {\r\n case QueryChangeAction.Modify: {\r\n const conds = edata.changee as Condition | Condition[];\r\n\r\n const modifyCondition = (cond: Condition, autoEdit: boolean) => {\r\n const el = this.slot.querySelector(`div[data-id=${cond.id}]`);\r\n if (el) {\r\n autoEdit = autoEdit\r\n && ((edata.condPart & ConditionPart.Operator) === ConditionPart.Operator)\r\n && cond.expressions.length > 1\r\n && (cond.expressions[1]._isDefaultValue || cond.expressions[1].value == '' ||\r\n cond.expressions[1].value == null); \r\n\r\n const isActive = el.classList.contains('active');\r\n const renderer = this.getConditionRenderer(cond, el as HTMLDivElement);\r\n if (renderer) {\r\n const newEl = renderer.render(autoEdit);\r\n if (isActive) {\r\n this.toggleConditionPicked(cond);\r\n }\r\n\r\n if (isFocusInside && !autoEdit) {\r\n const focusElem = newEl.querySelector('a') || newEl.querySelector('.eqjs-qp-condition-button');\r\n if (focusElem) {\r\n safeFocus(focusElem);\r\n }\r\n }\r\n \r\n }\r\n }\r\n }\r\n\r\n let autoEdit = this.options.autoEditNewCondition;\r\n if (Array.isArray(conds)) {\r\n conds.forEach((cond) => modifyCondition(cond, autoEdit));\r\n autoEdit = false;\r\n } \r\n else {\r\n modifyCondition(conds, autoEdit);\r\n }\r\n\r\n break;\r\n }\r\n case QueryChangeAction.Add: {\r\n \r\n const conds = edata.changee as Condition | Condition[];\r\n\r\n const addCondition = (cond: Condition) => {\r\n const renderer = this.getConditionRenderer(cond);\r\n if (renderer) {\r\n const parent = cond.getParent();\r\n const parentEl = this.slot.querySelector(`div[data-id=${parent.id}]`);\r\n if (parentEl) {\r\n const newCondContainer = parentEl.lastChild;\r\n if (newCondContainer) {\r\n const el = renderer.render(this.options.autoEditNewCondition);\r\n newCondContainer.appendChild(el);\r\n \r\n el.scrollIntoView(false);\r\n\r\n if (isFocusInside && !this.options.autoEditNewCondition) {\r\n el.querySelector(`a`).focus();\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (Array.isArray(conds)) {\r\n conds.forEach((cond) => addCondition(cond));\r\n } \r\n else {\r\n addCondition(conds);\r\n }\r\n \r\n break;\r\n }\r\n case QueryChangeAction.Delete: {\r\n const conds = edata.changee as Condition | Condition[];\r\n\r\n const deleteCondition = (cond: Condition) => {\r\n const el = this.slot.querySelector(`div[data-id=${cond.id}]`);\r\n\r\n if (el) {\r\n const parent = this.slot.querySelector(`div[data-id=${cond.getParent().id}] > .eqjs-qp-row-group`);;\r\n const next = el.nextSibling;\r\n const prev = el.previousSibling;\r\n\r\n el.parentElement.removeChild(el);\r\n\r\n if (isFocusInside) {\r\n const focusCond = next || prev || parent;\r\n const focusElem =(focusCond as HTMLElement).querySelector('a') || (focusCond as HTMLElement).querySelector('.eqjs-qp-condition-button');\r\n if (focusElem) {\r\n focusElem.focus();\r\n }\r\n }\r\n }\r\n \r\n }\r\n\r\n if (Array.isArray(conds)) {\r\n conds.forEach((cond) => deleteCondition(cond));\r\n } \r\n else {\r\n deleteCondition(conds);\r\n }\r\n\r\n break;\r\n }\r\n\r\n default:\r\n this.refresh();\r\n break;\r\n }\r\n })\r\n }\r\n\r\n private detachQueryObserver() {\r\n if (this.queryEventCallbackId) {\r\n const query = this.getQuery();\r\n query.removeChangedCallback(this.queryEventCallbackId);\r\n }\r\n }\r\n\r\n public getQuery(): Query {\r\n if (this.customQuery) {\r\n return this.customQuery;\r\n }\r\n \r\n return this.context.getQuery();\r\n }\r\n\r\n protected refreshCore() { \r\n this.clear();\r\n this.render();\r\n }\r\n\r\n protected setOptions(options?: QueryPanelOptions) {\r\n dataUtils.assignDeep(this.options, options);\r\n\r\n // dateFormatValue & dateFormatDisplay back compatibility\r\n if (this.options.dateFormatValue) {\r\n i18n.updateLocaleSettings({\r\n editDateFormat: this.options.dateFormatValue\r\n });\r\n }\r\n\r\n if (this.options.dateFormatDisplay) {\r\n i18n.updateLocaleSettings({\r\n shortDateFormat: this.options.dateFormatDisplay\r\n });\r\n }\r\n\r\n if (typeof this.options.editableParts === \"undefined\") {\r\n this.options.editableParts = QPEditablePart.All;\r\n }\r\n\r\n if (browserUtils.isMobileMode()) {\r\n this.options.buttons = this.options.buttons || {}\r\n this.options.buttons.condition = [\"menu\"];\r\n this.options.buttons.group = [\"menu\"];\r\n }\r\n }\r\n\r\n protected clear() {\r\n this.slot.innerHTML = \"\";\r\n }\r\n\r\n protected render() {\r\n try {\r\n this.entitiesMenu = this.createEntitiesMenu();\r\n this.createConditionMenus();\r\n this.createLinkTypeMenu();\r\n\r\n this.rootContainer = domel('div', this.slot)\r\n .toDOM();\r\n\r\n domel(this.slot)\r\n .removeClass(eqCssMobile)\r\n .addClass(browserUtils.getMobileCssClass());\r\n \r\n const query = this.getQuery();\r\n const root = query.getRootCondition();\r\n\r\n const renderer = this.getConditionRenderer(root, this.rootContainer);\r\n if (renderer) {\r\n renderer.render();\r\n }\r\n\r\n if (this.options.showAddRow) {\r\n this.addRowElement = domel('div', this.slot)\r\n .toDOM();\r\n const addrowRenderer = this.getAddRowRenderer(this.addRowElement);\r\n if (addrowRenderer)\r\n addrowRenderer.render();\r\n }\r\n }\r\n catch (err) {\r\n const error = err as any;\r\n this.context.throwError({\r\n action: \"QueryPanel rendering\",\r\n text: error.message,\r\n sourceError: error\r\n });\r\n }\r\n }\r\n\r\n public getConditionRenderer(condition: Condition, slot?: HTMLDivElement): ConditionRenderer | null {\r\n let renderer: ConditionRenderer;\r\n if (this.options.onGetConditionRenderer) {\r\n renderer = this.options.onGetConditionRenderer(condition, slot);\r\n\r\n if (renderer) {\r\n return renderer;\r\n } \r\n }\r\n \r\n switch(condition.tag) {\r\n case CondTag.Simple:\r\n return new SimpleConditionRenderer(this, condition, slot);\r\n case CondTag.Group:\r\n return new ConditionGroupRenderer(this, condition, slot);\r\n } \r\n\r\n return null;\r\n }\r\n\r\n public getExpressionRenderer(expression: Expression, slot?: HTMLDivElement): ExpressionRenderer | null {\r\n if (!expression) {\r\n throw 'Expression is not defined in the condition';\r\n }\r\n\r\n const model = this.getContext().getModel();\r\n const condition = expression.getParent() as Condition;\r\n const operator = model.getOperatorById(condition.getOperatorId());\r\n const attribute = model.getAttributeByIdSafe(condition.expressions[0].value);\r\n const operand = model.getOperand(attribute, operator, expression.getIndex());\r\n\r\n let editor: EqValueEditor;\r\n let tag: EqEditorTag;\r\n\r\n if (operand && operand.editor && operand.editor.tag !== EqEditorTag.Unknown) {\r\n editor = operand.editor;\r\n }\r\n else if (attribute && attribute.defaultEditor) {\r\n editor = attribute.defaultEditor;\r\n }\r\n else {\r\n editor = new EqValueEditor();\r\n }\r\n\r\n tag = editor.tag;\r\n \r\n let exprType = expression.dataType;\r\n if (exprType == DataType.Unknown) {\r\n exprType = attribute.dataType;\r\n }\r\n\r\n if (expression.kind === DataKind.Attribute) {\r\n if (expression.getIndex() === 0) { // Base attribute expression\r\n return new AttributeExpressionRenderer(this, expression, this.entitiesMenu, slot);\r\n }\r\n else {\r\n let attributeMenu = this.createEntitiesMenu((ent: Entity, attr: EntityAttr) => {\r\n\r\n if (attr) {\r\n return attr.useInConditions && attr.dataType === exprType;\r\n }\r\n return true;\r\n });\r\n\r\n return new AttributeExpressionRenderer(this, expression, attributeMenu, slot);\r\n }\r\n }\r\n else if (expression.kind === DataKind.Query) {\r\n tag = EqEditorTag.SubQuery;\r\n }\r\n else if (expression.kind === DataKind.Scalar) {\r\n if (tag == EqEditorTag.Unknown && (expression.dataType === DataType.Date \r\n || expression.dataType === DataType.DateTime || expression.dataType === DataType.Time)) \r\n {\r\n tag = EqEditorTag.DateTime;\r\n }\r\n }\r\n else if (expression.kind == DataKind.ParentColumn) {\r\n tag = EqEditorTag.BindToParentColumn;\r\n }\r\n\r\n if (this.options.onGetExpressionRenderer) {\r\n let renderer = this.options.onGetExpressionRenderer(this, expression, editor, slot);\r\n if (renderer) {\r\n return renderer;\r\n }\r\n }\r\n\r\n switch (tag) {\r\n case EqEditorTag.List:\r\n return new ListExpressionRenderer(this, expression, editor, slot);\r\n case EqEditorTag.SqlList:\r\n return new SqlListExpressionRenderer(this, expression, editor, slot);\r\n case EqEditorTag.CustomList: \r\n return new CustomListExpressionRenderer(this, expression, editor, slot);\r\n case EqEditorTag.DateTime:\r\n return new DateTimeExpressionRenderer(this, expression, editor, slot);\r\n case EqEditorTag.SubQuery:\r\n return new SubQueryExpressionRenderer(this, expression, editor, slot);\r\n //move to ERS later\r\n case EqEditorTag.BindToParentColumn:\r\n return new BindToParentColumnExpressionRenderer(this, expression, editor, slot);\r\n default:\r\n return new InputExpressionRenderer(this, expression, editor, slot);\r\n }\r\n }\r\n\r\n public getOperatorRenderer(condition: Condition, text: string, slot?: HTMLDivElement): BaseElementRenderer | null {\r\n let renderer: BaseElementRenderer;\r\n if (this.options.onGetOperatorRenderer)\r\n renderer = this.options.onGetOperatorRenderer(condition, text, slot);\r\n\r\n if (renderer) \r\n return renderer;\r\n\r\n return new OperatorRenderer(this, condition, text, slot);\r\n }\r\n\r\n public getAddRowRenderer(slot?: HTMLDivElement): BaseElementRenderer | null {\r\n let renderer: BaseElementRenderer;\r\n if (this.options.onGetAddRowRenderer)\r\n renderer = this.options.onGetAddRowRenderer(slot);\r\n\r\n if (renderer) \r\n return renderer;\r\n\r\n return new AddRowRenderer(this, this.entitiesMenu, slot);\r\n }\r\n\r\n private createEntitiesMenu(filterFunc?: (ent: Entity, attr: EntityAttr) => boolean) : PopupMenu {\r\n const model = this.getContext().getModel();\r\n if (!model || model.isEmpty()) return null;\r\n\r\n let menuId = this.slot.id || \"eq-querypanel\";\r\n menuId += '-EntitiesMenu';\r\n\r\n const entitiesList = model.getEntitiesTree({ \r\n addUIC: true, \r\n addUIR: false, \r\n addUIS: false, \r\n attrPlacement: this.options.attrPlacement, \r\n sortEntities: this.options.sortEntities \r\n }, \r\n filterFunc);\r\n\r\n const options: PopupMenuOptions = { \r\n items: entitiesList, \r\n adjustHeight: this.options.adjustEntitiesMenuHeight, \r\n id: menuId, \r\n domWriteItemsId: this.options.domWriteItemsId \r\n }\r\n dataUtils.assign(options, this.options.menuOptions);\r\n return new PopupMenu(options);\r\n }\r\n \r\n\r\n public showEntitiesMenu(options: PopupMenuOptions) {\r\n this.entitiesMenu.showMenu(options);\r\n }\r\n\r\n private createConditionMenus() {\r\n //ConditionMenu\r\n {\r\n const query = this.getQuery();\r\n\r\n let menuId = this.slot.id || \"eq-querypanel\";\r\n menuId += '-ConditionMenu';\r\n\r\n const items = [\r\n {\r\n id: \"enable\",\r\n text:i18n.getText('MenuEnable')\r\n },\r\n {\r\n id: \"delete\",\r\n text: i18n.getText('CmdDelete')\r\n }\r\n ];\r\n\r\n if (query.isEx()) {\r\n if ( this.options.allowParameterization || this.options.allowInJoinConditions) {\r\n items.push({ id: \"delimiter\", text: \"---\" });\r\n };\r\n\r\n if (this.options.allowParameterization) {\r\n items.push({\r\n id: \"param\",\r\n text: i18n.getText('MenuParameterization')\r\n });\r\n };\r\n\r\n if (this.options.allowInJoinConditions) {\r\n items.push({\r\n id: \"inJoin\",\r\n text: i18n.getText('MenuJoinCond')\r\n });\r\n }; \r\n }\r\n \r\n const options: PopupMenuOptions = { items: items, adjustHeight: this.options.adjustEntitiesMenuHeight, id: menuId, domWriteItemsId: this.options.domWriteItemsId, showSearchBoxAfter: 100, showSelected: true };\r\n dataUtils.assign(options, this.options.menuOptions);\r\n this.conditionMenu = new PopupMenu(options);\r\n }\r\n\r\n //groupMenu\r\n {\r\n let menuId = this.slot.id || \"eq-querypanel\";\r\n menuId += '-GroupMenu';\r\n\r\n const items = [\r\n {\r\n id: \"enable\",\r\n text: i18n.getText('MenuEnable')\r\n },\r\n {\r\n id: \"delete\",\r\n text: i18n.getText('CmdDelete')\r\n },\r\n {\r\n id: \"delimiter\",\r\n text: \"---\"\r\n },\r\n {\r\n id: \"addCondition\",\r\n text: i18n.getText('CmdAddCondition')\r\n },\r\n {\r\n id: \"addGroup\",\r\n text: i18n.getText('CmdAddCondGroup')\r\n }\r\n ];\r\n \r\n\r\n const options: PopupMenuOptions = { items: items, adjustHeight: this.options.adjustEntitiesMenuHeight, id: menuId, domWriteItemsId: this.options.domWriteItemsId, showSearchBoxAfter: 100, showSelected: true };\r\n dataUtils.assign(options, this.options.menuOptions);\r\n this.groupMenu = new PopupMenu(options);\r\n }\r\n\r\n //rootGroupMenu\r\n {\r\n let menuId = this.slot.id || \"eq-querypanel\";\r\n menuId += '-RootGroupMenu';\r\n \r\n const items = [\r\n {\r\n id: \"addCondition\",\r\n text: i18n.getText('CmdAddCondition')\r\n },\r\n {\r\n id: \"addGroup\",\r\n text: i18n.getText('CmdAddCondGroup')\r\n }\r\n ];\r\n\r\n const options: PopupMenuOptions = { items: items, adjustHeight: this.options.adjustEntitiesMenuHeight, id: menuId, domWriteItemsId: this.options.domWriteItemsId, showSearchBoxAfter: 100, showSelected: true };\r\n dataUtils.assign(options, this.options.menuOptions);\r\n this.rootGroupMenu = new PopupMenu(options);\r\n }\r\n\r\n }\r\n\r\n private createLinkTypeMenu() {\r\n let menuId = this.slot.id;\r\n if (menuId) {\r\n menuId += '-LinkTypeMenu';\r\n }\r\n\r\n const typeList = eqconsts.predicateLinkTypeList;\r\n const itemList = typeList.map((item: eqconsts.ConstValue) => {\r\n return {\r\n id: item.id,\r\n text: i18n.getText(item.key)\r\n }\r\n })\r\n\r\n const options: PopupMenuOptions = { items: itemList, adjustHeight: this.options.adjustEntitiesMenuHeight, id: menuId, domWriteItemsId: this.options.domWriteItemsId }\r\n dataUtils.assign(options, this.options.menuOptions);\r\n this.linkTypeMenu = new PopupMenu(options);\r\n }\r\n\r\n public toggleConditionPicked(condition: Condition, force: boolean = undefined) {\r\n let el: HTMLElement;\r\n let isActive: boolean;\r\n if (condition) {\r\n el = this.slot.querySelector(`div[data-id=${condition.id}][data-condrow], div[data-id=${condition.id}] > div[data-group-row]`);\r\n if (el) {\r\n isActive = el.classList.contains('active');\r\n }\r\n }\r\n\r\n //clear 'active' in all rows\r\n const rows = this.slot.querySelectorAll(`.${this.cssPrefix}-row`);\r\n for(let i = 0; i < rows.length; i++) {\r\n const row = rows[i] as HTMLElement;\r\n if (row.hasAttribute('data-group-row')) {\r\n if (!this.options.alwaysShowButtonsInGroups) {\r\n domel(row)\r\n .data(\"show-buttons\", null)\r\n }\r\n } else {\r\n if (!this.options.alwaysShowButtonsInConditions) {\r\n domel(row)\r\n .data(\"show-buttons\", null)\r\n }\r\n }\r\n\r\n domel(row)\r\n .removeClass('active');\r\n }\r\n\r\n if (el && !isActive) {\r\n domel(el)\r\n .addClass('active')\r\n .data(\"show-buttons\", \"\")\r\n }\r\n }\r\n\r\n \r\n private landingSlot: HTMLDivElement \r\n = domel('div')\r\n .addClass(`${this.cssPrefix}-cond-landing-slot`)\r\n .addChildElement(\r\n domel('div')\r\n .toDOM())\r\n .toDOM();\r\n\r\n private showLandingSlot() {\r\n const container = this.slot.querySelector('.eqjs-qp-conditions-root');\r\n if (container) {\r\n container.appendChild(this.landingSlot);\r\n this.landingSlot.scrollIntoView({block: \"center\", behavior: \"smooth\"});\r\n }\r\n }\r\n\r\n private hideLangindSlot() {\r\n if (this.landingSlot.parentElement) {\r\n this.landingSlot.parentElement.removeChild(this.landingSlot);\r\n }\r\n }\r\n\r\n protected onProcessStartCore() {\r\n if (this.options.showIndicatorOnLoad) {\r\n if (!this.progressBlock.parentNode)\r\n this.slot.appendChild(this.progressBlock);\r\n }\r\n }\r\n\r\n protected onProcessEndCore() {\r\n if (this.options.showIndicatorOnLoad) {\r\n if (this.progressBlock.parentNode)\r\n this.slot.removeChild(this.progressBlock);\r\n }\r\n } \r\n\r\n private renderProgressBlock() {\r\n this.progressBlock = document.createElement('div');\r\n this.progressBlock.classList.add(`${eqCssPrefix}-progress-win8`);\r\n this.progressBlock.classList.add(browserUtils.getMobileCssClass());\r\n this.progressBlock.innerHTML = '<div class=\"wBall\" id=\"wBall_1\"><div class=\"wInnerBall\"></div></div><div class=\"wBall\" id=\"wBall_2\"><div class=\"wInnerBall\"></div></div><div class=\"wBall\" id=\"wBall_3\"><div class=\"wInnerBall\"></div></div><div class=\"wBall\" id=\"wBall_4\"><div class=\"wInnerBall\"></div></div><div class=\"wBall\" id=\"wBall_5\"><div class=\"wInnerBall\"></div></div>';\r\n } \r\n}\r\n\r\n","import { i18n } from '@easydata/core';\r\nimport { utils as dataUtils } from '@easydata/core';\r\n\r\nimport {\r\n Widget, WidgetGroup,\r\n EqContext, QueryChangeAction, \r\n SimpleConditionDescriptor\r\n} from '@easyquery/core';\r\n\r\nimport { slideUp, slideDown, domel } from '@easydata/ui';\r\n\r\nimport { QueryPanel } from './query_panel';\r\nimport { FilterBarOptions } from './widget_options';\r\nimport { browserUtils } from '../utils/browser_utils';\r\n\r\nexport class FilterBar extends Widget {\r\n \r\n private qpBlock: HTMLElement;\r\n private qpElement: HTMLElement;\r\n\r\n private buttonsBlock: HTMLElement;\r\n\r\n private headerElement: HTMLDivElement;\r\n private headerIconElement: HTMLDivElement;\r\n private headerTextBlock: HTMLDivElement;\r\n private headerTextElement: HTMLDivElement;\r\n\r\n private headerArrowBlock: HTMLDivElement;\r\n private headerArrowElement: HTMLDivElement;\r\n\r\n private headerLinkElement: HTMLDivElement;\r\n\r\n private queryPanel: QueryPanel;\r\n\r\n private queryEventCallbackId: string; \r\n\r\n private options: FilterBarOptions = {\r\n applyOnClose: true,\r\n showApplyButton: true,\r\n showClearButton: true,\r\n queryPanel: {\r\n showAddRow: true,\r\n showCheckboxes: true,\r\n alwaysShowButtonsInGroups: true\r\n }\r\n }\r\n\r\n constructor (slot: HTMLElement) {\r\n super(slot);\r\n\r\n this.group = WidgetGroup.Query;\r\n }\r\n\r\n public getWidgetType(): string {\r\n return 'filterBar';\r\n }\r\n\r\n protected get cssPrefix(): string {\r\n return 'eqjs-fb';\r\n }\r\n\r\n public init(context: EqContext, options?: FilterBarOptions) {\r\n\r\n super.init(context, options);\r\n\r\n this.setOptions(options);\r\n \r\n this.destroyCore();\r\n\r\n this.qpElement = domel('div')\r\n .addClass(`${this.cssPrefix}-querypanel`)\r\n .toDOM();\r\n\r\n this.queryPanel = new QueryPanel(this.qpElement);\r\n this.queryPanel.init(context, this.options.queryPanel || {});\r\n\r\n this.attachQueryObserver();\r\n }\r\n\r\n private setOptions(options?: FilterBarOptions) {\r\n this.options = dataUtils.assignDeep(this.options, options);\r\n }\r\n\r\n private applyBtnClick(ev: Event) {\r\n this.applyFilter();\r\n }\r\n\r\n private clearBtnClick(ev: Event) {\r\n this.clearFilter();\r\n }\r\n\r\n private showQueryPanel(callback?: () => void) {\r\n slideDown(this.qpBlock, 200, () => {\r\n this.updateHeader();\r\n\r\n if (callback)\r\n callback();\r\n });\r\n }\r\n\r\n private hideQueryPanel() {\r\n slideUp(this.qpBlock, 200, () => {\r\n this.updateHeader();\r\n\r\n if (this.options.applyOnClose) {\r\n this.applyFilter();\r\n }\r\n });\r\n }\r\n\r\n private headerClickHandler(ev: Event) {\r\n ev.preventDefault();\r\n\r\n if (domel(this.qpBlock).isVisible()) { // close query panel\r\n this.hideQueryPanel();\r\n }\r\n else { //open query panel\r\n this.showQueryPanel();\r\n }\r\n }\r\n\r\n private updateHeader() {\r\n if (!this.headerTextElement)\r\n return;\r\n\r\n let text = '';\r\n\r\n const query = this.getContext().getQuery();\r\n if (query) {\r\n text = query.getConditionsText();\r\n }\r\n \r\n if (text == '') {\r\n text = i18n.getText('StrNoFilterDefined');\r\n }\r\n\r\n domel(this.headerTextElement)\r\n .text(text)\r\n .attr('title', text);\r\n\r\n if (!query || query.isEmptyConditions()) { //empty query, don't show query panel and arrow, show link in header\r\n domel(this.headerTextElement).hide();\r\n domel(this.headerLinkElement).show();\r\n if (!domel(this.qpBlock).isVisible()) {\r\n domel(this.headerArrowBlock).hide();\r\n this.headerElement.style.cursor = '';\r\n this.headerElement.removeEventListener('click', this.headerClickListener);\r\n }\r\n }\r\n else {\r\n this.headerElement.style.cursor = 'pointer';\r\n this.headerElement.removeEventListener('click', this.headerClickListener);\r\n this.headerElement.addEventListener('click', this.headerClickListener);\r\n\r\n domel(this.headerTextElement).show();\r\n domel(this.headerLinkElement).hide();\r\n domel(this.headerArrowBlock).show();\r\n }\r\n\r\n if (domel(this.qpBlock).isVisible()) { // close query panel\r\n this.headerArrowElement.classList.add(`${this.cssPrefix}-header-arrowUp`);\r\n }\r\n else {\r\n this.headerArrowElement.classList.remove(`${this.cssPrefix}-header-arrowUp`);\r\n }\r\n\r\n this.textResize();\r\n\r\n }\r\n\r\n private headerClickListener = this.headerClickHandler.bind(this);\r\n\r\n private render() {\r\n domel(this.slot)\r\n .addClass(`${this.cssPrefix}-container`)\r\n .addClass(browserUtils.getMobileCssClass())\r\n .addChild('div', builder => this.headerElement = builder\r\n .addClass(`${this.cssPrefix}-header`)\r\n .addChild('div', builder => this.headerIconElement = builder\r\n .addClass(`${this.cssPrefix}-header-icon`)\r\n .toDOM()\r\n )\r\n .addChild('div', builder => this.headerTextBlock = builder\r\n .addClass(`${this.cssPrefix}-header-textblock`)\r\n .addChild('div', builder => this.headerTextElement = builder\r\n .addClass(`${this.cssPrefix}-header-text`)\r\n .toDOM()\r\n )\r\n .addChild('div', builder => this.headerLinkElement = builder\r\n .addClass(`${this.cssPrefix}-header-text ${this.cssPrefix}-header-link`)\r\n .text(i18n.getText('StrNoFilterClickToAdd'))\r\n .hide()\r\n .on('click', () => {\r\n this.queryPanel.showEntitiesMenu({\r\n anchor: this.headerLinkElement,\r\n selectedIds: null,\r\n itemSelectedCallback: (item, items) => {\r\n const attrid = item.id;\r\n \r\n this.showQueryPanel(() => {\r\n const query = this.getContext().getQuery();\r\n\r\n const descr: SimpleConditionDescriptor = {\r\n parent: query.getRootCondition(),\r\n attributeId: attrid\r\n }\r\n \r\n const cond = query.addSimpleCondition(descr);\r\n \r\n if (cond) {\r\n query.fireConditionsChangedEvent(QueryChangeAction.Add, cond);\r\n }\r\n });\r\n }\r\n });\r\n })\r\n .toDOM()\r\n )\r\n .toDOM()\r\n )\r\n .addChild('div', builder => this.headerArrowBlock = builder\r\n .addClass(`${this.cssPrefix}-header-arrowblock`)\r\n .addChild('div', builder => this.headerArrowElement = builder\r\n .addClass(`${this.cssPrefix}-header-arrow`)\r\n .toDOM()\r\n )\r\n .toDOM()\r\n )\r\n .toDOM()\r\n )\r\n .addChild('div', builder => this.qpBlock = builder \r\n .addClass(`${this.cssPrefix}-querypanelblock`)\r\n .addClass(browserUtils.getMobileCssClass())\r\n .hide()\r\n .addChildElement(this.qpElement)\r\n .toDOM()\r\n )\r\n \r\n if (this.options.showApplyButton || this.options.showClearButton) {\r\n this.buttonsBlock = domel('div', this.qpBlock) \r\n .addClass(`${this.cssPrefix}-buttonsblock`)\r\n .addClass(browserUtils.getMobileCssClass())\r\n .toDOM();\r\n }\r\n\r\n if (this.options.showApplyButton) {\r\n domel('a', this.buttonsBlock)\r\n .attr('href', 'javascript:void(0)')\r\n .addClass(`${this.cssPrefix}-button ${this.cssPrefix}-button-apply`)\r\n .text(i18n.getText('ButtonApply'))\r\n .on('click', this.applyBtnClick.bind(this))\r\n }\r\n\r\n if (this.options.showClearButton) {\r\n domel('a', this.buttonsBlock)\r\n .attr('href', 'javascript:void(0)')\r\n .addClass(`${this.cssPrefix}-button ${this.cssPrefix}-button-clear`)\r\n .text(i18n.getText('CmdClear'))\r\n .on('click', this.clearBtnClick.bind(this))\r\n }\r\n \r\n\r\n window.addEventListener('resize', () => {\r\n this.textResize();\r\n })\r\n\r\n this.updateHeader();\r\n this.queryPanel.refresh();\r\n\r\n setTimeout(() => this.textResize(), 500); \r\n }\r\n\r\n protected refreshCore() {\r\n this.clear();\r\n this.render();\r\n }\r\n\r\n private clear() {\r\n this.slot.innerHTML = \"\";\r\n }\r\n\r\n public applyFilter() {\r\n if (this.options.applyFilterCallback) {\r\n this.options.applyFilterCallback();\r\n }\r\n }\r\n\r\n public clearFilter() {\r\n const query = this.getContext().getQuery();\r\n if (query) {\r\n query.clearConditions();\r\n query.fireConditionsChangedEvent(QueryChangeAction.All);\r\n }\r\n }\r\n\r\n public textResize() {\r\n this.headerTextBlock.style.width = (this.slot.clientWidth - this.headerIconElement.offsetWidth \r\n - (domel(this.headerArrowBlock).isVisible() ? this.headerArrowBlock.offsetWidth : 0)) + \"px\";\r\n }\r\n\r\n protected destroyCore() {\r\n\r\n if (this.queryPanel)\r\n this.queryPanel.destroy();\r\n\r\n this.detachQueryObserver();\r\n\r\n this.slot.innerHTML = '';\r\n } \r\n\r\n private attachQueryObserver() {\r\n const query = this.getContext().getQuery();\r\n\r\n this.queryEventCallbackId = query.addChangedCallback(event => {\r\n this.updateHeader();\r\n })\r\n }\r\n\r\n private detachQueryObserver() {\r\n const query = this.getContext().getQuery();\r\n if (query)\r\n query.removeChangedCallback(this.queryEventCallbackId);\r\n }\r\n}","import { EqContext, Widget, WidgetGroup } from \"@easyquery/core\";\r\n\r\n/**\r\n * The widget responsed for rendering html content\r\n */\r\nexport class HtmlContentWidget extends Widget {\r\n\r\n /**\r\n * The html element\r\n */\r\n protected contentElement: HTMLElement;\r\n\r\n /**\r\n * The default constructor.\r\n * @param slot The html element.\r\n */\r\n constructor(slot: HTMLElement) {\r\n super(slot);\r\n\r\n this.contentElement = slot;\r\n this.group = WidgetGroup.Result;\r\n }\r\n\r\n public getWidgetType(): string {\r\n return 'htmlContent';\r\n }\r\n\r\n /**\r\n * Initialize widget.\r\n * @param context The context.\r\n * @param options The options.\r\n */\r\n public init(context: EqContext, options?: any) {\r\n super.init(context, options);\r\n }\r\n\r\n /**\r\n * Refresh widget implementation\r\n */\r\n protected refreshCore() {\r\n\r\n this.clear();\r\n\r\n if (!this.context.resultContent)\r\n return;\r\n\r\n this.render();\r\n }\r\n\r\n /**\r\n * Renders widget\r\n */\r\n protected render() {\r\n if (this.context.resultContent) {\r\n this.contentElement.innerHTML += this.context.resultContent;\r\n }\r\n\r\n }\r\n\r\n /**\r\n * Clears content.\r\n */\r\n protected clear() {\r\n this.contentElement.innerHTML = \"\";\r\n }\r\n\r\n protected destroyCore() {\r\n this.clear();\r\n }\r\n\r\n}","import { utils as dataUtils } from '@easydata/core';\r\nimport { EqContext, WidgetGroup } from '@easyquery/core';\r\n\r\nimport { HtmlContentWidget } from './html_content_widget';\r\n\r\n/**\r\n * The widget responsed for rendering html grid.\r\n */\r\nexport class EqHtmlGrid extends HtmlContentWidget {\r\n \r\n /** pageTtem css class */\r\n protected pageItemCssClass: string;\r\n\r\n protected options: any = {\r\n maxButtonCount: 10,\r\n useBootstrap: false\r\n }\r\n\r\n /**\r\n * The default constructor.\r\n * @param slot The html element.\r\n */\r\n constructor(slot: HTMLElement) {\r\n super(slot);\r\n }\r\n \r\n public getWidgetType(): string {\r\n return 'eqHtmlGrid';\r\n }\r\n\r\n /**\r\n * Initialize widget.\r\n * @param context The context.\r\n * @param options The options.\r\n */\r\n public init(context: EqContext, options?: any){\r\n super.init(context, options);\r\n\r\n this.setOptions(options);\r\n }\r\n\r\n \r\n private setOptions(options?: any) {\r\n dataUtils.assignDeep(this.options, options);\r\n }\r\n\r\n /**\r\n * Refresh widget implementation\r\n */\r\n protected refreshCore() {\r\n super.refreshCore();\r\n\r\n this.renderPageNavigator();\r\n }\r\n\r\n protected destroyCore() {\r\n this.slot.innerHTML = '';\r\n }\r\n\r\n /**\r\n * Renders page navigator.\r\n */\r\n protected renderPageNavigator() {\r\n\r\n const pageNavigatorPlaceholder = document.getElementById(\"PageNavigator\");\r\n if (!pageNavigatorPlaceholder) {\r\n return;\r\n }\r\n \r\n const pageCount = parseInt(pageNavigatorPlaceholder.getAttribute('data-pagecount'));\r\n const pageIndex = parseInt(pageNavigatorPlaceholder.getAttribute('data-pageindex'));\r\n \r\n if (pageCount > 1) {\r\n \r\n let buttonClick = (ev: MouseEvent) => {\r\n let element = ev.target as HTMLElement;\r\n \r\n if (element.hasAttribute('data-page')) {\r\n const pageNum = parseInt(element.getAttribute('data-page'));\r\n \r\n this.context.fetchDataChunk({\r\n chunk: {\r\n page: pageNum\r\n },\r\n success: () => {\r\n this.context.refreshWidgets(WidgetGroup.Result);\r\n }\r\n });\r\n } \r\n };\r\n \r\n const maxButtonCount = this.options.maxButtonCount || 10;\r\n const zeroBasedIndex = pageIndex - 1;\r\n let firstPageIndex = zeroBasedIndex - (zeroBasedIndex % maxButtonCount) + 1;\r\n let lastPageIndex = firstPageIndex + maxButtonCount - 1;\r\n if (lastPageIndex > pageCount) {\r\n lastPageIndex = pageCount;\r\n }\r\n \r\n let ul = document.createElement('ul');\r\n if (this.options.useBootstrap) {\r\n ul.className = \"pagination\";\r\n }\r\n else {\r\n ul.className = \"eqv-pagination\";\r\n }\r\n if (this.options.pageItemCssClass) {\r\n ul.className += \" \" + (this.options.pageItemCssClass);\r\n }\r\n \r\n let li = document.createElement('li');\r\n if (this.options.useBootstrap) {\r\n li.className = \"page-item\";\r\n }\r\n \r\n let a:HTMLElement = document.createElement('span');\r\n a.setAttribute(\"aria-hidden\", 'true');\r\n \r\n if (this.options.useBootstrap) {\r\n a.className = \"page-link\";\r\n }\r\n \r\n if (firstPageIndex == 1) {\r\n li.className += \" disabled\";\r\n }\r\n else {\r\n if (this.options.useBootstrap) {\r\n a = document.createElement('a');\r\n a.setAttribute('href', 'javascript:void(0)');\r\n a.setAttribute(\"data-page\", `${firstPageIndex - 1}`);\r\n a.className = \"page-link\";\r\n } \r\n else {\r\n let newA = document.createElement('a');\r\n newA.setAttribute('href', 'javascript:void(0)');\r\n newA.setAttribute(\"data-page\", `${firstPageIndex - 1}`);\r\n a = newA; \r\n }\r\n a.addEventListener(\"click\", buttonClick);\r\n }\r\n a.innerHTML = \"«\";\r\n \r\n li.appendChild(a);\r\n ul.appendChild(li);\r\n \r\n for (let i = firstPageIndex; i <= lastPageIndex; i++) {\r\n li = document.createElement('li');\r\n if (this.options.useBootstrap) {\r\n li.className = \"page-item\";\r\n }\r\n if (i == pageIndex)\r\n li.className += \" active\";\r\n \r\n a = document.createElement('a');\r\n a.setAttribute('href', 'javascript:void(0)');\r\n a.innerHTML = i.toString();\r\n a.setAttribute('data-page', i.toString());\r\n a.className = \"page-link\";\r\n \r\n a.addEventListener(\"click\", buttonClick);\r\n li.appendChild(a);\r\n ul.appendChild(li);\r\n }\r\n \r\n li = document.createElement('li');\r\n if (this.options.useBootstrap) {\r\n li.className = \"page-item\";\r\n }\r\n a = document.createElement(\"span\");\r\n a.setAttribute('aria-hidden', 'true');\r\n \r\n if (this.options.useBootstrap) {\r\n a.className = \"page-link\";\r\n }\r\n if (lastPageIndex == pageCount) {\r\n li.className += \"disabled\";\r\n }\r\n else {\r\n if (this.options.useBootstrap) {\r\n a = document.createElement('a');\r\n a.setAttribute('href', 'javascript:void(0)');\r\n a.setAttribute(\"data-page\", `${lastPageIndex + 1}`);\r\n a.className += \" page-link\";\r\n } else {\r\n let newA = document.createElement('a');\r\n newA.setAttribute('href', 'javascript:void(0)');\r\n newA.setAttribute(\"data-page\", `${lastPageIndex + 1}`);\r\n a = newA; \r\n }\r\n a.addEventListener(\"click\", buttonClick);\r\n }\r\n a.innerHTML = \"»\";\r\n \r\n li.appendChild(a);\r\n ul.appendChild(li);\r\n \r\n pageNavigatorPlaceholder.appendChild(ul);\r\n }\r\n \r\n }\r\n\r\n}","import { utils as dataUtils } from '@easydata/core';\r\nimport { GridOptions } from './widget_options'\r\nimport { Widget, EqContext, WidgetGroup } from '@easyquery/core';\r\n\r\n/**\r\n * Base class for GRID.\r\n */\r\nexport class Grid extends Widget {\r\n\r\n /** The html element. */\r\n protected slot: HTMLElement;\r\n\r\n protected options: GridOptions = {\r\n useCustomLocaleSettings: false\r\n }\r\n\r\n /**\r\n * The default constructor.\r\n * @param slot The html element.\r\n */\r\n constructor(slot: HTMLElement) {\r\n super(slot);\r\n\r\n this.slot = slot;\r\n this.group = WidgetGroup.Result;\r\n }\r\n\r\n public getWidgetType(): string {\r\n return 'grid';\r\n }\r\n\r\n /**\r\n * Initialize widget.\r\n * @param context The context.\r\n * @param options The options.\r\n */\r\n public init(context: EqContext, options?: GridOptions){\r\n super.init(context, options);\r\n\r\n if (options) {\r\n dataUtils.assignDeep(this.options, options);\r\n }\r\n }\r\n \r\n /**\r\n * Refresh widget implementation\r\n */\r\n protected refreshCore() {\r\n\r\n this.clear();\r\n\r\n if (!this.context.resultTable) {\r\n return;\r\n }\r\n\r\n this.render();\r\n }\r\n\r\n\r\n /**\r\n * Renders widget\r\n */\r\n protected render() {\r\n\r\n if (this.options.beforeTableRendering) {\r\n this.options.beforeTableRendering(this.context.resultTable);\r\n } \r\n\r\n this.applyDisplayFormats();\r\n }\r\n\r\n protected applyDisplayFormats() {\r\n }\r\n\r\n /**\r\n * Clears GRID.\r\n */\r\n protected clear() {\r\n this.slot.innerHTML = \"\";\r\n }\r\n}","import { \r\n WidgetGroup, EqContext, \r\n Query, DataModel, QueryColumn, \r\n QueryChangeAction, ExprTag, QueryChangePart, \r\n SortDirection, EntityAttr, QueryChangeEventData \r\n} from '@easyquery/core';\r\nimport { utils as dataUtils } from '@easydata/core';\r\n\r\nimport { \r\n EasyGrid, AddColumnClickEvent, \r\n ColumnMovedEvent,\r\n EasyGridOptions\r\n} from '@easydata/ui';\r\n\r\nimport { Grid } from './grid';\r\nimport { PopupMenuOptions, PopupMenu } from '../utils/popup_menu';\r\n\r\nexport class EasyGridWidget extends Grid {\r\n\r\n private grid: EasyGrid;\r\n\r\n private entitiesMenu: PopupMenu;\r\n\r\n private queryEventCallbackId: string;\r\n\r\n private hasCustomTotalsSettings = false;\r\n\r\n //!!!! DO NOT forget to add types for options\r\n protected options: any = { autoRefresh: true };\r\n\r\n /**\r\n * The default constructor.\r\n * @param slot The html element.\r\n */\r\n constructor(slot: HTMLElement) {\r\n super(slot);\r\n\r\n this.group = WidgetGroup.Result;\r\n }\r\n\r\n public getWidgetType(): string {\r\n return 'easyGrid';\r\n }\r\n\r\n /**\r\n * Initialize widget.\r\n * @param context The context.\r\n * @param options The options.\r\n */\r\n public init(context: EqContext, options?: any) {\r\n super.init(context, options);\r\n\r\n const gridOptions: EasyGridOptions = {\r\n ...options,\r\n slot: this.slot,\r\n dataTable: context.resultTable\r\n };\r\n\r\n this.options = dataUtils.assign(this.options, options);\r\n \r\n gridOptions.onPlusButtonClick = (ev) => this.addColumnClickHandler(ev);\r\n gridOptions.onColumnMoved = (ev) => this.columnMovedHandler(ev);\r\n\r\n if (gridOptions.aggregates) {\r\n this.hasCustomTotalsSettings = true;\r\n }\r\n else {\r\n gridOptions.aggregates = { settings: context.getQuery().getAggregationSettings(), calculator: null }\r\n }\r\n\r\n gridOptions.aggregates.calculator = this.context.getServices()\r\n .getAggregatesCalculator();\r\n \r\n\r\n this.destroy();\r\n\r\n this.grid = new EasyGrid(gridOptions);\r\n \r\n if (this.options.autoRefresh) {\r\n this.attachQueryObserver();\r\n }\r\n }\r\n\r\n protected refreshCore() {\r\n this.clear();\r\n this.updateTotalsSettings();\r\n this.render();\r\n }\r\n\r\n protected render() {\r\n this.createEntitiesMenu();\r\n this.grid.refresh();\r\n }\r\n\r\n protected attachQueryObserver() {\r\n }\r\n\r\n protected destroyCore() {\r\n this.detachQueryObserver();\r\n if (this.grid)\r\n this.grid.destroy();\r\n \r\n this.slot.innerHTML = '';\r\n }\r\n\r\n private detachQueryObserver() {\r\n if (this.queryEventCallbackId) {\r\n const query = this.getContext().getQuery();\r\n query.removeChangedCallback(this.queryEventCallbackId);\r\n }\r\n }\r\n\r\n protected updateTotalsSettings() {\r\n const context = this.getContext();\r\n if (!this.hasCustomTotalsSettings) {\r\n const settings = context.getQuery().getAggregationSettings();\r\n this.grid.options.aggregates.settings = settings;\r\n }\r\n }\r\n\r\n protected createEntitiesMenu() {\r\n const model = this.getContext().getModel();\r\n if (!model || model.isEmpty()) return;\r\n\r\n let menuId = this.slot.id;\r\n if (menuId) {\r\n menuId += '-EntitiesMenu';\r\n }\r\n\r\n const entitiesList = model.getEntitiesTree({ addUIC: false, addUIR: true, addUIS: false });\r\n const options: PopupMenuOptions = { items: entitiesList, id: menuId }\r\n dataUtils.assign(options, (this.options as any).menuOptions);\r\n this.entitiesMenu = new PopupMenu(options);\r\n }\r\n\r\n public getModel(): DataModel {\r\n return this.context.getModel();\r\n }\r\n\r\n public getQuery(): Query {\r\n return this.context.getQuery();\r\n }\r\n\r\n public clear() {\r\n if (this.grid)\r\n this.grid.clear();\r\n }\r\n \r\n protected addColumnClickHandler(ev: AddColumnClickEvent) {\r\n this.entitiesMenu.showMenu({\r\n anchor: ev.sourceEvent.target as HTMLElement, \r\n selectedIds: null, \r\n itemSelectedCallback: (data, items) => {\r\n const attrid = data.id;\r\n this.addNewColumn(attrid);\r\n return false;\r\n }\r\n });\r\n }\r\n\r\n protected columnMovedHandler(ev: ColumnMovedEvent) {\r\n const query = this.getQuery();\r\n const oldIndex = dataUtils.findItemIndexById(query.getColumns(), ev.columnId);\r\n if (oldIndex >= 0) {\r\n query.moveColumn(oldIndex, ev.newIndex);\r\n query.fireChangedEvent({\r\n part: QueryChangePart.Columns,\r\n action: QueryChangeAction.All,\r\n source: this\r\n });\r\n }\r\n }\r\n\r\n public addNewColumn(attrId: string): QueryColumn {\r\n const model = this.getContext().getModel();\r\n const query = this.getContext().getQuery();\r\n\r\n const col = query.addColumn({\r\n attributeId: attrId\r\n });\r\n\r\n query.fireChangedEvent({\r\n part: QueryChangePart.Columns,\r\n action: QueryChangeAction.Add,\r\n changee: col,\r\n source: this\r\n });\r\n\r\n return col;\r\n } \r\n} ","import { Widget, WidgetGroup } from '@easyquery/core';\r\n\r\n/**\r\n * The widget responsed for rendering statement.\r\n * It's usually added for demonstration purposes only.\r\n */\r\nexport class StatementPanel extends Widget {\r\n\r\n private panel: HTMLElement;\r\n\r\n /**\r\n * The default constructor.\r\n * @param slot The html element.\r\n */\r\n constructor(slot: HTMLElement) {\r\n super(slot);\r\n\r\n this.panel = slot;\r\n this.group = WidgetGroup.Statement;\r\n\r\n if (this.panel.tagName !== \"TEXTAREA\") {\r\n this.panel.innerHTML = '<div class=\"eqv-sql-panel-result\"></div>';\r\n this.panel = this.panel.querySelector('div') as HTMLElement;\r\n }\r\n }\r\n\r\n \r\n public getWidgetType(): string {\r\n return 'statementPanel';\r\n }\r\n\r\n /**\r\n * Refresh widget implementation\r\n */\r\n protected refreshCore() {\r\n this.clear();\r\n this.render();\r\n }\r\n\r\n private render() {\r\n this.panel.textContent = this.context.resultStatement ? this.context.resultStatement : \"\";\r\n var statementText = this.panel.innerHTML.replace(/\\r\\n/g, \"<br />\").replace(/ /g, \" \");\r\n this.panel.innerHTML = statementText;\r\n }\r\n\r\n protected destroyCore() {\r\n this.clear();\r\n }\r\n\r\n private clear(){\r\n this.panel.innerHTML = \"\";\r\n }\r\n}\r\n","import { Widget, WidgetGroup } from '@easyquery/core'\r\n\r\n/**\r\n * The widget responsed for rendering process bar.\r\n */\r\nexport class ProcessWidget extends Widget {\r\n\r\n private element: HTMLElement;\r\n\r\n /**\r\n * The default constructor.\r\n * @param slot The html element.\r\n */\r\n constructor(slot: HTMLElement) {\r\n super(slot);\r\n\r\n this.element = slot;\r\n this.element.style.display = 'none';\r\n this.group = WidgetGroup.All;\r\n }\r\n\r\n public getWidgetType(): string {\r\n return 'processIndicator';\r\n }\r\n\r\n /**\r\n * On process start implementation\r\n */\r\n protected onProcessStartCore() {\r\n this.element.style.display = '';\r\n }\r\n\r\n /**\r\n * On process end implementation\r\n */\r\n protected onProcessEndCore() {\r\n this.element.style.display = 'none';\r\n }\r\n\r\n}","import { \r\n Widget, WidgetGroup, \r\n EqContext, Query, \r\n DataKind\r\n} from \"@easyquery/core\";\r\nimport { DataType, utils as dataUtils } from '@easydata/core';\r\n\r\nimport { domel } from '@easydata/ui';\r\n\r\nimport { ColumnsBar } from './columns_bar';\r\nimport { QueryPanel } from './query_panel';\r\n\r\nimport { eqCssPrefix } from '../utils/utils';\r\n\r\nexport class ManageDrillDownWidget extends Widget {\r\n\r\n constructor(slot: HTMLElement) {\r\n super(slot);\r\n\r\n this.group = WidgetGroup.None;\r\n }\r\n\r\n public getWidgetType(): string {\r\n return 'manageDrillDown';\r\n }\r\n\r\n protected options: any;\r\n\r\n public init(context: EqContext, options: any) {\r\n super.init(context, options);\r\n\r\n this.options = options;\r\n\r\n this.refresh();\r\n\r\n this.slot.addEventListener('click', this.clickHandler);\r\n }\r\n\r\n\r\n protected destroyCore() {\r\n this.slot.removeEventListener('click', this.clickHandler);\r\n }\r\n\r\n private clickHandler = () => this.openDialog();\r\n\r\n private columnsBar?: ColumnsBar = null;\r\n private queryPanel?: QueryPanel = null;\r\n private ddQuery?: Query = null;\r\n\r\n protected cssPrefix: string = eqCssPrefix;\r\n\r\n protected openDialog() {\r\n const dialogService = this.context.getServices().getDialogService();\r\n const query = this.context.getQuery();\r\n const model = this.context.getModel();\r\n\r\n const dialogBody = domel('div')\r\n .addClass(`${this.cssPrefix}-manage-drilldown`)\r\n .addChildElement(this.renderColumnsBarBlock())\r\n .addChildElement(this.renderQueryPanelBlock())\r\n .toDOM()\r\n\r\n let op = model.addOrUpdateOperator({\r\n id: 'BindToParentColumn',\r\n caption: 'is bound to',\r\n format: '{expr1} [[is bound to]] {expr2}',\r\n paramCount: 2,\r\n kind: DataKind.ParentColumn,\r\n appliedTypes: [DataType.String, DataType.Bool, DataType.Float, DataType.Int32, DataType.Int64, DataType.Word]\r\n });\r\n op.defaultOperand.dataType = DataType.String;\r\n op.defaultOperand.kind = DataKind.ParentColumn;\r\n\r\n model.runThroughEntities(attr => {\r\n const opIdx = attr.operators.indexOf(op.id);\r\n if (opIdx > 0) {\r\n dataUtils.moveArrayItem(attr.operators, opIdx, 0);\r\n }\r\n }, null);\r\n\r\n this.ddQuery = new Query(model, null, {\r\n parent: query,\r\n context: this.context\r\n });\r\n\r\n const dds = this.context.getQuery().getDrillDowns();\r\n if (dds.length) {\r\n const dd = dds[0];\r\n this.ddQuery.loadFromData(dd.toJSONData());\r\n }\r\n\r\n dialogService.open({\r\n title: 'Manage Drill Down',\r\n body: dialogBody,\r\n cancelable: true,\r\n closable: false,\r\n beforeOpen: () => {\r\n\r\n const columnsBarSlot = dialogBody.getElementsByClassName(`${this.cssPrefix}-columnsbar-slot`)[0] as HTMLElement;\r\n this.columnsBar = new ColumnsBar(columnsBarSlot, this.ddQuery);\r\n this.columnsBar.init(this.context, this.options.columnsBar);\r\n \r\n const queryPanelSlot = dialogBody.getElementsByClassName(`${this.cssPrefix}-querypanel-slot`)[0] as HTMLElement;\r\n this.queryPanel = new QueryPanel(queryPanelSlot, this.ddQuery);\r\n this.queryPanel.init(this.context, this.options.queryPanel);\r\n\r\n this.columnsBar.refresh();\r\n this.queryPanel.refresh();\r\n\r\n },\r\n onSubmit: () => {\r\n return this.submitDialog();\r\n },\r\n onDestroy: () => {\r\n this.destroyDialog();\r\n }\r\n });\r\n\r\n }\r\n\r\n protected renderQueryPanelBlock(): HTMLElement {\r\n return domel('div')\r\n .addClass(`${this.cssPrefix}-querypanel-block`)\r\n .addChild('div', b => b\r\n .addClass(`${this.cssPrefix}-querypanel-caption`)\r\n )\r\n .addChild('div', b => b\r\n .addClass(`${this.cssPrefix}-querypanel-slot`)\r\n )\r\n .toDOM();\r\n }\r\n\r\n protected renderColumnsBarBlock(): HTMLElement {\r\n return domel('div')\r\n .addClass(`${this.cssPrefix}-columnsbar-block`)\r\n .addChild('div', b => b\r\n .addClass(`${this.cssPrefix}-columnsbar-caption`)\r\n )\r\n .addChild('div', b => b\r\n .addClass(`${this.cssPrefix}-columnsbar-slot`)\r\n )\r\n .toDOM();\r\n }\r\n\r\n protected submitDialog() {\r\n if (this.ddQuery.tryValidate({\r\n checkExpressions: true\r\n })) {\r\n const dds = this.context.getQuery().getDrillDowns();\r\n if (dds.length) {\r\n dds[0].loadFromData(this.ddQuery.toJSONData());\r\n this.context.getQuery().fireChangedEvent();\r\n }\r\n else {\r\n if (!this.ddQuery.isEmpty()) {\r\n const dd = this.context.getQuery().addDrillDown();\r\n dd.loadFromData(this.ddQuery.toJSONData());\r\n\r\n this.context.getQuery().fireChangedEvent();\r\n }\r\n }\r\n\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n protected destroyDialog() {\r\n\r\n const model = this.context.getModel();\r\n model.removeOperator('BindToParentColumn', true);\r\n \r\n this.ddQuery = null;\r\n\r\n this.columnsBar && this.columnsBar.destroy();\r\n this.columnsBar = null;\r\n\r\n this.queryPanel && this.queryPanel.destroy();\r\n this.queryPanel = null;\r\n }\r\n\r\n}\r\n","import { domel } from '@easydata/ui';\r\n\r\nimport { EqContext, i18n } from '@easyquery/core';\r\n\r\nexport class ExportDialog {\r\n\r\n constructor (protected context: EqContext) {\r\n\r\n }\r\n\r\n private promise:Promise<void> = null;\r\n\r\n show(defFormat: string = null) {\r\n if (!this.promise) {\r\n\r\n const formats = this.context.getExportFormats();\r\n if (formats.length == 0)\r\n throw Error(\"No exporter has been registered.\");\r\n\r\n defFormat = defFormat || formats[0];\r\n\r\n this.promise = new Promise((resolve, reject) => {\r\n const ds = this.context.getServices().getDialogService();\r\n const body = domel('div')\r\n .addClass('kdlg-form-section')\r\n .addChild('div', b => b\r\n .addClass('kfrm-form')\r\n .addChild('div', b => b\r\n .addClass('kfrm-fields col-a-1 label-align-right')\r\n .addChild('label', b => b \r\n .addClass('kdlg-form-label', 'kflex-20')\r\n .attr('for', 'export_format')\r\n .addText(i18n.getText('ExportDlgFmtLabel'))\r\n ) \r\n .addChild('div', b => b\r\n .addClass('kfrm-select')\r\n .addChild('select', b => {\r\n b\r\n .attr('name', 'export_format')\r\n .id('exportFormat');\r\n\r\n for(const format of this.context.getExportFormats()) {\r\n b.addOption({\r\n value: format,\r\n title: i18n.getText(format) || format,\r\n selected: defFormat == format\r\n });\r\n }\r\n \r\n })\r\n ) \r\n )\r\n )\r\n .toDOM();\r\n \r\n ds.open({\r\n title: i18n.getText('ExportDlgTitle'),\r\n body: body,\r\n onSubmit: () => {\r\n const format = (body.querySelector('#exportFormat') as HTMLSelectElement).value;\r\n this.context.exportResult({\r\n format: format,\r\n success: resolve,\r\n error: reject\r\n });\r\n return true;\r\n }\r\n });\r\n });\r\n }\r\n\r\n return this.promise.finally(() => this.promise = null);\r\n }\r\n\r\n}","/** Represents chart types. */\r\nexport enum ChartType {\r\n Column = 3,\r\n\r\n Histogram = 4,\r\n\r\n Bar = 5,\r\n\r\n Combo = 6,\r\n\r\n Area = 7, \r\n\r\n Line = 9,\r\n\r\n Pie = 10, \r\n Polar = 11,\r\n\r\n Doughnut = 12,\r\n Radar = 13,\r\n\r\n SteppedLine = 14,\r\n}","import { EqContext, Query } from '@easyquery/core';\r\nimport { i18n, utils as dataUtils } from '@easydata/core';\r\nimport { Dialog, DialogService, domel } from '@easydata/ui';\r\n\r\nimport { FacetType } from '../types/facet_type';\r\nimport { FacetContainer } from '../widgets/facet_container';\r\n\r\nimport { browserUtils } from '../utils/browser_utils';\r\n\r\nexport abstract class ResultFacet {\r\n\r\n protected settings: any;\r\n\r\n protected slot?: HTMLElement;\r\n\r\n protected contentDiv: HTMLElement;\r\n\r\n private displayMessageDiv: HTMLElement;\r\n\r\n public title: string = i18n.getText('Facets', 'DefaultFacetTitle');\r\n\r\n protected cssPrefix = 'eqjs-facet';\r\n\r\n protected dialogTitle = i18n.getText('Facets', 'DefaultDlgTitle');\r\n \r\n protected options: any = {};\r\n\r\n protected canDisplayFlag = true;\r\n\r\n constructor(\r\n protected container: FacetContainer, \r\n options?: any\r\n )\r\n {\r\n dataUtils.assignDeep(this.options, options);\r\n }\r\n\r\n public init(slot: HTMLElement) {\r\n this.slot = slot;\r\n\r\n this.contentDiv = domel('div', this.slot)\r\n .addClass(`${this.cssPrefix}-content`)\r\n .toDOM();\r\n this.displayMessageDiv = domel('div', this.slot).hide().toDOM();\r\n }\r\n\r\n public abstract getType(): FacetType;\r\n\r\n public showSettingsDialog(): Promise<boolean> {\r\n return new Promise<boolean>((resolve) => {\r\n const ds = this.getDialogService();\r\n const content = this.renderDialogContent();\r\n const dlg = ds.open({\r\n title: this.dialogTitle,\r\n body: content,\r\n cancelable: true,\r\n closable: false,\r\n onSubmit: () => {\r\n const submited = this.submitSettingsDialog();\r\n if (submited) {\r\n resolve(true);\r\n }\r\n return submited;\r\n },\r\n onCancel: () => {\r\n resolve(false);\r\n }\r\n });\r\n\r\n this.afterDialogOpened(dlg);\r\n });\r\n }\r\n\r\n protected afterDialogOpened(dlg: Dialog) {\r\n\r\n }\r\n\r\n protected renderDialogContent(): HTMLElement {\r\n let fieldsContainer;\r\n let b = domel('div')\r\n .addClass('kfrm-form')\r\n .addChild('div', b => fieldsContainer = b\r\n .addClass(`${browserUtils.isIE() \r\n ? 'kfrm-fields-ie col-ie-1-4 label-align-right' \r\n : 'kfrm-fields col-a-1 label-align-right'}`)\r\n .toDOM()\r\n );\r\n \r\n this.renderFormFields(b.toDOM(), fieldsContainer);\r\n return b.toDOM();\r\n }\r\n\r\n protected renderFormFields(form: HTMLElement, fieldsContainer: HTMLElement) {\r\n let cont = fieldsContainer;\r\n if (browserUtils.isIE()) {\r\n cont = domel('div', fieldsContainer)\r\n .addClass('kfrm-field-ie')\r\n .toDOM();\r\n }\r\n\r\n domel(cont)\r\n .addChild('label', b => b \r\n .attr('for', 'tab_name')\r\n .addText(i18n.getText('Facets', 'TabNameLabel'))\r\n ) \r\n .addChild('input', b => b\r\n .id('facetTabName')\r\n .name('tab_name')\r\n .type('text')\r\n .attr('value', this.title)\r\n )\r\n }\r\n\r\n protected submitSettingsDialog(): boolean {\r\n const tabNameInput = document.querySelector<HTMLInputElement>('#facetTabName');\r\n if (tabNameInput.value.length == 0)\r\n return false;\r\n\r\n this.title = tabNameInput.value;\r\n return true;\r\n }\r\n\r\n protected getDialogService(): DialogService {\r\n return this.getContext()\r\n .getServices()\r\n .getDialogService();\r\n }\r\n\r\n protected canDisplay() {\r\n const context = this.getContext();\r\n const resultTable = context.resultTable;\r\n return (resultTable.getCachedCount() == resultTable.getTotal());\r\n }\r\n\r\n protected showErrorMessage(message: string) {\r\n this.displayMessageDiv.innerHTML = message;\r\n this.displayMessageDiv.classList.add(`${this.cssPrefix}-error-message`);\r\n domel(this.displayMessageDiv).show();\r\n }\r\n\r\n protected showUnableDisplayMessage(message?: string) {\r\n const context = this.getContext();\r\n const resultTable = context.resultTable;\r\n\r\n this.displayMessageDiv.innerHTML = message || i18n.getText('Facets', 'ErrNotEnoughData')\r\n .replace('{totalRecs}', `${resultTable.getTotal()}`)\r\n .replace('{cachedRecs}', `${resultTable.getCachedCount()}`)\r\n .replace(/\\[(.*)\\]/g, `<a href='javascript:void(0)' class=\"${this.cssPrefix}-download-all-link\">$1</a>`);\r\n\r\n const link = this.displayMessageDiv.querySelector<HTMLLinkElement>(`a.${this.cssPrefix}-download-all-link`);\r\n if (link) {\r\n link.addEventListener('click', this.downloadAllClickHandler);\r\n }\r\n\r\n domel(this.contentDiv).hide();\r\n domel(this.displayMessageDiv).show();\r\n }\r\n\r\n protected hideUnableDisplayMessage() {\r\n domel(this.displayMessageDiv).hide();\r\n domel(this.contentDiv).show();\r\n }\r\n\r\n private downloadAllClickHandler = () => {\r\n const resultTable = this.getContext().resultTable;\r\n if (!resultTable.elasticChunks) {\r\n const nextChunkStart = resultTable.getCachedRows().length;\r\n const recordsToLoad = resultTable.getTotal() - resultTable.getCachedCount();\r\n\r\n const ds = this.getDialogService();\r\n const dlg = ds.openProgress({\r\n title: i18n.getText('Facets', 'LoadDataDlgTitle'),\r\n content: i18n.getText('Facets', 'LoadDataDlgContent')\r\n .replace('{loadedRecs}', '0')\r\n .replace('{totalRecs}', `${recordsToLoad}`),\r\n onSubmit: () => this.refresh(),\r\n determinated: true\r\n });\r\n\r\n let loadedRecords = 0;\r\n setTimeout(() => {\r\n resultTable.getRows({ offset: nextChunkStart, limit: recordsToLoad})\r\n .then(_ => {\r\n loadedRecords += _.length;\r\n const progress = loadedRecords / recordsToLoad;\r\n dlg.updateContent(i18n.getText('Facets', 'LoadDataDlgContent')\r\n .replace('{loadedRecs}', `${loadedRecords}`)\r\n .replace('{totalRecs}', `${recordsToLoad}`));\r\n dlg.updateProgress(progress);\r\n })\r\n .catch(error => {\r\n dlg.submit();\r\n this.getContext().throwError(error);\r\n });\r\n }, 10)\r\n }\r\n else {\r\n const ds = this.getDialogService();\r\n const dlg = ds.openProgress({\r\n title: i18n.getText('Facets', 'LoadDataDlgTitle'),\r\n onSubmit: () => this.refresh(),\r\n determinated: false\r\n });\r\n \r\n this.loadElasticChunk()\r\n .then(_ => {\r\n dlg.submit();\r\n })\r\n .catch(error => {\r\n dlg.submit();\r\n this.getContext().throwError(error);\r\n });\r\n }\r\n \r\n }\r\n\r\n public abstract getSettings();\r\n\r\n public getContext(): EqContext {\r\n return this.container.getContext();\r\n }\r\n\r\n public getQuery(): Query {\r\n return this.getContext().getQuery();\r\n }\r\n\r\n public saveToData(): any {\r\n return { title: this.title, type: this.getType() };\r\n }\r\n\r\n public loadFromData(data: any) {\r\n if (data) {\r\n this.title = data.title;\r\n }\r\n }\r\n\r\n public refresh() {\r\n this.hideUnableDisplayMessage();\r\n if (this.canDisplay()) {\r\n this.refreshCore();\r\n }\r\n else {\r\n this.showUnableDisplayMessage();\r\n }\r\n }\r\n\r\n protected abstract refreshCore();\r\n\r\n public abstract destroy();\r\n\r\n\r\n private async loadElasticChunk(): Promise<any> {\r\n const resultTable = this.getContext().resultTable;\r\n const nextChunkStart = resultTable.getCachedRows().length;\r\n\r\n //next chunk\r\n return resultTable.getRows({ offset:nextChunkStart, limit: resultTable.chunkSize })\r\n .then(_ => {\r\n return resultTable.totalIsKnown()\r\n ? Promise.resolve() \r\n : this.loadElasticChunk();\r\n });\r\n }\r\n\r\n public onResize() { \r\n }\r\n}","import { Dialog, domel, DomElementBuilder } from '@easydata/ui';\r\n\r\nimport { EasyDataTable, DataColumn, DataType, utils as dataUtils, i18n } from '@easydata/core';\r\nimport { EasyGrid, GridColumn, GridCellRenderer } from '@easydata/ui';\r\n\r\nimport { FacetType } from '../types/facet_type';\r\nimport { ResultFacet } from './result_facet';\r\n\r\nimport { browserUtils } from '../utils/browser_utils';\r\n\r\nenum AggrFunc {\r\n Sum = 'SUM',\r\n Average = 'AVG',\r\n Min = 'MIN',\r\n Max = 'MAX',\r\n Count = 'COUNT'\r\n}\r\n\r\nenum FormFieldType {\r\n ColumnField,\r\n RowField,\r\n CellData\r\n}\r\n\r\ninterface CrossTabOptions {\r\n aggrFunc?: AggrFunc;\r\n rowName?: string;\r\n colName?: string;\r\n fieldName?: string;\r\n totalsCol?: boolean;\r\n totalsRow?: boolean;\r\n}\r\n\r\ninterface AggrFuncOptions {\r\n rowName: string;\r\n colName: string;\r\n fieldName: string;\r\n rowValue: string;\r\n colValue: string;\r\n}\r\n\r\nconst DFMT_REGEX = /{0:(.*?)}/g;\r\n\r\n\r\nexport class PivotTableFacet extends ResultFacet {\r\n\r\n protected grid: EasyGrid;\r\n\r\n public title: string = i18n.getText('Facets', 'Pivot', 'FacetTitle');\r\n\r\n protected dialogTitle = i18n.getText('Facets', 'Pivot', 'DlgTitle');\r\n\r\n protected pivotTable: EasyDataTable = new EasyDataTable();\r\n\r\n protected settings: CrossTabOptions;\r\n\r\n public init(slot: HTMLElement) {\r\n super.init(slot);\r\n\r\n this.options.maxRowCount = this.options.maxRowCount || 500;\r\n this.options.viewportRowsCount = this.options.viewportRowsCount || 50;\r\n\r\n this.grid = new EasyGrid({\r\n slot: this.contentDiv,\r\n dataTable: this.pivotTable,\r\n paging: {\r\n enabled: false,\r\n pageSize: this.options.maxRowCount\r\n },\r\n viewportRowsCount: this.options.viewportRowsCount,\r\n useRowNumeration: false,\r\n showPlusButton: false,\r\n allowDragDrop: false,\r\n onGetCellRenderer: (column: GridColumn, defaultRenderer: GridCellRenderer) => {\r\n if (column.dataColumn) {\r\n if (column.dataColumn.id == \"total\") {\r\n return (value: any, column: GridColumn, cell: HTMLElement, rowEl: HTMLElement) => {\r\n defaultRenderer(value, column, cell, rowEl);\r\n cell.classList.add('pivot-cell-total');\r\n }\r\n }\r\n\r\n if (this.settings.totalsRow) {\r\n const colIndex = this.pivotTable.columns.getIndex(column.dataColumn.id);\r\n const isFirst = colIndex === 0;\r\n if (isFirst) {\r\n return (value: any, column: GridColumn, cell: HTMLElement, rowEl: HTMLElement) => {\r\n const idx = Number.parseInt(rowEl.getAttribute('data-row-idx'));\r\n const isLast = idx === this.pivotTable.getCachedCount() - 1;\r\n if (isLast) {\r\n value = i18n.getText('Facets', 'Pivot', 'TotalGridLabel');\r\n } \r\n defaultRenderer(value, column, cell, rowEl);\r\n }\r\n }\r\n }\r\n \r\n } \r\n }\r\n });\r\n }\r\n\r\n public getType(): FacetType {\r\n return FacetType.PivotTable;\r\n }\r\n\r\n public destroy() {\r\n if (this.grid) {\r\n this.grid.destroy();\r\n }\r\n }\r\n\r\n private createAggrFuncSelectBuilder(aggrFunc?: string): DomElementBuilder<HTMLElement> {\r\n const model = this.getContext().getModel();\r\n const csb = domel('select');\r\n\r\n const aggrfuncs = Object.keys(AggrFunc).map(k => AggrFunc[k]);\r\n for(const aggrfunc of aggrfuncs) {\r\n csb.addChild('option', b => {\r\n b\r\n .attr('value', aggrfunc)\r\n .text(model.getAggrFunctionCaption(aggrfunc));\r\n });\r\n }\r\n\r\n const options = csb.toDOM().querySelectorAll('option');\r\n if (aggrFunc != undefined) {\r\n options.forEach(option => {\r\n if (option.value == aggrFunc) {\r\n option.selected = true;\r\n }\r\n });\r\n }\r\n else {\r\n options[0].selected = true;\r\n }\r\n\r\n return csb;\r\n }\r\n \r\n \r\n private createColumnsSelectBuilder(allowedTypes?: DataType[], colName?: string, formFieldType?: FormFieldType): DomElementBuilder<HTMLElement> { \r\n const dataTable = this.getContextDataTable();\r\n const csb = domel('select');\r\n\r\n let firstNumericColIndex = null;\r\n let optionIndex = 0;\r\n for(let i = 0; i < dataTable.columns.count; i++) {\r\n const column = dataTable.columns.get(i);\r\n\r\n const colLabel = column.label;\r\n const colType = column.type;\r\n const colId = column.id;\r\n\r\n if (allowedTypes && allowedTypes.indexOf(colType) < 0)\r\n continue;\r\n\r\n if (firstNumericColIndex === null && dataUtils.isNumericType(colType)) {\r\n firstNumericColIndex = optionIndex;\r\n }\r\n\r\n csb.addChild('option', b => {\r\n b\r\n .attr('value', colId)\r\n .text(colLabel);\r\n });\r\n optionIndex ++;\r\n }\r\n\r\n const options: HTMLOptionElement[] = Array.from(csb.toDOM().querySelectorAll('option'));\r\n if (options.length > 0) {\r\n if (colName != undefined) {\r\n for(const option of options) {\r\n if (option.value == colName) {\r\n csb.toDOM().value = option.value;\r\n break;\r\n }\r\n }\r\n }\r\n else {\r\n switch (formFieldType) {\r\n case FormFieldType.ColumnField: {\r\n csb.toDOM().value = options[0].value;\r\n break;\r\n }\r\n case FormFieldType.RowField: {\r\n csb.toDOM().value = options.length > 1 ? options[1].value : options[0].value;\r\n break;\r\n }\r\n case FormFieldType.CellData: {\r\n csb.toDOM().value = firstNumericColIndex === null ? options[0].value : options[firstNumericColIndex].value;\r\n break;\r\n }\r\n }\r\n } \r\n }\r\n\r\n return csb;\r\n }\r\n\r\n protected renderFormFields(form: HTMLElement, fieldsContainer: HTMLElement) {\r\n super.renderFormFields(form, fieldsContainer);\r\n\r\n const settings = this.settings || { totalsRow: true, totalsCol: true };\r\n\r\n const colTypes = [DataType.String, DataType.Date, DataType.DateTime, DataType.Int32,\r\n DataType.Int64, DataType.Word, DataType.Byte];\r\n\r\n const fieldTypes = [DataType.String, DataType.Float, DataType.Int32,\r\n DataType.Int64, DataType.Word, DataType.Byte, DataType.Currency];\r\n \r\n\r\n const isIE = browserUtils.isIE();\r\n let current = fieldsContainer;\r\n const horizClass = isIE ? 'kfrm-fields-ie is-horizontal' : 'kfrm-fields is-horizontal';\r\n\r\n const getCurrent = () => {\r\n if (isIE) {\r\n return domel('div', fieldsContainer)\r\n .addClass('kfrm-field-ie')\r\n .toDOM()\r\n }\r\n else {\r\n return fieldsContainer;\r\n }\r\n }\r\n \r\n if (isIE) {\r\n domel(fieldsContainer)\r\n .addChildElement(getCurrent())\r\n }\r\n else {\r\n domel(fieldsContainer)\r\n .addChild('div')\r\n .addChild('div')\r\n }\r\n \r\n current = getCurrent();\r\n domel(current)\r\n .addChild('label', b => b\r\n .attr('for', 'column_field')\r\n .text(i18n.getText('Facets', 'Pivot', 'ColumnFieldSelectorLabel'))\r\n )\r\n .addChild('div', b => b\r\n .addClass(horizClass)\r\n .addChild('div', b => b\r\n .addClass('kfrm-select')\r\n .attr('name', 'column_field')\r\n .addChildElement(\r\n this.createColumnsSelectBuilder(colTypes, settings.colName, FormFieldType.ColumnField)\r\n .id('pivotTableColFieldSelector')\r\n .toDOM()\r\n )\r\n )\r\n .addChild('button', b => b\r\n .addClass('kfrm-button')\r\n .addClass('eqjs-facets-button-swap')\r\n .attr('title', i18n.getText('Facets', 'Pivot', 'SwapBtnTitle'))\r\n .on('click', () => {\r\n const colSelect = document.getElementById('pivotTableColFieldSelector') as HTMLSelectElement;\r\n const rowSelect = document.getElementById('pivotTableRowFieldSelector') as HTMLSelectElement;\r\n const tmp = colSelect.value;\r\n colSelect.value = rowSelect.value;\r\n rowSelect.value = tmp;\r\n })\r\n )\r\n )\r\n \r\n\r\n current = getCurrent();\r\n domel(current)\r\n .addChild('label', b => b\r\n .attr('for', 'row_field')\r\n .text(i18n.getText('Facets', 'Pivot', 'RowFieldSelectorLabel'))\r\n )\r\n .addChild('div', b => b\r\n .addClass('kfrm-select')\r\n .attr('name', 'row_field')\r\n .addChildElement(\r\n this.createColumnsSelectBuilder(colTypes, settings.rowName, FormFieldType.RowField)\r\n .id('pivotTableRowFieldSelector')\r\n .toDOM()\r\n )\r\n )\r\n \r\n current = getCurrent();\r\n domel(current)\r\n .addChild('label', b => b\r\n .attr('for', 'data_function')\r\n .text(i18n.getText('Facets', 'Pivot', 'CellDataSelectorLabel'))\r\n )\r\n .addChild('div', b => b\r\n .addClass(horizClass)\r\n .addChild('div', b => b\r\n .addClass('kfrm-select')\r\n .attr('name', 'data_function')\r\n .addChildElement(\r\n this.createAggrFuncSelectBuilder(settings.aggrFunc)\r\n .id('pivotTableAggrFuncSelector')\r\n .toDOM()\r\n )\r\n )\r\n .addChild('label', b => b.addText('of '))\r\n .addChild('div', b => b\r\n .addClass('kfrm-select')\r\n .attr('name', 'data_column')\r\n .addChildElement(\r\n this.createColumnsSelectBuilder(fieldTypes, settings.fieldName, FormFieldType.CellData)\r\n .on('change', (ev) => {\r\n const colId = (ev.target as HTMLSelectElement).value;\r\n this.validateSelectedField(colId);\r\n })\r\n .id('pivotTableCellFieldSelector')\r\n .toDOM()\r\n )\r\n )\r\n )\r\n\r\n current = getCurrent();\r\n domel(current)\r\n .addChild('div')\r\n .addChild('div', b => b\r\n .addClass(horizClass)\r\n .addChild('label', b => b\r\n .addClass('checkbox')\r\n .addChild('input', b => { b\r\n .id('pivotTableHasTotalsRow')\r\n .type('checkbox')\r\n if (settings.totalsRow)\r\n b.attr('checked', '')\r\n })\r\n .addText(' ' + i18n.getText('Facets', 'Pivot', 'TotalsRowLabel'))\r\n )\r\n .addChild('label', b => b\r\n .addClass('checkbox')\r\n .addChild('input', b => {b\r\n .id('pivotTableHasTotalsCol')\r\n .type('checkbox')\r\n if (settings.totalsCol)\r\n b.attr('checked', '')\r\n })\r\n .addText(' ' + i18n.getText('Facets', 'Pivot', 'TotalsColLabel'))\r\n )\r\n )\r\n }\r\n\r\n protected afterDialogOpened(dlg: Dialog) {\r\n const colId = (document.getElementById('pivotTableCellFieldSelector') as HTMLSelectElement).value;\r\n if (colId) {\r\n this.validateSelectedField(colId);\r\n }\r\n\r\n if (this.getQuery().getColumns().length <= 2) {\r\n dlg.showAlert('The dataset should contain at least three columns to build a pivot table', 'error');\r\n dlg.getSubmitButtonElement().disabled = true;\r\n }\r\n }\r\n\r\n private validateSelectedField(colId: string) {\r\n const dataTable = this.getContextDataTable();\r\n const colIndex = dataTable.columns.getIndex(colId);\r\n const col = dataTable.columns.get(colIndex);\r\n\r\n const aggrSelector = document.getElementById('pivotTableAggrFuncSelector') as HTMLSelectElement;\r\n if (col.type == DataType.String) {\r\n aggrSelector.disabled = true;\r\n aggrSelector.value = AggrFunc.Count;\r\n }\r\n else {\r\n aggrSelector.disabled = false;\r\n }\r\n }\r\n \r\n protected submitSettingsDialog(): boolean {\r\n const result = super.submitSettingsDialog();\r\n\r\n if (result) {\r\n this.settings = {\r\n colName: (document.getElementById('pivotTableColFieldSelector') as HTMLSelectElement).value,\r\n rowName: (document.getElementById('pivotTableRowFieldSelector') as HTMLSelectElement).value,\r\n aggrFunc: ((document.getElementById('pivotTableAggrFuncSelector') as HTMLSelectElement).value as AggrFunc),\r\n fieldName: (document.getElementById('pivotTableCellFieldSelector') as HTMLSelectElement).value,\r\n totalsRow: (document.getElementById('pivotTableHasTotalsRow') as HTMLInputElement).checked,\r\n totalsCol: (document.getElementById('pivotTableHasTotalsCol') as HTMLInputElement).checked\r\n };\r\n\r\n this.refresh(); \r\n }\r\n\r\n return result;\r\n }\r\n\r\n public saveToData(): any {\r\n const data = super.saveToData();\r\n if (this.settings) {\r\n dataUtils.assignDeep(data, this.settings);\r\n }\r\n return data;\r\n }\r\n\r\n public loadFromData(data: any) {\r\n super.loadFromData(data);\r\n \r\n if (data) {\r\n this.settings = dataUtils.assignDeep(this.settings, data);\r\n if (this.settings.aggrFunc as string == 'AVERAGE') {\r\n this.settings.aggrFunc = AggrFunc.Average\r\n }\r\n }\r\n }\r\n\r\n protected refreshCore() {\r\n this.updatePivotData();\r\n if (this.grid) {\r\n const dataSize = this.pivotTable.getTotal();\r\n const maxRow = this.grid.options.paging.pageSize;\r\n if (dataSize > maxRow) {\r\n this.contentDiv.classList.remove('pivot-grid-with-totals');\r\n this.showErrorMessage(i18n.getText('Facets', 'ErrTooMuchData'));\r\n }\r\n\r\n if (this.options.viewportRowsCount > dataSize) {\r\n this.grid.options.viewportRowsCount = dataSize\r\n }\r\n else {\r\n this.grid.options.viewportRowsCount = this.options.viewportRowsCount\r\n }\r\n this.grid.refresh();\r\n }\r\n }\r\n\r\n protected getContextDataTable(): EasyDataTable {\r\n const context = this.getContext();\r\n return context.resultTable;\r\n }\r\n\r\n \r\n private updatePivotData() {\r\n this.pivotTable.clear();\r\n\r\n const dataTable = this.getContextDataTable();\r\n if (!dataTable || dataTable.getTotal() == 0) {\r\n return;\r\n }\r\n\r\n if (!this.settings) {\r\n return;\r\n }\r\n\r\n const colName = this.settings.colName;\r\n const rowName = this.settings.rowName;\r\n const fieldName = this.settings.fieldName;\r\n const colIdx = dataTable.columns.getIndex(colName);\r\n const rowIdx = dataTable.columns.getIndex(rowName);\r\n const fieldIdx = dataTable.columns.getIndex(fieldName);\r\n\r\n if (colIdx == undefined || rowIdx == undefined || fieldIdx == undefined) {\r\n this.showUnableDisplayMessage(i18n.getText('Facets', 'ErrQueryChanged'));\r\n return;\r\n }\r\n \r\n const columnField = dataTable.columns.get(fieldIdx);\r\n const columnCol = dataTable.columns.get(colIdx);\r\n const columnRow = dataTable.columns.get(rowIdx);\r\n\r\n const rowLabel = columnRow.label;\r\n const rowType = columnRow.type;\r\n const colLabel = columnCol.label;\r\n\r\n const colValues = [];\r\n const rowValues = [];\r\n\r\n const rows = dataTable.getCachedRows();\r\n for (let i = 0; i < rows.length; i++) {\r\n const colValue = rows[i].getValue(colIdx);\r\n if (colValues.indexOf(colValue) < 0) {\r\n colValues.push(colValue);\r\n }\r\n\r\n const rowValue = rows[i].getValue(rowIdx);\r\n if (rowValues.indexOf(rowValue) < 0) {\r\n rowValues.push(rowValue);\r\n }\r\n }\r\n\r\n this.pivotTable.columns.add({\r\n id: rowLabel + '\\\\' + colLabel,\r\n label: rowLabel + '\\\\' + colLabel,\r\n description: '',\r\n type: rowType,\r\n dfmt: columnRow.displayFormat,\r\n style: columnRow.style\r\n });\r\n\r\n const null_columns = [];\r\n\r\n let colFieldFormatter: (column: DataColumn, value: any) => string = null;\r\n\r\n if (dataUtils.isNumericType(columnCol.type)) {\r\n colFieldFormatter = this.formatNumber;\r\n }\r\n else if (dataUtils.getDateDataTypes().indexOf(columnCol.type) >= 0) {\r\n colFieldFormatter = this.formatDate;\r\n }\r\n\r\n for(let i = 0; i < colValues.length; i++) {\r\n const colValue = colValues[i];\r\n if (!colValue) {\r\n null_columns.push(i);\r\n }\r\n else {\r\n const label = colFieldFormatter \r\n ? colFieldFormatter(columnCol, colValue) \r\n : colValue;\r\n \r\n this.pivotTable.columns.add({\r\n id: colValue,\r\n label: label,\r\n description: '',\r\n dfmt: columnField.displayFormat,\r\n type: this.settings.aggrFunc !== AggrFunc.Count \r\n ? columnField.type : DataType.Int64,\r\n style: columnField.style\r\n });\r\n }\r\n }\r\n \r\n let new_rows = [];\r\n\r\n for(let i = 0; i < rowValues.length; i++) {\r\n new_rows.push([])\r\n new_rows[i].push(rowValues[i]);\r\n }\r\n\r\n for(let i = 0; i < rowValues.length; i++) {\r\n for(let j = 0; j < colValues.length; j++) {\r\n if (null_columns.indexOf(j) >= 0)\r\n continue;\r\n \r\n new_rows[i].push(\r\n this.calcAggrFunc(\r\n this.settings.aggrFunc,\r\n { \r\n colName: this.settings.colName,\r\n rowName: this.settings.rowName,\r\n fieldName: this.settings.fieldName,\r\n rowValue: rowValues[i],\r\n colValue: colValues[j]\r\n }\r\n )\r\n );\r\n }\r\n }\r\n\r\n if (this.settings.totalsCol) {\r\n this.pivotTable.columns.add({\r\n id: \"total\",\r\n label: i18n.getText('Facets', 'Pivot', 'TotalGridLabel'),\r\n description: '',\r\n dfmt: columnField.displayFormat,\r\n type: this.settings.aggrFunc !== AggrFunc.Count \r\n ? columnField.type : DataType.Int64\r\n });\r\n \r\n for(let i = 0; i < new_rows.length; i++) {\r\n const row = new_rows[i];\r\n\r\n let totalByRow = 0;\r\n if (this.settings.aggrFunc == AggrFunc.Min \r\n || this.settings.aggrFunc == AggrFunc.Max) {\r\n totalByRow = row[1];\r\n }\r\n\r\n for(let j = 1; j < row.length; j++) {\r\n const value = row[j];\r\n if (value !== null) {\r\n if (this.settings.aggrFunc === AggrFunc.Min) {\r\n if (value < totalByRow)\r\n totalByRow = value;\r\n }\r\n else if (this.settings.aggrFunc === AggrFunc.Max) {\r\n if (value > totalByRow)\r\n totalByRow = value;\r\n }\r\n else {\r\n totalByRow += value;\r\n }\r\n }\r\n }\r\n\r\n if (this.settings.aggrFunc === AggrFunc.Average) {\r\n totalByRow /= row.length - 1;\r\n }\r\n\r\n row.push(totalByRow);\r\n }\r\n }\r\n\r\n for(const row of new_rows) {\r\n this.pivotTable.addRow(row);\r\n }\r\n\r\n if (this.settings.totalsRow) {\r\n\r\n let total_row = [];\r\n // to be able to create date value\r\n total_row.push(null);\r\n\r\n for (let i = 1; i < this.pivotTable.columns.count; i++) {\r\n\r\n const rows = this.pivotTable.getCachedRows();\r\n\r\n let totalByCol = 0;\r\n if (this.settings.aggrFunc == AggrFunc.Min\r\n || this.settings.aggrFunc == AggrFunc.Max) {\r\n totalByCol = rows[0].getValue(i);\r\n }\r\n\r\n for (let j = 0; j < rows.length; j++) {\r\n const value = rows[j].getValue(i);\r\n if (value !== null) {\r\n if (this.settings.aggrFunc === AggrFunc.Min) {\r\n if (value < totalByCol)\r\n totalByCol = value;\r\n }\r\n else if (this.settings.aggrFunc === AggrFunc.Max) {\r\n if (value > totalByCol)\r\n totalByCol = value;\r\n }\r\n else {\r\n totalByCol += value;\r\n }\r\n }\r\n }\r\n\r\n if (this.settings.aggrFunc === AggrFunc.Average) {\r\n totalByCol /= rows.length;\r\n }\r\n\r\n total_row.push(totalByCol);\r\n }\r\n\r\n this.pivotTable.addRow(total_row);\r\n\r\n this.contentDiv.classList.add('pivot-grid-with-totals');\r\n }\r\n else {\r\n this.contentDiv.classList.remove('pivot-grid-with-totals');\r\n }\r\n }\r\n\r\n private calcAggrFunc(func: AggrFunc, options: AggrFuncOptions): number | null {\r\n switch (func) {\r\n case AggrFunc.Sum:\r\n return this.sum(options);\r\n case AggrFunc.Average:\r\n return this.average(options);\r\n case AggrFunc.Min:\r\n return this.min(options);\r\n case AggrFunc.Max:\r\n return this.max(options);\r\n case AggrFunc.Count:\r\n return this.count(options);\r\n default:\r\n return 0;\r\n }\r\n\r\n }\r\n\r\n public getSettings() {\r\n return this.settings;\r\n }\r\n\r\n\r\n private formatDate(column: DataColumn, value: any): string {\r\n const isDate = Object.prototype.toString.call(value) === '[object Date]';\r\n let strValue = (value || '').toString();\r\n \r\n if (isDate) {\r\n if (column && column.displayFormat \r\n && DFMT_REGEX.test(column.displayFormat)) {\r\n strValue = column.displayFormat.replace(DFMT_REGEX, (_, $1) => {\r\n return i18n.dateTimeToStr(value, column.type, $1);\r\n });\r\n }\r\n else {\r\n const locale = i18n.getCurrentLocale();\r\n const timeOptions = { hour: 'numeric', minute: 'numeric', second: 'numeric' };\r\n switch (column.type) {\r\n case DataType.Date:\r\n strValue = value.toLocaleDateString(locale);\r\n break;\r\n case DataType.Time:\r\n strValue = value.toLocaleTimeString(locale, timeOptions);\r\n break;\r\n case DataType.DateTime:\r\n strValue = `${value.toLocaleDateString(locale)} ${value.toLocaleTimeString(locale, timeOptions)}`;\r\n break;\r\n }\r\n }\r\n }\r\n\r\n return strValue;\r\n }\r\n\r\n private formatNumber(column: DataColumn, value): string {\r\n let strValue = (value || '').toString();\r\n\r\n if(typeof value == 'number') {\r\n if (column && column.displayFormat\r\n && DFMT_REGEX.test(column.displayFormat)) {\r\n strValue = column.displayFormat.replace(DFMT_REGEX, (_, $1) => {\r\n return i18n.numberToStr(value, $1);\r\n });\r\n }\r\n else {\r\n strValue = value.toLocaleString();\r\n }\r\n }\r\n\r\n return strValue;\r\n }\r\n \r\n private sum(options: AggrFuncOptions): number {\r\n\r\n let result = 0;\r\n\r\n const dataTable = this.getContextDataTable();\r\n const rows = dataTable.getCachedRows();\r\n\r\n for(let i = 0; i < rows.length; i++) {\r\n \r\n const rowValue = rows[i].getValue(options.rowName);\r\n const colValue = rows[i].getValue(options.colName)\r\n \r\n if (rowValue !== options.rowValue \r\n || colValue !== options.colValue) {\r\n continue;\r\n }\r\n\r\n const fieldValue = rows[i].getValue(options.fieldName);\r\n result += fieldValue;\r\n }\r\n\r\n return result;\r\n }\r\n\r\n private average(options: AggrFuncOptions): number {\r\n\r\n let result = 0;\r\n let count = 0;\r\n\r\n const dataTable = this.getContextDataTable();\r\n const rows = dataTable.getCachedRows();\r\n\r\n for(let i = 0; i < rows.length; i++) {\r\n \r\n const rowValue = rows[i].getValue(options.rowName);\r\n const colValue = rows[i].getValue(options.colName)\r\n \r\n if (rowValue !== options.rowValue \r\n || colValue !== options.colValue) {\r\n continue;\r\n }\r\n\r\n const fieldValue = rows[i].getValue(options.fieldName);\r\n result += fieldValue;\r\n count++;\r\n }\r\n\r\n if (count != 0)\r\n result = result / count;\r\n\r\n return result;\r\n }\r\n\r\n private min(options: AggrFuncOptions): number | null {\r\n\r\n let min = Number.MAX_SAFE_INTEGER;\r\n\r\n const dataTable = this.getContextDataTable();\r\n const rows = dataTable.getCachedRows();\r\n\r\n for(let i = 0; i < rows.length; i++) {\r\n \r\n const rowValue = rows[i].getValue(options.rowName);\r\n const colValue = rows[i].getValue(options.colName);\r\n \r\n if (rowValue !== options.rowValue \r\n || colValue !== options.colValue) {\r\n continue;\r\n }\r\n\r\n const fieldValue = rows[i].getValue(options.fieldName);\r\n if (fieldValue < min) {\r\n min = fieldValue;\r\n }\r\n }\r\n\r\n if (min == Number.MAX_SAFE_INTEGER)\r\n return null;\r\n\r\n return min;\r\n }\r\n\r\n private max(options: AggrFuncOptions): number | null {\r\n \r\n let max = Number.MIN_SAFE_INTEGER;\r\n\r\n const dataTable = this.getContextDataTable();\r\n const rows = dataTable.getCachedRows();\r\n\r\n for(let i = 0; i < rows.length; i++) {\r\n \r\n const rowValue = rows[i].getValue(options.rowName);\r\n const colValue = rows[i].getValue(options.colName);\r\n \r\n if (rowValue !== options.rowValue \r\n || colValue !== options.colValue) {\r\n continue;\r\n }\r\n\r\n const fieldValue = rows[i].getValue(options.fieldName);\r\n if (fieldValue > max) {\r\n max = fieldValue;\r\n }\r\n }\r\n\r\n if (max == Number.MIN_SAFE_INTEGER)\r\n return null; \r\n\r\n return max;\r\n }\r\n\r\n private count(options: AggrFuncOptions): number {\r\n const dataTable = this.getContextDataTable();\r\n\r\n let count = 0;\r\n\r\n const rows = dataTable.getCachedRows();\r\n for(let i = 0; i < rows.length; i++) {\r\n\r\n const rowValue = rows[i].getValue(options.rowName);\r\n const colValue = rows[i].getValue(options.colName);\r\n \r\n if (rowValue !== options.rowValue \r\n || colValue !== options.colValue) {\r\n continue; \r\n }\r\n\r\n count++;\r\n }\r\n\r\n return count;\r\n } \r\n}","\r\nimport { \r\n EqContext, Widget, \r\n WidgetGroup, \r\n} from '@easyquery/core';\r\n\r\nimport { \r\n EasyDataTable,\r\n i18n,\r\n utils as dataUtils \r\n} from '@easydata/core';\r\n\r\nimport { \r\n addCssClass, showElement, \r\n hideElement, toggleVisibility,\r\n isVisible\r\n} from '@easydata/ui';\r\n\r\nimport { ChartWidgetOptions } from '../widget_options';\r\nimport { ChartType } from './chart_type';\r\n\r\nexport interface ChartColumn {\r\n idx: number;\r\n label: string;\r\n}\r\n\r\nexport abstract class ChartWidget extends Widget {\r\n protected element: HTMLElement;\r\n\r\n protected chartType: ChartType = ChartType.Pie;\r\n\r\n protected supportedChartTypes: ChartType[] = [];\r\n\r\n protected dataTable: EasyDataTable = null;\r\n\r\n protected potentialLabelColumns: ChartColumn[] = [];\r\n protected potentialDataColumns: ChartColumn[] = [];\r\n\r\n protected labelColumn: number = -1;\r\n protected dataColumns: number[] = [];\r\n\r\n protected settingsDiv: HTMLElement;\r\n protected chartDiv: HTMLElement;\r\n\r\n protected options: ChartWidgetOptions = {\r\n chartType: ChartType.Pie,\r\n showOnPaging: false,\r\n hideSettings: false,\r\n legend: {\r\n show: false,\r\n position: 'right'\r\n }\r\n }\r\n\r\n protected get cssPrefix(): string {\r\n return 'eqjs-chart';\r\n }\r\n\r\n /**\r\n * The default constructor.\r\n * @param slot The html element.\r\n * @param provider The provider.\r\n */\r\n constructor(slot: HTMLElement) {\r\n super(slot);\r\n this.element = slot;\r\n\r\n this.group = WidgetGroup.Result;\r\n }\r\n\r\n\r\n /**\r\n * Initialize widget.\r\n * @param context The context.\r\n * @param options The options.\r\n */\r\n public init(context: EqContext, options?: ChartWidgetOptions) {\r\n super.init(context, options);\r\n this.dataTable = context.resultTable;\r\n\r\n this.setOptions(options);\r\n }\r\n\r\n /**\r\n * Checks, if widget has data.\r\n * @returns `true` if has data, otherwise - `false`.\r\n */\r\n public hasData() : boolean {\r\n let result = this.dataTable != null;\r\n\r\n if (result) {\r\n result = this.dataTable.getCachedCount() > 0;\r\n }\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Checks, if there ara colums for chart\r\n * @returns `true` if there are columns, otherwise - `false`.\r\n */\r\n public hasColumnsForChart() : boolean {\r\n return this.potentialLabelColumns.length > 0 && this.potentialDataColumns.length > 0;\r\n }\r\n\r\n /**\r\n * Refresh widget implementation\r\n */\r\n protected refreshCore() {\r\n this.prepareChartData();\r\n this.render();\r\n }\r\n\r\n private setOptions(options: ChartWidgetOptions) {\r\n dataUtils.assignDeep(this.options, options);\r\n this.supportedChartTypes = this.getSupportedChartTypes(); \r\n if (this.supportedChartTypes.length == 0) {\r\n throw Error(\"Chart widget should support at least one chart type\");\r\n }\r\n if (options.chartType && this.supportedChartTypes.indexOf(options.chartType) >= 0) {\r\n this.chartType = options.chartType; \r\n }\r\n else {\r\n this.chartType = this.supportedChartTypes[0];\r\n }\r\n }\r\n\r\n public getOptions(): ChartWidgetOptions {\r\n return this.options;\r\n }\r\n\r\n public getChartTypeName(ct: ChartType) : string {\r\n switch (ct) {\r\n case ChartType.Area:\r\n return i18n.getText('ChartType', 'Area');\r\n case ChartType.Bar:\r\n return i18n.getText('ChartType', 'Bar');\r\n case ChartType.Column:\r\n return i18n.getText('ChartType', 'Column');\r\n case ChartType.Combo:\r\n return i18n.getText('ChartType', 'Combo');\r\n case ChartType.Doughnut:\r\n return i18n.getText('ChartType', 'Doughnut');\r\n case ChartType.Polar: \r\n return i18n.getText('ChartType', 'Polar');\r\n case ChartType.Radar:\r\n return i18n.getText('ChartType', 'Radar');\r\n case ChartType.Histogram:\r\n return i18n.getText('ChartType', 'Histogram');\r\n case ChartType.Line:\r\n return i18n.getText('ChartType', 'Line');\r\n case ChartType.SteppedLine:\r\n return i18n.getText('ChartType', 'SteppedLine');\r\n default: \r\n return i18n.getText('ChartType', 'Pie');\r\n }\r\n }\r\n\r\n public updateSettings(settings: {type: ChartType, labelColumn: number, dataColumn: number, showLegend?: boolean}, updateColumns = true) {\r\n if (typeof settings.showLegend !== 'undefined') {\r\n this.options.legend = this.options.legend || {};\r\n this.options.legend.show = settings.showLegend;\r\n }\r\n this.chartType = settings.type;\r\n this.labelColumn = settings.labelColumn;\r\n this.dataColumns[0] = settings.dataColumn;\r\n\r\n if (updateColumns)\r\n this.updateChartColumns();\r\n }\r\n\r\n /**\r\n * Prepares data for chart.\r\n */\r\n public prepareChartData() {\r\n if (this.dataTable) {\r\n this.potentialLabelColumns = [];\r\n this.potentialDataColumns = [];\r\n let colNum = this.dataTable.columns.count;\r\n\r\n for (let i = 0; i < colNum; i++) {\r\n const column = this.dataTable.columns.get(i);\r\n let colType = column.type;\r\n let colLabel = column.label;\r\n this.potentialLabelColumns.push({ idx: i, label: colLabel });\r\n\r\n if (dataUtils.isNumericType(colType)) {\r\n this.potentialDataColumns.push({ idx: i, label: colLabel });\r\n }\r\n };\r\n\r\n if (this.labelColumn != -1) {\r\n if (!this.potentialLabelColumns\r\n .filter(c => c.idx == this.labelColumn)\r\n .length) {\r\n this.labelColumn = -1;\r\n }\r\n }\r\n else {\r\n this.labelColumn = (this.potentialLabelColumns.length > 0) \r\n ? this.potentialLabelColumns[0].idx : -1;\r\n }\r\n\r\n if (this.dataColumns.length) {\r\n const ids = this.potentialDataColumns.map(d => d.idx);\r\n this.dataColumns = this.dataColumns.filter(v => ids.indexOf(v) >= 0);\r\n\r\n if (!this.dataColumns.length) {\r\n this.dataColumns = (this.potentialDataColumns.length > 0)\r\n ? [].concat(this.potentialDataColumns[0].idx)\r\n : []\r\n }\r\n }\r\n else {\r\n this.dataColumns = (this.potentialDataColumns.length > 0)\r\n ? [].concat(this.potentialDataColumns[0].idx)\r\n : []\r\n }\r\n\r\n this.initChart();\r\n }\r\n }\r\n\r\n protected abstract hasChartTypes: ChartType[];\r\n\r\n public getSupportedChartTypes(): ChartType[] {\r\n const chartTypes = this.options.supportedChartTypes\r\n ? this.options.supportedChartTypes\r\n : Object.keys(ChartType).map(key => ChartType[key]);\r\n\r\n return chartTypes.filter(type => this.hasChartTypes.indexOf(type) >= 0);\r\n }\r\n\r\n public getCurrentChartType(): ChartType {\r\n return this.chartType;\r\n }\r\n\r\n protected abstract canDraw(): boolean;\r\n\r\n protected abstract initChart(): void;\r\n\r\n private render() : void {\r\n this.clear();\r\n\r\n if (this.hasData() && this.hasColumnsForChart() \r\n && (this.context.resultTable.getTotal() \r\n == this.context.resultTable.getCachedCount())) \r\n {\r\n let headerDiv = document.createElement('div');\r\n addCssClass(headerDiv, `${this.cssPrefix}-header`);\r\n\r\n let mainDiv = document.createElement('div');\r\n addCssClass(mainDiv, `${this.cssPrefix}-main`);\r\n \r\n if (this.canDraw()) {\r\n let chartTypeSelector = document.createElement('select');\r\n\r\n for (let ct of this.supportedChartTypes) {\r\n let sopt = document.createElement('option');\r\n sopt.value = ct.toString();\r\n sopt.text = this.getChartTypeName(ct);\r\n chartTypeSelector.appendChild(sopt);\r\n }\r\n\r\n chartTypeSelector.value = this.chartType.toString();\r\n\r\n headerDiv.appendChild(chartTypeSelector);\r\n\r\n chartTypeSelector.addEventListener('change', (ev) => {\r\n let ctkey = (ev.target as HTMLSelectElement).value;\r\n this.chartType = parseInt(ctkey) as ChartType;\r\n this.refresh();\r\n });\r\n\r\n this.settingsDiv = document.createElement('div');\r\n addCssClass(this.settingsDiv, `${this.cssPrefix}-settings`);\r\n hideElement(this.settingsDiv);\r\n mainDiv.appendChild(this.settingsDiv);\r\n\r\n this.chartDiv = document.createElement('div');\r\n addCssClass(this.chartDiv, `${this.cssPrefix}-content`);\r\n hideElement(this.chartDiv);\r\n\r\n mainDiv.appendChild(this.chartDiv);\r\n\r\n this.initSettingsDiv();\r\n\r\n let chartSettingsBtn = document.createElement('div');\r\n addCssClass(chartSettingsBtn, `${this.cssPrefix}-settings-icon`);\r\n chartSettingsBtn.title = \"Settings\";\r\n\r\n headerDiv.appendChild(chartSettingsBtn);\r\n\r\n chartSettingsBtn.addEventListener('click', (ev) => {\r\n this.toggleSettings();\r\n });\r\n \r\n this.drawChart(100);\r\n\r\n } \r\n else {\r\n this.addContentDiv(mainDiv, 'Unable to render the chart. None of the supported chart libraries (ChartJS, Google Charts, etc) is found.');\r\n }\r\n\r\n if (!this.options.hideSettings) {\r\n this.element.appendChild(headerDiv);\r\n }\r\n\r\n this.element.appendChild(mainDiv);\r\n\t\t\t\r\n\t\t\tthis.element.style.display = \"\";\r\n }\r\n\t\telse {\r\n\t\t\tthis.element.style.display = \"none\";\r\n\t\t}\r\n }\r\n\r\n private addContentDiv(mainDiv: HTMLElement, text: string) : void {\r\n let contentDiv = document.createElement('div');\r\n addCssClass(contentDiv, `${this.cssPrefix}-no-data`);\r\n contentDiv.innerText = text;\r\n mainDiv.appendChild(contentDiv);\r\n }\r\n\r\n /**\r\n * Clears the chart.\r\n */\r\n public clear() : void {\r\n this.element.innerHTML = '';\r\n }\r\n\r\n /**\r\n * Draws chart with a delay.\r\n * @param delay The delay.\r\n */\r\n public drawChart(delay : number) {\r\n showElement(this.chartDiv);\r\n if (delay > 0) {\r\n setTimeout(() => this.drawCore(), delay);\r\n }\r\n else {\r\n this.drawCore();\r\n }\r\n }\r\n\r\n protected abstract drawCore(): void;\r\n\r\n protected abstract updateChartColumns(): void;\r\n\r\n /**\r\n * Inititializes the settings div.\r\n */\r\n public initSettingsDiv() {\r\n let settingsHeader = document.createElement('div');\r\n settingsHeader.textContent = 'SETTINGS';\r\n addCssClass(settingsHeader, `${this.cssPrefix}-settings-header`);\r\n\r\n this.settingsDiv.appendChild(settingsHeader);\r\n\r\n // Label column\r\n let labelDiv = document.createElement('div');\r\n addCssClass(labelDiv, `${this.cssPrefix}-settings-single`);\r\n this.settingsDiv.appendChild(labelDiv);\r\n\r\n let labelColumnSelectorCaption = document.createElement('span');\r\n showElement(labelColumnSelectorCaption);\r\n labelColumnSelectorCaption.textContent = 'Label column';\r\n labelDiv.appendChild(labelColumnSelectorCaption);\r\n\r\n let labelColumnSelector = document.createElement('select');\r\n showElement(labelColumnSelector);\r\n labelDiv.appendChild(labelColumnSelector);\r\n\r\n for (let col of this.potentialLabelColumns) {\r\n let sopt = document.createElement('option');\r\n sopt.value = col.idx.toString();\r\n sopt.text = col.label;\r\n labelColumnSelector.appendChild(sopt);\r\n }\r\n\r\n if (this.labelColumn >= 0) {\r\n labelColumnSelector.value = this.labelColumn.toString();\r\n }\r\n\r\n labelColumnSelector.addEventListener('change', (ev) => { \r\n this.labelColumn = parseInt((ev.target as HTMLSelectElement).value);\r\n this.updateChartColumns();\r\n this.toggleSettings(() => {\r\n this.drawChart(100);\r\n });\r\n });\r\n\r\n // Data column\r\n let dataDiv = document.createElement('div');\r\n addCssClass(dataDiv, `${this.cssPrefix}-settings-single`);\r\n this.settingsDiv.appendChild(dataDiv);\r\n\r\n let dataColumnSelectorCaption = document.createElement('span');\r\n showElement(dataColumnSelectorCaption);\r\n dataColumnSelectorCaption.textContent = 'Data column';\r\n dataDiv.appendChild(dataColumnSelectorCaption);\r\n\r\n let dataColumnSelector = document.createElement('select');\r\n showElement(dataColumnSelector);\r\n dataDiv.appendChild(dataColumnSelector);\r\n\r\n for (let col of this.potentialDataColumns) {\r\n let sopt = document.createElement('option');\r\n sopt.value = col.idx.toString();\r\n sopt.text = col.label;\r\n dataColumnSelector.appendChild(sopt);\r\n }\r\n\r\n if (this.dataColumns.length > 0 && this.dataColumns[0] >= 0) {\r\n dataColumnSelector.value = this.dataColumns[0].toString();\r\n }\r\n\r\n dataColumnSelector.addEventListener('change', (ev) => { \r\n this.dataColumns[0] = parseInt((ev.target as HTMLSelectElement).value);\r\n this.updateChartColumns();\r\n this.toggleSettings(() => {\r\n this.drawChart(100);\r\n });\r\n });\r\n }\r\n\r\n public getPotentialLabelColumns(): ChartColumn[] {\r\n return this.potentialLabelColumns;\r\n }\r\n\r\n public getPotentialDataColumns(): ChartColumn[] {\r\n return this.potentialDataColumns;\r\n }\r\n\r\n public getLabelColumnIndex(): number {\r\n return this.labelColumn;\r\n }\r\n\r\n public getDataColumnIndex(): number {\r\n return this.dataColumns[0];\r\n }\r\n\r\n /**\r\n * Toggles settings.\r\n * @param callback The callback.\r\n */\r\n public toggleSettings(callback? : () => void) {\r\n let first : HTMLElement;\r\n let second : HTMLElement;\r\n\r\n if (isVisible(this.chartDiv)){\r\n first = this.chartDiv;\r\n second = this.settingsDiv;\r\n }\r\n else {\r\n first = this.settingsDiv;\r\n second = this.chartDiv;\r\n }\r\n\r\n toggleVisibility(first, second, {\r\n complete: callback\r\n });\r\n }\r\n}","import { addElement } from '@easydata/ui';\r\n\r\nimport { ChartWidget } from './chart_widget';\r\nimport { ChartType } from './chart_type'\r\n\r\ndeclare var Chart;\r\n\r\nexport class ChartJsWidget extends ChartWidget {\r\n private colors: string[] = [\r\n '#4dc9f6',\r\n '#f67019',\r\n '#f53794',\r\n '#537bc4',\r\n '#acc236',\r\n '#166a8f',\r\n '#00a950',\r\n '#58595b',\r\n '#8549ba'\r\n ];\r\n\r\n /**\r\n * The default constructor.\r\n * @param slot The html element.\r\n * @param provider The provider.\r\n */\r\n constructor(slot: HTMLElement) {\r\n super(slot);\r\n\r\n this.options.legend = {\r\n show: false,\r\n position: 'bottom'\r\n };\r\n }\r\n\r\n\r\n public getWidgetType(): string {\r\n return 'chartChartJs';\r\n }\r\n\r\n private chartLabels: string[] = [];\r\n private chartColumns: string[] = [];\r\n\r\n protected hasChartTypes = [\r\n ChartType.Column,\r\n ChartType.Bar,\r\n ChartType.Area,\r\n ChartType.Line,\r\n ChartType.SteppedLine,\r\n ChartType.Doughnut,\r\n ChartType.Polar,\r\n ChartType.Radar,\r\n ChartType.Pie\r\n // ChartType.Bubble,\r\n // ChartType.Scatter\r\n ];\r\n\r\n public static hasChartJs() : boolean {\r\n return typeof Chart !== 'undefined';\r\n }\r\n \r\n protected canDraw(): boolean {\r\n return ChartJsWidget.hasChartJs();\r\n }\r\n\r\n protected initChart() {\r\n if (ChartJsWidget.hasChartJs() && this.labelColumn >= 0 \r\n && this.dataColumns && this.dataColumns.length > 0) \r\n {\r\n this.updateChartColumns();\r\n } \r\n }\r\n\r\n protected drawCore() {\r\n if (ChartJsWidget.hasChartJs() && this.dataTable \r\n && this.dataTable.getCachedCount() > 0) {\r\n\r\n let config = this.generateConfig();\r\n \r\n let chartCanvas = this.getChartCanvas(this.chartDiv);\r\n let chartContext = chartCanvas.getContext('2d');\r\n\r\n new Chart(chartContext, config);\r\n }\r\n }\r\n\r\n protected updateChartColumns() {\r\n if (this.dataTable) {\r\n this.chartLabels = [];\r\n this.chartColumns = [];\r\n const rows = this.dataTable.getCachedRows();\r\n for (let i = 0; i < rows.length; i++) {\r\n this.chartLabels.push(rows[i].getValue(this.labelColumn));\r\n this.chartColumns.push(rows[i].getValue(this.dataColumns[0]));\r\n }\r\n }\r\n }\r\n \r\n private getChartCanvas(slot : HTMLElement) : HTMLCanvasElement {\r\n let result : HTMLCanvasElement;\r\n\r\n //find canvas element\r\n let canvases = slot.getElementsByTagName('canvas'); \r\n if (canvases && canvases.length > 0) {\r\n result = canvases[0];\r\n }\r\n else {\r\n result = addElement(slot, 'canvas') as HTMLCanvasElement;\r\n }\r\n return result;\r\n }\r\n\r\n private generateConfig(){\r\n let dataColors = [];\r\n let datasetName = this.dataTable.columns.get(this.dataColumns[0]).label;\r\n let fillValue = true;\r\n let borderColor: string;\r\n\r\n if (this.chartType == ChartType.Pie\r\n || this.chartType == ChartType.Doughnut\r\n || this.chartType == ChartType.Polar\r\n || this.chartType == ChartType.Bar \r\n || this.chartType == ChartType.Column) {\r\n\r\n for (let i = 0; i < this.chartLabels.length; i++) {\r\n dataColors.push(this.colors[i % this.colors.length]);\r\n }\r\n } \r\n else {\r\n dataColors = [this.colors[3]];\r\n }\r\n\r\n if (this.chartType == ChartType.Line \r\n || this.chartType == ChartType.SteppedLine) {\r\n fillValue = false;\r\n borderColor = this.colors[3];\r\n \r\n }\r\n\r\n this.options.legend = this.options.legend || {}\r\n\r\n const dataset1: any = {\r\n data: this.chartColumns,\r\n backgroundColor: dataColors,\r\n borderColor: borderColor,\r\n label: datasetName,\r\n fill: fillValue\r\n }\r\n\r\n if (this.chartType == ChartType.SteppedLine) {\r\n dataset1.stepped = this.chartType === ChartType.SteppedLine, // >= 3.0.0\r\n dataset1.steppedLine = this.chartType === ChartType.SteppedLine // <= 3.0.0\r\n }\r\n\r\n const displayLegend = this.options.legend.show && (this.chartType == ChartType.Pie\r\n || this.chartType == ChartType.Radar || this.chartType == ChartType.Polar\r\n || this.chartType == ChartType.Doughnut);\r\n\r\n return {\r\n type: this.getChartType(),\r\n data: {\r\n datasets: [dataset1],\r\n labels: this.chartLabels\r\n },\r\n options: {\r\n legend: {\r\n display: displayLegend,\r\n position: this.options.legend.position || 'bottom'\r\n },\r\n title: {\r\n display: true,\r\n text: datasetName\r\n }\r\n } \r\n }\r\n }\r\n\r\n private getChartType() {\r\n switch (this.chartType) {\r\n case ChartType.Column:\r\n return \"bar\";\r\n\r\n case ChartType.Bar:\r\n return \"horizontalBar\";\r\n\r\n case ChartType.Area:\r\n case ChartType.SteppedLine:\r\n case ChartType.Line:\r\n return \"line\";\r\n\r\n case ChartType.Doughnut:\r\n return \"doughnut\";\r\n\r\n case ChartType.Polar:\r\n return \"polarArea\";\r\n\r\n case ChartType.Radar:\r\n return \"radar\";\r\n\r\n case ChartType.Pie:\r\n return \"pie\";\r\n\r\n default:\r\n return \"pie\";\r\n } \r\n }\r\n}","import { DataType } from '@easydata/core';\r\nimport { ChartWidget } from './chart_widget';\r\n\r\nimport { ChartType } from './chart_type';\r\n\r\ndeclare var google;\r\n\r\nexport class GoogleChartWidget extends ChartWidget {\r\n protected googleDataView: any;\r\n\r\n protected hasChartTypes = [\r\n ChartType.Column,\r\n ChartType.Bar,\r\n ChartType.Histogram,\r\n ChartType.Combo,\r\n ChartType.Area,\r\n ChartType.Line,\r\n ChartType.SteppedLine,\r\n ChartType.Pie,\r\n ChartType.Doughnut\r\n ];\r\n\r\n /**\r\n * The default constructor.\r\n * @param slot The html element.\r\n * @param provider The provider.\r\n */\r\n constructor(slot: HTMLElement) {\r\n super(slot);\r\n \r\n this.options.legend = {\r\n show: true,\r\n position: 'right'\r\n }\r\n }\r\n\r\n \r\n public getWidgetType(): string {\r\n return 'chartGoogle';\r\n }\r\n\r\n protected canDraw(): boolean {\r\n return GoogleChartWidget.hasGoogleCharts();\r\n }\r\n\r\n public static hasGoogleCharts() : boolean {\r\n return typeof google !== 'undefined' && typeof google.charts !== 'undefined';\r\n }\r\n \r\n protected initChart() {\r\n if (GoogleChartWidget.hasGoogleCharts() && this.labelColumn >= 0 \r\n && this.dataColumns && this.dataColumns.length > 0) \r\n {\r\n this.googleDataView = \r\n new google.visualization.DataView(this.convertToGoogleFormat());\r\n this.updateChartColumns();\r\n } \r\n }\r\n\r\n private convertToGoogleType(type: DataType): string {\r\n switch(type) {\r\n case DataType.Date:\r\n return \"date\";\r\n case DataType.DateTime:\r\n return \"datetime\";\r\n case DataType.Time:\r\n return \"timeofday\";\r\n case DataType.Byte:\r\n case DataType.Word:\r\n case DataType.Int32:\r\n case DataType.Int64:\r\n case DataType.Currency:\r\n case DataType.Float:\r\n return \"number\";\r\n default:\r\n return \"string\";\r\n }\r\n }\r\n\r\n \r\n private convertToGoogleValue(value: any, type: DataType): any {\r\n switch(type) {\r\n case DataType.Bool:\r\n return value ? value.toString() : null;\r\n default:\r\n return value;\r\n }\r\n }\r\n\r\n protected convertToGoogleFormat(): any {\r\n const googleTable = new google.visualization.DataTable();\r\n const columns = this.dataTable.columns;\r\n for(let i = 0; i < columns.count; i++) {\r\n const column = columns.get(i);\r\n googleTable.addColumn(this.convertToGoogleType(column.type), column.label, column.id);\r\n }\r\n\r\n const rows = this.dataTable.getCachedRows();\r\n googleTable.addRows(rows.length);\r\n\r\n for(let i = 0; i < rows.length; i++) {\r\n const row = rows[i];\r\n for(let j = 0; j < columns.count; j++) {\r\n googleTable.setCell(i, j, this.convertToGoogleValue(row.getValue(j), columns.get(j).type));\r\n }\r\n }\r\n \r\n return googleTable;\r\n }\r\n\r\n protected drawCore() {\r\n if (this.googleDataView != null) {\r\n this.options.legend = this.options.legend || {};\r\n\r\n let chartOptions: any = {\r\n width: \"100%\",\r\n height: \"100%\",\r\n chartArea: { width: this.getChartAreaWidth }\r\n };\r\n\r\n if (this.chartType == ChartType.Doughnut) {\r\n chartOptions.pieHole = 0.4;\r\n }\r\n\r\n if (!this.options.legend.show) {\r\n chartOptions.legend = 'none';\r\n }\r\n else {\r\n chartOptions.legend = { position: this.options.legend.position }\r\n }\r\n \r\n let chart = this.createChart(this.chartDiv);\r\n chart.draw(this.googleDataView, chartOptions);\r\n }\r\n }\r\n\r\n \r\n private getChartAreaWidth(chartType : ChartType): string {\r\n if (chartType == ChartType.Pie) {\r\n return \"100%\";\r\n }\r\n else {\r\n return \"50%\";\r\n }\r\n }\r\n\r\n protected updateChartColumns() {\r\n if (this.googleDataView) {\r\n this.googleDataView.setColumns([].concat(this.labelColumn).concat(this.dataColumns));\r\n }\r\n }\r\n\r\n protected createChart(slot: HTMLElement) : any {\r\n switch (this.chartType) {\r\n case ChartType.Column:\r\n return new google.visualization.ColumnChart(slot);\r\n case ChartType.Histogram:\r\n return new google.visualization.Histogram(slot);\r\n case ChartType.Bar:\r\n return new google.visualization.BarChart(slot);\r\n case ChartType.Combo:\r\n return new google.visualization.ComboChart(slot);\r\n case ChartType.Area:\r\n return new google.visualization.AreaChart(slot);\r\n case ChartType.Line:\r\n return new google.visualization.LineChart(slot);\r\n case ChartType.SteppedLine:\r\n return new google.visualization.SteppedAreaChart(slot);\r\n case ChartType.Pie:\r\n case ChartType.Doughnut:\r\n return new google.visualization.PieChart(slot);\r\n default:\r\n return new google.visualization.PieChart(slot);\r\n }\r\n }\r\n}","import { i18n , utils as dataUtils } from '@easydata/core';\r\nimport { domel, Dialog } from '@easydata/ui';\r\n\r\nimport { FacetType } from '../types/facet_type';\r\nimport { ResultFacet } from './result_facet';\r\n\r\nimport { ChartType } from '../widgets/charts/chart_type';\r\nimport { ChartWidget } from '../widgets/charts/chart_widget';\r\nimport { ChartJsWidget } from '../widgets/charts/chart_widget_chartjs';\r\nimport { GoogleChartWidget } from '../widgets/charts/chart_widget_google';\r\nimport { ChartWidgetOptions } from '../widgets/widget_options';\r\n\r\nimport { browserUtils } from '../utils/browser_utils';\r\n\r\nexport class ChartFacet extends ResultFacet {\r\n protected chart: ChartWidget;\r\n\r\n public title: string = i18n.getText('Facets', 'Chart', 'FacetTitle');\r\n\r\n protected settings: any;\r\n\r\n protected dialogTitle = i18n.getText('Facets', 'Chart', 'DlgTitle');\r\n\r\n public init(slot: HTMLElement) {\r\n super.init(slot);\r\n \r\n if (GoogleChartWidget.hasGoogleCharts()) {\r\n this.chart = new GoogleChartWidget(this.contentDiv);\r\n }\r\n else {\r\n this.chart = new ChartJsWidget(this.contentDiv);\r\n }\r\n\r\n const supportedChartTypes = this.container.options \r\n ? this.container.options.supportedChartTypes \r\n : null;\r\n\r\n this.chart.init(this.getContext(), { \r\n legend: {\r\n show: false\r\n },\r\n showOnPaging: true,\r\n hideSettings: true,\r\n supportedChartTypes: supportedChartTypes\r\n } as ChartWidgetOptions);\r\n\r\n //prevent showing chart tab\r\n domel(this.slot).hide();\r\n }\r\n\r\n public destroy() {\r\n if (this.chart) {\r\n this.chart.destroy();\r\n }\r\n }\r\n\r\n public getType(): FacetType {\r\n return FacetType.Chart;\r\n }\r\n\r\n protected renderFormFields(form: HTMLElement, fieldsContainer: HTMLElement) {\r\n super.renderFormFields(form, fieldsContainer);\r\n const isIE = browserUtils.isIE();\r\n const horizClass = isIE ? 'kfrm-fields-ie is-horizontal' : 'kfrm-fields is-horizontal'\r\n \r\n // Chart type\r\n let chartTypeSelector = document.createElement('select');\r\n chartTypeSelector.id = 'chart_type_selector';\r\n chartTypeSelector.name = 'chart_type_selector';\r\n for (let ct of this.chart.getSupportedChartTypes()) {\r\n let sopt = document.createElement('option');\r\n sopt.value = ct.toString();\r\n sopt.text = this.chart.getChartTypeName(ct);\r\n chartTypeSelector.appendChild(sopt);\r\n }\r\n\r\n chartTypeSelector.value = this.chart.getCurrentChartType().toString();\r\n\r\n if (!this.settings) {\r\n this.chart.prepareChartData();\r\n this.settings = {\r\n type: this.chart.getCurrentChartType().toString(),\r\n labelColumn: `${this.chart.getLabelColumnIndex() >= 0 ? this.chart.getLabelColumnIndex() : ''}`,\r\n dataColumn: `${this.chart.getDataColumnIndex() >= 0 ? this.chart.getDataColumnIndex() : ''}`,\r\n showLegend: false\r\n }\r\n }\r\n\r\n // Label column\r\n const labelColumnSelector = document.createElement('select');\r\n labelColumnSelector.name = 'label_column_selector';\r\n labelColumnSelector.id = 'label_column_selector';\r\n for (const col of this.chart.getPotentialLabelColumns()) {\r\n const sopt = document.createElement('option');\r\n sopt.value = col.idx.toString();\r\n sopt.text = col.label;\r\n labelColumnSelector.appendChild(sopt);\r\n }\r\n\r\n labelColumnSelector.value = this.settings.labelColumn;\r\n\r\n // Data column\r\n const dataColumnSelector = document.createElement('select');\r\n dataColumnSelector.id = 'data_column_selector';\r\n dataColumnSelector.name = 'data_column_selector';\r\n for (const col of this.chart.getPotentialDataColumns()) {\r\n const sopt = document.createElement('option');\r\n sopt.value = col.idx.toString();\r\n sopt.text = col.label;\r\n dataColumnSelector.appendChild(sopt);\r\n }\r\n\r\n dataColumnSelector.value = this.settings.dataColumn.toString();\r\n\r\n let current = fieldsContainer;\r\n\r\n const getCurrent = () => {\r\n if (isIE) {\r\n return domel('div', fieldsContainer)\r\n .addClass('kfrm-field-ie')\r\n .toDOM()\r\n }\r\n else {\r\n return fieldsContainer;\r\n }\r\n }\r\n \r\n if (isIE) {\r\n domel(form)\r\n .addChildElement(getCurrent())\r\n }\r\n else {\r\n domel(fieldsContainer)\r\n .addChild('div')\r\n .addChild('div')\r\n }\r\n\r\n current = getCurrent();\r\n domel(current)\r\n .addChild('label', b => b\r\n .attr('for', 'chart_type_selector')\r\n .text(i18n.getText('Facets', 'Chart', 'ChartTypeSelectorLabel'))\r\n )\r\n .addChild('div', b =>\r\n b\r\n .addClass('kfrm-select')\r\n .addChildElement(chartTypeSelector)\r\n )\r\n\r\n current = getCurrent();\r\n domel(current)\r\n .addChild('label', b => b\r\n .attr('for', 'label_column_selector')\r\n .text(i18n.getText('Facets', 'Chart', 'LabelColumnSelectorLabel'))\r\n )\r\n .addChild('div', b => b\r\n .addClass('kfrm-select')\r\n .addChildElement(labelColumnSelector)\r\n )\r\n\r\n current = getCurrent();\r\n domel(current)\r\n .addChild('label', b => b\r\n .attr('for', 'data_column_selector')\r\n .text(i18n.getText('Facets', 'Chart', 'DataColumnSelectorLabel'))\r\n )\r\n .addChild('div', b => b\r\n .addClass('kfrm-select')\r\n .addChildElement(dataColumnSelector)\r\n )\r\n\r\n\r\n current = getCurrent();\r\n domel(current)\r\n .addChild('div')\r\n .addChild('div', b => b\r\n .addClass(horizClass)\r\n .addChild('label', b => b\r\n .addClass('checkbox')\r\n .addChild('input', b => {\r\n b\r\n .id('show_legend')\r\n .type('checkbox')\r\n if (this.settings.showLegend)\r\n b.attr('checked', '')\r\n })\r\n .addText(' ' + i18n.getText('Facets', 'Chart', 'ShowLegendLabel'))\r\n )\r\n )\r\n }\r\n\r\n protected afterDialogOpened(dlg: Dialog) {\r\n if (this.getContext().resultTable.columns.getItems().filter(col => dataUtils.isNumericType(col.type)).length <= 0) {\r\n dlg.showAlert('The dataset should contain at least one numeric column to build a chart', 'error');\r\n dlg.getSubmitButtonElement().disabled = true;\r\n }\r\n }\r\n\r\n\r\n protected submitSettingsDialog(): boolean {\r\n const result = super.submitSettingsDialog();\r\n\r\n const chartTypeSelector = document.getElementById('chart_type_selector') as HTMLSelectElement;\r\n const ct = parseInt(chartTypeSelector.value) as ChartType;\r\n \r\n const labelColumnSelector = document.getElementById('label_column_selector') as HTMLSelectElement;\r\n const labelColumn = parseInt(labelColumnSelector.value);\r\n\r\n const dataColumnSelector = document.getElementById('data_column_selector') as HTMLSelectElement;\r\n const dataColumn = parseInt(dataColumnSelector.value);\r\n\r\n const showLegendInput = document.getElementById('show_legend') as HTMLInputElement;\r\n const showLegend = showLegendInput.checked;\r\n\r\n\r\n if (result) {\r\n this.settings = {\r\n type: ct,\r\n labelColumn: labelColumn,\r\n dataColumn: dataColumn,\r\n showLegend: showLegend\r\n };\r\n if (this.canDisplay()) {\r\n this.refresh();\r\n }\r\n }\r\n\r\n return result;\r\n }\r\n\r\n public getSettings() {\r\n return this.settings;\r\n }\r\n\r\n public saveToData(): any {\r\n const data = super.saveToData();\r\n if (this.settings) {\r\n data.chartType = this.settings.type;\r\n data.labelCol = this.settings.labelColumn;\r\n data.dataCol = this.settings.dataColumn;\r\n data.showLeg = this.settings.showLegend;\r\n }\r\n return data;\r\n }\r\n\r\n public loadFromData(data: any) {\r\n super.loadFromData(data);\r\n\r\n if (data) {\r\n this.settings = {\r\n type: data.chartType,\r\n dataColumn: data.dataCol,\r\n labelColumn: data.labelCol,\r\n showLegend: data.showLeg\r\n }\r\n }\r\n }\r\n\r\n protected refreshCore() {\r\n if (this.chart) {\r\n if (this.settings) {\r\n this.chart.updateSettings(this.settings);\r\n }\r\n this.chart.prepareChartData();\r\n this.chart.refresh();\r\n }\r\n }\r\n\r\n public onResize() {\r\n this.refresh();\r\n }\r\n\r\n}","import { utils as dataUtils } from '@easydata/core';\r\nimport { i18n, Widget } from '@easyquery/core';\r\n\r\nimport { ResultFacet } from './result_facet'\r\nimport { FacetType } from '../types/facet_type';\r\n\r\nimport { EasyGridWidget } from '../widgets/easy_grid_widget';\r\n\r\nexport class DataTableFacet extends ResultFacet {\r\n\r\n protected grid: Widget = null;\r\n\r\n public title: string = i18n.getText('Facets', 'DataTable', 'FacetTitle');\r\n\r\n protected dialogTitle = i18n.getText('Facets', 'DataTable', 'DlgTitle');\r\n\r\n public init(slot: HTMLElement) {\r\n super.init(slot);\r\n\r\n this.reinitGrid();\r\n }\r\n\r\n public getSettings() {\r\n return this.settings;\r\n }\r\n\r\n protected reinitGrid() {\r\n if (this.grid)\r\n this.grid.destroy();\r\n\r\n const options = this.container.options || {};\r\n if (options.gridResolver) {\r\n this.grid = options.gridResolver(this.contentDiv, this.getType())\r\n }\r\n\r\n if (this.grid == null) {\r\n this.grid = new EasyGridWidget(this.contentDiv);\r\n }\r\n\r\n options.grid = options.grid || {};\r\n options.grid.autoRefresh = false;\r\n options.grid.addColumns = false;\r\n\r\n const context = this.getContext();\r\n options.grid.totals = this.settings;\r\n\r\n this.grid.init(context, options.grid);\r\n }\r\n\r\n public getType(): FacetType {\r\n return FacetType.DataGrid;\r\n }\r\n\r\n protected canDisplay() {\r\n return true;\r\n }\r\n\r\n protected refreshCore() { \r\n if (!this.grid) return;\r\n this.grid.refresh();\r\n }\r\n\r\n public destroy() {\r\n if (this.grid) {\r\n this.grid.destroy();\r\n }\r\n }\r\n}","import { Query, Widget, WidgetGroup } from '@easyquery/core';\r\n\r\nimport { FacetType } from '../types/facet_type';\r\nimport { ResultFacet } from '../facets/result_facet';\r\nimport { ChartFacet } from '../facets/chart_facet';\r\nimport { PivotTableFacet } from '../facets/pivot_table_facet';\r\nimport { DataTableFacet } from '../facets/datatable_facet';\r\n\r\nexport abstract class FacetContainer extends Widget {\r\n\r\n protected facets: ResultFacet[] = [];\r\n\r\n public options: any = {};\r\n\r\n constructor(slot: HTMLElement) {\r\n super(slot);\r\n\r\n this.group = WidgetGroup.Result;\r\n }\r\n protected destroyCore() {\r\n for (const facet of this.facets) {\r\n facet.destroy();\r\n }\r\n this.clear();\r\n }\r\n\r\n protected createFacetTab(type: FacetType): ResultFacet {\r\n const options = this.options[type];\r\n switch (type) {\r\n case FacetType.Chart:\r\n return new ChartFacet(this, options);\r\n case FacetType.PivotTable:\r\n return new PivotTableFacet(this, options);\r\n default:\r\n return new DataTableFacet(this, options);\r\n }\r\n }\r\n\r\n public getQuery(): Query {\r\n return this.getContext().getQuery();\r\n }\r\n\r\n public abstract clear();\r\n}","import { \r\n EqContext, WidgetGroup,\r\n QueryChangePart,\r\n QueryChangeEventData,\r\n QueryChangeAction,\r\n} from '@easyquery/core';\r\nimport { i18n, utils as dataUtils } from '@easydata/core';\r\nimport { DialogService, domel } from '@easydata/ui';\r\n\r\nimport { FacetType } from '../types/facet_type';\r\nimport { ResultFacet } from '../facets/result_facet';\r\n\r\nimport { browserUtils } from '../utils/browser_utils';\r\nimport { PopupMenu } from '../utils/popup_menu';\r\nimport { ResultFacetsPanelOptions } from './widget_options';\r\nimport { eqCssPrefix } from '../utils/utils'\r\nimport { ExportDialog } from '../dialog/export_dialog';\r\nimport { FacetContainer } from './facet_container';\r\n\r\nexport class ResultFacetsPanel extends FacetContainer {\r\n protected activeFacetIndex = -1;\r\n\r\n protected addMenu: PopupMenu;\r\n\r\n private firstRender: boolean = true;\r\n\r\n private headerDiv: HTMLElement;\r\n private tabsUl: HTMLElement;\r\n private tabsDiv: HTMLElement;\r\n private bodyDiv: HTMLElement;\r\n\r\n private exportDiv: HTMLElement;\r\n\r\n private recordsDiv: HTMLElement;\r\n\r\n private addFacetButton: HTMLDivElement;\r\n private maximizeButton: HTMLButtonElement;\r\n\r\n private isMaximized: boolean;\r\n\r\n private queryEventCallbackId: string;\r\n \r\n public options: ResultFacetsPanelOptions = {\r\n showExportButton: true,\r\n showRefreshButton: true,\r\n showMaximizeButton: true,\r\n maximize2Window: false,\r\n showProcessIndicator: true,\r\n facetTypes: [FacetType.DataGrid, FacetType.Chart, FacetType.PivotTable ]\r\n };\r\n\r\n constructor(slot: HTMLElement) {\r\n super(slot);\r\n\r\n if (!this.slot.classList.contains(`${this.cssPrefix}-panel`)) {\r\n this.slot.classList.add(`${this.cssPrefix}-panel`);\r\n }\r\n\r\n this.renderProcessBlock();\r\n }\r\n\r\n protected get cssPrefix(): string {\r\n return 'eqjs-facets';\r\n }\r\n\r\n public getWidgetType(): string {\r\n return 'facetsPanel';\r\n }\r\n\r\n /**\r\n * Initialize widget.\r\n * @param context The context. \r\n * @param options The options.\r\n */\r\n public init(context: EqContext, options?: ResultFacetsPanelOptions) {\r\n super.init(context, options);\r\n\r\n this.setOptions(options);\r\n\r\n this.destroyCore();\r\n\r\n this.attachQueryObserver();\r\n\r\n this.loadFacets();\r\n }\r\n\r\n protected attachQueryObserver() {\r\n const query = this.getQuery();\r\n\r\n if (this.queryEventCallbackId) {\r\n query.removeChangedCallback(this.queryEventCallbackId);\r\n }\r\n\r\n this.queryEventCallbackId = query.addChangedCallback(event => {\r\n //if something has changed, and that change is related to columns\r\n const edata = event.data as QueryChangeEventData;\r\n if (edata.part != QueryChangePart.All) {\r\n return;\r\n }\r\n\r\n if (edata.source == this) {\r\n return;\r\n }\r\n\r\n this.reloadFacets();\r\n this.refreshCore(true);\r\n });\r\n }\r\n\r\n protected refreshCore(force = false) {\r\n if (this.firstRender || force) {\r\n this.clear();\r\n this.createAddMenu();\r\n this.render();\r\n }\r\n\r\n this.validateAddFacetButton();\r\n\r\n this.renderActiveFacet();\r\n this.updateTotalRecords();\r\n }\r\n\r\n private menuItems = [\r\n { id: FacetType.DataGrid, text: i18n.getText('Facets', 'AddMenuItems', 'DataTable') },\r\n { id: FacetType.Chart, text: i18n.getText('Facets', 'AddMenuItems', 'Chart') },\r\n { id: FacetType.PivotTable, text: i18n.getText('Facets', 'AddMenuItems', 'Pivot') }\r\n ]\r\n\r\n private menuItemsFilter = (item) => { \r\n if (this.options.facetTypes.indexOf(item.id) < 0)\r\n return false;\r\n\r\n\r\n if (item.id === FacetType.DataGrid) {\r\n return this.facets.filter(facet => facet.getType() == FacetType.DataGrid).length === 0;\r\n }\r\n \r\n return true;\r\n };\r\n\r\n protected createAddMenu() {\r\n this.addMenu = new PopupMenu({ \r\n items: this.menuItems, \r\n id: \"FacetType-List\" \r\n });\r\n }\r\n\r\n protected updateTotalRecords() {\r\n const context = this.getContext();\r\n const total = context.resultTable.getTotal();\r\n this.recordsDiv.innerHTML = i18n.getText('Facets', 'TotalRecordsLabel') + ' ' + total;\r\n\r\n if (total == 0) {\r\n domel(this.exportDiv).hide();\r\n }\r\n else {\r\n domel(this.exportDiv).show();\r\n }\r\n }\r\n\r\n private _processBlock: HTMLElement;\r\n\r\n private renderProcessBlock() {\r\n const html = '<div class=\"wBall\" id=\"wBall_1\"><div class=\"wInnerBall\"></div></div><div class=\"wBall\" id=\"wBall_2\"><div class=\"wInnerBall\"></div></div><div class=\"wBall\" id=\"wBall_3\"><div class=\"wInnerBall\"></div></div><div class=\"wBall\" id=\"wBall_4\"><div class=\"wInnerBall\"></div></div><div class=\"wBall\" id=\"wBall_5\"><div class=\"wInnerBall\"></div></div>';;\r\n\r\n this._processBlock = domel('div')\r\n .addClass(`${this.cssPrefix}-spinner`)\r\n .addChild('div', b => b\r\n .addClass(`${eqCssPrefix}-progress-win8`, browserUtils.getMobileCssClass())\r\n .addHtml(html)\r\n )\r\n .toDOM();\r\n }\r\n\r\n protected onProcessStartCore() {\r\n if (this.options.showProcessIndicator) {\r\n // FacetsPanel might be not rendered yet, so \r\n // it has no body\r\n if (!this._processBlock.parentNode && this.bodyDiv) {\r\n this.bodyDiv.childNodes.forEach(el => {\r\n domel(el as HTMLElement).hide();\r\n });\r\n this.bodyDiv.appendChild(this._processBlock);\r\n }\r\n }\r\n }\r\n \r\n protected onProcessEndCore() {\r\n if (this.options.showProcessIndicator) {\r\n if (this._processBlock.parentNode) {\r\n try {\r\n this._processBlock.parentNode\r\n .removeChild(this._processBlock);\r\n }\r\n catch(e) {\r\n\r\n }\r\n finally {\r\n this.renderActiveFacet(false);\r\n }\r\n }\r\n }\r\n }\r\n\r\n protected render() {\r\n this.firstRender = false;\r\n \r\n this.headerDiv = domel('div', this.slot)\r\n .addClass(`${this.cssPrefix}-header`)\r\n .toDOM();\r\n\r\n this.tabsDiv = \r\n domel('div', this.headerDiv)\r\n .addClass(`${this.cssPrefix}-tabs`)\r\n .toDOM();\r\n\r\n this.tabsUl = domel('ul', this.tabsDiv)\r\n .addClass(`${this.cssPrefix}-nav-tabs`)\r\n .toDOM();\r\n\r\n this.bodyDiv = \r\n domel('div', this.slot)\r\n .addClass(`${this.cssPrefix}-body`)\r\n .toDOM();\r\n\r\n for(const facet of this.facets) {\r\n this.renderFacet(facet);\r\n }\r\n\r\n domel(this.tabsDiv)\r\n .addChild('div', b => this.addFacetButton = b\r\n .addClass(`${this.cssPrefix}-add-button`)\r\n .title(i18n.getText('Facets', 'NewFacetTitle'))\r\n .addChild('a', b => b\r\n .attr('href', 'javascript:void(0)')\r\n )\r\n .on('click', (e) => this.addClickHandler(e as MouseEvent))\r\n .toDOM()\r\n ) \r\n\r\n const manageDiv = domel('div', this.headerDiv)\r\n .addClass(`${this.cssPrefix}-manage`)\r\n .toDOM();\r\n\r\n this.recordsDiv = domel('div', manageDiv)\r\n .addClass(`${this.cssPrefix}-total-recs`)\r\n .toDOM();\r\n \r\n if (this.options.showRefreshButton || this.options.showExportButton || this.options.showMaximizeButton) {\r\n const bdb = domel('div', manageDiv)\r\n .addClass(`${this.cssPrefix}-total-buttons`)\r\n .toDOM();\r\n\r\n if (this.options.showExportButton) {\r\n this.exportDiv = domel('button', bdb)\r\n .on('click', () => this.exportHandler())\r\n .addClass(`${this.cssPrefix}-button`)\r\n .addClass(`${this.cssPrefix}-button-export`)\r\n .title(i18n.getText('Facets', 'ExportBtnTitle'))\r\n .toDOM();\r\n }\r\n\r\n if (this.options.showRefreshButton ) {\r\n domel('button', bdb)\r\n .on('click', () => this.refreshHandler())\r\n .addClass(`${this.cssPrefix}-button`)\r\n .addClass(`${this.cssPrefix}-button-refresh`)\r\n .title(i18n.getText('Facets', 'RefreshBtnTitle'));\r\n }\r\n\r\n if (this.options.showMaximizeButton ) {\r\n this.maximizeButton = domel('button', bdb)\r\n .on('click', () => this.options.maximize2Window ? this.maximizeHandler(true) : this.maximizeHandler())\r\n .addClass(`${this.cssPrefix}-button`)\r\n .addClass(`${this.cssPrefix}-button-maximize`)\r\n .title(i18n.getText('Facets', 'MaximizeBtnTitle'))\r\n .toDOM();\r\n }\r\n }\r\n }\r\n\r\n protected refreshHandler() {\r\n const context = this.getContext();\r\n context.fetchData({\r\n success: () => {\r\n // possibly we should move this logic to context\r\n context.refreshWidgets(WidgetGroup.Result);\r\n }\r\n });\r\n }\r\n\r\n protected exportHandler() {\r\n const context = this.getContext();\r\n new ExportDialog(context)\r\n .show()\r\n }\r\n\r\n protected maximizeHandler(toWindow?: boolean) {\r\n let b = domel(this.slot);\r\n if (toWindow) {\r\n b.toggleClass(`${eqCssPrefix}-maximized-2window`);\r\n\r\n if (this.slot.classList.contains(`${eqCssPrefix}-maximized-2window`)) {\r\n this.maximizeButton.title = i18n.getText('Facets', 'RestoreBtnTitle');\r\n this.maximizeButton.classList.toggle(`${this.cssPrefix}-button-maximize`, false);\r\n this.maximizeButton.classList.toggle(`${this.cssPrefix}-button-restore`, true);\r\n }\r\n else {\r\n this.maximizeButton.title = i18n.getText('Facets', 'MaximizeBtnTitle');\r\n this.maximizeButton.classList.toggle(`${this.cssPrefix}-button-restore`, false);\r\n this.maximizeButton.classList.toggle(`${this.cssPrefix}-button-maximize`, true);\r\n }\r\n }\r\n else {\r\n const isMaximized = !this.slot.hasAttribute('data-is-maximized');\r\n\r\n if (isMaximized) {\r\n this.slot.setAttribute('data-is-maximized', '');\r\n this.maximizeButton.title = i18n.getText('Facets', 'RestoreBtnTitle');\r\n this.maximizeButton.classList.toggle(`${this.cssPrefix}-button-maximize`, false);\r\n this.maximizeButton.classList.toggle(`${this.cssPrefix}-button-restore`, true);\r\n }\r\n else {\r\n this.slot.removeAttribute('data-is-maximized');\r\n this.maximizeButton.title = i18n.getText('Facets', 'MaximizeBtnTitle');\r\n this.maximizeButton.classList.toggle(`${this.cssPrefix}-button-restore`, false);\r\n this.maximizeButton.classList.toggle(`${this.cssPrefix}-button-maximize`, true);\r\n }\r\n\r\n const arrToHide = document.querySelectorAll('[data-hide-on-max]');\r\n arrToHide.forEach(el => {\r\n if (isMaximized) {\r\n el.setAttribute('style', 'display: none;')\r\n }\r\n else {\r\n el.removeAttribute('style');\r\n }\r\n });\r\n }\r\n\r\n this.facets.forEach(facetTab => facetTab.onResize());\r\n }\r\n\r\n protected renderActiveFacet(refresh = true) {\r\n this.tabsUl.querySelectorAll<HTMLElement>('li') //`.${this.cssPrefix}-header-item.${this.cssPrefix}-facet`)\r\n .forEach((el, index) => {\r\n if (el.classList.contains('active')) {\r\n el.classList.remove('active');\r\n }\r\n if (this.activeFacetIndex === index) {\r\n el.classList.add('active')\r\n }\r\n });\r\n\r\n this.bodyDiv.querySelectorAll<HTMLElement>(`.${eqCssPrefix}-facet`)\r\n .forEach((el, index) => {\r\n domel(el).hide();\r\n\r\n if (this.activeFacetIndex === index) {\r\n domel(el).show();\r\n if (refresh) {\r\n this.facets[index].refresh();\r\n }\r\n }\r\n });\r\n }\r\n\r\n protected renderFacet(facet: ResultFacet) { \r\n this.renderFacetTab(facet);\r\n \r\n const body = this.renderFacetSlot(facet);\r\n \r\n facet.init(body);\r\n }\r\n\r\n protected renderFacetTab(facet: ResultFacet): HTMLElement {\r\n return domel('li', this.tabsUl)\r\n //.addClass(`${this.cssPrefix}-header-item`, `${this.cssPrefix}-facet`)\r\n //facet settings button\r\n .addChild('span', b => b\r\n .addClass(`${eqCssPrefix}-facet-settings`)\r\n .on('click', (e) => {\r\n e.stopPropagation();\r\n this.settingsClickHandler(facet);\r\n })\r\n )\r\n .addChild('a', b => b\r\n .addText(facet.title)\r\n .attr('href', 'javascript:void(0)')\r\n )\r\n //facet close button\r\n .addChild('span', b => b\r\n .addClass(`${eqCssPrefix}-facet-close`)\r\n .on('click', (e) => {\r\n e.stopPropagation();\r\n this.closeClickHandler(facet);\r\n })\r\n )\r\n .on('click', (e) => this.selectClickHandler(facet))\r\n .toDOM();\r\n }\r\n\r\n protected renderFacetSlot(facet): HTMLElement {\r\n let element = domel('div', this.bodyDiv)\r\n .addClass(`${eqCssPrefix}-facet`)\r\n .hide()\r\n .toDOM();\r\n \r\n return element;\r\n }\r\n\r\n private refreshFacetTabs() {\r\n this.tabsUl.querySelectorAll<HTMLElement>('li') //`.${this.cssPrefix}-header-item.${this.cssPrefix}-facet`)\r\n .forEach((item) => {\r\n this.tabsUl.removeChild(item);\r\n });\r\n \r\n for(const facet of this.facets) {\r\n this.renderFacetTab(facet);\r\n }\r\n }\r\n\r\n protected removeFacet(facet: ResultFacet) {\r\n const index = this.facets.indexOf(facet);\r\n if (index >= 0) {\r\n this.facets.splice(index, 1);\r\n\r\n const header = this.tabsUl.childNodes[index];\r\n this.tabsUl.removeChild(header);\r\n\r\n const body = this.bodyDiv.childNodes[index];\r\n this.bodyDiv.removeChild(body);\r\n\r\n if (this.facets.length > 0) {\r\n this.activeFacetIndex = \r\n index < this.facets.length \r\n ? index\r\n : this.facets.length - 1;\r\n }\r\n else {\r\n this.activeFacetIndex = -1;\r\n }\r\n this.renderActiveFacet();\r\n this.validateAddFacetButton();\r\n }\r\n }\r\n\r\n private addClickHandler(ev: MouseEvent) {\r\n this.addMenu.showMenu({\r\n anchor: ev.target as HTMLElement,\r\n itemFilterCallback: this.menuItemsFilter,\r\n itemSelectedCallback: (data) => {\r\n const facet = this.createFacetTab(data.id);\r\n const facetSlot = this.renderFacetSlot(facet);\r\n facet.init(facetSlot);\r\n facet.showSettingsDialog()\r\n .then(submited => {\r\n if (submited) { \r\n this.facets.push(facet);\r\n this.activeFacetIndex = this.facets.length - 1;\r\n \r\n this.renderFacetTab(facet); \r\n this.renderActiveFacet();\r\n \r\n this.saveFacets();\r\n }\r\n else {\r\n this.bodyDiv.removeChild(facetSlot);\r\n }\r\n\r\n //this.validateAddFacetButton();\r\n })\r\n .catch(error => console.error(error));\r\n }\r\n });\r\n }\r\n\r\n private selectClickHandler(facet: ResultFacet) {\r\n const index = this.facets.indexOf(facet);\r\n this.setActiveFacet(index);\r\n }\r\n\r\n private settingsClickHandler(facet: ResultFacet) {\r\n facet.showSettingsDialog()\r\n .then(submited => {\r\n if (submited) { \r\n this.refreshFacetTabs();\r\n this.renderActiveFacet();\r\n this.saveFacets();\r\n }\r\n })\r\n .catch(error => console.error(error));\r\n }\r\n\r\n private closeClickHandler(facet: ResultFacet) {\r\n const ds = this.getDialogService();\r\n ds.openConfirm(i18n.getText('Facets', 'RemoveFacetDlgTitle'), \r\n i18n.getText('Facets', 'RemoveFacetDlgContent')\r\n .replace('{facetTitle}', facet.title))\r\n .then(confirmed => {\r\n if (confirmed) {\r\n this.removeFacet(facet);\r\n this.saveFacets();\r\n }\r\n })\r\n .catch(error => console.error(error));\r\n }\r\n\r\n public clear() {\r\n this.firstRender = true;\r\n this.slot.innerHTML = \"\";\r\n }\r\n\r\n protected createDefaultFacetIfNotExist() {\r\n if (this.facets.length === 0) {\r\n const facet = this.createFacetTab(FacetType.DataGrid);\r\n this.facets.push(facet);\r\n this.activeFacetIndex = 0;\r\n }\r\n }\r\n\r\n protected validateAddFacetButton() {\r\n this.addFacetButton.hidden = this.addMenu.getItems()\r\n .filter(this.menuItemsFilter).length == 0;\r\n }\r\n\r\n protected setActiveFacet(index: number) {\r\n if (this.activeFacetIndex != index) {\r\n this.activeFacetIndex = index;\r\n this.renderActiveFacet();\r\n this.saveFacets(true);\r\n }\r\n }\r\n\r\n protected setOptions(options?: ResultFacetsPanelOptions) {\r\n dataUtils.assignDeep(this.options, options);\r\n }\r\n\r\n protected getDialogService(): DialogService {\r\n return this.getContext()\r\n .getServices()\r\n .getDialogService();\r\n }\r\n\r\n protected saveFacets(isActivate = false) {\r\n const query = this.getQuery();\r\n query.innerData = query.innerData || {};\r\n query.innerData.facets = {\r\n active: this.activeFacetIndex,\r\n items: this.facets.map(f => f.saveToData())\r\n };\r\n query.fireChangedEvent({\r\n part: QueryChangePart.Facets,\r\n action: isActivate ? QueryChangeAction.Activate : QueryChangeAction.All,\r\n source: this\r\n });\r\n }\r\n\r\n private reloadFacets() {\r\n for(const facet of this.facets) {\r\n facet.destroy();\r\n }\r\n this.loadFacets();\r\n }\r\n\r\n protected loadFacets() {\r\n const query = this.getQuery();\r\n this.facets = [];\r\n if (query.innerData && query.innerData.facets) {\r\n const items = query.innerData.facets.items;\r\n for(const fd of items) {\r\n const facet = this.createFacetTab(fd.type);\r\n facet.loadFromData(fd);\r\n this.facets.push(facet);\r\n }\r\n\r\n const active = query.innerData.facets.active;\r\n this.activeFacetIndex = (active >= 0) \r\n ? active\r\n : this.facets.length - 1;\r\n }\r\n else {\r\n this.createDefaultFacetIfNotExist();\r\n }\r\n }\r\n}","import { utils as dataUtils } from '@easydata/core';\r\nimport { EqContext, Widget, WidgetGroup } from '@easyquery/core';\r\n\r\nimport { ExportDialog } from '../dialog/export_dialog';\r\n\r\nexport class ExportWidget extends Widget {\r\n\r\n getWidgetType(): string {\r\n return 'exportWidget';\r\n }\r\n\r\n constructor(slot: HTMLElement) {\r\n super(slot);\r\n\r\n this.group = WidgetGroup.All;\r\n }\r\n\r\n private options = {\r\n defFormat: 'csv',\r\n enableExport: true\r\n };\r\n\r\n public init(context: EqContext, options: any) {\r\n super.init(context, options);\r\n\r\n this.options = dataUtils.assignDeep(this.options, options);\r\n\r\n this.slot.addEventListener('click', this.clickHandler);\r\n }\r\n\r\n protected refreshCore() {\r\n if (this.options.enableExport && this.context.resultTable \r\n && this.context.resultTable.getCachedCount() > 0) {\r\n this.slot.removeAttribute('disabled');\r\n }\r\n else {\r\n this.slot.setAttribute('disabled', '');\r\n }\r\n }\r\n\r\n protected destroyCore() {\r\n this.slot.removeAttribute('disabled');\r\n this.slot.removeEventListener('click', this.clickHandler);\r\n }\r\n\r\n private clickHandler = (ev: MouseEvent) => {\r\n if (!this.slot.hasAttribute('disabled'))\r\n new ExportDialog(this.context).show(this.options.defFormat);\r\n }\r\n\r\n}","import { AggregationSettings, utils as dataUtils } from '@easydata/core';\r\nimport { domel, DomElementBuilder } from '@easydata/ui';\r\n\r\nimport { AggrFunction, ExprTag, Query, QueryColumn } from '@easyquery/core';\r\nimport { PopupMenu } from '../../../utils/popup_menu';\r\n\r\nimport { i18n } from '@easyquery/core';\r\n\r\nexport interface AggrSettingsRendererOptions {\r\n slot: HTMLElement,\r\n query: Query,\r\n onChanged?: () => void;\r\n}\r\n\r\nexport class AggrSettingsRenderer { \r\n protected state: {\r\n groups: {\r\n columns: string[]\r\n }[],\r\n aggregates: {\r\n colId: string,\r\n funcId: string\r\n }[],\r\n recordCount: boolean;\r\n grandTotals: boolean\r\n };\r\n\r\n protected slot: HTMLElement;\r\n\r\n protected query: Query;\r\n\r\n private onChanged?: () => void;\r\n\r\n protected get cssPrefix(): string {\r\n return 'eqjs-as';\r\n }\r\n\r\n constructor(options: AggrSettingsRendererOptions) {\r\n if (!options || !options.slot)\r\n throw new Error('slot is required');\r\n\r\n if (!options || !options.query)\r\n throw new Error('query is required');\r\n\r\n this.slot = options.slot;\r\n this.query = options.query;\r\n\r\n this.onChanged = options.onChanged;\r\n\r\n this.dropSelectState();\r\n this.dropState();\r\n }\r\n\r\n public render() {\r\n this.createFunctionMenu();\r\n this.setInitialState();\r\n this.changed();\r\n }\r\n\r\n private setInitialState() {\r\n const aggrSettings = this.query.getAggregationSettings();\r\n const groups = aggrSettings.getInternalGroups();\r\n const aggrs = aggrSettings.getAggregates();\r\n\r\n for(const group of groups) {\r\n this.state.groups.push({\r\n columns: group.columns\r\n });\r\n }\r\n\r\n for(const aggr of aggrs) {\r\n this.state.aggregates.push({\r\n colId: aggr.colId,\r\n funcId: aggr.funcId\r\n })\r\n }\r\n\r\n this.state.grandTotals = aggrSettings.hasGrandTotals();\r\n\r\n this.state.recordCount = aggrSettings.hasRecordCount();\r\n }\r\n\r\n protected getAvailableColumns() {\r\n return this.query.getColumns().filter(c => c.enabled);\r\n }\r\n\r\n private selectState = {\r\n columns: []\r\n };\r\n\r\n protected renderCore() {\r\n this.slot.innerHTML = '';\r\n\r\n const cols = this.getAvailableColumns();\r\n\r\n const slotb = domel(this.slot as HTMLDivElement);\r\n let currentGroup = null;\r\n let groupBlockColumns: DomElementBuilder<HTMLDivElement> = null;\r\n let selectedBlockColumns: DomElementBuilder<HTMLDivElement> = null;\r\n\r\n const aggregates = this.state.aggregates;\r\n\r\n let groupCounter = -1;\r\n for(const col of cols) {\r\n if (currentGroup) {\r\n if (currentGroup.columns.indexOf(col.id) >= 0) {\r\n // render to current group div\r\n this.renderColumn(groupBlockColumns, col, true);\r\n continue;\r\n }\r\n }\r\n\r\n currentGroup = this.getGroupForColumn(col.id);\r\n if (currentGroup != null) {\r\n groupCounter++;\r\n // create groupDiv\r\n const groupBlock = domel('div', this.slot)\r\n .addClass(`${this.cssPrefix}-group`)\r\n .data('gindex', `${groupCounter}`);\r\n\r\n groupBlockColumns = domel('div', groupBlock.toDOM())\r\n .addClass(`${this.cssPrefix}-columns`);\r\n\r\n this.renderColumn(groupBlockColumns, col, true);\r\n \r\n continue;\r\n }\r\n \r\n const aggr = aggregates.filter(a => a.colId == col.id)[0];\r\n if (aggr) {\r\n const aggrBlock = domel('div', this.slot)\r\n .addClass(`${this.cssPrefix}-aggr`)\r\n\r\n this.renderColumn(aggrBlock, col, true, aggr.funcId);\r\n\r\n aggrBlock\r\n .addChild('div', b => b\r\n .addClass(`${this.cssPrefix}-buttons`)\r\n .addChild('button', b => b\r\n .addClass(`${this.cssPrefix}-unaggr-btn`)\r\n .title(i18n.getText('AggrSettings', 'UnaggrBtn'))\r\n .on('click', this.removeAggrBtnClickHandler.bind(this))\r\n )\r\n )\r\n\r\n continue;\r\n }\r\n\r\n if (this.selectState.columns.indexOf(col.id) >= 0) {\r\n // create selectedDiv\r\n if (selectedBlockColumns == null) {\r\n const selectedBlock = domel('div', this.slot)\r\n .addClass(`${this.cssPrefix}-selected`)\r\n\r\n selectedBlockColumns = domel('div', selectedBlock.toDOM())\r\n .addClass(`${this.cssPrefix}-columns`);\r\n }\r\n\r\n this.renderColumn(selectedBlockColumns, col, false);\r\n continue;\r\n }\r\n\r\n // render column as is\r\n this.renderColumn(slotb, col, false);\r\n }\r\n\r\n if (selectedBlockColumns) {\r\n const buttonsContainer = domel('div', selectedBlockColumns.toDOM().parentElement) \r\n .addClass(`${this.cssPrefix}-buttons`);\r\n\r\n buttonsContainer.addChild('button', b => b\r\n .addClass(`${this.cssPrefix}-group-btn`)\r\n .title(i18n.getText('AggrSettings', 'GroupBtn'))\r\n .on('click', this.groupBtnClickHandler.bind(this))\r\n );\r\n\r\n if (this.selectState.columns.length == 1) {\r\n buttonsContainer.addChild('button', b => b\r\n .addClass(`${this.cssPrefix}-aggr-btn`)\r\n .title(i18n.getText('AggrSettings', 'AggrBtn'))\r\n .on('click', this.aggrBtnClickHandler.bind(this))\r\n );\r\n }\r\n }\r\n\r\n domel(this.slot)\r\n .addChild('div', b => b\r\n .addClass(`${this.cssPrefix}-counts`)\r\n .addChild('label', b => b\r\n .addClass('eqjs-ctrl-switch')\r\n .addChild('input', b => {\r\n b.attr('type', 'checkbox');\r\n if (this.state.recordCount) {\r\n b.attr('checked', '')\r\n }\r\n\r\n b.on('change', this.countsCheckboxChangeHandler.bind(this))\r\n })\r\n .addChild('span', b => b\r\n .addClass('slider round')\r\n )\r\n .addChild('span', b => b\r\n .addClass('switch-text')\r\n .addText(i18n.getText('AggrSettings', 'GroupCountsLabel'))\r\n )\r\n )\r\n )\r\n .addChild('div', b => b\r\n .addClass(`${this.cssPrefix}-grandtotals`)\r\n .addChild('label', b => b\r\n .addClass('eqjs-ctrl-switch')\r\n .addChild('input', b => {\r\n b.attr('type', 'checkbox');\r\n if (this.state.grandTotals) {\r\n b.attr('checked', '')\r\n }\r\n\r\n b.on('change', this.grandCheckboxChangeHandler.bind(this))\r\n })\r\n .addChild('span', b => b\r\n .addClass('slider round')\r\n )\r\n .addChild('span', b => b\r\n .addClass('switch-text')\r\n .addText(i18n.getText('AggrSettings', 'GrandTotalsLabel'))\r\n )\r\n )\r\n );\r\n\r\n const groups = this.slot.querySelectorAll(`.${this.cssPrefix}-group`);\r\n groups.forEach(el => {\r\n domel(el as HTMLElement)\r\n .addChild('div', b => b\r\n .addClass(`${this.cssPrefix}-buttons`)\r\n .addChild('button', b => b\r\n .addClass(`${this.cssPrefix}-ungroup-btn`)\r\n .title(i18n.getText('AggrSettings', 'UngroupBtn'))\r\n .on('click', this.removeGroupBtnClickHandler.bind(this))\r\n )\r\n );\r\n });\r\n\r\n this.validateCheckboxes();\r\n }\r\n\r\n private validateCheckboxes() { \r\n\r\n if (this.selectState.columns.length === 0)\r\n return;\r\n\r\n let prevElement: HTMLElement, prevInputEl: HTMLElement, \r\n nextInputEl: HTMLElement = null;\r\n for (let i = 0; i < this.slot.childNodes.length; i++) {\r\n const el = this.slot.childNodes[i] as HTMLElement;\r\n if (el.classList.contains(`${this.cssPrefix}-selected`)) {\r\n if (prevElement && prevElement.classList.contains(`${this.cssPrefix}-column`)) {\r\n prevInputEl = prevElement;\r\n } \r\n } \r\n else if (el.classList.contains(`${this.cssPrefix}-column`)) {\r\n if (prevElement && prevElement.classList.contains(`${this.cssPrefix}-selected`)) {\r\n nextInputEl = el;\r\n }\r\n } \r\n\r\n prevElement = el;\r\n };\r\n\r\n for (let i = 0; i < this.slot.childNodes.length; i++) {\r\n const el = this.slot.childNodes[i] as HTMLElement;\r\n\r\n if (el.classList.contains(`${this.cssPrefix}-column`) && el != prevInputEl && el != nextInputEl) {\r\n el.firstElementChild.firstElementChild.setAttribute('disabled', '');\r\n }\r\n };\r\n\r\n const selector = `.${this.cssPrefix}-selected>.${this.cssPrefix}-columns>.${this.cssPrefix}-column`\r\n const selectedCols = this.slot.querySelectorAll(selector);\r\n for (let i = 1; i < selectedCols.length - 1; i++) {\r\n const el = selectedCols[i];\r\n el.firstElementChild.firstElementChild.setAttribute('disabled', '');\r\n }\r\n \r\n }\r\n\r\n public isValid(): boolean {\r\n const hasSelected = this.selectState.columns.length;\r\n const hasAggrs = this.state.aggregates.length > 0;\r\n const hasGroups = this.state.groups.length > 0;\r\n const hasTotals = this.state.grandTotals;\r\n const hasCounts = this.state.recordCount;\r\n\r\n if (hasSelected)\r\n return false;\r\n\r\n if (hasGroups) {\r\n return hasAggrs || hasCounts;\r\n }\r\n\r\n if (hasAggrs) {\r\n return hasGroups || hasTotals;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n public getValidationMessage() {\r\n const hasSelected = this.selectState.columns.length;\r\n const hasAggrs = this.state.aggregates.length > 0;\r\n const hasGroups = this.state.groups.length > 0;\r\n const hasTotals = this.state.grandTotals;\r\n const hasRecCount = this.state.recordCount;\r\n\r\n if (hasSelected)\r\n return `${i18n.getText('AggrSettings', 'SelectedError')} `;\r\n\r\n if (hasGroups && !hasAggrs && !hasRecCount)\r\n return `${i18n.getText('AggrSettings', 'NoAggrOrCountError')} `;\r\n\r\n if (hasAggrs && !hasGroups && !hasTotals)\r\n return `${i18n.getText('AggrSettings', 'NoGroupsOrGrandError')} `;\r\n\r\n return `${i18n.getText('AggrSettings', 'NoGroupsOrAggrError')} `;\r\n }\r\n\r\n public getSettings(): AggregationSettings {\r\n const settings = new AggregationSettings(this.query);\r\n for(const group of this.state.groups) {\r\n settings.addGroup({ columns: group.columns });\r\n }\r\n\r\n for(const aggr of this.state.aggregates) {\r\n settings.addAggregateColumn(aggr.colId, aggr.funcId);\r\n }\r\n\r\n if (this.state.grandTotals) {\r\n settings.addGrandTotals();\r\n }\r\n\r\n if (this.state.recordCount) {\r\n settings.addCounts();\r\n }\r\n\r\n return settings;\r\n }\r\n\r\n protected renderColumn(b: DomElementBuilder<HTMLDivElement>, col: QueryColumn, isTaken: boolean, funcId: string = null) {\r\n b.addChild('div', b => {\r\n b.data('colid', col.id);\r\n\r\n const caption = funcId \r\n ? `${col.caption} (${this.funcMap[funcId].caption})`\r\n : col.caption;\r\n\r\n if (!isTaken) {\r\n b\r\n .addClass(`${this.cssPrefix}-column`)\r\n .addChild('label', b => b\r\n .addClass('checkbox')\r\n .addChild('input', b => { \r\n b.attr('type', 'checkbox');\r\n if (this.selectState.columns.indexOf(col.id) >= 0) {\r\n b.attr('checked', '')\r\n }\r\n\r\n b.on('change', this.colCheckboxChangeHandler.bind(this))\r\n })\r\n .addText(caption)\r\n );\r\n }\r\n else {\r\n b\r\n .addClass(`${this.cssPrefix}-column-used`)\r\n .addText(caption)\r\n }\r\n });\r\n }\r\n\r\n protected getGroupForColumn(colId: string) {\r\n const index = this.getGroupIndexForColumn(colId);\r\n if (index >= 0)\r\n return this.state.groups[index];\r\n return null;\r\n }\r\n\r\n protected getGroupIndexForColumn(colId: string): number {\r\n for(var i = 0; i < this.state.groups.length; i ++) {\r\n const group = this.state.groups[i];\r\n if (group.columns.indexOf(colId) >= 0)\r\n return i;\r\n }\r\n\r\n return -1;\r\n }\r\n\r\n protected grandCheckboxChangeHandler(ev: Event) {\r\n this.state.grandTotals = !this.state.grandTotals;\r\n this.onChanged && this.onChanged();\r\n }\r\n\r\n protected countsCheckboxChangeHandler(ev: Event) {\r\n this.state.recordCount = !this.state.recordCount;\r\n this.onChanged && this.onChanged();\r\n }\r\n\r\n protected colCheckboxChangeHandler(ev: Event) {\r\n const input = ev.target as HTMLInputElement;\r\n const colId = input.parentElement.parentElement.getAttribute('data-colid');\r\n\r\n // toggle column to track state\r\n const index = this.selectState.columns.indexOf(colId);\r\n if (index >= 0) {\r\n this.selectState.columns.splice(index, 1);\r\n }\r\n else {\r\n this.selectState.columns.push(colId);\r\n const cols = this.getAvailableColumns();\r\n this.selectState.columns = this.selectState.columns.sort((col1, col2) => {\r\n const index1 = cols.findIndex(c => c.id == col1);\r\n const index2 = cols.findIndex(c => c.id == col2);\r\n return index1 - index2;\r\n });\r\n }\r\n\r\n this.changed();\r\n }\r\n\r\n protected groupBtnClickHandler() {\r\n this.state.groups.push({ columns: this.selectState.columns });\r\n\r\n const cols = this.getAvailableColumns();\r\n this.state.groups = this.state.groups.sort((g1, g2) => {\r\n const g1Index = cols.findIndex(c => c.id == g1.columns[0]);\r\n const g2Index = cols.findIndex(c => c.id == g2.columns[0]);\r\n return g1Index - g2Index;\r\n });\r\n\r\n this.dropSelectState();\r\n\r\n this.changed();\r\n }\r\n\r\n protected removeGroupBtnClickHandler(ev: Event) {\r\n const btn = ev.target as HTMLElement;\r\n const index = Number.parseInt(btn.parentElement.parentElement.getAttribute('data-gindex'));\r\n this.state.groups.splice(index, 1);\r\n\r\n this.changed();\r\n }\r\n\r\n protected removeAggrBtnClickHandler(ev: Event) {\r\n const btn = ev.target as HTMLElement;\r\n const colId = btn.parentElement.parentElement.querySelector(`.${this.cssPrefix}-column-used`)\r\n .getAttribute('data-colid');\r\n\r\n const index = this.state.aggregates.findIndex(a => a.colId == colId);\r\n if (index >= 0) {\r\n this.state.aggregates.splice(index, 1);\r\n this.changed();\r\n }\r\n }\r\n\r\n protected aggrBtnClickHandler(ev: Event) {\r\n const model = this.query.getModel();\r\n const colId = this.selectState.columns[0];\r\n const col = this.getAvailableColumns().filter(c => c.id == colId)[0];\r\n\r\n this.functionMenu.showMenu({\r\n anchor: ev.target as HTMLElement,\r\n itemFilterCallback: (item) => {\r\n return this.funcMap[item.id].appliedTypes.indexOf(col.expr.dataType) >= 0;\r\n },\r\n itemSelectedCallback: (data) => {\r\n this.state.aggregates.push({\r\n colId: colId,\r\n funcId: data.id\r\n });\r\n\r\n this.dropSelectState();\r\n\r\n this.changed();\r\n }\r\n });\r\n\r\n }\r\n\r\n protected clear() {\r\n this.dropSelectState();\r\n this.dropState();\r\n\r\n this.changed();\r\n }\r\n\r\n private dropSelectState() {\r\n this.selectState = {\r\n columns: []\r\n };\r\n }\r\n\r\n private dropState() {\r\n this.state = {\r\n groups: [],\r\n aggregates: [],\r\n recordCount: true,\r\n grandTotals: false\r\n };\r\n }\r\n\r\n private changed() {\r\n this.onChanged && this.onChanged();\r\n this.renderCore();\r\n }\r\n\r\n private functionMenu: PopupMenu;\r\n\r\n private funcMap: {\r\n [funcId: string]: AggrFunction\r\n } = {}\r\n\r\n private createFunctionMenu() {\r\n const model = this.query.getModel();\r\n const funcs = this.query.getModel().getAggrFunctions();\r\n\r\n const items = [];\r\n for (const func of funcs) {\r\n if (!func) continue;\r\n\r\n this.funcMap[func.id] = func;\r\n\r\n const funcCaption = model\r\n .getAggrFunctionCaption(func.id);\r\n\r\n const item = {\r\n id: func.id,\r\n text: funcCaption\r\n };\r\n\r\n items.push(item);\r\n }\r\n\r\n let menuId = this.slot.id;\r\n if (menuId) {\r\n menuId += '-FunctionsMenu';\r\n }\r\n\r\n const menuOptions = {\r\n items: items,\r\n id: menuId,\r\n searchBoxAlwaysShown: false,\r\n domWriteItemsId: true\r\n };\r\n\r\n this.functionMenu = new PopupMenu(menuOptions);\r\n }\r\n}","import { domel } from '@easydata/ui';\r\nimport { EqContext, i18n, Query, QueryChangePart } from '@easyquery/core';\r\nimport { AggrSettingsRenderer } from '../widgets/renderers/aggr_settings/aggr_settings_renderer';\r\n\r\nexport class AggrSettingsDialog {\r\n\r\n private query: Query;\r\n\r\n private renderer: AggrSettingsRenderer;\r\n\r\n private body: HTMLElement;\r\n\r\n constructor(protected context: EqContext) {\r\n \r\n }\r\n\r\n private promise: Promise<void> = null;\r\n\r\n public show(query?: Query) {\r\n const initQuery = query || this.context.getQuery();\r\n // copy query to prevent changes\r\n this.query = this.context.createQuery();\r\n this.query.loadFromData(initQuery.toJSONData());\r\n\r\n // to rewrite with returning new aggrsettigns \r\n // structure instead of apply on submit\r\n if (!this.promise) {\r\n this.promise = new Promise((resolve, reject) => {\r\n const ds = this.context.getServices().getDialogService();\r\n this.body = this.renderBody();\r\n var dlg = ds.open({\r\n title: i18n.getText('AggrSettings', 'AggrDialogTitle'),\r\n body: this.body,\r\n onSubmit: () => {\r\n if (this.query.enableAggregation && !this.renderer.isValid())\r\n return false;\r\n \r\n initQuery.enableAggregation = this.query.enableAggregation;\r\n if (initQuery.enableAggregation) {\r\n initQuery.useAggregation(settings => {\r\n const s = this.renderer.getSettings();\r\n settings.loadFromData(s.saveToData());\r\n });\r\n }\r\n\r\n initQuery.fireChangedEvent({\r\n part: QueryChangePart.Aggregation,\r\n wasModified: false\r\n });\r\n\r\n resolve();\r\n return true;\r\n },\r\n onCancel: () => {\r\n resolve();\r\n }\r\n });\r\n\r\n this.renderer = new AggrSettingsRenderer({\r\n slot: this.body.querySelector('#AggrSettingsComponent'),\r\n query: this.query,\r\n onChanged: () => {\r\n dlg.clearAlert();\r\n const isValid = this.renderer.isValid();\r\n if (!isValid) {\r\n const error = this.renderer.getValidationMessage();\r\n dlg.showAlert(error, 'warning');\r\n }\r\n \r\n const btn = dlg.getRootElement()\r\n .querySelector<HTMLButtonElement>('.kfrm-button.is-info');\r\n btn.disabled = !isValid && this.query.enableAggregation;\r\n }\r\n });\r\n if (this.query.enableAggregation) {\r\n this.renderer.render();\r\n }\r\n });\r\n }\r\n\r\n return this.promise.catch(e => console.error(e))\r\n .finally(() => this.promise = null);\r\n }\r\n\r\n protected renderBody(): HTMLElement {\r\n const b = domel('div')\r\n .addChild('div', b => b\r\n .addClass(`eqjs-as-enableaggr`)\r\n .addChild('label', b => b\r\n .addClass('eqjs-ctrl-switch')\r\n .addChild('input', b => {\r\n b.attr('type', 'checkbox');\r\n if (this.query.enableAggregation) {\r\n b.attr('checked', '')\r\n }\r\n\r\n b.on('change', this.enableAggrCheckBoxChangeHandler.bind(this))\r\n })\r\n .addChild('span', b => b\r\n .addClass('slider round')\r\n )\r\n .addChild('span', b => b\r\n .addClass('switch-text')\r\n .addText(i18n.getText('AggrSettings', 'EnableAggrLabel'))\r\n )\r\n )\r\n )\r\n .addChild('div', b => b\r\n .id('AggrSettingsComponent')\r\n );\r\n \r\n\r\n return b.toDOM();\r\n }\r\n\r\n protected enableAggrCheckBoxChangeHandler(e: Event) {\r\n this.query.enableAggregation = !this.query.enableAggregation;\r\n this.body.querySelector('#AggrSettingsComponent').innerHTML = '';\r\n if (this.query.enableAggregation) {\r\n this.renderer.render();\r\n }\r\n else {\r\n const btn = this.body ? this.body.closest('.kdlg-modal').querySelector<HTMLButtonElement>('footer .kfrm-button.is-info') : null;\r\n if (btn) {\r\n btn.disabled = false; \r\n }\r\n }\r\n }\r\n}","import { Widget, WidgetGroup, EqContext, i18n, Query } from '@easyquery/core';\r\nimport { browserUtils } from '../utils/browser_utils';\r\nimport { AggrSettingsDialog } from \"../dialog/aggr_settings_dialog\";\r\n\r\n/**\r\n * The widget responsed for rendering the name of the current query.\r\n */\r\nexport class AggregationBar extends Widget {\r\n private dialogLink: HTMLAnchorElement;\r\n private linkClickCallback = () => {\r\n new AggrSettingsDialog(this.context).show(this.getQuery());\r\n }\r\n\r\n private queryEventCallbackId: string = null;\r\n\r\n private customQuery?: Query;\r\n\r\n /**\r\n * The default constructor.\r\n * @param slot The HTML element where our widget should be placed.\r\n * @param customQuery The custom query\r\n */\r\n constructor(slot: HTMLElement, customQuery?: Query) {\r\n super(slot);\r\n\r\n this.customQuery = customQuery;\r\n this.group = WidgetGroup.Query | WidgetGroup.QueryStatus;\r\n } \r\n\r\n public init(context: EqContext, options: any) {\r\n super.init(context, options);\r\n\r\n this.destroyCore();\r\n this.attachQueryObserver();\r\n }\r\n\r\n protected get cssPrefix(): string {\r\n return 'eqjs-aggrb';\r\n }\r\n\r\n public getWidgetType(): string {\r\n return 'aggregationBar';\r\n }\r\n\r\n /**\r\n * Refresh widget implementation\r\n */\r\n protected refreshCore() {\r\n this.render();\r\n }\r\n\r\n protected getLinkText(): string {\r\n const query = this.getQuery();;\r\n if (query.enableAggregation) {\r\n const aggrSettings = query.getAggregationSettings();\r\n const groups = aggrSettings.getInternalGroups();\r\n const aggrs = aggrSettings.getAggregates();\r\n\r\n let groupArr = [];\r\n const cols = query.getColumns();\r\n for(const group of groups) {\r\n const colNames = group.columns.map(value => {\r\n const col = cols.find(c => c.id == value);\r\n if (col) {\r\n return col.caption;\r\n }\r\n else {\r\n return ''\r\n }\r\n })\r\n\r\n groupArr.push(`[${colNames.join(', ')}]`); \r\n }\r\n\r\n const groupString = groupArr.join(', ');\r\n \r\n let aggrArr = [];\r\n const funcs = query.getModel().getAggrFunctions();\r\n for(const aggr of aggrs) {\r\n const col = cols.find(c => c.id == aggr.colId);\r\n const func = funcs.find(f => f.id == aggr.funcId);\r\n\r\n if (col && func) {\r\n aggrArr.push(`${col.caption} (${func.caption})`); \r\n }\r\n }\r\n\r\n const aggrString = aggrArr.join(', ');\r\n\r\n return `${groupString || i18n.getText('AggrSettings', 'NoGroupsLabel')} ::: ${aggrString ? `<${aggrString}>` : i18n.getText('AggrSettings', 'NoAggrsLabel')}`;\r\n }\r\n else {\r\n return i18n.getText('AggrSettings', 'EmptySettingsLabel');\r\n }\r\n\r\n }\r\n\r\n private render() {\r\n this.slot.classList.add(`${this.cssPrefix}-panel`);\r\n const mobClass = browserUtils.getMobileCssClass();\r\n if (mobClass) {\r\n this.slot.classList.add(mobClass)\r\n }\r\n \r\n if (!this.dialogLink) {\r\n this.dialogLink = document.createElement('a');\r\n this.dialogLink.setAttribute('href', 'javascript:void(0)');\r\n this.slot.appendChild(this.dialogLink);\r\n }\r\n\r\n // Update\r\n\r\n this.dialogLink.textContent = this.getLinkText();\r\n this.dialogLink.removeEventListener('click', this.linkClickCallback);\r\n this.dialogLink.addEventListener('click', this.linkClickCallback);\r\n }\r\n\r\n private clear() {\r\n this.slot.innerHTML = \"\";\r\n this.dialogLink = null;\r\n }\r\n\r\n private attachQueryObserver() {\r\n const query = this.getQuery();\r\n this.queryEventCallbackId = query.addChangedCallback(event => {\r\n this.refreshCore();\r\n });\r\n }\r\n\r\n private detachQueryObserver() {\r\n if (this.queryEventCallbackId) {\r\n const query = this.getQuery();\r\n query.removeChangedCallback(this.queryEventCallbackId);\r\n }\r\n }\r\n\r\n protected destroyCore() {\r\n this.clear();\r\n this.detachQueryObserver();\r\n }\r\n\r\n public getQuery(): Query {\r\n return this.customQuery || this.context.getQuery();\r\n }\r\n}\r\n","import { i18n } from '@easydata/core';\r\n\r\nimport { EqContext, Widget, WidgetGroup } from '@easyquery/core'\r\n\r\nexport class LocaleWidget extends Widget {\r\n\r\n private selectEl: HTMLSelectElement;\r\n\r\n /**\r\n * The default constructor.\r\n * @param slot The html element.\r\n */\r\n constructor(slot: HTMLElement) {\r\n super(slot);\r\n\r\n this.group = WidgetGroup.None;\r\n }\r\n\r\n public init(context: EqContext, options: any) {\r\n super.init(context, options);\r\n\r\n this.clear();\r\n this.render();\r\n }\r\n\r\n public getWidgetType(): string {\r\n return 'changeLocale';\r\n }\r\n\r\n private render() {\r\n const locales = i18n.getLocales();\r\n if (locales.length > 1) {\r\n\r\n this.selectEl = document.createElement('select');\r\n for(let locale of locales) {\r\n let optionEl = document.createElement('option');\r\n optionEl.value = locale.locale;\r\n optionEl.innerHTML = this.displayLocaleName(locale);\r\n this.selectEl.appendChild(optionEl)\r\n }\r\n\r\n this.selectEl.value = i18n.getCurrentLocale();\r\n this.selectEl.classList.add('eqv-select');\r\n this.selectEl.addEventListener('change', this.changeLocale);\r\n\r\n this.slot.appendChild(this.selectEl);\r\n }\r\n }\r\n\r\n private changeLocale = () => {\r\n const newLocale = this.selectEl.value;\r\n i18n.setCurrentLocale(newLocale);\r\n\r\n this.context.refreshWidgets(WidgetGroup.All);\r\n }\r\n\r\n private displayLocaleName(locale: i18n.LocaleInfoItem): string {\r\n if (locale.englishName && locale.displayName) {\r\n return `${locale.englishName} - ${locale.displayName}`;\r\n } \r\n else if (locale.englishName) {\r\n return locale.englishName;\r\n }\r\n else if (locale.displayName) {\r\n return locale.displayName;\r\n }\r\n\r\n return locale.locale;\r\n }\r\n\r\n private clear(){\r\n this.slot.innerHTML = \"\";\r\n }\r\n\r\n protected destroyCore() {\r\n this.clear();\r\n }\r\n}","import { Widget, WidgetGroup, EqContext } from '@easyquery/core';\r\nimport { browserUtils } from '../utils/browser_utils';\r\n/**\r\n * The widget responsed for rendering the name of the current query.\r\n */\r\nexport class QueryNameWidget extends Widget {\r\n private nameSlot: HTMLElement;\r\n private tooltipSlot: HTMLElement;\r\n private asteriskSlot: HTMLElement;\r\n\r\n private queryEventCallbackId: string = null;\r\n\r\n /**\r\n * The default constructor.\r\n * @param slot The HTML element where our widget should be placed.\r\n */\r\n constructor(slot: HTMLElement) {\r\n super(slot);\r\n this.group = WidgetGroup.Query | WidgetGroup.QueryStatus;\r\n } \r\n\r\n public init(context: EqContext, options: any) {\r\n super.init(context, options);\r\n\r\n this.destroyCore();\r\n this.attachQueryObserver();\r\n }\r\n\r\n protected get cssPrefix(): string {\r\n return 'eqjs-query-name';\r\n }\r\n\r\n public getWidgetType(): string {\r\n return 'queryName';\r\n }\r\n\r\n /**\r\n * Refresh widget implementation\r\n */\r\n protected refreshCore() {\r\n this.render();\r\n }\r\n\r\n private render() {\r\n this.slot.classList.add(`${this.cssPrefix}`);\r\n const mobClass = browserUtils.getMobileCssClass();\r\n if (mobClass) {\r\n this.slot.classList.add(mobClass)\r\n }\r\n \r\n if (!this.nameSlot) {\r\n this.nameSlot = document.createElement('div');\r\n this.nameSlot.classList.add(`${this.cssPrefix}-text`);\r\n this.nameSlot.classList.add(`${this.cssPrefix}-theme`);\r\n this.slot.appendChild(this.nameSlot);\r\n }\r\n\r\n if (!this.asteriskSlot) {\r\n this.asteriskSlot = document.createElement('span');\r\n this.asteriskSlot.innerHTML = \"*\";\r\n this.asteriskSlot.classList.add(`${this.cssPrefix}-asterisk`);\r\n this.slot.appendChild(this.asteriskSlot);\r\n }\r\n\r\n if (!this.tooltipSlot) {\r\n this.tooltipSlot = document.createElement('span');\r\n this.tooltipSlot.classList.add(`${this.cssPrefix}-tooltip`);\r\n this.tooltipSlot.classList.add(`${this.cssPrefix}-theme`);\r\n this.slot.appendChild(this.tooltipSlot);\r\n }\r\n\r\n\r\n // Update\r\n const queryName = this.context.getQuery().getName();\r\n this.nameSlot.textContent = queryName;\r\n this.tooltipSlot.textContent = queryName;\r\n\r\n this.asteriskSlot.style.visibility = this.context.getQuery().isModified() ? \"visible\" : \"hidden\";\r\n }\r\n\r\n private clear() {\r\n this.slot.innerHTML = \"\";\r\n this.nameSlot = null;\r\n this.tooltipSlot = null;\r\n this.asteriskSlot = null;\r\n \r\n }\r\n\r\n private attachQueryObserver() {\r\n const query = this.context.getQuery();\r\n\r\n this.queryEventCallbackId = query.addChangedCallback(event => {\r\n this.refreshCore();\r\n });\r\n }\r\n\r\n private detachQueryObserver() {\r\n if (this.queryEventCallbackId) {\r\n const query = this.context.getQuery();\r\n query.removeChangedCallback(this.queryEventCallbackId);\r\n }\r\n }\r\n\r\n protected destroyCore() {\r\n this.clear();\r\n this.detachQueryObserver();\r\n }\r\n}\r\n","import { i18n } from '@easydata/core';\r\nimport { utils as dataUtils } from '@easydata/core';\r\nimport { Widget, EqContext, \r\n WidgetGroup\r\n} from '@easyquery/core';\r\n\r\nimport { \r\n DialogService, DefaultDialogService, \r\n addElement, domel \r\n} from '@easydata/ui';\r\n\r\nimport { EasyGridWidget } from '../widgets/easy_grid_widget';\r\nimport { ChartJsWidget } from '../widgets/charts/chart_widget_chartjs';\r\nimport { EntitiesPanel } from '../widgets/entities_panel';\r\nimport { ColumnsPanel } from '../widgets/columns_panel';\r\nimport { ColumnsBar } from '../widgets/columns_bar';\r\nimport { LocaleWidget } from '../widgets/locale_widget';\r\nimport { QueryPanel } from '../widgets/query_panel';\r\nimport { ProcessWidget } from '../widgets/process_widget';\r\nimport { FilterBar } from '../widgets/filter_bar';\r\nimport { SortingBar } from '../widgets/sorting_bar';\r\nimport { QueryNameWidget } from '../widgets/queryname_widget';\r\nimport { StatementPanel } from '../widgets/statement_panel';\r\nimport { ResultFacetsPanel } from '../widgets/result_facets_panel';\r\n\r\nimport { EqViewOptions, EqResultOptions } from './view_options';\r\nimport { eqCssPrefix } from '../utils/utils';\r\nimport { browserUtils } from '../utils/browser_utils';\r\nimport { ExportWidget } from '../widgets/export_widget';\r\n\r\nimport { AggregationBar } from '../widgets/aggregation_bar';\r\n\r\nexport abstract class View {\r\n protected context: EqContext;\r\n \r\n protected domRoots: Array<Document | ShadowRoot> = [ document ];\r\n\r\n protected defaultViewOptions: EqViewOptions = {\r\n enableExport : true,\r\n disableConfirmationOnQueryChange: false,\r\n queryFileExtensions : 'text/xml,application/json',\r\n result: {\r\n clearResultOnQueryChange: true,\r\n showChart: true,\r\n showProcessIndicator: true\r\n },\r\n widgets: {\r\n resultGrid: {\r\n addColumns: false\r\n }\r\n },\r\n handlers: { \r\n }\r\n };\r\n\r\n protected viewOptions : EqViewOptions = {};\r\n protected resultOptions: EqResultOptions = {};\r\n\r\n // Widgets START\r\n protected entitiesPanelWidget?: Widget;\r\n protected columnsPanelWidget?: Widget;\r\n protected columnsBarWidget?: Widget;\r\n protected queryPanelWidget?: Widget;\r\n protected resultGridWidget?: Widget;\r\n protected chartWidget?: Widget;\r\n protected queryNameWidget?: Widget;\r\n protected processWidget?: Widget;\r\n protected localeWidget?: Widget;\r\n protected statementPanelWidget?: Widget;\r\n protected filterBarWidget?: Widget;\r\n protected sortingBarWidget?: Widget;\r\n protected statementWidget?: Widget;\r\n protected exportWidget?: Widget;\r\n protected aggregationBarWidget?: Widget;\r\n protected resultFacetPanelWidget?: Widget;\r\n protected resultCountSlot?: HTMLElement;\r\n protected resultPanelSlot?: HTMLElement;\r\n // Widgets END\r\n\r\n constructor() {\r\n this.resetContext();\r\n\r\n this.renderSpinner();\r\n }\r\n\r\n private resetContext() {\r\n this.context = new EqContext();\r\n\r\n this.context\r\n .getServices()\r\n .registerDialogServiceResolver(\r\n () => new DefaultDialogService()\r\n );\r\n }\r\n\r\n public init(options: EqViewOptions) {\r\n try {\r\n this.context.initStart();\r\n \r\n // to support shadow DOM rendering\r\n if (options && options.shadowRoots)\r\n this.domRoots = this.domRoots.concat(options.shadowRoots);\r\n \r\n this.viewOptions = this.initOptions(options);\r\n this.resultOptions = dataUtils.assignDeep(this.defaultViewOptions.result, this.viewOptions.result);\r\n \r\n this.initWidgets(this.viewOptions);\r\n \r\n this.context.init(this.viewOptions);\r\n \r\n this.initDone(); \r\n }\r\n catch (err) {\r\n this.context.throwError({ action: 'Init', sourceError : err as Error });\r\n }\r\n }\r\n\r\n protected initOptions(options?: EqViewOptions): EqViewOptions {\r\n options = dataUtils.assignDeep(this.defaultViewOptions, options);\r\n\r\n // support old format \r\n if (!options.widgets.easyGrid) {\r\n options.widgets.easyGrid = options.widgets.resultGrid || {};\r\n }\r\n\r\n // map columnTitleFormat option to widgets that have similar option\r\n if (options.columnTitleFormat) {\r\n this.context.options.columnTitleFormat = options.columnTitleFormat;\r\n }\r\n\r\n //to support old paging options (should be removed in the next versions)\r\n options.widgets.easyGrid.paging = \r\n dataUtils.assignDeep({}, options.result.paging, options.widgets.easyGrid.paging);\r\n\r\n this.enableExport = options.enableExport || false;\r\n\r\n if (!options.widgets.exportWidget) {\r\n options.widgets.exportWidget = {};\r\n }\r\n \r\n options.widgets.exportWidget.enableExport = this.enableExport;\r\n \r\n return options;\r\n }\r\n\r\n protected initWidgets(options?: EqViewOptions) {\r\n let queryPanel: string | HTMLElement = \"QueryPanel\"\r\n let columnsPanel: string | HTMLElement = \"ColumnsPanel\";\r\n let entitiesPanel: string | HTMLElement = \"EntitiesPanel\";\r\n let resultPanel: string | HTMLElement = \"ResultPanel\";\r\n let columnsBar: string | HTMLElement = \"ColumnsBar\";\r\n let sortingBar: string | HTMLElement = \"SortingBar\";\r\n let filterBar: string | HTMLElement = \"FilterBar\";\r\n let processBar: string | HTMLElement = \"ProcessBar\";\r\n let statementPanel: string | HTMLElement = \"StatementPanel\";\r\n let changeLocale: string | HTMLElement = \"ChangeLocale\";\r\n let queryNameLabel: string | HTMLElement = \"QueryNameLabel\";\r\n let facetsPanel: string | HTMLElement = \"ResultFacetsPanel\";\r\n let resultCount: string | HTMLElement = \"ResultCount\";\r\n let exportButton: string | HTMLElement = \"ExportButton\";\r\n let aggregationBar: string | HTMLElement = \"AggregationBar\";\r\n\r\n if (options.slots) {\r\n queryNameLabel = options.slots.queryNameLabel || queryNameLabel;\r\n queryPanel = options.slots.queryPanel || queryPanel;\r\n columnsPanel = options.slots.columnsPanel || columnsPanel;\r\n columnsBar = options.slots.columnsBar || columnsBar;\r\n entitiesPanel = options.slots.entitiesPanel || entitiesPanel;\r\n resultPanel = options.slots.resultPanel || resultPanel;\r\n statementPanel = options.slots.statementPanel || statementPanel;\r\n processBar = options.slots.processBar || processBar;\r\n changeLocale = options.slots.changeLocale || changeLocale;\r\n facetsPanel = options.slots.facetsPanel || facetsPanel;\r\n resultCount = options.slots.resultCountSpan || resultCount;\r\n filterBar = options.slots.filterBar || filterBar;\r\n exportButton = options.slots.exportButtons || exportButton;\r\n aggregationBar = options.slots.aggregationBar || aggregationBar;\r\n }\r\n\r\n const epElement = this.resolveElement(entitiesPanel);\r\n if (epElement && !this.entitiesPanelWidget) {\r\n this.entitiesPanelWidget = this.createEntitiesPanelWidget(epElement);\r\n this.context.addWidget(this.entitiesPanelWidget);\r\n }\r\n\r\n const cpElement = this.resolveElement(columnsPanel);\r\n if (cpElement && !this.columnsPanelWidget) {\r\n this.columnsPanelWidget = this.createColumnsPanelWidget(cpElement);\r\n this.context.addWidget(this.columnsPanelWidget);\r\n }\r\n\r\n const cbElement = this.resolveElement(columnsBar);\r\n if (cbElement && !this.columnsBarWidget) {\r\n this.columnsBarWidget = this.createColumnsBarWidget(cbElement);\r\n this.context.addWidget(this.columnsBarWidget);\r\n }\r\n \r\n const qpElement = this.resolveElement(queryPanel);\r\n if (qpElement && !this.queryPanelWidget) {\r\n this.queryPanelWidget = this.createQueryPanelWidget(qpElement);\r\n this.context.addWidget(this.queryPanelWidget);\r\n } \r\n\r\n this.resultPanelSlot = this.resolveElement(resultPanel);\r\n if (this.resultPanelSlot) {\r\n if (!this.resultGridWidget) {\r\n let gridPanel = addElement(this.resultPanelSlot, 'div', { cssClass: 'eqv-result-grid' });\r\n this.resultGridWidget = this.createResultGridWidget(gridPanel);\r\n this.context.addWidget(this.resultGridWidget); \r\n }\r\n \r\n if (this.resultOptions.showChart && !this.chartWidget) {\r\n let chartPanel = addElement(this.resultPanelSlot, 'div', { cssClass: 'eqv-chart-panel' });\r\n chartPanel.style.display = 'none';\r\n this.chartWidget = this.createChartWidget(chartPanel);\r\n this.context.addWidget(this.chartWidget);\r\n }\r\n }\r\n\r\n const qnElement = this.resolveElement(queryNameLabel);\r\n if (qnElement && !this.queryNameWidget) {\r\n this.queryNameWidget = this.createQueryNameWidget(qnElement);\r\n this.context.addWidget(this.queryNameWidget);\r\n }\r\n\r\n const fbElement = this.resolveElement(filterBar);\r\n if (fbElement && !this.filterBarWidget) {\r\n this.filterBarWidget = this.createFilterBarWidget(fbElement);\r\n this.context.addWidget(this.filterBarWidget);\r\n }\r\n\r\n const sbElement = this.resolveElement(sortingBar);\r\n if (sbElement && !this.sortingBarWidget) {\r\n this.sortingBarWidget = this.createSortingBarWidget(sbElement);\r\n this.context.addWidget(this.sortingBarWidget);\r\n }\r\n\r\n const pbElement = this.resolveElement(processBar);\r\n if (pbElement && !this.processWidget) {\r\n this.processWidget = this.createProcessWidget(pbElement);\r\n this.context.addWidget(this.processWidget);\r\n }\r\n\r\n const stElement = this.resolveElement(statementPanel);\r\n if (stElement && !this.statementPanelWidget) {\r\n this.statementPanelWidget = this.createStatementPanelWidget(stElement);\r\n this.context.addWidget(this.statementPanelWidget);\r\n }\r\n\r\n const clElement = this.resolveElement(changeLocale);\r\n if (clElement) {\r\n const widget = this.createLocaleWidget(clElement);\r\n this.context.addWidget(widget);\r\n }\r\n\r\n const fpElement = this.resolveElement(facetsPanel);\r\n if (fpElement && !this.resultFacetPanelWidget) {\r\n this.resultFacetPanelWidget = this.createResultFacetsPanel(fpElement);\r\n this.context.addWidget(this.resultFacetPanelWidget);\r\n }\r\n\r\n const ewElement = this.resolveElement(exportButton);\r\n if (ewElement && !this.exportWidget) {\r\n this.exportWidget = this.createExportWidget(ewElement);\r\n this.context.addWidget(this.exportWidget);\r\n }\r\n\r\n this.resultCountSlot = this.resolveElement(resultCount);\r\n\r\n const aggrbElement = this.resolveElement(aggregationBar);\r\n if (aggrbElement && !this.aggregationBarWidget) {\r\n this.aggregationBarWidget = this.createAggregationBarWidget(aggrbElement);\r\n this.context.addWidget(this.aggregationBarWidget);\r\n }\r\n }\r\n\r\n protected initDone() : void {}\r\n\r\n protected resolveElement(elementOrId: string | HTMLElement): HTMLElement {\r\n if (typeof elementOrId === 'string') {\r\n for(const domRoot of this.domRoots) {\r\n const el = domRoot.getElementById(elementOrId);\r\n if (el)\r\n return el;\r\n }\r\n return null;\r\n }\r\n\r\n return elementOrId;\r\n }\r\n\r\n protected resolveElementsByClassName(className: string): Element[] {\r\n let result: Element[] = [];\r\n for(const domRoot of this.domRoots) {\r\n const elemList = domRoot.querySelectorAll('.' + className);\r\n for (let i = 0; i < elemList.length; i++) {\r\n result.push(elemList[i]);\r\n }\r\n }\r\n return result\r\n }\r\n\r\n /**\r\n\t* Shows records count.\r\n * @param count The value to show.\r\n\t*/\r\n protected displayRecordsCount(count: number) {\r\n if (this.resultCountSlot && (typeof count !== 'undefined')) {\r\n this.resultCountSlot.style.display = \"inline\";\r\n this.resultCountSlot.innerHTML = i18n.getText(\"MsgResultCount\").replace(\"{0}\", count.toString());\r\n }\r\n }\r\n\r\n public getContext(): EqContext {\r\n return this.context;\r\n }\r\n\r\n /**\r\n * Sets dialog service for the view\r\n * @param dialogService The dialog service.\r\n */\r\n public setDialogService(dialogService: DialogService) {\r\n this.context.getServices()\r\n .registerDialogServiceResolver(() => dialogService);\r\n }\r\n\r\n\r\n /** @deprecated `executeQuery` is deprecated. Use `fetchData` instead*/\r\n public executeQuery (options?: any) {\r\n console.warn('`executeQuery` is deprecated. Use `fetchData` instead')\r\n this.fetchData(options);\r\n }\r\n\r\n /**\r\n\t* Fetches the data according to the query and other options defined in the context.\r\n * @param options The options. \r\n\t*/\r\n public fetchData (options?: any) {\r\n options = options || { refresh: true };\r\n this.context.clearResult();\r\n\r\n //don't run fetch if the query is empty\r\n if (this.context.getQuery().isEmpty() && !this.resultOptions.fetchEmptyQueries) return;\r\n\r\n this.showResultSpinner();\r\n this.context.fetchData({\r\n elasticPaging: options.elasticPaging,\r\n success: (result) => { \r\n this.hideResultSpinner();\r\n\r\n this.toggleExportButtons();\r\n\r\n this.displayRecordsCount(this.context.resultTable.getTotal());\r\n\r\n if (options.refresh === true) {\r\n this.context.refreshWidgets(WidgetGroup.Result);\r\n }\r\n\r\n if (options.callback) {\r\n options.callback();\r\n }\r\n\r\n if (options.success) {\r\n options.success();\r\n }\r\n },\r\n error: () => {\r\n this.hideResultSpinner();\r\n }\r\n });\r\n }\r\n\r\n protected enableExport = false;\r\n\r\n protected toggleExportButtons() {\r\n if (this.enableExport && this.context.resultTable \r\n && this.context.resultTable.getCachedCount() > 0) {\r\n this.enableExportButtons();\r\n } \r\n else {\r\n this.disableExportButtons();\r\n }\r\n\r\n }\r\n\r\n protected enableExportButtons() {\r\n // Nothing to do\r\n }\r\n\r\n protected disableExportButtons() {\r\n // Nothing to do\r\n }\r\n\r\n private _spinnerDiv: HTMLElement;\r\n\r\n private renderSpinner() {\r\n const html = '<div class=\"wBall\" id=\"wBall_1\"><div class=\"wInnerBall\"></div></div><div class=\"wBall\" id=\"wBall_2\"><div class=\"wInnerBall\"></div></div><div class=\"wBall\" id=\"wBall_3\"><div class=\"wInnerBall\"></div></div><div class=\"wBall\" id=\"wBall_4\"><div class=\"wInnerBall\"></div></div><div class=\"wBall\" id=\"wBall_5\"><div class=\"wInnerBall\"></div></div>';;\r\n\r\n this._spinnerDiv = domel('div')\r\n .addClass(`eqjs-result-spinner`)\r\n .addChild('div', b => b\r\n .addClass(`${eqCssPrefix}-progress-win8`, browserUtils.getMobileCssClass())\r\n .addHtml(html)\r\n )\r\n .toDOM();\r\n }\r\n\r\n protected showResultSpinner() {\r\n if (this.resultOptions.showProcessIndicator && this.resultPanelSlot) {\r\n if (!this._spinnerDiv.parentNode) {\r\n for (let i = 0; i < this.resultPanelSlot.children.length; i++) {\r\n const el = this.resultPanelSlot.children[i] as HTMLElement;\r\n domel(el).hide();\r\n }\r\n this.resultPanelSlot.appendChild(this._spinnerDiv);\r\n }\r\n }\r\n }\r\n\r\n protected hideResultSpinner() {\r\n if (this.resultOptions.showProcessIndicator && this.resultPanelSlot) {\r\n if (this._spinnerDiv.parentNode) {\r\n this._spinnerDiv.parentNode.removeChild(this._spinnerDiv);\r\n for (let i = 0; i < this.resultPanelSlot.children.length; i++) {\r\n const el = this.resultPanelSlot.children[i] as HTMLElement;\r\n domel(el).show();\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n\t* Creates the widget that represents Chart Widget.\r\n * @param slot The HTMLElement to place the created widget in.\r\n * @returns the created Widget object.\r\n\t*/\r\n protected createChartWidget(slotElement: HTMLElement): Widget {\r\n if (this.resultOptions.chartWidgetResolver) {\r\n return this.resultOptions.chartWidgetResolver(slotElement);\r\n }\r\n else {\r\n return new ChartJsWidget(slotElement);\r\n }\r\n }\r\n\r\n /**\r\n\t* Creates the widget that represents Grid Widget.\r\n * @param slot The HTMLElement to place the created widget in.\r\n * @returns the created Widget object.\r\n\t*/\r\n protected createResultGridWidget(slotElement: HTMLElement): Widget {\r\n if (this.resultOptions.resultGridResolver) {\r\n return this.resultOptions.resultGridResolver(slotElement);\r\n }\r\n else {\r\n return new EasyGridWidget(slotElement);\r\n }\r\n }\r\n\r\n\t/**\r\n\t* Creates the widget that represents Entity Panel.\r\n * @param slot The HTMLElement to place the created widget in.\r\n * @returns the created Widget object.\r\n\t*/\r\n protected createEntitiesPanelWidget(slot: HTMLElement): Widget {\r\n return new EntitiesPanel(slot);\r\n }\r\n\r\n\t/**\r\n\t* Creates the widget that represents Columns Panel.\r\n * @param slot The HTMLElement to place the created widget in.\r\n * @returns the created Widget object.\r\n\t*/\r\n protected createColumnsPanelWidget(slot: HTMLElement): Widget {\r\n return new ColumnsPanel(slot);\r\n }\r\n\r\n\t/**\r\n\t* Creates the widget that represents Query Panel.\r\n * @param slot The HTMLElement to place the created widget in.\r\n * @returns the created Widget object.\r\n\t*/\r\n protected createQueryPanelWidget(slot: HTMLElement): Widget {\r\n return new QueryPanel(slot);\r\n }\r\n\r\n /**\r\n\t* Creates the widget that represents Locale Widget.\r\n * @param slot The HTMLElement to place the created widget in.\r\n * @returns the created Widget object.\r\n\t*/\r\n protected createLocaleWidget(slot: HTMLElement): Widget {\r\n return new LocaleWidget(slot);\r\n }\r\n\r\n /**\r\n\t* Creates the widget that represents Process Widget.\r\n * @param slot The HTMLElement to place the created widget in.\r\n * @returns the created Widget object.\r\n\t*/\r\n protected createProcessWidget(slot: HTMLElement): Widget {\r\n return new ProcessWidget(slot);\r\n }\r\n\r\n /**\r\n\t* Creates the widget that represents Columns Bar.\r\n * @param slot The HTMLElement to place the created widget in.\r\n * @returns the created Widget object.\r\n\t*/\r\n protected createColumnsBarWidget(slot: HTMLElement): Widget {\r\n return new ColumnsBar(slot);\r\n }\r\n\r\n /**\r\n\t* Creates the widget that represents Filter Bar.\r\n * @param slot The HTMLElement to place the created widget in.\r\n * @returns the created Widget object.\r\n\t*/\r\n protected createFilterBarWidget(slot: HTMLElement): Widget {\r\n return new FilterBar(slot);\r\n }\r\n\r\n /**\r\n\t* Creates the widget that represents Sorting Bar.\r\n * @param slot The HTMLElement to place the created widget in.\r\n * @returns the created Widget object.\r\n\t*/\r\n protected createSortingBarWidget(slot: HTMLElement): Widget {\r\n return new SortingBar(slot);\r\n }\r\n\r\n /**\r\n\t* Creates the widget that represents Query Name Widget.\r\n * @param slot The HTMLElement to place the created widget in.\r\n * @returns the created Widget object.\r\n\t*/\r\n protected createQueryNameWidget(slot: HTMLElement): Widget {\r\n return new QueryNameWidget(slot);\r\n }\r\n\r\n /**\r\n * Creates the widget that represents Statement Panel Widget.\r\n * @param slot \r\n */\r\n protected createStatementPanelWidget(slot: HTMLElement): Widget {\r\n return new StatementPanel(slot);\r\n }\r\n\r\n /**\r\n * Creates the widget that represents Result Facets Panel Widget.\r\n * @param slot \r\n */\r\n protected createResultFacetsPanel(slot: HTMLElement): Widget {\r\n return new ResultFacetsPanel(slot);\r\n }\r\n\r\n /**\r\n * Creates the widget that represents Export funcionality.\r\n * @param slot \r\n */\r\n protected createExportWidget(slot: HTMLElement): Widget {\r\n return new ExportWidget(slot);\r\n }\r\n\r\n /**\r\n * Creates the widget that represents Aggregation Bar Widget.\r\n * @param slot \r\n */\r\n protected createAggregationBarWidget(slot: HTMLElement): Widget {\r\n return new AggregationBar(slot);\r\n }\r\n\r\n public detach() {\r\n if (this.entitiesPanelWidget) {\r\n this.entitiesPanelWidget.destroy();\r\n this.entitiesPanelWidget = null;\r\n }\r\n\r\n if (this.columnsPanelWidget) {\r\n this.columnsPanelWidget.destroy();\r\n this.columnsPanelWidget = null;\r\n }\r\n\r\n if (this.queryPanelWidget) {\r\n this.queryPanelWidget.destroy();\r\n this.queryPanelWidget = null;\r\n }\r\n\r\n if (this.columnsBarWidget) {\r\n this.columnsBarWidget.destroy();\r\n this.columnsBarWidget = null;\r\n }\r\n\r\n if (this.resultGridWidget) {\r\n this.resultGridWidget.destroy();\r\n this.resultGridWidget = null;\r\n }\r\n\r\n if (this.chartWidget) {\r\n this.chartWidget.destroy();\r\n this.chartWidget = null;\r\n }\r\n\r\n if (this.queryNameWidget) {\r\n this.queryNameWidget.destroy();\r\n this.queryNameWidget = null;\r\n }\r\n\r\n if (this.processWidget) {\r\n this.processWidget.destroy();\r\n this.processWidget = null;\r\n }\r\n\r\n if (this.localeWidget) {\r\n this.localeWidget.destroy();\r\n this.localeWidget = null;\r\n }\r\n\r\n if (this.statementPanelWidget) {\r\n this.statementPanelWidget.destroy();\r\n this.statementPanelWidget = null;\r\n }\r\n\r\n if (this.filterBarWidget) {\r\n this.filterBarWidget.destroy();\r\n this.filterBarWidget = null;\r\n }\r\n\r\n if (this.sortingBarWidget) {\r\n this.sortingBarWidget.destroy();\r\n this.sortingBarWidget = null;\r\n }\r\n\r\n if (this.statementWidget) {\r\n this.statementWidget.destroy();\r\n this.statementWidget = null;\r\n }\r\n\r\n if (this.exportWidget) {\r\n this.exportWidget.destroy();\r\n this.exportWidget = null;\r\n }\r\n\r\n if (this.resultFacetPanelWidget) {\r\n this.resultFacetPanelWidget.destroy();\r\n this.resultFacetPanelWidget = null;\r\n }\r\n\r\n if (this.resultCountSlot) {\r\n this.resultCountSlot.innerHTML = '';\r\n this.resultCountSlot = null;\r\n }\r\n\r\n if (this.resultPanelSlot) {\r\n this.resultPanelSlot.innerHTML = '';\r\n this.resultPanelSlot = null;\r\n }\r\n\r\n this.domRoots = [ document ];\r\n this.resetContext();\r\n }\r\n}","import { i18n, EqEvent} from '@easydata/core';\r\nimport { ContextNewQueryOptions, Query, \r\n QueryChangeEventData, QueryChangePart, WidgetGroup \r\n} from '@easyquery/core';\r\n\r\nimport { domel } from '@easydata/ui';\r\n\r\nimport { PopupMenu } from '../utils/popup_menu';\r\nimport { browserUtils } from '../utils/browser_utils';\r\n\r\nimport { EqViewOptions } from './view_options';\r\nimport { View } from '../views/view'; \r\n\r\ntype DlgCallbackResult = {\r\n success: boolean;\r\n message?: string\r\n}\r\n\r\n/**\r\n * The EasyQuery client-side view that represents the UI for advanced search page\r\n */\r\nexport class AdvancedSearchView extends View { \r\n protected queryNameLabel: HTMLElement;\r\n protected clearQueryButton: HTMLElement;\r\n protected newQueryButton: HTMLElement;\r\n protected queryListSelector: HTMLSelectElement;\r\n protected loadQueryButton: HTMLElement;\r\n protected saveQueryButton: HTMLElement;\r\n protected copyQueryButton: HTMLElement;\r\n protected removeQueryButton: HTMLElement;\r\n protected storageDropButton: HTMLElement;\r\n protected queryListPanel: HTMLElement;\r\n\r\n protected saveQueryToFileButton: HTMLElement;\r\n protected loadQueryFromFileButton: HTMLElement;\r\n protected loadQueryFromFileInput: HTMLInputElement;\r\n\r\n protected fetchDataButton: HTMLElement;\r\n\r\n protected exportButtons: HTMLElement[] = [];\r\n\r\n\t// Name of the class to add to disabled elements.\r\n protected disabledClass = \"eqjs-disabled\";\r\n\r\n protected dropdownContainerClass = \"eqv-dropdown-container\";\r\n protected dropdownButtonClass = \"eqv-drop-button\";\r\n protected dropdownContentClass = \"eqv-dropdown-content\";\r\n protected dropdownShowClass = \"eqv-dropdown-show\";\r\n\r\n //handlers\r\n private fetchDataButtonClickHandler: any;\r\n private clearQueryButtonClickHandler: any;\r\n private newQueryButtonClickHandler: any;\r\n private loadQueryButtonClickHandler: any;\r\n private saveQueryButtonClickHandler: any;\r\n private copyQueryButtonClickHandler: any;\r\n private removeQueryButtonClickHandler: any;\r\n private saveQueryToFileButtonClickHandler: any;\r\n private loadQueryFromFileButtonClickHandler: any;\r\n private exportButtonClickHandler: any;\r\n\r\n private storageButtonClickHandler: any;\r\n\r\n private queryChangedHandler: (ev: EqEvent) => void;\r\n\r\n private outsideClickHandler: (ev: MouseEvent) => any;\r\n\r\n constructor() {\r\n super();\r\n\r\n this.fetchDataButtonClickHandler = this.fetchDataButtonClick.bind(this);\r\n this.clearQueryButtonClickHandler = this.clearQueryButtonClick.bind(this);\r\n this.newQueryButtonClickHandler = this.newQueryButtonClick.bind(this);\r\n this.loadQueryButtonClickHandler = this.loadQueryButtonClick.bind(this);\r\n this.saveQueryButtonClickHandler = this.saveQueryButtonClick.bind(this);\r\n this.copyQueryButtonClickHandler = this.copyQueryButtonClick.bind(this);\r\n this.removeQueryButtonClickHandler = this.removeQueryButtonClick.bind(this);\r\n \r\n this.storageButtonClickHandler = this.storageDropButtonClick.bind(this);\r\n\r\n this.saveQueryToFileButtonClickHandler = this.saveQueryToFileButtonClick.bind(this);\r\n this.loadQueryFromFileButtonClickHandler = this.loadQueryFromFileButtonClick.bind(this);\r\n\r\n const self = this;\r\n this.exportButtonClickHandler = function (this: HTMLElement, e) {\r\n if (!this.classList.contains(self.disabledClass)) {\r\n const format = this.getAttribute(\"data-format\");\r\n self.getContext().exportResult({ format: format });\r\n }\r\n }\r\n\r\n this.queryChangedHandler = (ev) => {\r\n const eventData = ev.data as QueryChangeEventData;\r\n\r\n if (this.resultOptions.clearResultOnQueryChange) {\r\n this.context.clearResult();\r\n this.context.refreshWidgets(WidgetGroup.Result);\r\n }\r\n \r\n this.disableExportButtons(); \r\n if (this.resultCountSlot) {\r\n this.resultCountSlot.style.display = \"none\";\r\n } \r\n\r\n if (this.viewOptions.syncQueryOnChange) {\r\n this.syncQuery(); \r\n }\r\n\r\n if (this.viewOptions.fetchDataOnChange) {\r\n if (!eventData || (eventData.part != QueryChangePart.ExtraData \r\n && eventData.part != QueryChangePart.Facets)) {\r\n this.fetchData();\r\n }\r\n }\r\n };\r\n\r\n this.outsideClickHandler = (event) => {\r\n let currentContent = null;\r\n if ((event.target as HTMLElement).matches(`.${this.dropdownButtonClass}`)) {\r\n currentContent = (event.target as HTMLElement).parentElement.querySelector(`.${this.dropdownContentClass}`);\r\n }\r\n else if ((event.target as HTMLElement).matches(`.${this.dropdownButtonClass} > span`)) {\r\n currentContent = (event.target as HTMLElement).parentElement.parentElement.querySelector(`.${this.dropdownContentClass}`);\r\n }\r\n\r\n var dropdowns = this.resolveElementsByClassName(this.dropdownContentClass);\r\n for (let i = 0; i < dropdowns.length; i++) {\r\n var openDropdown = dropdowns[i];\r\n if (currentContent != openDropdown) {\r\n if (openDropdown.classList.contains(this.dropdownShowClass)) {\r\n openDropdown.classList.remove(this.dropdownShowClass);\r\n }\r\n }\r\n }\r\n };\r\n }\r\n\r\n protected refreshQueryList() {\r\n if (this.queryListPanel) {\r\n this.queryListPanel.innerHTML = '';\r\n \r\n this.context.loadQueryList({\r\n success: (data) => {\r\n const b = domel('ul',this.queryListPanel)\r\n .addClass('list-group list-group-flush');\r\n\r\n data.map(item => {\r\n b.addChild('li', b => {\r\n b.addClass('list-group-item')\r\n .setStyle('cursor', 'pointer')\r\n .data('id', item.id)\r\n .text(item.name)\r\n .on('click', () => {\r\n this.checkIfQueryModified(() => this.loadQuery(item.id));\r\n });\r\n });\r\n }); \r\n }\r\n });\r\n }\r\n }\r\n\r\n protected initOptions(options: EqViewOptions) {\r\n options = super.initOptions(options);\r\n\r\n if (typeof (options.syncQueryOnChange) == 'undefined') {\r\n options.syncQueryOnChange = true;\r\n }\r\n\r\n return options;\r\n }\r\n\r\n protected initWidgets(options?: EqViewOptions) {\r\n super.initWidgets(options);\r\n\r\n let exportClass = \"eqjs-export\";\r\n let queryContentInputId: string | HTMLElement = \"QueryContentJson\";\r\n let clearQueryButtonId: string | HTMLElement = \"ClearQueryButton\";\r\n let newQueryButtonId: string | HTMLElement = \"NewQueryButton\";\r\n let loadQueryButtonId: string | HTMLElement = \"LoadQueryButton\";\r\n let saveQueryButtonId: string | HTMLElement = \"SaveQueryButton\";\r\n let copyQueryButtonId: string | HTMLElement = \"CopyQueryButton\";\r\n let removeQueryButtonId: string | HTMLElement = \"RemoveQueryButton\";\r\n let storageButtonId: string | HTMLElement = \"StorageDropButton\";\r\n let fetchDataButtonId: string | HTMLElement = \"FetchDataButton\";\r\n let loadQueryFromFileButtonId: string | HTMLElement = \"LoadQueryFromFileButton\";\r\n let saveQueryToFileButtonId: string | HTMLElement = \"SaveQueryToFileButton\";\r\n let queryListPanelId: string | HTMLElement = \"QueryListPanel\";\r\n\r\n if (options.slots) {\r\n queryContentInputId = options.slots.queryContentInput || queryContentInputId;\r\n fetchDataButtonId = options.slots.fetchDataButton || fetchDataButtonId;\r\n clearQueryButtonId = options.slots.clearQueryButton || clearQueryButtonId;\r\n newQueryButtonId = options.slots.newQueryButton || newQueryButtonId;\r\n loadQueryButtonId = options.slots.loadQueryButton || loadQueryButtonId;\r\n saveQueryButtonId = options.slots.saveQueryButton || saveQueryButtonId;\r\n copyQueryButtonId = options.slots.copyQueryButton || copyQueryButtonId;\r\n removeQueryButtonId = options.slots.removeQueryButton || removeQueryButtonId;\r\n storageButtonId = options.slots.storageButton || storageButtonId;\r\n exportClass = options.slots.exportClass || exportClass;\r\n loadQueryFromFileButtonId = options.slots.loadQueryFromFileButton || loadQueryFromFileButtonId;\r\n saveQueryToFileButtonId = options.slots.saveQueryToFileButton || saveQueryToFileButtonId;\r\n queryListPanelId = options.slots.queryListPanel || queryListPanelId;\r\n }\r\n\r\n this.exportButtons = this.domRoots.reduce((elems, root) => \r\n elems.concat(Array.from(root.querySelectorAll(`.${exportClass}`))) ,[]);\r\n\r\n if (!options.enableExport) {\r\n this.hideExportButtons();\r\n }\r\n\r\n this.disableExportButtons();\r\n //Add event listener for export buttons\r\n const self = this;\r\n this.exportButtons.forEach((button) => {\r\n button.addEventListener('click', this.exportButtonClickHandler);\r\n });\r\n\r\n if (!this.fetchDataButton) {\r\n this.fetchDataButton = this.resolveElement(fetchDataButtonId);\r\n if (!this.fetchDataButton) {\r\n this.fetchDataButton = this.resolveElement('ExecuteQueryButton'); //deprecated, should be removed on the next major update\r\n } \r\n if (this.fetchDataButton) {\r\n this.fetchDataButton.addEventListener('click', this.fetchDataButtonClickHandler);\r\n } \r\n }\r\n\r\n if (!this.clearQueryButton) {\r\n this.clearQueryButton = this.resolveElement(clearQueryButtonId);\r\n if (this.clearQueryButton) {\r\n this.clearQueryButton.addEventListener('click', this.clearQueryButtonClickHandler);\r\n } \r\n }\r\n\r\n if (!this.newQueryButton) {\r\n this.newQueryButton = this.resolveElement(newQueryButtonId);\r\n if (this.newQueryButton) {\r\n this.newQueryButton.addEventListener('click', this.newQueryButtonClickHandler);\r\n } \r\n }\r\n \r\n if (!this.loadQueryButton) {\r\n this.loadQueryButton = this.resolveElement(loadQueryButtonId);\r\n if (this.loadQueryButton) {\r\n this.loadQueryButton.addEventListener('click', this.loadQueryButtonClickHandler);\r\n }\r\n }\r\n\r\n if (!this.saveQueryButton) {\r\n this.saveQueryButton = this.resolveElement(saveQueryButtonId);\r\n if (this.saveQueryButton) {\r\n this.saveQueryButton.addEventListener('click', this.saveQueryButtonClickHandler);\r\n } \r\n } \r\n\r\n if (!this.copyQueryButton) {\r\n this.copyQueryButton = this.resolveElement(copyQueryButtonId);\r\n if (this.copyQueryButton) {\r\n this.copyQueryButton.addEventListener('click', this.copyQueryButtonClickHandler);\r\n }\r\n }\r\n\r\n if (!this.removeQueryButton) {\r\n this.removeQueryButton = this.resolveElement(removeQueryButtonId);\r\n if (this.removeQueryButton) {\r\n this.removeQueryButton.addEventListener('click', this.removeQueryButtonClickHandler);\r\n }\r\n }\r\n\r\n if (!this.storageDropButton) {\r\n this.storageDropButton = this.resolveElement(storageButtonId);\r\n if (this.storageDropButton) {\r\n this.storageDropButton.addEventListener('click', this.storageButtonClickHandler);\r\n } \r\n }\r\n\r\n if (!this.saveQueryToFileButton) {\r\n this.saveQueryToFileButton = this.resolveElement(saveQueryToFileButtonId);\r\n if (this.saveQueryToFileButton) {\r\n this.saveQueryToFileButton.addEventListener('click', this.saveQueryToFileButtonClickHandler);\r\n }\r\n }\r\n\r\n if (!this.queryListPanel) {\r\n this.queryListPanel = this.resolveElement(queryListPanelId);\r\n \r\n //For backward compatibility. Remove on the next update\r\n if (!this.queryListPanel) {\r\n this.queryListPanel = this.resolveElement('QueryListSlot');\r\n }\r\n\r\n if (this.queryListPanel) {\r\n this.context.addEventListener('ready', () => {\r\n this.refreshQueryList();\r\n }); \r\n }\r\n } \r\n\r\n if (!this.loadQueryFromFileButton) {\r\n this.loadQueryFromFileButton = this.resolveElement(loadQueryFromFileButtonId);\r\n if (this.loadQueryFromFileButton) {\r\n this.loadQueryFromFileInput = document.createElement('input');\r\n this.loadQueryFromFileInput.type = 'file';\r\n this.loadQueryFromFileInput.accept = options.queryFileExtensions;\r\n this.loadQueryFromFileInput.style.display = 'none';\r\n\r\n document.body.appendChild(this.loadQueryFromFileInput);\r\n this.loadQueryFromFileInput.addEventListener('change', this.loadQueryFromFileInputSelect.bind(this));\r\n this.loadQueryFromFileButton.addEventListener('click', this.loadQueryFromFileButtonClickHandler);\r\n }\r\n }\r\n\r\n // hide any dropdown menu when user clicks somewhere\r\n window.addEventListener('click', this.outsideClickHandler);\r\n }\r\n \r\n protected initDone() {\r\n super.initDone();\r\n const query = this.context.getQuery();\r\n query.addChangedCallback(this.queryChangedHandler);\r\n }\r\n\r\n\t/**\r\n\t* Sends current query to the backend.\r\n\t*/\r\n public syncQuery() {\r\n this.context.syncQuery({\r\n success: (responseData) => {\r\n if (responseData.statement) {\r\n this.context.refreshWidgets(WidgetGroup.Statement);\r\n }\r\n }\r\n });\r\n }\r\n\r\n\t/**\r\n\t* Disables export buttons.\r\n\t*/\r\n protected disableExportButtons() {\r\n this.exportButtons.forEach((button) => {\r\n (button as HTMLButtonElement).disabled = true;\r\n if (!button.classList.contains(this.disabledClass)) {\r\n button.classList.add(this.disabledClass);\r\n }\r\n })\r\n }\r\n\r\n\t/**\r\n\t* Enables export buttons.\r\n\t*/\r\n protected enableExportButtons() {\r\n this.exportButtons.forEach((button) => {\r\n (button as HTMLButtonElement).disabled = false;\r\n if (button.classList.contains(this.disabledClass)) {\r\n button.classList.remove(this.disabledClass);\r\n }\r\n })\r\n }\r\n\r\n\t/**\r\n\t* Hides export buttons.\r\n\t*/\r\n protected hideExportButtons() {\r\n this.exportButtons.forEach((button) => {\r\n button.style.display = \"none\";\r\n })\r\n }\r\n\r\n protected clearQueryButtonClick() {\r\n this.context.clearQuery();\r\n this.context.refreshWidgets(WidgetGroup.Statement);\r\n }\r\n\r\n protected createNewQuery(options?: ContextNewQueryOptions) : Query {\r\n return this.context.newQuery(options);\r\n }\r\n\r\n public loadQuery(queryId: string) {\r\n if (!queryId) return;\r\n this.context.loadQuery({\r\n queryId: queryId,\r\n silent: false\r\n });\r\n }\r\n\r\n protected saveQuery(success, error?) {\r\n this.context.saveQuery({\r\n success: () => {\r\n if (success)\r\n success();\r\n\r\n this.context.getQuery().fireChangedEvent({\r\n part: QueryChangePart.Properties,\r\n wasModified: false\r\n });\r\n this.refreshQueryList();\r\n },\r\n error: error\r\n });\r\n }\r\n\r\n protected saveCurrentQuery(copyQuery: boolean = false, callback?) {\r\n const query = this.context.getQuery();\r\n if (query.isNewbie || copyQuery) {\r\n this.showSaveQueryDialog((result) => new Promise(resolve => {\r\n if (!result)\r\n return;\r\n \r\n query.regenerateId();\r\n query.setName(result);\r\n query.fireChangedEvent({\r\n part: QueryChangePart.Properties,\r\n wasModified: true\r\n });\r\n this.saveQuery(\r\n () => { resolve({success: true}); callback; },\r\n (error) => resolve({success: false, message: error}));\r\n }));\r\n }\r\n else {\r\n this.saveQuery(callback);\r\n } \r\n }\r\n\r\n public checkIfQueryModified(callback) {\r\n if (this.context.getQuery().isModified() \r\n && !this.viewOptions.disableConfirmationOnQueryChange) {\r\n this.showQueryChangedDialog((result) => {\r\n if (result) {\r\n this.saveCurrentQuery(false, callback); \r\n }\r\n else {\r\n callback();\r\n }\r\n });\r\n }\r\n else {\r\n callback();\r\n }\r\n }\r\n\r\n protected removeCurrentQuery() {\r\n this.context.removeQuery({\r\n success: () => {\r\n this.createNewQuery({\r\n useStorage: false\r\n });\r\n if (this.resultCountSlot) {\r\n this.resultCountSlot.style.display = \"none\";\r\n } \r\n this.context.clearResult();\r\n this.refreshQueryList();\r\n }\r\n });\r\n }\r\n\r\n private _querySaveTemplate = `<div id=\"kdlg-dialog-form\" class=\"kfrm-form\">\r\n <div class=\"kfrm-fields label-above\">\r\n <label for=\"kdlg-dialog-form-input\" id=\"kdlg-dialog-form-content\"></label>\r\n <input type=\"text\" name=\"kdlg-dialog-form-input\" id=\"kdlg-dialog-form-input\" />\r\n </div>\r\n </div>`;\r\n\r\n // ------------------ Dialog wrappers ---------------------\r\n protected showNewQueryDialog(callback: (result: string) => Promise<DlgCallbackResult>) {\r\n const ds = this.context.getServices().getDialogService();\r\n const defVal = i18n.getText('NewQueryDefName');\r\n const dlg = ds.open({\r\n title: i18n.getText('NewQueryTitle'),\r\n body: this. _querySaveTemplate,\r\n submitable: true,\r\n closable: true,\r\n cancelable: true,\r\n submitOnEnter: true,\r\n arrangeParents: false,\r\n beforeOpen: () => {\r\n const input = document.getElementById(`kdlg-dialog-form-input`) as HTMLInputElement;\r\n if (defVal) {\r\n input.value = defVal;\r\n }\r\n const content = document.getElementById('kdlg-dialog-form-content');\r\n content.innerHTML = i18n.getText('NewQueryContent');\r\n input.focus();\r\n },\r\n onSubmit: () => {\r\n const input = document.getElementById(`kdlg-dialog-form-input`) as HTMLInputElement;\r\n const value = input.value;\r\n if (value && value.replace(/\\s/g, '').length > 0) {\r\n if (!callback)\r\n return true;\r\n\r\n dlg.disableButtons();\r\n const header = dlg.getRootElement().querySelector<HTMLElement>('header');\r\n const processEl = domel('div', header)\r\n .addClass('eqjs-process-bar local')\r\n .toDOM();\r\n callback(value)\r\n .then(result => {\r\n header.removeChild(processEl);\r\n dlg.enableButtons();\r\n if (result.success) {\r\n dlg.close();\r\n }\r\n else {\r\n dlg.showAlert(result.message, 'error');\r\n }\r\n });\r\n }\r\n\r\n return false;\r\n }\r\n });\r\n }\r\n\r\n protected showQueryChangedDialog(callback: (result: boolean) => void) {\r\n const ds = this.context.getServices().getDialogService();\r\n ds.openConfirm(i18n.getText('QueryChangedTitle'), i18n.getText('QueryChangedContent'), callback);\r\n }\r\n\r\n protected showSaveQueryDialog(callback: (result: string) => Promise<DlgCallbackResult>) {\r\n const ds = this.context.getServices().getDialogService();\r\n const query = this.context.getQuery();\r\n const newQueryName = query.isNewbie\r\n ? query.getName()\r\n : i18n.getText('SaveQueryDefName').replace('{queryName}', query.getName());\r\n\r\n const dlg = ds.open({\r\n title: i18n.getText('SaveQueryTitle'),\r\n body: this._querySaveTemplate,\r\n submitable: true,\r\n closable: true,\r\n cancelable: true,\r\n submitOnEnter: true,\r\n arrangeParents: false,\r\n beforeOpen: () => {\r\n const input = document.getElementById(`kdlg-dialog-form-input`) as HTMLInputElement;\r\n input.value = newQueryName;\r\n const content = document.getElementById('kdlg-dialog-form-content');\r\n content.innerHTML = i18n.getText('SaveQueryContent');\r\n input.focus();\r\n },\r\n onSubmit: () => {\r\n const input = document.getElementById(`kdlg-dialog-form-input`) as HTMLInputElement;\r\n const value = input.value;\r\n if (value && value.replace(/\\s/g, '').length > 0) {\r\n if (!callback)\r\n return true;\r\n\r\n dlg.disableButtons();\r\n const header = dlg.getRootElement().querySelector<HTMLElement>('header');\r\n const processEl = domel('div', header)\r\n .addClass('eqjs-process-bar local')\r\n .toDOM();\r\n callback(value)\r\n .then(result => {\r\n dlg.enableButtons();\r\n header.removeChild(processEl);\r\n if (result.success) {\r\n dlg.close();\r\n }\r\n else {\r\n dlg.showAlert(result.message, 'error');\r\n }\r\n });\r\n }\r\n\r\n return false;\r\n }\r\n });\r\n }\r\n\r\n protected showRemoveQueryDialog(callback: (result: boolean) => void) {\r\n const ds = this.context.getServices().getDialogService();\r\n const query = this.context.getQuery();\r\n ds.openConfirm(i18n.getText('RemoveQueryTitle'), i18n.getText('RemoveQueryContent').replace('{queryName}', query.getName()), callback);\r\n }\r\n\r\n protected showSaveQueryToFileDialog(callback: (fileName: string, format: string) => Promise<DlgCallbackResult>) : void {\r\n const ds = this.getContext().getServices().getDialogService();\r\n const query = this.context.getQuery();\r\n const body = this.renderSaveToFileDialogBody(query.getName());\r\n const dlg = ds.open({\r\n title: i18n.getText('SaveQueryToFileDlgTitle'),\r\n body: body,\r\n onSubmit: () => {\r\n const fileNameInput = body.querySelector('#kdlgFileNameInput') as HTMLInputElement;\r\n\r\n const fileName = fileNameInput ? fileNameInput.value : \"Query\";\r\n\r\n const formatSelector = body.querySelector('#kdlgFileFormatSelector') as HTMLInputElement;\r\n const format = formatSelector ? formatSelector.value : 'json';\r\n\r\n if (callback) {\r\n dlg.disableButtons();\r\n const header = dlg.getRootElement().querySelector<HTMLElement>('header');\r\n const processEl = domel('div', header)\r\n .addClass('eqjs-process-bar local')\r\n .toDOM();\r\n callback(fileName, format)\r\n .then(result => {\r\n dlg.enableButtons();\r\n header.removeChild(processEl);\r\n if (result.success) {\r\n dlg.close();\r\n }\r\n else {\r\n dlg.showAlert(result.message, 'error');\r\n }\r\n });\r\n return false;\r\n }\r\n \r\n return true;\r\n }\r\n });\r\n }\r\n\r\n protected renderSaveToFileDialogBody(name: string, format = \"json\"): HTMLElement {\r\n const isIE = browserUtils.isIE();\r\n const fieldsClass = isIE \r\n ? 'kfrm-fields-ie col-ie-1-4 label-align-right' \r\n : 'kfrm-fields col-a-1 label-align-right'\r\n const horizClass = isIE \r\n ? 'kfrm-fields-ie is-horizontal' \r\n : 'kfrm-fields is-horizontal';\r\n\r\n return domel('div')\r\n .addClass('kfrm-form')\r\n .addChild('div', b => {\r\n b.addClass(fieldsClass)\r\n .addChild('label', b => b \r\n .attr('for', 'file_name')\r\n .addText(i18n.getText('FileNameLabel'))\r\n )\r\n .addChild('div', b => b\r\n .addClass(horizClass)\r\n\r\n .addChild('input', b => b\r\n .id('kdlgFileNameInput')\r\n .name('file_name')\r\n .type('text')\r\n .attr('value', name)\r\n )\r\n .addChild('label', b => b \r\n .addText('.')\r\n )\r\n .addChild('div', b => b\r\n .addClass('kfrm-select')\r\n .addChild('select', b => b\r\n .id('kdlgFileFormatSelector')\r\n .addClass('kdlg-form-control')\r\n .addOption({ \r\n value: 'xml',\r\n selected: 'xml' === format\r\n })\r\n .addOption({ \r\n value: 'json',\r\n selected: 'json' === format\r\n })\r\n )\r\n )\r\n );\r\n })\r\n .toDOM();\r\n }\r\n \r\n // ------------------ Query management buttons handler ---------------------\r\n protected newQueryButtonClick() {\r\n this.checkIfQueryModified(() => {\r\n this.createNewQuery();\r\n });\r\n }\r\n\r\n protected saveQueryToFileButtonClick() {\r\n this.showSaveQueryToFileDialog((fileName, format) => new Promise((resolve) => {\r\n this.context.getQueryFile({\r\n fileName: fileName,\r\n format: format,\r\n success: () => resolve({success: true}),\r\n error: (error) => resolve({ success: false, message: error})\r\n });\r\n }));\r\n }\r\n\r\n protected loadQueryFromFileButtonClick() {\r\n this.checkIfQueryModified(() => {\r\n this.showLoadQueryFromFileDialog();\r\n });\r\n }\r\n\r\n public showLoadQueryFromFileDialog(): void {\r\n this.loadQueryFromFileInput.click();\r\n }\r\n\r\n protected loadQueryFromFileInputSelect() {\r\n const files = this.loadQueryFromFileInput.files;\r\n const file = files.item(0);\r\n\r\n const data = new FormData();\r\n data.append(file.name, file);\r\n\r\n this.loadQueryFromFileInput.value = \"\";\r\n\r\n this.context.uploadQueryFile({\r\n data: data,\r\n success: () => {\r\n this.syncQuery();\r\n this.refreshQueryList();\r\n }\r\n });\r\n }\r\n\r\n protected loadQueryButtonClick() { \r\n this.context.loadQueryList({\r\n success: (data) => {\r\n this.fillLoadQueryButtonMenu(data);\r\n this.queryListMenu.showMenu({\r\n anchor: this.loadQueryButton,\r\n adjustHeight: false,\r\n itemSelectedCallback: (data) => {\r\n this.checkIfQueryModified(() => this.loadQuery(data.id));\r\n }\r\n }); \r\n }\r\n });\r\n }\r\n\r\n private queryListMenu: PopupMenu = null;\r\n\r\n protected fillLoadQueryButtonMenu(queryList: any) {\r\n const query = this.getContext().getQuery();\r\n this.queryListMenu = new PopupMenu({\r\n items: queryList.map(item => ({ id: item.id, text: item.name })),\r\n selectedIds: query.getId()\r\n });\r\n }\r\n\r\n protected saveQueryButtonClick() {\r\n this.saveCurrentQuery();\r\n }\r\n\r\n protected copyQueryButtonClick() {\r\n this.saveCurrentQuery(true);\r\n }\r\n\r\n protected removeQueryButtonClick() {\r\n this.showRemoveQueryDialog((result) => {\r\n if (result) {\r\n this.removeCurrentQuery();\r\n }\r\n });\r\n }\r\n\r\n protected storageDropButtonClick() {\r\n let container = this.storageDropButton.parentElement;\r\n let content = container.querySelector(`.${this.dropdownContentClass}`);\r\n if (content) {\r\n window.setTimeout(() => content.classList.toggle(this.dropdownShowClass), 100);\r\n }\r\n }\r\n\r\n protected fetchDataButtonClick() {\r\n this.fetchData(); \r\n }\r\n\r\n\r\n public detach() {\r\n this.enableExportButtons();\r\n this.exportButtons.forEach((button) => {\r\n button.removeEventListener('click', this.exportButtonClickHandler);\r\n });\r\n this.exportButtons = [];\r\n\r\n if (this.fetchDataButton) {\r\n this.fetchDataButton.removeEventListener('click', this.fetchDataButtonClickHandler);\r\n this.fetchDataButton = null;\r\n }\r\n\r\n if (this.clearQueryButton) {\r\n this.clearQueryButton.removeEventListener('click', this.clearQueryButtonClickHandler);\r\n this.clearQueryButton = null;\r\n }\r\n\r\n if (this.newQueryButton) {\r\n this.newQueryButton.removeEventListener('click', this.newQueryButtonClickHandler);\r\n this.newQueryButton = null;\r\n }\r\n\r\n if (this.loadQueryButton) {\r\n this.loadQueryButton.removeEventListener('click', this.loadQueryButtonClickHandler);\r\n this.loadQueryButton = null;\r\n }\r\n\r\n if (this.saveQueryButton) {\r\n this.saveQueryButton.removeEventListener('click', this.saveQueryButtonClickHandler);\r\n this.saveQueryButton = null;\r\n }\r\n\r\n if (this.copyQueryButton) {\r\n this.copyQueryButton.removeEventListener('click', this.copyQueryButtonClickHandler);\r\n this.copyQueryButton = null;\r\n }\r\n\r\n if (this.removeQueryButton) {\r\n this.removeQueryButton.removeEventListener('click', this.removeQueryButtonClickHandler);\r\n this.removeQueryButton = null;\r\n }\r\n\r\n if (this.storageDropButton) {\r\n this.storageDropButton.removeEventListener('click', this.storageButtonClickHandler);\r\n this.storageDropButton = null;\r\n }\r\n\r\n if (this.saveQueryToFileButton) {\r\n this.saveQueryToFileButton.removeEventListener('click', this.saveQueryToFileButtonClickHandler);\r\n this.saveQueryToFileButton = null;\r\n }\r\n\r\n if (this.queryListPanel) {\r\n this.queryListPanel = null;\r\n }\r\n\r\n if (this.loadQueryFromFileButton) {\r\n if (this.loadQueryFromFileInput) {\r\n document.body.removeChild(this.loadQueryFromFileInput);\r\n }\r\n this.loadQueryFromFileButton.removeEventListener('click', this.loadQueryFromFileButtonClickHandler);\r\n this.loadQueryFromFileButton = null;\r\n }\r\n\r\n super.detach();\r\n }\r\n}\r\n","import { \r\n WidgetGroup, QueryChangeEventData, QueryChangePart \r\n} from '@easyquery/core';\r\n\r\nimport { EqViewOptions } from './view_options';\r\n\r\nimport { View } from './view';\r\n\r\n/**\r\n * The view that represents a data-filtering scenario (a text search for one entity/table)\r\n */\r\nexport class DataFilterView extends View {\r\n constructor() {\r\n super();\r\n }\r\n\r\n protected initOptions(options?: EqViewOptions): EqViewOptions {\r\n options = super.initOptions(options);\r\n options.result.fetchEmptyQueries = true;\r\n\r\n const query = this.context.getQuery();\r\n query.addChangedCallback(() => {\r\n if (this.resultOptions.clearResultOnQueryChange){\r\n this.context.clearResult();\r\n }\r\n\r\n if (options.syncQueryOnChange) {\r\n this.context.syncQuery();\r\n }\r\n });\r\n\r\n this.context.addEventListener('ready', this.fetchData.bind(this));\r\n\r\n return options;\r\n }\r\n\r\n protected initWidgets(options?: EqViewOptions) {\r\n super.initWidgets(options);\r\n\r\n if (this.sortingBarWidget) {\r\n this.context.getQuery().addChangedCallback((ev) => {\r\n const edata = ev.data as QueryChangeEventData;\r\n if (!edata || (edata.part != QueryChangePart.SortingColumns \r\n && edata.part != QueryChangePart.Columns && edata.part != QueryChangePart.All)) {\r\n return;\r\n }\r\n this.fetchData();\r\n });\r\n }\r\n\r\n if (this.filterBarWidget) {\r\n const widgetType = this.filterBarWidget.getWidgetType();\r\n options.widgets[widgetType] = options.widgets[widgetType] || {};\r\n if (!options.widgets[widgetType].applyFilterCallback) {\r\n options.widgets[widgetType].applyFilterCallback = () => {\r\n this.fetchData();\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Obsolete. Left for backward compatibility. \r\n * Use fetchData() instead\r\n * @deprecated Use `fetchData()`\r\n */\r\n public applyQueryFilter() {\r\n console.warn('applyQueryFilter is obsolete. Use fetchData instead');\r\n this.fetchData();\r\n }\r\n\r\n public fetchData() {\r\n super.fetchData({ refresh: true });\r\n }\r\n}","import { Widget } from \"@easyquery/core\"\r\nimport { EqHtmlGrid } from \"../widgets/eq_result_html_grid\" \r\nimport { DataFilterView } from \"./data_filter_view\";\r\n\r\n/**\r\n * The EasyQuery client-side view that represents the UI for data filtering page\r\n */\r\nexport class HtmlDataFilterView extends DataFilterView {\r\n constructor() {\r\n super();\r\n }\r\n\r\n /**\r\n\t* Creates the widget that represents Grid Widget.\r\n * @param slot The HTMLElement to place the created widget in.\r\n * @returns the created Widget object.\r\n\t*/\r\n protected createResultGridWidget(element: HTMLElement): Widget {\r\n return new EqHtmlGrid(element);\r\n }\r\n\r\n /**\r\n * Obsolete. Left for backward compatibility. \r\n * Use fetchData() instead\r\n */\r\n public applyQueryFilter() {\r\n console.warn('applyQueryFilter is obsolete. Use fetchData instead');\r\n this.fetchData();\r\n }\r\n}\r\n","import {\r\n WidgetGroup, QueryChangePart, QueryChangeEventData\r\n} from '@easyquery/core';\r\nimport { i18n, utils as dataUtils } from '@easydata/core';\r\n\r\nimport { domel } from '@easydata/ui';\r\n\r\nimport { ReportViewOptions } from './view_options';\r\nimport { browserUtils } from '../utils/browser_utils';\r\n\r\nimport { View } from './view';\r\n\r\n/**\r\n * Represents single report in the view\r\n */\r\nexport interface Report {\r\n id: string,\r\n name?: string,\r\n description?: string,\r\n lastUpdated?: number\r\n} \r\n\r\nexport interface ReportCacheItem {\r\n id: string,\r\n lastUpdated?: number,\r\n content?: string\r\n}\r\n\r\n/**\r\n * The view that represents the \"ad-hoc reporting\" scenario\r\n */\r\nexport class ReportView extends View {\r\n private reports: Report[] = [];\r\n\r\n private reportCache: ReportCacheItem[] = [];\r\n\r\n //controls\r\n private newReportButton: HTMLElement;\r\n private loadReportButton: HTMLElement;\r\n private saveReportButton: HTMLElement;\r\n private reloadReportDataButton: HTMLElement;\r\n private removeReportButton: HTMLElement;\r\n private clearReportButton: HTMLElement;\r\n\r\n private reportListSlot: HTMLElement;\r\n\r\n private exportButtonsContainer: HTMLElement;\r\n private exportButtons: HTMLElement[] = [];\r\n private exportClass = \"eqjs-export\";\r\n private disabledClass = \"eqjs-disabled\";\r\n\r\n\r\n // handlers\r\n private exportButtonClickHandler: any;\r\n private clearReportButtonClickHandler: any;\r\n private newReportButtonClickHandler: any;\r\n private loadReportButtonClickHandler: any;\r\n private saveReportButtonClickHandler: any;\r\n private removeReportButtonClickHandler: any;\r\n private reloadReportDataButtonClickHandler: any;\r\n\r\n protected enableExport: boolean = false;\r\n\r\n private useReportCache: boolean = true;\r\n\r\n private syncReportOnChange: boolean = true;\r\n\r\n private defaultReportId?: string;\r\n\r\n constructor() {\r\n super();\r\n\r\n this.context.useStoredQueryOnFetch = true;\r\n\r\n this.exportButtonClickHandler = (srcElement: HTMLElement, e) => {\r\n if (!srcElement.classList.contains(this.disabledClass)) {\r\n const format = srcElement.getAttribute(\"data-format\");\r\n this.context.exportResult({ format: format });\r\n }\r\n }\r\n\r\n this.clearReportButtonClickHandler = this.clearReportButtonClick.bind(this);\r\n this.newReportButtonClickHandler = this.newReportButtonClick.bind(this);\r\n this.loadReportButtonClickHandler = this.loadReportButtonClick.bind(this);\r\n this.saveReportButtonClickHandler = this.saveReportButtonClick.bind(this);\r\n this.removeReportButtonClickHandler = this.removeReportButtonClick.bind(this);\r\n this.reloadReportDataButtonClickHandler = this.reloadReportDataButtonClick.bind(this);\r\n\r\n browserUtils.onMobileModeChanged(_ => {\r\n document.location.reload();\r\n });\r\n }\r\n\r\n protected initOptions(options?: ReportViewOptions): ReportViewOptions {\r\n options = super.initOptions(options);\r\n\r\n if (typeof(options.syncQueryOnChange) !== \"undefined\") {\r\n this.syncReportOnChange = options.syncQueryOnChange;\r\n }\r\n\r\n if (typeof(options.syncReportOnChange) !== \"undefined\") {\r\n this.syncReportOnChange = options.syncReportOnChange;\r\n }\r\n\r\n options.syncQueryOnChange = this.syncReportOnChange;\r\n\r\n \r\n if (typeof (options.useReportCache) !== \"undefined\") {\r\n this.useReportCache = options.useReportCache;\r\n }\r\n\r\n this.defaultReportId = options.defaultReportId;\r\n return options;\r\n }\r\n\r\n protected initDone() {\r\n super.initDone();\r\n \r\n const query = this.context.getQuery();\r\n query.addChangedCallback((event) => {\r\n const eventData = event.data as QueryChangeEventData;\r\n\r\n if (eventData) {\r\n if (eventData.changeType == \"query.switched\") {\r\n this.context.clearResult();\r\n this.context.refreshWidgets(WidgetGroup.Result);\r\n this.context.refreshWidgets(WidgetGroup.Query);\r\n }\r\n else {\r\n this.disableExportButtons(); \r\n if (this.resultCountSlot) {\r\n this.resultCountSlot.style.display = \"none\";\r\n }\r\n }\r\n }\r\n\r\n //true if we just switched the report or changed facets (query was not changed)\r\n let isLiteUpdate = !eventData\r\n || eventData.changeType == \"query.switched\"\r\n || eventData.part == QueryChangePart.ExtraData\r\n || eventData.part == QueryChangePart.Facets;\r\n\r\n let syncStarted = false;\r\n\r\n if (this.syncReportOnChange) {\r\n const needSync = eventData && eventData.changeType != \"query.switched\" && !eventData.noSync; \r\n if (needSync) {\r\n syncStarted = true;\r\n this.syncReport({\r\n success: () => {\r\n // fetch data on query change\r\n if (!isLiteUpdate && this.viewOptions.fetchDataOnChange) { \r\n this.fetchData();\r\n }\r\n }\r\n });\r\n }\r\n }\r\n\r\n // clear dataset result on query change\r\n if (!isLiteUpdate && this.resultOptions.clearResultOnQueryChange) { \r\n this.context.clearResult();\r\n this.context.refreshWidgets(WidgetGroup.Result);\r\n }\r\n\r\n if (!isLiteUpdate && !syncStarted && this.viewOptions.fetchDataOnChange) { \r\n this.fetchData();\r\n }\r\n });\r\n\r\n window.setTimeout(() => {\r\n this.context.loadQueryList({\r\n success: (data) => {\r\n if (Array.isArray(data)) {\r\n this.reports = data\r\n\r\n const exists = this.reports.filter(r => r.id == this.defaultReportId).length > 0;\r\n if (exists) {\r\n this.renderReportList({ reportId: this.defaultReportId });\r\n }\r\n else {\r\n this.renderReportList();\r\n }\r\n }\r\n }\r\n })\r\n }, 100);\r\n }\r\n\r\n protected initWidgets(options?: ReportViewOptions) {\r\n super.initWidgets(options);\r\n\r\n let clearReportButton: string | HTMLElement = \"ClearReportButton\";\r\n let newReportButton: string | HTMLElement = \"NewReportButton\";\r\n let loadReportButton: string | HTMLElement = \"LoadReportButton\";\r\n let saveReportButton: string | HTMLElement = \"SaveReportButton\";\r\n let removeReportButton: string | HTMLElement = \"RemoveReportButton\";\r\n let reloadReportDataButton: string | HTMLElement = \"ReloadReportDataButton\";\r\n\r\n let resultCountSpan: string | HTMLElement = \"ResultCount\";\r\n let exportButtons: string | HTMLElement = \"ResultExportButtons\";\r\n\r\n let exportClass = this.exportClass;\r\n\r\n if (options.slots) {\r\n resultCountSpan = options.slots.resultCountSpan || resultCountSpan;\r\n exportButtons = options.slots.exportButtons || exportButtons;\r\n \r\n clearReportButton = options.slots.clearReportButton || clearReportButton;\r\n newReportButton = options.slots.newReportButton || newReportButton;\r\n loadReportButton = options.slots.loadReportButton || loadReportButton;\r\n saveReportButton = options.slots.saveReportButton || saveReportButton;\r\n removeReportButton = options.slots.removeReportButton || removeReportButton;\r\n reloadReportDataButton = options.slots.reloadReportDataButton || reloadReportDataButton;\r\n exportClass = options.slots.exportClass || exportClass;\r\n }\r\n\r\n this.exportButtons = this.domRoots.reduce((elems, root) => \r\n elems.concat(Array.from(root.querySelectorAll(`.${exportClass}`))) ,[]);\r\n\r\n this.enableExport = options.enableExport;\r\n if (this.enableExport) {\r\n //Add event listener for export buttons\r\n this.exportButtons.forEach((button) => {\r\n button.addEventListener('click', this.exportButtonClickHandler);\r\n });\r\n \r\n }\r\n else {\r\n this.hideExportButtons();\r\n }\r\n this.exportButtonsContainer = this.resolveElement(exportButtons);\r\n\r\n if (!this.clearReportButton) {\r\n this.clearReportButton = this.resolveElement(clearReportButton);\r\n if (this.clearReportButton) {\r\n this.clearReportButton.addEventListener('click', this.clearReportButtonClickHandler);\r\n }\r\n }\r\n\r\n if (!this.newReportButton) {\r\n this.newReportButton = this.resolveElement(newReportButton);\r\n if (this.newReportButton) {\r\n this.newReportButton.addEventListener('click', this.newReportButtonClickHandler);\r\n } \r\n }\r\n \r\n if (!this.loadReportButton) {\r\n this.loadReportButton = this.resolveElement(loadReportButton);\r\n if (this.loadReportButton) {\r\n this.loadReportButton.addEventListener('click', this.loadReportButtonClickHandler);\r\n }\r\n }\r\n\r\n if (!this.saveReportButton) {\r\n this.saveReportButton = this.resolveElement(saveReportButton);\r\n if (this.saveReportButton) {\r\n this.saveReportButton.addEventListener('click', this.saveReportButtonClickHandler);\r\n }\r\n }\r\n\r\n if (!this.removeReportButton) {\r\n this.removeReportButton = this.resolveElement(removeReportButton);\r\n if (this.removeReportButton) {\r\n this.removeReportButton.addEventListener('click', this.removeReportButtonClickHandler);\r\n }\r\n }\r\n\r\n if (!this.reloadReportDataButton) {\r\n this.reloadReportDataButton = this.resolveElement(reloadReportDataButton);\r\n \r\n //OBSOLETE: remove the next 3 lines. We just support the old default button ID here\r\n if (!this.reloadReportDataButton) {\r\n this.reloadReportDataButton = this.resolveElement('UpdateReportButton'); \r\n }\r\n\r\n if (this.reloadReportDataButton) {\r\n this.reloadReportDataButton.addEventListener('click', this.reloadReportDataButtonClickHandler);\r\n }\r\n }\r\n\r\n this.reportListSlot = document.getElementById('ReportList');\r\n this.resultCountSlot = this.resolveElement(resultCountSpan);\r\n }\r\n\r\n private _reportSaveTemplate = `<div id=\"kdlg-dialog-form\" class=\"kfrm-form\">\r\n <div class=\"kfrm-fields label-above\">\r\n <label for=\"kdlg-dialog-form-input\" id=\"kdlg-dialog-form-content\"></label>\r\n <input type=\"text\" name=\"kdlg-dialog-form-input\" id=\"kdlg-dialog-form-input\" />\r\n <label for=\"kdlg-dialog-form-textarea\" id=\"kdlg-dialog-form-desc-label\"></label>\r\n <textarea type=\"text\" name=\"kdlg-dialog-form-textarea\" id=\"kdlg-dialog-form-textarea\"></textarea>\r\n </div>\r\n </div>`;\r\n\r\n\t/**\r\n\t* Creates a new report.\r\n\t*/\r\n public newReport() {\r\n const ds = this.context.getServices().getDialogService();\r\n const dlg = ds.open({\r\n title: i18n.getText('NewReportDlgTitle'),\r\n body: this._reportSaveTemplate,\r\n submitable: true,\r\n closable: true,\r\n cancelable: true,\r\n submitOnEnter: true,\r\n arrangeParents: false,\r\n beforeOpen: () => {\r\n const input = document.getElementById(`kdlg-dialog-form-input`) as HTMLInputElement;\r\n input.value = i18n.getText('NewReportDefName');\r\n const content = document.getElementById('kdlg-dialog-form-content');\r\n content.innerHTML = i18n.getText('SaveReportDlgLabel');\r\n const label = document.getElementById('kdlg-dialog-form-desc-label');\r\n label.innerHTML = i18n.getText('ReportDescLabel');\r\n input.focus();\r\n },\r\n onSubmit: () => {\r\n const nameInput = document.getElementById(`kdlg-dialog-form-input`) as HTMLInputElement;\r\n const queryName = nameInput.value;\r\n if (queryName && queryName.replace(/\\s/g, '').length > 0) {\r\n dlg.clearAlert();\r\n dlg.disableButtons();\r\n const header = dlg.getRootElement().querySelector<HTMLElement>('header');\r\n const processEl = domel('div', header)\r\n .addClass('eqjs-process-bar local')\r\n .toDOM();\r\n\r\n const descInput = document.getElementById(`kdlg-dialog-form-textarea`) as HTMLTextAreaElement;\r\n const queryDesc = descInput.value;\r\n\r\n this.context.newQuery({\r\n name: queryName,\r\n description: queryDesc,\r\n success: () => {\r\n dlg.close();\r\n\r\n const query = this.context.getQuery();\r\n const reportId = query.getId();\r\n\r\n this.insertIntoReportList({ id: reportId, name: query.getName(), description: query.getDescription() });\r\n this.renderReportList({ reportId: reportId });\r\n },\r\n error: (error) => {\r\n header.removeChild(processEl);\r\n dlg.enableButtons();\r\n\r\n dlg.showAlert(error, 'error');\r\n }\r\n });\r\n }\r\n\r\n return false;\r\n }\r\n });\r\n }\r\n\r\n\t/**\r\n\t* Loads report by ID.\r\n * @param reportId The ID of the report to load.\r\n\t*/\r\n public loadReport(reportId: string) {\r\n if (!reportId) {\r\n throw 'Empty report ID!';\r\n }\r\n\r\n let reportToLoad = this.findReportById(reportId);\r\n if (!reportToLoad) return;\r\n\r\n const self = this;\r\n const query = self.context.getQuery();\r\n\r\n const reportLoaded = () => {\r\n this.renderReportProps();\r\n this.context.resultTable.clear();\r\n query.fireChangedEvent({ \r\n part : QueryChangePart.All,\r\n noSync: true,\r\n changeType: 'query.switched'\r\n });\r\n this.fetchData();\r\n }\r\n\r\n let reportContent = this.useReportCache ? this.getReportContentFromCache(reportToLoad) : null;\r\n if (reportContent) {\r\n query.clear();\r\n query.loadFromJson(reportContent, { validate: false });\r\n reportLoaded();\r\n }\r\n else {\r\n this.context.loadQuery({\r\n queryId: reportId,\r\n silent: true,\r\n success: () => {\r\n this.saveReportContentInCache(reportToLoad, query.toJSON());\r\n reportLoaded();\r\n }\r\n });\r\n }\r\n \r\n this.setActiveReport(reportId);\r\n }\r\n\r\n\t/**\r\n\t* Shows the dialog to save the report with new name.\r\n\t*/\r\n public saveCurrentReportAs() {\r\n const query = this.context.getQuery();\r\n const ds = this.context.getServices().getDialogService();\r\n const dlg = ds.open({\r\n title: i18n.getText('SaveReportDlgTitle'),\r\n body: this._reportSaveTemplate,\r\n submitable: true,\r\n closable: true,\r\n cancelable: true,\r\n submitOnEnter: true,\r\n arrangeParents: false,\r\n beforeOpen: () => {\r\n const input = document.getElementById(`kdlg-dialog-form-input`) as HTMLInputElement;\r\n input.value = query.getName();\r\n const content = document.getElementById('kdlg-dialog-form-content');\r\n content.innerHTML = i18n.getText('SaveReportDlgLabel');\r\n const label = document.getElementById('kdlg-dialog-form-desc-label');\r\n label.innerHTML = i18n.getText('ReportDescLabel');\r\n const text = document.getElementById(`kdlg-dialog-form-textarea`) as HTMLTextAreaElement;\r\n text.value = query.getDescription();\r\n input.focus();\r\n },\r\n onSubmit: () => {\r\n const input = document.getElementById(`kdlg-dialog-form-input`) as HTMLInputElement;\r\n const value = input.value;\r\n if (value && value.replace(/\\s/g, '').length > 0) {\r\n query.setId(\r\n dataUtils.generateId(\r\n value.replace(/\\s/g, '')));\r\n\r\n dlg.clearAlert();\r\n dlg.disableButtons();\r\n const header = dlg.getRootElement().querySelector<HTMLElement>('header');\r\n const processEl = domel('div', header)\r\n .addClass('eqjs-process-bar local')\r\n .toDOM();\r\n\r\n const text = document.getElementById(`kdlg-dialog-form-textarea`) as HTMLTextAreaElement;\r\n const desc = text.value;\r\n\r\n query.setDescription(desc);\r\n\r\n this.context.newQuery({\r\n clearQuery: false,\r\n name: value,\r\n success: () => {\r\n dlg.close();\r\n\r\n this.context.refreshWidgets(WidgetGroup.Query);\r\n\r\n const savedQuery = this.context.getQuery();\r\n\r\n const reportId = savedQuery.getId();\r\n this.fetchData();\r\n this.insertIntoReportList({ id: reportId, name: query.getName(), description: query.getDescription() });\r\n this.renderReportList({ reportId: reportId });\r\n this.setActiveReport(reportId);\r\n this.renderReportProps();\r\n },\r\n error: (error) => {\r\n header.removeChild(processEl);\r\n dlg.enableButtons();\r\n\r\n dlg.showAlert(error, 'error');\r\n }\r\n });\r\n }\r\n\r\n return false;\r\n }\r\n });\r\n }\r\n\r\n\t/**\r\n\t* Removes current report.\r\n\t*/\r\n public removeCurrentReport() {\r\n const report = this.context.getQuery();\r\n const ds = this.context.getServices().getDialogService();\r\n ds.openConfirm(\r\n i18n.getText('RemoveReportDlgTitle'), \r\n i18n.getText('RemoveReportContent').replace('{reportName}',report.getName()))\r\n .then(result => {\r\n if (result) {\r\n const reportId = report.getId();\r\n this.context.removeQuery({\r\n queryId: reportId,\r\n success: () => {\r\n const index = this.removeFromReportList(reportId);\r\n this.renderReportList({ reportIndex: index });\r\n }\r\n });\r\n }\r\n })\r\n }\r\n\r\n\t/**\r\n\t* Sends current report's query to back-end.\r\n\t*/\r\n public syncReport(options?: any) {\r\n if (this.useReportCache) {\r\n const query = this.context.getQuery();\r\n\r\n const currentReport = this.findReportById(query.getId());\r\n if (currentReport) {\r\n currentReport.lastUpdated = Date.now();\r\n this.saveReportContentInCache(currentReport, query.toJSON()); \r\n }\r\n }\r\n \r\n this.context.syncQuery({\r\n success: (responseData) => {\r\n if (responseData.query) {\r\n this.context.refreshWidgets(WidgetGroup.Query);\r\n }\r\n \r\n if (responseData.statement) {\r\n this.context.refreshWidgets(WidgetGroup.Statement);\r\n }\r\n\r\n if (options && options.success) {\r\n options.success(responseData);\r\n }\r\n }\r\n });\r\n }\r\n\r\n\t/**\r\n\t* Sets active report.\r\n * @param reportId The ID of the report to make active.\r\n\t*/\r\n public setActiveReport(reportId: string) {\r\n let rlItems = this.reportListSlot.querySelectorAll('li');\r\n\r\n for (let i = 0; i < rlItems.length; i++) {\r\n const item: HTMLLIElement = rlItems[i]; \r\n item.classList.remove('active');\r\n\r\n const rid = item.getAttribute('data-rid');\r\n if (rid === reportId) {\r\n item.classList.add('active');\r\n }\r\n };\r\n }\r\n\r\n\t/**\r\n\t* Renders current report.\r\n\t*/\r\n public renderReportProps() { \r\n let query = this.context.getQuery();\r\n let titleElem = document.getElementById('ReportTitle');\r\n titleElem.innerHTML = query.getName();\r\n\r\n const columnsPanel = document.querySelector('.columns-bar') as HTMLElement;\r\n if (columnsPanel) {\r\n columnsPanel.innerHTML = '<strong>Columns:</strong>';\r\n let columns = query.getColumns();\r\n for (let column of columns) {\r\n columnsPanel.innerHTML += '<span class=\"label label-default\">' + column.caption + '</span> ';\r\n }\r\n } \r\n }\r\n\r\n\t/**\r\n\t* Renders the list of reports.\r\n * @param options The options. In particular, `options.reportIndex` defines which report should be active.\r\n\t*/\r\n public renderReportList(options?: any) {\r\n this.renderReportPanels();\r\n\r\n if (!this.reportListSlot.matches('li')) {\r\n this.reportListSlot.innerHTML = \"\";\r\n\r\n options = options || { reportId: (this.reports.length > 0 ? this.reports[0].id : null) };\r\n var ul = document.createElement('ul');\r\n ul.className = 'list-group list-group-flush';\r\n\r\n this.reportListSlot.appendChild(ul);\r\n\r\n for (let report of this.reports) {\r\n this.renderReportItemInList(report, ul);\r\n }\r\n\r\n if (options.reportId) {\r\n this.loadReport(options.reportId);\r\n }\r\n if (typeof (options.reportIndex) !== \"undefined\") {\r\n let idx = options.reportIndex;\r\n if (idx >= this.reports.length)\r\n idx = this.reports.length - 1;\r\n if (idx < 0 && this.reports.length > 0)\r\n idx = 0;\r\n if (idx >= 0)\r\n this.loadReport(this.reports[idx].id);\r\n }\r\n }\r\n }\r\n\r\n public detach() {\r\n if (this.exportButtonsContainer) {\r\n this.showExportButtons();\r\n this.exportButtons.forEach((button) => {\r\n button.removeEventListener('click', this.exportButtonClickHandler);\r\n });\r\n this.exportButtons = [];\r\n this.exportButtonsContainer = null;\r\n }\r\n\r\n if (this.clearReportButton) {\r\n this.clearReportButton.removeEventListener('click', this.clearReportButtonClickHandler);\r\n this.clearReportButton = null;\r\n }\r\n\r\n if (this.newReportButton) {\r\n this.newReportButton.removeEventListener('click', this.newReportButtonClickHandler);\r\n this.newReportButton = null;\r\n }\r\n\r\n if (this.loadReportButton) {\r\n this.loadReportButton.removeEventListener('click', this.loadReportButtonClickHandler);\r\n this.loadReportButton = null;\r\n }\r\n\r\n if (this.saveReportButton) {\r\n this.saveReportButton.addEventListener('click', this.saveReportButtonClickHandler);\r\n this.saveReportButton = null;\r\n }\r\n\r\n if (this.removeReportButton) {\r\n this.removeReportButton.removeEventListener('click', this.removeReportButtonClickHandler);\r\n this.removeReportButton = null;\r\n }\r\n\r\n if (this.reloadReportDataButton) {\r\n this.reloadReportDataButton.removeEventListener('click', this.reloadReportDataButtonClickHandler);\r\n this.removeReportButton = null;\r\n }\r\n\r\n if (this.reportListSlot) {\r\n this.reportListSlot.innerHTML = '';\r\n this.reportListSlot = null;\r\n }\r\n\r\n if (this.resultCountSlot) {\r\n this.resultCountSlot.innerHTML = '';\r\n this.resultCountSlot = null;\r\n }\r\n\r\n super.detach();\r\n }\r\n\r\n\t/**\r\n\t* Renders a single item in the list of reports.\r\n * @param report The [[Report]] object to render.\r\n * @param ul The [[HTMLUListElement]] to add the item to.\r\n\t*/\r\n protected renderReportItemInList(report: Report, ul: HTMLUListElement) {\r\n if (!ul) {\r\n ul = this.reportListSlot.querySelector(\"ul\") as HTMLUListElement; \r\n }\r\n\r\n let reportName = report.name || report.description || \"\";\r\n let li = document.createElement('li');\r\n li.className = \"list-group-item\";\r\n li.style.cursor = 'pointer';\r\n li.setAttribute('data-rid', report.id);\r\n li.innerText = reportName;\r\n\r\n if (report.description) {\r\n li.title = report.description;\r\n }\r\n\r\n li.addEventListener('click', (e: MouseEvent) => {\r\n const target = e.target as HTMLElement;\r\n const rid = target.getAttribute('data-rid');\r\n\r\n this.loadReport(rid);\r\n });\r\n\r\n ul.appendChild(li);\r\n }\r\n\r\n\t/**\r\n\t* Renders report panels.\r\n\t*/\r\n protected renderReportPanels() {\r\n const reportsContainer = document.getElementById(\"ReportsContainer\");\r\n const noReportPanel = document.getElementById(\"NoReportPanel\");\r\n\r\n if (this.reports.length > 0) {\r\n this.hideElement(noReportPanel);\r\n this.showElement(reportsContainer);\r\n } \r\n else {\r\n this.hideElement(reportsContainer);\r\n this.showElement(noReportPanel);\r\n }\r\n }\r\n\r\n\r\n //TODO: Move these two functions to @easydata/ui\r\n private hideElement(element: HTMLElement): void {\r\n if (element) {\r\n element.style.visibility = 'hidden';\r\n }\r\n }\r\n\r\n private showElement(element: HTMLElement): void {\r\n if (element) {\r\n element.style.removeProperty('visibility');\r\n }\r\n }\r\n \r\n\r\n\t/**\r\n\t* Inserts the report to the list of reports.\r\n * @param report The [[Report]] object to be inserted.\r\n\t*/\r\n protected insertIntoReportList(report: Report) {\r\n this.reports.push(report);\r\n }\r\n\r\n\t/**\r\n\t* Removes the report from the list of reports.\r\n * @param reportId The ID of the report to be removed.\r\n\t* @returns the index of removed report.\r\n\t*/\r\n protected removeFromReportList(reportId: string): number {\r\n let index = this.indexOfReportById(reportId);\r\n if (index >= 0)\r\n this.reports.splice(index, 1);\r\n\r\n return index;\r\n\r\n }\r\n\r\n private indexOfReportById(reportId: string): number {\r\n for (let i = 0; i < this.reports.length; i++) {\r\n if (this.reports[i].id === reportId)\r\n return i;\r\n }\r\n return -1;\r\n }\r\n\r\n\t/**\r\n\t* The handler of the \"Clear\" button click.\r\n\t*/\r\n protected clearReportButtonClick() {\r\n this.clearErrors();\r\n this.context.clearQuery();\r\n }\r\n\r\n\t/**\r\n\t* The handler of the \"Update\" button click.\r\n\t*/\r\n protected reloadReportDataButtonClick() {\r\n this.fetchData();\r\n }\r\n\r\n\t/**\r\n\t* The handler of the \"Save\" button click.\r\n\t*/\r\n protected saveReportButtonClick() {\r\n this.saveCurrentReportAs();\r\n }\r\n\r\n\t/**\r\n\t* The handler of the \"Load\" button click.\r\n\t*/\r\n protected loadReportButtonClick() {\r\n this.loadReport(\"LastQuery\");\r\n }\r\n\r\n\t/**\r\n\t* The handler of the \"Remove\" button click.\r\n\t*/\r\n protected removeReportButtonClick() {\r\n this.removeCurrentReport();\r\n }\r\n\r\n\t/**\r\n\t* The handler of the \"New\" button click.\r\n\t*/\r\n protected newReportButtonClick() {\r\n this.newReport();\r\n }\r\n\r\n\t/**\r\n\t* The handler of errors.\r\n * @param error The error object.\r\n\t*/\r\n protected errorHandler(error) {\r\n\r\n }\r\n\r\n\t/**\r\n\t* Clears the errors.\r\n\t*/\r\n protected clearErrors() {\r\n\r\n }\r\n\r\n\t/**\r\n\t* Disables export buttons.\r\n\t*/\r\n protected disableExportButtons() {\r\n this.hideExportButtons();\r\n }\r\n\r\n\t/**\r\n\t* Enables export buttons.\r\n\t*/\r\n protected enableExportButtons() {\r\n this.showExportButtons();\r\n }\r\n\r\n\t/**\r\n\t* Hides export buttons.\r\n\t*/\r\n protected hideExportButtons() {\r\n if (this.exportButtonsContainer) {\r\n this.exportButtonsContainer.style.display = \"none\"; \r\n }\r\n }\r\n\r\n\t/**\r\n\t* Shows export buttons.\r\n\t*/\r\n protected showExportButtons() {\r\n if (this.exportButtonsContainer) {\r\n this.exportButtonsContainer.style.display = \"initial\"; \r\n }\r\n }\r\n\r\n /**\r\n * Saves reports content to the cache.\r\n * @param report The report.\r\n * @param content The content (Query serialized into JSON).\r\n */\r\n protected saveReportContentInCache(report: Report, content: string) {\r\n let item = this.findReportCacheItem(report.id);\r\n if (!item) {\r\n item = { id: report.id };\r\n\r\n this.reportCache.push(item);\r\n }\r\n\r\n item.lastUpdated = report.lastUpdated;\r\n item.content = content;\r\n }\r\n\r\n /**\r\n * Gets the report content from cache.\r\n * @param report The report.\r\n * @returns Content of the report (Query in JSOn string)\r\n */\r\n protected getReportContentFromCache(report: Report): string | null {\r\n let item = this.findReportCacheItem(report.id);\r\n if (item && item.lastUpdated === report.lastUpdated) {\r\n return item.content;\r\n }\r\n\r\n return null;\r\n }\r\n\r\n private findReportById(id: string):Report | null {\r\n for(let item of this.reports) {\r\n if (item.id === id) {\r\n return item;\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n private findReportCacheItem(id: string):ReportCacheItem | null {\r\n for(let item of this.reportCache) {\r\n if (item.id === id) {\r\n return item;\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n}","import { i18n } from '@easydata/core'\r\n\r\nfunction addOldEasyQueryUIMapper() {\r\n i18n.addMapper((info: i18n.LocaleInfo) => {\r\n if (!info && !info.texts)\r\n return;\r\n\r\n for (let prop in info.texts) {\r\n switch(prop) {\r\n case 'PredicateTitle':\r\n info.texts['ConditionGroupTitle'] = info.texts[prop];\r\n break;\r\n case 'RootPredicateTitle':\r\n info.texts['RootConditionGroupTitle'] = info.texts[prop];\r\n break;\r\n case 'ErrIncorrectPredicateTitleFormat':\r\n info.texts['ErrIncorrectGroupTitleFormat'] = info.texts[prop];\r\n break;\r\n case 'ButtonAddPredicate':\r\n info.texts['ButtonAddGroup'] = info.texts[prop];\r\n break;\r\n case 'ButtonDelete':\r\n info.texts['CmdDelete'] = info.texts[prop];\r\n break; \r\n case 'ButtonClear':\r\n info.texts['CmdClear'] = info.texts[prop];\r\n break;\r\n case 'ButtonEnable':\r\n info.texts['CmdToggleEnable'] = info.texts[prop];\r\n break; \r\n case 'ButtonAddCondition':\r\n info.texts['CmdAddCondition'] = info.texts[prop];\r\n break; \r\n case 'ButtonAddGroup':\r\n info.texts['CmdAddCondGroup'] = info.texts[prop];\r\n break; \r\n \r\n default:\r\n //do nothing\r\n break;\r\n }\r\n }\r\n });\r\n}\r\n\r\nfunction addEasyQueryUITexts() {\r\n i18n.updateDefaultTexts({\r\n AltMenuAttribute: 'Attribute',\r\n AltMenuConstantExpression: 'Constant expression',\r\n ButtonApply: 'Apply',\r\n ButtonCancel: 'Cancel',\r\n ButtonClose: 'Close',\r\n ButtonNext: 'Next',\r\n ButtonPrev: 'Prev',\r\n ButtonNow: 'Now',\r\n ButtonOK: 'OK',\r\n\r\n MenuEnable: 'Enabled',\r\n MenuParameterization: 'Parameterized',\r\n MenuJoinCond: 'Use in JOIN',\r\n \r\n CmdClear: 'Clear',\r\n CmdDelete: 'Delete',\r\n CmdToggleEnable: 'Toggle enable',\r\n CmdToggleEnableCustom: 'Custom Expression columns are not supported',\r\n\r\n CmdAddCondition: 'Add condition',\r\n CmdAddCondGroup: 'Add group of conditions',\r\n\r\n ButtonSelectAll: 'Select all',\r\n ButtonDeselectAll: 'Clear selection',\r\n ButtonAddColumns: 'Add column(s)',\r\n ButtonAddConditions: 'Add condition(s)',\r\n\r\n CmdClickToAddCondition: '[Add new condition]',\r\n CmdDeleteRow: 'Delete this row',\r\n ErrIncorrectGroupTitleFormat: 'Incorrect condition group title format',\r\n ErrNotNumber: ' is not a number',\r\n ErrIncorrectInteger: 'Incorrect integer value',\r\n ErrIncorrectNumberList: 'Incorrect list format',\r\n False: 'False',\r\n LinkTypeAll: 'all',\r\n LinkTypeAny: 'any',\r\n LinkTypeNone: 'none',\r\n LinkTypeNotAll: 'not all',\r\n ConjAll: 'and',\r\n ConjAny: 'or',\r\n ConjNotAll: 'and',\r\n ConjNone: 'or',\r\n MsgApplySelection: '[Apply selection]',\r\n MsgAs: 'as',\r\n MsgEmptyList: '(empty list)',\r\n MsgEmptyListValue: '[select value]',\r\n MsgEmptyScalarValue: '[enter value]',\r\n MsgSubQueryValue: '[edit sub-query]',\r\n MsgEmptyAttrValue: '[select attribute]',\r\n MsgEmptyOperator: '[Unrecognized operator]',\r\n MsgEmptyCustomSql: '[enter SQL expression]',\r\n MsgCustomSql: '[Custom SQL]',\r\n MsgNoResult: 'No result',\r\n MsgResultCount: '{0} records found',\r\n\r\n MsgOf: 'of',\r\n ConditionGroupTitle: '{lt} of the following apply',\r\n RootConditionGroupTitle: 'Select records where {lt} of the following apply',\r\n StrAddConditions: 'Add conditions',\r\n SubQueryDialogTitle: 'Edit sub-query',\r\n SubQueryColumnTitle: 'Column:',\r\n SubQueryEmptyColumn: '[select column]',\r\n SubQueryQueryPanelCaption: 'Conditions',\r\n True: 'True',\r\n\r\n ButtonSorting: 'Sorting',\r\n ButtonToAggr: 'Change to aggregate column',\r\n ButtonToSimple: 'Change to simple column',\r\n ButtonFormat: 'Display format',\r\n CmdAscending: 'Ascending',\r\n CmdClickToAddColumn: '[Add new column]',\r\n CmdDeleteColumn: 'Delete column',\r\n CmdDeleteSorting: 'Delete sorting',\r\n CmdDescending: 'Descending',\r\n CmdGroupSort: 'Sorting',\r\n CmdGroupFormat: 'Display format',\r\n CmdNotSorted: 'Not sorted',\r\n ColTypeAggrFunc: 'Aggregate function',\r\n ColTypeCompound: 'Calculated',\r\n ColTypeGroup: 'Column type',\r\n ColTypeSimple: 'Simple column',\r\n HeaderExpression: 'Expression',\r\n HeaderSorting: 'Sorting',\r\n HeaderTitle: 'Title',\r\n SortHeaderColumn: 'Column',\r\n SortHeaderSorting: 'Sorting',\r\n StrAddColumns: 'Add columns',\r\n CustomExpression: 'Custom Expression',\r\n AddAllForEntityText: '[Add all attributes]',\r\n\r\n CmdMoveToStart: 'Move to start',\r\n CmdMoveRight: 'Move right',\r\n CmdMoveLeft: 'Move left',\r\n CmdMoveToEnd: 'Move to the end',\r\n CmdMoveUp: 'Move up',\r\n CmdMoveDown: 'Move down',\r\n\r\n ButtonMenu: 'Show menu',\r\n CmdToSimple: 'Not aggregated',\r\n\r\n CmdMoveToFirst: 'Move to the first',\r\n CmdMoveToPrev: 'Move to the previous',\r\n CmdMoveToNext: 'Move to the next',\r\n CmdMoveToLast: 'Move to the last',\r\n\r\n CmdHiddenColumn: 'Hidden',\r\n\r\n RowButtonTitle: 'Click to see the available options',\r\n\r\n EntityToggle: 'Toggle entity',\r\n\r\n //FilterBar\r\n StrNoFilterDefined: 'No filter defined',\r\n StrNoFilterClickToAdd: 'No filter defined. Click to add a new condition',\r\n\r\n //Time picker\r\n HintHours: 'Hours',\r\n HintMinutes: 'Minutes',\r\n\r\n //advanced search view texts\r\n RemoveQueryTitle: 'Confirmation',\r\n RemoveQueryContent: 'Remove query [{queryName}]?',\r\n NewQueryTitle: 'New query',\r\n NewQueryContent: 'New query name: ',\r\n NewQueryDefName: 'New query',\r\n SaveQueryTitle: 'Save query',\r\n SaveQueryContent: 'Query name: ',\r\n SaveQueryDefName: '{queryName} copy',\r\n QueryChangedTitle: 'Confirmation',\r\n QueryChangedContent: 'The query was changed. Do you want to save it first?',\r\n UpdateQuerySelector: '[click here to load the query]',\r\n FileNameLabel: 'File name: ',\r\n SaveQueryToFileDlgTitle: 'Save query to file',\r\n\r\n //report view texts\r\n NewReportDefName: 'New report',\r\n NewReportDlgTitle: 'New report',\r\n SaveReportDlgTitle: 'Save report',\r\n SaveReportDlgLabel: 'Report name:',\r\n ReportDescLabel: 'Description: ',\r\n RemoveReportDlgTitle: 'Remove report',\r\n RemoveReportContent: 'Are you sure you want to remove \\'{reportName}\\'?',\r\n\r\n //facets\r\n Facets: {\r\n TotalRecordsLabel: 'Total records:',\r\n AddMenuItems: {\r\n Chart: 'Chart',\r\n Pivot: 'Pivot table',\r\n DataTable: 'Data table'\r\n },\r\n LoadDataDlgTitle: 'Downloading data',\r\n LoadDataDlgContent: 'Records loaded: {loadedRecs}/{totalRecs}',\r\n RefreshBtnTitle: 'Refresh',\r\n ExportBtnTitle: 'Export',\r\n MaximizeBtnTitle: 'Maximize',\r\n RestoreBtnTitle: 'Restore Down',\r\n RemoveFacetDlgTitle: 'Remove facet',\r\n RemoveFacetDlgContent: `Are you sure, that you want to delete {facetTitle} tab?`,\r\n DefaultDlgTitle: 'Setup facet',\r\n DefaultFacetTitle: '',\r\n NewFacetTitle: 'New Facet',\r\n TabNameLabel: 'Tab name',\r\n ErrQueryChanged: 'FAILED TO DISPLAY. QUERY WAS CHANGED',\r\n ErrNotEnoughData: `We can't display the graph because not all data for this query is loaded. \r\n The total number of records: {totalRecs}, currently loaded: {cachedRecs}. \r\n You can [download the result]. Please note: this may take some time and consume a lot of memory.`,\r\n ErrTooMuchData: 'Too much data. The grid is not able to display it',\r\n Chart: {\r\n FacetTitle: 'Chart',\r\n DlgTitle: 'Chart settings',\r\n DataColumnSelectorLabel: 'Data column',\r\n LabelColumnSelectorLabel: 'Label column',\r\n ChartTypeSelectorLabel: 'Chart type',\r\n ShowLegendLabel: 'Show legend (if available)'\r\n },\r\n Pivot: {\r\n FacetTitle: 'Pivot table',\r\n DlgTitle: 'Pivot settings',\r\n SwapBtnTitle: 'Swap column and row fields',\r\n ColumnFieldSelectorLabel: 'Column field',\r\n RowFieldSelectorLabel: 'Row field',\r\n CellDataSelectorLabel: 'Cell data',\r\n TotalsRowLabel: 'Totals row',\r\n TotalsColLabel: 'Totals column',\r\n TotalGridLabel: 'Total'\r\n },\r\n DataTable: {\r\n FacetTitle: 'Result table',\r\n DlgTitle: 'Table facet settings'\r\n }\r\n },\r\n TotalsDlgLabel: 'Totals',\r\n GrandTotalsLabel: 'Grand totals',\r\n TotalsDlgTitle: 'Select totals',\r\n //formats\r\n ExportDlgTitle: 'Export result',\r\n ExportDlgFmtLabel: 'Format',\r\n 'csv': 'CSV',\r\n 'excel': 'Excel',\r\n 'pdf': 'PDF',\r\n 'excel-html': 'HTML (Excel-compatible)',\r\n \r\n // Aggregation settings\r\n AggrSettings: {\r\n GroupBtn: 'Group selected column(s)',\r\n UngroupBtn: 'Ungroup columns',\r\n AggrBtn: 'Aggregate selected column',\r\n UnaggrBtn: 'Remove column aggregation',\r\n GrandTotalsLabel: 'Show grand totals',\r\n GroupCountsLabel: 'Show record count for groups',\r\n AggrDialogTitle: 'Aggregation/grouping',\r\n EnableAggrLabel: 'Enable aggregation',\r\n SelectedError: 'Complete the action with selected column(s)',\r\n NoGroupsOrAggrError: 'Add at least one group or aggregation',\r\n NoGroupsOrGrandError: 'Add at least one group, or enable grand totals',\r\n NoAggrOrCountError: 'Add at least one aggregation, or enable records count',\r\n\r\n NoGroupsLabel: 'No groups',\r\n NoAggrsLabel: 'No aggregations',\r\n EmptySettingsLabel: '[ Click to setup ]'\r\n },\r\n\r\n ChartType: {\r\n Area: 'Area chart',\r\n Bar: 'Bar chart',\r\n Column: 'Column chart',\r\n Combo: 'Combo chart',\r\n Doughnut: 'Doughnut chart',\r\n Polar: 'Polar chart',\r\n Radar: 'Radar chart',\r\n Histogram: 'Histogram chart',\r\n Line: 'Line chart',\r\n SteppedLine: 'Stepped line chart',\r\n Pie: 'Pie chart'\r\n }\r\n });\r\n}\r\n\r\naddOldEasyQueryUIMapper();\r\naddEasyQueryUITexts();","import { EqServiceProvider } from '@easyquery/core';\r\n\r\nimport { DialogService } from '@easydata/ui';\r\n\r\ndeclare module '@easyquery/core/dist/lib/common/eq_services' {\r\n interface EqServiceProvider {\r\n registerDialogServiceResolver(this: EqServiceProvider, resolver: () => DialogService);\r\n getDialogService(this: EqServiceProvider): DialogService;\r\n }\r\n}\r\n\r\nEqServiceProvider.prototype.registerDialogServiceResolver = function (this: EqServiceProvider, resolver: () => DialogService) {\r\n this['dialogServiceResolver'] = resolver;\r\n}\r\n\r\nEqServiceProvider.prototype.getDialogService = function (this: EqServiceProvider) {\r\n if (!this['dialogService']) {\r\n if (!this['dialogServiceResolver']) {\r\n throw 'DialogServiceResolver is not defined';\r\n }\r\n this['dialogService'] = this['dialogServiceResolver']();\r\n }\r\n\r\n return this['dialogService'];\r\n}","export * from './widgets/entities_panel'\r\nexport * from './widgets/columns_panel'\r\nexport * from './widgets/columns_bar'\r\nexport * from './widgets/sorting_bar'\r\nexport * from './widgets/query_panel'\r\nexport * from './widgets/filter_bar'\r\nexport * from './widgets/html_content_widget'\r\nexport * from './widgets/eq_result_html_grid'\r\nexport * from './widgets/grid'\r\nexport * from './widgets/easy_grid_widget'\r\nexport * from './widgets/statement_panel'\r\nexport * from './widgets/widget_options'\r\nexport * from './widgets/process_widget'\r\nexport * from './widgets/manage_drilldown_widget'\r\nexport * from './widgets/result_facets_panel'\r\nexport * from './widgets/export_widget'\r\nexport * from './widgets/aggregation_bar'\r\n\r\nexport * from './widgets/charts/chart_type'\r\nexport * from './widgets/charts/chart_widget'\r\nexport * from './widgets/charts/chart_widget_google'\r\nexport * from './widgets/charts/chart_widget_chartjs'\r\n\r\nexport * from './widgets/renderers/base_element_renderer'\r\nexport * from './widgets/renderers/dropdown_renderer'\r\n\r\nexport * from './widgets/renderers/aggr_settings/aggr_settings_renderer'\r\nexport * from './widgets/renderers/columnsbar/aggrfunc_column_renderer_cb'\r\nexport * from './widgets/renderers/columnsbar/attr_column_renderer_cb'\r\nexport * from './widgets/renderers/columnsbar/column_renderer_cb'\r\n\r\nexport * from './widgets/renderers/columnspanel/aggrfunc_column_renderer_cp'\r\nexport * from './widgets/renderers/columnspanel/attr_column_renderer_cp'\r\nexport * from './widgets/renderers/columnspanel/column_renderer_cp'\r\nexport * from './widgets/renderers/columnspanel/editable_column_renderer_cp'\r\n\r\nexport * from './widgets/renderers/querypanel/input_expression_renderer'\r\nexport * from './widgets/renderers/querypanel/datetime_expression_render'\r\nexport * from './widgets/renderers/querypanel/condition_renderer'\r\nexport * from './widgets/renderers/querypanel/condition_group_renderer'\r\nexport * from './widgets/renderers/querypanel/attribute_expression_renderer'\r\nexport * from './widgets/renderers/querypanel/expression_renderer'\r\nexport * from './widgets/renderers/querypanel/operator_renderer'\r\nexport * from './widgets/renderers/querypanel/subquery_expression_renderer'\r\nexport * from './widgets/renderers/querypanel/list_expression_renderer'\r\nexport * from './widgets/renderers/querypanel/text_renderer'\r\nexport * from './widgets/renderers/querypanel/addrow_renderer'\r\n\r\nexport * from './facets/result_facet'\r\nexport * from './facets/datatable_facet'\r\nexport * from './facets/chart_facet'\r\nexport * from './facets/pivot_table_facet'\r\n\r\nexport * from './views/view_options'\r\nexport * from './views/view'\r\nexport * from './views/adv_search_view'\r\nexport * from './views/data_filter_view'\r\nexport * from './views/html_data_filter_view'\r\nexport * from './views/report_view'\r\n\r\nexport * from './utils/dropdown'\r\nexport * from './utils/popup_menu'\r\nexport * from './utils/browser_utils'\r\n\r\nexport * from './types/qp_editable_part'\r\nexport * from './types/facet_type'\r\n\r\nexport * from './dialog/export_dialog'\r\nexport * from './dialog/aggr_settings_dialog'\r\n\r\nimport './i18n/text_resources'\r\nimport './extensions'\r\n\r\nif (!Element.prototype.matches) {\r\n Element.prototype.matches = \r\n (Element.prototype as any).msMatchesSelector \r\n || (Element.prototype as any).webkitMatchesSelector;\r\n}\r\n// support NodeList forEach in IE11\r\nif (window['NodeList'] && !window['NodeList'].prototype.forEach) {\r\n window['NodeList'].prototype.forEach = Array.prototype.forEach as any;\r\n}\r\n\r\n//find index in IE11\r\nif (!Array.prototype.findIndex) {\r\n Array.prototype.findIndex = function (predicate) {\r\n if (this == null) {\r\n throw new TypeError('Array.prototype.findIndex called on null or undefined');\r\n }\r\n if (typeof predicate !== 'function') {\r\n throw new TypeError('predicate must be a function');\r\n }\r\n var list = Object(this);\r\n var length = list.length >>> 0;\r\n var thisArg = arguments[1];\r\n var value;\r\n\r\n for (var i = 0; i < length; i++) {\r\n value = list[i];\r\n if (predicate.call(thisArg, value, i, list)) {\r\n return i;\r\n }\r\n }\r\n return -1;\r\n };\r\n}"],"names":["root","factory","exports","module","require","define","amd","self","__WEBPACK_EXTERNAL_MODULE__388__","browserUtils","_isFirefox","_isIE","isIE","eval","isFirefox","ua","navigator","userAgent","toLowerCase","indexOf","_detectedIsMobileMode","_isMobileMode","undefined","detectIsMobileMode","oldValue","isMobileMode","window","matchMedia","matches","newValue","mobileModeChangeHandler","setIsMobileMode","value","onMobileModeChanged","callback","getMobileCssClass","addEventListener","findHighestZIndex","elem","highest","zindex","document","defaultView","getComputedStyle","getPropertyValue","numZIndex","parseInt","parentElement","safeFocus","element","setTimeout","_","focus","eqCssPrefix","eqCssMobile","DataType","EntityAttrKind","HttpMethod","EditorTag","i18n","utils","HttpRequest","xhr","descriptor","this","method","url","headers","queryParams","data","prototype","setHeader","name","setQueryParam","getXMLHttpRequest","getResponseHeaders","readyState","HEADERS_RECEIVED","headerMap","_i","arr_1","getAllResponseHeaders","trim","split","length","parts","header","shift","join","open","_this","UNSENT","Object","keys","encodeURI","map","param","setRequestHeader","abort","currentLocale","englishUSLocaleSettings","shortDateFormat","longDateFormat","editDateFormat","shortTimeFormat","editTimeFormat","longTimeFormat","shortMonthNames","longMonthNames","shortWeekDayNames","longWeekDayNames","decimalSeparator","currency","defaultLocale","localeId","englishName","displayName","texts","ButtonOK","ButtonCancel","Yes","No","True","False","settings","allLocales","mappers","mapInfo","info","mappers_1","mapper","getCurrentLocale","setCurrentLocale","newLocale","assignDeep","getLocaleSettings","updateLocaleSettings","settingsToUpdate","updateLocaleInfo","localeData","localeInfoToUpdate","loadBrowserLocaleSettings","now","dateStr","timeStr","dateFormat","timeFormat","lang","language","Date","toLocaleDateString","year","month","day","toLocaleTimeString","hour","minute","second","replace","buildShortDateTimeFormat","dataType","format","localeSettings","Time","buildLongDateTimeFormat","addMapper","push","getLocales","result","locale","sort","a","b","setLocale","l","console","warn","getText","args","arguments","textsObj","resText","argLength","i","getOneLocaleSetting","key","getShortMonthName","monthNum","getLongMonthName","getShortWeekDayName","dayNum","toString","getLongWeekDayName","updateLocaleTexts","error","updateDefaultTexts","addLocale","localeInfo","resetLocales","dateTimeToStr","dateTime","DateTime","numberToStr","number","type","charAt","toUpperCase","cachedSequenceFormats","values_2","filter","v","values_1","Number","forEach","index","values","formatWithSequence","slice","toLocaleString","digits","style","useGrouping","minimumIntegerDigits","minimumFractionDigits","maximumFractionDigits","getNumberFormatOptions","mask","ch","reverse","convertWithMask","Math","trunc","booleanToStr","bool","concat","getAllDataTypes","item","getDateDataTypes","getStringDataTypes","String","Memo","FixedChar","_numericTypes","Byte","Word","Int32","Int64","Float","Currency","Autoinc","getNumericDataTypes","_intTypes","assignDeepCore","hashSet","target","sources","sources_1","source","hasOwnProperty","sourceVal","has","get","Array","isArray","createArrayFrom","set","create","getPrototypeOf","collection","collection_1","assign","WeakMap","getIfDefined","defaultValue","IsDefinedAndNotNull","copyArrayTo","collection1","collection2","len1","len2","findItemById","array","id","arrLength","idx","findItemIndexById","indexOfArrayItem","arr","len","moveArrayItem","index1","index2","splice","removeArrayItem","insertArrayItem","fillArray","start","end","relativeStart","k","max","min","relativeEnd","final","shiftToFitWindow","absLeft","width","body","getElementsByTagName","winWidth","innerWidth","documentElement","clientWidth","absRight","isObject","val","isNumericType","dtype","isIntType","isNumeric","isNaN","parseFloat","isFinite","areCompatibleDataTypes","type1","type2","Unknown","isPropSet","obj","propName","symbols","squeeze","str","maxlen","step","nextIndex","getRandomInt","floor","random","safeParseInt","res","generateId","prefix","prfx","pml","ptt","squeezeMoniker","randCharPart","randInt","targetBase","buffer","rest","intToNumBase","getTime","strToDateTime","normalizedValue","formatItems","dateItems","monthIndex","dayIndex","yearIndex","hourIndex","minutesIndex","secondsIndex","today","getFullYear","getMonth","getDate","getDaysInMonth","_a","strToTime","timeItems","DT_FORMAT_RGEX","date","yearStr","getHours","getMinutes","getSeconds","hour12","isPm","yyyy","yy","substring","MMMM","MMM","MM","M","dd","d","HH","H","hh","h","tt","mm","ss","match","$1","extendStatics","ColumnAlignment","HttpActionResult","request","promise","getPromise","getRequest","then","onfulfilled","onrejected","catch","finally","onfinally","__extends","setPrototypeOf","__proto__","p","call","TypeError","__","constructor","__assign","t","s","n","apply","HttpResponseError","_super","status","message","Error","MetaEntity","HttpClient","defaultHeaders","customPayload","defineProperty","_responseBody","enumerable","configurable","options","send","Get","post","Post","put","Put","delete","Delete","contentType","XMLHttpRequest","desc","beforeEachRequest","onRequest","dataToSend","JSON","stringify","Promise","resolve","reject","responseType","onerror","responseText","onreadystatechange","responseContentType","getResponseHeader","responseObj","response","parse","onResponse","decodeArrayBuffer","uintArray","reader","FileReader","onloadend","DONE","readAsText","Blob","parent","isEditable","caption","description","attributes","subEntities","loadFromData","model","dto","captionPlural","namePlur","ied","ents","newEntity","createEntity","attrs","newAttr","createEntityAttr","scan","processAttribute","processEntity","opts","stop","internalProcessEntity","entity","attrCount","attr","subEntityCount","getFirstPrimaryAttr","getPrimaryAttrs","isPrimaryKey","MetaEntityAttr","size","isForeignKey","isNullable","showOnView","showOnCreate","showOnEdit","showInLookup","lookupAttr","expr","kind","Data","cptn","ipk","ifk","lattr","lookupEntity","lent","dataAttr","dattr","lookupDataAttr","ldattr","isDataType","defVal","nul","ivis","sov","soc","soe","sil","displayFormat","dfmt","udata","userData","edtr","defaultEditor","getEditorById","createValueEditor","ValueEditor","tag","resType","defValue","defval","rtype","accept","multiline","subType","getValueText","text","_b","_c","MetaData","mainEntity","rootEntity","displayFormats","Map","getMainEntity","loadFromJSON","stringJson","version","vers","editors","newEditor","entroot","dtypeStr","formats","getDisplayFormats","getDisplayFormatsForType","getDefaultFormat","f","isdef","setData","isEmpty","getId","getName","getRootEntity","editorId","editor","getAttributeById","attrId","getEntityAttrById","checkAttrProperty","attribute","listByEntityWithFilter","filterFunc","ent","entIdx","newEnt","items","isEntity","attrIdx","listByEntity","resultEntities","resultAttributes","newOpts","includeRootData","sortCheck","sortEntities","attrPlacement","clear","addDefaultValueEditors","addOrUpdateValueEditor","ve","getEntitiesTree","getEntitiesTreeWithFilter","getFullEntityPathByAttr","sep","getEntityPathByAttr","entityCaption","entityText","getAttributeText","attrText","entityPath","RegExp","runThroughEntities","getFirstAttributeByFilter","AggregationSettings","colStore","aggregates","groups","useGrandTotals","useRecordCount","_caseSensitiveGroups","COUNT_FIELD_NAME","updateCompareProc","compareValues","strictCompare","caseInsensitiveCompare","addGroup","cols","columns","getColumnIds","from","to","validateColumns","hasColumnsInUse","addAggregateColumn","colIndexOrId","funcId","colId","validateAggregate","addGrandTotals","addCounts","getGroups","grp","getInternalGroups","lastGroup","getAggregates","hasAggregates","hasGroups","hasGrandTotals","hasRecordCount","drop","caseSensitiveGroups","c","aggr","needAggrCalculation","saveToData","ugt","urc","csg","buildGroupKey","group","row","caseInsensitive","keyVal","getValue","value1","value2","liquid","DataColumn","label","originAttrId","isAggr","groupFooterColumnTemplate","gfct","calculatedWidth","DataColumnList","_dateColumnIdx","add","colOrDesc","col","updateDateColumnIdx","getItems","count","move","newIndex","oldIndex","getIndex","getDateColumnIndexes","removeAt","removeDate","DataRow","toArray","colIdOrIndex","RangeError","setValue","EasyDataTable","_chunkSize","_elasticChunks","cachedRows","total","loader","needTotal","isInMemory","chunkSize","elasticChunks","inMemory","_columns","onUpdate","colDesc","rows","rowData","createRow","addRow","getRows","params","fromIndex","pageSize","page","offset","limit","endIndex","loadChunk","table","getCachedRows","getCachedCount","fireUpdated","getRow","getTotal","setTotal","dataOrRow","dateIdx","column","mapDate","rowOrValues","newRow","dateIdx_1","cachedTotal","totalIsKnown","EasyGuid","newGuid","r","EventEmitter","silentMode","events","subscribe","eventType","event","getEventRecByType","eventCallback","eventCallbacks","unsubscribe","callbackId","fire","postpone","force","eventRec","eqevent_1","emitAllFunc","enterSilentMode","exitSilentMode","isSilent","event_1","renderLiquidTemplate","template","vars","liquidVarRegexp","x","NaN","ceil","addElement","createElement","cssClass","className","appendChild","addCssClass","hideElement","display","showElement","toggleVisibility","first","duration","complete","isVisible","offsetWidth","offsetHeight","createBrowserEvent","eventName","Event","createEvent","initEvent","getViewportSize","height","clientHeight","innerHeight","getScrollPos","docElem","top","pageYOffset","scrollTop","left","pageXOffset","scrollLeft","getElementAbsolutePos","y","position","box","defaultBoundingClientRect","right","bottom","getBoundingClientRect","scollPos","clientTop","clientLeft","round","getWinSize","slideDown","removeProperty","overflow","paddingTop","paddingBottom","marginTop","marginBottom","boxSizing","transitionProperty","transitionDuration","slideUp","__spreadArray","pack","ar","DomElementBuilder","addChild","childBuilder","builder","domel","addChildElement","attrValue","setAttribute","title","dataId","dataValue","removeAttribute","show","removeStyle","hide","toHide","setStyle","visible","getClientRects","addClass","classNames","fullList","classList","removeClass","remove","toggleClass","toggle","on","listener","eventTypes","off","removeEventListener","styleId","styleValue","setProperty","innerText","html","innerHTML","oldElem","tagName","replaceWith","addText","textEl","createTextNode","addHtml","toDOM","appendTo","DomTextAreaElementBuilder","DomInputElementBuilder","valueAsDate","valueAsNumber","maskPattern","input","inputHandler","e","mskd","startSelection","selectionStart","el","test","selectionEnd","keyCode","preventDefault","selection","onlyLodash","dispatchEvent","char","fromCharCode","charCode","mskd_1","selectionStart_1","selection_1","event_2","DomSelectElementBuilder","addOption","option","selected","HTMLDivElement","HTMLSpanElement","HTMLAnchorElement","HTMLButtonElement","HTMLImageElement","HTMLInputElement","HTMLTextAreaElement","HTMLSelectElement","DropEffect","touchEventIsDefined","TouchEvent","AutoResizeColumns","EqDragEvent","dragImage","sourceEvent","dropEffect","Allow","pageX","pageY","MouseEvent","touches","Position","ev","eqDragManager","DragManager","delta","draggableItem","finishedSuccessfully","mouseDownPosition","containerDescriptors","containerDescriptorIndex","None","classPrefix","DRAG_DISABLED_ATTR","registerDraggableItem","ondragstart","detectDragging","hasAttribute","stopPropagation","cursorPosition","abs","startDragging","mouseMoveEventListener","mouseMoveDragListener","beforeDragStart","cloneNode","renderer","updateCusror","updateImageClass","scope","updateDragItemPosition","onDragStart","mouseDownListener","mouseUpListener","endDraggind","dropContDesc","container","scopes","onDrop","onDragLeave","onDragEnd","removeChild","registerDropContainer","removeDropContainer","descriptorOrSlot","descs","descs_1","detectDragEnterEvent","dragEnterEvent","detectDragLeaveEvent","dragLeaveEvent","event_3","onDragOver","setCursorStyle","Forbid","cursor","children","pos","event_4","onDragEnter","event_5","containerPos","CellRendererType","cssPrefix","DFMT_REGEX","GridColumnAlign","StringCellRendererDefault","cellValueElement","rowElement","align","NONE","NumberCellRendererDefault","strValue","dataColumn","DateTimeCellRendererDefault","isDate","timeOptions","BoolCellRendererDefault","GridCellRendererStore","renderers","defaultRenderers","registerRenderer","setDefaultRenderer","STRING","NUMBER","DATETIME","BOOL","getDefaultRenderer","columnType","cellType","getCellType","getDefaultRendererByType","rendererType","getRenderer","DialogFooterAlignment","GridColumn","grid","isRowNum","_label","_description","widthOptions","columnWidths","alignment","LEFT","CENTER","RIGHT","MapAlignment","default","cellRenderer","cellRendererStore","rowNumColumn","onGetCellRenderer","GridColumnList","columnList","sync","hasRowNumCol","rowNumCol","onSyncGridColumn","EasyGrid","pagination","paginationOptions","maxButtonCount","useBootstrap","defaultDataGridOptions","slot","dataTable","fixHeightOnFirstRender","syncGridColumns","useRowNumeration","allowDragDrop","calculator","paging","enabled","pageSizeItems","autoResize","Always","stringColumns","numberColumns","boolColumns","dateColumns","otherColumns","showPlusButton","viewportRowsCount","showActiveRow","rowsOnPagePromise","containerInitialHeight","firstRender","prevRowTotals","landingIndex","landingSlot","_activeRowIndex","mergeOptions","processColumnWidthsOptions","eventEmitter","setSlot","init","colWidthOptions","pagingOptions","knownTypes","getElementById","getElementsByClassName","onInit","onRowClick","onRowDbClick","onPlusButtonClick","onColumnChanged","onColumnDeleted","onColumnMoved","onPageChanged","onActiveRowChanged","activeRowIndex","showLandingSlot","hideLandingSlot","refresh","fireEvent","columnId","getData","getColumns","destroy","clearDOM","render","hasData","rootDiv","renderHeader","headerDiv","renderBody","bodyDiv","renderFooter","footerDiv","gridContainer","needAutoResize","Never","updateHeight","resizeColumns","firstRow","bodyCellContainerDiv","firstElementChild","viewportHeight_1","bodyViewportDiv","sbHeight","getContainerWidth","reduce","sum","current","headerViewportDiv","headerCellContainerDiv","headerRowDiv","hd","renderColumnHeader","renderHeaderButtons","containerWidth","colBuilder","colDiv","attrLabel","showAggrs","canShowAggregates","showProgress","getRowsToRender","hideProgress","rowsToRender","groups_1","updateTotalsState","tr","renderRow","showGrandTotalsOnEachPage","isLastPage","onViewportKeydown","bind","aggrSettings","isLast","changeLevel","level","renderTotalsRow","applyGroupColumnTemplate","colIndex","renderCell","aggrContainer","getAggrContainer","aggrCols","getAggregateData","aggrCols_1","aggrColId","isLastGroupColumn","groupColIndex","aggrColIndex","groupFooterTemplate","firstChild","cellDiv","rowCount","querySelectorAll","ensureRowVisibility","rowOrIndex","getDataRow","rowRect","viewportRect","rowTop","rowBottom","viewportHeight","windowHeight","footerPaginateDiv","renderPageNavigator","pageInfoBlock","renderPageInfoBlock","pageInfoDiv","fistPageRecordNum","lastPageRecordNum","totalStr","getLocalIndexByGlobal","getGlobalIndexByLocal","indexGlobal","rowBuilder","rowIndex","colindex","cellElement","valueCell","setPage","paginateDiv","prefix_1","buttonClickHandler_1","getAttribute","renderPageCell","pageIndex","content","disabled","extreme","active","li","a_1","newA","ul","cell","pageCount","zeroBasedIndex","firstPageIndex","lastPageIndex","allowPageSizeChange","pageSizes","selectSize","sel_1","selOptions","selSet","Set","labelDiv","handler","handlerId","plusButtonTitle","colElems","rowElem","landingPos","newLandingIndex","cols_1","colPos","insertBefore","updateActiveRow","activeRow","getActiveRow","visibility","sumWidth","headerCells","headerIdx","_loop_1","this_1","cellValues","maxWidth","whiteSpace","maxOption","minOption","Calendar","yearRange","setDate","currentDate","dateChanged","onDateChanged","DateTimePicker","calendar","timePicker","setDateTime","currentDateTime","setTime","getDateTime","showCalendar","createCalendar","showDateTimeInput","timePickerIsUsed","showTimePicker","oneClickDateSelection","dateTimeChanged","createTimePicker","onTimeChanged","time","setHours","setMinutes","anchor","beforeShow","onApply","cancel","onCancel","onDateTimeChanged","DefaultCalendar","daysOfWeek","months","calendarBody","isManualInputChanging","selectedMonth","selectedYear","rerenderMonth","renderManualDateInput","headerTextElem","renderCalendarButtons","getInputDateFormat","newDate","manualInputElem","jump","updateDisplayedDateValue","prev","selectMonthElem","selectYearElem","next","rerenderSelectYear","exec","minusYear","plusYear","op","firstDay","getDay","daysInMonth","setFullYear","setMonth","dayOfWeek","cellsDrawnInLastRow","cellsToDraw","TimePicker","currentTime","timeChanged","DefaultTimePicker","updateDisplayedTime","hoursInput","minutesInput","timeText","slidersBuilder","timeToDraw","DefaultDateTimePicker","sb","zIndex","renderButtons","globalMouseDownHandler","srcElement","contains","nowButton","submitButton","calendarSlot","timePickerSlot","anchorPos","parentPos","DefaultDialogService","openConfirm","closable","submitable","cancelable","onSubmit","openPrompt","submitOnEnter","arrangeParents","beforeOpen","processInput","dialog","DefaultDialog","onDestroy","dlg","untrack","track","createSet","DefaultDialogSet","openDialogs","openProgress","DefaultProgressDialog","getAllDialogs","closeAllDialogs","close","submitHandler","token","cancelHandler","keydownHandler","isActiveDialog","dialogId","windowElement","headerElement","alertElement","bodyElement","alignClass","footerAlignment","Center","footerElement","bb","submitButtonText","recaptchaSiteKey","grecaptcha","ready","execute","action","cancelButtonText","getRootElement","getSubmitButtonElement","getCancelButtonElement","windowDiv","querySelector","clearAlert","onInput","onShow","submit","disableButtons","button","enableButtons","showAlert","reason","alert","windowDivs","turnOn","contentElement","progressElement","determinated","updateContent","updateProgress","progress","in01","num","dialogService","currentDialog","currentIndex","getCurrent","openNext","openPrev","dlgOptions","GridPageInfo","GridItemsPerPage","ButtonApply","ButtonNow","LblTotal","IsIE","IsEdge","IsFirefox","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","__webpack_modules__","definition","o","prop","Symbol","toStringTag","ColumnAction","queryChangedCallbackId","WidgetGroup","panel","getWidgetType","context","setOptions","renderProgressBlock","refreshCore","syncWithColumns","refreshCheckedStateByColumns","onProcessStartCore","showIndicatorOnLoad","progressBlock","parentNode","onProcessEndCore","destroyCore","showToolbar","showSelectAllButton","showClearSelectionButton","showAddColumnButton","showAddConditionButton","showCheckboxes","showTooltips","draggableAttributes","showAttributes","useInConditions","useInResult","useInSorting","showFilterBox","filterBoxMode","autoClearSelection","entityRenderedCallback","attributeRenderedCallback","query","getQuery","removeChangedCallback","addChangedCallback","edata","part","QueryChangePart","getModel","rootEntityBlock","entTree","addUIC","addUIR","addUIS","entityTreeBlock","renderEntity","createFilterBox","createToolPanel","block","entityBlock","entityNode","entityChildren","nodeLabel","nodeInput","attrNode","attrInput","nodeToggleButton","href","currentOffset","divElem","hidden","itemsLength","checkbox","currentTarget","checked","addColumn","fireColumnsChangedEvent","QueryChangeAction","ExprTag","removeColumn","j","checkboxes","entities","attributeId","removeColumns","filterBoxBlock","filterBoxInput","checkFilterAttribute","displayAttrCount","collapseAll","expandAll","defClass","toolPanelBlock","toolSelectAll","toolDeselectAll","toolAddColumns","toolAddCond","toolLeftBlock","toolRightBlock","selectAll","deselectAll","attrElements","attrList","fireProcessEvent","attrElement","fireChangedEvent","addSimpleCondition","attrCaption","textContent","checkFilterText","filterText","entChildren","entElem","childNodes","childs","nodeButtons","inputs","Widget","isFilteringMode","showSelected","parentMenu","menu","parentLevel","levelIndex","levelDiv","domWriteItemsId","menuId","itemRenderedCallback","_applyItem","itemDiv","activeItem","selectedItem","initialized","updated","renderContent","setItems","itemBgColor","colors","bgON","itemFgColor","fgON","itemFontFamily","bgOVER","itemStyle","fontFamily","itemFontSize","fontSize","multiselect","isSubQuery","baseDivBuilder","useDefaultStyles","border","baseDiv","applyItem","hideButtons","applyDiv","applyBtn","borderBottom","padding","applyTextNode","buttons","cancelBtn","marginLeft","cancelText","hideMenu","searchBoxAlwaysShown","showSearchBoxAfter","searchDivBuilder","searchEditBoxBuilder","deactivateItem","renderItems","searchBox","click","moveActiveItemUp","moveActiveItemDown","openSubLevel","searchDiv","scrollDiv","tabIndex","overflowX","overflowY","which","getRootLevel","closeDiv","filteredItems","activateItem","menuItem","showSubLevel","subLevel","focusScrollDiv","turnCheckboxes","itemCheckbox","isItemSelected","setItemSelected","submitItems","selectedItems","allSubitemsAreFiltered","filterCallback","isItemDiv","isLevelDiv","getMenuItem","renderItemsWithoutFilter","activateOnMouseOver","itemFilterCallback","getItemFilterCallback","color","paddingLeft","paddingRight","cb","defaultChecked","margin","verticalAlign","itemText","showItemIds","itemTextNode","arrowSpan","arrowText","itemClickHandler","itemSelected","refreshCheckboxes","isCursorInside","renderItemsWithFilter","filterSections","pureFilterTexts","section","filterItems","renderItemWithFilter","matchesFilter","regexp","resultItems","restFilterSections","filterRegexp","groupItem","groupItemMatches","filterTexts","levelFilterText","highlightText","lowerText","lowerContent","indexInMas","itemOverBgColor","itemOverFgColor","fgOVER","itemClass","itemClassOver","backgroundColor","levelId","MenuLevel","scroll","winSize","leftSpace","rightSpace","offsetParent","showAt","adjustTopPos","levelBottom","initLevelDiv","levelStyle","minItemWidth","maxItemWidth","maxHeight","newHeight","searchBoxAutoFocus","submitMenu","update","newItems","refreshItems","findItem","searchedText","txt","mouseIsOverBlock","mouseIsOverLink","toId","ancorFocused","adjustHeight","submitOnBlur","PopupMenu","lastMenuID","updateProps","rootLevel","menuKeyUpHandler","stopImmediatePropagation","isOutside","menuLevel","shadow","commandTemplate","clearItemsMenuProps","clearItemMenuProps","setSelectedItems","selectedIds","showMenu","activeElement","itemSelectedCallback","menuClosedCallback","onMenuItemSelected","srcPos","anchorHeight","anchorWidth","knockMenuStyle","formatStr","tokenText","skipSpaces","getToken","getTokenText","npos","npos1","npos2","QPEditablePart","functionMenu","formatsMenu","buttonMenu","isMouseOverBlock","keepShowingButtons","getButtonsToShow","columnEnabled","sortingButton","renderSoringButton","sorting","SortDirection","replaceChild","createFunctionMenu","createFormatsMenu","createButtonMenu","getClassesToAdd","renderCheckbox","renderExpressionBlock","showColumnTitles","renderCaptionBlock","isReadOnly","renderEnabledButton","renderColumnTypeButton","renderColumnFormatButton","renderDeleteButton","renderMenuButton","onMouseEnter","onMouseLeave","accentActiveColumn","onMouseClick","alwaysShowButtons","showButtons","toggleColumnPicked","adjustButtonsVisibility","fireColumnChanged","inputEl","minWidth","isEndEvent","save","KeyboardEvent","FocusEvent","aEl","sortButtonDirectionCssClass","sortButtonCssClass","getUIS","sortMenu","moveMenu","isHidden","Hidden","MoveTop","MoveDown","MoveUp","MoveBottom","SortingNone","SortingAsc","SortingDesc","buttonMenuHandler","leaveButtonBlock","evt","includes","Menu","allowAggrColumns","changeTypeHandler","getFormatsMenuItems","allowDisplayFormatChange","changeFormatHandler","Enable","getContext","getDataType","itemId","enterButtonBlock","isColumnActive","funcCaption","funcs","getAggrFunctions","funcAllowed","colDataType","func","toInclude","getAppliedTypesOrDefault","getAggrFunctionCaption","areCustomExpressionsAllowed","menuOptions","curQuery","setHidden","moveColumn","colMenu","getButtonMenuSelectedItems","processFormatsButtonMenuItems","processExtraButtonMenuItems","common","allowHiddenColumns","sortItems","allowSorting","getSortMenuList","getMoveMenuList","extra","getExtraButtonMenuItems","arrSelected","formatId","renderBaseExpression","getAttributeByIdSafe","baseAttr","getAttributeTitle","showEntitiesMenu","baseExpressionItemSelectedCallback","attrid","updateBaseAttr","getDefaultColumnCaption","baseAttrId","arg","changeTypeToCustomSql","changeColumnType","newElement","changeTypeToAggr","ColumnRendererCP","displayFormatParser","DisplayFormatParser","exprBlockBuilder","getAggrFunctionFormat","arrFormat","parseDisplayFormat","changeTypeToSimple","parser","AttrColumnRendererCP","dataTypeMenu","exprBlock","getColumnValue","colVal","setColumnValue","createDataTypeMenu","dataTypeLink","typeItem","sql","getDefaultValue","EditableColumnRendererCP","activeColumn","showAddRow","showHeader","allowDuplicates","allowCustomExpressions","attrElementFormat","titleElementFormat","columnRenderedCallback","customExpressionText","showAddAllForEntity","detachQueryObserver","attachQueryObserver","moveColumnCore","addNewColumn","renderBaseElements","minusHeight","headerBuilder","columnsBlock","addRowElement","ids","queryEventCallbackId","focusedBefore","isFocusInside","changee","colEl","getColumnRenderer","newEl","focusElem","agjustHeaderVisibility","addColumnElement","nextSibling","previousSibling","focusCond","rowElems","rowHeight","absPos","scrollIntoView","behavior","attributeFormat","columnTitleFormat","createEntitiesMenu","createColumnMenus","renderColumn","err","throwError","sourceError","isActive","newColBlock","scrollToBottom","scrollHeight","checkColumnsArray","checkColumn","getColumnsBlock","ConstColumnRendererCP","AggrFuncColumnRendererCP","CustomSqlColumnRendererCP","isEx","addAllColumnsToEntitiesList","list","attrIds","unshift","entitiesList","adjustEntitiesMenuHeight","entitiesMenu","createSortMenu","createMoveMenu","direction","colToMove","tapedTwice","bar","renderSortingImage","renderButtonsBlock","renderSortingButton","isFocused","ctrlKey","metaKey","clickEvent","buttonSortingClickHandler","_sortIndex","getColumnSortIndex","buttonDeleteClickHandler","buttonTypeClickHandler","changeColumnTypeHandler","buttonFormatClickHandler","formatButtonIsShown","onHideButtonsMobile","onShowButtonsMobile","ColumnRendererCB","AttrColumnRendererCB","EditableColumnRendererCB","customQuery","sortMenuList","moveMenuList","addRowButton","elements","columnSlots","colSlot","colWidth","colHeight","paddingWidth","renderAddRowButton","renderColumnButtonsBlockMobile","columnButtonsBlockMobileArrow","columnButtonsBlockMobile","buttonsBlockSortingButton","currentColumnRenderer","hideColumnButtonsMobile","buttonsBlockTypeButton","buttonsBlockFormatButton","buttonsBlockDeleteButton","showColumnButtonsMobile","columnRenderer","columnElement","currentActiveColumn","rect","offsetTop","offsetLeft","ConstColumnRendererCB","AggrFuncColumnRendererCB","CustomSqlColumnRendererCB","colJson","globalCounter","sd","getArrow","isJustSorted","setColumnSortIndex","getSortedColumns","justsorted","ColumnRendererSB","ConditionAction","condition","autoAppear","coreRender","onConditionRendered","isInJoin","isParameterized","getLevel","operator","getOperatorById","getOperatorId","equtils","renderConjunction","mayAppear","minLength","nullOperator","expressions","getOperatorRenderer","toAppear","getExpressionRenderer","adjustWidth","TextRenderer","accentActiveCondition","toggleConditionPicked","buttonsBlock","setConditionParameterized","setParameterized","setConditionInJoin","setInJoin","getConditionMenu","getParent","isFirstConditionInGroup","getConditions","showConjunctions","linkTypeStr","linkType","conjuctionText","isConditionActive","alwaysShowButtonsInConditions","conditionMenuHandler","AddCondition","isGroup","entMenu","getEntitiesMenu","descr","cond","fireConditionsChangedEvent","AddGroup","addConditionGroup","conditions","condMenu","getConditionMenuSelectedItems","Parameterized","InJoin","editableParts","Removal","Addition","onButtonMouseEnter","onButtonMouseLeave","buttonsToShow","ConditionRenderer","appear","onGetMenu","_onGetMenu","onItemSelected","_onItemSelected","dropdown","DomDropDownElementBuilder","FacetType","isRoot","renderGroupRow","renderConditions","showRootRow","ConditionGroupRowRenderer","getConditionRenderer","buildGroupElements","getGroupTitle","groupTitle","eqconsts","getLinkTypeMenu","getConditionGroupMenu","alwaysShowButtonsInGroups","SimpleConditionRenderer","isEditMode","labelElement","renderLabelElement","renderEditor","showEditor","displayedText","getLabelText","getEmptyText","expression","valueEditor","onExpressionRendered","emptyTextValue","silent","ConditionPart","validateInput","success","showValidationError","isEmptyValue","BaseElementRenderer","inputBuilder","dontProcessBlur","validationResult","inputElement","closeEditor","MIN_WIDTH","inputValue","DataKind","validateListInput","validateScalarInput","parsedVal","Value","ExpressionRenderer","menuItemsList","showWhenReady","adjustNewValue","setContent","emptyTextList","getListName","fillMenuItemsList","renderMenuBlock","showLoader","hideLoader","getValuesAsArray","selLength","multiSelect","queryPanel","menuContainer","showIdsForListItems","onComplete","takeDefaultValue","itemLen","isDefault","isLoading","onClickTemp","_isDefaultValue","loaderElement","listName","listRequestHandler","getListRequestHandler","editorParams","extraParams","ListExpressionRenderer","CustomListExpressionRenderer","attrObj","attrFormat","Attribute","emptyTextAttribute","getMenu","getRootCondition","DropDownRenderer","operators","operId","related","defaultOperand","isRelatedToSubQuery","emptyTextOperator","Operator","setOperatorId","dtp","internalDateFormat","internalTimeFormat","pickerOptions","convertToInternalFormat","dateTimePickerResolver","isDateMacro","getDateMacroValue","isTimeMacro","getTimeMacroValue","convertFromInternalFormat","macroText","dialogBlockBody","renderColumnBlock","renderQueryPanelBlock","Query","subQuery","exprType","colEntitiesList","colEntitiesMenu","columnBlock","setResultAttributeId","parentEl","queryPanelBlock","qpId","getSubQuery","createColumn","sortIndex","Expression","parentPanel","createQuery","toJSONData","subOptions","entitiesListFilter","listItems","listOptions","subQueryPanelListOptions","QueryPanel","attrExpr","rootCondEl","minHeight","getServices","getDialogService","subQueryDialogWidth","tryValidate","checkExpressions","getParentQuery","attrDataType","All","activeCondition","entitiesPopupHandler","allowParameterization","allowInJoinConditions","showPoweredBy","activateRootOnStart","subQueryDialogHeight","dialogZIndex","numberListSeparators","autoEditNewCondition","onGetConditionRenderer","onGetExpressionRenderer","onGetOperatorRenderer","onOperatorRendered","onGetAddRowRenderer","defaultQuery","hideLangindSlot","conditionMenu","linkTypeMenu","rootGroupMenu","groupMenu","conds","autoEdit","condPart","newCondContainer","lastChild","dateFormatValue","dateFormatDisplay","createConditionMenus","createLinkTypeMenu","rootContainer","addrowRenderer","getAddRowRenderer","CondTag","ConditionGroupRenderer","operand","getOperand","EqEditorTag","EqValueEditor","AttributeExpressionRenderer","attributeMenu","SqlListExpressionRenderer","DateTimeExpressionRenderer","SubQueryExpressionRenderer","BindToParentColumnExpressionRenderer","InputExpressionRenderer","OperatorRenderer","AddRowRenderer","applyOnClose","showApplyButton","showClearButton","headerClickListener","headerClickHandler","qpElement","applyBtnClick","applyFilter","clearBtnClick","clearFilter","showQueryPanel","qpBlock","updateHeader","hideQueryPanel","headerTextElement","getConditionsText","isEmptyConditions","headerLinkElement","headerArrowBlock","headerArrowElement","textResize","headerIconElement","headerTextBlock","applyFilterCallback","clearConditions","resultContent","pageNavigatorPlaceholder","buttonClick","pageNum","fetchDataChunk","chunk","refreshWidgets","pageItemCssClass","HtmlContentWidget","useCustomLocaleSettings","resultTable","beforeTableRendering","applyDisplayFormats","hasCustomTotalsSettings","autoRefresh","gridOptions","addColumnClickHandler","columnMovedHandler","getAggregationSettings","getAggregatesCalculator","updateTotalsSettings","Grid","resultStatement","statementText","clickHandler","openDialog","columnsBar","ddQuery","dialogBody","renderColumnsBarBlock","addOrUpdateOperator","paramCount","appliedTypes","opIdx","dds","getDrillDowns","columnsBarSlot","ColumnsBar","queryPanelSlot","submitDialog","destroyDialog","addDrillDown","removeOperator","ChartType","defFormat","getExportFormats","ds","exportResult","dialogTitle","canDisplayFlag","downloadAllClickHandler","loadElasticChunk","contentDiv","displayMessageDiv","showSettingsDialog","renderDialogContent","submited","submitSettingsDialog","afterDialogOpened","fieldsContainer","renderFormFields","form","cont","tabNameInput","canDisplay","showErrorMessage","showUnableDisplayMessage","link","hideUnableDisplayMessage","getType","nextChunkStart","onResize","AggrFunc","FormFieldType","chartType","Pie","supportedChartTypes","potentialLabelColumns","potentialDataColumns","labelColumn","dataColumns","showOnPaging","hideSettings","legend","hasColumnsForChart","prepareChartData","getSupportedChartTypes","getOptions","getChartTypeName","ct","Area","Bar","Column","Combo","Doughnut","Polar","Radar","Histogram","Line","SteppedLine","updateSettings","updateColumns","showLegend","updateChartColumns","colNum","colType","colLabel","initChart","hasChartTypes","getCurrentChartType","mainDiv","canDraw","chartTypeSelector","sopt","ctkey","settingsDiv","chartDiv","initSettingsDiv","chartSettingsBtn","toggleSettings","drawChart","addContentDiv","delay","drawCore","settingsHeader","labelColumnSelectorCaption","labelColumnSelector","dataDiv","dataColumnSelectorCaption","dataColumnSelector","getPotentialLabelColumns","getPotentialDataColumns","getLabelColumnIndex","getDataColumnIndex","chartLabels","chartColumns","hasChartJs","Chart","ChartJsWidget","config","generateConfig","chartContext","getChartCanvas","canvases","borderColor","dataColors","datasetName","fillValue","dataset1","fill","stepped","steppedLine","displayLegend","getChartType","datasets","labels","ChartWidget","GoogleChartWidget","hasGoogleCharts","google","charts","googleDataView","visualization","DataView","convertToGoogleFormat","convertToGoogleType","convertToGoogleValue","googleTable","DataTable","addRows","setCell","chartOptions","chartArea","getChartAreaWidth","pieHole","createChart","draw","setColumns","ColumnChart","BarChart","ComboChart","AreaChart","LineChart","SteppedAreaChart","PieChart","chart","horizClass","getSettings","labelCol","dataCol","showLeg","ResultFacet","pivotTable","maxRowCount","defaultRenderer","rowEl","totalsRow","PivotTable","createAggrFuncSelectBuilder","aggrFunc","csb","aggrfunc","createColumnsSelectBuilder","allowedTypes","colName","formFieldType","getContextDataTable","firstNumericColIndex","optionIndex","ColumnField","RowField","CellData","totalsCol","colTypes","fieldTypes","colSelect","rowSelect","tmp","rowName","fieldName","validateSelectedField","aggrSelector","Count","Average","updatePivotData","dataSize","colIdx","rowIdx","fieldIdx","columnField","columnCol","columnRow","rowLabel","rowType","colValues","rowValues","colValue","rowValue","null_columns","colFieldFormatter","formatNumber","formatDate","new_rows","calcAggrFunc","totalByRow","Min","Max","total_row","totalByCol","Sum","average","MAX_SAFE_INTEGER","fieldValue","MIN_SAFE_INTEGER","reinitGrid","gridResolver","EasyGridWidget","addColumns","totals","DataGrid","facets","createFacetTab","ChartFacet","PivotTableFacet","DataTableFacet","activeFacetIndex","showExportButton","showRefreshButton","showMaximizeButton","maximize2Window","showProcessIndicator","facetTypes","menuItems","menuItemsFilter","facet","renderProcessBlock","loadFacets","reloadFacets","createAddMenu","validateAddFacetButton","renderActiveFacet","updateTotalRecords","addMenu","recordsDiv","exportDiv","_processBlock","tabsDiv","tabsUl","renderFacet","addFacetButton","addClickHandler","manageDiv","bdb","exportHandler","refreshHandler","maximizeButton","maximizeHandler","fetchData","ExportDialog","toWindow","facetTab","renderFacetTab","renderFacetSlot","settingsClickHandler","closeClickHandler","selectClickHandler","refreshFacetTabs","removeFacet","facetSlot","saveFacets","setActiveFacet","confirmed","createDefaultFacetIfNotExist","isActivate","innerData","fd","FacetContainer","enableExport","selectState","funcMap","onChanged","dropSelectState","dropState","setInitialState","changed","aggrs","state","grandTotals","recordCount","getAvailableColumns","renderCore","slotb","currentGroup","groupBlockColumns","selectedBlockColumns","groupCounter","getGroupForColumn","groupBlock","aggrBlock","removeAggrBtnClickHandler","selectedBlock","buttonsContainer","groupBtnClickHandler","aggrBtnClickHandler","countsCheckboxChangeHandler","grandCheckboxChangeHandler","removeGroupBtnClickHandler","validateCheckboxes","prevElement","prevInputEl","nextInputEl","selector","selectedCols","isValid","hasSelected","hasAggrs","hasTotals","hasCounts","getValidationMessage","hasRecCount","isTaken","colCheckboxChangeHandler","getGroupIndexForColumn","col1","col2","findIndex","g1","g2","btn","initQuery","enableAggregation","useAggregation","wasModified","AggrSettingsRenderer","enableAggrCheckBoxChangeHandler","closest","linkClickCallback","AggrSettingsDialog","getLinkText","groupArr","colNames","find","groupString","aggrArr","aggrString","mobClass","dialogLink","changeLocale","selectEl","locales","optionEl","displayLocaleName","nameSlot","asteriskSlot","tooltipSlot","queryName","isModified","domRoots","defaultViewOptions","disableConfirmationOnQueryChange","queryFileExtensions","clearResultOnQueryChange","showChart","widgets","resultGrid","handlers","viewOptions","resultOptions","resetContext","renderSpinner","EqContext","registerDialogServiceResolver","initStart","shadowRoots","initOptions","initWidgets","initDone","easyGrid","exportWidget","columnsPanel","entitiesPanel","resultPanel","filterBar","processBar","statementPanel","queryNameLabel","facetsPanel","resultCount","exportButton","aggregationBar","slots","resultCountSpan","exportButtons","epElement","resolveElement","entitiesPanelWidget","createEntitiesPanelWidget","addWidget","cpElement","columnsPanelWidget","createColumnsPanelWidget","cbElement","columnsBarWidget","createColumnsBarWidget","queryPanelWidget","createQueryPanelWidget","resultPanelSlot","resultGridWidget","gridPanel","createResultGridWidget","chartWidget","chartPanel","createChartWidget","qnElement","queryNameWidget","createQueryNameWidget","fbElement","filterBarWidget","createFilterBarWidget","sbElement","sortingBarWidget","createSortingBarWidget","pbElement","processWidget","createProcessWidget","stElement","statementPanelWidget","createStatementPanelWidget","clElement","widget","createLocaleWidget","fpElement","resultFacetPanelWidget","createResultFacetsPanel","ewElement","createExportWidget","resultCountSlot","aggrbElement","aggregationBarWidget","createAggregationBarWidget","elementOrId","resolveElementsByClassName","elemList","displayRecordsCount","setDialogService","executeQuery","clearResult","fetchEmptyQueries","showResultSpinner","elasticPaging","hideResultSpinner","toggleExportButtons","enableExportButtons","disableExportButtons","_spinnerDiv","slotElement","chartWidgetResolver","resultGridResolver","EntitiesPanel","ColumnsPanel","LocaleWidget","ProcessWidget","FilterBar","SortingBar","QueryNameWidget","StatementPanel","ResultFacetsPanel","ExportWidget","AggregationBar","detach","localeWidget","statementWidget","disabledClass","dropdownContainerClass","dropdownButtonClass","dropdownContentClass","dropdownShowClass","_querySaveTemplate","queryListMenu","fetchDataButtonClickHandler","fetchDataButtonClick","clearQueryButtonClickHandler","clearQueryButtonClick","newQueryButtonClickHandler","newQueryButtonClick","loadQueryButtonClickHandler","loadQueryButtonClick","saveQueryButtonClickHandler","saveQueryButtonClick","copyQueryButtonClickHandler","copyQueryButtonClick","removeQueryButtonClickHandler","removeQueryButtonClick","storageButtonClickHandler","storageDropButtonClick","saveQueryToFileButtonClickHandler","saveQueryToFileButtonClick","loadQueryFromFileButtonClickHandler","loadQueryFromFileButtonClick","exportButtonClickHandler","queryChangedHandler","eventData","syncQueryOnChange","syncQuery","fetchDataOnChange","outsideClickHandler","currentContent","dropdowns","openDropdown","refreshQueryList","queryListPanel","loadQueryList","checkIfQueryModified","loadQuery","exportClass","queryContentInputId","clearQueryButtonId","newQueryButtonId","loadQueryButtonId","saveQueryButtonId","copyQueryButtonId","removeQueryButtonId","storageButtonId","fetchDataButtonId","loadQueryFromFileButtonId","saveQueryToFileButtonId","queryListPanelId","queryContentInput","fetchDataButton","clearQueryButton","newQueryButton","loadQueryButton","saveQueryButton","copyQueryButton","removeQueryButton","storageButton","loadQueryFromFileButton","saveQueryToFileButton","elems","hideExportButtons","storageDropButton","loadQueryFromFileInput","loadQueryFromFileInputSelect","responseData","statement","clearQuery","createNewQuery","newQuery","queryId","saveQuery","saveCurrentQuery","copyQuery","isNewbie","showSaveQueryDialog","regenerateId","setName","showQueryChangedDialog","removeCurrentQuery","removeQuery","useStorage","showNewQueryDialog","newQueryName","showRemoveQueryDialog","showSaveQueryToFileDialog","renderSaveToFileDialogBody","fileNameInput","fileName","formatSelector","fieldsClass","getQueryFile","showLoadQueryFromFileDialog","file","files","FormData","append","uploadQueryFile","fillLoadQueryButtonMenu","queryList","View","widgetType","applyQueryFilter","EqHtmlGrid","DataFilterView","reports","reportCache","useReportCache","syncReportOnChange","_reportSaveTemplate","useStoredQueryOnFetch","clearReportButtonClickHandler","clearReportButtonClick","newReportButtonClickHandler","newReportButtonClick","loadReportButtonClickHandler","loadReportButtonClick","saveReportButtonClickHandler","saveReportButtonClick","removeReportButtonClickHandler","removeReportButtonClick","reloadReportDataButtonClickHandler","reloadReportDataButtonClick","location","reload","defaultReportId","changeType","isLiteUpdate","syncStarted","noSync","syncReport","renderReportList","reportId","clearReportButton","newReportButton","loadReportButton","saveReportButton","removeReportButton","reloadReportDataButton","exportButtonsContainer","reportListSlot","newReport","queryDesc","insertIntoReportList","getDescription","loadReport","reportToLoad","findReportById","reportLoaded","renderReportProps","reportContent","getReportContentFromCache","loadFromJson","validate","saveReportContentInCache","toJSON","setActiveReport","saveCurrentReportAs","setId","setDescription","removeCurrentReport","report","removeFromReportList","reportIndex","currentReport","lastUpdated","rlItems","renderReportPanels","renderReportItemInList","showExportButtons","reportName","rid","reportsContainer","noReportPanel","indexOfReportById","clearErrors","errorHandler","findReportCacheItem","AltMenuAttribute","AltMenuConstantExpression","ButtonClose","ButtonNext","ButtonPrev","MenuEnable","MenuParameterization","MenuJoinCond","CmdClear","CmdDelete","CmdToggleEnable","CmdToggleEnableCustom","CmdAddCondition","CmdAddCondGroup","ButtonSelectAll","ButtonDeselectAll","ButtonAddColumns","ButtonAddConditions","CmdClickToAddCondition","CmdDeleteRow","ErrIncorrectGroupTitleFormat","ErrNotNumber","ErrIncorrectInteger","ErrIncorrectNumberList","LinkTypeAll","LinkTypeAny","LinkTypeNone","LinkTypeNotAll","ConjAll","ConjAny","ConjNotAll","ConjNone","MsgApplySelection","MsgAs","MsgEmptyList","MsgEmptyListValue","MsgEmptyScalarValue","MsgSubQueryValue","MsgEmptyAttrValue","MsgEmptyOperator","MsgEmptyCustomSql","MsgCustomSql","MsgNoResult","MsgResultCount","MsgOf","ConditionGroupTitle","RootConditionGroupTitle","StrAddConditions","SubQueryDialogTitle","SubQueryColumnTitle","SubQueryEmptyColumn","SubQueryQueryPanelCaption","ButtonSorting","ButtonToAggr","ButtonToSimple","ButtonFormat","CmdAscending","CmdClickToAddColumn","CmdDeleteColumn","CmdDeleteSorting","CmdDescending","CmdGroupSort","CmdGroupFormat","CmdNotSorted","ColTypeAggrFunc","ColTypeCompound","ColTypeGroup","ColTypeSimple","HeaderExpression","HeaderSorting","HeaderTitle","SortHeaderColumn","SortHeaderSorting","StrAddColumns","CustomExpression","AddAllForEntityText","CmdMoveToStart","CmdMoveRight","CmdMoveLeft","CmdMoveToEnd","CmdMoveUp","CmdMoveDown","ButtonMenu","CmdToSimple","CmdMoveToFirst","CmdMoveToPrev","CmdMoveToNext","CmdMoveToLast","CmdHiddenColumn","RowButtonTitle","EntityToggle","StrNoFilterDefined","StrNoFilterClickToAdd","HintHours","HintMinutes","RemoveQueryTitle","RemoveQueryContent","NewQueryTitle","NewQueryContent","NewQueryDefName","SaveQueryTitle","SaveQueryContent","SaveQueryDefName","QueryChangedTitle","QueryChangedContent","UpdateQuerySelector","FileNameLabel","SaveQueryToFileDlgTitle","NewReportDefName","NewReportDlgTitle","SaveReportDlgTitle","SaveReportDlgLabel","ReportDescLabel","RemoveReportDlgTitle","RemoveReportContent","Facets","TotalRecordsLabel","AddMenuItems","Pivot","LoadDataDlgTitle","LoadDataDlgContent","RefreshBtnTitle","ExportBtnTitle","MaximizeBtnTitle","RestoreBtnTitle","RemoveFacetDlgTitle","RemoveFacetDlgContent","DefaultDlgTitle","DefaultFacetTitle","NewFacetTitle","TabNameLabel","ErrQueryChanged","ErrNotEnoughData","ErrTooMuchData","FacetTitle","DlgTitle","DataColumnSelectorLabel","LabelColumnSelectorLabel","ChartTypeSelectorLabel","ShowLegendLabel","SwapBtnTitle","ColumnFieldSelectorLabel","RowFieldSelectorLabel","CellDataSelectorLabel","TotalsRowLabel","TotalsColLabel","TotalGridLabel","TotalsDlgLabel","GrandTotalsLabel","TotalsDlgTitle","ExportDlgTitle","ExportDlgFmtLabel","AggrSettings","GroupBtn","UngroupBtn","AggrBtn","UnaggrBtn","GroupCountsLabel","AggrDialogTitle","EnableAggrLabel","SelectedError","NoGroupsOrAggrError","NoGroupsOrGrandError","NoAggrOrCountError","NoGroupsLabel","NoAggrsLabel","EmptySettingsLabel","EqServiceProvider","resolver","Element","msMatchesSelector","webkitMatchesSelector","predicate","thisArg"],"sourceRoot":""}
|