define(['jquery', 'bootstrap', 'backend', 'table', 'form'], function ($, undefined, Backend, Table, Form) { var Controller = { index: function () { Table.api.init({ extend: { index_url: 'split.ticket/index' + location.search, add_url: 'split.ticket/add', edit_url: 'split.ticket/edit', del_url: 'split.ticket/del', multi_url: 'split.ticket/multi', table: 'split_ticket', } }); var table = $("#table"); table.bootstrapTable({ url: $.fn.bootstrapTable.defaults.extend.index_url, pk: 'id', sortName: 'id', sortOrder: 'desc', fixedColumns: true, fixedRightNumber: 1, columns: [ [ {checkbox: true}, { field: 'ticket_type', title: __('Ticket_type'), searchList: Config.ticketTypeList, operate: false, formatter: Controller.api.formatter.ticketTypePlain }, {field: 'ticket_name', title: __('Ticket_name'), operate: 'LIKE'}, { field: 'link_code_text', title: __('Split_link_id'), operate: false, formatter: Controller.api.formatter.splitLinkCode }, { field: 'start_time_text', title: __('Start_time'), operate: 'RANGE', addclass: 'datetimerange', autocomplete: false, sortable: true }, { field: 'end_time_text', title: __('End_time'), operate: 'RANGE', addclass: 'datetimerange', autocomplete: false, sortable: true }, {field: 'order_limit', title: __('Order_limit'), operate: false}, {field: 'assign_ratio', title: __('Assign_ratio'), operate: false}, {field: 'complete_count', title: __('Complete_count'), operate: false, sortable: true}, { field: 'ticket_progress_text', title: __('Ticket_progress'), operate: false, formatter: Table.api.formatter.content }, { field: 'inbound_ratio_text', title: __('Inbound_ratio'), operate: false, formatter: Table.api.formatter.content }, { field: 'speed_per_hour', title: __('Speed_per_hour'), operate: false, formatter: Controller.api.formatter.speedPerHour }, { field: 'number_count', title: __('Number_count'), operate: false, formatter: Controller.api.formatter.numberCount }, { field: 'sync_display_text', title: __('Sync_status'), operate: false, formatter: Controller.api.formatter.syncDisplay }, { field: 'status', title: __('Status'), searchList: Config.statusList, formatter: Table.api.formatter.toggle, yes: 'normal', no: 'hidden' }, { field: 'createtime', title: __('Createtime'), operate: 'RANGE', addclass: 'datetimerange', autocomplete: false, formatter: Table.api.formatter.datetime, sortable: true }, { field: 'operate', title: __('Operate'), table: table, events: Table.api.events.operate, formatter: Table.api.formatter.operate } ] ] }); Table.api.bindevent(table); table.on('check.bs.table uncheck.bs.table check-all.bs.table uncheck-all.bs.table', function () { var ids = Table.api.selectedids(table); $('.btn-sync').toggleClass('btn-disabled disabled', ids.length === 0); }); $('.btn-sync').on('click', function (e) { e.preventDefault(); e.stopPropagation(); var ids = Table.api.selectedids(table); if (!ids.length) { Toastr.error(__('Please select at least one record')); return false; } Layer.confirm(__('Sync running'), {icon: 3, title: __('Sync_status_btn')}, function (index) { Layer.close(index); var loadIdx = Layer.load(1, {shade: [0.3, '#000']}); Fast.api.ajax({ url: 'split.ticket/sync', data: {ids: ids.join(',')} }, function (data, ret) { Layer.close(loadIdx); table.bootstrapTable('refresh'); return false; }, function () { Layer.close(loadIdx); }); }); return false; }); }, add: function () { Controller.api.bindevent(); }, edit: function () { Controller.api.bindevent(); }, api: { formatter: { /** * 工单类型:纯文本展示,无链接/标签样式 */ ticketTypePlain: function (value, row) { var text = row.ticket_type_text != null && row.ticket_type_text !== '' ? String(row.ticket_type_text) : (value != null ? String(value) : ''); if (text === '') { return '-'; } return '' + Fast.api.escape(text) + ''; }, /** * 分流链接:纯文本 + 边框背景标记,不可点击 */ splitLinkCode: function (value) { value = value == null ? '' : String(value); if ($.trim(value) === '') { return '-'; } var safe = Fast.api.escape(value); return '' + safe + ''; }, speedPerHour: function (value) { var num = parseFloat(value); if (isNaN(num)) { return '0.00'; } return num.toFixed(2); }, numberCount: function (value, row) { var total = parseInt(value, 10) || 0; var offline = parseInt(row.number_offline_count, 10) || 0; var banned = parseInt(row.number_banned_count, 10) || 0; var tip = __('Number_count_detail').replace('%s', offline).replace('%s', banned); if (offline > 0 || banned > 0) { return '' + total + ''; } return String(total); }, syncDisplay: function (value, row) { var text = value || ''; var color = row.sync_status === 'success' ? 'success' : 'danger'; return '' + Fast.api.escape(text) + ''; } }, bindevent: function () { Form.api.bindevent($('form[role=form]')); Controller.api.fixSelectPlaceholder(); Controller.api.bindNumberTypeToggle(); Controller.api.bindEndTimeCheck(); }, /** * selectpicker 空选项文案改为中文「请选择」 */ fixSelectPlaceholder: function () { var text = __('Please select'); if (!text || text === 'Please select' || text === 'Please Select') { text = '请选择'; } $('#c-ticket_type, #c-split_link_id').each(function () { var $el = $(this); $el.attr({'data-none-selected-text': text, 'title': text}); $el.find('option[value=""]').first().text(text); if ($el.data('selectpicker')) { $el.selectpicker('render'); } }); }, /** * 号码类型为 custom 时显示自定义输入框 */ bindNumberTypeToggle: function () { var $type = $('#c-number_type'); var $wrap = $('.split-number-type-custom'); var $custom = $('#c-number_type_custom'); if (!$type.length) { return; } var toggle = function () { var val = $type.val(); if (val === 'custom') { $wrap.removeClass('hide'); $custom.attr('data-rule', 'required'); } else { $wrap.addClass('hide'); $custom.removeAttr('data-rule'); $custom.val(''); } if ($custom.data('validator')) { $custom.trigger('validate'); } }; $type.on('changed.bs.select change', toggle); toggle(); }, /** * 前端预校验:到期时间须晚于开始时间(后端为准) */ bindEndTimeCheck: function () { var $form = $('form[role=form]'); var $start = $('#c-start_time'); var $end = $('#c-end_time'); if (!$start.length || !$end.length) { return; } var parseTs = function (str) { str = $.trim(str || ''); if (!str) { return 0; } var d = new Date(str.replace(/-/g, '/')); return isNaN(d.getTime()) ? 0 : Math.floor(d.getTime() / 1000); }; $form.on('submit', function (e) { var s = parseTs($start.val()); var en = parseTs($end.val()); if (s > 0 && en > 0 && en <= s) { e.preventDefault(); e.stopImmediatePropagation(); Layer.msg(__('End time must after start')); return false; } }); } } }; return Controller; });