PageSourceSearch

https://logisticspoe-6xbwz3cw.manus.space/assets/FeatureSettings-D1AaWhnE.js

js logisticspoe-6xbwz3cw.manus.space collected 2026-10-03 05:04:06 UTC 73,067 bytes, 15 lines download raw bytes

1import{f as ie,t as b,r as S,F as h,j as e,v as c,I as o,B as F}from"./index-BSDW1oXO.js";import{A as ve,M as C,S as I,j as be,K as ee,F as k}from"./AppLayout-Cygsc5g6.js";import{R as Ne}from"./RoleGuard-BhEJLJgD.js";import{S as Ce}from"./switch-DiiO2Wxi.js";import{T as $}from"./textarea-Dt-aCe2h.js";import{T as ke}from"./TimeTreeRepairProgressPanel-DJIzcqGo.js";import{O as te,a as ye}from"./orderClipboardFields-7_ACTvD_.js";import{C as q}from"./clock-3-EOigJxhq.js";import{E as Te}from"./eye-off-BJBeXnsU.js";import"./badge-C9VVw_VW.js";import"./phone-C9TJVbMn.js";import"./DriverOfflineQueueContext-BEufZpdi.js";import"./index-kDhvbWGq.js";import"./select--Ol-BrhX.js";import"./chevron-down-BLn-uhAC.js";import"./settings-CGT12rKW.js";import"./wrench-Bpj9hFtT.js";import"./index-Byu38Y_L.js";import"./progress-CzQR2Smy.js";import"./search-D9fK1HFq.js";import"./eye-DF0rd5JS.js";import"./arrow-left-BZi9p_2F.js";import"./truck-BwipagV7.js";import"./users-DBgza2Az.js";import"./chart-column-B79fz39p.js";import"./chevron-right-DYXrKHZe.js";import"./circle-check-CoKTsn8F.js";/**
2 * @license lucide-react v0.453.0 - ISC
3 *
4 * This source code is licensed under the ISC license.
5 * See the LICENSE file in the root directory of this source tree.
6 */const B=ie("Building2",[["path",{d:"M6 22V4a2 2 0 0 1 2-2h8a2 2 0 0 1 2 2v18Z",key:"1b4qmf"}],["path",{d:"M6 12H4a2 2 0 0 0-2 2v6a2 2 0 0 0 2 2h2",key:"i71pzd"}],["path",{d:"M18 9h2a2 2 0 0 1 2 2v9a2 2 0 0 1-2 2h-2",key:"10jefs"}],["path",{d:"M10 6h4",key:"1itunk"}],["path",{d:"M10 10h4",key:"tcdvrf"}],["path",{d:"M10 14h4",key:"kelpxr"}],["path",{d:"M10 18h4",key:"1ulq68"}]]);/**
7 * @license lucide-react v0.453.0 - ISC
8 *
9 * This source code is licensed under the ISC license.
10 * See the LICENSE file in the root directory of this source tree.
11 */const ae=ie("SquareMenu",[["rect",{width:"18",height:"18",x:"3",y:"3",rx:"2",key:"afitv7"}],["path",{d:"M7 8h10",key:"1jw688"}],["path",{d:"M7 12h10",key:"b7w52i"}],["path",{d:"M7 16h10",key:"wp8him"}]]);function we(l){return{title:l.headerTitle?.trim()||l.companyName?.trim()||"公司標題",address:l.companyAddress?.trim()||"公司地址",phone:l.companyPhone?.trim()||"公司電話",fps:l.taxId?.trim()||"63138767"}}function Ae(l,g,u){return{id:l,name:g.trim(),...u}}function Pe(l){const{headerTitle:g,companyAddress:u,companyPhone:p,taxId:j}=l;return{headerTitle:g,companyAddress:u,companyPhone:p,taxId:j}}function Ie(l,g,u){return l.map(p=>p.id===g?{...p,name:u.trim()}:p)}function De(l,g,u){const p=Object.fromEntries(Object.entries(g).map(([j,y])=>[j,y===u?null:y]));return{templates:l.filter(j=>j.id!==u),defaults:p}}function Le(l,g,u){return{...l,[g]:u}}function Re(l){return l.length>0}function Ee(l){return l?"TimeTree 同步密碼已更新":"請輸入新的 TimeTree 同步密碼"}function Me(l){if(!l)return"尚未成功登入 TimeTree";const g=new Date(l);return Number.isNaN(g.getTime())?"最近登入時間資料無效":g.toLocaleString("zh-HK",{timeZone:"Asia/Hong_Kong",year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit",second:"2-digit",hour12:!1})}const Oe=[{href:"/admin/orders/new",label:"手動建立工單"},{href:"/admin/search",label:"全局搜尋"},{href:"/admin/month-view-calendar",label:"排班日曆"},{href:"/admin/calendar-grid",label:"排班視圖"},{href:"/admin/documents",label:"製作報價單/發票"},{href:"/admin/issued-invoices",label:"已發出發票"},{href:"/admin",label:"總覽"},{href:"/admin/orders",label:"工單管理"},{href:"/admin/kanban",label:"工單看板"},{href:"/admin/reports",label:"財務報表"},{href:"/admin/orders/import",label:"批量匯入工單"},{href:"/admin/timetree",label:"TimeTree 匯入"},{href:"/admin/drivers",label:"師傅管理"},{href:"/admin/users",label:"用戶管理"},{href:"/admin/reports/drivers",label:"師傅績效"},{href:"/admin/backup",label:"資料庫備份"},{href:"/admin/notifications",label:"訊息中心"},{href:"/admin/sessions",label:"登入會話管理"}],f={mimeType:"image/png",typeLabel:"PNG 圖像",width:1284,height:1146,originalBytes:811201},He={clerk:{clerkCalendar:!0,clerkOrderManagement:!0,clerkDocuments:!0,clerkIssuedInvoices:!0},driver:{driverDocuments:!0,driverCreateQuotation:!0,driverCreateInvoice:!0,driverCreateReceipt:!1,driverInvoiceRequiresCompleted:!0,driverPastRecords:!0,driverOrderOverview:!1,driverGlobalSearch:!1,driverHistoryDays:7,driverScheduleHeader:!1}},se={adminIssuedInvoices:"管理員:已發出發票工作台",adminFinancialReports:"管理員:財務報表",clerkCalendar:"文員:排班日曆",clerkOrderManagement:"文員:工單管理",clerkDocuments:"文員:製作報價單/發票",clerkIssuedInvoices:"文員:已發出發票工作台",driverDocuments:"師傅:文件製作入口",driverCreateQuotation:"師傅:製作報價單",driverCreateInvoice:"師傅:製作發票",driverCreateReceipt:"師傅:製作收據",driverInvoiceRequiresCompleted:"師傅:完成工單後才可製作發票",driverPastRecords:"師傅:查詢以往記錄",driverOrderOverview:"師傅:工單總覽",driverGlobalSearch:"師傅:全局搜尋",driverHistoryDays:"師傅:歷史紀錄可查閱天數",driverScheduleHeader:"師傅:顯示我的排班頂部頁籤"};function _e(l){return new Promise((g,u)=>{const p=new Image,j=URL.createObjectURL(l);p.onload=()=>
11{URL.revokeObjectURL(j),g({width:p.naturalWidth,height:p.naturalHeight})},p.onerror=()=>{URL.revokeObjectURL(j),u(new Error("無法讀取圖像"))},p.src=j})}function m({icon:l,title:g,description:u,children:p}){return e.jsxs("section",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:71",className:"rounded-xl border bg-card p-4 shadow-sm sm:p-5",children:[e.jsxs("div",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:71",className:"mb-4 flex gap-3",children:[e.jsx("div",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:71",className:"rounded-lg bg-primary/10 p-2 text-primary",children:e.jsx(l,{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:71",className:"h-5 w-5"})}),e.jsxs("div",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:71",children:[e.jsx("h2",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:71",className:"font-semibold",children:g}),e.jsx("p",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:71",className:"mt-0.5 text-xs text-muted-foreground",children:u})]})]}),p]})}function r({label:l,description:g,checked:u,onCheckedChange:p}){return e.jsxs("div",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:75",className:"flex items-center justify-between gap-4 border-t py-3 first:border-t-0 first:pt-0",children:[e.jsxs("div",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:75",children:[e.jsx("p",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:75",className:"text-sm font-medium",children:l}),e.jsx("p",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:75",className:"mt-0.5 text-xs text-muted-foreground",children:g})]}),e.jsx(Ce,{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:75",checked:u,onCheckedChange:p})]})}function xt(){const l=b.useUtils(),{data:g,isLoading:u}=b.documents.getFeatureSettings.useQuery(),{data:p,refetch:j}=b.timetree.syncStatus.useQuery(),{data:y=[]}=b.users.all.useQuery(),{data:ne=[]}=b.documents.listPermissionChangeLogs.useQuery(),[a,T]=S.useState(),[Q,W]=S.useState(),[z,K]=S.useState(!1),[D,re]=S.useState(""),[L,ce]=S.useState(""),[R,de]=S.useState("quotation"),[E,le]=S.useState(.65),[G,Z]=S.useState(""),[oe,M]=S.useState(null),[J,w]=S.useState(""),[O,V]=S.useState("");S.useEffect(()=>{g&&(T(g),W(g))},[g]);const H=b.documents.updateFeatureSettings.useMutation({onSuccess:t=>{T(t),W(t),l.documents.getFeatureSettings.invalidate(),h.success("功能設定已儲存並套用")},onError:t=>h.error(t.message||"儲存設定失敗")}),_=b.timetree.updateSyncPassword.useMutation({onSuccess:()=>{V(""),h.success(Ee(!0))},onError:t=>h.error(t.message||"更新 TimeTree 同步密碼失敗")}),U=b.timetree.testConnection.useMutation({onSuccess:async t=>{await j(),h.success("TimeTree 連線測試成功",{description:`可讀取 ${t.eventCount} 個當日活動。`})},onError:t=>h.error(t.message||"TimeTree 連線測試失敗")}),s=(t,i)=>T(n=>{const d=structuredClone(n);let x=d;return t.slice(0,-1).forEach(N=>{x=x[N]}),x[t[t.length-1]]=i,d}),me=(t,i)=>{const n=a.hiddenMenuItems;s(["hiddenMenuItems"],i?[...n,t]:n.filter(d=>d!==t))},ge=(t,i)=>{const n=a.reminders.recipientUserIds;s(["reminders","recipientUserIds"],i?Array.from(new Set([...n,t])):n.filter(d=>d!==t))},xe=(t,i)=>{const n=a.scheduleCards.copyFields;if(!i&&n.length===1){h.error("最少需要保留一個複製欄位");return}s(["scheduleCards","copyFields"],i?te.filter(d=>d===t||n.includes(d)):n.filter(d=>d!==t))},Y=t=>T(i=>({...i,roleAccess:{...i.roleAccess,...He[t]}})),A=ne.filter(t=>{const i=!D||(t.actorName||`用戶 #${t.actorUserId}`).toLowerCase().includes(D.toLowerCase()),n=new Date(t.createdAt).toLocaleDateString("en-CA",{timeZone:"Asia/Hong_Kong"});return i&&(!L||n===L)}),pe=()=>{const i=["時間,操作人,變更內容",...A.map(x=>{const N=(()=>{try{return JSON.parse(x.changes)}catch{return[]}})();return[new Date(x.createdAt).toLocaleString("zh-HK",{timeZone:"Asia/Hong_Kong",hour12:!1}),x.actorName||`用戶 #${x.actorUserId}`,N.map(P=>`${se[P.key]||P.key}: ${P.from?"開啟":"關閉"} → ${P.to?"開啟":"關閉"}`).join(";")]}).map(x=>x.map(N=>`"${String(N).replaceAll('"','""')}"`).join(","))].join(`
12`),n=URL.createObjectURL(new Blob(["\uFEFF"+i],{type:"text/csv;charset=utf-8"})),d=document.createElement("a");d.href=n,d.download=`權限異動紀錄_${new Date().toISOString().slice(0,10)}.csv`,d.click(),URL.revokeObjectURL(n)},ue=!!a&&!!Q&&JSON.stringify(a)!==JSON.stringify(Q),v=a?we(a.pdf):null,he=()=>{const t=G.trim();if(!t){h.error("請輸入公司版面範本名稱");return}const i=Ae(`${Date.now()}-${Math.random().toString(36).slice(2,8)}`,t,{headerTitle:a.pdf.headerTitle,companyAddress:a.pdf.companyAddress,companyPhone:a.pdf.companyPhone,taxId:a.pdf.taxId});s(["pdf","headerTemplates"],[...a.pdf.headerTemplates||[],i].slice(-12)),Z(""),h.success("公司版面範本已加入,按儲存全部設定後生效")},X=t=>{const i=(a.pdf.headerTemplates||[]).find(d=>d.id===t);if(!i)return;const n=Pe(i);
12Object.entries(n).forEach(([d,x])=>s(["pdf",d],x)),h.success(`已套用公司版面範本「${i.name}」`)},Se=t=>{const i=J.trim();if(!i){h.error("請輸入範本名稱");return}s(["pdf","headerTemplates"],Ie(a.pdf.headerTemplates||[],t,i)),M(null),w("")},Fe=t=>{const i=De(a.pdf.headerTemplates||[],a.pdf.headerTemplateDefaults,t);s(["pdf","headerTemplates"],i.templates),s(["pdf","headerTemplateDefaults"],i.defaults),h.success("公司版面範本已刪除")},je=(t,i)=>{s(["pdf","headerTemplateDefaults"],Le(a.pdf.headerTemplateDefaults,t,i))},fe=async t=>{if(t){if(t.type!==f.mimeType){h.error(`公司印章必須為 ${f.typeLabel} 檔案`);return}K(!0);try{const{width:i,height:n}=await _e(t);if(i!==f.width||n!==f.height)throw new Error(`圖像尺寸必須為 ${f.width} × ${f.height} px`);const d=new FormData;d.append("file",t);const x=await fetch("/api/upload",{method:"POST",body:d});if(!x.ok)throw new Error("上傳失敗");const{url:N}=await x.json();s(["pdf","companyStamp"],N),h.success("公司印章規格已通過並上傳;儲存設定後會套用至新 PDF")}catch(i){h.error(i instanceof Error?i.message:"公司印章上傳失敗")}finally{K(!1)}}};return e.jsx(ve,{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:209",title:"功能設定",children:e.jsx(Ne,{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:209",allowedRoles:["admin","admin+driver"],children:e.jsxs("div",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:209",className:"space-y-5 px-4 pb-10 md:px-0",children:[e.jsxs("div",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:209",children:[e.jsx("h1",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:209",className:"font-display text-2xl font-semibold",children:"功能設定"}),e.jsx("p",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:209",className:"mt-1 text-sm text-muted-foreground",children:"集中調整全局顯示、角色可用功能及 PDF 公司資料。儲存後會立即套用至新生成的文件。"})]}),u||!a?e.jsx("div",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:209",className:"rounded-xl border p-10 text-center text-sm text-muted-foreground",children:"正在載入設定…"}):e.jsxs(e.Fragment,{children:[e.jsxs(m,{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:210",icon:q,title:"全局時間設定",description:"業務日期與時間維持香港時間,避免排班及文件出現時區差異。",children:[e.jsx(r,{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:210",label:"24 小時制時間",description:"所有可設定的時間介面使用 00:00–23:59 格式。",checked:a.use24HourTime,onCheckedChange:t=>s(["use24HourTime"],t)}),e.jsxs("div",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:210",className:"mt-3",children:[e.jsx(c,{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:210",children:"系統時區"}),e.jsx(o,{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:210",value:"Asia/Hong_Kong(香港時間)",disabled:!0,className:"mt-1"})]})]}),e.jsxs(m,{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:211",icon:q,title:"寫字樓 WhatsApp 當值號碼",description:"師傅選擇「通知寫字樓已聯絡客人」時,系統會按香港時間自動使用目前時段的 WhatsApp 號碼。每個時段均可隨時調整。",children:[e.jsx("div",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:211",className:"space-y-3",children:a.officeWhatsAppShifts.map((t,i)=>e.jsxs("div",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:211",className:"grid gap-3 rounded-lg border bg-muted/20 p-3 sm:grid-cols-[minmax(110px,1fr)_130px_130px_minmax(150px,1.4fr)]",children:[e.jsxs("div",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:211",children:[e.jsx(c,{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:211",children:"時段名稱"}),e.jsx(o,{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:211",className:"mt-1",value:t.label,maxLength:40,onChange:n=>s(["officeWhatsAppShifts"],a.officeWhatsAppShifts.map((d,x)=>x===i?{...d,label:n.target.value}:d))})]}),e.jsxs("div",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:211",children:[e.jsx(c,{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:211",children:"開始時間"}),e.jsx(o,{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:211",type:"time",className:"mt-1",value:t.startTime,onChange:n=>s(["officeWhatsAppShifts"],a.officeWhatsAppShifts.map((d,x)=>x===i?{...d,startTime:n.target.value}:d))})]}),e.jsxs("div",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:211",children:[e.jsx(c,{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:211",children:"結束時間"}),e.jsx(o,{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:211",type:"time",className:"mt-1",value:t.endTime,onChange:n=>s(["officeWhatsAppShifts"],a.officeWhatsAppShifts.map((d,x)=>x===i?{...d,endTime:n.target.value}:d))})]}),e.jsxs("div",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:211",children:[e.jsx(c,{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:211",children:"WhatsApp 號碼"}),e.jsx(o,{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:211",className:"mt-1",value:t.phone,inputMode:"tel",placeholder:"ä¾
12‹å¦‚:68912611",maxLength:32,onChange:n=>s(["officeWhatsAppShifts"],a.officeWhatsAppShifts.map((d,x)=>x===i?{...d,phone:n.target.value}:d))})]})]},t.id))}),e.jsx("p",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:211",className:"mt-3 text-xs text-muted-foreground",children:"預設:06:00–15:00、15:00–00:00、00:00–06:00。電話可輸入 +852、852 或八位本地號碼,傳送時會自動正規化。"})]}),e.jsxs(m,{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:212",icon:q,title:"午夜自動完成前一天工單",description:"開啟後,系統每日香港時間 00:05 會將前一天預約、但仍未完成且未取消的工單設為已完成。",children:[e.jsx(r,{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:212",label:"啟用午夜自動完成",description:"關閉時背景工作只會記錄為略過,不會修改任何工單。已取消或已完成工單不會再次處理。",checked:a.orderAutomation.autoCompletePreviousDayEnabled,onCheckedChange:t=>s(["orderAutomation","autoCompletePreviousDayEnabled"],t)}),e.jsx("p",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:212",className:"mt-3 text-xs text-muted-foreground",children:"請修改後按下方「儲存全部設定」才會套用。每次處理會加入工單狀態歷程,並更新相關 TimeTree 行程。"})]}),e.jsxs(m,{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:213",icon:C,title:"TimeTree AI 輔助同步",description:"只在既有工單號、UUID 和同日同址同時間規則均無法識別時,才會進行高信心地址比對。",children:[e.jsx(r,{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:213",label:"啟用高信心 AI 輔助",description:"只有同電話、同香港日期時間、唯一未取消候選,且 AI 信心達 98% 才建立既有事件連結;AI 不會改取消、師傅、日期、時間或工單內容。關閉後只保留原有確定性同步規則。",checked:a.timeTreeAiAssistance.enabled,onCheckedChange:t=>s(["timeTreeAiAssistance","enabled"],t)}),e.jsx("p",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:213",className:"mt-3 text-xs text-muted-foreground",children:"低於 98% 的個案會進入 AI 同步人工覆核清單,供管理員或文員確認連結或略過。"})]}),e.jsx(ke,{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:214"}),e.jsx(m,{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:215",icon:ae,title:"預設進入頁面",description:"各角色登入成功或返回系統首頁時,會自動前往其所屬設定的頁面。",children:e.jsxs("div",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:215",className:"grid gap-3 sm:grid-cols-3",children:[e.jsxs("div",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:215",children:[e.jsx(c,{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:215",children:"管理員預設進入頁面"}),e.jsxs("select",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:215",className:"mt-1 h-10 w-full rounded-md border border-input bg-background px-3 text-sm",value:a.defaultLandingPages.admin,onChange:t=>s(["defaultLandingPages","admin"],t.target.value),children:[e.jsx("option",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:215",value:"/admin/month-view-calendar",children:"排班日曆"}),e.jsx("option",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:215",value:"/admin/calendar-grid",children:"排班日曆視圖"}),e.jsx("option",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:215",value:"/admin",children:"總覽"}),e.jsx("option",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:215",value:"/admin/orders",children:"工單管理"}),e.jsx("option",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:215",value:"/admin/kanban",children:"工單看板"}),e.jsx("option",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:215",value:"/admin/issued-invoices",children:"已發出發票"}),e.jsx("option",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:215",value:"/admin/documents",children:"製作報價單/發票"})]})]}),e.jsxs("div",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:215",children:[e.jsx(c,{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:215",children:"文員預設進入頁面"}),e.jsxs("select",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:215",className:"mt-1 h-10 w-full rounded-md border border-input bg-background px-3 text-sm",value:a.defaultLandingPages.clerk,onChange:t=>s(["defaultLandingPages","clerk"],t.target.value),children:[e.jsx("option",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:215",value:"/admin/month-view-calendar",children:"排班日曆"}),e.jsx("option",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:215",value:"/admin/calendar-grid",children:"排班日曆視圖"}),e.jsx("option",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:215",value:"/admin/orders",children:"工單管理"}),e.jsx("option",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:215",value:"/admin/kanban",children:"工單看板"}),e.jsx("option",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:215",value:"/admin/issued-invoices",children:"已發出發票"}),e.jsx("option",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:215",value:"/admin/documents",children:"製作報價單/發票"})]})]}),e.jsxs("div",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:215",children:[e.jsx(c,{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:215",children:"師傅預設進入頁面"}),e.jsxs("select",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:215",className:"mt-1 h-10 w-full rounded-md border border-input bg-background px-3 text-sm",value:a.defaultLandingPages.driver,onChange:t=>s(["defaultLandingPages","driver"],t.target.value),children:[e.jsx("option",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:215",value:"/driver",children:"師傅總覽"}),e.jsx("option",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:215",value:"/driver/active",children:"進行中工單"}),e.jsx("option",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:215",value:"/driver/history",children:"工單歷史"})]})]})]})}),e.jsxs(m,{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:216",icon:Te,t
12itle:"已隱藏項目與開放功能",description:"目前可把不常用的區塊與選單暫時隱藏,日後可隨時重新開放。",children:[e.jsx(r,{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:216",label:"簽署區域位置調整",description:"開啟後才會在文件預覽顯示印章及簽名位置調整工具。",checked:a.enabledFeatures.signatureLayoutTools,onCheckedChange:t=>s(["enabledFeatures","signatureLayoutTools"],t)}),e.jsx(r,{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:216",label:"已發出發票工作台",description:"在管理員與文員選單顯示發票跟進、收據及收款功能。",checked:a.enabledFeatures.issuedInvoices,onCheckedChange:t=>s(["enabledFeatures","issuedInvoices"],t)})]}),e.jsx(m,{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:217",icon:ae,title:"選單項目開放設定",description:"勾選後會隱藏對應選單項目,不會刪除資料或功能。",children:Oe.map(t=>e.jsx(r,{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:217",label:t.label,description:"在適用角色的側邊選單顯示此項目。",checked:!a.hiddenMenuItems.includes(t.href),onCheckedChange:i=>me(t.href,!i)},t.href))}),e.jsxs(m,{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:218",icon:I,title:"管理員功能權限",description:"管理員功能可分別開關;關閉後對應入口不會顯示。",children:[e.jsx(r,{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:218",label:"已發出發票工作台",description:"允許管理員處理發票、收據及收款跟進。",checked:a.roleAccess.adminIssuedInvoices,onCheckedChange:t=>s(["roleAccess","adminIssuedInvoices"],t)}),e.jsx(r,{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:218",label:"財務報表",description:"允許管理員查看財務統計與報表。",checked:a.roleAccess.adminFinancialReports,onCheckedChange:t=>s(["roleAccess","adminFinancialReports"],t)})]}),e.jsxs(m,{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:219",icon:I,title:"文員功能權限",description:"為文員逐項開放排班、工單與文件工作;開關可隨時調整。",children:[e.jsx("div",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:219",className:"mb-3 flex justify-end",children:e.jsx(F,{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:219",size:"sm",variant:"outline",onClick:()=>Y("clerk"),children:"套用文員預設權限"})}),e.jsx(r,{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:219",label:"排班日曆",description:"允許文員查看及處理排班日曆。",checked:a.roleAccess.clerkCalendar,onCheckedChange:t=>s(["roleAccess","clerkCalendar"],t)}),e.jsx(r,{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:219",label:"工單管理",description:"允許文員查看、編輯及跟進工單。",checked:a.roleAccess.clerkOrderManagement,onCheckedChange:t=>s(["roleAccess","clerkOrderManagement"],t)}),e.jsx(r,{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:219",label:"製作報價單/發票",description:"允許文員製作及預覽報價單與發票。",checked:a.roleAccess.clerkDocuments,onCheckedChange:t=>s(["roleAccess","clerkDocuments"],t)}),e.jsx(r,{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:219",label:"已發出發票工作台",description:"允許文員跟進發票、建立收據及確認收款。",checked:a.roleAccess.clerkIssuedInvoices,onCheckedChange:t=>s(["roleAccess","clerkIssuedInvoices"],t)})]}),e.jsxs(m,{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:220",icon:I,title:"師傅功能權限",description:"為師傅逐項控制工單查閱、搜尋、文件建立及客戶資料查詢。",children:[e.jsx("div",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:220",className:"mb-3 flex justify-end",children:e.jsx(F,{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:220",size:"sm",variant:"outline",onClick:()=>Y("driver"),children:"套用師傅預設權限"})}),e.jsx(r,{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:220",label:"工單總覽",description:"預設關閉;開啟後師傅可查看自己已獲派的進行中工單。",checked:a.roleAccess.driverOrderOverview,onCheckedChange:t=>s(["roleAccess","driverOrderOverview"],t)}),e.jsx(r,{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:220",label:"全局搜尋",description:"預設關閉;開啟後師傅只可搜尋自己已獲派或已完成的工單。",checked:a.roleAccess.driverGlobalSearch,onCheckedChange:t=>s(["roleAccess","driverGlobalSearch"],t)}),e.jsxs("div",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:220",className:"border-t py-3",children:[e.jsx(c,{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:220",children:"師傅歷史紀錄可查閱天數"}),e.jsx(o,{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:220",type:"number",min:1,max:365,className:"mt-1",value:a.roleAccess.driverHistoryDays,onChange:t=>s(["roleAccess","driverHistoryDays"],Math.min(365,Math.max(1,Number(t.target.value)||1)))}),e.jsx("p",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:220",className:"mt-1 text-xs text-muted-foreground",children:"師傅只可查閱自己在最近指定天數內完成的工單;預設為 7 天。"})]}),e.jsx(r,{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:220",label:"顯示我的排班頂部頁籤",description:"預設關閉;關閉後師傅進入我的排班時隱藏最頂部的藍色「我的排班」頁籤。",checked:a.roleAccess.driverScheduleHeader,onCheckedChange:t=>s(["roleAccess","driverScheduleHeader"],t)}),e.jsx(r,{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:220",label:"文件製作入口",description:"允許師傅使用報價單及發票文件頁。",checked:a.roleAccess.driverDocuments,onCheckedChange:t=>s(["roleAccess","driverDocuments"],t)}),e.jsx(r,{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:220",label:"製作報價單",description:"允許師傅為其工單製作報價單。",checked:a.roleAccess.driverCreateQuotation,onCheckedChange:t=>s(["roleAccess","driverCreateQuotation"],t)}),e.jsx(r,{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:220",label:"製作發票",description:"允許師傅為其工單製作發票。",checked:a.roleAccess.driverCreateInvoice,onCheckedChange:t=>s(["roleAccess","driverCreateInvoice"],t)}),e.jsx(r,{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:220",label:"只可為已完成工單製作發票",description:"維持開啟可避免未完成工作過早發出發票。",checked:a.roleAccess.driverInvoiceRequiresCompleted,onCheckedChange:t=>s(["roleAccess","driverInvoiceRequiresCompleted"],t)}),e.jsx(r,{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:220",label:"製作收據",description:"預設關閉;只在您需要開放師傅自行開收據時啟用。",checked:a.roleAccess.driverCreateReceipt,onCheckedChange:t=>s(["roleAccess","driverCreateReceipt"],t)}),e.jsx(r,{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:220",label:"查詢以往記錄",description:"允許師傅從自己已獲派的工單查看同一電話或地址的過往工單及收據。",checked:a.roleAccess.driverPastRecords,onCheckedChange:t=>s(["roleAccess","driverPastRecords"],t)})]}),e.jsxs(m,{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:221",icon:I,title:"權限異動紀錄",description:"保留最近 30 次角色功能開關的操作人、時間與變更前後狀態。",children:[e.jsxs("div",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:221",className:"mb-3 grid gap-2 sm:grid-cols-[1fr_180px_auto]",children:[e.jsx(o,{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:221",value:D,onChange:t=>re(t.target.value),placeholder:"搜尋操作人"}),e.jsx(o,{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:221",type:"date",value:L,onChange:t=>ce(t.target.value)}),e.jsx(F,{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:221",variant:"outline",onClick:pe,disabled:A.length===0,children:"匯出 CSV"})]}),e.jsx("div",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:221",className:"space-y-2",children:A.length===0?e.jsx("p",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:221",className:"text-sm text-muted-foreground",children:"沒有符合搜尋條件的權限異動紀錄。"}):A.map(t=>{const i=(()=>{try{return JSON.parse(t.changes)}catch{return[]}})();return e.jsxs("div",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:221",className:"rounded-lg border bg-muted/20 p-3 text-sm",children:[e.jsxs("p",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:221",className:"font-medium",children:[t.actorName||`用戶 #${t.actorUserId}`," ",e.jsx("span",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:221",className:"ml-2 text-xs font-normal text-muted-foreground",children:new Date(t.createdAt).toLocaleStr
12ing("zh-HK",{timeZone:"Asia/Hong_Kong",hour12:!1})})]}),e.jsx("p",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:221",className:"mt-1 text-xs text-muted-foreground",children:i.map(n=>`${se[n.key]||n.key}:${n.from?"開啟":"關閉"} → ${n.to?"開啟":"關閉"}`).join(";")})]},t.id)})})]}),e.jsx(be,{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:222",showTestButton:!0}),e.jsxs(m,{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:223",icon:ee,title:"系統通知開關",description:"控制通知中心、即時提示及手機推播是否建立。帳戶登入與安全警告為保障帳戶安全,會繼續保持開啟。",children:[e.jsx(r,{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:223",label:"新工單通知",description:"新工單建立或由 TimeTree 匯入時通知管理員。",checked:a.notificationControls.newOrders,onCheckedChange:t=>s(["notificationControls","newOrders"],t)}),e.jsx(r,{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:223",label:"派單、改派及取消通知",description:"行程派給、移除或改派師傅時通知相關師傅。",checked:a.notificationControls.scheduleChanges,onCheckedChange:t=>s(["notificationControls","scheduleChanges"],t)}),e.jsx(r,{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:223",label:"工單狀態變更通知",description:"師傅或管理員更改工單狀態時通知相關人員。",checked:a.notificationControls.orderStatusChanges,onCheckedChange:t=>s(["notificationControls","orderStatusChanges"],t)}),e.jsx(r,{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:223",label:"行程前約 30 分鐘提醒",description:"在預約時間前約 30 分鐘發出行程提醒。",checked:a.notificationControls.scheduleReminders,onCheckedChange:t=>s(["notificationControls","scheduleReminders"],t)}),e.jsx(r,{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:223",label:"「全體」行程通知",description:"行程文字含「全體」時,同時通知全部帳戶。",checked:a.notificationControls.allMembersSchedules,onCheckedChange:t=>s(["notificationControls","allMembersSchedules"],t)}),e.jsx(r,{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:223",label:"逾期發票彙總通知",description:"按設定門檻向指定管理員發出每日逾期發票摘要。",checked:a.notificationControls.invoiceReminders,onCheckedChange:t=>s(["notificationControls","invoiceReminders"],t)}),e.jsx(r,{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:223",label:"PDF 背景同步完成通知",description:"本機 PDF 在背景成功同步後通知文件建立者。",checked:a.notificationControls.pdfSyncCompleted,onCheckedChange:t=>s(["notificationControls","pdfSyncCompleted"],t)}),e.jsx(r,{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:223",label:"TimeTree AI/衝突覆核通知",description:"有低信心或同時間資料衝突需要人工覆核時通知管理員及文員。",checked:a.notificationControls.timeTreeReviews,onCheckedChange:t=>s(["notificationControls","timeTreeReviews"],t)})]}),e.jsx(m,{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:224",icon:ee,title:"提醒規則",description:"調整逾期發票與登入會話的提示門檻。",children:e.jsxs("div",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:224",className:"grid gap-3 sm:grid-cols-2",children:[e.jsxs("div",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:224",children:[e.jsx(c,{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:224",children:"逾期未收款門檻(天)"}),e.jsx(o,{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:224",type:"number",min:1,max:365,className:"mt-1",value:a.reminders.overdueDays,onChange:t=>s(["reminders","overdueDays"],Math.max(1,Number(t.target.value)||1))}),e.jsx("p",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:224",className:"mt-1 text-xs text-muted-foreground",children:"發票發出後超過此天數仍未收款,即顯示逾期提示。"})]}),e.jsxs("div",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:224",children:[e.jsx(c,{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:224",children:"會話到期æ
12é†’(天)"}),e.jsx(o,{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:224",type:"number",min:1,max:29,className:"mt-1",value:a.reminders.sessionExpiryReminderDays,onChange:t=>s(["reminders","sessionExpiryReminderDays"],Math.min(29,Math.max(1,Number(t.target.value)||1)))}),e.jsx("p",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:224",className:"mt-1 text-xs text-muted-foreground",children:"在登入會話到期前此天數內,於通知中心與受信任裝置顯示提醒。"})]}),e.jsx("div",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:224",className:"rounded-lg border p-3",children:e.jsx(r,{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:224",label:"每日提醒規則",description:"啟用後,每天香港時間 06:00 會彙總逾期發票通知接收帳戶。",checked:a.reminders.dailyEnabled,onCheckedChange:t=>s(["reminders","dailyEnabled"],t)})}),e.jsxs("div",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:224",className:"sm:col-span-2 rounded-lg border p-3",children:[e.jsx(c,{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:224",children:"每日逾期彙總通知接收帳戶"}),e.jsx("p",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:224",className:"mt-1 text-xs text-muted-foreground",children:"勾選後只通知指定管理員;不勾選任何帳戶時,會通知全部管理員。"}),e.jsx("div",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:224",className:"mt-3 grid gap-2 sm:grid-cols-2",children:y.filter(t=>t.role==="admin"||t.role==="admin+driver").map(t=>e.jsxs("label",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:224",className:"flex cursor-pointer items-center gap-2 rounded-md border bg-background px-3 py-2 text-sm",children:[e.jsx("input",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:224",type:"checkbox",checked:a.reminders.recipientUserIds.includes(t.id),onChange:i=>ge(t.id,i.target.checked)}),e.jsx("span",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:224",className:"font-medium",children:t.name||t.username||`帳戶 #${t.id}`}),e.jsx("span",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:224",className:"ml-auto text-xs text-muted-foreground",children:t.role==="admin+driver"?"管理員/師傅":"管理員"})]},t.id))})]})]})}),e.jsxs(m,{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:225",icon:k,title:"常用維修項目",description:"此清單會在師傅確認維修內容時顯示;每行一項,儲存後即時套用。",children:[e.jsx(c,{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:225",children:"常用維修項目"}),e.jsx($,{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:225",className:"mt-1 min-h-40",value:(a.commonRepairItems||[]).join(`
13`),onChange:t=>s(["commonRepairItems"],Array.from(new Set(t.target.value.split(/\r?\n/).map(i=>i.trim()).filter(Boolean))).slice(0,50)),placeholder:`例如:
14檢查及維修
15更換零件`}),e.jsx("p",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:225",className:"mt-1 text-xs text-muted-foreground",children:"最多 50 項;師傅個人的收藏與排列次序不會被此設定覆蓋。"})]}),e.jsx(m,{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:226",icon:B,title:"PDF 公司資料、付款方式與 Remarks",description:"用於之後新生成的報價單、發票及收據。",children:e.jsxs("div",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:226",className:"grid gap-3 sm:grid-cols-2",children:[e.jsxs("div",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:226",children:[e.jsx(c,{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:226",children:"公司名稱"}),e.jsx(o,{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:226",className:"mt-1",value:a.pdf.companyName,onChange:t=>s(["pdf","companyName"],t.target.value)})]}),e.jsxs("div",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:226",children:[e.jsx(c,{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:226",children:"公司電話"}),e.jsx(o,{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:226",className:"mt-1",value:a.pdf.companyPhone,onChange:t=>s(["pdf","companyPhone"],t.target.value)})]}),e.jsxs("div",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:226",className:"sm:col-span-2",children:[e.jsx(c,{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:226",children:"公司地址"}),e.jsx(o,{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:226",className:"mt-1",value:a.pdf.companyAddress,onChange:t=>s(["pdf","companyAddress"],t.target.value)})]}),e.jsxs("div",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:226",children:[e.jsx(c,{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:226",children:"FPS/識別資料"}),e.jsx(o,{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:226",className:"mt-1",value:a.pdf.taxId,onChange:t=>s(["pdf","taxId"],t.target.value)})]}),e.jsx("div",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:226",className:"sm:col-span-2 rounded-xl border bg-muted/20 p-3",children:e.jsxs("div",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:226",className:"grid gap-3 sm:grid-cols-[1fr_210px]",children:[e.jsxs("div",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:226",children:[e.jsx(c,{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:226",children:"公司印章上傳"}),e.jsx(o,{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:226",type:"file",accept:f.mimeType,className:"mt-1",onChange:t=>fe(t.target.files?.[0]),disabled:z}),e.jsxs("div",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:226",className:"mt-3 rounded-lg border border-dashed bg-background p-3 text-xs text-muted-foreground",children:[e.jsx("p",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:226",className:"font-medium text-foreground",children:"新圖必須完全符合原公司印章規格"}),e.jsxs("p",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:226",className:"mt-1",children:["文件類別:",f.typeLabel]}),e.jsxs("p",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:226",children:["解像度/像素尺寸:",f.width," × ",f.height," px"]}),e.jsxs("p",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:226",children:["原圖檔案大小:",(f.originalBytes/1024).toFixed(1)," KB(作參考)"]}),e.jsx("p",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:226",className:"mt-1",children:z?"正在檢查規格及上傳…":"上傳前會檢查文件類別與像素尺寸;不符合規格將不會套用。"})]})]}),e.jsx("div",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:226",className:"flex min-h-44 items-center justify-center overflow-hidden rounded-lg border bg-background p-3",children:a.pdf.companyStamp?e.jsx("img",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:226",src:a.pdf.companyStamp,alt:"現有公司印章預覽",className:"max-h-40 max-w-full object-contain"}):e.jsx("span",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:226",className:"text-xs text-muted-foreground",children:"尚未設定印章"})})]})}),e.jsxs("div",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:226",children:[e.jsx(c,{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:226",children:"FPS 收款號碼"}),e.jsx(o,{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:226",className:"mt-1",value:a.pdf.paymentFps,onChange:t=>s(["pdf","paymentFps"],t.target.value)})]}),e.jsxs("div",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:226",children:[e.jsx(c,{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:226",children:"銀行資料"}),e.jsx(o,{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:226",className:"mt-1",value:a.pdf.paymentBank,onChange:t=>s(["pdf","paymentBank"],t.target.value)})]}),e.jsxs("div",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:226",className:"sm:col-span-2",children:[e.jsx(c,{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:226",children:"收款戶名"}),e.jsx(o,{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:226",className:"mt-1",value:a.pdf.paymentAccountName,onChange:t=>s(["pdf","paymentAccountName"],t.target.value)})]}),e.jsxs("div",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:226",className:"sm:col-span-2",children:[e.jsx(c,{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:226",children:"Remarks 內容"}),e.jsx($,{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:226",className:"mt-1 min-h-32",value:a.pdf.remarks,onChange:t=>s(["pdf","remarks"],t.target.value)}),e.jsxs("p",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:226",className:"mt-1 text-xs text-muted-foreground",children:["可使用 ",e.jsx("code",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:226",children:"{days}"})," 顯示施工天數。"]})]})]})}),e.jsx(m,{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:227",icon:k,title:"PDF 下載檔名",description:"報價單、發票及收據會統一使用客戶地址命名。",children:e.jsxs("div",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:227",className:"rounded-lg border bg-muted/20 p-3 text-sm",children:[e.jsx("p",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:227",className:"font-medium",children:"格式:地址-文件類型.pdf"}),e.jsx("p",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:227",className:"mt-1 text-xs leading-relaxed text-muted-foreground",children:"自動移除空白、逗號及 / \\ | : * ? < > 等不可用字元;「/F」會轉為「樓」,其他「/」會直接移除。沒有地址時才使用工單編號或安全預設名稱。"})]})}),e.jsx(m,{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:228",icon:B,title:"PDF 左上角標題與公司文字",description:"此區會直接顯示在報價單、發票及收據 PDF 左上角;儲存後套用至新生成文件。",children:e.jsxs("div",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:228",className:"grid gap-3 sm:grid-cols-2",children:[e.jsxs("div",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:228",className:"sm:col-span-2",children:[e.jsx(c,{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:228",children:"左上角標題"}),e.jsx(o,{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:228",className:"mt-1",value:a.pdf.headerTitle,onChange:t=>
15s(["pdf","headerTitle"],t.target.value),placeholder:"例如:昱陞維修工程有限公司"})]}),e.jsxs("div",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:228",className:"sm:col-span-2",children:[e.jsx(c,{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:228",children:"左上角地址文字"}),e.jsx(o,{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:228",className:"mt-1",value:a.pdf.companyAddress,onChange:t=>s(["pdf","companyAddress"],t.target.value)})]}),e.jsxs("div",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:228",children:[e.jsx(c,{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:228",children:"左上角電話文字"}),e.jsx(o,{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:228",className:"mt-1",value:a.pdf.companyPhone,onChange:t=>s(["pdf","companyPhone"],t.target.value)})]}),e.jsxs("div",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:228",children:[e.jsx(c,{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:228",children:"FPS 號碼"}),e.jsx(o,{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:228",className:"mt-1",value:a.pdf.taxId,onChange:t=>s(["pdf","taxId"],t.target.value),placeholder:"63138767"}),e.jsx("p",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:228",className:"mt-1 text-xs text-muted-foreground",children:"PDF 會固定以「FPS:」標示此號碼。"})]})]})}),e.jsx(m,{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:229",icon:k,title:"PDF 左上角即時預覽",description:"預覽會隨標題、地址、電話及 FPS 輸入即時更新;不必先儲存即可確認排版。",children:e.jsx("div",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:229",className:"overflow-hidden rounded-xl border bg-slate-100 p-3 sm:p-5",children:e.jsxs("div",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:229",className:"mx-auto min-h-56 max-w-xl rounded-sm border border-slate-300 bg-white p-5 shadow-sm",children:[e.jsxs("div",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:229",className:"flex items-start justify-between gap-4 border-b-2 border-slate-700 pb-4",children:[e.jsxs("div",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:229",className:"min-w-0",children:[e.jsx("h3",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:229",className:"break-words text-xl font-bold text-slate-800",children:v?.title}),e.jsx("p",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:229",className:"mt-2 break-words text-xs leading-relaxed text-slate-600",children:v?.address}),e.jsxs("p",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:229",className:"mt-1 text-xs text-slate-600",children:["電話: ",v?.phone]}),e.jsxs("p",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:229",className:"mt-1 text-xs text-slate-600",children:["FPS: ",v?.fps]})]}),e.jsxs("div",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:229",className:"shrink-0 text-right",children:[e.jsx("p",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:229",className:"text-lg font-semibold text-slate-700",children:"Quotation"}),e.jsx("p",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:229",className:"mt-1 text-xs text-slate-500",children:"Order No.: PREVIEW-001"})]})]}),e.jsx("div",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:229",className:"py-5 text-center text-xs text-slate-400",children:"客戶資料及文件內容預覽區域"})]})})}),e.jsxs(m,{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:230",icon:k,title:"PDF 預覽控制與公司版面範本",description:"切換文件類型與 A4 縮放比例;可把目前左上角資料另存為公司版面範本,日後一鍵套用。",children:[e.jsxs("div",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:230",className:"grid gap-3 sm:grid-cols-2",children:[e.jsxs("div",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:230",children:[e.jsx(c,{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:230",children:"預覽文件類型"}),e.jsxs("select",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:230",className:"mt-1 h-10 w-full rounded-md border border-input bg-background px-3 text-sm",value:R,onChange:t=>de(t.target.value),children:[e.jsx("option",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:230",value:"quotation",children:"Quotation"}),e.jsx("option",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:230",value:"invoice",children:"Invoice"}),e.jsx("option",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:230",value:"receipt",children:"Receipt"})]})]}),e.jsxs("div",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:230",children:[e.jsx(c,{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:230",children:"A4 縮放比例"}),e.jsxs("select",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:230",className:"mt-1 h-10 w-full rounded-md border border-input bg-background px-3 text-sm",value:E,onChange:t=>le(Number(t.target.value)),children:[e.jsx("option",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:230",value:.45,children:"45%(小)"}),e.jsx("option",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:230",value:.65,children:"65%(標準)"}),e.jsx("option",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:230",value:.85,children:"85%(大)"}),e.jsx("option",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:230",value:1,children:"100%(原尺寸)"})]})]}),e.jsxs("div",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:230",className:"sm:col-span-2 rounded-lg border bg-muted/20 p-3",children:[e.jsx(c,{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:230",children:"另存目前公司版面範本"}),e.jsxs("div",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:230",className:"mt-2 flex flex-col gap-2 sm:flex-row",children:[e.jsx(o,{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:230",value:G,onChange:t=>
15Z(t.target.value),placeholder:"例如:標準工程單抬頭",maxLength:80}),e.jsx(F,{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:230",type:"button",variant:"outline",onClick:he,children:"儲存為範本"})]}),(a.pdf.headerTemplates||[]).length>0&&e.jsx("div",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:230",className:"mt-3 grid gap-2 sm:grid-cols-2",children:a.pdf.headerTemplates.map(t=>e.jsxs("button",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:230",type:"button",onClick:()=>X(t.id),className:"rounded-md border bg-background px-3 py-2 text-left text-sm transition-colors hover:bg-primary/5",children:[e.jsx("span",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:230",className:"font-medium",children:t.name}),e.jsxs("span",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:230",className:"mt-0.5 block truncate text-xs text-muted-foreground",children:[t.headerTitle," · FPS ",t.taxId]})]},t.id))})]})]}),e.jsx("div",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:230",className:"mt-4 overflow-auto rounded-xl border bg-slate-100 p-3",children:e.jsx("div",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:230",style:{transform:`scale(${E})`,transformOrigin:"top left",width:`${100/E}%`},children:e.jsxs("div",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:230",className:"min-h-72 rounded-sm border border-slate-300 bg-white p-5 shadow-sm",children:[e.jsxs("div",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:230",className:"flex items-start justify-between gap-4 border-b-2 border-slate-700 pb-4",children:[e.jsxs("div",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:230",className:"min-w-0",children:[e.jsx("h3",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:230",className:"break-words text-xl font-bold text-slate-800",children:v?.title}),e.jsx("p",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:230",className:"mt-2 break-words text-xs leading-relaxed text-slate-600",children:v?.address}),e.jsxs("p",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:230",className:"mt-1 text-xs text-slate-600",children:["電話: ",v?.phone]}),e.jsxs("p",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:230",className:"mt-1 text-xs text-slate-600",children:["FPS: ",v?.fps]})]}),e.jsxs("div",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:230",className:"shrink-0 text-right",children:[e.jsx("p",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:230",className:"text-lg font-semibold text-slate-700",children:R==="quotation"?"Quotation":R==="invoice"?"Invoice":"Receipt"}),e.jsx("p",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:230",className:"mt-1 text-xs text-slate-500",children:"Order No.: PREVIEW-001"})]})]}),e.jsx("div",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:230",className:"py-8 text-center text-xs text-slate-400",children:"A4 文件內容預覽區域"})]})})})]}),e.jsxs(m,{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:231",icon:B,title:"公司版面範本管理",description:"可為每種文件指定預設範本;範本縮圖只顯示 PDF 左上角排版。",children:[e.jsx("div",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:231",className:"grid gap-3 sm:grid-cols-3",children:["quotation","invoice","receipt"].map(t=>e.jsxs("div",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:231",children:[e.jsxs(c,{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:231",children:[t==="quotation"?"Quotation":t==="invoice"?"Invoice":"Receipt"," 預設範本"]}),e.jsxs("select",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:231",className:"mt-1 h-10 w-full rounded-md border border-input bg-background px-3 text-sm",value:a.pdf.headerTemplateDefaults?.[t]||"__none",onChange:i=>je(t,i.target.value==="__none"?null:i.target.value),children:[e.jsx("option",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:231",value:"__none",children:"使用目前全局左上角設定"}),(a.pdf.headerTemplates||[]).map(i=>e.jsx("option",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:231",value:i.id,children:i.name},i.id))]})]},t))}),e.jsx("div",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:231",className:"mt-4 grid gap-3 sm:grid-cols-2",children:(a.pdf.headerTemplates||[]).length===0?e.jsx("p",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:231",className:"rounded-lg border border-dashed p-4 text-sm text-muted-foreground",children:"尚未儲存公司版面範本。"}):a.pdf.headerTemplates.map(t=>e.jsxs("div",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:231",className:"overflow-hidden rounded-xl border bg-card",children:[e.jsx("div",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:231",className:"border-b bg-slate-100 p-3",children:e.jsx("div",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:231",className:"origin-top-left scale-[0.66] rounded-sm border border-slate-300 bg-white p-3 shadow-sm",style:{width:"150%"},children:e.jsxs("div",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:231",className:"flex items-start justify-between gap-3 border-b border-slate-600 pb-2",children:[e.jsxs("div",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:231",className:"min-w-0",children:[e.jsx("p",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:231",className:"truncate text-sm font-bold text-slate-800",children:t.headerTitle}),e.jsx("p",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:231",className:"mt-1 truncate text-[9px] text-slate-600",children:t.companyAddress}),e.jsxs("p",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:231",className:"text-[9px] text-slate-600",children:["電話: ",t.companyPhone]}),e.jsxs("p",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:231",className:"text-[9px] text-slate-600",children:["FPS: ",t.taxId]})]}),e.jsx("p",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:231",className:"text-xs font-semibold text-slate-700",children:"PDF"})]})})}),e.jsxs("div",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:231",className:"space-y-2 p-3",children:[oe===t.id?e.jsxs("div",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:231",className:"flex gap-2",children:[e.jsx(o,{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:231",value:J,onChange:i=>w(i.target.value),maxLength:80,autoFocus:!0}),e.jsx(F,{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:231",size:"sm",onClick:()=>Se(t.id),children:"儲存"}),e.jsx(F,{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:231",size:"sm",variant:"outline",onClick:()=>{M(null),w("")},children:"取消"})]}):e.jsxs("div",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:231",className:"flex items-center justify-between gap-2",children:[e.jsx("p",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:231",className:"min-w-0 truncate text-sm font-semibold",children:t.name}),e.jsx("span",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:231",className:"text-xs text-muted-foreground",children:["quotation","invoice","receipt"].filter(i=>a.pdf.headerTemplateDefaults?.[i]===t.id).map(i=>i==="quotation"?"Q":i==="invoice"?"I":"R").join(" · ")||"未設預設"})]}),e.jsxs("div",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:231",className:"flex flex-wrap gap-2",children:[e.jsx(F,{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:231",type:"button",size:"sm",variant:"outline",onClick:()=>X(t.id),children:"套用"}),e.jsx(F,{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:231",type:"button",size:"sm",variant:"outline",onClick:()=>{M(t.id),w(t.name)},children:"重新命名"}),e.jsx(F,{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:231",type:"button",size:"sm",variant:"outline",className:"text-destructive hover:text-destructive",onClick:()=>Fe(t.id),children:"刪除"})]})]})]},t.id))})]}),e.jsxs(m,{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:232",icon:C,title:"PDF 文件版面顯示",description:"控制報價單費用明細、發票/收據付款資料欄位及各文件類型的獨立頁尾。",children:[e.jsx(r,{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:233",label:"報價單顯示費用明細",description:"關閉後,Quotation PDF 會隱藏整個費用明細區塊;發票與收據不受影響。",checked:a.pdf.showQuotationCharges,onCheckedChange:t=>s(["pdf","showQuotationCharges"],t)}),e.jsxs("div",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:234",className:"mt-4 grid gap-4 lg:grid-cols-2",children:[e.jsxs("div",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:235",className:"rounded-lg border bg-muted/20 p-3",children:[e.jsx("p",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:235",className:"mb-3 text-sm font-semibold",children:"Invoice 付款資料欄位"}),Object.entries({method:"收款方式",fps:"FPS 號碼",bank:"銀行資料",accountName:"收款戶名",collector:"收款人"}).map(([t,i])=>e.jsx(r,{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:235",label:i,description:"在 Invoice PDF 的付款資料區顯示ã€
15‚",checked:a.pdf.paymentFields.invoice[t],onCheckedChange:n=>s(["pdf","paymentFields","invoice",t],n)},t))]}),e.jsxs("div",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:236",className:"rounded-lg border bg-muted/20 p-3",children:[e.jsx("p",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:236",className:"mb-3 text-sm font-semibold",children:"Receipt 付款資料欄位"}),Object.entries({date:"實際收款日期",method:"收款方式",amount:"實收金額",collector:"收款人",zeroChargeReason:"零收費原因",fps:"FPS 號碼",bank:"銀行資料",accountName:"收款戶名"}).map(([t,i])=>e.jsx(r,{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:236",label:i,description:"在 Receipt PDF 的付款資料區顯示。",checked:a.pdf.paymentFields.receipt[t],onCheckedChange:n=>s(["pdf","paymentFields","receipt",t],n)},t))]})]}),e.jsx("div",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:238",className:"mt-4 grid gap-3 sm:grid-cols-3",children:["quotation","invoice","receipt"].map(t=>e.jsxs("div",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:238",children:[e.jsxs(c,{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:238",children:[t==="quotation"?"Quotation":t==="invoice"?"Invoice":"Receipt"," 頁尾文字"]}),e.jsx($,{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:238",className:"mt-1 min-h-24",value:a.pdf.footerText[t],onChange:i=>s(["pdf","footerText",t],i.target.value),placeholder:"可使用 {year} 顯示年度",maxLength:500})]},t))}),e.jsxs("p",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:239",className:"mt-2 text-xs text-muted-foreground",children:["頁尾可使用 ",e.jsx("code",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:239",children:"{year}"})," 自動顯示目前年度;留空會隱藏該文件的頁尾文字。"]})]}),e.jsxs(m,{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:241",icon:C,title:"工單詳情與編輯版面",description:"統一排班日曆及排班視圖的卡片操作;設定會套用至所有管理員及文員。",children:[e.jsx(r,{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:242",label:"按編輯先顯示工單詳情",description:"開啟後,排班卡片的編輯按鍵會先開啟完整工單詳情,再由詳情選擇編輯。",checked:a.orderLayouts.openDetailBeforeEditing,onCheckedChange:t=>s(["orderLayouts","openDetailBeforeEditing"],t)}),e.jsx(r,{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:243",label:"使用排班日曆編輯版面",description:"開啟後,詳情中的編輯會使用排班日曆的簡潔表單,維修事項會置於備注下方。",checked:a.orderLayouts.useCalendarEditor,onCheckedChange:t=>s(["orderLayouts","useCalendarEditor"],t)})]}),e.jsxs(m,{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:245",icon:C,title:"排班工單卡片顯示",description:"調整排班視圖的維修信息高度;設定會同時套用到手機及電腦的待派與已派卡片。",children:[e.jsxs("div",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:246",className:"max-w-md",children:[e.jsx(c,{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:247",htmlFor:"schedule-repair-information-lines",children:"維修信息預設顯示行數"}),e.jsx("select",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:248",id:"schedule-repair-information-lines",className:"mt-1 h-10 w-full rounded-md border border-input bg-background px-3 text-sm",value:a.scheduleCards.repairInformationLines,onChange:t=>s(["scheduleCards","repairInformationLines"],Number(t.target.value)),children:[1,2,3,4,5,6].map(t=>e.jsxs("option",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:249",value:t,children:[t," 行"]},t))}),e.jsx("p",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:251",className:"mt-1 text-xs text-muted-foreground",children:"預設為 2 行。手機或電腦點擊工單卡片空白位置可展開完整維修信息,再按一次收起;致電、WhatsApp、派工、編輯及取消按鍵不會觸發展開。"})]}),e.jsxs("div",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:253",className:"mt-3 rounded-lg border border-amber-300 bg-amber-50 p-3 text-xs text-amber-950",children:[e.jsx("p",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:254",className:"font-semibold",children:"重要/緊急內容會自動標示"}),e.jsx("p",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:255",className:"mt-1",children:"例如「緊急、爆喉、水浸、漏電」會顯示紅色「緊急維修」;「重要、優先、盡快、漏水、故障」會顯示琥珀色「重要維修」。此標籤只加強辨識,不會改變工單狀態、時間、派單或通知。"})]}),e.jsxs("div",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:257",className:"mt-4 rounded-lg border bg-muted/20 p-3",children:[e.jsx("p",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:258",className:"text-sm font-semibold",children:"複製工單信息包含欄位"}),e.jsx("p",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:259",className:"mt-1 text-xs text-muted-foreground",children:"勾選後,排班卡片的複製圖案及手機長按選單只會輸出所選欄位。選擇「歷史維修紀錄」時才會額外讀取該工單確認紀錄。"}),e.jsx("div",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:260",className:"mt-3 grid gap-2 sm:grid-cols-2 lg:grid-cols-3",children:te.map(t=>{const i=a.scheduleCards.copyFields.includes(t);return e.jsxs("label",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:263",className:"flex cursor-pointer items-center gap-2 rounded-md border bg-background px-3 py-2 text-sm",children:[e.jsx("input",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:264",type:"checkbox",className:"h-4 w-4",checked:i,onChange:n=>xe(t,n.target.checked)}),e.jsx("span",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:265",children:ye[t]})]},t)})})]})]}),e.jsxs(m,{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:271",icon:C,title:"TimeTree 自動委派師傅條件",description:"控制 TimeTree 匯入時可否自動派單,以及可使用哪些資料作識別。活動標籤預設不會用於自動派單。",children:[e.jsx(r,{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:272",label:"啟用自動委派師傅",description:"關閉後,所有 TimeTree 匯入只建立工單,不會因名稱或標籤自動派給師傅。",checked:a.timeTreeAutoAssignment.enabled,onCheckedChange:t=>s(["timeTreeAutoAssignment","enabled"],t)}),e.jsx(r,{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:273",label:"使用活動名稱及備註識別",description:"開啟後,系統會在 TimeTree 活動名稱及備註尋找師傅 TimeTree 名稱。",checked:a.timeTreeAutoAssignment.useEventText,onCheckedChange:t=>s(["timeTreeAutoAssignment","useEventText"],t)}),e.jsx(r,{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:274",label:"使用活動標籤作後備委派",description:"預設關閉。只有在前述名稱未識別到師傅時,才按 TimeTree 活動標籤作後備派單。",checked:a.timeTreeAutoAssignment.useLabelFallback,onCheckedChange:t=>s(["timeTreeAutoAssignment","useLabelFallback"],t)}),e.jsxs("div",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:275",className:"grid gap-3 sm:grid-cols-2",children:[e.jsxs("div",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:275",children:[e.jsx(c,{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:275",children:"名稱取字數"}),e.jsx(o,{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:275",type:"number",className:"mt-1",min:1,max:8,value:a.timeTreeDriverNameMatching.prefixLength,onChange:t=>s(["timeTreeDriverNameMatching","prefixLength"],Math.min(8,Math.max(1,Number(t.target.value)||1)))}),e.jsx("p",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:275",className:"mt-1 text-xs text-muted-foreground",children:"預設為頭 2 個字。"})]}),e.jsxs("div",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:275",children:[e.jsx(c,{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:275",children:"名稱後必須接的分隔符號"}),e.jsx(o,{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:275",className:"mt-1",value:a.timeTreeDriverNameMatching.requiredSuffix,onChange:t=>s(["timeTreeDriverNameMatching","requiredSuffix"],t.target.value),placeholder:"請按空白鍵輸入空格",maxLength:20}),e.jsxs("p",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:275",className:"mt-1 text-xs text-muted-foreground",children:["目前:",a.timeTreeDriverNameMatching.requiredSuffix===" "?"空格":`「${a.timeTreeDriverNameMatching.requiredSuffix}」`,";不可留空。"]})]})]}),e.jsxs("div",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:276",className:"mt-3 grid gap-3 sm:grid-cols-2",children:[e.jsxs("div",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:276",children:[e.jsx(c,{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:276",children:"識別事項(以逗號分隔)"}),e.jsx(o,{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:276",className:"mt-1",value:a.timeTreeIdentifierItems.join("、"),onChange:t=>s(["timeTreeIdentifierItems"],t.target.value.split(/[、,,]/).map(i=>
15i.trim()).filter(Boolean)),placeholder:"例如:收尾、別遲、改期、取消"}),e.jsx("p",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:276",className:"mt-1 text-xs text-muted-foreground",children:"匯入時不會把這些字視為地址;寫入 TimeTree 時會置於師傅名稱前。"})]}),e.jsxs("div",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:276",children:[e.jsx(c,{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:276",children:"可選注意事項(以逗號分隔)"}),e.jsx(o,{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:276",className:"mt-1",value:a.orderAttentionItems.join("、"),onChange:t=>s(["orderAttentionItems"],t.target.value.split(/[、,,]/).map(i=>i.trim()).filter(Boolean)),placeholder:"例如:收尾、別遲、改期"}),e.jsx("p",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:276",className:"mt-1 text-xs text-muted-foreground",children:"新增工單可選取,未勾選不會寫入工單或 TimeTree。"})]})]}),e.jsx("p",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:277",className:"mt-3 text-xs text-muted-foreground",children:"例如名稱為「細佬」、設定 2 字及空格時,只會識別「細佬 09:00」,不會識別「細佬處理」。修改後請按下方「儲存全部設定」才會套用。"})]}),e.jsx(m,{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:279",icon:C,title:"TimeTree 同步密碼",description:"更新 TimeTree 自動同步使用的密碼。現有密碼不會顯示或回傳;更新後會在下一次同步時使用新密碼。",children:e.jsxs("div",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:280",className:"max-w-xl space-y-2",children:[e.jsxs("div",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:281",className:"rounded-lg border bg-muted/30 p-3 text-sm",children:[e.jsx("p",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:282",className:"font-medium",children:"最近成功登入"}),e.jsxs("p",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:283",className:"mt-1 text-muted-foreground",children:[Me(p?.lastLoginSuccess),"(香港時間)"]})]}),e.jsx(c,{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:285",htmlFor:"timetree-sync-password",children:"新同步密碼"}),e.jsxs("div",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:286",className:"flex flex-col gap-2 sm:flex-row",children:[e.jsx(o,{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:287",id:"timetree-sync-password",type:"password",autoComplete:"new-password",value:O,onChange:t=>V(t.target.value),placeholder:"輸入新的 TimeTree 密碼",maxLength:500}),e.jsx(F,{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:288",type:"button",className:"shrink-0",disabled:!Re(O)||_.isPending,onClick:()=>_.mutate({password:O}),children:_.isPending?"更新中…":"更新同步密碼"})]}),e.jsx("p",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:292",className:"text-xs text-muted-foreground",children:"基於安全理由,密碼不會顯示於此頁、通知或操作紀錄。"}),e.jsx(F,{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:293",type:"button",variant:"outline",className:"w-full sm:w-auto",disabled:U.isPending,onClick:()=>U.mutate(),children:U.isPending?"正在測試連線…":"手動測試同步"}),e.jsx("p",{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:296",className:"text-xs text-muted-foreground",children:"只會測試登入及讀取當日活動,不會建立、修改或匯入工單。"})]})}),e.jsxs(F,{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:299",className:"w-full sm:w-auto",onClick:()=>H.mutate(a),disabled:!ue||H.isPending,children:[e.jsx(k,{"data-loc":"client/src/pages/admin/FeatureSettings.tsx:299",className:"mr-2 h-4 w-4"}),H.isPending?"儲存中…":"儲存全部設定"]})]})]})})})}export{xt as default};

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.