project_screen_setting.js 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271
  1. /* global $, postData, toastr, window */
  2. 'use strict';
  3. $(function() {
  4. const pageData = window.projectScreenPageData || { screens: [], templates: [] };
  5. let screens = pageData.screens || [];
  6. const templates = pageData.templates || [];
  7. let selectedId = screens.length ? String((screens.find(x => parseInt(x.is_default) === 1) || screens[0]).id) : '';
  8. let selectedCodes = [];
  9. let permissionPage = 1;
  10. const permissionPageSize = 50;
  11. let permissionChanges = {};
  12. let permissionOriginal = {};
  13. const escapeHtml = function(value) {
  14. return $('<div>').text(value === undefined || value === null ? '' : value).html();
  15. };
  16. const selectedScreen = function() {
  17. return screens.find(x => String(x.id) === selectedId);
  18. };
  19. const postProjectScreen = function(type, data, successCallback, errorCallback) {
  20. postData(
  21. '/setting/module/projectscreen',
  22. $.extend({ type }, data),
  23. successCallback,
  24. errorCallback
  25. );
  26. };
  27. const renderScreens = function() {
  28. if (selectedId && !screens.some(x => String(x.id) === selectedId)) {
  29. selectedId = screens.length ? String(screens[0].id) : '';
  30. }
  31. if (!selectedId && screens.length) {
  32. selectedId = String((screens.find(x => parseInt(x.is_default) === 1) || screens[0]).id);
  33. }
  34. const html = [];
  35. screens.forEach(screen => {
  36. const active = String(screen.id) === selectedId ? ' active' : '';
  37. html.push(`<div class="list-group-item list-group-item-action d-flex align-items-center project-screen-list-item${active}" data-id="${screen.id}">`);
  38. html.push(`<span>${escapeHtml(screen.name)}</span>`);
  39. if (parseInt(screen.is_default) === 1) html.push('<span class="ml-auto text-primary">默认</span>');
  40. html.push('</div>');
  41. });
  42. $('#project-screen-list').html(html.join(''));
  43. const screen = selectedScreen();
  44. if (!screen) {
  45. $('#project-screen-selected-name').text('大屏预览');
  46. $('#project-screen-default, #project-screen-delete, #project-screen-preview').hide();
  47. $('#project-screen-empty').show();
  48. return;
  49. }
  50. $('#project-screen-selected-name').text(screen.name);
  51. $('#project-screen-delete, #project-screen-preview').show();
  52. $('#project-screen-empty').hide();
  53. $('#project-screen-default').toggle(parseInt(screen.is_default) !== 1);
  54. const previewClass = screen.template && screen.template.previewClass ? screen.template.previewClass : '';
  55. const preview = $('#project-screen-preview');
  56. preview.removeClass(function(index, className) {
  57. return (className.match(/project-screen-preview-\S+/g) || []).join(' ');
  58. });
  59. if (previewClass) preview.addClass(previewClass);
  60. };
  61. const renderTemplates = function() {
  62. const html = [];
  63. templates.forEach(template => {
  64. const added = screens.some(screen => screen.template_code === template.code);
  65. const selected = selectedCodes.indexOf(template.code) >= 0;
  66. const cardClass = selected ? ' border-primary' : '';
  67. const statusClass = selected ? 'badge-primary' : 'badge-secondary';
  68. const statusText = added ? '已添加' : (selected ? '已选择' : '可选择');
  69. html.push('<div class="col-6 mb-3">');
  70. html.push(`<div class="card h-100 project-screen-template-item${added ? ' added' : ''}${cardClass}" data-code="${escapeHtml(template.code)}">`);
  71. html.push(`<div class="project-screen-template-preview ${escapeHtml(template.previewClass)}"><div></div></div>`);
  72. html.push('<div class="card-body py-2 d-flex align-items-center">');
  73. html.push(`<strong>${escapeHtml(template.name)}</strong><span class="badge ${statusClass} ml-auto">${statusText}</span>`);
  74. html.push('</div></div></div>');
  75. });
  76. $('#project-screen-template-grid').html(html.join(''));
  77. $('#project-screen-selected-count').text(`已选择 ${selectedCodes.length} 个`);
  78. $('#project-screen-add').text(selectedCodes.length ? `添加(${selectedCodes.length})` : '添加');
  79. };
  80. const openDeleteModal = function(id) {
  81. selectedId = id || selectedId;
  82. renderScreens();
  83. const screen = selectedScreen();
  84. if (!screen) return;
  85. const remaining = screens.filter(x => x.id !== screen.id);
  86. let hint = '移除后,已有业务数据不会受到影响。';
  87. if (parseInt(screen.is_default) === 1 && remaining.length) {
  88. hint += ` “${remaining[0].name}”将自动成为默认大屏。`;
  89. } else if (parseInt(screen.is_default) === 1) {
  90. hint += ' 这是最后一个大屏,移除后左侧项目大屏入口将隐藏。';
  91. }
  92. $('#project-screen-delete-name').text(screen.name);
  93. $('#project-screen-delete-hint').text(hint);
  94. $('#project-screen-delete-modal').modal('show');
  95. };
  96. $('#project-screen-status').change(function() {
  97. const input = this;
  98. const enabled = input.checked ? 1 : 0;
  99. input.disabled = true;
  100. postProjectScreen('status', { enabled }, function() {
  101. $('#project-screen-module-status')
  102. .toggleClass('text-success', enabled === 1)
  103. .text(enabled ? '已开启' : '');
  104. input.disabled = false;
  105. }, function() {
  106. input.checked = !input.checked;
  107. input.disabled = false;
  108. });
  109. });
  110. $('.project-screen-tab').click(function(event) {
  111. event.preventDefault();
  112. const tab = $(this).attr('data-tab');
  113. $('.project-screen-tab').removeClass('active');
  114. $(this).addClass('active');
  115. $('#project-screen-config, #project-screen-permission, #project-screen-tender').hide();
  116. $(`#project-screen-${tab}`).show();
  117. if (tab === 'permission') loadPermissions(1);
  118. });
  119. $('#project-screen-select').click(function() {
  120. selectedCodes = [];
  121. renderTemplates();
  122. $('#project-screen-select-modal').modal('show');
  123. });
  124. $('#project-screen-template-grid').on('click', '.project-screen-template-item:not(.added)', function() {
  125. const code = $(this).attr('data-code');
  126. const index = selectedCodes.indexOf(code);
  127. if (index >= 0) selectedCodes.splice(index, 1);
  128. else selectedCodes.push(code);
  129. renderTemplates();
  130. });
  131. $('#project-screen-add').click(function() {
  132. if (!selectedCodes.length) {
  133. toastr.warning('请至少选择一个大屏');
  134. return;
  135. }
  136. postProjectScreen('add', { codes: selectedCodes }, function(data) {
  137. screens = data.screens;
  138. const firstAdded = screens.find(x => selectedCodes[0] === x.template_code);
  139. selectedId = firstAdded ? String(firstAdded.id) : (screens.length ? String(screens[0].id) : '');
  140. renderScreens();
  141. $('#project-screen-select-modal').modal('hide');
  142. toastr.success(`已添加 ${selectedCodes.length} 个大屏`);
  143. });
  144. });
  145. $('#project-screen-list').on('click', '.project-screen-list-item', function() {
  146. selectedId = $(this).attr('data-id');
  147. renderScreens();
  148. });
  149. $('#project-screen-delete').click(function() { openDeleteModal(selectedId); });
  150. $('#project-screen-delete-confirm').click(function() {
  151. const screen = selectedScreen();
  152. if (!screen) return;
  153. postProjectScreen('delete', { id: screen.id }, function(data) {
  154. screens = data.screens;
  155. selectedId = screens.length ? String(screens[0].id) : '';
  156. renderScreens();
  157. $('#project-screen-delete-modal').modal('hide');
  158. toastr.success('大屏移除成功');
  159. });
  160. });
  161. $('#project-screen-default').click(function() {
  162. const screen = selectedScreen();
  163. if (!screen) return;
  164. postProjectScreen('default', { id: screen.id }, function(data) {
  165. screens = data.screens;
  166. renderScreens();
  167. toastr.success('默认大屏设置成功');
  168. });
  169. });
  170. const renderPermissionRows = function(result) {
  171. const html = [];
  172. permissionOriginal = {};
  173. result.list.forEach(account => {
  174. const disabled = account.is_admin ? 'disabled' : '';
  175. const authorized = !!(account.is_admin || account.authorized);
  176. const checked = authorized ? 'checked' : '';
  177. const adminIcon = account.is_admin ? ' <span class="ml-1" title="管理员"><i class="fa fa-user-circle-o"></i></span>' : '';
  178. permissionOriginal[account.id] = authorized;
  179. html.push(`<tr data-id="${account.id}"><td>${escapeHtml(account.account)}${adminIcon}</td><td>${escapeHtml(account.name)}</td><td>${escapeHtml(account.company)}</td><td>${escapeHtml(account.role)}</td>`);
  180. html.push(`<td class="text-nowrap">${escapeHtml(account.mobile)}</td>`);
  181. html.push(`<td><input type="checkbox" class="project-screen-permission-check" ${checked} ${disabled}></td></tr>`);
  182. });
  183. $('#project-screen-permission-body').html(html.join(''));
  184. $('#project-screen-permission-empty').toggle(result.list.length === 0);
  185. $('#project-screen-permission-count').text(`已授权 ${result.authorizedTotal} / 共 ${result.allTotal} 人`);
  186. const totalPage = Math.max(Math.ceil(result.total / result.pageSize), 1);
  187. $('#project-screen-page-info').text(`${result.page} / ${totalPage}`);
  188. $('#project-screen-prev').prop('disabled', result.page <= 1);
  189. $('#project-screen-next').prop('disabled', result.page >= totalPage);
  190. $('#project-screen-permission-all').prop('checked', false);
  191. };
  192. const updatePermissionSaveButton = function() {
  193. $('#project-screen-permission-save').toggle(Object.keys(permissionChanges).length > 0);
  194. };
  195. const setPermissionChange = function(id, authorized) {
  196. if (permissionOriginal[id] === authorized) delete permissionChanges[id];
  197. else permissionChanges[id] = { id, authorized };
  198. };
  199. function loadPermissions(page) {
  200. permissionPage = Math.max(page || 1, 1);
  201. postProjectScreen('permissionload', {
  202. page: permissionPage,
  203. pageSize: permissionPageSize,
  204. keyword: $('#project-screen-keyword').val(),
  205. authorized: $('#project-screen-authorized').prop('checked') ? 1 : 0,
  206. }, function(result) {
  207. permissionPage = result.page;
  208. permissionChanges = {};
  209. updatePermissionSaveButton();
  210. renderPermissionRows(result);
  211. });
  212. }
  213. $('#project-screen-permission-body').on('change', '.project-screen-permission-check', function() {
  214. const id = parseInt($(this).closest('tr').attr('data-id'));
  215. setPermissionChange(id, this.checked);
  216. updatePermissionSaveButton();
  217. });
  218. $('#project-screen-permission-all').change(function() {
  219. const checked = this.checked;
  220. $('#project-screen-permission-body .project-screen-permission-check:not(:disabled)').each(function() {
  221. this.checked = checked;
  222. const id = parseInt($(this).closest('tr').attr('data-id'));
  223. setPermissionChange(id, checked);
  224. });
  225. updatePermissionSaveButton();
  226. });
  227. $('#project-screen-permission-save').click(function() {
  228. const changes = Object.values(permissionChanges);
  229. if (!changes.length) return;
  230. postProjectScreen('permissionsave', { changes }, function() {
  231. permissionChanges = {};
  232. updatePermissionSaveButton();
  233. toastr.success('项目大屏权限保存成功');
  234. loadPermissions(permissionPage);
  235. });
  236. });
  237. $('#project-screen-search').click(function() { loadPermissions(1); });
  238. $('#project-screen-keyword').keydown(function(event) {
  239. if (event.keyCode === 13) loadPermissions(1);
  240. });
  241. $('#project-screen-authorized').change(function() { loadPermissions(1); });
  242. $('#project-screen-prev').click(function() { loadPermissions(permissionPage - 1); });
  243. $('#project-screen-next').click(function() { loadPermissions(permissionPage + 1); });
  244. renderScreens();
  245. });