preview.ui.js 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755
  1. window.afterPageUpdate = function($target, info, options)
  2. {
  3. window.isDropdown = false;
  4. window.lineCount = 1;
  5. window.checkedList = window.initCheckedList();
  6. window.chartList = [];
  7. for(key in chartTypeList) {
  8. chartList.push({value: key, text: chartTypeList[key]});
  9. }
  10. window.filterChecked = {};
  11. if(viewType == 'single')
  12. {
  13. var metricCurrent = $('.metric-tree .metric-current');
  14. if(metricCurrent.length) metricCurrent[0].scrollIntoView({block: 'center', inline: 'start' })
  15. }
  16. if(viewType == 'multiple')
  17. {
  18. window.renderCheckedLabel();
  19. $(window).on('resize', window.renderCheckedLabel);
  20. }
  21. window.addTitle2Star();
  22. window.addDivider();
  23. window.initFilterPanel();
  24. }
  25. window.initCheckedList = function()
  26. {
  27. if(viewType == 'multiple' && (typeof window.checkedList !== 'undefined' && Array.isArray(window.checkedList) && window.checkedList.length > 1))
  28. {
  29. return window.checkedList;
  30. }
  31. else
  32. {
  33. return [{id:current.id + '', name:current.name}];
  34. }
  35. }
  36. window.addTitle2Star = function()
  37. {
  38. $('.metric-collect').attr('title', collectStar);
  39. }
  40. window.addDivider = function()
  41. {
  42. let features = $('#featureBar .nav-feature').find('li.nav-item');
  43. let lastItem = features[features.length - 1];
  44. $(lastItem).addClass('divider-before');
  45. }
  46. /* 事件处理函数。 */
  47. window.handleCheckboxChange = function($el)
  48. {
  49. $el = $($el);
  50. var isChecked = $el.is(":checked");
  51. var value = $el.val();
  52. var text = $el.next().text();
  53. if(!isChecked && window.checkedList.length == 1)
  54. {
  55. $el.prop('checked', true);
  56. return;
  57. }
  58. if(isChecked && window.checkedList.length >= 10)
  59. {
  60. $el.prop('checked', false);
  61. return messagerWarning(maxSelectMsg.replace('%s', maxSelectNum));
  62. }
  63. window.updateCheckAction(value, text, isChecked);
  64. }
  65. window.handleNavMenuClick = function($el)
  66. {
  67. var scope = $el.attr('id');
  68. window.ajaxGetMetrics(scope, '', function(total){
  69. window.deactiveNavMenu();
  70. window.hideFilterPanel();
  71. window.resetFilterPanel();
  72. $el.addClass('active');
  73. $el.append(`<span class="label size-sm rounded-full white">${total}</span>`);
  74. })
  75. }
  76. window.handleFilterCheck = function()
  77. {
  78. window.updateFilterCheck();
  79. }
  80. window.handleFilterToggle = function($el)
  81. {
  82. toggleSearchBtn();
  83. $('.filter-panel').toggleClass('hidden');
  84. }
  85. window.handleFilterClearItem = function($el)
  86. {
  87. $el = $($el);
  88. if(!$el.length) return;
  89. var $checkboxList = $el.closest('.panel').find('.panel-body .check-list-inline .checkbox-primary');
  90. $checkboxList.each(function(index, elem){
  91. $(elem).find('input').prop('checked', false);
  92. });
  93. window.updateFilterCheck();
  94. }
  95. window.handleFilterClearAll = function($el)
  96. {
  97. $el = $($el);
  98. if(!$el.length) return;
  99. var $checkboxList = $el.closest('.panel').find('.panel-body .check-list-inline .checkbox-primary');
  100. $checkboxList.each(function(index, elem){
  101. $(elem).find('input').prop('checked', false);
  102. });
  103. window.updateFilterCheck();
  104. }
  105. window.handleFilterClick = function()
  106. {
  107. var filterBase64 = btoa(JSON.stringify(window.filterChecked));
  108. if(viewType == 'multiple')
  109. {
  110. window.ajaxGetMetrics('filter', filterBase64, function(total)
  111. {
  112. window.deactiveNavMenu();
  113. $('.side-title').text(filterLang.filterTotal.replace('%s', total));
  114. });
  115. return;
  116. }
  117. loadPage($.createLink('metric', 'preview', 'scope=filter&viewType=' + viewType + '&metricID=0&filtersBase64=' + filterBase64));
  118. }
  119. window.handleChartTypeChange = function(metricID, viewType = 'single')
  120. {
  121. if(viewType == 'single')
  122. {
  123. var chartType = $('[name=chartType]').val();
  124. }
  125. else
  126. {
  127. var chartType = $('#metricBox' + metricID).find('[name=chartType]').val();
  128. }
  129. var $form = $('#queryForm' + metricID);
  130. var formData = window.getFormData($form);
  131. $.post($.createLink('metric', 'ajaxGetEchartsOptions', 'metricID=' + metricID + '&chartType=' + chartType), formData, function(resp)
  132. {
  133. var options = JSON.parse(resp);
  134. if(!options) return;
  135. window.renderChart(metricID, viewType, options);
  136. });
  137. }
  138. window.handleRemoveLabel = function(id)
  139. {
  140. var checkedItem = window.checkedList.find(function(checked){return checked.id == id});
  141. if(!checkedItem) return;
  142. window.updateCheckAction(checkedItem.id, checkedItem.name, false);
  143. }
  144. window.handleDateLabelClick = function(evt)
  145. {
  146. $form = $(evt).closest('form');
  147. $form.find('.query-date button.btn').removeClass('selected');
  148. $form.find('.query-date-picker input[name="dateBegin"]').zui('datepicker').$.setValue('');
  149. $form.find('.query-date-picker input[name="dateEnd"]').zui('datepicker').$.setValue('');
  150. $(evt).addClass('selected');
  151. }
  152. window.handleCalcDateClick = function(evt)
  153. {
  154. $form = $(evt).closest('form');
  155. $form.find('.query-calc-date button.btn').removeClass('selected');
  156. $(evt).addClass('selected');
  157. }
  158. window.handleDatePickerChange = function(evt)
  159. {
  160. $form = $(evt).closest('form');
  161. var dateBegin = $form.find('.query-date-picker input[name="dateBegin"]').zui('datepicker').$.value;
  162. var dateEnd = $form.find('.query-date-picker input[name="dateEnd"]').zui('datepicker').$.value;
  163. if(dateBegin.length && dateEnd.length)
  164. {
  165. $form.find('.query-date button.btn').removeClass('selected');
  166. }
  167. }
  168. /* 事件处理函数结束。 */
  169. window.isMetricChecked = function(id)
  170. {
  171. return window.checkedList.filter(function(metric){return metric.id == id}).length != 0;
  172. }
  173. window.updateCheckList = function(id, name, isChecked)
  174. {
  175. if(isChecked)
  176. {
  177. return window.checkedList.push({id: id, name: name});
  178. }
  179. window.checkedList = window.checkedList.filter(function(item){return item.id != id});
  180. }
  181. window.updateCheckAction = function(id, name, isChecked)
  182. {
  183. window.updateCheckList(id, name, isChecked);
  184. window.updateCheckbox(id, isChecked);
  185. window.renderCheckedLabel();
  186. window.updateMetricBoxs(id, isChecked);
  187. }
  188. window.ajaxGetMetrics = function(scope, filters = '', callback)
  189. {
  190. $.get($.createLink('metric', 'ajaxGetMetrics', 'scope=' + scope + '&filters=' + filters), function(resp){
  191. var metrics = JSON.parse(resp);
  192. var total = metrics.length;
  193. var checked = window.checkedList.map(obj => obj.id).join(',');
  194. var url = $.createLink('metric', 'ajaxGetMetricSideTree', 'scope=' + scope + '&checkedList=' + checked + '&filters=' + filters);
  195. $('.side .metric-tree').empty();
  196. loadTarget(url, '.side .metric-tree');
  197. if(typeof callback == 'function') callback(total);
  198. });
  199. }
  200. window.updateFilterCheck = function()
  201. {
  202. var selector = '.filter-panel .panel-body .check-list-inline .checkbox-primary input:checked';
  203. window.filterChecked = {'scope': [], 'object': [], 'purpose': []};
  204. var hasChecked = false;
  205. $(selector).each(function(index, elem){
  206. var name = $(elem).attr('name');
  207. var value = $(elem).val();
  208. window.filterChecked[name].push(value);
  209. hasChecked = true;
  210. });
  211. if(!hasChecked)
  212. {
  213. $('.filter-btn .common').removeClass('hidden');
  214. $('.filter-btn .checked').addClass('hidden');
  215. return;
  216. }
  217. $('.filter-btn .common').addClass('hidden');
  218. $('.filter-btn .checked').removeClass('hidden');
  219. var checkedInfo = filterLang.checkedInfo;
  220. checkedInfo = checkedInfo.replace('%s', window.filterChecked.scope.length);
  221. checkedInfo = checkedInfo.replace('%s', window.filterChecked.object.length);
  222. checkedInfo = checkedInfo.replace('%s', window.filterChecked.purpose.length);
  223. $('.filter-btn .checked').text(checkedInfo);
  224. }
  225. window.resetFilterPanel = function()
  226. {
  227. var $checkboxList = $('.filter-panel .panel').find('.panel-body .check-list-inline .checkbox-primary');
  228. $checkboxList.each(function(index, elem){
  229. $(elem).find('input').prop('checked', false);
  230. });
  231. window.updateFilterCheck();
  232. $('.side-title').text(metricListLang);
  233. }
  234. window.initFilterPanel = function()
  235. {
  236. if(!$('.filter-panel').length) return;
  237. $('#mainMenu').after($('.filter-panel'));
  238. toggleSearchBtn(true);
  239. if(scope == 'filter')
  240. {
  241. toggleSearchBtn(false);
  242. $('.filter-panel').removeClass('hidden');
  243. window.updateFilterCheck();
  244. }
  245. else
  246. {
  247. window.hideFilterPanel();
  248. }
  249. }
  250. window.getMetricRecordType = function(recordRow)
  251. {
  252. if(!recordRow) return false;
  253. var type = [];
  254. if(recordRow.scope) type.push('scope');
  255. if(recordRow.date) type.push('date');
  256. if(type.length == 0) type.push('system');
  257. return type.join('-');
  258. }
  259. window.renderChart = function(metricID, viewType, options)
  260. {
  261. var $currentBox = $('#metricBox' + metricID);
  262. if(viewType == 'single') $currentBox = $('.table-and-chart-single');
  263. if(!$currentBox.find('.chart').length) return;
  264. var classes = viewType == 'single' ? 'chart chart-single' : 'chart chart-multiple';
  265. $currentBox.find('.chart').remove();
  266. $currentBox.find('.chart-side').append('<div class="' + classes + '"></div>');
  267. window.renderEchart($currentBox.find('.chart')[0], options);
  268. }
  269. window.renderEchart = function($obj, option)
  270. {
  271. $.getLib(config.webRoot + 'js/echarts/echarts.common.min.js', {root: false}, function() {
  272. var myChart = echarts.init($obj);
  273. option && myChart.setOption(option);
  274. });
  275. }
  276. window.setDropDown = function()
  277. {
  278. var $drop = $('.dropdown-icon');
  279. $drop.toggleClass('rotate');
  280. if($drop.hasClass('rotate'))
  281. {
  282. window.isDropdown = true;
  283. window.unfoldContent();
  284. }
  285. else
  286. {
  287. window.isDropdown = false;
  288. window.foldContent();
  289. }
  290. }
  291. window.unfoldContent = function()
  292. {
  293. var $content = $('.checked-content');
  294. var contentHeight = 48 + (window.lineCount - 1) * 40;
  295. $content.height(contentHeight);
  296. window.setMultiTableHeight(contentHeight);
  297. setTimeout(function(){
  298. $content.find('.gray-next').addClass('gray-visible');
  299. $content.find('.gray-next').removeClass('gray-hidden');
  300. }, 300);
  301. }
  302. window.foldContent = function()
  303. {
  304. var $content = $('.checked-content');
  305. var contentHeight = 48;
  306. $content.height(contentHeight);
  307. window.setMultiTableHeight(contentHeight);
  308. $content.find('.gray-next').addClass('gray-hidden');
  309. $content.find('.gray-next').removeClass('gray-visible');
  310. }
  311. window.updateMetricBoxs = function(id, isChecked)
  312. {
  313. if(!isChecked)
  314. {
  315. $('#metricBox' + id).remove();
  316. $('.table-and-charts').first().find('.metric-name').removeClass('metric-name-notfirst');
  317. }
  318. else
  319. {
  320. window.appendMetricBox(id);
  321. }
  322. }
  323. /**
  324. * 多选添加一个度量项到展示区。
  325. * Add a metricBox.
  326. *
  327. * @access public
  328. * @return void
  329. */
  330. window.appendMetricBox = function(id, mode = 'add')
  331. {
  332. var url = $.createLink('metric', 'ajaxGetMultipleMetricBox', 'metricID=' + id);
  333. var metricDom = $('<div>');
  334. var metricID = 'metricBox' + id;
  335. metricDom.attr('id', metricID);
  336. metricDom.attr('metric-id', id);
  337. metricDom.addClass('metricBox');
  338. $('.table-and-charts').append(metricDom);
  339. loadTarget(url, metricID);
  340. }
  341. window.handleQueryClick = function(id, viewType = 'single')
  342. {
  343. var $form = $('#queryForm' + id);
  344. var check = window.validateForm($form);
  345. if(!check) return;
  346. var formData = window.getFormData($form);
  347. var scopeValue = formData.get('scope') === null ? '' : formData.get('scope');
  348. var calcDate = formData.get('calcDate') === null ? '' : formData.get('calcDate');
  349. var dateBegin = formData.get('dateBegin') === null ? '' : formData.get('dateBegin').replace(/-/g, '_');
  350. var dateEnd = formData.get('dateEnd') === null ? '' : formData.get('dateEnd').replace(/-/g, '_');
  351. $.post($.createLink('metric', 'ajaxGetTableAndCharts', 'metricID=' + id + '&scope=' + scopeValue + '&calcDate=' + calcDate + '&dateBegin=' + dateBegin + '&dateEnd=' + dateEnd + '&viewType=' + viewType), formData, function(resp)
  352. {
  353. if(viewType == 'multiple')
  354. {
  355. $('#metricBox' + id).find('.table-and-chart').replaceWith(resp);
  356. }
  357. else
  358. {
  359. $('.table-and-chart-single').replaceWith(resp);
  360. }
  361. });
  362. }
  363. window.validateForm = function($form)
  364. {
  365. var formSerialize = $form.serialize();
  366. var formObj = window.parseSerialize(formSerialize);
  367. var dateBegin = formObj.dateBegin?.length ? new Date(formObj.dateBegin) : false;
  368. var dateEnd = formObj.dateEnd?.length ? new Date(formObj.dateEnd) : false;
  369. if(dateBegin && dateEnd && dateBegin > dateEnd)
  370. {
  371. zui.Messager.show(errorDateRange, {type: 'danger', time: 2000});
  372. return false;
  373. }
  374. return true;
  375. }
  376. window.getFormData = function($form)
  377. {
  378. var $dateBegin = $form.find('.query-date-picker input[name="dateBegin"]');
  379. var $dateEnd = $form.find('.query-date-picker input[name="dateEnd"]');
  380. var $selectedDate = $form.find('.query-date button.selected');
  381. var dateBeginValue = $dateBegin.length ? $dateBegin.zui('datepicker').$.value : '';
  382. var dateEndValue = $dateEnd.length ? $dateEnd.zui('datepicker').$.value : '';
  383. if(!$selectedDate.length && $dateBegin.length && $dateEnd.length && (!dateBeginValue.length || !dateEndValue.length))
  384. {
  385. var buttons = $form.find('.query-date button');
  386. $(buttons[0]).addClass('selected');
  387. $form.find('.query-date-picker input[name="dateBegin"]').zui('datepicker').$.setValue('');
  388. $form.find('.query-date-picker input[name="dateEnd"]').zui('datepicker').$.setValue('');
  389. }
  390. var formSerialize = $form.serialize();
  391. var formObj = window.parseSerialize(formSerialize);
  392. var formData = new FormData();
  393. for(var key in formObj)
  394. {
  395. var value = formObj[key];
  396. if(key.startsWith('scope')) key = 'scope';
  397. formData.append(key, value);
  398. }
  399. if($selectedDate.length)
  400. {
  401. formData.append('dateLabel', $selectedDate.attr('key'));
  402. formData.delete('dateBegin');
  403. formData.delete('dateEnd');
  404. }
  405. var $calcDate = $form.find('.query-calc-date button.selected');
  406. if($calcDate.length)
  407. {
  408. formData.append('calcDate', $calcDate.attr('key'));
  409. }
  410. return formData;
  411. }
  412. window.collectMetric = function(id)
  413. {
  414. $.get($.createLink('metric', 'ajaxCollectMetric', 'metricID=' + id), function(resp)
  415. {
  416. var result = JSON.parse(resp);
  417. $('.metric-collect-' + id).find('i').attr('class', result.collect ? 'icon icon-star star' : 'icon icon-star-empty star-empty');
  418. });
  419. }
  420. window.handleSidebarToggle = function(status)
  421. {
  422. setTimeout(function(){
  423. $('.chart-side .chart').children().each(function(index, elem){
  424. var chart = $(elem).zui().chart;
  425. if(!chart) return;
  426. chart.resize();
  427. });
  428. }, 300);
  429. }
  430. window.renderCheckedLabel = function()
  431. {
  432. var $content = $('.picker-multi-selections');
  433. if(!$content.length) return;
  434. $content.empty();
  435. var tpl = $('#item-tpl').html();
  436. var labels = JSON.parse(JSON.stringify(window.checkedList));
  437. var multi = labels.length > 1;
  438. var width = Math.floor($content.width());
  439. var left = width;
  440. // 当nextLine 在left <= 0 中置true后,代表接下来的元素都是换行的
  441. var nextLine = false;
  442. var lineCount = 1;
  443. for(var i = 0; i < labels.length; i++)
  444. {
  445. var classes = 'picker-multi-selection';
  446. if(nextLine) classes += ' gray-next';
  447. var label = labels[i];
  448. var data = {
  449. id: label.id,
  450. name: label.name,
  451. spanClass: classes,
  452. multiple: multi ? '' : 'hidden',
  453. };
  454. var html = $(zui.formatString(tpl, data));
  455. $content.append(html);
  456. var $label = $content.find('[metric-id="' + label.id + '"]');
  457. var labelWidth = $label.width();
  458. var labelLeft = parseInt($label.css('padding-left')) + parseInt($label.css('margin-left'));
  459. var labelRight = parseInt($label.css('padding-right')) + parseInt($label.css('margin-right'));
  460. var labelWidth = Math.ceil(labelWidth + labelLeft + labelRight + 2);
  461. left = left - labelWidth;
  462. if(left <= 0)
  463. {
  464. var $div = $label.find('.text');
  465. var divWidth = $div.width();
  466. if(divWidth < -left)
  467. {
  468. // 如果剩下的空间一点字都显示不下了,就换行
  469. left = width - labelWidth;
  470. // 如果列表是折叠的还没判定换行但是这一行一点字都显示不下,从这里加next类
  471. if(!nextLine) $label.addClass('gray-next');
  472. // 此时已经换行了,行数加1
  473. lineCount ++;
  474. }
  475. else
  476. {
  477. // 通过设置div的宽度,减少文字的内容
  478. $div.width(Math.floor($div.width()) - Math.ceil(-left) - 1);
  479. // 换行了,重置left
  480. left = width;
  481. // 如果这个元素后面还有元素,说明行数要+1
  482. if(i + 1 < labels.length) lineCount ++;
  483. }
  484. nextLine = true;
  485. }
  486. }
  487. $(".metric-remove").addClass('hidden');
  488. $('.details').removeClass('details-after');
  489. if(!multi)
  490. {
  491. var maxSelectTipText = maxSelectTip.replace('%s', maxSelectNum);
  492. $content.append(`<span class="label ghost">${maxSelectTipText}</span>`);
  493. }
  494. else
  495. {
  496. $(".metric-remove").removeClass('hidden');
  497. $('.details').addClass('details-after');
  498. }
  499. if(!window.isDropdown) $content.find('.gray-next').addClass('gray-hidden');
  500. $('.dropdown-icon').addClass('visibility-hidden');
  501. if(lineCount >= 2) $('.dropdown-icon').removeClass('visibility-hidden');
  502. var contentHeight = 48 + (lineCount - 1) * 40;
  503. if(window.lineCount != lineCount && window.isDropdown)
  504. {
  505. // 在展开状态缩放到只有一行了
  506. if(lineCount == 1)
  507. {
  508. $('.dropdown-icon').toggleClass('rotate');
  509. window.isDropdown = false;
  510. window.foldContent();
  511. }
  512. // 在展开状态多了若干行, 或者少了若干行
  513. else
  514. {
  515. $('.checked-content').height(contentHeight);
  516. window.setMultiTableHeight(contentHeight);
  517. }
  518. }
  519. window.lineCount = lineCount;
  520. $('.checked-tip').html(selectCount.replace('%s', labels.length));
  521. }
  522. /* 纯函数 */
  523. window.renderHeight = function()
  524. {
  525. return $('.table-side').height();
  526. }
  527. window.parseSerialize = function(serialize)
  528. {
  529. var result = {};
  530. serialize = serialize.replaceAll('%5B%5D', '');
  531. var items = serialize.split('&');
  532. for(var i = 0; i < items.length; i++)
  533. {
  534. var item = items[i].split('=');
  535. var key = item[0];
  536. var value = item[1];
  537. if(!result[key]) result[key] = [];
  538. if(key.startsWith('scope'))
  539. {
  540. result[key].push(value);
  541. }
  542. else
  543. {
  544. result[key] = value;
  545. }
  546. }
  547. return result;
  548. }
  549. window.generateCheckItem = function(text, value, scope, isChecked)
  550. {
  551. var checked = isChecked ? 'checked=""' : '';
  552. var currentClass = isChecked ? 'metric-current' : '';
  553. return `<div class="font-medium checkbox-primary ${currentClass}">
  554. <input type="checkbox" id="metric${value}" name="metric" ${checked} value="${value}" scope="${scope}" onchange="window.handleCheckboxChange(this)">
  555. <label for="metric${value}">${text}</label>
  556. </div>`;
  557. }
  558. window.messagerWarning = function(message)
  559. {
  560. return zui.Messager.show({
  561. content: message,
  562. icon: 'icon-exclamation-pure',
  563. iconClass: 'center w-6 h-6 rounded-full m-0 warning',
  564. contentClass: 'text-lg font-bold',
  565. close: false,
  566. className: 'p-6 bg-white text-black gap-2 messager-fail',
  567. });
  568. }
  569. window.getTableHeight = function(actual)
  570. {
  571. return Math.min(800, $('.table-side').height());
  572. }
  573. window.setMultiTableHeight = function(contentHeight)
  574. {
  575. $('.table-and-charts').css('max-height', 'calc(100% - ' + contentHeight + 'px)');
  576. }
  577. window.updateCheckbox = function(id, isChecked)
  578. {
  579. var $el = $('.side .metric-tree .check-list input#metric' + id);
  580. $el.prop('checked', isChecked);
  581. if(isChecked)
  582. {
  583. return $el.closest('.checkbox-primary').addClass('metric-current');
  584. }
  585. $el.closest('.checkbox-primary').removeClass('metric-current');
  586. }
  587. window.genDataZoom = function(dataLength, initZoom = 10, axis = 'x')
  588. {
  589. var percent = initZoom / dataLength * 100;
  590. percent = percent > 100 ? 100 : percent;
  591. var dataZoom = {
  592. start: 0,
  593. end: percent,
  594. };
  595. if(axis == 'x') dataZoom.xAxisIndex = [0];
  596. if(axis == 'y') dataZoom.yAxisIndex = [0];
  597. return [dataZoom];
  598. }
  599. window.hideFilterPanel = function()
  600. {
  601. toggleSearchBtn(false);
  602. $('.filter-panel').addClass('hidden');
  603. }
  604. window.deactiveNavMenu = function()
  605. {
  606. var itemSelector = 'menu.nav-ajax .nav-item a';
  607. $(itemSelector).removeClass('active');
  608. $(itemSelector).find('span.label').remove();
  609. }
  610. window.toggleSearchBtn = function(active = null)
  611. {
  612. if(active === null)
  613. {
  614. $('.filter-btn').toggleClass('ring-primary');
  615. $('.icon-search').toggleClass('text-primary');
  616. $('.filter-btn-text').toggleClass('text-primary');
  617. }
  618. else
  619. {
  620. if(active)
  621. {
  622. $('.filter-btn').addClass('ring-primary');
  623. $('.icon-search').addClass('text-primary');
  624. $('.filter-btn-text').addClass('text-primary');
  625. }
  626. else
  627. {
  628. $('.filter-btn').removeClass('ring-primary');
  629. $('.icon-search').removeClass('text-primary');
  630. $('.filter-btn-text').removeClass('text-primary');
  631. }
  632. }
  633. }
  634. window.collapseFilters = function()
  635. {
  636. $('.collapse-icon').toggleClass('icon-chevron-double-up');
  637. $('.collapse-icon').toggleClass('icon-chevron-double-down');
  638. $('[data-collapse=true]').parent('.checkbox-primary').toggleClass('hidden');
  639. }
  640. $(document).ready(function()
  641. {
  642. $('[data-collapse=true]').parent('.checkbox-primary').addClass('hidden');
  643. })