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.

registerIndividual.vue 13KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424
  1. <template>
  2. <main id="main" style="padding-top: 10px; padding-bottom: 50px;">
  3. <div class="form">
  4. <div v-if="boolMessage" class="row">
  5. <div class="col">
  6. <alert
  7. :text="'Register Success! You\'ll be redirected shortly.'"
  8. :type="'SUCCESS'"
  9. />
  10. </div>
  11. </div>
  12. <div v-if="boolValidationError" class="row">
  13. <div class="col">
  14. <alert :text="errorMessage" :type="errorOccurred" />
  15. </div>
  16. </div>
  17. <h3 class="card-title text-center">User Details</h3>
  18. <div class="row">
  19. <div class="col-sm-12 col-md-6">
  20. <div class="form-group">
  21. <float-label label="Name" style="width: 100%;">
  22. <input
  23. type="text"
  24. id="inputName"
  25. class="form-control uniInput my-2"
  26. v-model="indivUser.name"
  27. v-bind:class="{
  28. 'is-valid': indivUser.name,
  29. 'is-invalid': !requiredField(indivUser.name) && nameLoad,
  30. }"
  31. v-on:keyup="nameLoad = true"
  32. v-on:blur="nameLoad = true"
  33. placeholder="Name"
  34. />
  35. <div class="invalid-feedback">Name is required!</div>
  36. </float-label>
  37. </div>
  38. <div class="form-group">
  39. <float-label label="Surname" style="width: 100%;">
  40. <input
  41. type="text"
  42. id="inputSurname"
  43. class="form-control uniInput my-2"
  44. v-model="indivUser.surname"
  45. v-bind:class="{
  46. 'is-valid': indivUser.surname,
  47. 'is-invalid':
  48. !requiredField(indivUser.surname) && surnameLoad,
  49. }"
  50. v-on:keyup="surnameLoad = true"
  51. v-on:blur="surnameLoad = true"
  52. placeholder="Surname"
  53. />
  54. <div class="invalid-feedback">Surname is required!</div>
  55. </float-label>
  56. </div>
  57. <div class="form-group">
  58. <float-label label="Email" style="width: 100%;">
  59. <input
  60. type="email"
  61. id="inputEmail"
  62. v-model="indivUser.email"
  63. class="form-control uniInput my-2"
  64. v-bind:class="{
  65. 'is-valid': indivUser.email,
  66. 'is-invalid': !validEmail(indivUser.email) && emailLoad,
  67. }"
  68. v-on:keyup="emailLoad = true"
  69. v-on:blur="emailLoad = true"
  70. placeholder="Email"
  71. />
  72. <div class="invalid-feedback">
  73. Valid email address is required!
  74. </div>
  75. </float-label>
  76. </div>
  77. </div>
  78. <div class="col-sm-12 col-md-6">
  79. <div class="form-group">
  80. <float-label label="Cellphone Number" style="width: 100%;">
  81. <input
  82. type="text"
  83. id="inputCellNumber"
  84. name="inputCellNumber"
  85. v-model="indivUser.cellNumber"
  86. class="form-control uniInput my-2"
  87. v-bind:class="{
  88. 'is-valid': indivUser.cellNumber,
  89. 'is-invalid':
  90. !requiredField(validPhoneNumber(indivUser.cellNumber)) &&
  91. cellNumberLoad,
  92. }"
  93. v-on:keyup="cellNumberLoad = true"
  94. v-on:blur="cellNumberLoad = true"
  95. placeholder="Cellphone Number"
  96. />
  97. <div class="invalid-feedback">Cellphone number is required!</div>
  98. </float-label>
  99. </div>
  100. <div class="form-group">
  101. <float-label label="Landline Number" style="width: 100%;">
  102. <input
  103. type="text"
  104. id="inputTelephone"
  105. v-model="indivUser.telephone"
  106. class="form-control uniInput my-2"
  107. v-bind:class="{
  108. 'is-valid':
  109. indivUser.telephone &&
  110. validPhoneNumber(indivUser.telephone),
  111. 'is-invalid':
  112. indivUser.telephone &&
  113. !validPhoneNumber(indivUser.telephone),
  114. }"
  115. placeholder="Landline Number"
  116. />
  117. </float-label>
  118. </div>
  119. </div>
  120. </div>
  121. <hr />
  122. <div class="row">
  123. <div class="col-sm-12">
  124. <float-label label="Username" style="width: 100%;">
  125. <input
  126. type="text"
  127. id="inputUsername"
  128. v-model="indivUser.username"
  129. class="form-control uniInput my-2"
  130. v-bind:class="{
  131. 'is-valid': indivUser.username,
  132. 'is-invalid':
  133. !requiredField(indivUser.username) && usernameLoad,
  134. }"
  135. v-on:keyup="usernameLoad = true"
  136. v-on:blur="usernameLoad = true"
  137. placeholder="Username"
  138. />
  139. <div class="invalid-feedback">Username is required!</div>
  140. </float-label>
  141. </div>
  142. </div>
  143. <div class="row">
  144. <div class="col-sm-12 col-md-6">
  145. <float-label label="Password" style="width: 100%;">
  146. <input
  147. type="password"
  148. placeholder="Password "
  149. v-model="indivUser.password"
  150. id="inputPassword"
  151. class="form-control uniInput my-2"
  152. v-bind:class="{
  153. 'is-valid': indivUser.password,
  154. 'is-invalid':
  155. !requiredField(indivUser.password) && passwordLoad,
  156. }"
  157. v-on:keyup="passwordLoad = true"
  158. v-on:blur="passwordLoad = true"
  159. />
  160. <div class="invalid-feedback">Password is required!</div>
  161. </float-label>
  162. </div>
  163. <div class="col">
  164. <float-label label="Confirm Password" style="width: 100%;">
  165. <input
  166. type="password"
  167. placeholder="Confirm Password"
  168. v-model="indivUser.confirmPassword"
  169. id="inputConfirmPassword"
  170. class="form-control uniInput my-2"
  171. v-bind:class="{
  172. 'is-valid': indivUser.confirmPassword,
  173. 'is-invalid':
  174. !validConfirm(indivUser.confirmPassword) &&
  175. confirmPasswordLoad,
  176. }"
  177. v-on:keyup="confirmPasswordLoad = true"
  178. v-on:blur="confirmPasswordLoad = true"
  179. />
  180. <div class="invalid-feedback">
  181. Password and Confirm password must be the same!
  182. </div>
  183. </float-label>
  184. </div>
  185. </div>
  186. <div class="row">
  187. <div class="col">
  188. <label for="tc">
  189. <router-link to="/termsConditionsView">
  190. Terms & Conditions
  191. </router-link>
  192. </label>
  193. <input name="tc" type="checkbox" class="ml-3 mt-2" v-model="terms" />
  194. </div>
  195. </div>
  196. <button
  197. v-if="terms"
  198. class="btn-white-border"
  199. v-on:click="SubmitData()"
  200. type="submit"
  201. >
  202. SUBMIT
  203. </button>
  204. <button
  205. :data-target="'#myNewUserModal'"
  206. data-toggle="modal"
  207. @click="navigate()"
  208. class="btn-white-border"
  209. style="float: right;"
  210. type="submit"
  211. >
  212. Cancel
  213. </button>
  214. <button
  215. hidden
  216. :data-target="'#myModalAgency'"
  217. data-toggle="modal"
  218. ref="dataToggle"
  219. ></button>
  220. </div>
  221. </main>
  222. </template>
  223. <script>
  224. /* eslint-disable */
  225. import { mapState, mapActions } from 'vuex'
  226. import carousel from 'vue-owl-carousel'
  227. import alert from '../shared/alert'
  228. import Log from '../../assets/Log'
  229. export default {
  230. components: {
  231. carousel,
  232. alert,
  233. },
  234. props: {
  235. RegisterHeader: { type: String, default: undefined },
  236. },
  237. name: 'PrivateIndividual',
  238. data() {
  239. return {
  240. isPasswordShown: 'password',
  241. selectItems: [{ text: 'password', value: 0 }],
  242. showPassword: false,
  243. boolMessage: false,
  244. terms: false,
  245. indivUser: {
  246. name: '',
  247. surname: '',
  248. email: '',
  249. cellNumber: '',
  250. telephone: '',
  251. username: '',
  252. password: '',
  253. confirmPassword: '',
  254. },
  255. boolValidationError: false,
  256. nameLoad: false,
  257. surnameLoad: false,
  258. emailLoad: false,
  259. cellNumberLoad: false,
  260. telephoneLoad: false,
  261. usernameLoad: false,
  262. passwordLoad: false,
  263. confirmPasswordLoad: false,
  264. errorOccurred: '',
  265. errorMessage: '',
  266. }
  267. },
  268. computed: {
  269. ...mapState('register', ['registerIndividual']),
  270. Header() {
  271. return this.RegisterHeader
  272. ? 'Agency Administrator Details'
  273. : 'Private Individual'
  274. },
  275. },
  276. methods: {
  277. ...mapActions('register', [
  278. 'getIndividual',
  279. 'saveIndividual',
  280. 'updateIndividual',
  281. 'clearIndividual',
  282. ]),
  283. navigate() {
  284. if (Log.getUser().role !== 'Super Admin') {
  285. this.$router.push('/user/login')
  286. }
  287. },
  288. togglePassword() {
  289. this.showPassword = true
  290. this.isPasswordShown = 'text'
  291. },
  292. passwordToggled() {
  293. this.showPassword = false
  294. this.isPasswordShown = 'password'
  295. },
  296. SubmitData() {
  297. this.indivUser.acceptedTerms = this.terms
  298. if (this.validatePage()) {
  299. this.saveIndividual(this.indivUser)
  300. .then((res) => {
  301. this.boolMessage = true
  302. setTimeout(() => {
  303. if (Log.getUser().role !== 'Super Admin') {
  304. this.$router.push('/user/login')
  305. } else {
  306. this.$refs.dataToggle.click()
  307. this.$router.go()
  308. }
  309. }, 500)
  310. })
  311. .catch((err) => {
  312. console.log(err)
  313. this.boolValidationError = true
  314. this.errorOccurred = 'ERROR'
  315. this.errorMessage = 'Server Error: CONNECTION_REFUSED'
  316. if (err) {
  317. if (err.data.message) {
  318. this.errorMessage = err.data.message
  319. } else {
  320. this.errorMessage = 'Error.'
  321. }
  322. }
  323. })
  324. }
  325. },
  326. Close() {
  327. this.$router.push('/user/login')
  328. },
  329. validatePage: function () {
  330. console.log('validatePage')
  331. if (
  332. this.indivUser.name &&
  333. this.indivUser.surname &&
  334. this.indivUser.email &&
  335. this.indivUser.cellNumber &&
  336. this.indivUser.username &&
  337. this.indivUser.password &&
  338. this.indivUser.password === this.indivUser.confirmPassword &&
  339. this.validPhoneNumber(this.indivUser.cellNumber) &&
  340. this.validPhoneNumber(this.indivUser.telephone)
  341. ) {
  342. this.errorOccurred = ''
  343. this.errorMessage = ''
  344. this.boolValidationError = false
  345. return true
  346. } else {
  347. this.boolValidationError = true
  348. ;(this.nameLoad = true),
  349. (this.surnameLoad = true),
  350. (this.emailLoad = true),
  351. (this.cellNumberLoad = true),
  352. (this.telephoneLoad = true),
  353. (this.usernameLoad = true),
  354. (this.passwordLoad = true),
  355. (this.confirmPasswordLoad = true),
  356. (this.errorOccurred = 'ERROR')
  357. this.errorMessage = 'Please check form and correct all input fields!'
  358. return false
  359. }
  360. },
  361. requiredField: function (tfield) {
  362. if (tfield) {
  363. return true
  364. } else {
  365. return false
  366. }
  367. },
  368. validPhoneNumber(number) {
  369. if (number) {
  370. const rx = /^\(?\d{3}\)?[-\s]?\d{3}[-\s]?\d{4}$/
  371. // const rx = /^[\+]?[(]?[0-9]{3}[)]?[-\s\.]?[0-9]{3}[-\s\.]?[0-9]{4,6}$/im
  372. return rx.test(String(number))
  373. } else {
  374. return true
  375. }
  376. },
  377. validEmail: function (email) {
  378. var re = /(.+)@(.+){2,}\.(.+){2,}/
  379. if (email) {
  380. return re.test(email.toLowerCase())
  381. } else {
  382. return re.test(email)
  383. }
  384. },
  385. validConfirm: function (tfield) {
  386. if (this.requiredField(tfield)) {
  387. if (tfield === this.indivUser.password) {
  388. return true
  389. } else {
  390. return false
  391. }
  392. } else {
  393. return false
  394. }
  395. },
  396. },
  397. }
  398. </script>
  399. <style lang="scss" scoped>
  400. .btn-disabled {
  401. font-family: 'Muli';
  402. font-size: 15px;
  403. letter-spacing: 1px;
  404. display: inline-block;
  405. padding: 10px 32px;
  406. border-radius: 2px;
  407. transition: 0.5s;
  408. margin: 10px;
  409. color: #fff;
  410. background: grey;
  411. border-color: black;
  412. color: black;
  413. cursor: not-allowed;
  414. }
  415. .btn-disabled :hover {
  416. background: grey;
  417. border-color: black;
  418. color: black;
  419. cursor: not-allowed;
  420. }
  421. </style>