403Webshell
Server IP : 69.72.244.102  /  Your IP : 216.73.216.164
Web Server : LiteSpeed
System : Linux s3434.fra1.stableserver.net 4.18.0-513.24.1.lve.2.el8.x86_64 #1 SMP Fri May 24 12:42:50 UTC 2024 x86_64
User : konzalta ( 1271)
PHP Version : 7.4.33
Disable Function : NONE
MySQL : OFF  |  cURL : ON  |  WGET : ON  |  Perl : ON  |  Python : ON  |  Sudo : OFF  |  Pkexec : OFF
Directory :  /home/konzalta/constituency.work/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Command :


[ Back ]     

Current File : /home/konzalta/constituency.work/documents.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>ConstituencyOS – Documents</title>
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&display=swap" rel="stylesheet">
<style>
*,*::before,*::after{box-sizing:border-box;margin:0;padding:0;}
:root{
  --green:#1a7a4a;--green-light:#e8f5ee;--green-mid:#2d9e63;
  --red:#dc2626;--red-light:#fdecea;
  --amber:#f59e0b;--amber-light:#fffbeb;
  --blue:#2563eb;--blue-light:#eff6ff;
  --purple:#7c3aed;--purple-light:#f5f3ff;
  --teal:#0891b2;--teal-light:#ecfeff;
  --text:#111827;--muted:#6b7280;--light:#9ca3af;
  --border:#e5e7eb;--bg:#f3f4f6;--white:#ffffff;
  --sidebar-w:216px;--radius:10px;--radius-sm:6px;
  --shadow:0 1px 3px rgba(0,0,0,.08);
}
html,body{height:100%;margin:0;padding:0;}
body{font-family:'Inter',sans-serif;font-size:13px;color:var(--text);background:var(--bg);}
.sidebar{position:fixed;top:0;left:0;bottom:0;width:var(--sidebar-w);background:var(--white);border-right:1px solid var(--border);display:flex;flex-direction:column;overflow-y:auto;overflow-x:hidden;z-index:40;}
.sidebar-logo{display:flex;align-items:center;gap:9px;padding:14px 14px 12px;border-bottom:1px solid var(--border);flex-shrink:0;}
.logo-icon{width:38px;height:38px;background:linear-gradient(135deg,#b91c1c,#1a7a4a);border-radius:8px;display:flex;align-items:center;justify-content:center;font-size:17px;flex-shrink:0;}
.logo-text strong{display:block;font-size:12.5px;font-weight:700;color:var(--green);}
.logo-text small{font-size:10px;color:var(--muted);line-height:1.3;}
.sidebar-profile{display:flex;align-items:center;gap:9px;padding:11px 14px;border-bottom:1px solid var(--border);flex-shrink:0;}
.s-av{width:36px;height:36px;border-radius:50%;background:#374151;color:white;font-weight:600;font-size:13px;display:flex;align-items:center;justify-content:center;flex-shrink:0;position:relative;}
.s-av .dot{position:absolute;bottom:1px;right:1px;width:8px;height:8px;border-radius:50%;background:var(--green-mid);border:2px solid white;}
.pname{font-size:11.5px;font-weight:600;}.psub{font-size:10.5px;color:var(--muted);}
.sidebar-nav{flex:1;padding:6px 0;}
.nav-item{display:flex;align-items:center;gap:9px;padding:8px 14px;font-size:12px;font-weight:500;color:var(--muted);cursor:pointer;position:relative;transition:background .12s,color .12s;white-space:nowrap;}
.nav-item:hover{background:var(--bg);color:var(--text);}
.nav-item.active{background:var(--green-light);color:var(--green);font-weight:600;}
.nav-item.active::before{content:'';position:absolute;left:0;top:0;bottom:0;width:3px;background:var(--green);border-radius:0 2px 2px 0;}
.nav-icon{font-size:14px;width:16px;text-align:center;flex-shrink:0;}
.nav-badge{margin-left:auto;background:var(--red);color:white;font-size:9.5px;font-weight:700;padding:1px 5px;border-radius:10px;}
.nav-new{margin-left:auto;background:var(--green);color:white;font-size:9px;font-weight:700;padding:2px 5px;border-radius:4px;}
.nav-chev{margin-left:auto;font-size:10px;color:var(--light);}
.sidebar-footer{padding:12px 14px;border-top:1px solid var(--border);flex-shrink:0;}
.right-panel{margin-left:var(--sidebar-w);display:flex;flex-direction:column;min-height:100vh;}
.topbar{position:sticky;top:0;z-index:30;height:52px;background:var(--white);border-bottom:1px solid var(--border);display:flex;align-items:center;gap:10px;padding:0 18px;}
.menu-btn{font-size:17px;cursor:pointer;color:var(--muted);}
.const-sel{display:flex;align-items:center;gap:6px;background:var(--bg);border:1px solid var(--border);border-radius:var(--radius-sm);padding:5px 10px;cursor:pointer;font-size:12px;font-weight:500;}
.srch{flex:1;max-width:360px;display:flex;align-items:center;gap:7px;background:var(--bg);border:1px solid var(--border);border-radius:var(--radius-sm);padding:6px 11px;color:var(--muted);font-size:12px;}
.srch input{border:none;background:transparent;outline:none;width:100%;font-size:12px;font-family:inherit;}
.srch kbd{margin-left:auto;font-size:9.5px;background:var(--border);padding:1px 5px;border-radius:3px;font-family:inherit;}
.tbr{margin-left:auto;display:flex;align-items:center;gap:8px;}
.ibt{position:relative;width:32px;height:32px;border-radius:50%;background:var(--bg);border:1px solid var(--border);display:flex;align-items:center;justify-content:center;cursor:pointer;font-size:15px;}
.ibt .bdg{position:absolute;top:-3px;right:-3px;background:var(--red);color:white;font-size:9px;font-weight:700;width:15px;height:15px;border-radius:50%;display:flex;align-items:center;justify-content:center;border:1.5px solid white;}
.ibt .bdg.grn{background:var(--green-mid);}
.upill{display:flex;align-items:center;gap:7px;border:1px solid var(--border);border-radius:var(--radius-sm);padding:3px 8px;cursor:pointer;font-size:12px;font-weight:500;}
.content{padding:18px 18px 40px;display:flex;flex-direction:column;gap:14px;}
.btn{display:inline-flex;align-items:center;gap:6px;padding:7px 14px;border-radius:var(--radius-sm);font-size:12px;font-weight:600;cursor:pointer;border:none;transition:background .15s;}
.btn-primary{background:var(--green);color:white;}.btn-primary:hover{background:var(--green-mid);}
.btn-ghost{background:var(--white);color:var(--text);border:1px solid var(--border);}.btn-ghost:hover{background:var(--bg);}
.page-hdr{display:flex;align-items:flex-start;justify-content:space-between;}
.page-title{font-size:19px;font-weight:700;}
.page-sub{font-size:12px;color:var(--muted);margin-top:2px;}

/* STORAGE METER */
.storage-card{background:var(--white);border:1px solid var(--border);border-radius:var(--radius);padding:14px 16px;display:flex;align-items:center;gap:20px;}
.storage-ring{flex-shrink:0;position:relative;}
.storage-ring-label{position:absolute;inset:0;display:flex;flex-direction:column;align-items:center;justify-content:center;}
.storage-ring-label strong{font-size:14px;font-weight:700;}
.storage-ring-label span{font-size:8.5px;color:var(--muted);}
.storage-stats{flex:1;display:grid;grid-template-columns:repeat(4,1fr);gap:16px;}
.ss-item{text-align:left;}
.ss-dot{width:8px;height:8px;border-radius:2px;display:inline-block;margin-right:5px;}
.ss-val{font-size:15px;font-weight:700;}
.ss-lbl{font-size:10.5px;color:var(--muted);}

/* LAYOUT */
.docs-layout{display:grid;grid-template-columns:220px 1fr;gap:14px;align-items:start;}

/* FOLDER TREE */
.folder-card{background:var(--white);border:1px solid var(--border);border-radius:var(--radius);overflow:hidden;}
.folder-hdr{padding:12px 14px;border-bottom:1px solid var(--border);font-size:12.5px;font-weight:600;}
.folder-item{display:flex;align-items:center;gap:8px;padding:8px 14px;font-size:12px;color:var(--muted);cursor:pointer;transition:background .12s,color .12s;position:relative;}
.folder-item:hover{background:var(--bg);color:var(--text);}
.folder-item.active{background:var(--green-light);color:var(--green);font-weight:600;}
.folder-item.active::before{content:'';position:absolute;left:0;top:0;bottom:0;width:3px;background:var(--green);}
.folder-count{margin-left:auto;font-size:10px;color:var(--light);background:var(--bg);padding:1px 6px;border-radius:10px;}
.folder-item.active .folder-count{background:white;color:var(--green);}

/* TOOLBAR */
.toolbar{display:flex;align-items:center;gap:10px;background:var(--white);border:1px solid var(--border);border-radius:var(--radius);padding:10px 14px;flex-wrap:wrap;}
.sb{flex:1;min-width:180px;display:flex;align-items:center;gap:7px;background:var(--bg);border:1px solid var(--border);border-radius:var(--radius-sm);padding:7px 11px;}
.sb input{border:none;background:transparent;outline:none;width:100%;font-size:12px;font-family:inherit;color:var(--text);}
.fsel{display:flex;align-items:center;gap:5px;background:var(--bg);border:1px solid var(--border);border-radius:var(--radius-sm);padding:6px 10px;font-size:12px;white-space:nowrap;}
.fsel select{border:none;background:transparent;outline:none;font-size:12px;font-family:inherit;color:var(--text);cursor:pointer;}
.view-toggle{display:flex;gap:2px;background:var(--bg);border:1px solid var(--border);border-radius:var(--radius-sm);padding:2px;}
.vt{width:28px;height:26px;border-radius:4px;display:flex;align-items:center;justify-content:center;cursor:pointer;font-size:13px;color:var(--muted);}
.vt.active{background:var(--white);color:var(--text);box-shadow:var(--shadow);}

/* GRID VIEW */
.doc-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:12px;}
.doc-card{background:var(--white);border:1px solid var(--border);border-radius:var(--radius);padding:14px;cursor:pointer;transition:box-shadow .15s;display:flex;flex-direction:column;gap:10px;}
.doc-card:hover{box-shadow:0 4px 16px rgba(0,0,0,.1);border-color:var(--green-mid);}
.doc-icon-wrap{height:64px;border-radius:var(--radius-sm);display:flex;align-items:center;justify-content:center;font-size:30px;}
.doc-name{font-size:12px;font-weight:600;line-height:1.3;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
.doc-meta{font-size:10.5px;color:var(--muted);}
.doc-tags{display:flex;flex-wrap:wrap;gap:4px;}
.doc-tag{font-size:9px;padding:1px 6px;border-radius:20px;font-weight:600;background:var(--bg);color:var(--muted);}
.doc-footer{display:flex;align-items:center;justify-content:space-between;padding-top:6px;border-top:1px solid var(--border);}

/* LIST VIEW */
.list-card{background:var(--white);border:1px solid var(--border);border-radius:var(--radius);overflow:hidden;display:none;}
table{width:100%;border-collapse:collapse;}
thead tr{background:var(--bg);border-bottom:1px solid var(--border);}
th{padding:9px 14px;font-size:11px;font-weight:600;color:var(--muted);text-align:left;white-space:nowrap;cursor:pointer;}
th:hover{color:var(--text);}
tbody tr{border-bottom:1px solid var(--border);transition:background .1s;cursor:pointer;}
tbody tr:last-child{border-bottom:none;}
tbody tr:hover{background:#f9fafb;}
td{padding:9px 14px;font-size:12px;vertical-align:middle;}
.fdoc-icon{font-size:16px;margin-right:8px;}

/* PAGINATION */
.pgn{display:flex;align-items:center;justify-content:space-between;padding:10px 14px;border-top:1px solid var(--border);background:var(--white);border-left:1px solid var(--border);border-right:1px solid var(--border);border-bottom:1px solid var(--border);border-radius:0 0 var(--radius) var(--radius);}
.pg-info{font-size:11.5px;color:var(--muted);}
.pg-btns{display:flex;gap:4px;}
.pg-btn{width:26px;height:26px;border-radius:var(--radius-sm);border:1px solid var(--border);background:var(--white);display:flex;align-items:center;justify-content:center;cursor:pointer;font-size:11.5px;font-weight:500;}
.pg-btn.active{background:var(--green);color:white;border-color:var(--green);}
.pg-btn:hover:not(.active){background:var(--bg);}

/* UPLOAD ZONE */
.upload-zone{border:2px dashed var(--border);border-radius:var(--radius);padding:24px;text-align:center;background:var(--white);cursor:pointer;transition:border-color .15s,background .15s;}
.upload-zone:hover,.upload-zone.dragover{border-color:var(--green);background:var(--green-light);}
.upload-icon{font-size:28px;margin-bottom:6px;}
.upload-text{font-size:12.5px;font-weight:600;}
.upload-sub{font-size:11px;color:var(--muted);margin-top:2px;}

/* DETAIL PANEL */
.ov{position:fixed;inset:0;background:rgba(0,0,0,.35);z-index:100;display:none;}
.ov.open{display:flex;align-items:flex-start;justify-content:flex-end;}
.dp{width:420px;height:100%;background:var(--white);box-shadow:-4px 0 24px rgba(0,0,0,.12);display:flex;flex-direction:column;overflow:hidden;}
.dp-hdr{padding:16px 18px;border-bottom:1px solid var(--border);flex-shrink:0;display:flex;align-items:flex-start;gap:14px;}
.dp-icon-box{width:54px;height:54px;border-radius:var(--radius-sm);display:flex;align-items:center;justify-content:center;font-size:26px;flex-shrink:0;}
.dp-close{width:28px;height:28px;border-radius:50%;background:var(--bg);border:1px solid var(--border);display:flex;align-items:center;justify-content:center;cursor:pointer;font-size:14px;margin-left:auto;}
.dp-name{font-size:14px;font-weight:700;line-height:1.3;}
.dp-meta{font-size:11px;color:var(--muted);margin-top:3px;}
.dp-body{flex:1;overflow-y:auto;padding:18px;display:flex;flex-direction:column;gap:16px;}
.dp-sect{font-size:11px;font-weight:700;color:var(--muted);text-transform:uppercase;letter-spacing:.5px;margin-bottom:8px;}
.dp-row{display:flex;justify-content:space-between;padding:5px 0;border-bottom:1px solid var(--border);font-size:12px;}
.dp-row:last-child{border-bottom:none;}
.dp-key{color:var(--muted);}.dp-val{font-weight:500;text-align:right;}
.preview-box{background:var(--bg);border-radius:var(--radius-sm);height:180px;display:flex;align-items:center;justify-content:center;font-size:50px;color:var(--light);}
.dp-footer{padding:14px 18px;border-top:1px solid var(--border);display:flex;gap:8px;flex-shrink:0;}
.dp-footer .btn{flex:1;justify-content:center;}
.version-item{display:flex;align-items:center;gap:8px;padding:8px 10px;background:var(--bg);border-radius:var(--radius-sm);font-size:11.5px;}
.version-item:not(:last-child){margin-bottom:5px;}
</style>
</head>
<body>
<aside class="sidebar">
  <div class="sidebar-logo"><div class="logo-icon">πŸ›οΈ</div><div class="logo-text"><strong>ConstituencyOS</strong><small>Everything in your constituency,<br>in one place.</small></div></div>
  <div class="sidebar-profile"><div class="s-av">DM<div class="dot"></div></div><div><div class="pname">Hon. David Mwangi, MP</div><div class="psub">Embakasi South</div></div></div>
  <nav class="sidebar-nav">
    <div class="nav-item" onclick="location.href='index.html'"><span class="nav-icon">🏠</span>Dashboard</div>
    <div class="nav-item" onclick="location.href='constituents.html'"><span class="nav-icon">πŸ‘₯</span>Constituents</div>
    <div class="nav-item" onclick="location.href='complaints.html'"><span class="nav-icon">πŸ“‹</span>Complaints<span class="nav-badge">9</span></div>
    <div class="nav-item" onclick="location.href='projects.html'"><span class="nav-icon">πŸ“</span>Projects</div>
    <div class="nav-item" onclick="location.href='bursaries.html'"><span class="nav-icon">πŸŽ“</span>Bursaries</div>
    <div class="nav-item" onclick="location.href='events.html'"><span class="nav-icon">πŸ“…</span>Events</div>
    <div class="nav-item" onclick="location.href='social_protection.html'"><span class="nav-icon">πŸ›‘οΈ</span>Social Protection</div>
    <div class="nav-item" onclick="location.href='ward_management.html'"><span class="nav-icon">🏘️</span>Ward Management</div>
    <div class="nav-item" onclick="location.href='finance.html'"><span class="nav-icon">πŸ’°</span>Finance</div>
    <div class="nav-item" onclick="location.href='documents.html'"><span class="nav-icon">πŸ“„</span>Documents</div>
    <div class="nav-item" onclick="location.href='staff_management.html'"><span class="nav-icon">πŸ‘€</span>Staff Management</div>
    <div class="nav-item" onclick="location.href='reports_analytics.html'"><span class="nav-icon">πŸ“Š</span>Reports & Analytics</div>
    <div class="nav-item active"><span class="nav-icon">πŸ€–</span>AI Assistant<span class="nav-new">New</span></div>
    <div class="nav-item" onclick="location.href='settings.html'"><span class="nav-icon">βš™οΈ</span>Settings</div>
    <div class="nav-item" onclick="location.href='public_portal.html'"><span class="nav-icon">🌐</span>Public Portal</div>
  </nav>
  <div class="sidebar-footer"><div style="display:flex;align-items:center;gap:9px;cursor:pointer"><span>❓</span><div><div style="font-size:11.5px;font-weight:600">Need Help?</div><div style="font-size:10.5px;color:var(--muted)">Contact Support</div></div></div></div>
</aside>

<div class="right-panel">
  <header class="topbar">
    <span class="menu-btn">☰</span>
    <div class="const-sel"><span style="font-size:13px">πŸ›οΈ</span>Embakasi South Constituency<span style="font-size:10px;color:var(--muted)">β–Ό</span></div>
    <div class="srch"><span>πŸ”</span><input type="text" placeholder="Search for anything…"><kbd>⌘K</kbd></div>
    <div class="tbr">
      <div class="ibt">πŸ””<div class="bdg">8</div></div>
      <div class="ibt">βœ‰οΈ<div class="bdg grn">3</div></div>
      <div class="upill"><div class="s-av" style="width:26px;height:26px;font-size:10px">DM</div>Hon. David Mwangi<span style="font-size:10px;color:var(--muted)">β–Ό</span></div>
    </div>
  </header>

  <main class="content">
    <div class="page-hdr">
      <div><div class="page-title">Documents</div><div class="page-sub">Store, organise, and share constituency files, reports, and records</div></div>
      <div style="display:flex;gap:8px;">
        <button class="btn btn-ghost">πŸ“ New Folder</button>
        <button class="btn btn-primary" onclick="triggerUpload()">⬆ Upload Files</button>
      </div>
    </div>

    <!-- Storage meter -->
    <div class="storage-card">
      <div class="storage-ring">
        <svg width="72" height="72" viewBox="0 0 72 72">
          <circle cx="36" cy="36" r="29" fill="none" stroke="#e5e7eb" stroke-width="9"/>
          <circle cx="36" cy="36" r="29" fill="none" stroke="#1a7a4a" stroke-width="9" stroke-dasharray="113 69" stroke-dashoffset="0" transform="rotate(-90 36 36)"/>
        </svg>
        <div class="storage-ring-label"><strong>62%</strong><span>used</span></div>
      </div>
      <div class="storage-stats">
        <div class="ss-item"><div class="ss-val">3.1 GB</div><div class="ss-lbl"><span class="ss-dot" style="background:var(--green)"></span>Used of 5 GB</div></div>
        <div class="ss-item"><div class="ss-val">248</div><div class="ss-lbl"><span class="ss-dot" style="background:var(--blue)"></span>Total Files</div></div>
        <div class="ss-item"><div class="ss-val">12</div><div class="ss-lbl"><span class="ss-dot" style="background:var(--purple)"></span>Folders</div></div>
        <div class="ss-item"><div class="ss-val">6</div><div class="ss-lbl"><span class="ss-dot" style="background:var(--amber)"></span>Shared with you</div></div>
      </div>
    </div>

    <!-- Upload zone -->
    <div class="upload-zone" id="uploadZone" onclick="triggerUpload()">
      <div class="upload-icon">⬆</div>
      <div class="upload-text">Click to upload or drag and drop files here</div>
      <div class="upload-sub">PDF, Word, Excel, Images up to 25MB</div>
    </div>

    <div class="docs-layout">

      <!-- Folder Tree -->
      <div class="folder-card">
        <div class="folder-hdr">Folders</div>
        <div class="folder-item active" onclick="filterFolder('all',this)">
          <span>πŸ“‚</span> All Documents <span class="folder-count" id="cnt-all">0</span>
        </div>
        <div class="folder-item" onclick="filterFolder('CDF Reports',this)">
          <span>πŸ’°</span> CDF Reports <span class="folder-count" id="cnt-cdf">0</span>
        </div>
        <div class="folder-item" onclick="filterFolder('Project Files',this)">
          <span>πŸ“</span> Project Files <span class="folder-count" id="cnt-proj">0</span>
        </div>
        <div class="folder-item" onclick="filterFolder('Bursary Records',this)">
          <span>πŸŽ“</span> Bursary Records <span class="folder-count" id="cnt-burs">0</span>
        </div>
        <div class="folder-item" onclick="filterFolder('Legal & Compliance',this)">
          <span>βš–οΈ</span> Legal &amp; Compliance <span class="folder-count" id="cnt-legal">0</span>
        </div>
        <div class="folder-item" onclick="filterFolder('Meeting Minutes',this)">
          <span>πŸ“</span> Meeting Minutes <span class="folder-count" id="cnt-min">0</span>
        </div>
        <div class="folder-item" onclick="filterFolder('Correspondence',this)">
          <span>βœ‰οΈ</span> Correspondence <span class="folder-count" id="cnt-corr">0</span>
        </div>
        <div class="folder-item" onclick="filterFolder('Media & Photos',this)">
          <span>πŸ–ΌοΈ</span> Media &amp; Photos <span class="folder-count" id="cnt-media">0</span>
        </div>
        <div class="folder-item" onclick="filterFolder('starred',this)" style="border-top:1px solid var(--border);margin-top:4px;padding-top:10px;">
          <span>⭐</span> Starred <span class="folder-count" id="cnt-star">0</span>
        </div>
      </div>

      <!-- Right: toolbar + docs -->
      <div style="display:flex;flex-direction:column;gap:12px;">
        <div class="toolbar">
          <div class="sb"><span>πŸ”</span><input type="text" id="searchInput" placeholder="Search documents…" oninput="applyFilters()"></div>
          <div class="fsel">πŸ“„ <select id="typeFilter" onchange="applyFilters()">
            <option value="">All Types</option>
            <option>PDF</option><option>Word</option><option>Excel</option><option>Image</option>
          </select></div>
          <div class="fsel">↕ <select id="sortFilter" onchange="applyFilters()">
            <option value="recent">Most Recent</option>
            <option value="name">Name A–Z</option>
            <option value="size">Largest First</option>
          </select></div>
          <div class="view-toggle">
            <div class="vt active" id="vt-grid" onclick="setView('grid')">⊞</div>
            <div class="vt" id="vt-list" onclick="setView('list')">☰</div>
          </div>
        </div>

        <div id="folderLabel" style="font-size:14px;font-weight:700;"></div>

        <!-- Grid -->
        <div class="doc-grid" id="docGrid"></div>

        <!-- List -->
        <div class="list-card" id="docListCard">
          <table>
            <thead><tr>
              <th onclick="sortBy('name')">Name ↕</th><th>Folder</th><th onclick="sortBy('size')">Size ↕</th>
              <th onclick="sortBy('date')">Modified ↕</th><th>Owner</th><th></th>
            </tr></thead>
            <tbody id="docListBody"></tbody>
          </table>
        </div>

        <div class="pgn">
          <div class="pg-info" id="pgInfo"></div>
          <div class="pg-btns" id="pgBtns"></div>
        </div>
      </div>
    </div>
  </main>
</div>

<!-- DETAIL PANEL -->
<div class="ov" id="ov" onclick="closeOv(event)">
  <div class="dp">
    <div class="dp-hdr">
      <div class="dp-icon-box" id="dp-iconbox"></div>
      <div style="flex:1;">
        <div class="dp-name" id="dp-name"></div>
        <div class="dp-meta" id="dp-meta"></div>
      </div>
      <div class="dp-close" onclick="closeDp()">βœ•</div>
    </div>
    <div class="dp-body">
      <div class="preview-box" id="dp-preview"></div>
      <div>
        <div class="dp-sect">File Details</div>
        <div class="dp-row"><span class="dp-key">Folder</span><span class="dp-val" id="dp-folder"></span></div>
        <div class="dp-row"><span class="dp-key">File Type</span><span class="dp-val" id="dp-type"></span></div>
        <div class="dp-row"><span class="dp-key">Size</span><span class="dp-val" id="dp-size"></span></div>
        <div class="dp-row"><span class="dp-key">Uploaded By</span><span class="dp-val" id="dp-owner"></span></div>
        <div class="dp-row"><span class="dp-key">Date Modified</span><span class="dp-val" id="dp-date"></span></div>
        <div class="dp-row"><span class="dp-key">Shared</span><span class="dp-val" id="dp-shared"></span></div>
      </div>
      <div>
        <div class="dp-sect">Tags</div>
        <div class="doc-tags" id="dp-tags"></div>
      </div>
      <div>
        <div class="dp-sect">Version History</div>
        <div id="dp-versions"></div>
      </div>
    </div>
    <div class="dp-footer">
      <button class="btn btn-ghost" style="flex:1;justify-content:center;" onclick="closeDp()">Close</button>
      <button class="btn btn-ghost" style="flex:1;justify-content:center;">πŸ”— Share</button>
      <button class="btn btn-primary" style="flex:1;justify-content:center;">⬇ Download</button>
    </div>
  </div>
</div>

<script>
const TYPE_STYLE = {
  PDF:{icon:'πŸ“„',color:'#dc2626',bg:'#fdecea'},
  Word:{icon:'πŸ“',color:'#2563eb',bg:'#eff6ff'},
  Excel:{icon:'πŸ“Š',color:'#16a34a',bg:'#ecfdf5'},
  Image:{icon:'πŸ–ΌοΈ',color:'#7c3aed',bg:'#f5f3ff'},
};

const DOCUMENTS = [
  {id:'D-001',name:'Q3 FY2023-2024 Financial Statement.pdf',folder:'CDF Reports',type:'PDF',size:2.4,date:'2024-03-31',owner:'Finance Office',shared:true,starred:true,tags:['Quarterly','Audited']},
  {id:'D-002',name:'Annual CDF Utilisation Report 2023.pdf',folder:'CDF Reports',type:'PDF',size:5.1,date:'2024-01-15',owner:'Finance Office',shared:true,starred:false,tags:['Annual','CDF']},
  {id:'D-003',name:'Kwa Njenga Water Pipeline - BOQ.xlsx',folder:'Project Files',type:'Excel',size:0.8,date:'2024-05-12',owner:'Eng. Kamau',shared:false,starred:false,tags:['Water','BOQ']},
  {id:'D-004',name:'Imara Daima Dispensary - Architectural Plans.pdf',folder:'Project Files',type:'PDF',size:8.2,date:'2023-11-02',owner:'BuildRight Contractors',shared:true,starred:true,tags:['Health','Plans']},
  {id:'D-005',name:'Pipeline Road Rehabilitation - Contract.pdf',folder:'Legal & Compliance',type:'PDF',size:1.6,date:'2023-10-15',owner:'Legal Office',shared:false,starred:false,tags:['Contract','Roads']},
  {id:'D-006',name:'Bursary Applications Master List 2024.xlsx',folder:'Bursary Records',type:'Excel',size:1.2,date:'2024-05-18',owner:'Education Dept',shared:true,starred:true,tags:['Bursary','2024']},
  {id:'D-007',name:'Bursary Disbursement Schedule Q2.xlsx',folder:'Bursary Records',type:'Excel',size:0.6,date:'2024-04-30',owner:'Finance Office',shared:false,starred:false,tags:['Bursary','Schedule']},
  {id:'D-008',name:'CDF Act Compliance Checklist.docx',folder:'Legal & Compliance',type:'Word',size:0.3,date:'2024-02-10',owner:'Legal Office',shared:false,starred:false,tags:['Compliance']},
  {id:'D-009',name:'Staff Meeting Minutes - May 2024.docx',folder:'Meeting Minutes',type:'Word',size:0.2,date:'2024-05-20',owner:'Office Secretary',shared:false,starred:false,tags:['Meeting']},
  {id:'D-010',name:'Pipeline Ward Baraza Minutes.docx',folder:'Meeting Minutes',type:'Word',size:0.25,date:'2024-05-20',owner:'Ward Administrator',shared:false,starred:false,tags:['Baraza','Pipeline']},
  {id:'D-011',name:'CDFC Quarterly Meeting Minutes Q1.docx',folder:'Meeting Minutes',type:'Word',size:0.4,date:'2024-03-28',owner:'CDF Committee',shared:true,starred:false,tags:['CDFC']},
  {id:'D-012',name:'Letter to County Government - Road Maintenance.pdf',folder:'Correspondence',type:'PDF',size:0.15,date:'2024-04-22',owner:'MP Office',shared:false,starred:false,tags:['Letter']},
  {id:'D-013',name:'Ministry of Health - Dispensary Handover Request.pdf',folder:'Correspondence',type:'PDF',size:0.2,date:'2024-05-10',owner:'MP Office',shared:false,starred:false,tags:['Health','Handover']},
  {id:'D-014',name:'School Opening Ceremony Photos.jpg',folder:'Media & Photos',type:'Image',size:4.5,date:'2024-05-20',owner:'Communications',shared:true,starred:true,tags:['Event','Photos']},
  {id:'D-015',name:'Imara Daima Dispensary - Construction Progress.jpg',folder:'Media & Photos',type:'Image',size:3.2,date:'2024-05-15',owner:'Eng. Mwangi',shared:false,starred:false,tags:['Health','Progress']},
  {id:'D-016',name:'Umoja Market Renovation - Before & After.jpg',folder:'Media & Photos',type:'Image',size:2.8,date:'2023-12-15',owner:'Communications',shared:true,starred:false,tags:['Roads','Before-After']},
  {id:'D-017',name:'Social Protection Disbursement Log Q1 2024.xlsx',folder:'CDF Reports',type:'Excel',size:0.64,date:'2024-04-05',owner:'Social Protection Office',shared:true,starred:false,tags:['Social Protection']},
  {id:'D-018',name:'Mihango Primary School - Classroom Plans.pdf',folder:'Project Files',type:'PDF',size:3.4,date:'2024-02-08',owner:'EduBuild Ltd',shared:false,starred:false,tags:['Education','Plans']},
  {id:'D-019',name:'Mabatini Health Centre Upgrade - Tender Document.pdf',folder:'Legal & Compliance',type:'PDF',size:2.1,date:'2024-05-01',owner:'Procurement Office',shared:false,starred:false,tags:['Tender','Health']},
  {id:'D-020',name:'Office Operations Statement - April 2024.pdf',folder:'CDF Reports',type:'PDF',size:0.32,date:'2024-05-02',owner:'Finance Office',shared:false,starred:false,tags:['Operations']},
  {id:'D-021',name:'Youth Sports Complex - Site Survey.xlsx',folder:'Project Files',type:'Excel',size:0.9,date:'2024-01-20',owner:'Eng. Mwangi',shared:false,starred:false,tags:['Sports','Survey']},
  {id:'D-022',name:'Fundraiser Pledge Cards Template.docx',folder:'Correspondence',type:'Word',size:0.1,date:'2024-05-18',owner:'MP Office',shared:false,starred:false,tags:['Fundraiser']},
];

let filtered=[...DOCUMENTS];
let activeFolder='all';
let currentView='grid';
let sortKey='date';
let sortDir=-1;
let currentPage=1;
const PAGE_SIZE=12;
let currentDoc=null;

function fileTag(t){
  const s=TYPE_STYLE[t];
  return `<span style="background:${s.bg};color:${s.color};font-size:9.5px;font-weight:700;padding:2px 7px;border-radius:20px;">${s.icon} ${t}</span>`;
}

function updateCounts(){
  document.getElementById('cnt-all').textContent = DOCUMENTS.length;
  document.getElementById('cnt-cdf').textContent = DOCUMENTS.filter(d=>d.folder==='CDF Reports').length;
  document.getElementById('cnt-proj').textContent = DOCUMENTS.filter(d=>d.folder==='Project Files').length;
  document.getElementById('cnt-burs').textContent = DOCUMENTS.filter(d=>d.folder==='Bursary Records').length;
  document.getElementById('cnt-legal').textContent = DOCUMENTS.filter(d=>d.folder==='Legal & Compliance').length;
  document.getElementById('cnt-min').textContent = DOCUMENTS.filter(d=>d.folder==='Meeting Minutes').length;
  document.getElementById('cnt-corr').textContent = DOCUMENTS.filter(d=>d.folder==='Correspondence').length;
  document.getElementById('cnt-media').textContent = DOCUMENTS.filter(d=>d.folder==='Media & Photos').length;
  document.getElementById('cnt-star').textContent = DOCUMENTS.filter(d=>d.starred).length;
}

function filterFolder(folder, el){
  activeFolder = folder;
  document.querySelectorAll('.folder-item').forEach(f=>f.classList.remove('active'));
  el.classList.add('active');
  applyFilters();
}

function applyFilters(){
  const q = document.getElementById('searchInput').value.toLowerCase();
  const type = document.getElementById('typeFilter').value;
  const sort = document.getElementById('sortFilter').value;

  filtered = DOCUMENTS.filter(d=>{
    if(activeFolder==='starred' && !d.starred) return false;
    else if(activeFolder!=='all' && activeFolder!=='starred' && d.folder!==activeFolder) return false;
    if(type && d.type!==type) return false;
    if(q && !`${d.name} ${d.folder} ${d.owner} ${d.tags.join(' ')}`.toLowerCase().includes(q)) return false;
    return true;
  });

  if(sort==='name') filtered.sort((a,b)=>a.name.localeCompare(b.name));
  else if(sort==='size') filtered.sort((a,b)=>b.size-a.size);
  else filtered.sort((a,b)=>new Date(b.date)-new Date(a.date));

  currentPage=1;
  const lbl = activeFolder==='all' ? 'All Documents' : activeFolder==='starred' ? '⭐ Starred Documents' : activeFolder;
  document.getElementById('folderLabel').textContent = `${lbl} (${filtered.length})`;
  render();
}

function sortBy(key){
  filtered.sort((a,b)=>{
    let av=a[key],bv=b[key];
    if(key==='date'){av=new Date(av);bv=new Date(bv);}
    return av>bv?1:av<bv?-1:0;
  });
  render();
}

function setView(v){
  currentView=v;
  document.getElementById('vt-grid').classList.toggle('active', v==='grid');
  document.getElementById('vt-list').classList.toggle('active', v==='list');
  document.getElementById('docGrid').style.display = v==='grid'?'grid':'none';
  document.getElementById('docListCard').style.display = v==='list'?'block':'none';
}

function render(){
  const start=(currentPage-1)*PAGE_SIZE, end=start+PAGE_SIZE;
  const page=filtered.slice(start,end);

  document.getElementById('docGrid').innerHTML = page.map(d=>{
    const s=TYPE_STYLE[d.type];
    return `<div class="doc-card" onclick="openDp('${d.id}')">
      <div class="doc-icon-wrap" style="background:${s.bg};color:${s.color}">${s.icon}</div>
      <div>
        <div class="doc-name" title="${d.name}">${d.starred?'⭐ ':''}${d.name}</div>
        <div class="doc-meta">${d.size} MB Β· ${d.date}</div>
      </div>
      <div class="doc-tags">${d.tags.slice(0,2).map(t=>`<span class="doc-tag">${t}</span>`).join('')}</div>
      <div class="doc-footer">
        <span style="font-size:10.5px;color:var(--muted)">${d.owner}</span>
        ${fileTag(d.type)}
      </div>
    </div>`;
  }).join('');

  document.getElementById('docListBody').innerHTML = page.map(d=>{
    const s=TYPE_STYLE[d.type];
    return `<tr onclick="openDp('${d.id}')">
      <td><span class="fdoc-icon">${s.icon}</span>${d.starred?'⭐ ':''}${d.name}</td>
      <td style="color:var(--muted)">${d.folder}</td>
      <td style="color:var(--muted)">${d.size} MB</td>
      <td style="color:var(--muted)">${d.date}</td>
      <td>${d.owner}</td>
      <td>${d.shared?'πŸ”— Shared':''}</td>
    </tr>`;
  }).join('');

  const total=filtered.length, pages=Math.ceil(total/PAGE_SIZE);
  document.getElementById('pgInfo').textContent = `Showing ${Math.min(start+1,total)}–${Math.min(end,total)} of ${total} documents`;
  const pb=document.getElementById('pgBtns'); pb.innerHTML='';
  const add=(l,p,a)=>{const b=document.createElement('div');b.className='pg-btn'+(a?' active':'');b.textContent=l;b.onclick=()=>{currentPage=p;render();};pb.appendChild(b);};
  if(currentPage>1) add('β€Ή',currentPage-1,false);
  for(let i=1;i<=Math.min(pages,7);i++) add(i,i,i===currentPage);
  if(currentPage<pages) add('β€Ί',currentPage+1,false);
}

function openDp(id){
  currentDoc = DOCUMENTS.find(d=>d.id===id);
  const d=currentDoc, s=TYPE_STYLE[d.type];
  document.getElementById('dp-iconbox').textContent = s.icon;
  document.getElementById('dp-iconbox').style.background = s.bg;
  document.getElementById('dp-iconbox').style.color = s.color;
  document.getElementById('dp-name').textContent = (d.starred?'⭐ ':'')+d.name;
  document.getElementById('dp-meta').textContent = `${d.type} Β· ${d.size} MB`;
  document.getElementById('dp-preview').textContent = s.icon;
  document.getElementById('dp-preview').style.color = s.color;
  document.getElementById('dp-folder').textContent = d.folder;
  document.getElementById('dp-type').textContent = d.type+' document';
  document.getElementById('dp-size').textContent = d.size+' MB';
  document.getElementById('dp-owner').textContent = d.owner;
  document.getElementById('dp-date').textContent = d.date;
  document.getElementById('dp-shared').textContent = d.shared ? 'πŸ”— Shared with team' : 'Private';
  document.getElementById('dp-tags').innerHTML = d.tags.map(t=>`<span class="doc-tag">${t}</span>`).join('');
  document.getElementById('dp-versions').innerHTML = `
    <div class="version-item"><strong>v3</strong> (current) β€” ${d.date} Β· ${d.owner}</div>
    <div class="version-item">v2 β€” Previous edit Β· 2 weeks earlier</div>
    <div class="version-item">v1 β€” Original upload</div>
  `;
  document.getElementById('ov').classList.add('open');
}

function closeOv(e){ if(e.target===document.getElementById('ov')) closeDp(); }
function closeDp(){ document.getElementById('ov').classList.remove('open'); }

function triggerUpload(){
  alert('File picker would open here β€” drag & drop or browse to upload to the current folder.');
}

const uz = document.getElementById('uploadZone');
uz.addEventListener('dragover', e=>{ e.preventDefault(); uz.classList.add('dragover'); });
uz.addEventListener('dragleave', ()=> uz.classList.remove('dragover'));
uz.addEventListener('drop', e=>{ e.preventDefault(); uz.classList.remove('dragover'); alert('File(s) dropped β€” would upload to current folder.'); });

updateCounts();
applyFilters();
</script>
</body>
</html>

Youez - 2016 - github.com/yon3zu
LinuXploit