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 : Package.vue
<template>
  <div id="amelia-booking-wrap" class="am-wrap">

    <!-- Package -->
    <div id="am-service-booking" ref="bookingContainer" v-if="!empty && package && package.status === 'visible'">
      <transition name="fade">
        <div v-show="fetchedPackage">

          <!-- Package Gallery -->
          <div class="am-service-gallery">
            <el-carousel
              v-if="package.gallery.length > 0"
              indicator-position="none"
              :arrow="package.gallery.length === 1 ? 'never' : 'always'"
              :autoplay=true
            >
              <el-carousel-item v-for="(image, index) in package.gallery" :key="index">
                <div
                  class="am-image-slide"
                  :style="{'background-image': 'url(' + image.pictureFullPath + ')'}">
                </div>
              </el-carousel-item>
            </el-carousel>
          </div>

          <!-- Package Details -->
          <div class="am-service" :style="{backgroundColor: formColors.formBackgroundColor}">

            <!-- Package Header -->
            <div class="am-service-header">

              <!-- Package Profile Photo -->
              <div class="am-service-image">
                <img
                  :src="pictureLoad(package, false)" @error="imageLoadError(package, false)"
                  :alt="package.name"
                >
              </div>

              <!-- Package Data -->
              <div class="am-service-data">

                <!-- Package Back -->
                <div
                  v-if="passedCategory"
                  :style="{color: formColors.formTextColor}"
                  class="am-category-url" @click="backToCategory"
                >
                  <i class="el-icon-back"></i> {{ passedCategory.name }}
                </div>

                <!-- Package Name -->
                <div class="am-service-title">
                  <h2 :style="{color: formColors.formTextColor, fontFamily: $root.settings.customization.font}">
                    {{ package.name }}
                  </h2>
                </div>
              </div>

              <!-- Package Price -->
              <div class="am-service-price" v-if="package.price">
                {{ getFormattedPrice(package.calculatedPrice ? package.price : package.price - package.price / 100 * package.discount, !$root.settings.payments.hideCurrencySymbolFrontend) }}
              </div>

            </div>

            <el-row
              v-if="formParts.package_rules_description.visibility || formParts.selected_services.visibility"
              class="am-package-selected"
            >
              <el-col
                v-if="formParts.package_rules_description.visibility"
                :span="12"
                class="am-package-selected-col"
              >
                <div class="am-package-rule">
                  <div>
                    <span :style="{color: formColors.formTextColor}">
                      <i class="el-icon-date"></i> {{ $root.labels.package_book_service }} {{ package.sharedCapacity && package.quantity ? $root.labels.package_book_service_2 + ' ' + package.quantity + ' ' + (package.quantity === 1 ? $root.labels.appointment.toLowerCase() : $root.labels.appointments.toLowerCase()) + '.' : '' }}
                    </span>
                  </div>

                  <div v-if="package.durationType !== null || package.endDate !== null">
                    <span
                      v-if="package.durationType === 'day' || package.durationType === 'week' || package.durationType === 'month'"
                      :style="{color: formColors.formTextColor}"
                    >
                      <i class="el-icon-time"></i> {{ $root.labels.package_book_duration }} {{ package.durationCount }}  {{ package.durationCount > 1 ? $root.labels[package.durationType + 's'].toLowerCase() : $root.labels[package.durationType].toLowerCase() + '.' }}
                    </span>
                    <span
                      v-if="package.endDate !== null"
                      :style="{color: formColors.formTextColor}"
                    >
                      <i class="el-icon-time"></i> {{ $root.labels.package_book_expire }} {{ formatDate(package.endDate) }}
                    </span>
                  </div>
                </div>

                <div class="am-package-description ql-description"><p v-html="package.description" :style="{color: formColors.formTextColor}"></p></div>
              </el-col>

              <el-col
                v-if="formParts.selected_services.visibility"
                :span="12"
                class="am-package-selected-col"
              >
                <el-row v-for="bookable in package.availableBookableInfo" :key="bookable.serviceId">
                  <el-col :span="16" class="am-package-service" :style="{color: formColors.formTextColor}">
                    {{ bookable.serviceName }} <span :style="{color: formColors.formTextColor}" v-if="!package.sharedCapacity">x{{ bookable.serviceQuantity }}</span>
                  </el-col>
                </el-row>
              </el-col>
            </el-row>

            <!-- Package Booking -->
            <booking
              v-if="fetchedPackage"
              :id="id"
              :form-type="'catalogForm'"
              :passedPackage="package"
              :passedCategory="passedCategory"
              :passedEntities="options.entities"
              :passedEntitiesRelations="options.entitiesRelations"
              :showPackage="false"
              :addToCalendarProperty="addToCalendarProperty"
              @entitiesFetched="getEntities"
            >
            </booking>

          </div>

        </div>
      </transition>
    </div>

    <div v-if="empty" class="am-no-services">
      <img :src="$root.getUrl+'public/img/am-empty-booking.svg'" style="margin-top: 10px;">
      <h1>{{$root.labels.oops}}</h1>
      <h3>{{$root.labels.no_services_employees}}</h3>
      <p>{{$root.labels.add_services_employees}}</p>
      <a href="https://wpamelia.com/services-and-categories/" rel="nofollow">
        {{$root.labels.add_services_url}}
      </a>
      <span style="font-size:14px">{{$root.labels.and}}</span>
      <a href="https://wpamelia.com/employees/" rel="nofollow">
        {{$root.labels.add_employees_url}}
      </a>
    </div>

  </div>
</template>

<script>
  import imageMixin from '../../../js/common/mixins/imageMixin'
  import PhoneInput from '../../parts/PhoneInput.vue'
  import catalogMixin from '../../../js/frontend/mixins/catalogMixin'
  import durationMixin from '../../../js/common/mixins/durationMixin'
  import entitiesMixin from '../../../js/common/mixins/entitiesMixin'
  import cacheMixin from '../../../js/frontend/mixins/cacheMixin'
  import Booking from '../booking/Booking'
  import Extras from './parts/Extras'
  import EmployeesBlock from './parts/EmployeesBlock'
  import helperMixin from '../../../js/backend/mixins/helperMixin'
  import dateMixin from '../../../js/common/mixins/dateMixin'
  import moment from 'moment'
  import formsCustomizationMixin from '../../../../assets/js/common/mixins/formsCustomizationMixin'

  export default {

    mixins: [cacheMixin, dateMixin, imageMixin, catalogMixin, durationMixin, entitiesMixin, helperMixin, formsCustomizationMixin],

    props: {
      addToCalendarProperty: {
        type: Object,
        default: () => {
          return {
            visible: true
          }
        }
      },
      formsData: {
        type: Object,
        default: () => {
          return {}
        }
      },
      customize: {
        type: Object,
        default: () => {
          return {}
        }
      },
      passedCategory: {
        default: () => {},
        type: Object
      },
      passedPackage: {
        default: () => {},
        type: Object
      },
      passedEntities: {
        default: () => {},
        type: Object
      },
      passedEntitiesRelations: {
        default: () => {},
        type: Object
      }
    },

    data () {
      return {
        empty: false,
        id: 'am-step-booking-catalog',
        package: {},
        fetchedPackage: false,
        responseEntities: {
          taxes: [],
          categories: [],
          employees: [],
          locations: [],
          customFields: []
        },
        options: {
          availableEntitiesIds: {
            packages: [],
            categories: [],
            employees: [],
            locations: [],
            services: []
          },
          entitiesRelations: {},
          entities: {
            packages: [],
            services: [],
            employees: [],
            locations: []
          }
        },
        packageId: '',
        columnsLg: 12,
        formColors: Object.keys(this.formsData).length ? (this.$root.settings.customization.useGlobalColors.catalogForm ? this.$root.settings.customization.globalColors : this.formsData.categoryPackageForm.globalSettings) : {},
        formParts: Object.keys(this.formsData).length ? this.formsData.categoryPackageForm.parts : {}
      }
    },

    created () {
      if (!Object.keys(this.formsData).length) {
        let customizedData = this.getTranslatedForms('catalogForm').catalogForm
        this.formColors = this.$root.settings.customization.useGlobalColors.catalogForm ? this.$root.settings.customization.globalColors : customizedData.categoryPackageForm.globalSettings
        this.formParts = customizedData.categoryPackageForm.parts
      }
      this.id = this.id + this.$root.shortcodeData.counter
      this.packageId = 'package' in this.$root.shortcodeData.booking ? this.$root.shortcodeData.booking.package : null
      window.addEventListener('resize', this.handleResize)
    },

    mounted () {
      this.$nextTick(() => {
        if (this.$refs && this.$refs.bookingContainer) {
          this.$refs.bookingContainer.scrollIntoView({ behavior: 'smooth', block: 'nearest', inline: 'nearest' })
        }
      })

      if (this.passedPackage) {
        this.options.isFrontEnd = true

        this.package = JSON.parse(JSON.stringify(this.passedPackage))
        this.fetchedPackage = true

        this.options.entities = this.passedEntities
        this.options.entitiesRelations = this.passedEntitiesRelations

        // Customization hook
        if ('beforeCatalogPackageLoaded' in window) {
          window.beforeCatalogPackageLoaded(this.package)
        }
      } else {
        this.fetchEntities((success) => {
          if (success) {
            this.fetchedEntities()
          }
        }, {
          types: ['locations', 'employees', 'categories', 'custom_fields', 'packages', 'taxes'],
          isFrontEnd: true,
          isPanel: false
        })
      }
    },

    updated () {
      this.handleResize()
    },

    methods: {
      fetchedEntities () {
        this.package = this.getPackageById(this.packageId)
        if (this.options.entities.packages.length === 0 || this.options.entities.employees.length === 0 || !this.package) this.empty = true
        this.fetchedPackage = true
      },

      backToCategory () {
        this.$emit('showAllServices')
      },

      getEntities (entities) {
        this.options.entities = entities
      },

      handleResize () {
        let amContainer = document.getElementById('amelia-app-booking' + this.$root.shortcodeData.counter)
        let amContainerWidth = amContainer.offsetWidth
        if (amContainerWidth < 670) {
          this.columnsLg = 24
          amContainer.classList.add('am-mobile-collapsed')
          amContainer.classList.remove('am-desktop')
        } else {
          this.columnsLg = 12
          amContainer.classList.add('am-desktop')
          amContainer.classList.remove('am-mobile-collapsed')
        }
      },

      formatDate (date) {
        return this.getFrontedFormattedDate(
          moment(date).format('YYYY-MM-DD')
        )
      }
    },

    components: {
      PhoneInput,
      Booking,
      Extras,
      EmployeesBlock
    }

  }
</script>
© 2026 GrazzMean-Shell