Uname: Linux webm012.cluster130.gra.hosting.ovh.net 5.15.167-ovh-vps-grsec-zfs-classid #1 SMP Tue Sep 17 08:14:20 UTC 2024 x86_64
Software: Apache
PHP version: 8.0.30 [ PHP INFO ] PHP os: Linux
Server Ip: 145.239.37.162
Your Ip: 216.73.216.190
User: dreampi (1009562) | Group: users (100)
Safe Mode: OFF
Disable Function:
_dyuweyrj4,_dyuweyrj4r,dl

name : DialogActions.vue
<template>
  <div>
    <div class="am-dialog-footer">
      <div class="am-dialog-footer-actions">

        <!-- Dialog Delete Confirmation -->
        <transition name="slide-vertical">
          <div class="am-dialog-confirmation" v-show="showDeleteConfirmation">
            <h3 v-show="allowedDelete">
              {{ message.confirm.remove }}
            </h3>
            <el-alert
              v-if="action.haveRemoveEffect && deleteEffectMessage"
              title=""
              type="warning"
              :description="deleteEffectMessage"
              show-icon
              :closable="false"
            >
            </el-alert>
            <div class="align-left" v-if="hasApplyGloballyDeletion">
              <el-button size="small" @click="deleteEntity(false)" type="primary">
                {{ getConfirmDeleteButtonText().no }}
              </el-button>
              <el-button size="small" @click="deleteEntity(true)" type="primary">
                {{ getConfirmDeleteButtonText().yes }}
              </el-button>
            </div>
            <div class="align-left" v-else>
              <el-button size="small" v-if="allowedDelete" @click="showDeleteConfirmation = !showDeleteConfirmation">
                {{ $root.labels.cancel }}
              </el-button>
              <el-button size="small" v-if="allowedDelete" @click="deleteEntity(false)" type="primary">
                {{ $root.labels.delete }}
              </el-button>
              <el-button v-if="!allowedDelete" @click="showDeleteConfirmation = !showDeleteConfirmation" class="am-dialog-action-close" size="small" icon="el-icon-close"></el-button>
            </div>
          </div>
        </transition>

        <!-- Dialog Visibility Confirmation -->
        <transition name="slide-vertical">
          <div class="am-dialog-confirmation" v-if="status" v-show="showVisibilityConfirmation">
            <h3 v-if="isStatusOn()">{{ message.confirm.hide }}</h3>
            <h3 v-else-if="isStatusOff()">{{ message.confirm.show }}</h3>
            <div class="align-left" v-if="hasApplyGloballyVisibility">
              <el-button size="small" v-if="isStatusOn()" @click="hideEntity(false)" type="primary">
                {{ getConfirmStatusButtonText().no }}
              </el-button>
              <el-button size="small" v-if="isStatusOn()" @click="hideEntity(true)" type="primary">
                {{ getConfirmStatusButtonText().yes }}
              </el-button>
              <el-button size="small" v-if="isStatusOff()" @click="showEntity(false)" type="primary">
                {{ getConfirmStatusButtonText().no }}
              </el-button>
              <el-button size="small" v-if="isStatusOff()" @click="showEntity(true)" type="primary">
                {{ getConfirmStatusButtonText().yes }}
              </el-button>
            </div>
            <div class="align-left" v-else>
              <el-button size="small" @click="showVisibilityConfirmation = !showVisibilityConfirmation">
                {{ $root.labels.cancel }}
              </el-button>
              <el-button size="small" v-if="isStatusOn()" @click="hideEntity(false)" type="primary">
                {{ getConfirmStatusButtonText().yes }}
              </el-button>
              <el-button size="small" v-if="isStatusOff()" @click="showEntity(false)" type="primary">
                {{ getConfirmStatusButtonText().no }}
              </el-button>
            </div>
          </div>
        </transition>

        <!-- Dialog Visibility Confirmation -->
        <transition name="slide-vertical">
          <div class="am-dialog-confirmation" v-if="status" v-show="showBlockConfirmation">
            <h3>{{ message.confirm.block }}</h3>
            <div class="align-left">
              <el-button size="small" @click="showBlockConfirmation = !showBlockConfirmation">
                {{ $root.labels.cancel }}
              </el-button>
              <el-button size="small" @click="blockEntity(false)" type="primary">
                {{ getConfirmBlockButtonText().yes }}
              </el-button>
            </div>
          </div>
        </transition>

        <!-- Dialog Duplicate Confirmation -->
        <transition name="slide-vertical">
          <div class="am-dialog-confirmation" v-show="showDuplicateConfirmation">
            <h3>{{ message.confirm.duplicate }}</h3>
            <div class="align-left">
              <el-button size="small" @click="showDuplicateConfirmation = !showDuplicateConfirmation">
                {{ $root.labels.cancel }}
              </el-button>
              <el-button size="small" @click="duplicateEntity" type="primary">
                {{ $root.labels.duplicate }}
              </el-button>
            </div>
          </div>
        </transition>

        <!-- Dialog Save Confirm -->
        <transition name="slide-vertical">
          <div class="am-dialog-confirmation" v-show="showSaveConfirmation">
            <h3 v-if="buttonText" style="display: block;">{{ message.confirm.save }}
              <span v-if="message.confirm.saveDetails">{{ message.confirm.saveDetails }}</span>
            </h3>
            <div class="align-left" style="display: block;" v-if="buttonText">
              <el-button type="primary" size="small" @click="onSubmit(false)">
                {{ getConfirmSaveButtonText().no }}
              </el-button>
              <el-button type="primary" size="small" @click="onSubmit(true)">
                {{ getConfirmSaveButtonText().yes }}
              </el-button>
            </div>
            <el-col :span="22">
            <el-alert
              v-if="action.haveSaveWarning"
              title=""
              type="warning"
              :description="message.confirm.save"
              show-icon
              :closable="false"
              style="word-break: break-word;"
            >
            </el-alert>
            </el-col>
            <el-col :span="2">
            <el-button
              v-if="showSaveConfirmation"
              @click="closeMessage()"
              class="am-dialog-action-close"
              size="small"
              icon="el-icon-close"
            ></el-button>
            </el-col>
          </div>
        </transition>

        <!-- Dialog Buttons -->
        <el-row v-if="!isNew">
          <el-col :sm="16" class="align-left">
            <el-button
              v-if="action.haveDuplicate"
              :class="{'am-button-icon': hasIcons, 'am-dialog-create': !hasIcons}"
              :type="getButtonType('duplicate')"
              @click="handleDuplicateConfirmation"
            >
              <img v-if="hasIcons" class="svg-amelia" :alt="$root.labels.duplicate" :src="$root.getUrl+'public/img/copy.svg'"/>
              <span v-else>{{getActionDuplicateButtonText()}}</span>
            </el-button>
            <el-button
              v-if="action.haveStatus"
              :class="{'am-button-icon': hasIcons, 'am-dialog-create': !hasIcons}"
              :type="getButtonType('status')"
              @click="handleVisibilityConfirmation"
            >
              <img
                v-if="hasIcons"
                class="svg-amelia"
                :alt="$root.labels.hide"
                :src="$root.getUrl+ (isStatusOff() ? 'public/img/unhide.svg' : 'public/img/hide.svg')"
              />
              <span v-else>
                {{ getActionStatusButtonText() }}
              </span>
            </el-button>
            <el-button
              v-if="action.haveRemove"
              :class="{'am-button-icon': hasIcons, 'am-dialog-create': !hasIcons}"
              :type="getButtonType('remove')"
              @click="handleDeleteConfirmation"
            >
              <img
                v-if="hasIcons"
                class="svg-amelia"
                :alt="$root.labels.delete"
                :src="$root.getUrl+'public/img/delete.svg'"
              />
              <span v-else>
                {{ getActionRemoveButtonText() }}
              </span>
            </el-button>
            <el-button
              v-if="action.haveBlock"
              class="am-button-block"
              :type="getButtonType('block')"
              @click="handleBlockConfirmation"
            >
              <img
                class="svg-amelia"
                :alt="$root.labels.block"
                :src="$root.getUrl+ (isStatusBlocked() ? 'public/img/unblock.svg' : 'public/img/block.svg')"
              />
              <span>
                {{ getConfirmBlockButtonText().yes }}
              </span>
            </el-button>
          </el-col>
          <el-col
            :sm="(action.haveRemove === false && action.haveStatus === false && action.haveDuplicate === false) ? 24 : 8"
            class="align-right"
          >
            <el-button
              v-if="action.haveAdd && action.haveEdit"
              type="primary"
              class="am-dialog-create"
              :loading="loadSaveButton"
              @click="handleSaveClick"
            >
              {{ $root.labels.save }}
            </el-button>
          </el-col>
        </el-row>
        <el-row v-else>
          <el-col :sm="24" class="align-right">
            <el-button type="" @click="closeDialog" class="">
              {{ $root.labels.cancel }}
            </el-button>
            <el-button
              v-if="action.haveAdd && action.haveEdit"
              type="primary"
              class="am-dialog-create"
              :loading="loadSaveButton"
              @click="handleSaveClick"
            >
              {{ $root.labels.save }}
            </el-button>
          </el-col>
        </el-row>
      </div>
    </div>

    <!-- Dialog Loader -->
    <div class="am-dialog-loader" v-show="dialogLoading">
      <div class="am-dialog-loader-content">
        <img :src="$root.getUrl+'public/img/spinner.svg'" class="">
        <p>{{ $root.labels.loader_message }}</p>
      </div>
    </div>

  </div>
</template>

<script>
  import Form from 'form-object'
  import notifyMixin from '../../../js/backend/mixins/notifyMixin'
  import dateMixin from '../../../js/common/mixins/dateMixin'
  import cabinetMixin from '../../../js/frontend/mixins/cabinetMixin'
  import stashMixin from '../../../js/backend/mixins/stashMixin'

  export default {

    mixins: [notifyMixin, dateMixin, cabinetMixin, stashMixin],

    props: {
      formName: '',
      urlName: null,
      urlSubName: {
        type: String,
        default: ''
      },
      isNew: null,
      entity: null,
      getParsedEntity: null,
      updateStash: false,
      haveSaveConfirmation: null,
      hasApplyGloballyVisibility: false,
      hasApplyGloballyDeletion: false,
      loadSaveButton: false,
      calendarConflict: {
        enable: false
      },
      getCalendarEvents: null,

      hasIcons: true,

      status: null,

      buttonType: {
        status: 'primary',
        remove: 'danger'
      },

      action: {
        haveAdd: false,
        haveEdit: false,
        haveStatus: false,
        haveBlock: false,
        haveRemove: false,
        haveRemoveEffect: false,
        ignoreDeleteEffect: false,
        haveDuplicate: false,
        haveSaveWarning: false
      },

      message: {
        success: {
          save: null,
          remove: null,
          show: null,
          hide: null
        },
        confirm: {
          remove: null,
          show: null,
          hide: null,
          duplicate: null,
          save: null,
          saveDetails: null
        }
      },

      buttonText: null
    },

    data () {
      return {
        form: new Form(),

        allowedDelete: true,

        showDeleteConfirmation: false,
        showVisibilityConfirmation: false,
        showDuplicateConfirmation: false,
        showSaveConfirmation: false,
        showAddHoursDialog: false,
        confirmCalendarConflict: false,
        showBlockConfirmation: false,

        deleteEffectMessage: null,

        dialogLoading: false
      }
    },

    created () {
      Form.defaults.axios = this.$http
    },

    methods: {
      getButtonType (actionType) {
        switch (actionType) {
          case ('status'):
            return this.hasIcons ? null : this.buttonType.status

          case ('remove'):
            return this.hasIcons ? null : this.buttonType.remove

          case ('block'):
          case ('duplicate'):
            return this.hasIcons ? null : this.buttonType.duplicate
        }
      },

      closeDialog () {
        this.$parent.$emit('closeDialog')
      },

      closeMessage () {
        this.showSaveConfirmation = false

        this.$emit('closeSaveConfirmation')
      },

      onSubmit (applyGlobally) {
        let $this = this.$root
        this.$parent.$refs[this.formName].validate((valid, errors) => {
          if (valid) {
            if (this.calendarConflict && this.calendarConflict.enabled) {
              this.handleSaveConfirmation()
              if (applyGlobally) {
                this.$emit('confirmCalendarConflict')
                this.confirmCalendarConflict = true
                this.handleSaveClick(applyGlobally)
              }
            } else {
              this.dialogLoading = true
              if (this.isNew) {
                this.addEntity(applyGlobally)
              } else {
                this.editEntity(applyGlobally)
              }
            }
          } else {
            // For Appointment dialog, change tab to "Custom Fields" if validation error only there
            if (this.formName === 'appointment') {
              this.handleDialogTabChange(errors, 'bookings.')
            }

            // For Service dialog, change tab to "Duration & Pricing" if validation error only there
            if (this.formName === 'service') {
              this.handleDialogTabChange(errors, 'duration')
            }

            this.$emit('validationFailCallback')
            return false
          }

          this.$root = $this
        })
      },

      onSuccess (title, message, response) {
        this.$parent.$emit('saveCallback', response)
        setTimeout(() => {
          this.dialogLoading = false
          this.$parent.$emit('closeDialog')
        }, 300)
        this.notify(title, message, 'success')
      },

      onError (title, responseData) {
        this.dialogLoading = false
        this.$emit('errorCallback', responseData)
      },

      errorEntityMissing (error) {
        if ('data' in error.response &&
          'data' in error.response.data &&
          error.response.data.data === 'object' &&
          'entityMissing' in error.response.data.data &&
          error.response.data.data.entityMissing
        ) {
          this.dialogLoading = false

          this.notify(this.$root.labels.error, error.response.data.message, 'error')

          return true
        }

        return false
      },

      addEntity (applyGlobally) {
        let config = null

        if (this.$store !== undefined && this.$store.state.cabinet !== undefined && this.$store.state.cabinet.cabinetType === 'provider') {
          config = Object.assign(this.getAuthorizationHeaderObject(), {params: {source: 'cabinet-' + this.$store.state.cabinet.cabinetType}})
        }

        this.$http.post(this.$root.getAjaxUrl + '/' + this.urlName, this.getParsedEntity(applyGlobally), config)
          .then(response => {
            this.onSuccess(this.$root.labels.success, this.message.success.save, response.data.data)

            if (this.updateStash) {
              this.updateStashEntities({})
            }
          })
          .catch(error => {
            if (error.response) {
              if (this.errorEntityMissing(error)) {
                return
              }

              this.onError('', error.response.data.data)
            }
          })
      },

      editEntity (applyGlobally) {
        let config = null

        if (this.$store !== undefined && this.$store.state.cabinet !== undefined && this.$store.state.cabinet.cabinetType === 'provider') {
          config = Object.assign(this.getAuthorizationHeaderObject(), {params: {source: 'cabinet-' + this.$store.state.cabinet.cabinetType}})
        }

        this.$http.post(
          this.$root.getAjaxUrl + '/' + this.urlName + this.urlSubName + '/' + this.entity.id,
          this.getParsedEntity(applyGlobally),
          config
        ).then(response => {
          this.onSuccess(this.$root.labels.success, this.message.success.save, response.data.data)

          if (this.updateStash) {
            this.updateStashEntities({})
          }
        }).catch(error => {
          if (error.response) {
            if (this.errorEntityMissing(error)) {
              return
            }

            this.onError('', error.response.data.data)
          }
        })
      },

      deleteEntity (applyGlobally) {
        this.dialogLoading = true
        this.form.post(this.$root.getAjaxUrl + '/' + this.urlName + '/delete/' + this.entity.id, {
          'status': this.status.on,
          'applyGlobally': applyGlobally
        })
          .then(response => {
            this.onSuccess(this.$root.labels.success, this.message.success.remove, response.data.data)

            if (this.updateStash) {
              this.updateStashEntities({})
            }
          })
          .catch(error => {
            if (error.response) {
              this.onError('', error.response.data.data.message)
            }
          })
      },

      showEntity (applyGlobally) {
        this.dialogLoading = true
        this.form.post(this.$root.getAjaxUrl + '/' + this.urlName + '/status/' + this.entity.id, {
          'status': this.status.on,
          'applyGlobally': applyGlobally
        })
          .then(response => {
            this.onSuccess(this.$root.labels.success, this.message.success.show, null)

            if (this.updateStash) {
              this.updateStashEntities({})
            }
          })
          .catch(error => {
            if (error.response) {
              this.onError('', error.response.data.data.message)
            }
          })
      },

      hideEntity (applyGlobally) {
        this.dialogLoading = true
        this.form.post(this.$root.getAjaxUrl + '/' + this.urlName + '/status/' + this.entity.id, {
          'status': this.status.off,
          'applyGlobally': applyGlobally
        }).then(() => {
          this.onSuccess(this.$root.labels.success, this.message.success.hide, null)

          if (this.updateStash) {
            this.updateStashEntities({})
          }
        }).catch(error => {
          if (error.response) {
            this.onError('', error.response.data.data.message)
          }
        })
      },

      blockEntity (applyGlobally) {
        this.dialogLoading = true
        this.form.post(this.$root.getAjaxUrl + '/' + this.urlName + '/status/' + this.entity.id, {
          'status': this.entity.status === 'visible' ? this.status.block : this.status.on,
          'applyGlobally': applyGlobally
        }).then(() => {
          this.onSuccess(this.$root.labels.success, this.message.success.block, null)

          if (this.updateStash) {
            this.updateStashEntities({})
          }
        }).catch(error => {
          if (error.response) {
            this.onError('', error.response.data.data.message)
          }
        })
      },

      duplicateEntity () {
        this.dialogLoading = true
        this.$parent.$emit('closeDialog', true)
        this.$parent.$emit('duplicateCallback', this.entity)
        setTimeout(() => {
          this.showDuplicateConfirmation = false
          this.dialogLoading = false
        }, 600)
      },

      handleSaveConfirmation () {
        this.showSaveConfirmation = !this.showSaveConfirmation
        this.showVisibilityConfirmation = false
        this.showDeleteConfirmation = false
        this.showDuplicateConfirmation = false
        this.showBlockConfirmation = false
      },

      handleDuplicateConfirmation () {
        this.showDuplicateConfirmation = !this.showDuplicateConfirmation
        this.showSaveConfirmation = false
        this.showDeleteConfirmation = false
        this.showVisibilityConfirmation = false
        this.showBlockConfirmation = false
      },

      handleVisibilityConfirmation () {
        this.showVisibilityConfirmation = !this.showVisibilityConfirmation
        this.showSaveConfirmation = false
        this.showDeleteConfirmation = false
        this.showDuplicateConfirmation = false
        this.showBlockConfirmation = false
      },

      handleBlockConfirmation () {
        this.showBlockConfirmation = !this.showBlockConfirmation
        this.showSaveConfirmation = false
        this.showDeleteConfirmation = false
        this.showDuplicateConfirmation = false
        this.showVisibilityConfirmation = false
      },

      handleDeleteConfirmation () {
        this.showVisibilityConfirmation = false
        this.showDuplicateConfirmation = false
        this.showSaveConfirmation = false
        this.showBlockConfirmation = false

        if (this.action.haveRemoveEffect) {
          if (this.showDeleteConfirmation === false) {
            this.$http.get(this.$root.getAjaxUrl + '/' + this.urlName + '/effect/' + this.entity.id)
              .then(response => {
                this.allowedDelete = response.data.data.valid || this.ignoreDeleteEffect
                this.deleteEffectMessage = response.data.data.message
                this.showDeleteConfirmation = !this.showDeleteConfirmation
              })
              .catch(e => {
                this.showDeleteConfirmation = !this.showDeleteConfirmation
                this.deleteEffectMessage = ''
              })
          }
        } else {
          this.showDeleteConfirmation = !this.showDeleteConfirmation
        }
      },

      handleSaveClick () {
        if (this.getCalendarEvents && !this.confirmCalendarConflict) {
          this.getCalendarEvents().then(() => {
            if (this.haveSaveConfirmation && this.haveSaveConfirmation()) {
              this.handleSaveConfirmation()
            } else {
              this.onSubmit(false)
            }
          })
        } else {
          if (this.haveSaveConfirmation && this.haveSaveConfirmation()) {
            this.handleSaveConfirmation()
          } else {
            this.onSubmit(false)
          }
        }
      },

      getConfirmSaveButtonText () {
        return this.buttonText !== null && this.buttonText.confirm && this.buttonText.confirm.save ? {
          yes: this.buttonText.confirm.save.yes,
          no: this.buttonText.confirm.save.no
        } : {
          yes: this.$root.labels.yes,
          no: this.$root.labels.no
        }
      },

      getConfirmDeleteButtonText () {
        return this.buttonText !== null && this.buttonText.confirm && this.buttonText.confirm.remove ? {
          yes: this.buttonText.confirm.remove.yes,
          no: this.buttonText.confirm.remove.no
        } : {
          yes: this.$root.labels.yes,
          no: this.$root.labels.no
        }
      },

      getConfirmBlockButtonText () {
        return this.buttonText !== null && this.buttonText.confirm && this.buttonText.confirm.status ? {
          yes: this.buttonText.confirm.status.block,
          no: this.buttonText.confirm.status.no
        } : {
          yes: this.$root.labels.yes,
          no: this.$root.labels.no
        }
      },

      getConfirmStatusButtonText () {
        return this.buttonText !== null && this.buttonText.confirm && this.buttonText.confirm.status ? {
          yes: this.buttonText.confirm.status.yes,
          no: this.buttonText.confirm.status.no
        } : {
          yes: this.$root.labels.yes,
          no: this.$root.labels.no
        }
      },

      getActionStatusButtonText () {
        return this.buttonText !== null && this.buttonText.action ? this.buttonText.action.status : ''
      },

      getActionRemoveButtonText () {
        return this.buttonText !== null && this.buttonText.action ? this.buttonText.action.remove : ''
      },

      getActionDuplicateButtonText () {
        return this.buttonText !== null && this.buttonText.action ? this.buttonText.action.duplicate : ''
      },

      handleDialogTabChange (errors, fieldString) {
        let errorKeys = Object.keys(errors)

        let numberOfErrors = 0

        for (let i = 0; i < errorKeys.length; i++) {
          numberOfErrors = errorKeys[i].startsWith(fieldString) ? numberOfErrors + 1 : numberOfErrors
        }

        if (numberOfErrors === errorKeys.length) {
          this.$emit('validationTabFailCallback')
        }
      },

      isStatusOn () {
        return this.entity.status === this.status.on
      },

      isStatusOff () {
        return this.entity.status === this.status.off
      },

      isStatusBlocked () {
        return this.entity.status === this.status.block
      }
    },

    computed: {},

    components: {}

  }
</script>
© 2026 GrazzMean-Shell