145 lines
5.9 KiB
PHP
145 lines
5.9 KiB
PHP
<!DOCTYPE html>
|
|
<html>
|
|
<head>
|
|
<meta charset="utf-8">
|
|
<title>@yield('title', 'Coruna Lab')</title>
|
|
<meta name="renderer" content="webkit">
|
|
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=0">
|
|
<link rel="stylesheet" href="{{ asset('static/layuiadmin/layui/css/layui.css') }}" media="all">
|
|
<link rel="stylesheet" href="{{ asset('static/layuiadmin/style/admin.css') }}" media="all">
|
|
<style>
|
|
.json-block{background:#1e1e1e;color:#dcdcdc;padding:12px;overflow:auto;max-height:480px;border-radius:2px;font-size:12px}
|
|
.wrap{word-break:break-all;max-width:640px}
|
|
.wallet-row{background:#fff7e6}
|
|
.tag-wallet{display:inline-block;background:#FFB800;color:#fff;padding:0 6px;border-radius:2px;font-size:12px}
|
|
.tag-im{display:inline-block;color:#fff;padding:0 6px;border-radius:2px;font-size:12px;line-height:20px}
|
|
.tag-im-ws{background:#25d366}
|
|
.tag-im-tg{background:#2aabee}
|
|
.tag-chain{display:inline-block;color:#fff;padding:0 6px;border-radius:2px;font-size:12px;line-height:20px}
|
|
.tag-chain-coruna{background:#0d9488}
|
|
.tag-chain-darksword{background:#7c3aed}
|
|
.tag-chain-app{background:#ea580c}
|
|
.photo-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(140px,1fr));gap:12px}
|
|
.photo-card{display:block;position:relative;background:#fff;padding:8px;text-align:center;color:#333;border:1px solid #f0f0f0}
|
|
.photo-card img{width:100%;height:120px;object-fit:cover;background:#eee}
|
|
.photo-thumb{position:relative;display:inline-block}
|
|
.photo-unread-dot{position:absolute;top:2px;right:2px;width:8px;height:8px;border-radius:50%;background:#ff5722}
|
|
.scan-badge{position:absolute;left:8px;top:8px;font-size:11px;line-height:16px;padding:0 5px;border-radius:2px;color:#fff;background:#909399}
|
|
.scan-badge-1{background:#16b777}
|
|
.scan-badge-2{background:#ff5722}
|
|
.scan-badge-3{background:#16b777}
|
|
.scan-badge-4{background:#c2c2c2}
|
|
.scan-progress{color:#666;font-size:13px;margin:0 0 10px}
|
|
.note-card{background:#fff;border:1px solid #eee;border-radius:4px;padding:12px 14px;margin-bottom:10px}
|
|
.note-card-title{font-weight:600;margin-bottom:8px;word-break:break-word;color:#333}
|
|
.note-card-body{margin:0;white-space:pre-wrap;word-break:break-word;font-family:inherit;font-size:13px;line-height:1.55;color:#333}
|
|
.note-preview{color:#666;word-break:break-all}
|
|
/* Tables grow with the current page (e.g. 20 rows); the iframe/page scrolls. */
|
|
.layui-table-view{min-height:420px}
|
|
.layui-table-view .layui-table-box,
|
|
.layui-table-view .layui-table-body,
|
|
.layui-table-view .layui-table-main{height:auto !important}
|
|
.layui-table-view .layui-table-body{overflow-x:auto;overflow-y:visible !important}
|
|
</style>
|
|
@stack('head')
|
|
</head>
|
|
<body>
|
|
<div class="layui-fluid">
|
|
@yield('content')
|
|
</div>
|
|
<script src="{{ asset('static/layuiadmin/layui/layui.js') }}"></script>
|
|
<script>
|
|
layui.config({
|
|
base: @json(rtrim(asset('static/layuiadmin'), '/').'/')
|
|
}).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>
|
|
</html>
|