project_screen_setting.js 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276
  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. if (tab === 'permission') {
  116. $('#project-screen-config').hide();
  117. $('#project-screen-permission').show();
  118. loadPermissions(1);
  119. } else {
  120. $('#project-screen-permission').hide();
  121. $('#project-screen-config').show();
  122. }
  123. });
  124. $('#project-screen-select').click(function() {
  125. selectedCodes = [];
  126. renderTemplates();
  127. $('#project-screen-select-modal').modal('show');
  128. });
  129. $('#project-screen-template-grid').on('click', '.project-screen-template-item:not(.added)', function() {
  130. const code = $(this).attr('data-code');
  131. const index = selectedCodes.indexOf(code);
  132. if (index >= 0) selectedCodes.splice(index, 1);
  133. else selectedCodes.push(code);
  134. renderTemplates();
  135. });
  136. $('#project-screen-add').click(function() {
  137. if (!selectedCodes.length) {
  138. toastr.warning('请至少选择一个大屏');
  139. return;
  140. }
  141. postProjectScreen('add', { codes: selectedCodes }, function(data) {
  142. screens = data.screens;
  143. const firstAdded = screens.find(x => selectedCodes[0] === x.template_code);
  144. selectedId = firstAdded ? String(firstAdded.id) : (screens.length ? String(screens[0].id) : '');
  145. renderScreens();
  146. $('#project-screen-select-modal').modal('hide');
  147. toastr.success(`已添加 ${selectedCodes.length} 个大屏`);
  148. });
  149. });
  150. $('#project-screen-list').on('click', '.project-screen-list-item', function() {
  151. selectedId = $(this).attr('data-id');
  152. renderScreens();
  153. });
  154. $('#project-screen-delete').click(function() { openDeleteModal(selectedId); });
  155. $('#project-screen-delete-confirm').click(function() {
  156. const screen = selectedScreen();
  157. if (!screen) return;
  158. postProjectScreen('delete', { id: screen.id }, function(data) {
  159. screens = data.screens;
  160. selectedId = screens.length ? String(screens[0].id) : '';
  161. renderScreens();
  162. $('#project-screen-delete-modal').modal('hide');
  163. toastr.success('大屏移除成功');
  164. });
  165. });
  166. $('#project-screen-default').click(function() {
  167. const screen = selectedScreen();
  168. if (!screen) return;
  169. postProjectScreen('default', { id: screen.id }, function(data) {
  170. screens = data.screens;
  171. renderScreens();
  172. toastr.success('默认大屏设置成功');
  173. });
  174. });
  175. const renderPermissionRows = function(result) {
  176. const html = [];
  177. permissionOriginal = {};
  178. result.list.forEach(account => {
  179. const disabled = account.is_admin ? 'disabled' : '';
  180. const authorized = !!(account.is_admin || account.authorized);
  181. const checked = authorized ? 'checked' : '';
  182. const adminIcon = account.is_admin ? ' <span class="ml-1" title="管理员"><i class="fa fa-user-circle-o"></i></span>' : '';
  183. permissionOriginal[account.id] = authorized;
  184. 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>`);
  185. html.push(`<td class="text-nowrap">${escapeHtml(account.mobile)}</td>`);
  186. html.push(`<td><input type="checkbox" class="project-screen-permission-check" ${checked} ${disabled}></td></tr>`);
  187. });
  188. $('#project-screen-permission-body').html(html.join(''));
  189. $('#project-screen-permission-empty').toggle(result.list.length === 0);
  190. $('#project-screen-permission-count').text(`已授权 ${result.authorizedTotal} / 共 ${result.allTotal} 人`);
  191. const totalPage = Math.max(Math.ceil(result.total / result.pageSize), 1);
  192. $('#project-screen-page-info').text(`${result.page} / ${totalPage}`);
  193. $('#project-screen-prev').prop('disabled', result.page <= 1);
  194. $('#project-screen-next').prop('disabled', result.page >= totalPage);
  195. $('#project-screen-permission-all').prop('checked', false);
  196. };
  197. const updatePermissionSaveButton = function() {
  198. $('#project-screen-permission-save').toggle(Object.keys(permissionChanges).length > 0);
  199. };
  200. const setPermissionChange = function(id, authorized) {
  201. if (permissionOriginal[id] === authorized) delete permissionChanges[id];
  202. else permissionChanges[id] = { id, authorized };
  203. };
  204. function loadPermissions(page) {
  205. permissionPage = Math.max(page || 1, 1);
  206. postProjectScreen('permissionload', {
  207. page: permissionPage,
  208. pageSize: permissionPageSize,
  209. keyword: $('#project-screen-keyword').val(),
  210. authorized: $('#project-screen-authorized').prop('checked') ? 1 : 0,
  211. }, function(result) {
  212. permissionPage = result.page;
  213. permissionChanges = {};
  214. updatePermissionSaveButton();
  215. renderPermissionRows(result);
  216. });
  217. }
  218. $('#project-screen-permission-body').on('change', '.project-screen-permission-check', function() {
  219. const id = parseInt($(this).closest('tr').attr('data-id'));
  220. setPermissionChange(id, this.checked);
  221. updatePermissionSaveButton();
  222. });
  223. $('#project-screen-permission-all').change(function() {
  224. const checked = this.checked;
  225. $('#project-screen-permission-body .project-screen-permission-check:not(:disabled)').each(function() {
  226. this.checked = checked;
  227. const id = parseInt($(this).closest('tr').attr('data-id'));
  228. setPermissionChange(id, checked);
  229. });
  230. updatePermissionSaveButton();
  231. });
  232. $('#project-screen-permission-save').click(function() {
  233. const changes = Object.values(permissionChanges);
  234. if (!changes.length) return;
  235. postProjectScreen('permissionsave', { changes }, function() {
  236. permissionChanges = {};
  237. updatePermissionSaveButton();
  238. toastr.success('项目大屏权限保存成功');
  239. loadPermissions(permissionPage);
  240. });
  241. });
  242. $('#project-screen-search').click(function() { loadPermissions(1); });
  243. $('#project-screen-keyword').keydown(function(event) {
  244. if (event.keyCode === 13) loadPermissions(1);
  245. });
  246. $('#project-screen-authorized').change(function() { loadPermissions(1); });
  247. $('#project-screen-prev').click(function() { loadPermissions(permissionPage - 1); });
  248. $('#project-screen-next').click(function() { loadPermissions(permissionPage + 1); });
  249. renderScreens();
  250. });