[FEAT] 優化客戶合約管理介面與修復日期偏移問題
All checks were successful
star-cloud-deploy-demo / deploy-demo (push) Successful in 52s
All checks were successful
star-cloud-deploy-demo / deploy-demo (push) Successful in 52s
1. 整合「客戶詳情」與「合約歷程」至單一側邊欄,改用分頁 (Tabs) 切換介面。 2. 優化清單「服務期程」顯示:根據客戶模式(租賃/買斷)動態顯示對應期間,並使用完整文字標籤取代縮寫。 3. 修復日期 Bug:在 Company 模型指定日期序列化格式為 Y-m-d,解決時區轉換導致的日期減少一天問題。 4. 新增合約歷程資料表模型、遷移檔以及對應的多語系翻譯(中、英、日)。 5. 移除清單操作列中重複的合約歷程圖示。
This commit is contained in:
@@ -2,8 +2,11 @@
|
||||
|
||||
@section('content')
|
||||
<div class="space-y-6" x-data="{
|
||||
|
||||
showModal: false,
|
||||
showHistoryModal: false,
|
||||
editing: false,
|
||||
sidebarView: 'detail',
|
||||
currentCompany: {
|
||||
id: '',
|
||||
name: '',
|
||||
@@ -16,6 +19,10 @@
|
||||
contact_email: '',
|
||||
start_date: '',
|
||||
end_date: '',
|
||||
warranty_start_date: '',
|
||||
warranty_end_date: '',
|
||||
software_start_date: '',
|
||||
software_end_date: '',
|
||||
status: 1,
|
||||
note: '',
|
||||
settings: {
|
||||
@@ -28,7 +35,10 @@
|
||||
this.currentCompany = {
|
||||
id: '', name: '', code: '', original_type: 'lease', current_type: 'lease',
|
||||
tax_id: '', contact_name: '', contact_phone: '',
|
||||
contact_email: '', start_date: '', end_date: '', status: 1, note: '',
|
||||
contact_email: '', start_date: '', end_date: '',
|
||||
warranty_start_date: '', warranty_end_date: '',
|
||||
software_start_date: '', software_end_date: '',
|
||||
status: 1, note: '',
|
||||
settings: { enable_material_code: false, enable_points: false }
|
||||
};
|
||||
this.showModal = true;
|
||||
@@ -39,6 +49,10 @@
|
||||
...company,
|
||||
start_date: company.start_date ? company.start_date.substring(0, 10) : '',
|
||||
end_date: company.end_date ? company.end_date.substring(0, 10) : '',
|
||||
warranty_start_date: company.warranty_start_date ? company.warranty_start_date.substring(0, 10) : '',
|
||||
warranty_end_date: company.warranty_end_date ? company.warranty_end_date.substring(0, 10) : '',
|
||||
software_start_date: company.software_start_date ? company.software_start_date.substring(0, 10) : '',
|
||||
software_end_date: company.software_end_date ? company.software_end_date.substring(0, 10) : '',
|
||||
settings: {
|
||||
enable_material_code: company.settings?.enable_material_code || false,
|
||||
enable_points: company.settings?.enable_points || false
|
||||
@@ -57,9 +71,13 @@
|
||||
detailCompany: {
|
||||
id: '', name: '', code: '', original_type: 'lease', current_type: 'lease',
|
||||
tax_id: '', contact_name: '', contact_phone: '', contact_email: '',
|
||||
start_date: '', end_date: '', status: 1, note: '',
|
||||
start_date: '', end_date: '',
|
||||
warranty_start_date: '', warranty_end_date: '',
|
||||
software_start_date: '', software_end_date: '',
|
||||
status: 1, note: '',
|
||||
settings: { enable_material_code: false, enable_points: false },
|
||||
users_count: 0, machines_count: 0
|
||||
users_count: 0, machines_count: 0,
|
||||
contracts: []
|
||||
},
|
||||
openDetailSidebar(company) {
|
||||
this.detailCompany = {
|
||||
@@ -69,15 +87,40 @@
|
||||
enable_points: company.settings?.enable_points || false
|
||||
}
|
||||
};
|
||||
this.sidebarView = 'detail';
|
||||
this.showDetail = true;
|
||||
},
|
||||
openHistorySidebar(company) {
|
||||
this.detailCompany = {
|
||||
...company,
|
||||
settings: {
|
||||
enable_material_code: company.settings?.enable_material_code || false,
|
||||
enable_points: company.settings?.enable_points || false
|
||||
}
|
||||
};
|
||||
this.sidebarView = 'history';
|
||||
this.showDetail = true;
|
||||
},
|
||||
openFullHistory() {
|
||||
this.showHistoryModal = true;
|
||||
},
|
||||
openHistory(company) {
|
||||
this.detailCompany = {
|
||||
...company,
|
||||
settings: {
|
||||
enable_material_code: company.settings?.enable_material_code || false,
|
||||
enable_points: company.settings?.enable_points || false
|
||||
}
|
||||
};
|
||||
this.showHistoryModal = true;
|
||||
},
|
||||
submitConfirmedForm() {
|
||||
if (this.statusToggleSource === 'list') {
|
||||
this.$refs.statusToggleForm.submit();
|
||||
} else {
|
||||
this.$refs.companyForm.submit();
|
||||
}
|
||||
}
|
||||
},
|
||||
}">
|
||||
<!-- Header -->
|
||||
<div class="flex flex-col md:flex-row md:items-center justify-between gap-6">
|
||||
@@ -164,7 +207,7 @@
|
||||
{{ __('Accounts / Machines') }}</th>
|
||||
<th
|
||||
class="px-6 py-4 text-[12px] font-black text-slate-400 dark:text-slate-500 uppercase tracking-widest border-b border-slate-100 dark:border-slate-800 text-center">
|
||||
{{ __('Contract Period') }}</th>
|
||||
{{ __('Service Terms') }}</th>
|
||||
<th
|
||||
class="px-6 py-4 text-[12px] font-black text-slate-400 dark:text-slate-500 uppercase tracking-widest border-b border-slate-100 dark:border-slate-800 text-right">
|
||||
{{ __('Actions') }}</th>
|
||||
@@ -235,20 +278,53 @@
|
||||
</div>
|
||||
</div>
|
||||
</td>
|
||||
<td class="px-6 py-6 text-center text-slate-500 dark:text-slate-400">
|
||||
<div class="flex flex-col items-center gap-1.5 font-mono">
|
||||
<div class="flex items-center gap-2 min-w-[130px] justify-center">
|
||||
<span class="text-[10px] font-bold text-slate-400 uppercase tracking-tighter">{{ __('From:') }}</span>
|
||||
<span class="text-[13px] font-bold tracking-tighter text-slate-600 dark:text-slate-300">
|
||||
{{ $company->start_date ? $company->start_date->format('Y-m-d') : '--' }}
|
||||
<td class="px-6 py-6 border-b border-slate-50 dark:border-slate-800/50">
|
||||
<div class="flex flex-col gap-2.5 min-w-[200px] mx-auto w-fit">
|
||||
<!-- Contract Period (Only for Lease) -->
|
||||
@if($company->current_type === 'lease')
|
||||
<div class="flex items-center gap-3 group/term">
|
||||
<span class="px-2 py-0.5 rounded-md bg-blue-500/10 text-blue-600 text-[10px] font-black border border-blue-500/20 group-hover/term:bg-blue-500 group-hover/term:text-white transition-all tracking-wider whitespace-nowrap min-w-[42px] text-center">
|
||||
{{ __('Contract') }}
|
||||
</span>
|
||||
<div class="flex items-center gap-1.5 font-mono text-[11px] font-bold">
|
||||
<span class="text-slate-400">{{ $company->start_date ? $company->start_date->format('Y-m-d') : '--' }}</span>
|
||||
<span class="text-slate-300">~</span>
|
||||
<span class="{{ $company->end_date && $company->end_date->isPast() ? 'text-rose-500 shadow-sm shadow-rose-500/10' : 'text-slate-600 dark:text-slate-300' }}">
|
||||
{{ $company->end_date ? $company->end_date->format('Y-m-d') : __('Permanent') }}
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="flex items-center gap-2 min-w-[130px] justify-center">
|
||||
<span class="text-[10px] font-bold text-slate-400 uppercase tracking-tighter">{{ __('To:') }}</span>
|
||||
<span class="text-[13px] font-bold tracking-tighter {{ $company->end_date && $company->end_date->isPast() ? 'text-rose-500' : 'text-slate-800 dark:text-slate-200' }}">
|
||||
{{ $company->end_date ? $company->end_date->format('Y-m-d') : __('Permanent') }}
|
||||
@endif
|
||||
|
||||
@if($company->current_type === 'buyout')
|
||||
<!-- Warranty Period -->
|
||||
<div class="flex items-center gap-3 group/term">
|
||||
<span class="px-2 py-0.5 rounded-md bg-amber-500/10 text-amber-600 text-[10px] font-black border border-amber-500/20 group-hover/term:bg-amber-500 group-hover/term:text-white transition-all tracking-wider whitespace-nowrap min-w-[42px] text-center">
|
||||
{{ __('Warranty') }}
|
||||
</span>
|
||||
<div class="flex items-center gap-1.5 font-mono text-[11px] font-bold">
|
||||
<span class="text-slate-400">{{ $company->warranty_start_date ? $company->warranty_start_date->format('Y-m-d') : '--' }}</span>
|
||||
<span class="text-slate-300">~</span>
|
||||
<span class="{{ $company->warranty_end_date && $company->warranty_end_date->isPast() ? 'text-rose-500 shadow-sm shadow-rose-500/10' : 'text-slate-500 dark:text-slate-400' }}">
|
||||
{{ $company->warranty_end_date ? $company->warranty_end_date->format('Y-m-d') : '--' }}
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Software Period -->
|
||||
<div class="flex items-center gap-3 group/term">
|
||||
<span class="px-2 py-0.5 rounded-md bg-purple-500/10 text-purple-600 text-[10px] font-black border border-purple-500/20 group-hover/term:bg-purple-500 group-hover/term:text-white transition-all tracking-wider whitespace-nowrap min-w-[42px] text-center">
|
||||
{{ __('Software') }}
|
||||
</span>
|
||||
<div class="flex items-center gap-1.5 font-mono text-[11px] font-bold">
|
||||
<span class="text-slate-400">{{ $company->software_start_date ? $company->software_start_date->format('Y-m-d') : '--' }}</span>
|
||||
<span class="text-slate-300">~</span>
|
||||
<span class="{{ $company->software_end_date && $company->software_end_date->isPast() ? 'text-rose-500 shadow-sm shadow-rose-500/10' : 'text-slate-500 dark:text-slate-400' }}">
|
||||
{{ $company->software_end_date ? $company->software_end_date->format('Y-m-d') : '--' }}
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
@endif
|
||||
</div>
|
||||
</td>
|
||||
<td class="px-6 py-6 text-right">
|
||||
@@ -447,11 +523,11 @@
|
||||
<input type="text" name="tax_id" x-model="currentCompany.tax_id"
|
||||
class="luxury-input w-full">
|
||||
</div>
|
||||
<div class="grid grid-cols-2 gap-3">
|
||||
<div class="grid grid-cols-2 gap-3" x-show="currentCompany.current_type === 'lease'">
|
||||
<div class="space-y-2">
|
||||
<label class="text-xs font-black text-slate-500 uppercase tracking-widest pl-1">{{
|
||||
__('Start Date') }} <span class="text-rose-500 ml-0.5">*</span></label>
|
||||
<input type="date" name="start_date" x-model="currentCompany.start_date" required
|
||||
<input type="date" name="start_date" x-model="currentCompany.start_date" :required="currentCompany.current_type === 'lease'"
|
||||
class="luxury-input w-full px-2">
|
||||
</div>
|
||||
<div class="space-y-2">
|
||||
@@ -462,6 +538,38 @@
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Buyout Specific Dates -->
|
||||
<div x-show="currentCompany.current_type === 'buyout'" x-transition class="space-y-4 pt-2">
|
||||
<div class="grid grid-cols-1 md:grid-cols-2 gap-6">
|
||||
<div class="grid grid-cols-2 gap-3">
|
||||
<div class="space-y-2">
|
||||
<label class="text-[10px] font-black text-amber-600 uppercase tracking-widest pl-1">{{ __('Warranty Start') }}</label>
|
||||
<input type="date" name="warranty_start_date" x-model="currentCompany.warranty_start_date"
|
||||
class="luxury-input w-full px-2 border-amber-100 dark:border-amber-900/30">
|
||||
</div>
|
||||
<div class="space-y-2">
|
||||
<label class="text-[10px] font-black text-amber-600 uppercase tracking-widest pl-1">{{ __('Warranty End') }}</label>
|
||||
<input type="date" name="warranty_end_date" x-model="currentCompany.warranty_end_date"
|
||||
class="luxury-input w-full px-2 border-amber-100 dark:border-amber-900/30">
|
||||
</div>
|
||||
</div>
|
||||
<div class="grid grid-cols-2 gap-3">
|
||||
<div class="space-y-2">
|
||||
<label class="text-[10px] font-black text-indigo-600 uppercase tracking-widest pl-1">{{ __('Software Start') }}</label>
|
||||
<input type="date" name="software_start_date" x-model="currentCompany.software_start_date"
|
||||
class="luxury-input w-full px-2 border-indigo-100 dark:border-indigo-900/30">
|
||||
</div>
|
||||
<div class="space-y-2">
|
||||
<label class="text-[10px] font-black text-indigo-600 uppercase tracking-widest pl-1">{{ __('Software End') }}</label>
|
||||
<input type="date" name="software_end_date" x-model="currentCompany.software_end_date"
|
||||
class="luxury-input w-full px-2 border-indigo-100 dark:border-indigo-900/30">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<!-- Keep hidden start_date for buyout as well if needed by backend -->
|
||||
<input type="hidden" name="start_date" :value="currentCompany.start_date" x-if="currentCompany.current_type === 'buyout' && !currentCompany.start_date">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Admin Account Section (Account Creation) - Only show when creating -->
|
||||
@@ -652,7 +760,7 @@
|
||||
<!-- Header -->
|
||||
<div class="px-8 py-6 border-b border-slate-100 dark:border-slate-800 flex items-center justify-between bg-white dark:bg-slate-900 sticky top-0 z-10">
|
||||
<div>
|
||||
<h2 class="text-xl font-black text-slate-800 dark:text-white tracking-tight">{{ __('Customer Details') }}</h2>
|
||||
<h2 class="text-xl font-black text-slate-800 dark:text-white tracking-tight" x-text="sidebarView === 'history' ? '{{ __('Contract History Detail') }}' : '{{ __('Customer Details') }}'"></h2>
|
||||
<div class="flex items-center gap-2 mt-1">
|
||||
<p class="text-xs font-bold text-slate-400 uppercase tracking-[0.2em]" x-text="detailCompany.name"></p>
|
||||
<span class="text-xs font-mono font-black text-cyan-500 px-1.5 py-0.5 bg-cyan-500/10 rounded" x-text="detailCompany.code"></span>
|
||||
@@ -666,7 +774,19 @@
|
||||
</div>
|
||||
|
||||
<!-- Body -->
|
||||
<div class="flex-1 overflow-y-auto px-8 py-8 space-y-8 custom-scrollbar">
|
||||
<div class="flex-1 overflow-y-auto px-8 pt-4 pb-8 space-y-5 custom-scrollbar">
|
||||
<!-- Tab Switcher -->
|
||||
<div class="flex gap-1 p-1 bg-slate-100 dark:bg-slate-800/60 rounded-xl">
|
||||
<button @click="sidebarView = 'detail'"
|
||||
:class="sidebarView === 'detail' ? 'bg-white dark:bg-slate-700 text-slate-800 dark:text-white shadow-sm' : 'text-slate-400 hover:text-slate-600'"
|
||||
class="flex-1 py-2.5 px-3 text-xs font-black uppercase tracking-[0.15em] rounded-lg transition-all">{{ __('Customer Details') }}</button>
|
||||
<button @click="sidebarView = 'history'"
|
||||
:class="sidebarView === 'history' ? 'bg-white dark:bg-slate-700 text-slate-800 dark:text-white shadow-sm' : 'text-slate-400 hover:text-slate-600'"
|
||||
class="flex-1 py-2.5 px-3 text-xs font-black uppercase tracking-[0.15em] rounded-lg transition-all">{{ __('Contract History Detail') }}</button>
|
||||
</div>
|
||||
|
||||
<!-- Detail View -->
|
||||
<div x-show="sidebarView === 'detail'" class="space-y-8">
|
||||
<!-- Validity & Status Section -->
|
||||
<section class="space-y-4">
|
||||
<h3 class="text-xs font-black text-emerald-500 uppercase tracking-[0.3em]">{{ __('Account Status') }}</h3>
|
||||
@@ -690,38 +810,56 @@
|
||||
</div>
|
||||
|
||||
<!-- Business Type -->
|
||||
<div class="bg-slate-50 dark:bg-slate-800/40 p-5 rounded-2xl border border-slate-100 dark:border-slate-800/80">
|
||||
<h4 class="text-[10px] font-black text-indigo-500 uppercase tracking-[0.2em] mb-4">{{ __('Business Type') }}</h4>
|
||||
<div class="space-y-4">
|
||||
<div class="flex items-center justify-between">
|
||||
<span class="text-[11px] font-bold text-slate-400">{{ __('Original:') }}</span>
|
||||
<span class="px-2.5 py-1 rounded-lg text-[11px] font-bold uppercase tracking-widest"
|
||||
:class="detailCompany.original_type === 'buyout' ? 'bg-amber-500/10 text-amber-600' : 'bg-blue-500/10 text-blue-600'"
|
||||
x-text="detailCompany.original_type === 'buyout' ? '{{ __('Buyout') }}' : '{{ __('Lease') }}'"></span>
|
||||
</div>
|
||||
<div class="flex items-center justify-between">
|
||||
<span class="text-[11px] font-bold text-slate-400">{{ __('Current:') }}</span>
|
||||
<span class="px-2.5 py-1 rounded-lg text-[11px] font-bold uppercase tracking-widest"
|
||||
:class="detailCompany.current_type === 'buyout' ? 'bg-amber-500/10 text-amber-600 border border-amber-500/20' : 'bg-blue-500/10 text-blue-600 border border-blue-500/20'"
|
||||
x-text="detailCompany.current_type === 'buyout' ? '{{ __('Buyout') }}' : '{{ __('Lease') }}'"></span>
|
||||
<div class="bg-slate-50 dark:bg-slate-800/40 p-5 rounded-2xl border border-slate-100 dark:border-slate-800/80 space-y-4">
|
||||
<div class="flex justify-between items-start pb-3 border-b border-slate-100/50 dark:border-slate-800/50">
|
||||
<div>
|
||||
<h4 class="text-[10px] font-black text-indigo-500 uppercase tracking-[0.2em]">{{ __('Contract Model') }}</h4>
|
||||
</div>
|
||||
<span :class="detailCompany.current_type === 'lease' ? 'text-blue-500 bg-blue-500/10' : 'text-amber-500 bg-amber-500/10'"
|
||||
class="text-[10px] font-black uppercase tracking-wider px-2.5 py-1 rounded-lg">
|
||||
<span x-text="detailCompany.current_type === 'lease' ? '{{ __('Lease') }}' : '{{ __('Buyout') }}'"></span>
|
||||
</span>
|
||||
</div>
|
||||
|
||||
<!-- Lease Info Display -->
|
||||
<template x-if="detailCompany.current_type === 'lease'">
|
||||
<div class="grid grid-cols-2 gap-4">
|
||||
<div class="space-y-1">
|
||||
<p class="text-[9px] font-black text-slate-400 uppercase tracking-widest">{{ __('Start Date') }}</p>
|
||||
<p class="text-xs font-black text-slate-700 dark:text-slate-200" x-text="detailCompany.start_date?.substring(0, 10) || '-'"></p>
|
||||
</div>
|
||||
<div class="space-y-1">
|
||||
<p class="text-[9px] font-black text-slate-400 uppercase tracking-widest">{{ __('End Date') }}</p>
|
||||
<p class="text-xs font-black text-slate-800 dark:text-white" x-text="detailCompany.end_date?.substring(0, 10) || '{{ __('Unlimited') }}'"></p>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<!-- Buyout Info Display -->
|
||||
<template x-if="detailCompany.current_type === 'buyout'">
|
||||
<div class="space-y-4">
|
||||
<div class="grid grid-cols-1 gap-3">
|
||||
<div class="p-3 bg-amber-50/30 dark:bg-amber-500/5 rounded-xl border border-amber-100/50 dark:border-amber-500/10">
|
||||
<p class="text-[9px] font-black text-amber-600 uppercase tracking-widest">{{ __('Warranty Service') }}</p>
|
||||
<div class="flex items-center gap-2 mt-1">
|
||||
<span class="text-xs font-black text-slate-700 dark:text-slate-200" x-text="detailCompany.warranty_start_date?.substring(0, 10) || '-'"></span>
|
||||
<span class="text-slate-400">~</span>
|
||||
<span class="text-xs font-black text-slate-800 dark:text-white" x-text="detailCompany.warranty_end_date?.substring(0, 10) || '-'"></span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="p-3 bg-indigo-50/30 dark:bg-indigo-500/5 rounded-xl border border-indigo-100/50 dark:border-indigo-500/10">
|
||||
<p class="text-[9px] font-black text-indigo-600 uppercase tracking-widest">{{ __('Software Service') }}</p>
|
||||
<div class="flex items-center gap-2 mt-1">
|
||||
<span class="text-xs font-black text-slate-700 dark:text-slate-200" x-text="detailCompany.software_start_date?.substring(0, 10) || '-'"></span>
|
||||
<span class="text-slate-400">~</span>
|
||||
<span class="text-xs font-black text-slate-800 dark:text-white" x-text="detailCompany.software_end_date?.substring(0, 10) || '-'"></span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
</div>
|
||||
|
||||
<!-- Contract Period -->
|
||||
<div class="bg-slate-50 dark:bg-slate-800/40 p-5 rounded-2xl border border-slate-100 dark:border-slate-800/80">
|
||||
<h4 class="text-[10px] font-black text-indigo-500 uppercase tracking-[0.2em] mb-4">{{ __('Contract Period') }}</h4>
|
||||
<div class="space-y-3 font-mono">
|
||||
<div class="flex items-center gap-3">
|
||||
<span class="text-[10px] font-bold text-slate-400 uppercase tracking-tighter min-w-[32px]">{{ __('From:') }}</span>
|
||||
<div class="text-[13px] font-bold tracking-tighter text-slate-700 dark:text-slate-200" x-text="detailCompany.start_date || '--'"></div>
|
||||
</div>
|
||||
<div class="flex items-center gap-3">
|
||||
<span class="text-[10px] font-bold text-slate-400 uppercase tracking-tighter min-w-[32px]">{{ __('To:') }}</span>
|
||||
<div class="text-[13px] font-bold tracking-tighter text-slate-800 dark:text-white" :class="detailCompany.end_date_expired ? 'text-rose-500' : ''" x-text="detailCompany.end_date || '{{ __('Permanent') }}'"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
@@ -803,6 +941,82 @@
|
||||
<p class="text-sm font-bold text-slate-600 dark:text-slate-400 leading-relaxed italic" x-text="detailCompany.note"></p>
|
||||
</div>
|
||||
</section>
|
||||
</div>
|
||||
|
||||
<!-- History View -->
|
||||
<div x-show="sidebarView === 'history'" class="space-y-6">
|
||||
<template x-for="(contract, index) in (detailCompany.contracts || [])" :key="contract.id">
|
||||
<div class="bg-slate-50/50 dark:bg-slate-800/30 rounded-2xl border border-slate-100 dark:border-slate-800/80 overflow-hidden">
|
||||
<!-- Card Header -->
|
||||
<div class="px-5 py-3 bg-white dark:bg-slate-800/50 border-b border-slate-100 dark:border-slate-800 flex justify-between items-center">
|
||||
<div class="flex items-center gap-2.5">
|
||||
<div class="size-7 rounded-full bg-slate-100 dark:bg-slate-700 flex items-center justify-center text-[9px] font-black text-slate-500" x-text="'#' + (detailCompany.contracts.length - index)"></div>
|
||||
<div>
|
||||
<p class="text-[10px] font-black text-slate-700 dark:text-slate-200" x-text="new Date(contract.created_at).toLocaleString()"></p>
|
||||
<div class="flex items-center gap-1.5 mt-0.5">
|
||||
<span :class="contract.type === 'lease' ? 'text-blue-500 bg-blue-500/10' : 'text-amber-500 bg-amber-500/10'"
|
||||
class="text-[8px] font-black uppercase tracking-wider px-1.5 py-0.5 rounded"
|
||||
x-text="contract.type === 'lease' ? '{{ __('Lease') }}' : '{{ __('Buyout') }}'"></span>
|
||||
<span class="text-[9px] text-slate-400">{{ __('by') }} <span class="text-slate-600 dark:text-slate-300" x-text="contract.creator?.name || 'System'"></span></span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<template x-if="index === 0">
|
||||
<span class="px-2 py-0.5 bg-emerald-500 text-white text-[8px] font-black uppercase tracking-widest rounded-full">{{ __('Current') }}</span>
|
||||
</template>
|
||||
</div>
|
||||
|
||||
<!-- Card Body -->
|
||||
<div class="p-5 space-y-4">
|
||||
<!-- Lease dates -->
|
||||
<template x-if="contract.type === 'lease'">
|
||||
<div class="grid grid-cols-2 gap-4">
|
||||
<div class="space-y-1.5">
|
||||
<p class="text-[10px] font-black text-slate-400 uppercase tracking-widest">{{ __('Contract Start') }}</p>
|
||||
<p class="text-sm font-black text-slate-700 dark:text-white font-mono" x-text="contract.start_date?.substring(0, 10) || '-'"></p>
|
||||
</div>
|
||||
<div class="space-y-1.5">
|
||||
<p class="text-[10px] font-black text-slate-400 uppercase tracking-widest">{{ __('Contract End') }}</p>
|
||||
<p class="text-sm font-black text-slate-700 dark:text-white font-mono" x-text="contract.end_date?.substring(0, 10) || '{{ __('Unlimited') }}'"></p>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
<!-- Buyout dates -->
|
||||
<template x-if="contract.type === 'buyout'">
|
||||
<div class="grid grid-cols-1 gap-4">
|
||||
<div class="p-4 bg-amber-50/40 dark:bg-amber-500/5 rounded-2xl border border-amber-100/50 dark:border-amber-500/10">
|
||||
<p class="text-[10px] font-black text-amber-600 uppercase tracking-widest mb-2">{{ __('Warranty Service') }}</p>
|
||||
<div class="flex items-center gap-2">
|
||||
<span class="text-sm font-black text-slate-700 dark:text-slate-200 font-mono" x-text="contract.warranty_start_date?.substring(0, 10) || '-'"></span>
|
||||
<span class="text-slate-400 font-bold">~</span>
|
||||
<span class="text-sm font-black text-slate-800 dark:text-white font-mono" x-text="contract.warranty_end_date?.substring(0, 10) || '-'"></span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="p-4 bg-indigo-50/40 dark:bg-indigo-500/5 rounded-2xl border border-indigo-100/50 dark:border-indigo-500/10">
|
||||
<p class="text-[10px] font-black text-indigo-600 uppercase tracking-widest mb-2">{{ __('Software Service') }}</p>
|
||||
<div class="flex items-center gap-2">
|
||||
<span class="text-sm font-black text-slate-700 dark:text-slate-200 font-mono" x-text="contract.software_start_date?.substring(0, 10) || '-'"></span>
|
||||
<span class="text-slate-400 font-bold">~</span>
|
||||
<span class="text-sm font-black text-slate-800 dark:text-white font-mono" x-text="contract.software_end_date?.substring(0, 10) || '-'"></span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
<!-- Note -->
|
||||
<div class="pt-2 border-t border-slate-100/50 dark:border-slate-800/50" x-show="contract.note">
|
||||
<p class="text-[9px] font-bold text-slate-400 italic" x-text="contract.note"></p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<div x-show="!(detailCompany.contracts || []).length" class="py-12 text-center">
|
||||
<div class="size-14 rounded-2xl bg-slate-50 dark:bg-slate-800/50 flex items-center justify-center mx-auto mb-3 border border-slate-100 dark:border-slate-800">
|
||||
<svg class="size-7 text-slate-300" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="M12 6.042A8.967 8.967 0 006 3.75c-1.052 0-2.062.18-3 .512v14.25A8.987 8.987 0 016 18c2.305 0 4.408.867 6 2.292m0-14.25a8.966 8.966 0 016-2.292c1.052 0 2.062.18 3 .512v14.25A8.987 8.987 0 0018 18c-2.305 0-4.408.867-6 2.292m0-14.25v14.25" /></svg>
|
||||
</div>
|
||||
<p class="text-xs font-black text-slate-400 uppercase tracking-[0.2em]">{{ __('No history records') }}</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Footer -->
|
||||
@@ -815,7 +1029,7 @@
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
</div>
|
||||
|
||||
<style>
|
||||
|
||||
Reference in New Issue
Block a user