Phase 2: FR/EN toggle, dark mode, recherche multi-section
This commit is contained in:
+297
-239
@@ -3,132 +3,136 @@
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>SysCmd — Command Reference</title>
|
||||
<title>SysCmd</title>
|
||||
<style>
|
||||
:root{--bg:#f8fafc;--fg:#0f172a;--sidebar:#fff;--brd:#e2e8f0;--brd2:#f1f5f9;--muted:#94a3b8;--txt:#475569;--title:#0f172a;--hover:#f1f5f9;--alt:#fafbfc;--actbg:#0f172a;--actfg:#fff;--boxbg:#fff}
|
||||
.dark{--bg:#0b1120;--fg:#e2e8f0;--sidebar:#0f172a;--brd:#1e293b;--brd2:#1e293b;--muted:#64748b;--txt:#94a3b8;--title:#f1f5f9;--hover:#1e293b;--alt:#151e30;--actbg:#3b82f6;--actfg:#fff;--boxbg:#1e293b}
|
||||
*{box-sizing:border-box;margin:0;padding:0}
|
||||
body{font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,sans-serif;background:#f8fafc;color:#0f172a;line-height:1.5}
|
||||
.sbar{width:14rem;border-right:1px solid #e2e8f0;background:#fff;display:flex;flex-direction:column;min-height:100vh;padding:12px 0;overflow-y:auto;flex-shrink:0}
|
||||
body{font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,sans-serif;background:var(--bg);color:var(--fg);line-height:1.5;transition:background .2s,color .2s}
|
||||
.sbar{width:14rem;border-right:1px solid var(--brd);background:var(--sidebar);display:flex;flex-direction:column;min-height:100vh;padding:12px 0;overflow-y:auto;flex-shrink:0;transition:border .2s,background .2s}
|
||||
.main{flex:1;padding:24px;max-width:960px}
|
||||
.tree{flex:1;overflow-y:auto}
|
||||
.grp{font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:.05em;color:#94a3b8;padding:8px 12px 4px}
|
||||
.slk{display:flex;align-items:center;gap:6px;padding:4px 10px;border-radius:6px;font-size:13px;font-weight:500;cursor:pointer;color:#475569;transition:all .12s;user-select:none}
|
||||
.slk:hover{background:#f1f5f9;color:#0f172a}
|
||||
.slk.act{background:#0f172a;color:#fff}
|
||||
.grp{font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:.05em;color:var(--muted);padding:8px 12px 4px}
|
||||
.slk{display:flex;align-items:center;gap:6px;padding:4px 10px;border-radius:6px;font-size:13px;font-weight:500;cursor:pointer;color:var(--txt);transition:all .12s;user-select:none}
|
||||
.slk:hover{background:var(--hover);color:var(--title)}
|
||||
.slk.act{background:var(--actbg);color:var(--actfg)}
|
||||
.slk3{padding-left:48px;font-size:12px}
|
||||
.slk4{padding-left:64px;font-size:11px;font-weight:400}
|
||||
.tgl{display:inline-flex;align-items:center;justify-content:center;width:16px;height:16px;flex-shrink:0;transition:transform .15s;color:#94a3b8}
|
||||
.tgl{display:inline-flex;align-items:center;justify-content:center;width:16px;height:16px;flex-shrink:0;transition:transform .15s;color:var(--muted)}
|
||||
.tgl.o{transform:rotate(90deg)}
|
||||
.chd{display:none}
|
||||
.chd.o{display:block}
|
||||
.chd{display:none}.chd.o{display:block}
|
||||
.dg{width:6px;height:6px;border-radius:50%;background:#22c55e;flex-shrink:0}
|
||||
.dgr{width:6px;height:6px;border-radius:50%;background:#cbd5e1;flex-shrink:0}
|
||||
.dgr{width:6px;height:6px;border-radius:50%;background:var(--muted);flex-shrink:0}
|
||||
.do{width:6px;height:6px;border-radius:50%;background:#f59e0b;flex-shrink:0}
|
||||
.bd{font-size:11px;color:#94a3b8;display:flex;gap:6px;align-items:center;margin-bottom:2px}
|
||||
.bd .c{color:#0f172a;font-weight:500}
|
||||
.bd{font-size:11px;color:var(--muted);display:flex;gap:6px;align-items:center;margin-bottom:2px}
|
||||
.bd .c{color:var(--title);font-weight:500}
|
||||
.scmd{display:grid;grid-template-columns:190px 1fr;align-items:start;padding:4px 12px;border-radius:5px;font-size:13px;gap:8px;transition:background .1s}
|
||||
.scmd:hover{background:#f1f5f9}
|
||||
.scmd .d{color:#475569;font-weight:500;line-height:1.4}
|
||||
.scmd .t{font-family:Consolas,'Courier New',monospace;font-size:12px;color:#0f172a;cursor:pointer;display:inline-flex;align-items:center;gap:6px;line-height:1.4;word-break:break-all}
|
||||
.scmd:hover{background:var(--hover)}
|
||||
.scmd .d{color:var(--txt);font-weight:500;line-height:1.4}
|
||||
.scmd .t{font-family:Consolas,'Courier New',monospace;font-size:12px;color:var(--title);cursor:pointer;display:inline-flex;align-items:center;gap:6px;line-height:1.4;word-break:break-all}
|
||||
.scmd .t:hover .cp{opacity:1}
|
||||
.cp{opacity:0;width:14px;height:14px;flex-shrink:0;color:#94a3b8;transition:opacity .12s}
|
||||
.alt{background:#fafbfc}
|
||||
.stab{padding:4px 10px;border-radius:5px;font-size:11px;font-weight:500;cursor:pointer;border:1px solid #e2e8f0;color:#64748b;white-space:nowrap;transition:all .12s}
|
||||
.stab.a{background:#0f172a;color:#fff;border-color:#0f172a}
|
||||
.stab:hover:not(.a){background:#f1f5f9}
|
||||
.si{width:100%;padding:7px 12px 7px 34px;border-radius:8px;font-size:13px;outline:none;border:1.5px solid #e2e8f0;background:#fff;transition:border-color .12s}
|
||||
.si:focus{border-color:#0f172a}
|
||||
.oc{border-radius:10px;border:1px solid #e2e8f0;background:#fff;cursor:pointer;transition:all .15s;padding:16px}
|
||||
.oc:hover{border-color:#0f172a;box-shadow:0 2px 12px rgba(0,0,0,.08)}
|
||||
.cp{opacity:0;width:14px;height:14px;flex-shrink:0;color:var(--muted);transition:opacity .12s}
|
||||
.alt{background:var(--alt)}
|
||||
.orig{background:#fcfce0}
|
||||
.stab{padding:4px 10px;border-radius:5px;font-size:11px;font-weight:500;cursor:pointer;border:1px solid var(--brd);color:var(--txt);white-space:nowrap;transition:all .12s}
|
||||
.stab.a{background:var(--actbg);color:var(--actfg);border-color:var(--actbg)}
|
||||
.stab:hover:not(.a){background:var(--hover)}
|
||||
.si{width:100%;padding:7px 12px 7px 34px;border-radius:8px;font-size:13px;outline:none;border:1.5px solid var(--brd);background:var(--boxbg);color:var(--fg);transition:border-color .12s,background .2s,color .2s}
|
||||
.si:focus{border-color:var(--actbg)}
|
||||
.si::placeholder{color:var(--muted)}
|
||||
.oc{border-radius:10px;border:1px solid var(--brd);background:var(--boxbg);cursor:pointer;transition:all .15s;padding:16px}
|
||||
.oc:hover{border-color:var(--actbg);box-shadow:0 2px 12px rgba(0,0,0,.15)}
|
||||
.oc .ic{width:36px;height:36px;border-radius:8px;display:flex;align-items:center;justify-content:center;flex-shrink:0}
|
||||
.oc .sl{font-size:11px;color:#94a3b8}
|
||||
.oc.ph{opacity:.6}
|
||||
.oc.ph:hover{opacity:.8}
|
||||
.oc .sl{font-size:11px;color:var(--muted)}
|
||||
.oc.ph{opacity:.6}.oc.ph:hover{opacity:.8}
|
||||
.emp{padding:40px 16px;max-width:360px;margin:0 auto;text-align:center}
|
||||
.emp h3{font-weight:600;font-size:15px;margin-bottom:4px;color:#0f172a}
|
||||
.emp p{font-size:13px;color:#94a3b8;line-height:1.5}
|
||||
.sb{border:1px solid #e2e8f0;border-radius:10px;background:#fff;text-align:center;padding:12px}
|
||||
.sb .n{font-size:20px;font-weight:700;color:#0f172a}
|
||||
.sb .l{font-size:11px;color:#94a3b8}
|
||||
.cl{font-size:11px;font-weight:700;text-transform:uppercase;letter-spacing:.05em;color:#94a3b8;margin-top:8px;margin-bottom:4px}
|
||||
.emp h3{font-weight:600;font-size:15px;margin-bottom:4px;color:var(--title)}
|
||||
.emp p{font-size:13px;color:var(--muted);line-height:1.5}
|
||||
.sb{border:1px solid var(--brd);border-radius:10px;background:var(--boxbg);text-align:center;padding:12px;transition:background .2s,border .2s}
|
||||
.sb .n{font-size:20px;font-weight:700;color:var(--title)}
|
||||
.sb .l{font-size:11px;color:var(--muted)}
|
||||
.cl{font-size:11px;font-weight:700;text-transform:uppercase;letter-spacing:.05em;color:var(--muted);margin-top:8px;margin-bottom:4px;grid-column:1/-1}
|
||||
.gp{display:flex;gap:4px;flex-wrap:wrap;margin-bottom:12px}
|
||||
.lr{display:flex;gap:12px;align-items:center;margin-bottom:12px;font-size:11px;color:#64748b}
|
||||
.p8{padding:24px;font-size:13px;color:#94a3b8}
|
||||
.cmdbox{background:#fff;border:1px solid #e2e8f0;border-radius:12px;overflow:hidden}
|
||||
.cmdbox .s{font-size:11px;color:#94a3b8;padding:8px 12px;border-bottom:1px solid #f1f5f9}
|
||||
.lr{display:flex;gap:12px;align-items:center;margin-bottom:12px;font-size:11px;color:var(--txt)}
|
||||
.p8{padding:24px;font-size:13px;color:var(--muted)}
|
||||
.cmdbox{background:var(--boxbg);border:1px solid var(--brd);border-radius:12px;overflow:hidden;transition:background .2s,border .2s}
|
||||
.cmdbox .s{font-size:11px;color:var(--muted);padding:8px 12px;border-bottom:1px solid var(--brd2)}
|
||||
.lbtn{padding:3px 8px;border-radius:5px;font-size:10px;font-weight:600;cursor:pointer;border:1.5px solid var(--brd);background:transparent;color:var(--muted);transition:all .12s;font-family:inherit}
|
||||
.lbtn.a{background:var(--actbg);color:var(--actfg);border-color:var(--actbg)}
|
||||
.lbtn:hover:not(.a){background:var(--hover);color:var(--title)}
|
||||
.dbtn{padding:3px;border-radius:5px;cursor:pointer;border:none;background:transparent;color:var(--muted);font-size:14px;line-height:1;transition:all .12s;display:flex;align-items:center;justify-content:center;width:28px;height:28px}
|
||||
.dbtn:hover{background:var(--hover);color:var(--title)}
|
||||
.sep{color:var(--brd2);font-size:11px;padding:0 4px}
|
||||
</style>
|
||||
</head>
|
||||
<body style="display:flex;min-height:100vh">
|
||||
|
||||
<!-- SIDEBAR -->
|
||||
<div class="sbar">
|
||||
<div style="display:flex;align-items:center;gap:10px;padding:8px 12px 16px;border-bottom:1px solid #f1f5f9;flex-shrink:0;cursor:pointer" onclick="SH()">
|
||||
<div style="width:28px;height:28px;background:#0f172a;border-radius:8px;display:flex;align-items:center;justify-content:center">
|
||||
<div style="display:flex;align-items:center;gap:10px;padding:8px 12px 12px;border-bottom:1px solid var(--brd2);flex-shrink:0">
|
||||
<div style="width:28px;height:28px;background:var(--actbg);border-radius:8px;display:flex;align-items:center;justify-content:center;cursor:pointer;flex-shrink:0" onclick="SH()">
|
||||
<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="white" stroke-width="2.5"><path d="M10 20l4-16m4 4l4 4-4 4M6 16l-4-4 4-4"/></svg>
|
||||
</div>
|
||||
<span style="font-weight:700;font-size:14px">SysCmd</span>
|
||||
<span style="font-weight:700;font-size:14px;flex:1;cursor:pointer" onclick="SH()">SysCmd</span>
|
||||
<div style="display:flex;gap:2px">
|
||||
<div class="lbtn a" id="lang-fr" onclick="SL('fr')">FR</div>
|
||||
<div class="lbtn" id="lang-en" onclick="SL('en')">EN</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="tree" id="tree"></div>
|
||||
<div style="padding-top:12px;border-top:1px solid #f1f5f9;flex-shrink:0">
|
||||
<div style="display:flex;align-items:center;gap:8px;padding:8px 12px">
|
||||
<div style="width:28px;height:28px;background:#e2e8f0;border-radius:50%;display:flex;align-items:center;justify-content:center;font-size:12px;font-weight:600;color:#64748b">LK</div>
|
||||
<div style="font-size:12px"><div style="font-weight:500;color:#0f172a">Laurent</div><div style="color:#94a3b8">sysadmin</div></div>
|
||||
<div style="padding-top:8px;border-top:1px solid var(--brd2);flex-shrink:0">
|
||||
<div style="display:flex;align-items:center;gap:8px;padding:6px 12px">
|
||||
<div style="width:28px;height:28px;background:var(--brd2);border-radius:50%;display:flex;align-items:center;justify-content:center;font-size:12px;font-weight:600;color:var(--muted)">LK</div>
|
||||
<div style="font-size:12px;flex:1"><div style="font-weight:500;color:var(--title)">Laurent</div><div style="color:var(--muted)">sysadmin</div></div>
|
||||
<div class="dbtn" onclick="TD()" id="dm-btn" title="Dark mode">☾</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- MAIN -->
|
||||
<div class="main">
|
||||
|
||||
<div style="display:flex;justify-content:space-between;align-items:center;margin-bottom:20px">
|
||||
<div>
|
||||
<div class="bd" id="bd"></div>
|
||||
<h1 style="font-size:18px;font-weight:700" id="os-title">SysCmd</h1>
|
||||
<p style="font-size:11px;color:#64748b;margin-top:2px" id="os-sub"></p>
|
||||
<p style="font-size:11px;color:var(--txt);margin-top:2px" id="os-sub"></p>
|
||||
</div>
|
||||
<div style="position:relative">
|
||||
<svg style="position:absolute;left:10px;top:50%;transform:translateY(-50%);width:14px;height:14px;color:#94a3b8" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z"/></svg>
|
||||
<input class="si" id="search" placeholder="Chercher une commande..." oninput="onSearch(this.value)">
|
||||
<svg style="position:absolute;left:10px;top:50%;transform:translateY(-50%);width:14px;height:14px;color:var(--muted)" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z"/></svg>
|
||||
<input class="si" id="search" placeholder="Search..." oninput="onSearch(this.value)">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="gp" id="tabs"></div>
|
||||
|
||||
<div class="lr" id="stats-bar">
|
||||
<span id="shown">0</span> <span>commandes</span>
|
||||
<span>·</span>
|
||||
<span id="fi">Aucun filtre</span>
|
||||
<span id="shown">0</span> <span id="sl-cmd">commands</span>
|
||||
<span class="sep">·</span>
|
||||
<span id="fi">No filter</span>
|
||||
<span class="sep">·</span>
|
||||
<span id="ms-hint" style="display:none;cursor:pointer;color:var(--actbg)" onclick="MSB()"></span>
|
||||
</div>
|
||||
|
||||
<div class="cmdbox" id="cmd-box">
|
||||
<div id="cmds"></div>
|
||||
</div>
|
||||
|
||||
<!-- HOME -->
|
||||
<div id="home">
|
||||
<div style="text-align:center;margin:32px 0 24px">
|
||||
<h2 style="font-size:24px;font-weight:700;margin-bottom:8px">SysCmd</h2>
|
||||
<p style="font-size:13px;color:#64748b;max-width:480px;margin:0 auto">Référence de commandes multi-plateforme. Cliquez sur un OS pour voir ses commandes.</p>
|
||||
<div style="margin-top:12px;display:flex;justify-content:center;gap:12px;font-size:11px;color:#94a3b8">
|
||||
<span style="display:flex;align-items:center;gap:4px"><span class="dg" style="display:inline-block;vertical-align:middle"></span> Données disponibles</span>
|
||||
<span style="display:flex;align-items:center;gap:4px"><span class="do" style="display:inline-block;vertical-align:middle"></span> Catégorie</span>
|
||||
<span style="display:flex;align-items:center;gap:4px"><span class="dgr" style="display:inline-block;vertical-align:middle"></span> À venir</span>
|
||||
<p style="font-size:13px;color:var(--txt);max-width:480px;margin:0 auto" id="hp-desc">Multi-platform command reference. Click an OS to browse its commands.</p>
|
||||
<div style="margin-top:12px;display:flex;justify-content:center;gap:12px;font-size:11px;color:var(--muted)">
|
||||
<span style="display:flex;align-items:center;gap:4px"><span class="dg" style="display:inline-block;vertical-align:middle"></span> <span id="hp-avail">Available data</span></span>
|
||||
<span style="display:flex;align-items:center;gap:4px"><span class="do" style="display:inline-block;vertical-align:middle"></span> <span id="hp-cat">Category</span></span>
|
||||
<span style="display:flex;align-items:center;gap:4px"><span class="dgr" style="display:inline-block;vertical-align:middle"></span> <span id="hp-pend">Pending</span></span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="gs" style="display:none;margin-bottom:24px"></div>
|
||||
|
||||
<div id="stats-row" style="display:grid;grid-template-columns:repeat(4,1fr);gap:12px;margin-bottom:24px"></div>
|
||||
|
||||
<div id="grid" style="display:grid;grid-template-columns:repeat(3,1fr);gap:12px"></div>
|
||||
</div>
|
||||
|
||||
<div style="margin-top:16px;text-align:center;font-size:11px;color:#94a3b8" id="fh">Cliquez sur un OS pour explorer ses commandes</div>
|
||||
<div style="margin-top:16px;text-align:center;font-size:11px;color:var(--muted)" id="fh">Click a command to copy</div>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
"use strict";
|
||||
var L='en',DM=localStorage.getItem('dm')==='1',N=null,CS=null,MS=null,MT=null;
|
||||
function t(f,e){return{fr:f,en:e}}
|
||||
var N=null,CS=null;
|
||||
function LL(n){n=parseInt(n);return isNaN(n)?L:n===0?'fr':'en'}
|
||||
|
||||
// Apply dark mode
|
||||
if(DM)document.documentElement.classList.add('dark');
|
||||
|
||||
var TREE={id:'r',children:[
|
||||
{id:'os',label:t('OS','OS'),children:[
|
||||
@@ -160,63 +164,64 @@ var TREE={id:'r',children:[
|
||||
{id:'dck-df',label:t('Dockerfile build','Dockerfile build'),secs:['dck_build']},
|
||||
{id:'dck-instr',label:t('Dockerfile instructions','Dockerfile instructions'),secs:['dck_directives']}]},
|
||||
{id:'oth',label:t('Other','Other'),children:[
|
||||
{id:'net',label:t('Reseau','Network'),children:[{id:'cis',label:t('Cisco','Cisco')},{id:'tpl',label:t('TP-Link','TP-Link')}]},
|
||||
{id:'net',label:t('Network','Network'),children:[{id:'cis',label:t('Cisco','Cisco')},{id:'tpl',label:t('TP-Link','TP-Link')}]},
|
||||
{id:'sql',label:t('SQL','SQL'),children:[{id:'my',label:t('MySQL/MariaDB','MySQL/MariaDB'),secs:['mysql']},{id:'pg',label:t('PostgreSQL','PostgreSQL'),secs:['pg']}]},
|
||||
{id:'dev',label:t('DevOps','DevOps'),children:[{id:'ans',label:t('Ansible','Ansible')},{id:'tf',label:t('Terraform','Terraform')},{id:'k8',label:t('Kubernetes','Kubernetes')}]}]}]};
|
||||
|
||||
// ── SECTIONS (unchanged definitions) ──
|
||||
var SEC={};
|
||||
SEC.sys={label:t('systeme','system'),cmds:[
|
||||
{d:t('Version noyau','Kernel'),c:'uname -r'},{d:t('Version OS','OS version'),c:'lsb_release -a'},
|
||||
{d:t('Memoire','Memory'),c:'free -h'},{d:t('Hostname','Hostname'),c:'hostnamectl'},
|
||||
SEC.sys={label:t('System','System'),cmds:[
|
||||
{d:t('Kernel version','Kernel version'),c:'uname -r'},{d:t('OS version','OS version'),c:'lsb_release -a'},
|
||||
{d:t('Memory','Memory'),c:'free -h'},{d:t('Hostname','Hostname'),c:'hostnamectl'},
|
||||
{d:t('Uptime','Uptime'),c:'uptime'},{d:t('CPU','CPU'),c:'lscpu'},{d:t('Date','Date'),c:'timedatectl'}]};
|
||||
SEC.apt={label:t('APT','APT'),cmds:[
|
||||
{d:t('Sync repos','Sync repos'),c:'sudo apt update'},{d:t('Mise a jour','Upgrade'),c:'sudo apt full-upgrade -y'},
|
||||
{d:t('Installer','Install'),c:'sudo apt install [pkg]'},{d:t('Purge','Purge'),c:'sudo apt purge [pkg]'},
|
||||
{d:t('Sync repos','Sync repos'),c:'sudo apt update'},{d:t('Upgrade','Upgrade'),c:'sudo apt full-upgrade -y'},
|
||||
{d:t('Install','Install'),c:'sudo apt install [pkg]'},{d:t('Purge','Purge'),c:'sudo apt purge [pkg]'},
|
||||
{d:t('Search','Search'),c:'apt search [kw]'},{d:t('Installed','Installed'),c:'apt list --installed'},
|
||||
{d:t('Fichiers','Package files'),c:'dpkg -L [pkg]'}]};
|
||||
SEC.users={label:t('utilisateurs','users'),cmds:[
|
||||
{d:t('Ajouter','Add'),c:'sudo adduser [n]'},{d:t('Supprimer','Delete'),c:'sudo deluser --remove-home [n]'},
|
||||
{d:t('Groupe sudo','Sudo group'),c:'sudo usermod -aG sudo [n]'},{d:t('Permissions','Perms'),c:'chmod 755 [f]'},
|
||||
{d:t('Root','Root'),c:'sudo -i'}]};
|
||||
SEC.systemd={label:t('systemd','systemd'),cmds:[
|
||||
{d:t('Package files','Package files'),c:'dpkg -L [pkg]'}]};
|
||||
SEC.users={label:t('Users','Users'),cmds:[
|
||||
{d:t('Add user','Add user'),c:'sudo adduser [n]'},{d:t('Delete user','Delete user'),c:'sudo deluser --remove-home [n]'},
|
||||
{d:t('Sudo group','Sudo group'),c:'sudo usermod -aG sudo [n]'},{d:t('Permissions','Permissions'),c:'chmod 755 [f]'},
|
||||
{d:t('Root shell','Root shell'),c:'sudo -i'}]};
|
||||
SEC.systemd={label:t('Systemd','Systemd'),cmds:[
|
||||
{d:t('Start/Stop','Start/Stop'),c:'sudo systemctl start|stop [s]'},{d:t('Restart','Restart'),c:'sudo systemctl restart [s]'},
|
||||
{d:t('Enable','Enable'),c:'sudo systemctl enable [s]'},{d:t('Status','Status'),c:'systemctl status [s]'},
|
||||
{d:t('Logs','Logs'),c:'journalctl -u [s] -n 50'},{d:t('Purge logs','Purge logs'),c:'sudo journalctl --vacuum-time=7d'}]};
|
||||
SEC.wsys={label:t('systeme','system'),cmds:[
|
||||
SEC.wsys={label:t('System','System'),cmds:[
|
||||
{d:t('(CMD) Version','(CMD) Version'),c:'ver'},{d:t('(CMD) systeminfo','(CMD) systeminfo'),c:'systeminfo'},
|
||||
{d:t('(PS) Get-ComputerInfo','(PS) Get-ComputerInfo'),c:'Get-ComputerInfo'}]};
|
||||
SEC.wfiles={label:t('fichiers','files'),cmds:[
|
||||
SEC.wfiles={label:t('Files','Files'),cmds:[
|
||||
{d:t('(CMD) dir','(CMD) dir'),c:'dir /s'},{d:t('(CMD) rmdir','(CMD) rmdir'),c:'rmdir /s [f]'},
|
||||
{d:t('(PS) Get-ChildItem','(PS) Get-ChildItem'),c:'Get-ChildItem -Recurse -Filter *.txt'}]};
|
||||
SEC.wproc={label:t('processus','processes'),cmds:[
|
||||
SEC.wproc={label:t('Processes','Processes'),cmds:[
|
||||
{d:t('(CMD) tasklist','(CMD) tasklist'),c:'tasklist'},{d:t('(CMD) taskkill','(CMD) taskkill'),c:'taskkill /IM notepad.exe /F'},
|
||||
{d:t('(PS) Get-Process','(PS) Get-Process'),c:'Get-Process'}]};
|
||||
SEC.wnet={label:t('reseau','network'),cmds:[
|
||||
SEC.wnet={label:t('Network','Network'),cmds:[
|
||||
{d:t('(CMD) ipconfig','(CMD) ipconfig'),c:'ipconfig /all'},{d:t('(CMD) netstat','(CMD) netstat'),c:'netstat -an | findstr LISTEN'},
|
||||
{d:t('(PS) TNM','(PS) TNM'),c:'Test-NetConnection [ip] -Port [port]'}]};
|
||||
{d:t('(PS) Test-NetConn','(PS) Test-NetConn'),c:'Test-NetConnection [ip] -Port [port]'}]};
|
||||
SEC.odnf={label:t('DNF','DNF'),cmds:[
|
||||
{d:t('Sync','Sync'),c:'sudo dnf check-update'},{d:t('Upgrade','Upgrade'),c:'sudo dnf upgrade -y'},
|
||||
{d:t('Install','Install'),c:'sudo dnf install [p]'},{d:t('Remove','Remove'),c:'sudo dnf remove [p]'}]};
|
||||
SEC.r_dnf={label:t('DNF','DNF'),cmds:[
|
||||
{d:t('Sync depots','Sync repos'),c:'sudo dnf check-update'},{d:t('Mise a jour','Upgrade'),c:'sudo dnf upgrade -y'},
|
||||
{d:t('Installer','Install'),c:'sudo dnf install [pkg]'},{d:t('Supprimer','Remove'),c:'sudo dnf remove [pkg]'},
|
||||
{d:t('Chercher','Search'),c:'dnf search [kw]'},{d:t('Historique','History'),c:'dnf history'},
|
||||
{d:t('Info paquet','Package info'),c:'dnf info [pkg]'},{d:t('Fichiers (rpm)','Package files'),c:'rpm -ql [pkg]'}]};
|
||||
{d:t('Sync repos','Sync repos'),c:'sudo dnf check-update'},{d:t('Upgrade','Upgrade'),c:'sudo dnf upgrade -y'},
|
||||
{d:t('Install','Install'),c:'sudo dnf install [pkg]'},{d:t('Remove','Remove'),c:'sudo dnf remove [pkg]'},
|
||||
{d:t('Search','Search'),c:'dnf search [kw]'},{d:t('History','History'),c:'dnf history'},
|
||||
{d:t('Package info','Package info'),c:'dnf info [pkg]'},{d:t('Package files','Package files'),c:'rpm -ql [pkg]'}]};
|
||||
SEC.r_fw={label:t('firewalld','firewalld'),cmds:[
|
||||
{d:t('Status','Status'),c:'sudo firewall-cmd --state'},{d:t('Zone par defaut','Default zone'),c:'sudo firewall-cmd --get-default-zone'},
|
||||
{d:t('Ouvrir port','Open port'),c:'sudo firewall-cmd --permanent --add-port=22/tcp'},
|
||||
{d:t('Ouvrir service','Open service'),c:'sudo firewall-cmd --permanent --add-service=http'},
|
||||
{d:t('Reload','Reload'),c:'sudo firewall-cmd --reload'},{d:t('Lister regles','List rules'),c:'sudo firewall-cmd --list-all'}]};
|
||||
{d:t('Status','Status'),c:'sudo firewall-cmd --state'},{d:t('Default zone','Default zone'),c:'sudo firewall-cmd --get-default-zone'},
|
||||
{d:t('Open port','Open port'),c:'sudo firewall-cmd --permanent --add-port=22/tcp'},
|
||||
{d:t('Open service','Open service'),c:'sudo firewall-cmd --permanent --add-service=http'},
|
||||
{d:t('Reload','Reload'),c:'sudo firewall-cmd --reload'},{d:t('List rules','List rules'),c:'sudo firewall-cmd --list-all'}]};
|
||||
SEC.r_selinux={label:t('SELinux','SELinux'),cmds:[
|
||||
{d:t('Status','Status'),c:'getenforce'},{d:t('Permissif','Permissive'),c:'sudo setenforce 0'},
|
||||
{d:t('Enforcing','Enforcing'),c:'sudo setenforce 1'},{d:t('Logs AVC','AVC logs'),c:'sudo ausearch -m avc -ts recent'},
|
||||
{d:t('Contextes fichier','File contexts'),c:'ls -Z [f]'},{d:t('restorecon','restorecon'),c:'sudo restorecon -Rv [p]'},
|
||||
{d:t('Bools liste','List booleans'),c:'getsebool -a'},{d:t('Config permanente','Permanent config'),c:'cat /etc/selinux/config'}]};
|
||||
{d:t('Status','Status'),c:'getenforce'},{d:t('Permissive','Permissive'),c:'sudo setenforce 0'},
|
||||
{d:t('Enforcing','Enforcing'),c:'sudo setenforce 1'},{d:t('AVC logs','AVC logs'),c:'sudo ausearch -m avc -ts recent'},
|
||||
{d:t('File contexts','File contexts'),c:'ls -Z [f]'},{d:t('restorecon','restorecon'),c:'sudo restorecon -Rv [p]'},
|
||||
{d:t('Boolean list','Boolean list'),c:'getsebool -a'},{d:t('Permanent config','Permanent config'),c:'cat /etc/selinux/config'}]};
|
||||
SEC.r_epel={label:t('EPEL','EPEL'),cmds:[
|
||||
{d:t('Installer EPEL','Install EPEL'),c:'sudo dnf install epel-release'},
|
||||
{d:t('Activer EPEL','Enable EPEL'),c:'sudo dnf config-manager --set-enabled epel'},
|
||||
{d:t('Chercher EPEL','Search EPEL'),c:'dnf search [kw] --enablerepo=epel'}]};
|
||||
SEC.ospec={label:t('Oracle spec.','Oracle spec.'),cmds:[
|
||||
{d:t('Install EPEL','Install EPEL'),c:'sudo dnf install epel-release'},
|
||||
{d:t('Enable EPEL','Enable EPEL'),c:'sudo dnf config-manager --set-enabled epel'},
|
||||
{d:t('Search EPEL','Search EPEL'),c:'dnf search [kw] --enablerepo=epel'}]};
|
||||
SEC.ospec={label:t('Oracle specifics','Oracle specifics'),cmds:[
|
||||
{d:t('Ksplice status','Ksplice status'),c:'sudo uptrack-status'},{d:t('Ksplice upgrade','Ksplice upgrade'),c:'sudo uptrack-upgrade'},
|
||||
{d:t('Switch kernel','Switch kernel'),c:'sudo grubby --set-default /boot/vmlinuz-[v]'}]};
|
||||
SEC.osel={label:t('SELinux','SELinux'),cmds:[
|
||||
@@ -237,87 +242,79 @@ SEC.szones={label:t('Zones','Zones'),cmds:[
|
||||
{d:t('List','List'),c:'zoneadm list -cv'},{d:t('Boot','Boot'),c:'sudo zoneadm -z [z] boot'},
|
||||
{d:t('Halt','Halt'),c:'sudo zoneadm -z [z] halt'},{d:t('Console','Console'),c:'sudo zlogin -C [z]'}]};
|
||||
SEC.fbsd_pkg={label:t('pkg','pkg'),cmds:[
|
||||
{d:t('Sync depots','Update repos'),c:'sudo pkg update'},{d:t('Mise a jour','Upgrade'),c:'sudo pkg upgrade'},
|
||||
{d:t('Installer','Install'),c:'sudo pkg install [pkg]'},{d:t('Supprimer','Remove'),c:'sudo pkg delete [pkg]'},
|
||||
{d:t('Chercher','Search'),c:'pkg search [kw]'},{d:t('Infos paquet','Package info'),c:'pkg info [pkg]'},
|
||||
{d:t('Paquets installes','Installed'),c:'pkg info'}]};
|
||||
{d:t('Update repos','Update repos'),c:'sudo pkg update'},{d:t('Upgrade','Upgrade'),c:'sudo pkg upgrade'},
|
||||
{d:t('Install','Install'),c:'sudo pkg install [pkg]'},{d:t('Remove','Remove'),c:'sudo pkg delete [pkg]'},
|
||||
{d:t('Search','Search'),c:'pkg search [kw]'},{d:t('Package info','Package info'),c:'pkg info [pkg]'},
|
||||
{d:t('Installed','Installed'),c:'pkg info'}]};
|
||||
SEC.fbsd_zfs={label:t('ZFS','ZFS'),cmds:[
|
||||
{d:t('Pool status','Pool status'),c:'zpool status'},{d:t('Pool list','Pool list'),c:'zpool list'},
|
||||
{d:t('Scrub','Scrub'),c:'sudo zpool scrub [pool]'},{d:t('Datasets','Datasets'),c:'zfs list'},
|
||||
{d:t('Snapshot','Snapshot'),c:'sudo zfs snapshot [pool]/[ds]@[n]'},{d:t('Rollback','Rollback'),c:'sudo zfs rollback [pool]/[ds]@[n]'},
|
||||
{d:t('Send/Receive','Send/Receive'),c:'zfs send [pool]/[ds]@snap | zfs receive [dest]'}]};
|
||||
{d:t('Snapshot','Snapshot'),c:'sudo zfs snapshot [pool]/[ds]@[n]'},{d:t('Rollback','Rollback'),c:'sudo zfs rollback [pool]/[ds]@[n]'}]};
|
||||
SEC.fbsd_jail={label:t('jail','jail'),cmds:[
|
||||
{d:t('Lister jails','List jails'),c:'jls'},{d:t('Console jail','Jail console'),c:'jexec [id] sh'},
|
||||
{d:t('Info jail','Jail info'),c:'jail -v'},{d:t('Demarrer jail','Start jail'),c:'sudo service jail start [name]'},
|
||||
{d:t('Arreter jail','Stop jail'),c:'sudo service jail stop [name]'}]};
|
||||
SEC.fbsd_net={label:t('reseau','network'),cmds:[
|
||||
{d:t('List jails','List jails'),c:'jls'},{d:t('Console','Console'),c:'jexec [id] sh'},
|
||||
{d:t('Start jail','Start jail'),c:'sudo service jail start [name]'},{d:t('Stop jail','Stop jail'),c:'sudo service jail stop [name]'}]};
|
||||
SEC.fbsd_net={label:t('Network','Network'),cmds:[
|
||||
{d:t('Interfaces','Interfaces'),c:'ifconfig'},{d:t('Route','Route'),c:'netstat -rn'},
|
||||
{d:t('IP add','IP config'),c:'ifconfig [int] inet 10.0.0.10/24'},{d:t('DNS config','DNS config'),c:'cat /etc/resolv.conf'},
|
||||
{d:t('pf status','pf status'),c:'sudo pfctl -s info'},{d:t('pf regles','pf rules'),c:'sudo pfctl -s rules'}]};
|
||||
SEC.fbsd_sys={label:t('systeme','system'),cmds:[
|
||||
{d:t('DNS config','DNS config'),c:'cat /etc/resolv.conf'},{d:t('pf status','pf status'),c:'sudo pfctl -s info'}]};
|
||||
SEC.fbsd_sys={label:t('System','System'),cmds:[
|
||||
{d:t('Version','Version'),c:'uname -r -s'},{d:t('Hostname','Hostname'),c:'hostname'},
|
||||
{d:t('Uptime','Uptime'),c:'uptime'},{d:t('CPU info','CPU info'),c:'sysctl hw.model'},{d:t('Memoire','Memory'),c:'sysctl hw.physmem'}]};
|
||||
{d:t('CPU info','CPU info'),c:'sysctl hw.model'},{d:t('Memory','Memory'),c:'sysctl hw.physmem'}]};
|
||||
SEC.mac_brew={label:t('Homebrew','Homebrew'),cmds:[
|
||||
{d:t('Installer','Install'),c:'brew install [pkg]'},{d:t('Supprimer','Uninstall'),c:'brew uninstall [pkg]'},
|
||||
{d:t('Mise a jour','Update'),c:'brew update'},{d:t('Upgrade tout','Upgrade all'),c:'brew upgrade'},
|
||||
{d:t('Chercher','Search'),c:'brew search [kw]'},{d:t('Info paquet','Info'),c:'brew info [pkg]'},
|
||||
{d:t('Lister formules','List installed'),c:'brew list'},{d:t('Cask installer','Install cask'),c:'brew install --cask [app]'}]};
|
||||
{d:t('Install','Install'),c:'brew install [pkg]'},{d:t('Uninstall','Uninstall'),c:'brew uninstall [pkg]'},
|
||||
{d:t('Update','Update'),c:'brew update'},{d:t('Upgrade all','Upgrade all'),c:'brew upgrade'},
|
||||
{d:t('Search','Search'),c:'brew search [kw]'},{d:t('Info','Info'),c:'brew info [pkg]'},
|
||||
{d:t('List installed','List installed'),c:'brew list'},{d:t('Install cask','Install cask'),c:'brew install --cask [app]'}]};
|
||||
SEC.mac_defaults={label:t('defaults','defaults'),cmds:[
|
||||
{d:t('Lire valeur','Read key'),c:"defaults read [domain] [key]"},{d:t('Ecrire valeur','Write key'),c:"defaults write [domain] [key] -type [val]"},
|
||||
{d:t('Finder affichage','Show hidden'),c:"defaults write com.apple.Finder AppleShowAllFiles true && killall Finder"},
|
||||
{d:t('Screenshot folder','Screenshot path'),c:"defaults write com.apple.screencapture location [path]; killall SystemUIServer"}]};
|
||||
SEC.mac_disk={label:t('disque','disk'),cmds:[
|
||||
{d:t('Lister disques','List disks'),c:'diskutil list'},{d:t('Infos disque','Disk info'),c:'diskutil info [disk]'},
|
||||
{d:t('Monter','Mount'),c:'diskutil mount [disk]'},{d:t('Demonter','Unmount'),c:'diskutil unmount [disk]'},
|
||||
{d:t('Effacer (format)','Erase'),c:'diskutil eraseDisk JHFS+ [name] [disk]'},{d:t('Verifier','Verify'),c:'diskutil verifyVolume [disk]'}]};
|
||||
SEC.mac_sys={label:t('systeme','system'),cmds:[
|
||||
{d:t('Version macOS','macOS version'),c:'sw_vers'},{d:t('Hardware','Hardware'),c:'system_profiler SPHardwareDataType'},
|
||||
{d:t('Memoire','Memory'),c:'system_profiler SPMemoryDataType'},{d:t('Rapport systeme','System report'),c:'system_profiler -detailLevel basic'},
|
||||
{d:t('Processus','Processes'),c:'top -l 1 -n 10'},{d:t('Disque espace','Disk space'),c:'df -h'}]};
|
||||
SEC.dc_up={label:t('Compose up/down','Compose up/down'),cmds:[
|
||||
{d:t('Demarrer','Start'),c:'docker compose up -d'},{d:t('Arreter','Stop'),c:'docker compose down'},
|
||||
{d:t('Read key','Read key'),c:"defaults read [domain] [key]"},{d:t('Write key','Write key'),c:"defaults write [domain] [key] -type [val]"},
|
||||
{d:t('Show hidden files','Show hidden files'),c:"defaults write com.apple.Finder AppleShowAllFiles true && killall Finder"},
|
||||
{d:t('Screenshot path','Screenshot path'),c:"defaults write com.apple.screencapture location [path]; killall SystemUIServer"}]};
|
||||
SEC.mac_disk={label:t('disk','disk'),cmds:[
|
||||
{d:t('List disks','List disks'),c:'diskutil list'},{d:t('Disk info','Disk info'),c:'diskutil info [disk]'},
|
||||
{d:t('Mount','Mount'),c:'diskutil mount [disk]'},{d:t('Unmount','Unmount'),c:'diskutil unmount [disk]'}]};
|
||||
SEC.mac_sys={label:t('System','System'),cmds:[
|
||||
{d:t('macOS version','macOS version'),c:'sw_vers'},{d:t('Hardware','Hardware'),c:'system_profiler SPHardwareDataType'},
|
||||
{d:t('Memory','Memory'),c:'system_profiler SPMemoryDataType'},{d:t('Processes','Processes'),c:'top -l 1 -n 10'},
|
||||
{d:t('Disk space','Disk space'),c:'df -h'}]};
|
||||
SEC.dc_up={label:t('Up/Down','Up/Down'),cmds:[
|
||||
{d:t('Start','Start'),c:'docker compose up -d'},{d:t('Stop','Stop'),c:'docker compose down'},
|
||||
{d:t('Rebuild + start','Rebuild + start'),c:'docker compose up -d --build'},{d:t('Force recreate','Force recreate'),c:'docker compose up -d --force-recreate'},
|
||||
{d:t('Arreter sans suppr','Stop without removal'),c:'docker compose stop'},{d:t('Supprimer tout','Remove all'),c:'docker compose down -v'}]};
|
||||
SEC.dc_logs={label:t('Compose logs','Compose logs'),cmds:[
|
||||
{d:t('Logs follow','Logs follow'),c:'docker compose logs -f'},{d:t('Logs service','Service logs'),c:'docker compose logs [service] -f'},
|
||||
{d:t('Logs 50 dernieres','Last 50 lines'),c:'docker compose logs --tail=50'},{d:t('Logs avec timestamps','With timestamps'),c:'docker compose logs -t'}]};
|
||||
SEC.dc_exec={label:t('Compose exec','Compose exec'),cmds:[
|
||||
{d:t('Shell service','Shell into service'),c:'docker compose exec [service] bash'},
|
||||
{d:t('Commande service','Run command'),c:'docker compose exec [service] [cmd]'},
|
||||
{d:t('Shell root','Shell as root'),c:'docker compose exec -u root [service] bash'},
|
||||
{d:t('Exec sans TTY','No TTY'),c:'docker compose exec -T [service] [cmd]'}]};
|
||||
SEC.dc_ps={label:t('Compose ps','Compose ps'),cmds:[
|
||||
{d:t('Lister services','List services'),c:'docker compose ps'},{d:t('Lister avec ports','With ports'),c:'docker compose ps --services'},
|
||||
{d:t('Stats','Stats'),c:'docker compose ps -a'},{d:t('Images utilisees','Images used'),c:'docker compose images'},
|
||||
{d:t('Verifier config','Validate config'),c:'docker compose config'}]};
|
||||
SEC.dc_build={label:t('Compose build','Compose build'),cmds:[
|
||||
{d:t('Build tout','Build all'),c:'docker compose build'},{d:t('Build service','Build service'),c:'docker compose build [service]'},
|
||||
{d:t('Build sans cache','No cache'),c:'docker compose build --no-cache'},{d:t('Pull images','Pull images'),c:'docker compose pull'}]};
|
||||
SEC.dck_build={label:t('Dockerfile build','Dockerfile build'),cmds:[
|
||||
{d:t('Build image','Build image'),c:'docker build -t [name]:[tag] .'},{d:t('Build sans cache','No cache'),c:'docker build --no-cache -t [name]:[tag] .'},
|
||||
{d:t('Build avec args','With build args'),c:'docker build --build-arg [k]=[v] -t [name]:[tag] .'},{d:t('Lister etapes','List layers'),c:'docker history [image]'},
|
||||
{d:t('Multi-stage name','Multi-stage target'),c:'docker build --target [stage] -t [name]:[tag] .'}]};
|
||||
SEC.dck_directives={label:t('Dockerfile instructions','Dockerfile instructions'),cmds:[
|
||||
{d:t('Base image','Base image'),c:'FROM [image]:[tag]'},{d:t('Commande shell','Shell command'),c:'RUN [command]'},
|
||||
{d:t('Copier fichiers','Copy files'),c:'COPY [src] [dest]'},{d:t('Working dir','Working directory'),c:'WORKDIR /app'},
|
||||
{d:t('Port expose','Expose port'),c:'EXPOSE [port]'},{d:t('Commande par defaut','Default command'),c:'CMD [\"exec\", \"args\"]'},
|
||||
{d:t('Point d entree','Entry point'),c:'ENTRYPOINT [\"exec\", \"args\"]'},{d:t('Variables env','Environment'),c:'ENV [key]=[value]'},
|
||||
{d:t('Volume','Volume'),c:'VOLUME [path]'},{d:t('Utilisateur','User'),c:'USER [user]'},
|
||||
{d:t('Healthcheck','Healthcheck'),c:'HEALTHCHECK CMD [cmd]'},{d:t('Labels metadonnees','Labels'),c:'LABEL [key]=[value]'}]};
|
||||
{d:t('Stop (no removal)','Stop (no removal)'),c:'docker compose stop'},{d:t('Remove all','Remove all'),c:'docker compose down -v'}]};
|
||||
SEC.dc_logs={label:t('Logs','Logs'),cmds:[
|
||||
{d:t('Follow logs','Follow logs'),c:'docker compose logs -f'},{d:t('Service logs','Service logs'),c:'docker compose logs [s] -f'},
|
||||
{d:t('Last 50 lines','Last 50 lines'),c:'docker compose logs --tail=50'},{d:t('With timestamps','With timestamps'),c:'docker compose logs -t'}]};
|
||||
SEC.dc_exec={label:t('Exec','Exec'),cmds:[
|
||||
{d:t('Shell into service','Shell into service'),c:'docker compose exec [s] bash'},
|
||||
{d:t('Run command','Run command'),c:'docker compose exec [s] [cmd]'},
|
||||
{d:t('Shell as root','Shell as root'),c:'docker compose exec -u root [s] bash'}]};
|
||||
SEC.dc_ps={label:t('PS','PS'),cmds:[
|
||||
{d:t('List services','List services'),c:'docker compose ps'},{d:t('Validate config','Validate config'),c:'docker compose config'},
|
||||
{d:t('Images used','Images used'),c:'docker compose images'}]};
|
||||
SEC.dc_build={label:t('Build','Build'),cmds:[
|
||||
{d:t('Build all','Build all'),c:'docker compose build'},{d:t('Build service','Build service'),c:'docker compose build [s]'},
|
||||
{d:t('No cache','No cache'),c:'docker compose build --no-cache'},{d:t('Pull images','Pull images'),c:'docker compose pull'}]};
|
||||
SEC.dck_build={label:t('Build image','Build image'),cmds:[
|
||||
{d:t('Build image','Build image'),c:'docker build -t [name]:[tag] .'},{d:t('No cache','No cache'),c:'docker build --no-cache -t [name]:[tag] .'},
|
||||
{d:t('Build args','Build args'),c:'docker build --build-arg [k]=[v] -t [name]:[tag] .'},{d:t('Multi-stage','Multi-stage'),c:'docker build --target [stage] -t [name]:[tag] .'}]};
|
||||
SEC.dck_directives={label:t('Dockerfile','Dockerfile'),cmds:[
|
||||
{d:t('Base image','Base image'),c:'FROM [image]:[tag]'},{d:t('Shell command','Shell command'),c:'RUN [command]'},
|
||||
{d:t('Copy files','Copy files'),c:'COPY [src] [dest]'},{d:t('Working directory','Working dir'),c:'WORKDIR /app'},
|
||||
{d:t('Expose port','Expose port'),c:'EXPOSE [port]'},{d:t('Default command','Default command'),c:'CMD ["exec","args"]'},
|
||||
{d:t('Entry point','Entry point'),c:'ENTRYPOINT ["exec","args"]'},{d:t('Environment','Environment'),c:'ENV [key]=[value]'},
|
||||
{d:t('Volume','Volume'),c:'VOLUME [path]'},{d:t('User','User'),c:'USER [user]'},
|
||||
{d:t('Healthcheck','Healthcheck'),c:'HEALTHCHECK CMD [cmd]'},{d:t('Labels','Labels'),c:'LABEL [key]=[value]'}]};
|
||||
SEC.mysql={label:t('MySQL/MariaDB','MySQL/MariaDB'),cmds:[
|
||||
{d:t('Connexion','Connect'),c:'mysql -u [user] -p'},{d:t('Bases liste','Show databases'),c:'SHOW DATABASES;'},
|
||||
{d:t('Tables liste','Show tables'),c:'SHOW TABLES;'},{d:t('Utilisateurs','Users'),c:'SELECT User,Host FROM mysql.user;'},
|
||||
{d:t('Creer base','Create DB'),c:'CREATE DATABASE [db];'},{d:t('Creer user','Create user'),c:"CREATE USER '[u]'@'localhost' IDENTIFIED BY '[p]';"},
|
||||
{d:t('Grant droits','Grant privileges'),c:"GRANT ALL ON [db].* TO '[u]'@'localhost';"},{d:t('Dump base','Dump database'),c:'mysqldump -u [u] -p [db] > backup.sql'},
|
||||
{d:t('Restore base','Restore database'),c:'mysql -u [u] -p [db] < backup.sql'},{d:t('Dump toutes','Dump all'),c:'mysqldump -u [u] -p --all-databases > all.sql'},
|
||||
{d:t('Show process','Show processlist'),c:'SHOW FULL PROCESSLIST;'},{d:t('Variables','Variables'),c:"SHOW VARIABLES LIKE '%[kw]%';"}]};
|
||||
{d:t('Connect','Connect'),c:'mysql -u [user] -p'},{d:t('Show databases','Show databases'),c:'SHOW DATABASES;'},
|
||||
{d:t('Show tables','Show tables'),c:'SHOW TABLES;'},{d:t('Users','Users'),c:'SELECT User,Host FROM mysql.user;'},
|
||||
{d:t('Create DB','Create DB'),c:'CREATE DATABASE [db];'},{d:t('Create user','Create user'),c:"CREATE USER '[u]'@'localhost' IDENTIFIED BY '[p]';"},
|
||||
{d:t('Grant privileges','Grant privileges'),c:"GRANT ALL ON [db].* TO '[u]'@'localhost';"},{d:t('Dump database','Dump database'),c:'mysqldump -u [u] -p [db] > backup.sql'},
|
||||
{d:t('Restore database','Restore database'),c:'mysql -u [u] -p [db] < backup.sql'},{d:t('Dump all','Dump all'),c:'mysqldump -u [u] -p --all-databases > all.sql'},
|
||||
{d:t('Show processlist','Show processlist'),c:'SHOW FULL PROCESSLIST;'},{d:t('Variables','Variables'),c:"SHOW VARIABLES LIKE '%[kw]%';"}]};
|
||||
SEC.pg={label:t('PostgreSQL','PostgreSQL'),cmds:[
|
||||
{d:t('Connexion','Connect'),c:"psql -U [user] -d [db]"},{d:t('Bases liste','List databases'),c:'\\l+'},
|
||||
{d:t('Tables liste','List tables'),c:'\\dt+'},{d:t('Describe table','Describe table'),c:'\\d+ [table]'},
|
||||
{d:t('Creer base','Create database'),c:'CREATE DATABASE [db];'},{d:t('Creer user','Create user'),c:"CREATE USER [u] WITH PASSWORD '[p]';"},
|
||||
{d:t('Grant droits','Grant privileges'),c:"GRANT ALL PRIVILEGES ON DATABASE [db] TO [u];"},{d:t('Dump base','Dump database'),c:'pg_dump -U [u] [db] > backup.sql'},
|
||||
{d:t('Restore base','Restore database'),c:'psql -U [u] -d [db] < backup.sql'},{d:t('List indexes','List indexes'),c:'\\di+'},
|
||||
{d:t('Vacuumer','Vacuum'),c:"VACUUM FULL ANALYZE;"},{d:t('pg_hba.conf','pg_hba.conf path'),c:'SHOW hba_file;'}]};
|
||||
{d:t('Connect','Connect'),c:"psql -U [user] -d [db]"},{d:t('List databases','List databases'),c:'\\l+'},
|
||||
{d:t('List tables','List tables'),c:'\\dt+'},{d:t('Describe table','Describe table'),c:'\\d+ [table]'},
|
||||
{d:t('Create database','Create database'),c:'CREATE DATABASE [db];'},{d:t('Create user','Create user'),c:"CREATE USER [u] WITH PASSWORD '[p]';"},
|
||||
{d:t('Grant privileges','Grant privileges'),c:"GRANT ALL PRIVILEGES ON DATABASE [db] TO [u];"},{d:t('Dump database','Dump database'),c:'pg_dump -U [u] [db] > backup.sql'},
|
||||
{d:t('Restore database','Restore database'),c:'psql -U [u] -d [db] < backup.sql'},{d:t('Vacuum','Vacuum'),c:"VACUUM FULL ANALYZE;"}]};
|
||||
|
||||
var ALL=[];(function(){var seen={};for(var k in SEC)SEC[k].cmds.forEach(function(x){if(!seen[x.c]){seen[x.c]=1;ALL.push(x)}})})();
|
||||
|
||||
@@ -326,102 +323,148 @@ function CL(n,o){if(n.children){for(var i=0;i<n.children.length;i++)CL(n.childre
|
||||
function CC(n){if(n.secs){var t=0;for(var i=0;i<n.secs.length;i++)if(SEC[n.secs[i]])t+=SEC[n.secs[i]].cmds.length;return t}return 0}
|
||||
function $(i){return document.getElementById(i)}
|
||||
|
||||
// ── LANG ──
|
||||
function SL(l){L=l;
|
||||
$('lang-fr').className='lbtn'+(l==='fr'?' a':'');
|
||||
$('lang-en').className='lbtn'+(l==='en'?' a':'');
|
||||
$('search').placeholder=l==='en'?'Search a command...':'Chercher une commande...';
|
||||
// Update static text
|
||||
$('hp-desc').textContent=l==='en'?'Multi-platform command reference. Click an OS to browse its commands.':'Reference de commandes multi-plateforme. Cliquez sur un OS pour voir ses commandes.';
|
||||
$('hp-avail').textContent=l==='en'?'Available data':'Donnees disponibles';
|
||||
$('hp-cat').textContent=l==='en'?'Category':'Categorie';
|
||||
$('hp-pend').textContent=l==='en'?'Pending':'A venir';
|
||||
$('fh').textContent=l==='en'?'Click a command to copy':'Cliquez sur une commande pour la copier';
|
||||
$('sl-cmd').textContent=l==='en'?'commands':'commandes';
|
||||
if(N)SU(N);else RH()
|
||||
}
|
||||
function TD(){DM=!DM;document.documentElement.classList.toggle('dark',DM);localStorage.setItem('dm',DM?'1':'0')}
|
||||
|
||||
// ── RENDER TREE ──
|
||||
function RT(){
|
||||
var el=$('tree');el.innerHTML='';
|
||||
function RN(c,n,d){
|
||||
var br=n.children&&n.children.length>0,ver=!!n.secs;
|
||||
var dv=document.createElement('div');
|
||||
if(d===0){var lb=document.createElement('div');lb.className='grp';lb.textContent='Categories';dv.appendChild(lb)}
|
||||
if(d===0){var lb=document.createElement('div');lb.className='grp';lb.textContent=L==='en'?'Categories':'Categories';dv.appendChild(lb)}
|
||||
else{
|
||||
var rw=document.createElement('div');
|
||||
var c2='slk';if(d===2)c2+=' slk3';if(d===3)c2+=' slk4';if(n===N)c2+=' act';rw.className=c2;
|
||||
if(br){var tg=document.createElement('span');tg.className='tgl o';
|
||||
tg.innerHTML='<svg width="12" height="12" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2.5" d="M9 18l6-6-6-6"/></svg>';rw.appendChild(tg)
|
||||
}else{var sp=document.createElement('span');sp.style.cssText='width:16px;flex-shrink:0;display:inline-block';rw.appendChild(sp)}
|
||||
}else{rw.appendChild(document.createElement('span'))}
|
||||
var dt=document.createElement('span');
|
||||
if(ver||n._p)dt.className='dg';else if(br)dt.className='do';else dt.className='dgr';
|
||||
rw.appendChild(dt);
|
||||
var lb2=document.createElement('span');lb2.textContent=n.label.fr;rw.appendChild(lb2);
|
||||
var lb2=document.createElement('span');lb2.textContent=n.label[L];rw.appendChild(lb2);
|
||||
var cnt=CC(n)||(n._p&&n._p.secs?SEC[n._sid]?SEC[n._sid].cmds.length:0:0);
|
||||
if(cnt>0){var b2=document.createElement('span');b2.style.cssText='margin-left:auto;font-size:10px;color:#94a3b8';b2.textContent=''+cnt;rw.appendChild(b2)}
|
||||
if(cnt>0){var b2=document.createElement('span');b2.style.cssText='margin-left:auto;font-size:10px;color:var(--muted)';b2.textContent=''+cnt;rw.appendChild(b2)}
|
||||
rw.onclick=function(e){
|
||||
if(br&&(e.target.closest('.tgl')||e.target.closest('[data-toggle]'))){var tg=rw.querySelector('.tgl');if(tg){tg.classList.toggle('o');rw.nextElementSibling.classList.toggle('o');e.stopPropagation()}return}
|
||||
if(br)return;S(n)
|
||||
};
|
||||
dv.appendChild(rw)
|
||||
}
|
||||
function onPath(t) { if(!t)return false; if(t===n)return true; var p=t._p; while(p){if(p===n)return true;p=p._p}return false; }
|
||||
function onPath(t){if(!t)return false;if(t===n)return true;var p=t._p;while(p){if(p===n)return true;p=p._p}return false}
|
||||
if(br){var kd=document.createElement('div');kd.className='chd'+(onPath(N)?' o':'');
|
||||
for(var i=0;i<n.children.length;i++){n.children[i]._p=n;RN(kd,n.children[i],d+1)}
|
||||
dv.appendChild(kd)
|
||||
}
|
||||
dv.appendChild(kd)}
|
||||
if(ver&&n.secs){var kd=document.createElement('div');kd.className='chd';
|
||||
if(n===N||(N&&N._p===n))kd.className='chd o';
|
||||
for(var j=0;j<n.secs.length;j++){var s=n.secs[j],sc=SEC[s];if(!sc)continue;
|
||||
var sn={id:n.id+'-'+s,label:sc.label,_sid:s,_p:n};RN(kd,sn,d+1)}
|
||||
dv.appendChild(kd)
|
||||
}
|
||||
dv.appendChild(kd)}
|
||||
c.appendChild(dv)
|
||||
}
|
||||
RN(el,TREE,0)
|
||||
}
|
||||
|
||||
// ── SELECT ──
|
||||
function S(n){
|
||||
N=n;CS=null;RT();$('search').value='';HI();$('bd').innerHTML='';
|
||||
N=n;CS=null;MS=null;MT=null;RT();$('search').value='';HI();
|
||||
$('ms-hint').style.display='none';$('bd').innerHTML='';
|
||||
SU(n)
|
||||
}
|
||||
function SU(n){
|
||||
var t=$('os-title'),s=$('os-sub'),c=$('cmds');
|
||||
if(n._sid){var sc=SEC[n._sid];if(sc){t.textContent=(n._p.label.fr||'')+' > '+sc.label.fr;s.textContent=sc.cmds.length+' commandes';SC(sc.cmds)}return}
|
||||
if(n.secs&&n.secs.length>0){var s0=n.secs[0],sc0=SEC[s0];if(sc0){t.textContent=n.label.fr;s.textContent=n.secs.length+' sections . '+CC(n)+' commandes';SC(sc0.cmds)}return}
|
||||
t.textContent=n.label.fr;s.textContent='Aucune donnee';c.innerHTML='<div class="emp"><h3>'+n.label.fr+'</h3><p>Pas encore de commandes</p></div>'
|
||||
if(n._sid){var sc=SEC[n._sid];if(sc){t.textContent=(n._p.label[L]||'')+' > '+sc.label[L];s.textContent=sc.cmds.length+' '+SL('commands','commandes');SC(sc.cmds);return}}
|
||||
if(n.secs&&n.secs.length>0){var s0=n.secs[0],sc0=SEC[s0];if(sc0){t.textContent=n.label[L];s.textContent=n.secs.length+' sections . '+CC(n)+' '+SL('commands','commandes');SC(sc0.cmds)}return}
|
||||
t.textContent=n.label[L];s.textContent='No data';c.innerHTML='<div class="emp"><h3>'+n.label[L]+'</h3><p>'+SL('No commands yet for this OS.','Pas encore de commandes pour cet OS.')+'</p></div>'
|
||||
}
|
||||
|
||||
function SH(){N=null;CS=null;RT();$('search').value='';
|
||||
$('home').style.display='block';$('tabs').style.display='none';$('stats-bar').style.display='none';$('cmd-box').style.display='none';
|
||||
$('bd').innerHTML='';$('os-title').textContent='SysCmd';$('os-sub').textContent='';$('fh').textContent='Cliquez sur un OS pour explorer ses commandes';
|
||||
RH()
|
||||
// ── MULTI-SECTION SEARCH ──
|
||||
function MSB(){
|
||||
if(!MS||!MT)return;
|
||||
S(MT);
|
||||
// After select, trigger the multi-section mode
|
||||
MS=true;CS=null;
|
||||
var secs=MT.secs||(MT._p?MT._p.secs:null);
|
||||
if(!secs)return;
|
||||
var allCmds=[];
|
||||
secs.forEach(function(sid){var sc=SEC[sid];if(sc)sc.cmds.forEach(function(x){allCmds.push({cmd:x,sec:sc.label[L]})})});
|
||||
var sv=$('search').value.trim().toLowerCase();
|
||||
if(sv)allCmds=allCmds.filter(function(x){return x.cmd.d[L].toLowerCase().indexOf(sv)!==-1||x.cmd.c.toLowerCase().indexOf(sv)!==-1});
|
||||
var el=$('cmds');$('shown').textContent=''+allCmds.length;
|
||||
$('ms-hint').style.display='block';
|
||||
$('ms-hint').textContent=SL('All sections ('+allCmds.length+')','Toutes les sections ('+allCmds.length+')');
|
||||
if(allCmds.length===0){el.innerHTML='<div class="p8">'+SL('No commands found','Aucune commande trouvee')+'</div>';return}
|
||||
el.innerHTML='';
|
||||
allCmds.forEach(function(x,i){
|
||||
var r=document.createElement('div');r.className='scmd'+(i%2===0?' alt':'');
|
||||
r.innerHTML='<div class="d">'+x.cmd.d[L]+' <span style="color:var(--muted);font-weight:400;font-size:10px">['+x.sec+']</span></div><div class="t"><span class="cp"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" width="14" height="14"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"/><path d="M5 15H4a2 2 0 01-2-2V4a2 2 0 012-2h9a2 2 0 012 2v1"/></svg></span><span>'+x.cmd.c+'</span></div>';
|
||||
r.querySelector('.t').onclick=function(){navigator.clipboard.writeText(x.cmd.c)};
|
||||
el.appendChild(r)
|
||||
})
|
||||
}
|
||||
function HI(){$('home').style.display='none';$('tabs').style.display='flex';$('stats-bar').style.display='flex';$('cmd-box').style.display='block';$('fh').textContent='Cliquez sur une commande pour la copier'}
|
||||
|
||||
function SH(){N=null;CS=null;MS=null;MT=null;RT();$('search').value='';
|
||||
$('home').style.display='block';$('tabs').style.display='none';$('stats-bar').style.display='none';$('cmd-box').style.display='none';
|
||||
$('bd').innerHTML='';$('os-title').textContent='SysCmd';$('os-sub').textContent='';$('fh').textContent=SL('Click a command to copy','Cliquez sur une commande pour la copier');
|
||||
RH()}
|
||||
function HI(){$('home').style.display='none';$('tabs').style.display='flex';$('stats-bar').style.display='flex';$('cmd-box').style.display='block';$('fh').textContent=SL('Click a command to copy','Cliquez sur une commande pour la copier')}
|
||||
|
||||
function RH(){RS();RCS()}
|
||||
function RS(){
|
||||
var tc=ALL.length,ts=0;for(var k in SEC)ts++;
|
||||
var lv=CL(TREE,[]),tos=0;for(var i=0;i<lv.length;i++)if(lv[i].secs)tos++;
|
||||
$('stats-row').innerHTML='<div class="sb"><div class="n">'+tc+'</div><div class="l">commandes</div></div><div class="sb"><div class="n">'+ts+'</div><div class="l">sections</div></div><div class="sb"><div class="n">'+tos+'</div><div class="l">OS renseignes</div></div><div class="sb"><div class="n" style="color:#94a3b8">'+(lv.length-tos)+'</div><div class="l">placeholders</div></div>'
|
||||
var cmds=SL('commands','commandes'),secs=SL('sections','sections'),os=SL('OS documented','OS renseignes'),ph=SL('pending','placeholders');
|
||||
$('stats-row').innerHTML='<div class="sb"><div class="n">'+tc+'</div><div class="l">'+cmds+'</div></div><div class="sb"><div class="n">'+ts+'</div><div class="l">'+secs+'</div></div><div class="sb"><div class="n">'+tos+'</div><div class="l">'+os+'</div></div><div class="sb"><div class="n" style="color:var(--muted)">'+(lv.length-tos)+'</div><div class="l">'+ph+'</div></div>'
|
||||
}
|
||||
|
||||
function SL(e,f){return L==='en'?e:f}
|
||||
|
||||
var CARDS=[
|
||||
{id:'deb',l:'Debian',i:'D',c:'#0f172a',d:t('Distribution stable','Stable'),cat:'os'},
|
||||
{id:'ubu',l:'Ubuntu',i:'U',c:'#dc2626',d:t('Base Debian LTS','Debian LTS'),cat:'os',gr:true},
|
||||
{id:'ora',l:'Oracle Linux',i:'O',c:'#b9141e',d:t('Linux UEK+SELinux','UEK+SELinux'),cat:'os'},
|
||||
{id:'win',l:'Windows',i:'W',c:'#0078d4',d:t('CMD+PS','CMD+PS'),cat:'os',gr:true},
|
||||
{id:'sol',l:'Solaris',i:'S',c:'#b46400',d:t('Solaris+ZFS+DTrace','Solaris'),cat:'os'},
|
||||
{id:'rhel',l:'RHEL/CentOS',i:'R',c:'#e63946',d:t('Enterprise Linux standard','Enterprise Linux'),cat:'os'},
|
||||
{id:'fed',l:'Fedora',i:'F',c:'#94a3b8',d:t('RHEL-based','RHEL-based'),cat:'os',ph:1},
|
||||
{id:'freebsd',l:'FreeBSD',i:'B',c:'#cc1111',d:t('Unix BSD avec ZFS+jails','BSD Unix with ZFS+jails'),cat:'os'},
|
||||
{id:'mac',l:'macOS',i:'M',c:'#a1a1a6',d:t('Homebrew+defaults+diskutil','Homebrew+defaults+diskutil'),cat:'os'},
|
||||
{id:'dck',l:'Docker',i:'D',c:'#0ea5e9',d:t('Compose + Dockerfile','Compose + Dockerfile'),cat:'dk',gr:true},
|
||||
{id:'cis',l:'Cisco',i:'C',c:'#8b5cf6',d:t('Reseau Cisco','Cisco'),cat:'oth',ph:1},
|
||||
{id:'my',l:'MySQL/MariaDB',i:'S',c:'#8b5cf6',d:t('Bases SQL','SQL'),cat:'oth'},
|
||||
{id:'pg',l:'PostgreSQL',i:'P',c:'#8b5cf6',d:t('Base avancee','Advanced DB'),cat:'oth'},
|
||||
{id:'ans',l:'Ansible',i:'A',c:'#8b5cf6',d:t('Automatisation','Automation'),cat:'oth',ph:1},
|
||||
{id:'k8',l:'Kubernetes',i:'K',c:'#8b5cf6',d:t('Orchestration','Orchestration'),cat:'oth',ph:1}];
|
||||
{id:'deb',l:'Debian',i:'D',c:'#0f172a',d:'Stable distribution',df:'Distribution stable',cat:'os'},
|
||||
{id:'ubu',l:'Ubuntu',i:'U',c:'#dc2626',d:'Debian-based LTS',df:'Base Debian LTS',cat:'os',gr:true},
|
||||
{id:'ora',l:'Oracle Linux',i:'O',c:'#b9141e',d:'Linux UEK+SELinux',df:'Linux UEK+SELinux',cat:'os'},
|
||||
{id:'win',l:'Windows',i:'W',c:'#0078d4',d:'CMD+PS client/server',df:'CMD+PS client/server',cat:'os',gr:true},
|
||||
{id:'sol',l:'Solaris',i:'S',c:'#b46400',d:'Solaris ZFS+DTrace',df:'Solaris ZFS+DTrace',cat:'os'},
|
||||
{id:'rhel',l:'RHEL/CentOS',i:'R',c:'#e63946',d:'Enterprise Linux',df:'Enterprise Linux',cat:'os'},
|
||||
{id:'fed',l:'Fedora',i:'F',c:'#94a3b8',d:'RHEL-based (pending)',df:'Bas sur RHEL (venir)',cat:'os',ph:1},
|
||||
{id:'freebsd',l:'FreeBSD',i:'B',c:'#cc1111',d:'BSD with ZFS+jails',df:'BSD avec ZFS+jails',cat:'os'},
|
||||
{id:'mac',l:'macOS',i:'M',c:'#a1a1a6',d:'Homebrew+defaults',df:'Homebrew+defaults',cat:'os'},
|
||||
{id:'dck',l:'Docker',i:'D',c:'#0ea5e9',d:'Compose + Dockerfile',df:'Compose + Dockerfile',cat:'dk',gr:true},
|
||||
{id:'cis',l:'Cisco',i:'C',c:'#8b5cf6',d:'Cisco networking (pending)',df:'Reseau Cisco (venir)',cat:'oth',ph:1},
|
||||
{id:'my',l:'MySQL/MariaDB',i:'S',c:'#8b5cf6',d:'SQL databases',df:'Bases SQL',cat:'oth'},
|
||||
{id:'pg',l:'PostgreSQL',i:'P',c:'#8b5cf6',d:'Advanced database',df:'Base de donnes',cat:'oth'},
|
||||
{id:'ans',l:'Ansible',i:'A',c:'#8b5cf6',d:'IT automation (pending)',df:'Automatisation IT (venir)',cat:'oth',ph:1},
|
||||
{id:'k8',l:'Kubernetes',i:'K',c:'#8b5cf6',d:'Container orchestration (pending)',df:'Orchestration (venir)',cat:'oth',ph:1}];
|
||||
|
||||
function RCS(){
|
||||
var cats={os:{l:t('Systemes d exploitation','Operating Systems'),h:''},dk:{l:t('Docker/Conteneurs','Docker/Containers'),h:''},oth:{l:t('Reseau, BDD, DevOps','Network, DB, DevOps'),h:''}};
|
||||
var ct0={os:{l:SL('Operating Systems','Systemes d exploitation'),h:''},dk:{l:SL('Docker/Containers','Docker/Conteneurs'),h:''},oth:{l:SL('Network, DB, DevOps','Reseau, BDD, DevOps'),h:''}};
|
||||
CARDS.forEach(function(cd){
|
||||
var nd=FN(TREE,cd.id),cnt=nd?CC(nd):0,ph=cd.ph&&cnt===0;
|
||||
if(!cats[cd.cat])cats[cd.cat]={l:cd.cat,h:''};
|
||||
if(!ct0[cd.cat])ct0[cd.cat]={l:cd.cat,h:''};
|
||||
var desc=cd.d&&L==='en'?cd.d:cd.df||cd.d||'';
|
||||
var h='<div class="oc'+(ph?' ph':'')+'" data-card="'+cd.id+'">'+
|
||||
'<div style="display:flex;gap:12px;margin-bottom:12px">'+
|
||||
'<div class="ic" style="background:'+(ph?'#e2e8f0':cd.c)+';color:'+(ph?'#94a3b8':'#fff')+'"><span style="font-weight:700;font-size:13px">'+cd.i+'</span></div>'+
|
||||
'<div style="flex:1;min-width:0"><div style="font-weight:600;font-size:13px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap">'+(cd.gr?cd.l+' >':cd.l)+'</div>'+
|
||||
'<div class="sl">'+cd.d.fr+'</div></div></div>'+
|
||||
'<div style="display:flex;gap:8px;font-size:11px">'+(cnt>0?'<span style="font-weight:600;color:#0f172a">'+cnt+'</span><span style="color:#94a3b8">commandes</span>':'<span style="color:#cbd5e1">'+(ph?'A venir':'via sidebar')+'</span>')+'</div></div>';
|
||||
cats[cd.cat].h+=h
|
||||
});
|
||||
'<div class="ic" style="background:'+(ph?'var(--brd2)':cd.c)+';color:'+(ph?'var(--muted)':'#fff')+';transition:background .2s"><span style="font-weight:700;font-size:13px">'+cd.i+'</span></div>'+
|
||||
'<div style="flex:1;min-width:0"><div style="font-weight:600;font-size:13px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--title)">'+(cd.gr?cd.l+'>':cd.l)+'</div>'+
|
||||
'<div style="font-size:11px;color:var(--muted)">'+desc+'</div></div></div>'+
|
||||
'<div style="display:flex;gap:8px;font-size:11px">'+(cnt>0?'<span style="font-weight:600;color:var(--title)">'+cnt+'</span><span style="color:var(--muted)">'+SL('commands','commandes')+'</span>':'<span style="color:var(--muted)">'+SL('Pending','A venir')+'</span>')+'</div></div>';
|
||||
ct0[cd.cat].h+=h});
|
||||
var html='';
|
||||
Object.keys(cats).forEach(function(k){html+='<div class="cl">'+cats[k].l.fr+'</div>'+cats[k].h});
|
||||
Object.keys(ct0).forEach(function(k){html+='<div class="cl">'+ct0[k].l+'</div>'+ct0[k].h});
|
||||
$('grid').innerHTML=html;
|
||||
// Bind clicks
|
||||
$('grid').querySelectorAll('[data-card]').forEach(function(el){
|
||||
el.onclick=function(){
|
||||
var id=el.dataset.card,cd=null;
|
||||
@@ -429,47 +472,62 @@ function RCS(){
|
||||
if(!cd)return;
|
||||
var nd=FN(TREE,cd.id);
|
||||
if(cd.gr&&nd&&nd.children&&nd.children.length>0)S(nd.children[0]);
|
||||
else if(nd)S(nd)
|
||||
}
|
||||
})
|
||||
else if(nd)S(nd)}})
|
||||
}
|
||||
|
||||
function SC(cmds){
|
||||
var el=$('cmds'),sv=$('search').value.trim().toLowerCase();
|
||||
var c2=sv?cmds.filter(function(x){return x.d.fr.indexOf(sv)!==-1||x.d.en.indexOf(sv)!==-1||x.c.indexOf(sv)!==-1}):cmds;
|
||||
var c2=sv?cmds.filter(function(x){return x.d[L].toLowerCase().indexOf(sv)!==-1||x.c.toLowerCase().indexOf(sv)!==-1}):cmds;
|
||||
$('shown').textContent=''+c2.length;
|
||||
if(c2.length===0){el.innerHTML='<div class="p8">Aucune commande trouvee</div>';return}
|
||||
$('ms-hint').style.display='none';
|
||||
if(c2.length===0){el.innerHTML='<div class="p8">'+SL('No commands found','Aucune commande trouvee')+'</div>';return}
|
||||
el.innerHTML='';
|
||||
c2.forEach(function(x,i){
|
||||
var r=document.createElement('div');r.className='scmd'+(i%2===0?' alt':'');
|
||||
r.innerHTML='<div class="d">'+x.d.fr+'</div><div class="t"><span class="cp"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" width="14" height="14"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"/><path d="M5 15H4a2 2 0 01-2-2V4a2 2 0 012-2h9a2 2 0 012 2v1"/></svg></span><span>'+x.c+'</span></div>';
|
||||
r.innerHTML='<div class="d">'+x.d[L]+'</div><div class="t"><span class="cp"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" width="14" height="14"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"/><path d="M5 15H4a2 2 0 01-2-2V4a2 2 0 012-2h9a2 2 0 012 2v1"/></svg></span><span>'+x.c+'</span></div>';
|
||||
r.querySelector('.t').onclick=function(){
|
||||
navigator.clipboard.writeText(x.c).then(function(){
|
||||
var ic=r.querySelector('.cp');
|
||||
ic.innerHTML='<svg viewBox="0 0 24 24" fill="none" stroke="#22c55e" stroke-width="2.5" width="14" height="14"><polyline points="20 6 9 17 4 12"/></svg>';
|
||||
setTimeout(function(){ic.innerHTML='<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" width="14" height="14"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"/><path d="M5 15H4a2 2 0 01-2-2V4a2 2 0 012-2h9a2 2 0 012 2v1"/></svg>'},1200)
|
||||
})
|
||||
};
|
||||
el.appendChild(r)
|
||||
})
|
||||
setTimeout(function(){ic.innerHTML='<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" width="14" height="14"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"/><path d="M5 15H4a2 2 0 01-2-2V4a2 2 0 012-2h9a2 2 0 012 2v1"/></svg>'},1200)})};
|
||||
el.appendChild(r)})
|
||||
}
|
||||
|
||||
function onSearch(v){
|
||||
$('fi').textContent=v.trim()?'Filtre: "'+v+'"':'Aucun filtre';
|
||||
if(N&&N._sid){SC(SEC[N._sid].cmds);return}
|
||||
if(N&&N.secs&&N.secs.length>0){SC(SEC[N.secs[0]].cmds);return}
|
||||
$('fi').textContent=v.trim()?SL('Filter:','Filtre:')+' "'+v+'"':SL('No filter','Aucun filtre');
|
||||
if(N&&N._sid){MS=false;SC(SEC[N._sid].cmds);return}
|
||||
if(N&&N.secs&&N.secs.length>0){MS=true;MT=N;MSS(N,v);return}
|
||||
if(!N&&v.trim()){
|
||||
var r=ALL.filter(function(x){return x.d.fr.indexOf(v.trim().toLowerCase())!==-1||x.d.en.indexOf(v.trim().toLowerCase())!==-1||x.c.indexOf(v.trim().toLowerCase())!==-1});
|
||||
var r=ALL.filter(function(x){return x.d[L].toLowerCase().indexOf(v.trim().toLowerCase())!==-1||x.c.toLowerCase().indexOf(v.trim().toLowerCase())!==-1});
|
||||
$('gs').style.display='block';
|
||||
var h='<div class="cmdbox"><div class="s">'+r.length+' resultat(s)</div>';
|
||||
if(r.length===0)h+='<div class="p8">Aucun resultat</div>';
|
||||
var h='<div class="cmdbox"><div class="s">'+r.length+' '+SL('result(s)','resultat(s)')+'</div>';
|
||||
if(r.length===0)h+='<div class="p8">'+SL('No results','Aucun resultat')+'</div>';
|
||||
else{r.forEach(function(x,i){
|
||||
h+='<div class="scmd'+(i%2===0?' alt':'')+'"><div class="d">'+x.d.fr+'</div><div class="t"><span class="cp"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" width="14" height="14"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"/><path d="M5 15H4a2 2 0 01-2-2V4a2 2 0 012-2h9a2 2 0 012 2v1"/></svg></span><span>'+x.c+'</span></div></div>'
|
||||
})}
|
||||
h+='<div class="scmd'+(i%2===0?' alt':'')+'"><div class="d">'+x.d[L]+'</div><div class="t"><span class="cp"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" width="14" height="14"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"/><path d="M5 15H4a2 2 0 01-2-2V4a2 2 0 012-2h9a2 2 0 012 2v1"/></svg></span><span>'+x.c+'</span></div></div>'})}
|
||||
h+='</div>';$('gs').innerHTML=h;$('grid').style.display='none';$('stats-row').style.display='none'
|
||||
}else if(!N){$('gs').style.display='none';$('grid').style.display='grid';$('stats-row').style.display='grid'}
|
||||
}
|
||||
|
||||
function MSS(n,v){
|
||||
var secs=n.secs;
|
||||
if(!secs||secs.length===0){SC(SEC[secs[0]].cmds);return}
|
||||
var allCmds=[];
|
||||
secs.forEach(function(sid){var sc=SEC[sid];if(sc)sc.cmds.forEach(function(x){allCmds.push({cmd:x,sec:sc.label[L]})})});
|
||||
var sv=v.trim().toLowerCase();
|
||||
if(sv)allCmds=allCmds.filter(function(x){return x.cmd.d[L].toLowerCase().indexOf(sv)!==-1||x.cmd.c.toLowerCase().indexOf(sv)!==-1});
|
||||
$('shown').textContent=''+allCmds.length;
|
||||
$('ms-hint').style.display='block';
|
||||
$('ms-hint').textContent=SL('All sections ('+allCmds.length+')','Toutes les sections ('+allCmds.length+')');
|
||||
var el=$('cmds');
|
||||
if(allCmds.length===0){el.innerHTML='<div class="p8">'+SL('No commands found','Aucune commande trouvee')+'</div>';return}
|
||||
el.innerHTML='';
|
||||
allCmds.forEach(function(x,i){
|
||||
var r=document.createElement('div');r.className='scmd'+(i%2===0?' alt':'');
|
||||
r.innerHTML='<div class="d">'+x.cmd.d[L]+' <span style="color:var(--muted);font-weight:400;font-size:10px">['+x.sec+']</span></div><div class="t"><span class="cp"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" width="14" height="14"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"/><path d="M5 15H4a2 2 0 01-2-2V4a2 2 0 012-2h9a2 2 0 012 2v1"/></svg></span><span>'+x.cmd.c+'</span></div>';
|
||||
r.querySelector('.t').onclick=function(){navigator.clipboard.writeText(x.cmd.c)};
|
||||
el.appendChild(r)})
|
||||
}
|
||||
|
||||
RT();
|
||||
SH();
|
||||
</script>
|
||||
|
||||
Reference in New Issue
Block a user