@@ -2,10 +2,11 @@
import { computed , nextTick , onBeforeUnmount , onMounted , reactive , ref , watch } from 'vue'
import { useRoute , useRouter } from 'vue-router'
import { ElMessage , ElMessageBox , type FormInstance , type FormItemRule , type FormRules , type UploadRequestOptions } from 'element-plus'
import { AlertTriangle , Box , ChevronDown , ChevronUp , Download , Eye , FilePlus2 , FileText , GripVertical , ImagePlus , MapPin , PackageCheck , Pencil , Plus , RotateCcw , Send , SlidersHorizontal , Trash2 , Upload } from '@lucide/vue'
import { AlertTriangle , Box , ChevronDown , ChevronUp , Download , FilePlus2 , FileText , GripVertical , ImagePlus , MapPin , PackageCheck , Pencil , Plus , RotateCcw , Send , SlidersHorizontal , Trash2 , Upload } from '@lucide/vue'
import { FIRST _LEG _ORDER _STATUSES , type FirstLegOrderStatus } from '@chongchong/shared'
import QueryToolbar , { type QueryField , type QueryModel } from '@/components/common/QueryToolbar.vue'
import DataTable , { type DataTableColumn } from '@/components/common/DataTable.vue'
import type { TableAction } from '@/components/common/tableActions'
import { ApiError } from '@/api/http'
import FirstLegOrderEditorShell from '@/modules/first-leg/components/FirstLegOrderEditorShell.vue'
import InboundBillingPanel from '@/modules/first-leg/components/InboundBillingPanel.vue'
@@ -110,11 +111,12 @@ const batchImportResult = ref<MerchantBatchImportResponse | null>(null)
const batchImportError = ref ( '' )
const fixedOrderColumns : DataTableColumn [ ] = [
{ key : 'selection' , type : 'selection' , width : 48 , fixed : 'left' , reserveSelection : true } ,
{ key : 'actions' , label : '操作' , width : 216 , fixed : 'left' , align : 'center ' , headerAlign : 'center ' , slotName : 'actions' } ,
{ key : 'order' , label : '订单号' , width : 190 , fixed : 'left' , align : 'left' , headerAlign : 'left' , showOverflowTooltip : true , slotName : 'order' } ,
{ key : 'actions' , label : '操作' , width : 284 , fixed : 'left' , align : 'left ' , headerAlign : 'left ' , slotName : 'actions' } ,
{ key : 'order' , label : '订单号' , width : 240 , fixed : 'left' , align : 'left' , headerAlign : 'left' , showOverflowTooltip : true , slotName : 'order' } ,
]
const selectableOrderColumns : DataTableColumn [ ] = [
{ key : 'inboundCode' , label : '入仓码' , width : 176 , align : 'left' , headerAlign : 'left' , showOverflowTooltip : true , slotName : 'inboundCode' } ,
{ key : 'inboundCode' , label : '入仓码' , width : 230 , align : 'left' , headerAlign : 'left' , showOverflowTooltip : true , slotName : 'inboundCode' } ,
{ key : 'status' , label : '当前订单状态' , width : 126 , align : 'center' , headerAlign : 'center' , slotName : 'status' } ,
{ key : 'channel' , label : '渠道' , width : 150 , align : 'left' , headerAlign : 'left' , showOverflowTooltip : true , slotName : 'channel' } ,
{ key : 'transportMode' , label : '运输方式' , width : 104 , align : 'center' , headerAlign : 'center' , slotName : 'transportMode' } ,
{ key : 'pickupMethod' , label : '交货方式' , width : 112 , align : 'center' , headerAlign : 'center' , slotName : 'pickupMethod' } ,
@@ -122,7 +124,6 @@ const selectableOrderColumns: DataTableColumn[] = [
{ key : 'receivingWarehouse' , label : '国内收货仓' , width : 150 , align : 'left' , headerAlign : 'left' , showOverflowTooltip : true , slotName : 'receivingWarehouse' } ,
{ key : 'destinationWarehouse' , label : '目的仓' , width : 120 , align : 'left' , headerAlign : 'left' , showOverflowTooltip : true , slotName : 'destinationWarehouse' } ,
{ key : 'destinationType' , label : '目的仓类型' , width : 112 , align : 'center' , headerAlign : 'center' , slotName : 'destinationType' } ,
{ key : 'status' , label : '当前订单状态' , width : 126 , align : 'center' , headerAlign : 'center' , slotName : 'status' } ,
{ key : 'packageCount' , label : '箱数' , width : 82 , align : 'center' , headerAlign : 'center' , slotName : 'packageCount' } ,
{ key : 'expressCompany' , label : '快递公司' , width : 128 , align : 'left' , headerAlign : 'left' , showOverflowTooltip : true , slotName : 'expressCompany' } ,
{ key : 'trackingNumber' , label : '快递单号' , width : 158 , align : 'left' , headerAlign : 'left' , showOverflowTooltip : true , slotName : 'trackingNumber' } ,
@@ -1157,6 +1158,23 @@ async function autofillWarehouseSelections() {
markEditorClean ( )
}
function getOrderRowActions ( row : object ) : TableAction [ ] {
const order = row as FirstLegOrder
const actions : TableAction [ ] = [
{ key : 'detail' , label : '详情' , run : ( ) => openDetail ( order ) } ,
]
if ( canConfirmInboundFee . value && order . businessSummary . customerFeeConfirmationRequired ) {
actions . push ( { key : 'fee' , label : '确认计费重' , run : ( ) => openFeeConfirmation ( order ) } )
}
if ( canEditOrder . value && canClientEditFirstLegOrder ( order . status ) ) {
actions . push ( { key : 'edit' , label : '编辑' , loading : openingEditor . value , run : ( ) => openEdit ( order ) } )
}
if ( eligibleCustomsDetail ( order ) ) {
actions . push ( { key : 'customs' , label : '报关资料' , run : ( ) => openCustomsDocuments ( order ) } )
}
return actions
}
async function openCreate ( ) {
if ( availableWarehouses . value . length === 0 ) {
ElMessage . warning ( supportingDataLoading . value
@@ -1860,14 +1878,14 @@ async function searchOrders(model: QueryModel) {
< / script >
< template >
< section class = "first-leg-page" : class = "{ 'is-create-route': isCreatePage }" >
< section class = "first-leg-page" : class = "{ 'is-create-route': isCreatePage, 'client-ui': !isCreatePage }" >
< template v-if = "!isCreatePage" >
< QueryToolbar v-model = "filters" class="first-leg-query-toolbar" :fields="queryFields" ariaLabel="订单查询" @search="searchOrders" / >
< QueryToolbar v-model = "filters" class="first-leg-query-toolbar" layout="grid" :fields="queryFields" ariaLabel="订单查询" @search="searchOrders" / >
< div class = "client-card order-table-card" >
< div class = "order-table-toolbar" >
< div > < strong > 订单列表 < / strong > < span > 共 { { filteredOrders . length } } 条 < / span > < / div >
< div class = "order-table-toolbar-actions" >
< DataTable v -model :page = "tablePage" v -model :page-size = "tablePageSize" :data = "pagedOrders" :columns = "visibleOrderColumns" :key = "orderTableVersion" :loading = "store.loading" :total = "filteredOrders.length" : page -sizes = " [ 10 , 20 , 50 ] " row -key = " id " empty -text = " 暂无订单 " class = "prototype-order-table" :row-actions = "getOrderRowActions" @ selection -change = " handleOrderSelectionChange " >
< template # toolbar > < strong > 订单列表 < / strong > < span > 共 { { filteredOrders . length } } 条 < / span > < span v-if = "selectedOrderCount" > 已选 {{ selectedOrderCount }} 条 < / span > < / template >
< template # toolbar -actions >
< el-popover placement = "bottom-end" :width = "320" trigger = "click" popper -class = " order -column -popper " >
< template # reference >
< el-button class = "column-settings-trigger" aria -label = " 设置订单列表显示列 " title = "设置显示列" > < SlidersHorizontal :size = "18" / > < / el-button >
@@ -1899,8 +1917,9 @@ async function searchOrders(model: QueryModel) {
< el-button v-if = "canSubmitOrder" :loading="batchSubmitting" :disabled="selectedDraftOrders.length === 0 || companySubmissionBlocked" @click="submitSelectedDraftOrders"><Send :size="17" / > 批量提交草稿 < / el-button >
< el-button v-if = "auth.hasPermission('order:first-leg:create')" @click="openBatchImport"><Upload :size="17" / > 批量导入订单 < / el-button >
< el-button v-if = "auth.hasPermission('order:first-leg:create')" type="primary" :loading="pageDataLoading" :disabled="pageDataLoading || availableWarehouses.length === 0" @click="openCreate"><FilePlus2 :size="17" / > 创建订单 < / el-button >
< / div >
< / div >
< / template >
< template # before -table >
< div v-if = "companySubmissionBlocked && !supportingDataErrors.some((message) => message.startsWith('企业资料'))" class="order-eligibility is-pending" role="status" >
< AlertTriangle :size = "20" / >
< div > < strong > { { canCreateOrder ? '企业资料待审核,当前仅可保存订单草稿' : '企业资料待审核,当前订单为只读' } } < / strong > < span > { { canCreateOrder ? '平台审核通过后即可提交;您仍可创建、编辑和保存草稿。' : '您当前拥有只读权限,可以继续查看订单进展。' } } < / span > < / div >
@@ -1911,21 +1930,15 @@ async function searchOrders(model: QueryModel) {
< div > < strong > 部分订单配套数据加载失败 < / strong > < span v-for = "message in supportingDataErrors" :key="message" > {{ message }} < / span > < / div >
< el -button : loading = "supportingDataLoading || store.loading" @click ="loadPageData" > 重新加载 < / el -button >
< / div >
< div v-if = "store.loadError" class="order-load-state" role="alert" >
< / template >
< template v-if = "store.loadError" # error >
< div class = "order-load-state" role = "alert" >
< AlertTriangle :size = "24" / >
< div > < strong > 订单数据加载失败 < / strong > < span > { { store . loadError } } < / span > < / div >
< el-button :loading = "store.loading" @click ="loadPageData" > 重新加载 < / el -button >
< / div >
< template v-else >
< div class = "desktop-order-table" >
< DataTable v -model :page = "tablePage" v -model :page-size = "tablePageSize" :data = "pagedOrders" :columns = "visibleOrderColumns" :key = "orderTableVersion" :loading = "store.loading" :total = "filteredOrders.length" : page -sizes = " [ 10 , 20 , 50 ] " row -key = " id " empty -text = " 暂无订单 " class = "prototype-order-table" @ selection -change = " handleOrderSelectionChange " >
< template # actions = "{ row }" >
< div class = "order-row-actions" >
< el-button link type = "primary" @click ="openDetail(row as FirstLegOrder)" > < Eye :size = "15" / > 详情 < / el-button >
< el-button v-if = "canConfirmInboundFee && (row as FirstLegOrder).businessSummary.customerFeeConfirmationRequired" link type="primary" @click="openFeeConfirmation(row as FirstLegOrder)" > 确认计费重 < / el -button >
< el-button v-if = "canEditOrder && canClientEditFirstLegOrder((row as FirstLegOrder).status)" link type="primary" :loading="openingEditor" @click="openEdit(row as FirstLegOrder)"><Pencil :size="15" / > 编辑 < / el-button >
< el-button v-if = "eligibleCustomsDetail(row as FirstLegOrder)" link type="primary" @click="openCustomsDocuments(row as FirstLegOrder)"><FileText :size="15" / > 报关资料 < / el-button >
< / div >
< / template >
< template # order = "{ row }" >
< button class = "order-number-link table-code" type = "button" : title = "(row as FirstLegOrder).orderNo || '—'" @click ="openDetail(row as FirstLegOrder)" > {{ ( row as FirstLegOrder ) .orderNo | | ' — ' }} < / button >
@@ -1947,7 +1960,7 @@ async function searchOrders(model: QueryModel) {
< template # receivingWarehouse = "{ row }" > < span class = "table-ellipsis" : title = "displayListValue((row as FirstLegOrder).receivingWarehouseName)" > { { displayListValue ( ( row as FirstLegOrder ) . receivingWarehouseName ) } } < / span > < / template >
< template # destinationWarehouse = "{ row }" > < span class = "table-ellipsis" : title = "displayListValue((row as FirstLegOrder).destinationWarehouseName)" > { { displayListValue ( ( row as FirstLegOrder ) . destinationWarehouseName ) } } < / span > < / template >
< template # destinationType = "{ row }" > { { destinationTypeLabels [ ( row as FirstLegOrder ) . destinationType ] } } < / template >
< template # status = "{ row }" > < el-tag : type = "getFirstLegStatusTone((row as FirstLegOrder). status) " effect = "light" > { { getFirstLegStatusLabel ( ( row as FirstLegOrder ) . status ) } } < / el-tag > < / template >
< template # status = "{ row }" > < span class = "client- status" : data -tone = " getFirstLegStatusTone ( ( row as FirstLegOrder ) .status ) " > { { getFirstLegStatusLabel ( ( row as FirstLegOrder ) . status ) } } < / span > < / template >
< template # packageCount = "{ row }" > { { formatListMetric ( orderPackageCount ( row as FirstLegOrder ) ) } } < / template >
< template # expressCompany = "{ row }" > < span class = "table-ellipsis" : title = "displayListValue((row as FirstLegOrder).expressCompanyName)" > { { displayListValue ( ( row as FirstLegOrder ) . expressCompanyName ) } } < / span > < / template >
< template # trackingNumber = "{ row }" > < span class = "table-ellipsis table-code" : title = "displayListValue((row as FirstLegOrder).trackingNumber)" > { { displayListValue ( ( row as FirstLegOrder ) . trackingNumber ) } } < / span > < / template >
@@ -1975,8 +1988,7 @@ async function searchOrders(model: QueryModel) {
< / el-empty >
< / template >
< / DataTable >
< / div >
< div v-loading = "store.loading" class="mobile-order-surface" >
< div v-if = "!store.loadError" v-loading="store.loading" class="mobile-order-surface" >
< div v-if = "filteredOrders.length" class="mobile-order-list" >
< article v-for = "order in filteredOrders" :key="order.id" class="mobile-order-card" >
< header > < button type = "button" @click ="openDetail(order)" > {{ order.orderNo | | ' — ' }} < / button > < el -tag :type = "getFirstLegStatusTone(order.status)" effect = "light" > { { getFirstLegStatusLabel ( order . status ) } } < / el-tag > < / header >
@@ -1987,10 +1999,10 @@ async function searchOrders(model: QueryModel) {
< footer >
< span > 更新于 { { formatDateTime ( order . updatedAt ) } } < / span >
< div >
< el-button link type = "primary" @click ="openDetail(order)" > < Eye :size = "15" / > 详情 < / el-button >
< el-button link type = "primary" @click ="openDetail(order)" > 详情 < / el -button >
< el-button v-if = "canConfirmInboundFee && order.businessSummary.customerFeeConfirmationRequired" link type="primary" @click="openFeeConfirmation(order)" > 确认计费重 < / el -button >
< el-button v-if = "canEditOrder && canClientEditFirstLegOrder(order.status)" link type="primary" :loading="openingEditor" @click="openEdit(order)"><Pencil :size="15" / > 编辑 < / el-button >
< el-button v-if = "eligibleCustomsDetail(order)" link type="primary" @click="openCustomsDocuments(order)"><FileText :size="15" / > 报关资料 < / el-button >
< el-button v-if = "canEditOrder && canClientEditFirstLegOrder(order.status)" link type="primary" :loading="openingEditor" @click="openEdit(order)" > 编辑 < / el -button >
< el-button v-if = "eligibleCustomsDetail(order)" link type="primary" @click="openCustomsDocuments(order)" > 报关资料 < / el -button >
< / div >
< / footer >
< / article >
@@ -1999,7 +2011,6 @@ async function searchOrders(model: QueryModel) {
< el-button v-if = "auth.hasPermission('order:first-leg:create')" type="primary" :loading="pageDataLoading" :disabled="pageDataLoading || availableWarehouses.length === 0" @click="openCreate"><Plus :size="16" / > { { pageDataLoading ? '加载收货仓中' : ( availableWarehouses . length ? '创建第一笔订单' : '暂无可用收货仓' ) } } < / el-button >
< / el-empty >
< / div >
< / template >
< / div >
< / template >
@@ -2040,7 +2051,7 @@ async function searchOrders(model: QueryModel) {
< small v-if = "channelError" class="field-guidance field-guidance--error">渠道加载失败:{{ channelError }} <el-button link type="primary" @click="retryPricingChannels" > 重试 < / el -button > < / small >
< small v-else-if = "form.receivingWarehouseId && !channelLoading && channelOptions.length === 0" class="field-guidance" > 当前收货仓暂无可用渠道 , 请联系平台管理员 。 < / small >
< / el -form -item >
< el-form-item label = "报价包税方式" prop = "pricingTaxMode" required >
< el-form-item label = "报价包税方式" prop = "pricingTaxMode" required class = "pricing-tax-mode-field" >
< el-radio-group v-model = "form.pricingTaxMode"><el-radio v-for="mode in availablePricingTaxModes" :key="mode" :value="mode" > {{ pricingTaxModeLabel ( mode ) }} < / el -radio > < / el-radio-group >
< small v-if = "form.channelCode && availablePricingTaxModes.length === 0" class="field-guidance field-guidance--error" > 当前渠道没有可用报价方式 , 请重新选择渠道 。 < / small >
< / el -form -item >
@@ -2339,17 +2350,9 @@ async function searchOrders(model: QueryModel) {
< / template >
< style scoped >
. first - leg - page { display : flex ; flex - direction : column ; gap : 14 px ; }
. first - leg - page { display : flex ; flex - direction : column ; gap : var ( -- client - section - gap ) ; }
: global ( . client - main : has ( > . first - leg - page : not ( . is - create - route ) ) > . client - page - heading ) { margin - bottom : 0 ; }
: global ( . client - main : has ( > . first - leg - page : not ( . is - create - route ) ) > . client - page - heading > div ) { position : absolute ; width : 1 px ; height : 1 px ; margin : - 1 px ; padding : 0 ; overflow : hidden ; border : 0 ; clip : rect ( 0 0 0 0 ) ; white - space : nowrap ; }
. first - leg - query - toolbar { display : block ; padding : 16 px 18 px 14 px ; border : 0 ; border - radius : 10 px ; background : # fff ; box - shadow : 0 3 px 14 px rgba ( 31 , 48 , 78 , .05 ) ; }
. first - leg - query - toolbar : deep ( . query - toolbar _ _filters ) { display : grid ; min - width : 0 ; grid - template - columns : repeat ( 4 , minmax ( 0 , 1 fr ) ) ; gap : 12 px 18 px ; }
. first - leg - query - toolbar : deep ( . query - toolbar _ _field ) { min - width : 0 ; }
. first - leg - query - toolbar : deep ( . query - toolbar _ _field . el - input ) , . first - leg - query - toolbar : deep ( . query - toolbar _ _field . el - select ) , . first - leg - query - toolbar : deep ( . query - toolbar _ _field . el - date - editor ) { flex : 1 1 auto ; width : 100 % ; }
. first - leg - query - toolbar : deep ( . query - toolbar _ _filters . el - input ) , . first - leg - query - toolbar : deep ( . query - toolbar _ _filters . el - select ) , . first - leg - query - toolbar : deep ( . query - toolbar _ _filters . el - date - editor ) { width : 100 % ; }
. first - leg - query - toolbar : deep ( . query - toolbar _ _actions ) { justify - content : flex - start ; margin - top : 14 px ; padding - top : 12 px ; border - top : 1 px solid # edf0f5 ; }
. first - leg - query - toolbar : deep ( . query - toolbar _ _actions . el - button ) { min - height : 36 px ; margin - left : 0 ; }
. first - leg - query - toolbar : deep ( . query - toolbar _ _actions . query - export - button ) { order : - 1 ; }
. order - eligibility { display : flex ; align - items : flex - start ; gap : 12 px ; padding : 14 px 16 px ; border : 1 px solid ; }
. order - eligibility svg { flex : 0 0 20 px ; margin - top : 1 px ; }
. order - eligibility div { display : flex ; min - width : 0 ; flex : 1 ; flex - direction : column ; gap : 3 px ; }
@@ -2361,13 +2364,7 @@ async function searchOrders(model: QueryModel) {
. supporting - data - error strong { color : var ( -- navy ) ; font - size : 13 px ; }
. supporting - data - error span { overflow - wrap : anywhere ; color : var ( -- muted ) ; font - size : 11 px ; line - height : 1.55 ; }
. order - row - actions , . editor - actions { display : flex ; justify - content : flex - end ; gap : 8 px ; }
. order - table - card { padding : 0 ; overflow : hidden ; }
. order - table - toolbar { display : flex ; min - height : 58 px ; align - items : center ; justify - content : space - between ; gap : 16 px ; padding : 10 px 16 px ; border - bottom : 1 px solid var ( -- border ) ; }
. order - table - toolbar > div { display : flex ; min - width : 0 ; align - items : baseline ; gap : 8 px ; }
. order - table - toolbar strong { color : var ( -- navy ) ; font - size : 14 px ; }
. order - table - toolbar span { color : var ( -- muted ) ; font - size : 11 px ; }
. order - table - toolbar > . order - table - toolbar - actions { align - items : center ; gap : 8 px ; }
. order - table - toolbar - actions : deep ( . el - button + . el - button ) { margin - left : 0 ; }
. order - table - card { padding : 0 ; overflow : hidden ; border : 1 px solid var ( -- client - border ) ; border - radius : var ( -- client - radius ) ; box - shadow : none ; }
. batch - import - dialog { display : flex ; flex - direction : column ; gap : 18 px ; }
. batch - import - actions { display : flex ; min - width : 0 ; align - items : center ; flex - wrap : wrap ; gap : 10 px ; }
. batch - import - actions > span { min - width : 0 ; overflow : hidden ; color : var ( -- muted ) ; font - size : 12 px ; text - overflow : ellipsis ; white - space : nowrap ; }
@@ -2390,17 +2387,6 @@ async function searchOrders(model: QueryModel) {
: global ( . order - column - popper . column - settings - item . el - checkbox . is - checked . el - checkbox _ _label ) { color : var ( -- primary ) ; }
: global ( . order - column - popper . column - settings - item . el - button ) { width : 28 px ; height : 28 px ; padding : 0 ; margin : 0 ; color : # 45556 e ; }
: global ( . order - column - popper . column - settings - reset ) { min - height : 36 px ; margin : 8 px 6 px 0 ; color : # 40516 b ; }
. prototype - order - table { font - size : 11 px ; }
. prototype - order - table : deep ( . el - table ) { color : # 626 b78 ; font - size : 11 px ; }
. prototype - order - table : deep ( . el - table _ _header - wrapper th . el - table _ _cell ) { height : 44 px ; padding : 0 ; background : # fafbfc ; color : # 687386 ; font - size : 11 px ; font - weight : 650 ; vertical - align : middle ; }
. prototype - order - table : deep ( . el - table _ _body - wrapper td . el - table _ _cell ) { height : 50 px ; padding : 0 ; vertical - align : middle ; }
. prototype - order - table : deep ( . el - table . cell ) { min - width : 0 ; padding : 0 12 px ; line - height : 18 px ; white - space : nowrap ; }
. prototype - order - table : deep ( . el - table _ _header - wrapper . cell ) { overflow : visible ; line - height : 16 px ; text - overflow : clip ; }
. prototype - order - table : deep ( . el - table _ _body - wrapper . cell ) { overflow : hidden ; }
. prototype - order - table : deep ( . el - tag ) { height : 24 px ; padding : 0 9 px ; line - height : 22 px ; white - space : nowrap ; }
. prototype - order - table : deep ( . el - table _ _row : nth - child ( even ) td . el - table _ _cell ) { background : # fcfcfd ; }
. prototype - order - table : deep ( . el - table _ _row : hover > td . el - table _ _cell ) { background : # f6f8fc ; }
. prototype - order - table : deep ( . data - table _ _pagination ) { min - height : 54 px ; padding : 10 px 16 px ; }
. table - ellipsis , . table - multivalue { display : block ; width : 100 % ; min - width : 0 ; overflow : hidden ; text - overflow : ellipsis ; white - space : nowrap ; }
. table - code { font - variant - numeric : tabular - nums ; letter - spacing : 0 ; }
. order - table - card > . order - eligibility , . order - table - card > . supporting - data - error { border - width : 0 0 1 px ; }
@@ -2418,8 +2404,8 @@ async function searchOrders(model: QueryModel) {
: global ( . first - leg - detail - dialog . el - dialog _ _footer ) { flex : 0 0 auto ; padding : 12 px 22 px ; border - top : 1 px solid var ( -- border ) ; background : # fff ; }
. mobile - order - surface { display : none ; min - height : 220 px ; }
. mobile - order - list { display : none ; }
. order - number - link { display : block ; width : 100 % ; max - width : 100 % ; overflow : hidden ; padding : 0 ; border : 0 ; background : none ; color : var ( -- primary ) ; cursor : pointer ; font - size : 11 px ; font - weight : 700 ; line - height : 18 px ; text - align : left ; text - overflow : ellipsis ; white - space : nowrap ; }
. inbound - code - link { max - width : 100 % ; overflow : hidden ; padding : 0 ; border : 0 ; background : transparent ; color : var ( -- primary ) ; cursor : pointer ; text - align : left ; text - decoration : underline ; text - decoration - color : transparent ; text - underline - offset : 3 px ; text - overflow : ellipsis ; white - space : nowrap ; }
. order - number - link { display : block ; width : 100 % ; max - width : 100 % ; overflow : hidden ; padding : 0 ; border : 0 ; background : none ; color : var ( -- client - action ) ; cursor : pointer ; font - size : var ( -- client - font - size ) ; font - weight : 700 ; line - height : 18 px ; text - align : left ; text - overflow : ellipsis ; white - space : nowrap ; }
. inbound - code - link { max - width : 100 % ; overflow : hidden ; padding : 0 ; border : 0 ; background : transparent ; color : var ( -- client - action ) ; cursor : pointer ; text - align : left ; text - decoration : underline ; text - decoration - color : transparent ; text - underline - offset : 3 px ; text - overflow : ellipsis ; white - space : nowrap ; }
. inbound - code - link : hover , . inbound - code - link : focus - visible { text - decoration - color : currentColor ; }
. inbound - code - link : focus - visible { outline : 2 px solid var ( -- primary ) ; outline - offset : 2 px ; }
. order - number - link : focus - visible { outline : 2 px solid var ( -- primary ) ; outline - offset : 3 px ; }
@@ -2509,7 +2495,7 @@ async function searchOrders(model: QueryModel) {
. shipping - form - flow . prototype - form - row -- tabs { margin - bottom : 12 px ; }
. compact - transport - grid { display : grid ; width : 100 % ; grid - template - columns : 1 fr ; gap : 0 ; margin : 6 px 0 0 ; }
. compact - transport - grid > : deep ( . el - form - item ) { display : grid ; width : 100 % ; grid - template - columns : 114 px minmax ( 0 , 560 px ) ; align - items : start ; margin - bottom : 10 px ; }
. compact - transport - grid > : deep ( . el - form - item : nth - child ( 2 ) ) { display : none ; }
. compact - transport - grid > : deep ( . pricing - tax - mode - field ) { display : none ; }
. compact - transport - grid > : deep ( . el - form - item : nth - child ( 1 ) ) { grid - template - columns : 114 px minmax ( 0 , 360 px ) ; }
. compact - transport - grid > : deep ( . el - form - item : nth - child ( 6 ) ) { grid - template - columns : 114 px minmax ( 0 , 360 px ) ; }
. compact - transport - grid > : deep ( . el - form - item : nth - child ( 7 ) ) { grid - template - columns : 114 px minmax ( 0 , 620 px ) ; margin - top : 2 px ; margin - bottom : 0 ; }
@@ -2643,7 +2629,7 @@ async function searchOrders(model: QueryModel) {
: deep ( . el - timeline - item _ _content > span ) { font - size : 11 px ; }
@ media ( max - width : 1280 px ) {
. first - leg - query - toolbar : deep ( . query - toolbar _ _filters ) { grid - template - columns : repeat ( 2 , minmax ( 0 , 1 fr ) ) ; }
. desktop - order - table { display : none ; }
. prototype - order - table : deep ( > . el - table ) , . prototype - order - table : deep ( > . data - table _ _pagination ) { display : none ; }
. mobile - order - surface { display : block ; }
. mobile - order - list { display : grid ; grid - template - columns : repeat ( 2 , minmax ( 0 , 1 fr ) ) ; gap : 10 px ; padding : 10 px ; }
. mobile - order - card { min - width : 0 ; padding : 14 px ; border : 1 px solid var ( -- border ) ; background : # fff ; }
@@ -2666,9 +2652,6 @@ async function searchOrders(model: QueryModel) {
. first - leg - query - toolbar { padding : 12 px ; }
. first - leg - query - toolbar : deep ( . query - toolbar _ _filters ) { display : flex ; }
: global ( . client - main : has ( > . first - leg - page : not ( . is - create - route ) ) > . client - page - heading ) { margin - bottom : 10 px ; }
. order - table - toolbar { align - items : stretch ; flex - direction : column ; gap : 10 px ; }
. order - table - toolbar > div { justify - content : space - between ; }
. order - table - toolbar . el - button { width : 100 % ; min - height : 40 px ; }
. order - eligibility { flex - wrap : wrap ; }
. order - eligibility . el - button { width : 100 % ; min - height : 44 px ; }
. order - form - grid , . order - detail - grid , . cargo - form - grid , . cargo - form - grid -- basic , . party - detail - grid { grid - template - columns : 1 fr ; }
@@ -2686,7 +2669,7 @@ async function searchOrders(model: QueryModel) {
. segmented - options : deep ( . el - radio - button _ _inner ) { border : 1 px solid var ( -- border ) ; border - radius : 6 px ! important ; box - shadow : none ! important ; }
. warehouse - options { width : 100 % ; gap : 12 px 18 px ; }
. compact - transport - grid > : deep ( . el - form - item ) , . compact - transport - grid > : deep ( . el - form - item : nth - child ( 7 ) ) { display : block ; margin - bottom : 14 px ; }
. compact - transport - grid > : deep ( . el - form - item : nth - child ( 2 ) ) { display : none ; }
. compact - transport - grid > : deep ( . pricing - tax - mode - field ) { display : none ; }
. compact - transport - grid > : deep ( . el - form - item _ _label ) { min - height : auto ; justify - content : flex - start ; padding : 0 0 8 px ; line - height : 1.4 ; }
. cargo - table - toolbar { align - items : stretch ; flex - direction : column ; }
. cargo - import - actions , . cargo - table - actions { flex - wrap : wrap ; }
@@ -2697,7 +2680,7 @@ async function searchOrders(model: QueryModel) {
. price - estimate _ _state . is - error { align - items : flex - start ; flex - direction : column ; }
. form - span - full { grid - column : auto ; }
. editor - actions : deep ( . el - button ) { min - height : 44 px ; }
. desktop - order - table { display : none ; }
. prototype - order - table : deep ( > . el - table ) , . prototype - order - table : deep ( > . data - table _ _pagination ) { display : none ; }
. order - load - state { min - height : 240 px ; grid - template - columns : 1 fr ; justify - items : start ; }
. supporting - data - error { grid - template - columns : auto minmax ( 0 , 1 fr ) ; }
. supporting - data - error . el - button { grid - column : 1 / - 1 ; width : 100 % ; min - height : 44 px ; }