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 : DialogTranslate.vue
<template>
  <div class="am-dialog-translate">

    <div class="am-dialog-scrollable" :style="dialogStyle">

      <!-- Dialog Header -->
      <div class="am-dialog-header">
        <el-row>
          <el-col :span="16">
            <img class="am-dialog-translate-svg-back" :src="$root.getUrl+'public/img/arrow-back.svg'" @click="goBack">
            <h2>{{ getHeaderTitle()}}</h2>
          </el-col>

          <el-col :span="8" class="align-right">
            <el-button class="am-dialog-close" @click="closeDialog" size="small" icon="el-icon-close"></el-button>
          </el-col>
        </el-row>
      </div>

      <LicenceBlockHeader/>

      <!-- Old Translations -->
      <div :class="licenceClassDisabled()" v-for="(translation, key) in oldTranslations" :key="key">
        <el-row :gutter="28" type="flex" v-if="usedLanguages && usedLanguages.indexOf(key) !== -1">
          <!-- Language -->
          <el-col :xs="languageWidth" :sm="languageWidth" style="padding-right: 0">
            <div class="used-language">
              <img class="am-dialog-translate-flag" :src="getLanguageFlag(key)">
              {{ getLanguageLabel(key, true) }}
            </div>
          </el-col>

          <!-- Translation -->
          <el-col :xs="8" :sm="14" v-if="(type === 'name' || type === 'firstName' || type === 'lastName') && tab !== 'cf' && tab !== 'tickets'" style="padding-right: 0">
            <el-input v-model="oldTranslations[key]" type="text" :placeholder="$root.labels.translation">
            </el-input>
          </el-col>
        </el-row>

        <!-- Description Translation -->
        <el-row class="am-dialog-translate-description" style="margin-bottom: 8px" :gutter="24" type="flex" v-if="type === 'description' && usedLanguages && usedLanguages.indexOf(key) !== -1">
          <el-col :sm="24" style="padding-right: 0">
            <content-block
              :label="$root.labels.description"
              :entity="oldTranslations"
              :property="key"
              :textProperty="key"
              :htmlProperty="key + 'Html'"
              :hasTranslation="false"
              :hasQuill="hasQuill"
              :textModeProp="true"
              :allowImage="false"
            >
            </content-block>
          </el-col>
        </el-row>

        <!-- Url -->
        <el-row class="am-dialog-translate-description" :gutter="24" type="flex" v-if="type === 'url' && usedLanguages && usedLanguages.indexOf(key) !== -1">
          <el-col :sm="24" style="padding-right: 0">
            <el-input v-model="oldTranslations[key]" :value="translation" placeholder="https://test.site.com/customer-panel/">
            </el-input>
          </el-col>
        </el-row>

        <!-- Custom Field -->
        <el-row class="am-dialog-translate-description" :gutter="26" type="flex" v-if="tab === 'cf' && usedLanguages && usedLanguages.indexOf(key) !== -1">
          <!-- Language -->
          <el-col :sm="5">
            <div class="am-dialog-translate-cf"> {{ $root.labels.label_name }} </div>
          </el-col>
          <!-- Label -->
          <el-col :sm="5">
            <div class="am-dialog-translate-cf-label">
              <i>{{name}}</i>
            </div>
          </el-col>
          <!-- Translation -->
          <el-col :sm="14" style="padding-right: 0">
            <el-input v-model="oldTranslations[key]" :value="translation" type="text" placeholder=" ">
            </el-input>
          </el-col>
        </el-row>

        <!-- Custom Field Options -->
        <div v-if="cfOptions.length && usedLanguages && usedLanguages.indexOf(key) !== -1" v-for="(option, i) in options">
          <el-row :gutter="20" type="flex" class="am-dialog-translate-description">
            <el-col :sm="5">
              <div class="am-dialog-translate-cf"> #{{i}}</div>
            </el-col>
            <el-col :sm="5">
              <div class="am-dialog-translate-cf-label">
                <i>{{option.label}}</i>
              </div>
            </el-col>
            <el-col :sm="14" style="padding-right: 0">
              <el-input type="text" v-model="option['translations'][key]" placeholder=" ">
              </el-input>
            </el-col>
          </el-row>
        </div>

        <!-- Collection -->
        <div v-if="eventTickets.length && usedLanguages && usedLanguages.indexOf(key) !== -1" v-for="item in tickets">
          <el-row :gutter="20" type="flex" class="am-dialog-translate-description">
            <el-col :sm="5">
              <div class="am-dialog-translate-cf-label">
                <i>{{item.name}}</i>
              </div>
            </el-col>
            <el-col :sm="19" style="padding-right: 0">
              <el-input type="text" v-model="item['translations'][key]" placeholder=" ">
              </el-input>
            </el-col>
          </el-row>
        </div>

        <!-- Collection -->
        <div v-if="badges.length && usedLanguages && usedLanguages.indexOf(key) !== -1" v-for="item in badges">
          <el-row :gutter="20" type="flex" class="am-dialog-translate-description">
            <el-col :sm="8">
              <div class="am-dialog-translate-cf-label">
                <i>{{item.content}}</i>
              </div>
            </el-col>
            <el-col :sm="16" style="padding-right: 0">
              <el-input type="text" v-model="item['translations'][key]" placeholder=" ">
              </el-input>
            </el-col>
          </el-row>
        </div>
      </div>


      <!-- New Translations -->
      <div :class="licenceClassDisabled()" v-for="(translation, index) in newTranslations" :key="index">
        <el-row :gutter="28" type="flex" style="margin-right: -15px">
          <el-col :sm="languageWidth" style="padding-right: 0">
            <el-select :placeholder=$root.labels.language v-model="newTranslations[index].lan" clearable filterable>
              <template slot="prefix">
                <img class="am-dialog-translate-flag-selected" :src="getLanguageFlag(newTranslations[index].lan)">
              </template>
              <el-option
                v-for="(lang, index) in allLanguagesKeys"
                :key="index"
                :label="getLanguageLabel(lang, false)"
                :value="lang"
                :disabled="lang in oldTranslations || lang === $root.locale"
              >
                <span>
                  <img class="am-dialog-translate-flag" :src="getLanguageFlag(lang)">
                  {{ getLanguageLabel(lang, false) }}
                </span>
              </el-option>
            </el-select>
          </el-col>

          <el-col :xs="14" :sm="18" v-if="(type === 'name' || type === 'firstName' || type === 'lastName') && tab !== 'cf' && tab !== 'tickets'" style="padding-right: 0">
            <el-input type="text" :name="translation.name" v-model="newTranslations[index].value" :placeholder="$root.labels.translation"/>
          </el-col>
        </el-row>

        <el-row class="am-dialog-translate-description" :gutter="24" type="flex" v-if="type === 'description'">
          <el-col :sm="24">
            <el-input v-model="newTranslations[index].value" :value="translation" type="textarea" :autosize="{minRows: 4, maxRows: 6}">
            </el-input>
          </el-col>
        </el-row>

        <el-row class="am-dialog-translate-description" :gutter="24" type="flex" v-if="type === 'url'">
          <el-col :sm="24">
            <el-input v-model="newTranslations[index].value" :value="translation" placeholder="https://test.site.com/customer-panel/">
            </el-input>
          </el-col>
        </el-row>

        <!-- Custom Field -->
        <el-row class="am-dialog-translate-description" :gutter="20" type="flex" v-if="tab === 'cf'">
          <el-col :sm="5">
            <div class="am-dialog-translate-cf"> {{ $root.labels.label_name }} </div>
          </el-col>
          <el-col :sm="5">
            <div class="am-dialog-translate-cf-label">
              <i>{{name}}</i>
            </div>
          </el-col>
          <el-col :sm="14" style="padding-right: 0">
            <el-input type="text" :name="translation.name" v-model="newTranslations[index].value"/>
          </el-col>
        </el-row>
        <!-- Custom Field Options-->
        <div v-if="cfOptions.length" v-for="(option, i) in options">
          <el-row class="am-dialog-translate-description" :gutter="24" type="flex">
            <el-col :sm="5">
              <div class="am-dialog-translate-cf"> #{{i}}</div>
            </el-col>
            <el-col :sm="5">
              <div class="am-dialog-translate-cf-label">
                <i>{{option.label}}</i>
              </div>
            </el-col>
            <el-col :sm="14" style="padding-right: 0">
              <el-input type="text" v-model="option['translations'][newTranslations[index].lan]" placeholder=" ">
              </el-input>
            </el-col>
          </el-row>
        </div>
        <!-- Collection -->
        <div v-if="eventTickets.length" v-for="item in tickets">
          <el-row class="am-dialog-translate-description" :gutter="24" type="flex">
            <el-col :sm="5">
              <div class="am-dialog-translate-cf-label">
                <i>{{item.name}}</i>
              </div>
            </el-col>
            <el-col :sm="19" style="padding-right: 0">
              <el-input type="text" v-model="item['translations'][newTranslations[index].lan]" placeholder=" ">
              </el-input>
            </el-col>
          </el-row>
        </div>

        <div v-if="badges.length" v-for="item in badges">
          <el-row class="am-dialog-translate-description" :gutter="24" type="flex">
            <el-col :sm="8">
              <div class="am-dialog-translate-cf-label">
                <i>{{item.content}}</i>
              </div>
            </el-col>
            <el-col :sm="16" style="padding-right: 0">
              <el-input type="text" v-model="item['translations'][newTranslations[index].lan]" placeholder=" ">
              </el-input>
            </el-col>
          </el-row>
        </div>
      </div>

      <div :class="licenceClassDisabled()" v-if="$root.settings.role !== 'provider'">
        <img  @click="addLanguage" class="am-dialog-translate-svg-plus" :src="$root.getUrl+'public/img/plus-circle.svg'"/>
        <div @click="addLanguage" class="add-language">{{ $root.labels.add_language }}</div>
      </div>

    </div>

    <!-- Dialog Footer -->
    <div class="am-dialog-footer" v-if="tab === 'category' || tab === 'cf' || tab === 'tickets' || tab === 'roles' || type === 'badges'">
      <div class="am-dialog-footer-actions">
        <el-row>
          <el-col :sm="24" class="align-right">
            <el-button type="" @click="closeDialog" class="">{{ $root.labels.cancel }}</el-button>
            <el-button type="primary" @click="saveDialog" class="am-dialog-create">{{ $root.labels.save }}</el-button>
          </el-col>
        </el-row>
      </div>
    </div>

  </div>
</template>

<script>
import licenceMixin from '../../../js/common/mixins/licenceMixin'
import imageMixin from '../../../js/common/mixins/imageMixin'
import ContentBlock from '../parts/ContentBlock'

export default {
  mixins: [
    licenceMixin,
    imageMixin
  ],

  name: 'DialogTranslate',

  props: {
    passedTranslations: null,
    name: '',
    allLanguagesData: null,
    usedLanguages: null,
    type: {
      required: false,
      default: 'name',
      type: String
    },
    tab: '',
    cfOptions: {
      required: false,
      default: function () {
        return []
      },
      type: Array
    },
    eventTickets: {
      required: false,
      default: function () {
        return []
      },
      type: Array
    },
    employeeBadges: {
      required: false,
      default: function () {
        return []
      },
      type: Array
    },
    hasQuill: true
  },

  data () {
    return {
      translations: null,
      oldTranslations: null,
      newTranslations: [],
      settings: null,
      newLanguages: [],
      languageWidth: 12,
      options: [],
      tickets: [],
      allLanguagesKeys: [],
      badges: []
    }
  },

  mounted () {
    this.translations = this.passedTranslations ? JSON.parse(this.passedTranslations) : {}
    this.oldTranslations = this.translations[this.type] ? this.translations[this.type] : {}

    let newUsedLanguages = this.oldTranslations
      ? this.usedLanguages.filter(e => !Object.keys(this.oldTranslations).includes(e))
      : this.usedLanguages

    newUsedLanguages.forEach((n) => { this.oldTranslations[n] = '' })

    if (_.isEmpty(this.oldTranslations)) {
      this.addLanguage()
    }

    this.oldTranslations = JSON.parse(JSON.stringify(this.oldTranslations))

    if (this.type === 'description' || this.tab === 'cf' || this.tab === 'tickets' || this.type === 'url' || this.type === 'badges') {
      this.languageWidth = 24
    }

    let options = JSON.parse(JSON.stringify(this.cfOptions))

    options.forEach(option => {
      if (option.translations) {
        option.translations = JSON.parse(option.translations)
      } else {
        option.translations = {}
      }
      this.usedLanguages.forEach(language => {
        if (!option.translations[language]) {
          option.translations[language] = ''
        }
      })
    })

    this.options = options

    let tickets = JSON.parse(JSON.stringify(this.eventTickets))

    tickets.forEach(ticket => {
      if (ticket.translations) {
        ticket.translations = JSON.parse(ticket.translations)
      } else {
        ticket.translations = {}
      }
      this.usedLanguages.forEach(language => {
        if (!ticket.translations[language]) {
          ticket.translations[language] = ''
        }
      })
    })

    this.tickets = tickets

    if (this.type === 'badges') {
      let badges = JSON.parse(JSON.stringify(this.employeeBadges))

      badges.forEach(badge => {
        if (badge.translations) {
          badge.translations = JSON.parse(badge.translations)
        } else {
          badge.translations = {}
        }
        this.usedLanguages.forEach(language => {
          if (!badge.translations[language]) {
            badge.translations[language] = ''
          }
        })
      })

      this.badges = badges
    }

    this.allLanguagesKeys = Object.keys(this.allLanguagesData)
  },

  computed: {
    dialogStyle () {
      if (this.tab !== 'cf' && this.tab !== 'tickets' && this.tab !== 'category' && this.tab !== 'roles' && this.tab !== 'badges') {
        return 'margin-bottom: 0'
      }
      return ''
    }
  },

  methods: {
    saveDialog () {
      this.newTranslations.forEach(tr => {
        if (tr.lan) {
          if (!this.usedLanguages.includes(tr.lan)) {
            this.newLanguages.push(tr.lan)
          }
          this.oldTranslations[tr.lan] = tr.value
        }
      })

      this.translations[this.type] = this.oldTranslations

      this.options.forEach(option => {
        option.edited = true
        option.translations = JSON.stringify(option.translations)
      })

      this.tickets.forEach(ticket => {
        ticket.edited = true
        ticket.translations = JSON.stringify(ticket.translations)
      })

      if (this.type === 'badges') {
        this.badges.forEach(badge => {
          badge.translations = JSON.stringify(badge.translations)
        })
      } else {
        this.badges = null
      }

      this.$emit('saveDialogTranslate', JSON.stringify(this.translations), this.newLanguages, this.tab, this.options, this.tickets, this.badges)
    },

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

    addLanguage () {
      this.newTranslations.push({'lan': '', 'value': ''})
    },

    getLanguageLabel (lang, cut) {
      if (cut && (this.type === 'name' || this.type === 'firstName' || this.type === 'lastName') && this.tab !== 'cf' && this.tab !== 'tickets' && this.tab !== 'badges') {
        return this.allLanguagesData[lang].name.substring(0, 21)
      }
      return this.allLanguagesData[lang].name
    },

    getLanguageFlag (lang) {
      if (lang && this.allLanguagesData[lang] && this.allLanguagesData[lang].country_code) {
        return this.$root.getUrl + 'public/img/flags/' + this.allLanguagesData[lang].country_code + '.png'
      }
      return this.$root.getUrl + 'public/img/grey.svg'
    },

    goBack () {
      if (this.tab === 'cf' || this.tab === 'tickets' || this.tab === 'category' || this.type === 'badges') {
        this.closeDialog()
      } else {
        this.saveDialog()
      }
    },

    getHeaderTitle () {
      if (this.tab === 'cf') {
        return this.$root.labels.translate + ' ' + this.$root.labels.custom_field
      }
      if (this.tab === 'tickets') {
        return this.$root.labels.translate + ' ' + this.$root.labels.event_tickets
      }
      if (this.type === 'description') {
        return this.$root.labels.translate + ' ' + this.$root.labels.description
      }
      if (this.type === 'url') {
        return this.$root.labels.url
      }
      if (this.type === 'badges') {
        return this.$root.labels.translate + ' ' + this.$root.labels.employee_badge
      }
      return this.$root.labels.translate + ' ' + this.name
    }
  },

  components: {
    ContentBlock
  }
}
</script>
© 2026 GrazzMean-Shell