Compare commits

...

2 Commits

Author SHA1 Message Date
c015666f87 [FIX] Machine Utilization dark mode visibility and contrast
All checks were successful
star-cloud-deploy-demo / deploy-demo (push) Successful in 42s
2026-03-25 14:50:56 +08:00
3629caebd0 [FEAT] Machine Utilization UI refinement & localization 2026-03-25 14:47:52 +08:00
4 changed files with 118 additions and 42 deletions

View File

@@ -194,8 +194,8 @@
"Failed to update machine images: ": "Failed to update machine images: ",
"Fill in the device repair or maintenance details": "Fill in the device repair or maintenance details",
"Firmware Version": "Firmware Version",
"Fleet Avg OEE": "全機隊平均 OEE",
"Fleet Performance": "全機隊效能",
"Fleet Avg OEE": "Fleet Avg OEE",
"Fleet Performance": "Fleet Performance",
"From": "From",
"Full Access": "Full Access",
"Full Name": "Full Name",
@@ -214,6 +214,30 @@
"Heating Start Time": "Heating Start Time",
"Helper": "Helper",
"Home Page": "Home Page",
"Machine Utilization": "Machine Utilization",
"Machine Registry": "Machine Registry",
"Avg Cycle": "Avg Cycle",
"Cycle Efficiency": "Cycle Efficiency",
"Daily Revenue": "Daily Revenue",
"Real-time fleet efficiency and OEE metrics": "Real-time fleet efficiency and OEE metrics",
"Real-time performance analytics": "Real-time performance analytics",
"Reporting Period": "Reporting Period",
"Select an asset from the left to start analysis": "Select an asset from the left to start analysis",
"Select date to sync data": "Select date to sync data",
"Search serial or name...": "Search serial or name...",
"Serial NO": "Serial NO",
"OEE Efficiency Trend": "OEE Efficiency Trend",
"Online Status": "Online Status",
"Optimized Performance": "Optimized Performance",
"Output Count": "Output Count",
"OEE": "OEE",
"Utilized Time": "Utilized Time",
"Units": "Units",
"No Machine Selected": "No Machine Selected",
"No matching machines": "No matching machines",
"min": "min",
"s": "s",
"Total Gross Value": "Total Gross Value",
"Info": "Info",
"Initial Admin Account": "Initial Admin Account",
"Initial Role": "Initial Role",
@@ -277,7 +301,7 @@
"Machine model updated successfully.": "Machine model updated successfully.",
"Machine settings updated successfully.": "Machine settings updated successfully.",
"Machines": "Machines",
"Machines Online": "在線機台數",
"Machines Online": "Machines Online",
"Maintenance": "Maintenance",
"Maintenance Content": "Maintenance Content",
"Maintenance Date": "Maintenance Date",
@@ -286,6 +310,7 @@
"Maintenance QR": "Maintenance QR",
"Maintenance QR Code": "Maintenance QR Code",
"Maintenance Records": "Maintenance Records",
"Live Fleet Updates": "Live Fleet Updates",
"Maintenance record created successfully": "Maintenance record created successfully",
"Scan this code to quickly access the maintenance form for this device.": "Scan this code to quickly access the maintenance form for this device.",
"Manage Account Access": "管理帳號存取",
@@ -294,7 +319,7 @@
"Manage all tenant accounts and validity": "Manage all tenant accounts and validity",
"Manage your machine fleet and operational data": "Manage your machine fleet and operational data",
"Manage your profile information, security settings, and login history": "Manage your profile information, security settings, and login history",
"Management of operational parameters": "機台運作參數管理",
"Management of operational parameters": "Management of operational parameters",
"Management of operational parameters and models": "Management of operational parameters and models",
"Max 3": "Max 3",
"Member & External": "Member & External",
@@ -321,7 +346,7 @@
"New Password": "New Password",
"New Password (leave blank to keep current)": "New Password (leave blank to keep current)",
"New Record": "New Record",
"New Sub Account Role": "新增子帳號角色",
"New Sub Account Role": "New Sub Account Role",
"Next": "Next",
"No Invoice": "No Invoice",
"No accounts found": "No accounts found",
@@ -338,7 +363,6 @@
"No machines assigned": "未分配機台",
"No machines available": "No machines available",
"No machines available in this company.": "此客戶目前沒有可供分配的機台。",
"No maintenance records found": "No maintenance records found",
"No matching logs found": "No matching logs found",
"No permissions": "No permissions",
"No roles found.": "No roles found.",
@@ -349,18 +373,18 @@
"Not Used": "Not Used",
"Not Used Description": "不使用第三方支付介接",
"Notes": "Notes",
"OEE Score": "OEE 綜合得分",
"OEE.Activity": "營運活動",
"OEE.Errors": "異常",
"OEE.Hours": "小時",
"OEE.Orders": "訂單",
"OEE.Sales": "銷售",
"OEE Score": "OEE Score",
"OEE.Activity": "Activity",
"OEE.Errors": "Errors",
"OEE.Hours": "Hours",
"OEE.Orders": "Orders",
"OEE.Sales": "Sales",
"Offline": "Offline",
"Offline Machines": "Offline Machines",
"Once your account is deleted, all of its resources and data will be permanently deleted. Before deleting your account, please download any data or information that you wish to retain.": "Once your account is deleted, all of its resources and data will be permanently deleted. Before deleting your account, please download any data or information that you wish to retain.",
"Once your account is deleted, all of its resources and data will be permanently deleted. Please enter your password to confirm you would like to permanently delete your account.": "Once your account is deleted, all of its resources and data will be permanently deleted. Please enter your password to confirm you would like to permanently delete your account.",
"Online": "Online",
"Online Duration": "累積連線時數",
"Online Duration": "Online Duration",
"Online Machines": "Online Machines",
"Only system roles can be assigned to platform administrative accounts.": "Only system roles can be assigned to platform administrative accounts.",
"Operational Parameters": "Operational Parameters",
@@ -370,7 +394,7 @@
"Optional": "Optional",
"Order Management": "Order Management",
"Orders": "Orders",
"Other Permissions": "其他權限",
"Other Permissions": "Other Permissions",
"Others": "Others",
"Owner": "Owner",
"PARTNER_KEY": "PARTNER_KEY",
@@ -554,9 +578,9 @@
"Today's Transactions": "Today's Transactions",
"Total Connected": "Total Connected",
"Total Customers": "Total Customers",
"Total Daily Sales": "本日累計銷量",
"Total Daily Sales": "Today's Total Sales",
"Total Logins": "Total Logins",
"Total Selected": "已選擇總數",
"Total Selected": "Total Selected",
"Total Slots": "Total Slots",
"Total items": "Total items: :count",
"Track device health and maintenance history": "Track device health and maintenance history",
@@ -565,7 +589,7 @@
"Tutorial Page": "Tutorial Page",
"Type": "Type",
"UI Elements": "UI Elements",
"Unified Operational Timeline": "整合式營運時序圖",
"Unified Operational Timeline": "Unified Operational Timeline",
"Unknown": "Unknown",
"Update": "Update",
"Update Customer": "Update Customer",

View File

@@ -182,7 +182,7 @@
"Enter role name": "ロール名を入力してください",
"Enter serial number": "シリアル番号を入力してください",
"Enter your password to confirm": "確認のためパスワードを入力してください",
"Equipment efficiency and OEE metrics": "設備效能與 OEE 綜合指標",
"Equipment efficiency and OEE metrics": "設備効率と OEE 指標",
"Error": "エラー",
"Execution Time": "実行時間",
"Expired": "期限切れ",
@@ -194,7 +194,7 @@
"Failed to update machine images: ": "機台画像の更新に失敗しました:",
"Fill in the device repair or maintenance details": "デバイスの修理またはメンテナンスの詳細を入力してください",
"Firmware Version": "ファームウェアバージョン",
"Fleet Avg OEE": "全機隊平均 OEE",
"Fleet Avg OEE": "フリート平均 OEE",
"Fleet Performance": "全機隊效能",
"From": "から",
"Full Access": "全機台授權",
@@ -214,6 +214,30 @@
"Heating Start Time": "加熱開始時間",
"Helper": "ヘルパー",
"Home Page": "主画面",
"Machine Utilization": "機台稼働率",
"Machine Registry": "機台登録",
"Avg Cycle": "平均サイクル",
"Cycle Efficiency": "サイクル効率",
"Daily Revenue": "日次収益",
"Real-time fleet efficiency and OEE metrics": "リアルタイムのフリート効率と OEE 指標",
"Real-time performance analytics": "リアルタイム・パフォーマンス分析",
"Reporting Period": "レポート期間",
"Select an asset from the left to start analysis": "分析を開始するには左側のデバイスを選択してください",
"Select date to sync data": "データ同期の日付を選択してください",
"Search serial or name...": "シリアル番号または名称で検索...",
"Serial NO": "シリアル番号",
"OEE Efficiency Trend": "OEE 効率トレンド",
"Online Status": "オンライン状態",
"Optimized Performance": "最適化されたパフォーマンス",
"Output Count": "出力数",
"OEE": "OEE",
"Utilized Time": "稼働時間",
"Units": "ユニット",
"No Machine Selected": "機台が選択されていません",
"No matching machines": "一致する機台が見つかりません",
"min": "分",
"s": "秒",
"Total Gross Value": "総売上額",
"Info": "情報",
"Initial Admin Account": "初期管理者アカウント",
"Initial Role": "初期ロール",
@@ -286,6 +310,7 @@
"Maintenance QR": "メンテナンス QR",
"Maintenance QR Code": "メンテナンス QR コード",
"Maintenance Records": "メンテナンス記録",
"Live Fleet Updates": "ライブフリート更新",
"Maintenance record created successfully": "メンテナンス記録が正常に作成されました",
"Scan this code to quickly access the maintenance form for this device.": "このコードをスキャンして、このデバイスのメンテナンスフォームに素早くアクセスしてください。",
"Manage Account Access": "管理帳號存取",
@@ -349,12 +374,12 @@
"Not Used": "未使用",
"Not Used Description": "不使用第三方支付介接",
"Notes": "備考",
"OEE Score": "OEE 綜合得分",
"OEE.Activity": "營運活動",
"OEE.Errors": "異常",
"OEE.Hours": "時",
"OEE.Orders": "訂單",
"OEE.Sales": "銷售",
"OEE Score": "OEE スコア",
"OEE.Activity": "稼働アクティビティ",
"OEE.Errors": "エラー",
"OEE.Hours": "時",
"OEE.Orders": "注文",
"OEE.Sales": "売上",
"Offline": "オフライン",
"Offline Machines": "オフライン機台",
"Once your account is deleted, all of its resources and data will be permanently deleted. Before deleting your account, please download any data or information that you wish to retain.": "アカウントが削除されると、そのすべてのリソース和データが永久に削除されます。アカウントを削除する前に、保持したいデータや情報をダウンロードしてください。",
@@ -401,7 +426,7 @@
"Pickup Codes": "受取コード",
"Please check the following errors:": "以下のエラーを確認してください:",
"Please check the form for errors.": "フォームにエラーがないか確認してください。",
"Please select a machine to view metrics": "請選擇機台以查看數據",
"Please select a machine to view metrics": "機台を選択して指標を表示してください",
"Point Rules": "ポイントルール",
"Point Settings": "ポイント設定",
"Previous": "前へ",
@@ -420,10 +445,10 @@
"Purchasing": "購入中",
"Quality": "品質 (Quality)",
"Questionnaire": "アンケート",
"Quick Expiry Check": "效期快速檢查",
"Quick Select": "快速選取",
"Quick Expiry Check": "有効期限のクイックチェック",
"Quick Select": "クイック選択",
"Quick search...": "クイック検索...",
"Real-time OEE analysis awaits": "即時 OEE 分析預備中",
"Real-time OEE analysis awaits": "リアルタイム OEE 分析待機中",
"Real-time Operation Logs (Last 50)": "リアルタイム操作ログ (直近 50 件)",
"Real-time monitoring across all machines": "全機台のリアルタイム監視",
"Real-time status monitoring": "リアルタイムステータス監視",
@@ -580,7 +605,7 @@
"Users": "ユーザー数",
"Utilization Rate": "稼働率",
"Utilization Timeline": "稼動時序",
"Utilization, OEE and Operational Intelligence": "稼動率、OEE 與營運情報",
"Utilization, OEE and Operational Intelligence": "稼動率、OEE と運用インテリジェンス",
"Valid Until": "有効期限",
"Vending Page": "販売画面",
"Venue Management": "会場管理",

View File

@@ -183,6 +183,8 @@
"Enter serial number": "請輸入機台序號",
"Enter your password to confirm": "請輸入您的密碼以確認",
"Equipment efficiency and OEE metrics": "設備效能與 OEE 綜合指標",
"Avg Cycle": "平均週期",
"Cycle Efficiency": "週期效率",
"Error": "異常",
"Execution Time": "執行時間",
"Expired": "已過期",
@@ -195,6 +197,7 @@
"Fill in the device repair or maintenance details": "填寫設備維修或保養詳情",
"Firmware Version": "韌體版本",
"Fleet Avg OEE": "全機台平均 OEE",
"Daily Revenue": "當日營收",
"Fleet Performance": "全機台效能",
"From": "從",
"Full Access": "全機台授權",
@@ -278,6 +281,8 @@
"Machine settings updated successfully.": "機台設定已成功更新。",
"Machines": "機台列表",
"Machines Online": "在線機台數",
"Machine Utilization": "機台稼動率",
"Machine Registry": "機台清冊",
"Maintenance": "保養",
"Maintenance Content": "維修內容",
"Maintenance Date": "維修日期",
@@ -286,6 +291,7 @@
"Maintenance QR": "維修掃描碼",
"Maintenance QR Code": "維修掃描碼",
"Maintenance Records": "維修管理單",
"Live Fleet Updates": "即時數據更新",
"Maintenance record created successfully": "維修紀錄已成功建立",
"Scan this code to quickly access the maintenance form for this device.": "掃描此 QR Code 即可快速進入此設備的維修單填寫頁面。",
"Manage Account Access": "管理帳號存取",
@@ -308,6 +314,7 @@
"Message": "訊息",
"Message Content": "日誌內容",
"Message Display": "訊息顯示",
"min": "分",
"Min 8 characters": "至少 8 個字元",
"Model": "機台型號",
"Model Name": "型號名稱",
@@ -339,6 +346,8 @@
"No machines available": "目前沒有可供分配的機台",
"No machines available in this company.": "此客戶目前沒有可供分配的機台。",
"No maintenance records found": "找不到維修紀錄",
"No Machine Selected": "尚未選擇機台",
"No matching machines": "找不到符合的機台",
"No matching logs found": "找不到符合條件的日誌",
"No permissions": "無權限項目",
"No roles found.": "找不到角色資料。",
@@ -350,6 +359,10 @@
"Not Used Description": "不使用第三方支付介接",
"Notes": "備註",
"OEE Score": "OEE 綜合得分",
"OEE Efficiency Trend": "OEE 效率趨勢",
"Online Status": "在線狀態",
"Optimized Performance": "效能優化",
"Output Count": "出貨數量",
"OEE.Activity": "營運活動",
"OEE.Errors": "異常",
"OEE.Hours": "小時",
@@ -424,6 +437,9 @@
"Quick Select": "快速選取",
"Quick search...": "快速搜尋...",
"Real-time OEE analysis awaits": "即時 OEE 分析預備中",
"Real-time fleet efficiency and OEE metrics": "全機台即時效率與 OEE 指標",
"Real-time performance analytics": "即時效能分析",
"Reporting Period": "報表區間",
"Real-time Operation Logs (Last 50)": "即時操作日誌 (最後 50 筆)",
"Real-time monitoring across all machines": "跨機台即時狀態監控",
"Real-time status monitoring": "即時監控機台連線動態",
@@ -461,6 +477,7 @@
"Roles": "角色權限",
"Roles scoped to specific customer companies.": "適用於各個客戶單位的特定角色。",
"Running Status": "運行狀態",
"s": "秒",
"SYSTEM": "系統層級",
"Sales": "銷售管理",
"Sales Activity": "銷售活動",
@@ -490,6 +507,7 @@
"Select Model": "選擇型號",
"Select Owner": "選擇所屬公司",
"Select a machine to deep dive": "請選擇機台以開始深度分析",
"Select date to sync data": "選擇日期以同步數據",
"Selected": "已選擇",
"Selected Date": "查詢日期",
"Serial & Version": "序號與版本",
@@ -560,6 +578,7 @@
"Total Slots": "總貨道數",
"Total items": "總計 :count 項",
"Track device health and maintenance history": "追蹤設備健康與維修歷史",
"Total Gross Value": "銷售總結",
"Transfer Audit": "調撥單",
"Transfers": "調撥單",
"Tutorial Page": "教學頁",
@@ -579,6 +598,8 @@
"Username": "使用者帳號",
"Users": "帳號數",
"Utilization Rate": "機台稼動率",
"Utilized Time": "稼動持續時間",
"Units": "台",
"Utilization Timeline": "稼動時序",
"Utilization, OEE and Operational Intelligence": "稼動率、OEE 與營運情報",
"Valid Until": "合約到期日",

View File

@@ -159,7 +159,7 @@ window.utilizationDashboard = function(initialMachines, initialStats) {
custom: function({ series, seriesIndex, dataPointIndex, w }) {
return '<div class="px-3 py-2 bg-slate-900 text-white rounded-lg border border-slate-700 shadow-xl">' +
'<span class="text-[10px] font-black uppercase tracking-widest block opacity-50 mb-1">' + w.globals.categoryLabels[dataPointIndex] + '</span>' +
'<span class="text-sm font-black">' + series[seriesIndex][dataPointIndex] + '% OEE</span>' +
'<span class="text-sm font-black">' + series[seriesIndex][dataPointIndex] + '% {{ __("OEE") }}</span>' +
'</div>';
}
}
@@ -252,7 +252,7 @@ window.utilizationDashboard = function(initialMachines, initialStats) {
<p class="text-[11px] font-black text-cyan-600 dark:text-cyan-400 uppercase tracking-[0.2em] mb-3">{{ __('Reporting Period') }}</p>
<div class="relative group">
<input type="date" x-model="startDate" @change="fetchData"
class="w-full bg-transparent border-none p-0 text-xl font-black text-slate-800 dark:text-white focus:ring-0 cursor-pointer">
class="w-full bg-transparent border-none p-0 text-xl font-black text-slate-800 dark:text-white focus:ring-0 cursor-pointer dark:[&::-webkit-calendar-picker-indicator]:invert">
<div class="absolute bottom-0 left-0 w-0 h-0.5 bg-cyan-500 group-hover:w-full transition-all duration-500"></div>
</div>
<p class="mt-3 text-[10px] font-bold text-slate-400 uppercase tracking-widest">{{ __('Select date to sync data') }}</p>
@@ -270,11 +270,17 @@ window.utilizationDashboard = function(initialMachines, initialStats) {
<!-- Search -->
<div class="relative group">
<span class="absolute inset-y-0 left-0 pl-4 flex items-center pointer-events-none">
<svg class="size-4 text-slate-400 group-focus-within:text-cyan-500 transition-colors" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5"><circle cx="11" cy="11" r="8"/><path d="m21 21-4.3-4.3"/></svg>
<span class="absolute inset-y-0 left-0 flex items-center pl-4 pointer-events-none z-10">
<svg class="h-4 w-4 text-slate-400 group-focus-within:text-cyan-500 transition-colors"
viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round"
stroke-linejoin="round">
<circle cx="11" cy="11" r="8"></circle>
<line x1="21" y1="21" x2="16.65" y2="16.65"></line>
</svg>
</span>
<input type="text" x-model="searchQuery" placeholder="{{ __('Search serial or name...') }}"
class="luxury-input pl-11 py-3 w-full text-sm">
<input type="text" x-model="searchQuery"
placeholder="{{ __('Search serial or name...') }}"
class="luxury-input py-2.5 pl-12 pr-6 block w-full text-sm">
</div>
<!-- List Container -->
@@ -315,9 +321,9 @@ window.utilizationDashboard = function(initialMachines, initialStats) {
<!-- Machine Header -->
<div class="luxury-card rounded-[2.5rem] p-8 border-b-4 border-b-cyan-500 shadow-xl shadow-cyan-500/5 relative overflow-hidden">
<div class="absolute top-0 right-0 p-8">
<div class="flex items-center gap-2 px-4 py-2 rounded-full bg-slate-900/5 dark:bg-white/5 backdrop-blur-md">
<div :class="selectedMachine.status === 'online' ? 'bg-emerald-500' : 'bg-slate-400'" class="size-2 rounded-full"></div>
<span class="text-[10px] font-black uppercase tracking-widest" x-text="selectedMachine.status"></span>
<div class="flex items-center gap-2 px-4 py-2 rounded-full bg-slate-900/5 dark:bg-white/10 backdrop-blur-md">
<div :class="selectedMachine.status === 'online' ? 'bg-emerald-500 shadow-[0_0_8px_rgba(16,185,129,0.4)]' : 'bg-slate-400'" class="w-2 h-2 rounded-full"></div>
<span class="text-[10px] font-black uppercase tracking-widest text-slate-600 dark:text-slate-200" x-text="selectedMachine.status === 'online' ? '{{ __("Online") }}' : '{{ __("Offline") }}'"></span>
</div>
</div>
@@ -327,7 +333,7 @@ window.utilizationDashboard = function(initialMachines, initialStats) {
</div>
<div>
<h2 class="text-3xl font-black text-slate-800 dark:text-white tracking-tight" x-text="selectedMachine.name"></h2>
<p class="text-sm font-bold text-slate-500 uppercase tracking-[0.2em] mt-1" x-text="'Serial NO: ' + selectedMachine.serial_no"></p>
<p class="text-sm font-bold text-slate-500 uppercase tracking-[0.2em] mt-1" x-text="'{{ __("Serial NO") }}: ' + selectedMachine.serial_no"></p>
</div>
</div>
@@ -339,7 +345,7 @@ window.utilizationDashboard = function(initialMachines, initialStats) {
</div>
<div>
<p class="text-[10px] font-bold text-slate-400 uppercase tracking-widest mb-1">{{ __('Utilized Time') }}</p>
<p class="text-xl font-black text-slate-800 dark:text-slate-200" x-text="(selectedMachine.utilized_minutes || 0) + ' min'"></p>
<p class="text-xl font-black text-slate-800 dark:text-slate-200" x-text="(selectedMachine.utilized_minutes || 0) + ' {{ __("min") }}'"></p>
</div>
<div>
<p class="text-[10px] font-bold text-slate-400 uppercase tracking-widest mb-1">{{ __('Output Count') }}</p>
@@ -347,7 +353,7 @@ window.utilizationDashboard = function(initialMachines, initialStats) {
</div>
<div>
<p class="text-[10px] font-bold text-slate-400 uppercase tracking-widest mb-1">{{ __('Avg Cycle') }}</p>
<p class="text-xl font-black text-slate-800 dark:text-slate-200" x-text="(selectedMachine.avg_cycle || 0) + 's'"></p>
<p class="text-xl font-black text-slate-800 dark:text-slate-200" x-text="(selectedMachine.avg_cycle || 0) + '{{ __("s") }}'"></p>
</div>
</div>
</div>