提交 6e2dd018 authored 作者: wangjiahao's avatar wangjiahao

feat:增加支持文本超链接

上级 21059d19
<template>
<el-popover
ref="popover"
width="340"
trigger="click"
>
<el-row>
<el-form ref="form" size="mini" label-width="70px">
<el-form-item :label="$t('panel.is_enable')">
<el-switch v-model="linkInfo.enable" size="mini" />
<span v-show="linkInfo.enable" style="color: #909399; font-size: 8px;margin-left: 3px">
Tips:{{ $t('panel.link_open_tips') }}
</span>
</el-form-item>
<el-form-item :label="$t('panel.open_mode')">
<el-radio-group v-model="linkInfo.openMode" :disabled="!linkInfo.enable">
<el-radio label="_blank">{{ $t('panel.new_window') }}</el-radio>
<el-radio label="_self">{{ $t('panel.now_window') }}</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item :label="$t('panel.hyperLinks')">
<el-input v-model="linkInfo.content" :disabled="!linkInfo.enable" />
</el-form-item>
<el-form-item>
<el-button type="primary" @click="onSubmit">{{ $t('panel.confirm') }}</el-button>
<el-button @click="onClose">{{ $t('panel.cancel') }}</el-button>
</el-form-item>
</el-form>
</el-row>
<i slot="reference" class="icon iconfont icon-chaolianjie" />
</el-popover>
</template>
<script>
import { mapState } from 'vuex'
import { deepCopy } from '@/components/canvas/utils/utils'
export default {
props: {
linkInfo: {
type: Object,
required: true
}
},
data() {
return {
componentType: null,
linkageActiveStatus: false,
editFilter: [
'view',
'custom'
]
}
},
computed: {
...mapState([
'curComponent'
])
},
methods: {
onSubmit() {
this.curComponent.hyperlinks = deepCopy(this.linkInfo)
this.popoverClose()
},
onClose() {
this.$emit('close')
this.popoverClose()
},
popoverClose() {
this.$refs.popover.showPopper = false
}
}
}
</script>
<style lang="scss" scoped>
.slot-class{
color: white;
}
.bottom {
margin-top: 20px;
text-align: center;
}
.ellip{
/*width: 100%;*/
margin-left: 10px;
margin-right: 10px;
overflow: hidden;/*超出部分隐藏*/
white-space: nowrap;/*不换行*/
text-overflow:ellipsis;/*超出部分文字以...显示*/
background-color: #f7f8fa;
color: #3d4d66;
font-size: 12px;
line-height: 24px;
height: 24px;
border-radius: 3px;
}
.select-filed{
/*width: 100%;*/
margin-left: 10px;
margin-right: 10px;
overflow: hidden;/*超出部分隐藏*/
white-space: nowrap;/*不换行*/
text-overflow:ellipsis;/*超出部分文字以...显示*/
color: #3d4d66;
font-size: 12px;
line-height: 35px;
height: 35px;
border-radius: 3px;
}
>>>.el-popover{
height: 200px;
overflow: auto;
}
</style>
<template> <template>
<el-card class="el-card-main" :style="mainStyle"> <el-card class="el-card-main" :style="mainStyle">
<div style="position: relative;"> <div id="main-attr" style="position: relative;">
<div style="width: 100px;float: left;margin-top: 2px;margin-left: 2px;"> <div style="width: 100px;float: left;margin-top: 2px;margin-left: 2px;">
<el-radio-group v-model="styleInfo.textAlign" size="mini" @change="styleChange"> <el-radio-group v-model="styleInfo.textAlign" size="mini" @change="styleChange">
<el-radio-button <el-radio-button
...@@ -76,13 +76,23 @@ ...@@ -76,13 +76,23 @@
<el-color-picker ref="backgroundColorPicker" v-model="styleInfo.backgroundColor" style="margin-top: 7px;height: 0px" size="mini" @change="styleChange" /> <el-color-picker ref="backgroundColorPicker" v-model="styleInfo.backgroundColor" style="margin-top: 7px;height: 0px" size="mini" @change="styleChange" />
</div> </div>
</div> </div>
<div style="width: 20px;float: left;margin-top: 2px;margin-left: 2px;">
<el-tooltip content="超链接">
<Hyperlinks :link-info="this.curComponent.hyperlinks" />
</el-tooltip>
</div>
</div> </div>
</el-card> </el-card>
</template> </template>
<script> <script>
import { mapState } from 'vuex' import { mapState } from 'vuex'
import Hyperlinks from '@/components/canvas/components/Editor/Hyperlinks'
export default { export default {
components: { Hyperlinks },
props: { props: {
scrollLeft: { scrollLeft: {
type: Number, type: Number,
...@@ -96,6 +106,7 @@ export default { ...@@ -96,6 +106,7 @@ export default {
data() { data() {
return { return {
innerOpacity: 0, innerOpacity: 0,
mainWidthOffset: 600,
textAlignOptions: [ textAlignOptions: [
{ {
icon: 'iconfont icon-juzuo', icon: 'iconfont icon-juzuo',
...@@ -125,6 +136,8 @@ export default { ...@@ -125,6 +136,8 @@ export default {
if (this.styleInfo['opacity']) { if (this.styleInfo['opacity']) {
this.innerOpacity = this.styleInfo['opacity'] * 100 this.innerOpacity = this.styleInfo['opacity'] * 100
} }
this.mainWidthOffset = document.getElementById('main-attr').offsetWidth - 50
// console.log('mainWidthOffset:' + this.mainWidthOffset)
}, },
computed: { computed: {
letterDivColor() { letterDivColor() {
...@@ -181,7 +194,7 @@ export default { ...@@ -181,7 +194,7 @@ export default {
ps = x + 60 ps = x + 60
} }
// 防止toolbar超出边界 // 防止toolbar超出边界
const xGap = ps + 565 - this.canvasWidth const xGap = ps + this.mainWidthOffset - this.canvasWidth
// console.log('canvasWidth:' + this.canvasWidth + ';xGap:' + xGap) // console.log('canvasWidth:' + this.canvasWidth + ';xGap:' + xGap)
if (xGap > 0) { if (xGap > 0) {
return ps - xGap return ps - xGap
...@@ -213,7 +226,6 @@ export default { ...@@ -213,7 +226,6 @@ export default {
.el-card-main { .el-card-main {
height: 34px; height: 34px;
z-index: 10; z-index: 10;
width: 620px;
position: absolute; position: absolute;
} }
......
...@@ -18,7 +18,7 @@ ...@@ -18,7 +18,7 @@
<div v-if="!canEdit" :style="{ verticalAlign: element.style.verticalAlign }" @dblclick="setEdit" v-html="element.propValue" /> <div v-if="!canEdit" :style="{ verticalAlign: element.style.verticalAlign }" @dblclick="setEdit" v-html="element.propValue" />
</div> </div>
<div v-else class="v-text"> <div v-else class="v-text">
<div :style="{ verticalAlign: element.style.verticalAlign }" v-html="element.propValue" /> <div :style="{ verticalAlign: element.style.verticalAlign }" v-html="textInfo" />
</div> </div>
</template> </template>
...@@ -56,6 +56,13 @@ export default { ...@@ -56,6 +56,13 @@ export default {
} }
}, },
computed: { computed: {
textInfo() {
if (this.element && this.element.hyperlinks && this.element.hyperlinks.enable) {
return "<a target='" + this.element.hyperlinks.openMode + "' href='" + this.element.hyperlinks.content + "'>" + this.element.propValue + '</a>'
} else {
return this.element.propValue
}
}
}, },
watch: { watch: {
...@@ -123,9 +130,9 @@ export default { ...@@ -123,9 +130,9 @@ export default {
selectText(element) { selectText(element) {
const selection = window.getSelection() const selection = window.getSelection()
const range = document.createRange() const range = document.createRange()
range.selectNodeContents(element) // range.selectNodeContents(element)
selection.removeAllRanges() // selection.removeAllRanges()
selection.addRange(range) // selection.addRange(range)
}, },
removeSelectText() { removeSelectText() {
......
...@@ -11,6 +11,13 @@ export const commonAttr = { ...@@ -11,6 +11,13 @@ export const commonAttr = {
isLock: false // 是否锁定组件 isLock: false // 是否锁定组件
} }
// 超链接配置
export const HYPERLINKS = {
openMode: '_blank',
enable: false,
content: 'http://'
}
export const assistList = [ export const assistList = [
{ {
id: '10001', id: '10001',
...@@ -71,6 +78,7 @@ const list = [ ...@@ -71,6 +78,7 @@ const list = [
backgroundColor: '#ffffff', backgroundColor: '#ffffff',
borderRadius: 0 borderRadius: 0
}, },
hyperlinks: HYPERLINKS,
x: 1, x: 1,
y: 1, y: 1,
sizex: 10, sizex: 10,
......
...@@ -1319,7 +1319,13 @@ export default { ...@@ -1319,7 +1319,13 @@ export default {
suspension: 'suspension', suspension: 'suspension',
new_element_distribution: 'New element Distribution', new_element_distribution: 'New element Distribution',
subject_no_edit: 'System Subject Can Not Edit', subject_no_edit: 'System Subject Can Not Edit',
subject_name_not_null: 'Subject Name Can Not Be Null And Less Than 20 charts' subject_name_not_null: 'Subject Name Can Not Be Null And Less Than 20 charts',
is_enable: 'Enable',
open_mode: 'Open Model',
new_window: 'New Window',
now_window: 'Now Window',
hyperLinks: 'hyperlinks',
link_open_tips: 'Open When Panel Not In Edit Status'
}, },
plugin: { plugin: {
local_install: 'Local installation', local_install: 'Local installation',
......
...@@ -1322,7 +1322,13 @@ export default { ...@@ -1322,7 +1322,13 @@ export default {
suspension: '悬浮', suspension: '悬浮',
new_element_distribution: '当前元素移入分布方式', new_element_distribution: '当前元素移入分布方式',
subject_no_edit: '系统主题不能修改', subject_no_edit: '系统主题不能修改',
subject_name_not_null: '主题名称需要1~20字符' subject_name_not_null: '主题名称需要1~20字符',
is_enable: '是否启用',
open_mode: '打开方式',
new_window: '新窗口',
now_window: '当前窗口',
hyperLinks: '超链接',
link_open_tips: '仪表板非编辑状态可打开链接'
}, },
plugin: { plugin: {
local_install: '本地安裝', local_install: '本地安裝',
......
...@@ -1327,7 +1327,13 @@ export default { ...@@ -1327,7 +1327,13 @@ export default {
suspension: '悬浮', suspension: '悬浮',
new_element_distribution: '当前元素移入分布方式', new_element_distribution: '当前元素移入分布方式',
subject_no_edit: '系统主题不能修改', subject_no_edit: '系统主题不能修改',
subject_name_not_null: '主题名称需要1~20字符' subject_name_not_null: '主题名称需要1~20字符',
is_enable: '是否启用',
open_mode: '打开方式',
new_window: '新窗口',
now_window: '当前窗口',
hyperLinks: '超链接',
link_open_tips: '仪表板非编辑状态可打开链接'
}, },
plugin: { plugin: {
local_install: '本地安装', local_install: '本地安装',
......
...@@ -54,6 +54,18 @@ ...@@ -54,6 +54,18 @@
<div class="content unicode" style="display: block;"> <div class="content unicode" style="display: block;">
<ul class="icon_lists dib-box"> <ul class="icon_lists dib-box">
<li class="dib">
<span class="icon iconfont">&#xe9b2;</span>
<div class="name">超链接</div>
<div class="code-name">&amp;#xe9b2;</div>
</li>
<li class="dib">
<span class="icon iconfont">&#xe60f;</span>
<div class="name">科学技术</div>
<div class="code-name">&amp;#xe60f;</div>
</li>
<li class="dib"> <li class="dib">
<span class="icon iconfont">&#xe69c;</span> <span class="icon iconfont">&#xe69c;</span>
<div class="name">符号-数据矩阵</div> <div class="name">符号-数据矩阵</div>
...@@ -408,9 +420,9 @@ ...@@ -408,9 +420,9 @@
<pre><code class="language-css" <pre><code class="language-css"
>@font-face { >@font-face {
font-family: 'iconfont'; font-family: 'iconfont';
src: url('iconfont.woff2?t=1633678290478') format('woff2'), src: url('iconfont.woff2?t=1634191971474') format('woff2'),
url('iconfont.woff?t=1633678290478') format('woff'), url('iconfont.woff?t=1634191971474') format('woff'),
url('iconfont.ttf?t=1633678290478') format('truetype'); url('iconfont.ttf?t=1634191971474') format('truetype');
} }
</code></pre> </code></pre>
<h3 id="-iconfont-">第二步:定义使用 iconfont 的样式</h3> <h3 id="-iconfont-">第二步:定义使用 iconfont 的样式</h3>
...@@ -436,6 +448,24 @@ ...@@ -436,6 +448,24 @@
<div class="content font-class"> <div class="content font-class">
<ul class="icon_lists dib-box"> <ul class="icon_lists dib-box">
<li class="dib">
<span class="icon iconfont icon-chaolianjie"></span>
<div class="name">
超链接
</div>
<div class="code-name">.icon-chaolianjie
</div>
</li>
<li class="dib">
<span class="icon iconfont icon-kexuejishu"></span>
<div class="name">
科学技术
</div>
<div class="code-name">.icon-kexuejishu
</div>
</li>
<li class="dib"> <li class="dib">
<span class="icon iconfont icon-shujujuzhen"></span> <span class="icon iconfont icon-shujujuzhen"></span>
<div class="name"> <div class="name">
...@@ -967,6 +997,22 @@ ...@@ -967,6 +997,22 @@
<div class="content symbol"> <div class="content symbol">
<ul class="icon_lists dib-box"> <ul class="icon_lists dib-box">
<li class="dib">
<svg class="icon svg-icon" aria-hidden="true">
<use xlink:href="#icon-chaolianjie"></use>
</svg>
<div class="name">超链接</div>
<div class="code-name">#icon-chaolianjie</div>
</li>
<li class="dib">
<svg class="icon svg-icon" aria-hidden="true">
<use xlink:href="#icon-kexuejishu"></use>
</svg>
<div class="name">科学技术</div>
<div class="code-name">#icon-kexuejishu</div>
</li>
<li class="dib"> <li class="dib">
<svg class="icon svg-icon" aria-hidden="true"> <svg class="icon svg-icon" aria-hidden="true">
<use xlink:href="#icon-shujujuzhen"></use> <use xlink:href="#icon-shujujuzhen"></use>
......
@font-face { @font-face {
font-family: "iconfont"; /* Project id 2459092 */ font-family: "iconfont"; /* Project id 2459092 */
src: url('iconfont.woff2?t=1633678290478') format('woff2'), src: url('iconfont.woff2?t=1634191971474') format('woff2'),
url('iconfont.woff?t=1633678290478') format('woff'), url('iconfont.woff?t=1634191971474') format('woff'),
url('iconfont.ttf?t=1633678290478') format('truetype'); url('iconfont.ttf?t=1634191971474') format('truetype');
} }
.iconfont { .iconfont {
...@@ -13,6 +13,14 @@ ...@@ -13,6 +13,14 @@
-moz-osx-font-smoothing: grayscale; -moz-osx-font-smoothing: grayscale;
} }
.icon-chaolianjie:before {
content: "\e9b2";
}
.icon-kexuejishu:before {
content: "\e60f";
}
.icon-shujujuzhen:before { .icon-shujujuzhen:before {
content: "\e69c"; content: "\e69c";
} }
......
This source diff could not be displayed because it is too large. You can view the blob instead.
...@@ -5,6 +5,20 @@ ...@@ -5,6 +5,20 @@
"css_prefix_text": "icon-", "css_prefix_text": "icon-",
"description": "", "description": "",
"glyphs": [ "glyphs": [
{
"icon_id": "3229030",
"name": "超链接",
"font_class": "chaolianjie",
"unicode": "e9b2",
"unicode_decimal": 59826
},
{
"icon_id": "23880814",
"name": "科学技术",
"font_class": "kexuejishu",
"unicode": "e60f",
"unicode_decimal": 58895
},
{ {
"icon_id": "1766500", "icon_id": "1766500",
"name": "符号-数据矩阵", "name": "符号-数据矩阵",
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论