bafb8f2d by 杨炀

Merge branch 'dev' of https://code.itechtop.cn/yangyang/dance-pc into dev

2 parents 1227a2db a957eab0
...@@ -237,7 +237,7 @@ async function changeSelectIn() { ...@@ -237,7 +237,7 @@ async function changeSelectIn() {
237 async function changeSelectOut() { 237 async function changeSelectOut() {
238 const res = await booking.getVehicleByCheckIn({ 238 const res = await booking.getVehicleByCheckIn({
239 activityId: route.params.cptId, 239 activityId: route.params.cptId,
240 checkIn: form1.value.checkIn, 240 checkIn: form2.value.checkIn,
241 category: '1' 241 category: '1'
242 }) 242 })
243 form2.value.checkOut = '' 243 form2.value.checkOut = ''
...@@ -273,6 +273,13 @@ async function handleSubmit(v) { ...@@ -273,6 +273,13 @@ async function handleSubmit(v) {
273 // category: v 273 // category: v
274 // }) 274 // })
275 } 275 }
276 const res = await booking.checkOrderPay('1')
277 if (!res.data) {
278 await proxy.$modal.confirm(language == 0 ? '您有未支付的订单,请前往支付!' : 'You have unpaid orders, please proceed to payment!')
279 await router.push({
280 path: '/center/myReservation'
281 })
282 } else {
276 await router.push({ 283 await router.push({
277 name: 'carList', 284 name: 'carList',
278 params: { 285 params: {
...@@ -280,6 +287,7 @@ async function handleSubmit(v) { ...@@ -280,6 +287,7 @@ async function handleSubmit(v) {
280 }, 287 },
281 query: obj 288 query: obj
282 }) 289 })
290 }
283 } 291 }
284 292
285 293
......
...@@ -271,19 +271,26 @@ ...@@ -271,19 +271,26 @@
271 <el-col :span="24">{{ language == 0 ? '备注' : 'Remarks' }}{{ form.remarks }}</el-col> 271 <el-col :span="24">{{ language == 0 ? '备注' : 'Remarks' }}{{ form.remarks }}</el-col>
272 </el-row> 272 </el-row>
273 <el-row v-if="type == 'ticket'" style="width: 100%"> 273 <el-row v-if="type == 'ticket'" style="width: 100%">
274 <el-col :lg="12"> 274 <el-col :lg="8">
275 {{ language == 0 ? '联系人' : 'Contact' }}{{ form.contacts }} 275 {{ language == 0 ? '联系人' : 'Contact' }}{{ form.contacts }}
276 </el-col> 276 </el-col>
277 <el-col :lg="12"> 277 <el-col :lg="8">
278 {{ language == 0 ? '联系方式' : 'Contact' }}{{ form.phone }}
279 </el-col>
280 <el-col :lg="8">
278 {{ language == 0 ? '联系方式' : 'Contact' }}{{ form.phone }} 281 {{ language == 0 ? '联系方式' : 'Contact' }}{{ form.phone }}
279 </el-col> 282 </el-col>
280 <el-row v-for="(v,i) in form.extJson?.orderCustomerList" :key="i" style="width: 100%"> 283 <el-row v-for="(v,i) in form.extJson?.orderCustomerList" :key="i" style="width: 100%">
281 <el-col :lg="12" :md="12" :sm="12" :xs="24"> 284 <el-col :lg="8" :md="8" :sm="12" :xs="24">
282 {{ v.name }} - 285 {{ v.name }} -
283
284 <span class="text-gray">{{ v.idCard }}</span> 286 <span class="text-gray">{{ v.idCard }}</span>
285 </el-col> 287 </el-col>
286 <el-col :lg="12" :md="12" :sm="12" :xs="24" class="text-right"> 288 <el-col :lg="8" :md="8" :sm="12" :xs="24" class="">
289 <span v-if="v.deskNo" class="">{{ language == 0 ? '座位号' : 'Seat Number' }}{{
290 v.deskNo + '-' + v.seatNo
291 }}</span>
292 </el-col>
293 <el-col :lg="8" :md="8" :sm="12" :xs="24" class="text-right">
287 <span v-if="language == 0 " class="text-primary">{{ form.price }}</span> 294 <span v-if="language == 0 " class="text-primary">{{ form.price }}</span>
288 <span v-else>{{ form.priceEn || 0 }}</span> 295 <span v-else>{{ form.priceEn || 0 }}</span>
289 </el-col> 296 </el-col>
......
1 <template> 1 <template>
2 <div> 2 <div>
3 <!-- top --> 3 <!-- top -->
4 <div class="container top"> 4 <div class="container top father">
5 <img :src="fillImgUrl(matchForm.ticketImg)" alt="" class="cover_img"> 5 <img :src="fillImgUrl(matchForm.ticketImg)" alt="" class="cover_img">
6 <div class="info"> 6 <div class="info">
7 <div class="title">{{ matchForm.name }}</div> 7 <div class="title">{{ matchForm.name }}</div>
...@@ -114,6 +114,7 @@ ...@@ -114,6 +114,7 @@
114 > 114 >
115 {{ it.name }} 115 {{ it.name }}
116 </div> 116 </div>
117 <div v-if="remarks" class="remarks">{{ remarks }}</div>
117 </div> 118 </div>
118 </div> 119 </div>
119 120
...@@ -151,15 +152,15 @@ ...@@ -151,15 +152,15 @@
151 {{ triggerLanguage(language, "票型", "Ticket Type") }} : 152 {{ triggerLanguage(language, "票型", "Ticket Type") }} :
152 </div> 153 </div>
153 <div> 154 <div>
154 <span 155 <!-- <span-->
155 v-if="currTick?.images" 156 <!-- v-if="currTick?.images"-->
156 style="color: #493ceb;cursor:pointer;font-weight:600;font-size: 14px" 157 <!-- style="color: #493ceb;cursor:pointer;font-weight:600;font-size: 14px"-->
157 @click="showUrl=currTick.images;show=true" 158 <!-- @click="showUrl=currTick.images;show=true"-->
158 > <span style="color: red;font-size: 18px">*</span> 159 <!-- > <span style="color: red;font-size: 18px">*</span>-->
159 {{ 160 <!-- {{-->
160 language == 0 ? '点击查看区域布局' : 'View Area Layout' 161 <!-- language == 0 ? '点击查看区域布局' : 'View Area Layout'-->
161 }} 162 <!-- }}-->
162 </span> 163 <!-- </span>-->
163 </div> 164 </div>
164 </div> 165 </div>
165 <div class="select_item_box"> 166 <div class="select_item_box">
...@@ -221,7 +222,15 @@ ...@@ -221,7 +222,15 @@
221 </div> 222 </div>
222 223
223 </div> 224 </div>
224 225 <el-image
226 v-if="currTick?.images"
227 :preview-src-list="[fillImgUrl(currTick?.images)]"
228 :src="fillImgUrl(currTick?.images) "
229 class="son"
230 fit="cover"
231 preview-teleported
232 style="width:200px"
233 />
225 </div> 234 </div>
226 </div> 235 </div>
227 236
...@@ -278,6 +287,7 @@ const active = ref(1) ...@@ -278,6 +287,7 @@ const active = ref(1)
278 const props = defineProps({ 287 const props = defineProps({
279 activityId: [String, Number] 288 activityId: [String, Number]
280 }) 289 })
290 const remarks = ref()
281 const timeData = ref() 291 const timeData = ref()
282 const endTime = ref() 292 const endTime = ref()
283 const matchForm = ref({}) 293 const matchForm = ref({})
...@@ -336,6 +346,7 @@ async function getVenueList() { ...@@ -336,6 +346,7 @@ async function getVenueList() {
336 venueList.value = res.rows 346 venueList.value = res.rows
337 currVenue.value = res.rows[0] 347 currVenue.value = res.rows[0]
338 selectForm.value.latsId = res.rows[0]?.id 348 selectForm.value.latsId = res.rows[0]?.id
349 if (venueList.value.length > 0) remarks.value = res.rows[0].remarks
339 await getTicketListType() 350 await getTicketListType()
340 } 351 }
341 352
...@@ -345,10 +356,10 @@ async function getTicketListType() { ...@@ -345,10 +356,10 @@ async function getTicketListType() {
345 tickList.value = res.data 356 tickList.value = res.data
346 selectForm.value.sessionType = Object.keys(res.data)[0] 357 selectForm.value.sessionType = Object.keys(res.data)[0]
347 358
348 currTick.value = tickList.value[selectForm.value.sessionType][0] 359 // currTick.value = tickList.value[selectForm.value.sessionType][0]
349 selectForm.value.latstId = currTick.value?.id 360 // selectForm.value.latstId = currTick.value?.id
350 selectForm.value.price = currTick.value?.price 361 // selectForm.value.price = currTick.value?.price
351 selectForm.value.priceEn = currTick.value?.priceEn 362 // selectForm.value.priceEn = currTick.value?.priceEn
352 } 363 }
353 364
354 function select(v) { 365 function select(v) {
...@@ -371,19 +382,20 @@ function selectVenue(v) { ...@@ -371,19 +382,20 @@ function selectVenue(v) {
371 selectForm.value.id = null 382 selectForm.value.id = null
372 selectForm.value.price = '--' 383 selectForm.value.price = '--'
373 selectForm.value.priceEn = '--' 384 selectForm.value.priceEn = '--'
374 385 remarks.value = v.remarks
375 getTicketListType() 386 getTicketListType()
376 } 387 }
377 388
378 function selectSessionType(key) { 389 function selectSessionType(key) {
379 selectForm.value.sessionType = key 390 selectForm.value.sessionType = key
380 391
381 currTick.value = tickList.value[selectForm.value.sessionType][0] 392 // currTick.value = tickList.value[selectForm.value.sessionType][0]
382 selectForm.value.latstId = currTick.value?.id 393 selectForm.value.latstId = currTick.value?.id
383 selectForm.value.price = currTick.value?.price 394 selectForm.value.price = currTick.value?.price
384 selectForm.value.priceEn = currTick.value?.priceEn 395 selectForm.value.priceEn = currTick.value?.priceEn
385 } 396 }
386 397
398 // 选择票型
387 function selectTick(v) { 399 function selectTick(v) {
388 currTick.value = v 400 currTick.value = v
389 selectForm.value.latstId = v.id 401 selectForm.value.latstId = v.id
...@@ -760,4 +772,20 @@ getmatchData() ...@@ -760,4 +772,20 @@ getmatchData()
760 text-align: center; 772 text-align: center;
761 } 773 }
762 774
775 .father {
776 position: relative;
777 }
778
779 .son {
780 position: absolute;
781 bottom: 30px;
782 right: 50px;
783 }
784
785 .remarks {
786 font-size: 17px;
787 margin-left: 20px;
788 line-height: 40px;
789 color: #2b2f3a;
790 }
763 </style> 791 </style>
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
2 <div> 2 <div>
3 <!-- top --> 3 <!-- top -->
4 <div class="container top"> 4 <div class="container top">
5 <img :src="fillImgUrl(travel.cover)" alt="" class="cover_img" st> 5 <img :src="fillImgUrl(travel.cover)" alt="" class="cover_img">
6 <div class="info"> 6 <div class="info">
7 <div class="title">{{ travel.name }}</div> 7 <div class="title">{{ travel.name }}</div>
8 <div class="select_item_box"> 8 <div class="select_item_box">
...@@ -30,10 +30,10 @@ ...@@ -30,10 +30,10 @@
30 <br> 30 <br>
31 <div v-for="v in ticketList" v-show="v.leftNum!=0" :key="v.id"> 31 <div v-for="v in ticketList" v-show="v.leftNum!=0" :key="v.id">
32 <div class="select_item_box"> 32 <div class="select_item_box">
33 <div class="label ticket"> 33 <div class="ticket ticket-row">
34 <span class="label">
34 {{ v.name }} : 35 {{ v.name }} :
35 </div> 36 </span>
36 <div class="rowBox">
37 <span class="titleTick"> 37 <span class="titleTick">
38 {{ 38 {{
39 triggerLanguage(language, v.price, v.priceEn) 39 triggerLanguage(language, v.price, v.priceEn)
...@@ -42,11 +42,17 @@ ...@@ -42,11 +42,17 @@
42 triggerLanguage(language, '¥/人', '€/person') 42 triggerLanguage(language, '¥/人', '€/person')
43 }} 43 }}
44 </span> 44 </span>
45 </div>
46 <div class="rowBox">
47
48 <span>
45 <el-input-number 49 <el-input-number
46 v-model="v.count" :max="v.leftNum" :min="0" :precision="0" class="inputNumber" 50 v-model="v.count" :max="v.leftNum" :min="0" :precision="0" class="inputNumber"
47 @change="countTotal" 51 @change="countTotal"
48 /> 52 />
49 <i class="residue">{{ language == 0 ? '剩余票数' : 'Remaining votes' }}{{ v.leftNum }}</i> 53 <i class="residue">{{ language == 0 ? '剩余票数' : 'Remaining votes' }}{{ v.leftNum }}</i>
54 </span>
55
50 </div> 56 </div>
51 </div> 57 </div>
52 </div> 58 </div>
...@@ -79,14 +85,18 @@ ...@@ -79,14 +85,18 @@
79 </div> 85 </div>
80 86
81 <div 87 <div
82 v-if="endTime<=0" class="btn" style="margin-left: 40px;opacity: 0.5;cursor: not-allowed;margin-top: 10px" 88 v-if="endTime<=0" class="btn"
89 style="margin-left: 40px;opacity: 0.5;cursor: not-allowed;margin-top: 10px"
83 @click="toSelectClosed" 90 @click="toSelectClosed"
84 > 91 >
85 {{ 92 {{
86 triggerLanguage(language, "售票结束", "Sale closed") 93 triggerLanguage(language, "售票结束", "Sale closed")
87 }} 94 }}
88 </div> 95 </div>
89 <div v-else class="btn" style="margin-left: 40px;margin-top: 10px" @click="toSelectSeat()"> 96 <div
97 v-else v-show="travel?.dateList?.length>0" class="btn" style="margin-left: 40px;margin-top: 10px"
98 @click="toSelectSeat()"
99 >
90 {{ 100 {{
91 triggerLanguage(language, "立即购票", "Buy tickets now") 101 triggerLanguage(language, "立即购票", "Buy tickets now")
92 }} 102 }}
...@@ -202,8 +212,8 @@ function countTotal() { ...@@ -202,8 +212,8 @@ function countTotal() {
202 })] 212 })]
203 } 213 }
204 } 214 }
205 selectForm.value.price = price 215 selectForm.value.price = price?.toFixed(2)
206 selectForm.value.priceEn = priceEn 216 selectForm.value.priceEn = priceEn?.toFixed(2)
207 } 217 }
208 218
209 async function toSelectSeat() { 219 async function toSelectSeat() {
...@@ -348,11 +358,14 @@ function toSelectClosed() { ...@@ -348,11 +358,14 @@ function toSelectClosed() {
348 .ticket { 358 .ticket {
349 height: 40px; 359 height: 40px;
350 line-height: 40px; 360 line-height: 40px;
351 width: 100px; 361 width: 320px;
352 } 362 }
353 363
354 .rowBox { 364 .ticket-row {
355 display: flex; 365 display: flex;
366 justify-content: space-between;
367 align-items: center;
368 }
356 369
357 .titleTick { 370 .titleTick {
358 color: #493ceb; 371 color: #493ceb;
...@@ -362,10 +375,13 @@ function toSelectClosed() { ...@@ -362,10 +375,13 @@ function toSelectClosed() {
362 margin-right: 30px; 375 margin-right: 30px;
363 height: 40px; 376 height: 40px;
364 line-height: 40px; 377 line-height: 40px;
365 width: 180px;
366 //text-align: center;
367 } 378 }
368 379
380
381 .rowBox {
382 display: flex;
383
384
369 .inputNumber { 385 .inputNumber {
370 height: 35px; 386 height: 35px;
371 margin: 2.5px; 387 margin: 2.5px;
......
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
8 <!-- <el-button class="fr" type="primary" plain @click="toInvoice">{{ language==0?'发票开具':'Invoice' }}</el-button>--> 8 <!-- <el-button class="fr" type="primary" plain @click="toInvoice">{{ language==0?'发票开具':'Invoice' }}</el-button>-->
9 <!-- <el-button class="fr" type="primary" plain @click="toInvoice">{{ language==0?'我的发票':'My Invoice' }}</el-button>--> 9 <!-- <el-button class="fr" type="primary" plain @click="toInvoice">{{ language==0?'我的发票':'My Invoice' }}</el-button>-->
10 </div> 10 </div>
11 <el-empty v-if="list?.length == 0" :image="`/img/order_no.png`" :image-size="228"/> 11 <el-empty v-if="list?.length == 0" :image="`/img/order_no.png`" :image-size="228" />
12 12
13 <div class="pd20"> 13 <div class="pd20">
14 <div v-for="b in list" class="item"> 14 <div v-for="b in list" class="item">
...@@ -28,8 +28,10 @@ ...@@ -28,8 +28,10 @@
28 <span v-if="b.status == '0'&&b.surplus!='0,0'&&b.surplus!='0'" class="bg-warning"> 28 <span v-if="b.status == '0'&&b.surplus!='0,0'&&b.surplus!='0'" class="bg-warning">
29 {{ language == 0 ? '待支付' : 'Unpaid' }} 29 {{ language == 0 ? '待支付' : 'Unpaid' }}
30 </span> 30 </span>
31 <span v-if="b.status == '0'&&(b.surplus=='0,0'||b.surplus=='0')" 31 <span
32 class="bg-warning">{{ language == 0 ? '已取消' : 'Canceled' }}</span> 32 v-if="b.status == '0'&&(b.surplus=='0,0'||b.surplus=='0')"
33 class="bg-warning"
34 >{{ language == 0 ? '已取消' : 'Canceled' }}</span>
33 <span v-if="b.status == '1'" class="bg-blue">{{ language == 0 ? '支付成功' : 'successful' }}</span> 35 <span v-if="b.status == '1'" class="bg-blue">{{ language == 0 ? '支付成功' : 'successful' }}</span>
34 <span v-if="b.status == '2'" class="bg-warning">{{ language == 0 ? '已取消' : 'Canceled' }}</span> 36 <span v-if="b.status == '2'" class="bg-warning">{{ language == 0 ? '已取消' : 'Canceled' }}</span>
35 <span v-if="b.status == '3'||b.status == '4'" class="bg-danger">{{ 37 <span v-if="b.status == '3'||b.status == '4'" class="bg-danger">{{
...@@ -84,9 +86,13 @@ ...@@ -84,9 +86,13 @@
84 <p v-if="b.extJsonObj.ticketDate.name"> 86 <p v-if="b.extJsonObj.ticketDate.name">
85 {{ b.extJsonObj.ticketDate.name }} 87 {{ b.extJsonObj.ticketDate.name }}
86 </p> 88 </p>
87 <p>{{ b.extJsonObj.atName }}{{ b.extJsonObj.atsName }}{{ b.extJsonObj.atstName }}</p> 89 <p>{{ b.extJsonObj.atName }}{{ b.extJsonObj.atsName }}
88 <p v-for="p in b.extJsonObj?.orderCustomerList"> 90 {{
89 <el-tag class="mr10" v-if="p.deskNo">{{p.deskNo}}-{{p.seatNo}}</el-tag> 91 b.extJsonObj.sessionType == '1000' ? language == 0 ? '日间场' : 'Day' : language == 0 ? '夜间场' : 'Night'
92 }} |
93 {{ b.extJsonObj.atstName }}</p>
94 <p v-for="(p,i) in b.extJsonObj?.orderCustomerList" :key="i">
95 <el-tag v-if="p.deskNo" class="mr10">{{ p.deskNo }}-{{ p.seatNo }}</el-tag>
90 {{ p.name }} - {{ p.paymentType == '3' ? '€' : '¥' }}{{ b.extJsonObj.price }} 96 {{ p.name }} - {{ p.paymentType == '3' ? '€' : '¥' }}{{ b.extJsonObj.price }}
91 </p> 97 </p>
92 </div> 98 </div>
...@@ -101,8 +107,8 @@ ...@@ -101,8 +107,8 @@
101 <p>{{ b.messageObj?.roomName }}</p> 107 <p>{{ b.messageObj?.roomName }}</p>
102 <p>{{ b.messageObj?.roomInfo }}</p> 108 <p>{{ b.messageObj?.roomInfo }}</p>
103 </div> 109 </div>
104 <div v-if="b.orderType == 1"/> 110 <div v-if="b.orderType == 1" />
105 <div v-if="b.orderType == 2"/> 111 <div v-if="b.orderType == 2" />
106 <div v-if="b.orderType == 3||b.orderType == 4"> 112 <div v-if="b.orderType == 3||b.orderType == 4">
107 <p>{{ b.extJsonObj.packageName }}</p> 113 <p>{{ b.extJsonObj.packageName }}</p>
108 </div> 114 </div>
...@@ -125,7 +131,6 @@ ...@@ -125,7 +131,6 @@
125 @finish="finish(b)" 131 @finish="finish(b)"
126 /> 132 />
127 </div> 133 </div>
128
129 <div class="text-right"> 134 <div class="text-right">
130 <el-button 135 <el-button
131 v-if="(b.orderType == 0||b.orderType == 5)&&b.viewStatus!=0" class="mb10" plain round 136 v-if="(b.orderType == 0||b.orderType == 5)&&b.viewStatus!=0" class="mb10" plain round
...@@ -166,26 +171,26 @@ ...@@ -166,26 +171,26 @@
166 </div> 171 </div>
167 </div> 172 </div>
168 </el-card> 173 </el-card>
169 <div class="pd20"/> 174 <div class="pd20" />
170 175
171 </div> 176 </div>
172 </template> 177 </template>
173 178
174 <script setup> 179 <script setup>
175 import {onMounted, getCurrentInstance} from '@vue/runtime-core' 180 import { onMounted, getCurrentInstance } from '@vue/runtime-core'
176 import {useStorage} from '@vueuse/core/index' 181 import { useStorage } from '@vueuse/core/index'
177 import {newbilllist} from '@/apiPc/common' 182 import { newbilllist } from '@/apiPc/common'
178 import useUserStore from '@/store/modules/user' 183 import useUserStore from '@/store/modules/user'
179 import dayjs from 'dayjs' 184 import dayjs from 'dayjs'
180 import {cancelOrder2, cancelOrder} from '/@/apiPc/booking' 185 import { cancelOrder2, cancelOrder } from '/@/apiPc/booking'
181 186
182 import {ElMessage} from 'element-plus' 187 import { ElMessage } from 'element-plus'
183 188
184 const router = useRouter() 189 const router = useRouter()
185 const language = useStorage('language', 0) 190 const language = useStorage('language', 0)
186 const list = ref([]) 191 const list = ref([])
187 const user = useUserStore().user 192 const user = useUserStore().user
188 const {proxy} = getCurrentInstance() 193 const { proxy } = getCurrentInstance()
189 194
190 onMounted(() => { 195 onMounted(() => {
191 getList() 196 getList()
...@@ -197,7 +202,7 @@ function finish(bill) { ...@@ -197,7 +202,7 @@ function finish(bill) {
197 } 202 }
198 203
199 function getList() { 204 function getList() {
200 newbilllist({createById: user.userId}).then(res => { 205 newbilllist({ createById: user.userId }).then(res => {
201 list.value = res.rows || [] 206 list.value = res.rows || []
202 for (const b of list.value) { 207 for (const b of list.value) {
203 b.messageObj = JSON.parse(b.message) || {} 208 b.messageObj = JSON.parse(b.message) || {}
......
...@@ -430,7 +430,6 @@ function next() { ...@@ -430,7 +430,6 @@ function next() {
430 obj.passportUrl = wdsfData.value.passportUrl || '' 430 obj.passportUrl = wdsfData.value.passportUrl || ''
431 } 431 }
432 registerSingle(obj).then(res => { 432 registerSingle(obj).then(res => {
433 debugger
434 setToken(res.data.token) 433 setToken(res.data.token)
435 afterR() 434 afterR()
436 }) 435 })
...@@ -445,7 +444,7 @@ function next() { ...@@ -445,7 +444,7 @@ function next() {
445 passportNumber: wdsfData.value.passportNumber, 444 passportNumber: wdsfData.value.passportNumber,
446 picUrl: wdsfData.value.picUrl, 445 picUrl: wdsfData.value.picUrl,
447 birth: wdsfData.value.birthday, 446 birth: wdsfData.value.birthday,
448 personId: wdsfData.value.personId, 447 // personId: wdsfData.value.personId,
449 username: wdsfData.value.email, 448 username: wdsfData.value.email,
450 password: form.value.password, 449 password: form.value.password,
451 ocrFlag: '1' 450 ocrFlag: '1'
......
Styling with Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!