@@ -77,12 +77,10 @@ defineExpose({ selectedDate, mode })
< template >
< section class = "appointment-calendar admin-density" :aria-busy = "loading" >
< div class = "calendar-main" >
< div class = "calendar-controls" role = "group" aria -label = " 参考图层 " > < label > < input v-model = "showArrivals" type="checkbox" @change="updateLayers">显示到港参考</label><label><input v-model="showTrips" type="checkbox" @change="updateLayers" > 显示用车计划 < / label > < / div >
< header class = "calendar-toolbar" >
< div class = "calendar-label" >
< svg width = "22" height = "22" viewBox = "0 0 24 24" fill = "none" aria -hidden = " true " > < rect x = "3" y = "5" width = "18" height = "16" rx = "2" stroke = "currentColor" stroke -width = " 1.8 " / > < path d = "M8 3v4M16 3v4M3 10h18M8 15h3M14 15h3" stroke = "currentColor" stroke -width = " 1.8 " stroke -linecap = " round " / > < / svg >
< strong > 预约日历 < / strong >
< span v-if = "showArrivals" class="legend arrival">船舶到港</span><span class="legend delivery">预约送仓</span><span class="legend pickup">预约提柜</span><span v-if="showTrips" class="legend trip" > 用车计划 < / span >
< / div >
< div class = "calendar-controls" >
< el-button v-if = "canCreate" type="primary" :disabled="loading" @click="emit('create', selectedDate)" > + 新增预约 < / el -button >
@@ -96,6 +94,10 @@ defineExpose({ selectedDate, mode })
< el -button @click ="select(dateKey(new Date()))" > 今天 < / el -button >
< / div >
< / header >
< div class = "calendar-options" >
< div class = "calendar-legend" > < span v-if = "showArrivals" class="legend arrival">船舶到港</span><span class="legend delivery">预约送仓</span><span class="legend pickup">预约提柜</span><span v-if="showTrips" class="legend trip" > 用车计划 < / span > < / div >
< div class = "calendar-layers" role = "group" aria -label = " 参考图层 " > < label > < input v-model = "showArrivals" type="checkbox" @change="updateLayers">显示到港参考</label><label><input v-model="showTrips" type="checkbox" @change="updateLayers" > 显示用车计划 < / label > < / div >
< / div >
< div class = "weekdays" > < span v-for = "day in weekdays" :key="day" > {{ day }} < / span > < / div >
< div v-loading = "loading" class="calendar-grid" :class="{ 'week-grid': mode === 'week' }" >
< button v-for = "date in dates" :key="date" type="button" class="calendar-day"
@@ -118,7 +120,7 @@ defineExpose({ selectedDate, mode })
< article v-for = "event in selectedEvents" :key="event.key" class="detail-event" >
< div class = "event-heading" > < span class = "event-type" :class = "event.type" > { { eventTypeLabels [ event . type ] } } < / span > < span > { { event . time || '—' } } < / span > < / div >
< h3 > { { event . title } } < / h3 > < p v-if = "event.subtitle" class="event-subtitle" > {{ event.subtitle }} < / p >
< dl > < div v-for = "field in event.fields" :key="field.label" > < dt > { { field . label } } < / dt > < dd > { { field . value || '—' } } < / dd > < / div > < / dl >
< dl > < div v-for = "field in event.fields" :key="field.label" :class="{ 'wide-field': ['系统单号', '完整时段', '预约备注'].includes(field.label) }" > < dt > { { field . label } } < / dt > < dd > { { field . value || '—' } } < / dd > < / div > < / dl >
< AppointmentInboundCodes v-if = "event.inboundCodes" :codes="event.inboundCodes" / >
< footer v-if = "event.canEdit || event.canDelete || event.sourcePath" class="density-actions" >
< el -button v-if = "event.sourcePath" class="density-action" :disabled="loading" @click="emit('open', event)" > 查看来源 < / el -button >
@@ -132,12 +134,16 @@ defineExpose({ selectedDate, mode })
< / template >
< style scoped >
. appointment - calendar { display : grid ; align - items : start ; grid - template - columns : minmax ( 0 , 2.5 fr ) minmax ( 320 px , 1 fr ) ; gap : 16 px ; color : # 344054 ; }
. appointment - calendar { display : grid ; align - items : start ; grid - template - columns : minmax ( 0 , 1 fr ) 360 px ; gap : var ( -- admin - space - 5 ) ; color : # 344054 ; }
. calendar - main , . calendar - detail { background : # fff ; border : 1 px solid # e4e9f2 ; border - radius : 10 px ; overflow : hidden ; }
. calendar - toolbar { display : flex ; flex - wrap : wrap ; justify - content : space - between ; align - items : center ; gap : 12 px ; padding : 16 px ; border - bottom : 1 px solid # edf0f6 ; }
. calendar - toolbar { display : flex ; flex - wrap : wrap ; justify - content : space - between ; align - items : center ; gap : var ( -- admin - space - 3 ) ; padding : var ( -- admin - space - 5 ) ; border - bottom : 1 px solid # edf0f6 ; }
. calendar - label , . calendar - controls { display : flex ; align - items : center ; gap : 10 px ; }
. calendar - label > svg { color : # 617 ce9 ; }
. calendar - label > strong { font - size : 16 px ; }
. calendar - label > strong { font - size : var ( -- admin - font - section ) ; }
. calendar - options { display : flex ; align - items : center ; justify - content : space - between ; flex - wrap : wrap ; gap : var ( -- admin - space - 3 ) ; padding : var ( -- admin - space - 3 ) var ( -- admin - space - 5 ) ; border - bottom : 1 px solid var ( -- admin - table - border ) ; }
. calendar - legend , . calendar - layers { display : flex ; align - items : center ; flex - wrap : wrap ; gap : var ( -- admin - space - 5 ) ; }
. calendar - layers label { display : inline - flex ; align - items : center ; gap : var ( -- admin - space - 1 ) ; cursor : pointer ; font - size : var ( -- admin - font - caption ) ; color : var ( -- el - text - color - secondary ) ; }
. calendar - layers input { margin : 0 ; accent - color : var ( -- el - color - primary ) ; }
. legend { font - size : 12 px ; white - space : nowrap ; }
. legend : : before { content : '' ; display : inline - block ; width : 7 px ; height : 7 px ; border - radius : 50 % ; margin - right : 5 px ; background : # 4 b78e8 ; }
. legend . delivery : : before { background : # 27 a87a ; }
@@ -149,16 +155,16 @@ defineExpose({ selectedDate, mode })
. nav - button { border : 1 px solid # dbe3ee ; font - size : 22 px ; }
. calendar - period { font - size : 14 px ; white - space : nowrap ; }
. weekdays , . calendar - grid { display : grid ; grid - template - columns : repeat ( 7 , minmax ( 0 , 1 fr ) ) ; }
. weekdays { text - align : center ; color : # 8491 a5 ; background : # f8faff ; padding : 12 px 14 px ; font - size : 13 px ; }
. calendar - grid { gap : 7 px ; padding : 12 px ; background : # fbfcff ; }
. calendar - day { display : flex ; flex - direction : column ; align - items : stretch ; justify - content : flex - start ; height : 128 px ; min - width : 0 ; padding : 8 px ; border : 1 px solid # e5eaf2 ; border - radius : 8 px ; background : # fff ; text - align : left ; cursor : pointer ; color : inherit ; font : inherit ; overflow : hidden ; }
. weekdays { text - align : center ; color : # 8491 a5 ; background : # f8faff ; padding : var ( -- admin - space - 3 ) var ( -- admin - space - 5 ) ; font - size : var ( -- admin - font - caption ) ; }
. calendar - grid { gap : var ( -- admin - space - 2 ) ; padding : var ( -- admin - space - 3 ) ; background : # fbfcff ; }
. calendar - day { display : flex ; flex - direction : column ; align - items : stretch ; justify - content : flex - start ; height : 112 px ; min - width : 0 ; padding : var ( -- admin - space - 2 ) ; border : 1 px solid # e5eaf2 ; border - radius : 8 px ; background : # fff ; text - align : left ; cursor : pointer ; color : inherit ; font : inherit ; overflow : hidden ; }
. calendar - day . outside { background : # f7f8fa ; color : # 98 a2b3 ; }
. calendar - day : hover { border - color : # bac8ed ; background : # f8faff ; }
. calendar - day . selected { border - color : # 617 ce9 ; background : # f5f7ff ; }
. calendar - day : focus - visible , . nav - button : focus - visible , . view - toggle button : focus - visible { outline : 2 px solid # 4167 d8 ; outline - offset : 2 px ; }
. day - number { display : block ; font - size : 12 px ; font - weight : 600 ; }
. day - events { display : flex ; flex - direction : column ; gap : 3 px ; margin - top : 6 px ; }
. event - chip { display : block ; padding : 3 px 6 px ; line - height : 16 px ; border - radius : 4 px ; overflow : hidden ; text - overflow : ellipsis ; white - space : nowrap ; font - size : 12 px ; }
. day - events { display : flex ; flex - direction : column ; gap : 2 px ; margin - top : var ( -- admin - space - 1 ) ; }
. event - chip { display : block ; padding : 1 px 6 px ; line - height : 16 px ; border - radius : 4 px ; overflow : hidden ; text - overflow : ellipsis ; white - space : nowrap ; font - size : 12 px ; }
. arrival { -- event - bg : # edf3ff ; -- event - fg : # 3765 d4 ; }
. delivery { -- event - bg : # e8f8f1 ; -- event - fg : # 18845 f ; }
. pickup { -- event - bg : # fff4e3 ; -- event - fg : # 995 a10 ; }
@@ -169,17 +175,18 @@ defineExpose({ selectedDate, mode })
. event - more , . empty - day { color : # 667085 ; font - size : 12 px ; }
. week - grid . calendar - day { height : 220 px ; }
. calendar - detail { align - self : start ; }
. calendar - detail > header { padding : 18 px ; border - bottom : 1 px solid # edf0f6 ; }
. calendar - detail > header > strong { font - size : 17 px ; }
. calendar - detail header p { margin : 10 px 0 0 ; font - size : 13 px ; color : # 8491 a5 ; }
. calendar - detail header b { color : # 617 ce9 ; font - size : 17 px ; }
. detail - events { padding : 14 px ; max - height : 650 px ; overflow - y : auto ; }
. detail - event + . detail - event { border - top : 1 px solid # e4e9f2 ; margin - top : 16 px ; padding - top : 16 px ; }
. calendar - detail > header { padding : var ( -- admin - space - 5 ) ; border - bottom : 1 px solid # edf0f6 ; }
. calendar - detail > header > strong { font - size : var ( -- admin - font - title ) ; }
. calendar - detail header p { margin : var ( -- admin - space - 1 ) 0 0 ; font - size : var ( -- admin - font - caption ) ; color : # 8491 a5 ; }
. calendar - detail header b { color : # 617 ce9 ; font - size : var ( -- admin - font - title ) ; }
. detail - events { padding : var ( -- admin - space - 5 ) ; max - height : 660 px ; overflow - y : auto ; }
. detail - event + . detail - event { border - top : 1 px solid # e4e9f2 ; margin - top : var ( -- admin - space - 5 ) ; padding - top : var ( -- admin - space - 5 ) ; }
. event - heading { display : flex ; justify - content : space - between ; align - items : center ; gap : 10 px ; font - size : 12 px ; }
. event - type { padding : 5 px 8 px ; border - radius : 4 px ; font - weight : 600 ; }
. detail - event h3 { font - size : 15 px ; margin : 14 px 0 8 px ; overflow - wrap : anywhere ; }
. detail - event h3 { font - size : var ( -- admin - font - section ) ; margin : var ( -- admin - space - 3 ) 0 ; overflow - wrap : anywhere ; }
. event - subtitle { color : # 667085 ; font - size : 13 px ; overflow - wrap : anywhere ; }
. detail - event dl { display : grid ; grid - template - columns : repeat ( 2 , minmax ( 0 , 1 fr ) ) ; gap : 12 px ; margin : 16 px 0 ; }
. detail - event dl { display : grid ; grid - template - columns : repeat ( 2 , minmax ( 0 , 1 fr ) ) ; gap : var ( -- admin - space - 3 ) var ( -- admin - space - 5 ) ; margin : var ( -- admin - space - 3 ) 0 ; }
. detail - event . wide - field { grid - column : 1 / - 1 ; }
. detail - event dt { font - size : 12 px ; color : # 8491 a5 ; }
. detail - event dd { margin : 4 px 0 0 ; font - size : 13 px ; overflow - wrap : anywhere ; }
. detail - event footer { display : flex ; justify - content : flex - end ; border - top : 1 px solid # edf0f6 ; padding - top : 10 px ; }