3e6b0c262a
Memind CI / Test, build, and release guards (push) Successful in 4m31s
Unify chat and OA drive appearance with shared memind-theme storage, default light mode, and cross-frame sync so users can switch themes from chat or the drive shell. Co-authored-by: Cursor <cursoragent@cursor.com>
161 lines
6.8 KiB
HTML
161 lines
6.8 KiB
HTML
<!DOCTYPE html>
|
|
<html lang="zh-CN">
|
|
<head>
|
|
<meta charset="UTF-8" />
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
<title>OA 网盘 · Memind</title>
|
|
<link rel="icon" href="/oa-drive/favicon.svg" type="image/svg+xml" />
|
|
<link rel="stylesheet" href="/oa-drive/app.css" />
|
|
</head>
|
|
<body>
|
|
<div class="wrap">
|
|
<div class="top-bar drop" id="dropZone" tabindex="0" title="拖放文件到此处上传">
|
|
<span class="top-title">OA 网盘</span>
|
|
<span class="top-sub">云端同步 · 拖放/<kbd>⌘V</kbd>粘贴上传</span>
|
|
<div class="links" id="links"></div>
|
|
<div class="top-actions">
|
|
<button type="button" id="themeToggle" title="切换主题">深色</button>
|
|
<button type="button" class="primary" id="pickFiles">选择文件</button>
|
|
<button type="button" id="pickFolder">选择文件夹</button>
|
|
</div>
|
|
<input type="file" id="fileInput" multiple />
|
|
<input type="file" id="folderInput" webkitdirectory directory multiple />
|
|
</div>
|
|
|
|
<div class="status" id="status"></div>
|
|
<div class="progress" id="progress"><i></i></div>
|
|
<div class="progress-detail" id="progressDetail">
|
|
<div class="progress-detail-head">
|
|
<strong id="progressSummary">上传中…</strong>
|
|
<span id="progressSpeed">—</span>
|
|
</div>
|
|
<div class="progress-detail-list" id="progressList"></div>
|
|
</div>
|
|
|
|
<div class="panel-shell" id="filePanelShell">
|
|
<div class="panel" id="filePanel">
|
|
<div class="panel-head">
|
|
<span>
|
|
共享文件 <small id="fileCount">0 个</small>
|
|
<span class="sync-badge" id="syncBadge"><span class="dot"></span><span id="syncText">连接中…</span></span>
|
|
</span>
|
|
<div class="bulk-actions">
|
|
<div class="toolbar-search">
|
|
<input type="search" id="searchInput" placeholder="搜索文件名…" autocomplete="off" />
|
|
</div>
|
|
<select class="conflict-select" id="conflictSelect" title="冲突策略">
|
|
<option value="rename">冲突:重命名</option>
|
|
<option value="overwrite">冲突:覆盖</option>
|
|
<option value="skip">冲突:跳过</option>
|
|
</select>
|
|
<div class="view-toggle" role="group" aria-label="视图切换">
|
|
<button type="button" id="viewListBtn" class="active" title="列表视图">☰</button>
|
|
<button type="button" id="viewIconsBtn" title="图标视图">▦</button>
|
|
</div>
|
|
<label class="select-all-label">
|
|
<input type="checkbox" id="selectAllCheck" title="全选" aria-label="全选" /> 全选
|
|
</label>
|
|
<button type="button" id="downloadZipBtn" disabled title="打包下载所选">打包下载</button>
|
|
<button type="button" id="newFolderBtn">新建文件夹</button>
|
|
<button type="button" class="danger" id="bulkDeleteBtn" disabled>删除所选</button>
|
|
<button type="button" id="trashBtn" title="回收站">回收站</button>
|
|
<button type="button" class="notify-btn" id="notifyBtn" title="开启桌面通知">🔔</button>
|
|
<button type="button" id="refreshBtn">刷新</button>
|
|
</div>
|
|
</div>
|
|
<div class="breadcrumb" id="breadcrumb"></div>
|
|
<div class="file-list" id="fileList">
|
|
<div class="list-header">
|
|
<div class="col-check"></div>
|
|
<div class="col-name"><span class="sortable active" data-sort="name">名称 <span class="sort-mark">▲</span></span></div>
|
|
<div class="col-size"><span class="sortable" data-sort="size">大小</span></div>
|
|
<div class="col-date"><span class="sortable" data-sort="mtime">修改日期</span></div>
|
|
<div class="col-actions"></div>
|
|
</div>
|
|
<div class="list-body" id="fileTree" tabindex="0" aria-label="文件列表"></div>
|
|
</div>
|
|
</div>
|
|
<div class="panel-resizer" id="panelResizer" title="拖动调整窗口大小" role="separator"></div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Drag overlay -->
|
|
<div class="drag-overlay" id="dragOverlay">
|
|
<div class="drag-overlay-box">
|
|
<div class="icon">📂</div>
|
|
<div class="hint" id="dragOverlayHint">松手移入</div>
|
|
<div class="sub" id="dragOverlaySub">释放以上传文件</div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Preview modal -->
|
|
<div class="modal" id="previewModal">
|
|
<div class="modal-box">
|
|
<div class="modal-head">
|
|
<span id="previewTitle"></span>
|
|
<div style="display:flex;gap:8px;flex-shrink:0">
|
|
<a class="btn" id="previewDownload" href="#">下载</a>
|
|
<a class="btn" id="previewOpen" href="#" target="_blank" rel="noopener">新标签打开</a>
|
|
<button type="button" id="previewClose">关闭</button>
|
|
</div>
|
|
</div>
|
|
<div class="modal-body" id="previewBody"></div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Detail modal -->
|
|
<div class="modal" id="detailModal">
|
|
<div class="modal-box sm">
|
|
<div class="modal-head">
|
|
<span id="detailTitle">文件详情</span>
|
|
<button type="button" id="detailClose">关闭</button>
|
|
</div>
|
|
<div class="modal-body">
|
|
<dl class="detail-grid" id="detailGrid"></dl>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Conflict modal -->
|
|
<div class="modal" id="conflictModal">
|
|
<div class="modal-box sm">
|
|
<div class="modal-head">
|
|
<span>文件冲突</span>
|
|
<button type="button" id="conflictClose">关闭</button>
|
|
</div>
|
|
<div class="modal-body">
|
|
<p id="conflictDesc">以下文件已存在,请选择处理方式:</p>
|
|
<div class="conflict-list" id="conflictList"></div>
|
|
<div class="conflict-actions">
|
|
<label><input type="radio" name="conflictChoice" value="rename" checked /> 重命名</label>
|
|
<label><input type="radio" name="conflictChoice" value="overwrite" /> 覆盖</label>
|
|
<label><input type="radio" name="conflictChoice" value="skip" /> 跳过</label>
|
|
</div>
|
|
</div>
|
|
<div class="modal-foot">
|
|
<button type="button" id="conflictCancel">取消</button>
|
|
<button type="button" class="primary" id="conflictConfirm">继续</button>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Trash drawer -->
|
|
<div class="trash-backdrop" id="trashBackdrop"></div>
|
|
<aside class="trash-drawer" id="trashDrawer">
|
|
<div class="trash-drawer-head">
|
|
<span>回收站</span>
|
|
<button type="button" id="trashClose">关闭</button>
|
|
</div>
|
|
<div class="trash-drawer-body" id="trashBody">
|
|
<div class="trash-empty">加载中…</div>
|
|
</div>
|
|
<div class="trash-drawer-foot">
|
|
<button type="button" id="trashEmptyBtn">清空回收站</button>
|
|
<button type="button" id="trashRefreshBtn">刷新</button>
|
|
</div>
|
|
</aside>
|
|
|
|
<script src="/oa-drive/app.js"></script>
|
|
</body>
|
|
</html>
|