define(['jquery', 'bootstrap', 'backend', 'table', 'form'], function ($, undefined, Backend, Table, Form) { var Controller = { index: function () { Table.api.init({ extend: { index_url: 'split.link/index' + location.search, add_url: 'split.link/add', edit_url: 'split.link/edit', del_url: 'split.link/del', multi_url: 'split.link/multi', table: 'split_link', } }); 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: 'countries_text', title: __('Countries'), operate: false, formatter: Table.api.formatter.content}, { field: 'link_code', title: __('Link_code'), operate: 'LIKE', formatter: Controller.api.formatter.linkCode }, {field: 'description', title: __('Description'), operate: 'LIKE', class: 'autocontent', formatter: Table.api.formatter.content}, { field: 'auto_reply_text', title: __('Reply statements column'), operate: false, formatter: Controller.api.formatter.autoReplyText }, {field: 'ip_protect', title: __('Ip_protect'), searchList: Config.ipProtectList, formatter: Table.api.formatter.status}, {field: 'random_shuffle', title: __('Random_shuffle'), searchList: Config.randomShuffleList, formatter: Table.api.formatter.status}, {field: 'status', title: __('Status'), searchList: Config.statusList, formatter: Table.api.formatter.status}, {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, buttons: [ { name: 'autoreply', text: __('Auto reply'), title: __('Auto reply'), icon: 'fa fa-commenting-o', classname: 'btn btn-warning btn-xs btn-split-autoreply', url: 'javascript:;' } ], formatter: Table.api.formatter.operate } ] ] }); table.on('click', '.btn-copy-split-link', function (e) { e.preventDefault(); e.stopPropagation(); var linkCode = $.trim($(this).data('link-code') || ''); if (!linkCode) { return false; } Controller.api.openCopyModal(linkCode); }); table.on('click', '.btn-copy-link-code-inline', function (e) { e.preventDefault(); e.stopPropagation(); var linkCode = $.trim($(this).data('link-code') || ''); if (linkCode) { Controller.api.copyText(linkCode); } }); table.on('click', '.btn-split-autoreply', function (e) { e.preventDefault(); e.stopPropagation(); e.stopImmediatePropagation(); var rowIndex = $(this).data('row-index'); var row = Table.api.getrowbyindex(table, rowIndex); if (!row || !row.id) { return false; } Controller.api.openAutoReplyModal(row); }); Controller.api.bindAutoReplyPreviewTips(table); Table.api.bindevent(table); }, add: function () { Controller.api.bindevent(); Controller.api.bindLinkCodeInput(); }, edit: function () { Controller.api.bindevent(); }, api: { /** 弹窗样式(仅注入一次) */ modalStyleInjected: false, injectModalStyles: function () { if (Controller.api.modalStyleInjected) { return; } Controller.api.modalStyleInjected = true; var css = [ '.split-link-copy-modal{padding:16px 20px;box-sizing:border-box;}', '.split-link-copy-modal .form-group{margin-bottom:16px;}', '.split-link-copy-modal .control-label{display:block;font-weight:600;color:#444;margin-bottom:8px;}', '.split-link-copy-modal .split-link-code-row{display:flex;align-items:center;flex-wrap:wrap;gap:8px;}', '.split-link-copy-modal .split-link-code-value{font-size:18px;font-weight:600;color:#337ab7;text-decoration:underline;word-break:break-all;}', '.split-link-copy-modal .split-domain-tabs{margin-bottom:0;border-bottom:1px solid #ddd;}', '.split-link-copy-modal .split-domain-tab-box{border:1px solid #ddd;border-top:none;border-radius:0 0 4px 4px;background:#fafafa;overflow:hidden;}', '.split-link-copy-modal .split-domain-tab-box .tab-pane{max-height:280px;overflow-y:auto;overflow-x:hidden;padding:10px 12px;margin:0;}', '.split-link-copy-modal .split-domain-list{display:grid;grid-template-columns:repeat(3,1fr);gap:8px;align-items:stretch;}', '.split-link-copy-modal .split-domain-item{border:1px solid #e8e8e8;border-radius:4px;background:#fff;transition:border-color .2s,box-shadow .2s;height:100%;min-width:0;}', '.split-link-copy-modal .split-domain-item:hover{border-color:#b8d4f0;}', '.split-link-copy-modal .split-domain-item.is-checked{border-color:#337ab7;box-shadow:0 0 0 1px rgba(51,122,183,.15);}', '.split-link-copy-modal .split-domain-item-label{display:flex;align-items:flex-start;gap:8px;margin:0;padding:8px 10px;cursor:pointer;font-weight:normal;width:100%;height:100%;box-sizing:border-box;}', '.split-link-copy-modal .split-domain-item-label input[type=radio]{margin:3px 0 0;flex-shrink:0;}', '.split-link-copy-modal .split-domain-item-body{flex:1;min-width:0;display:flex;flex-direction:column;gap:5px;}', '.split-link-copy-modal .split-domain-name{font-size:13px;font-weight:600;color:#333;word-break:break-all;line-height:1.4;}', '.split-link-copy-modal .split-domain-status{display:flex;flex-direction:column;align-items:flex-start;gap:4px;}', '.split-link-copy-modal .split-domain-status .label{font-size:10px;font-weight:normal;padding:2px 6px;line-height:1.3;white-space:nowrap;margin:0;display:inline-block;max-width:100%;overflow:hidden;text-overflow:ellipsis;}', '.split-link-copy-modal .split-domain-empty{margin:0;padding:20px 12px;color:#999;text-align:center;line-height:1.6;grid-column:1/-1;}', '.split-link-copy-modal .split-tip-box{margin:12px 0;padding:10px 12px;background:#f8f9fa;border-left:3px solid #337ab7;border-radius:0 4px 4px 0;line-height:1.6;color:#666;}', '.split-link-copy-modal .split-generated-url{font-size:12px;}', '.split-link-copy-modal .split-modal-footer{margin-top:16px;padding-top:12px;border-top:1px solid #eee;}' ].join(''); $('').text(css).appendTo('head'); }, formatter: { /** * 回复语:列表最多 50 字 + ...,悬停保留换行显示全文 */ autoReplyText: function (value, row, index) { var full = (row.auto_reply != null && row.auto_reply !== '') ? String(row.auto_reply) : ''; if (full === '') { return '-'; } var preview = value != null && value !== '' ? String(value) : full; var safePreview = Fast.api.escape(preview); var encFull = encodeURIComponent(full); return ''; }, /** * 分流链接列:链接样式 + COPY 图标,点击链接打开弹窗 */ linkCode: function (value) { value = value == null ? '' : value.toString(); if (value === '') { return '-'; } var safe = Fast.api.escape(value); return '' + '' + safe + '' + ' ' + ''; } }, openCopyModal: function (linkCode) { Controller.api.loadCopyModalData(function (data) { Controller.api.renderCopyModal(linkCode, data); }); }, /** 回复语列悬停提示(保留换行) */ autoReplyTipIndex: null, bindAutoReplyPreviewTips: function (table) { table.off('mouseenter.splitAutoReply mouseleave.splitAutoReply') .on('mouseenter.splitAutoReply', '.split-auto-reply-preview', function () { var enc = $(this).attr('data-full'); if (!enc) { return; } var full = ''; try { full = decodeURIComponent(enc); } catch (e) { return; } var html = '
' + __('Split platform domain empty') + ' ' + __('Go system config') + '' + '
'; } var myDomainsHtml = ''; if (myDomains.length) { var items = []; $.each(myDomains, function (i, item) { items.push(Controller.api.buildDomainRadio({ domain: item.domain, type: 'my', checked: defaultType === 'my' && item.domain === defaultDomain, nsText: item.ns_status_text || '', dnsText: item.dns_status_text || '', nsStatus: item.ns_status || '', dnsStatus: item.dns_status || '', showStatus: true })); }); myDomainsHtml = '' + __('Split my domain empty') + '
'; } var initialUrl = Controller.api.buildSplitUrl(defaultDomain, linkCode); var safeLinkCode = Fast.api.escape(linkCode); var html = [ '