|
|
@@ -1,37 +1,42 @@
|
|
|
<script setup lang="ts">
|
|
|
import CalendarDate from '@/components/DateRange/src/components/CalendarDate.vue'
|
|
|
-import AutoSelect from '@/components/AutoSelect/src/AutoSelect.vue'
|
|
|
import NewbookingTable from './components/NewbookingTable.vue'
|
|
|
import AddNewAddress from './images/default_add_address@2x.png'
|
|
|
import NotAvailable from './images/default_destination_not_available@2x.png'
|
|
|
import NotShipment from './images/default_no_shipment@2x.png'
|
|
|
import submitsucessful from './images/icon_success_big@2x.png'
|
|
|
import { useUserStore } from '@/stores/modules/user'
|
|
|
-import { useRouter } from 'vue-router'
|
|
|
+import { useRouter, useRoute } from 'vue-router'
|
|
|
+import { ElMessage } from 'element-plus'
|
|
|
+import dayjs from 'dayjs'
|
|
|
|
|
|
const userStore = useUserStore()
|
|
|
const router = useRouter()
|
|
|
-const { currentRoute } = router
|
|
|
-const { value } = currentRoute
|
|
|
-const { query } = value
|
|
|
-const { a } = query
|
|
|
+const route = useRoute()
|
|
|
+const a = route.query.a
|
|
|
|
|
|
const CreateNewBOokingSearch = ref('')
|
|
|
const status = ref('')
|
|
|
const booking = ref('')
|
|
|
-const DateValue = ref('')
|
|
|
+const DateValue = ref(
|
|
|
+ route.query.date && dayjs(route.query.date as string).isValid()
|
|
|
+ ? dayjs(route.query.date as string).format('YYYY.MM.DD')
|
|
|
+ : ''
|
|
|
+)
|
|
|
const DeliveryTime = ref('')
|
|
|
const bookingTableRef = ref()
|
|
|
-const VesselName = ref([])
|
|
|
const VesselNametest = ref('')
|
|
|
const ShipperValue = ref('')
|
|
|
const ConsigneeValue = ref('')
|
|
|
+const deliveryDate = ref('')
|
|
|
+const DeliveryReference = ref('')
|
|
|
const getAddressListData = ref({})
|
|
|
// const isFocused = ref(false)
|
|
|
const isFocused = ref({
|
|
|
Shipper: false,
|
|
|
Consignee: false,
|
|
|
- Vessel: false
|
|
|
+ Vessel: false,
|
|
|
+ deliveryDate: false
|
|
|
})
|
|
|
const isataFocused = ref(false)
|
|
|
const isetaFocused = ref(false)
|
|
|
@@ -49,18 +54,15 @@ const recommendateWarning = ref('')
|
|
|
const ATATimeList = ref(null)
|
|
|
const ETATimeList = ref(null)
|
|
|
const Addressradio = ref()
|
|
|
-const LocationName = ref('')
|
|
|
const AddressLine1 = ref('')
|
|
|
const AddressLine2 = ref('')
|
|
|
const AddressLine3 = ref('')
|
|
|
const AddressLine4 = ref('')
|
|
|
const CountryCode = ref('')
|
|
|
const CityCode = ref('')
|
|
|
-const CountryCity = ref('')
|
|
|
const PostalCode = ref('')
|
|
|
const ContactPerson = ref('')
|
|
|
const ContactNumber = ref('')
|
|
|
-const instructions = ref('')
|
|
|
const modetypeValue = ref('Truck')
|
|
|
const Requirements = ref('')
|
|
|
const Modification = ref()
|
|
|
@@ -196,10 +198,6 @@ const showETAlabel = computed(() => {
|
|
|
return ETATimeList.value != null || isetaFocused.value
|
|
|
})
|
|
|
|
|
|
-const changeFocus = (val: boolean) => {
|
|
|
- // isFocused.value = val
|
|
|
-}
|
|
|
-
|
|
|
const changeFocustest = (type: any, val: boolean) => {
|
|
|
isFocused.value[type] = val
|
|
|
}
|
|
|
@@ -215,63 +213,56 @@ interface CountryItem {
|
|
|
value: string
|
|
|
label: string
|
|
|
}
|
|
|
-const countrys = ref<CountryItem[]>([])
|
|
|
const Countryoptions = ref<CountryItem[]>([])
|
|
|
const Countryloading = ref(false)
|
|
|
-const city = ref<CountryItem[]>([])
|
|
|
const Cityoptions = ref<CountryItem[]>([])
|
|
|
const cityloading = ref(false)
|
|
|
-const getAddressCountryCityData = (type: any) => {
|
|
|
- $api
|
|
|
- .getAddressCountryCityData({
|
|
|
- term: '',
|
|
|
- term_type: type,
|
|
|
- limit: type == 'country' ? CityCode.value : CountryCode.value
|
|
|
- })
|
|
|
- .then((res: any) => {
|
|
|
- if (res.code === 200) {
|
|
|
- if (type == 'country') {
|
|
|
- countrys.value = res.data
|
|
|
- } else {
|
|
|
- city.value = res.data
|
|
|
- }
|
|
|
- }
|
|
|
- })
|
|
|
-}
|
|
|
const querySearchCountry = (query: string) => {
|
|
|
- if (query) {
|
|
|
- Countryloading.value = true
|
|
|
- setTimeout(() => {
|
|
|
- Countryloading.value = false
|
|
|
- Countryoptions.value = countrys.value.filter((item) => {
|
|
|
- return item.label.toLowerCase().includes(query.toLowerCase())
|
|
|
+ Countryloading.value = true
|
|
|
+ setTimeout(() => {
|
|
|
+ $api
|
|
|
+ .getAddressCountryCityData({
|
|
|
+ term: query,
|
|
|
+ term_type: 'country',
|
|
|
+ limit: CityCode.value != '' ? CityCode.value : ''
|
|
|
})
|
|
|
- }, 1000)
|
|
|
- } else {
|
|
|
- Countryoptions.value = []
|
|
|
- }
|
|
|
+ .then((res: any) => {
|
|
|
+ if (res.code === 200) {
|
|
|
+ Countryoptions.value = res.data
|
|
|
+ Countryloading.value = false
|
|
|
+ }
|
|
|
+ })
|
|
|
+ }, 1000)
|
|
|
}
|
|
|
const querySearchCity = (query: string) => {
|
|
|
- if (query) {
|
|
|
- cityloading.value = true
|
|
|
- setTimeout(() => {
|
|
|
- cityloading.value = false
|
|
|
- Cityoptions.value = city.value.filter((item) => {
|
|
|
- return item.label.toLowerCase().includes(query.toLowerCase())
|
|
|
+ cityloading.value = true
|
|
|
+ setTimeout(() => {
|
|
|
+ $api
|
|
|
+ .getAddressCountryCityData({
|
|
|
+ term: query,
|
|
|
+ term_type: 'city',
|
|
|
+ limit: CountryCode.value != '' ? CountryCode.value : ''
|
|
|
})
|
|
|
- }, 1000)
|
|
|
- } else {
|
|
|
- Cityoptions.value = []
|
|
|
- }
|
|
|
+ .then((res: any) => {
|
|
|
+ if (res.code === 200) {
|
|
|
+ Cityoptions.value = res.data
|
|
|
+ cityloading.value = false
|
|
|
+ }
|
|
|
+ })
|
|
|
+ }, 1000)
|
|
|
}
|
|
|
// 特殊日期样式
|
|
|
const getCurrentStyle = (current: any) => {
|
|
|
const dateString = current.format('YYYY.MM.DD')
|
|
|
if (specialDates.value != undefined && specialDates.value.includes(dateString)) {
|
|
|
return {
|
|
|
- background: '#b3e5d4',
|
|
|
+ background: 'var(--color-delivery-date-picker-cell-bg)',
|
|
|
borderRadius: '6px',
|
|
|
- color: `var(--color-neutral-1)`
|
|
|
+ color: `var(--color-neutral-1)`,
|
|
|
+ margin: 'auto',
|
|
|
+ width: '32px',
|
|
|
+ height: '32px',
|
|
|
+ lineHeight: '33px'
|
|
|
}
|
|
|
}
|
|
|
// 默认样式
|
|
|
@@ -317,15 +308,15 @@ const AddNewAddressDelivery = () => {
|
|
|
// 保存新地址
|
|
|
const SaveNewAddress = () => {
|
|
|
if (
|
|
|
- AddressLine1.value != '' ||
|
|
|
- AddressLine2.value != '' ||
|
|
|
- AddressLine3.value != '' ||
|
|
|
- (AddressLine4.value != '' &&
|
|
|
- CountryCode.value != '' &&
|
|
|
+ (CountryCode.value != '' &&
|
|
|
CityCode.value != '' &&
|
|
|
PostalCode.value != '' &&
|
|
|
ContactPerson.value != '' &&
|
|
|
- ContactNumber.value != '')
|
|
|
+ ContactNumber.value != '' &&
|
|
|
+ AddressLine1.value != '') ||
|
|
|
+ AddressLine2.value != '' ||
|
|
|
+ AddressLine3.value != '' ||
|
|
|
+ AddressLine4.value != ''
|
|
|
) {
|
|
|
const addressData = {
|
|
|
address_1: AddressLine1.value,
|
|
|
@@ -368,20 +359,25 @@ const SaveNewAddress = () => {
|
|
|
}
|
|
|
AddNewAddressVisible.value = false
|
|
|
currentEditAddress.value = null
|
|
|
+ } else {
|
|
|
+ ElMessage({
|
|
|
+ message: 'Required fields not entered.',
|
|
|
+ type: 'warning'
|
|
|
+ })
|
|
|
}
|
|
|
}
|
|
|
// 点击按钮
|
|
|
const handleclickbutton = (val: any) => {
|
|
|
- Requirements.value = Requirements.value + val
|
|
|
+ Requirements.value = Requirements.value ? Requirements.value + ', ' + val : val
|
|
|
}
|
|
|
let delivery_address = ''
|
|
|
const changeAddressRadio = () => {
|
|
|
ManageVisible.value = false
|
|
|
if (Addressradio.value != undefined) {
|
|
|
isselectedAddress.value = Addressradio.value
|
|
|
+ selectedAddressList.value = ManageAddressList.value[Addressradio.value]
|
|
|
+ delivery_address = `${selectedAddressList.value.contact_person}(${selectedAddressList.value.contact_number})\n${selectedAddressList.value.address_1}\n${selectedAddressList.value.address_2}\n${selectedAddressList.value.address_3}\n${selectedAddressList.value.address_4},${selectedAddressList.value.country},${selectedAddressList.value.city},${selectedAddressList.value.postal_code}`
|
|
|
}
|
|
|
- selectedAddressList.value = ManageAddressList.value[Addressradio.value]
|
|
|
- delivery_address = `${selectedAddressList.value.contact_person}(${selectedAddressList.value.contact_number})\n${selectedAddressList.value.address_1}\n${selectedAddressList.value.address_2}\n${selectedAddressList.value.address_3}\n${selectedAddressList.value.address_4},${selectedAddressList.value.country},${selectedAddressList.value.city},${selectedAddressList.value.postal_code}`
|
|
|
}
|
|
|
// 页面初始化
|
|
|
let checkShipments = []
|
|
|
@@ -390,6 +386,7 @@ let checkShipmentsdata = []
|
|
|
let checkShipmentsInfo = {}
|
|
|
let checkShipmentsSubmitInfoData = {}
|
|
|
const getInitBookingData = () => {
|
|
|
+ bookingTableRef.value.tableLoadingTable = true
|
|
|
$api
|
|
|
.InitCreateBooking({
|
|
|
serial_no: a != undefined ? a : ''
|
|
|
@@ -411,6 +408,7 @@ const getInitBookingData = () => {
|
|
|
DeliveryTime.value = res.data.data.delivery_time
|
|
|
Modification.value = res.data.data.modify_reason
|
|
|
selectedAddressList.value = res.data.data.delivery_address_detail
|
|
|
+ DeliveryReference.value = res.data.data.delivery_reference
|
|
|
isselectedAddress.value = ''
|
|
|
const sync_key = res.data.data.delivery_address_detail.sync_key
|
|
|
checkShipments = res.data.data.tableData.map((item) => ({
|
|
|
@@ -457,6 +455,12 @@ const getInitBookingData = () => {
|
|
|
}
|
|
|
}
|
|
|
})
|
|
|
+ .finally(() => {
|
|
|
+ bookingTableRef.value.tableLoadingTable = false
|
|
|
+ })
|
|
|
+}
|
|
|
+const clearManageDialog = () => {
|
|
|
+ ManageAddressList.value = []
|
|
|
}
|
|
|
// 查询Shipments
|
|
|
const SearchShipment = () => {
|
|
|
@@ -465,6 +469,7 @@ const SearchShipment = () => {
|
|
|
vessel: VesselNametest.value,
|
|
|
consignee: ConsigneeValue.value,
|
|
|
shipper: ShipperValue.value,
|
|
|
+ recommended_delivery_date: deliveryDate.value,
|
|
|
eta_start: ETATimeList.value != null ? ETATimeList.value[0] : '',
|
|
|
eta_end: ETATimeList.value != null ? ETATimeList.value[1] : '',
|
|
|
ata_start: ATATimeList.value != null ? ATATimeList.value[0] : '',
|
|
|
@@ -522,6 +527,7 @@ const getDateRangeArray = (startDateStr, endDateStr) => {
|
|
|
}
|
|
|
}
|
|
|
const selectChangeEvent = (val: any, date: any, submitInfo: any) => {
|
|
|
+ ManageAddressList.value = []
|
|
|
getAddressListData.value = { ...val }
|
|
|
checkShipmentsSubmitInfo.value = { ...submitInfo }
|
|
|
if (date.length != 0) {
|
|
|
@@ -534,6 +540,7 @@ const selectChangeEvent = (val: any, date: any, submitInfo: any) => {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+const manageLoading = ref(false)
|
|
|
// 点击 Address Book
|
|
|
const handleClickAddress = () => {
|
|
|
if (!isAddNewAddressVisible.value) {
|
|
|
@@ -543,6 +550,7 @@ const handleClickAddress = () => {
|
|
|
(item) => item.contact_type !== 'Delete'
|
|
|
)
|
|
|
if (a == undefined) {
|
|
|
+ manageLoading.value = true
|
|
|
$api
|
|
|
.getAddressBookList({
|
|
|
...getAddressListData.value
|
|
|
@@ -556,11 +564,20 @@ const handleClickAddress = () => {
|
|
|
ManageVisible.value = true
|
|
|
}
|
|
|
})
|
|
|
+ .finally(() => {
|
|
|
+ manageLoading.value = false
|
|
|
+ })
|
|
|
}
|
|
|
}
|
|
|
|
|
|
//选择日期
|
|
|
const changeDatePicker = (val: any) => {
|
|
|
+ if (val === null) {
|
|
|
+ isRecommendDate.value = false
|
|
|
+ recommendateWarning.value = ''
|
|
|
+ isConsistent.value = false
|
|
|
+ return
|
|
|
+ }
|
|
|
if (specialDates.value.length != 0) {
|
|
|
if (isConsistent.value) {
|
|
|
isRecommendDate.value = true
|
|
|
@@ -616,7 +633,6 @@ const handleClickEditAddress = (val: any) => {
|
|
|
// 删除地址
|
|
|
const handleDeleteAddress = (val: any) => {
|
|
|
const key = val.contact_type == 'Unedit' ? 'sync_key' : 'id'
|
|
|
- console.log(val.contact_type)
|
|
|
if (val.contact_type !== 'Add') {
|
|
|
updateAddressList({ ...val, contact_type: 'Delete' })
|
|
|
}
|
|
|
@@ -670,6 +686,7 @@ const SubmitBooking = () => {
|
|
|
...checkShipmentsSubmitInfoData,
|
|
|
delivery_time: DeliveryTime.value,
|
|
|
delivery_mode: modetypeValue.value,
|
|
|
+ delivery_reference: DeliveryReference.value,
|
|
|
delivery_date: datetwo,
|
|
|
delivery_address: delivery_address,
|
|
|
special_requirements: Requirements.value,
|
|
|
@@ -689,6 +706,12 @@ const SubmitBooking = () => {
|
|
|
})
|
|
|
}
|
|
|
|
|
|
+const ctnsCount = computed(() => {
|
|
|
+ return bookingTableRef.value?.getTableCheckedRows().reduce((total, row) => {
|
|
|
+ return total + (Number(row.pakages) || 0)
|
|
|
+ }, 0)
|
|
|
+})
|
|
|
+
|
|
|
onMounted(() => {
|
|
|
getInitBookingData()
|
|
|
})
|
|
|
@@ -700,6 +723,15 @@ onMounted(() => {
|
|
|
<div v-if="a == undefined">Create New Booking</div>
|
|
|
<div v-else>Modify Booking</div>
|
|
|
<div class="flex">
|
|
|
+ <div class="select-info">
|
|
|
+ <span style="color: var(--color-neutral-2)">Selected: </span>
|
|
|
+ <span
|
|
|
+ >{{ bookingTableRef?.getTableCheckedRows().length }} Shipments|{{
|
|
|
+ ctnsCount
|
|
|
+ }}
|
|
|
+ ctns</span
|
|
|
+ >
|
|
|
+ </div>
|
|
|
<el-button @click="CancelRulesVisible = true" class="el-button--default create-button"
|
|
|
><span class="font_family icon-icon_return_b"></span> Cancel</el-button
|
|
|
>
|
|
|
@@ -719,32 +751,29 @@ onMounted(() => {
|
|
|
</div>
|
|
|
<el-divider v-if="a != undefined" style="margin: 8px 0" />
|
|
|
<!-- Select Shipments -->
|
|
|
+ <div class="Delivery" style="font-weight: bold">
|
|
|
+ <span class="serial-number">1</span>
|
|
|
+ <span class="stars_red">*</span>Select Shipments<span class="title_warning"
|
|
|
+ >*Please select items with the same consignee.</span
|
|
|
+ >
|
|
|
+ </div>
|
|
|
<div class="select_shipments">
|
|
|
<div v-if="isNotSameConfiguration" class="alertIndormation">
|
|
|
Please select same consignee with same delivery information
|
|
|
</div>
|
|
|
- <div style="margin-bottom: 16px; font-weight: bold">
|
|
|
- <span class="stars_red">*</span>Select Shipments<span class="title_warning"
|
|
|
- >*Please select items with the same consignee.</span
|
|
|
- >
|
|
|
- </div>
|
|
|
+
|
|
|
<div class="shipments_search" v-if="a == undefined">
|
|
|
- <div class="flex">
|
|
|
+ <div class="top-filter-search">
|
|
|
<el-input
|
|
|
placeholder="Enter Booking/HBL/PO/Carrier Booking No. "
|
|
|
v-model="CreateNewBOokingSearch"
|
|
|
- style="width: 34%"
|
|
|
class="log_input"
|
|
|
>
|
|
|
<template #prefix>
|
|
|
- <span class="iconfont_icon">
|
|
|
- <svg class="iconfont icon_search" aria-hidden="true">
|
|
|
- <use xlink:href="#icon-icon_search_b"></use>
|
|
|
- </svg>
|
|
|
- </span>
|
|
|
+ <span class="font_family icon-icon_search_b"></span>
|
|
|
</template>
|
|
|
</el-input>
|
|
|
- <div class="input-with-label" style="margin: 0 8px">
|
|
|
+ <div class="input-with-label">
|
|
|
<!-- <AutoSelect ASPlaceholder="Input Vessel Name" :ASValue="VesselName" @changeFocus="changeFocus"></AutoSelect> -->
|
|
|
<el-input
|
|
|
placeholder="Shipper"
|
|
|
@@ -756,7 +785,7 @@ onMounted(() => {
|
|
|
</el-input>
|
|
|
<span v-if="showLabelShipper" class="border-label">Shipper</span>
|
|
|
</div>
|
|
|
- <div class="input-with-label" style="margin-right: 8px">
|
|
|
+ <div class="input-with-label">
|
|
|
<!-- <AutoSelect ASPlaceholder="Input Vessel Name" :ASValue="VesselName" @changeFocus="changeFocus"></AutoSelect> -->
|
|
|
<el-input
|
|
|
placeholder="Consignee"
|
|
|
@@ -768,14 +797,7 @@ onMounted(() => {
|
|
|
</el-input>
|
|
|
<span v-if="showLabelConsignee" class="border-label">Consignee</span>
|
|
|
</div>
|
|
|
- <el-button
|
|
|
- style="width: 108px"
|
|
|
- class="el-button--dark create-button"
|
|
|
- @click="SearchShipment"
|
|
|
- >Search</el-button
|
|
|
- >
|
|
|
- </div>
|
|
|
- <div class="flex" style="margin-top: 8px">
|
|
|
+
|
|
|
<div class="input-with-label">
|
|
|
<CalendarDate
|
|
|
:isNeedFooter="false"
|
|
|
@@ -786,7 +808,7 @@ onMounted(() => {
|
|
|
></CalendarDate>
|
|
|
<span v-if="showETAlabel" class="border-label">ETA</span>
|
|
|
</div>
|
|
|
- <div class="input-with-label" style="margin: 0 8px">
|
|
|
+ <div class="input-with-label">
|
|
|
<CalendarDate
|
|
|
:isNeedFooter="false"
|
|
|
CalendarWidth="100%"
|
|
|
@@ -795,7 +817,26 @@ onMounted(() => {
|
|
|
></CalendarDate>
|
|
|
<span v-if="showataLabel" class="border-label">ATA</span>
|
|
|
</div>
|
|
|
- <div class="input-with-label" style="margin-right: 8px">
|
|
|
+
|
|
|
+ <div class="input-with-label">
|
|
|
+ <!-- <AutoSelect ASPlaceholder="Input Vessel Name" :ASValue="VesselName" @changeFocus="changeFocus"></AutoSelect> -->
|
|
|
+ <a-date-picker
|
|
|
+ v-model:value="deliveryDate"
|
|
|
+ :showToday="false"
|
|
|
+ @focus="isFocused.deliveryDate = true"
|
|
|
+ @blur="isFocused.deliveryDate = false"
|
|
|
+ :format="userStore.dateFormat"
|
|
|
+ placeholder="Recommended Delivery Date"
|
|
|
+ valueFormat="MM/DD/YYYY"
|
|
|
+ style="width: 100%; height: 40px"
|
|
|
+ >
|
|
|
+ </a-date-picker>
|
|
|
+ <span v-if="isFocused.deliveryDate" class="border-label"
|
|
|
+ >Recommended Delivery Date</span
|
|
|
+ >
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <div class="input-with-label">
|
|
|
<!-- <AutoSelect ASPlaceholder="Input Vessel Name" :ASValue="VesselName" @changeFocus="changeFocus"></AutoSelect> -->
|
|
|
<el-input
|
|
|
placeholder="Input Vessel Name"
|
|
|
@@ -803,11 +844,19 @@ onMounted(() => {
|
|
|
@focus="changeFocustest('Vessel', true)"
|
|
|
@blur="changeFocustest('Vessel', false)"
|
|
|
class="log_input"
|
|
|
+ style="width: 100%"
|
|
|
>
|
|
|
</el-input>
|
|
|
<span v-if="showLabelVessel" class="border-label">Vessel Name</span>
|
|
|
</div>
|
|
|
- <div style="width: 108px"></div>
|
|
|
+ <div class="right-btn">
|
|
|
+ <el-button
|
|
|
+ style="width: 108px"
|
|
|
+ class="el-button--dark create-button"
|
|
|
+ @click="SearchShipment"
|
|
|
+ >Search</el-button
|
|
|
+ >
|
|
|
+ </div>
|
|
|
</div>
|
|
|
</div>
|
|
|
<NewbookingTable
|
|
|
@@ -816,7 +865,10 @@ onMounted(() => {
|
|
|
></NewbookingTable>
|
|
|
</div>
|
|
|
<!-- Delivery Information -->
|
|
|
- <div class="Delivery">Delivery Information</div>
|
|
|
+ <div class="Delivery">
|
|
|
+ <span class="serial-number">2</span>
|
|
|
+ <span>Delivery Information</span>
|
|
|
+ </div>
|
|
|
<div class="delivery_address">
|
|
|
<div class="deliverty_flex">
|
|
|
<div><span class="stars_red">*</span>Delivery Address</div>
|
|
|
@@ -907,8 +959,9 @@ onMounted(() => {
|
|
|
:showToday="false"
|
|
|
style="width: 240px"
|
|
|
:format="userStore.dateFormat"
|
|
|
- placeholder="Please Select Date"
|
|
|
valueFormat="YYYY.MM.DD"
|
|
|
+ placeholder="Please Select Date"
|
|
|
+ class="delivery-date-picker"
|
|
|
>
|
|
|
<template #renderExtraFooter>
|
|
|
<div class="recommended">
|
|
|
@@ -936,6 +989,17 @@ onMounted(() => {
|
|
|
placeholder="Please Select Time"
|
|
|
></el-time-select>
|
|
|
</div>
|
|
|
+ <div style="margin-left: 12px">
|
|
|
+ <div class="delivery_type_title">Delivery Reference</div>
|
|
|
+ <el-tooltip
|
|
|
+ class="item"
|
|
|
+ effect="dark"
|
|
|
+ content="Reference to be quoted on arrival at the Warehouse/DC"
|
|
|
+ placement="bottom"
|
|
|
+ >
|
|
|
+ <el-input v-model="DeliveryReference" class="delivery_reference"></el-input>
|
|
|
+ </el-tooltip>
|
|
|
+ </div>
|
|
|
</div>
|
|
|
<div class="delivery_type_title">Special Requirements</div>
|
|
|
<div class="flex" style="margin-top: 8px">
|
|
|
@@ -985,51 +1049,71 @@ onMounted(() => {
|
|
|
:rows="4"
|
|
|
></el-input>
|
|
|
</div>
|
|
|
- <el-dialog v-model="ManageVisible" width="640" class="ManageDialog" :show-close="false">
|
|
|
- <div class="manage_empty_address" v-if="ManageAddressList.length == 0">
|
|
|
- <img :src="AddNewAddress" width="48" style="margin-bottom: 8px" />
|
|
|
- <el-button
|
|
|
- :disabled="isNotClickAddress"
|
|
|
- class="el-button--main"
|
|
|
- @click="AddNewAddressDelivery"
|
|
|
- >
|
|
|
- + Add New Address</el-button
|
|
|
- >
|
|
|
- </div>
|
|
|
- <el-radio-group v-model="Addressradio">
|
|
|
- <el-radio v-for="(item, index) in ManageAddressList" :key="index" :value="index">
|
|
|
- <div class="addressradio">
|
|
|
- <div class="radio_top">
|
|
|
- <div class="radio_title">{{ item.contact_person }}({{ item.contact_number }})</div>
|
|
|
- <div v-if="item.create_user == 'Online_D_Address'">
|
|
|
- <el-button @click="handleClickEditAddress(item)" class="el-button--blue"
|
|
|
- ><span class="font_family icon-icon_edit_b"></span
|
|
|
- ></el-button>
|
|
|
- <el-button @click="handleDeleteAddress(item)" class="el-button--blue"
|
|
|
- ><span class="font_family icon-icon_delete_b"></span
|
|
|
- ></el-button>
|
|
|
- </div>
|
|
|
- </div>
|
|
|
- <div class="radio_content">
|
|
|
- <div v-if="item.address_1 != null && item.address_1 != ''" class="radio_content_text">
|
|
|
- {{ item.address_1 }}
|
|
|
- </div>
|
|
|
- <div v-if="item.address_2 != null && item.address_2 != ''" class="radio_content_text">
|
|
|
- {{ item.address_2 }}
|
|
|
- </div>
|
|
|
- <div v-if="item.address_3 != null && item.address_3 != ''" class="radio_content_text">
|
|
|
- {{ item.address_3 }}
|
|
|
- </div>
|
|
|
- <div v-if="item.address_4 != null && item.address_4 != ''" class="radio_content_text">
|
|
|
- {{ item.address_4 }}
|
|
|
+ <el-dialog
|
|
|
+ @closed="clearManageDialog"
|
|
|
+ v-model="ManageVisible"
|
|
|
+ width="640"
|
|
|
+ class="ManageDialog"
|
|
|
+ :show-close="false"
|
|
|
+ >
|
|
|
+ <div v-vloading="manageLoading">
|
|
|
+ <div class="manage_empty_address" v-if="ManageAddressList.length == 0">
|
|
|
+ <img :src="AddNewAddress" width="48" style="margin-bottom: 8px" />
|
|
|
+ <el-button
|
|
|
+ :disabled="isNotClickAddress"
|
|
|
+ class="el-button--main"
|
|
|
+ @click="AddNewAddressDelivery"
|
|
|
+ >
|
|
|
+ + Add New Address</el-button
|
|
|
+ >
|
|
|
+ </div>
|
|
|
+ <el-radio-group v-model="Addressradio" style="max-height: 50vh; overflow: auto">
|
|
|
+ <el-radio v-for="(item, index) in ManageAddressList" :key="index" :value="index">
|
|
|
+ <div class="addressradio">
|
|
|
+ <div class="radio_top">
|
|
|
+ <div class="radio_title">{{ item.contact_person }}({{ item.contact_number }})</div>
|
|
|
+ <div v-if="item.create_user == 'Online_D_Address'">
|
|
|
+ <el-button @click="handleClickEditAddress(item)" class="el-button--blue"
|
|
|
+ ><span class="font_family icon-icon_edit_b"></span
|
|
|
+ ></el-button>
|
|
|
+ <el-button @click="handleDeleteAddress(item)" class="el-button--blue"
|
|
|
+ ><span class="font_family icon-icon_delete_b"></span
|
|
|
+ ></el-button>
|
|
|
+ </div>
|
|
|
</div>
|
|
|
- <div class="radio_content_text">
|
|
|
- {{ item.country }},{{ item.city }},{{ item.postal_code }}
|
|
|
+ <div class="radio_content">
|
|
|
+ <div
|
|
|
+ v-if="item.address_1 != null && item.address_1 != ''"
|
|
|
+ class="radio_content_text"
|
|
|
+ >
|
|
|
+ {{ item.address_1 }}
|
|
|
+ </div>
|
|
|
+ <div
|
|
|
+ v-if="item.address_2 != null && item.address_2 != ''"
|
|
|
+ class="radio_content_text"
|
|
|
+ >
|
|
|
+ {{ item.address_2 }}
|
|
|
+ </div>
|
|
|
+ <div
|
|
|
+ v-if="item.address_3 != null && item.address_3 != ''"
|
|
|
+ class="radio_content_text"
|
|
|
+ >
|
|
|
+ {{ item.address_3 }}
|
|
|
+ </div>
|
|
|
+ <div
|
|
|
+ v-if="item.address_4 != null && item.address_4 != ''"
|
|
|
+ class="radio_content_text"
|
|
|
+ >
|
|
|
+ {{ item.address_4 }}
|
|
|
+ </div>
|
|
|
+ <div class="radio_content_text">
|
|
|
+ {{ item.country }},{{ item.city }},{{ item.postal_code }}
|
|
|
+ </div>
|
|
|
</div>
|
|
|
</div>
|
|
|
- </div>
|
|
|
- </el-radio>
|
|
|
- </el-radio-group>
|
|
|
+ </el-radio>
|
|
|
+ </el-radio-group>
|
|
|
+ </div>
|
|
|
<template #header>
|
|
|
<div class="my-header">
|
|
|
<div class="header_Title">Manage Address</div>
|
|
|
@@ -1148,7 +1232,6 @@ onMounted(() => {
|
|
|
v-model="CountryCode"
|
|
|
filterable
|
|
|
remote
|
|
|
- @focus="getAddressCountryCityData('country')"
|
|
|
placeholder="Select Country"
|
|
|
:remote-method="querySearchCountry"
|
|
|
:loading="Countryloading"
|
|
|
@@ -1168,7 +1251,6 @@ onMounted(() => {
|
|
|
v-model="CityCode"
|
|
|
filterable
|
|
|
remote
|
|
|
- @focus="getAddressCountryCityData('city')"
|
|
|
placeholder="Select City"
|
|
|
:remote-method="querySearchCity"
|
|
|
:loading="cityloading"
|
|
|
@@ -1289,12 +1371,8 @@ onMounted(() => {
|
|
|
</div>
|
|
|
</template>
|
|
|
<template #header>
|
|
|
- <div class="cancel_header">
|
|
|
- <span class="iconfont_icon">
|
|
|
- <svg class="iconfont icon_danger" aria-hidden="true">
|
|
|
- <use xlink:href="#icon-icon_fail_fill_b"></use>
|
|
|
- </svg>
|
|
|
- </span>
|
|
|
+ <div class="unable-save-header dialog-header">
|
|
|
+ <span class="font_family icon-icon_fail_fill_b"></span>
|
|
|
Unable to Save
|
|
|
</div>
|
|
|
</template>
|
|
|
@@ -1314,12 +1392,8 @@ onMounted(() => {
|
|
|
</div>
|
|
|
</template>
|
|
|
<template #header>
|
|
|
- <div class="cancel_header">
|
|
|
- <span class="iconfont_icon iconfont_warning">
|
|
|
- <svg class="iconfont icon_warning" aria-hidden="true">
|
|
|
- <use xlink:href="#icon-icon_tipsfilled_b"></use>
|
|
|
- </svg>
|
|
|
- </span>
|
|
|
+ <div class="warning-header dialog-header">
|
|
|
+ <span class="font_family icon-icon_fail_fill_b"></span>
|
|
|
Unsaved Changes
|
|
|
</div>
|
|
|
</template>
|
|
|
@@ -1345,12 +1419,8 @@ onMounted(() => {
|
|
|
</div>
|
|
|
</template>
|
|
|
<template #header>
|
|
|
- <div class="cancel_header">
|
|
|
- <span class="iconfont_icon">
|
|
|
- <svg class="iconfont iconfont_warning" aria-hidden="true">
|
|
|
- <use xlink:href="#icon-icon_tipsfilled_b"></use>
|
|
|
- </svg>
|
|
|
- </span>
|
|
|
+ <div class="warning-header dialog-header">
|
|
|
+ <span class="font_family icon-icon_warning_fill_b"></span>
|
|
|
Additional Fees Notice
|
|
|
</div>
|
|
|
</template>
|
|
|
@@ -1376,6 +1446,10 @@ onMounted(() => {
|
|
|
background-color: var(--color-mode);
|
|
|
box-sizing: border-box;
|
|
|
}
|
|
|
+.select-info {
|
|
|
+ font-size: 14px;
|
|
|
+ line-height: 40px;
|
|
|
+}
|
|
|
.flex {
|
|
|
display: flex;
|
|
|
}
|
|
|
@@ -1394,7 +1468,7 @@ onMounted(() => {
|
|
|
}
|
|
|
.select_shipments {
|
|
|
border: 1px solid var(--color-border);
|
|
|
- margin: 16px 24px 12px 24px;
|
|
|
+ margin: 10px 24px 12px 24px;
|
|
|
padding: 9px 16px 16px 16px;
|
|
|
border-radius: 12px;
|
|
|
position: relative;
|
|
|
@@ -1426,7 +1500,14 @@ onMounted(() => {
|
|
|
font-weight: 400;
|
|
|
}
|
|
|
.shipments_search {
|
|
|
- margin: 0 0 8px 0;
|
|
|
+ display: flex;
|
|
|
+ margin-bottom: 16px;
|
|
|
+}
|
|
|
+.top-filter-search {
|
|
|
+ flex: 1;
|
|
|
+ display: grid;
|
|
|
+ grid-template-columns: repeat(4, 1fr);
|
|
|
+ grid-gap: 8px;
|
|
|
}
|
|
|
:deep(.log_input .el-input__wrapper) {
|
|
|
box-shadow: 0 0 0 1px var(--color-select-border) inset;
|
|
|
@@ -1434,14 +1515,12 @@ onMounted(() => {
|
|
|
}
|
|
|
.input-with-label {
|
|
|
position: relative;
|
|
|
- display: inline-block;
|
|
|
- width: 34%;
|
|
|
}
|
|
|
.border-label {
|
|
|
position: absolute;
|
|
|
top: -7px;
|
|
|
left: 10px;
|
|
|
- background: white; /* 用背景色覆盖边框 */
|
|
|
+ background: var(--color-mode); /* 用背景色覆盖边框 */
|
|
|
padding: 0 5px;
|
|
|
font-size: 12px;
|
|
|
color: var(--color-neutral-2);
|
|
|
@@ -1455,9 +1534,22 @@ onMounted(() => {
|
|
|
height: 40px;
|
|
|
}
|
|
|
.Delivery {
|
|
|
+ display: flex;
|
|
|
+ align-items: center;
|
|
|
font-size: 18px;
|
|
|
font-weight: 700;
|
|
|
- margin: 11px 0 14px 24px;
|
|
|
+ line-height: 24px;
|
|
|
+ margin: 24px 0 10px 24px;
|
|
|
+ .serial-number {
|
|
|
+ width: 24px;
|
|
|
+ height: 24px;
|
|
|
+ margin-right: 4px;
|
|
|
+ background-color: var(--color-theme);
|
|
|
+ text-align: center;
|
|
|
+ color: #fff;
|
|
|
+ font-size: 14px;
|
|
|
+ border-radius: 50%;
|
|
|
+ }
|
|
|
}
|
|
|
.empty_address {
|
|
|
height: 122px;
|
|
|
@@ -1486,7 +1578,7 @@ onMounted(() => {
|
|
|
margin-bottom: 4px;
|
|
|
}
|
|
|
.recommended {
|
|
|
- background: #f5f7fa;
|
|
|
+ background: var(--color-personal-preference-bg);
|
|
|
border-bottom: 1px solid var(--color-border);
|
|
|
height: 24px;
|
|
|
display: flex;
|
|
|
@@ -1548,7 +1640,7 @@ onMounted(() => {
|
|
|
font-size: 18px;
|
|
|
}
|
|
|
.addressradio {
|
|
|
- background-color: #f8f9fd;
|
|
|
+ background-color: var(--color-prompt-diaolog-bg);
|
|
|
border-radius: 12px;
|
|
|
padding: 13px 8px 16px 16px;
|
|
|
}
|
|
|
@@ -1599,6 +1691,12 @@ onMounted(() => {
|
|
|
:deep(.el-input__wrapper) {
|
|
|
height: 40px;
|
|
|
}
|
|
|
+.delivery_reference {
|
|
|
+ width: 240px;
|
|
|
+ :deep(.el-input__wrapper) {
|
|
|
+ height: 32px;
|
|
|
+ }
|
|
|
+}
|
|
|
.inputmargin {
|
|
|
margin: 4px 0 16px 0;
|
|
|
}
|
|
|
@@ -1688,4 +1786,29 @@ onMounted(() => {
|
|
|
:deep(header.el-dialog__header) {
|
|
|
background-color: var(--color-system-body-bg);
|
|
|
}
|
|
|
+.dialog-header {
|
|
|
+ display: flex;
|
|
|
+ align-items: center;
|
|
|
+ .font_family {
|
|
|
+ font-size: 14px;
|
|
|
+ width: 16px;
|
|
|
+ height: 16px;
|
|
|
+ border-radius: 24px;
|
|
|
+ margin-right: 4px;
|
|
|
+ }
|
|
|
+}
|
|
|
+.unable-save-header .font_family {
|
|
|
+ color: #b53039;
|
|
|
+}
|
|
|
+
|
|
|
+div.warning-header .font_family {
|
|
|
+ color: #e9b227;
|
|
|
+}
|
|
|
+</style>
|
|
|
+<style lang="scss">
|
|
|
+.ant-picker-dropdown .ant-picker-cell .ant-picker-cell-inner {
|
|
|
+ height: 32px;
|
|
|
+ width: 32px;
|
|
|
+ margin: 0 auto;
|
|
|
+}
|
|
|
</style>
|