修改认证显示每页显示条目

修改认证显示每页显示条目

修改认证显示每页显示条目

<template>

            <button type="button" class="close" @click.prevent="offAlert">
                ×
            </button>
            {{ message.success }}

            <button type="button" class="close" @click.prevent="offAlert">
                ×
            </button>
            {{ message.error }}

                      <router-link type="button" class="btn btn-primary btn-sm" :to="{ name: 'certification:add' }">添加</router-link>

                        状态：
                        <select class="form-control" v-model="filter.status">
                            <option :value="item.value" v-for="item in statuss.data">{{ item.status }}</option>
                        </select>

                        类型：
                        <select class="form-control" v-model="filter.certification_name">
                           <option value="">全部</option>
                           <option :value="item.name" v-for="item in categories.data">{{ item.display_name }}</option>
                        </select>

                      <input type="text" class="form-control" v-model="filter.keyword" placeholder="关键词搜索">
                      <router-link class="btn btn-default" tag="button" :to="{ path: '/certifications/', query: searchQuery }">
                        搜索
                      </router-link>

                            用户名
                            真实姓名
                            机构名称
                            手机号码
                            身份证号码
                            认证类型
                            认证描述
                            认证资料
                            认证状态
                            认证时间
                            操作

                        <template v-if="certifications.length">

                              {{ certification.user.name }}
                              {{ certification.data.name }}
                              {{ certification.data.hasOwnProperty('org_name') ? certification.data.org_name : '' }}
                              {{ certification.data.phone }}
                              {{ certification.data.number }}
                              {{ certification.category.display_name }}
                              {{ certification.data.desc }}
                              下载
                              {{ statuss.display[certification.status] }}
                              <local-date :utc="certification.updated_at"/>

                                  <router-link type="button"
                                  class="btn btn-primary btn-sm"
                                  v-show="certification.status === 1"
                                  :to="{ name: 'certification:edit', params:{certification:certification.id}}">编辑</router-link>
                                  <button class="btn btn-primary btn-sm"
                                  v-show="certification.status === 0"
                                  @click.prevent="openPassModal(index)">通过</button>
                                  <button class="btn btn-primary btn-sm"
                                      v-show="certification.status !== 2"
                                      @click="openRejectModal(certification.id)">驳回</button>

                        </template>
                        <template v-else>

无数据

                        </template>

              <offset-paginator class="pagination" :total="total" :offset="offset" :limit="15">
                <template scope="pagination">

                    {{ pagination.page }}
                    <router-link v-else :to="offsetPage(pagination.offset)">{{ pagination.page }}</router-link>

                </template>
              </offset-paginator>

                <button type="button" class="close" data-dismiss="modal" aria-label="Close">×</button>

认证驳回

                    驳回理由
                    <textarea class="form-control" v-model="reject.content" @input="reject.message = ''"></textarea>
                    {{ reject.message }}

                <button type="button" class="btn btn-default" data-dismiss="modal">关闭</button>
                <button type="button" class="btn btn-primary" @click="rejectCertification">确认</button>

                <button type="button" class="close" data-dismiss="modal" aria-label="Close">×</button>

认证通过

                    通过描述
                    <textarea class="form-control" v-model="pass.desc" @input="pass.message = ''"></textarea>
                    {{ pass.message }}

                <button type="button" class="btn btn-default" data-dismiss="modal">关闭</button>
                <button type="button" class="btn btn-primary" @click="passCertification">确认</button>

</template>

<template>

            <button type="button" class="close" @click.prevent="offAlert">
                ×
            </button>
            {{ message.success }}

            <button type="button" class="close" @click.prevent="offAlert">
                ×
            </button>
            {{ message.error }}

                      <router-link type="button" class="btn btn-primary btn-sm" :to="{ name: 'certification:add' }">添加</router-link>

                        状态：
                        <select class="form-control" v-model="filter.status">
                            <option :value="item.value" v-for="item in statuss.data">{{ item.status }}</option>
                        </select>

                        类型：
                        <select class="form-control" v-model="filter.certification_name">
                           <option value="">全部</option>
                           <option :value="item.name" v-for="item in categories.data">{{ item.display_name }}</option>
                        </select>

                      <input type="text" class="form-control" v-model="filter.keyword" placeholder="关键词搜索">
                      <router-link class="btn btn-default" tag="button" :to="{ path: '/certifications/', query: searchQuery }">
                        搜索
                      </router-link>

                            用户名
                            真实姓名
                            机构名称
                            手机号码
                            身份证号码
                            认证类型
                            认证描述
                            认证资料
                            认证状态
                            认证时间
                            操作

                        <template v-if="certifications.length">

                              {{ certification.user.name }}
                              {{ certification.data.name }}
                              {{ certification.data.hasOwnProperty('org_name') ? certification.data.org_name : '' }}
                              {{ certification.data.phone }}
                              {{ certification.data.number }}
                              {{ certification.category.display_name }}
                              {{ certification.data.desc }}
                              下载
                              {{ statuss.display[certification.status] }}
                              <local-date :utc="certification.updated_at"/>

                                  <router-link type="button"
                                  class="btn btn-primary btn-sm"
                                  v-show="certification.status === 1"
                                  :to="{ name: 'certification:edit', params:{certification:certification.id}}">编辑</router-link>
                                  <button class="btn btn-primary btn-sm"
                                  v-show="certification.status === 0"
                                  @click.prevent="openPassModal(index)">通过</button>
                                  <button class="btn btn-primary btn-sm"
                                      v-show="certification.status !== 2"
                                      @click="openRejectModal(certification.id)">驳回</button>

                        </template>
                        <template v-else>

无数据

                        </template>

              <offset-paginator class="pagination" :total="total" :offset="offset" :limit="1">
                <template scope="pagination">

                    {{ pagination.page }}
                    <router-link v-else :to="offsetPage(pagination.offset)">{{ pagination.page }}</router-link>

                </template>
              </offset-paginator>

                <button type="button" class="close" data-dismiss="modal" aria-label="Close">×</button>

认证驳回

                    驳回理由
                    <textarea class="form-control" v-model="reject.content" @input="reject.message = ''"></textarea>
                    {{ reject.message }}

                <button type="button" class="btn btn-default" data-dismiss="modal">关闭</button>
                <button type="button" class="btn btn-primary" @click="rejectCertification">确认</button>

                <button type="button" class="close" data-dismiss="modal" aria-label="Close">×</button>

认证通过

                    通过描述
                    <textarea class="form-control" v-model="pass.desc" @input="pass.message = ''"></textarea>
                    {{ pass.message }}

                <button type="button" class="btn btn-default" data-dismiss="modal">关闭</button>
                <button type="button" class="btn btn-primary" @click="passCertification">确认</button>

</template>


部门管理员添加上级用户时缺失负责部门列issues/I2SDU1

部门管理员添加上级用户时缺失负责部门列issues/I2SDU1

<template>

             查询
              重置

      添加已有用户
      新建用户

       0">

            取消关联

         批量操作

         已选择 {{
        selectedRowKeys.length }}项
        清空

          编辑

              更多

                分配部门角色

                用户详情

                 handleDelete(record.id)">
                  取消关联

    <user-modal ref="modalForm" @ok="modalFormOk"></user-modal>
    <Select-User-Modal ref="selectUserModal" @selectFinished="selectOK"></Select-User-Modal>
    <dept-role-user-modal ref="deptRoleUser"></dept-role-user-modal>

</template>


Added likes in the dataset card

Added likes in the dataset card

<template>

        <input class="checkbox-input" @click="toggleSelection" type="checkBox" name="contact" value="02">

          {{ dataset.name }}

 0 || isShared">

 0">

              {{ tag }}<span v-if="index < numberTags - 1">,

          {{dataset.permission.owner.username}}

      {{ lastSynced }}

      {{ numberRows }}

      {{ humanFileSize(dataset.table.size) }}

      1 map

      {{ $t(`DatasetCard.shared.${dataset.privacy}`) }}

</template>


style: 样式类名修改

style: 样式类名修改

<template>

        <{{ node.tagName.toLowerCase() }}

              {{ " " + item.name }}= {{ item.value }}

              {{ " " + item.name }}

           >

      <template v-if="canFold">

          <ElementTree :node="child" :parentIsUnfold="unfold"></ElementTree>

      </template>
      </{{ node.tagName.toLowerCase() }}>

    <template v-else-if="node && node.nodeType === 3 && node.textContent">
      {{ _trim(node.textContent) }}
    </template>

</template>


if container download container

if container download container


调整九宫格内swiper高度

调整九宫格内swiper高度

<template>
	<view class="page">
		<page-head :title="title"></page-head>
		<view class="uni-list">
			<view class="uni-list-cell uni-list-cell-pd">
				<view class="uni-list-cell-db">循环</view>
				<switch @change="switchChange"/>
			</view>
		</view>
		<swiper :indicator-dots="true" :autoplay="true" :circular="isCircular">
			<swiper-item>
				<view class="uni-grid-9">
					<view class="uni-grid-9-item" hover-class="uni-grid-9-item-hover" v-for="(item,index) in grids" :key="index" :class="index % 3 === 2 ? 'no-border-right' : ''">
						<image class="uni-grid-9-image" :src="item"></image>
						<text class="uni-grid-9-text">grid</text>
					</view>
				</view>
			</swiper-item>
			<swiper-item>
				<view class="uni-grid-9">
					<view class="uni-grid-9-item" hover-class="uni-grid-9-item-hover" v-for="(item,index) in grids" :key="index" :class="index % 3 === 2 ? 'no-border-right' : ''">
						<image class="uni-grid-9-image" :src="item"></image>
						<text class="uni-grid-9-text">grid</text>
					</view>
				</view>
			</swiper-item>
			<swiper-item>
				<view class="uni-grid-9">
					<view class="uni-grid-9-item" hover-class="uni-grid-9-item-hover" v-for="(item,index) in grids" :key="index" :class="index % 3 === 2 ? 'no-border-right' : ''">
						<image class="uni-grid-9-image" :src="item"></image>
						<text class="uni-grid-9-text">grid</text>
					</view>
				</view>
			</swiper-item>
		</swiper>
	</view>
</template>

<script>
	export default {
		data(){
			return {
				title: 'grid',
				grids: ["../../../static/c1.png", "../../../static/c2.png", "../../../static/c3.png",
					"../../../static/c4.png", "../../../static/c5.png", "../../../static/c6.png",
					"../../../static/c7.png", "../../../static/c8.png", "../../../static/c9.png"
				],
				isCircular:false
			}
		},
		methods:{
			switchChange(e){
				this.isCircular = e.detail.value;
			}
		}
	}
</script>

<style>
	.page {
		padding-top: 60upx;
	}

	page {
		background: #efeff4;
	}
	.uni-list{
		margin-bottom: 30upx;
	}
	.uni-list-cell {
		justify-content: flex-start
	}
	swiper{
		height: 680upx;
		background:#f2f2f2;
	}
</style>

<template>
	<view class="page">
		<page-head :title="title"></page-head>
		<view class="uni-list">
			<view class="uni-list-cell uni-list-cell-pd">
				<view class="uni-list-cell-db">循环</view>
				<switch @change="switchChange"/>
			</view>
		</view>
		<swiper :indicator-dots="true" :autoplay="true" :circular="isCircular">
			<swiper-item>
				<view class="uni-grid-9">
					<view class="uni-grid-9-item" hover-class="uni-grid-9-item-hover" v-for="(item,index) in grids" :key="index" :class="index % 3 === 2 ? 'no-border-right' : ''">
						<image class="uni-grid-9-image" :src="item"></image>
						<text class="uni-grid-9-text">grid</text>
					</view>
				</view>
			</swiper-item>
			<swiper-item>
				<view class="uni-grid-9">
					<view class="uni-grid-9-item" hover-class="uni-grid-9-item-hover" v-for="(item,index) in grids" :key="index" :class="index % 3 === 2 ? 'no-border-right' : ''">
						<image class="uni-grid-9-image" :src="item"></image>
						<text class="uni-grid-9-text">grid</text>
					</view>
				</view>
			</swiper-item>
			<swiper-item>
				<view class="uni-grid-9">
					<view class="uni-grid-9-item" hover-class="uni-grid-9-item-hover" v-for="(item,index) in grids" :key="index" :class="index % 3 === 2 ? 'no-border-right' : ''">
						<image class="uni-grid-9-image" :src="item"></image>
						<text class="uni-grid-9-text">grid</text>
					</view>
				</view>
			</swiper-item>
		</swiper>
	</view>
</template>

<script>
	export default {
		data(){
			return {
				title: 'grid',
				grids: ["../../../static/c1.png", "../../../static/c2.png", "../../../static/c3.png",
					"../../../static/c4.png", "../../../static/c5.png", "../../../static/c6.png",
					"../../../static/c7.png", "../../../static/c8.png", "../../../static/c9.png"
				],
				isCircular:false
			}
		},
		methods:{
			switchChange(e){
				this.isCircular = e.detail.value;
			}
		}
	}
</script>

<style>
	.page {
		padding-top: 60upx;
	}

	page {
		background: #efeff4;
	}
	.uni-list{
		margin-bottom: 30upx;
	}
	.uni-list-cell {
		justify-content: flex-start
	}
	swiper{
		height: 600upx;
	}
</style>


fix: switched order of supported browsers

<template lang="pug">
  doc-view
    template(slot-scope="{ namespace }")
      app-alert(error :value="`${namespace}.alert1`")

      section#supported-browsers
        section-head(:value="`${namespace}.browserHeader`")
        section-text(:value="`${namespace}.browserText`")
        v-list.transparent.py-0
          v-layout(row wrap)
            v-flex(
              xs12 sm6 md4
              v-for="browser in browsers"
              v-bind:key="browser.title"
            ).px-0
              v-list-tile(avatar tag="ul")
                v-list-tile-avatar(:color="browser.supported ? browser.supported === 'polyfill' ? 'warning' : 'success' : 'error'")
                  v-icon(dark v-if="typeof browser.icon === 'string'") fa-{{ browser.icon }}
                  v-icon(dark v-else v-for="icon in browser.icon" :key="icon").browser-icon--split fa-{{ icon }}
                v-list-tile-content
                  v-list-tile-title {{ browser.title }}
                  v-list-tile-sub-title {{ getBrowserSupport(browser) }}

      section#cdn-install
        section-head(:value="`${namespace}.cdnHeader`")
        section-text(:value="`${namespace}.cdnText`")

        markup(lang="html")
          | <!DOCTYPE html>
          |
          |
          |   <link href='https://fonts.googleapis.com/css?family=Roboto:300,400,500,700|Material+Icons' rel="stylesheet">
          |   <link href="https://unpkg.com/vuetify/dist/vuetify.min.css" rel="stylesheet">
          |   <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no, minimal-ui">
          |
          |
          |

          |     <v-app>
          |       <v-content>
          |         <v-container>Hello world</v-container>
          |       <v-content>
          |     </v-app>
          |

          |
          |
          |
          |
          |
          |

      section#new-applications
        section-head(:value="`${namespace}.newHeader`")
        section-text(:value="`${namespace}.newText`")
        template-list

      section#existing-applications
        section-head(:value="`${namespace}.existingHeader`")
        section-text(:value="`${namespace}.existingText1`")
        section-text(:value="`${namespace}.existingText2`")
        markup(lang="cli")
          | $ npm install vuetify --save
          | # or
          | $ yarn add vuetify
        section-text(:value="`${namespace}.existingText3`")
        markup(lang="js")
          | import Vue from 'vue'
          | import Vuetify from 'vuetify'
          |
          | Vue.use(Vuetify)
        section-text(:value="`${namespace}.existingText4`")
        markup(lang="js")
          | // index.js or main.js
          | import 'vuetify/dist/vuetify.min.css' // Ensure you are using css-loader
        markup(lang="stylus")
          | // main.styl
          | @import '~vuetify/src/stylus/main' // Ensure you are using stylus-loader

        section-text(:value="`${namespace}.existingText5`")
        markup(lang="html")
          |
          |   <link href='https://fonts.googleapis.com/css?family=Roboto:300,400,500,700|Material+Icons' rel="stylesheet">
          |
        app-alert(error :value="`${namespace}.alert2`")

      section#ie11-support
        section-head(:value="`${namespace}.ie11Header`")
        section-text(:value="`${namespace}.ie11Text`")

        markup(lang="cli")
          | // my-project/
          | $ npm install babel-polyfill --save
          | // or
          | $ yarn add babel-polyfill

        markup(lang="javascript")
          | // my-project/src/index.js
          | import 'babel-polyfill'
          | ...
          | new Vue()

        section-text(:value="`${namespace}.ie11Text2`")
        markup(lang="html")
          | <template slot="items" slot-scope="props">
          |   {{ props.item.name }}
          | </template>
</template>


Removed spanish and chinese chat groups

Removed spanish and chinese chat groups

<template>
  <v-layout wrap pa-2>
    <v-flex xs12>

Ethereum Network News Feeds

For the 24 most important Ethereum news of the day, follow us on your favorite social media:

      Twitter

      Facebook

      LinkedIn
    </v-flex>
    <v-flex xs12 class="mt-5">

Ethereum Network Chat Groups

For interesting, controversial or thought-provoking discussions about Ethereum topics, with other Etherians. Please no talk about mining or the ether price.

    </v-flex>
    <v-flex xs12 sm6 md4>

English:

         Telegram
         Facebook

    </v-flex>
    <v-flex xs12 class="mt-5">

Ethereum Network Development

If you want to help foster the Ethereum community as well, your help is very appreciated, either with coding / finding bugs, adding projects or any other way:

      Github
      <router-link to="/form">Add project</router-link>
    </v-flex>
  </v-layout>
</template>

<template>
  <v-layout wrap pa-2>
    <v-flex xs12>

Ethereum Network News Feeds

For the 24 most important Ethereum news of the day, follow us on your favorite social media:

      Twitter

      Facebook

      LinkedIn
    </v-flex>
    <v-flex xs12 class="mt-5">

Ethereum Network Chat Groups

For interesting, controversial or thought-provoking discussions about Ethereum topics, with other Etherians. Please no talk about mining or the ether price.

    </v-flex>
    <v-flex xs12 sm6 md4>

English:

         Telegram
         Facebook

    </v-flex>
      <v-flex xs12 sm6 md4>

Spanish:

         Telegram
         Facebook

    </v-flex>
    <v-flex xs12 sm6 md4>

Chinese:

      <v-dialog v-model="dialog">
       WeChat
        <v-card>

        </v-card>
      </v-dialog>
    </v-flex>
    <v-flex xs12 class="mt-5">

Ethereum Network Development

If you want to help foster the Ethereum community as well, your help is very appreciated, either with coding / finding bugs, adding projects or any other way:

      Github
      <router-link to="/form">Add project</router-link>
    </v-flex>
  </v-layout>
</template>


Finished  S13. E174: Understanding mixins

<template>

Filters & Mixins

{{ text | toUpperCase | toLowerCase}}

        <input v-model="filterText">

{{ fruit }}

        <app-list />

</template>

<template>

Filters & Mixins

{{ text | toUpperCase | toLowerCase}}

        <input v-model="filterText">

{{ fruit }}

</template>


Equalize input element between ModelSelection and ProjectSelection

<template>
  <v-card>
    <v-card-title>
      Model Instances
    </v-card-title>

    <v-divider class="ma-0"></v-divider>

    <v-card-text>
      <div v-if="!modelInstances.length" class="body-1">
        There are no model instances.
      </div>

      <div v-else>
        <v-list-item v-for="model in modelInstances" v-bind:key="model.id">
          <v-list-item-content>
            <router-link style="text-decoration: none; color: initial" :to="'/zeta/metamodel/editor/' + model.id">
              <v-list-item-title v-text="model.name"></v-list-item-title>
            </router-link>
          </v-list-item-content>

          <v-list-item-action>
            <v-btn icon @click="deleteModelInstance(model.id)">
              <v-icon>mdi-delete</v-icon>
            </v-btn>
          </v-list-item-action>

          <v-list-item-action>
            <v-btn icon @click="validateModelInstance(model.id)">
              <v-icon>mdi-thumb-up</v-icon>
            </v-btn>
          </v-list-item-action>
        </v-list-item>
      </div>
    </v-card-text>

    <v-divider class="ma-0"></v-divider>

    <v-card-actions>
        <v-text-field
            id="inputModelName"
            v-model="inputModelName"
            :append-icon="'mdi-plus-box'"
            outlined
            clearable
            hide-details
            label="New model name"
            type="text"
            @click:append="createModelInstance"
            v-on:keyup.enter="createModelInstance"
        ></v-text-field>
    </v-card-actions>
  </v-card>
</template>
<script>
import ModelInstanceUtils from "./ModelInstanceUtils";
import ValidatorUtils from "./ValidatorUtils";

export default {
  name: 'ModelSelection',
  props: {
    gdslProject: {},
    modelInstances: {},
  },
  data() {
    return {
      inputModelName: ""
    }
  },
  methods: {
    createModelInstance() {
      ModelInstanceUtils.createInstance(this.inputModelName, this.$route.params.id)
    },
    deleteModelInstance(modelId) {
      ModelInstanceUtils.deleteInstance(modelId)
    },
    validateModelInstance(modelId) {
      ValidatorUtils.validate(modelId)
    },
  }
}
</script>
<style scoped>

a {
  color: #42b983;
}
</style>

<template>
  <v-card>
    <v-card-title>
      Model Instances
    </v-card-title>

    <v-divider class="ma-0"></v-divider>

    <v-card-text>
      <div v-if="!modelInstances.length" class="body-1">
        There are no model instances.
      </div>

      <div v-else>
        <v-list-item v-for="model in modelInstances" v-bind:key="model.id">
          <v-list-item-content>
            <router-link style="text-decoration: none; color: initial" :to="'/zeta/metamodel/editor/' + model.id">
              <v-list-item-title v-text="model.name"></v-list-item-title>
            </router-link>
          </v-list-item-content>

          <v-list-item-action>
            <v-btn icon @click="deleteModelInstance(model.id)">
              <v-icon>mdi-delete</v-icon>
            </v-btn>
          </v-list-item-action>

          <v-list-item-action>
            <v-btn icon @click="validateModelInstance(model.id)">
              <v-icon>mdi-thumb-up</v-icon>
            </v-btn>
          </v-list-item-action>
        </v-list-item>
      </div>
    </v-card-text>

    <v-divider class="ma-0"></v-divider>

    <v-card-actions>
        <v-text-field
            id="inputModelName"
            v-model="inputModelName"
            :append-outer-icon="'mdi-plus-box'"
            outlined
            clearable
            hide-details
            label="New model name"
            type="text"
            @click:append-outer="createModelInstance"
            v-on:keyup.enter="createModelInstance"
        ></v-text-field>
    </v-card-actions>
  </v-card>
</template>
<script>
import ModelInstanceUtils from "./ModelInstanceUtils";
import ValidatorUtils from "./ValidatorUtils";

export default {
  name: 'ModelSelection',
  props: {
    gdslProject: {},
    modelInstances: {},
  },
  data() {
    return {
      inputModelName: ""
    }
  },
  methods: {
    createModelInstance() {
      ModelInstanceUtils.createInstance(this.inputModelName, this.$route.params.id)
    },
    deleteModelInstance(modelId) {
      ModelInstanceUtils.deleteInstance(modelId)
    },
    validateModelInstance(modelId) {
      ValidatorUtils.validate(modelId)
    },
  }
}
</script>
<style scoped>

a {
  color: #42b983;
}
</style>


Reintigrate express server for Sketch

Reintigrate express server for Sketch

<template>
    <div class="server" >
    </div>
</template>

<script>
// import { evalScript, openPath, loadScript } from "brutalism";
import amulets from 'amulets'
import WebSocket from 'ws'
import fs from 'fs'

export default {
    props: {
        devName: {
            type: String,
            default: 'sumUX'
        },
        scriptName: {
            type: String,
            default: 'AEUX'
        },
        port: {
            type: Number,
            default: 4000
        },
    },
    data: () => ({
        server: null,
        prefs: {},
    }),
    methods: {
        newWebSocket() {
            this.server = new WebSocket.Server({ port: 7250, })
            this.server.on('connection', (ws) => {
                console.log('new connection');
                ws.on('message', (message) => {
                    let msg = JSON.parse(message)
                    console.log('MSG', msg);

                    amulets.getPrefs()
                    .then(prefs => {
                        msg.data.prefs = prefs
                        if (msg.method == 'writeFiles') {
                            amulets.checkPath(prefs.absolutePath)
                            this.writeFiles(msg, prefs.absolutePath)
                            .then(folderPath => {
                                msg.data.layerData[0].folderPath = folderPath
                            })
                        }
                    })
                    .then(() => {
                        amulets.evalScript('buildLayers', msg.data)
                        .then(result => {
                            console.log('RESULT', result);
                            ws.send(JSON.stringify(result))
                        })
                        .catch(error =>
                            // ws.send(JSON.stringify(error))
                            alert(`Catch: ${error}`)
                        )
                    })

                    amulets.switchApps('aftereffects')
                })
            })
        },
        writeFiles(msg, path) {
            try {
            return new Promise((resolve, reject) => {
                let folderPath = (path == '') ?  window.cep.fs.showOpenDialogEx(false, true, 'Save images').data[0] : path
                if (!folderPath) {
                    reject('No path selected for images')
                }

                let images = msg.images;
                let fileNames = []

                images.forEach(image => {
                    let data = image.imgData
                    let fileName = image.name
                    fileNames.push(fileName)

                    let savePath = `${folderPath}/${fileName}`

                    fs.writeFileSync(decodeURI(savePath), data, 'base64', function(err) {
                        console.log(err);
                    });
                });

                resolve(folderPath)
            })
            } catch (error) { alert(`try/catch: ${error}`) }
        },
    },
    mounted() {
        amulets.configure({devName: this.devName, scriptName: this.scriptName})
        this.newWebSocket()
        amulets.newServer(7240)
    },
}
</script>

<template>
    <div class="server" >
    </div>
</template>

<script>
// import { evalScript, openPath, loadScript } from "brutalism";
import amulets from 'amulets'
import WebSocket from 'ws'
import fs from 'fs'

export default {
    props: {
        devName: {
            type: String,
            default: 'sumUX'
        },
        scriptName: {
            type: String,
            default: 'AEUX'
        },
        port: {
            type: Number,
            default: 4000
        },
    },
    data: () => ({
        server: null,
        prefs: {},
    }),
    methods: {
        newWebSocket() {
            this.server = new WebSocket.Server({port: 7240})
            this.server.on('connection', (ws) => {
                console.log('new connection');
                ws.on('message', (message) => {
                    let msg = JSON.parse(message)
                    console.log('MSG', msg);

                    if (msg.method == 'writeFiles') {
                        amulets.getPrefs()
                        .then(prefs => {
                            return prefs
                        })
                        .then(prefs => {
                            amulets.checkPath(prefs.absolutePath)
                            this.writeFiles(msg, prefs.absolutePath)
                            .then(folderPath => {
                                msg.data.layerData[0].folderPath = folderPath
                                msg.data.prefs = prefs
                                // build layers
                                amulets.evalScript('buildLayers', msg.data)
                                .then(result => {
                                    console.log('RESULT', result);
                                    ws.send(JSON.stringify(result))
                                })
                            })
                            .catch(error =>
                                ws.send(JSON.stringify(error))
                                // alert(`Catch: ${error}`)
                            )
                        })

                    } else {
                        amulets.evalScript(msg.method, msg.data)
                        .then(result => {
                            console.log('RESULT', result);
                            ws.send(JSON.stringify(result))
                        })
                    }

                    amulets.switchApps('aftereffects')
                })
            })
        },
        writeFiles(msg, path) {
            try {
            return new Promise((resolve, reject) => {
                let folderPath = (path == '') ?  window.cep.fs.showOpenDialogEx(false, true, 'Save images').data[0] : path
                if (!folderPath) {
                    reject('No path selected for images')
                }

                let images = msg.images;
                let fileNames = []

                images.forEach(image => {
                    let data = image.imgData
                    let fileName = image.name
                    fileNames.push(fileName)

                    let savePath = `${folderPath}/${fileName}`

                    fs.writeFileSync(decodeURI(savePath), data, 'base64', function(err) {
                        console.log(err);
                    });
                });

                resolve(folderPath)
            })
            } catch (error) { alert(`try/catch: ${error}`) }
        },
    },
    mounted() {
        amulets.configure({devName: this.devName, scriptName: this.scriptName})
        this.newWebSocket()
    },
}
</script>


自定义拦截增加200

自定义拦截增加200

<template>

          通用设置

            真实 IP header

              [帮助文档]

          <input v-model="data['clientip.header']" type="text" class="form-control">

            自定义拦截状态码

            自定义拦截跳转页面

          <input v-model="data['block.redirect_url']" type="text" class="form-control">

            自定义HTML响应内容

              [帮助文档]

          <textarea v-model="data['block.content_html']" type="text" class="form-control" />

            自定义XML响应内容

              [帮助文档]

          <textarea v-model="data['block.content_xml']" type="text" class="form-control" />

            自定义JSON响应内容

              [帮助文档]

          <textarea v-model="data['block.content_json']" type="text" class="form-control" />

            <input v-model="data['decompile.enable']" type="checkbox" checked="data['decompile.enable']" class="custom-switch-input">

              开启反汇编功能

                [帮助文档]

          <button type="submit" class="btn btn-primary" @click="doSave()">
            保存
          </button>

</template>


docs(Typography): remove obsolete file

docs(Typography): remove obsolete file

<template>
  <v-card
    class="pa-12 mb-4"
    color="teal"
    dark
    flat
  >
    <v-layout
      v-for="(text, i) in texts"
      :key="`${i}-text`"
      mb-4
      align-center
      justify-start
      wrap
    >
      <div
        class="mr-4"
        style="min-width: 85px;"
      >
        <code>.{{ text[0] }}</code>
      </div>
      <v-flex :class="`${text[0]}`">{{ text[1] }}</v-flex>
    </v-layout>
  </v-card>
</template>

<script>
  export default {
    data: () => ({
      texts: [
        ['display-4', 'Light 96sp', '300'],
        ['display-3', 'Light 60sp', '400'],
        ['display-2', 'Regular 48sp', '400'],
        ['display-1', 'Regular 34sp', '400'],
        ['headline', 'Regular 24sp', '400'],
        ['title', 'Medium 20sp', '500'],
        ['subtitle-1', 'Regular 16sp', '400'],
        ['subtitle-2', 'Medium 14sp', '500'],
        ['body-1', 'Regular 16sp', '400'],
        ['body-2', 'Regular 14sp', '500'],
        ['caption', 'Regular 12sp', '400'],
        ['overline', 'Regular 10sp', '500'],
      ],
    }),

  }
</script>


重构顶部导航栏组件，使用flex代替js计算

重构顶部导航栏组件，使用flex代替js计算

<template>
	<view>
		<!-- #ifdef APP-PLUS -->
		<!-- 固定在顶部的导航栏 -->
		<uni-nav-bar fixed="true" left-icon="back" @click-left="back" @click-right="showMenu" left-text="返回" right-text="菜单"
		 title="导航栏组件"></uni-nav-bar>
		<!-- 使用非原生导航栏后需要在页面顶部占位 -->
		<view style="height:80px;">...</view>
		<!-- #endif -->
		<view class="uni-padding-wrap">
			<view class="uni-helllo-text uni-common-mt">
				本导航栏为自定义组件，并非原生导航栏。除非原生导航栏无法满足需求，否则不推荐使用自定义导航栏组件。具体参考http://ask.dcloud.net.cn/article/34921
			</view>
			<view class="uni-title uni-center uni-common-mt">
				基础用法
				<text>\n返回图标 + 标题</text>
			</view>
		</view>
		<uni-nav-bar left-icon="back" left-text="返回" @click-left="back" title="标题"></uni-nav-bar>
		<view class="uni-title uni-center uni-common-mt">
			其他常见样式
			<text>\n返回图标 + 搜索 + 右侧按钮</text>
		</view>
		<uni-nav-bar color="#333333" background-color="#FFFFFF" fixed="false" right-icon="scan" @click-left="showCity"
		 @click-right="scan">
			<block slot="left">
				<view class="city">
					<text>{{city}}</text>
					<uni-icon type="arrowdown" color="#333333" size="22"></uni-icon>
				</view>
			</block>
			<view class="input-view">
				<uni-icon type="search" size="22" color="#666666"></uni-icon>
				<input confirm-type="search" @confirm="confirm" class="input" type="text" placeholder="输入搜索关键词" />
			</view>
		</uni-nav-bar>
	</view>
</template>

<script>
	import uniNavBar from '../../../components/uni-nav-bar.vue'
	import uniIcon from '../../../components/uni-icon.vue'

	export default {
		components: {
			uniNavBar,
			uniIcon
		},
		data() {
			return {
				city: '北京'
			}
		},
		methods: {
			back() {
				uni.navigateBack({
					delta: 1
				})
			},
			showMenu() {
				uni.showToast({
					title: '菜单'
				})
			},
			clickLeft() {
				uni.showToast({
					title: '左侧按钮'
				})
			},
			search() {
				uni.showToast({
					title: '搜索'
				})
			},
			showCity() {
				uni.showToast({
					title: '选择城市'
				})
			},
			scan() {
				uni.showToast({
					title: '扫码'
				})
			},
			confirm() {
				uni.showToast({
					title: '搜索'
				})
			}
		},
		onPullDownRefresh() {
			console.log('onPullDownRefresh')
			setTimeout(function() {
				uni.stopPullDownRefresh()
				console.log('stopPullDownRefresh')
			}, 1000)
		}
	}
</script>

<style>
	.title {
		font-size: 15px;
		line-height: 20px;
		color: #333333;
		padding: 15px;
	}

	.city {
		display: flex;
		flex-direction: row;
		align-items: center;
		justify-content: center;
		width: 100%;
		margin-left:8px;
	}

	.input-view {
		width: 92%;
		display: flex;
		background-color: #e7e7e7;
		height: 30px;
		border-radius: 15px;
		padding: 0 4%;
		flex-wrap:nowrap;
		margin:7px 0;
		line-height:30px;
	}

	.input-view .uni-icon{
		line-height:30px !important;
	}

	.input-view .input {
		height:20px;
		line-height:20px;
		width:94%;
		padding: 5px 3%;
	}
</style>

<template>
	<view>
		<!-- #ifdef APP-PLUS -->
		<!-- 固定在顶部的导航栏 -->
		<uni-nav-bar fixed="true" left-icon="back" @click-left="back" @click-right="showMenu" left-text="返回" right-text="菜单"
		 title="导航栏组件"></uni-nav-bar>
		<!-- 占位用的导航栏 -->
		<uni-nav-bar background-color="rgba(0,0,0,0)" status-bar="true"></uni-nav-bar>
		<!-- #endif -->
		<view class="title">本导航栏为自定义组件，并非原生导航栏。除非原生导航栏无法满足需求，否则不推荐使用自定义导航栏组件。具体参考http://ask.dcloud.net.cn/article/34921</view>
		<view class="title">基础用法(注意右上角应避开微信小程序自带的胶囊按钮)</view>
		<uni-nav-bar left-icon="back" @click-left="back" title="标题"></uni-nav-bar>
		<!-- <uni-nav-bar left-icon="camera" @click-left="clickLeft" @click-right="showMenu" right-icon="bars" title="标题"></uni-nav-bar>
        <uni-nav-bar left-icon="back" @click-left="back" left-text="返回" title="标题"></uni-nav-bar>
        <uni-nav-bar left-icon="back" @click-left="back" @click-right="showMenu" left-text="返回" right-text="菜单" title="标题"></uni-nav-bar>
        <uni-nav-bar left-icon="back" @click-left="showMenu" @click-right="showMenu" left-text="菜单" right-text="菜单" title="标题"></uni-nav-bar> -->
		<view class="title">其他常见样式</view>
		<uni-nav-bar color="#333333" background-color="#FFFFFF" fixed="false" right-icon="scan" @click-left="showCity"
		 @click-right="scan">
			<block slot="left">
				<view class="city">
					<text>{{city}}</text>
					<uni-icon type="arrowdown" color="#333333" size="22"></uni-icon>
				</view>
			</block>
			<view class="input-view">
				<uni-icon type="search" size="22" color="#666666"></uni-icon>
				<input confirm-type="search" @confirm="confirm" class="input" type="text" placeholder="输入搜索关键词" />
			</view>
		</uni-nav-bar>
	</view>
</template>

<script>
	import uniNavBar from '../../../components/uni-nav-bar.vue'
	import uniIcon from '../../../components/uni-icon.vue'

	export default {
		components: {
			uniNavBar,
			uniIcon
		},
		data() {
			return {
				city: '北京'
			}
		},
		methods: {
			back() {
				uni.navigateBack({
					delta: 1
				})
			},
			showMenu() {
				uni.showToast({
					title: '菜单'
				})
			},
			clickLeft() {
				uni.showToast({
					title: '左侧按钮'
				})
			},
			search() {
				uni.showToast({
					title: '搜索'
				})
			},
			showCity() {
				uni.showToast({
					title: '选择城市'
				})
			},
			scan() {
				uni.showToast({
					title: '扫码'
				})
			},
			confirm() {
				uni.showToast({
					title: '搜索'
				})
			}
		},
		onPullDownRefresh() {
			console.log('onPullDownRefresh')
			setTimeout(function() {
				uni.stopPullDownRefresh()
				console.log('stopPullDownRefresh')
			}, 1000)
		}
	}
</script>

<style>
	.title {
		font-size: 15px;
		line-height: 20px;
		color: #333333;
		padding: 15px;
	}

	.city {
		display: flex;
		flex-direction: row;
		align-items: center;
		justify-content: center;
		width: 100%;
	}

	.input-view {
		position: absolute;
		width: 100%;
		top: 50%;
		transform: translateY(-50%);
		align-items: center;
		display: flex;
		flex-direction: row;
		background-color: #e7e7e7;
		height: 30px;
		border-radius: 15px;
		padding: 0 10px;
	}

	.input {
		flex: 1;
		padding: 0 5px;
	}
</style>


updated dropdown button icon

updated dropdown button icon

<template>

      <button
        :aria-label="__('Create new file or directory')"
        type="button"
        class="rounded border-0 d-flex ide-entry-dropdown-toggle"
        @click.stop="openDropdown()"
      >
        <icon
          name="ellipsis_v"
        />
        <icon
          name="arrow-down"
        />
      </button>

        <template v-if="type === 'tree'">

            <item-button
              :label="__('New file')"
              class="d-flex"
              icon="doc-new"
              icon-classes="mr-2"
              @click="createNewItem('blob')"
            />

            <upload
              :path="path"
              @create="createTempEntry"
            />

            <item-button
              :label="__('New directory')"
              class="d-flex"
              icon="folder-new"
              icon-classes="mr-2"
              @click="createNewItem('tree')"
            />

        </template>

          <item-button
            :label="__('Rename')"
            class="d-flex"
            icon="pencil"
            icon-classes="mr-2"
            @click="createNewItem('rename')"
          />

          <item-button
            :label="__('Delete')"
            class="d-flex"
            icon="remove"
            icon-classes="mr-2"
            @click="deleteEntry(path)"
          />

</template>

<template>

      <button
        :aria-label="__('Create new file or directory')"
        type="button"
        class="rounded border-0 d-flex ide-entry-dropdown-toggle"
        @click.stop="openDropdown()"
      >
        <icon
          name="hamburger"
        />
        <icon
          name="arrow-down"
        />
      </button>

        <template v-if="type === 'tree'">

            <item-button
              :label="__('New file')"
              class="d-flex"
              icon="doc-new"
              icon-classes="mr-2"
              @click="createNewItem('blob')"
            />

            <upload
              :path="path"
              @create="createTempEntry"
            />

            <item-button
              :label="__('New directory')"
              class="d-flex"
              icon="folder-new"
              icon-classes="mr-2"
              @click="createNewItem('tree')"
            />

        </template>

          <item-button
            :label="__('Rename')"
            class="d-flex"
            icon="pencil"
            icon-classes="mr-2"
            @click="createNewItem('rename')"
          />

          <item-button
            :label="__('Delete')"
            class="d-flex"
            icon="remove"
            icon-classes="mr-2"
            @click="deleteEntry(path)"
          />

</template>


Eslint

Eslint

<template>
  <uw-card :loaded="true">
    <template #card-heading>

        UW Resources

    </template>
    <template #card-body>

Explore tools, services, and resources by popular topics.

                Academic Resources

                Student Finances

                Accounts, Identity, and Email

                Employment

          More topics

            Teaching

            Libraries

            Campus Life

            Events and Activities

            Services for Faculty and Staff

    </template>
  </uw-card>
</template>


Fixed bug where course detail is displayed in and out of the disclosure

<template>

    <div :class="`w-100 myuw-border-top border-c${section.color_id}`" />
    <uw-card loaded>
      <template #card-heading>

              {{ section.curriculum_abbr }}
              {{ section.course_number }}
              {{ section.section_id }}

            {{ section.course_title }}

              {{ ucfirst(section.section_type) }}

              {{ section.credits }} CR

          Summer {{ section.summer_term.split('-').map(ucfirst).join('-') }}

          Dates: {{ sectionFormattedDates(section) }}

          Your status: On Standby

      </template>

      <template #card-body>
        <uw-course-eval
          v-if="isReadyEval"
          :eval-data="getSectionEval(section.index)"
          :section="section"
        />
        <uw-course-details
          v-if="!section.is_ended"
          :course="course"
          :section="section"
          :show-row-heading="showRowHeading "
        />
      </template>

      <template #card-disclosure>
        <template
          v-if="section.is_ended || getSectionEval(section.index).length > 0"
        >
          <b-collapse :id="`course-details-${index}`" v-model="isOpen">
            <uw-course-details
              :course="course"
              :section="section"
              :show-row-heading="showRowHeading "
            />

        </template>
        <template v-else>
          <b-collapse :id="`instructors-collapse-${index}`" v-model="isOpen">
            <uw-instructor-info
              v-if="section.instructors.length > 0"
              :instructors="section.instructors"
            />

        </template>
      </template>

      <template #card-footer>
        <template
          v-if="section.is_ended || getSectionEval(section.index).length > 0"
        >
          <b-button
            v-if="!isOpen"
            v-b-toggle="`course-details-${index}`"
            variant="link"
            size="sm"
            class="w-100 p-0 border-0 text-dark"
            aria-label="SHOW COURSE DETAILS"
            title="Expand to show course details"
          >
            SHOW COURSE DETAILS

          <b-button
            v-else
            v-b-toggle="`course-details-${index}`"
            variant="link"
            size="sm"
            class="w-100 p-0 border-0 text-dark"
            aria-label="HIDE COURSE DETAILS"
            title="Collapse to hide course details"
          >
            HIDE COURSE DETAILS

        </template>

        <template v-else>
           0">
            <b-button
              v-if="!isOpen"
              v-b-toggle="`instructors-collapse-${index}`"
              variant="link"
              size="sm"
              class="w-100 p-0 border-0 text-dark"
              aria-label="SHOW INSTRUCTORS"
              title="Expand to show instructors"
            >
              SHOW INSTRUCTORS

            <b-button
              v-else
              v-b-toggle="`instructors-collapse-${index}`"
              variant="link"
              size="sm"
              class="w-100 p-0 border-0 text-dark"
              aria-label="HIDE INSTRUCTORS"
              title="Collapse to hide instructors"
            >
              HIDE INSTRUCTORS

            No instructor information available

        </template>
      </template>
    </uw-card>

</template>

<template>

    <div :class="`w-100 myuw-border-top border-c${section.color_id}`" />
    <uw-card loaded>
      <template #card-heading>

              {{ section.curriculum_abbr }}
              {{ section.course_number }}
              {{ section.section_id }}

            {{ section.course_title }}

              {{ ucfirst(section.section_type) }}

              {{ section.credits }} CR

          Summer {{ section.summer_term.split('-').map(ucfirst).join('-') }}

          Dates: {{ sectionFormattedDates(section) }}

          Your status: On Standby

      </template>

      <template #card-body>
        <uw-course-eval
          v-if="isReadyEval"
          :eval-data="getSectionEval(section.index)"
          :section="section"
        />
        <uw-course-details
          v-if="!section.is_ended"
          :course="course"
          :section="section"
          :show-row-heading="showRowHeading "
        />
      </template>

      <template #card-disclosure>
        <template
          v-if="section.is_ended || getSectionEval(section.index)"
        >
          <b-collapse :id="`course-details-${index}`" v-model="isOpen">
            <uw-course-details
              :course="course"
              :section="section"
              :show-row-heading="showRowHeading "
            />

        </template>
        <template v-else>
          <b-collapse :id="`instructors-collapse-${index}`" v-model="isOpen">
            <uw-instructor-info
              v-if="section.instructors.length > 0"
              :instructors="section.instructors"
            />

        </template>
      </template>

      <template #card-footer>
        <template
          v-if="section.is_ended || getSectionEval(section.index)"
        >
          <b-button
            v-if="!isOpen"
            v-b-toggle="`course-details-${index}`"
            variant="link"
            size="sm"
            class="w-100 p-0 border-0 text-dark"
            aria-label="SHOW COURSE DETAILS"
            title="Expand to show course details"
          >
            SHOW COURSE DETAILS

          <b-button
            v-else
            v-b-toggle="`course-details-${index}`"
            variant="link"
            size="sm"
            class="w-100 p-0 border-0 text-dark"
            aria-label="HIDE COURSE DETAILS"
            title="Collapse to hide course details"
          >
            HIDE COURSE DETAILS

        </template>

        <template v-else>
           0">
            <b-button
              v-if="!isOpen"
              v-b-toggle="`instructors-collapse-${index}`"
              variant="link"
              size="sm"
              class="w-100 p-0 border-0 text-dark"
              aria-label="SHOW INSTRUCTORS"
              title="Expand to show instructors"
            >
              SHOW INSTRUCTORS

            <b-button
              v-else
              v-b-toggle="`instructors-collapse-${index}`"
              variant="link"
              size="sm"
              class="w-100 p-0 border-0 text-dark"
              aria-label="HIDE INSTRUCTORS"
              title="Collapse to hide instructors"
            >
              HIDE INSTRUCTORS

            No instructor information available

        </template>
      </template>
    </uw-card>

</template>


Fixed typo.

Fixed typo.

Reported at Transifex.

Signed-off-by: rakekniven <431c871bb5514e240c815672fa1af6e63423a115@users.noreply.github.com>

<template>

			{{ t('spreed', 'Be careful, these actions cannot be undone.') }}

			<template v-if="canLeaveConversation">

{{ t('spreed', 'Leave conversation') }}

					{{ t('spreed', 'Once a conversation is left, to rejoin a closed conversation, an invite is needed. An open conversation can be re-joined at any time.') }}

				<button
					@click.prevent.exact="leaveConversation">
					{{ t('spreed', 'Leave conversation') }}
				</button>
			</template>
			<template v-if="canDeleteConversation">

{{ t('spreed', 'Delete conversation') }}

					{{ t('spreed', 'Permanently delete this conversation.') }}

				<button
					class="critical error"
					@click.prevent.exact="deleteConversation">
					{{ t('spreed', 'Delete conversation') }}
				</button>
			</template>
			<template v-if="canDeleteConversation">

{{ t('spreed', 'Delete chat messages') }}

					{{ t('spreed', 'Permanently delete all the messages in this conversation.') }}

				<button
					class="critical error"
					@click.prevent.exact="clearChatHistory">
					{{ t('spreed', 'Delete chat messages') }}
				</button>
			</template>

</template>

<template>

			{{ t('spreed', 'Be careful, these actions cannot be undone.') }}

			<template v-if="canLeaveConversation">

{{ t('spreed', 'Leave conversation') }}

					{{ t('spreed', 'Once a conversation is left, to re-join a closed conversation, an invite is needed. An open conversation can be re-joined at any time.') }}

				<button
					@click.prevent.exact="leaveConversation">
					{{ t('spreed', 'Leave conversation') }}
				</button>
			</template>
			<template v-if="canDeleteConversation">

{{ t('spreed', 'Delete conversation') }}

					{{ t('spreed', 'Permanently delete this conversation.') }}

				<button
					class="critical error"
					@click.prevent.exact="deleteConversation">
					{{ t('spreed', 'Delete conversation') }}
				</button>
			</template>
			<template v-if="canDeleteConversation">

{{ t('spreed', 'Delete chat messages') }}

					{{ t('spreed', 'Permanently delete all the messages in this conversation.') }}

				<button
					class="critical error"
					@click.prevent.exact="clearChatHistory">
					{{ t('spreed', 'Delete chat messages') }}
				</button>
			</template>

</template>


fix(jenkins-plugin): pagination issues

fix(jenkins-plugin): pagination issues

<template>

 0">

Specimen

      1d

{{ job.name }}

      {{ job.timeSince }}

</template>


Fix the edit song form bug

Fix the edit song form bug

<template>

    <sound-bar v-if="loading"></sound-bar>
    <form v-else @submit.prevent="submit">

        <hgroup class="meta">

{{ displayedTitle }}

            {{ bySameArtist || formData.artistName ? formData.artistName : 'Mixed Artists' }}

            {{ inSameAlbum || formData.albumName ? formData.albumName : 'Mixed Albums' }}

        </hgroup>

            Details
            Lyrics

                Title
                <input name="title" type="text" v-model="formData.title">

                Artist
                <typeahead
                  :items="artistState.artists"
                  :options="artistTypeaheadOptions"
                  v-model="formData.artistName"/>

                Album
                <typeahead
                  :items="albumState.albums"
                  :options="albumTypeaheadOptions"
                  v-model="formData.albumName"/>

                  <input type="checkbox" @change="changeCompilationState" ref="compilationStateChk" />
                  Album is a compilation of songs by various artists

                Track
                <input name="track" type="text" pattern="\d*" v-model="formData.track"
                title="Empty or a number">

                <textarea v-model="formData.lyrics"/>

        <input type="submit" value="Update">
        Cancel

    </form>

</template>


App não levantava (componente bModal não encontrado no Bootstrap-vue)

<template>

{{progressbarCaption}}

</template>


fixed bug where an extra td was being generated

<template lang="pug">
  v-data-table(
    :headers="headers"
    :search="search"
    :items="computedItems"
    :pagination.sync="pagination"
    :hide-actions="this.items.length <= 10"
    :rows-per-page-items="[10, 25, { text: 'All', value: -1 }]"
  ).component-parameters
    template(slot="items" slot-scope="{ item }")
      td(
        v-for="(opt, i) in item"
        :key="i"
      )
        markdown(:source="opt.toString()")
</template>

<script>
  import { capitalize } from '@/util/helpers'

  export default {
    data: () => ({
      pagination: {
        rowsPerPage: 10
      }
    }),

    props: {
      target: String,
      headers: {
        type: Array,
        default: () => ([])
      },
      items: {
        type: Array,
        default: () => ([])
      },
      namespace: String,
      search: String,
      type: String
    },

    computed: {
      computedItems () {
        return this.items.map(item => {
          const newItem = {}

          if (item !== Object(item)) {
            item = { name: item }
          }

          for (const header of this.headers) {
            const key = header.value
            const fn = this[`gen${capitalize(key)}`]

            if (fn) {
              newItem[key] = fn(item[key])
            } else {
              newItem[key] = item[key] == null ? '' : item[key]
            }
          }

          newItem.description = item.description || this.genDescription(item.name)

          return newItem
        })
      }
    },

    methods: {
      genDescription (name) {
        let description = ''
        const specialLevelDesc = `${this.namespace}.special.${this.type}.${this.target}.${name}`
        const pageComponentLevelDesc = `${this.namespace}.${this.type}.${this.target}.${name}`
        const componentLevelDesc = `${this.namespace}.${this.type}.${name}`
        const genericDesc = `Generic.${capitalize(this.type)}.${name}`

        if (this.$te(specialLevelDesc)) {
          description = this.$t(specialLevelDesc)
        } else if (this.$te(pageComponentLevelDesc)) {
          description = this.$t(pageComponentLevelDesc)
        } else if (this.$te(componentLevelDesc)) {
          description = this.$t(componentLevelDesc)
        } else if (this.$te(genericDesc)) {
          description = this.$t(genericDesc)
        }

        return description
      },
      genName (name) {
        name = name || ''
        name = name.replace(/([A-Z])/g, (g) => `-${g[0].toLowerCase()}`)

        return `<code>${name}</code>`
      },
      genType (type) {
        type = Array.isArray(type) ? type : [type]

        return type.map(t => {
          return this.$t(`Generic.Types.${t}`)
        }).join(', ')
      }
    }
  }
</script>

<style lang="stylus">
  .component-parameters
    code
      white-space: nowrap

    p
      margin-bottom: 0
</style>

<template lang="pug">
  v-data-table(
    :headers="headers"
    :search="search"
    :items="computedItems"
    :pagination.sync="pagination"
    :hide-actions="this.items.length <= 10"
    :rows-per-page-items="[10, 25, { text: 'All', value: -1 }]"
  ).component-parameters
    template(slot="items" slot-scope="{ item }")
      td(
        v-for="(opt, i) in item"
        :key="i"
      )
        markdown(:source="opt.toString()")
</template>

<script>
  import { capitalize } from '@/util/helpers'

  export default {
    data: () => ({
      pagination: {
        rowsPerPage: 10
      }
    }),

    props: {
      target: String,
      headers: {
        type: Array,
        default: () => ([])
      },
      items: {
        type: Array,
        default: () => ([])
      },
      namespace: String,
      search: String,
      type: String
    },

    computed: {
      computedItems () {
        return this.items.map(item => {
          const newItem = {}

          if (item !== Object(item)) {
            item = { name: item }
          }

          for (const header of this.headers) {
            const key = header.value
            const fn = this[`gen${capitalize(key)}`]

            if (fn) {
              newItem[key] = fn(item[key])
            } else {
              newItem[key] = item[key] == null ? '' : item[key]
            }
          }

          newItem.desc = item.desc || this.genDescription(item.name)

          return newItem
        })
      }
    },

    methods: {
      genDescription (name) {
        let description = ''
        const specialLevelDesc = `${this.namespace}.special.${this.type}.${this.target}.${name}`
        const pageComponentLevelDesc = `${this.namespace}.${this.type}.${this.target}.${name}`
        const componentLevelDesc = `${this.namespace}.${this.type}.${name}`
        const genericDesc = `Generic.${capitalize(this.type)}.${name}`

        if (this.$te(specialLevelDesc)) {
          description = this.$t(specialLevelDesc)
        } else if (this.$te(pageComponentLevelDesc)) {
          description = this.$t(pageComponentLevelDesc)
        } else if (this.$te(componentLevelDesc)) {
          description = this.$t(componentLevelDesc)
        } else if (this.$te(genericDesc)) {
          description = this.$t(genericDesc)
        }

        return description
      },
      genName (name) {
        name = name || ''
        name = name.replace(/([A-Z])/g, (g) => `-${g[0].toLowerCase()}`)

        return `<code>${name}</code>`
      },
      genType (type) {
        type = Array.isArray(type) ? type : [type]

        return type.map(t => {
          return this.$t(`Generic.Types.${t}`)
        }).join(', ')
      }
    }
  }
</script>

<style lang="stylus">
  .component-parameters
    code
      white-space: nowrap

    p
      margin-bottom: 0
</style>


ui: 🎨 add tips for connection

ui: 🎨 add tips for connection

<template>

    <mew-input
      v-model="pairingPassword"
      placeholder="Pairing Password"
      type="password"
      :error-messages="passwordErrorMsg"
    />
    <v-row no-gutters class="border-container mb-8">
      <v-col
        class="d-flex align-center justify-center pt-5"
        order="1"
        cols="12"
        lg="6"
        order-lg="2"
        order-md="1"
      >

      </v-col>
      <v-col order-lg="1" order-md="2" order="2" lg="6" cols="12" class="pa-5">

          Where is my pairing password?

Connect your Cool Wallet device.

Open CoolBitX mobile app

            Go to
            Settings
              <v-icon size="small"> mdi-arrow-right </v-icon>
              Show pairing password.

          Need more help?
          Read More
            <v-icon size="small" color="greenPrimary"> mdi-launch </v-icon>

          Note: If device is not available in the pairing selection pop-up,
          please enable
          Allow New Pairing in the mobile app settings

      </v-col>
    </v-row>
    <mew-button
      :has-full-width="true"
      btn-size="xlarge"
      title="Unlock Wallet"
      @click.native="coolWalletUnlock"
    />

</template>

<template>

    <mew-input
      v-model="pairingPassword"
      placeholder="Pairing Password"
      type="password"
      :error-messages="passwordErrorMsg"
    />
    <v-row no-gutters class="border-container mb-8">
      <v-col
        class="d-flex align-center justify-center pt-5"
        order="1"
        cols="12"
        lg="6"
        order-lg="2"
        order-md="1"
      >

      </v-col>
      <v-col order-lg="1" order-md="2" order="2" lg="6" cols="12" class="pa-5">

          Where is my pairing password?

Connect your Cool Wallet device.

Open CoolBitX mobile app

            Go to
            Settings
              <v-icon size="small"> mdi-arrow-right </v-icon>
              Show pairing password.

          Need more help?
          Read More
            <v-icon size="small" color="greenPrimary"> mdi-launch </v-icon>

      </v-col>
    </v-row>
    <mew-button
      :has-full-width="true"
      btn-size="xlarge"
      title="Unlock Wallet"
      @click.native="coolWalletUnlock"
    />

</template>


Clear the search term on Autocomplete input.

Refs #78.

<template>
	<v-autocomplete
		v-model="inputVal"
		v-bind="$attrs"
		:label="$tc(labelKey, multiple ? 2 : 1)"
		item-text="identifyingName"
		item-value="id"
		menu-props="allowOverflow"
		:multiple="multiple"
		:chips="multiple"
		:deletable-chips="multiple"
		:loading="loading ? 'primary' : false"
		:no-data-text="$t('core.components.Autocomplete.nodata')"
		:search-input.sync="search"
		@input="search = ''"
	>
		<template v-if="refreshable" v-slot:append-outer>
			<v-btn icon small @click.stop="$emit('refresh')">
				<v-icon>mdi-refresh</v-icon>
			</v-btn>
		</template>
	</v-autocomplete>
</template>

<script>
export default {
	name: 'Autocomplete',

	props: {
		// Using v-bind="$attrs" means we can avoid re-declaring everything we want to pass as-is to v-autocomplete
		value: {
			type: null,
			default: false
		},

		labelKey: {
			type: String,
			required: true
		},

		refreshable: {
			type: Boolean,
			default: false
		},

		loading: {
			type: Boolean,
			default: false
		},

		// Re-declared to always be able to set multiple input as chips
		multiple: {
			type: Boolean,
			default: false
		}
	},

	data() {
		return {
			inputVal: this.value,
			// See https://stackoverflow.com/a/55809183/109813
			search: ''
		}
	},

	watch: {
		value(val) {
			this.inputVal = val
		},

		inputVal(val) {
			this.$emit('input', val)
		}
	}
}
</script>

<template>
	<v-autocomplete
		v-model="inputVal"
		v-bind="$attrs"
		:label="$tc(labelKey, multiple ? 2 : 1)"
		item-text="identifyingName"
		item-value="id"
		menu-props="allowOverflow"
		:multiple="multiple"
		:chips="multiple"
		:deletable-chips="multiple"
		:loading="loading ? 'primary' : false"
		:no-data-text="$t('core.components.Autocomplete.nodata')"
	>
		<template v-if="refreshable" v-slot:append-outer>
			<v-btn icon small @click.stop="$emit('refresh')">
				<v-icon>mdi-refresh</v-icon>
			</v-btn>
		</template>
	</v-autocomplete>
</template>

<script>
export default {
	name: 'Autocomplete',

	props: {
		// Using v-bind="$attrs" means we can avoid re-declaring everything we want to pass as-is to v-autocomplete
		value: {
			type: null,
			default: false
		},

		labelKey: {
			type: String,
			required: true
		},

		refreshable: {
			type: Boolean,
			default: false
		},

		loading: {
			type: Boolean,
			default: false
		},

		// Re-declared to always be able to set multiple input as chips
		multiple: {
			type: Boolean,
			default: false
		}
	},

	data() {
		return {
			inputVal: this.value
		}
	},

	watch: {
		value(val) {
			this.inputVal = val
		},

		inputVal(val) {
			this.$emit('input', val)
		}
	}
}
</script>


Répare le lien pour les démarches des professions agricoles (#1863)

<template>

      <img
        class="aj-droit-illustration"
        v-bind:src="require(`./../../public/img/${droit.provider.imgSrc}`)"
        v-bind:alt="'Image pour ' + droit.label"
      />

{{ capitalize(droit.label) }}

      <DroitMontant
        v-bind:droit="droit"
        unexpected
        v-if="
          droit.montant && (isString(droit.montant) || isNumber(droit.montant))
        "
      />

{{ droit.label }}

            <BenefitCtaLink
              v-if="droit.link"
              v-bind:analytics-name="droit.label"
              v-bind:link="droit.link"
              v-bind:benefit="droit"
              type="link"
              level="'inline'"
              itemprop="termsOfService"
            />

Pour en bénéficier, vous devez également :

                Cette aide se
              base sur vos ressources de l'année
              {{ $store.state.dates.fiscalYear.label }}

            <router-link
              class="button outline red no-shadow text-center"
              to="/simulation/ressources/fiscales"
              v-if="!aCharge"
              >Déclarez vos ressources
              {{ $store.state.dates.fiscalYear.label }}</router-link
            >

               Cette aide se
              base sur votre patrimoine. Vous avez un patrimoine immobilier,
              d'épargne, des revenus fonciers et/ou du capital ? Vous devez
              renseigner des informations complémentaires.

            <router-link
              class="button outline red no-shadow text-center"
              to="/simulation/ressources/patrimoine"
              id="patrimoine-link"
              >Déclarez votre patrimoine</router-link
            >

              L'application Mes Aides ne peut pas calculer le montant de cette
              prestation, car
              .

          <BenefitCta
            class="aj-droit-content-buttons-cta"
            v-bind:benefit="droit"
          ></BenefitCta>

             Démarches pour les
            professions agricoles

            Lien invalide ?
            Merci pour votre aide ! Nous réglerons ce problème très
              prochainement.

</template>


#24 use vue router to keep all query parameters and also use URL encoding of special characters

<template>

    <input class="quicksearch" v-model="term" type="search" :placeholder="$t('search')">

</template>


do not close new entry modal in bibliography view on click outside modal

<template>
    <modal :name="id" height="auto" :scrollable="true" @closed="hide" :click-to-close="!!data.id">

{{ $t('main.bibliography.modal.edit.title') }}

{{ $t('main.bibliography.modal.new.title') }}

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

                <form role="form" id="newBibliographyItemForm" name="newBibliographyItemForm" @submit.prevent="success(data)">

                        {{ $t('global.type') }}:

                            <multiselect
                                v-model="data.type"
                                label="name"
                                track-by="id"
                                :allowEmpty="false"
                                :closeOnSelect="true"
                                :hideSelected="true"
                                :multiple="false"
                                :options="availableTypes">
                            </multiselect>

                        {{ mandatory }}:*

                            <input type="text" class="form-control" v-model="data.fields[mandatory]" required/>

                        {{ optional }}:

                            <input type="text" class="form-control" v-model="data.fields[optional]"/>

                </form>

{{ $t('main.bibliography.modal.new.bibtex-code') }}

                <button type="submit" class="btn btn-success" form="newBibliographyItemForm" v-if="data.id">
                     {{ $t('global.update') }}
                </button>
                <button type="submit" class="btn btn-success" form="newBibliographyItemForm" v-else>
                     {{ $t('global.add') }}
                </button>
                <button type="button" class="btn btn-danger" @click="hide">
                     {{ $t('global.cancel') }}
                </button>

    </modal>
</template>

<template>
    <modal :name="id" height="auto" :scrollable="true" @closed="hide">

{{ $t('main.bibliography.modal.edit.title') }}

{{ $t('main.bibliography.modal.new.title') }}

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

                <form role="form" id="newBibliographyItemForm" name="newBibliographyItemForm" @submit.prevent="success(data)">

                        {{ $t('global.type') }}:

                            <multiselect
                                v-model="data.type"
                                label="name"
                                track-by="id"
                                :allowEmpty="false"
                                :closeOnSelect="true"
                                :hideSelected="true"
                                :multiple="false"
                                :options="availableTypes">
                            </multiselect>

                        {{ mandatory }}:*

                            <input type="text" class="form-control" v-model="data.fields[mandatory]" required/>

                        {{ optional }}:

                            <input type="text" class="form-control" v-model="data.fields[optional]"/>

                </form>

{{ $t('main.bibliography.modal.new.bibtex-code') }}

                <button type="submit" class="btn btn-success" form="newBibliographyItemForm" v-if="data.id">
                     {{ $t('global.update') }}
                </button>
                <button type="submit" class="btn btn-success" form="newBibliographyItemForm" v-else>
                     {{ $t('global.add') }}
                </button>
                <button type="button" class="btn btn-danger" @click="hide">
                     {{ $t('global.cancel') }}
                </button>

    </modal>
</template>


More visual schedule border styling

More visual schedule border styling

<template>

      <div :class="`bg-c${meetingData.section.color_id}`"
           class="p-1 text-center myuw-text-xxs"
      >

          T

          {{ sectionTitle }}

        <slot>

            {{ meetingLocation }}

            {{ meetingLocation }}

            (Confirm)

        </slot>

</template>


Updated styles for mobile

Updated styles for mobile

<template>
  <div
    class="product align-center w-100 pb20"
    v-observe-visibility="visibilityChanged"
  >
    <router-link
      class="block no-underline product-link"
      :to="productLink"
      data-testid="productLink"
    >
      <div
        class="product-cover bg-cl-secondary"
        :class="[{ sale: labelsActive && isOnSale }, { new: labelsActive && isNew }]"
      >
        <product-image
          class="product-cover__thumb"
          :image="thumbnailObj"
          :alt="product.name | htmlDecode"
          :calc-ratio="false"
          data-testid="productImage"
        />
      </div>

      <p class="mb0 cl-accent mt10" v-if="!onlyImage">
        {{ product.name | htmlDecode }}
      </p>

      <span
        class="price-original mr5 lh30 cl-secondary"
        v-if="product.special_price && parseFloat(product.original_price_incl_tax) > 0 && !onlyImage"
      >
        {{ product.original_price_incl_tax | price }}
      </span>

      <span
        class="price-special lh30 cl-accent weight-700"
        v-if="product.special_price && parseFloat(product.special_price) > 0 && !onlyImage"
      >
        {{ product.price_incl_tax | price }}
      </span>

      <span
        class="lh30 cl-secondary"
        v-if="!product.special_price && parseFloat(product.price_incl_tax) > 0 && !onlyImage"
      >
        {{ product.price_incl_tax | price }}
      </span>
    </router-link>
  </div>
</template>

<script>
import rootStore from '@vue-storefront/core/store'
import { ProductTile } from '@vue-storefront/core/modules/catalog/components/ProductTile.ts'
import config from 'config'
import ProductImage from './ProductImage'

export default {
  mixins: [ProductTile],
  components: {
    ProductImage
  },
  props: {
    labelsActive: {
      type: Boolean,
      default: true
    },
    onlyImage: {
      type: Boolean,
      default: false
    }
  },
  computed: {
    thumbnailObj () {
      return {
        src: this.thumbnail,
        loading: this.thumbnail
      }
    }
  },
  methods: {
    onProductPriceUpdate (product) {
      if (product.sku === this.product.sku) {
        Object.assign(this.product, product)
      }
    },
    visibilityChanged (isVisible, entry) {
      if (isVisible) {
        if (config.products.configurableChildrenStockPrefetchDynamic && rootStore.products.filterUnavailableVariants) {
          const skus = [this.product.sku]
          if (this.product.type_id === 'configurable' && this.product.configurable_children && this.product.configurable_children.length > 0) {
            for (const confChild of this.product.configurable_children) {
              const cachedItem = rootStore.state.stock.cache[confChild.id]
              if (typeof cachedItem === 'undefined' || cachedItem === null) {
                skus.push(confChild.sku)
              }
            }
            if (skus.length > 0) {
              rootStore.dispatch('stock/list', { skus: skus }) // store it in the cache
            }
          }
        }
      }
    }
  },
  beforeMount () {
    this.$bus.$on('product-after-priceupdate', this.onProductPriceUpdate)
  },
  beforeDestroy () {
    this.$bus.$off('product-after-priceupdate', this.onProductPriceUpdate)
  }
}
</script>

<style lang="scss" scoped>
@import '~theme/css/animations/transitions';
@import '~theme/css/variables/colors';
@import '~theme/css/helpers/functions/color';

$bg-secondary: color(secondary, $colors-background);
$border-secondary: color(secondary, $colors-border);
$color-white: color(white);

.product {
  @media (max-width: 767px) {
    padding-bottom: 10px;
  }
}

.price-original {
  text-decoration: line-through;
}

%label {
  position: absolute;
  top: 0;
  left: 0;
  display: flex;
  justify-content: center;
  align-items: center;
  width: 40px;
  height: 40px;
  background-color: $border-secondary;
  text-transform: uppercase;
  color: $color-white;
  font-size: 12px;
}

.product-cover{
  overflow: hidden;
  max-height: 300px;
  &__thumb{
    padding-bottom: calc(143.88% / (164.5 / 100));
    @media screen and (min-width: 768px){
      padding-bottom: calc(300% / (276.5 / 100));
    }
    opacity: .8;
    will-change: opacity, transform;
    transition: .3s opacity $motion-main, .3s transform $motion-main;
  }
  &:hover{
    .product-cover__thumb{
      opacity: 1;
      transform: scale(1.1);
    }
    &.sale::after,
    &.new::after{
      opacity: .8;
    }
  }
  &.sale{
    &::after {
      @extend %label;
      content: 'Sale';
    }
  }
  &.new{
    &::after {
      @extend %label;
      content: 'New';
    }
  }
}
</style>

<template>
  <div
    class="product align-center w-100 pb20"
    v-observe-visibility="visibilityChanged"
  >
    <router-link
      class="block no-underline product-link"
      :to="productLink"
      data-testid="productLink"
    >
      <div
        class="product-cover bg-cl-secondary"
        :class="[{ sale: labelsActive && isOnSale }, { new: labelsActive && isNew }]"
      >
        <product-image
          class="product-cover__thumb"
          :image="thumbnailObj"
          :alt="product.name | htmlDecode"
          :calc-ratio="false"
          data-testid="productImage"
        />
      </div>

      <p class="mb0 cl-accent mt10" v-if="!onlyImage">
        {{ product.name | htmlDecode }}
      </p>

      <span
        class="price-original mr5 lh30 cl-secondary"
        v-if="product.special_price && parseFloat(product.original_price_incl_tax) > 0 && !onlyImage"
      >
        {{ product.original_price_incl_tax | price }}
      </span>

      <span
        class="price-special lh30 cl-accent weight-700"
        v-if="product.special_price && parseFloat(product.special_price) > 0 && !onlyImage"
      >
        {{ product.price_incl_tax | price }}
      </span>

      <span
        class="lh30 cl-secondary"
        v-if="!product.special_price && parseFloat(product.price_incl_tax) > 0 && !onlyImage"
      >
        {{ product.price_incl_tax | price }}
      </span>
    </router-link>
  </div>
</template>

<script>
import rootStore from '@vue-storefront/core/store'
import { ProductTile } from '@vue-storefront/core/modules/catalog/components/ProductTile.ts'
import config from 'config'
import ProductImage from './ProductImage'

export default {
  mixins: [ProductTile],
  components: {
    ProductImage
  },
  props: {
    labelsActive: {
      type: Boolean,
      default: true
    },
    onlyImage: {
      type: Boolean,
      default: false
    }
  },
  computed: {
    thumbnailObj () {
      return {
        src: this.thumbnail,
        loading: this.thumbnail
      }
    }
  },
  methods: {
    onProductPriceUpdate (product) {
      if (product.sku === this.product.sku) {
        Object.assign(this.product, product)
      }
    },
    visibilityChanged (isVisible, entry) {
      if (isVisible) {
        if (config.products.configurableChildrenStockPrefetchDynamic && rootStore.products.filterUnavailableVariants) {
          const skus = [this.product.sku]
          if (this.product.type_id === 'configurable' && this.product.configurable_children && this.product.configurable_children.length > 0) {
            for (const confChild of this.product.configurable_children) {
              const cachedItem = rootStore.state.stock.cache[confChild.id]
              if (typeof cachedItem === 'undefined' || cachedItem === null) {
                skus.push(confChild.sku)
              }
            }
            if (skus.length > 0) {
              rootStore.dispatch('stock/list', { skus: skus }) // store it in the cache
            }
          }
        }
      }
    }
  },
  beforeMount () {
    this.$bus.$on('product-after-priceupdate', this.onProductPriceUpdate)
  },
  beforeDestroy () {
    this.$bus.$off('product-after-priceupdate', this.onProductPriceUpdate)
  }
}
</script>

<style lang="scss" scoped>
@import '~theme/css/animations/transitions';
@import '~theme/css/variables/colors';
@import '~theme/css/helpers/functions/color';

$bg-secondary: color(secondary, $colors-background);
$border-secondary: color(secondary, $colors-border);
$color-white: color(white);

.product {
  @media (max-width: 767px) {
    padding-bottom: 10px;
  }
}

.price-original {
  text-decoration: line-through;
}

%label {
  position: absolute;
  top: 0;
  left: 0;
  display: flex;
  justify-content: center;
  align-items: center;
  width: 40px;
  height: 40px;
  background-color: $border-secondary;
  text-transform: uppercase;
  color: $color-white;
  font-size: 12px;
}

.product-cover{
  overflow: hidden;
  max-height: 300px;
  &__thumb{
    padding-bottom: calc(300% / (276.5 / 100));
    opacity: .8;
    will-change: opacity, transform;
    transition: .3s opacity $motion-main, .3s transform $motion-main;
  }
  &:hover{
    .product-cover__thumb{
      opacity: 1;
      transform: scale(1.1);
    }
    &.sale::after,
    &.new::after{
      opacity: .8;
    }
  }
  &.sale{
    &::after {
      @extend %label;
      content: 'Sale';
    }
  }
  &.new{
    &::after {
      @extend %label;
      content: 'New';
    }
  }
}
</style>


edit tinymce height

edit tinymce height

<template>
    <div>
        <Card shadow>
        <textarea class='tinymce-textarea' id="tinymceEditer"></textarea>
        </Card>
    </div>
</template>

<script>
import tinymce from 'tinymce';
export default {
    mounted () {
        var height = document.querySelector('.single-page-con').offsetHeight - 250;
        tinymce.init({
            selector: '#tinymceEditer',
            branding: false,
            elementpath: false,
            height: height,
            language: 'zh_CN.GB2312',
            menubar: 'edit insert view format table tools',
            theme: 'modern',
            plugins: [
                'advlist autolink lists link image charmap print preview hr anchor pagebreak imagetools',
                'searchreplace visualblocks visualchars code fullscreen fullpage',
                'insertdatetime media nonbreaking save table contextmenu directionality',
                'emoticons paste textcolor colorpicker textpattern imagetools codesample'
            ],
            toolbar1: ' newnote print fullscreen preview | undo redo | insert | styleselect | forecolor backcolor bold italic | alignleft aligncenter alignright alignjustify | bullist numlist outdent indent | link image emoticons media codesample',
            autosave_interval: '20s',
            image_advtab: true,
            table_default_styles: {
                width: '100%',
                borderCollapse: 'collapse'
            }
        });
    },
    destroyed () {
        tinymce.get('tinymceEditer').destroy();
    }
};
</script>

<style>

</style>

<template>
    <div>
        <Card shadow>
        <textarea class='tinymce-textarea' id="tinymceEditer"></textarea>
        </Card>
    </div>
</template>

<script>
import tinymce from 'tinymce';
export default {
    mounted () {
        var height = document.querySelector('.single-page-con').offsetHeight - 200;
        tinymce.init({
            selector: '#tinymceEditer',
            branding: false,
            elementpath: false,
            height: height,
            language: 'zh_CN.GB2312',
            menubar: 'edit insert view format table tools',
            theme: 'modern',
            plugins: [
                'advlist autolink lists link image charmap print preview hr anchor pagebreak imagetools',
                'searchreplace visualblocks visualchars code fullscreen fullpage',
                'insertdatetime media nonbreaking save table contextmenu directionality',
                'emoticons paste textcolor colorpicker textpattern imagetools codesample'
            ],
            toolbar1: ' newnote print fullscreen preview | undo redo | insert | styleselect | forecolor backcolor bold italic | alignleft aligncenter alignright alignjustify | bullist numlist outdent indent | link image emoticons media codesample',
            autosave_interval: '20s',
            image_advtab: true,
            table_default_styles: {
                width: '100%',
                borderCollapse: 'collapse'
            }
        });
    },
    destroyed () {
        tinymce.get('tinymceEditer').destroy();
    }
};
</script>

<style>

</style>


fix: tx confirmation help link

fix: tx confirmation help link

<template>

    <app-modal
      :show="showSuccessModal"
      :title="successTitle"
      :close="resetSuccess"
      :close-only="true"
      width="480"
      @close="resetSuccess"
    >
      <template #dialogBody>

            {{ successBodyText }}

          <v-row class="justify-sm-space-around align-center pt-3" dense>
            <v-col cols="12" sm="auto" class="pb-2" order-sm="3">
              View Progress
            </v-col>
            <v-col cols="12" sm="auto" class="pb-2">
              View on Etherscan
                <v-icon color="primary" small>mdi-launch</v-icon>
            </v-col>
            <v-col
              v-if="network.type.isEthVMSupported.supported"
              cols="12"
              sm="auto"
              class="pb-2"
            >
              View on EthVM
                <v-icon color="primary" small>mdi-launch</v-icon>
            </v-col>
          </v-row>

      </template>
    </app-modal>
    <app-modal
      :show="showTxOverlay"
      :title="title !== '' ? title : 'Confirmation'"
      :close="reset"
      :btn-action="btnAction"
      :btn-enabled="disableBtn"
      :scrollable="true"
      :anchored="true"
      width="650"
      @close="reset"
    >
      <template #dialogBody>
        <v-card-text ref="scrollableContent" class="py-0 px-5 px-md-0">
          <confirmation-send-transaction-details
            v-if="!isSwap"
            :to="txTo"
            :network="network"
            :tx-fee="txFee"
            :tx-fee-usd="txFeeUSD"
            :value="value"
            :value-usd="usdValue"
            :to-tx-data="tx.toTxData"
            :to-details="allToDetails"
            :send-currency="sendCurrency"
          />
          <confirmation-swap-transaction-details
            v-else
            :to="swapInfo.to"
            :from="swapInfo.from"
            :from-img="swapInfo.fromImg"
            :from-type="swapInfo.fromType"
            :to-type="swapInfo.toType"
            :to-img="swapInfo.toImg"
            :from-val="swapInfo.fromVal"
            :to-val="swapInfo.toVal"
            :provider="swapInfo.selectedProvider"
            :to-usd="swapInfo.toUsdVal"
            :from-usd="swapInfo.fromUsdVal"
            :tx-fee="swapInfo.totalFees"
            :gas-price-type="swapInfo.gasPriceType"
            :is-hardware="isHardware"
          />

            Make sure all the information is correct. Canceling or
            reversing a transaction cannot be guaranteed. You will still be
            charged gas fee even if transaction fails.
            Learn more.

          <confirm-with-wallet
            v-if="showConfirmWithWallet"
            :tx-length="unsignedTxArr.length > 0 ? unsignedTxArr.length : 1"
            :signed="signingPending"
            :error="error"
          />
          <v-expansion-panels
            v-model="panel"
            accordion
            multiple
            flat
            class="expansion-border"
          >
            <v-expansion-panel
              v-for="(transaction, i) in transactions"
              :key="`${transaction.title}${transaction.value}${i}`"
              :class="{
                'expansion-panel-border-bottom':
                  transactions.length > 1 && i !== transactions.length - 1
              }"
              @click="scrollToElement(i)"
            >
              <v-expansion-panel-header
                :disable-icon-rotate="signing"
                class="expansion-header"
              >
                <v-row class="align-center pr-7 pl-2">

                    Transaction
                      {{ transactions.length > 1 ? `${i + 1}` : `details` }}

                    {{ isSwap ? 'Swap ' : '' }} part {{ i + 1 }} -
                      {{ dataToAction(unsignedTxArr[i]) }}
                    {{ dataToAction(tx) }}

                  <v-spacer />

                    <v-progress-circular
                      v-show="
                        error === '' && isBatch && signedTxArray.length
                    <v-progress-circular
                      v-show="
                        !isBatch && Object.keys(signedTxObject).length === 0
                      "
                      indeterminate
                      color="primary"
                      size="20"
                      width="2"
                      class="pr-7"
                    />
                    <v-icon
                      v-show="
                        !isBatch && Object.keys(signedTxObject).length !== 0
                      "
                      color="primary"
                    >
                      mdi-check
                    </v-icon>
                    <v-icon
                      v-show="
                        error === '' && isBatch && signedTxArray.length >= i + 1
                      "
                      color="primary"
                    >
                      mdi-check
                    </v-icon>

                </v-row>
              </v-expansion-panel-header>
              <v-expansion-panel-content :id="i">

                  <v-row
                    v-for="txVal in transaction"
                    :key="`${txVal.title}${txVal.value}`"
                    class="d-flex justify-space-between"
                    no-gutters
                  >
                    <v-col
                      cols="12"
                      md="3"
                      class="d-flex d-sm-block ma-0 searchText--text"
                    >
                      {{ txVal.title }}
                    </v-col>

                    <v-col cols="12" md="9">
                      <app-scroll-block>

                          {{ txVal.value }}

                      </app-scroll-block>
                    </v-col>
                  </v-row>

              </v-expansion-panel-content>
            </v-expansion-panel>
          </v-expansion-panels>
        </v-card-text>
      </template>
    </app-modal>
    <mew-overlay
      :show-overlay="showSignOverlay"
      :title="title ? title : 'Message'"
      left-btn-text=""
      right-btn-text="close"
      :close="reset"
    >
      <template #mewOverlayBody>
        <confirmation-messsage
          ref="messageConfirmationContainer"
          :msg="signature"
          :copy="copyToClipboard"
        />
      </template>
    </mew-overlay>

</template>