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/userManagement/components/EditForm.vue
<template>
  <div class="height-set workflow-edit-modal">
    <div class="spinner-main">
      <Loader :loading="widgetLoading"> </Loader>
    </div>
    <div class="row d-flex justify-content-between" v-if="!widgetLoading">
      <h4 class="mb-3">{{ AddUser ? "Add" : "Update" }} User Management</h4>
      <b-form @submit.prevent="formSubmit">
        <div class="row mb-4">
          <div class="col-md-12">
            <div class="card">
              <div class="card-body">
                <h5 class="card-title mb-3">User's Personal Information</h5>
                <h6 class="card-subtitle mb-4 card-title-desc">
                  {{ AddUser ? "Add" : "Update" }} user's personal information
                </h6>

                <!-------------Created On-------------------->
                <div class="row" v-if="!AddUser">
                  <div class="col-md-4">
                    <b-form-group
                      class="mb-3"
                      label="Created On :"
                      label-for="formrow-firstname-input"
                      label-class="font-weight-normal"
                    >
                      <b-form-group
                        class="mb-3 grey-clolr"
                        :label="created_on"
                        label-for="formrow-firstname-input"
                        label-class="font-weight-normal"
                      />
                    </b-form-group>
                  </div>

                  <!-------------Updated On-------------------->
                  <div class="col-md-4">
                    <b-form-group
                      class="mb-3"
                      label="Updated On :"
                      label-for="formrow-lastname-input"
                      label-class="font-weight-normal"
                    >
                      <b-form-group
                        class="mb-3 grey-clolr"
                        :label="updated_on"
                        label-for="formrow-firstname-input"
                        label-class="font-weight-normal"
                      />
                    </b-form-group>
                  </div>

                  <!-------------Role-------------------->
                  <div class="col-md-4">
                    <b-form-group
                      class="mb-3"
                      label="SID :"
                      label-for="formrow-role-input"
                      label-class="font-weight-normal"
                    >
                      <b-form-group
                        class="mb-3 grey-clolr"
                        :label="sid"
                        label-for="formrow-firstname-input"
                        label-class="font-weight-normal"
                      />
                    </b-form-group>
                  </div>
                </div>

                <!-------------First Name-------------------->
                <div class="row">
                  <div class="col-md-4">
                    <b-form-group
                      class="mb-3"
                      label="Give your First Name: *"
                      label-for="formrow-firstname-input"
                      label-class="font-weight-normal"
                    >
                      <b-form-input
                        id="formrow-firstname-input"
                        type="text"
                        placeholder="First Name"
                        v-model="form.firstname"
                        name="widgetfirstname"
                        :class="{
                          'is-invalid': submitted && v$.form.firstname.$error,
                        }"
                      ></b-form-input>
                      <div
                        v-if="submitted && v$.form.firstname.$error"
                        class="invalid-feedback"
                      >
                        <span>This value is required.</span>
                      </div>
                    </b-form-group>
                  </div>

                  <!-------------Last Name-------------------->
                  <div class="col-md-4">
                    <b-form-group
                      class="mb-3"
                      label="Give your Last name: *"
                      label-for="formrow-lastname-input"
                      label-class="font-weight-normal"
                    >
                      <b-form-input
                        id="formrow-lastname-input"
                        type="text"
                        placeholder="Last name"
                        v-model="form.lastname"
                        name="widgetlastname"
                        :class="{
                          'is-invalid': submitted && v$.form.lastname.$error,
                        }"
                      ></b-form-input>
                      <div
                        v-if="submitted && v$.form.lastname.$error"
                        class="invalid-feedback"
                      >
                        <span>This value is required.</span>
                      </div>
                    </b-form-group>
                  </div>

                  <!-------------Role-------------------->
                  <div class="col-md-4">
                    <b-form-group
                      class="mb-3"
                      label="Select your role: *"
                      label-for="formrow-role-input"
                      label-class="font-weight-normal"
                    >
                      <b-form-select
                        class="form-select form-select-sm"
                        v-model="form.role"
                        size="sm"
                        placeholder="Role"
                        :options="roleOptions"
                        style="height: 36px"
                        :class="{
                          'is-invalid': submitted && v$.form.role.$error,
                        }"
                      ></b-form-select>
                      <div
                        v-if="submitted && v$.form.role.$error"
                        class="invalid-feedback"
                      >
                        <span>This value is required.</span>
                      </div>
                    </b-form-group>
                  </div>
                </div>

                <div class="row">
                  <!-------------Email-------------------->
                  <div class="col-md-4">
                    <b-form-group
                      class="mb-3"
                      label="Enter your Email: *"
                      label-for="formrow-email-input"
                      label-class="font-weight-normal"
                    >
                      <b-form-input
                        id="formrow-email-input"
                        type="text"
                        placeholder="Email"
                        v-model="form.email"
                        name="widgetemail"
                        :class="{
                          'is-invalid': submitted && v$.form.email.$error,
                        }"
                      ></b-form-input>
                      <div
                        v-if="submitted && v$.form.email.$error"
                        class="invalid-feedback"
                      >
                        <span>This value is required.</span>
                      </div>
                    </b-form-group>
                  </div>

                  <!-------------Phone number-------------------->
                  <div class="col-md-4">
                    <b-form-group
                      class="mb-3"
                      label="Give your phone number: *"
                      label-for="formrow-phone-input"
                      label-class="font-weight-normal"
                    >
                      <b-form-input
                        id="formrow-phone-input"
                        type="text"
                        placeholder="Phone Number"
                        v-model="form.phone"
                        name="widgetphone"
                        :class="{
                          'is-invalid': submitted && v$.form.phone.$error,
                        }"
                      ></b-form-input>
                      <!-- <div
                        v-if="submitted && v$.form.phone.$error"
                        class="invalid-feedback"
                      >
                        <span>This value is required.</span>
                      </div> -->

                      <div
                        v-if="submitted && v$.form.phone.$error"
                        class="invalid-feedback"
                      >
                        <span v-if="v$.form.phone.minLength"
                          >Phone number must be at least 10 characters long.</span
                        >
                        <span v-if="v$.form.phone.maxLength"
                          >and cannot exceed 15 characters.</span
                        >
                      </div>
                    </b-form-group>
                  </div>

                 
                  <!-------------Extension-------------------->
                  <div class="col-md-4">
                    <b-form-group
                      class="mb-3"
                      label="Give your Extension Number:"
                      label-for="formrow-extension-input"
                      label-class="font-weight-normal"
                    >
                      <b-form-input
                        id="formrow-extension-input"
                        type="text"
                        placeholder="Extension"
                        v-model="form.extension"
                        name="widgetextension"
                        @input="validateInput"
                        :class="{
                          'is-invalid': submitted && errorMessage,
                        }"
                      ></b-form-input>
                      <div v-if="errorMessage"  class="error-message">{{ errorMessage }}</div>

                    </b-form-group>
                  </div>
                </div>

                <div class="row">
                  <!-------------Department-------------------->
                  <div class="col-md-4">
                    <b-form-group
                      class="mb-3"
                      label="Give your department name:"
                      label-for="formrow-department-input"
                      label-class="font-weight-normal"
                    >
                      <b-form-input
                        id="formrow-department-input"
                        type="text"
                        placeholder="Department"
                        v-model="form.department"
                        name="widgetdepartment"
                      ></b-form-input>
                    </b-form-group>
                  </div>
                  <!-------------title-------------------->
                  <div class="col-md-4">
                    <b-form-group
                      class="mb-3"
                      label="Give your title:"
                      label-for="formrow-title-input"
                      label-class="font-weight-normal"
                    >
                      <b-form-input
                        id="formrow-title-input"
                        type="text"
                        placeholder="Title"
                        v-model="form.title"
                        name="widgettitle"
                      ></b-form-input>
                    </b-form-group>
                  </div>

                  <!-------------Languages-------------------->
                  <div class="col-md-4">
                    <b-form-group
                      class="mb-3"
                      label="Select your Langauges:"
                      label-for="formrow-langauge-input"
                      label-class="font-weight-normal"
                    >
                      <b-form-select
                        class="form-select form-select-sm"
                        v-model="form.language"
                        size="sm"
                        placeholder="Languages"
                        :options="languageOptions"
                        style="height: 36px"
                        value-field="value"
                        text-field="label"
                      ></b-form-select>
                    </b-form-group>
                  </div>
                </div>

                <div class="row mb-4 mt-4">
                  <div class="col-md-12">
                    <h5 class="card-title mb-3">Two Factor Authentication Settings</h5>
                    <h6 class="card-subtitle mb-4 card-title-desc">
                      {{ AddUser ? "Add" : "Update" }} user's two factor authentication settings
                    </h6>

                    <div class="form-check form-switch mb-3 form-switch-lg">
                      <input
                        class="form-check-input"
                        type="checkbox"
                        id="2fa-toggle"
                        v-model="twofact"
                      />
                      <label class="form-check-label" for="2fa-toggle">
                        Enable SMS Two Factor Authentication
                      </label>
                    </div>
                  </div>
                </div>

                <!-------------Reports-------------------->
                <div class="row mb-4" v-if="reportOptions && reportOptions.length > 0">
                  <div class="col-md-4">
                    <h5 class="card-title mb-3">User's Report Access</h5>
                    <h6 class="card-subtitle mb-4 card-title-desc">
                      {{ AddUser ? "Add" : "Update" }} user's report access
                    </h6>
                    <b-form-group
                      class="mb-3"
                      label="Reports: Select one or multiple reports:"
                      label-for="formrow-report-input"
                      label-class="font-weight-normal"
                    >
                      <VueMultiselect
                        v-model="form.report"
                        :options="reportOptions"
                        :multiple="true"
                        :close-on-select="true"
                        label="name"
                        track-by="id"
                      />
                    </b-form-group>
                  </div>
                </div>


             <div class="row"  v-if="shouldShowIntegrationAccess">
              <div>
                <h5 class="card-title mb-3">User's Integration Access</h5>
                <h6 class="card-subtitle mb-4 card-title-desc">
                  {{ AddUser ? "Add" : "Update" }} user's integration access
                </h6>
              </div>    
              </div>
                <div class="row" v-if="agentObj.ams_2000">                           
                  <div class="col-md-12">
                    <div class="form-check form-switch mb-3 form-switch-lg">
                      <input
                        class="form-check-input"
                        type="checkbox"
                        id="checkbox-1"
                        v-model="checked_ams_2000"
                      />
                      <label class="form-check-label" for="checkbox-1">
                        Allow user AMS 2000 API Access
                      </label>
                    </div>
                  </div>
                </div>
                <div class="row"  v-if="agentObj.ams_evo">
                  <div class="col-md-12">
                    <div class="form-check form-switch mb-3 form-switch-lg">
                      <input
                        class="form-check-input"
                        type="checkbox"
                        id="checkbox-2"
                        v-model="checked_ams_evolution"
                      />
                      <label class="form-check-label" for="checkbox-2">
                        Allow user AMS Evoluation API Access
                      </label>
                    </div>
                  </div>
                </div>
                <div class="row" v-if="agentObj.neo_verify">
                  <div class="col-md-12" >
                    <div class="form-check form-switch mb-3 form-switch-lg">
                      <input
                        class="form-check-input"
                        type="checkbox"
                        id="checkbox-3"
                        v-model="checked_neo_verify"
                      />
                      <label class="form-check-label" for="checkbox-3">
                        Allow user NEO verify API Access
                      </label>
                    </div>
                  </div>
                </div>
              </div>
              <div class="card">
                <div class="card-body">
                  <div class="mb-3">
                    <b-button variant="primary" type="submit" v-if="AddUser">
                      <i
                        v-if="addEditWorkflowLoading"
                        class="font-size-16 align-middle me-2"
                      > <Icon icon="bx:loader-alt" /></i>
                      Save!
                    </b-button>

                    <b-button variant="primary" type="submit" v-if="!AddUser">
                      <i
                        v-if="addEditWorkflowLoading"
                        class="font-size-16 align-middle me-2"
                      > <Icon icon="bx:loader-alt" /></i>
                      Update!
                    </b-button>
                  </div>
                </div>
              </div>
            </div>
          </div>
        </div>

        <!-- Add workflow condition and action cards here -->
      </b-form>
    </div>
  </div>
</template>
<script>
import VueMultiselect from "vue-multiselect";
import Loader from "../../../components/Loader/loader.vue";
import {
  required,
  email,
  minLength,
  maxLength,
  sameAs,
  helpers,
} from "@vuelidate/validators";
import {
  BForm,
  BFormGroup,
  BFormInput,
  BButton,
  BFormSelect,
  BFormSelectOption,
  BFormCheckbox,
} from "bootstrap-vue-next";
import { useVuelidate } from "@vuelidate/core";
import UserMangetService from "../../../service/userManagementSerice";
import { Icon } from '@iconify/vue';

import * as _ from "lodash";
export default {
  setup() {
    const v$ = useVuelidate({
      form: {
        email: { required },
        firstname: { required },
        lastname: { required },
        phone: { required },
        role: { required },
        // password: { required },
      },
    });

    return { v$ }; // Ensure to return an object with the 'v$' property
  },
  props: {
    selectedId: {
      type: [Number, null],
      required: true,
    },
    AddUser: {
      type: Boolean,
      required: true,
    },

    addEditWorkflowLoading: {
      required: true,
    },
    workflowTypes: {
      type: Array,
      required: true,
    },
    setErrorMessage: {
      type: Function,
      required: true,
    },
    setSuccessMessage: {
      type: Function,
      required: true,
    },
    userData: {
      type: Object,
      required: true,
    },
    success: {
      type: Boolean,
      required: true,
    },
    closemodal:{
      type: Boolean,
      required: true,
    },
    agentObj:{
      type: Object,
      required: true,
    }
  },
  validations: {
    form: {
      email: { email, required },
      firstname: { required },
      lastname: { required },
      phone: {
        required,
        minLength: minLength(10), // Minimum length of 8 characters
        maxLength: maxLength(15), // Maximum length of 32 characters
      },
      role: { required },

    },
  },
  mounted() {},
  data() {
    return {
      submitted: false,
      errorMessage: '',

      form: {
        email: "",
        title: "",
        lastname: "",
        firstname: "",
        phone: "",
        department: "",
        // password: '',
        extension: "",
        role: "",
        language: "",
        report: "",
      },
      roleOptions: ["sysadmin", "admin", "guest", "member", "agent", "partner"],
      languageOptions: [],
      reportOptions: [],
      checked_ams_2000: false,
      checked_ams_evolution: false,
      checked_neo_verify: false,
      reportSamplearray: [],
      widgetLoading: false,
      twofact: false,
      created_on: "",
      updated_on: "",
      sid: "",
    };
  },
  computed: {
    shouldShowIntegrationAccess() {
    return this.agentObj.ams_2000 || this.agentObj.ams_evo || this.agentObj.neo_verify;
  }
  },

  methods: {
    formSubmit() {
      this.submitted = true;
      this.v$?.form.$touch();

      if (this.v$.$invalid) {
        // Use optional chaining to avoid errors if v$ is undefined
        return;
      }
      if(!this.errorMessage)
      {
        this.submitData(this.form);

      }
      // this.widgetLoading = true;
    },
    validateExtension() {
      // Check if the entered value is negative, and reset to a default value if needed
      if (this.form.extension < 0 || this.form.extension.length < 3) {
        // You can choose to handle this validation failure in a way that fits your application
        // For example, displaying an error message or resetting to a default value
        this.form.extension = null; // or this.form.extension = "";
      }
    },

    validateInput() {
      // Use a regular expression to check if the input contains exactly 3 numbers
      const numberRegex = /\d{3}/;

      if (this.form.extension.length === 3) {
        this.errorMessage = ""
      } else {
        this.errorMessage = "Extension must be at least 3 digits long";

      }
    },

    submitData(form) {
      if (this.AddUser) {
        let data = {
          role: form.role,
          title: form.title,
          firstname: form.firstname,
          lastname: form.lastname,
          extension: form.extension ? form.extension : 0,
          phonenumber: form.phone,
          // password:"User@123!",
          email: form.email,
          two_factor_auth: this.twofact,
          department: form.department,
          reports: form.report ? form.report.map((item) => item.id) : "",
          languages: form.language,
          ams_2000: this.checked_ams_2000 ? "y" : "n",
          ams_evolution: this.checked_ams_evolution ? "y" : "n",
          neo_verify: this.checked_neo_verify ? "y" : "n",
        };

        this.$emit("formSubmit", {
          ...data,
        });
      } else {
        let data = {
          role: form.role,
          title: form.title,
          firstname: form.firstname,
          lastname: form.lastname,
          extension: form.extension ? form.extension : 0,
          phonenumber: form.phone,
          email: form.email,
          two_factor_auth: this.twofact,
          department: form.department,
          reports: form.report ? form.report.map((item) => item.id) : "",
          languages: form.language,
          ams_2000: this.checked_ams_2000 ? "y" : "n",
          ams_evolution: this.checked_ams_evolution ? "y" : "n",
          neo_verify: this.checked_neo_verify ? "y" : "n",
        };

        this.$emit("formSubmit", {
          ...data,
        });
      }
    },
    clearFields() {
      this.form = {
        email: "",
        title: "",
        lastname: "",
        firstname: "",
        phone: "",
        department: "",
        extension: "",
        role: "",
        language: "",
        report: "",
      };
      this.checked_ams_2000 = false;
      this.checked_ams_evolution = false;
      this.checked_neo_verify = false;
      this.submitted = false;
    },

    async getUserById(id) {
      this.widgetLoading = true;
      const {
        data: { data, message, success },
      } = await UserMangetService.getUserManagementDataByid(id);
      if (!success) {
        this.setErrorMessage(message);
      } else {
        this.setEditableData(data);
      }

      this.widgetLoading = false;
    },

    formatDate(dateString) {
      const options = {
        weekday: "short",
        year: "numeric",
        month: "short",
        day: "2-digit",
        hour: "numeric",
        minute: "numeric",
        second: "numeric",
      };

      const formattedDate = new Date(dateString).toLocaleString("en-US", options);
      return formattedDate;
    },

    setEditableData(data) {
      this.form.title = data.title;
      this.form.firstname = data.firstname;
      this.form.lastname = data.lastname;
      this.form.email = data.email;
      this.form.phone = data.phonenumber;
      // this.form.password = 'User@123';
      this.form.department = data.department;
      this.form.extension = data.extension;
      (this.created_on = this.formatDate(data.created_on)),
        (this.updated_on = this.formatDate(data.updated_on)),
        (this.sid = data.sid),
        (this.form.role = data.role),
        (this.form.language = data.locale);
      (this.checked_ams_2000 = data.ams_2000),
        (this.twofact = data.two_factor_auth),
        (this.checked_ams_evolution = data.ams_evolution),
        (this.checked_neo_verify = data.neo_verify),
        (this.form.report = this.convertArray(data.reports));
    },

    convertArray(reports) {
      const actualarrayLookup = {};
      this.reportSamplearray.forEach((item) => {
        actualarrayLookup[item.id] = item;
      });
      const output = reports.map((report) => actualarrayLookup[report.report_id]);
      return output;
    },
    setDropdownValues(value) {
      this.languageOptions = value.preferred_languages;
      this.reportOptions = value.reports;
      this.reportSamplearray = value.reports;
    },
  },

  components: {
    Loader,
    VueMultiselect,
    BForm,
    BFormGroup,
    BFormInput,
    BButton,
    BFormSelect,
    BFormSelectOption,
    BFormCheckbox,
    Icon
  },
  watch: {
    selectedId: {
      immediate: true,
      handler(newVal) {
        if (newVal) {
          this.getUserById(newVal);
        }
      },
    },

    AddUser: {
      immediate: true,
      handler(newVal) {

        if (newVal) {
          this.clearFields();
        }
      },
    },

    userData: {
      immediate: true,
      handler(newVal) {
        this.setDropdownValues(newVal);
      },
    },

    success: {
      immediate: true,
      handler(newVal) {
        if (newVal) {
          this.clearFields();
        }
      },
    },
    closemodal:{
      immediate: true, 
      handler(newVal) {
      
        this.clearFields();
          this.submitted = false;
      },
     
    },
    agentObj:{
      immediate: true, 
      handler(newVal) {
      
      }, 
      }
  },
};
</script>