You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

359 lines
12 KiB

2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
  1. <template>
  2. <div class="tw-mb-[20px] tw-rounded-[20px] tw-px-[20px] tw-py-[30px] tw-border tw-border-solid tw-border-slate-200">
  3. <div class="element collapse tw-my-[12px]">
  4. <div
  5. :class="[
  6. 'label',
  7. 'tw-cursor-pointer',
  8. 'service-info',
  9. show ? 'show' : 'hide',
  10. ]"
  11. @click="show = !show"
  12. >
  13. <div class="t-w-full tw-grid tw-grid-cols-[30px_auto_80px]">
  14. <div class="tw-w-[30px] tw-h-[30px] tw-rounded-[30px] tw-bg-black tw-text-white tw-flex tw-justify-center tw-items-center t14 md:t16">{{ sort }}</div>
  15. <div class="tw-flex tw-justify-center tw-items-center"><span class="tw-text-neutrals-600 tw-font-normal t14 md:t16">[{{ $t("Length") }} {{formData.length}}cm x {{ $t("Width") }} {{formData.width}}cm x {{ $t("Height") }} {{formData.height}}cm , {{ $t("Weight") }} {{ formData.weight }}kg] , {{ $t("Quantity") }}{{ formData.quantity }}</span></div>
  16. <v-img max-width="18" max-height="19" class="tw-ml-[10px]" @click="delService" :src="require('@/assets/svg/delete_default.svg')"></v-img>
  17. </div>
  18. </div>
  19. {{ typeof formData.length }}
  20. <Transition name="bounce">
  21. <div v-show="show">
  22. <div class="tw-pr-24 tw-mt-[20px]">
  23. <div class="element tw-grid tw-grid-cols-1 md:tw-grid-cols-[122px_auto] xl:tw-grid-cols-[122px_auto] tw-gap-[10px]">
  24. <div class="tw-flex tw-items-center">
  25. <label class="tw-font-normal tw-mb-[10px] md:tw-mb-0 t14 md:t16">
  26. <span>{{ $t("Package")}}</span><span class="required t12 md:t14">*</span>
  27. </label>
  28. </div>
  29. <elementSelectNew
  30. :select="{
  31. id: 'Package',
  32. label: 'Package',
  33. required: true,
  34. }"
  35. :isRow="true"
  36. :itemsCenter="true"
  37. :labelWidth="0"
  38. :selectWidth="200"
  39. :selectList="selectPackageList"
  40. :default="formData.package"
  41. :validation="validation.package"
  42. @change="updatePackape($event)"
  43. ></elementSelectNew>
  44. </div>
  45. <div class="element tw-grid tw-grid-cols-1 md:tw-grid-cols-[122px_auto_auto_auto] xl:tw-grid-cols-[122px_auto_auto_auto] tw-gap-[10px] tw-mt-[20px]">
  46. <div class="tw-flex tw-items-center">
  47. <label class="tw-font-normal tw-mb-[10px] md:tw-mb-0 t14 md:t16">
  48. <span>{{ $t("Size (cm)")}}</span><span class="required t12 md:t14">*</span>
  49. </label>
  50. </div>
  51. <elementInputNew
  52. :input="{
  53. id: 'Length',
  54. required: true,
  55. type: 'text',
  56. placeholder: 'Length',
  57. }"
  58. :maxlength="11"
  59. :validation="validation.length"
  60. @change="updateLength($event)"
  61. ></elementInputNew>
  62. <elementInputNew
  63. :input="{
  64. id: 'Width',
  65. required: true,
  66. type: 'text',
  67. placeholder: 'Width',
  68. }"
  69. :maxlength="11"
  70. :validation="validation.width"
  71. @change="updateWidth($event)"
  72. ></elementInputNew>
  73. <elementInputNew
  74. :input="{
  75. id: 'Height',
  76. required: true,
  77. type: 'text',
  78. placeholder: 'Height',
  79. }"
  80. :maxlength="11"
  81. :validation="validation.height"
  82. @change="updateHeight($event)"
  83. ></elementInputNew>
  84. </div>
  85. <div class="element tw-grid tw-grid-cols-1 md:tw-grid-cols-2 xl:tw-grid-cols-2 tw-gap-[10px] tw-mt-[20px]">
  86. <div class="element tw-grid tw-grid-cols-1 md:tw-grid-cols-[122px_auto] xl:tw-grid-cols-[122px_auto] tw-gap-[10px]">
  87. <div class="tw-flex tw-items-center">
  88. <label class="tw-font-normal tw-mb-[10px] md:tw-mb-0 t14 md:t16">
  89. <span>{{ $t("Weight (kg)")}}</span><span class="required t12 md:t14">*</span>
  90. </label>
  91. </div>
  92. <elementInputNew
  93. :input="{
  94. id: 'Weight',
  95. required: true,
  96. type: 'text',
  97. placeholder: '',
  98. }"
  99. :maxlength="11"
  100. :validation="validation.weight"
  101. @change="updateWeight($event)"
  102. ></elementInputNew>
  103. </div>
  104. <div class="element tw-grid tw-grid-cols-1 md:tw-grid-cols-[122px_auto] xl:tw-grid-cols-[122px_auto] tw-gap-[10px]">
  105. <div class="tw-flex tw-items-center md:tw-justify-end">
  106. <label class="tw-font-normal tw-mb-[10px] md:tw-mb-0 t14 md:t16">
  107. <span>{{ $t("Quantity")}}</span><span class="required t12 md:t14">*</span>
  108. </label>
  109. </div>
  110. <elementSelectNew
  111. :select="{
  112. id: 'Quantity',
  113. label: 'Quantity',
  114. required: true,
  115. }"
  116. :isRow="true"
  117. :itemsCenter="true"
  118. :labelWidth="0"
  119. :selectWidth="200"
  120. :selectList="selectQuantityList"
  121. :default="formData.quantity"
  122. :validation="validation.quantity"
  123. @change="updateQuantity($event)"
  124. ></elementSelectNew>
  125. </div>
  126. </div>
  127. <div class="tw-border-0 tw-border-b tw-border-solid tw-border-neutrals-200 tw-mt-[20px]"></div>
  128. <div class="group tw-mt-[20px]">
  129. <h3 class="t14 tw-font-bold tw-mb-[10px] md:t16">
  130. {{ $t("Service Type") }}<span class="required tw-font-normal t12 md:t14">*</span>&nbsp;({{ $t("Multiple choices") }})
  131. <span v-if="validation.typeShow==false" class="required md:tw-ml-[20px] tw-font-normal t12 md:t14">{{ $t("Required.") }}</span>
  132. </h3>
  133. <typeMultigroup :packages="typeGroupList" @type="changeType($event)"></typeMultigroup>
  134. </div>
  135. </div>
  136. </div>
  137. </Transition>
  138. </div>
  139. </div>
  140. </template>
  141. <script>
  142. import elementSelectNew from "@/components/newComponent/form/ElementSelectNew";
  143. import elementInputNew from "@/components/newComponent/form/ElementInputNew";
  144. import typeMultigroup from "@/components/service/content/typeMultigroup.vue";
  145. import is from "is_js";
  146. import { IsNumber } from "~/utils/common";
  147. export default {
  148. name: 'selectExhibitionService',
  149. components: {
  150. elementSelectNew,
  151. elementInputNew,
  152. typeMultigroup
  153. },
  154. props: {
  155. selectPackageList: {
  156. type: Array,
  157. },
  158. selectLengthList: {
  159. type: Array,
  160. },
  161. selectWidthList: {
  162. type: Array,
  163. },
  164. selectHeightList: {
  165. type: Array,
  166. },
  167. selectQuantityList: {
  168. type: Array,
  169. },
  170. typeGroupList:{
  171. type: Array,
  172. },
  173. show: {
  174. type: Boolean,
  175. default: false,
  176. },
  177. sort:{
  178. type: Number,
  179. }
  180. },
  181. data() {
  182. return {
  183. typeLength: 0,
  184. // show: true,
  185. formData: {
  186. package: "0",
  187. selectPackape:{id: "0",name:""},
  188. length: "",
  189. width: "",
  190. height: "",
  191. weight: "",
  192. quantity: "0",
  193. selectServiceItems: [],
  194. },
  195. validation: {
  196. package: true,
  197. length: true,
  198. width: true,
  199. height: true,
  200. weight: true,
  201. quantity: true,
  202. typeShow: true,
  203. },
  204. errors: null,
  205. };
  206. },
  207. // watch: {
  208. // showServiceItem: {
  209. // handler: function () {
  210. // this.show = this.showServiceItem;
  211. // },
  212. // },
  213. // },
  214. methods: {
  215. validators() {
  216. if (is.empty(this.formData.package) || this.formData.package=="0") {
  217. this.validation.package = false;
  218. } else {
  219. this.validation.package = true;
  220. }
  221. if (is.empty(this.formData.length) || IsNumber(this.formData.length)==false || this.formData.length == "0") {
  222. this.validation.length = false;
  223. } else {
  224. this.validation.length = true;
  225. }
  226. if (is.empty(this.formData.width) || IsNumber(this.formData.width)==false || this.formData.width == "0") {
  227. this.validation.width = false;
  228. } else {
  229. this.validation.width = true;
  230. }
  231. if (is.empty(this.formData.height) || IsNumber(this.formData.height)==false || this.formData.height == "0") {
  232. this.validation.height = false;
  233. } else {
  234. this.validation.height = true;
  235. }
  236. if (is.empty(this.formData.weight) || IsNumber(this.formData.weight)==false) {
  237. this.validation.weight = false;
  238. } else {
  239. this.validation.weight = true;
  240. }
  241. if (is.empty(this.formData.quantity) || this.formData.quantity=="0") {
  242. this.validation.quantity = false;
  243. } else {
  244. this.validation.quantity = true;
  245. }
  246. if(this.typeLength<=0){
  247. this.validation.typeShow = false;
  248. }else{
  249. this.validation.typeShow = true;
  250. }
  251. this.errors = Object.entries(this.validation).filter(
  252. (e) => e[1] == false
  253. );
  254. if (this.errors.length > 0) {
  255. return false;
  256. } else {
  257. return true;
  258. }
  259. },
  260. changeType(serviceItems) {
  261. // this.validation.typeShow = serviceItems.length > 0 ? false : true;
  262. this.typeLength = serviceItems.length;
  263. this.formData.selectServiceItems = serviceItems;
  264. this.$emit("ChangeCosts",{type: 'stacker',value: this.formData});
  265. },
  266. delService(){
  267. this.$emit('delExhibitionService')//第一个参数是方法名,第二个为传递的参数
  268. },
  269. updateLength(value){
  270. this.formData.length = value;
  271. this.$emit("ChangeCosts",{type: 'stacker',value: this.formData});
  272. },
  273. updateWidth(value){
  274. this.formData.width = value;
  275. this.$emit("ChangeCosts",{type: 'stacker',value: this.formData});
  276. },
  277. updateHeight(value){
  278. this.formData.height = value;
  279. this.$emit("ChangeCosts",{type: 'stacker',value: this.formData});
  280. },
  281. updateWeight(value){
  282. this.formData.weight = value;
  283. this.$emit("ChangeCosts",{type: 'stacker',value: this.formData});
  284. },
  285. updateQuantity(value){
  286. this.formData.quantity = value;
  287. this.$emit("ChangeCosts",{type: 'stacker',value: this.formData});
  288. },
  289. updatePackape(value){
  290. if(this.selectPackageList.length>0){
  291. for(let i=0;i<this.selectPackageList.length;i++){
  292. if(this.selectPackageList[i].id == value){
  293. this.formData.selectPackape = this.selectPackageList[i];
  294. break;
  295. }
  296. }
  297. }
  298. this.formData.package = value;
  299. }
  300. },
  301. };
  302. </script>
  303. <style lang="scss" scoped>
  304. select {
  305. -moz-appearance: none;
  306. /* Firefox */
  307. -webkit-appearance: none;
  308. /* Safari and Chrome */
  309. appearance: none;
  310. background-image: url("~/assets/svg/down-arrow.svg");
  311. background-size: 9px 6px;
  312. background-position: right 20px center;
  313. background-repeat: no-repeat;
  314. }
  315. .service-info {
  316. position: relative;
  317. &::after {
  318. content: "";
  319. display: inline-block;
  320. position: absolute;
  321. right: 0;
  322. top: 5px;
  323. background-image: url("~/assets/svg/down-arrow.svg");
  324. background-size: 100%;
  325. background-position: right center;
  326. background-repeat: no-repeat;
  327. width: 16px;
  328. height: 10px;
  329. transition: all 0.2s linear;
  330. }
  331. &.show {
  332. &::after {
  333. transition: all 0.2s linear;
  334. transform: rotate(180deg);
  335. }
  336. }
  337. }
  338. .bounce-enter-active {
  339. animation: bounce-in 0.3s ease-out;
  340. }
  341. .bounce-leave-active {
  342. animation: bounce-in 0.3s cubic-bezier(1, 0.5, 0.8, 1) reverse;
  343. }
  344. @keyframes bounce-in {
  345. 0% {
  346. opacity: 0;
  347. transform: translateY(-10px);
  348. }
  349. 50% {
  350. opacity: 0.5;
  351. transform: translateY(-5px);
  352. }
  353. 100% {
  354. opacity: 1;
  355. transform: translateY(0);
  356. }
  357. }
  358. </style>