HEX
Server: Apache/2.4.52 (Ubuntu)
System: Linux spn-python 5.15.0-89-generic #99-Ubuntu SMP Mon Oct 30 20:42:41 UTC 2023 x86_64
User: arjun (1000)
PHP: 8.1.2-1ubuntu2.20
Disabled: NONE
Upload Files
File: //proc/self/root/home/arjun/projects/buyercall/buyercall/assets/vue/widgets/AccountsTable/Edit.vue
<template>
  <b-modal
    v-model="showEditModal"
    dialog-class="modal-dialog-slideout"
    :hide-footer="true"
    content-class="rounded-0"
  >
    <template #modal-header>
      <button
        type="button"
        class="btn btn-primary"
        @click="$emit('closeAddEditModal')"
      >
        <i class="bx bx-left-arrow-alt font-size-16 align-middle me-2"></i>
        Close
      </button>
    </template>
    <div class="height-set">
      <div class="spinner-main">
        <Loader :loading="loading"> </Loader>
      </div>
      <div class="row justify-content-center" v-if="!loading">
        <div class="col-xl-12">
          <div class="card">
            <div class="card-body">
              <h4 class="card-title">Partnership Account Details</h4>
              <p class="card-title-desc">
                Update or change partnership account details.
              </p>
              <b-form @submit.prevent="formSubmit">
                <div class="row">
                  <div class="col-md-12">
                    <b-form-group class="mb-3" label="Name" label-for="name">
                      <b-form-input
                        id="name"
                        type="text"
                        placeholder="Name"
                        v-model="form.name"
                        name="name"
                        :class="{
                          'is-invalid': submitted && $v.form.name.$error,
                        }"
                      ></b-form-input>
                      <div
                        v-if="submitted && $v.form.name.$error"
                        class="invalid-feedback"
                      >
                        <span v-if="!$v.form.name.required"
                          >This value is required.</span
                        >
                      </div>
                    </b-form-group>
                  </div>
                </div>
                <div class="row">
                  <div class="col-md-12">
                    <b-form-group
                      class="mb-3"
                      label="Description"
                      label-for="description"
                    >
                      <b-form-textarea
                        id="description"
                        rows="3"
                        placeholder="Enter description"
                        v-model="form.description"
                        name="title"
                        :class="{
                          'is-invalid': submitted && $v.form.description.$error,
                        }"
                      ></b-form-textarea>
                      <div
                        v-if="submitted && $v.form.description.$error"
                        class="invalid-feedback"
                      >
                        <span v-if="!$v.form.description.required"
                          >This value is required.</span
                        >
                      </div>
                    </b-form-group>
                  </div>
                </div>
                <div class="row">
                  <div class="col-md-12">
                    <b-form-group
                      class="mb-3"
                      label="Enter safety information"
                      label-for="description"
                    >
                      <b-form-textarea
                        id="safety_information"
                        rows="3"
                        placeholder="Enter safety information"
                        v-model="form.safety_information"
                        name="title"
                        :class="{
                          'is-invalid':
                            submitted && $v.form.safety_information.$error,
                        }"
                      ></b-form-textarea>
                      <div
                        v-if="submitted && $v.form.safety_information.$error"
                        class="invalid-feedback"
                      >
                        <span v-if="!$v.form.safety_information.required"
                          >This value is required.</span
                        >
                      </div>
                    </b-form-group>
                  </div>
                </div>
                <div class="row">
                  <div class="col-md-6">
                    <b-form-group
                      class="mb-3"
                      label="Address One"
                      label-for="address_1"
                    >
                      <b-form-input
                        id="address_1"
                        type="text"
                        placeholder="Address One"
                        v-model="form.address_1"
                        name="address_1"
                        :class="{
                          'is-invalid': submitted && $v.form.address_1.$error,
                        }"
                      ></b-form-input>
                      <div
                        v-if="submitted && $v.form.address_1.$error"
                        class="invalid-feedback"
                      >
                        <span v-if="!$v.form.address_1.required"
                          >This value is required.</span
                        >
                      </div>
                    </b-form-group>
                  </div>
                  <div class="col-md-6">
                    <b-form-group
                      class="mb-3"
                      label="Address Two"
                      label-for="address_2"
                    >
                      <b-form-input
                        id="address_2"
                        type="text"
                        placeholder="Address Two"
                        v-model="form.address_2"
                        name="address_2"
                        :class="{
                          'is-invalid': submitted && $v.form.address_2.$error,
                        }"
                      ></b-form-input>
                      <div
                        v-if="submitted && $v.form.address_2.$error"
                        class="invalid-feedback"
                      >
                        <span v-if="!$v.form.address_2.required"
                          >This value is required.</span
                        >
                      </div>
                    </b-form-group>
                  </div>
                  <div class="col-md-12" v-if="invitation_url">
                    <p class="card-title-desc">
                      Invitation Link : {{ invitation_url }}
                    </p>
                  </div>
                </div>

                <div class="row">
                  <div class="col-md-12">
                    <b-form-group
                      class="mb-3 form-label"
                      label="Partner Account Invitation Url"
                      label-for="formrow-accountsignup"
                    >
                      <span
                        id="formrow-accountsignup"
                        class="text-primary"
                        ref="textToCopy"
                      >
                        {{ invitation_url }}
                      </span>
                      <b-button
                        v-b-popover.top.focus="'Copied!'"
                        variant="light"
                        @click="copyText"
                        >Copy</b-button
                      >
                    </b-form-group>
                  </div>
                </div>

                <div class="row">
                  <div class="col-md-4 mb-3">
                    <b-input-group
                      label="Email"
                      label-for="formrow-email-input"
                    >
                      <template #append>
                        <b-input-group-text>{{
                          `@${partnershipDetails.partnerUrl}`
                        }}</b-input-group-text>
                        <div
                          v-if="submitted && $v.form.email.$error"
                          class="invalid-feedback"
                        >
                          <span v-if="!$v.form.email.required"
                            >This value is required.</span
                          >
                        </div>
                      </template>
                      <b-form-input
                        id="formrow-emailPrefix-input"
                        type="text"
                        placeholder="Email Prefix"
                        v-model="form.email"
                        name="email"
                        :disabled="this.selectedAccount !== null"
                        :class="{
                          'is-invalid': submitted && $v.form.email.$error,
                        }"
                      ></b-form-input>
                    </b-input-group>
                  </div>
                </div>
                <div class="row">
                  <div class="col-md-4">
                    <b-form-group class="mb-3" label="City" label-for="city">
                      <b-form-input
                        id="city"
                        type="text"
                        placeholder="City"
                        v-model="form.city"
                        name="city"
                        :class="{
                          'is-invalid': submitted && $v.form.city.$error,
                        }"
                      ></b-form-input>
                      <div
                        v-if="submitted && $v.form.city.$error"
                        class="invalid-feedback"
                      >
                        <span v-if="!$v.form.city.required"
                          >This value is required.</span
                        >
                      </div>
                    </b-form-group>
                  </div>
                  <div class="col-md-4">
                    <b-form-group class="mb-3" label="State" label-for="state">
                      <b-form-input
                        id="state"
                        type="text"
                        placeholder="State"
                        v-model="form.state"
                        name="state"
                        :class="{
                          'is-invalid': submitted && $v.form.state.$error,
                        }"
                      ></b-form-input>
                      <div
                        v-if="submitted && $v.form.state.$error"
                        class="invalid-feedback"
                      >
                        <span v-if="!$v.form.state.required"
                          >This value is required.</span
                        >
                      </div>
                    </b-form-group>
                  </div>
                  <div class="col-md-4">
                    <b-form-group
                      class="mb-3"
                      label="Zip Code"
                      label-for="zip_code"
                    >
                      <b-form-input
                        id="zip_code"
                        type="text"
                        placeholder="Zip Code"
                        v-model="form.zip_code"
                        name="zip_code"
                        :class="{
                          'is-invalid': submitted && $v.form.zip_code.$error,
                        }"
                      ></b-form-input>
                      <div
                        v-if="submitted && $v.form.zip_code.$error"
                        class="invalid-feedback"
                      >
                        <span v-if="!$v.form.zip_code.required"
                          >This value is required.</span
                        >
                      </div>
                    </b-form-group>
                  </div>
                  <div class="col-md-4">
                    <b-form-group
                      class="mb-3"
                      label="Country"
                      label-for="country"
                    >
                      <b-form-input
                        id="country"
                        type="text"
                        placeholder="Country"
                        v-model="form.country"
                        name="zip_code"
                        :class="{
                          'is-invalid': submitted && $v.form.country.$error,
                        }"
                      ></b-form-input>
                      <div
                        v-if="submitted && $v.form.country.$error"
                        class="invalid-feedback"
                      >
                        <span v-if="!$v.form.country.required"
                          >This value is required.</span
                        >
                      </div>
                    </b-form-group>
                  </div>
                  <div class="col-md-4 mb-3">
                    <label for="timezone">Timezone</label>
                    <multiselect
                      v-model="form.timezone"
                      :options="timeZones"
                      :multiple="false"
                      label="label"
                      :class="{
                        'is-invalid': submitted && $v.form.timezone.$error,
                      }"
                    ></multiselect>
                    <div
                      v-if="submitted && $v.form.timezone.$error"
                      class="invalid-feedback"
                    >
                      <span v-if="!$v.form.timezone.required"
                        >This value is required.</span
                      >
                    </div>
                  </div>
                  <div class="col-md-4 mb-3">
                    <label for="timezone">Billing Type</label>
                    <multiselect
                      v-model="form.billing_type"
                      :options="billing_types"
                      :multiple="false"
                      label="label"
                      :class="{
                        'is-invalid': submitted && $v.form.billing_type.$error,
                      }"
                    ></multiselect>
                    <div
                      v-if="submitted && $v.form.billing_type.$error"
                      class="invalid-feedback"
                    >
                      <span v-if="!$v.form.billing_type.required"
                        >This value is required.</span
                      >
                    </div>
                  </div>
                  <div class="col-md-4 mb-3">
                    <label for="timezone">Business Type</label>
                    <multiselect
                      v-model="form.business_type"
                      :options="business_types"
                      :multiple="false"
                      label="label"
                      :class="{
                        'is-invalid': submitted && $v.form.business_type.$error,
                      }"
                    ></multiselect>
                    <div
                      v-if="submitted && $v.form.business_type.$error"
                      class="invalid-feedback"
                    >
                      <span v-if="!$v.form.business_type.required"
                        >This value is required.</span
                      >
                    </div>
                  </div>
                </div>
                <div class="row">
                  <div class="col-md-4">
                    <div
                      class="form-check form-switch mb-3 form-switch-lg d-flex"
                    >
                      <input
                        class="form-check-input"
                        type="checkbox"
                        id="active"
                        v-model="form.active"
                      />
                      <label class="form-check-label" for="isActive"
                        >Is Active</label
                      >
                    </div>
                  </div>
                </div>
                <!-- GENERAL SCHEDULE  -->
                <div class="row">
                  <div class="col-md-12">
                    <h5>General Schedule</h5>
                  </div>
                  <div class="col-md-5">
                    <div
                      class="form-check form-switch mb-3 form-switch-lg d-flex"
                    >
                      <input
                        class="form-check-input"
                        type="checkbox"
                        id="availableAllHours"
                        v-model="availableAllHours"
                      />
                      <label class="form-check-label" for="availableAllHours"
                        >Available all hours</label
                      >
                    </div>
                  </div>
                </div>
                <div class="table-responsive mb-3">
                  <table class="table mb-0">
                    <thead class="table-light">
                      <tr>
                        <th>Available Days</th>
                        <th>Available From</th>
                        <th>Available To</th>
                      </tr>
                    </thead>
                    <tbody>
                      <tr v-for="(v, index) in availInfo" :key="index">
                        <th scope="row">
                          <div
                            class="form-check form-switch mb-3 form-switch-lg"
                          >
                            <input
                              class="form-check-input"
                              type="checkbox"
                              v-model="v.is_active"
                              :disabled="v.disabled"
                            />
                            <label class="form-check-label">{{
                              v.label
                            }}</label>
                          </div>
                        </th>
                        <td>
                          <date-picker
                            v-model="v.start"
                            format="hh:mm a"
                            value-type="format"
                            type="time"
                            placeholder="hh:mm a"
                            :disabled="v.disabled"
                            :input-class="
                              submitted && v.startRequired
                                ? 'mx-input parsley-error'
                                : 'mx-input'
                            "
                            @change="resetFormErrors"
                          ></date-picker>
                          <div
                            v-if="submitted && v.startRequired"
                            class="invalid-feedback-custom"
                          >
                            <span>This value is required.</span>
                          </div>
                        </td>
                        <td>
                          <date-picker
                            v-model="v.stop"
                            format="hh:mm a"
                            value-type="format"
                            type="time"
                            placeholder="hh:mm a"
                            :disabled="v.disabled"
                            @change="resetFormErrors"
                            :input-class="
                              submitted && v.stopRequired
                                ? 'mx-input parsley-error'
                                : 'mx-input'
                            "
                          ></date-picker>
                          <div
                            v-if="submitted && v.stopRequired"
                            class="invalid-feedback-custom"
                          >
                            <span>This value is required.</span>
                          </div>
                        </td>
                      </tr>
                    </tbody>
                  </table>
                </div>

                <!-- SERVICE SCHEDULE  -->
                <div
                  class="row"
                  v-if="
                    form.business_type &&
                    form.business_type.value === 'automotive'
                  "
                >
                  <div class="col-md-12">
                    <h5>Service Schedule</h5>
                  </div>
                  <div class="col-md-5">
                    <div
                      class="form-check form-switch mb-3 form-switch-lg d-flex"
                    >
                      <input
                        class="form-check-input"
                        type="checkbox"
                        id="serviceavailableAllHours"
                        v-model="serviceavailableAllHours"
                      />
                      <label
                        class="form-check-label"
                        for="serviceavailableAllHours"
                        >Available all hours</label
                      >
                    </div>
                  </div>
                </div>
                <div
                  class="table-responsive mb-3"
                  v-if="
                    form.business_type &&
                    form.business_type.value === 'automotive'
                  "
                >
                  <table class="table mb-0">
                    <thead class="table-light">
                      <tr>
                        <th>Available Days</th>
                        <th>Available From</th>
                        <th>Available To</th>
                      </tr>
                    </thead>
                    <tbody>
                      <tr v-for="(v, index) in serviceAvailInfo" :key="index">
                        <th scope="row">
                          <div
                            class="form-check form-switch mb-3 form-switch-lg"
                          >
                            <input
                              class="form-check-input"
                              type="checkbox"
                              v-model="v.is_active"
                              :disabled="v.disabled"
                            />
                            <label class="form-check-label">{{
                              v.label
                            }}</label>
                          </div>
                        </th>
                        <td>
                          <date-picker
                            v-model="v.start"
                            format="hh:mm a"
                            value-type="format"
                            type="time"
                            placeholder="hh:mm a"
                            :disabled="v.disabled"
                            :input-class="
                              submitted && v.startRequired
                                ? 'mx-input parsley-error'
                                : 'mx-input'
                            "
                            @change="resetFormErrors"
                          ></date-picker>
                          <div
                            v-if="submitted && v.startRequired"
                            class="invalid-feedback-custom"
                          >
                            <span>This value is required.</span>
                          </div>
                        </td>
                        <td>
                          <date-picker
                            v-model="v.stop"
                            format="hh:mm a"
                            value-type="format"
                            type="time"
                            placeholder="hh:mm a"
                            :disabled="v.disabled"
                            @change="resetFormErrors"
                            :input-class="
                              submitted && v.stopRequired
                                ? 'mx-input parsley-error'
                                : 'mx-input'
                            "
                          ></date-picker>
                          <div
                            v-if="submitted && v.stopRequired"
                            class="invalid-feedback-custom"
                          >
                            <span>This value is required.</span>
                          </div>
                        </td>
                      </tr>
                    </tbody>
                  </table>
                </div>
                <div class="">
                  <b-button variant="primary" type="submit">
                    <i
                      class="
                        bx bx-loader bx-spin
                        font-size-16
                        align-middle
                        me-2
                      "
                      v-if="addEditLoading"
                    ></i>
                    Save</b-button
                  >
                </div>
              </b-form>
            </div>
          </div>
        </div>
      </div>
    </div>
  </b-modal>
</template>
<script>
import { required } from 'vuelidate/lib/validators';
import Loader from '../../components/Loader/loader.vue';
import Multiselect from 'vue-multiselect';
import * as _ from 'lodash';
import PartnershipAcountService from '../../service/partnershipAcountService';
import { toastConfig } from '../../utils/util';
import { scheduleInfo } from './constants';
import DatePicker from 'vue-datepicker-next';

import { BButton,BModal,BForm,BFormGroup,BFormInput,BFormTextarea,BPopover,BInputGroupText,BInputGroup} from 'bootstrap-vue-next'

export default {
  mounted() {
    if (this.selectedAccount !== null) {
      this.getAccountDetails();
    }
  },
  props: {
    partnershipDetails: {},
    selectedAccount: {},
    addEditLoading: {
      type: Boolean,
      required: true,
    },
    timeZones: {
      type: Array,
      required: true,
    },
    billing_types: {
      type: Array,
      required: true,
    },
    business_types: {
      type: Array,
      required: true,
    },
  },
  data() {
    return {
      availInfo: scheduleInfo,
      serviceAvailInfo: scheduleInfo,
      availableAllHours: false,
      serviceavailableAllHours: false,
      showEditModal: true,
      detailLoading: false,
      submitted: false,
      invitation_url: null,
      form: {
        name: '',
        description: '',
        safety_information: '',
        address_1: '',
        address_2: '',
        city: '',
        state: '',
        zip_code: '',
        country: '',
        timezone: null,
        email: '',
        active: true,
        billing_type: null,
        business_type: null,
        scheduleData: null,
      },
    };
  },
  validations: {
    form: {
      name: { required },
      description: { required },
      timezone: { required },
      email: { required },
      billing_type: { required },
      business_type: { required },
      safety_information: { required },
      address_1: { required },
      address_2: { required },
      city: { required },
      state: { required },
      zip_code: { required },
      country: { required },
    },
  },
  computed: {
    loading() {
      return this.detailLoading;
    },
  },
  methods: {
    copyText() {
      this.selectText(this.$refs.textToCopy); // e.g. <div ref="text">
    },
    selectText(element) {
      var range;
      if (document.selection) {
        // IE
        range = document.body.createTextRange();
        range.moveToElementText(element);
        range.select();
      } else if (window.getSelection) {
        range = document.createRange();
        range.selectNode(element);
        window.getSelection().removeAllRanges();
        window.getSelection().addRange(range);
      }
    },
    resetComponentInfo(data) {
      if (!_.isEmpty(data.scheduleData)) {
        this.availableAllHours = data.scheduleData.allHours;
        if (_.isEmpty(data.scheduleData.availableHours)) {
          this.availInfo = scheduleInfo;
          return;
        }
        const cleanedScheduleData = _.map(
          data.scheduleData.availableHours,
          (i) => ({ ...i, day_id: parseInt(i.day_id) }),
        );
        this.availInfo = _.map(this.availInfo, (i) => {
          const dayInfo = _.find(
            cleanedScheduleData,
            ({ day_id }) => day_id === i.day_id,
          );

          return {
            ...i,
            is_active: dayInfo ? dayInfo.is_active : i.is_active,
            start: dayInfo ? dayInfo.start : i.start,
            stop: dayInfo ? dayInfo.stop : i.stop,
            schedule_id: dayInfo ? dayInfo.schedule_id : i.schedule_id,
          };
        });
      }
    },
    resetFormErrors() {
      // this.timzoneFieldValid = true;
      this.submitted = false;
      this.availInfo = _.map(this.availInfo, (i) => {
        return {
          ...i,
          startRequired: false,
          stopRequired: false,
        };
      });
    },
    resetFormErrorsService() {
      // this.timzoneFieldValid = true;
      this.submitted = false;
      this.serviceAvailInfo = _.map(this.serviceAvailInfo, (i) => {
        return {
          ...i,
          startRequired: false,
          stopRequired: false,
        };
      });
    },
    getAccountDetails() {
      this.detailLoading = true;
      PartnershipAcountService.getPartnershipAccountDetails(
        this.selectedAccount,
      )
        .then(({ data: { success, message, data } }) => {
          if (success) {
            this.detailLoading = false;
            this.form = {
              ...data,
              billing_type: _.find(
                this.billing_types,
                ({ value }) => value === data.billing_type,
              ),
              business_type: _.find(
                this.business_types,
                ({ value }) => value === data.business_type,
              ),
              timezone: _.find(
                this.timeZones,
                ({ value }) => value === data.timezone,
              ),
            };
            this.invitation_url = data.invitation_url;
            this.resetComponentInfo(data);
          } else {
            this.$toast.open(toastConfig.toastError(message));
            this.detailLoading = false;
          }
        })
        .catch((e) => {
          this.detailLoading = false;
          this.$toast.open(
            toastConfig.toastError(
              'Something went wrong while adding partnership account!',
            ),
          );
        });
    },
    formSubmit() {
      this.submitted = true;
      let scheduleFormIsValid = true;
      let scheduleServiceFormIsValid = true;
      if (!this.availableAllHours) {
        this.availInfo = _.map(this.availInfo, (i) => {
          if ((i.is_active && !i.start) || (i.is_active && !i.stop)) {
            scheduleFormIsValid = false;
          }
          return {
            ...i,
            startRequired: i.is_active && !i.start ? true : false,
            stopRequired: i.is_active && !i.stop ? true : false,
          };
        });
      }
      if (!this.serviceavailableAllHours) {
        this.serviceAvailInfo = _.map(this.serviceAvailInfo, (i) => {
          if ((i.is_active && !i.start) || (i.is_active && !i.stop)) {
            scheduleServiceFormIsValid = false;
          }
          return {
            ...i,
            startRequired: i.is_active && !i.start ? true : false,
            stopRequired: i.is_active && !i.stop ? true : false,
          };
        });
      }
      if (!scheduleFormIsValid || !scheduleServiceFormIsValid) {
        return;
      }
      // this.$v.$touch();
      // if (this.$v.$invalid) {
      //   return;
      // }
      let formData = {
        ...this.form,
        timezone: this.form.timezone.value,
        billing_type: this.form.billing_type.value,
        business_type: this.form.business_type.value,

        // timeZone: this.timeZoneId.value,
        generalScheduleData: {
          allHours: this.availableAllHours,
          availableHours: _.map(this.availInfo, (i) => ({
            day_id: `${i.day_id}`,
            ..._.omit(i, [
              'disabled',
              'startRequired',
              'stopRequired',
              'label',
            ]),
          })),
        },
      };
      if (
        this.form.business_type &&
        this.form.business_type.value === 'automotive'
      ) {
        formData = {
          ...formData,
          serviceScheduleData: {
            allHours: this.serviceavailableAllHours,
            availableHours: _.map(this.serviceAvailInfo, (i) => ({
              day_id: `${i.day_id}`,
              ..._.omit(i, [
                'disabled',
                'startRequired',
                'stopRequired',
                'label',
              ]),
            })),
          },
        };
      }
      this.$emit('formSubmit', formData);
    },
  },
  components: {
    Loader,
    Multiselect,
    DatePicker,
    BButton,BModal,BForm,BFormGroup,BFormInput,BFormTextarea,BPopover,BInputGroupText,BInputGroup
  },
  watch: {
    availableAllHours(v) {
      this.availInfo = _.map(this.availInfo, (i) => ({
        ...i,
        disabled: v ? true : false,
      }));
    },
    serviceavailableAllHours(v) {
      this.serviceAvailInfo = _.map(this.serviceAvailInfo, (i) => ({
        ...i,
        disabled: v ? true : false,
      }));
    },
  },
};
</script>