AddRules.vue 33 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991
  1. <script lang="ts" setup>
  2. import { ref, watch } from 'vue'
  3. import RulesShipments from './components/RulesShipments.vue'
  4. import AddedrluesTag from './components/AddedrluesTag.vue'
  5. import DelayedType from './components/DelayedType.vue'
  6. import ETDShipments from './components/ETDShipments.vue'
  7. import NotiFrequency from './components/NotiFrequency.vue'
  8. import NotiMethods from './components/NotiMethods.vue'
  9. import submitsucessful from './images/submit_successful.png'
  10. interface CheckboxItem {
  11. value: string
  12. label: string
  13. }
  14. interface Props {
  15. SystemList: Object
  16. TitleType: String
  17. }
  18. const MilestoneOceanListInit = ref<CheckboxItem[]>([])
  19. const MilestoneOceanListChecked = ref()
  20. const MilestoneAirListInit = ref<CheckboxItem[]>([])
  21. const MilestoneAirListChecked = ref()
  22. const ContainerOceanListInit = ref<CheckboxItem[]>([])
  23. const ContainerOceanListChecked = ref()
  24. const props = defineProps<Props>()
  25. let savesubscribeobj: any = {}
  26. const SystemList = ref(props.SystemList)
  27. const RulesActive = ref(['SelectMilestone', 'NotificationFrequency', 'NotificationMethod'])
  28. const OceanCheckList = ref()
  29. const AirCheckList = ref()
  30. const ContainerOceanList = ref()
  31. const IsFirstActive = ref(true)
  32. const IsTwoActive = ref(true)
  33. const IsThreeActive = ref(true)
  34. const CancelRulesVisible = ref(false)
  35. const UnableSaveVisible = ref(false)
  36. const SaveedVisible = ref(false)
  37. const DelayedDeparturedList = ref()
  38. const DelayedAirdList = ref()
  39. const ETDOceanList = ref()
  40. const ETDAirList = ref()
  41. const FrequencyDataMil = ref()
  42. const FrequencyDataCon = ref()
  43. const FrequencyDataDep = ref()
  44. const FrequencyDataETD = ref()
  45. const MethodsDataMil = ref()
  46. const MethodsDataCon = ref()
  47. const MethodsDataDep = ref()
  48. const MethodsDataETD = ref()
  49. const DelayedDataInit = ref()
  50. const DelayedDataInitAir = ref()
  51. const OceanETDInit = ref()
  52. const AirETDInit = ref()
  53. watch(
  54. () => props.SystemList,
  55. (current) => {
  56. SystemList.value = current
  57. FrequencyDataMil.value = current['Milestone_Update']
  58. MethodsDataMil.value = current['Milestone_Update']
  59. FrequencyDataCon.value = current['Container_Status_Update']
  60. MethodsDataCon.value = current['Container_Status_Update']
  61. FrequencyDataDep.value = current['Departure/Arrival_Delay']
  62. MethodsDataDep.value = current['Departure/Arrival_Delay']
  63. FrequencyDataETD.value = current['ETD/ETA_Change']
  64. MethodsDataETD.value = current['ETD/ETA_Change']
  65. Initdata(current)
  66. }
  67. )
  68. // 初始赋值
  69. const Initdata = (val: any) => {
  70. MilestoneOceanListInit.value = val.Milestone_Update.OceanCheckBoxList
  71. MilestoneOceanListChecked.value = val.Milestone_Update.OceanCheckedList
  72. OceanCheckList.value = val.Milestone_Update.OceanCheckedList
  73. MilestoneAirListInit.value = val.Milestone_Update.AirCheckBoxList
  74. MilestoneAirListChecked.value = val.Milestone_Update.AirCheckedList
  75. AirCheckList.value = val.Milestone_Update.AirCheckedList
  76. ContainerOceanListInit.value = val.Container_Status_Update.CtnrCheckBoxList
  77. ContainerOceanListChecked.value = val.Container_Status_Update.CtnrCheckedList
  78. ContainerOceanList.value = val.Container_Status_Update.CtnrCheckedList
  79. let OceanObj: any = {}
  80. OceanObj.atd_etd = val['Departure/Arrival_Delay'].ocean_atd_sub_etd
  81. OceanObj.atd_etd_unit = val['Departure/Arrival_Delay'].ocean_atd_sub_etd_unit
  82. OceanObj.ata_eta = val['Departure/Arrival_Delay'].ocean_ata_sub_eta
  83. OceanObj.ata_eta_unit = val['Departure/Arrival_Delay'].ocean_ata_sub_eta_unit
  84. DelayedDataInit.value = OceanObj
  85. let AirObj: any = {}
  86. AirObj.atd_etd = val['Departure/Arrival_Delay'].air_atd_sub_etd
  87. AirObj.atd_etd_unit = val['Departure/Arrival_Delay'].air_atd_sub_etd_unit
  88. AirObj.ata_eta = val['Departure/Arrival_Delay'].air_ata_sub_eta
  89. AirObj.ata_eta_unit = val['Departure/Arrival_Delay'].air_ata_sub_eta_unit
  90. DelayedDataInitAir.value = AirObj
  91. let OceanChange: any = {}
  92. OceanChange.ETDradio = val['ETD/ETA_Change'].ocean_etd_change
  93. OceanChange.etd_old_sub_new = val['ETD/ETA_Change'].ocean_etd_old_sub_new
  94. OceanChange.etd_old_sub_new_unit = val['ETD/ETA_Change'].ocean_etd_old_sub_new_unit
  95. OceanChange.ETAradio = val['ETD/ETA_Change'].ocean_eta_change
  96. OceanChange.eta_old_sub_new = val['ETD/ETA_Change'].ocean_eta_old_sub_new
  97. OceanChange.eta_old_sub_new_unit = val['ETD/ETA_Change'].ocean_eta_old_sub_new_unit
  98. OceanETDInit.value = OceanChange
  99. let AirChange: any = {}
  100. AirChange.ETDradio = val['ETD/ETA_Change'].air_etd_change
  101. AirChange.etd_old_sub_new = val['ETD/ETA_Change'].air_etd_old_sub_new
  102. AirChange.etd_old_sub_new_unit = val['ETD/ETA_Change'].air_etd_old_sub_new_unit
  103. AirChange.ETAradio = val['ETD/ETA_Change'].air_eta_change
  104. AirChange.eta_old_sub_new = val['ETD/ETA_Change'].air_eta_old_sub_new
  105. AirChange.eta_old_sub_new_unit = val['ETD/ETA_Change'].air_eta_old_sub_new_unit
  106. AirETDInit.value = AirChange
  107. }
  108. // 给tag list赋值
  109. const ChangeCheckOceanRules = (val: any) => {
  110. OceanCheckList.value = val
  111. }
  112. const ChangeContainerRules = (val: any) => {
  113. ContainerOceanList.value = val
  114. }
  115. // delayed赋值
  116. const ChangeDeayedRules = (val: any) => {
  117. DelayedDeparturedList.value = []
  118. if (val.Departure != '') {
  119. DelayedDeparturedList.value.push(val.Departure)
  120. savesubscribeobj.ocean_atd_sub_etd = val.Departure.split(' ')[3]
  121. savesubscribeobj.ocean_atd_sub_etd_unit = val.Departure.split(' ')[4]
  122. } else {
  123. delete savesubscribeobj.ocean_atd_sub_etd
  124. delete savesubscribeobj.ocean_atd_sub_etd_unit
  125. }
  126. if (val.Arrival != '') {
  127. DelayedDeparturedList.value.push(val.Arrival)
  128. savesubscribeobj.ocean_ata_sub_eta = val.Arrival.split(' ')[4]
  129. savesubscribeobj.ocean_ata_sub_eta_unit = val.Arrival.split(' ')[5]
  130. } else {
  131. delete savesubscribeobj.ocean_ata_sub_eta
  132. delete savesubscribeobj.ocean_ata_sub_eta_unit
  133. }
  134. }
  135. const ChangeAirRules = (val: any) => {
  136. DelayedAirdList.value = []
  137. if (val.Departure != '') {
  138. DelayedAirdList.value.push(val.Departure)
  139. savesubscribeobj.air_atd_sub_etd = val.Departure.split(' ')[3]
  140. savesubscribeobj.air_atd_sub_etd_unit = val.Departure.split(' ')[4]
  141. } else {
  142. delete savesubscribeobj.air_atd_sub_etd
  143. delete savesubscribeobj.air_atd_sub_etd_unit
  144. }
  145. if (val.Arrival != '') {
  146. DelayedAirdList.value.push(val.Arrival)
  147. savesubscribeobj.air_ata_sub_eta = val.Arrival.split(' ')[4]
  148. savesubscribeobj.air_ata_sub_eta_unit = val.Arrival.split(' ')[5]
  149. } else {
  150. delete savesubscribeobj.air_ata_sub_eta
  151. delete savesubscribeobj.air_ata_sub_eta_unit
  152. }
  153. }
  154. const ChangeCheckAirRules = (val: any) => {
  155. AirCheckList.value = val
  156. }
  157. // 更改Frequency时间
  158. const MilFrequencyList = ref()
  159. const ChangeMilFrequency = (val: any, type: any) => {
  160. MilFrequencyList.value = val
  161. savesubscribeobj = { ...savesubscribeobj, ...type }
  162. }
  163. const ConFrequencyList = ref()
  164. const ChangeConFrequency = (val: any, type: any) => {
  165. ConFrequencyList.value = val
  166. savesubscribeobj = { ...savesubscribeobj, ...type }
  167. }
  168. const DepFrequencyList = ref()
  169. const ChangeDepFrequency = (val: any, type: any) => {
  170. DepFrequencyList.value = val
  171. savesubscribeobj = { ...savesubscribeobj, ...type }
  172. }
  173. const ETDFrequencyList = ref()
  174. const ChangeETDFrequency = (val: any, type: any) => {
  175. ETDFrequencyList.value = val
  176. savesubscribeobj = { ...savesubscribeobj, ...type }
  177. }
  178. // 删除 Frequency tag
  179. const NotiFrequencyDeleteMil = ref()
  180. const NotiFrequencyDeleteCon = ref()
  181. const NotiFrequencyDeleteDep = ref()
  182. const NotiFrequencyDeleteETD = ref()
  183. const handleCloseRadio = (val: any) => {
  184. if (val == 'Mil') {
  185. NotiFrequencyDeleteMil.value.handleCloseRadioFrequency()
  186. } else if (val == 'Con') {
  187. NotiFrequencyDeleteCon.value.handleCloseRadioFrequency()
  188. } else if (val == 'Dep') {
  189. NotiFrequencyDeleteDep.value.handleCloseRadioFrequency()
  190. } else {
  191. NotiFrequencyDeleteETD.value.handleCloseRadioFrequency()
  192. }
  193. }
  194. // methods 切换
  195. const MilMethodsList = ref()
  196. const ChangeMethodsAddMil = (val: any, type: any) => {
  197. MilMethodsList.value = val
  198. savesubscribeobj = { ...savesubscribeobj, ...type }
  199. }
  200. const ConMethodsList = ref()
  201. const ChangeMethodsAddCon = (val: any, type: any) => {
  202. ConMethodsList.value = val
  203. savesubscribeobj = { ...savesubscribeobj, ...type }
  204. }
  205. const DepMethodsList = ref()
  206. const ChangeMethodsAddDep = (val: any, type: any) => {
  207. DepMethodsList.value = val
  208. savesubscribeobj = { ...savesubscribeobj, ...type }
  209. }
  210. const ETDMethodsList = ref()
  211. const ChangeMethodsAddETD = (val: any, type: any) => {
  212. ETDMethodsList.value = val
  213. savesubscribeobj = { ...savesubscribeobj, ...type }
  214. }
  215. const OceanDelayed = ref()
  216. const AirDelayed = ref()
  217. const handleCloseDelayed = (val: any) => {
  218. OceanDelayed.value.closeDelayed(val)
  219. }
  220. const handleCloseAirDelayed = (val: any) => {
  221. AirDelayed.value.closeDelayed(val)
  222. }
  223. // ETD Change
  224. const ChangeETDOceanRules = (val: any) => {
  225. ETDOceanList.value = []
  226. if (val.ETD != '') {
  227. if (val.ETD.indexOf('≥') != -1) {
  228. savesubscribeobj.ocean_etd_change = false
  229. savesubscribeobj.ocean_etd_old_sub_new = val.ETD.split(' ')[6]
  230. savesubscribeobj.ocean_etd_old_sub_new_unit = val.ETD.split(' ')[7]
  231. } else {
  232. savesubscribeobj.ocean_etd_change = true
  233. }
  234. ETDOceanList.value.push(val.ETD)
  235. } else {
  236. delete savesubscribeobj.ocean_etd_change
  237. delete savesubscribeobj.ocean_etd_old_sub_new
  238. delete savesubscribeobj.ocean_etd_old_sub_new_unit
  239. }
  240. if (val.ETA != '') {
  241. if (val.ETA.indexOf('≥') != -1) {
  242. savesubscribeobj.ocean_eta_change = false
  243. savesubscribeobj.ocean_eta_old_sub_new = val.ETA.split(' ')[6]
  244. savesubscribeobj.ocean_eta_old_sub_new_unit = val.ETA.split(' ')[7]
  245. } else {
  246. savesubscribeobj.ocean_eta_change = true
  247. }
  248. ETDOceanList.value.push(val.ETA)
  249. } else {
  250. delete savesubscribeobj.ocean_eta_change
  251. delete savesubscribeobj.ocean_eta_old_sub_new
  252. delete savesubscribeobj.ocean_eta_old_sub_new_unit
  253. }
  254. }
  255. // 删除ETD tag
  256. const OceanETD = ref()
  257. const closeOceanETD = (val: any) => {
  258. OceanETD.value.closeETD(val)
  259. }
  260. // ETA Change
  261. const ChangeETDAirRules = (val: any) => {
  262. ETDAirList.value = []
  263. if (val.ETD != '') {
  264. if (val.ETD.indexOf('≥') != -1) {
  265. savesubscribeobj.air_etd_change = false
  266. savesubscribeobj.air_etd_old_sub_new = val.ETD.split(' ')[6]
  267. savesubscribeobj.air_etd_old_sub_new_unit = val.ETD.split(' ')[7]
  268. } else {
  269. savesubscribeobj.air_etd_change = true
  270. }
  271. ETDAirList.value.push(val.ETD)
  272. } else {
  273. delete savesubscribeobj.air_etd_change
  274. delete savesubscribeobj.air_etd_old_sub_new
  275. delete savesubscribeobj.air_etd_old_sub_new_unit
  276. }
  277. if (val.ETA != '') {
  278. if (val.ETA.indexOf('≥') != -1) {
  279. savesubscribeobj.air_eta_change = false
  280. savesubscribeobj.air_eta_old_sub_new = val.ETA.split(' ')[6]
  281. savesubscribeobj.air_eta_old_sub_new_unit = val.ETA.split(' ')[7]
  282. } else {
  283. savesubscribeobj.air_eta_change = true
  284. }
  285. ETDAirList.value.push(val.ETA)
  286. } else {
  287. delete savesubscribeobj.air_eta_change
  288. delete savesubscribeobj.air_eta_old_sub_new
  289. delete savesubscribeobj.air_eta_old_sub_new_unit
  290. }
  291. }
  292. // 删除ETA tag
  293. const AirETD = ref()
  294. const closeAirETD = (val: any) => {
  295. AirETD.value.closeETD(val)
  296. }
  297. const emits = defineEmits(['UnsavedCollapse', 'SavedAddedRules'])
  298. // 不保存修改的折叠面板
  299. const UnsavedCollapse = () => {
  300. CancelRulesVisible.value = false
  301. emits('UnsavedCollapse')
  302. }
  303. // 保存subscribe配置
  304. const missingmessage = ref('')
  305. // 保存成功调用接口
  306. const SaveSuceessful = () => {
  307. $api
  308. .Savesubscribe({
  309. ...savesubscribeobj
  310. })
  311. .then((res: any) => {
  312. if (res.code === 200) {
  313. SaveedVisible.value = true
  314. setTimeout(() => {
  315. SaveedVisible.value = false
  316. emits('SavedAddedRules', res.data.addedRules, savesubscribeobj.rules_type)
  317. }, 3000)
  318. }
  319. })
  320. }
  321. const Savesubscribe = () => {
  322. let str = ''
  323. if (props.TitleType == 'Milestone') {
  324. savesubscribeobj.rules_type = 'Milestone_Update'
  325. if (
  326. OceanCheckList.value == undefined ||
  327. AirCheckList.value == undefined ||
  328. MilFrequencyList.value.length == 0 ||
  329. MilMethodsList.value.length == 0
  330. ) {
  331. if (OceanCheckList.value == undefined) {
  332. missingmessage.value += 'Ocean Shipments, '
  333. }
  334. if (AirCheckList.value == undefined) {
  335. missingmessage.value += 'Air Shipments, '
  336. }
  337. if (MilFrequencyList.value.length == 0) {
  338. missingmessage.value += 'Notification Frequency, '
  339. }
  340. if (MilMethodsList.value.length == 0) {
  341. missingmessage.value += 'Notification Method, '
  342. }
  343. missingmessage.value = missingmessage.value.substring(0, missingmessage.value.length - 2)
  344. UnableSaveVisible.value = true
  345. } else {
  346. savesubscribeobj.ocean_milestone = OceanCheckList.value
  347. savesubscribeobj.air_milestone = AirCheckList.value
  348. str =
  349. 'Ocean Milestones: ' +
  350. OceanCheckList.value.join(',') +
  351. ';\nAir Milestones: ' +
  352. AirCheckList.value.join(',') +
  353. ';'
  354. savesubscribeobj.event_details = str
  355. SaveSuceessful()
  356. }
  357. } else if (props.TitleType == 'Container') {
  358. savesubscribeobj.rules_type = 'Container_Status_Update'
  359. if (
  360. ContainerOceanList.value == undefined ||
  361. ConFrequencyList.value.length == 0 ||
  362. ConMethodsList.value.length == 0
  363. ) {
  364. if (ContainerOceanList.value == undefined) {
  365. missingmessage.value += 'Ocean Shipments, '
  366. }
  367. if (ConFrequencyList.value.length == 0) {
  368. missingmessage.value += 'Notification Frequency, '
  369. }
  370. if (ConMethodsList.value.length == 0) {
  371. missingmessage.value += 'Notification Method, '
  372. }
  373. missingmessage.value = missingmessage.value.substring(0, missingmessage.value.length - 2)
  374. UnableSaveVisible.value = true
  375. } else {
  376. savesubscribeobj.ocean_ctnr_status = ContainerOceanList.value
  377. str = 'Ocean Container: ' + ContainerOceanList.value.join(',')
  378. savesubscribeobj.event_details = str
  379. SaveSuceessful()
  380. }
  381. } else if (props.TitleType == 'Departure') {
  382. savesubscribeobj.rules_type = 'Departure/Arrival_Delay'
  383. if (
  384. DelayedDeparturedList.value == undefined ||
  385. DelayedAirdList.value == undefined ||
  386. DepFrequencyList.value.length == 0 ||
  387. DepMethodsList.value.length == 0
  388. ) {
  389. if (DelayedDeparturedList.value == undefined) {
  390. missingmessage.value += 'Ocean Shipments, '
  391. }
  392. if (DelayedAirdList.value == undefined) {
  393. missingmessage.value += 'Air Shipments, '
  394. }
  395. if (DepFrequencyList.value.length == 0) {
  396. missingmessage.value += 'Notification Frequency, '
  397. }
  398. if (DepMethodsList.value.length == 0) {
  399. missingmessage.value += 'Notification Method, '
  400. }
  401. missingmessage.value = missingmessage.value.substring(0, missingmessage.value.length - 2)
  402. UnableSaveVisible.value = true
  403. } else {
  404. str = DelayedDeparturedList.value.join(';\n') + ';\n' + DelayedAirdList.value.join(';\n')
  405. savesubscribeobj.event_details = str
  406. SaveSuceessful()
  407. }
  408. } else {
  409. savesubscribeobj.rules_type = 'ETD/ETA_Change'
  410. if (
  411. ETDOceanList.value == undefined ||
  412. ETDOceanList.value.length == 0 ||
  413. ETDAirList.value == undefined ||
  414. ETDAirList.value.length == 0 ||
  415. ETDFrequencyList.value.length == 0 ||
  416. ETDMethodsList.value.length == 0
  417. ) {
  418. if (ETDOceanList.value == undefined) {
  419. missingmessage.value += 'Ocean Shipments, '
  420. }
  421. if (ETDAirList.value == undefined) {
  422. missingmessage.value += 'Air Shipments, '
  423. }
  424. if (ETDFrequencyList.value.length == 0) {
  425. missingmessage.value += 'Notification Frequency, '
  426. }
  427. if (ETDMethodsList.value.length == 0) {
  428. missingmessage.value += 'Notification Method, '
  429. }
  430. missingmessage.value = missingmessage.value.substring(0, missingmessage.value.length - 2)
  431. UnableSaveVisible.value = true
  432. } else {
  433. str = ETDOceanList.value.join(';\n') + ';\n' + ETDAirList.value.join(';\n')
  434. savesubscribeobj.event_details = str
  435. SaveSuceessful()
  436. }
  437. }
  438. }
  439. // 删除表格数据后清空所有数据
  440. const clearData = (val: any) => {
  441. if (val == 'Milestone_Update') {
  442. OceanCheckList.value = []
  443. AirCheckList.value = []
  444. MilFrequencyList.value = []
  445. MilMethodsList.value = []
  446. MilestoneOceanListChecked.value = []
  447. MilestoneAirListChecked.value = []
  448. handleCloseRadio('Mil')
  449. } else if (val == 'Container_Status_Update') {
  450. ContainerOceanList.value = []
  451. ConFrequencyList.value = []
  452. ConMethodsList.value = []
  453. ContainerOceanListChecked.value = []
  454. handleCloseRadio('Con')
  455. } else if (val == 'Departure/Arrival_Delay') {
  456. DelayedDeparturedList.value = []
  457. DelayedAirdList.value = []
  458. DepFrequencyList.value = []
  459. DepMethodsList.value = []
  460. OceanDelayed.value.ClearData()
  461. AirDelayed.value.ClearData()
  462. handleCloseRadio('Dep')
  463. } else {
  464. ETDOceanList.value = []
  465. ETDAirList.value = []
  466. ETDFrequencyList.value = []
  467. ETDMethodsList.value = []
  468. handleCloseRadio('ETD')
  469. OceanETD.value.ClearData()
  470. AirETD.value.ClearData()
  471. }
  472. }
  473. defineExpose({
  474. clearData
  475. })
  476. </script>
  477. <template>
  478. <div class="Rules_flex">
  479. <div class="Rules_left">
  480. <div class="Rules_collapse">
  481. <el-collapse
  482. v-model="RulesActive"
  483. @change="IsFirstActive = !IsFirstActive"
  484. v-if="props.TitleType == 'Milestone'"
  485. >
  486. <el-collapse-item name="SelectMilestone">
  487. <template #title>
  488. <div class="Rules_Title">
  489. <span class="iconfont_icon">
  490. <svg class="iconfont" aria-hidden="true">
  491. <use
  492. :xlink:href="IsFirstActive ? '#icon-icon_dropdown_b' : '#icon-icon_up_b'"
  493. ></use>
  494. </svg>
  495. </span>
  496. <span class="stars_red">*</span>Select Milestone
  497. </div>
  498. </template>
  499. <div>
  500. <RulesShipments
  501. Title="Ocean shipments"
  502. @ChangeCheckRules="ChangeCheckOceanRules"
  503. :CheckboxList="MilestoneOceanListInit"
  504. :CheckedList="MilestoneOceanListChecked"
  505. ></RulesShipments>
  506. </div>
  507. <div>
  508. <RulesShipments
  509. Title="Air shipments"
  510. @ChangeCheckRules="ChangeCheckAirRules"
  511. :CheckboxList="MilestoneAirListInit"
  512. :CheckedList="MilestoneAirListChecked"
  513. ></RulesShipments>
  514. </div>
  515. </el-collapse-item>
  516. </el-collapse>
  517. <el-collapse
  518. v-model="RulesActive"
  519. @change="IsFirstActive = !IsFirstActive"
  520. v-if="props.TitleType == 'Container'"
  521. >
  522. <el-collapse-item name="SelectMilestone">
  523. <template #title>
  524. <div class="Rules_Title">
  525. <span class="iconfont_icon">
  526. <svg class="iconfont" aria-hidden="true">
  527. <use
  528. :xlink:href="IsFirstActive ? '#icon-icon_dropdown_b' : '#icon-icon_up_b'"
  529. ></use>
  530. </svg>
  531. </span>
  532. <span class="stars_red">*</span>Select Container Status
  533. </div>
  534. </template>
  535. <div>
  536. <RulesShipments
  537. Title="Ocean shipments"
  538. @ChangeCheckRules="ChangeContainerRules"
  539. :CheckboxList="ContainerOceanListInit"
  540. :CheckedList="ContainerOceanListChecked"
  541. ></RulesShipments>
  542. </div>
  543. </el-collapse-item>
  544. </el-collapse>
  545. <el-collapse
  546. v-model="RulesActive"
  547. @change="IsFirstActive = !IsFirstActive"
  548. v-if="props.TitleType == 'Departure'"
  549. >
  550. <el-collapse-item name="SelectMilestone">
  551. <template #title>
  552. <div class="Rules_Title">
  553. <span class="iconfont_icon">
  554. <svg class="iconfont" aria-hidden="true">
  555. <use
  556. :xlink:href="IsFirstActive ? '#icon-icon_dropdown_b' : '#icon-icon_up_b'"
  557. ></use>
  558. </svg>
  559. </span>
  560. <span class="stars_red">*</span>Select Delayed Type
  561. </div>
  562. </template>
  563. <div>
  564. <DelayedType
  565. Title="Ocean shipments"
  566. ref="OceanDelayed"
  567. :DelayedData="DelayedDataInit"
  568. @ChangeCheckRules="ChangeDeayedRules"
  569. ></DelayedType>
  570. </div>
  571. <div>
  572. <DelayedType
  573. Title="Air shipments"
  574. ref="AirDelayed"
  575. :DelayedData="DelayedDataInitAir"
  576. @ChangeCheckRules="ChangeAirRules"
  577. ></DelayedType>
  578. </div>
  579. </el-collapse-item>
  580. </el-collapse>
  581. <el-collapse
  582. v-model="RulesActive"
  583. @change="IsFirstActive = !IsFirstActive"
  584. v-if="props.TitleType == 'ETDChange'"
  585. >
  586. <el-collapse-item name="SelectMilestone">
  587. <template #title>
  588. <div class="Rules_Title">
  589. <span class="iconfont_icon">
  590. <svg class="iconfont" aria-hidden="true">
  591. <use
  592. :xlink:href="IsFirstActive ? '#icon-icon_dropdown_b' : '#icon-icon_up_b'"
  593. ></use>
  594. </svg>
  595. </span>
  596. <span class="stars_red">*</span>Select Delayed Type
  597. </div>
  598. </template>
  599. <div>
  600. <ETDShipments
  601. Title="Ocean shipments"
  602. ref="OceanETD"
  603. :ETDData="OceanETDInit"
  604. @ChangeCheckRules="ChangeETDOceanRules"
  605. ></ETDShipments>
  606. </div>
  607. <div>
  608. <ETDShipments
  609. Title="Air shipments"
  610. ref="AirETD"
  611. :ETDData="AirETDInit"
  612. @ChangeCheckRules="ChangeETDAirRules"
  613. ></ETDShipments>
  614. </div>
  615. </el-collapse-item>
  616. </el-collapse>
  617. <el-collapse
  618. style="margin-top: 17px; margin-right: 16px"
  619. v-model="RulesActive"
  620. @change="IsTwoActive = !IsTwoActive"
  621. >
  622. <el-collapse-item name="NotificationFrequency">
  623. <template #title>
  624. <div class="Rules_Title">
  625. <span class="iconfont_icon">
  626. <svg class="iconfont" aria-hidden="true">
  627. <use
  628. :xlink:href="IsTwoActive ? '#icon-icon_dropdown_b' : '#icon-icon_up_b'"
  629. ></use>
  630. </svg>
  631. </span>
  632. <span class="stars_red">*</span>Notification Frequency
  633. </div>
  634. </template>
  635. <NotiFrequency
  636. v-if="props.TitleType == 'Milestone'"
  637. ref="NotiFrequencyDeleteMil"
  638. :FrequencyData="FrequencyDataMil"
  639. @ChangeFrequencyAdd="ChangeMilFrequency"
  640. ></NotiFrequency>
  641. <NotiFrequency
  642. v-if="props.TitleType == 'Container'"
  643. ref="NotiFrequencyDeleteCon"
  644. :FrequencyData="FrequencyDataCon"
  645. @ChangeFrequencyAdd="ChangeConFrequency"
  646. ></NotiFrequency>
  647. <NotiFrequency
  648. v-if="props.TitleType == 'Departure'"
  649. ref="NotiFrequencyDeleteDep"
  650. :FrequencyData="FrequencyDataDep"
  651. @ChangeFrequencyAdd="ChangeDepFrequency"
  652. ></NotiFrequency>
  653. <NotiFrequency
  654. v-if="props.TitleType == 'ETDChange'"
  655. ref="NotiFrequencyDeleteETD"
  656. :FrequencyData="FrequencyDataETD"
  657. @ChangeFrequencyAdd="ChangeETDFrequency"
  658. ></NotiFrequency>
  659. </el-collapse-item>
  660. </el-collapse>
  661. <el-collapse
  662. style="margin: 17px 0"
  663. v-model="RulesActive"
  664. @change="IsThreeActive = !IsThreeActive"
  665. >
  666. <el-collapse-item name="NotificationMethod">
  667. <template #title>
  668. <div class="Rules_Title">
  669. <span class="iconfont_icon">
  670. <svg class="iconfont" aria-hidden="true">
  671. <use
  672. :xlink:href="IsThreeActive ? '#icon-icon_dropdown_b' : '#icon-icon_up_b'"
  673. ></use>
  674. </svg>
  675. </span>
  676. <span class="stars_red">*</span>Notification Method
  677. </div>
  678. </template>
  679. <NotiMethods
  680. v-if="props.TitleType == 'Milestone'"
  681. :MethodsData="MethodsDataMil"
  682. @ChangeMethodsAdd="ChangeMethodsAddMil"
  683. ></NotiMethods>
  684. <NotiMethods
  685. v-if="props.TitleType == 'Container'"
  686. :MethodsData="MethodsDataCon"
  687. @ChangeMethodsAdd="ChangeMethodsAddCon"
  688. ></NotiMethods>
  689. <NotiMethods
  690. v-if="props.TitleType == 'Departure'"
  691. :MethodsData="MethodsDataDep"
  692. @ChangeMethodsAdd="ChangeMethodsAddDep"
  693. ></NotiMethods>
  694. <NotiMethods
  695. v-if="props.TitleType == 'ETDChange'"
  696. :MethodsData="MethodsDataETD"
  697. @ChangeMethodsAdd="ChangeMethodsAddETD"
  698. ></NotiMethods>
  699. </el-collapse-item>
  700. </el-collapse>
  701. </div>
  702. </div>
  703. <div class="Rules_right">
  704. <div class="right_Title">Added Rules</div>
  705. <AddedrluesTag
  706. :CheckedList="DelayedDeparturedList"
  707. v-if="props.TitleType == 'Departure'"
  708. @handleCloseRadio="handleCloseDelayed"
  709. Title="Ocean Shipments"
  710. ></AddedrluesTag>
  711. <AddedrluesTag
  712. v-if="props.TitleType == 'Milestone'"
  713. :CheckedList="OceanCheckList"
  714. Title="Ocean Shipments"
  715. ></AddedrluesTag>
  716. <AddedrluesTag
  717. v-if="props.TitleType == 'Container'"
  718. :CheckedList="ContainerOceanList"
  719. Title="Ocean Shipments"
  720. ></AddedrluesTag>
  721. <AddedrluesTag
  722. :CheckedList="ETDOceanList"
  723. v-if="props.TitleType == 'ETDChange'"
  724. Title="Ocean Shipments"
  725. @handleCloseRadio="closeOceanETD"
  726. ></AddedrluesTag>
  727. <AddedrluesTag
  728. :CheckedList="ETDAirList"
  729. v-if="props.TitleType == 'ETDChange'"
  730. @handleCloseRadio="closeAirETD"
  731. Title="Air Shipments"
  732. ></AddedrluesTag>
  733. <AddedrluesTag
  734. :CheckedList="DelayedAirdList"
  735. v-if="props.TitleType == 'Departure'"
  736. @handleCloseRadio="handleCloseAirDelayed"
  737. Title="Air Shipments"
  738. ></AddedrluesTag>
  739. <AddedrluesTag
  740. v-if="props.TitleType == 'Milestone'"
  741. :CheckedList="AirCheckList"
  742. Title="Air Shipments"
  743. ></AddedrluesTag>
  744. <AddedrluesTag
  745. v-if="props.TitleType == 'Milestone'"
  746. :CheckedList="MilFrequencyList"
  747. Title="Notification Frequency"
  748. @handleCloseRadio="handleCloseRadio('Mil')"
  749. ></AddedrluesTag>
  750. <AddedrluesTag
  751. v-if="props.TitleType == 'Container'"
  752. :CheckedList="ConFrequencyList"
  753. Title="Notification Frequency"
  754. @handleCloseRadio="handleCloseRadio('Con')"
  755. ></AddedrluesTag>
  756. <AddedrluesTag
  757. v-if="props.TitleType == 'Departure'"
  758. :CheckedList="DepFrequencyList"
  759. Title="Notification Frequency"
  760. @handleCloseRadio="handleCloseRadio('Dep')"
  761. ></AddedrluesTag>
  762. <AddedrluesTag
  763. v-if="props.TitleType == 'ETDChange'"
  764. :CheckedList="ETDFrequencyList"
  765. Title="Notification Frequency"
  766. @handleCloseRadio="handleCloseRadio('ETD')"
  767. ></AddedrluesTag>
  768. <AddedrluesTag
  769. v-if="props.TitleType == 'Milestone'"
  770. :CheckedList="MilMethodsList"
  771. Title="Notification Method"
  772. ></AddedrluesTag>
  773. <AddedrluesTag
  774. v-if="props.TitleType == 'Container'"
  775. :CheckedList="ConMethodsList"
  776. Title="Notification Method"
  777. ></AddedrluesTag>
  778. <AddedrluesTag
  779. v-if="props.TitleType == 'Departure'"
  780. :CheckedList="DepMethodsList"
  781. Title="Notification Method"
  782. ></AddedrluesTag>
  783. <AddedrluesTag
  784. v-if="props.TitleType == 'ETDChange'"
  785. :CheckedList="ETDMethodsList"
  786. Title="Notification Method"
  787. ></AddedrluesTag>
  788. </div>
  789. </div>
  790. <div class="Rules_buttom">
  791. <el-button class="el-button--dark rules_button" @click="Savesubscribe">Save</el-button>
  792. <el-button @click="CancelRulesVisible = true" class="rules_button" type="default"
  793. >Cancel</el-button
  794. >
  795. <!-- 取消保存 -->
  796. <el-dialog v-model="CancelRulesVisible" width="480">
  797. <div>You have unsaved changes.</div>
  798. <div>Are you sure you want to leave this page?</div>
  799. <template #footer>
  800. <div class="dialog-footer">
  801. <el-button type="default" @click="CancelRulesVisible = false" style="width: 100px"
  802. >Cancel</el-button
  803. >
  804. <el-button class="el-button--warning" @click="UnsavedCollapse" style="width: 100px">
  805. OK
  806. </el-button>
  807. </div>
  808. </template>
  809. <template #header>
  810. <div class="cancel_header">
  811. <span class="iconfont_icon iconfont_warning">
  812. <svg class="iconfont icon_warning" aria-hidden="true">
  813. <use xlink:href="#icon-icon_tipsfilled_b"></use>
  814. </svg>
  815. </span>
  816. Unsaved Changes
  817. </div>
  818. </template>
  819. </el-dialog>
  820. <!-- 保存失败 -->
  821. <el-dialog v-model="UnableSaveVisible" width="480">
  822. <div>{{ missingmessage }} missing.</div>
  823. <div>Please complete all required fields.</div>
  824. <template #footer>
  825. <div class="dialog-footer">
  826. <el-button
  827. class="el-button--danger"
  828. @click="UnableSaveVisible = false"
  829. style="width: 100px"
  830. >
  831. OK
  832. </el-button>
  833. </div>
  834. </template>
  835. <template #header>
  836. <div class="cancel_header">
  837. <span class="iconfont_icon iconfont_warning">
  838. <svg class="iconfont icon_danger" aria-hidden="true">
  839. <use xlink:href="#icon-icon_fail_fill_b"></use>
  840. </svg>
  841. </span>
  842. Unable to Save
  843. </div>
  844. </template>
  845. </el-dialog>
  846. <!-- 保存成功 -->
  847. <el-dialog v-model="SaveedVisible" width="320" style="height: 212px">
  848. <div style="text-align: center"><el-image :src="submitsucessful" /></div>
  849. <div style="text-align: center; margin-top: 20px">Saved successfully</div>
  850. </el-dialog>
  851. </div>
  852. </template>
  853. <style lang="scss" scoped>
  854. .Rules_flex {
  855. padding: 0 0 0 8px;
  856. display: flex;
  857. }
  858. .Rules_left {
  859. width: 60%;
  860. border-right: 1px solid var(--color-user-config-title-bottom-border);
  861. }
  862. .Rules_right {
  863. width: 40%;
  864. background-color: var(--more-filters-background-color);
  865. }
  866. .right_Title {
  867. color: var(--color-neutral-1);
  868. padding: 9px 8px;
  869. font-size: 18px;
  870. font-weight: 700;
  871. border-bottom: 1px solid var(--color-user-config-title-bottom-border);
  872. background-color: var(--color-drawer-body-bg);
  873. }
  874. .iconfont {
  875. width: 16px;
  876. height: 16px;
  877. margin-right: 8px;
  878. }
  879. .icon_danger {
  880. fill: var(--color-btn-danger-bg);
  881. }
  882. :deep(.Rules_Title) {
  883. color: var(--color-neutral-1);
  884. font-size: 14px;
  885. font-weight: 700;
  886. height: 22px;
  887. display: flex;
  888. align-items: center;
  889. }
  890. .stars_red {
  891. color: var(--color-danger);
  892. }
  893. :deep(.el-collapse-item__header) {
  894. height: 25px !important;
  895. margin: 14px 0 0 0 !important;
  896. border: none !important;
  897. padding: 0 !important;
  898. }
  899. :deep(.el-collapse-item__header):hover {
  900. background-color: #fff !important;
  901. border: none !important;
  902. }
  903. :deep(.el-collapse-item__arrow) {
  904. width: 0 !important;
  905. height: 0 !important;
  906. }
  907. :deep(.el-icon svg) {
  908. width: 0 !important;
  909. }
  910. :deep(.el-collapse-item__header.is-active) {
  911. background-color: transparent !important;
  912. border-color: transparent !important;
  913. }
  914. :deep(.el-collapse-item__arrow.is-active) {
  915. transform: rotate(-180deg) !important;
  916. }
  917. :deep(.Ocean_collapse .el-collapse-item__arrow) {
  918. width: 16px !important;
  919. height: 16px !important;
  920. background-image: url('../src/images/icon_expand.png') !important;
  921. background-size: contain;
  922. background-repeat: no-repeat;
  923. transform: rotate(0);
  924. }
  925. :deep(.Ocean_collapse .el-collapse-item__header) {
  926. background-color: #fff !important;
  927. padding: 0 8px !important;
  928. height: 40px !important;
  929. }
  930. :deep(.Ocean_collapse .el-collapse-item) {
  931. background-color: var(--color-dialog-header-bg);
  932. border-radius: 12px;
  933. }
  934. :deep(.Ocean_collapse .el-collapse-item__wrap) {
  935. padding: 0 8px !important;
  936. }
  937. :deep(.Ocean_collapse .el-collapse-item__header.is-active) {
  938. background-color: var(--color-dialog-header-bg) !important;
  939. }
  940. :deep(.el-checkbox__input.is-checked + .el-checkbox__label) {
  941. color: var(--color-neutral-1);
  942. }
  943. .Rules_buttom {
  944. padding: 8px;
  945. border-top: 1px solid var(--color-border-1);
  946. }
  947. .rules_button {
  948. width: 100px;
  949. height: 40px;
  950. }
  951. .cancel_header {
  952. font-size: 18px;
  953. font-weight: 700;
  954. color: var(--color-neutral-1);
  955. display: flex;
  956. align-items: center;
  957. }
  958. .icon_warning {
  959. width: 22px;
  960. height: 22px;
  961. margin-right: 0;
  962. fill: var(--color-btn-warning-bg);
  963. }
  964. .iconfont_warning {
  965. display: flex;
  966. align-items: center;
  967. }
  968. :deep(header.el-dialog__header) {
  969. background-color: #fff;
  970. }
  971. :deep(footer.el-dialog__footer) {
  972. border-top: none;
  973. }
  974. :deep(.el-collapse) {
  975. margin-right: 8px;
  976. }
  977. </style>