de/core/frontend/src/components/dataease/DeOutWidget.vue
2023-08-24 17:34:35 +08:00

319 lines
7.4 KiB
Vue

<template>
<div
ref="myContainer"
class="my-container"
:style="inScreen?autoStyle:''"
>
<div
ref="conditionMain"
:style="outsideStyle"
class="condition-main"
>
<div
v-if="element.options.attrs.showTitle && element.options.attrs.title"
ref="deTitleContainer"
:style="titleStyle"
class="condition-title"
>
<div class="condition-title-absolute">
<div class="first-title">
<div class="span-container">
<span ref="deTitle">{{ element.options.attrs.title }}</span>
</div>
</div>
</div>
</div>
<div
ref="deContentContainer"
class="condition-content"
:class="(element.options.attrs.showTitle && element.options.attrs.title) ? '' : 'condition-content-default'"
>
<div class="condition-content-container">
<div class="first-element">
<div
:class="element.component === 'de-select-grid' ? 'first-element-grid-container': ''"
:style="deSelectGridBg"
class="first-element-container"
>
<component
:is="element.component"
v-if="element.type==='custom'"
:id="'component' + element.id"
ref="deOutWidget"
:canvas-id="canvasId"
class="component-custom"
:out-style="element.style"
:is-relation="isRelation"
:element="element"
:in-draw="inDraw"
:in-screen="inScreen"
/>
</div>
</div>
</div>
</div>
</div>
</div>
</template>
<script>
import inputStyleMixin from '@/components/widget/deWidget/inputStyleMixin'
import { mapState } from 'vuex'
export default {
name: 'DeOutWidget',
mixins: [inputStyleMixin],
props: {
canvasId: {
type: String,
required: true
},
element: {
type: Object,
default: () => {
}
},
inDraw: {
type: Boolean,
default: true
},
inScreen: {
type: Boolean,
required: false,
default: true
},
h: {
type: Number,
default: 50
},
editMode: {
type: String,
require: false,
default: 'edit'
},
isRelation: {
type: Boolean,
default: false
},
searchCount: {
type: Number,
required: false,
default: 0
}
},
data() {
return {
needRefreshComponents: ['de-select', 'de-select-grid', 'de-select-tree'],
inputMaxSize: 46,
inputLargeSize: 42,
inputSmallSize: 38,
inputMiniSize: 32,
options: null,
showNumber: false,
mainClass: '',
mainHeight: 75,
duHeight: 46,
titleStyle: null,
outsideStyle: null
}
},
computed: {
scale() {
return this.previewCanvasScale.scalePointHeight
},
autoStyle() {
return {
height: (100 / this.scale) + '%!important',
width: (100 / this.scale) + '%!important',
left: 50 * (1 - 1 / this.scale) + '%', // 放大余量 除以 2
top: 50 * (1 - 1 / this.scale) + '%', // 放大余量 除以 2
transform: 'scale(' + this.scale + ')'
}
},
deSelectGridBg() {
if (this.element.component !== 'de-select-grid') return null
const { backgroundColorSelect, color } = this.element.commonBackground
return {
background: backgroundColorSelect ? color : '#fff',
border: backgroundColorSelect ? 'none' : '1px solid #d7dae2'
}
},
isFilterComponent() {
return ['de-select', 'de-select-grid', 'de-date', 'de-input-search', 'de-number-range', 'de-select-tree'].includes(this.element.component)
},
...mapState([
'curComponent',
'previewCanvasScale'
])
},
watch: {
'element.style': {
handler(val) {
this.handlerPositionChange(val)
},
deep: true,
immediate: true
},
// 监听外部计时器变化
searchCount: function(val1) {
// 正在操作的组件不进行刷新
if (val1 > 0 && this.needRefreshComponents.includes(this.element.component) && (!this.curComponent || this.curComponent.id !== this.element.id)) {
this.$refs['deOutWidget'].refreshLoad()
}
}
},
mounted() {
},
created() {
const { horizontal, vertical, brColor, wordColor, innerBgColor } = this.element.style
this.$set(this.element.style, 'horizontal', horizontal || 'left')
this.$set(this.element.style, 'vertical', vertical || 'center')
this.$set(this.element.style, 'brColor', brColor || '')
this.$set(this.element.style, 'wordColor', wordColor || '')
this.$set(this.element.style, 'innerBgColor', innerBgColor || '')
},
methods: {
getComponentId() {
return this.element.id
},
getCanvasId() {
return this.canvasId
},
handlerPositionChange(val) {
const { horizontal = 'left', vertical = 'center' } = val
this.titleStyle = {
width: '100%',
textAlign: horizontal
}
this.outsideStyle = {
flexDirection: 'column'
}
if (vertical !== 'top' && this.element.component !== 'de-select-grid') {
this.titleStyle = null
this.outsideStyle = {
flexDirection: horizontal === 'right' ? 'row-reverse' : '',
alignItems: 'center'
}
}
if (this.element.component === 'de-select-grid') {
this.$set(this.outsideStyle, 'flexDirection', 'column')
}
if (vertical !== 'top' && this.element.component === 'de-number-range') {
if (!this.titleStyle) {
this.titleStyle = {}
}
this.titleStyle.marginTop = '-20px'
}
},
getCondition() {
if (this.$refs && this.$refs['deOutWidget'] && this.$refs['deOutWidget'].getCondition) {
return this.$refs['deOutWidget'].getCondition()
}
return null
},
clearHandler() {
if (this.$refs && this.$refs['deOutWidget'] && this.$refs['deOutWidget'].clearHandler) {
this.$refs['deOutWidget'].clearHandler()
}
}
}
}
</script>
<style lang="scss" scoped>
.my-container {
position: relative;
overflow: auto !important;
top: 0px;
right: 0px;
bottom: 0px;
left: 0px;
}
.condition-main {
position: absolute;
overflow: hidden;
top: 0px;
right: 0px;
bottom: 0px;
left: 0px;
display: flex;
}
.condition-title {
height: 2em;
cursor: -webkit-grab;
line-height: 2em;
white-space: nowrap;
}
.span-container {
overflow: hidden auto;
position: relative;
padding: 0 5px;
}
.condition-content {
overflow: auto hidden;
letter-spacing: 0px !important;
width: 100%;
}
.condition-content-container {
position: relative;
width: 100%;
height: 100%;
white-space: nowrap;
}
.first-element {
position: relative;
margin: 0px;
padding: 0px;
height: 100%;
}
.first-element-container {
width: calc(100% - 10px);
background: initial;
margin: 0 4px;
div {
width: 100%;
}
display: flex;
align-items: flex-end;
}
.first-element-container ::v-deep .el-input__inner {
height: 40px !important;
line-height: 40px !important;
}
.first-element-grid-container {
background: #fff;
border: 1px solid #d7dae2;
top: 5px;
height: 100%;
}
.condition-main-line {
height: 40px !important;
}
.condition-main {
display: flex;
padding-top: 5px;
}
.condition-content-default {
inset: 0px 0px 0px !important;
}
</style>