セレクトボックスの初期化不備を修正

セレクトボックスの初期化不備を修正

<!--
- SelectBox.vue -
選択入力用 Vue コンポーネント。
選択入力の標準レイアウト適用と例外表示、シンプルなイベント処理をサポートします。

[template]
SelectBox(field="statusType", v-model="item.statusType", :options="statusTypes",
  @change="search", :updating="updating")

※v-model のバインドは必須です。
※field 未設定時は例外メッセージを無視します。
※updating 指定時は処理中に disabled が有効化されます。
-->
<template lang="pug">
Message(:field="field")
  select.form-control(:class="styleClass", @change="onChange", :disabled="updating")
    option(v-for="option in selectOptions", :value="option.value", :selected="option.value === value")
      | {{ option.label }}
</template>

<script lang="babel">
import * as Lib from 'platform/plain'
import Vue from 'vue'
import Message from 'components/Message.vue'
export default {
  name: 'select-box',
  components: { Message },
  props: {
    /** 例外メッセージ表示で利用されるフィールドキー */
    field: {type: String, default: null},
    /** 値が空の時の表示文字列 */
    emptyword: {type: String, default: null},
    /** {label: 表示名, 値: value} なオブジェクト配列。単純な文字配列の時は同じ。 */
    options: {type: Array, default: []},
    /** 処理中フラグ */
    updating: {type: Boolean, default: false},
    // from v-model
    value: {required: true},
    /** スタイルクラス定義 */
    styleClass: {type: Object, default: () => {}},
  },
  computed: {
    selectOptions() {
      var values = []
      if (this.emptyword) {
        values.push({label: this.emptyword, value: null})
      }
      if (this.options) {
        this.options.forEach(v => {
          if (typeof v === "string") {
            values.push({label: v, value: v})
          } else {
            values.push({label: v.label, value: v.value})
          }
        })
      }
      return values
    }
  },
  methods: {
    onChange(event) {
      this.$emit('input', event.target.value)
      this.$emit('change', event)
    }
  }
}
</script>

<!--
- SelectBox.vue -
選択入力用 Vue コンポーネント。
選択入力の標準レイアウト適用と例外表示、シンプルなイベント処理をサポートします。

[template]
SelectBox(field="statusType", v-model="item.statusType", :options="statusTypes",
  @change="search", :updating="updating")

※v-model のバインドは必須です。
※field 未設定時は例外メッセージを無視します。
※updating 指定時は処理中に disabled が有効化されます。
-->
<template lang="pug">
Message(:field="field")
  select.form-control(:value="value", @change="onChange", :disabled="updating")
    option(v-for="option in selectOptions", :value="option.value")
      | {{ option.label }}
</template>

<script lang="babel">
import * as Lib from 'platform/plain'
import Vue from 'vue'
import Message from 'components/Message.vue'
export default {
  name: 'select-box',
  components: { Message },
  props: {
    /** 例外メッセージ表示で利用されるフィールドキー */
    field: {type: String, default: null},
    /** 値が空の時の表示文字列 */
    emptyword: {type: String, default: null},
    /** {label: 表示名, 値: value} なオブジェクト配列。単純な文字配列の時は同じ。 */
    options: {type: Array, default: []},
    /** 処理中フラグ */
    updating: {type: Boolean, default: false},
    // from v-model
    value: {required: true}
  },
  computed: {
    selectOptions() {
      var values = []
      if (this.emptyword) {
        values.push({label: this.emptyword, value: null})
      }
      if (this.options) {
        this.options.forEach(v => {
          if (typeof v === "string") {
            values.push({label: v, value: v})
          } else {
            values.push({label: v.label, value: v.value})
          }
        })
      }
      return values
    }
  },
  methods: {
    onChange(event) {
      this.$emit('input', event.target.value)
      this.$emit('change', event)
    }
  }
}
</script>


Improved messages to user.

Improved messages to user.

<template>
    <v-card id="link-answer-container">
        <v-card-title id="link-answer-title">Answer the question {{question}}
        </v-card-title>
        <v-divider></v-divider>
        <v-card-text id="link-answer-content">
            <v-form v-model="valid">
                <v-layout row wrap>
                    <v-flex xs12>
                        <v-text-field v-model="link" name="link" ref="link" :loading="checkLink"
                                      :label="$t('pages:detailQuestion.yourLink')"
                                      :rules="[isValidLink(),
                                               isNotEmbedYoutube(),
                                               ruleFieldRequired($t('validation:fieldRequired')),
                                               ruleToManyChars($t('validation:toManyChars'), 1000)]">
                        </v-text-field>

Youtube Video erkannt

Vimeo Video erkannt

                    </v-flex>
                    <v-flex xs12 v-if="response.type === 'Youtube' || response.type === 'Vimeo'">
                        <v-layout row wrap>
                            <v-flex xs12 md6>

                            </v-flex>
                            <v-flex xs12 md6>
                                <v-text-field v-model="response.title"
                                              :label="$t('common:title')"
                                              :rules="[ruleFieldRequired($t('validation:fieldRequired')),
                                               ruleToManyChars($t('validation:toManyChars'), 100)]" :counter="100">
                                </v-text-field>
                                <v-text-field v-model="response.description" multi-line rows="4"
                                              :label="$t('common:description')"
                                              :rules="[ruleFieldRequired($t('validation:fieldRequired')),
                                               ruleToManyChars($t('validation:toManyChars'), 1000)]" :counter="1000">
                                </v-text-field>
                            </v-flex>
                        </v-layout>
                    </v-flex>
                    <v-flex xs12 v-else-if="response.type === 'Link'">

                                <v-text-field v-model="response.title"
                                              :label="$t('common:title')"
                                              :rules="[ruleFieldRequired($t('validation:fieldRequired')),
                                               ruleToManyChars($t('validation:toManyChars'), 140)]" :counter="140">
                                </v-text-field>
                                <v-text-field v-model="response.description" multi-line rows="4"
                                              :label="$t('common:description')"
                                              :rules="[ruleFieldRequired($t('validation:fieldRequired')),
                                               ruleToManyChars($t('validation:toManyChars'), 1000)]" :counter="1000">
                                </v-text-field>

Um was für ein Weblink handelt es sich?

                                <v-radio-group v-model="response.pageType" column id="page-type-container">
                                    <v-radio label="Artikel" value="article" color="primary">
                                    </v-radio>
                                    <v-radio label="Blog" value="blog" color="primary">
                                    </v-radio>
                                    <v-radio label="Webseite" value="website" color="primary">
                                    </v-radio>
                                </v-radio-group>

                    </v-flex>
                </v-layout>
            </v-form>
        </v-card-text>
        <v-divider></v-divider>
        <v-card-actions>
            <v-spacer></v-spacer>
            <v-btn color="primary" flat @click.native="$emit('close-dialog')">
                {{$t("common:button.close")}}
            </v-btn>
            <v-btn color="primary" flat @click.native="createLinkAnswer()"
                   :disabled="!valid || checkLink">
                {{$t("common:button.create")}}
            </v-btn>
        </v-card-actions>
    </v-card>
</template>

<template>
    <v-card id="link-answer-container">
        <v-card-title>Answers the question  {{question}} </v-card-title>
        <v-divider></v-divider>
        <v-card-text>
            <v-form v-model="valid">
                <v-layout row wrap>
                    <v-flex xs12>
                        <v-text-field v-model="link" name="link" ref="link"
                                      :label="$t('pages:detailQuestion.yourLink')"
                                      :rules="[isValidLink(),
                                               isNotEmbedYoutube(),
                                               ruleFieldRequired($t('validation:fieldRequired')),
                                               ruleToManyChars($t('validation:toManyChars'), 1000)]">
                        </v-text-field>

                            Youtube Video Infos werden geladen

Youtube Video erkannt

Vimeo Video erkannt

                    </v-flex>
                    <v-flex xs12 v-if="response.type === 'Youtube' || response.type === 'Vimeo'">
                        <v-layout row wrap>
                            <v-flex xs12 md6>

                            </v-flex>
                            <v-flex xs12 md6>
                                <v-text-field v-model="response.title"
                                              :label="$t('common:title')"
                                              :rules="[ruleFieldRequired($t('validation:fieldRequired')),
                                               ruleToManyChars($t('validation:toManyChars'), 100)]" :counter="100">
                                </v-text-field>
                                <v-text-field v-model="response.description" multi-line rows="4"
                                              :label="$t('common:description')"
                                              :rules="[ruleFieldRequired($t('validation:fieldRequired')),
                                               ruleToManyChars($t('validation:toManyChars'), 1000)]" :counter="1000">
                                </v-text-field>
                            </v-flex>
                        </v-layout>
                    </v-flex>
                    <v-flex xs12 v-else-if="response.type === 'Link'">

                                <v-text-field v-model="response.title"
                                              :label="$t('common:title')"
                                              :rules="[ruleFieldRequired($t('validation:fieldRequired')),
                                               ruleToManyChars($t('validation:toManyChars'), 140)]" :counter="140">
                                </v-text-field>
                                <v-text-field v-model="response.description" multi-line rows="4"
                                              :label="$t('common:description')"
                                              :rules="[ruleFieldRequired($t('validation:fieldRequired')),
                                               ruleToManyChars($t('validation:toManyChars'), 1000)]" :counter="1000">
                                </v-text-field>

Was für ein Weblink handelt es sich?

                                <v-radio-group v-model="response.pageType" column id="page-type-container">
                                    <v-radio label="Artikel" value="article" color="primary">
                                    </v-radio>
                                    <v-radio label="Blog" value="blog" color="primary">
                                    </v-radio>
                                </v-radio-group>

                    </v-flex>
                </v-layout>
            </v-form>
        </v-card-text>
        <v-divider></v-divider>
        <v-card-actions>
            <v-spacer></v-spacer>
            <v-btn color="primary" flat @click.native="$emit('close-dialog')">
                {{$t("common:button.close")}}
            </v-btn>
            <v-btn color="primary" flat @click.native="createLinkAnswer()"
                   :disabled="!valid || checkLink">
                {{$t("common:button.create")}}
            </v-btn>
        </v-card-actions>
    </v-card>
</template>


fix(docs): releases page does not clear cache (#9809)

<template lang="pug">
q-card(flat bordered)
  q-card-section.row.no-wrap.items-center(v-if="error")
    q-icon.q-mr-sm(name="warning" size="24px" color="negative")
    div Cannot connect to GitHub. Please try again later.
  q-card-section.row.no-wrap.items-center(v-else-if="loading")
    q-spinner.q-mr-sm(size="24px" color="brand-primary")
    div Loading release notes from GitHub...
  template(v-else)
    q-tabs.text-grey-7(v-model="currentPackage" align="left" active-color="brand-primary" active-bg-color="blue-1" indicator-color="brand-primary")
      q-tab(v-for="(packageReleases, packageName) in packages" :label="packageName" :name="packageName" :key="packageName")
    q-separator
    q-tab-panels.packages-container(v-model="currentPackage" animated)
      q-tab-panel.q-pa-none(v-for="(packageReleases, packageName) in packages" :key="packageName" :name="packageName")
        package-releases(:latest-version="versions[packageName]" :releases="packageReleases")
</template>

<script>
import { ref, onMounted } from 'vue'
import { date } from 'quasar'

import PackageReleases from './PackageReleases'

const { extractDate } = date

export default {
  name: 'QuasarReleases',

  components: {
    PackageReleases
  },

  setup () {
    const packagesDefinitions = {
      quasar: [],
      '@quasar/app': [],
      '@quasar/cli': [],
      '@quasar/extras': [],
      '@quasar/icongenie': []
    }
    const loading = ref(false)
    const error = ref(false)
    const packages = ref(packagesDefinitions)
    const currentPackage = ref('quasar')
    const versions = ref({})

    function queryReleases (page = 1) {
      loading.value = true
      error.value = false

      const latestVersions = {}
      const xhrQuasar = new XMLHttpRequest()

      xhrQuasar.addEventListener('load', function () {
        loading.value = false
        const releases = JSON.parse(this.responseText)

        if (releases.length === 0) {
          return
        }

        let stopQuery = false

        for (const release of releases) {
          if (release.name.indexOf('babel-preset-app') > -1) {
            continue
          }

          const [ packageName, version ] = release.name.split('-v')

          if (!version) {
            stopQuery = true
            continue
          }

          if (packages.value[ packageName ] === void 0) {
            packages.value[ packageName ] = []
          }

          const releaseInfo = {
            version,
            date: extractDate(release.created_at, 'YYYY-MM-DD').toLocaleDateString(),
            body: release.body,
            label: `${packageName} v${version}`
          }
          packages.value[ packageName ].push(releaseInfo)

          if (latestVersions[ packageName ] === void 0) {
            latestVersions[ packageName ] = releaseInfo.label
          }
        }

        if (!stopQuery) {
          queryReleases(page + 1)
        }

        versions.value = Object.assign(latestVersions, versions.value)
      })

      xhrQuasar.addEventListener('error', () => {
        error.value = true
      })

      xhrQuasar.open('GET', `https://api.github.com/repos/quasarframework/quasar/releases?page=${page}&per_page=100`)
      xhrQuasar.send()
    }

    onMounted(() => { queryReleases() })

    return {
      loading,
      error,
      packages,
      currentPackage,
      versions
    }
  }
}
</script>

<style lang="sass">
.packages-container .q-tab-panel
  padding-right: 0
  padding-top: 0
</style>

<template lang="pug">
q-card(flat bordered)
  q-card-section.row.no-wrap.items-center(v-if="error")
    q-icon.q-mr-sm(name="warning" size="24px" color="negative")
    div Cannot connect to GitHub. Please try again later.
  q-card-section.row.no-wrap.items-center(v-else-if="loading")
    q-spinner.q-mr-sm(size="24px" color="brand-primary")
    div Loading release notes from GitHub...
  template(v-else)
    q-tabs.text-grey-7(v-model="currentPackage" align="left" active-color="brand-primary" active-bg-color="blue-1" indicator-color="brand-primary")
      q-tab(v-for="(packageReleases, packageName) in packages" :label="packageName" :name="packageName" :key="packageName")
    q-separator
    q-tab-panels.packages-container(v-model="currentPackage" animated)
      q-tab-panel.q-pa-none(v-for="(packageReleases, packageName) in packages" :key="packageName" :name="packageName")
        package-releases(:latest-version="versions[packageName]" :releases="packageReleases")
</template>

<script>
import { ref, onMounted } from 'vue'
import { date } from 'quasar'

import PackageReleases from './PackageReleases'

const { extractDate } = date
const packagesDefinitions = {
  quasar: [],
  '@quasar/app': [],
  '@quasar/cli': [],
  '@quasar/extras': [],
  '@quasar/icongenie': []
}

export default {
  name: 'QuasarReleases',

  components: {
    PackageReleases
  },

  setup () {
    const loading = ref(false)
    const error = ref(false)
    const packages = ref(packagesDefinitions)
    const currentPackage = ref('quasar')
    const versions = ref({})

    function queryReleases (page = 1) {
      loading.value = true
      error.value = false

      const latestVersions = {}
      const xhrQuasar = new XMLHttpRequest()

      xhrQuasar.addEventListener('load', function () {
        loading.value = false
        const releases = JSON.parse(this.responseText)

        if (releases.length === 0) {
          return
        }

        let stopQuery = false

        for (const release of releases) {
          if (release.name.indexOf('babel-preset-app') > -1) {
            continue
          }

          const [ packageName, version ] = release.name.split('-v')

          if (!version) {
            stopQuery = true
            continue
          }

          if (packages.value[ packageName ] === void 0) {
            packages.value[ packageName ] = []
          }

          const releaseInfo = {
            version,
            date: extractDate(release.created_at, 'YYYY-MM-DD').toLocaleDateString(),
            body: release.body,
            label: `${packageName} v${version}`
          }
          packages.value[ packageName ].push(releaseInfo)

          if (latestVersions[ packageName ] === void 0) {
            latestVersions[ packageName ] = releaseInfo.label
          }
        }

        if (!stopQuery) {
          queryReleases(page + 1)
        }

        versions.value = Object.assign(latestVersions, versions.value)
      })

      xhrQuasar.addEventListener('error', () => {
        error.value = true
      })

      xhrQuasar.open('GET', `https://api.github.com/repos/quasarframework/quasar/releases?page=${page}&per_page=100`)
      xhrQuasar.send()
    }

    onMounted(() => { queryReleases() })

    return {
      loading,
      error,
      packages,
      currentPackage,
      versions
    }
  }
}
</script>

<style lang="sass">
.packages-container .q-tab-panel
  padding-right: 0
  padding-top: 0
</style>


Added youtube video button.

Added youtube video button.

<template>

{{$t('pages:landingPagePublic.whatIsDumondaMe.title')}}

                {{$t('pages:landingPagePublic.whatIsDumondaMe.description')}}

            <v-btn color="secondary" class="action-button" @click="openExplainVideo">
                {{$t('pages:landingPagePublic.whatIsDumondaMe.actionButton')}}
            </v-btn>

</template>


style: Minor code formatting

style: Minor code formatting

<template>

            <router-link :to="'/Program/' + program.name">

{{ program.program_name }}

            </router-link>

                    {{ buttonName }}

            {{ enrollButton }}
            Sign Up

</template>


録画詳細メニューの search を実装

録画詳細メニューの search を実装

<template>

        <v-menu v-model="isOpened" bottom left>
            <template v-slot:activator="{ on }">
                <v-btn dark icon v-on="on">
                    <v-icon>mdi-dots-vertical</v-icon>
                </v-btn>
            </template>
            <v-list>
                <v-list-item v-on:click="openDownloadDialog">
                    <v-list-item-icon class="mr-3">
                        <v-icon>mdi-download</v-icon>
                    </v-list-item-icon>
                    <v-list-item-content>
                        <v-list-item-title>download</v-list-item-title>
                    </v-list-item-content>
                </v-list-item>
                <v-list-item v-if="typeof recordedItem.ruleId !== 'undefined'" v-on:click="gotoRule">
                    <v-list-item-icon class="mr-3">
                        <v-icon>mdi-calendar</v-icon>
                    </v-list-item-icon>
                    <v-list-item-content>
                        <v-list-item-title>rule</v-list-item-title>
                    </v-list-item-content>
                </v-list-item>
                <v-list-item v-on:click="search">
                    <v-list-item-icon class="mr-3">
                        <v-icon>mdi-magnify</v-icon>
                    </v-list-item-icon>
                    <v-list-item-content>
                        <v-list-item-title>search</v-list-item-title>
                    </v-list-item-content>
                </v-list-item>
                <v-list-item v-on:click="openDeleteDialog">
                    <v-list-item-icon class="mr-3">
                        <v-icon>mdi-delete</v-icon>
                    </v-list-item-icon>
                    <v-list-item-content>
                        <v-list-item-title>delete</v-list-item-title>
                    </v-list-item-content>
                </v-list-item>
            </v-list>
        </v-menu>

        <RecordedDownloadDialog
            :isOpen.sync="isOpenDownloadDialog"
            :recordedItem="recordedItem"
            v-on:download="downloadVideo"
            v-on:downloadPlayList="downloadPlayList"
        ></RecordedDownloadDialog>
        <RecordedDeleteDialog
            :isOpen.sync="isOpenDeleteDialog"
            :recordedItem="recordedItem"
            :isDelaySnackbarViewNum="800"
            v-on:deleteSiccessful="deleteSiccessful"
        ></RecordedDeleteDialog>

</template>


Close the Actions-menu when clicking "Show your screen"

Signed-off-by: Joas Schilling <ab43a7c9cb5b2380afc4ddf8b3e2583169b39a02@schilljs.com>

<template>

				<button
					id="mute"
					v-shortkey.once="['m']"
					v-tooltip="audioButtonTooltip"
					:aria-label="audioButtonAriaLabel"
					:class="audioButtonClass"
					@shortkey="toggleAudio"
					@click.stop="toggleAudio">
					<Microphone
						v-if="showMicrophoneOn"
						:size="24"
						title=""
						fill-color="#ffffff"
						decorative />
					<MicrophoneOff
						v-else
						:size="24"
						title=""
						fill-color="#ffffff"
						decorative />
				</button>

			<button
				id="hideVideo"
				v-shortkey.once="['v']"
				v-tooltip="videoButtonTooltip"
				:aria-label="videoButtonAriaLabel"
				:class="videoButtonClass"
				@shortkey="toggleVideo"
				@click.stop="toggleVideo">
				<VideoIcon
					v-if="showVideoOn"
					:size="24"
					title=""
					fill-color="#ffffff"
					decorative />
				<VideoOff
					v-else
					:size="24"
					title=""
					fill-color="#ffffff"
					decorative />
			</button>
			<Actions
				v-if="!screenSharingButtonHidden"
				id="screensharing-button"
				v-tooltip="screenSharingButtonTooltip"
				:aria-label="screenSharingButtonAriaLabel"
				:class="screenSharingButtonClass"
				class="app-navigation-entry-utils-menu-button"
				:boundaries-element="boundaryElement"
				container="#content-vue"
				:open="screenSharingMenuOpen"
				@update:open="screenSharingMenuOpen = true"
				@update:close="screenSharingMenuOpen = false">

				<Monitor
					v-if="model.attributes.localScreen"
					slot="icon"
					:size="24"
					title=""
					fill-color="#ffffff"
					decorative />
				<MonitorOff
					v-if="!model.attributes.localScreen"
					slot="icon"
					:size="24"
					title=""
					fill-color="#ffffff"
					decorative />

				<ActionButton
					v-if="!screenSharingMenuOpen"
					@click.stop="toggleScreenSharingMenu">
					<Monitor
						slot="icon"
						:size="24"
						title=""
						fill-color="#ffffff"
						decorative />
					{{ screenSharingButtonTooltip }}
				</ActionButton>
				<ActionButton
					v-if="model.attributes.localScreen"
					@click="showScreen">
					<Monitor
						slot="icon"
						:size="24"
						title=""
						fill-color="#ffffff"
						decorative />
					{{ t('spreed', 'Show your screen') }}
				</ActionButton>
				<ActionButton
					v-if="model.attributes.localScreen"
					@click="stopScreen">
					<MonitorOff
						slot="icon"
						:size="24"
						title=""
						fill-color="#ffffff"
						decorative />
					{{ t('spreed', 'Stop screensharing') }}
				</ActionButton>
			</Actions>
			<button
				v-shortkey.once="['r']"
				v-tooltip="t('spreed', 'Lower hand (R)')"
				class="lower-hand"
				:class="model.attributes.raisedHand.state ? '' : 'hidden-visually'"
				:tabindex="model.attributes.raisedHand.state ? 0 : -1"
				:aria-label="t('spreed', 'Lower hand (R)')"
				@shortkey="toggleHandRaised"
				@click.stop="toggleHandRaised">
				<Hand
					:size="24"
					title=""
					fill-color="#ffffff"
					decorative />
			</button>
			<Actions
				v-if="showActions"
				v-tooltip="t('spreed', 'More actions')"
				container="#content-vue"
				:aria-label="t('spreed', 'More actions')">
				<ActionButton
					:close-after-click="true"
					@click="toggleHandRaised">
					<Hand
						slot="icon"
						:size="16"
						decorative
						title="" />
					{{ raiseHandButtonLabel }}
				</ActionButton>
				<ActionSeparator />
				<ActionButton
					icon="icon-settings"
					:close-after-click="true"
					@click="showSettings">
					{{ t('spreed', 'Settings') }}
				</ActionButton>
			</Actions>

			<Popover
				v-if="qualityWarningTooltip"
				:boundaries-element="boundaryElement"
				:aria-label="qualityWarningAriaLabel"
				trigger="hover"
				:auto-hide="false"
				:open="showQualityWarningTooltip">
				<NetworkStrength2Alert
					slot="trigger"
					decorative
					fill-color="#e9322d"
					title=""
					:size="24"
					@mouseover="mouseover = true"
					@mouseleave="mouseover = false" />

					{{ qualityWarningTooltip.content }}

						<button
							v-if="qualityWarningTooltip.action"
							class="primary hint__button"
							@click="executeQualityWarningTooltipAction">
							{{ qualityWarningTooltip.actionLabel }}
						</button>
						<button
							v-if="!isQualityWarningTooltipDismissed"
							class="hint__button"
							@click="dismissQualityWarningTooltip">
							{{ t('spreed', 'Dismiss') }}
						</button>

			</Popover>

</template>

<template>

				<button
					id="mute"
					v-shortkey.once="['m']"
					v-tooltip="audioButtonTooltip"
					:aria-label="audioButtonAriaLabel"
					:class="audioButtonClass"
					@shortkey="toggleAudio"
					@click.stop="toggleAudio">
					<Microphone
						v-if="showMicrophoneOn"
						:size="24"
						title=""
						fill-color="#ffffff"
						decorative />
					<MicrophoneOff
						v-else
						:size="24"
						title=""
						fill-color="#ffffff"
						decorative />
				</button>

			<button
				id="hideVideo"
				v-shortkey.once="['v']"
				v-tooltip="videoButtonTooltip"
				:aria-label="videoButtonAriaLabel"
				:class="videoButtonClass"
				@shortkey="toggleVideo"
				@click.stop="toggleVideo">
				<VideoIcon
					v-if="showVideoOn"
					:size="24"
					title=""
					fill-color="#ffffff"
					decorative />
				<VideoOff
					v-else
					:size="24"
					title=""
					fill-color="#ffffff"
					decorative />
			</button>
			<Actions
				v-if="!screenSharingButtonHidden"
				id="screensharing-button"
				v-tooltip="screenSharingButtonTooltip"
				:aria-label="screenSharingButtonAriaLabel"
				:class="screenSharingButtonClass"
				class="app-navigation-entry-utils-menu-button"
				:boundaries-element="boundaryElement"
				container="#content-vue"
				@update:open="screenSharingMenuOpen = true"
				@update:close="screenSharingMenuOpen = false">

				<Monitor
					v-if="model.attributes.localScreen"
					slot="icon"
					:size="24"
					title=""
					fill-color="#ffffff"
					decorative />
				<MonitorOff
					v-if="!model.attributes.localScreen"
					slot="icon"
					:size="24"
					title=""
					fill-color="#ffffff"
					decorative />

				<ActionButton
					v-if="!screenSharingMenuOpen"
					@click.stop="toggleScreenSharingMenu">
					<Monitor
						slot="icon"
						:size="24"
						title=""
						fill-color="#ffffff"
						decorative />
					{{ screenSharingButtonTooltip }}
				</ActionButton>
				<ActionButton
					v-if="model.attributes.localScreen"
					@click="showScreen">
					<Monitor
						slot="icon"
						:size="24"
						title=""
						fill-color="#ffffff"
						decorative />
					{{ t('spreed', 'Show your screen') }}
				</ActionButton>
				<ActionButton
					v-if="model.attributes.localScreen"
					@click="stopScreen">
					<MonitorOff
						slot="icon"
						:size="24"
						title=""
						fill-color="#ffffff"
						decorative />
					{{ t('spreed', 'Stop screensharing') }}
				</ActionButton>
			</Actions>
			<button
				v-shortkey.once="['r']"
				v-tooltip="t('spreed', 'Lower hand (R)')"
				class="lower-hand"
				:class="model.attributes.raisedHand.state ? '' : 'hidden-visually'"
				:tabindex="model.attributes.raisedHand.state ? 0 : -1"
				:aria-label="t('spreed', 'Lower hand (R)')"
				@shortkey="toggleHandRaised"
				@click.stop="toggleHandRaised">
				<Hand
					:size="24"
					title=""
					fill-color="#ffffff"
					decorative />
			</button>
			<Actions
				v-if="showActions"
				v-tooltip="t('spreed', 'More actions')"
				container="#content-vue"
				:aria-label="t('spreed', 'More actions')">
				<ActionButton
					:close-after-click="true"
					@click="toggleHandRaised">
					<Hand
						slot="icon"
						:size="16"
						decorative
						title="" />
					{{ raiseHandButtonLabel }}
				</ActionButton>
				<ActionSeparator />
				<ActionButton
					icon="icon-settings"
					:close-after-click="true"
					@click="showSettings">
					{{ t('spreed', 'Settings') }}
				</ActionButton>
			</Actions>

			<Popover
				v-if="qualityWarningTooltip"
				:boundaries-element="boundaryElement"
				:aria-label="qualityWarningAriaLabel"
				trigger="hover"
				:auto-hide="false"
				:open="showQualityWarningTooltip">
				<NetworkStrength2Alert
					slot="trigger"
					decorative
					fill-color="#e9322d"
					title=""
					:size="24"
					@mouseover="mouseover = true"
					@mouseleave="mouseover = false" />

					{{ qualityWarningTooltip.content }}

						<button
							v-if="qualityWarningTooltip.action"
							class="primary hint__button"
							@click="executeQualityWarningTooltipAction">
							{{ qualityWarningTooltip.actionLabel }}
						</button>
						<button
							v-if="!isQualityWarningTooltipDismissed"
							class="hint__button"
							@click="dismissQualityWarningTooltip">
							{{ t('spreed', 'Dismiss') }}
						</button>

			</Popover>

</template>


refactor: ♻ token decimals to number

refactor: ♻ token decimals to number

<template>
  <mew-module
    class="d-flex flex-grow-1 pt-6"
    title="Send"
    :has-elevation="true"
    :has-indicator="true"
  >
    <template #moduleBody>

      <v-row class="mt-5">
        <v-col cols="12" sm="6" class="pr-sm-1 pt-0 pb-0 pb-sm-4">

            <app-button-balance
              :balance="selectedBalance"
              :loading="!showSelectedBalance"
              class="d-sm-none"
            />
            <mew-select
              ref="mewSelect"
              label="Token"
              :items="tokens"
              :is-custom="true"
              :value="selectedCurrency"
              @input="setCurrency"
            />

        </v-col>
        <v-col cols="12" sm="6" class="pl-sm-1 pt-0 pb-2 pb-sm-4">

            <app-button-balance
              :balance="selectedBalance"
              :loading="!showSelectedBalance"
              class="d-none d-sm-block"
            />
            <mew-input
              label="Amount"
              placeholder="0"
              :value="amount"
              type="number"
              :persistent-hint="true"
              :error-messages="amountErrorMessage"
              :max-btn-obj="{
                title: 'Max',
                disabled: disableSwapBtn,
                method: setEntireBal
              }"
              :buy-more-str="buyMoreStr"
              @buyMore="openMoonpay"
              @input="val => setAmount(val, false)"
            />

        </v-col>

        <v-col v-if="showBalanceNotice" cols="12" class="pt-0 pb-4">
          <send-low-balance-notice
            :address="address"
            :currency-name="currencyName"
            class="pa-3"
          />
        </v-col>

        <v-col cols="12" class="pt-4 pb-2">
          <module-address-book ref="addressInput" @setAddress="setAddress" />
        </v-col>

        <v-col cols="12" class="py-0 mb-8">
          <app-transaction-fee
            :show-fee="showSelectedBalance"
            :getting-fee="!txFeeIsReady"
            :error="feeError"
            :total-cost="totalCost"
            :tx-fee="txFee"
            :total-gas-limit="gasLimit"
            :message="feeError"
            :not-enough-eth="!hasEnoughEth"
            :from-eth="isFromNetworkCurrency"
            @onLocalGasPrice="handleLocalGasPrice"
          />
        </v-col>

        <v-col cols="12" class="py-4">
          <mew-expand-panel
            ref="expandPanel"
            :panel-items="expandPanel"
            :idx-to-expand="openedPanels"
            @toggled="closeToggle"
          >
            <template #panelBody1>

                    <v-icon class="greyPrimary--text mew-body mr-1">
                      mdi-alert-outline</v-icon
                    >For advanced users only

                    Please don’t edit these fields unless you are an expert user
                    & know what you’re doing. Entering the wrong information
                    could result in your transaction failing or getting stuck.

                    Reset to default: {{ formattedDefaultGasLimit }}

                <mew-input
                  :value="gasLimit"
                  :label="$t('common.gas.limit')"
                  placeholder=""
                  :error-messages="gasLimitError"
                  type="number"
                  @input="setGasLimit"
                />

                <mew-input
                  v-show="!isToken"
                  ref="dataInput"
                  v-model="data"
                  :label="$t('sendTx.add-data')"
                  placeholder="0x..."
                  :rules="dataRules"
                  :error-messages="dataInvalidHexMessage"
                  :hide-clear-btn="data === '0x'"
                  class="mb-8"
                  @keyup.native="verifyHexFormat"
                  @focusout.native="verifyHexFormat"
                />

            </template>
          </mew-expand-panel>
        </v-col>
      </v-row>

          <mew-button
            title="Next"
            :has-full-width="false"
            btn-size="xlarge"
            :disabled="isDisabledNextBtn"
            @click.native="send()"
          />

          <mew-button
            :title="$t('common.clear-all')"
            :has-full-width="false"
            btn-size="small"
            btn-style="transparent"
            @click.native="clear()"
          />

    </template>
  </mew-module>
</template>


chore: 👷 remove console

chore: 👷 remove console

<template>

    <mew6-white-sheet>
      <mew-module
        :has-elevation="true"
        :has-indicator="true"
        class="d-flex flex-grow-1 pt-6"
        title="Swap"
      >
        <template v-if="isAvailable" #moduleBody>

            <v-row class="align-center justify-space-between mt-4">
              <v-col cols="12" sm="5" class="pb-0 pb-sm-3 pr-sm-0">

                  <app-button-balance
                    :loading="isLoading"
                    :balance="displayBalance"
                  />
                  <mew-select
                    :value="fromTokenType"
                    label="From"
                    :items="actualFromTokens"
                    :is-custom="true"
                    :loading="isLoading"
                    @input="setFromToken"
                  />

                <mew-input
                  ref="amountInput"
                  label="Amount"
                  placeholder="0"
                  type="number"
                  :value="tokenInValue"
                  :persistent-hint="true"
                  :error-messages="amountErrorMessage"
                  :disabled="initialLoad"
                  :buy-more-str="
                    isEthNetwork &&
                    (amountErrorMessage === errorMsgs.amountExceedsEthBalance ||
                      amountErrorMessage === errorMsgs.amountEthIsTooLow)
                      ? 'Buy more.'
                      : null
                  "
                  :max-btn-obj="{
                    title: 'Max',
                    disabled: false,
                    method: setMaxAmount
                  }"
                  @input="setTokenInValue"
              /></v-col>
              <v-col cols="12" sm="2" class="px-6 py-0 py-sm-3 mb-3 mb-sm-0">

                  <swap-btn
                    :class="[
                      enableTokenSwitch
                        ? 'cursor--pointer'
                        : 'pointer-event--none',
                      'd-flex align-center justify-center'
                    ]"
                    @click.native="switchTokens"
                  />

              </v-col>
              <v-col cols="12" sm="5" class="pl-sm-0 pb-0 pb-sm-3">
                <mew-select
                  ref="toToken"
                  :value="toTokenType"
                  :items="actualToTokens"
                  :is-custom="true"
                  :loading="isLoading"
                  label="To"
                  @input="setToToken"
                />

                <mew-input
                  label="Amount"
                  placeholder="0"
                  type="number"
                  :hide-clear-btn="true"
                  :value="tokenOutValue"
                  :is-readonly="true"
                />
              </v-col>
            </v-row>

          <app-user-msg-block
            v-if="!hasMinEth"
            class="mt-sm-5"
            :message="msg.lowBalance"
          >

              <mew-button
                btn-size="small"
                btn-style="outline"
                title="Buy Ether"
                class="ma-1"
                :has-full-width="$vuetify.breakpoint.xsOnly"
                @click.native="buyEth"
              />

          </app-user-msg-block>

          <module-address-book
            v-show="showToAddress"
            class="mt-10"
            :is-valid-address-func="isValidToAddress"
            @setAddress="setToAddress"
          />

          <app-user-msg-block
            v-if="
              toTokenType &&
              toTokenType.value &&
              toTokenType.value.toLowerCase() == 'bitcoin' &&
              isEthNetwork
            "
            class="mt-sm-5"
            :message="msg.storeBitcoin"
          >

              <v-expansion-panels
                flat
                class="expansion-panels--remove-paddings"
              >
                <v-expansion-panel>
                  <v-expansion-panel-header
                    color="tableHeader"
                    class="textPrimaryModule--text"
                  >
                    How can I get wrapped Bitcoin?
                  </v-expansion-panel-header>
                  <v-expansion-panel-content color="tableHeader" class="pa-0">

                      When you swap to Bitcoin, it is moved to the Bitcoin
                      blockchain, & requires a Bitcoin wallet. In order to keep
                      Bitcoin in MyEtherWallet, you can swap to wrapped Bitcoin
                      instead. Wrapped Bitcoin is an Ethereum token, with a
                      value approximately equal to 1 BTC. Wrapped Bitcoins can
                      be stored in MEW, and can be used as any other Ethereum
                      asset: you can swap it to other tokens, use it as
                      collateral in DeFi apps, etc. There are multiple kinds of
                      wrapped Bitcoins, but they roughly do the same thing.

                        Learn more about Wrapped Bitcoin.

                    <v-row class="mt-6">
                      <v-col cols="12" md="4">
                        <mew-button
                          btn-size="small"
                          btn-style="outline"
                          title="Swap to renBTC"
                          :has-full-width="true"
                        />
                      </v-col>
                      <v-col cols="12" md="4">
                        <mew-button
                          btn-size="small"
                          btn-style="outline"
                          title="Swap to wBTC"
                          :has-full-width="true"
                        />
                      </v-col>
                      <v-col cols="12" md="4">
                        <mew-button
                          btn-size="small"
                          btn-style="outline"
                          title="Swap to PBTC"
                          :has-full-width="true"
                        />
                      </v-col>
                    </v-row>
                  </v-expansion-panel-content>
                </v-expansion-panel>
              </v-expansion-panels>

          </app-user-msg-block>

            <v-slide-y-transition hide-on-leave group>
              <swap-provider-mentions
                v-if="showAnimation"
                key="showAnimation"
                :is-loading="isLoadingProviders"
                :check-loading="checkLoading"
                @showProviders="showProviders"
              />

                <swap-providers-list
                  :step="step"
                  :available-quotes="availableQuotes"
                  :set-provider="setProvider"
                  :to-token-symbol="toTokenType ? toTokenType.symbol : ''"
                  :to-token-icon="toTokenType ? toTokenType.img : ''"
                  :is-loading="isLoadingProviders"
                  :providers-error="providersErrorMsg"
                  class="mt-7"
                />

                <app-transaction-fee
                  v-if="step > 0 && providersErrorMsg.subtitle === ''"
                  :show-fee="showSwapFee"
                  :getting-fee="loadingFee"
                  :error="feeError"
                  :total-cost="totalCost"
                  :tx-fee="txFee"
                  :total-gas-limit="totalGasLimit"
                  :message="feeError"
                  :not-enough-eth="notEnoughEth"
                  :from-eth="isFromTokenMain"
                  class="mt-10 mt-sm-16"
                  @onLocalGasPrice="handleLocalGasPrice"
                />

 0 &&
                    providersErrorMsg.subtitle === '' &&
                    !isLoadingProviders
                  "
                  class="text-center mt-10 mt-sm-15"
                >
                  <mew-button
                    title="Next"
                    :has-full-width="true"
                    :disabled="disableNext"
                    btn-size="xlarge"
                    style="max-width: 240px"
                    @click.native="showConfirm"
                  />

            </v-slide-y-transition>

        </template>

        <template v-else #moduleBody>

            <app-user-msg-block :message="swapNotAvailableMes" />

        </template>
      </mew-module>
    </mew6-white-sheet>

</template>