/* global $, postData, toastr, window */
'use strict';
$(function() {
const pageData = window.projectScreenPageData || { screens: [], templates: [] };
let screens = pageData.screens || [];
const templates = pageData.templates || [];
let selectedId = screens.length ? String((screens.find(x => parseInt(x.is_default) === 1) || screens[0]).id) : '';
let selectedCodes = [];
let permissionPage = 1;
const permissionPageSize = 50;
let permissionChanges = {};
let permissionOriginal = {};
const escapeHtml = function(value) {
return $('
').text(value === undefined || value === null ? '' : value).html();
};
const selectedScreen = function() {
return screens.find(x => String(x.id) === selectedId);
};
const postProjectScreen = function(type, data, successCallback, errorCallback) {
postData(
'/setting/module/projectscreen',
$.extend({ type }, data),
successCallback,
errorCallback
);
};
const renderScreens = function() {
if (selectedId && !screens.some(x => String(x.id) === selectedId)) {
selectedId = screens.length ? String(screens[0].id) : '';
}
if (!selectedId && screens.length) {
selectedId = String((screens.find(x => parseInt(x.is_default) === 1) || screens[0]).id);
}
const html = [];
screens.forEach(screen => {
const active = String(screen.id) === selectedId ? ' active' : '';
html.push(`
`);
html.push(`${escapeHtml(screen.name)}`);
if (parseInt(screen.is_default) === 1) html.push('默认');
html.push('
');
});
$('#project-screen-list').html(html.join(''));
const screen = selectedScreen();
if (!screen) {
$('#project-screen-selected-name').text('大屏预览');
$('#project-screen-default, #project-screen-delete, #project-screen-preview').hide();
$('#project-screen-empty').show();
return;
}
$('#project-screen-selected-name').text(screen.name);
$('#project-screen-delete, #project-screen-preview').show();
$('#project-screen-empty').hide();
$('#project-screen-default').toggle(parseInt(screen.is_default) !== 1);
const previewClass = screen.template && screen.template.previewClass ? screen.template.previewClass : '';
const preview = $('#project-screen-preview');
preview.removeClass(function(index, className) {
return (className.match(/project-screen-preview-\S+/g) || []).join(' ');
});
if (previewClass) preview.addClass(previewClass);
};
const renderTemplates = function() {
const html = [];
templates.forEach(template => {
const added = screens.some(screen => screen.template_code === template.code);
const selected = selectedCodes.indexOf(template.code) >= 0;
const cardClass = selected ? ' border-primary' : '';
const statusClass = selected ? 'badge-primary' : 'badge-secondary';
const statusText = added ? '已添加' : (selected ? '已选择' : '可选择');
html.push('
');
html.push(`
`);
html.push(`
`);
html.push('
');
html.push(`${escapeHtml(template.name)}${statusText}`);
html.push('
');
});
$('#project-screen-template-grid').html(html.join(''));
$('#project-screen-selected-count').text(`已选择 ${selectedCodes.length} 个`);
$('#project-screen-add').text(selectedCodes.length ? `添加(${selectedCodes.length})` : '添加');
};
const openDeleteModal = function(id) {
selectedId = id || selectedId;
renderScreens();
const screen = selectedScreen();
if (!screen) return;
const remaining = screens.filter(x => x.id !== screen.id);
let hint = '移除后,已有业务数据不会受到影响。';
if (parseInt(screen.is_default) === 1 && remaining.length) {
hint += ` “${remaining[0].name}”将自动成为默认大屏。`;
} else if (parseInt(screen.is_default) === 1) {
hint += ' 这是最后一个大屏,移除后左侧项目大屏入口将隐藏。';
}
$('#project-screen-delete-name').text(screen.name);
$('#project-screen-delete-hint').text(hint);
$('#project-screen-delete-modal').modal('show');
};
$('#project-screen-status').change(function() {
const input = this;
const enabled = input.checked ? 1 : 0;
input.disabled = true;
postProjectScreen('status', { enabled }, function() {
$('#project-screen-module-status')
.toggleClass('text-success', enabled === 1)
.text(enabled ? '已开启' : '');
input.disabled = false;
}, function() {
input.checked = !input.checked;
input.disabled = false;
});
});
$('.project-screen-tab').click(function(event) {
event.preventDefault();
const tab = $(this).attr('data-tab');
$('.project-screen-tab').removeClass('active');
$(this).addClass('active');
$('#project-screen-config, #project-screen-permission, #project-screen-tender').hide();
$(`#project-screen-${tab}`).show();
if (tab === 'permission') loadPermissions(1);
});
$('#project-screen-select').click(function() {
selectedCodes = [];
renderTemplates();
$('#project-screen-select-modal').modal('show');
});
$('#project-screen-template-grid').on('click', '.project-screen-template-item:not(.added)', function() {
const code = $(this).attr('data-code');
const index = selectedCodes.indexOf(code);
if (index >= 0) selectedCodes.splice(index, 1);
else selectedCodes.push(code);
renderTemplates();
});
$('#project-screen-add').click(function() {
if (!selectedCodes.length) {
toastr.warning('请至少选择一个大屏');
return;
}
postProjectScreen('add', { codes: selectedCodes }, function(data) {
screens = data.screens;
const firstAdded = screens.find(x => selectedCodes[0] === x.template_code);
selectedId = firstAdded ? String(firstAdded.id) : (screens.length ? String(screens[0].id) : '');
renderScreens();
$('#project-screen-select-modal').modal('hide');
toastr.success(`已添加 ${selectedCodes.length} 个大屏`);
});
});
$('#project-screen-list').on('click', '.project-screen-list-item', function() {
selectedId = $(this).attr('data-id');
renderScreens();
});
$('#project-screen-delete').click(function() { openDeleteModal(selectedId); });
$('#project-screen-delete-confirm').click(function() {
const screen = selectedScreen();
if (!screen) return;
postProjectScreen('delete', { id: screen.id }, function(data) {
screens = data.screens;
selectedId = screens.length ? String(screens[0].id) : '';
renderScreens();
$('#project-screen-delete-modal').modal('hide');
toastr.success('大屏移除成功');
});
});
$('#project-screen-default').click(function() {
const screen = selectedScreen();
if (!screen) return;
postProjectScreen('default', { id: screen.id }, function(data) {
screens = data.screens;
renderScreens();
toastr.success('默认大屏设置成功');
});
});
const renderPermissionRows = function(result) {
const html = [];
permissionOriginal = {};
result.list.forEach(account => {
const disabled = account.is_admin ? 'disabled' : '';
const authorized = !!(account.is_admin || account.authorized);
const checked = authorized ? 'checked' : '';
const adminIcon = account.is_admin ? '
' : '';
permissionOriginal[account.id] = authorized;
html.push(`
| ${escapeHtml(account.account)}${adminIcon} | ${escapeHtml(account.name)} | ${escapeHtml(account.company)} | ${escapeHtml(account.role)} | `);
html.push(`${escapeHtml(account.mobile)} | `);
html.push(` |
`);
});
$('#project-screen-permission-body').html(html.join(''));
$('#project-screen-permission-empty').toggle(result.list.length === 0);
$('#project-screen-permission-count').text(`已授权 ${result.authorizedTotal} / 共 ${result.allTotal} 人`);
const totalPage = Math.max(Math.ceil(result.total / result.pageSize), 1);
$('#project-screen-page-info').text(`${result.page} / ${totalPage}`);
$('#project-screen-prev').prop('disabled', result.page <= 1);
$('#project-screen-next').prop('disabled', result.page >= totalPage);
$('#project-screen-permission-all').prop('checked', false);
};
const updatePermissionSaveButton = function() {
$('#project-screen-permission-save').toggle(Object.keys(permissionChanges).length > 0);
};
const setPermissionChange = function(id, authorized) {
if (permissionOriginal[id] === authorized) delete permissionChanges[id];
else permissionChanges[id] = { id, authorized };
};
function loadPermissions(page) {
permissionPage = Math.max(page || 1, 1);
postProjectScreen('permissionload', {
page: permissionPage,
pageSize: permissionPageSize,
keyword: $('#project-screen-keyword').val(),
authorized: $('#project-screen-authorized').prop('checked') ? 1 : 0,
}, function(result) {
permissionPage = result.page;
permissionChanges = {};
updatePermissionSaveButton();
renderPermissionRows(result);
});
}
$('#project-screen-permission-body').on('change', '.project-screen-permission-check', function() {
const id = parseInt($(this).closest('tr').attr('data-id'));
setPermissionChange(id, this.checked);
updatePermissionSaveButton();
});
$('#project-screen-permission-all').change(function() {
const checked = this.checked;
$('#project-screen-permission-body .project-screen-permission-check:not(:disabled)').each(function() {
this.checked = checked;
const id = parseInt($(this).closest('tr').attr('data-id'));
setPermissionChange(id, checked);
});
updatePermissionSaveButton();
});
$('#project-screen-permission-save').click(function() {
const changes = Object.values(permissionChanges);
if (!changes.length) return;
postProjectScreen('permissionsave', { changes }, function() {
permissionChanges = {};
updatePermissionSaveButton();
toastr.success('项目大屏权限保存成功');
loadPermissions(permissionPage);
});
});
$('#project-screen-search').click(function() { loadPermissions(1); });
$('#project-screen-keyword').keydown(function(event) {
if (event.keyCode === 13) loadPermissions(1);
});
$('#project-screen-authorized').change(function() { loadPermissions(1); });
$('#project-screen-prev').click(function() { loadPermissions(permissionPage - 1); });
$('#project-screen-next').click(function() { loadPermissions(permissionPage + 1); });
renderScreens();
});