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: //home/arjun/projects/buyercall/buyercall/assets/vue/widgets/ProfileSettings/ScheduleAvailInfo.vue
<template>
  <div class="row justify-content-center">
    <div class="col-xl-12">
      <div class="card">
        <div class="card-body">
          <h4 class="card-title">Schedule & Availability Information</h4>
          <p class="card-text-desc">
            Update your schedule and availability information to ensure you are
            available at the correct times
          </p>
          <div
            role="alert"
            aria-live="polite"
            aria-atomic="true"
            class="alert alert-info"
          >
            Your current timezone is {{ profileData.timeZoneId }}. To update
            your timezone please visit the
            <a @click.prevent="$emit('selectTabIndex', 0)"
              ><strong>Personal Information</strong></a
            >
            section.
          </div>
          <!-- <div class="row">
            <div class="col-md-5">
              <div class="mt-2 mb-3">
                <label>Timezone</label>
                <multiselect
                  v-model="timeZoneId"
                  @input="resetFormErrors"
                  :options="timeZones"
                  placeholder="Select timezone"
                  label="label"
                  :class="{
                    'is-invalid': submitted && !timzoneFieldValid,
                  }"
                ></multiselect>
                <div
                  v-if="submitted && !timzoneFieldValid"
                  class="invalid-feedback-custom"
                >
                  <span>This value is required.</span>
                </div>
              </div>
            </div>
          </div> -->
          <div class="row">
            <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>
          <div>
            <b-button variant="primary" @click="submit">
              <i
                class="bx bx-loader bx-spin font-size-16 align-middle me-2"
                v-if="scheduleSubmitloading"
              ></i>
              Save</b-button
            >
            <b-button variant="light">Cancel</b-button>
          </div>
        </div>
      </div>
    </div>
  </div>
</template>
<script>
import Multiselect from 'vue-multiselect';
import DatePicker from 'vue-datepicker-next';
import * as _ from 'lodash';
import { BButton} from 'bootstrap-vue-next'

const initAvailInfo = [
  {
    label: 'Sunday',
    day_id: 0,
    is_active: false,
    start: '08:00 am',
    stop: '05:00 pm',
    disabled: false,
    schedule_id: null,
    startRequired: false,
    stopRequired: false,
  },
  {
    label: 'Monday',
    day_id: 1,
    is_active: false,
    start: '08:00 am',
    stop: '05:00 pm',
    disabled: false,
    schedule_id: null,
    startRequired: false,
    stopRequired: false,
  },
  {
    label: 'Tuesday',
    day_id: 2,
    is_active: false,
    start: '08:00 am',
    stop: '05:00 pm',
    disabled: false,
    schedule_id: null,
    startRequired: false,
    stopRequired: false,
  },
  {
    label: 'Wednesday',
    day_id: 3,
    is_active: false,
    start: '08:00 am',
    stop: '05:00 pm',
    disabled: false,
    schedule_id: null,
    startRequired: false,
    stopRequired: false,
  },
  {
    label: 'Thursday',
    day_id: 4,
    is_active: false,
    start: '08:00 am',
    stop: '05:00 pm',
    disabled: false,
    schedule_id: null,
    startRequired: false,
    stopRequired: false,
  },
  {
    label: 'Friday',
    day_id: 5,
    is_active: false,
    start: '08:00 am',
    stop: '05:00 pm',
    disabled: false,
    schedule_id: null,
    startRequired: false,
    stopRequired: false,
  },
  {
    label: 'Saturday',
    day_id: 6,
    is_active: false,
    start: '08:00 am',
    stop: '05:00 pm',
    disabled: false,
    schedule_id: null,
    startRequired: false,
    stopRequired: false,
  },
];
export default {
  components: {
    Multiselect,
    DatePicker,
    BButton
  },
  props: {
    timeZones: {
      type: Array,
      required: true,
    },
    scheduleData: {
      type: Object,
      required: true,
    },
    scheduleSubmitloading: {
      type: Boolean,
      required: true,
    },
    profileData: {
      type: Object,
      required: true,
    },
  },
  mounted() {
    this.resetComponentInfo();
  },

  data() {
    return {
      submitted: false,
      // timeZoneId: null,
      availableAllHours: false,
      availInfo: initAvailInfo,
      timzoneFieldValid: true,
    };
  },
  methods: {
    submit() {
      this.submitted = true;
      let formIsValid = true;
      if (!this.availableAllHours) {
        this.availInfo = _.map(this.availInfo, (i) => {
          if ((i.is_active && !i.start) || (i.is_active && !i.stop)) {
            formIsValid = false;
          }
          return {
            ...i,
            startRequired: i.is_active && !i.start ? true : false,
            stopRequired: i.is_active && !i.stop ? true : false,
          };
        });
      }
      if (!formIsValid) {
        return;
      }
      this.$emit('form-submit', {
        allHours: this.availableAllHours,
        // timeZone: this.timeZoneId.value,
        availableHours: _.map(this.availInfo, (i) => ({
          day_id: `${i.day_id}`,
          ..._.omit(i, ['disabled', 'startRequired', 'stopRequired', 'label']),
        })),
      });
    },
    resetFormErrors() {
      // this.timzoneFieldValid = true;
      this.submitted = false;
      this.availInfo = _.map(this.availInfo, (i) => {
        return {
          ...i,
          startRequired: false,
          stopRequired: false,
        };
      });
    },
    resetComponentInfo() {
      if (!_.isEmpty(this.scheduleData)) {
        this.availableAllHours = this.scheduleData.allHours;
        if (_.isEmpty(this.scheduleData.availableHours)) {
          this.availInfo = initAvailInfo;
          return;
        }
        const cleanedScheduleData = _.map(
          this.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,
          };
        });
      }
    },
  },
  watch: {
    availableAllHours(v) {
      this.availInfo = _.map(this.availInfo, (i) => ({
        ...i,
        disabled: v ? true : false,
      }));
    },
  },
};
</script>