query.ui.js 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. window.latin1ToBase64 = function(str)
  2. {
  3. const encoder = new TextEncoder();
  4. const latin1Array = encoder.encode(str);
  5. const latin1String = String.fromCharCode.apply(null, latin1Array);
  6. return btoa(latin1String);
  7. }
  8. window.saveQuery = function()
  9. {
  10. const data = state();
  11. if(data.sql) data.sql = latin1ToBase64(data.sql);
  12. const formData = zui.createFormData({action: 'saveQuery', data: JSON.stringify(data)});
  13. const link = $('#state').data('url');
  14. $.ajaxSubmit({url: link, data: formData});
  15. }
  16. window.state = function(key, value)
  17. {
  18. const state = $('#state').data('state');
  19. if(key?.length && state.hasOwnProperty(key))
  20. {
  21. state[key] = value;
  22. $('#state').attr('data-state', JSON.stringify(state));
  23. }
  24. return state;
  25. }
  26. window.postQueryResult = function(e, info)
  27. {
  28. const { item } = info;
  29. const { page } = item;
  30. const { pager } = state();
  31. const { pageID, pageTotal } = pager;
  32. if(page == 'first' && pageID != 1) pager.pageID = 1;
  33. if(page == 'last' && pageTotal != pageID) pager.pageID = pageTotal;
  34. if(page == 'prev' && pageID - 1 >= 1) pager.pageID = pageID - 1;
  35. if(page == 'next' && pageID + 1 <= pageTotal) pager.pageID = pageID + 1;
  36. state('pager', pager);
  37. state('triggerQuery', true);
  38. updatePage('query');
  39. }
  40. window.buildPostParams = function(action, index)
  41. {
  42. if(!action) action = state().action;
  43. state('action', action);
  44. actionSelectors = '#queryBase';
  45. const data = state();
  46. if(action.startsWith('sqlBuilder-'))
  47. {
  48. const builder = getSqlBuilderPost(action, index);
  49. data.sqlbuilder = builder.data;
  50. actionSelectors = builder.selectors;
  51. }
  52. if(data.sql) data.sql = latin1ToBase64(data.sql);
  53. const formData = zui.createFormData({action, data: JSON.stringify(data)});
  54. const selectors = [actionSelectors, '#dictionarySideBar', '#state', 'pageJS/.zin-page-js', 'pageCSS/.zin-page-css>*', '#configJS'];
  55. const link = $('#state').data('url');
  56. return {link, formData, selectors: selectors.filter(selector => selector?.length != 0).join(',')};
  57. }
  58. window.updatePage = function(action, index)
  59. {
  60. const {link, formData, selectors} = buildPostParams(action, index);
  61. postAndLoadPage(link, formData, selectors, {modal: true});
  62. }
  63. window.ajaxQuery = function()
  64. {
  65. state('triggerQuery', true);
  66. updatePage('query');
  67. }
  68. window.handleSqlChange = function()
  69. {
  70. const sql = $('#sqlForm').find('textarea[name="sql"]').val();
  71. state('sql', sql);
  72. if(state().mode == 'text')
  73. {
  74. const canChangeMode = !sql?.trim()?.length;
  75. state('canChangeMode', canChangeMode);
  76. canChangeMode ? $('#changeMode').removeClass('hidden') : $('#changeMode').addClass('hidden')
  77. canChangeMode ? $('#changeModeDisabled').addClass('hidden') : $('#changeModeDisabled').removeClass('hidden')
  78. }
  79. }
  80. window.saveFields = function()
  81. {
  82. let $form = $('#fieldSettingsForm');
  83. let formData = new FormData($form[0]);
  84. let data = {};
  85. for (var [key, value] of formData.entries()) {
  86. const pureKey = key.substring(0, key.indexOf("["));
  87. if(!data[pureKey]) data[pureKey] = [];
  88. data[pureKey].push(value);
  89. }
  90. let fieldSettings = {};
  91. data.key.forEach((key, index) => {
  92. fieldSettings[key] = {};
  93. Object.keys(data).forEach(itemKey => {
  94. if(itemKey == 'key') return;
  95. fieldSettings[key][itemKey] = data[itemKey][index];
  96. });
  97. });
  98. state('fieldSettings', fieldSettings);
  99. state('triggerQuery', true);
  100. updatePage('saveFields');
  101. }
  102. window.changeMode = function(event)
  103. {
  104. const mode = $(event.currentTarget).data('mode');
  105. const tip = $(event.currentTarget).data('tip');
  106. if(mode == 'builder')
  107. {
  108. zui.Modal.confirm({message: tip}).then((res) =>
  109. {
  110. if(res) doChangeMode(mode);
  111. });
  112. return;
  113. }
  114. doChangeMode(mode);
  115. }
  116. window.doChangeMode = function(mode)
  117. {
  118. const changeMode = mode == 'text' ? 'builder' : 'text';
  119. state('mode', changeMode);
  120. state('fields', []);
  121. state('langs', []);
  122. state('fieldSettings', []);
  123. state('relatedObject', []);
  124. state('queryCols', []);
  125. state('queryData', []);
  126. state('error', false);
  127. state('errorMsg', '');
  128. updatePage('changeMode');
  129. }