@easyquery/ui 7.2.3 → 7.2.4-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.
Files changed (215) hide show
  1. package/dist/assets/css/easyquery.css +5 -2
  2. package/dist/browser/eq.community.css.map +1 -1
  3. package/dist/browser/eq.community.js +32224 -33715
  4. package/dist/browser/eq.community.js.map +1 -1
  5. package/dist/browser/eq.community.min.js +1 -9
  6. package/dist/browser/eq.community.min.js.map +1 -1
  7. package/dist/browser/eq.core.css +22 -114
  8. package/dist/browser/eq.core.min.css +3 -10
  9. package/dist/browser/eq.view.css +1 -1
  10. package/dist/browser/eq.view.css.map +1 -1
  11. package/dist/browser/eq.view.min.css +1 -10
  12. package/dist/bundles/easyquery.ui.js +22951 -22870
  13. package/dist/bundles/easyquery.ui.js.map +1 -1
  14. package/dist/bundles/easyquery.ui.min.js +1 -1
  15. package/dist/bundles/easyquery.ui.min.js.map +1 -1
  16. package/dist/lib/dialog/aggr_settings_dialog.d.ts +12 -12
  17. package/dist/lib/dialog/aggr_settings_dialog.js +106 -106
  18. package/dist/lib/dialog/export_dialog.d.ts +7 -7
  19. package/dist/lib/dialog/export_dialog.js +63 -63
  20. package/dist/lib/extensions.d.ts +7 -7
  21. package/dist/lib/extensions.js +13 -13
  22. package/dist/lib/facets/chart_facet.d.ts +21 -21
  23. package/dist/lib/facets/chart_facet.js +240 -238
  24. package/dist/lib/facets/chart_facet.js.map +1 -1
  25. package/dist/lib/facets/datatable_facet.d.ts +15 -15
  26. package/dist/lib/facets/datatable_facet.js +71 -69
  27. package/dist/lib/facets/datatable_facet.js.map +1 -1
  28. package/dist/lib/facets/pivot_table_facet.d.ts +51 -51
  29. package/dist/lib/facets/pivot_table_facet.js +698 -696
  30. package/dist/lib/facets/pivot_table_facet.js.map +1 -1
  31. package/dist/lib/facets/result_facet.d.ts +40 -40
  32. package/dist/lib/facets/result_facet.js +246 -246
  33. package/dist/lib/facets/result_facet.js.map +1 -1
  34. package/dist/lib/i18n/text_resources.d.ts +1 -1
  35. package/dist/lib/i18n/text_resources.js +260 -259
  36. package/dist/lib/i18n/text_resources.js.map +1 -1
  37. package/dist/lib/public_api.d.ts +61 -61
  38. package/dist/lib/public_api.js +92 -90
  39. package/dist/lib/public_api.js.map +1 -1
  40. package/dist/lib/types/facet_type.d.ts +5 -5
  41. package/dist/lib/types/facet_type.js +6 -6
  42. package/dist/lib/types/qp_editable_part.d.ts +15 -15
  43. package/dist/lib/types/qp_editable_part.js +16 -16
  44. package/dist/lib/utils/browser_utils.d.ts +8 -8
  45. package/dist/lib/utils/browser_utils.js +58 -58
  46. package/dist/lib/utils/display_format_parser.d.ts +11 -11
  47. package/dist/lib/utils/display_format_parser.js +61 -61
  48. package/dist/lib/utils/dropdown.d.ts +11 -11
  49. package/dist/lib/utils/dropdown.js +57 -55
  50. package/dist/lib/utils/dropdown.js.map +1 -1
  51. package/dist/lib/utils/popup_menu.d.ts +163 -163
  52. package/dist/lib/utils/popup_menu.js +1259 -1260
  53. package/dist/lib/utils/popup_menu.js.map +1 -1
  54. package/dist/lib/utils/utils.d.ts +9 -9
  55. package/dist/lib/utils/utils.js +46 -46
  56. package/dist/lib/utils/utils.js.map +1 -1
  57. package/dist/lib/views/adv_search_view.d.ts +95 -95
  58. package/dist/lib/views/adv_search_view.js +712 -710
  59. package/dist/lib/views/adv_search_view.js.map +1 -1
  60. package/dist/lib/views/data_filter_view.d.ts +17 -17
  61. package/dist/lib/views/data_filter_view.js +79 -77
  62. package/dist/lib/views/data_filter_view.js.map +1 -1
  63. package/dist/lib/views/html_data_filter_view.d.ts +19 -19
  64. package/dist/lib/views/html_data_filter_view.js +44 -42
  65. package/dist/lib/views/html_data_filter_view.js.map +1 -1
  66. package/dist/lib/views/report_view.d.ts +173 -173
  67. package/dist/lib/views/report_view.js +733 -731
  68. package/dist/lib/views/report_view.js.map +1 -1
  69. package/dist/lib/views/view.d.ts +149 -149
  70. package/dist/lib/views/view.js +538 -538
  71. package/dist/lib/views/view.js.map +1 -1
  72. package/dist/lib/views/view_options.d.ts +113 -113
  73. package/dist/lib/views/view_options.js +1 -0
  74. package/dist/lib/widgets/aggregation_bar.d.ts +30 -30
  75. package/dist/lib/widgets/aggregation_bar.js +145 -143
  76. package/dist/lib/widgets/aggregation_bar.js.map +1 -1
  77. package/dist/lib/widgets/charts/chart_type.d.ts +14 -14
  78. package/dist/lib/widgets/charts/chart_type.js +15 -15
  79. package/dist/lib/widgets/charts/chart_widget.d.ts +92 -92
  80. package/dist/lib/widgets/charts/chart_widget.js +384 -382
  81. package/dist/lib/widgets/charts/chart_widget.js.map +1 -1
  82. package/dist/lib/widgets/charts/chart_widget_chartjs.d.ts +23 -23
  83. package/dist/lib/widgets/charts/chart_widget_chartjs.js +186 -184
  84. package/dist/lib/widgets/charts/chart_widget_chartjs.js.map +1 -1
  85. package/dist/lib/widgets/charts/chart_widget_google.d.ts +23 -23
  86. package/dist/lib/widgets/charts/chart_widget_google.js +165 -163
  87. package/dist/lib/widgets/charts/chart_widget_google.js.map +1 -1
  88. package/dist/lib/widgets/columns_bar.d.ts +64 -64
  89. package/dist/lib/widgets/columns_bar.js +722 -721
  90. package/dist/lib/widgets/columns_bar.js.map +1 -1
  91. package/dist/lib/widgets/columns_panel.d.ts +64 -62
  92. package/dist/lib/widgets/columns_panel.js +740 -721
  93. package/dist/lib/widgets/columns_panel.js.map +1 -1
  94. package/dist/lib/widgets/easy_grid_widget.d.ts +38 -38
  95. package/dist/lib/widgets/easy_grid_widget.js +229 -227
  96. package/dist/lib/widgets/easy_grid_widget.js.map +1 -1
  97. package/dist/lib/widgets/entities_panel.d.ts +49 -49
  98. package/dist/lib/widgets/entities_panel.js +627 -625
  99. package/dist/lib/widgets/entities_panel.js.map +1 -1
  100. package/dist/lib/widgets/eq_result_html_grid.d.ts +32 -32
  101. package/dist/lib/widgets/eq_result_html_grid.js +185 -183
  102. package/dist/lib/widgets/eq_result_html_grid.js.map +1 -1
  103. package/dist/lib/widgets/export_widget.d.ts +10 -10
  104. package/dist/lib/widgets/export_widget.js +57 -55
  105. package/dist/lib/widgets/export_widget.js.map +1 -1
  106. package/dist/lib/widgets/facet_container.d.ts +12 -12
  107. package/dist/lib/widgets/facet_container.js +53 -51
  108. package/dist/lib/widgets/facet_container.js.map +1 -1
  109. package/dist/lib/widgets/filter_bar.d.ts +38 -38
  110. package/dist/lib/widgets/filter_bar.js +259 -257
  111. package/dist/lib/widgets/filter_bar.js.map +1 -1
  112. package/dist/lib/widgets/grid.d.ts +35 -35
  113. package/dist/lib/widgets/grid.js +79 -77
  114. package/dist/lib/widgets/grid.js.map +1 -1
  115. package/dist/lib/widgets/html_content_widget.d.ts +35 -35
  116. package/dist/lib/widgets/html_content_widget.js +71 -69
  117. package/dist/lib/widgets/html_content_widget.js.map +1 -1
  118. package/dist/lib/widgets/locale_widget.d.ts +16 -16
  119. package/dist/lib/widgets/locale_widget.js +79 -77
  120. package/dist/lib/widgets/locale_widget.js.map +1 -1
  121. package/dist/lib/widgets/manage_drilldown_widget.d.ts +18 -18
  122. package/dist/lib/widgets/manage_drilldown_widget.js +154 -152
  123. package/dist/lib/widgets/manage_drilldown_widget.js.map +1 -1
  124. package/dist/lib/widgets/process_widget.d.ts +21 -21
  125. package/dist/lib/widgets/process_widget.js +50 -48
  126. package/dist/lib/widgets/process_widget.js.map +1 -1
  127. package/dist/lib/widgets/query_panel.d.ts +62 -58
  128. package/dist/lib/widgets/query_panel.js +675 -653
  129. package/dist/lib/widgets/query_panel.js.map +1 -1
  130. package/dist/lib/widgets/queryname_widget.d.ts +27 -27
  131. package/dist/lib/widgets/queryname_widget.js +109 -107
  132. package/dist/lib/widgets/queryname_widget.js.map +1 -1
  133. package/dist/lib/widgets/renderers/aggr_settings/aggr_settings_renderer.d.ts +54 -54
  134. package/dist/lib/widgets/renderers/aggr_settings/aggr_settings_renderer.js +429 -429
  135. package/dist/lib/widgets/renderers/aggr_settings/aggr_settings_renderer.js.map +1 -1
  136. package/dist/lib/widgets/renderers/base_element_renderer.d.ts +15 -15
  137. package/dist/lib/widgets/renderers/base_element_renderer.js +63 -63
  138. package/dist/lib/widgets/renderers/columnsbar/aggrfunc_column_renderer.d.ts +11 -11
  139. package/dist/lib/widgets/renderers/columnsbar/aggrfunc_column_renderer.js +62 -60
  140. package/dist/lib/widgets/renderers/columnsbar/aggrfunc_column_renderer.js.map +1 -1
  141. package/dist/lib/widgets/renderers/columnsbar/column_renderer_cb.d.ts +53 -53
  142. package/dist/lib/widgets/renderers/columnsbar/column_renderer_cb.js +550 -550
  143. package/dist/lib/widgets/renderers/columnsbar/column_renderer_cb.js.map +1 -1
  144. package/dist/lib/widgets/renderers/columnsbar/simple_column_renderer.d.ts +9 -9
  145. package/dist/lib/widgets/renderers/columnsbar/simple_column_renderer.js +79 -77
  146. package/dist/lib/widgets/renderers/columnsbar/simple_column_renderer.js.map +1 -1
  147. package/dist/lib/widgets/renderers/columnspanel/aggrfunc_column_renderer.d.ts +17 -17
  148. package/dist/lib/widgets/renderers/columnspanel/aggrfunc_column_renderer.js +180 -178
  149. package/dist/lib/widgets/renderers/columnspanel/aggrfunc_column_renderer.js.map +1 -1
  150. package/dist/lib/widgets/renderers/columnspanel/column_renderer_cp.d.ts +74 -72
  151. package/dist/lib/widgets/renderers/columnspanel/column_renderer_cp.js +829 -817
  152. package/dist/lib/widgets/renderers/columnspanel/column_renderer_cp.js.map +1 -1
  153. package/dist/lib/widgets/renderers/columnspanel/customsql_column_renderer.d.ts +21 -18
  154. package/dist/lib/widgets/renderers/columnspanel/customsql_column_renderer.js +238 -214
  155. package/dist/lib/widgets/renderers/columnspanel/customsql_column_renderer.js.map +1 -1
  156. package/dist/lib/widgets/renderers/columnspanel/simple_column_renderer.d.ts +13 -13
  157. package/dist/lib/widgets/renderers/columnspanel/simple_column_renderer.js +180 -178
  158. package/dist/lib/widgets/renderers/columnspanel/simple_column_renderer.js.map +1 -1
  159. package/dist/lib/widgets/renderers/dropdown_renderer.d.ts +9 -9
  160. package/dist/lib/widgets/renderers/dropdown_renderer.js +42 -40
  161. package/dist/lib/widgets/renderers/dropdown_renderer.js.map +1 -1
  162. package/dist/lib/widgets/renderers/querypanel/addrow_renderer.d.ts +16 -16
  163. package/dist/lib/widgets/renderers/querypanel/addrow_renderer.js +87 -85
  164. package/dist/lib/widgets/renderers/querypanel/addrow_renderer.js.map +1 -1
  165. package/dist/lib/widgets/renderers/querypanel/attribute_expression_renderer.d.ts +14 -14
  166. package/dist/lib/widgets/renderers/querypanel/attribute_expression_renderer.js +71 -69
  167. package/dist/lib/widgets/renderers/querypanel/attribute_expression_renderer.js.map +1 -1
  168. package/dist/lib/widgets/renderers/querypanel/bind_to_parent_column_expression_renderer.d.ts +7 -7
  169. package/dist/lib/widgets/renderers/querypanel/bind_to_parent_column_expression_renderer.js +41 -39
  170. package/dist/lib/widgets/renderers/querypanel/bind_to_parent_column_expression_renderer.js.map +1 -1
  171. package/dist/lib/widgets/renderers/querypanel/condition_group_renderer.d.ts +27 -27
  172. package/dist/lib/widgets/renderers/querypanel/condition_group_renderer.js +231 -229
  173. package/dist/lib/widgets/renderers/querypanel/condition_group_renderer.js.map +1 -1
  174. package/dist/lib/widgets/renderers/querypanel/condition_renderer.d.ts +48 -48
  175. package/dist/lib/widgets/renderers/querypanel/condition_renderer.js +509 -507
  176. package/dist/lib/widgets/renderers/querypanel/condition_renderer.js.map +1 -1
  177. package/dist/lib/widgets/renderers/querypanel/datetime_expression_render.d.ts +13 -13
  178. package/dist/lib/widgets/renderers/querypanel/datetime_expression_render.js +108 -106
  179. package/dist/lib/widgets/renderers/querypanel/datetime_expression_render.js.map +1 -1
  180. package/dist/lib/widgets/renderers/querypanel/expression_renderer.d.ts +28 -28
  181. package/dist/lib/widgets/renderers/querypanel/expression_renderer.js +91 -89
  182. package/dist/lib/widgets/renderers/querypanel/expression_renderer.js.map +1 -1
  183. package/dist/lib/widgets/renderers/querypanel/input_expression_renderer.d.ts +14 -14
  184. package/dist/lib/widgets/renderers/querypanel/input_expression_renderer.js +165 -163
  185. package/dist/lib/widgets/renderers/querypanel/input_expression_renderer.js.map +1 -1
  186. package/dist/lib/widgets/renderers/querypanel/list_expression_renderer.d.ts +35 -35
  187. package/dist/lib/widgets/renderers/querypanel/list_expression_renderer.js +317 -315
  188. package/dist/lib/widgets/renderers/querypanel/list_expression_renderer.js.map +1 -1
  189. package/dist/lib/widgets/renderers/querypanel/operator_renderer.d.ts +19 -19
  190. package/dist/lib/widgets/renderers/querypanel/operator_renderer.js +95 -93
  191. package/dist/lib/widgets/renderers/querypanel/operator_renderer.js.map +1 -1
  192. package/dist/lib/widgets/renderers/querypanel/subquery_expression_renderer.d.ts +27 -27
  193. package/dist/lib/widgets/renderers/querypanel/subquery_expression_renderer.js +237 -235
  194. package/dist/lib/widgets/renderers/querypanel/subquery_expression_renderer.js.map +1 -1
  195. package/dist/lib/widgets/renderers/querypanel/text_renderer.d.ts +11 -11
  196. package/dist/lib/widgets/renderers/querypanel/text_renderer.js +36 -36
  197. package/dist/lib/widgets/renderers/querypanel/text_renderer.js.map +1 -1
  198. package/dist/lib/widgets/renderers/sortingbar/column_renderer_sp.d.ts +26 -26
  199. package/dist/lib/widgets/renderers/sortingbar/column_renderer_sp.js +163 -163
  200. package/dist/lib/widgets/renderers/sortingbar/column_renderer_sp.js.map +1 -1
  201. package/dist/lib/widgets/result_facets_panel.d.ts +64 -64
  202. package/dist/lib/widgets/result_facets_panel.js +503 -501
  203. package/dist/lib/widgets/result_facets_panel.js.map +1 -1
  204. package/dist/lib/widgets/sorting_bar.d.ts +32 -34
  205. package/dist/lib/widgets/sorting_bar.js +245 -328
  206. package/dist/lib/widgets/sorting_bar.js.map +1 -1
  207. package/dist/lib/widgets/statement_panel.d.ts +21 -21
  208. package/dist/lib/widgets/statement_panel.js +60 -58
  209. package/dist/lib/widgets/statement_panel.js.map +1 -1
  210. package/dist/lib/widgets/widget_options.d.ts +433 -429
  211. package/dist/lib/widgets/widget_options.js +1 -0
  212. package/package.json +25 -25
  213. package/webpack.config.js +31 -24
  214. package/dist/browser/eq.community.min.css.map +0 -1
  215. package/dist/browser/eq.view.min.css.map +0 -1
@@ -1,1261 +1,1260 @@
1
- import { i18n } from '@easydata/core';
2
- import { utils as dataUtils } from '@easydata/core';
3
- import { domel } from '@easydata/ui';
4
- import { getElementAbsolutePos, getScrollPos, getWinSize, getViewportSize } from '@easydata/ui';
5
- import { browserUtils } from './browser_utils';
6
- import { findHighestZIndex } from './utils';
7
- var MenuLevel = /** @class */ (function () {
8
- function MenuLevel(options) {
9
- this.isFilteringMode = false;
10
- this.showSelected = false;
11
- //menu, items, levelIndex
12
- this.parentMenu = options.menu || null;
13
- this.parentLevel = options.parent || null;
14
- this.parentElement = options.container || document.body;
15
- this.levelIndex = options.levelIndex || 0;
16
- this.levelDiv = null;
17
- this.domWriteItemsId = options.domWriteItemsId || false;
18
- this.menuId = options.menuId || '';
19
- this.itemRenderedCallback = options.itemRenderedCallback || null;
20
- //we need to define special "apply" item for this level
21
- this._applyItem = { id: null, text: null, itemDiv: null };
22
- this.items = options.items || [];
23
- this.activeItem = null;
24
- this.selectedItem = null;
25
- this.initialized = false;
26
- this.showSelected = options.showSelected;
27
- this.updated = 0;
28
- this.renderContent();
29
- }
30
- Object.defineProperty(MenuLevel.prototype, "applyItem", {
31
- get: function () {
32
- return this._applyItem;
33
- },
34
- enumerable: true,
35
- configurable: true
36
- });
37
- Object.defineProperty(MenuLevel.prototype, "cssPrefix", {
38
- get: function () {
39
- return 'eqjs-menu';
40
- },
41
- enumerable: true,
42
- configurable: true
43
- });
44
- MenuLevel.prototype.getItems = function () {
45
- return this.items;
46
- };
47
- MenuLevel.prototype.setItems = function (items) {
48
- this.items = items;
49
- };
50
- MenuLevel.prototype.renderContent = function () {
51
- var _this = this;
52
- if (!this.items) {
53
- return;
54
- }
55
- var self = this;
56
- //define internal variables used in this function
57
- var itemBgColor = this.parentMenu.style.colors.bgON || "white";
58
- var itemFgColor = this.parentMenu.style.colors.fgON || "black";
59
- var itemOverBgColor = this.parentMenu.style.colors.bgOVER || "LightSteelBlue";
60
- var itemFontFamily = this.parentMenu.style.itemStyle.fontFamily || "";
61
- var itemFontSize = this.parentMenu.style.itemStyle.fontSize || "14px";
62
- var multiselect = this.parentMenu.options.multiselect;
63
- var isSubQuery = this.parentMenu.options.isSubQuery;
64
- //add base DIV element which is also used to show the shadow
65
- var baseDivBuilder = domel('div')
66
- .addClass(browserUtils.getMobileCssClass());
67
- if (this.parentMenu.options.useDefaultStyles) {
68
- baseDivBuilder
69
- .setStyle('backgroundColor', itemBgColor)
70
- .setStyle('border', '1px solid')
71
- .setStyle('borderColor', itemBgColor)
72
- .setStyle('backgroundColor', this.parentMenu.style.colors.border)
73
- .setStyle('margin', '-2px 2px 2px -2px')
74
- .setStyle('width', 'auto')
75
- .setStyle('height', 'auto');
76
- }
77
- baseDivBuilder
78
- .setStyle('z-index', this.parentMenu.zIndex)
79
- .setStyle('position', 'absolute')
80
- .setStyle('display', 'none');
81
- var baseDiv = baseDivBuilder.toDOM();
82
- baseDiv['menuLevel'] = this;
83
- var applyItem = this._applyItem;
84
- //if multiselect option is on - then we should add special "apply" item
85
- if (multiselect && this.levelIndex === 0 && this.parentMenu.options.hideButtons !== true) {
86
- var applyDiv = document.createElement("div");
87
- applyDiv.classList.add(this.cssPrefix + "-applyDiv");
88
- applyDiv['menuItem'] = applyItem;
89
- this.applyBtn = document.createElement('button');
90
- if (this.parentMenu.options.useDefaultStyles) {
91
- applyDiv.style.borderBottom = '1px solid';
92
- applyDiv.style.padding = '5px';
93
- applyDiv.style.marginBottom = '5px';
94
- this.applyBtn.style.padding = '0 5px';
95
- this.applyBtn.style.cursor = "pointer";
96
- }
97
- var applyTextNode = document.createTextNode(this.parentMenu.options.buttons.submit);
98
- this.applyBtn.appendChild(applyTextNode);
99
- applyDiv.appendChild(this.applyBtn);
100
- //cancel btn
101
- var cancelBtn = document.createElement('button');
102
- cancelBtn.classList.add(this.cssPrefix + "-cancel");
103
- if (this.parentMenu.options.useDefaultStyles) {
104
- cancelBtn.style.padding = '0 5px';
105
- cancelBtn.style.cursor = 'pointer';
106
- cancelBtn.style.marginLeft = '15px';
107
- }
108
- var cancelText = document.createTextNode(this.parentMenu.options.buttons.cancel);
109
- cancelBtn.appendChild(cancelText);
110
- applyDiv.appendChild(cancelBtn);
111
- baseDiv.appendChild(applyDiv);
112
- applyItem.itemDiv = applyDiv;
113
- this.applyBtn.addEventListener('click', function () {
114
- _this.submit(_this._applyItem);
115
- });
116
- cancelBtn.addEventListener('click', function () {
117
- _this.parentMenu.hideMenu();
118
- });
119
- }
120
- // if too many items - then we add a special "search" item
121
- // or there is an options to show always
122
- if (this.parentLevel == null
123
- && (this.parentMenu.options.searchBoxAlwaysShown || this.items.length >= this.parentMenu.options.showSearchBoxAfter)) {
124
- var searchDivBuilder = domel('div')
125
- .addClass(this.cssPrefix + "-searchDiv");
126
- if (this.parentMenu.options.useDefaultStyles) {
127
- searchDivBuilder
128
- .setStyle('border-bottom', '1px solid #666')
129
- .setStyle('background-color', itemBgColor)
130
- .setStyle('border-color', this.parentMenu.style.colors.border);
131
- if (itemFontFamily != "") {
132
- searchDivBuilder.setStyle('font-family', itemFontFamily);
133
- }
134
- searchDivBuilder
135
- .setStyle('font-size', itemFontSize)
136
- .setStyle('color', itemFgColor)
137
- .setStyle('cursor', 'pointer')
138
- .setStyle('text-align', 'left')
139
- .setStyle('padding', '5px');
140
- }
141
- var searchEditBoxBuilder = domel('input')
142
- .id('searchBox')
143
- .name('searchBox')
144
- .type('text')
145
- .size(16)
146
- .addClass(this.cssPrefix + "-searchBox")
147
- .on('input', function (ev) {
148
- _this.deactivateItem(_this.activeItem);
149
- _this.renderItems(_this.searchBox.value);
150
- })
151
- .on('keydown', function (ev) {
152
- var keyCode = ev.keyCode;
153
- switch (keyCode) {
154
- case 13: //enter
155
- if (_this.activeItem) {
156
- _this.activeItem.itemDiv.click();
157
- }
158
- break;
159
- case 38: // up
160
- _this.moveActiveItemUp();
161
- break;
162
- case 40: // down
163
- _this.moveActiveItemDown();
164
- break;
165
- case 39: // right
166
- if (!_this.searchBox.value) {
167
- _this.openSubLevel(_this.activeItem);
168
- }
169
- break;
170
- }
171
- });
172
- if (this.parentMenu.options.useDefaultStyles) {
173
- searchEditBoxBuilder
174
- .setStyle('font-family', 'monospace')
175
- .setStyle('font-size', '8pt')
176
- .setStyle('width', '100%');
177
- }
178
- if (isSubQuery) {
179
- searchEditBoxBuilder.addClass('eqjs-dialog');
180
- }
181
- this.searchBox = searchEditBoxBuilder.toDOM();
182
- this.searchDiv = searchDivBuilder.toDOM();
183
- this.searchDiv.appendChild(this.searchBox);
184
- baseDiv.appendChild(this.searchDiv);
185
- }
186
- var scrollDiv = document.createElement("div");
187
- scrollDiv.tabIndex = 1;
188
- domel(scrollDiv)
189
- .addClass(this.cssPrefix + "-scrollDiv")
190
- .addClass(browserUtils.getMobileCssClass());
191
- scrollDiv.style.overflowX = "hidden";
192
- scrollDiv.style.overflowY = "auto";
193
- scrollDiv.style.position = "relative";
194
- baseDiv.appendChild(scrollDiv);
195
- this.levelDiv = baseDiv;
196
- this.scrollDiv = scrollDiv;
197
- if (this.menuId) {
198
- this.levelDiv.id = this.menuId;
199
- }
200
- if (this.parentLevel) {
201
- this.levelDiv.style.zIndex
202
- = this.parentLevel.levelDiv.style.zIndex;
203
- }
204
- this.renderItems();
205
- var scrollDivKeyDownHandler = function (event) {
206
- switch (event.which) {
207
- case 13: // enter
208
- if (_this.parentMenu.options.multiselect) {
209
- _this.parentMenu.getRootLevel().applyBtn.click();
210
- }
211
- else {
212
- if (_this.activeItem) {
213
- _this.activeItem.itemDiv.click();
214
- }
215
- }
216
- break;
217
- case 32: // space
218
- if (_this.activeItem) {
219
- _this.activeItem.itemDiv.click();
220
- }
221
- break;
222
- case 37: // left
223
- if (_this.parentLevel && !_this.isFilteringMode) {
224
- _this.deactivateItem(_this.activeItem);
225
- _this.parentLevel.focus();
226
- }
227
- break;
228
- case 39: // right
229
- _this.openSubLevel(_this.activeItem);
230
- break;
231
- case 38: // up
232
- _this.moveActiveItemUp();
233
- break;
234
- case 40: // down
235
- _this.moveActiveItemDown();
236
- break;
237
- default: return; // exit this handler for other keys
238
- }
239
- event.preventDefault(); // prevent the default action (scroll / move caret)
240
- };
241
- scrollDiv.addEventListener("keydown", scrollDivKeyDownHandler);
242
- if (browserUtils.isMobileMode()) {
243
- this.closeDiv =
244
- domel('div', baseDiv)
245
- .addClass('eqjs-menu-close-btn')
246
- .addText(i18n.getText('ButtonClose'))
247
- .on('click', function () {
248
- _this.parentMenu.hideMenu();
249
- })
250
- .toDOM();
251
- }
252
- };
253
- MenuLevel.prototype.moveActiveItemDown = function () {
254
- var items = this.isFilteringMode ? this.filteredItems : this.items;
255
- if (this.activeItem) {
256
- var idx = items.indexOf(this.activeItem);
257
- if (idx < items.length - 1) {
258
- this.activateItem(items[idx + 1], false);
259
- }
260
- }
261
- else {
262
- this.activateItem(items[0], false);
263
- }
264
- };
265
- MenuLevel.prototype.moveActiveItemUp = function () {
266
- var items = this.isFilteringMode ? this.filteredItems : this.items;
267
- if (this.activeItem) {
268
- var idx = items.indexOf(this.activeItem);
269
- if (idx > 0) {
270
- this.activateItem(items[idx - 1], false);
271
- }
272
- }
273
- else {
274
- this.activateItem(items[items.length - 1], false);
275
- }
276
- };
277
- MenuLevel.prototype.openSubLevel = function (menuItem) {
278
- if (menuItem && menuItem.items && !this.isFilteringMode) {
279
- this.showSubLevel(menuItem);
280
- menuItem.subLevel.activateItem(menuItem.subLevel.items[0]);
281
- }
282
- };
283
- MenuLevel.prototype.focusScrollDiv = function () {
284
- this.scrollDiv.focus();
285
- };
286
- MenuLevel.prototype.turnCheckboxes = function (items) {
287
- //turn checkboxes on for selected items
288
- for (var i = 0; i < items.length; i++) {
289
- var item = items[i];
290
- if (item.itemCheckbox)
291
- item.itemCheckbox.checked = this.isItemSelected(item);
292
- if (item.items) {
293
- this.turnCheckboxes(item.items);
294
- }
295
- }
296
- };
297
- MenuLevel.prototype.isItemSelected = function (item) {
298
- if (item.items) {
299
- for (var i = 0; i < item.items.length; i++) {
300
- if (this.isItemSelected(item.items[i])) {
301
- return true;
302
- }
303
- }
304
- return false;
305
- }
306
- else {
307
- return item.selected;
308
- }
309
- };
310
- MenuLevel.prototype.setItemSelected = function (item, value) {
311
- if (item.items) {
312
- for (var i = 0; i < item.items.length; i++) {
313
- this.setItemSelected(item.items[i], value);
314
- }
315
- }
316
- else {
317
- item.selected = value;
318
- }
319
- };
320
- MenuLevel.prototype.submitItems = function (items, selectedItems) {
321
- for (var j = 0; j < items.length; j++) {
322
- if (items[j].items) {
323
- this.submitItems(items[j].items, selectedItems);
324
- }
325
- else {
326
- if (items[j].selected) {
327
- selectedItems.push(items[j]);
328
- }
329
- }
330
- }
331
- };
332
- MenuLevel.prototype.allSubitemsAreFiltered = function (items, filterCallback) {
333
- for (var i = 0; i < items.length; i++) {
334
- if (filterCallback(items[i]))
335
- return false;
336
- }
337
- return true;
338
- };
339
- MenuLevel.prototype.isItemDiv = function (element) {
340
- return element['menuItem'] ? true : false;
341
- };
342
- MenuLevel.prototype.isLevelDiv = function (element) {
343
- return element['menuLevel'] ? true : false;
344
- };
345
- MenuLevel.prototype.getMenuItem = function (element) {
346
- var el = element;
347
- while (!this.isItemDiv(el)) {
348
- if (this.isLevelDiv(el)) {
349
- throw "Can't get menu item";
350
- }
351
- el = el.parentElement;
352
- }
353
- return el['menuItem'];
354
- };
355
- MenuLevel.prototype.renderItemsWithoutFilter = function () {
356
- var _this = this;
357
- this.isFilteringMode = false;
358
- var scrollDiv = this.scrollDiv;
359
- var multiselect = this.parentMenu.options.multiselect;
360
- var activateOnMouseOver = this.parentMenu.options.activateOnMouseOver;
361
- var itemFgColor = this.parentMenu.style.colors.fgON || 'black';
362
- var itemOverBgColor = this.parentMenu.style.colors.bgOVER || 'LightSteelBlue';
363
- var itemFontSize = this.parentMenu.style.itemStyle.fontSize || '14px';
364
- var itemFilterCallback = this.parentMenu.getItemFilterCallback();
365
- scrollDiv.innerHTML = "";
366
- for (var i = 0; i < this.items.length; i++) {
367
- var item = this.items[i];
368
- if (!item || !item.text)
369
- continue;
370
- if (itemFilterCallback) {
371
- if (!itemFilterCallback(item))
372
- continue;
373
- if (item.items && this.allSubitemsAreFiltered(item.items, itemFilterCallback))
374
- continue;
375
- }
376
- item.data = function (propName) {
377
- return _this[propName];
378
- };
379
- if (typeof (item.selected) == "undefined") {
380
- item.selected = false;
381
- }
382
- if (item.selected && this.selectedItem == null) {
383
- this.selectedItem = item;
384
- }
385
- var itemDiv = document.createElement("div");
386
- domel(itemDiv)
387
- .addClass(this.cssPrefix + "-itemDiv")
388
- .addClass(browserUtils.getMobileCssClass());
389
- if (item.selected && this.showSelected && !multiselect) {
390
- itemDiv.classList.add(this.cssPrefix + "-selected");
391
- }
392
- ;
393
- if (this.domWriteItemsId && this.menuId) {
394
- itemDiv.id = 'item-' + this.menuId + '-' + item.id;
395
- }
396
- scrollDiv.appendChild(itemDiv);
397
- itemDiv['menuItem'] = item;
398
- itemDiv['menuLevel'] = this;
399
- item.itemDiv = itemDiv;
400
- if (this.parentMenu.options.useDefaultStyles) {
401
- itemDiv.style.fontSize = itemFontSize;
402
- itemDiv.style.color = itemFgColor;
403
- itemDiv.style.paddingLeft = "15px";
404
- itemDiv.style.paddingRight = "6px";
405
- itemDiv.style.cursor = "pointer";
406
- }
407
- if (item.text == '---') {
408
- itemDiv.appendChild(document.createElement('hr'));
409
- }
410
- else {
411
- if (multiselect) {
412
- var cb = document.createElement("input");
413
- cb.type = "checkbox";
414
- cb.id = "cb" + item.id;
415
- cb.checked = this.isItemSelected(item);
416
- cb.defaultChecked = this.isItemSelected(item);
417
- itemDiv.appendChild(cb);
418
- item.itemCheckbox = cb;
419
- if (this.parentMenu.options.useDefaultStyles) {
420
- cb.style.margin = "4px 10px 0 0";
421
- cb.style.verticalAlign = "top";
422
- }
423
- }
424
- var itemText = item.text;
425
- if (this.parentMenu.options.showItemIds) {
426
- itemText = item.id + ':' + itemText;
427
- }
428
- var itemTextNode = document.createTextNode(itemText);
429
- itemDiv.appendChild(itemTextNode);
430
- if (item.items && item.items.length > 0) {
431
- itemDiv.classList.add(this.cssPrefix + "-itemDiv-hasChildren");
432
- var arrowSpan = document.createElement('span');
433
- arrowSpan.classList.add(this.cssPrefix + "-itemDiv-arrow");
434
- itemDiv.appendChild(arrowSpan);
435
- var arrowText = document.createTextNode('>');
436
- arrowSpan.appendChild(arrowText);
437
- }
438
- var itemClickHandler = function (ev) {
439
- var menuItem = _this.getMenuItem(ev.target);
440
- if (multiselect) {
441
- if (!menuItem.items || ev.target == menuItem.itemCheckbox) {
442
- var itemSelected = _this.isItemSelected(menuItem);
443
- _this.setItemSelected(menuItem, !itemSelected);
444
- menuItem.itemCheckbox.checked = !itemSelected;
445
- _this.parentMenu.refreshCheckboxes();
446
- }
447
- else {
448
- _this.activateItem(menuItem);
449
- }
450
- }
451
- else {
452
- _this.activateItem(menuItem);
453
- _this.submit(menuItem);
454
- }
455
- return false;
456
- };
457
- itemDiv.removeEventListener("click", itemClickHandler);
458
- itemDiv.addEventListener('click', itemClickHandler);
459
- itemDiv.addEventListener('mouseenter', function (ev) {
460
- var item = _this.getMenuItem(ev.target);
461
- _this.parentMenu.isCursorInside = true;
462
- if (activateOnMouseOver) {
463
- _this.activateItem(item);
464
- }
465
- });
466
- itemDiv.addEventListener('mouseleave', function (ev) {
467
- var item = _this.getMenuItem(ev.target);
468
- _this.parentMenu.isCursorInside = false;
469
- setTimeout(function () {
470
- if (!_this.parentMenu.isCursorInside) {
471
- if (activateOnMouseOver && item == _this.activeItem && !item.subLevel) {
472
- _this.deactivateItem(item);
473
- }
474
- }
475
- }, 200);
476
- });
477
- }
478
- if (this.itemRenderedCallback) {
479
- this.itemRenderedCallback(this.menuId, itemDiv);
480
- }
481
- }
482
- };
483
- MenuLevel.prototype.renderItemsWithFilter = function (filter) {
484
- this.isFilteringMode = true;
485
- var scrollDiv = this.scrollDiv;
486
- scrollDiv.innerHTML = "";
487
- var filterSections = filter.split('>');
488
- var pureFilterTexts = filterSections.map(function (section) { return section.replace(/\*/g, ''); });
489
- var items = this.filterItems(this.items, filterSections);
490
- this.filteredItems = [];
491
- for (var i = 0; i < items.length; i++) {
492
- this.renderItemWithFilter(items[i], pureFilterTexts, 0);
493
- }
494
- };
495
- MenuLevel.prototype.matchesFilter = function (text, regexp) {
496
- if (text && regexp) {
497
- return regexp.test(text);
498
- }
499
- else {
500
- return true;
501
- }
502
- };
503
- MenuLevel.prototype.filterItems = function (items, filterSections) {
504
- var resultItems = [];
505
- var filter = filterSections.length > 0 ? filterSections[0] : '';
506
- var restFilterSections = filterSections.length > 1 ? filterSections.slice(1) : filterSections;
507
- var filterRegexp = filter ? new RegExp(filter.replace(/\*/g, '.+?'), 'i') : null;
508
- for (var i = 0; i < items.length; i++) {
509
- var item = items[i];
510
- if (item.items) {
511
- var groupItem = dataUtils.assign({}, item);
512
- var groupItemMatches = this.matchesFilter(item.text, filterRegexp);
513
- //if we have only one filter section (or an empty filter)
514
- if (filterSections.length < 2) {
515
- //if current group item matches the filter -> show all sub-items
516
- if (groupItemMatches && filterSections.length < 2) {
517
- groupItem.items = dataUtils.createArrayFrom(item.items);
518
- }
519
- else {
520
- groupItem.items = this.filterItems(item.items, restFilterSections);
521
- }
522
- }
523
- //if we have more than 1 filter section and there is a match -> filter sub-items as well
524
- else if (groupItemMatches) {
525
- groupItem.items = this.filterItems(item.items, restFilterSections);
526
- }
527
- //otherwise we skip this group at all
528
- else {
529
- groupItem.items = [];
530
- }
531
- if (groupItem.items.length > 0) {
532
- resultItems.push(groupItem);
533
- }
534
- }
535
- else {
536
- if (this.matchesFilter(item.text, filterRegexp)) {
537
- resultItems.push(item);
538
- }
539
- }
540
- }
541
- return resultItems;
542
- };
543
- MenuLevel.prototype.renderItemWithFilter = function (item, filterTexts, level) {
544
- var _this = this;
545
- var scrollDiv = this.scrollDiv;
546
- var levelFilterText = level < filterTexts.length ? filterTexts[level] : filterTexts[filterTexts.length - 1];
547
- var multiselect = this.parentMenu.options.multiselect;
548
- var activateOnMouseOver = this.parentMenu.options.activateOnMouseOver;
549
- var itemFgColor = this.parentMenu.style.colors.fgON || 'black';
550
- var itemOverBgColor = this.parentMenu.style.colors.bgOVER || 'LightSteelBlue';
551
- var itemFontSize = this.parentMenu.style.itemStyle.fontSize || '14px';
552
- var itemFilterCallback = this.parentMenu.getItemFilterCallback();
553
- if (!item || !item.text)
554
- return;
555
- if (itemFilterCallback) {
556
- if (!itemFilterCallback(item))
557
- return;
558
- if (item.items && this.allSubitemsAreFiltered(item.items, itemFilterCallback))
559
- return;
560
- }
561
- item.data = function (propName) {
562
- return this[propName];
563
- };
564
- if (typeof (item.selected) == "undefined") {
565
- item.selected = false;
566
- }
567
- if (item.selected && this.selectedItem == null) {
568
- this.selectedItem = item;
569
- }
570
- var itemDiv = document.createElement("div");
571
- domel(itemDiv)
572
- .addClass(this.cssPrefix + "-itemDiv")
573
- .addClass(browserUtils.getMobileCssClass());
574
- itemDiv.style.marginLeft = level * 10 + "px";
575
- if (item.selected && !multiselect) {
576
- itemDiv.classList.add(this.cssPrefix + "-selected");
577
- }
578
- ;
579
- if (this.domWriteItemsId && this.menuId) {
580
- itemDiv.id = 'item-' + this.menuId + '-' + item.id;
581
- }
582
- scrollDiv.appendChild(itemDiv);
583
- itemDiv['menuItem'] = item;
584
- itemDiv['menuLevel'] = this;
585
- item.itemDiv = itemDiv;
586
- if (this.parentMenu.options.useDefaultStyles) {
587
- itemDiv.style.fontSize = itemFontSize;
588
- itemDiv.style.color = itemFgColor;
589
- itemDiv.style.paddingLeft = "15px";
590
- itemDiv.style.paddingRight = "6px";
591
- itemDiv.style.cursor = "pointer";
592
- }
593
- if (item.text == '---') {
594
- itemDiv.appendChild(document.createElement('hr'));
595
- }
596
- else {
597
- if (multiselect) {
598
- var cb = document.createElement("input");
599
- cb.type = "checkbox";
600
- cb.id = "cb" + item.id;
601
- cb.checked = this.isItemSelected(item);
602
- cb.defaultChecked = this.isItemSelected(item);
603
- itemDiv.appendChild(cb);
604
- item.itemCheckbox = cb;
605
- if (this.parentMenu.options.useDefaultStyles) {
606
- cb.style.margin = "4px 10px 0 0";
607
- cb.style.verticalAlign = "top";
608
- }
609
- }
610
- var itemText = document.createElement('span');
611
- itemText.innerHTML = this.highlightText(item.text, levelFilterText);
612
- itemDiv.appendChild(itemText);
613
- if (item.items && item.items.length > 0) {
614
- itemDiv.classList.add(this.cssPrefix + "-itemDiv-filter-hasChildren");
615
- }
616
- else {
617
- this.filteredItems.push(item);
618
- var itemClickHandler = function (event) {
619
- if (multiselect) {
620
- if (!item.items || event.target == item.itemCheckbox) {
621
- var itemSelected = _this.isItemSelected(item);
622
- _this.setItemSelected(item, !itemSelected);
623
- item.itemCheckbox.checked = !itemSelected;
624
- _this.parentMenu.refreshCheckboxes();
625
- }
626
- else {
627
- _this.activateItem(item);
628
- }
629
- }
630
- else {
631
- _this.activateItem(item);
632
- _this.submit(item);
633
- }
634
- return false;
635
- };
636
- itemDiv.removeEventListener("click", itemClickHandler);
637
- itemDiv.addEventListener('click', itemClickHandler);
638
- itemDiv.addEventListener('mouseenter', function (ev) {
639
- ;
640
- _this.parentMenu.isCursorInside = true;
641
- if (activateOnMouseOver) {
642
- _this.activateItem(item);
643
- }
644
- });
645
- itemDiv.addEventListener('mouseleave', function (ev) {
646
- _this.parentMenu.isCursorInside = false;
647
- setTimeout(function () {
648
- if (!_this.parentMenu.isCursorInside) {
649
- if (activateOnMouseOver && item == _this.activeItem && !item.subLevel) {
650
- _this.deactivateItem(item);
651
- }
652
- }
653
- }, 200);
654
- });
655
- }
656
- }
657
- if (item.items) {
658
- for (var i = 0; i < item.items.length; i++) {
659
- this.renderItemWithFilter(item.items[i], filterTexts, level + 1);
660
- }
661
- }
662
- if (this.itemRenderedCallback) {
663
- this.itemRenderedCallback(this.menuId, itemDiv);
664
- }
665
- };
666
- MenuLevel.prototype.highlightText = function (content, text) {
667
- if (text && text.length > 0) {
668
- var lowerText = text.toLowerCase();
669
- var lowerContent = content.toLowerCase();
670
- var insertValue1 = "<span class='eqjs-menu-itemDiv-highlight'>";
671
- var insertValue2 = "</span>";
672
- var startIndex = lowerContent.indexOf(lowerText);
673
- if (startIndex >= 0) {
674
- var pos = 0;
675
- var value = content;
676
- var indexInMas = [];
677
- while (true) {
678
- var index = lowerContent.indexOf(lowerText, pos);
679
- if (index >= 0) {
680
- indexInMas.push(index);
681
- pos = index + text.length;
682
- }
683
- else {
684
- pos++;
685
- }
686
- if (pos >= value.length - 1) {
687
- break;
688
- }
689
- }
690
- if (indexInMas.length > 0) {
691
- content = '';
692
- for (var i = 0; i < indexInMas.length; i++) {
693
- if (i === 0) {
694
- content += value.substring(0, indexInMas[i]);
695
- }
696
- content += insertValue1 + value.substring(indexInMas[i], indexInMas[i] + text.length) + insertValue2;
697
- if (i < indexInMas.length - 1) {
698
- content += value.substring(indexInMas[i] + text.length, indexInMas[i + 1]);
699
- }
700
- else {
701
- content += value.substring(indexInMas[i] + text.length);
702
- }
703
- }
704
- }
705
- }
706
- }
707
- return content;
708
- };
709
- MenuLevel.prototype.renderItems = function (filter) {
710
- if (!filter && !browserUtils.isMobileMode()) {
711
- this.renderItemsWithoutFilter();
712
- }
713
- else {
714
- filter = filter || '';
715
- this.renderItemsWithFilter(filter.toLowerCase());
716
- }
717
- };
718
- MenuLevel.prototype.activateItem = function (menuItem, openSubLevel) {
719
- if (openSubLevel === void 0) { openSubLevel = true; }
720
- if (this.activeItem != null) {
721
- this.deactivateItem(this.activeItem);
722
- }
723
- this.activeItem = menuItem;
724
- var rowElement = menuItem.itemDiv;
725
- rowElement.classList.add('active');
726
- if (this.parentMenu.options.useDefaultStyles) {
727
- var itemBgColor = this.parentMenu.style.colors.bgON;
728
- var itemFgColor = this.parentMenu.style.colors.fgON;
729
- var itemOverBgColor = this.parentMenu.style.colors.bgOVER;
730
- var itemOverFgColor = this.parentMenu.style.colors.fgOVER || "";
731
- var itemClass = this.parentMenu.style.itemClass || "";
732
- var itemClassOver = this.parentMenu.style.itemClassOver || "";
733
- if (itemClassOver != "") {
734
- rowElement.style.backgroundColor = "";
735
- rowElement.style.color = "";
736
- }
737
- else {
738
- rowElement.style.backgroundColor = itemOverBgColor;
739
- rowElement.style.color = itemOverFgColor;
740
- }
741
- }
742
- if (menuItem.items && !this.isFilteringMode && openSubLevel) {
743
- this.showSubLevel(menuItem);
744
- }
745
- };
746
- MenuLevel.prototype.deactivateItem = function (menuItem) {
747
- if (!menuItem)
748
- return;
749
- var rowElement = menuItem.itemDiv;
750
- rowElement.classList.remove('active');
751
- if (this.parentMenu.options.useDefaultStyles) {
752
- var itemBgColor = this.parentMenu.style.colors.bgON;
753
- var itemFgColor = this.parentMenu.style.colors.fgON;
754
- var itemClass = this.parentMenu.style.itemClass || "";
755
- if (itemClass != "") {
756
- rowElement.style.backgroundColor = "";
757
- rowElement.style.color = "";
758
- }
759
- else {
760
- rowElement.style.backgroundColor = itemBgColor;
761
- rowElement.style.color = itemFgColor;
762
- }
763
- }
764
- if (menuItem.subLevel) {
765
- menuItem.subLevel.hide();
766
- }
767
- this.activeItem = null;
768
- };
769
- MenuLevel.prototype.showSubLevel = function (menuItem) {
770
- if (!menuItem.subLevel) {
771
- var levelId = '';
772
- if (this.menuId) {
773
- levelId = this.menuId + "-" + menuItem.id;
774
- }
775
- menuItem.subLevel = new MenuLevel({
776
- showSelected: this.showSelected,
777
- menu: this.parentMenu,
778
- parent: this,
779
- container: this.parentElement,
780
- items: menuItem.items,
781
- levelIndex: this.levelIndex + 1,
782
- domWriteItemsId: this.domWriteItemsId,
783
- menuId: levelId,
784
- itemRenderedCallback: this.itemRenderedCallback
785
- });
786
- }
787
- var pos = getElementAbsolutePos(menuItem.itemDiv);
788
- var scroll = getScrollPos();
789
- var winSize = getWinSize();
790
- //show menu to the side that have more space available
791
- var leftSpace = pos.x - scroll.left;
792
- var rightSpace = winSize.width - leftSpace - menuItem.itemDiv.offsetWidth;
793
- pos.x += menuItem.itemDiv.offsetParent.offsetWidth;
794
- pos.y += 1;
795
- menuItem.subLevel.showAt(pos.x, pos.y, true, true);
796
- menuItem.subLevel.levelDiv.style.width = '';
797
- menuItem.subLevel.levelDiv.style.right = '';
798
- if ((rightSpace >= menuItem.subLevel.levelDiv.offsetWidth) || (rightSpace >= leftSpace)) { //show level to the right
799
- if (rightSpace < menuItem.subLevel.levelDiv.offsetWidth) {
800
- menuItem.subLevel.levelDiv.style.right = -scroll.left + 'px';
801
- }
802
- }
803
- else { //show level to the left
804
- if (leftSpace < menuItem.subLevel.levelDiv.offsetWidth) {
805
- menuItem.subLevel.levelDiv.style.left = scroll.left + 4 + 'px';
806
- }
807
- else {
808
- menuItem.subLevel.levelDiv.style.left = '';
809
- }
810
- menuItem.subLevel.levelDiv.style.right = getViewportSize().width - pos.x + menuItem.itemDiv.offsetWidth - 6 + 'px';
811
- }
812
- menuItem.subLevel.levelDiv.style.visibility = 'visible';
813
- menuItem.subLevel.focus();
814
- };
815
- MenuLevel.prototype.adjustTopPos = function (top) {
816
- var winSize = getWinSize();
817
- var levelBottom = top - getScrollPos().top + this.levelDiv.offsetHeight;
818
- var res = top;
819
- if (levelBottom > winSize.height - 5) {
820
- res -= levelBottom - winSize.height + 5;
821
- if (res < getScrollPos().top) {
822
- res = getScrollPos().top + 10;
823
- }
824
- }
825
- return res;
826
- };
827
- MenuLevel.prototype.showAt = function (x, y, adjustTopPos, hidden) {
828
- if (!this.items) {
829
- return;
830
- }
831
- this.initLevelDiv();
832
- //crocodile
833
- this.turnCheckboxes(this.items);
834
- this.renderItems();
835
- var levelStyle = this.levelDiv.style;
836
- if (hidden) {
837
- this.levelDiv.style.visibility = 'hidden';
838
- }
839
- levelStyle.display = 'block';
840
- levelStyle.left = x + 'px';
841
- levelStyle.top = y + 'px';
842
- this.scrollDiv.style.width = "auto";
843
- this.scrollDiv.style.height = "auto";
844
- //adjusting level top position
845
- if (adjustTopPos) {
846
- y = this.adjustTopPos(y);
847
- levelStyle.top = y + 'px';
848
- }
849
- //setting minimal level width if it is defined
850
- var minItemWidth = this.parentMenu.minItemWidth;
851
- if (minItemWidth > 0 && this.scrollDiv.offsetWidth < minItemWidth) {
852
- for (var i = 0; i < this.items.length; i++) {
853
- this.items[i].itemDiv.style.width = minItemWidth + "px";
854
- }
855
- }
856
- var maxItemWidth = this.parentMenu.maxItemWidth;
857
- if (maxItemWidth > 0 && this.scrollDiv.offsetWidth > maxItemWidth) {
858
- for (var i = 0; i < this.items.length; i++) {
859
- this.items[i].itemDiv.style.width = maxItemWidth + "px";
860
- this.items[i].itemDiv.style.overflowX = "hidden";
861
- }
862
- }
863
- var winSize = getWinSize();
864
- //adjustinng maximum height of the menu level if it does not fit to browser window
865
- var maxHeight = winSize.height - (y - getScrollPos().top) - 15; //document.documentElement.scrollTop
866
- if (this.parentMenu.maxHeight > 0 && maxHeight > this.parentMenu.maxHeight) {
867
- maxHeight = this.parentMenu.maxHeight;
868
- }
869
- if (this._applyItem != null && this._applyItem.itemDiv != null) {
870
- maxHeight -= this._applyItem.itemDiv.offsetHeight + 5;
871
- }
872
- if (this.searchDiv != null) {
873
- maxHeight -= this.searchDiv.offsetHeight;
874
- }
875
- if (this.closeDiv != null) {
876
- maxHeight -= this.closeDiv.offsetHeight;
877
- }
878
- if (this.levelDiv.offsetHeight > maxHeight) {
879
- var newHeight = maxHeight;
880
- if (newHeight < 50) {
881
- newHeight = 50;
882
- }
883
- this.scrollDiv.style.height = newHeight + "px";
884
- }
885
- else {
886
- this.scrollDiv.style.height = "auto";
887
- }
888
- this.activeItem = null;
889
- };
890
- MenuLevel.prototype.focus = function () {
891
- var _this = this;
892
- window.setTimeout(function () {
893
- _this.scrollDiv.focus();
894
- if (_this.searchBox != null) {
895
- if (_this.parentMenu.options.searchBoxAutoFocus) {
896
- _this.searchBox.focus();
897
- }
898
- _this.searchBox.value = "";
899
- }
900
- }, 100);
901
- };
902
- MenuLevel.prototype.hide = function () {
903
- if (this.activeItem !== null) {
904
- if (this.activeItem.subLevel) {
905
- this.activeItem.subLevel.hide();
906
- }
907
- }
908
- if (this.levelDiv) {
909
- var levelStyle = this.levelDiv.style;
910
- levelStyle.display = 'none';
911
- if (this.initialized) {
912
- this.parentElement.removeChild(this.levelDiv);
913
- this.initialized = false;
914
- }
915
- }
916
- };
917
- MenuLevel.prototype.initLevelDiv = function () {
918
- if (!this.initialized) {
919
- this.parentElement.appendChild(this.levelDiv);
920
- domel(this.levelDiv)
921
- .addClass(this.cssPrefix + "-levelDiv")
922
- .addClass(browserUtils.getMobileCssClass());
923
- this.initialized = true;
924
- }
925
- };
926
- MenuLevel.prototype.submit = function (menuItem) {
927
- if (menuItem != null) {
928
- if (!menuItem.items) {
929
- this.parentMenu.hideMenu();
930
- var selectedItems = [];
931
- if (menuItem == this._applyItem) {
932
- this.submitItems(this.items, selectedItems);
933
- }
934
- this.parentMenu.submitMenu(menuItem, selectedItems);
935
- }
936
- }
937
- };
938
- MenuLevel.prototype.remove = function () {
939
- //remove old level elements
940
- for (var i = 0; i < this.items.length; i++) {
941
- var item = this.items[i];
942
- if (item.subLevel) {
943
- item.subLevel.remove();
944
- }
945
- }
946
- if (this.levelDiv) {
947
- this.levelDiv.innerHTML = "";
948
- var parentNode = this.levelDiv.parentNode;
949
- if (parentNode != null) {
950
- parentNode.removeChild(this.levelDiv);
951
- }
952
- }
953
- this.levelDiv = null;
954
- };
955
- MenuLevel.prototype.update = function (newItems) {
956
- this.remove();
957
- //create new level
958
- this.items = newItems;
959
- this.activeItem = null;
960
- this.selectedItem = null;
961
- this._applyItem.itemDiv = null;
962
- this.initialized = false;
963
- this.updated++;
964
- this.renderContent();
965
- };
966
- MenuLevel.prototype.refreshCheckboxes = function () {
967
- for (var i = 0; i < this.items.length; i++) {
968
- var item = this.items[i];
969
- if (item.itemCheckbox) {
970
- item.itemCheckbox.checked = this.isItemSelected(item);
971
- }
972
- if (item.subLevel) {
973
- item.subLevel.refreshCheckboxes();
974
- }
975
- }
976
- };
977
- MenuLevel.prototype.refreshItems = function () {
978
- for (var i = 0; i < this.items.length; i++) {
979
- var item = this.items[i];
980
- if (item.itemDiv) {
981
- if (item.hidden) {
982
- item.itemDiv.style.display = "none";
983
- }
984
- else {
985
- item.itemDiv.style.display = "block";
986
- }
987
- }
988
- if (item.subLevel) {
989
- item.subLevel.refreshItems();
990
- }
991
- }
992
- };
993
- MenuLevel.prototype.findItem = function (searchedText) {
994
- var txt = searchedText.toLowerCase();
995
- for (var i = 0; i < this.items.length; i++) {
996
- var item = this.items[i];
997
- if (item.text.toLowerCase().indexOf(txt) == 0) {
998
- return item;
999
- }
1000
- }
1001
- return null;
1002
- };
1003
- return MenuLevel;
1004
- }());
1005
- var PopupMenu = /** @class */ (function () {
1006
- function PopupMenu(options) {
1007
- var _this = this;
1008
- this.isCursorInside = false;
1009
- this.mouseIsOverBlock = false;
1010
- this.mouseIsOverLink = false;
1011
- this.toId = null;
1012
- this.active = false;
1013
- this.ancorFocused = null;
1014
- this.options = {
1015
- items: [],
1016
- buttons: {
1017
- submit: i18n.getText('ButtonApply'),
1018
- cancel: i18n.getText('ButtonCancel')
1019
- },
1020
- itemFilterCallback: null,
1021
- useDefaultStyles: false,
1022
- multiselect: false,
1023
- adjustHeight: true,
1024
- showSearchBoxAfter: 30,
1025
- activateOnMouseOver: true,
1026
- container: document.body,
1027
- domWriteItemsId: false,
1028
- itemRenderedCallback: null,
1029
- showItemIds: false
1030
- };
1031
- if (options) {
1032
- dataUtils.assignDeep(this.options, options);
1033
- }
1034
- if (this.options.hideButtons) {
1035
- this.options.submitOnBlur = true;
1036
- }
1037
- this.menuId = PopupMenu.lastMenuID++;
1038
- this.updateProps();
1039
- this.rootLevel = new MenuLevel({
1040
- menu: this,
1041
- items: this.options.items,
1042
- levelIndex: 0,
1043
- container: this.options.container,
1044
- domWriteItemsId: this.options.domWriteItemsId,
1045
- menuId: this.options.id,
1046
- itemRenderedCallback: this.options.itemRenderedCallback,
1047
- showSelected: this.options.showSelected,
1048
- });
1049
- this.rootLevel.levelDiv.classList.add(this.cssPrefix + "-rootLevel");
1050
- if (this.options.zIndex)
1051
- this.rootLevel.levelDiv.style.zIndex = "" + this.options.zIndex;
1052
- this.menuKeyUpHandler = function (e) {
1053
- if (e.which == 27) {
1054
- _this.hideMenu();
1055
- e.stopImmediatePropagation();
1056
- }
1057
- };
1058
- this.globalMouseDownHandler = function (e) {
1059
- if (!_this.active)
1060
- return true;
1061
- var event = window.event || e;
1062
- var o = event.srcElement || event.target;
1063
- var isOutside = true;
1064
- while (o) {
1065
- if (o.tagName && o.tagName.toLowerCase() == 'div') {
1066
- // it is added in renderContent of MenuLevel class
1067
- if (o.menuLevel) {
1068
- if (o.menuLevel.parentMenu == _this) {
1069
- isOutside = false;
1070
- break;
1071
- }
1072
- }
1073
- }
1074
- o = o.parentNode || o.parentElement;
1075
- }
1076
- if (isOutside) {
1077
- if (_this.options.submitOnBlur) {
1078
- _this.rootLevel.submit(_this.rootLevel.applyItem);
1079
- }
1080
- _this.hideMenu();
1081
- }
1082
- return true;
1083
- };
1084
- this.render();
1085
- }
1086
- Object.defineProperty(PopupMenu.prototype, "cssPrefix", {
1087
- get: function () {
1088
- return 'eqjs-menu';
1089
- },
1090
- enumerable: true,
1091
- configurable: true
1092
- });
1093
- PopupMenu.prototype.getItems = function () {
1094
- return this.rootLevel.getItems();
1095
- };
1096
- PopupMenu.prototype.updateProps = function () {
1097
- this.style = {};
1098
- this.style.colors = { border: "#666666", shadow: "#888888", bgON: "white", fgON: "black", bgOVER: "#B6BDD2", fgOVER: "black" };
1099
- this.style.itemStyle = { fontSize: "14px" };
1100
- this.minItemWidth = 0;
1101
- this.maxItemWidth = 0;
1102
- this.maxHeight = 0;
1103
- this.zIndex = "" + this.options.zIndex;
1104
- this.commandTemplate = "";
1105
- this.args = [];
1106
- this.active = false;
1107
- };
1108
- PopupMenu.prototype.render = function () {
1109
- };
1110
- PopupMenu.prototype.clearItemsMenuProps = function (items) {
1111
- if (!items)
1112
- return;
1113
- for (var i = 0; i < items.length; i++) {
1114
- this.clearItemMenuProps(items[i]);
1115
- }
1116
- };
1117
- PopupMenu.prototype.clearItemMenuProps = function (item) {
1118
- //don't clear properties they belong this menu
1119
- if (item.subLevel && item.subLevel.parentMenu == this)
1120
- return;
1121
- if (item.subLevel) {
1122
- item.subLevel.remove();
1123
- item.subLevel = null;
1124
- }
1125
- if (item.itemDiv) {
1126
- item.itemDiv = null;
1127
- }
1128
- if (item.items) {
1129
- this.clearItemsMenuProps(item.items);
1130
- }
1131
- };
1132
- PopupMenu.prototype.setSelectedItems = function (items, selectedIds) {
1133
- var itemsLength = items ? items.length : 0;
1134
- for (var i = 0; i < itemsLength; i++) {
1135
- var item = items[i];
1136
- if (item.items) {
1137
- this.setSelectedItems(item.items, selectedIds);
1138
- }
1139
- else {
1140
- item.selected = selectedIds.indexOf(item.id) >= 0;
1141
- }
1142
- }
1143
- };
1144
- PopupMenu.prototype.getRootLevel = function () {
1145
- return this.rootLevel;
1146
- };
1147
- PopupMenu.prototype.getItemFilterCallback = function () {
1148
- return this.itemFilterCallback;
1149
- };
1150
- PopupMenu.prototype.showMenu = function (options) {
1151
- this.ancorFocused = options.anchor == document.activeElement ? options.anchor : null;
1152
- this.clearItemsMenuProps(this.options.items);
1153
- this.itemSelectedCallback = options.itemSelectedCallback || null;
1154
- this.menuClosedCallback = options.menuClosedCallback || null;
1155
- this.itemFilterCallback = options.itemFilterCallback || null;
1156
- if (options.items) {
1157
- this.options.items = options.items;
1158
- this.rootLevel.setItems(options.items);
1159
- }
1160
- if (options.onMenuItemSelected) {
1161
- this.options.onMenuItemSelected = options.onMenuItemSelected;
1162
- }
1163
- var selectedIds = options.selectedIds || null;
1164
- if (selectedIds) {
1165
- if (typeof selectedIds === "string") {
1166
- selectedIds = selectedIds.split(",");
1167
- }
1168
- }
1169
- else {
1170
- selectedIds = [];
1171
- }
1172
- this.active = true;
1173
- this.setSelectedItems(this.options.items, selectedIds);
1174
- if (browserUtils.isMobileMode()) {
1175
- this.rootLevel.showAt(0, 0, true, true);
1176
- this.rootLevel.levelDiv.style.top = '0px';
1177
- this.rootLevel.levelDiv.style.bottom = '0px';
1178
- this.rootLevel.levelDiv.style.right = '0px';
1179
- this.rootLevel.levelDiv.style.position = 'fixed';
1180
- this.rootLevel.levelDiv.style.fontSize = '20px';
1181
- }
1182
- else {
1183
- var anchor = options.anchor || document.documentElement;
1184
- var srcPos = getElementAbsolutePos(anchor);
1185
- var anchorHeight = anchor.offsetHeight;
1186
- var anchorWidth = anchor.offsetHeight;
1187
- var pos = {
1188
- x: srcPos.x,
1189
- y: srcPos.y + anchorHeight + 2
1190
- };
1191
- var scroll_1 = getScrollPos();
1192
- var winSize = getWinSize();
1193
- //show menu to the side that have more space available
1194
- var leftSpace = pos.x + anchorWidth - scroll_1.left;
1195
- var rightSpace = winSize.width - leftSpace + anchorWidth;
1196
- pos.x += 2;
1197
- this.rootLevel.showAt(pos.x, pos.y, true, true);
1198
- this.rootLevel.levelDiv.style.width = '';
1199
- this.rootLevel.levelDiv.style.right = '';
1200
- if (!this.rootLevel.levelDiv.style.zIndex) {
1201
- // z-index is at least 10000 and more if anchor has bigger
1202
- this.rootLevel.levelDiv.style.zIndex = "" + Math.max(10000, findHighestZIndex(anchor) + 1);
1203
- }
1204
- if ((rightSpace >= this.rootLevel.levelDiv.offsetWidth) || (rightSpace >= leftSpace)) {
1205
- //show level to the right
1206
- if (rightSpace < this.rootLevel.levelDiv.offsetWidth) {
1207
- this.rootLevel.levelDiv.style.right = -scroll_1.left + 'px';
1208
- }
1209
- }
1210
- else {
1211
- //show level to the left
1212
- if (leftSpace < this.rootLevel.levelDiv.offsetWidth) {
1213
- this.rootLevel.levelDiv.style.left = scroll_1.left + 4 + 'px';
1214
- }
1215
- else {
1216
- this.rootLevel.levelDiv.style.left = '';
1217
- }
1218
- this.rootLevel.levelDiv.style.right = getViewportSize().width - pos.x - anchorWidth + 'px';
1219
- }
1220
- this.rootLevel.levelDiv.style.fontSize = '14px';
1221
- }
1222
- this.rootLevel.levelDiv.style.visibility = 'visible';
1223
- this.rootLevel.focus();
1224
- document.addEventListener('keyup', this.menuKeyUpHandler);
1225
- document.addEventListener('mousedown', this.globalMouseDownHandler, true);
1226
- };
1227
- PopupMenu.prototype.hideMenu = function () {
1228
- document.removeEventListener('mousedown', this.globalMouseDownHandler, true);
1229
- document.removeEventListener('keyup', this.menuKeyUpHandler);
1230
- this.rootLevel.hide();
1231
- if (this.ancorFocused) {
1232
- this.ancorFocused.focus();
1233
- }
1234
- if (this.menuClosedCallback) {
1235
- this.menuClosedCallback();
1236
- }
1237
- };
1238
- PopupMenu.prototype.submitMenu = function (menuItem, selectedItems) {
1239
- if (this.itemSelectedCallback) {
1240
- this.itemSelectedCallback(menuItem, selectedItems);
1241
- }
1242
- };
1243
- PopupMenu.prototype.knockMenuStyle = function (menu) {
1244
- menu.removeAttribute('style');
1245
- var ul = menu.querySelectorAll('ul').item(0);
1246
- var hasUlStyle = ul && ul.style ? true : false;
1247
- if (hasUlStyle !== false) {
1248
- ul.setAttribute('style', '');
1249
- }
1250
- };
1251
- PopupMenu.prototype.refreshItems = function () {
1252
- this.rootLevel.refreshItems();
1253
- };
1254
- PopupMenu.prototype.refreshCheckboxes = function () {
1255
- this.rootLevel.refreshCheckboxes();
1256
- };
1257
- PopupMenu.lastMenuID = 0;
1258
- return PopupMenu;
1259
- }());
1260
- export { PopupMenu };
1
+ import { i18n } from '@easydata/core';
2
+ import { utils as dataUtils } from '@easydata/core';
3
+ import { domel } from '@easydata/ui';
4
+ import { getElementAbsolutePos, getScrollPos, getWinSize, getViewportSize } from '@easydata/ui';
5
+ import { browserUtils } from './browser_utils';
6
+ import { findHighestZIndex } from './utils';
7
+ var MenuLevel = /** @class */ (function () {
8
+ function MenuLevel(options) {
9
+ this.isFilteringMode = false;
10
+ this.showSelected = false;
11
+ //menu, items, levelIndex
12
+ this.parentMenu = options.menu || null;
13
+ this.parentLevel = options.parent || null;
14
+ this.parentElement = options.container || document.body;
15
+ this.levelIndex = options.levelIndex || 0;
16
+ this.levelDiv = null;
17
+ this.domWriteItemsId = options.domWriteItemsId || false;
18
+ this.menuId = options.menuId || '';
19
+ this.itemRenderedCallback = options.itemRenderedCallback || null;
20
+ //we need to define special "apply" item for this level
21
+ this._applyItem = { id: null, text: null, itemDiv: null };
22
+ this.items = options.items || [];
23
+ this.activeItem = null;
24
+ this.selectedItem = null;
25
+ this.initialized = false;
26
+ this.showSelected = options.showSelected;
27
+ this.updated = 0;
28
+ this.renderContent();
29
+ }
30
+ Object.defineProperty(MenuLevel.prototype, "applyItem", {
31
+ get: function () {
32
+ return this._applyItem;
33
+ },
34
+ enumerable: false,
35
+ configurable: true
36
+ });
37
+ Object.defineProperty(MenuLevel.prototype, "cssPrefix", {
38
+ get: function () {
39
+ return 'eqjs-menu';
40
+ },
41
+ enumerable: false,
42
+ configurable: true
43
+ });
44
+ MenuLevel.prototype.getItems = function () {
45
+ return this.items;
46
+ };
47
+ MenuLevel.prototype.setItems = function (items) {
48
+ this.items = items;
49
+ };
50
+ MenuLevel.prototype.renderContent = function () {
51
+ var _this = this;
52
+ if (!this.items) {
53
+ return;
54
+ }
55
+ var self = this;
56
+ //define internal variables used in this function
57
+ var itemBgColor = this.parentMenu.style.colors.bgON || "white";
58
+ var itemFgColor = this.parentMenu.style.colors.fgON || "black";
59
+ var itemOverBgColor = this.parentMenu.style.colors.bgOVER || "LightSteelBlue";
60
+ var itemFontFamily = this.parentMenu.style.itemStyle.fontFamily || "";
61
+ var itemFontSize = this.parentMenu.style.itemStyle.fontSize || "14px";
62
+ var multiselect = this.parentMenu.options.multiselect;
63
+ var isSubQuery = this.parentMenu.options.isSubQuery;
64
+ //add base DIV element which is also used to show the shadow
65
+ var baseDivBuilder = domel('div')
66
+ .addClass(browserUtils.getMobileCssClass());
67
+ if (this.parentMenu.options.useDefaultStyles) {
68
+ baseDivBuilder
69
+ .setStyle('backgroundColor', itemBgColor)
70
+ .setStyle('border', '1px solid')
71
+ .setStyle('borderColor', itemBgColor)
72
+ .setStyle('backgroundColor', this.parentMenu.style.colors.border)
73
+ .setStyle('margin', '-2px 2px 2px -2px')
74
+ .setStyle('width', 'auto')
75
+ .setStyle('height', 'auto');
76
+ }
77
+ baseDivBuilder
78
+ .setStyle('z-index', this.parentMenu.zIndex)
79
+ .setStyle('position', 'absolute')
80
+ .setStyle('display', 'none');
81
+ var baseDiv = baseDivBuilder.toDOM();
82
+ baseDiv['menuLevel'] = this;
83
+ var applyItem = this._applyItem;
84
+ //if multiselect option is on - then we should add special "apply" item
85
+ if (multiselect && this.levelIndex === 0 && this.parentMenu.options.hideButtons !== true) {
86
+ var applyDiv = document.createElement("div");
87
+ applyDiv.classList.add("".concat(this.cssPrefix, "-applyDiv"));
88
+ applyDiv['menuItem'] = applyItem;
89
+ this.applyBtn = document.createElement('button');
90
+ if (this.parentMenu.options.useDefaultStyles) {
91
+ applyDiv.style.borderBottom = '1px solid';
92
+ applyDiv.style.padding = '5px';
93
+ applyDiv.style.marginBottom = '5px';
94
+ this.applyBtn.style.padding = '0 5px';
95
+ this.applyBtn.style.cursor = "pointer";
96
+ }
97
+ var applyTextNode = document.createTextNode(this.parentMenu.options.buttons.submit);
98
+ this.applyBtn.appendChild(applyTextNode);
99
+ applyDiv.appendChild(this.applyBtn);
100
+ //cancel btn
101
+ var cancelBtn = document.createElement('button');
102
+ cancelBtn.classList.add("".concat(this.cssPrefix, "-cancel"));
103
+ if (this.parentMenu.options.useDefaultStyles) {
104
+ cancelBtn.style.padding = '0 5px';
105
+ cancelBtn.style.cursor = 'pointer';
106
+ cancelBtn.style.marginLeft = '15px';
107
+ }
108
+ var cancelText = document.createTextNode(this.parentMenu.options.buttons.cancel);
109
+ cancelBtn.appendChild(cancelText);
110
+ applyDiv.appendChild(cancelBtn);
111
+ baseDiv.appendChild(applyDiv);
112
+ applyItem.itemDiv = applyDiv;
113
+ this.applyBtn.addEventListener('click', function () {
114
+ _this.submit(_this._applyItem);
115
+ });
116
+ cancelBtn.addEventListener('click', function () {
117
+ _this.parentMenu.hideMenu();
118
+ });
119
+ }
120
+ // if too many items - then we add a special "search" item
121
+ // or there is an options to show always
122
+ if (this.parentLevel == null
123
+ && (this.parentMenu.options.searchBoxAlwaysShown || this.items.length >= this.parentMenu.options.showSearchBoxAfter)) {
124
+ var searchDivBuilder = domel('div')
125
+ .addClass("".concat(this.cssPrefix, "-searchDiv"));
126
+ if (this.parentMenu.options.useDefaultStyles) {
127
+ searchDivBuilder
128
+ .setStyle('border-bottom', '1px solid #666')
129
+ .setStyle('background-color', itemBgColor)
130
+ .setStyle('border-color', this.parentMenu.style.colors.border);
131
+ if (itemFontFamily != "") {
132
+ searchDivBuilder.setStyle('font-family', itemFontFamily);
133
+ }
134
+ searchDivBuilder
135
+ .setStyle('font-size', itemFontSize)
136
+ .setStyle('color', itemFgColor)
137
+ .setStyle('cursor', 'pointer')
138
+ .setStyle('text-align', 'left')
139
+ .setStyle('padding', '5px');
140
+ }
141
+ var searchEditBoxBuilder = domel('input')
142
+ .id('searchBox')
143
+ .name('searchBox')
144
+ .type('text')
145
+ .size(16)
146
+ .addClass("".concat(this.cssPrefix, "-searchBox"))
147
+ .on('input', function (ev) {
148
+ _this.deactivateItem(_this.activeItem);
149
+ _this.renderItems(_this.searchBox.value);
150
+ })
151
+ .on('keydown', function (ev) {
152
+ var keyCode = ev.keyCode;
153
+ switch (keyCode) {
154
+ case 13: //enter
155
+ if (_this.activeItem) {
156
+ _this.activeItem.itemDiv.click();
157
+ }
158
+ break;
159
+ case 38: // up
160
+ _this.moveActiveItemUp();
161
+ break;
162
+ case 40: // down
163
+ _this.moveActiveItemDown();
164
+ break;
165
+ case 39: // right
166
+ if (!_this.searchBox.value) {
167
+ _this.openSubLevel(_this.activeItem);
168
+ }
169
+ break;
170
+ }
171
+ });
172
+ if (this.parentMenu.options.useDefaultStyles) {
173
+ searchEditBoxBuilder
174
+ .setStyle('font-family', 'monospace')
175
+ .setStyle('font-size', '8pt')
176
+ .setStyle('width', '100%');
177
+ }
178
+ if (isSubQuery) {
179
+ searchEditBoxBuilder.addClass('eqjs-dialog');
180
+ }
181
+ this.searchBox = searchEditBoxBuilder.toDOM();
182
+ this.searchDiv = searchDivBuilder.toDOM();
183
+ this.searchDiv.appendChild(this.searchBox);
184
+ baseDiv.appendChild(this.searchDiv);
185
+ }
186
+ var scrollDiv = document.createElement("div");
187
+ scrollDiv.tabIndex = 1;
188
+ domel(scrollDiv)
189
+ .addClass("".concat(this.cssPrefix, "-scrollDiv"))
190
+ .addClass(browserUtils.getMobileCssClass());
191
+ scrollDiv.style.overflowX = "hidden";
192
+ scrollDiv.style.overflowY = "auto";
193
+ scrollDiv.style.position = "relative";
194
+ baseDiv.appendChild(scrollDiv);
195
+ this.levelDiv = baseDiv;
196
+ this.scrollDiv = scrollDiv;
197
+ if (this.menuId) {
198
+ this.levelDiv.id = this.menuId;
199
+ }
200
+ if (this.parentLevel) {
201
+ this.levelDiv.style.zIndex
202
+ = this.parentLevel.levelDiv.style.zIndex;
203
+ }
204
+ this.renderItems();
205
+ var scrollDivKeyDownHandler = function (event) {
206
+ switch (event.which) {
207
+ case 13: // enter
208
+ if (_this.parentMenu.options.multiselect) {
209
+ _this.parentMenu.getRootLevel().applyBtn.click();
210
+ }
211
+ else {
212
+ if (_this.activeItem) {
213
+ _this.activeItem.itemDiv.click();
214
+ }
215
+ }
216
+ break;
217
+ case 32: // space
218
+ if (_this.activeItem) {
219
+ _this.activeItem.itemDiv.click();
220
+ }
221
+ break;
222
+ case 37: // left
223
+ if (_this.parentLevel && !_this.isFilteringMode) {
224
+ _this.deactivateItem(_this.activeItem);
225
+ _this.parentLevel.focus();
226
+ }
227
+ break;
228
+ case 39: // right
229
+ _this.openSubLevel(_this.activeItem);
230
+ break;
231
+ case 38: // up
232
+ _this.moveActiveItemUp();
233
+ break;
234
+ case 40: // down
235
+ _this.moveActiveItemDown();
236
+ break;
237
+ default: return; // exit this handler for other keys
238
+ }
239
+ event.preventDefault(); // prevent the default action (scroll / move caret)
240
+ };
241
+ scrollDiv.addEventListener("keydown", scrollDivKeyDownHandler);
242
+ if (browserUtils.isMobileMode()) {
243
+ this.closeDiv =
244
+ domel('div', baseDiv)
245
+ .addClass('eqjs-menu-close-btn')
246
+ .addText(i18n.getText('ButtonClose'))
247
+ .on('click', function () {
248
+ _this.parentMenu.hideMenu();
249
+ })
250
+ .toDOM();
251
+ }
252
+ };
253
+ MenuLevel.prototype.moveActiveItemDown = function () {
254
+ var items = this.isFilteringMode ? this.filteredItems : this.items;
255
+ if (this.activeItem) {
256
+ var idx = items.indexOf(this.activeItem);
257
+ if (idx < items.length - 1) {
258
+ this.activateItem(items[idx + 1], false);
259
+ }
260
+ }
261
+ else {
262
+ this.activateItem(items[0], false);
263
+ }
264
+ };
265
+ MenuLevel.prototype.moveActiveItemUp = function () {
266
+ var items = this.isFilteringMode ? this.filteredItems : this.items;
267
+ if (this.activeItem) {
268
+ var idx = items.indexOf(this.activeItem);
269
+ if (idx > 0) {
270
+ this.activateItem(items[idx - 1], false);
271
+ }
272
+ }
273
+ else {
274
+ this.activateItem(items[items.length - 1], false);
275
+ }
276
+ };
277
+ MenuLevel.prototype.openSubLevel = function (menuItem) {
278
+ if (menuItem && menuItem.items && !this.isFilteringMode) {
279
+ this.showSubLevel(menuItem);
280
+ menuItem.subLevel.activateItem(menuItem.subLevel.items[0]);
281
+ }
282
+ };
283
+ MenuLevel.prototype.focusScrollDiv = function () {
284
+ this.scrollDiv.focus();
285
+ };
286
+ MenuLevel.prototype.turnCheckboxes = function (items) {
287
+ //turn checkboxes on for selected items
288
+ for (var i = 0; i < items.length; i++) {
289
+ var item = items[i];
290
+ if (item.itemCheckbox)
291
+ item.itemCheckbox.checked = this.isItemSelected(item);
292
+ if (item.items) {
293
+ this.turnCheckboxes(item.items);
294
+ }
295
+ }
296
+ };
297
+ MenuLevel.prototype.isItemSelected = function (item) {
298
+ if (item.items) {
299
+ for (var i = 0; i < item.items.length; i++) {
300
+ if (this.isItemSelected(item.items[i])) {
301
+ return true;
302
+ }
303
+ }
304
+ return false;
305
+ }
306
+ else {
307
+ return item.selected;
308
+ }
309
+ };
310
+ MenuLevel.prototype.setItemSelected = function (item, value) {
311
+ if (item.items) {
312
+ for (var i = 0; i < item.items.length; i++) {
313
+ this.setItemSelected(item.items[i], value);
314
+ }
315
+ }
316
+ else {
317
+ item.selected = value;
318
+ }
319
+ };
320
+ MenuLevel.prototype.submitItems = function (items, selectedItems) {
321
+ for (var j = 0; j < items.length; j++) {
322
+ if (items[j].items) {
323
+ this.submitItems(items[j].items, selectedItems);
324
+ }
325
+ else {
326
+ if (items[j].selected) {
327
+ selectedItems.push(items[j]);
328
+ }
329
+ }
330
+ }
331
+ };
332
+ MenuLevel.prototype.allSubitemsAreFiltered = function (items, filterCallback) {
333
+ for (var i = 0; i < items.length; i++) {
334
+ if (filterCallback(items[i]))
335
+ return false;
336
+ }
337
+ return true;
338
+ };
339
+ MenuLevel.prototype.isItemDiv = function (element) {
340
+ return element['menuItem'] ? true : false;
341
+ };
342
+ MenuLevel.prototype.isLevelDiv = function (element) {
343
+ return element['menuLevel'] ? true : false;
344
+ };
345
+ MenuLevel.prototype.getMenuItem = function (element) {
346
+ var el = element;
347
+ while (!this.isItemDiv(el)) {
348
+ if (this.isLevelDiv(el)) {
349
+ throw "Can't get menu item";
350
+ }
351
+ el = el.parentElement;
352
+ }
353
+ return el['menuItem'];
354
+ };
355
+ MenuLevel.prototype.renderItemsWithoutFilter = function () {
356
+ var _this = this;
357
+ this.isFilteringMode = false;
358
+ var scrollDiv = this.scrollDiv;
359
+ var multiselect = this.parentMenu.options.multiselect;
360
+ var activateOnMouseOver = this.parentMenu.options.activateOnMouseOver;
361
+ var itemFgColor = this.parentMenu.style.colors.fgON || 'black';
362
+ var itemOverBgColor = this.parentMenu.style.colors.bgOVER || 'LightSteelBlue';
363
+ var itemFontSize = this.parentMenu.style.itemStyle.fontSize || '14px';
364
+ var itemFilterCallback = this.parentMenu.getItemFilterCallback();
365
+ scrollDiv.innerHTML = "";
366
+ for (var i = 0; i < this.items.length; i++) {
367
+ var item = this.items[i];
368
+ if (!item || !item.text)
369
+ continue;
370
+ if (itemFilterCallback) {
371
+ if (!itemFilterCallback(item))
372
+ continue;
373
+ if (item.items && this.allSubitemsAreFiltered(item.items, itemFilterCallback))
374
+ continue;
375
+ }
376
+ item.data = function (propName) {
377
+ return _this[propName];
378
+ };
379
+ if (typeof (item.selected) == "undefined") {
380
+ item.selected = false;
381
+ }
382
+ if (item.selected && this.selectedItem == null) {
383
+ this.selectedItem = item;
384
+ }
385
+ var itemDiv = document.createElement("div");
386
+ domel(itemDiv)
387
+ .addClass("".concat(this.cssPrefix, "-itemDiv"))
388
+ .addClass(browserUtils.getMobileCssClass());
389
+ if (item.selected && this.showSelected && !multiselect) {
390
+ itemDiv.classList.add("".concat(this.cssPrefix, "-selected"));
391
+ }
392
+ ;
393
+ if (this.domWriteItemsId && this.menuId) {
394
+ itemDiv.id = 'item-' + this.menuId + '-' + item.id;
395
+ }
396
+ scrollDiv.appendChild(itemDiv);
397
+ itemDiv['menuItem'] = item;
398
+ itemDiv['menuLevel'] = this;
399
+ item.itemDiv = itemDiv;
400
+ if (this.parentMenu.options.useDefaultStyles) {
401
+ itemDiv.style.fontSize = itemFontSize;
402
+ itemDiv.style.color = itemFgColor;
403
+ itemDiv.style.paddingLeft = "15px";
404
+ itemDiv.style.paddingRight = "6px";
405
+ itemDiv.style.cursor = "pointer";
406
+ }
407
+ if (item.text == '---') {
408
+ itemDiv.appendChild(document.createElement('hr'));
409
+ }
410
+ else {
411
+ if (multiselect) {
412
+ var cb = document.createElement("input");
413
+ cb.type = "checkbox";
414
+ cb.id = "cb" + item.id;
415
+ cb.checked = this.isItemSelected(item);
416
+ cb.defaultChecked = this.isItemSelected(item);
417
+ itemDiv.appendChild(cb);
418
+ item.itemCheckbox = cb;
419
+ if (this.parentMenu.options.useDefaultStyles) {
420
+ cb.style.margin = "4px 10px 0 0";
421
+ cb.style.verticalAlign = "top";
422
+ }
423
+ }
424
+ var itemText = item.text;
425
+ if (this.parentMenu.options.showItemIds) {
426
+ itemText = item.id + ':' + itemText;
427
+ }
428
+ var itemTextNode = document.createTextNode(itemText);
429
+ itemDiv.appendChild(itemTextNode);
430
+ if (item.items && item.items.length > 0) {
431
+ itemDiv.classList.add("".concat(this.cssPrefix, "-itemDiv-hasChildren"));
432
+ var arrowSpan = document.createElement('span');
433
+ arrowSpan.classList.add("".concat(this.cssPrefix, "-itemDiv-arrow"));
434
+ itemDiv.appendChild(arrowSpan);
435
+ var arrowText = document.createTextNode('>');
436
+ arrowSpan.appendChild(arrowText);
437
+ }
438
+ var itemClickHandler = function (ev) {
439
+ var menuItem = _this.getMenuItem(ev.target);
440
+ if (multiselect) {
441
+ if (!menuItem.items || ev.target == menuItem.itemCheckbox) {
442
+ var itemSelected = _this.isItemSelected(menuItem);
443
+ _this.setItemSelected(menuItem, !itemSelected);
444
+ menuItem.itemCheckbox.checked = !itemSelected;
445
+ _this.parentMenu.refreshCheckboxes();
446
+ }
447
+ else {
448
+ _this.activateItem(menuItem);
449
+ }
450
+ }
451
+ else {
452
+ _this.activateItem(menuItem);
453
+ _this.submit(menuItem);
454
+ }
455
+ return false;
456
+ };
457
+ itemDiv.removeEventListener("click", itemClickHandler);
458
+ itemDiv.addEventListener('click', itemClickHandler);
459
+ itemDiv.addEventListener('mouseenter', function (ev) {
460
+ var item = _this.getMenuItem(ev.target);
461
+ _this.parentMenu.isCursorInside = true;
462
+ if (activateOnMouseOver) {
463
+ _this.activateItem(item);
464
+ }
465
+ });
466
+ itemDiv.addEventListener('mouseleave', function (ev) {
467
+ var item = _this.getMenuItem(ev.target);
468
+ _this.parentMenu.isCursorInside = false;
469
+ setTimeout(function () {
470
+ if (!_this.parentMenu.isCursorInside) {
471
+ if (activateOnMouseOver && item == _this.activeItem && !item.subLevel) {
472
+ _this.deactivateItem(item);
473
+ }
474
+ }
475
+ }, 200);
476
+ });
477
+ }
478
+ if (this.itemRenderedCallback) {
479
+ this.itemRenderedCallback(this.menuId, itemDiv);
480
+ }
481
+ }
482
+ };
483
+ MenuLevel.prototype.renderItemsWithFilter = function (filter) {
484
+ this.isFilteringMode = true;
485
+ var scrollDiv = this.scrollDiv;
486
+ scrollDiv.innerHTML = "";
487
+ var filterSections = filter.split('>');
488
+ var pureFilterTexts = filterSections.map(function (section) { return section.replace(/\*/g, ''); });
489
+ var items = this.filterItems(this.items, filterSections);
490
+ this.filteredItems = [];
491
+ for (var i = 0; i < items.length; i++) {
492
+ this.renderItemWithFilter(items[i], pureFilterTexts, 0);
493
+ }
494
+ };
495
+ MenuLevel.prototype.matchesFilter = function (text, regexp) {
496
+ if (text && regexp) {
497
+ return regexp.test(text);
498
+ }
499
+ else {
500
+ return true;
501
+ }
502
+ };
503
+ MenuLevel.prototype.filterItems = function (items, filterSections) {
504
+ var resultItems = [];
505
+ var filter = filterSections.length > 0 ? filterSections[0] : '';
506
+ var restFilterSections = filterSections.length > 1 ? filterSections.slice(1) : filterSections;
507
+ var filterRegexp = filter ? new RegExp(filter.replace(/\*/g, '.+?'), 'i') : null;
508
+ for (var i = 0; i < items.length; i++) {
509
+ var item = items[i];
510
+ if (item.items) {
511
+ var groupItem = dataUtils.assign({}, item);
512
+ var groupItemMatches = this.matchesFilter(item.text, filterRegexp);
513
+ //if we have only one filter section (or an empty filter)
514
+ if (filterSections.length < 2) {
515
+ //if current group item matches the filter -> show all sub-items
516
+ if (groupItemMatches && filterSections.length < 2) {
517
+ groupItem.items = dataUtils.createArrayFrom(item.items);
518
+ }
519
+ else {
520
+ groupItem.items = this.filterItems(item.items, restFilterSections);
521
+ }
522
+ }
523
+ //if we have more than 1 filter section and there is a match -> filter sub-items as well
524
+ else if (groupItemMatches) {
525
+ groupItem.items = this.filterItems(item.items, restFilterSections);
526
+ }
527
+ //otherwise we skip this group at all
528
+ else {
529
+ groupItem.items = [];
530
+ }
531
+ if (groupItem.items.length > 0) {
532
+ resultItems.push(groupItem);
533
+ }
534
+ }
535
+ else {
536
+ if (this.matchesFilter(item.text, filterRegexp)) {
537
+ resultItems.push(item);
538
+ }
539
+ }
540
+ }
541
+ return resultItems;
542
+ };
543
+ MenuLevel.prototype.renderItemWithFilter = function (item, filterTexts, level) {
544
+ var _this = this;
545
+ var scrollDiv = this.scrollDiv;
546
+ var levelFilterText = level < filterTexts.length ? filterTexts[level] : filterTexts[filterTexts.length - 1];
547
+ var multiselect = this.parentMenu.options.multiselect;
548
+ var activateOnMouseOver = this.parentMenu.options.activateOnMouseOver;
549
+ var itemFgColor = this.parentMenu.style.colors.fgON || 'black';
550
+ var itemOverBgColor = this.parentMenu.style.colors.bgOVER || 'LightSteelBlue';
551
+ var itemFontSize = this.parentMenu.style.itemStyle.fontSize || '14px';
552
+ var itemFilterCallback = this.parentMenu.getItemFilterCallback();
553
+ if (!item || !item.text)
554
+ return;
555
+ if (itemFilterCallback) {
556
+ if (!itemFilterCallback(item))
557
+ return;
558
+ if (item.items && this.allSubitemsAreFiltered(item.items, itemFilterCallback))
559
+ return;
560
+ }
561
+ item.data = function (propName) {
562
+ return this[propName];
563
+ };
564
+ if (typeof (item.selected) == "undefined") {
565
+ item.selected = false;
566
+ }
567
+ if (item.selected && this.selectedItem == null) {
568
+ this.selectedItem = item;
569
+ }
570
+ var itemDiv = document.createElement("div");
571
+ domel(itemDiv)
572
+ .addClass("".concat(this.cssPrefix, "-itemDiv"))
573
+ .addClass(browserUtils.getMobileCssClass());
574
+ itemDiv.style.marginLeft = "".concat(level * 10, "px");
575
+ if (item.selected && !multiselect) {
576
+ itemDiv.classList.add("".concat(this.cssPrefix, "-selected"));
577
+ }
578
+ ;
579
+ if (this.domWriteItemsId && this.menuId) {
580
+ itemDiv.id = 'item-' + this.menuId + '-' + item.id;
581
+ }
582
+ scrollDiv.appendChild(itemDiv);
583
+ itemDiv['menuItem'] = item;
584
+ itemDiv['menuLevel'] = this;
585
+ item.itemDiv = itemDiv;
586
+ if (this.parentMenu.options.useDefaultStyles) {
587
+ itemDiv.style.fontSize = itemFontSize;
588
+ itemDiv.style.color = itemFgColor;
589
+ itemDiv.style.paddingLeft = "15px";
590
+ itemDiv.style.paddingRight = "6px";
591
+ itemDiv.style.cursor = "pointer";
592
+ }
593
+ if (item.text == '---') {
594
+ itemDiv.appendChild(document.createElement('hr'));
595
+ }
596
+ else {
597
+ if (multiselect) {
598
+ var cb = document.createElement("input");
599
+ cb.type = "checkbox";
600
+ cb.id = "cb" + item.id;
601
+ cb.checked = this.isItemSelected(item);
602
+ cb.defaultChecked = this.isItemSelected(item);
603
+ itemDiv.appendChild(cb);
604
+ item.itemCheckbox = cb;
605
+ if (this.parentMenu.options.useDefaultStyles) {
606
+ cb.style.margin = "4px 10px 0 0";
607
+ cb.style.verticalAlign = "top";
608
+ }
609
+ }
610
+ var itemText = document.createElement('span');
611
+ itemText.innerHTML = this.highlightText(item.text, levelFilterText);
612
+ itemDiv.appendChild(itemText);
613
+ if (item.items && item.items.length > 0) {
614
+ itemDiv.classList.add("".concat(this.cssPrefix, "-itemDiv-filter-hasChildren"));
615
+ }
616
+ else {
617
+ this.filteredItems.push(item);
618
+ var itemClickHandler = function (event) {
619
+ if (multiselect) {
620
+ if (!item.items || event.target == item.itemCheckbox) {
621
+ var itemSelected = _this.isItemSelected(item);
622
+ _this.setItemSelected(item, !itemSelected);
623
+ item.itemCheckbox.checked = !itemSelected;
624
+ _this.parentMenu.refreshCheckboxes();
625
+ }
626
+ else {
627
+ _this.activateItem(item);
628
+ }
629
+ }
630
+ else {
631
+ _this.activateItem(item);
632
+ _this.submit(item);
633
+ }
634
+ return false;
635
+ };
636
+ itemDiv.removeEventListener("click", itemClickHandler);
637
+ itemDiv.addEventListener('click', itemClickHandler);
638
+ itemDiv.addEventListener('mouseenter', function (ev) {
639
+ ;
640
+ _this.parentMenu.isCursorInside = true;
641
+ if (activateOnMouseOver) {
642
+ _this.activateItem(item);
643
+ }
644
+ });
645
+ itemDiv.addEventListener('mouseleave', function (ev) {
646
+ _this.parentMenu.isCursorInside = false;
647
+ setTimeout(function () {
648
+ if (!_this.parentMenu.isCursorInside) {
649
+ if (activateOnMouseOver && item == _this.activeItem && !item.subLevel) {
650
+ _this.deactivateItem(item);
651
+ }
652
+ }
653
+ }, 200);
654
+ });
655
+ }
656
+ }
657
+ if (item.items) {
658
+ for (var i = 0; i < item.items.length; i++) {
659
+ this.renderItemWithFilter(item.items[i], filterTexts, level + 1);
660
+ }
661
+ }
662
+ if (this.itemRenderedCallback) {
663
+ this.itemRenderedCallback(this.menuId, itemDiv);
664
+ }
665
+ };
666
+ MenuLevel.prototype.highlightText = function (content, text) {
667
+ if (text && text.length > 0) {
668
+ var lowerText = text.toLowerCase();
669
+ var lowerContent = content.toLowerCase();
670
+ var insertValue1 = "<span class='eqjs-menu-itemDiv-highlight'>";
671
+ var insertValue2 = "</span>";
672
+ var startIndex = lowerContent.indexOf(lowerText);
673
+ if (startIndex >= 0) {
674
+ var pos = 0;
675
+ var value = content;
676
+ var indexInMas = [];
677
+ while (true) {
678
+ var index = lowerContent.indexOf(lowerText, pos);
679
+ if (index >= 0) {
680
+ indexInMas.push(index);
681
+ pos = index + text.length;
682
+ }
683
+ else {
684
+ pos++;
685
+ }
686
+ if (pos >= value.length - 1) {
687
+ break;
688
+ }
689
+ }
690
+ if (indexInMas.length > 0) {
691
+ content = '';
692
+ for (var i = 0; i < indexInMas.length; i++) {
693
+ if (i === 0) {
694
+ content += value.substring(0, indexInMas[i]);
695
+ }
696
+ content += insertValue1 + value.substring(indexInMas[i], indexInMas[i] + text.length) + insertValue2;
697
+ if (i < indexInMas.length - 1) {
698
+ content += value.substring(indexInMas[i] + text.length, indexInMas[i + 1]);
699
+ }
700
+ else {
701
+ content += value.substring(indexInMas[i] + text.length);
702
+ }
703
+ }
704
+ }
705
+ }
706
+ }
707
+ return content;
708
+ };
709
+ MenuLevel.prototype.renderItems = function (filter) {
710
+ if (!filter && !browserUtils.isMobileMode()) {
711
+ this.renderItemsWithoutFilter();
712
+ }
713
+ else {
714
+ filter = filter || '';
715
+ this.renderItemsWithFilter(filter.toLowerCase());
716
+ }
717
+ };
718
+ MenuLevel.prototype.activateItem = function (menuItem, openSubLevel) {
719
+ if (openSubLevel === void 0) { openSubLevel = true; }
720
+ if (this.activeItem != null) {
721
+ this.deactivateItem(this.activeItem);
722
+ }
723
+ this.activeItem = menuItem;
724
+ var rowElement = menuItem.itemDiv;
725
+ rowElement.classList.add('active');
726
+ if (this.parentMenu.options.useDefaultStyles) {
727
+ var itemBgColor = this.parentMenu.style.colors.bgON;
728
+ var itemFgColor = this.parentMenu.style.colors.fgON;
729
+ var itemOverBgColor = this.parentMenu.style.colors.bgOVER;
730
+ var itemOverFgColor = this.parentMenu.style.colors.fgOVER || "";
731
+ var itemClass = this.parentMenu.style.itemClass || "";
732
+ var itemClassOver = this.parentMenu.style.itemClassOver || "";
733
+ if (itemClassOver != "") {
734
+ rowElement.style.backgroundColor = "";
735
+ rowElement.style.color = "";
736
+ }
737
+ else {
738
+ rowElement.style.backgroundColor = itemOverBgColor;
739
+ rowElement.style.color = itemOverFgColor;
740
+ }
741
+ }
742
+ if (menuItem.items && !this.isFilteringMode && openSubLevel) {
743
+ this.showSubLevel(menuItem);
744
+ }
745
+ };
746
+ MenuLevel.prototype.deactivateItem = function (menuItem) {
747
+ if (!menuItem)
748
+ return;
749
+ var rowElement = menuItem.itemDiv;
750
+ rowElement.classList.remove('active');
751
+ if (this.parentMenu.options.useDefaultStyles) {
752
+ var itemBgColor = this.parentMenu.style.colors.bgON;
753
+ var itemFgColor = this.parentMenu.style.colors.fgON;
754
+ var itemClass = this.parentMenu.style.itemClass || "";
755
+ if (itemClass != "") {
756
+ rowElement.style.backgroundColor = "";
757
+ rowElement.style.color = "";
758
+ }
759
+ else {
760
+ rowElement.style.backgroundColor = itemBgColor;
761
+ rowElement.style.color = itemFgColor;
762
+ }
763
+ }
764
+ if (menuItem.subLevel) {
765
+ menuItem.subLevel.hide();
766
+ }
767
+ this.activeItem = null;
768
+ };
769
+ MenuLevel.prototype.showSubLevel = function (menuItem) {
770
+ if (!menuItem.subLevel) {
771
+ var levelId = '';
772
+ if (this.menuId) {
773
+ levelId = this.menuId + "-" + menuItem.id;
774
+ }
775
+ menuItem.subLevel = new MenuLevel({
776
+ showSelected: this.showSelected,
777
+ menu: this.parentMenu,
778
+ parent: this,
779
+ container: this.parentElement,
780
+ items: menuItem.items,
781
+ levelIndex: this.levelIndex + 1,
782
+ domWriteItemsId: this.domWriteItemsId,
783
+ menuId: levelId,
784
+ itemRenderedCallback: this.itemRenderedCallback
785
+ });
786
+ }
787
+ var pos = getElementAbsolutePos(menuItem.itemDiv);
788
+ var scroll = getScrollPos();
789
+ var winSize = getWinSize();
790
+ //show menu to the side that have more space available
791
+ var leftSpace = pos.x - scroll.left;
792
+ var rightSpace = winSize.width - leftSpace - menuItem.itemDiv.offsetWidth;
793
+ pos.x += menuItem.itemDiv.offsetParent.offsetWidth;
794
+ pos.y += 1;
795
+ menuItem.subLevel.showAt(pos.x, pos.y, true, true);
796
+ menuItem.subLevel.levelDiv.style.width = '';
797
+ menuItem.subLevel.levelDiv.style.right = '';
798
+ if ((rightSpace >= menuItem.subLevel.levelDiv.offsetWidth) || (rightSpace >= leftSpace)) { //show level to the right
799
+ if (rightSpace < menuItem.subLevel.levelDiv.offsetWidth) {
800
+ menuItem.subLevel.levelDiv.style.right = -scroll.left + 'px';
801
+ }
802
+ }
803
+ else { //show level to the left
804
+ if (leftSpace < menuItem.subLevel.levelDiv.offsetWidth) {
805
+ menuItem.subLevel.levelDiv.style.left = scroll.left + 4 + 'px';
806
+ }
807
+ else {
808
+ menuItem.subLevel.levelDiv.style.left = '';
809
+ }
810
+ menuItem.subLevel.levelDiv.style.right = getViewportSize().width - pos.x + menuItem.itemDiv.offsetWidth - 6 + 'px';
811
+ }
812
+ menuItem.subLevel.levelDiv.style.visibility = 'visible';
813
+ menuItem.subLevel.focus();
814
+ };
815
+ MenuLevel.prototype.adjustTopPos = function (top) {
816
+ var winSize = getWinSize();
817
+ var levelBottom = top - getScrollPos().top + this.levelDiv.offsetHeight;
818
+ var res = top;
819
+ if (levelBottom > winSize.height - 5) {
820
+ res -= levelBottom - winSize.height + 5;
821
+ if (res < getScrollPos().top) {
822
+ res = getScrollPos().top + 10;
823
+ }
824
+ }
825
+ return res;
826
+ };
827
+ MenuLevel.prototype.showAt = function (x, y, adjustTopPos, hidden) {
828
+ if (!this.items) {
829
+ return;
830
+ }
831
+ this.initLevelDiv();
832
+ //crocodile
833
+ this.turnCheckboxes(this.items);
834
+ this.renderItems();
835
+ var levelStyle = this.levelDiv.style;
836
+ if (hidden) {
837
+ this.levelDiv.style.visibility = 'hidden';
838
+ }
839
+ levelStyle.display = 'block';
840
+ levelStyle.left = x + 'px';
841
+ levelStyle.top = y + 'px';
842
+ this.scrollDiv.style.width = "auto";
843
+ this.scrollDiv.style.height = "auto";
844
+ //adjusting level top position
845
+ if (adjustTopPos) {
846
+ y = this.adjustTopPos(y);
847
+ levelStyle.top = y + 'px';
848
+ }
849
+ //setting minimal level width if it is defined
850
+ var minItemWidth = this.parentMenu.minItemWidth;
851
+ if (minItemWidth > 0 && this.scrollDiv.offsetWidth < minItemWidth) {
852
+ for (var i = 0; i < this.items.length; i++) {
853
+ this.items[i].itemDiv.style.width = minItemWidth + "px";
854
+ }
855
+ }
856
+ var maxItemWidth = this.parentMenu.maxItemWidth;
857
+ if (maxItemWidth > 0 && this.scrollDiv.offsetWidth > maxItemWidth) {
858
+ for (var i = 0; i < this.items.length; i++) {
859
+ this.items[i].itemDiv.style.width = maxItemWidth + "px";
860
+ this.items[i].itemDiv.style.overflowX = "hidden";
861
+ }
862
+ }
863
+ var winSize = getWinSize();
864
+ //adjustinng maximum height of the menu level if it does not fit to browser window
865
+ var maxHeight = winSize.height - (y - getScrollPos().top) - 15; //document.documentElement.scrollTop
866
+ if (this.parentMenu.maxHeight > 0 && maxHeight > this.parentMenu.maxHeight) {
867
+ maxHeight = this.parentMenu.maxHeight;
868
+ }
869
+ if (this._applyItem != null && this._applyItem.itemDiv != null) {
870
+ maxHeight -= this._applyItem.itemDiv.offsetHeight + 5;
871
+ }
872
+ if (this.searchDiv != null) {
873
+ maxHeight -= this.searchDiv.offsetHeight;
874
+ }
875
+ if (this.closeDiv != null) {
876
+ maxHeight -= this.closeDiv.offsetHeight;
877
+ }
878
+ if (this.levelDiv.offsetHeight > maxHeight) {
879
+ var newHeight = maxHeight;
880
+ if (newHeight < 50) {
881
+ newHeight = 50;
882
+ }
883
+ this.scrollDiv.style.height = newHeight + "px";
884
+ }
885
+ else {
886
+ this.scrollDiv.style.height = "auto";
887
+ }
888
+ this.activeItem = null;
889
+ };
890
+ MenuLevel.prototype.focus = function () {
891
+ var _this = this;
892
+ window.setTimeout(function () {
893
+ _this.scrollDiv.focus();
894
+ if (_this.searchBox != null) {
895
+ if (_this.parentMenu.options.searchBoxAutoFocus) {
896
+ _this.searchBox.focus();
897
+ }
898
+ _this.searchBox.value = "";
899
+ }
900
+ }, 100);
901
+ };
902
+ MenuLevel.prototype.hide = function () {
903
+ if (this.activeItem !== null) {
904
+ if (this.activeItem.subLevel) {
905
+ this.activeItem.subLevel.hide();
906
+ }
907
+ }
908
+ if (this.levelDiv) {
909
+ var levelStyle = this.levelDiv.style;
910
+ levelStyle.display = 'none';
911
+ if (this.initialized) {
912
+ this.parentElement.removeChild(this.levelDiv);
913
+ this.initialized = false;
914
+ }
915
+ }
916
+ };
917
+ MenuLevel.prototype.initLevelDiv = function () {
918
+ if (!this.initialized) {
919
+ this.parentElement.appendChild(this.levelDiv);
920
+ domel(this.levelDiv)
921
+ .addClass("".concat(this.cssPrefix, "-levelDiv"))
922
+ .addClass(browserUtils.getMobileCssClass());
923
+ this.initialized = true;
924
+ }
925
+ };
926
+ MenuLevel.prototype.submit = function (menuItem) {
927
+ if (menuItem != null) {
928
+ if (!menuItem.items) {
929
+ this.parentMenu.hideMenu();
930
+ var selectedItems = [];
931
+ if (menuItem == this._applyItem) {
932
+ this.submitItems(this.items, selectedItems);
933
+ }
934
+ this.parentMenu.submitMenu(menuItem, selectedItems);
935
+ }
936
+ }
937
+ };
938
+ MenuLevel.prototype.remove = function () {
939
+ //remove old level elements
940
+ for (var i = 0; i < this.items.length; i++) {
941
+ var item = this.items[i];
942
+ if (item.subLevel) {
943
+ item.subLevel.remove();
944
+ }
945
+ }
946
+ if (this.levelDiv) {
947
+ this.levelDiv.innerHTML = "";
948
+ var parentNode = this.levelDiv.parentNode;
949
+ if (parentNode != null) {
950
+ parentNode.removeChild(this.levelDiv);
951
+ }
952
+ }
953
+ this.levelDiv = null;
954
+ };
955
+ MenuLevel.prototype.update = function (newItems) {
956
+ this.remove();
957
+ //create new level
958
+ this.items = newItems;
959
+ this.activeItem = null;
960
+ this.selectedItem = null;
961
+ this._applyItem.itemDiv = null;
962
+ this.initialized = false;
963
+ this.updated++;
964
+ this.renderContent();
965
+ };
966
+ MenuLevel.prototype.refreshCheckboxes = function () {
967
+ for (var i = 0; i < this.items.length; i++) {
968
+ var item = this.items[i];
969
+ if (item.itemCheckbox) {
970
+ item.itemCheckbox.checked = this.isItemSelected(item);
971
+ }
972
+ if (item.subLevel) {
973
+ item.subLevel.refreshCheckboxes();
974
+ }
975
+ }
976
+ };
977
+ MenuLevel.prototype.refreshItems = function () {
978
+ for (var i = 0; i < this.items.length; i++) {
979
+ var item = this.items[i];
980
+ if (item.itemDiv) {
981
+ if (item.hidden) {
982
+ item.itemDiv.style.display = "none";
983
+ }
984
+ else {
985
+ item.itemDiv.style.display = "block";
986
+ }
987
+ }
988
+ if (item.subLevel) {
989
+ item.subLevel.refreshItems();
990
+ }
991
+ }
992
+ };
993
+ MenuLevel.prototype.findItem = function (searchedText) {
994
+ var txt = searchedText.toLowerCase();
995
+ for (var i = 0; i < this.items.length; i++) {
996
+ var item = this.items[i];
997
+ if (item.text.toLowerCase().indexOf(txt) == 0) {
998
+ return item;
999
+ }
1000
+ }
1001
+ return null;
1002
+ };
1003
+ return MenuLevel;
1004
+ }());
1005
+ export var PopupMenu = /** @class */ (function () {
1006
+ function PopupMenu(options) {
1007
+ var _this = this;
1008
+ this.isCursorInside = false;
1009
+ this.mouseIsOverBlock = false;
1010
+ this.mouseIsOverLink = false;
1011
+ this.toId = null;
1012
+ this.active = false;
1013
+ this.ancorFocused = null;
1014
+ this.options = {
1015
+ items: [],
1016
+ buttons: {
1017
+ submit: i18n.getText('ButtonApply'),
1018
+ cancel: i18n.getText('ButtonCancel')
1019
+ },
1020
+ itemFilterCallback: null,
1021
+ useDefaultStyles: false,
1022
+ multiselect: false,
1023
+ adjustHeight: true,
1024
+ showSearchBoxAfter: 30,
1025
+ activateOnMouseOver: true,
1026
+ container: document.body,
1027
+ domWriteItemsId: false,
1028
+ itemRenderedCallback: null,
1029
+ showItemIds: false
1030
+ };
1031
+ if (options) {
1032
+ dataUtils.assignDeep(this.options, options);
1033
+ }
1034
+ if (this.options.hideButtons) {
1035
+ this.options.submitOnBlur = true;
1036
+ }
1037
+ this.menuId = PopupMenu.lastMenuID++;
1038
+ this.updateProps();
1039
+ this.rootLevel = new MenuLevel({
1040
+ menu: this,
1041
+ items: this.options.items,
1042
+ levelIndex: 0,
1043
+ container: this.options.container,
1044
+ domWriteItemsId: this.options.domWriteItemsId,
1045
+ menuId: this.options.id,
1046
+ itemRenderedCallback: this.options.itemRenderedCallback,
1047
+ showSelected: this.options.showSelected,
1048
+ });
1049
+ this.rootLevel.levelDiv.classList.add("".concat(this.cssPrefix, "-rootLevel"));
1050
+ if (this.options.zIndex)
1051
+ this.rootLevel.levelDiv.style.zIndex = "".concat(this.options.zIndex);
1052
+ this.menuKeyUpHandler = function (e) {
1053
+ if (e.which == 27) {
1054
+ _this.hideMenu();
1055
+ e.stopImmediatePropagation();
1056
+ }
1057
+ };
1058
+ this.globalMouseDownHandler = function (e) {
1059
+ if (!_this.active)
1060
+ return true;
1061
+ var event = window.event || e;
1062
+ var o = event.srcElement || event.target;
1063
+ var isOutside = true;
1064
+ while (o) {
1065
+ if (o.tagName && o.tagName.toLowerCase() == 'div') {
1066
+ // it is added in renderContent of MenuLevel class
1067
+ if (o.menuLevel) {
1068
+ if (o.menuLevel.parentMenu == _this) {
1069
+ isOutside = false;
1070
+ break;
1071
+ }
1072
+ }
1073
+ }
1074
+ o = o.parentNode || o.parentElement;
1075
+ }
1076
+ if (isOutside) {
1077
+ if (_this.options.submitOnBlur) {
1078
+ _this.rootLevel.submit(_this.rootLevel.applyItem);
1079
+ }
1080
+ _this.hideMenu();
1081
+ }
1082
+ return true;
1083
+ };
1084
+ this.render();
1085
+ }
1086
+ Object.defineProperty(PopupMenu.prototype, "cssPrefix", {
1087
+ get: function () {
1088
+ return 'eqjs-menu';
1089
+ },
1090
+ enumerable: false,
1091
+ configurable: true
1092
+ });
1093
+ PopupMenu.prototype.getItems = function () {
1094
+ return this.rootLevel.getItems();
1095
+ };
1096
+ PopupMenu.prototype.updateProps = function () {
1097
+ this.style = {};
1098
+ this.style.colors = { border: "#666666", shadow: "#888888", bgON: "white", fgON: "black", bgOVER: "#B6BDD2", fgOVER: "black" };
1099
+ this.style.itemStyle = { fontSize: "14px" };
1100
+ this.minItemWidth = 0;
1101
+ this.maxItemWidth = 0;
1102
+ this.maxHeight = 0;
1103
+ this.zIndex = "".concat(this.options.zIndex);
1104
+ this.commandTemplate = "";
1105
+ this.args = [];
1106
+ this.active = false;
1107
+ };
1108
+ PopupMenu.prototype.render = function () {
1109
+ };
1110
+ PopupMenu.prototype.clearItemsMenuProps = function (items) {
1111
+ if (!items)
1112
+ return;
1113
+ for (var i = 0; i < items.length; i++) {
1114
+ this.clearItemMenuProps(items[i]);
1115
+ }
1116
+ };
1117
+ PopupMenu.prototype.clearItemMenuProps = function (item) {
1118
+ //don't clear properties they belong this menu
1119
+ if (item.subLevel && item.subLevel.parentMenu == this)
1120
+ return;
1121
+ if (item.subLevel) {
1122
+ item.subLevel.remove();
1123
+ item.subLevel = null;
1124
+ }
1125
+ if (item.itemDiv) {
1126
+ item.itemDiv = null;
1127
+ }
1128
+ if (item.items) {
1129
+ this.clearItemsMenuProps(item.items);
1130
+ }
1131
+ };
1132
+ PopupMenu.prototype.setSelectedItems = function (items, selectedIds) {
1133
+ var itemsLength = items ? items.length : 0;
1134
+ for (var i = 0; i < itemsLength; i++) {
1135
+ var item = items[i];
1136
+ if (item.items) {
1137
+ this.setSelectedItems(item.items, selectedIds);
1138
+ }
1139
+ else {
1140
+ item.selected = selectedIds.indexOf(item.id) >= 0;
1141
+ }
1142
+ }
1143
+ };
1144
+ PopupMenu.prototype.getRootLevel = function () {
1145
+ return this.rootLevel;
1146
+ };
1147
+ PopupMenu.prototype.getItemFilterCallback = function () {
1148
+ return this.itemFilterCallback;
1149
+ };
1150
+ PopupMenu.prototype.showMenu = function (options) {
1151
+ this.ancorFocused = options.anchor == document.activeElement ? options.anchor : null;
1152
+ this.clearItemsMenuProps(this.options.items);
1153
+ this.itemSelectedCallback = options.itemSelectedCallback || null;
1154
+ this.menuClosedCallback = options.menuClosedCallback || null;
1155
+ this.itemFilterCallback = options.itemFilterCallback || null;
1156
+ if (options.items) {
1157
+ this.options.items = options.items;
1158
+ this.rootLevel.setItems(options.items);
1159
+ }
1160
+ if (options.onMenuItemSelected) {
1161
+ this.options.onMenuItemSelected = options.onMenuItemSelected;
1162
+ }
1163
+ var selectedIds = options.selectedIds || null;
1164
+ if (selectedIds) {
1165
+ if (typeof selectedIds === "string") {
1166
+ selectedIds = selectedIds.split(",");
1167
+ }
1168
+ }
1169
+ else {
1170
+ selectedIds = [];
1171
+ }
1172
+ this.active = true;
1173
+ this.setSelectedItems(this.options.items, selectedIds);
1174
+ if (browserUtils.isMobileMode()) {
1175
+ this.rootLevel.showAt(0, 0, true, true);
1176
+ this.rootLevel.levelDiv.style.top = '0px';
1177
+ this.rootLevel.levelDiv.style.bottom = '0px';
1178
+ this.rootLevel.levelDiv.style.right = '0px';
1179
+ this.rootLevel.levelDiv.style.position = 'fixed';
1180
+ this.rootLevel.levelDiv.style.fontSize = '20px';
1181
+ }
1182
+ else {
1183
+ var anchor = options.anchor || document.documentElement;
1184
+ var srcPos = getElementAbsolutePos(anchor);
1185
+ var anchorHeight = anchor.offsetHeight;
1186
+ var anchorWidth = anchor.offsetWidth;
1187
+ var pos = {
1188
+ x: srcPos.x,
1189
+ y: srcPos.y + anchorHeight + 2
1190
+ };
1191
+ var scroll_1 = getScrollPos();
1192
+ var winSize = getWinSize();
1193
+ //show menu to the side that have more space available
1194
+ var leftSpace = pos.x + anchorWidth - scroll_1.left;
1195
+ var rightSpace = winSize.width - leftSpace + anchorWidth;
1196
+ pos.x += 2;
1197
+ this.rootLevel.showAt(pos.x, pos.y, true, true);
1198
+ this.rootLevel.levelDiv.style.width = '';
1199
+ this.rootLevel.levelDiv.style.right = '';
1200
+ if (!this.rootLevel.levelDiv.style.zIndex) {
1201
+ // z-index is at least 10000 and more if anchor has bigger
1202
+ this.rootLevel.levelDiv.style.zIndex = "".concat(Math.max(10000, findHighestZIndex(anchor) + 1));
1203
+ }
1204
+ if ((rightSpace >= this.rootLevel.levelDiv.offsetWidth) || (rightSpace >= leftSpace)) {
1205
+ //show level to the right
1206
+ if (rightSpace < this.rootLevel.levelDiv.offsetWidth) {
1207
+ this.rootLevel.levelDiv.style.right = -scroll_1.left + 'px';
1208
+ }
1209
+ }
1210
+ else {
1211
+ //show level to the left
1212
+ if (leftSpace < this.rootLevel.levelDiv.offsetWidth) {
1213
+ this.rootLevel.levelDiv.style.left = scroll_1.left + 4 + 'px';
1214
+ }
1215
+ else {
1216
+ this.rootLevel.levelDiv.style.left = '';
1217
+ }
1218
+ this.rootLevel.levelDiv.style.right = getViewportSize().width - pos.x - anchorWidth + 'px';
1219
+ }
1220
+ this.rootLevel.levelDiv.style.fontSize = '14px';
1221
+ }
1222
+ this.rootLevel.levelDiv.style.visibility = 'visible';
1223
+ this.rootLevel.focus();
1224
+ document.addEventListener('keyup', this.menuKeyUpHandler);
1225
+ document.addEventListener('mousedown', this.globalMouseDownHandler, true);
1226
+ };
1227
+ PopupMenu.prototype.hideMenu = function () {
1228
+ document.removeEventListener('mousedown', this.globalMouseDownHandler, true);
1229
+ document.removeEventListener('keyup', this.menuKeyUpHandler);
1230
+ this.rootLevel.hide();
1231
+ if (this.ancorFocused) {
1232
+ this.ancorFocused.focus();
1233
+ }
1234
+ if (this.menuClosedCallback) {
1235
+ this.menuClosedCallback();
1236
+ }
1237
+ };
1238
+ PopupMenu.prototype.submitMenu = function (menuItem, selectedItems) {
1239
+ if (this.itemSelectedCallback) {
1240
+ this.itemSelectedCallback(menuItem, selectedItems);
1241
+ }
1242
+ };
1243
+ PopupMenu.prototype.knockMenuStyle = function (menu) {
1244
+ menu.removeAttribute('style');
1245
+ var ul = menu.querySelectorAll('ul').item(0);
1246
+ var hasUlStyle = ul && ul.style ? true : false;
1247
+ if (hasUlStyle !== false) {
1248
+ ul.setAttribute('style', '');
1249
+ }
1250
+ };
1251
+ PopupMenu.prototype.refreshItems = function () {
1252
+ this.rootLevel.refreshItems();
1253
+ };
1254
+ PopupMenu.prototype.refreshCheckboxes = function () {
1255
+ this.rootLevel.refreshCheckboxes();
1256
+ };
1257
+ PopupMenu.lastMenuID = 0;
1258
+ return PopupMenu;
1259
+ }());
1261
1260
  //# sourceMappingURL=popup_menu.js.map