step1.html.php 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441
  1. <div id='mainContent' class='main-row'>
  2. <div class='main-col'>
  3. <style><?php include $this->app->getModuleRoot() . 'dataview/css/querybase.css';?></style>
  4. <?php include $this->app->getModuleRoot() . 'dataview/view/querybase.html.php';?>
  5. <script><?php include $this->app->getModuleRoot() . 'dataview/js/querybase.js';?></script>
  6. </div>
  7. </div>
  8. <template id='queryFilterItemTpl'>
  9. <div class='filter-item filter-item-{index} input-group' data-index='{index}'>
  10. <span class='field-name input-group-addon'>{name}</span>
  11. <div class="default-block hidden"><?php echo html::input('default', '', "class='form-control form-input '")?></div>
  12. <div class="default-block hidden"><?php echo html::input('default', '', "class='form-control form-date'")?></div>
  13. <div class="default-block hidden"><?php echo html::input('default', '', "class='form-control form-datetime'")?></div>
  14. <div class="default-block hidden"><?php echo html::select('default', '', '', "class='form-control form-select'");?></div>
  15. </div>
  16. </template>
  17. <div id='queryFilterModal' class="modal fade" tabindex="-1" role="dialog" aria-hidden="true">
  18. <div class="modal-dialog">
  19. <div class="modal-content">
  20. <div class="modal-header">
  21. <button type="button" class="close" data-dismiss="modal" aria-hidden="true">× </button>
  22. <h4 class="modal-title"><?php echo $lang->dataview->add . $lang->dataview->queryFilters?></h4>
  23. </div>
  24. <div class="modal-body">
  25. <div class="alert alert-info no-margin"><?php echo $lang->dataview->queryFilterTip;?></div>
  26. <div class="form-overflow">
  27. <table class='table table-form'>
  28. <thead>
  29. <tr class='text-center'>
  30. <th class='w-160px text-left require'><?php echo $lang->dataview->varFilter->varCode?></th>
  31. <th class='w-160px text-left require'><?php echo $lang->dataview->varFilter->varLabel?></th>
  32. <th><?php echo $lang->dataview->varFilter->requestType?></th>
  33. <th class='text-left' style="width: 142px;"><?php echo $lang->dataview->varFilter->default?></th>
  34. <th class='text-left' style="width: 30px;"></th>
  35. </tr>
  36. </thead>
  37. <tbody class='text-center'></tbody>
  38. </table>
  39. </div>
  40. <table class='table table-form'>
  41. <tfoot>
  42. <tr>
  43. <td colspan='4' class='text-center'><?php echo html::submitButton();?></td></tr>
  44. </tfoot>
  45. </table>
  46. </div>
  47. </div>
  48. </div>
  49. </div>
  50. <template id="queryFilterFormTpl">
  51. <tr class="filter-item form-filter-{index}" data-index='{index}'>
  52. <td><?php echo html::input('varName', '{varName}', "class='form-control required' {disabled} placeholder='{$lang->pivot->varNameTip}' onchange='handleVarNameChange(this)'")?></td>
  53. <td><?php echo html::input('showName', '{showName}', "class='form-control required' onchange='handleShowNameChange(this)'")?></td>
  54. <td>
  55. <div class='input-group request-type'>
  56. <span class='input-group-addon' style='text-align:left'>
  57. <?php echo html::radio('requestType[{index}]', $lang->dataview->varFilter->requestTypeList, '{requestType}', "onchange='methods.step1.query.toggleRadio(this)'")?>
  58. </span>
  59. <?php echo html::select('selectList', $lang->dataview->varFilter->selectList, '{select}', "class='form-control {hidden}' onchange='methods.step1.query.toggleSelect(this, this.value)'");?>
  60. </div>
  61. </td>
  62. <td>
  63. <div class="default-block hidden"><?php echo html::input('default', '', "class='form-control form-input '")?></div>
  64. <div class="default-block hidden"><?php echo html::input('default', '', "class='form-control form-date '")?></div>
  65. <div class="default-block hidden"><?php echo html::input('default', '', "class='form-control form-datetime '")?></div>
  66. <div class="default-block hidden"><?php echo html::select('default', '', '', "class='form-control form-select'");?></div>
  67. </td>
  68. <td>
  69. <a href="javascript:;" onclick="methods.step1.query.deleteRow(this)" class="btn btn-link hidden"><i class="icon icon-trash"></i></a>
  70. </td>
  71. </tr>
  72. </template>
  73. <template id="nextStepTpl">
  74. <button type="button" class="btn btn-primary btn-next-step pull-right" onclick="nextStep()"><?php echo $lang->pivot->nextStep;?></button>
  75. </template>
  76. <template id="addQueryFilterTpl">
  77. <button type="button" class="btn add-query-filter" style="margin-left: 8px;"><?php echo $lang->dataview->add . $lang->dataview->queryFilters;?></button>
  78. </template>
  79. <template id="queryFiltersTpl">
  80. <tr id="queryFilters" class="hidden">
  81. <th></th>
  82. <td></td>
  83. </tr>
  84. </template>
  85. <script>
  86. DataStorage.addProperty('isInsert', true);
  87. var queryFilterModal = '#step1Content #queryFilterModal';
  88. var queryFilters = '#step1Content #queryFilters';
  89. var queryFilterFormTpl = '#step1Content #queryFilterFormTpl';
  90. $(function()
  91. {
  92. $('#dataform .btn.query').after([$('#addQueryFilterTpl').html(), $('#nextStepTpl').html()]);
  93. $('#dataform .btn.query').parent().parent().before($('#queryFiltersTpl').html());
  94. $('.add-query-filter').click(function()
  95. {
  96. DataStorage.isInsert = true;
  97. methods.step1.query.renderFilterForm([{}]);
  98. });
  99. $(queryFilterModal + ' #submit').click(function()
  100. {
  101. var pivot = DataStorage.clone('pivot');
  102. var sql = $('#sql').val();
  103. pivot.filters = [];
  104. var filters = methods.step1.query.getFilterFormData();
  105. if(!filters) return;
  106. pivot.filters = filters;
  107. if(DataStorage.isInsert) $('#sql').val(sql + " $" + filters[filters.length - 1].field);
  108. pivot.settings.filterType = 'query';
  109. DataStorage.pivot = pivot;
  110. $(queryFilterModal).modal('hide');
  111. methods.step1.query.renderFilters();
  112. })
  113. methods.step1.query.renderFilters();
  114. });
  115. function handleVarNameChange(elem)
  116. {
  117. var $td = $(elem).parent('td');
  118. $td.removeClass('has-error');
  119. if($td.find('#varNameError').length > 0) $td.find('#varNameError').remove();
  120. }
  121. function handleShowNameChange(elem)
  122. {
  123. var $td = $(elem).parent('td');
  124. $td.removeClass('has-error');
  125. if($td.find('#showNameError').length > 0) $td.find('#showNameError').remove();
  126. }
  127. methods.step1.query.getFilterFormData = function()
  128. {
  129. var hasError = false;
  130. var filters = [];
  131. $(queryFilterModal + ' .table tbody tr').each(function()
  132. {
  133. $(this).find('td').removeClass('has-error');
  134. var varName = $(this).find("input[name^='varName']").val();
  135. var showName = $(this).find("input[name^='showName']").val();
  136. var selectList = $(this).find("select[name^='selectList']").val();
  137. var requestType = $(this).find("input[name^='requestType']:checked").val();
  138. var defaultType = ".form-" + requestType;
  139. var defaultValue = requestType == 'select' ? $(this).find("select[name^='default']" + defaultType).data('zui.picker').getValue() : $(this).find("input[name^='default']" + defaultType).val();
  140. if($(this).find('#varNameError').length > 0) $(this).find('#varNameError').remove();
  141. if($(this).find('#showNameError').length > 0) $(this).find('#showNameError').remove();
  142. if(!varName || varName.length == 0)
  143. {
  144. hasError = true;
  145. $(this).find("input[name^='varName']").parent().addClass('has-error').append('<div id="varNameError" class="text-danger text-left">' + notemptyLang.replace('%s', '<?php echo $lang->dataview->varFilter->varCode?>') + '</div>');
  146. }
  147. if(!showName || showName.length == 0)
  148. {
  149. hasError = true;
  150. $(this).find("input[name^='showName']").parent().addClass('has-error').append('<div id="showNameError" class="text-danger text-left">' + notemptyLang.replace('%s', '<?php echo $lang->dataview->varFilter->varLabel?>') + '</div>');
  151. }
  152. var filter = {from: 'query', field: varName, type: requestType, typeOption: selectList, name: showName, default: defaultValue};
  153. filters.push(filter);
  154. });
  155. return hasError ? false : filters;
  156. }
  157. methods.step1.query.renderFilters = function()
  158. {
  159. var pivot = DataStorage.pivot;
  160. $(queryFilters).removeClass('hidden');
  161. $(queryFilters + ' td').empty();
  162. if(!DataStorage.isQueryFilter())
  163. {
  164. $(queryFilters).addClass('hidden');
  165. return;
  166. }
  167. var filters = pivot.filters;
  168. filters.forEach(function(filter, index)
  169. {
  170. var tpl = $(queryFilterItemTpl).html();
  171. var data =
  172. {
  173. index: index,
  174. name: filter.name,
  175. };
  176. var html = $($.zui.formatString(tpl, data));
  177. var control = methods.step1.query.getControl(filter.type, html);
  178. $(queryFilters + ' td').append(html);
  179. methods.step1.query.initControl(control, filter.type, filter.field, filter.default, filter.typeOption);
  180. })
  181. }
  182. methods.step1.query.getVarListFromSql = function()
  183. {
  184. var sql = $('#sql').val();
  185. var pattern = /\$\w+/g;
  186. var varList = sql.match(pattern);
  187. if(Array.isArray(varList)) varList = Array.from(new Set(varList));
  188. if(!Array.isArray(varList)) varList = [];
  189. return varList;
  190. }
  191. /**
  192. * Set varFrom.
  193. *
  194. * @access public
  195. * @return void
  196. */
  197. function setVarFrom()
  198. {
  199. var pivot = DataStorage.pivot;
  200. var filters = pivot.filters;
  201. if(sql !== '')
  202. {
  203. var varList = methods.step1.query.getVarListFromSql();
  204. if(methods.step1.query.needEditQuery())
  205. {
  206. var dataList = [];
  207. varList.forEach(function(varStr, index)
  208. {
  209. varStr = varStr.substr(1);
  210. var find = filters.find(function(filter){return filter.field == varStr});
  211. if(!find) dataList.push({varName: varStr, disabled: 'disabled'});
  212. });
  213. methods.step1.query.renderFilterForm(dataList);
  214. methods.step1.query.updateFilters(varList);
  215. return false;
  216. }
  217. if(varList && varList.length < filters.length && DataStorage.isQueryFilter())
  218. {
  219. methods.step1.query.updateFilters(varList);
  220. methods.step1.query.renderFilters();
  221. }
  222. }
  223. return true;
  224. }
  225. /**
  226. * Update filters form sql variables to storage.
  227. *
  228. * @param array varList
  229. * @access public
  230. * @return void
  231. */
  232. methods.step1.query.updateFilters = function(varList)
  233. {
  234. var newFilters = [];
  235. var pivot = DataStorage.clone('pivot');
  236. varList.forEach(function(varStr)
  237. {
  238. var find = pivot.filters.find(function(filter){return filter.field == varStr.substr(1)});
  239. if(find) newFilters.push(find);
  240. });
  241. pivot.filters = newFilters;
  242. DataStorage.pivot = pivot;
  243. }
  244. /**
  245. * Need edit query filter or not
  246. *
  247. * @access public
  248. * @return bool
  249. */
  250. methods.step1.query.needEditQuery = function()
  251. {
  252. var varList = methods.step1.query.getVarListFromSql();
  253. var pivot = DataStorage.clone('pivot');
  254. /* If the sql has not any variable for query filter. */
  255. if(!varList)
  256. {
  257. if(pivot.settings.filterType == 'query')
  258. {
  259. pivot.filters = [];
  260. pivot.settings.filterType = '';
  261. DataStorage.pivot = pivot;
  262. }
  263. return false;
  264. }
  265. /* Find if add new variables to sql. */
  266. var newVars = varList.filter(function(varStr)
  267. {
  268. var findInFilters = pivot.filters.find(function(filter){return filter.field == varStr.substr(1);});
  269. return !findInFilters;
  270. });
  271. return newVars.length > 0;
  272. }
  273. /**
  274. * ToggleSelectList.
  275. *
  276. * @param obj $obj
  277. * @access public
  278. * @return void
  279. */
  280. methods.step1.query.toggleRadio = function(obj)
  281. {
  282. $(obj).parents('td').find('select').addClass('hidden');
  283. var radioValue = $(obj).val();
  284. if(radioValue == 'select')
  285. {
  286. $(obj).parents('td').find('select').removeClass('hidden');
  287. }
  288. var defaultControl = $(obj).parents('tr').find('.default-control');
  289. var control = methods.step1.query.getControl(radioValue, $(obj).parents('tr'));
  290. methods.step1.query.initControl(control, radioValue, 'default', '', 'user');
  291. }
  292. methods.step1.query.toggleSelect = function(obj, options)
  293. {
  294. var type = 'select';
  295. var defaultControl = $(obj).parents('tr').find('.default-control');
  296. var control = methods.step1.query.getControl(type, $(obj).parents('tr'));
  297. methods.step1.query.initControl(control, type, 'default', '', options);
  298. }
  299. methods.step1.query.renderFilterForm = function(dataList, showModal = true)
  300. {
  301. var tplDataList = [];
  302. var varList = methods.step1.query.getVarListFromSql();
  303. var filters = DataStorage.pivot.filters;
  304. varList.forEach(function(varStr, index)
  305. {
  306. varStr = varStr.substr(1);
  307. var find = filters.find(function(filter){return filter.field == varStr});
  308. if(!find) return;
  309. var data = {disabled: 'disabled', varName: varStr};
  310. if(find)
  311. {
  312. data.showName = find.name;
  313. data.defaultValue = find.default;
  314. data.requestType = find.type;
  315. data.select = find.typeOption
  316. }
  317. tplDataList.push(data);
  318. });
  319. tplDataList = tplDataList.concat(dataList);
  320. var tbody = $(queryFilterModal + ' .table.table-form tbody');
  321. tbody.empty();
  322. tplDataList.forEach(function(tplData, index)
  323. {
  324. methods.step1.query.renderFilterItem(tbody, tplData, index);
  325. });
  326. if(tplDataList.length >= 2) tbody.find("tr:last-child td:last-child").find('a').removeClass('hidden');
  327. if(showModal) $(queryFilterModal).modal('show');
  328. }
  329. methods.step1.query.renderFilterItem = function(node, data, index)
  330. {
  331. var tplData = {index: index, disabled: '', varName: '', showName: '', requestType: 'input', select: 'user', defaultValue: ''};
  332. for(var key in tplData)
  333. {
  334. if(data.hasOwnProperty(key)) tplData[key] = data[key];
  335. }
  336. tplData.hidden = tplData.requestType == 'select' ? '' : 'hidden';
  337. var type = tplData.requestType;
  338. var select = tplData.select;
  339. var defaultValue = tplData.defaultValue;
  340. var tpl = $(queryFilterFormTpl).html();
  341. var html = $($.zui.formatString(tpl, tplData));
  342. node.append(html);
  343. html.find('input[name^="requestType"][value="' + type + '"]').attr('checked', 'checked');
  344. if(type == 'select') html.find('#selectList').val(select);
  345. var control = methods.step1.query.getControl(type, html);
  346. methods.step1.query.initControl(control, type, 'default', defaultValue, select);
  347. }
  348. methods.step1.query.deleteRow = function(trashObj)
  349. {
  350. $(trashObj).parents('tr').remove();
  351. }
  352. methods.step1.query.getControl = function(type, html)
  353. {
  354. html.find('.default-block').addClass('hidden');
  355. html.find('.default-block input[name="default"]').val('');
  356. var control = html.find('.form-' + type);
  357. control.parent('.default-block').removeClass('hidden');
  358. return control;
  359. }
  360. methods.step1.query.initControl = function(control, type, name, value, options)
  361. {
  362. if(type == 'date') setDateField(control);
  363. if(type == 'datetime') setDateField(control);
  364. if(type == 'select')
  365. {
  366. var picker = control.data('zui.picker');
  367. if(picker) picker.destroy();
  368. $.post(createLink('pivot', 'ajaxGetSysOptions', 'type=' + options), function(resp)
  369. {
  370. control.html($(resp).html());
  371. control.picker({maxDropHeight: pickerHeight});
  372. control.data('zui.picker').setValue(value);
  373. });
  374. }
  375. }
  376. </script>