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.

296 lines
8.0 KiB

  1. <template>
  2. <client-only>
  3. <div
  4. class="purchaser-info tw-p-5 tw-mb-[20px] tw-bg-white tw-rounded-xl"
  5. >
  6. <div class="tw-flex tw-flex-row tw-justify-between tw-items-center">
  7. <h3
  8. :class="[
  9. 'collapse',
  10. 't16',
  11. 'tw-relative',
  12. 'tw-cursor-pointer',
  13. 'xl:tw-text-[18px]',
  14. show ? 'show' : 'hide',
  15. disabled ? 'disabled' : '',
  16. disabled ? 'tw-text-neutrals-300' : 'tw-text-black',
  17. ]"
  18. @click="show = !show"
  19. >
  20. {{ $t("Ordering person") }}
  21. </h3>
  22. <div class="element content-status xl:tw-ml-[20px]">
  23. <span
  24. v-if="orderingPersonValidation == true"
  25. class="status-check-icon tw-inline-block tw-w-[30px] tw-h-[30px]"
  26. ></span>
  27. </div>
  28. </div>
  29. <Transition name="bounce">
  30. <div v-show="show">
  31. <div class="tw-mt-[32px] md:tw-ml-[60px]">
  32. <div class="element element-tabs tw-mb-[20px]">
  33. <div
  34. class="element element-form tw-grid tw-grid-cols-1 tw-gap-[10px] md:tw-grid-cols-2 md:tw-gap-x-[60px] md:tw-gap-y-[20px] md:tw-max-w-[580px]"
  35. >
  36. <!-- first name -->
  37. <div class="element">
  38. <elementInput
  39. :input="{
  40. id: 'FirstName',
  41. label: 'First Name',
  42. required: true,
  43. type: 'text',
  44. }"
  45. :default="userData.first_name"
  46. :validation="validation.first_name"
  47. @change="userData.first_name = $event"
  48. ></elementInput>
  49. </div>
  50. <!-- last name -->
  51. <div class="element">
  52. <elementInput
  53. :input="{
  54. id: 'LastName',
  55. label: 'Last Name',
  56. required: true,
  57. type: 'text',
  58. }"
  59. :default="userData.last_name"
  60. :validation="validation.last_name"
  61. @change="userData.last_name = $event"
  62. ></elementInput>
  63. </div>
  64. <!-- Email -->
  65. <div class="element">
  66. <elementInput
  67. :input="{
  68. id: 'ContactEmail',
  69. label: 'Contact Email',
  70. required: true,
  71. type: 'email',
  72. }"
  73. :default="userData.email"
  74. :validation="validation.email"
  75. @change="userData.email = $event"
  76. >
  77. </elementInput>
  78. </div>
  79. <!-- phoneNumber -->
  80. <div class="element">
  81. <label class="tw-block tw-mb-[10px]"
  82. ><span
  83. >{{ $t("Phone") }}<span class="required">*</span></span
  84. ></label
  85. >
  86. <div class="tw-grid tw-grid-cols-[120px_auto] tw-gap-[5px]">
  87. <elementCountryCodeSelect :select="{
  88. required: true,
  89. }" :userCodeSelect="userData.phone_code" :validation="validation.phone_code" @returnCode = "getReturnCode"
  90. >
  91. </elementCountryCodeSelect>
  92. <vue-phone-number-input v-model="userData.phone_number" :validation="validation.phone_number" color="#E5e5e5" error-color="#ef5a5a"
  93. valid-color="#e5e5e5"
  94. :error="error" :border-radius="5"
  95. no-flags :no-country-selector="true" no-example @update="getPhoneData" :translations="translateOption">
  96. </vue-phone-number-input>
  97. </div>
  98. </div>
  99. <!-- country -->
  100. <div class="element">
  101. <elementSelect
  102. :select="{
  103. id: 'Country',
  104. label: 'Country/Region',
  105. required: true,
  106. }"
  107. :selectList="countryOptions"
  108. :default="userData.country"
  109. :validation="validation.country"
  110. @change="userData.country = $event"
  111. ></elementSelect>
  112. </div>
  113. </div>
  114. </div>
  115. </div>
  116. </div>
  117. </Transition>
  118. </div>
  119. </client-only>
  120. </template>>
  121. <script>
  122. import elementInput from "@/components/newComponent/form/ElementInput";
  123. import elementSelect from "@/components/newComponent/form/ElementSelect";
  124. import elementCountryCodeSelect from "@/components/newComponent/form/ElementCountryCodeSelect.vue";
  125. import { IsNumber } from "~/utils/common";
  126. import is from "is_js";
  127. export default {
  128. name: "OrderingPersonInfo",
  129. props: {
  130. countryOptions: {
  131. type: Array,
  132. },
  133. },
  134. components: {
  135. elementInput,
  136. elementSelect,
  137. elementCountryCodeSelect,
  138. IsNumber,
  139. is
  140. },
  141. data() {
  142. return {
  143. show: false,
  144. disabled: false,
  145. orderingPersonValidation: false,
  146. userData: {
  147. first_name: "",
  148. last_name: "",
  149. email: "",
  150. phone_number: "",
  151. country: "0",
  152. phone_code: "",
  153. UserCompany: [],
  154. },
  155. validation: {
  156. first_name: true,
  157. last_name: true,
  158. email: true,
  159. phone_code: true,
  160. phone_number: true,
  161. country: true,
  162. },
  163. }
  164. },
  165. created() {
  166. this.getUser()
  167. },
  168. watch: {},
  169. methods: {
  170. async getUser() {
  171. await this.$axios
  172. .get(`/trending/api/Onsite/MemberInfo`)
  173. .then((res) => {
  174. if(res && res.data && res.data.DATA && res.data.DATA.rel){
  175. const data = res.data.DATA.rel
  176. if(data){
  177. this.userData.first_name = data.FirstName;
  178. this.userData.last_name = data.LastName;
  179. this.userData.email = data.Email;
  180. this.userData.phone_number = data.Phone;
  181. this.userData.country = data.CountryID;
  182. this.userData.phone_code = data.PhoneCode;
  183. }
  184. }
  185. })
  186. },
  187. getReturnCode(code){
  188. this.userData.phone_code = code;
  189. },
  190. getPhoneData(phoneData) {
  191. this.validation.phone_number = phoneData.isValid;
  192. },
  193. }
  194. }
  195. </script>
  196. <style lang="scss" scoped>
  197. .collapse {
  198. &::before {
  199. content: "";
  200. display: inline-block;
  201. position: relative;
  202. left: 0;
  203. top: 0;
  204. background-image: url("~/assets/svg/down-arrow.svg");
  205. background-repeat: no-repeat;
  206. background-position: center;
  207. background-size: 100%;
  208. width: 16px;
  209. height: 10px;
  210. margin-right: 40px;
  211. transform: rotate(-90deg);
  212. transition: all 0.2s linear;
  213. }
  214. &.disabled {
  215. pointer-events: none;
  216. &::before {
  217. background-image: url("~/assets/svg/down-arrow-disabled.svg");
  218. }
  219. }
  220. &.show {
  221. &::before {
  222. transform: rotate(0);
  223. transition: all 0.2s linear;
  224. }
  225. }
  226. }
  227. .btn-add-icon {
  228. background-image: url("~/assets/svg/plus-blue.svg");
  229. background-repeat: no-repeat;
  230. background-position: left 12px center;
  231. background-size: 16px 16px;
  232. }
  233. .btn-edit-icon {
  234. background-image: url("~/assets/svg/edit-info.svg");
  235. background-repeat: no-repeat;
  236. background-position: center;
  237. background-size: 100%;
  238. }
  239. .bounce-enter-active {
  240. animation: bounce-in 0.3s ease-out;
  241. }
  242. .bounce-leave-active {
  243. animation: bounce-in 0.3s cubic-bezier(1, 0.5, 0.8, 1) reverse;
  244. }
  245. @keyframes bounce-in {
  246. 0% {
  247. opacity: 0;
  248. transform: translateY(-10px);
  249. }
  250. 50% {
  251. opacity: 0.5;
  252. transform: translateY(-5px);
  253. }
  254. 100% {
  255. opacity: 1;
  256. transform: translateY(0);
  257. }
  258. }
  259. .status-check-icon {
  260. background-image: url("~/assets/svg/status-check.svg");
  261. background-size: 100%;
  262. background-repeat: no-repeat;
  263. background-position: center;
  264. }
  265. :deep(.input-tel__input) {
  266. height: 44px !important;
  267. padding-left: 13px !important;
  268. }
  269. </style>