Clean-up commented code

Clean-up commented code

<template>

        <button name="orcaTabButton" ref="orcaTabButton" class="button" v-on:click="tabDisplay($event)">ORCA</button>
        <button name="fdmnesTabButton" ref="fdmnesTabButton" class="button" v-on:click="tabDisplay($event)">FDMNES</button>
        <button name="quantumEspressoTabButton" ref="quantumEspressoTabButton" class="button" v-on:click="tabDisplay($event)">Quantum Espresso</button>

        Cluster status: {{ clusterStatus }}

        <form v-on:submit.prevent="onSubmit" method="post" id="submit-orca" v-bind:class="{loading: isLoading}">

            Input file already exists (*.inp)?
            <input type="file" ref="inputFile" v-on:change="setInputFile($event)"/>
            <button type="button" ref="clearInputFile" name="clearInputFile" class="button" v-on:click="clearFile($event)">Clear </button>

                Element:
                <select v-if="form == 'fdmnes'" name="element" v-model="element" v-on:change="overviewBuilder()">
                    <option v-for="e in elements">{{ e['element'] }}</option>
                </select>

                Absorption edge:
                <select name="absorbEdge" v-if="form == 'fdmnes'" v-model="edge" v-on:change="overviewBuilder()">
                    <option v-for="edge in fdmnes_abs_edge">{{ edge }}</option>
                </select>
                <select name="absorbEdge" v-if="form == 'qe'" v-model="edge" v-on:change="overviewBuilder()">
                    <option v-for="edge in qe_abs_edge">{{ edge }}</option>
                </select>

ORCA is an ab initio, DFT, and semi-empirical SCF-MO package developed by Frank Neese et al. at the Max Planck Institut für Kohlenforschung.

                    ORCA webpage at Max-Planck-Institut: https://www.kofo.mpg.de/en/research/services/orca

                    ORCA manual: https://www.kofo.mpg.de/412442/orca_manual-opt.pdf

                    ORCA input library website: https://sites.google.com/site/orcainputlibrary/home

If you publish calculation results performed with ORCA code please cite the original papers:

F. Neese, Wiley Interdisciplinary Reviews: Computational Molecular Science 2, 73 (2012).

F. Neese, Wiley Interdisciplinary Reviews: Computational Molecular Science 8, e1327 (2018).

                        In general, the input file is a free format ASCII file and can contain one or more keyword lines that start with a
                        "!" sign, one or more input blocks enclosed between an "%" sign and "end" that provide finer control over specific
                        aspects of the calculation, and finally the specification of the coordinates for the system along with the charge and
                        multiplicity provided either with a %coords block, or more usually enclosed within two "*" symbols. Here is an
                        example of a simple input file that contains all three input elements:

! BLYP DKH2 def2-SVP def2/J SlowConv NoFinalGrid # This is a comment

%maxcore 5024 # global scratch memory limit (in MB) per processing core.

%pal nprocs 4 # requested number of CPUs

                    end

                    * xyz 0 1

                    C   0.0   0.0   0.0

                    O   0.0   0.0   1.13

                    *

                        The input may contain several blocks, which consist of logically related data that can be user controlled. The program tries to choose sensible default values for all of these variables.
                        However, it is impossible to give defaults that are equally sensible for all systems. In general the defaults are slightly on the conservative side and more aggressive cutoffs etc. can
                        be chosen by the user and may help to speed things up for actual systems or give higher accuracy if desired. One-liner explanation (starts with !, order of the keywords is not important)

!Keywords Functional Hamiltonian BasisSet AuxBasisSet

BLYP   - generalized gradient approximation (GGA) DFT functional; see Table 6.2: Density functionals available in ORCA.

DKH2   - scalar relativistic Douglas-Kroll-Hess Hamiltonian of 2nd order; see Table 6.2: Density functionals available in ORCA.

def2-SVP   - basis set for H-Rn; see Table 9.8: Basis sets availability.

def2/J   - Coulomb-fitting auxiliary basis sets (AuxJ); see Table 9.8: Basis sets availability.

UKS   - selects spin unrestricted SCF method; Table 6.1: Main keywords that can be used in the simple input of ORCA.

RKS   - selects restricted closed-shell SCF method.

SlowConv   - selects appropriate SCF converger criteria for difficult cases. Most transition metal complexes fall into this category.

NoFinalGrid   - turns the final integration grid feature off.

Reading geometry from file.xyz in XMol format with coordinates in Ångström and a 2-line header that contains the number of atoms and a description line:

4

description line

C   0.000000000   0.000000000   0.000000000

O   2.362157486   0.000000000   0.000000000

H   -1.109548835   1.774545300   0.000000000

H   -1.109548835   -1.774545300   0.000000000

                        Which technique?
                        <input type="radio" id="Xas" name="technique" value="Xas" checked="checked" v-model="technique" v-on:change="overviewBuilder()">
                        XAS

                        <input type="radio" id="Xes" name="technique" value="Xes" v-model="technique" v-on:change="overviewBuilder()">
                        XES

                        Functional:
                        <select name="functional" v-model="functional" v-on:change="overviewBuilder()" title="BLYP is a generalized gradient approximation (GGA) DFT functional;
B3LYP is a hybrid DFT GGA functional (20% HF exchange).">
                            <option>BLYP</option>
                            <option>B3LYP</option>
                        </select>

                        Basis:
                        <select name="basis" v-model="basis" v-on:change="overviewBuilder()" title="These basis sets are all-electron for elements H-Kr, and automatically load Stuttgart-Dresden effective core potentials for elements Rb-Rn.
def2-SVP is a valence double-zeta basis set with 'new' polarization functions.
def2-SV(P) is the same with slightly reduced polarization.">
                            <option>def2-SVP</option>
                            <option>def2-SV(P)</option>
                        </select>

                        Charge value:
                        <input type="text" name="charge" v-model="charge" v-on:change="overviewBuilder()" v-bind:class="{ferror: errors.has('charge')}" v-validate="'required|decimal'" title="Total charge of the system" />
                        Multiplicity value:
                        <input type="text" name="multiplicity" v-model="multiplicity" v-on:change="overviewBuilder()" v-bind:class="{ferror: errors.has('multiplicity')}" v-validate="'required|decimal'" title="The multiplicity = 2S+1" />
                        Solvent:
                        <select name="solvent" v-model="solvent" v-on:change="overviewBuilder()" title="Add solvent if necessary">
                            <option v-for="s in orca_solvents">{{ s['name'] }}</option>
                        </select>

                        OrbWin[0] Start:
                        <input type="text" name="orbWin0Start" v-model="orbWin0Start" v-on:change="overviewBuilder()" v-bind:class="{ferror: errors.has('orbWin0Start')}" v-validate="'required|numeric|min_value:0'" title="orbwin[0] - Start, Stop, -1, -1
e.g. 0,0,-1,-1 # Selecting the alpha set (orbwin[0]). Selecting donor orbital range : 0 to 0 (the lowest energy
orbital only, means K-edge) and acceptor orbital range: -1 to -1 (meaning all virtual orbitals)"/>
                        {{ errors.first('orbWin0Start') }}

                        OrbWin[0] Stop:
                        <input type="text" name="orbWin0Stop" v-model="orbWin0Stop" v-on:change="overviewBuilder()" v-bind:class="{ferror: errors.has('orbWin0Stop')}" v-validate="'required|numeric|min_value:0'" title="orbwin[0] - Start, Stop, -1, -1
e.g. 0,0,-1,-1 # Selecting the alpha set (orbwin[0]). Selecting donor orbital range : 0 to 0 (the lowest energy
orbital only, means K-edge) and acceptor orbital range: -1 to -1 (meaning all virtual orbitals)"/>
                        {{ errors.first('orbWin0Stop') }}

                        OrbWin[1] Start:
                        <input type="text" name="orbWin1Start" v-model="orbWin1Start" v-on:change="overviewBuilder()" v-bind:class="{ferror: errors.has('orbWin1Start')}" v-validate="'required|numeric|min_value:0'" title="orbwin[1] - Start, Stop, -1, -1
e.g. 0,0,-1,-1 # Selecting the beta set in the same way as the alpha set. Not necessary if system is closed-shell."/>
                        {{ errors.first('orbWin1Start') }}

                        OrbWin[1] Stop:
                        <input type="text" name="orbWin1Stop" v-model="orbWin1Stop" v-on:change="overviewBuilder()" v-bind:class="{ferror: errors.has('orbWin1Stop')}" v-validate="'required|numeric|min_value:0'" title="orbwin[1] - Start, Stop, -1, -1
e.g. 0,0,-1,-1 # Selecting the beta set in the same way as the alpha set. Not necessary if system is closed-shell.
"/>
                        {{ errors.first('orbWin1Stop') }}

                        Load structure (.xyz, .gmnt):
                        <input type="file" ref="orcaStructureFile" v-on:change="setStructureFile($event); overviewBuilder($event)" title="Use file for structure (must be in correct format) or manually add structure using Atoms"/>
                        <button type="button" ref="clearStructureFile" name="clearStructureFile" class="button" v-on:click="clearFile($event)">Clear</button>

FDMNES (Finite Difference Method Near Edge Structure) is to provide a user friendly code, which is able to simulate a broad range of x-ray spectroscopies, beyond the muffin tin approximation. This ab initio (first principles) approach which is based upon the finite difference method, aims to eliminate all methodological parameters and go beyond the limitations of the spherical muffin tin approximation. It includes density functional theory and time-dependent density functional theory.

                    FDMNES webpage: http://fdmnes.neel.cnrs.fr/

                    FDMNES theory and input: HJoly_FDMNES_CONEXS_Newcastle.pdf

If you publish calculation results performed with FDMNES code please cite the original papers:

J. Phys.: Condens. Matter 21, 345501 (2009).

J. Chem. Theory Comput. 11, 4512-4521 (2015).

J. Synchrotron Rad. 23, 551-559 (2016).

                        Green?
                        <input type="checkbox" v-model="fdmnes_method" v-on:change="overviewBuilder()" />

                        Crystal?
                        <select name="crystal" v-model="crystal" v-on:change="overviewBuilder()">
                            <option>Crystal</option>
                            <option>Molecule</option>
                        </select>

                        Load structure (.cif, .pdb):
                        <input type="file" ref="fdmnesStructureFile" v-on:change="setStructureFile($event); overviewBuilder($event)"/>
                        <button type="button" ref="clearStructureFile" name="clearStructureFile" class="button" v-on:click="clearFile($event)">Clear</button>

Quantum ESPRESSO (Quantum opEn-Source Package for Research in Electronic Structure, Simulation, and Optimisation) is a suite of applications for ab-initio electronic structure calculations using plane waves and pseudopotentials.

                    Quantum ESPRESSO webpage: https://www.quantum-espresso.org

                    Pw.x input descriptions: https://www.quantum-espresso.org/Doc/INPUT_PW.html

                    XSPECTRA input descriptions: https://github.com/QEF/q-e/blob/master/XSpectra/Doc/INPUT_XSPECTRA

If you publish calculation results performed with QE code please cite the original papers:

Journal of Physics: Condensed Matter 21, 395502 (2009).

Phys. Rev. B 80, 075102 (2009)

Phys. Rev. B 87, 205105 (2013)

Journal of Physics: Condensed Matter 29, 465901 (2017).

The Journal of Chemical Physics 152, 154105 (2020).

 X-ray absorption simulations in quantum espresso are carried out in two steps. Firstly using the pw.x code and then using the xspectra.x code. The input files for these to codes are ASCII files separated into cards (or blocks). The beginning of a block is denoted by an & symbol and the name of the card, the card is closed with a "/", for example:

 &CONTROL … /.

 For pw.x the input cards must be given in the order: control, system, electrons. Information on the geometry is given in the input file and can be provided as a set of atomic coordinates in Angstrom and a set of cell parameters also in Angstroms.

Materials Project provides open web-based access to computed information on known and predicted materials.

                    https://materialsproject.org/

If you use the Materials Project as a resource in your research, please cite the following work:

APL Materials, 2013, 1(1), 011002.

                Cards

                <button type="button" name="systemCardBtn" ref="systemCardBtn" class="button" v-on:click="cardDisplay($event)">SYSTEM</button>
                <button type="button" name="atomicPositionCardBtn" ref="atomicPositionCardBtn" class="button" v-on:click="cardDisplay($event)">ATOMIC_POSITION</button>
                <button type="button" name="cellParamsCardBtn" ref="cellParamsCardBtn" class="button" v-on:click="cardDisplay($event)">CELL_PARAMETERS</button>
                <button type="button" name="mpApiBtn" ref="mpApiBtn" class="button" v-on:click="cardDisplay($event)">MATERIALS_PROJECT</button>

                            Conductivity:
                            <select name="conductivity" v-model="conductivity" v-on:change="overviewBuilder()">
                                <option>metallic</option>
                                <option>semiconductor</option>
                                <option>insulator</option>
                            </select>

                            ATOMIC_POSITIONS:
                            <select name="atomicPositionType" v-model="atomicPositionType" v-on:change="overviewBuilder()">
                                <option>bohr</option>
                                <option>angstrom</option>
                                <option>crystal</option>
                            </select>

                            Atoms:

                                <template slot="actions" slot-scope="{ row }">
                                    <button type="button" class="button" v-on:click="removeAtom(row.ID); overviewBuilder()">Remove</button>
                                </template>
                                <template slot="addRow" slot-scope="{ row }">

                                        <select name="atom" v-model="atom">
                                            <option v-for="e in ppElements">{{ e['element'] }}</option>
                                        </select>

                                    <input type="text" v-model="atomX" name="atomX" v-bind:class="{ferror: errors.has('atomX')}" v-validate="'required|decimal|min_value:-100|max_value:100'"/>
                                    <input type="text" v-model="atomY" name="atomY" v-bind:class="{ferror: errors.has('atomY')}" v-validate="'required|decimal|min_value:-100|max_value:100'"/>
                                    <input type="text" v-model="atomZ" name="atomZ" v-bind:class="{ferror: errors.has('atomZ')}" v-validate="'required|decimal|min_value:-100|max_value:100'"/>
                                    <input type="checkbox" title="Only one atom can be marked as absorbing" v-model="absorbingAtom" :disabled="absorbingAtomDisabled"/>
                                    <button class="button" type="button" v-on:click="addAtom(); overviewBuilder()">Add</button>
                                </template>

                            Cell Parameters Type:
                            <select name="cellParamsType" v-model="cellParamsType" v-on:change="overviewBuilder()">
                                <option>bohr</option>
                                <option>angstrom</option>
                            </select>

                            Cell Parameters:

                                <template slot="actions" slot-scope="{ row }">
                                    {{ 'V'+row.ID }}
                                </template>
                                <template slot="content" slot-scope="{ row }">
                                    <input type="text" v-model="row.X" :name="row.ID+'X'" v-bind:class="{ferror: errors.has(row.ID+'X')}" v-validate="'required|decimal|min_value:-100|max_value:100'" v-on:change="overviewBuilder()"/>
                                    <input type="text" v-model="row.Y" :name="row.ID+'Y'" v-bind:class="{ferror: errors.has(row.ID+'Y')}" v-validate="'required|decimal|min_value:-100|max_value:100'" v-on:change="overviewBuilder()"/>
                                    <input type="text" v-model="row.Z" :name="row.ID+'Z'" v-bind:class="{ferror: errors.has(row.ID+'Z')}" v-validate="'required|decimal|min_value:-100|max_value:100'" v-on:change="overviewBuilder()"/>
                                </template>

                            Your personal MP token:
                            <input style="width: 30%" type="text" v-model="mpApiToken" name="mpApiToken"/>

                            Material ID (e.g., mp-100):
                            <input style="width: 30%" type="text" v-model="mpApiId" name="mpApiId"/>

                            Which atom is absorbing (counting from 1)?:
                            <input type="number" min="1" max="100" v-model="mpApiAtom" name="mpApiAtom"/>

                            <button type="button" ref="fetchMpapiInput" name="fetchMpapiInput" class="button" v-on:click="fetchMpApi($event)">Fetch from MP api</button>

                    Atoms:

                        <template slot="actions" slot-scope="{ row }">
                            <button type="button" class="button" v-on:click="removeAtom(row.ID); overviewBuilder()">Remove</button>
                        </template>
                        <template slot="addRow" slot-scope="{ row }">

                                <select name="atom" v-model="atom" v-bind:class="{ferror: errors.has('atom')}" v-validate="'required'">
                                    <option v-for="e in elements">{{ e['element'] }}</option>
                                </select>

                            <input type="text" v-model="atomX" name="atomX" v-bind:class="{ferror: errors.has('atomX')}" v-validate="atomRules"/>
                            <input type="text" v-model="atomY" name="atomY" v-bind:class="{ferror: errors.has('atomY')}" v-validate="atomRules"/>
                            <input type="text" v-model="atomZ" name="atomZ" v-bind:class="{ferror: errors.has('atomZ')}" v-validate="atomRules"/>
                            <button class="button" type="button" v-on:click="addAtom(); overviewBuilder()">Add</button>
                        </template>

                    Params:

                        <template slot="content" slot-scope="{ row }">
                            <input type="text" v-model="fdmnesParams[0].A" name="fdmnesParamA" v-bind:class="{ferror: errors.has('fdmnesParamA')}" v-validate="'required|decimal|min_value:-100|max_value:100'" v-on:change="overviewBuilder()"/>
                            <input type="text" v-model="fdmnesParams[0].B" name="fdmnesParamB" v-bind:class="{ferror: errors.has('fdmnesParamB')}" v-validate="'required|decimal|min_value:-100|max_value:100'" v-on:change="overviewBuilder()"/>
                            <input type="text" v-model="fdmnesParams[0].C" name="fdmnesParamC" v-bind:class="{ferror: errors.has('fdmnesParamC')}" v-validate="'required|decimal|min_value:-100|max_value:100'" v-on:change="overviewBuilder()"/>
                            <input type="text" v-model="fdmnesParams[0].Alpha" name="fdmnesParamAlpha" v-bind:class="{ferror: errors.has('fdmnesParamAlpha')}" v-validate="'required|decimal|min_value:0|max_value:180'" v-on:change="overviewBuilder()"/>
                            <input type="text" v-model="fdmnesParams[0].Beta" name="fdmnesParamBeta" v-bind:class="{ferror: errors.has('fdmnesParamBeta')}" v-validate="'required|decimal|min_value:0|max_value:180'" v-on:change="overviewBuilder()"/>
                            <input type="text" v-model="fdmnesParams[0].Gamma" name="fdmnesParamGamma" v-bind:class="{ferror: errors.has('fdmnesParamGamma')}" v-validate="'required|decimal|min_value:0|max_value:180'" v-on:change="overviewBuilder()"/>
                        </template>

                    Overview (cannot edit!):
                    <textarea id="fileContents" v-bind:value="inputFileContents" v-bind:rows="textAreaRows" v-bind:cols="textAreaColumns" style="width:auto;height:auto" title="Job overview to be submitted to the calculation cluster" readonly>
                    </textarea>

                    Save input file:
                    <button type="button" class="button" v-on:click="downloadFileContents()">Download</button>

                    Spectrum Type:
                    <select name="orcaSpectrumType" v-model="orcaSpectrumType">
                        <option v-for="s in orcaMapKeyword">{{ s }}</option>
                    </select>
                    Start Value (eV):

                    <input type="text" name="orcaStartValue" v-model="orcaStartValue" v-bind:class="{ferror: errors.has('orcaStartValue')}" v-validate="'required|decimal'">

                    Stop Value (eV):

                    <input type="text" name="orcaStopValue" v-model="orcaStopValue" v-bind:class="{ferror: errors.has('orcaStopValue')}" v-validate="'required|decimal'">

                    Broadening (eV):

                    <input type="text" name="orcaBroadening" v-model="orcaBroadening" v-bind:class="{ferror: errors.has('orcaBroadening')}" v-validate="'required|decimal|min_value:0|max_value:100'">

                    <input type="checkbox" name="orcaLicense" value="accepted" v-model="orcaLicense">

                      Please tick here to comply with ORCA license agreement https://orcaforum.kofo.mpg.de/app.php/privacypolicy/policy

                    CPUs:
                    <input type="text" name="cpus" v-model="cpus" v-on:change="overviewBuilder()" v-bind:class="{ferror: errors.has('cpus')}" v-validate="'required|numeric|min_value:1|max_value:10'"/>
                    {{ errors.first('cpus') }}

                    Memory required in Gb:
                    <input type="text" name="memory" v-model="memory" v-on:change="overviewBuilder()" v-bind:class="{ferror: errors.has('memory')}" v-validate="'required|numeric|min_value:1|max_value:32'"/>

                    {{ errors.first('memory') }}
                    <button type="button" class="button submit" name="orcaSubmit" v-on:click="onSubmit($event)" :disabled="isSubmitDisabled || (!orcaLicense && orcaDisplay=='inline')">SUBMIT</button>

                    On successful submission, your results will be sent to the e-mail address associated with your fedid

                    Your Job Status'

                        <template slot="actions" slot-scope="{ row }">
                            <button type="button" :ref="'job'+row.jobID" class="button" v-on:click="killJob(row.jobID)">Kill Job</button>
                        </template>

        </form>

</template>


갤러리 카드 dimmer 효과 성능문제로 인해 제거

갤러리 카드 dimmer 효과 성능문제로 인해 제거

<template>

{{$t('common.button.view')}}

            {{image.writer.username}}

          <router-link :to="{name: 'gallery.view', params: {id: image.id}}" class="description break-all">
            {{image.name}}
          </router-link>

          {{image.id | IdToRegDate('LL')}}

              {{image.views}}

    <button @click="moreImages()" :class="{loading: isLoading}" type="button" class="ui fluid button trigger">{{$t('common.button.more.galleries')}}</button>

</template>


trailing whitespace removed

trailing whitespace removed

<template>

                <router-view></router-view>

</template>


fix space

fix space

<template>

			<AppSitesManagePage :site="site" />

					<AppTranslate>
						Game Jolt Sites are customizable external sites for your portfolio and
						games!
					</AppTranslate>

				{{ ' ' }}
				<AppTranslate>
					You can use a customizable template, or simply upload your own static site.
				</AppTranslate>

				<AppTranslate>
					Sites don't replace your Game Jolt user profile page. You can use your Site URL
					to share your site with others.
				</AppTranslate>

				<AppTranslate>You can set up a game site when managing your game.</AppTranslate>

			<AppSitesLinkCard :site="site" />

</template>

<template>

			<AppSitesManagePage :site="site" />

					<AppTranslate>
						Game Jolt Sites are customizable external sites for your portfolio and
						games!
					</AppTranslate>

				<AppTranslate>
					You can use a customizable template, or simply upload your own static site.
				</AppTranslate>

				<AppTranslate>
					Sites don't replace your Game Jolt user profile page. You can use your Site URL
					to share your site with others.
				</AppTranslate>

				<AppTranslate>You can set up a game site when managing your game.</AppTranslate>

			<AppSitesLinkCard :site="site" />

</template>


Added subfield in autocomplete

Added subfield in autocomplete

<template>
  <q-search v-model="pattern" @change="onChanged">
    <q-autocomplete @search="onSearch" @selected="onSelected" />
  </q-search>
</template>

<script>
import _ from 'lodash'
import { QSearch, QAutocomplete } from 'quasar'

export default {
  name: 'k-autocomplete',
  components: {
    QSearch,
    QAutocomplete
  },
  props: {
    services: {
      type: Array,
      required: true
    },
    processResults: {
      type: Function
    }
  },
  data () {
    return {
      pattern: ''
    }
  },
  methods: {
    clear () {
      this.pattern = ''
    },
    onSearch (pattern, done) {
      // Perform request for partial match to all registered services
      const requests = this.services.map(item => {
        const service = this.$api.getService(item.service)
        // build the query using given templet if any
        let query = Object.assign({}, item.baseQuery)
        // Then add partial match
        // We don't use set by dot here because Mongo queries on nested fields
        // require the key to contain the path and not nested objects
        // _.set(query, item.field, { $search: pattern })

        query[item.field] = { $search: pattern }
        return service.find({ query })
      })
      Promise.all(requests).then(responses => {
        let results = []
        for (let i = 0; i < responses.length; i++) {
          const response = responses[i]
          const item = this.services[i]
          if (response.total > 0) {
            response.data.forEach(data => {
              data.service = item.service
              data.field = item.field
              data.limit = item.limit
              if (!data.icon) data.icon = item.icon
              let result = {
                label: _.get(data, item.field),
                value: _.get(data, item.field),
                icon: _.get(data, item.iconField || 'icon.name')
              }
              if (item.subfield) {
                data.subfield = item.subfield
                result.sublabel = _.get(data, item.subfield)
              }
              Object.assign(result, { data: data })
              results.push(result)
            })
          }
        }
        if (this.processResults) {
          this.processResults(pattern, results)
        }
        this.$emit('pattern-changed', pattern)
        done(results)
      })
    },
    onSelected (item) {
      this.emitChange(item.data)
    },
    onChanged (pattern) {
      this.emitChange(pattern)
    }
  },
  created () {
    this.emitChange = _.debounce((value) => { this.$emit('changed', value) }, 300)
  }
}
</script>

<template>
  <q-search v-model="pattern" @change="onChanged">
    <q-autocomplete @search="onSearch" @selected="onSelected" />
  </q-search>
</template>

<script>
import _ from 'lodash'
import { QSearch, QAutocomplete } from 'quasar'

export default {
  name: 'k-autocomplete',
  components: {
    QSearch,
    QAutocomplete
  },
  props: {
    services: {
      type: Array,
      required: true
    },
    processResults: {
      type: Function
    }
  },
  data () {
    return {
      pattern: ''
    }
  },
  methods: {
    clear () {
      this.pattern = ''
    },
    onSearch (pattern, done) {
      // Perform request for partial match to all registered services
      const requests = this.services.map(item => {
        const service = this.$api.getService(item.service)
        // build the query using given templet if any
        let query = Object.assign({}, item.baseQuery)
        // Then add partial match
        // We don't use set by dot here because Mongo queries on nested fields
        // require the key to contain the path and not nested objects
        // _.set(query, item.field, { $search: pattern })

        query[item.field] = { $search: pattern }
        return service.find({ query })
      })
      Promise.all(requests).then(responses => {
        let results = []
        for (let i = 0; i < responses.length; i++) {
          const response = responses[i]
          const item = this.services[i]
          if (response.total > 0) {
            response.data.forEach(data => {
              data.service = item.service
              data.field = item.field
              data.limit = item.limit
              if (!data.icon) data.icon = item.icon
              let result = {
                label: _.get(data, item.field),
                value: _.get(data, item.field),
                icon: _.get(data, item.iconField || 'icon.name')
              }
              Object.assign(result, { data: data })
              results.push(result)
            })
          }
        }
        if (this.processResults) {
          this.processResults(pattern, results)
        }
        this.$emit('pattern-changed', pattern)
        done(results)
      })
    },
    onSelected (item) {
      this.emitChange(item.data)
    },
    onChanged (pattern) {
      this.emitChange(pattern)
    }
  },
  created () {
    this.emitChange = _.debounce((value) => { this.$emit('changed', value) }, 300)
  }
}
</script>


Fix bug

Fix bug

<template>
<transition-group
	name="staggered-fade"
	tag="div"
	:css="false"
	@before-enter="beforeEnter"
	@enter="enter"
	@leave="leave"
	mode="out-in"
	appear
>
	<slot></slot>
</transition-group>
</template>

<script lang="ts">
import Vue from 'vue';

export default Vue.extend({
	props: {
		delay: {
			type: Number,
			required: false,
			default: 40
		},
		direction: {
			type: String,
			required: false,
			default: 'down'
		},
		reversed: {
			type: Boolean,
			required: false,
			default: false
		}
	},
	i: 0,
	methods: {
		beforeEnter(el) {
			el.style.opacity = 0;
			el.style.transform = this.direction === 'down' ? 'translateY(-64px)' : 'translateY(64px)';
			let index = this.$options.i;
			const delay = this.delay * index;
			el.style.transition = [getComputedStyle(el).transition, `transform 0.7s cubic-bezier(0.23, 1, 0.32, 1) ${delay}ms`, `opacity 0.7s cubic-bezier(0.23, 1, 0.32, 1) ${delay}ms`].filter(x => x != '').join(',');
			this.$options.i++;
		},
		enter(el, done) {
			setTimeout(() => {
				el.style.opacity = 1;
				el.style.transform = 'translateY(0px)';
				el.addEventListener('transitionend', () => {
					el.style.transition = '';
					this.$options.i--;
					done();
				}, { once: true });
			});
		},
		leave(el) {
			el.style.opacity = 0;
			el.style.transform = this.direction === 'down' ? 'translateY(64px)' : 'translateY(-64px)';
		},
		focus() {
			this.$slots.default[0].elm.focus();
		}
	}
});
</script>

<style lang="scss">
.staggered-fade-move {
	transition: transform 0.7s !important;
}
</style>

<template>
<transition-group
	name="staggered-fade"
	tag="div"
	:css="false"
	@before-enter="beforeEnter"
	@enter="enter"
	@leave="leave"
	mode="out-in"
	appear
>
	<slot></slot>
</transition-group>
</template>

<script lang="ts">
import Vue from 'vue';

export default Vue.extend({
	props: {
		delay: {
			type: Number,
			required: false,
			default: 40
		},
		direction: {
			type: String,
			required: false,
			default: 'down'
		},
		reversed: {
			type: Boolean,
			required: false,
			default: false
		}
	},
	data() {
		return {
			currentChildren: [] as Node[],
			index: 0
		};
	},
	methods: {
		updateChildren() {
			this.currentChildren = this.$slots.default!.filter(n => n.elm != null).map(n => n.elm!);
		},
		beforeEnter(el) {
			el.style.opacity = 0;
			el.style.transform = this.direction === 'down' ? 'translateY(-64px)' : 'translateY(64px)';
		},
		enter(el, done) {
			let index = this.index;
			// TODO
			//if (this.reversed) index = ...;
			//console.log(index);
			el.style.transition = [getComputedStyle(el).transition, 'transform 0.7s cubic-bezier(0.23, 1, 0.32, 1)', 'opacity 0.7s cubic-bezier(0.23, 1, 0.32, 1)'].filter(x => x != '').join(',');
			setTimeout(() => {
				el.style.opacity = 1;
				el.style.transform = 'translateY(0px)';
				setTimeout(() => {
					done();
					this.index--;
				}, 700);
			}, this.delay * index)
			this.index++;
		},
		leave(el, done) {
			el.style.opacity = 0;
			el.style.transform = this.direction === 'down' ? 'translateY(64px)' : 'translateY(-64px)';
			setTimeout(done, 700);
		},
		focus() {
			this.$slots.default[0].elm.focus();
		}
	}
});
</script>

<style lang="scss">
.staggered-fade-move {
	transition: transform 0.7s !important;
}
</style>


Added ScheduleEntry number in ActivityList.vue

<!--
Lists all activity instances in a list view.
-->

<template>
  <v-list dense>
    <template v-for="scheduleEntry in scheduleEntries">
      <v-skeleton-loader
        v-if="scheduleEntry.activity()._meta.loading"
        :key="scheduleEntry._meta.self"
        type="list-item-avatar-two-line" height="60" />
      <v-list-item
        v-else
        :key="scheduleEntry._meta.self"
        two-line
        :to="scheduleEntryLink(scheduleEntry)">
        <v-chip class="mr-2" :color="scheduleEntry.activity().activityCategory().color.toString()">
          {{
            scheduleEntry.activity().activityCategory().short
          }}
        </v-chip>
        <v-list-item-content>
          <v-list-item-title>{{ scheduleEntry.number }}: {{ scheduleEntry.activity().title }}</v-list-item-title>
          <v-list-item-subtitle>{{ $moment.utc(scheduleEntry.startTime) }} - {{ $moment.utc(scheduleEntry.endTime) }}</v-list-item-subtitle>
        </v-list-item-content>
      </v-list-item>
    </template>
  </v-list>
</template>
<script>
import { scheduleEntryRoute } from '@/router'

export default {
  name: 'ActivityList',
  props: {
    period: {
      type: Function,
      required: true
    },
    scheduleEntries: {
      type: Array,
      required: true
    }
  },
  computed: {
    camp () {
      return this.period().camp()
    }
  },
  methods: {
    scheduleEntryLink (scheduleEntry) {
      return scheduleEntryRoute(this.camp, scheduleEntry)
    }
  }
}
</script>
<style lang="scss">

</style>

<!--
Lists all activity instances in a list view.
-->

<template>
  <v-list dense>
    <template v-for="scheduleEntry in scheduleEntries">
      <v-skeleton-loader
        v-if="scheduleEntry.activity()._meta.loading"
        :key="scheduleEntry._meta.self"
        type="list-item-avatar-two-line" height="60" />
      <v-list-item
        v-else
        :key="scheduleEntry._meta.self"
        two-line
        :to="scheduleEntryLink(scheduleEntry)">
        <v-chip class="mr-2" :color="scheduleEntry.activity().activityCategory().color.toString()">
          {{
            scheduleEntry.activity().activityCategory().short
          }}
        </v-chip>
        <v-list-item-content>
          <v-list-item-title>{{ scheduleEntry.activity().title }}</v-list-item-title>
          <v-list-item-subtitle>{{ $moment.utc(scheduleEntry.startTime) }} - {{ $moment.utc(scheduleEntry.endTime) }}</v-list-item-subtitle>
        </v-list-item-content>
      </v-list-item>
    </template>
  </v-list>
</template>
<script>
import { scheduleEntryRoute } from '@/router'

export default {
  name: 'ActivityList',
  props: {
    period: {
      type: Function,
      required: true
    },
    scheduleEntries: {
      type: Array,
      required: true
    }
  },
  computed: {
    camp () {
      return this.period().camp()
    }
  },
  methods: {
    scheduleEntryLink (scheduleEntry) {
      return scheduleEntryRoute(this.camp, scheduleEntry)
    }
  }
}
</script>
<style lang="scss">

</style>


api-text-field use :name

api-text-field use :name

<!--
Displays details on a single camp and allows to edit them.
-->

<template>
  <content-group :title="$tc('components.camp.campSettings.title')">
    <v-skeleton-loader v-if="camp()._meta.loading" type="article" />
    <div v-else class="mt-3">
      <api-form :entity="camp()">
        <api-text-field
          fieldname="name"
          :name="$tc('entity.camp.fields.name')"
          vee-rules="required"
          :disabled="disabled" />
        <api-text-field
          fieldname="title"
          :name="$tc('entity.camp.fields.title')"
          vee-rules="required"
          :disabled="disabled" />
        <api-text-field
          fieldname="motto"
          :name="$tc('entity.camp.fields.motto')"
          :disabled="disabled" />
      </api-form>
    </div>
  </content-group>
</template>

<script>
import ApiTextField from '@/components/form/api/ApiTextField.vue'
import ContentGroup from '@/components/layout/ContentGroup.vue'
import ApiForm from '@/components/form/api/ApiForm.vue'

export default {
  name: 'CampSettings',
  components: { ContentGroup, ApiTextField, ApiForm },
  props: {
    camp: {
      type: Function,
      required: true
    },
    disabled: {
      type: Boolean,
      default: false
    }
  },
  data () {
    return {}
  }
}
</script>

<style scoped>
</style>

<!--
Displays details on a single camp and allows to edit them.
-->

<template>
  <content-group :title="$tc('components.camp.campSettings.title')">
    <v-skeleton-loader v-if="camp()._meta.loading" type="article" />
    <div v-else class="mt-3">
      <api-form :entity="camp()">
        <api-text-field
          fieldname="name"
          :label="$tc('entity.camp.fields.name')"
          vee-rules="required"
          :disabled="disabled" />
        <api-text-field
          fieldname="title"
          :name="$tc('entity.camp.fields.title')"
          vee-rules="required"
          :disabled="disabled" />
        <api-text-field
          fieldname="motto"
          :name="$tc('entity.camp.fields.motto')"
          :disabled="disabled" />
      </api-form>
    </div>
  </content-group>
</template>

<script>
import ApiTextField from '@/components/form/api/ApiTextField.vue'
import ContentGroup from '@/components/layout/ContentGroup.vue'
import ApiForm from '@/components/form/api/ApiForm.vue'

export default {
  name: 'CampSettings',
  components: { ContentGroup, ApiTextField, ApiForm },
  props: {
    camp: {
      type: Function,
      required: true
    },
    disabled: {
      type: Boolean,
      default: false
    }
  },
  data () {
    return {}
  }
}
</script>

<style scoped>
</style>


Refactored code

Refactored code

/* Copyright 2020 Google LLC Licensed under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance with the License. You
may obtain a copy of the License at https://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software distributed
under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
CONDITIONS OF ANY KIND, either express or implied. See the License for the
specific language governing permissions and limitations under the License. */

<template>

        My Shops
        About

            Add Shop

            Logout

</template>


diff css

diff css

<template>

    <ui-loading v-if="loading"></ui-loading>

      <md-layout md-row>
        <md-input-container>
          {{ $t('Compare') }}
          <md-select name="compareA" id="compareA" v-model="compareA">
            <md-option v-for="(v, k) in allVersions" :value="v" :key="k">{{ v }}</md-option>
          </md-select>
        </md-input-container>

        <md-input-container>
          {{ $t('Compare') }}
          <md-select name="compareB" id="compareB" v-model="compareB">
            <md-option v-for="(v, k) in allVersions" :value="v" :key="k">{{ v }}</md-option>
          </md-select>
        </md-input-container>
      </md-layout>
      <template v-for="html in diffHTML">

      </template>

{{ $t("There are no code differences between the selected versions" )}} {{ diffHTML[0] }}

</template>


Extracted entry move

Extracted entry move

<template>

    <v-calendar
      v-model="value"
      class="ec-picasso"
      :events="events"
      :event-name="getActivityName | loading('Lädt…', ({ input }) => isActivityLoading(input))"
      :event-color="getActivityColor | loading('grey lighten-2', (entry) => isActivityLoading(entry))"
      :interval-height="intervalHeight"
      interval-width="46"
      :interval-format="intervalFormat"
      first-interval="5"
      interval-count="19"
      :start="start"
      :end="end"
      :locale="$i18n.locale"
      :day-format="dayFormat"
      :type="type"
      :weekday-format="weekdayFormat"
      :weekdays="[1, 2, 3, 4, 5, 6, 0]"
      color="primary"
      :event-ripple="false"
      @change="getEvents"
      @mousedown:event="entryMouseDown"
      @mouseup:event="entryMouseUp"
      @mousedown:time="timeMouseDown"
      @mousemove:time="timeMouseMove"
      @mouseup:time="timeMouseUp"
      @mouseleave.native="nativeMouseUp">
      <template #event="{event, eventParsed, timed}">

{{ getActivityName(event) }}

      </template>
    </v-calendar>
    <v-menu
      :value="showEntryInfo"
      :activator="selectedElement"
      :close-on-content-click="false"
      offset-x>
      <v-card>

test

      </v-card>
    </v-menu>

</template>


Desabilitando o botão de enviar cotas

Desabilitando o botão de enviar cotas

<template>

            Erro! {{errormsg}}

            Atenção! {{warningmsg}}

              Processo

                Digital

                Físico {{proc.dadosBasicos.numero}}

              <template v-if="marcasativas">

              </template>

        <processo-notas :processo="numero" :orgao="orgao" @ativar="notas = true" @desativar="notas = false"></processo-notas>

        <timeline :timeline="timeline"></timeline>

        <template v-if="proc && proc.dadosBasicos">

                    {{fixed.partesAtivas[0].tipoAtuacao}}

                    {{fixed.partesAtivas[0].pessoa.nome}}
                    1">
                      +{{fixed.partesAtivas.length-1}}

                    {{fixed.partesPassivas[0].tipoAtuacao}}

                    {{fixed.partesPassivas[0].pessoa.nome}}
                    1">
                      +{{fixed.partesPassivas.length-1}}

                  Ver partes...

                    PROCESSO

                        DIGITAL

                        FÍSICO

                    {{proc.dadosBasicos.numero}}

                    DATA DE DISTRIBUIÇÃO

                    ÓRGÃO JULGADOR

                    {{proc.dadosBasicos.orgaoJulgador.nomeOrgao}}

                    MAGISTRADO

                    {{proc.dadosBasicos.outroParametro.nomeMagistrado}}

                  Ver processos relacionados...

                    VALOR DA CAUSA

                    {{fixed.valorCausa}}

                    CLASSE

                    {{fixed.classeProcessualDescricao}}

                    ASSUNTO PRINCIPAL

                    {{fixed.assuntoPrincipalDescricao}}

                    CDA

                    {{proc.dadosBasicos.outroParametro.numCDA[0]}}
                    1">
                      +{{proc.dadosBasicos.outroParametro.numCDA.length-1}}

                  Ver mais...

                  Partes
                  <button type="button" class="close d-print-none" @click="mostrarPartes(false)">
                    ×
                  </button>

                    Pólo {{(polo.polo == 'AT') ? 'Ativo' : 'Passivo'}}

                  <template v-for="parte in polo.parte">

                        {{parte.tipoAtuacao}}

{{parte.pessoa.nome}}

                        Tipo

{{parte.pessoa.tipoPessoa}}

                        Documento

{{parte.documento}}

                        Assistência Judiciária

{{parte.assistenciaJudiciaria ? "Sim" : "Não"}}

                        {{tipoRepresentante[adv.tipoRepresentante]}}

{{adv.nome}}

                        Inscrição

{{adv.inscricao}}

                        Intimação

{{adv.intimacao ? "Sim" : "Não"}}

                  </template>

                  Processos Vinculados
                  <button type="button" class="close d-print-none" @click="mostrarProcessosRelacionados(false)">
                    ×
                  </button>

                             - {{pv.nomeClasse}} - {{pv.suporte}}

                  Recursos
                  <button type="button" class="close d-print-none" @click="mostrarProcessosRelacionados(false)">
                    ×
                  </button>

                             - {{pv.nomeClasse}} - {{pv.suporte}}

Dados Principais

                      Data/Hora de Distribuição

                      Órgão Julgador

{{proc.dadosBasicos.orgaoJulgador.nomeOrgao}}

                      Magistrado

{{proc.dadosBasicos.outroParametro.nomeMagistrado}}

                      Valor da Causa

{{fixed.valorCausa}}

                      Classe Processual

{{fixed.classeProcessualDescricao}}

                      Assunto Principal

{{fixed.assuntoPrincipalDescricao}}

                      Processos Vinculados

                               - {{pv.nomeClasse}} - {{pv.suporte}}

                      Recursos

                               - {{pv.nomeClasse}} - {{pv.suporte}}

                  Dados Complementares
                  <button type="button" class="close d-print-none" @click="mostrarDadosComplementares(false)">
                    ×
                  </button>

                      Data de Protocolo

                      Processos Administrativos

                      CDA's

                      Número Antigo

                      Petições Pendentes de Juntada

                      Processo Originário

                      Classe Processual

{{fixed.classeProcessualDescricaoCompleta}}

                      Assunto(s) CNJ

{{ass.descricaoCompleta}}

                <button type="button" @click="filtrarMovimentos()" class="close" aria-label="Close">
                  ×
                </button>

                  🔍
                  <input type="text" list="lst_filtrarMovimentosInput" id="filtrarMovimentosInput" class="form-control" placeholder="Filtrar Movimentos" v-model="filtro" ref="filtro">
                  <datalist id="lst_filtrarMovimentosInput">
                    <option>#marca</option>
                    <option>#distribuicao</option>
                    <option>#intimacao</option>
                    <option>#remessa</option>
                    <option>#devolucao</option>
                    <option>#juntada</option>
                    <option>#audiencia</option>
                    <option>#conclusao</option>
                    <option>#sentenca</option>
                    <option>#suspensao</option>
                    <option>#apelacao</option>
                    <option>#baixa</option>
                    <option>#arquivamento</option>
                  </datalist>

                    Data/Hora
                    Movimento
                    Peça
                    Página Inicial
                    Página Final

                  <template v-for="movdoc in filtrados">

                      {{movdoc.mov.movimentoLocal ? movdoc.mov.movimentoLocal.descricao : ''}}
                      <template v-if="movdoc.doc">

                            {{movdoc.doc.descricao}}

 0">
                          <template v-for="m in movdoc.marca">

                                {{m.texto}}

                          </template>

                        {{movdoc.doc && movdoc.doc.outroParametro ? movdoc.doc.outroParametro.paginaInicial : ''}}
                        {{movdoc.doc && movdoc.doc.outroParametro ? movdoc.doc.outroParametro.paginaFinal : ''}}
                      </template>
                      <template v-else>

                      </template>

                          <button type="button" class="close d-print-none" @click="mostrarTexto(movdoc.doc, false)">
                            ×
                          </button>

                  </template>

              <button type="button" v-if="!$parent.settings.filtrarMovimentos" @click="filtrarMovimentos('')" class="btn btn-secondary d-print-none mt-3">

                Filtrar Movimentos
              </button>

              <button type="button" v-if="marcasativas && (filtro !== '#marca')" @click="filtrarMovimentos('#marca')" class="btn btn-secondary d-print-none mt-3">

                Filtrar Marcas
              </button>

              <button type="button" @click="mostrarCompleto()" id="download" class="btn btn-info d-print-none mt-3">

                PDF Completo
              </button>

              <button type="button" @click="imprimir()" id="imprimir" class="btn btn-info d-print-none mt-3">

                Imprimir</button>

              <button type="button" @click="cotar()" id="cotar" class="btn btn-info d-print-none mt-3">

                Enviar Cota</button>

                As informações aqui contidas não produzem efeitos legais. Somente a publicação no D.O. tem validade para contagem de prazos.

Consulta realizada em: {{proc.dadosBasicos.outroParametro.dataConsulta}}.

        </template>

    <processo-peca-detalhes ref="processoPecaDetalhes" @ok="salvarProcessoPecaDetalhes" @remove="excluirProcessoPecaDetalhes"></processo-peca-detalhes>
    <processo-cota ref="processoCota" :processo="numero" :orgao="orgao" @ok="cotaEnviada" @erro="cotaNaoEnviada"></processo-cota>

</template>


Remove commented code in example

Remove commented code in example

<template>
  <v-date-picker v-model="value" locale="hu" is-inline />
</template>

<script>
export default {
  data() {
    return {
      value: null,
      masks: {
        title: 'MM YYYY',
      },
    };
  },
};
</script>

<template>
  <v-date-picker v-model="value" locale="hu" is-inline />
</template>

<script>
export default {
  data() {
    return {
      value: null,
      masks: {
        title: 'MM YYYY',
      },
    };
  },
  mounted() {
    // console.log(this.$vc.locales);
  },
};
</script>


Fix Bug Attributes & Operations on Nodes & Edges

<template>

    <Toolbar
        v-if="graphComponent"
        :graph-component="graphComponent"
        :isEditEnabled="isEditEnabled"
        :save-graph="saveGraph"
        @reload-graph="plotDefaultGraph()"
        @toggle-editable="toggleEditable"
        @toggle-grid="toggleGrid"
    />

      <DndPanel
          v-if="graphComponent"
          :graph-component="graphComponent"
          :is-expanded="isDndExpanded"
          :passive-supported="true"
          @add-attribute-to-node="(node, attributeName) => addAttributeToNode(node, attributeName)"
          @add-operation-to-node="(node, operationName) => addOperationToNode(node, operationName)"
          @delete-attribute-from-node="(node, attributeName) => deleteAttributeFromNode(node, attributeName)"
          @delete-operation-from-node="(node, operationName) => deleteOperationFromNode(node, operationName)"
          @change-input-mode="() => changeInputMode()"
      />

      <PropertyPanel
          :item="selectedItem"
          :is-open="selectedItem !== null"
          :node="sharedData.focusedNodeData"
          :edge="sharedData.focusedEdgeData"
          @add-attribute-to-node="(node, attributeName) => addAttributeToNode(node, attributeName)"
          @add-operation-to-node="(node, operationName) => addOperationToNode(node, operationName)"
          @delete-attribute-from-node="(node, attributeName) => deleteAttributeFromNode(node, attributeName)"
          @delete-operation-from-node="(node, operationName) => deleteOperationFromNode(node, operationName)"

          @add-attribute-to-edge="(edge, attributeName) => addAttributeToEdge(edge, attributeName)"
          @add-operation-to-edge="(edge, operationName) => addOperationToEdge(edge, operationName)"
          @delete-attribute-from-edge="(edge, attributeName) => deleteAttributeFromEdge(edge, attributeName)"
          @delete-operation-from-edge="(edge, operationName) => deleteOperationFromEdge(edge, operationName)"
          @on-edge-name-change="(edge, name) => updateEdgeLabel(edge, name)"
          @on-edge-style-change="edge => updateEdgeStyle(edge)"
      />

</template>


Fix hardware support check

Fix hardware support check

<template>

      <svg class="svg-icon icon-download" width="25px" height="25px" viewBox="0 0 25 25">
        <use xlink:href="#iconDownload"></use>
      </svg>
      GET

    <button v-on:click="check_app" class="btn btn-outline-pebble btn-download" :class="added || loading ? 'active': ''|| (added === null || !hardwareSupported || !platformSupported)?'disabled':''" v-if="$store.state.userParameters.inApp === true">
      <svg class="svg-icon icon-download" width="25px" height="25px" viewBox="0 0 25 25">
        <use xlink:href="#iconDownload"></use>
      </svg>
      {{(loading)?'...':'GET'}}
    </button>

"{{app.title}}" is requesting access to the following services.

        {{ item }}

If you tap on accept you will grant "{{app.title}}" access to read and use your data.

"{{app.title}}" requires a companion a to be used.

</template>


Fix application row specs

Fix application row specs

<template>

        {{ title }}

        {{ title }}

          <loading-button
            class="js-cluster-application-install-button"
            :loading="installButtonLoading"
            :disabled="installButtonDisabled"
            :label="installButtonLabel"
            @click="installClicked"
          />

            {{ generalErrorDescription }}

              {{ statusReason }}

              {{ requestReason }}

</template>


docs(QRange): use --h suffix in getting creative example (#6919)

<template>
  <div class="q-pa-md">
    <q-badge color="secondary" class="q-mb-lg">
      Model: {{ model.min }} to {{ model.max }} ({{ range.min }} to {{ range.max }}, step {{ range.step }})
    </q-badge>

    <q-range
      :style="trackStyle"
      class="custom-colored-range custom-colored-range--inside"
      v-model="model"
      :min="range.min"
      :max="range.max"
      :step="range.step"
      :left-label-value="model.min + 'px'"
      :right-label-value="model.max + 'px'"
      :left-label-color="leftLabelColor"
      :right-label-color="rightLabelColor"
      label-always
      drag-range
      color="purple"
    />

    <q-range
      :style="trackStyle"
      class="custom-colored-range custom-colored-range--outside q-mt-lg"
      v-model="model"
      :min="range.min"
      :max="range.max"
      :step="range.step"
      :left-label-value="model.min + 'px'"
      :right-label-value="model.max + 'px'"
      :left-label-color="leftLabelColor"
      :right-label-color="rightLabelColor"
      label-always
      drag-range
      color="purple"
    />

    <q-range
      :style="trackStyleTicks"
      class="custom-colored-range--zoom q-mt-lg"
      v-model="model"
      :min="range.min"
      :max="range.max"
      :step="range.step"
      :left-label-value="model.min + 'px'"
      :right-label-value="model.max + 'px'"
      :left-label-color="leftLabelColor"
      :right-label-color="rightLabelColor"
      label-always
      drag-range
      color="purple"
    />
  </div>
</template>

<style lang="stylus">
.custom-colored-range
  .q-slider__track-container--h
    background-image: var(--track-bg)
    margin-top: -3px
    height: 6px

.custom-colored-range--inside
  .q-slider__track--h
    top: 2px
    bottom: 2px

.custom-colored-range--outside
  .q-slider__track--h
    border: 2px solid currentColor
    background: transparent

.custom-colored-range--zoom
  .q-slider__track-container--h
    background: linear-gradient(to right, rgba(0, 0, 0, 0.26) 0%, rgba(0, 0, 0, 0.26) 100%),
      var(--track-bg),
      var(--tick-bg)
    background-repeat: no-repeat
    background-position: 0 9px, 0 9px, var(--tick-bg-pos)
    background-size: 100% 2px, 100% 2px, var(--tick-bg-size)
    background-blend-mode: soft-light
    margin-top: -10px
    height: 20px
    overflow: visible !important
  .q-slider__track--h
    top: 9px
    bottom: 9px
    border: 1px solid currentColor
    border-radius: 10px
    background: transparent
    transition: width 0.28s, left 0.28s, right 0.28s, top .28s, bottom .28s, border-width .28s
  &.q-slider--active
    .q-slider__track--h
      top: 5px
      bottom: 5px
      border-width: 3px
      transition: top .28s, bottom .28s, border-width .28s
</style>

<script>
export default {
  data () {
    return {
      range: {
        min: -20,
        max: 20,
        step: 1
      },
      model: {
        min: -12,
        max: 9
      },
      // min and max in the unit of the value
      zones: [
        { color: 'red', min: -20, max: -10 },
        { color: 'orange', min: -5, max: 2 },
        { color: 'green', min: 8, max: 20 }
      ],
      // x in the unit of the value
      // y from top in px - tick is centered if y is not specified
      // width and height in px
      ticks: [
        { color: 'black', x: -10, width: 4, height: 20 },
        { color: 'green', x: -5, width: 12, height: 10 },
        { color: 'blue', x: 0, y: 0, width: 2, height: 9 },
        { color: 'orange', x: 10, y: 11, width: 8, height: 9 }
      ]
    }
  },

  computed: {
    leftLabelColor () {
      return this.getLabelColor(this.model.min)
    },

    rightLabelColor () {
      return this.getLabelColor(this.model.max)
    },

    trackStyle () {
      const colors = []
      const { min, max } = this.range
      const range = max - min

      let prev = min

      for (let i = 0; i < this.zones.length; i++) {
        const zone = this.zones[i]

        if (zone.min > prev) {
          colors.push(`transparent ${(prev - min) / range * 100}%`)
          colors.push(`transparent ${(zone.min - min) / range * 100}%`)
        }

        colors.push(`${zone.color} ${(zone.min - min) / range * 100}%`)
        colors.push(`${zone.color} ${(zone.max - min) / range * 100}%`)

        prev = zone.max
      }

      if (prev < max) {
        colors.push(`transparent ${(prev - min) / range * 100}%`)
        colors.push(`transparent ${(max - min) / range * 100}%`)
      }

      return {
        '--track-bg': `linear-gradient(to right,${colors.join(',')})`
      }
    },

    tickStyle () {
      const ticksBg = []
      const ticksBgPos = []
      const ticksBgSize = []
      const { min, max } = this.range
      const rangeX = max - min
      const rangeY = 20 // from CSS

      for (let i = 0; i < this.ticks.length; i++) {
        const tick = this.ticks[i]

        ticksBg.push(`linear-gradient(to right,${tick.color} 0,${tick.color} 100%)`)
        ticksBgPos.push(`${(tick.x - min) / rangeX * 100}% ${tick.y === void 0 ? (rangeY - tick.height) / 2 : tick.y}px`)
        ticksBgSize.push(`${tick.width}px ${tick.height}px`)
      }

      return {
        '--tick-bg': ticksBg.join(','),
        '--tick-bg-pos': ticksBgPos.join(','),
        '--tick-bg-size': ticksBgSize.join(',')
      }
    },

    trackStyleTicks () {
      return {
        ...this.trackStyle,
        ...this.tickStyle
      }
    }
  },

  methods: {
    getLabelColor (val) {
      const zone = this.zones.find(z => (z.min <= val && val <= z.max))

      if (zone !== void 0) {
        return zone.color
      }
    }
  }
}
</script>

<template>
  <div class="q-pa-md">
    <q-badge color="secondary" class="q-mb-lg">
      Model: {{ model.min }} to {{ model.max }} ({{ range.min }} to {{ range.max }}, step {{ range.step }})
    </q-badge>

    <q-range
      :style="trackStyle"
      class="custom-colored-range custom-colored-range--inside"
      v-model="model"
      :min="range.min"
      :max="range.max"
      :step="range.step"
      :left-label-value="model.min + 'px'"
      :right-label-value="model.max + 'px'"
      :left-label-color="leftLabelColor"
      :right-label-color="rightLabelColor"
      label-always
      drag-range
      color="purple"
    />

    <q-range
      :style="trackStyle"
      class="custom-colored-range custom-colored-range--outside q-mt-lg"
      v-model="model"
      :min="range.min"
      :max="range.max"
      :step="range.step"
      :left-label-value="model.min + 'px'"
      :right-label-value="model.max + 'px'"
      :left-label-color="leftLabelColor"
      :right-label-color="rightLabelColor"
      label-always
      drag-range
      color="purple"
    />

    <q-range
      :style="trackStyleTicks"
      class="custom-colored-range--zoom q-mt-lg"
      v-model="model"
      :min="range.min"
      :max="range.max"
      :step="range.step"
      :left-label-value="model.min + 'px'"
      :right-label-value="model.max + 'px'"
      :left-label-color="leftLabelColor"
      :right-label-color="rightLabelColor"
      label-always
      drag-range
      color="purple"
    />
  </div>
</template>

<style lang="stylus">
.custom-colored-range
  .q-slider__track-container
    background-image: var(--track-bg)
    margin-top: -3px
    height: 6px

.custom-colored-range--inside
  .q-slider__track
    top: 2px
    bottom: 2px

.custom-colored-range--outside
  .q-slider__track
    border: 2px solid currentColor
    background: transparent

.custom-colored-range--zoom
  .q-slider__track-container
    background: linear-gradient(to right, rgba(0, 0, 0, 0.26) 0%, rgba(0, 0, 0, 0.26) 100%),
      var(--track-bg),
      var(--tick-bg)
    background-repeat: no-repeat
    background-position: 0 9px, 0 9px, var(--tick-bg-pos)
    background-size: 100% 2px, 100% 2px, var(--tick-bg-size)
    background-blend-mode: soft-light
    margin-top: -10px
    height: 20px
    overflow: visible !important
  .q-slider__track
    top: 9px
    bottom: 9px
    border: 1px solid currentColor
    border-radius: 10px
    background: transparent
    transition: width 0.28s, left 0.28s, right 0.28s, top .28s, bottom .28s, border-width .28s
  &.q-slider--active
    .q-slider__track
      top: 5px
      bottom: 5px
      border-width: 3px
      transition: top .28s, bottom .28s, border-width .28s
</style>

<script>
export default {
  data () {
    return {
      range: {
        min: -20,
        max: 20,
        step: 1
      },
      model: {
        min: -12,
        max: 9
      },
      // min and max in the unit of the value
      zones: [
        { color: 'red', min: -20, max: -10 },
        { color: 'orange', min: -5, max: 2 },
        { color: 'green', min: 8, max: 20 }
      ],
      // x in the unit of the value
      // y from top in px - tick is centered if y is not specified
      // width and height in px
      ticks: [
        { color: 'black', x: -10, width: 4, height: 20 },
        { color: 'green', x: -5, width: 12, height: 10 },
        { color: 'blue', x: 0, y: 0, width: 2, height: 9 },
        { color: 'orange', x: 10, y: 11, width: 8, height: 9 }
      ]
    }
  },

  computed: {
    leftLabelColor () {
      return this.getLabelColor(this.model.min)
    },

    rightLabelColor () {
      return this.getLabelColor(this.model.max)
    },

    trackStyle () {
      const colors = []
      const { min, max } = this.range
      const range = max - min

      let prev = min

      for (let i = 0; i < this.zones.length; i++) {
        const zone = this.zones[i]

        if (zone.min > prev) {
          colors.push(`transparent ${(prev - min) / range * 100}%`)
          colors.push(`transparent ${(zone.min - min) / range * 100}%`)
        }

        colors.push(`${zone.color} ${(zone.min - min) / range * 100}%`)
        colors.push(`${zone.color} ${(zone.max - min) / range * 100}%`)

        prev = zone.max
      }

      if (prev < max) {
        colors.push(`transparent ${(prev - min) / range * 100}%`)
        colors.push(`transparent ${(max - min) / range * 100}%`)
      }

      return {
        '--track-bg': `linear-gradient(to right,${colors.join(',')})`
      }
    },

    tickStyle () {
      const ticksBg = []
      const ticksBgPos = []
      const ticksBgSize = []
      const { min, max } = this.range
      const rangeX = max - min
      const rangeY = 20 // from CSS

      for (let i = 0; i < this.ticks.length; i++) {
        const tick = this.ticks[i]

        ticksBg.push(`linear-gradient(to right,${tick.color} 0,${tick.color} 100%)`)
        ticksBgPos.push(`${(tick.x - min) / rangeX * 100}% ${tick.y === void 0 ? (rangeY - tick.height) / 2 : tick.y}px`)
        ticksBgSize.push(`${tick.width}px ${tick.height}px`)
      }

      return {
        '--tick-bg': ticksBg.join(','),
        '--tick-bg-pos': ticksBgPos.join(','),
        '--tick-bg-size': ticksBgSize.join(',')
      }
    },

    trackStyleTicks () {
      return {
        ...this.trackStyle,
        ...this.tickStyle
      }
    }
  },

  methods: {
    getLabelColor (val) {
      const zone = this.zones.find(z => (z.min <= val && val <= z.max))

      if (zone !== void 0) {
        return zone.color
      }
    }
  }
}
</script>


Added info message for english speaking users.

<template>

{{$t('pages:feeds.aboutDumondaMeInfos.vision.title')}}

{{$t('pages:feeds.aboutDumondaMeInfos.vision.description')}}

            <v-btn outline color="primary" @click="$router.push({name: 'faq'})">
                {{$t('pages:feeds.aboutDumondaMeInfos.vision.actionButton')}}
            </v-btn>
            <v-btn outline color="primary" @click="$router.push({name: 'vision'})">
                {{$t('pages:feeds.aboutDumondaMeInfos.vision.actionButtonVision')}}
            </v-btn>

{{$t('pages:feeds.aboutDumondaMeInfos.aboutUs.title')}}

{{$t('pages:feeds.aboutDumondaMeInfos.aboutUs.description')}}

            <v-btn outline color="primary" @click="$router.push({name: 'aboutUs'})">
                {{$t('pages:feeds.aboutDumondaMeInfos.aboutUs.actionButton')}}
            </v-btn>

Dear English speaking user

At the moment we are still focusing our content on the German-speaking area.
                For this reason it has few English-speaking contents. However, you can still create an account and you
                will be informed when we start generating English language content.

            <v-btn outline color="primary" @click="changeLanguage">
                Change to German
            </v-btn>

{{$t('pages:feeds.aboutDumondaMeInfos.register.title')}}

{{$t('pages:feeds.aboutDumondaMeInfos.register.description')}}

            <v-btn color="secondary" @click="$router.push({name: 'register'})">
                {{$t('pages:feeds.aboutDumondaMeInfos.register.actionButton')}}
            </v-btn>

</template>

<template>

{{$t('pages:feeds.aboutDumondaMeInfos.vision.title')}}

{{$t('pages:feeds.aboutDumondaMeInfos.vision.description')}}

            <v-btn outline color="primary" @click="$router.push({name: 'faq'})">
                {{$t('pages:feeds.aboutDumondaMeInfos.vision.actionButton')}}
            </v-btn>
            <v-btn outline color="primary" @click="$router.push({name: 'vision'})">
                {{$t('pages:feeds.aboutDumondaMeInfos.vision.actionButtonVision')}}
            </v-btn>

{{$t('pages:feeds.aboutDumondaMeInfos.aboutUs.title')}}

{{$t('pages:feeds.aboutDumondaMeInfos.aboutUs.description')}}

            <v-btn outline color="primary" @click="$router.push({name: 'aboutUs'})">
                {{$t('pages:feeds.aboutDumondaMeInfos.aboutUs.actionButton')}}
            </v-btn>

{{$t('pages:feeds.aboutDumondaMeInfos.register.title')}}

{{$t('pages:feeds.aboutDumondaMeInfos.register.description')}}

            <v-btn color="secondary" @click="$router.push({name: 'register'})">
                {{$t('pages:feeds.aboutDumondaMeInfos.register.actionButton')}}
            </v-btn>

</template>


fix route name change (wallet to account)

<template>

      <novo-section v-if="current === 1">

{{ $t("setup.setup_novo_wallet") }}

        <novo-section>

            {{ $t("setup.create_new") }}
            <fa-icon :icon="['fal', 'long-arrow-right']" class="arrow" />

            {{ $t("setup.recover_existing") }}
            <fa-icon :icon="['fal', 'long-arrow-right']" class="arrow" />

        </novo-section>
      </novo-section>

      <novo-section v-else-if="current === 2">

{{ $t("common.important") }}

{{ $t("setup.this_is_your_recovery_phrase") }}

        <novo-section class="phrase">
          {{ recoveryPhrase }}
        </novo-section>
      </novo-section>

      <novo-section v-else-if="current === 3">

{{ $t("setup.enter_recovery_phrase") }}

{{ $t("setup.repeat_your_recovery_phrase") }}

{{ $t("setup.enter_existing_recovery_phrase") }}

        <phrase-input
          ref="phraseinput"
          :validate="validate"
          :autofocus="true"
          :isPhraseInvalid="isRecoveryPhraseInvalid === true"
          :reset="reset"
          @possible-phrase="onPossiblePhrase"
          @enter="validatePhraseOnEnter"
        />
      </novo-section>

{{ $t("setup.choose_password") }}

{{ $t("setup.choose_password_information") }}

        <novo-form-field :title="$t('common.password')">
          <input ref="password" type="password" v-model="password1" />
        </novo-form-field>
        <novo-form-field :title="$t('setup.repeat_password')">
          <input
            type="password"
            v-model="password2"
            :class="password2Status"
            @keydown="validatePasswordsOnEnter"
          />
        </novo-form-field>

    <novo-button-section class="steps-buttons">
      <template v-slot:left>
        <button v-if="showPreviousButton" @click="previousStep">
          {{ $t("buttons.previous") }}
        </button>
      </template>
      <template v-slot:right>
        <button @click="nextStep" :disabled="!isNextEnabled">

            {{ $t("buttons.next") }}

            {{ $t("buttons.finish") }}

        </button>
        <button
          @click="nextStep"
          v-show="showValidateButton"
          :disabled="!isValidateButtonEnabled"
        >
          {{ $t("buttons.next") }}
        </button>
      </template>
    </novo-button-section>

</template>


update: H5 ad 引入新的源

update: H5 ad 引入新的源

<template>
  <uni-ad
    v-bind="attrs"
    v-on="$listeners"
  >
    <div
      ref="container"
      class="uni-ad-container"
      @click="_onhandle"
    />
  </uni-ad>
</template>
<script>
import {
  subscriber
} from 'uni-mixins'

class AdConfig {
  static get instance () {
    if (this._instance == null) {
      this._instance = new AdConfig()
      this._instance._init()
    }
    return this._instance
  }

  static IC = 0
  static IS = 0

  constructor () {
    this._instance = null
    this._adConfig = null
    this._isLoading = false
    this._lastError = null
    this._callbacks = []
  }

  get adConfig () {
    return this._adConfig
  }

  get isExpired () {
    if (this._adConfig == null) {
      return true
    }
    return (Math.abs(Date.now() - this._adConfig.last) > this.CACHE_TIME)
  }

  _init () {
    var config = this._getConfig()
    if (config === null || !config.last) {
      return
    }

    if (!this.isExpired) {
      this._adConfig = config.data
    }
  }

  get (adpid, success, fail) {
    AdConfig.IC++
    if (this._adConfig != null) {
      this._doCallback(adpid, success, fail)
      if (this.isExpired) {
        this._loadAdConfig(adpid)
      }
      return
    }

    this._callbacks.push({
      adpid: adpid,
      success: success,
      fail: fail
    })

    this._loadAdConfig(adpid)
  }

  _doCallback (adpid, success, fail) {
    AdConfig.IS++
    var { a, b } = this._adConfig
    if (a[adpid]) {
      success(b, a[adpid])
    } else {
      fail(this.ERROR_INVALID_ADPID)
    }
  }

  _loadAdConfig (adpid) {
    if (this._isLoading === true) {
      return
    }
    this._isLoading = true

    uni.request({
      url: this.URL,
      method: 'GET',
      timeout: 8000,
      data: {
        d: location.hostname,
        a: adpid
      },
      dataType: 'json',
      success: (res) => {
        const rd = res.data
        if (rd.ret === 0) {
          const data = rd.data

          this._adConfig = data
          this._setConfig(data)

          this._callbacks.forEach(({ adpid, success, fail }) => {
            this._doCallback(adpid, success, fail)
          })
        } else {
          this._callbacks.forEach((i) => {
            i.fail({ errCode: rd.ret, errMsg: rd.msg })
          })
        }
        this._callbacks = []
      },
      fail: (err) => {
        this._callbacks.forEach((i) => {
          i.fail(err)
        })
        this._callbacks = []
      },
      complete: (c) => {
        this._isLoading = false
      }
    })
  }

  _getConfig () {
    if (!navigator.cookieEnabled || !window.localStorage) {
      return null
    }
    var data = localStorage.getItem(this.KEY)
    return data ? JSON.parse(data) : null
  }

  _setConfig (data) {
    if (!navigator.cookieEnabled || !window.localStorage) {
      return null
    }
    localStorage.setItem(this.KEY, JSON.stringify({
      last: Date.now(),
      data: data
    }))
  }
}
Object.assign(AdConfig.prototype, {
  URL: 'https://hac1.dcloud.net.cn/ah5',
  KEY: 'uni_app_ad_config',
  CACHE_TIME: 1000 * 60 * 10,
  ERROR_INVALID_ADPID: {
    '-5002': 'invalid adpid'
  }
})

class AdReport {
  static get instance () {
    if (this._instance == null) {
      this._instance = new AdReport()
      this._instance._init()
    }
    return this._instance
  }

  constructor () {
    this._instance = null
    this._adConfig = null
    this._guid = null
  }

  _init () {
    var config = this._getConfig()
    if (config !== null && config.guid) {
      this._guid = config.guid
      return
    }

    this._guid = this._newGUID()
    this._setConfig(this._guid)
  }

  get (data) {
    this._process(Object.assign(data, {
      d: location.hostname,
      i: this._guid
    }))
  }

  _process (data) {
    uni.request({
      url: this.URL,
      method: 'GET',
      data: data,
      dataType: 'json',
      success: () => {
      }
    })
  }

  _newGUID () {
    let guid = ''
    const format = 'xxxxxxxx-xxxx-4xxx-xxxx-xxxxxxxxxxxx'
    for (let i = 0; i < format.length; i++) {
      if (format[i] === 'x') {
        guid += (Math.random() * 16 | 0).toString(16)
      } else {
        guid += format[i]
      }
    }
    return guid.toUpperCase()
  }

  _getConfig () {
    if (!navigator.cookieEnabled || !window.localStorage) {
      return null
    }
    var data = localStorage.getItem(this.KEY)
    return data ? JSON.parse(data) : null
  }

  _setConfig (guid) {
    if (!navigator.cookieEnabled || !window.localStorage) {
      return null
    }
    localStorage.setItem(this.KEY, JSON.stringify({
      last: Date.now(),
      guid: guid
    }))
  }
}
Object.assign(AdReport.prototype, {
  URL: 'https://has1.dcloud.net.cn/ahl',
  KEY: 'uni_app_ad_guid'
})

class AdScript {
  static get instance () {
    if (this._instance == null) {
      this._instance = new AdScript()
    }
    return this._instance
  }

  constructor () {
    this._instance = null
    this._callback = {}
    this._cache = {}
  }

  load (provider, script, success, fail) {
    if (this._cache[provider] === undefined) {
      this.loadScript(script)
    }

    if (this._cache[provider] === 1) {
      success()
    } else {
      if (!this._callback[provider]) {
        this._callback[provider] = []
      }
      this._callback[provider].push({
        success,
        fail
      })
    }
  }

  loadScript (provider, script) {
    this._cache[provider] = 0
    var ads = document.createElement('script')
    ads.setAttribute('id', 'uniad_provider' + provider)
    for (const var1 in script) {
      ads.setAttribute(var1, script[var1])
    }
    ads.onload = () => {
      this._cache[provider] = 1
      this._callback[provider].forEach(({ success }) => {
        success()
      })
      this._callback[provider].length = 0
    }
    ads.onerror = (err) => {
      this._cache[provider] = undefined
      this._callback[provider].forEach(({ fail }) => {
        fail(err)
      })
      this._callback[provider].length = 0
    }
    document.body.append(ads)
  }
}

class AdTencent {
  static get instance () {
    if (this._instance == null) {
      this._instance = new AdTencent()
    }
    return this._instance
  }

  constructor () {
    this._instance = null
    this._callback = {}
    this._cache = {}
    window.TencentGDT = window.TencentGDT || []
  }

  load (appid, placementid, success, fail) {
    if (!this._callback[placementid]) {
      this._callback[placementid] = []
    }
    this._callback[placementid].push({
      success,
      fail
    })

    if (!this._cache[placementid]) {
      this._cache[placementid] = {
        isReady: false
      }
      window.TencentGDT.push({
        app_id: appid,
        placement_id: placementid,
        type: 'native',
        count: 1,
        onComplete: (res) => {
          this._cache[placementid].isReady = true
          this._callback[placementid].forEach(({ success, fail }) => {
            if (res && Array.isArray(res) && res.length) {
              success(res[0])
            } else {
              fail(res)
            }
            this._callback[placementid].length = 0
          })
        }
      })
    }

    if (this._cache[placementid].isReady === true) {
      window.TencentGDT.NATIVE.loadAd(placementid)
    }
  }
}

const CHECK_RENDER_DELAY = 1000
const CHECK_RENDER_RETRY = 5
const DEFAULT_WIDESCREEN_WIDTH = 750

export default {
  name: 'Ad',
  mixins: [subscriber],
  props: {
    adpid: {
      type: [Number, String],
      default: ''
    },
    adpidWidescreen: {
      type: [Number, String],
      default: ''
    },
    widescreenWidth: {
      type: [Number, String],
      default: DEFAULT_WIDESCREEN_WIDTH
    }
  },
  watch: {
    adpid (val) {
      if (val) {
        this._loadData(val)
      }
    },
    adpidWidescreen (val) {
      if (val) {
        this._loadData(val)
      }
    }
  },
  mounted () {
    this._p = {}
    this._pl = []
    this._pi = 0
    this._checkTimer = null
    this._checkTimerCount = 0
    this._isWidescreen = this.$refs.container.clientWidth > parseInt(this.widescreenWidth)
    this._loadData()
    AdReport.instance.get({
      h: __uniConfig.compilerVersion,
      a: this.adpid,
      at: -3,
      ic: AdConfig.IC,
      is: AdConfig.IS
    })
  },
  beforeDestroy () {
    this._clearCheckTimer()
    this.$refs.container.innerHTML = ''
  },
  methods: {
    _onhandle (e) {
      this._report(41)
    },
    _reset () {
      this._p = {}
      this._pl = []
      this._pi = 0
      this._clearCheckTimer()
      this.$refs.container.innerHTML = ''
      this._isReady = false
    },
    _loadData (adpid) {
      this._reset()
      const id = adpid || this.adpid
      const aid = (this._isWidescreen ? (this.adpidWidescreen || id) : id)
      AdConfig.instance.get(aid, (b, a) => {
        this._b = b
        this._pl = a
        this._renderAd()
      }, (err) => {
        this.$trigger('error', {}, err)
      })
    },
    _renderAd () {
      if (this._pi > this._pl.length - 1) {
        return
      }

      const data = this._pl[this._pi]
      const providerConfig = this._b[data.a1][data.t]

      var randomId = this._randomId()

      if (data.a1 === '10011') {
        AdTencent.instance.load(data.a3, data.a2, (res) => {
          window.TencentGDT.NATIVE.renderAd(res, randomId)
        })
        this._startCheckTimer()
      } else if (data.a1 === '10012') {
        this._renderAdView(providerConfig, data, randomId)
      } else {
        AdScript.instance.load(data.t, providerConfig.script, () => {
          this._renderAdView(providerConfig, data, randomId)
        }, (err) => {
          this.$trigger('error', {}, err)
        })
      }
    },
    _renderAdView (providerConfig, data, randomId) {
      var adView = document.createElement('div')
      adView.setAttribute('class', randomId)
      adView.setAttribute('id', randomId)
      this.$refs.container.innerHTML = ''
      this.$refs.container.append(adView)

      if (data.a1 === '10011') {
      } else if (data.a1 === '10012') {
        var adScript = document.createElement('script')
        const script = providerConfig.script
        for (const var1 in script) {
          adScript.setAttribute(var1, script[var1])
        }
        adView.appendChild(adScript)
      } else {
        let bindThis = window
        providerConfig.s.split('.').reduce((total, currentValue) => {
          bindThis = total
          return total[currentValue]
        }, window).bind(bindThis)(data.a2, randomId, 2)
      }

      this._startCheckTimer()
    },
    _renderNext () {
      if (this._pi >= this._pl.length - 1) {
        return
      }

      this._pi++
      this._renderAd()
    },
    _checkRender () {
      var hasContent = (this.$refs.container.children.length > 0 && this.$refs.container.clientHeight > 40)
      if (hasContent) {
        this._report(40)
      }
      return hasContent
    },
    _startCheckTimer () {
      this._clearCheckTimer()
      this._checkTimer = setInterval(() => {
        this._checkTimerCount++
        if (this._checkTimerCount >= CHECK_RENDER_RETRY) {
          this._clearCheckTimer()
          this._renderNext()
          return
        }

        if (this._checkRender()) {
          this._clearCheckTimer()
        }
      }, CHECK_RENDER_DELAY)
    },
    _clearCheckTimer () {
      this._checkTimerCount = 0
      if (this._checkTimer != null) {
        window.clearInterval(this._checkTimer)
        this._checkTimer = null
      }
    },
    _report (type) {
      AdReport.instance.get({
        h: __uniConfig.compilerVersion,
        a: this.adpid,
        at: type
      })
    },
    _randomId () {
      var result = ''
      for (let i = 0; i < 4; i++) {
        result += (65536 * (1 + Math.random()) | 0).toString(16).substring(1)
      }
      return '_u' + result
    }
  }
}
</script>

<style>
  uni-ad {
    display: block;
    overflow: hidden;
  }

  uni-ad[hidden] {
    display: none;
  }
</style>

<template>
  <uni-ad
    v-bind="attrs"
    v-on="$listeners"
  >
    <div
      ref="container"
      class="uni-ad-container"
      @click="_onhandle"
    />
  </uni-ad>
</template>
<script>
import {
  subscriber
} from 'uni-mixins'

class AdConfig {
  static get instance () {
    if (this._instance == null) {
      this._instance = new AdConfig()
      this._instance._init()
    }
    return this._instance
  }

  static IC = 0
  static IS = 0

  constructor () {
    this._instance = null
    this._adConfig = null
    this._isLoading = false
    this._lastError = null
    this._callbacks = []
  }

  get adConfig () {
    return this._adConfig
  }

  get isExpired () {
    if (this._adConfig == null) {
      return true
    }
    return (Math.abs(Date.now() - this._adConfig.last) > this.CACHE_TIME)
  }

  _init () {
    var config = this._getConfig()
    if (config === null || !config.last) {
      return
    }

    if (!this.isExpired) {
      this._adConfig = config.data
    }
  }

  get (adpid, success, fail) {
    AdConfig.IC++
    if (this._adConfig != null) {
      this._doCallback(adpid, success, fail)
      if (this.isExpired) {
        this._loadAdConfig(adpid)
      }
      return
    }

    this._callbacks.push({
      adpid: adpid,
      success: success,
      fail: fail
    })

    this._loadAdConfig(adpid)
  }

  _doCallback (adpid, success, fail) {
    AdConfig.IS++
    var { a, b } = this._adConfig
    if (a[adpid]) {
      success(b, a[adpid])
    } else {
      fail(this.ERROR_INVALID_ADPID)
    }
  }

  _loadAdConfig (adpid) {
    if (this._isLoading === true) {
      return
    }
    this._isLoading = true

    uni.request({
      url: this.URL,
      method: 'GET',
      timeout: 8000,
      data: {
        d: location.hostname,
        a: adpid
      },
      dataType: 'json',
      success: (res) => {
        const rd = res.data
        if (rd.ret === 0) {
          const data = rd.data

          this._adConfig = data
          this._setConfig(data)

          this._callbacks.forEach(({ adpid, success, fail }) => {
            this._doCallback(adpid, success, fail)
          })
        } else {
          this._callbacks.forEach((i) => {
            i.fail({ errCode: rd.ret, errMsg: rd.msg })
          })
        }
        this._callbacks = []
      },
      fail: (err) => {
        this._callbacks.forEach((i) => {
          i.fail(err)
        })
        this._callbacks = []
      },
      complete: (c) => {
        this._isLoading = false
      }
    })
  }

  _getConfig () {
    if (!navigator.cookieEnabled || !window.localStorage) {
      return null
    }
    var data = localStorage.getItem(this.KEY)
    return data ? JSON.parse(data) : null
  }

  _setConfig (data) {
    if (!navigator.cookieEnabled || !window.localStorage) {
      return null
    }
    localStorage.setItem(this.KEY, JSON.stringify({
      last: Date.now(),
      data: data
    }))
  }
}
Object.assign(AdConfig.prototype, {
  URL: 'https://hac1.dcloud.net.cn/ah5',
  KEY: 'uni_app_ad_config',
  CACHE_TIME: 1000 * 60 * 10,
  ERROR_INVALID_ADPID: {
    '-5002': 'invalid adpid'
  }
})

class AdReport {
  static get instance () {
    if (this._instance == null) {
      this._instance = new AdReport()
      this._instance._init()
    }
    return this._instance
  }

  constructor () {
    this._instance = null
    this._adConfig = null
    this._guid = null
  }

  _init () {
    var config = this._getConfig()
    if (config !== null && config.guid) {
      this._guid = config.guid
      return
    }

    this._guid = this._newGUID()
    this._setConfig(this._guid)
  }

  get (data) {
    this._process(Object.assign(data, {
      d: location.hostname,
      i: this._guid
    }))
  }

  _process (data) {
    uni.request({
      url: this.URL,
      method: 'GET',
      data: data,
      dataType: 'json',
      success: () => {
      }
    })
  }

  _newGUID () {
    let guid = ''
    const format = 'xxxxxxxx-xxxx-4xxx-xxxx-xxxxxxxxxxxx'
    for (let i = 0; i < format.length; i++) {
      if (format[i] === 'x') {
        guid += (Math.random() * 16 | 0).toString(16)
      } else {
        guid += format[i]
      }
    }
    return guid.toUpperCase()
  }

  _getConfig () {
    if (!navigator.cookieEnabled || !window.localStorage) {
      return null
    }
    var data = localStorage.getItem(this.KEY)
    return data ? JSON.parse(data) : null
  }

  _setConfig (guid) {
    if (!navigator.cookieEnabled || !window.localStorage) {
      return null
    }
    localStorage.setItem(this.KEY, JSON.stringify({
      last: Date.now(),
      guid: guid
    }))
  }
}
Object.assign(AdReport.prototype, {
  URL: 'https://has1.dcloud.net.cn/ahl',
  KEY: 'uni_app_ad_guid'
})

class AdScript {
  static get instance () {
    if (this._instance == null) {
      this._instance = new AdScript()
    }
    return this._instance
  }

  constructor () {
    this._instance = null
    this._callback = {}
    this._cache = {}
  }

  load (data, success, fail) {
    const provider = data.provider
    if (this._cache[provider] === undefined) {
      this.loadScript(data)
    }

    if (this._cache[provider] === 1) {
      success()
    } else {
      if (!this._callback[provider]) {
        this._callback[provider] = []
      }
      this._callback[provider].push({
        success,
        fail
      })
    }
  }

  loadScript (data) {
    const provider = data.provider
    this._cache[provider] = 0
    var ads = document.createElement('script')
    ads.setAttribute('id', 'uniad_provider' + provider)
    const script = data.script
    for (const var1 in script) {
      ads.setAttribute(var1, script[var1])
    }
    ads.onload = () => {
      this._cache[provider] = 1
      this._callback[provider].forEach(({ success }) => {
        success()
      })
      this._callback[provider].length = 0
    }
    ads.onerror = (err) => {
      this._cache[provider] = undefined
      this._callback[provider].forEach(({ fail }) => {
        fail(err)
      })
      this._callback[provider].length = 0
    }
    document.body.append(ads)
  }
}

const CHECK_RENDER_DELAY = 1000
const CHECK_RENDER_RETRY = 5
const DEFAULT_WIDESCREEN_WIDTH = 750

export default {
  name: 'Ad',
  mixins: [subscriber],
  props: {
    adpid: {
      type: [Number, String],
      default: ''
    },
    adpidWidescreen: {
      type: [Number, String],
      default: ''
    },
    widescreenWidth: {
      type: [Number, String],
      default: DEFAULT_WIDESCREEN_WIDTH
    }
  },
  watch: {
    adpid (val) {
      if (val) {
        this._loadData(val)
      }
    },
    adpidWidescreen (val) {
      if (val) {
        this._loadData(val)
      }
    }
  },
  mounted () {
    this._p = {}
    this._pl = []
    this._pi = 0
    this._checkTimer = null
    this._checkTimerCount = 0
    this._isWidescreen = this.$refs.container.clientWidth > parseInt(this.widescreenWidth)
    this._loadData()
    AdReport.instance.get({
      h: __uniConfig.compilerVersion,
      a: this.adpid,
      at: -3,
      ic: AdConfig.IC,
      is: AdConfig.IS
    })
  },
  beforeDestroy () {
    this._clearCheckTimer()
    this.$refs.container.innerHTML = ''
  },
  methods: {
    _onhandle (e) {
      this._report(41)
    },
    _reset () {
      this._p = {}
      this._pl = []
      this._pi = 0
      this._clearCheckTimer()
      this.$refs.container.innerHTML = ''
    },
    _loadData (adpid) {
      this._reset()
      const aid = adpid || (this._isWidescreen ? this.adpidWidescreen : this.adpid)
      AdConfig.instance.get(aid, (b, a) => {
        this._b = b
        this._pl = a
        this._renderAd()
      }, (err) => {
        this.$trigger('error', {}, err)
      })
    },
    _renderAd () {
      if (this._pi > this._pl.length - 1) {
        return
      }

      const data = this._pl[this._pi]
      const providerId = data.a1
      this._b[providerId].provider = providerId

      AdScript.instance.load(this._b[providerId], () => {
        this._renderAdView(this._b[providerId], data)
      }, (err) => {
        this.$trigger('error', {}, err)
      })
    },
    _renderAdView (provider, data) {
      var randomId = this._randomId()
      var adView = document.createElement('div')
      adView.setAttribute('class', randomId)
      this.$refs.container.innerHTML = ''
      this.$refs.container.append(adView)
      let bindThis = window
      provider.s.split('.').reduce((total, currentValue) => {
        bindThis = total
        return total[currentValue]
      }, window).bind(bindThis)(data.a2, randomId, 2)

      this._startCheckTimer()
    },
    _renderNext () {
      if (this._pi >= this._pl.length - 1) {
        return
      }

      this._pi++
      this._renderAd()
    },
    _checkRender () {
      var hasContent = (this.$refs.container.children.length > 0 && this.$refs.container.clientHeight > 40)
      if (hasContent) {
        this._report(40)
      }
      return hasContent
    },
    _startCheckTimer () {
      this._clearCheckTimer()
      this._checkTimer = setInterval(() => {
        this._checkTimerCount++
        if (this._checkTimerCount >= CHECK_RENDER_RETRY) {
          this._clearCheckTimer()
          this._renderNext()
          return
        }

        if (this._checkRender()) {
          this._clearCheckTimer()
        }
      }, CHECK_RENDER_DELAY)
    },
    _clearCheckTimer () {
      this._checkTimerCount = 0
      if (this._checkTimer != null) {
        window.clearInterval(this._checkTimer)
        this._checkTimer = null
      }
    },
    _report (type) {
      AdReport.instance.get({
        h: __uniConfig.compilerVersion,
        a: this.adpid,
        at: type
      })
    },
    _randomId () {
      var result = ''
      for (let i = 0; i < 4; i++) {
        result += (65536 * (1 + Math.random()) | 0).toString(16).substring(1)
      }
      return '_u' + result
    }
  }
}
</script>

<style>
  uni-ad {
    display: block;
    overflow: hidden;
  }

  uni-ad[hidden] {
    display: none;
  }
</style>


Fixed marked import (#2190)

Fixed marked import (#2190)

<template>

    <ts-navbar-main>
      <template v-slot:left>
        {{ sketch.name }}
      </template>
    </ts-navbar-main>

    <ts-navbar-secondary currentAppContext="sketch" currentPage="stories"></ts-navbar-secondary>

{{ title }}

                  <button class="delete" v-on:click="deleteBlock(index)"></button>

                    <textarea
                      class="textarea"
                      style="height: 100%;"
                      :value="obj.content"
                      @input="update($event, obj)"
                      placeholder="Your story starts here.."
                    ></textarea>

                  <transition name="fade">

                  </transition>

                    <button :disabled="!obj.content" class="button is-rounded is-success" v-on:click="saveAndHide(obj)">

                      Save
                    </button>

                      <router-link :to="{ name: 'Explore', query: { view: obj.componentProps.view.id } }"
                        >{{ obj.componentProps.view.name }}</router-link
                      >

                      {{ obj.componentProps.aggregation.name }}

                      {{ obj.componentProps.aggregation_group.name }}

                    <button class="delete" aria-label="delete" v-on:click="deleteBlock(index)"></button>

                    <component :is="obj.componentName" v-bind="obj.componentProps"></component>

                    <button class="button is-rounded" v-on:click="addBlock(index)">
                      + Text
                    </button>

                    <ts-view-list-dropdown
                      @setActiveView="addViewComponent($event, index)"
                      :is-simple="true"
                      :is-last="index === blocks.length - 1"
                      :title="'+ Saved search'"
                    ></ts-view-list-dropdown>

                    <ts-aggregation-list-dropdown
                      @addAggregation="addAggregationComponent($event, index)"
                      :is-rounded="true"
                      :is-last="index === blocks.length - 1"
                      :aggregations="allAggregations"
                    ></ts-aggregation-list-dropdown>

</template>


KIcon FacilityTopNav

KIcon FacilityTopNav

<template>

  <Navbar>
    <NavbarLink
      :title="coreString('classesLabel')"
      :link="linkify(PageNames.CLASS_MGMT_PAGE)"
    >
      <KIcon icon="domain" :color="$themeTokens.textInverted" style="top: 0; width: 24px; height: 24px;" />
    </NavbarLink>
    <NavbarLink
      :title="coreString('usersLabel')"
      :link="linkify(PageNames.USER_MGMT_PAGE)"
    >
      <KIcon icon="people" :color="$themeTokens.textInverted" style="top: 0; width: 24px; height: 24px;" />
    </NavbarLink>
    <NavbarLink
      :title="$tr('settings')"
      :link="linkify(PageNames.FACILITY_CONFIG_PAGE)"
    >
      <KIcon icon="settings" :color="$themeTokens.textInverted" style="top: 0; width: 24px; height: 24px;" />
    </NavbarLink>
    <NavbarLink
      :title="$tr('data')"
      :link="linkify(PageNames.DATA_EXPORT_PAGE)"
    >
      <KIcon icon="save" :color="$themeTokens.textInverted" style="top: 0; width: 24px; height: 24px;" />
    </NavbarLink>
  </Navbar>

</template>

<script>

  import Navbar from 'kolibri.coreVue.components.Navbar';
  import NavbarLink from 'kolibri.coreVue.components.NavbarLink';
  import commonCoreStrings from 'kolibri.coreVue.mixins.commonCoreStrings';
  import { PageNames } from '../constants';

  export default {
    name: 'FacilityTopNav',
    components: {
      Navbar,
      NavbarLink,
    },
    mixins: [commonCoreStrings],
    computed: {
      PageNames: () => PageNames,
    },
    methods: {
      linkify(name) {
        return {
          name,
          params: {
            facility_id: this.$route.params.facility_id,
          },
        };
      },
    },
    $trs: {
      data: 'Data',
      settings: 'Settings',
    },
  };

</script>

<style lang="scss" scoped></style>

<template>

  <Navbar>
    <NavbarLink
      :title="coreString('classesLabel')"
      :link="linkify(PageNames.CLASS_MGMT_PAGE)"
    >
      <mat-svg name="domain" category="social" />
    </NavbarLink>
    <NavbarLink
      :title="coreString('usersLabel')"
      :link="linkify(PageNames.USER_MGMT_PAGE)"
    >
      <mat-svg name="people" category="social" />
    </NavbarLink>
    <NavbarLink
      :title="$tr('settings')"
      :link="linkify(PageNames.FACILITY_CONFIG_PAGE)"
    >
      <mat-svg name="settings" category="action" />
    </NavbarLink>
    <NavbarLink
      :title="$tr('data')"
      :link="linkify(PageNames.DATA_EXPORT_PAGE)"
    >
      <mat-svg name="save" category="content" />
    </NavbarLink>
  </Navbar>

</template>

<script>

  import Navbar from 'kolibri.coreVue.components.Navbar';
  import NavbarLink from 'kolibri.coreVue.components.NavbarLink';
  import commonCoreStrings from 'kolibri.coreVue.mixins.commonCoreStrings';
  import { PageNames } from '../constants';

  export default {
    name: 'FacilityTopNav',
    components: {
      Navbar,
      NavbarLink,
    },
    mixins: [commonCoreStrings],
    computed: {
      PageNames: () => PageNames,
    },
    methods: {
      linkify(name) {
        return {
          name,
          params: {
            facility_id: this.$route.params.facility_id,
          },
        };
      },
    },
    $trs: {
      data: 'Data',
      settings: 'Settings',
    },
  };

</script>

<style lang="scss" scoped></style>


Fix user list UI

Fix user list UI

<template>

				<input type="text" class="form-control" :placeholder="__('Search for a user...')" v-model="search_text">

						{{ user.fullname }}

{{ user.bio || 'No Bio'}}

{{__('No user found')}}

</template>

<template>

				<input type="text" class="form-control" :placeholder="__('Search for a user...')" v-model="search_text">

					{{ user.fullname }}

</template>


Rename "Share" button to "Share session"

<template>

        {{ currentApp.appData.image | appName }}

                Quit

                Share session

</template>

<template>

        {{ currentApp.appData.image | appName }}

                Quit

                Share (copy url to clipboard)

</template>