mirror of
https://github.com/kiddin9/op-packages.git
synced 2026-11-06 11:24:07 +08:00
🌈 Sync 2026-09-24 15:19:50
This commit is contained in:
1 parent
765ac2b267
commit
87101cc7f2
126 files changed
+4403
-2879
No files matched your search
@@ -36,7 +36,9 @@ function chipValueNodes(spec, val) {
|
||||
return [
|
||||
label + ': ',
|
||||
E('strong', { 'class': 'fwlive-chip-not' }, [_('not')]),
|
||||
' contains ',
|
||||
' ',
|
||||
_('contains'),
|
||||
' ',
|
||||
valueNode
|
||||
];
|
||||
|
||||
|
||||
@@ -11,5 +11,5 @@
|
||||
* GENERATED — do not edit. Edit fwlive.css and run: node scripts/embed-fwlive-css.js
|
||||
*/
|
||||
return baseclass.extend({
|
||||
styleText: "\n.fwlive-map {\n\tmax-width: none;\n\twidth: 100%;\n\t--fwlive-pass-color: var(--success-color-high, var(--success-color, #46a546));\n\t--fwlive-deny-color: var(--error-color-high, var(--error-color, #ca3c3c));\n\t--fwlive-bg-medium: var(--background-color-medium, var(--white-color-low, #f9f9f9));\n\t--fwlive-paused-color: #b45309;\n}\n/* Wide page in Detail only — Simple keeps LuCI’s 940px column. */\n#maincontent.container:has(.fwlive-map[data-view=\"detailed\"]) {\n\tmax-width: none;\n\tpadding-left: 16px;\n\tpadding-right: 16px;\n}\n.fwlive-map[data-row-tint=\"accessible\"] {\n\t--fwlive-pass-color: #0d9488;\n\t--fwlive-deny-color: #c2410c;\n}\n.fwlive-map.fwlive-watch-paused .fwlive-title-row,\n.fwlive-map.fwlive-watch-paused .fwlive-watch-strip {\n\tbackground: rgba(180, 83, 9, 0.08);\n\tbackground: color-mix(in srgb, var(--fwlive-paused-color) 8%, transparent);\n}\n.fwlive-map.fwlive-watch-paused .fwlive-title-row {\n\tmargin: 0 -8px;\n\tpadding: 6px 8px 0;\n\tborder-radius: 3px 3px 0 0;\n}\n.fwlive-map.fwlive-watch-paused .fwlive-watch-strip {\n\tmargin: 0 -8px 10px;\n\tpadding: 8px;\n\tborder-radius: 0 0 3px 3px;\n\tborder-bottom-color: transparent;\n}\n.fwlive-title-row {\n\tdisplay: flex;\n\tflex-wrap: wrap;\n\talign-items: baseline;\n\tjustify-content: space-between;\n\tgap: 8px 16px;\n\tmargin: 0 0 4px;\n}\n.fwlive-title-row h2 {\n\tmargin: 0;\n\tflex: 0 1 auto;\n}\n.fwlive-title-status {\n\tdisplay: inline-flex;\n\talign-items: center;\n\tgap: 8px;\n\tflex-wrap: wrap;\n\tmin-width: 0;\n\tmargin-left: auto;\n}\n.fwlive-watch-strip {\n\tdisplay: flex;\n\tflex-wrap: wrap;\n\talign-items: stretch;\n\tjustify-content: flex-start;\n\tgap: 0;\n\tmin-height: 40px;\n\tpadding: 8px 0 10px;\n\tborder-bottom: 1px solid var(--border-color-medium);\n\tmargin-bottom: 10px;\n}\n.fwlive-watch-group {\n\tdisplay: flex;\n\talign-items: center;\n\tgap: 6px;\n\tmin-height: 28px;\n\tpadding: 0 10px;\n\tborder-left: 1px solid var(--border-color-medium);\n\tflex-wrap: wrap;\n}\n.fwlive-watch-group:last-child {\n\tpadding-right: 0;\n}\n.fwlive-watch-group-label {\n\tmargin-right: 2px;\n\tcolor: var(--text-color-medium);\n\tfont-size: 0.72em;\n\tfont-weight: 700;\n\tletter-spacing: 0.08em;\n\ttext-transform: uppercase;\n\twhite-space: nowrap;\n}\n.fwlive-watch-seg {\n\tdisplay: inline-flex;\n\talign-items: stretch;\n\tborder: 1px solid var(--border-color-medium);\n\tborder-radius: 3px;\n\toverflow: hidden;\n}\n.fwlive-watch-seg .fwlive-seg-btn {\n\tmargin: 0;\n\tborder: 0;\n\tborder-radius: 0;\n\tborder-right: 1px solid var(--border-color-medium);\n\tbackground: transparent;\n\tpadding: 4px 10px;\n\tfont-size: 0.88em;\n\tline-height: 1.25;\n\tmin-height: 28px;\n}\n.fwlive-watch-seg .fwlive-seg-btn:last-child {\n\tborder-right: 0;\n}\n.fwlive-watch-seg .fwlive-seg-btn[aria-pressed=\"true\"] {\n\tbackground: rgba(26, 111, 156, 0.12);\n\tbackground: color-mix(in srgb, var(--primary-color-high) 12%, transparent);\n\tcolor: var(--primary-color-high);\n\tfont-weight: 600;\n}\n.fwlive-watch-label { font-weight: 600; }\n.fwlive-watch-paused .fwlive-watch-label { color: var(--fwlive-paused-color); }\n.fwlive-map.fwlive-watch-paused .fwlive-title-status .fwlive-watch-label { color: var(--fwlive-paused-color); }\n.fwlive-dot {\n\twidth: 8px;\n\theight: 8px;\n\tborder-radius: 50%;\n\tbackground: var(--text-color-low, var(--border-color-high));\n\tdisplay: inline-block;\n\tflex-shrink: 0;\n}\n.fwlive-dot.fwlive-dot-on {\n\tbackground: var(--fwlive-pass-color);\n\tbox-shadow: 0 0 0 3px color-mix(in srgb, var(--fwlive-pass-color) 22%, transparent);\n}\n.fwlive-btn-ghost {\n\tbackground: transparent;\n\tborder-color: var(--border-color-medium);\n}\n.fwlive-btn-quiet {\n\tbackground: transparent;\n\tborder-color: var(--border-color-medium);\n\tcolor: var(--text-color-medium);\n\tfont-weight: 500;\n}\n.fwlive-log-merged {\n\tdisplay: inline-flex;\n\talign-items: center;\n\tgap: 6px;\n\tpadding: 4px 10px;\n\tborder: 1px solid var(--border-color-medium);\n\tborder-radius: 3px;\n\tbackground: var(--background-color-medium, var(--white-color-low, var(--background-color-high)));\n\tcolor: var(--text-color-high);\n\tfont-weight: 500;\n\tfont-size: 0.88em;\n\tline-height: 1.25;\n\tmin-height: 28px;\n\tcursor: pointer;\n}\n.fwlive-log-merged:hover {\n\tbackground: var(--background-color-low, var(--background-color-medium));\n}\n.fwlive-log-merged:disabled {\n\topacity: 0.65;\n\tcursor: default;\n}\n.fwlive-log-on-dot {\n\twidth: 6px;\n\theight: 6px;\n\tborder-radius: 50%;\n\tbackground: var(--fwlive-pass-color);\n\tflex-shrink: 0;\n}\n.fwlive-log-rate {\n\tcolor: var(--text-color-medium);\n\tfont-weight: 400;\n}\n.fwlive-display-bar {\n\tdisplay: flex;\n\tflex-wrap: wrap;\n\talign-items: center;\n\tgap: 8px 14px;\n\tmargin: 0 0 12px;\n\tpadding: 8px 12px;\n\tborder: 1px solid var(--border-color-medium);\n\tborder-radius: 3px;\n\tbackground: var(--background-color-high);\n}\n.fwlive-display-bar-label {\n\tflex: 0 0 auto;\n\tfoLine truncated
|
||||
styleText: "\n/* SPDX-License-Identifier: Apache-2.0 */\n.fwlive-map {\n\tmax-width: none;\n\twidth: 100%;\n\t--fwlive-pass-color: var(--success-color-high, var(--success-color, #46a546));\n\t--fwlive-deny-color: var(--error-color-high, var(--error-color, #ca3c3c));\n\t--fwlive-bg-medium: var(--background-color-medium, var(--white-color-low, #f9f9f9));\n\t--fwlive-paused-color: #b45309;\n}\n/* Wide page in Detail only — Simple keeps LuCI’s 940px column. */\n#maincontent.container:has(.fwlive-map[data-view=\"detailed\"]) {\n\tmax-width: none;\n\tpadding-left: 16px;\n\tpadding-right: 16px;\n}\n.fwlive-map[data-row-tint=\"accessible\"] {\n\t--fwlive-pass-color: #0d9488;\n\t--fwlive-deny-color: #c2410c;\n}\n.fwlive-map.fwlive-watch-paused .fwlive-title-row,\n.fwlive-map.fwlive-watch-paused .fwlive-watch-strip {\n\tbackground: rgba(180, 83, 9, 0.08);\n\tbackground: color-mix(in srgb, var(--fwlive-paused-color) 8%, transparent);\n}\n.fwlive-map.fwlive-watch-paused .fwlive-title-row {\n\tmargin: 0 -8px;\n\tpadding: 6px 8px 0;\n\tborder-radius: 3px 3px 0 0;\n}\n.fwlive-map.fwlive-watch-paused .fwlive-watch-strip {\n\tmargin: 0 -8px 10px;\n\tpadding: 8px;\n\tborder-radius: 0 0 3px 3px;\n\tborder-bottom-color: transparent;\n}\n.fwlive-title-row {\n\tdisplay: flex;\n\tflex-wrap: wrap;\n\talign-items: baseline;\n\tjustify-content: space-between;\n\tgap: 8px 16px;\n\tmargin: 0 0 4px;\n}\n.fwlive-title-row h2 {\n\tmargin: 0;\n\tflex: 0 1 auto;\n}\n.fwlive-title-status {\n\tdisplay: inline-flex;\n\talign-items: center;\n\tgap: 8px;\n\tflex-wrap: wrap;\n\tmin-width: 0;\n\tmargin-left: auto;\n}\n.fwlive-watch-strip {\n\tdisplay: flex;\n\tflex-wrap: wrap;\n\talign-items: stretch;\n\tjustify-content: flex-start;\n\tgap: 0;\n\tmin-height: 40px;\n\tpadding: 8px 0 10px;\n\tborder-bottom: 1px solid var(--border-color-medium);\n\tmargin-bottom: 10px;\n}\n.fwlive-watch-group {\n\tdisplay: flex;\n\talign-items: center;\n\tgap: 6px;\n\tmin-height: 28px;\n\tpadding: 0 10px;\n\tborder-left: 1px solid var(--border-color-medium);\n\tflex-wrap: wrap;\n}\n.fwlive-watch-group:last-child {\n\tpadding-right: 0;\n}\n.fwlive-watch-group-label {\n\tmargin-right: 2px;\n\tcolor: var(--text-color-medium);\n\tfont-size: 0.72em;\n\tfont-weight: 700;\n\tletter-spacing: 0.08em;\n\ttext-transform: uppercase;\n\twhite-space: nowrap;\n}\n.fwlive-watch-seg {\n\tdisplay: inline-flex;\n\talign-items: stretch;\n\tborder: 1px solid var(--border-color-medium);\n\tborder-radius: 3px;\n\toverflow: hidden;\n}\n.fwlive-watch-seg .fwlive-seg-btn {\n\tmargin: 0;\n\tborder: 0;\n\tborder-radius: 0;\n\tborder-right: 1px solid var(--border-color-medium);\n\tbackground: transparent;\n\tpadding: 4px 10px;\n\tfont-size: 0.88em;\n\tline-height: 1.25;\n\tmin-height: 28px;\n}\n.fwlive-watch-seg .fwlive-seg-btn:last-child {\n\tborder-right: 0;\n}\n.fwlive-watch-seg .fwlive-seg-btn[aria-pressed=\"true\"] {\n\tbackground: rgba(26, 111, 156, 0.12);\n\tbackground: color-mix(in srgb, var(--primary-color-high) 12%, transparent);\n\tcolor: var(--primary-color-high);\n\tfont-weight: 600;\n}\n.fwlive-watch-label { font-weight: 600; }\n.fwlive-watch-paused .fwlive-watch-label { color: var(--fwlive-paused-color); }\n.fwlive-map.fwlive-watch-paused .fwlive-title-status .fwlive-watch-label { color: var(--fwlive-paused-color); }\n.fwlive-dot {\n\twidth: 8px;\n\theight: 8px;\n\tborder-radius: 50%;\n\tbackground: var(--text-color-low, var(--border-color-high));\n\tdisplay: inline-block;\n\tflex-shrink: 0;\n}\n.fwlive-dot.fwlive-dot-on {\n\tbackground: var(--fwlive-pass-color);\n\tbox-shadow: 0 0 0 3px color-mix(in srgb, var(--fwlive-pass-color) 22%, transparent);\n}\n.fwlive-btn-ghost {\n\tbackground: transparent;\n\tborder-color: var(--border-color-medium);\n}\n.fwlive-btn-quiet {\n\tbackground: transparent;\n\tborder-color: var(--border-color-medium);\n\tcolor: var(--text-color-medium);\n\tfont-weight: 500;\n}\n.fwlive-log-merged {\n\tdisplay: inline-flex;\n\talign-items: center;\n\tgap: 6px;\n\tpadding: 4px 10px;\n\tborder: 1px solid var(--border-color-medium);\n\tborder-radius: 3px;\n\tbackground: var(--background-color-medium, var(--white-color-low, var(--background-color-high)));\n\tcolor: var(--text-color-high);\n\tfont-weight: 500;\n\tfont-size: 0.88em;\n\tline-height: 1.25;\n\tmin-height: 28px;\n\tcursor: pointer;\n}\n.fwlive-log-merged:hover {\n\tbackground: var(--background-color-low, var(--background-color-medium));\n}\n.fwlive-log-merged:disabled {\n\topacity: 0.65;\n\tcursor: default;\n}\n.fwlive-log-on-dot {\n\twidth: 6px;\n\theight: 6px;\n\tborder-radius: 50%;\n\tbackground: var(--fwlive-pass-color);\n\tflex-shrink: 0;\n}\n.fwlive-log-rate {\n\tcolor: var(--text-color-medium);\n\tfont-weight: 400;\n}\n.fwlive-display-bar {\n\tdisplay: flex;\n\tflex-wrap: wrap;\n\talign-items: center;\n\tgap: 8px 14px;\n\tmargin: 0 0 12px;\n\tpadding: 8px 12px;\n\tborder: 1px solid var(--border-color-medium);\n\tborder-radius: 3px;\n\tbackground: var(--background-color-high);\n}\n.fwlive-dLine truncated
|
||||
});
|
||||
@@ -1,3 +1,4 @@
|
||||
/* SPDX-License-Identifier: Apache-2.0 */
|
||||
.fwlive-map {
|
||||
max-width: none;
|
||||
width: 100%;
|
||||
|
||||
@@ -5,81 +5,103 @@
|
||||
|
||||
/**
|
||||
* Shared classify logic mirrors core/fwlive-log.js CLASSIFY_SPEC — keep in sync
|
||||
* (gen-luci-wrapper.js gates full-spec drift; ./scripts/gen-all.sh verifies).
|
||||
* (gen-luci-wrapper.js gates full-spec + regex drift; ./scripts/gen-all.sh verifies).
|
||||
* LuCI-only helpers live in the @fwlive-codegen:luci-preserve region.
|
||||
*/
|
||||
const CLASSIFY_SPEC = {
|
||||
glueKeys: [
|
||||
'IN',
|
||||
'OUT',
|
||||
'SRC',
|
||||
'DST',
|
||||
'PROTO',
|
||||
'SPT',
|
||||
'DPT',
|
||||
'LEN',
|
||||
'MAC',
|
||||
'TYPE',
|
||||
'CODE',
|
||||
'TTL',
|
||||
'TOS',
|
||||
'PREC',
|
||||
'DF'
|
||||
],
|
||||
nonFirewallPrefixes: [
|
||||
'dnsmasq',
|
||||
'procd',
|
||||
'ubusd',
|
||||
'netifd',
|
||||
'odhcpd',
|
||||
'logd',
|
||||
'dropbear',
|
||||
'uhttpd',
|
||||
'hostapd',
|
||||
'wpad'
|
||||
],
|
||||
nonFirewallPrefixHyphenContinuation: true,
|
||||
firewallHints: ['fw4', 'nft', 'iptables', 'kernel', 'firewall'],
|
||||
actionWords: ['ACCEPT', 'ALLOW', 'PASS', 'DROP', 'REJECT', 'DENY', 'BLOCK'],
|
||||
rules: [
|
||||
{
|
||||
or: [
|
||||
{ and: [{ kv: ['SRC'] }, { kv: ['DST'] }] },
|
||||
{
|
||||
and: [
|
||||
{ kvAny: ['IN', 'OUT'] },
|
||||
{ kvAny: ['SRC', 'DST', 'PROTO', 'SPT', 'DPT'] }
|
||||
]
|
||||
},
|
||||
{ and: [{ action: 'known' }, { kvAny: ['IN', 'OUT', 'PROTO', 'SRC', 'DST'] }] }
|
||||
]
|
||||
},
|
||||
{ and: [{ hint: true }, { action: 'known' }] },
|
||||
{ and: [{ hint: true }, { kvAny: ['IN', 'OUT', 'SRC', 'DST', 'PROTO'] }] }
|
||||
]
|
||||
};
|
||||
|
||||
function wordPattern(words) {
|
||||
const alt = words.join('|');
|
||||
return new RegExp('(^|[^A-Za-z0-9_])(' + alt + ')([^A-Za-z0-9_]|$)', 'i');
|
||||
}
|
||||
|
||||
/* ---- spec-derived classification regexes (mirror core/fwlive-log.js) ---- */
|
||||
const DENY_CLASS_WORDS = CLASSIFY_SPEC.actionWords.slice(3);
|
||||
const NON_FIREWALL_PREFIX = new RegExp(
|
||||
'^(' +
|
||||
CLASSIFY_SPEC.nonFirewallPrefixes.join('|') +
|
||||
')(' +
|
||||
(CLASSIFY_SPEC.nonFirewallPrefixHyphenContinuation ? '[^A-Za-z0-9_-]' : '[^A-Za-z0-9_]') +
|
||||
'|$)',
|
||||
'i'
|
||||
);
|
||||
const FIREWALL_HINT = wordPattern(CLASSIFY_SPEC.firewallHints);
|
||||
const ACTION_RE = wordPattern(CLASSIFY_SPEC.actionWords);
|
||||
const DENY_ACTION = wordPattern(DENY_CLASS_WORDS);
|
||||
const DENY_ACTION_UNDERSCORE = new RegExp(
|
||||
'(?:^|[^A-Za-z0-9])(?:' + DENY_CLASS_WORDS.join('|') + ')(?:[^A-Za-z0-9]|$)',
|
||||
'i'
|
||||
);
|
||||
const NETFILTER_KV_GLUE = new RegExp(
|
||||
'([^\\s])(?=(' + CLASSIFY_SPEC.glueKeys.join('|') + ')=)',
|
||||
'g'
|
||||
);
|
||||
|
||||
return baseclass.extend({
|
||||
CLASSIFY_SPEC: {
|
||||
glueKeys: [
|
||||
'IN',
|
||||
'OUT',
|
||||
'SRC',
|
||||
'DST',
|
||||
'PROTO',
|
||||
'SPT',
|
||||
'DPT',
|
||||
'LEN',
|
||||
'MAC',
|
||||
'TYPE',
|
||||
'CODE',
|
||||
'TTL',
|
||||
'TOS',
|
||||
'PREC',
|
||||
'DF'
|
||||
],
|
||||
nonFirewallPrefixes: [
|
||||
'dnsmasq',
|
||||
'procd',
|
||||
'ubusd',
|
||||
'netifd',
|
||||
'odhcpd',
|
||||
'logd',
|
||||
'dropbear',
|
||||
'uhttpd',
|
||||
'hostapd',
|
||||
'wpad'
|
||||
],
|
||||
nonFirewallPrefixHyphenContinuation: true,
|
||||
firewallHints: ['fw4', 'nft', 'iptables', 'kernel', 'firewall'],
|
||||
actionWords: ['ACCEPT', 'ALLOW', 'PASS', 'DROP', 'REJECT', 'DENY', 'BLOCK'],
|
||||
rules: [
|
||||
{
|
||||
or: [
|
||||
{ and: [{ kv: ['SRC'] }, { kv: ['DST'] }] },
|
||||
{
|
||||
and: [
|
||||
{ kvAny: ['IN', 'OUT'] },
|
||||
{ kvAny: ['SRC', 'DST', 'PROTO', 'SPT', 'DPT'] }
|
||||
]
|
||||
},
|
||||
{ and: [{ action: 'known' }, { kvAny: ['IN', 'OUT', 'PROTO', 'SRC', 'DST'] }] }
|
||||
]
|
||||
},
|
||||
{ and: [{ hint: true }, { action: 'known' }] },
|
||||
{ and: [{ hint: true }, { kvAny: ['IN', 'OUT', 'SRC', 'DST', 'PROTO'] }] }
|
||||
]
|
||||
},
|
||||
CLASSIFY_SPEC: CLASSIFY_SPEC,
|
||||
|
||||
TCP_FLAG_TAIL:
|
||||
/\b((?:SYN|ACK|FIN|RST|PSH|URG)(?:\s+(?:SYN|ACK|FIN|RST|PSH|URG))*)(?:\s+[A-Z][A-Z0-9_]*=[^\s]+)*\s*$/i,
|
||||
NETFILTER_KV_GLUE:
|
||||
/([^\s])(?=(IN|OUT|SRC|DST|PROTO|SPT|DPT|LEN|MAC|TYPE|CODE|TTL|TOS|PREC|DF)=)/g,
|
||||
|
||||
wordPattern: function (words) {
|
||||
const alt = words.join('|');
|
||||
return new RegExp('(^|[^A-Za-z0-9_])(' + alt + ')([^A-Za-z0-9_]|$)', 'i');
|
||||
},
|
||||
NETFILTER_KV_GLUE: NETFILTER_KV_GLUE,
|
||||
|
||||
kvHas: function (msg, key) {
|
||||
return new RegExp('(^|[^A-Za-z0-9_])' + key + '=').test(msg);
|
||||
},
|
||||
|
||||
NON_FIREWALL_PREFIX:
|
||||
/^(dnsmasq|procd|ubusd|netifd|odhcpd|logd|dropbear|uhttpd|hostapd|wpad)([^A-Za-z0-9_-]|$)/i,
|
||||
FIREWALL_HINT: /(^|[^A-Za-z0-9_])(fw4|nft|iptables|kernel|firewall)([^A-Za-z0-9_]|$)/i,
|
||||
ACTION_RE: /(^|[^A-Za-z0-9_])(ACCEPT|ALLOW|PASS|DROP|REJECT|DENY|BLOCK)([^A-Za-z0-9_]|$)/i,
|
||||
DENY_ACTION: /(^|[^A-Za-z0-9_])(DROP|REJECT|DENY|BLOCK)([^A-Za-z0-9_]|$)/i,
|
||||
DENY_ACTION_UNDERSCORE: /(?:^|[^A-Za-z0-9])(?:DROP|REJECT|DENY|BLOCK)(?:[^A-Za-z0-9]|$)/i,
|
||||
NON_FIREWALL_PREFIX: NON_FIREWALL_PREFIX,
|
||||
FIREWALL_HINT: FIREWALL_HINT,
|
||||
ACTION_RE: ACTION_RE,
|
||||
DENY_ACTION: DENY_ACTION,
|
||||
DENY_ACTION_UNDERSCORE: DENY_ACTION_UNDERSCORE,
|
||||
MAX_DATE_SECONDS: 8640000000000,
|
||||
|
||||
normalizeNetfilterMessage: function (message) {
|
||||
@@ -288,24 +310,6 @@ return baseclass.extend({
|
||||
return '%s:%s:%s'.format(pad(d.getHours()), pad(d.getMinutes()), pad(d.getSeconds()));
|
||||
},
|
||||
|
||||
formatFlowDisplay: function (row) {
|
||||
const src = row && row.src ? String(row.src) : '';
|
||||
const dst = row && row.dst ? String(row.dst) : '';
|
||||
const sport = row && row.sport ? String(row.sport) : '';
|
||||
const dport = row && row.dport ? String(row.dport) : '';
|
||||
let left = src;
|
||||
let right = dst;
|
||||
|
||||
if (sport) left = left ? left + ':' + sport : ':' + sport;
|
||||
if (dport) right = right ? right + ':' + dport : ':' + dport;
|
||||
|
||||
if (!left && !right) return '—';
|
||||
if (!right) return left;
|
||||
if (!left) return '→ ' + right;
|
||||
|
||||
return left + ' → ' + right;
|
||||
},
|
||||
|
||||
formatCell: function (value) {
|
||||
if (value == null || value === '') return '';
|
||||
|
||||
@@ -459,14 +463,7 @@ return baseclass.extend({
|
||||
const p = this.parseFilterValue(val);
|
||||
if (!p.value) return '';
|
||||
|
||||
if (p.negate) {
|
||||
if (field === 'q' || field === 'src' || field === 'dst')
|
||||
return '%s: not contains %s'.format(field, p.value);
|
||||
|
||||
return '%s: not %s'.format(field, p.value);
|
||||
}
|
||||
|
||||
return '%s: %s'.format(field, val);
|
||||
return _('%s: %s').format(field, val);
|
||||
},
|
||||
|
||||
matchesTextField: function (haystack, spec) {
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
*
|
||||
* renderToolbar(host, state, callbacks) → void
|
||||
* host - #fwlive-logging-bar strip slot (cleared and rebuilt; element kept)
|
||||
* state - { loggingStatus, loggingBusy, entriesLength, loggingNotice }
|
||||
* state - { loggingStatus, loggingBusy, loggingNotice }
|
||||
* callbacks - { onEnable(), onDisable() }
|
||||
*
|
||||
* G Hybrid chrome: when WAN logging is on, one merged control carries status +
|
||||
|
||||
@@ -854,7 +854,6 @@ return view.extend({
|
||||
return {
|
||||
loggingStatus: this.loggingStatus,
|
||||
loggingBusy: this.loggingBusy,
|
||||
entriesLength: this.entries.length,
|
||||
loggingNotice: this.loggingNotice,
|
||||
showConsent: this.shouldShowLoggingConsent()
|
||||
};
|
||||
|
||||
Reference in new issue
Block a user