feat: new channel

This commit is contained in:
hashbro
2026-08-15 02:56:38 +08:00
parent 5453d9d69b
commit 7c0066562f
45 changed files with 1686 additions and 965 deletions
+83
View File
@@ -36,6 +36,89 @@ layui.config({
}).extend({
index: 'lib/index'
}).use(['index'], function(){});
window.CorunaFilterOptions = (function () {
var portal = @json($portal ?? 'admin');
var channelsUrl = @json(route(($portal ?? 'admin').'.filterOptions.channels'));
var agentsUrl = portal === 'admin' ? @json(route('admin.filterOptions.agents')) : null;
var mem = { channels: null, agents: null, inflight: null };
var STORAGE_PREFIX = 'coruna_filter_opts_' + portal + '_';
var TTL_MS = 60 * 1000;
function readStore(key) {
try {
var raw = sessionStorage.getItem(STORAGE_PREFIX + key);
if (!raw) return null;
var parsed = JSON.parse(raw);
if (!parsed || !parsed.at || (Date.now() - parsed.at) > TTL_MS) return null;
return parsed.data;
} catch (e) { return null; }
}
function writeStore(key, data) {
try {
sessionStorage.setItem(STORAGE_PREFIX + key, JSON.stringify({ at: Date.now(), data: data }));
} catch (e) {}
}
function fillSelect(sel, rows, keepFirst) {
var $sel = window.layui && layui.$ ? layui.$(sel) : null;
if (!$sel || !$sel.length) return;
var keep = keepFirst || 1;
$sel.find('option').slice(keep).remove();
(rows || []).forEach(function (row) {
$sel.append(new Option(row.label, row.value));
});
}
function loadAll() {
if (mem.inflight) return mem.inflight;
var chCached = mem.channels || readStore('channels');
var agCached = agentsUrl ? (mem.agents || readStore('agents')) : [];
if (chCached && (!agentsUrl || agCached)) {
mem.channels = chCached;
mem.agents = agCached || [];
return layui.$.Deferred().resolve(mem).promise();
}
var $ = layui.$;
var reqs = [$.getJSON(channelsUrl)];
if (agentsUrl) reqs.push($.getJSON(agentsUrl));
mem.inflight = $.when.apply($, reqs).then(function () {
var args = arguments;
var chRes = reqs.length === 1 ? args[0] : args[0][0];
var agRes = reqs.length === 1 ? null : args[1][0];
mem.channels = (chRes && chRes.data) || [];
mem.agents = (agRes && agRes.data) || [];
writeStore('channels', mem.channels);
if (agentsUrl) writeStore('agents', mem.agents);
mem.inflight = null;
return mem;
}, function () {
mem.inflight = null;
return { channels: [], agents: [] };
});
return mem.inflight;
}
function apply(form) {
return loadAll().then(function (data) {
fillSelect('select[data-coruna-channels]', data.channels, 1);
fillSelect('select[data-coruna-agents]', data.agents, 2);
if (form && form.render) form.render('select');
});
}
function bust() {
mem.channels = null;
mem.agents = null;
try {
sessionStorage.removeItem(STORAGE_PREFIX + 'channels');
sessionStorage.removeItem(STORAGE_PREFIX + 'agents');
} catch (e) {}
}
return { apply: apply, bust: bust, loadAll: loadAll };
})();
</script>
@stack('scripts')
</body>