本卡屬 FR-192(母卡 FR-192 母案(同清單上一張)),卡 F-1,批 2。只改 FE(compliance-manager-fe)。依賴:無。
決策者點名主系統回饋表單的附件區「設計有點舊,順便調整」。本卡做一個共用的附件元件:一個拖放區,已經傳上去的檔和還沒傳的檔同一清單,每檔一列(圖示、檔名、大小、存放位置標籤),滑鼠移上去才出預覽/下載/移除,區底一行「拖放檔案到這裡,或選擇檔案」。先換進主系統回饋表單把舊的兩區四樣式拿掉;之後 Agent 主控台回饋頁(A-2)也用它。雛形 prototype/index.html 的新增回饋對話框與「主系統 · 編輯回饋」分頁就是這個樣子,只取結構。
new(照型):拖放與 accept 照 src/views/source-scan/SourceFilePicker.vue(ss-drop、onDrop、useAcceptedUploadTypes),多檔清單與既有檔列是新寫;extend:SystemFeedbackForm.vue 附件區整段換成這個元件,FileUpload 兩區四樣式刪掉
repo:~/Projects/Billows/Audit-Manager/compliance-manager-fe
改既有:src/views/feedback/system/SystemFeedbackForm.vue 302~420(附件區)
改既有:src/config/locales/i18n/zh-tw/feedback.json、en/feedback.json(附件區文案改寫;舊鍵 drag_drop_hint/ready_to_upload/uploaded_files 若無他處用則刪)
新開:src/components/common/AttachmentDropList.vue(props:existing[]、pending[]、accept、maxSize、canDownload、canDelete、readonly;emits:add、remove-pending、remove-existing、preview、download)
src/components/common/AttachmentDropList.vue:props existing([{uid, file_name, size, where}])、pending(File[])、accept、maxSize(bytes)、canDownload、canDelete、readonly;emits add(files)、remove-pending(index)、remove-existing(file)、preview(file)、download(file)。拖放與 <input type=file hidden> 照 src/views/source-scan/SourceFilePicker.vue 第 97~102 行;accept 用 useAcceptedUploadTypes;超大小用既有 lang.common.invalid_file_size 訊息。dark-card 風格的虛線框,每檔一列 flex(圖示、檔名 truncate、大小、where=cloud 時 Tag「存於主系統」、where=agent 時 Tag「存於 Agent」)、hover 才顯示動作鈕(opacity 切換,不用 PrimeVue Menu);區底一行提示;空的時候只剩那行。🔴 不自訂 font-size/max-width;grep border-left 為 0。SystemFeedbackForm.vue 第 302~420 行附件區整段換成 <AttachmentDropList>,FileUpload 與下方「已上傳的檔案」區刪掉;既有 uploadFileHandler/onPreviewFileClick/onDownloadFileClick/onDeleteFileClick 接到 emits;v-can 與 $canDownload 判斷搬進 canDelete/canDownload props。feedback.json(zh-tw、en):附件區文案改寫(attachment_drop_hint、attachment_choose、stored_on_agent、stored_on_cloud…);舊鍵 drag_drop_hint/ready_to_upload/uploaded_files/files_selected 全站 grep 無他處用才刪。回寫列出新增與沿用的鍵。npm run build、npm run lint;手測新增與編輯兩條路。npm run build 過;主系統新增回饋:空的只有一行提示、拖兩個檔進區內兩列、hover 出移除、超 20 MB 顯示既有錯誤訊息;編輯既有回饋:既有檔與新加檔同一區、既有檔 hover 出預覽/下載/刪除且 v-can 照舊;grep -n 'border-left\|font-size\|max-width' src/components/common/AttachmentDropList.vue 為 0;文案全部來自 i18n 檔,回寫列出新增與沿用的鍵
~/Projects/Billows/Audit-Manager/compliance-manager-be/docs/features/FR-192-2611-agent-console-feedback/design.md §3 決策定案、§5 詳細設計(本卡那節)、§6 拆卡表本卡那列、§8 風險;討論稿 discussion.md §4 只在想知道「為什麼這樣裁」時看~/Projects/Billows/Audit-Manager/compliance-manager-be/docs/features/FR-192-2611-agent-console-feedback/prototype/index.html(純畫面,只取結構與資訊順序;文案依 i18n 重寫)guidant_agent/scan/app/local_runs.py(本機先存+同步欄位)、sync/app/outbox.py(待回傳佇列)、console/api/runs_routes.py(清單/404/resend)、files/app/blob_ops.py(附件存本機);主系統 api/source_scan/routes/agent_manual_scan_route.py(Agent 收單端點先例)、infra/upload_file/remote_agent_adapter.py(Agent 檔參照)、core/plugins/_agent_config_sections.py+_agent_config_notify.py(設定通道)、core/plugins/issue.py(jedi-issue 接線);jedi-issue app/feedback/service/feedback_service.py、api/routes/feedback_route.py、plugin/contract.py(SchemaExtensions);jedi-remote-agent app/service/local_run_service.py(ingest 形狀)、migrations/011-remote-agent-offline-operators.sql(RLS/GRANT 先例);FE src/views/feedback/system/SystemFeedbackForm.vue、console/views/Runs.vue、console/views/Logs.vue(Dialog)、src/views/source-scan/SourceFilePicker.vue(拖放)docs/system-design/system-integration/04-Agent到主系統API.md、05-主系統到Agent指令.md