【modify】使用ESLint格式化代码

This commit is contained in:
zer0Black
2023-03-01 09:33:58 +08:00
parent 694855ae8b
commit 63369b8b87
400 changed files with 42942 additions and 43132 deletions
+33 -33
View File
@@ -7,40 +7,40 @@
</template>
<script>
import Avatar from 'ant-design-vue/es/avatar'
import Tooltip from 'ant-design-vue/es/tooltip'
import Avatar from 'ant-design-vue/es/avatar'
import Tooltip from 'ant-design-vue/es/tooltip'
export default {
name: 'AvatarItem',
components: {
Avatar,
Tooltip
export default {
name: 'AvatarItem',
components: {
Avatar,
Tooltip
},
props: {
tips: {
type: String,
default: '',
required: false
},
props: {
tips: {
type: String,
default: '',
required: false
},
src: {
type: String,
default: ''
}
},
data () {
return {
size: this.$parent.size
}
},
computed: {
avatarSize () {
return this.size !== 'mini' && this.size || 20
}
},
watch: {
'$parent.size' (val) {
this.size = val
}
src: {
type: String,
default: ''
}
},
data () {
return {
size: this.$parent.size
}
},
computed: {
avatarSize () {
return this.size !== 'mini' && this.size || 20
}
},
watch: {
'$parent.size' (val) {
this.size = val
}
}
</script>
}
</script>
+68 -69
View File
@@ -5,7 +5,6 @@
<slot></slot>
<template v-for="item in filterEmpty($slots.default).slice(0, 3)"></template>
<template v-if="maxLength > 0 && filterEmpty($slots.default).length > maxLength">
<avatar-item :size="size">
<avatar :size="size !== 'mini' && size || 20" :style="excessItemsStyle">{{ `+${maxLength}` }}</avatar>
@@ -17,84 +16,84 @@
-->
<script>
import Avatar from 'ant-design-vue/es/avatar'
import AvatarItem from './Item'
import { filterEmpty } from '@/components/_util/util'
import Avatar from 'ant-design-vue/es/avatar'
import AvatarItem from './Item'
import { filterEmpty } from '@/components/_util/util'
export default {
AvatarItem,
name: 'AvatarList',
components: {
Avatar,
AvatarItem
export default {
AvatarItem,
name: 'AvatarList',
components: {
Avatar,
AvatarItem
},
props: {
prefixCls: {
type: String,
default: 'ant-pro-avatar-list'
},
props: {
prefixCls: {
type: String,
default: 'ant-pro-avatar-list'
},
/**
/**
* 头像大小 类型: large、small 、mini, default
* 默认值: default
*/
size: {
type: [String, Number],
default: 'default'
},
/**
size: {
type: [String, Number],
default: 'default'
},
/**
* 要显示的最大项目
*/
maxLength: {
type: Number,
default: 0
},
/**
maxLength: {
type: Number,
default: 0
},
/**
* 多余的项目风格
*/
excessItemsStyle: {
type: Object,
default: () => {
return {
color: '#f56a00',
backgroundColor: '#fde3cf'
}
excessItemsStyle: {
type: Object,
default: () => {
return {
color: '#f56a00',
backgroundColor: '#fde3cf'
}
}
},
data () {
return {}
},
methods: {
getItems(items) {
const classString = {
[`${this.prefixCls}-item`]: true,
[`${this.size}`]: true
}
if (this.maxLength > 0) {
items = items.slice(0, this.maxLength)
items.push((<Avatar size={ this.size } style={ this.excessItemsStyle }>{`+${this.maxLength}`}</Avatar>))
}
const itemList = items.map((item) => (
<li class={ classString }>{ item }</li>
))
return itemList
}
},
render () {
const { prefixCls, size } = this.$props
const classString = {
[`${prefixCls}`]: true,
[`${size}`]: true,
}
const items = filterEmpty(this.$slots.default)
const itemsDom = items && items.length ? <ul class={`${prefixCls}-items`}>{ this.getItems(items) }</ul> : null
return (
<div class={ classString }>
{ itemsDom }
</div>
)
}
},
data () {
return {}
},
methods: {
getItems (items) {
const classString = {
[`${this.prefixCls}-item`]: true,
[`${this.size}`]: true
}
if (this.maxLength > 0) {
items = items.slice(0, this.maxLength)
items.push((<Avatar size={ this.size } style={ this.excessItemsStyle }>{`+${this.maxLength}`}</Avatar>))
}
const itemList = items.map((item) => (
<li class={ classString }>{ item }</li>
))
return itemList
}
},
render () {
const { prefixCls, size } = this.$props
const classString = {
[`${prefixCls}`]: true,
[`${size}`]: true
}
const items = filterEmpty(this.$slots.default)
const itemsDom = items && items.length ? <ul class={`${prefixCls}-items`}>{ this.getItems(items) }</ul> : null
return (
<div class={ classString }>
{ itemsDom }
</div>
)
}
</script>
}
</script>
+87 -87
View File
@@ -6,98 +6,98 @@
<script>
function fixedZero(val) {
return val * 1 < 10 ? `0${val}` : val;
}
function fixedZero (val) {
return val * 1 < 10 ? `0${val}` : val
}
export default {
name: "CountDown",
props: {
format: {
type: Function,
default: undefined
},
target: {
type: [Date, Number],
required: true,
},
onEnd: {
type: Function,
default: () => {
}
export default {
name: 'CountDown',
props: {
format: {
type: Function,
default: undefined
},
target: {
type: [Date, Number],
required: true
},
onEnd: {
type: Function,
default: () => {
}
},
data() {
return {
dateTime: '0',
originTargetTime: 0,
lastTime: 0,
timer: 0,
interval: 1000
}
},
filters: {
format(time) {
const hours = 60 * 60 * 1000;
const minutes = 60 * 1000;
const h = Math.floor(time / hours);
const m = Math.floor((time - h * hours) / minutes);
const s = Math.floor((time - h * hours - m * minutes) / 1000);
return `${fixedZero(h)}:${fixedZero(m)}:${fixedZero(s)}`
}
},
created() {
this.initTime()
this.tick()
},
methods: {
initTime() {
let lastTime = 0;
let targetTime = 0;
this.originTargetTime = this.target
try {
if (Object.prototype.toString.call(this.target) === '[object Date]') {
targetTime = this.target
} else {
targetTime = new Date(this.target).getTime()
}
} catch (e) {
throw new Error('invalid target prop')
}
lastTime = targetTime - new Date().getTime();
this.lastTime = lastTime < 0 ? 0 : lastTime
},
tick() {
const {onEnd} = this
this.timer = setTimeout(() => {
if (this.lastTime < this.interval) {
clearTimeout(this.timer)
this.lastTime = 0
if (typeof onEnd === 'function') {
onEnd();
}
} else {
this.lastTime -= this.interval
this.tick()
}
}, this.interval)
}
},
beforeUpdate () {
if (this.originTargetTime !== this.target) {
this.initTime()
}
},
beforeDestroy() {
clearTimeout(this.timer)
}
},
data () {
return {
dateTime: '0',
originTargetTime: 0,
lastTime: 0,
timer: 0,
interval: 1000
}
},
filters: {
format (time) {
const hours = 60 * 60 * 1000
const minutes = 60 * 1000
const h = Math.floor(time / hours)
const m = Math.floor((time - h * hours) / minutes)
const s = Math.floor((time - h * hours - m * minutes) / 1000)
return `${fixedZero(h)}:${fixedZero(m)}:${fixedZero(s)}`
}
},
created () {
this.initTime()
this.tick()
},
methods: {
initTime () {
let lastTime = 0
let targetTime = 0
this.originTargetTime = this.target
try {
if (Object.prototype.toString.call(this.target) === '[object Date]') {
targetTime = this.target
} else {
targetTime = new Date(this.target).getTime()
}
} catch (e) {
throw new Error('invalid target prop')
}
lastTime = targetTime - new Date().getTime()
this.lastTime = lastTime < 0 ? 0 : lastTime
},
tick () {
const { onEnd } = this
this.timer = setTimeout(() => {
if (this.lastTime < this.interval) {
clearTimeout(this.timer)
this.lastTime = 0
if (typeof onEnd === 'function') {
onEnd()
}
} else {
this.lastTime -= this.interval
this.tick()
}
}, this.interval)
}
},
beforeUpdate () {
if (this.originTargetTime !== this.target) {
this.initTime()
}
},
beforeDestroy () {
clearTimeout(this.timer)
}
}
</script>
<style scoped>
</style>
</style>
+1 -1
View File
@@ -1,3 +1,3 @@
import CountDown from './CountDown'
export default CountDown
export default CountDown
+44 -44
View File
@@ -1,49 +1,49 @@
<script>
import { cutStrByFullLength, getStrFullLength } from '@/components/_util/StringUtil'
import { cutStrByFullLength, getStrFullLength } from '@/components/_util/StringUtil'
export default {
name: 'Ellipsis',
props: {
prefixCls: {
type: String,
default: 'ant-pro-ellipsis'
},
tooltip: {
type: Boolean,
default: true,
},
length: {
type: Number,
default: 25,
},
lines: {
type: Number,
default: 1
},
fullWidthRecognition: {
type: Boolean,
default: false
}
export default {
name: 'Ellipsis',
props: {
prefixCls: {
type: String,
default: 'ant-pro-ellipsis'
},
methods: {},
render() {
const { tooltip, length } = this.$props
let text = ''
// 处理没有default插槽时的特殊情况
if (this.$slots.default) {
text = this.$slots.default.map(vNode => vNode.text).join('')
}
// 判断是否显示 tooltip
if (tooltip && getStrFullLength(text) > length) {
return (
<a-tooltip>
<template slot="title">{text}</template>
<span>{cutStrByFullLength(text, this.length) + '…'}</span>
</a-tooltip>
)
} else {
return (<span>{text}</span>)
}
tooltip: {
type: Boolean,
default: true
},
length: {
type: Number,
default: 25
},
lines: {
type: Number,
default: 1
},
fullWidthRecognition: {
type: Boolean,
default: false
}
},
methods: {},
render () {
const { tooltip, length } = this.$props
let text = ''
// 处理没有default插槽时的特殊情况
if (this.$slots.default) {
text = this.$slots.default.map(vNode => vNode.text).join('')
}
// 判断是否显示 tooltip
if (tooltip && getStrFullLength(text) > length) {
return (
<a-tooltip>
<template slot="title">{text}</template>
<span>{cutStrByFullLength(text, this.length) + '…'}</span>
</a-tooltip>
)
} else {
return (<span>{text}</span>)
}
}
</script>
}
</script>
+1 -1
View File
@@ -1,3 +1,3 @@
import Ellipsis from './Ellipsis'
export default Ellipsis
export default Ellipsis
+152 -152
View File
@@ -60,168 +60,168 @@
</template>
<script>
import { getFileAccessHttpUrl } from '@api/manage'
import JVxeCellMixins from '@/components/jero/JVxeTable/mixins/JVxeCellMixins'
import { ACCESS_TOKEN } from '@/store/mutation-types'
import JFilePop from '@/components/jero/minipop/JFilePop'
import { getFileAccessHttpUrl } from '@api/manage'
import JVxeCellMixins from '@/components/jero/JVxeTable/mixins/JVxeCellMixins'
import { ACCESS_TOKEN } from '@/store/mutation-types'
import JFilePop from '@/components/jero/minipop/JFilePop'
import JVxeUploadCell from '@/components/jero/JVxeTable/components/cells/JVxeUploadCell'
import JVxeUploadCell from '@/components/jero/JVxeTable/components/cells/JVxeUploadCell'
export default {
name: 'JVxeFileCell',
mixins: [JVxeCellMixins],
components: {JFilePop},
props: {},
data() {
return {
innerFile: null,
number:0,
export default {
name: 'JVxeFileCell',
mixins: [JVxeCellMixins],
components: { JFilePop },
props: {},
data () {
return {
innerFile: null,
number: 0
}
},
computed: {
/** upload headers */
uploadHeaders () {
const { originColumn: col } = this
const headers = {}
if (col.token === true) {
headers['X-Access-Token'] = this.$ls.get(ACCESS_TOKEN)
}
return headers
},
/** 上传请求地址 */
uploadAction () {
if (!this.originColumn.action) {
return window._CONFIG.domianURL + '/sys/common/upload'
} else {
return this.originColumn.action
}
},
computed: {
/** upload headers */
uploadHeaders() {
let {originColumn: col} = this
let headers = {}
if (col.token === true) {
headers['X-Access-Token'] = this.$ls.get(ACCESS_TOKEN)
}
return headers
},
/** 上传请求地址 */
uploadAction() {
if (!this.originColumn.action) {
return window._CONFIG['domianURL'] + '/sys/common/upload'
} else {
return this.originColumn.action
}
},
hasFile() {
return this.innerFile != null
},
ellipsisFileName() {
let length = 5
let file = this.innerFile
if (!file || !file.name) {
return ''
}
if (file.name.length > length) {
return file.name.substr(0, length) + '…'
}
return file.name
},
responseName() {
if (this.originColumn.responseName) {
return this.originColumn.responseName
} else {
return 'message'
}
},
hasFile () {
return this.innerFile != null
},
watch: {
innerValue: {
immediate: true,
handler() {
if (this.innerValue) {
this.innerFile = this.innerValue
} else {
this.innerFile = null
}
},
},
ellipsisFileName () {
const length = 5
const file = this.innerFile
if (!file || !file.name) {
return ''
}
if (file.name.length > length) {
return file.name.substr(0, length) + '…'
}
return file.name
},
methods: {
// 点击更多按钮
handleMoreOperation(originColumn) {
//update-begin-author:wangshuai date:20201021 for:LOWCOD-969 判断传过来的字段是否存在number,用于控制上传文件
if (originColumn.number) {
this.number = originColumn.number
} else {
this.number = 0
}
//update-end-author:wangshuai date:20201021 for:LOWCOD-969 判断传过来的字段是否存在number,用于控制上传文件
if(originColumn && originColumn.fieldExtendJson){
let json = JSON.parse(originColumn.fieldExtendJson);
this.number = json.uploadnum?json.uploadnum:0;
}
let path = ''
if (this.innerFile) {
path = this.innerFile.path
}
this.$refs.filePop.show('', path)
},
// 更多上传回调
handleFileSuccess(file) {
if (file) {
this.innerFile.path = file.path
this.handleChangeCommon(this.innerFile)
}
},
handleChangeUpload(info) {
let {originColumn: col} = this
let {file} = info
let value = {
name: file.name,
type: file.type,
size: file.size,
status: file.status,
percent: file.percent
}
if (file.response) {
value['responseName'] = file.response[this.responseName]
}
if (file.status === 'done') {
if (typeof file.response.success === 'boolean') {
if (file.response.success) {
value['path'] = file.response[this.responseName]
this.handleChangeCommon(value)
} else {
value['status'] = 'error'
value['message'] = file.response.message || '未知错误'
}
} else {
// 考虑到如果设置action上传路径为非jeecg-boot后台,可能不会返回 success 属性的情况,就默认为成功
value['path'] = file.response[this.responseName]
this.handleChangeCommon(value)
}
} else if (file.status === 'error') {
value['message'] = file.response.message || '未知错误'
}
this.innerFile = value
},
handleClickDownloadFile() {
let {url, path} = this.innerFile || {}
if (!url || url.length === 0) {
if (path && path.length > 0) {
url = getFileAccessHttpUrl(path.split(',')[0])
}
}
if (url) {
window.open(url)
}
},
handleClickDeleteFile() {
this.handleChangeCommon(null)
},
},
// 【组件增强】注释详见:JVxeCellMixins.js
enhanced: {
switches: {visible: true},
getValue: value => JVxeUploadCell.enhanced.getValue(value),
setValue: value => JVxeUploadCell.enhanced.setValue(value),
responseName () {
if (this.originColumn.responseName) {
return this.originColumn.responseName
} else {
return 'message'
}
}
},
watch: {
innerValue: {
immediate: true,
handler () {
if (this.innerValue) {
this.innerFile = this.innerValue
} else {
this.innerFile = null
}
}
}
},
methods: {
// 点击更多按钮
handleMoreOperation (originColumn) {
// update-begin-author:wangshuai date:20201021 for:LOWCOD-969 判断传过来的字段是否存在number,用于控制上传文件
if (originColumn.number) {
this.number = originColumn.number
} else {
this.number = 0
}
// update-end-author:wangshuai date:20201021 for:LOWCOD-969 判断传过来的字段是否存在number,用于控制上传文件
if (originColumn && originColumn.fieldExtendJson) {
const json = JSON.parse(originColumn.fieldExtendJson)
this.number = json.uploadnum ? json.uploadnum : 0
}
let path = ''
if (this.innerFile) {
path = this.innerFile.path
}
this.$refs.filePop.show('', path)
},
// 更多上传回调
handleFileSuccess (file) {
if (file) {
this.innerFile.path = file.path
this.handleChangeCommon(this.innerFile)
}
},
handleChangeUpload (info) {
const { originColumn: col } = this
const { file } = info
const value = {
name: file.name,
type: file.type,
size: file.size,
status: file.status,
percent: file.percent
}
if (file.response) {
value.responseName = file.response[this.responseName]
}
if (file.status === 'done') {
if (typeof file.response.success === 'boolean') {
if (file.response.success) {
value.path = file.response[this.responseName]
this.handleChangeCommon(value)
} else {
value.status = 'error'
value.message = file.response.message || '未知错误'
}
} else {
// 考虑到如果设置action上传路径为非jeecg-boot后台,可能不会返回 success 属性的情况,就默认为成功
value.path = file.response[this.responseName]
this.handleChangeCommon(value)
}
} else if (file.status === 'error') {
value.message = file.response.message || '未知错误'
}
this.innerFile = value
},
handleClickDownloadFile () {
let { url, path } = this.innerFile || {}
if (!url || url.length === 0) {
if (path && path.length > 0) {
url = getFileAccessHttpUrl(path.split(',')[0])
}
}
if (url) {
window.open(url)
}
},
handleClickDeleteFile () {
this.handleChangeCommon(null)
}
},
// 【组件增强】注释详见:JVxeCellMixins.js
enhanced: {
switches: { visible: true },
getValue: value => JVxeUploadCell.enhanced.getValue(value),
setValue: value => JVxeUploadCell.enhanced.setValue(value)
}
}
</script>
<style scoped lang="less">
@@ -67,19 +67,19 @@ import JVxeUploadCell from '@/components/jero/JVxeTable/components/cells/JVxeUpl
export default {
name: 'JVxeImageCell',
mixins: [JVxeCellMixins],
components: {JFilePop},
components: { JFilePop },
props: {},
data() {
data () {
return {
innerFile: null,
number:0
number: 0
}
},
computed: {
/** upload headers */
uploadHeaders() {
let {originColumn: col} = this
let headers = {}
uploadHeaders () {
const { originColumn: col } = this
const headers = {}
if (col.token === true) {
headers['X-Access-Token'] = this.$ls.get(ACCESS_TOKEN)
}
@@ -87,66 +87,66 @@ export default {
},
/** 上传请求地址 */
uploadAction() {
uploadAction () {
if (!this.originColumn.action) {
return window._CONFIG['domianURL'] + '/sys/common/upload'
return window._CONFIG.domianURL + '/sys/common/upload'
} else {
return this.originColumn.action
}
},
hasFile() {
hasFile () {
return this.innerFile != null
},
/** 预览图片地址 */
imgSrc() {
imgSrc () {
if (this.innerFile) {
if (this.innerFile['url']) {
return this.innerFile['url']
} else if (this.innerFile['path']) {
let path = this.innerFile['path'].split(',')[0]
if (this.innerFile.url) {
return this.innerFile.url
} else if (this.innerFile.path) {
const path = this.innerFile.path.split(',')[0]
return getFileAccessHttpUrl(path)
}
}
return ''
},
responseName() {
responseName () {
if (this.originColumn.responseName) {
return this.originColumn.responseName
} else {
return 'message'
}
},
}
},
watch: {
innerValue: {
immediate: true,
handler() {
handler () {
if (this.innerValue) {
this.innerFile = this.innerValue
} else {
this.innerFile = null
}
},
},
}
}
},
methods: {
// 点击更多按钮
handleMoreOperation(originColumn) {
//update-begin-author:wangshuai date:20201021 for:LOWCOD-969 判断传过来的字段是否存在number,用于控制上传文件
handleMoreOperation (originColumn) {
// update-begin-author:wangshuai date:20201021 for:LOWCOD-969 判断传过来的字段是否存在number,用于控制上传文件
if (originColumn.number) {
this.number = originColumn.number
} else {
this.number = 0
}
//update-end-author:wangshuai date:20201021 for:LOWCOD-969 判断传过来的字段是否存在number,用于控制上传文件
if(originColumn && originColumn.fieldExtendJson){
let json = JSON.parse(originColumn.fieldExtendJson);
this.number = json.uploadnum?json.uploadnum:0;
// update-end-author:wangshuai date:20201021 for:LOWCOD-969 判断传过来的字段是否存在number,用于控制上传文件
if (originColumn && originColumn.fieldExtendJson) {
const json = JSON.parse(originColumn.fieldExtendJson)
this.number = json.uploadnum ? json.uploadnum : 0
}
let path = ''
if (this.innerFile) {
@@ -156,7 +156,7 @@ export default {
},
// 更多上传回调
handleFileSuccess(file) {
handleFileSuccess (file) {
if (file) {
this.innerFile.path = file.path
this.handleChangeCommon(this.innerFile)
@@ -164,17 +164,17 @@ export default {
},
// 弹出上传出错详细信息
handleClickShowImageError() {
let file = this.innerFile || null
if (file && file['message']) {
this.$error({title: '上传出错', content: '错误信息:' + file['message'], maskClosable: true})
handleClickShowImageError () {
const file = this.innerFile || null
if (file && file.message) {
this.$error({ title: '上传出错', content: '错误信息:' + file.message, maskClosable: true })
}
},
handleChangeUpload(info) {
let {originColumn: col} = this
let {file} = info
let value = {
handleChangeUpload (info) {
const { originColumn: col } = this
const { file } = info
const value = {
name: file.name,
type: file.type,
size: file.size,
@@ -182,44 +182,44 @@ export default {
percent: file.percent
}
if (file.response) {
value['responseName'] = file.response[this.responseName]
value.responseName = file.response[this.responseName]
}
if (file.status === 'done') {
if (typeof file.response.success === 'boolean') {
if (file.response.success) {
value['path'] = file.response[this.responseName]
value.path = file.response[this.responseName]
this.handleChangeCommon(value)
} else {
value['status'] = 'error'
value['message'] = file.response.message || '未知错误'
value.status = 'error'
value.message = file.response.message || '未知错误'
}
} else {
// 考虑到如果设置action上传路径为非jeecg-boot后台,可能不会返回 success 属性的情况,就默认为成功
value['path'] = file.response[this.responseName]
value.path = file.response[this.responseName]
this.handleChangeCommon(value)
}
} else if (file.status === 'error') {
value['message'] = file.response.message || '未知错误'
value.message = file.response.message || '未知错误'
}
this.innerFile = value
},
handleClickDownloadFile() {
handleClickDownloadFile () {
if (this.imgSrc) {
window.open(this.imgSrc)
}
},
handleClickDeleteFile() {
handleClickDeleteFile () {
this.handleChangeCommon(null)
},
}
},
// 【组件增强】注释详见:JVxeCellMixins.js
enhanced: {
switches: {visible: true},
switches: { visible: true },
getValue: value => JVxeUploadCell.enhanced.getValue(value),
setValue: value => JVxeUploadCell.enhanced.setValue(value),
setValue: value => JVxeUploadCell.enhanced.setValue(value)
}
}
</script>
@@ -6,58 +6,58 @@
</template>
<script>
import JVxeCellMixins, { dispatchEvent, vModel } from '@/components/jero/JVxeTable/mixins/JVxeCellMixins'
import JVxeCellMixins, { dispatchEvent, vModel } from '@/components/jero/JVxeTable/mixins/JVxeCellMixins'
export default {
name: 'JVxePopupCell',
mixins: [JVxeCellMixins],
computed: {
popupProps() {
const {innerValue, originColumn: col, caseId, cellProps} = this
return {
...cellProps,
value: innerValue,
field: col.field || col.key,
code: col.popupCode,
orgFields: col.orgFields,
destFields: col.destFields,
groupId: caseId,
param: col.param,
sorter: col.sorter,
}
},
},
methods: {
/** popup回调 */
handlePopupInput(value, others) {
const {row, originColumn: col} = this
// 存储输入的值
let popupValue = value
if (others && Object.keys(others).length > 0) {
Object.keys(others).forEach(key => {
let currentValue = others[key]
// 当前列直接赋值,其他列通过vModel赋值
if (key === col.key) {
popupValue = currentValue
} else {
vModel.call(this, currentValue, row, key)
}
})
}
this.handleChangeCommon(popupValue)
},
},
// 【组件增强】注释详见:JVxeCellMixins.js
enhanced: {
aopEvents: {
editActived(event) {
dispatchEvent.call(this, event, 'ant-input')
},
},
},
export default {
name: 'JVxePopupCell',
mixins: [JVxeCellMixins],
computed: {
popupProps () {
const { innerValue, originColumn: col, caseId, cellProps } = this
return {
...cellProps,
value: innerValue,
field: col.field || col.key,
code: col.popupCode,
orgFields: col.orgFields,
destFields: col.destFields,
groupId: caseId,
param: col.param,
sorter: col.sorter
}
}
},
methods: {
/** popup回调 */
handlePopupInput (value, others) {
const { row, originColumn: col } = this
// 存储输入的值
let popupValue = value
if (others && Object.keys(others).length > 0) {
Object.keys(others).forEach(key => {
const currentValue = others[key]
// 当前列直接赋值,其他列通过vModel赋值
if (key === col.key) {
popupValue = currentValue
} else {
vModel.call(this, currentValue, row, key)
}
})
}
this.handleChangeCommon(popupValue)
}
},
// 【组件增强】注释详见:JVxeCellMixins.js
enhanced: {
aopEvents: {
editActived (event) {
dispatchEvent.call(this, event, 'ant-input')
}
}
}
}
</script>
<style scoped>
</style>
</style>
@@ -16,37 +16,37 @@
</template>
<script>
import JVxeCellMixins from '@/components/jero/JVxeTable/mixins/JVxeCellMixins'
import JVxeCellMixins from '@/components/jero/JVxeTable/mixins/JVxeCellMixins'
export default {
name: 'JVxeRadioCell',
mixins: [JVxeCellMixins],
computed: {
scrolling() {
return !!this.renderOptions.scrolling
},
clazz() {
return {
'j-vxe-radio': true,
'no-animation': this.scrolling
}
},
export default {
name: 'JVxeRadioCell',
mixins: [JVxeCellMixins],
computed: {
scrolling () {
return !!this.renderOptions.scrolling
},
methods: {
handleRadioClick(item) {
if (this.originColumn.allowClear === true) {
// 取消选择
if (item.value === this.innerValue) {
this.handleChangeCommon(null)
}
}
},
},
// 【组件增强】注释详见:JVxeCellMixins.js
enhanced: {
switches: {visible: true},
clazz () {
return {
'j-vxe-radio': true,
'no-animation': this.scrolling
}
}
},
methods: {
handleRadioClick (item) {
if (this.originColumn.allowClear === true) {
// 取消选择
if (item.value === this.innerValue) {
this.handleChangeCommon(null)
}
}
}
},
// 【组件增强】注释详见:JVxeCellMixins.js
enhanced: {
switches: { visible: true }
}
}
</script>
<style lang="less">
@@ -57,4 +57,4 @@
transition: none !important;
}
}
</style>
</style>
@@ -11,19 +11,19 @@ const common = {
labelMap: new Map(),
/** 公共data */
data() {
data () {
return {
loading: false,
innerSelectValue: null,
innerOptions: [],
innerOptions: []
}
},
/** 公共计算属性 */
computed: {
dict() {
dict () {
return this.originColumn.dict
},
options() {
options () {
if (this.isAsync) {
return this.innerOptions
} else {
@@ -31,16 +31,16 @@ const common = {
}
},
// 是否是异步模式
isAsync() {
let isAsync = this.originColumn.async
isAsync () {
const isAsync = this.originColumn.async
return (isAsync != null && isAsync !== '') ? !!isAsync : true
},
}
},
/** 公共属性监听 */
watch: {
innerValue: {
immediate: true,
handler(value) {
handler (value) {
if (value == null || value === '') {
this.innerSelectValue = null
} else {
@@ -48,7 +48,7 @@ const common = {
}
}
},
dict() {
dict () {
this.loadDataByDict()
}
},
@@ -56,15 +56,15 @@ const common = {
methods: {
// 根据 value 查询数据,用于回显
async loadDataByValue(value) {
async loadDataByValue (value) {
if (this.isAsync) {
if (this.innerSelectValue !== value) {
if (common.labelMap.has(value)) {
this.innerOptions = cloneObject(common.labelMap.get(value))
} else {
let {success, result} = await getAction(`/sys/dict/loadDictItem/${this.dict}`, {key: value})
const { success, result } = await getAction(`/sys/dict/loadDictItem/${this.dict}`, { key: value })
if (success && result && result.length > 0) {
this.innerOptions = [{value: value, text: result[0]}]
this.innerOptions = [{ value: value, text: result[0] }]
common.labelMap.set(value, cloneObject(this.innerOptions))
}
}
@@ -74,38 +74,38 @@ const common = {
},
// 初始化字典
async loadDataByDict() {
async loadDataByDict () {
if (!this.isAsync) {
// 如果字典项集合有数据
if (!this.originColumn.options || this.originColumn.options.length === 0) {
// 根据字典Code, 初始化字典数组
let dictStr = ''
if (this.dict) {
let arr = this.dict.split(',')
const arr = this.dict.split(',')
if (arr[0].indexOf('where') > 0) {
let tbInfo = arr[0].split('where')
const tbInfo = arr[0].split('where')
dictStr = tbInfo[0].trim() + ',' + arr[1] + ',' + arr[2] + ',' + encodeURIComponent(tbInfo[1])
} else {
dictStr = this.dict
}
if (this.dict.indexOf(',') === -1) {
//优先从缓存中读取字典配置
let cache = getDictItemsFromCache(this.dict)
// 优先从缓存中读取字典配置
const cache = getDictItemsFromCache(this.dict)
if (cache) {
this.innerOptions = cache
return
}
}
let {success, result} = await ajaxGetDictItems(dictStr, null)
const { success, result } = await ajaxGetDictItems(dictStr, null)
if (success) {
this.innerOptions = result
}
}
}
}
},
}
},
}
}
@@ -113,25 +113,25 @@ const common = {
export const DictSearchSpanCell = {
name: 'JVxeSelectSearchSpanCell',
mixins: [JVxeCellMixins],
data() {
data () {
return {
...common.data.apply(this),
...common.data.apply(this)
}
},
computed: {
...common.computed,
...common.computed
},
watch: {
...common.watch,
...common.watch
},
methods: {
...common.methods,
...common.methods
},
render(h) {
render (h) {
return h('span', {}, [
filterDictText(this.innerOptions, this.innerSelectValue || this.innerValue)
])
},
}
}
// 请求id
@@ -141,7 +141,7 @@ let requestId = 0
export const DictSearchInputCell = {
name: 'JVxeSelectSearchInputCell',
mixins: [JVxeCellMixins],
data() {
data () {
return {
...common.data.apply(this),
@@ -161,26 +161,26 @@ export const DictSearchInputCell = {
},
computed: {
...common.computed,
tipsContent() {
tipsContent () {
return this.originColumn.tipsContent || '请输入搜索内容'
},
filterOption() {
filterOption () {
if (this.isAsync) {
return null
}
return (input, option) => option.componentOptions.children[0].text.toLowerCase().indexOf(input.toLowerCase()) >= 0
},
}
},
watch: {
...common.watch,
...common.watch
},
created() {
this.loadData = debounce(this.loadData, 300)//消抖
created () {
this.loadData = debounce(this.loadData, 300)// 消抖
},
methods: {
...common.methods,
loadData(value) {
loadData (value) {
const currentRequestId = ++requestId
this.loading = true
this.innerOptions = []
@@ -191,11 +191,11 @@ export const DictSearchInputCell = {
}
// 字典code格式:table,text,code
this.hasRequest = true
getAction(`/sys/dict/loadDict/${this.dict}`, {keyword: value}).then(res => {
getAction(`/sys/dict/loadDict/${this.dict}`, { keyword: value }).then(res => {
if (currentRequestId !== requestId) {
return
}
let {success, result, message} = res
const { success, result, message } = res
if (success) {
this.innerOptions = result
result.forEach((item) => {
@@ -209,11 +209,11 @@ export const DictSearchInputCell = {
})
},
handleChange(selectedValue) {
handleChange (selectedValue) {
this.innerSelectValue = selectedValue
this.handleChangeCommon(this.innerSelectValue)
},
handleSearch(value) {
handleSearch (value) {
if (this.isAsync) {
// 在输入时也应该开启加载,因为loadData加了消抖,所以会有800ms的用户主观上认为的卡顿时间
this.loading = true
@@ -224,17 +224,17 @@ export const DictSearchInputCell = {
}
},
renderOptionItem() {
let options = []
this.options.forEach(({value, text, label, title, disabled}) => {
renderOptionItem () {
const options = []
this.options.forEach(({ value, text, label, title, disabled }) => {
options.push(
<a-select-option key={value} value={value} disabled={disabled}>{text || label || title}</a-select-option>
)
})
return options
},
}
},
render() {
render () {
return (
<a-select
showSearch
@@ -254,9 +254,9 @@ export const DictSearchInputCell = {
// 【组件增强】注释详见:JVxeCellMixins.js
enhanced: {
aopEvents: {
editActived(event) {
editActived (event) {
dispatchEvent.call(this, event, 'ant-select')
},
},
}
}
}
}
}
+18 -18
View File
@@ -11,31 +11,31 @@
</template>
<script>
export default {
name: "Trend",
props: {
prefixCls: {
type: String,
default: 'ant-pro-trend'
},
/**
export default {
name: 'Trend',
props: {
prefixCls: {
type: String,
default: 'ant-pro-trend'
},
/**
* 上升下降标识:up|down
*/
flag: {
type: String,
required: true
},
/**
flag: {
type: String,
required: true
},
/**
* 颜色反转
*/
reverseColor: {
type: Boolean,
default: false
}
reverseColor: {
type: Boolean,
default: false
}
}
}
</script>
<style lang="less" scoped>
@import "index";
</style>
</style>
+1 -1
View File
@@ -1,3 +1,3 @@
import Trend from './Trend.vue'
export default Trend
export default Trend
+38 -40
View File
@@ -7,79 +7,77 @@ export default class Area {
* 构造器
* @param express
*/
constructor(pcaa) {
if(!pcaa){
pcaa = Vue.prototype.$Jpcaa;
constructor (pcaa) {
if (!pcaa) {
pcaa = Vue.prototype.$Jpcaa
}
let arr = []
const arr = []
const province = pcaa['86']
Object.keys(province).map(key=>{
arr.push({id:key, text:province[key], pid:'86', index:1});
const city = pcaa[key];
Object.keys(city).map(key2=>{
arr.push({id:key2, text:city[key2], pid:key, index:2});
const qu = pcaa[key2];
if(qu){
Object.keys(qu).map(key3=>{
arr.push({id:key3, text:qu[key3], pid:key2, index:3});
Object.keys(province).map(key => {
arr.push({ id: key, text: province[key], pid: '86', index: 1 })
const city = pcaa[key]
Object.keys(city).map(key2 => {
arr.push({ id: key2, text: city[key2], pid: key, index: 2 })
const qu = pcaa[key2]
if (qu) {
Object.keys(qu).map(key3 => {
arr.push({ id: key3, text: qu[key3], pid: key2, index: 3 })
})
}
})
})
this.all = arr;
this.all = arr
}
get pca(){
return this.all;
get pca () {
return this.all
}
getCode(text){
if(!text || text.length==0){
getCode (text) {
if (!text || text.length == 0) {
return ''
}
for(let item of this.all){
if(item.text === text){
return item.id;
for (const item of this.all) {
if (item.text === text) {
return item.id
}
}
}
getText(code){
if(!code || code.length==0){
getText (code) {
if (!code || code.length == 0) {
return ''
}
let arr = []
this.getAreaBycode(code, arr, 3);
const arr = []
this.getAreaBycode(code, arr, 3)
return arr.join('/')
}
getRealCode(code){
let arr = []
getRealCode (code) {
const arr = []
this.getPcode(code, arr, 3)
return arr;
return arr
}
getPcode(id, arr, index){
for(let item of this.all){
if(item.id === id && item.index == index){
getPcode (id, arr, index) {
for (const item of this.all) {
if (item.id === id && item.index == index) {
arr.unshift(id)
if(item.pid != '86'){
if (item.pid != '86') {
this.getPcode(item.pid, arr, --index)
}
}
}
}
getAreaBycode(code, arr, index){
for(let item of this.all){
if(item.id === code && item.index == index){
arr.unshift(item.text);
if(item.pid != '86'){
getAreaBycode (code, arr, index) {
for (const item of this.all) {
if (item.id === code && item.index == index) {
arr.unshift(item.text)
if (item.pid != '86') {
this.getAreaBycode(item.pid, arr, --index)
}
}
}
}
}
}
+7 -7
View File
@@ -35,12 +35,12 @@ export const cutStrByFullLength = (str = '', maxLength) => {
}
// 下划线转换驼峰
export function underLinetoHump(name) {
return name.replace(/\_(\w)/g, function(all, letter){
return letter.toUpperCase();
});
export function underLinetoHump (name) {
return name.replace(/\_(\w)/g, function (all, letter) {
return letter.toUpperCase()
})
}
// 驼峰转换下划线
export function humptoUnderLine(name) {
return name.replace(/([A-Z])/g,"_$1").toLowerCase();
}
export function humptoUnderLine (name) {
return name.replace(/([A-Z])/g, '_$1').toLowerCase()
}
+1 -1
View File
@@ -9,4 +9,4 @@
*/
export function filterEmpty (children = []) {
return children.filter(c => c.tag || (c.text && c.text.trim() !== ''))
}
}
+64 -64
View File
@@ -13,76 +13,76 @@
</template>
<script>
import { triggerWindowResizeEvent } from '@/utils/util'
import { triggerWindowResizeEvent } from '@/utils/util'
export default {
name: 'AreaChartTy',
props: {
// 图表数据
dataSource: {
type: Array,
required: true
},
// 图表标题
title: {
type: String,
default: ''
},
// x 轴别名
x: {
type: String,
default: 'x'
},
// y 轴别名
y: {
type: String,
default: 'y'
},
// Y轴最小值
min: {
type: Number,
default: 0
},
// Y轴最大值
max: {
type: Number,
default: null
},
// 图表高度
height: {
type: Number,
default: 254
},
// 线的粗细
lineSize: {
type: Number,
default: 2
},
// 面积的颜色
color: {
type: String,
default: ''
},
// 线的颜色
lineColor: {
type: String,
default: ''
}
export default {
name: 'AreaChartTy',
props: {
// 图表数据
dataSource: {
type: Array,
required: true
},
computed: {
scale() {
return [
{ dataKey: 'x', title: this.x, alias: this.x },
{ dataKey: 'y', title: this.y, alias: this.y, min: this.min, max: this.max }
]
}
// 图表标题
title: {
type: String,
default: ''
},
mounted() {
triggerWindowResizeEvent()
// x 轴别名
x: {
type: String,
default: 'x'
},
// y 轴别名
y: {
type: String,
default: 'y'
},
// Y轴最小值
min: {
type: Number,
default: 0
},
// Y轴最大值
max: {
type: Number,
default: null
},
// 图表高度
height: {
type: Number,
default: 254
},
// 线的粗细
lineSize: {
type: Number,
default: 2
},
// 面积的颜色
color: {
type: String,
default: ''
},
// 线的颜色
lineColor: {
type: String,
default: ''
}
},
computed: {
scale () {
return [
{ dataKey: 'x', title: this.x, alias: this.x },
{ dataKey: 'y', title: this.y, alias: this.y, min: this.min, max: this.max }
]
}
},
mounted () {
triggerWindowResizeEvent()
}
}
</script>
<style lang="less" scoped>
@import "chart";
</style>
</style>
+32 -32
View File
@@ -10,41 +10,41 @@
</template>
<script>
import { triggerWindowResizeEvent } from '@/utils/util'
import { triggerWindowResizeEvent } from '@/utils/util'
export default {
name: 'Bar',
props: {
dataSource: {
type: Array,
required: true
},
yaxisText: {
type: String,
default: 'y'
},
title: {
type: String,
default: ''
},
height: {
type: Number,
default: 254
}
export default {
name: 'Bar',
props: {
dataSource: {
type: Array,
required: true
},
data() {
return { padding: ['auto', 'auto', '40', '50'] }
yaxisText: {
type: String,
default: 'y'
},
computed: {
scale() {
return [{
dataKey: 'y',
alias: this.yaxisText
}]
}
title: {
type: String,
default: ''
},
mounted() {
triggerWindowResizeEvent()
height: {
type: Number,
default: 254
}
},
data () {
return { padding: ['auto', 'auto', '40', '50'] }
},
computed: {
scale () {
return [{
dataKey: 'y',
alias: this.yaxisText
}]
}
},
mounted () {
triggerWindowResizeEvent()
}
</script>
}
</script>
+41 -41
View File
@@ -12,49 +12,49 @@
</template>
<script>
import { ChartEventMixins } from './mixins/ChartMixins'
import { ChartEventMixins } from './mixins/ChartMixins'
export default {
name: 'BarAndLine',
mixins: [ChartEventMixins],
props: {
title: {
type: String,
default: ''
},
dataSource: {
type: Array,
default: () => [
{ type: '10:10', bar: 200, line: 1000 },
{ type: '10:15', bar: 600, line: 1000},
{ type: '10:20', bar: 200, line: 1000},
{ type: '10:25', bar: 900, line: 1000},
{ type: '10:30', bar: 200, line: 1000},
{ type: '10:35', bar: 200, line: 1000},
{ type: '10:40', bar: 100, line: 1000}
]
},
height: {
type: Number,
default: 400
}
export default {
name: 'BarAndLine',
mixins: [ChartEventMixins],
props: {
title: {
type: String,
default: ''
},
data() {
return {
padding: { top:50, right:50, bottom:100, left:50 },
scale: [{
dataKey: 'bar',
min: 0
}, {
dataKey: 'line',
min: 0
}]
}
dataSource: {
type: Array,
default: () => [
{ type: '10:10', bar: 200, line: 1000 },
{ type: '10:15', bar: 600, line: 1000 },
{ type: '10:20', bar: 200, line: 1000 },
{ type: '10:25', bar: 900, line: 1000 },
{ type: '10:30', bar: 200, line: 1000 },
{ type: '10:35', bar: 200, line: 1000 },
{ type: '10:40', bar: 100, line: 1000 }
]
},
computed: {
data() {
return this.dataSource
}
height: {
type: Number,
default: 400
}
},
data () {
return {
padding: { top: 50, right: 50, bottom: 100, left: 50 },
scale: [{
dataKey: 'bar',
min: 0
}, {
dataKey: 'line',
min: 0
}]
}
},
computed: {
data () {
return this.dataSource
}
}
</script>
}
</script>
+72 -72
View File
@@ -11,86 +11,86 @@
</template>
<script>
import { DataSet } from '@antv/data-set'
import { ChartEventMixins } from './mixins/ChartMixins'
import { DataSet } from '@antv/data-set'
import { ChartEventMixins } from './mixins/ChartMixins'
export default {
name: 'BarMultid',
mixins: [ChartEventMixins],
props: {
title: {
type: String,
default: ''
},
dataSource: {
type: Array,
default: () => [
{ type: 'JeroOne', 'Jan.': 18.9, 'Feb.': 28.8, 'Mar.': 39.3, 'Apr.': 81.4, 'May': 47, 'Jun.': 20.3, 'Jul.': 24, 'Aug.': 35.6 },
{ type: 'JeroTwo', 'Jan.': 12.4, 'Feb.': 23.2, 'Mar.': 34.5, 'Apr.': 99.7, 'May': 52.6, 'Jun.': 35.5, 'Jul.': 37.4, 'Aug.': 42.4 }
]
},
fields: {
type: Array,
default: () => ['Jan.', 'Feb.', 'Mar.', 'Apr.', 'May', 'Jun.', 'Jul.', 'Aug.']
},
// 别名,需要的格式:[{field:'name',alias:'姓名'}, {field:'sex',alias:'性别'}]
aliases: {
type: Array,
default: () => []
},
height: {
type: Number,
default: 254
}
export default {
name: 'BarMultid',
mixins: [ChartEventMixins],
props: {
title: {
type: String,
default: ''
},
data() {
return {
adjust: [{
type: 'dodge',
marginRatio: 1 / 32
}]
}
dataSource: {
type: Array,
default: () => [
{ type: 'JeroOne', 'Jan.': 18.9, 'Feb.': 28.8, 'Mar.': 39.3, 'Apr.': 81.4, May: 47, 'Jun.': 20.3, 'Jul.': 24, 'Aug.': 35.6 },
{ type: 'JeroTwo', 'Jan.': 12.4, 'Feb.': 23.2, 'Mar.': 34.5, 'Apr.': 99.7, May: 52.6, 'Jun.': 35.5, 'Jul.': 37.4, 'Aug.': 42.4 }
]
},
computed: {
data() {
const dv = new DataSet.View().source(this.dataSource)
dv.transform({
type: 'fold',
fields: this.fields,
key: 'x',
value: 'y'
})
fields: {
type: Array,
default: () => ['Jan.', 'Feb.', 'Mar.', 'Apr.', 'May', 'Jun.', 'Jul.', 'Aug.']
},
// 别名,需要的格式:[{field:'name',alias:'姓名'}, {field:'sex',alias:'性别'}]
aliases: {
type: Array,
default: () => []
},
height: {
type: Number,
default: 254
}
},
data () {
return {
adjust: [{
type: 'dodge',
marginRatio: 1 / 32
}]
}
},
computed: {
data () {
const dv = new DataSet.View().source(this.dataSource)
dv.transform({
type: 'fold',
fields: this.fields,
key: 'x',
value: 'y'
})
// bar 使用不了 - 和 / 所以替换下
let rows = dv.rows.map(row => {
if (typeof row.x === 'string') {
row.x = row.x.replace(/[-/]/g, '_')
// bar 使用不了 - 和 / 所以替换下
const rows = dv.rows.map(row => {
if (typeof row.x === 'string') {
row.x = row.x.replace(/[-/]/g, '_')
}
return row
})
// 替换别名
rows.forEach(row => {
for (const item of this.aliases) {
if (item.field === row.type) {
row.type = item.alias
break
}
return row
})
// 替换别名
rows.forEach(row => {
for (let item of this.aliases) {
if (item.field === row.type) {
row.type = item.alias
break
}
}
})
return rows
},
scale() {
return [
{
type: 'cat',
dataKey: 'x'
}
]
}
}
})
return rows
},
scale () {
return [
{
type: 'cat',
dataKey: 'x'
}
]
}
}
}
</script>
<style scoped>
</style>
</style>
+127 -127
View File
@@ -45,143 +45,143 @@
</template>
<script>
import { registerShape } from 'viser-vue';
import { registerShape } from 'viser-vue'
registerShape('point', 'pointer', {
draw(cfg, container) {
let point = cfg.points[0];
point = this.parsePoint(point);
const center = this.parsePoint({
x: 0,
y: 0,
});
container.addShape('line', {
attrs: {
x1: center.x,
y1: center.y,
x2: point.x,
y2: point.y + 15,
stroke: cfg.color,
lineWidth: 5,
lineCap: 'round',
}
});
return container.addShape('circle', {
attrs: {
x: center.x,
y: center.y,
r: 9.75,
stroke: cfg.color,
lineWidth: 4.5,
fill: '#fff',
}
});
registerShape('point', 'pointer', {
draw (cfg, container) {
let point = cfg.points[0]
point = this.parsePoint(point)
const center = this.parsePoint({
x: 0,
y: 0
})
container.addShape('line', {
attrs: {
x1: center.x,
y1: center.y,
x2: point.x,
y2: point.y + 15,
stroke: cfg.color,
lineWidth: 5,
lineCap: 'round'
}
})
return container.addShape('circle', {
attrs: {
x: center.x,
y: center.y,
r: 9.75,
stroke: cfg.color,
lineWidth: 4.5,
fill: '#fff'
}
})
}
})
const scale = [{
dataKey: 'value',
min: 0,
max: 9,
tickInterval: 1,
nice: false
}]
const data = [
{ value: 7.0 }
]
export default {
name: 'DashChartDemo',
props: {
datasource: {
type: Number,
default: 7
},
title: {
type: String,
default: ''
}
});
const scale = [{
dataKey: 'value',
min: 0,
max: 9,
tickInterval: 1,
nice: false,
}];
const data = [
{ value: 7.0 },
];
export default {
name:"DashChartDemo",
props:{
datasource:{
type: Number,
default:7
},
title: {
type: String,
default: ''
}
},
created(){
if(!this.datasource){
this.chartData = data;
}else{
this.chartData = [
{ value: this.datasource },
];
}
},
created () {
if (!this.datasource) {
this.chartData = data
} else {
this.chartData = [
{ value: this.datasource }
]
}
this.getChartData()
},
watch: {
datasource: function (val) {
this.chartData = [
{ value: val }
]
this.getChartData()
},
watch: {
'datasource': function (val) {
this.chartData = [
{ value: val},
];
this.getChartData();
}
},
methods: {
getChartData () {
if (this.chartData && this.chartData.length > 0) {
this.abcd = this.chartData[0].value * 10
} else {
this.abcd = 70
}
},
methods:{
getChartData(){
if(this.chartData && this.chartData.length>0){
this.abcd = this.chartData[0].value * 10
}else{
this.abcd = 70
getHtmlGuideHtml () {
return '<div style="width: 300px;text-align: center;">\n' +
'<p style="font-size: 14px;color: #545454;margin: 0;">' + this.title + '</p>\n' +
'<p style="font-size: 36px;color: #545454;margin: 0;">' + this.abcd + '%</p>\n' +
'</div>'
},
getArcGuide2End () {
return [this.chartData[0].value, 0.945]
}
},
data () {
return {
chartData: [],
height: 400,
scale: scale,
abcd: 70,
axisLabel: {
offset: -16,
textStyle: {
fontSize: 18,
textAlign: 'center',
textBaseline: 'middle'
}
},
getHtmlGuideHtml(){
return '<div style="width: 300px;text-align: center;">\n' +
'<p style="font-size: 14px;color: #545454;margin: 0;">'+this.title+'</p>\n' +
'<p style="font-size: 36px;color: #545454;margin: 0;">'+this.abcd+'%</p>\n' +
'</div>'
axisSubTickLine: {
length: -8,
stroke: '#fff',
strokeOpacity: 1
},
getArcGuide2End(){
return [this.chartData[0].value, 0.945]
}
},
data() {
return {
chartData:[],
height: 400,
scale: scale,
abcd:70,
axisLabel: {
offset: -16,
textStyle: {
fontSize: 18,
textAlign: 'center',
textBaseline: 'middle'
}
},
axisSubTickLine: {
length: -8,
stroke: '#fff',
strokeOpacity: 1,
},
axisTickLine: {
length: -17,
stroke: '#fff',
strokeOpacity: 1,
},
arcGuide1Start: [0, 0.945],
arcGuide1End: [9, 0.945],
arcGuide1Style: {
stroke: '#CBCBCB',
lineWidth: 18,
},
arcGuide2Start: [0, 0.945],
arcGuide2Style: {
stroke: '#1890FF',
lineWidth: 18,
},
htmlGuidePosition: ['50%', '100%'],
htmlGuideHtml: `
axisTickLine: {
length: -17,
stroke: '#fff',
strokeOpacity: 1
},
arcGuide1Start: [0, 0.945],
arcGuide1End: [9, 0.945],
arcGuide1Style: {
stroke: '#CBCBCB',
lineWidth: 18
},
arcGuide2Start: [0, 0.945],
arcGuide2Style: {
stroke: '#1890FF',
lineWidth: 18
},
htmlGuidePosition: ['50%', '100%'],
htmlGuideHtml: `
<div style="width: 300px;text-align: center;">
<p style="font-size: 14px;color: #545454;margin: 0;">${this.title}</p>
<p style="font-size: 36px;color: #545454;margin: 0;">${this.abcd}%</p>
</div>
`,
};
},
};
`
}
}
}
</script>
+41 -41
View File
@@ -15,47 +15,47 @@
<script>
const data = []
for (let i = 0; i < 12; i += 1) {
data.push({
x: `${i + 1}`,
y: Math.floor(Math.random() * 1000) + 200
})
}
const tooltip = [
'x*y',
(x, y) => ({
name: x,
value: y
})
]
const scale = [{
dataKey: 'x',
min: 2
}, {
dataKey: 'y',
title: '时间',
min: 1,
max: 22
}]
const data = []
for (let i = 0; i < 12; i += 1) {
data.push({
x: `${i + 1}`,
y: Math.floor(Math.random() * 1000) + 200
})
}
const tooltip = [
'x*y',
(x, y) => ({
name: x,
value: y
})
]
const scale = [{
dataKey: 'x',
min: 2
}, {
dataKey: 'y',
title: '时间',
min: 1,
max: 22
}]
export default {
name: "Bar",
props: {
title: {
type: String,
default: ''
}
},
mounted(){
this.datasource = data
},
data () {
return {
datasource:[],
scale,
tooltip
}
export default {
name: 'Bar',
props: {
title: {
type: String,
default: ''
}
},
mounted () {
this.datasource = data
},
data () {
return {
datasource: [],
scale,
tooltip
}
}
</script>
}
</script>
@@ -12,84 +12,84 @@
</template>
<script>
import { DataSet } from '@antv/data-set'
import { ChartEventMixins } from './mixins/ChartMixins'
import { DataSet } from '@antv/data-set'
import { ChartEventMixins } from './mixins/ChartMixins'
export default {
name: 'LineChartMultid',
mixins: [ChartEventMixins],
props: {
title: {
type: String,
default: ''
},
dataSource: {
type: Array,
default: () => [
{ type: 'Jan', jeroOne: 7.0, jeroTwo: 3.9 },
{ type: 'Feb', jeroOne: 6.9, jeroTwo: 4.2 },
{ type: 'Mar', jeroOne: 9.5, jeroTwo: 5.7 },
{ type: 'Apr', jeroOne: 14.5, jeroTwo: 8.5 },
{ type: 'May', jeroOne: 18.4, jeroTwo: 11.9 },
{ type: 'Jun', jeroOne: 21.5, jeroTwo: 15.2 },
{ type: 'Jul', jeroOne: 25.2, jeroTwo: 17.0 },
{ type: 'Aug', jeroOne: 26.5, jeroTwo: 16.6 },
{ type: 'Sep', jeroOne: 23.3, jeroTwo: 14.2 },
{ type: 'Oct', jeroOne: 18.3, jeroTwo: 10.3 },
{ type: 'Nov', jeroOne: 13.9, jeroTwo: 6.6 },
{ type: 'Dec', jeroOne: 9.6, jeroTwo: 4.8 }
]
},
fields: {
type: Array,
default: () => ['jeroOne', 'jeroTwo']
},
// 别名,需要的格式:[{field:'name',alias:'姓名'}, {field:'sex',alias:'性别'}]
aliases:{
type: Array,
default: () => []
},
height: {
type: Number,
default: 254
}
export default {
name: 'LineChartMultid',
mixins: [ChartEventMixins],
props: {
title: {
type: String,
default: ''
},
data() {
return {
scale: [{
type: 'cat',
dataKey: 'x',
min: 0,
max: 1
}],
style: { stroke: '#fff', lineWidth: 1 }
}
dataSource: {
type: Array,
default: () => [
{ type: 'Jan', jeroOne: 7.0, jeroTwo: 3.9 },
{ type: 'Feb', jeroOne: 6.9, jeroTwo: 4.2 },
{ type: 'Mar', jeroOne: 9.5, jeroTwo: 5.7 },
{ type: 'Apr', jeroOne: 14.5, jeroTwo: 8.5 },
{ type: 'May', jeroOne: 18.4, jeroTwo: 11.9 },
{ type: 'Jun', jeroOne: 21.5, jeroTwo: 15.2 },
{ type: 'Jul', jeroOne: 25.2, jeroTwo: 17.0 },
{ type: 'Aug', jeroOne: 26.5, jeroTwo: 16.6 },
{ type: 'Sep', jeroOne: 23.3, jeroTwo: 14.2 },
{ type: 'Oct', jeroOne: 18.3, jeroTwo: 10.3 },
{ type: 'Nov', jeroOne: 13.9, jeroTwo: 6.6 },
{ type: 'Dec', jeroOne: 9.6, jeroTwo: 4.8 }
]
},
computed: {
data() {
const dv = new DataSet.View().source(this.dataSource)
dv.transform({
type: 'fold',
fields: this.fields,
key: 'x',
value: 'y'
})
let rows = dv.rows
// 替换别名
rows.forEach(row => {
for (let item of this.aliases) {
if (item.field === row.x) {
row.x = item.alias
break
}
fields: {
type: Array,
default: () => ['jeroOne', 'jeroTwo']
},
// 别名,需要的格式:[{field:'name',alias:'姓名'}, {field:'sex',alias:'性别'}]
aliases: {
type: Array,
default: () => []
},
height: {
type: Number,
default: 254
}
},
data () {
return {
scale: [{
type: 'cat',
dataKey: 'x',
min: 0,
max: 1
}],
style: { stroke: '#fff', lineWidth: 1 }
}
},
computed: {
data () {
const dv = new DataSet.View().source(this.dataSource)
dv.transform({
type: 'fold',
fields: this.fields,
key: 'x',
value: 'y'
})
const rows = dv.rows
// 替换别名
rows.forEach(row => {
for (const item of this.aliases) {
if (item.field === row.x) {
row.x = item.alias
break
}
})
return rows
}
}
})
return rows
}
}
}
</script>
<style scoped>
</style>
</style>
+22 -22
View File
@@ -48,33 +48,33 @@
<script>
const sourceDataConst = [
{ transfer: '一月', value: 813 },
{ transfer: '二月', value: 233 },
{ transfer: '三月', value: 561 }
]
const sourceDataConst = [
{ transfer: '一月', value: 813 },
{ transfer: '二月', value: 233 },
{ transfer: '三月', value: 561 }
]
export default {
name: 'Liquid',
props: {
height: {
type: Number,
default: 0
},
width: {
type: Number,
default: 0
}
export default {
name: 'Liquid',
props: {
height: {
type: Number,
default: 0
},
data() {
return {
data: sourceDataConst,
scale: []
}
width: {
type: Number,
default: 0
}
},
data () {
return {
data: sourceDataConst,
scale: []
}
}
}
</script>
<style scoped>
</style>
</style>
+46 -46
View File
@@ -10,60 +10,60 @@
</template>
<script>
import moment from 'dayjs'
import moment from 'dayjs'
const sourceData = []
const beginDay = new Date().getTime()
const sourceData = []
const beginDay = new Date().getTime()
for (let i = 0; i < 10; i++) {
sourceData.push({
x: moment(new Date(beginDay + 1000 * 60 * 60 * 24 * i)).format('YYYY-MM-DD'),
y: Math.round(Math.random() * 10)
})
}
for (let i = 0; i < 10; i++) {
sourceData.push({
x: moment(new Date(beginDay + 1000 * 60 * 60 * 24 * i)).format('YYYY-MM-DD'),
y: Math.round(Math.random() * 10)
})
}
export default {
name: 'MiniArea',
props: {
dataSource: {
type: Array,
default: () => []
},
// x 轴别名
x: {
type: String,
default: 'x'
},
// y 轴别名
y: {
type: String,
default: 'y'
}
export default {
name: 'MiniArea',
props: {
dataSource: {
type: Array,
default: () => []
},
data() {
return {
data: [],
height: 100
}
// x 轴别名
x: {
type: String,
default: 'x'
},
computed: {
scale() {
return [
{ dataKey: 'x', title: this.x, alias: this.x },
{ dataKey: 'y', title: this.y, alias: this.y }
]
}
},
created() {
if (this.dataSource.length === 0) {
this.data = sourceData
} else {
this.data = this.dataSource
}
// y 轴别名
y: {
type: String,
default: 'y'
}
},
data () {
return {
data: [],
height: 100
}
},
computed: {
scale () {
return [
{ dataKey: 'x', title: this.x, alias: this.x },
{ dataKey: 'y', title: this.y, alias: this.y }
]
}
},
created () {
if (this.dataSource.length === 0) {
this.data = sourceData
} else {
this.data = this.dataSource
}
}
}
</script>
<style lang="less" scoped>
@import "chart";
</style>
</style>
+53 -53
View File
@@ -8,69 +8,69 @@
</template>
<script>
import moment from 'dayjs'
import moment from 'dayjs'
const sourceData = []
const beginDay = new Date().getTime()
const sourceData = []
const beginDay = new Date().getTime()
for (let i = 0; i < 10; i++) {
sourceData.push({
x: moment(new Date(beginDay + 1000 * 60 * 60 * 24 * i)).format('YYYY-MM-DD'),
y: Math.round(Math.random() * 10)
})
}
for (let i = 0; i < 10; i++) {
sourceData.push({
x: moment(new Date(beginDay + 1000 * 60 * 60 * 24 * i)).format('YYYY-MM-DD'),
y: Math.round(Math.random() * 10)
})
}
const tooltip = [
'x*y',
(x, y) => ({
name: x,
value: y
})
]
const tooltip = [
'x*y',
(x, y) => ({
name: x,
value: y
})
]
const scale = [{
dataKey: 'x',
min: 2
}, {
dataKey: 'y',
title: '时间',
min: 1,
max: 30
}]
const scale = [{
dataKey: 'x',
min: 2
}, {
dataKey: 'y',
title: '时间',
min: 1,
max: 30
}]
export default {
name: 'MiniBar',
props: {
dataSource: {
type: Array,
default: () => []
},
width: {
type: Number,
default: null
},
height: {
type: Number,
default: 200
}
export default {
name: 'MiniBar',
props: {
dataSource: {
type: Array,
default: () => []
},
created() {
if (this.dataSource.length === 0) {
this.data = sourceData
} else {
this.data = this.dataSource
}
width: {
type: Number,
default: null
},
data() {
return {
tooltip,
data: [],
scale
}
height: {
type: Number,
default: 200
}
},
created () {
if (this.dataSource.length === 0) {
this.data = sourceData
} else {
this.data = this.dataSource
}
},
data () {
return {
tooltip,
data: [],
scale
}
}
}
</script>
<style lang="less" scoped>
@import "chart";
</style>
</style>
+20 -20
View File
@@ -11,27 +11,27 @@
</template>
<script>
export default {
name: 'MiniProgress',
props: {
target: {
type: Number,
default: 0
},
height: {
type: Number,
default: 10
},
color: {
type: String,
default: '#13C2C2'
},
percentage: {
type: Number,
default: 0
}
export default {
name: 'MiniProgress',
props: {
target: {
type: Number,
default: 0
},
height: {
type: Number,
default: 10
},
color: {
type: String,
default: '#13C2C2'
},
percentage: {
type: Number,
default: 0
}
}
}
</script>
<style lang="less" scoped>
@@ -72,4 +72,4 @@
}
}
}
</style>
</style>
+54 -54
View File
@@ -9,62 +9,62 @@
</template>
<script>
const DataSet = require('@antv/data-set')
import { ChartEventMixins } from './mixins/ChartMixins'
import { ChartEventMixins } from './mixins/ChartMixins'
const DataSet = require('@antv/data-set')
export default {
name: 'Pie',
mixins: [ChartEventMixins],
props: {
title: {
type: String,
default: ''
},
height: {
type: Number,
default: 254
},
dataSource: {
type: Array,
default: () => [
{ item: '示例一', count: 40 },
{ item: '示例二', count: 21 },
{ item: '示例三', count: 17 },
{ item: '示例四', count: 13 },
{ item: '示例五', count: 9 }
]
}
export default {
name: 'Pie',
mixins: [ChartEventMixins],
props: {
title: {
type: String,
default: ''
},
data() {
return {
scale: [{
dataKey: 'percent',
min: 0,
formatter: '.0%'
}],
pieStyle: {
stroke: '#fff',
lineWidth: 1
},
labelConfig: ['percent', {
formatter: (val, item) => {
return item.point.item + ': ' + val
}
}]
}
height: {
type: Number,
default: 254
},
computed: {
data() {
let dv = new DataSet.View().source(this.dataSource)
// 计算数据百分比
dv.transform({
type: 'percent',
field: 'count',
dimension: 'item',
as: 'percent'
})
return dv.rows
}
dataSource: {
type: Array,
default: () => [
{ item: '示例一', count: 40 },
{ item: '示例二', count: 21 },
{ item: '示例三', count: 17 },
{ item: '示例四', count: 13 },
{ item: '示例五', count: 9 }
]
}
},
data () {
return {
scale: [{
dataKey: 'percent',
min: 0,
formatter: '.0%'
}],
pieStyle: {
stroke: '#fff',
lineWidth: 1
},
labelConfig: ['percent', {
formatter: (val, item) => {
return item.point.item + ': ' + val
}
}]
}
},
computed: {
data () {
const dv = new DataSet.View().source(this.dataSource)
// 计算数据百分比
dv.transform({
type: 'percent',
field: 'count',
dimension: 'item',
as: 'percent'
})
return dv.rows
}
}
</script>
}
</script>
+63 -63
View File
@@ -11,80 +11,80 @@
</template>
<script>
const axis1Opts = {
dataKey: 'item',
line: null,
tickLine: null,
grid: {
lineStyle: {
lineDash: null
},
hideFirstLine: false
const axis1Opts = {
dataKey: 'item',
line: null,
tickLine: null,
grid: {
lineStyle: {
lineDash: null
},
hideFirstLine: false
}
}
const axis2Opts = {
dataKey: 'score',
line: null,
tickLine: null,
grid: {
type: 'polygon',
lineStyle: {
lineDash: null
}
}
const axis2Opts = {
}
const scale = [
{
dataKey: 'score',
line: null,
tickLine: null,
grid: {
type: 'polygon',
lineStyle: {
lineDash: null
}
}
min: 0,
max: 100
}, {
dataKey: 'user',
alias: '类型'
}
const scale = [
{
dataKey: 'score',
min: 0,
max: 100
}, {
dataKey: 'user',
alias: '类型'
}
]
]
const sourceData = [
{ item: '示例一', score: 40 },
{ item: '示例二', score: 20 },
{ item: '示例三', score: 67 },
{ item: '示例四', score: 43 },
{ item: '示例五', score: 90 }
]
const sourceData = [
{ item: '示例一', score: 40 },
{ item: '示例二', score: 20 },
{ item: '示例三', score: 67 },
{ item: '示例四', score: 43 },
{ item: '示例五', score: 90 }
]
export default {
name: 'Radar',
props: {
height: {
type: Number,
default: 254
},
dataSource: {
type: Array,
default: () => []
}
export default {
name: 'Radar',
props: {
height: {
type: Number,
default: 254
},
data() {
return {
axis1Opts,
axis2Opts,
scale,
data: sourceData
}
},
watch: {
dataSource(newVal) {
if (newVal.length === 0) {
this.data = sourceData
} else {
this.data = newVal
}
dataSource: {
type: Array,
default: () => []
}
},
data () {
return {
axis1Opts,
axis2Opts,
scale,
data: sourceData
}
},
watch: {
dataSource (newVal) {
if (newVal.length === 0) {
this.data = sourceData
} else {
this.data = newVal
}
}
}
}
</script>
<style scoped>
</style>
</style>
+17 -17
View File
@@ -12,24 +12,24 @@
</template>
<script>
export default {
name: "RankList",
// ['title', 'list']
props: {
title: {
type: String,
default: ''
},
list: {
type: Array,
default: null
},
height: {
type: Number,
default: null
}
export default {
name: 'RankList',
// ['title', 'list']
props: {
title: {
type: String,
default: ''
},
list: {
type: Array,
default: null
},
height: {
type: Number,
default: null
}
}
}
</script>
<style lang="less" scoped>
@@ -78,4 +78,4 @@
padding: 0 32px 32px 32px;
}
</style>
</style>
+36 -36
View File
@@ -12,43 +12,43 @@
</template>
<script>
const DataSet = require('@antv/data-set');
const DataSet = require('@antv/data-set')
export default {
name: 'StackBar',
props: {
dataSource: {
type: Array,
required: true,
default: () => [
{ 'State': '请假', '流转中': 25, '已归档': 18 },
{ 'State': '出差', '流转中': 30, '已归档': 20 },
{ 'State': '加班', '流转中': 38, '已归档': 42},
{ 'State': '用车', '流转中': 51, '已归档': 67}
]
},
height: {
type: Number,
default: 254
}
export default {
name: 'StackBar',
props: {
dataSource: {
type: Array,
required: true,
default: () => [
{ State: '请假', 流转中: 25, 已归档: 18 },
{ State: '出差', 流转中: 30, 已归档: 20 },
{ State: '加班', 流转中: 38, 已归档: 42 },
{ State: '用车', 流转中: 51, 已归档: 67 }
]
},
data() {
return {
label: { offset: 12 }
}
},
computed: {
data() {
const dv = new DataSet.View().source(this.dataSource);
dv.transform({
type: 'fold',
fields: ['流转中', '已归档'],
key: '流程状态',
value: '流程数量',
retains: ['State'],
});
return dv.rows;
}
height: {
type: Number,
default: 254
}
},
data () {
return {
label: { offset: 12 }
}
},
computed: {
data () {
const dv = new DataSet.View().source(this.dataSource)
dv.transform({
type: 'fold',
fields: ['流转中', '已归档'],
key: '流程状态',
value: '流程数量',
retains: ['State']
})
return dv.rows
}
}
</script>
}
</script>
+42 -42
View File
@@ -16,51 +16,51 @@
<script>
export default {
name: 'Bar',
props: {
title: {
type: String,
default: ''
},
x: {
type: String,
default: 'x'
},
y: {
type: String,
default: 'y'
},
data: {
type: Array,
default: () => []
},
height: {
type: Number,
default: 254
}
export default {
name: 'Bar',
props: {
title: {
type: String,
default: ''
},
data() {
return {}
x: {
type: String,
default: 'x'
},
computed: {
scale() {
return [
{ dataKey: 'x', title: this.x, alias: this.x },
{ dataKey: 'y', title: this.y, alias: this.y }
]
}
y: {
type: String,
default: 'y'
},
created() {
// this.getMonthBar()
data: {
type: Array,
default: () => []
},
methods: {
// getMonthBar() {
// this.$http.get('/analysis/month-bar')
// .then(res => {
// this.data = res.result
// })
// }
height: {
type: Number,
default: 254
}
},
data () {
return {}
},
computed: {
scale () {
return [
{ dataKey: 'x', title: this.x, alias: this.x },
{ dataKey: 'y', title: this.y, alias: this.y }
]
}
},
created () {
// this.getMonthBar()
},
methods: {
// getMonthBar() {
// this.$http.get('/analysis/month-bar')
// .then(res => {
// this.data = res.result
// })
// }
}
</script>
}
</script>
+40 -40
View File
@@ -7,49 +7,49 @@
</template>
<script>
export default {
name: "Trend",
props: {
// 同title
term: {
type: String,
default: '',
required: true
},
// 百分比
percentage: {
type: Number,
default: null
},
type: {
type: Boolean,
default: null
},
target: {
type: Number,
default: 0
},
value: {
type: Number,
default: 0
},
fixed: {
type: Number,
default: 2
}
export default {
name: 'Trend',
props: {
// 同title
term: {
type: String,
default: '',
required: true
},
data () {
return {
trend: this.type && 'up' || 'down',
rate: this.percentage
}
// 百分比
percentage: {
type: Number,
default: null
},
created () {
let type = this.type === null ? this.value >= this.target : this.type
this.trend = type ? 'up' : 'down';
this.rate = (this.percentage === null ? Math.abs(this.value - this.target) * 100 / this.target : this.percentage).toFixed(this.fixed)
type: {
type: Boolean,
default: null
},
target: {
type: Number,
default: 0
},
value: {
type: Number,
default: 0
},
fixed: {
type: Number,
default: 2
}
},
data () {
return {
trend: this.type && 'up' || 'down',
rate: this.percentage
}
},
created () {
const type = this.type === null ? this.value >= this.target : this.type
this.trend = type ? 'up' : 'down'
this.rate = (this.percentage === null ? Math.abs(this.value - this.target) * 100 / this.target : this.percentage).toFixed(this.fixed)
}
}
</script>
<style lang="less" scoped>
@@ -81,4 +81,4 @@
}
}
}
</style>
</style>
@@ -1,10 +1,10 @@
export const ChartEventMixins = {
methods: {
handleClick(event, chart) {
handleClick (event, chart) {
this.handleEvent('click', event, chart)
},
handleEvent(eventName, event, chart) {
handleEvent (eventName, event, chart) {
this.$emit(eventName, event, chart)
},
}
}
}
}
+81 -81
View File
@@ -18,90 +18,90 @@
</template>
<script>
import {ajaxGetDictItems,getDictItemsFromCache} from '@/api/api'
import { ajaxGetDictItems, getDictItemsFromCache } from '@/api/api'
export default {
name: "JDictSelectTag",
props: {
dictCode: String,
placeholder: String,
disabled: Boolean,
value: [String, Number],
type: String,
getPopupContainer:{
type: Function,
default: (node) => node.parentNode
}
},
data() {
return {
dictOptions: [],
tagType:""
}
},
watch:{
dictCode:{
immediate:true,
handler() {
this.initDictData()
},
}
},
created() {
if(!this.type || this.type==="list"){
this.tagType = "select"
}else{
this.tagType = this.type
}
},
computed: {
getValueSting(){
// update-begin author:wangshuai date:20200601 for: 不显示placeholder的文字 ------
// 当有null或“” placeholder不显示
return this.value != null ? this.value.toString() : undefined;
// update-end author:wangshuai date:20200601 for: 不显示placeholder的文字 ------
},
},
methods: {
initDictData() {
//优先从缓存中读取字典配置
if(getDictItemsFromCache(this.dictCode)){
this.dictOptions = getDictItemsFromCache(this.dictCode);
return
}
//根据字典Code, 初始化字典数组
ajaxGetDictItems(this.dictCode, null).then((res) => {
if (res.success) {
this.dictOptions = res.result;
}
})
},
handleInput(e='') {
let val;
if(Object.keys(e).includes('target')){
val = e.target.value
}else{
val = e
}
console.log(val);
this.$emit('change', val);
//解决数据规则,选择自定义SQL 规则值无法输入空格
this.$emit('input', val);
},
setCurrentDictOptions(dictOptions){
this.dictOptions = dictOptions
},
getCurrentDictOptions(){
return this.dictOptions
}
},
model:{
prop: 'value',
event: 'change'
export default {
name: 'JDictSelectTag',
props: {
dictCode: String,
placeholder: String,
disabled: Boolean,
value: [String, Number],
type: String,
getPopupContainer: {
type: Function,
default: (node) => node.parentNode
}
},
data () {
return {
dictOptions: [],
tagType: ''
}
},
watch: {
dictCode: {
immediate: true,
handler () {
this.initDictData()
}
}
},
created () {
if (!this.type || this.type === 'list') {
this.tagType = 'select'
} else {
this.tagType = this.type
}
},
computed: {
getValueSting () {
// update-begin author:wangshuai date:20200601 for: 不显示placeholder的文字 ------
// 当有null或“” placeholder不显示
return this.value != null ? this.value.toString() : undefined
// update-end author:wangshuai date:20200601 for: 不显示placeholder的文字 ------
}
},
methods: {
initDictData () {
// 优先从缓存中读取字典配置
if (getDictItemsFromCache(this.dictCode)) {
this.dictOptions = getDictItemsFromCache(this.dictCode)
return
}
// 根据字典Code, 初始化字典数组
ajaxGetDictItems(this.dictCode, null).then((res) => {
if (res.success) {
this.dictOptions = res.result
}
})
},
handleInput (e = '') {
let val
if (Object.keys(e).includes('target')) {
val = e.target.value
} else {
val = e
}
console.log(val)
this.$emit('change', val)
// 解决数据规则,选择自定义SQL 规则值无法输入空格
this.$emit('input', val)
},
setCurrentDictOptions (dictOptions) {
this.dictOptions = dictOptions
},
getCurrentDictOptions () {
return this.dictOptions
}
},
model: {
prop: 'value',
event: 'change'
}
}
</script>
<style scoped>
</style>
</style>
+63 -63
View File
@@ -4,28 +4,28 @@
* date: 20190109
*/
import {ajaxGetDictItems,getDictItemsFromCache} from '@/api/api'
import {getAction} from '@/api/manage'
import { ajaxGetDictItems, getDictItemsFromCache } from '@/api/api'
import { getAction } from '@/api/manage'
/**
* 获取字典数组
* @param dictCode 字典Code
* @return List<Map>
*/
export async function initDictOptions(dictCode) {
export async function initDictOptions (dictCode) {
if (!dictCode) {
return '字典Code不能为空!';
return '字典Code不能为空!'
}
//优先从缓存中读取字典配置
if(getDictItemsFromCache(dictCode)){
let res = {}
res.result = getDictItemsFromCache(dictCode);
res.success = true;
return res;
// 优先从缓存中读取字典配置
if (getDictItemsFromCache(dictCode)) {
const res = {}
res.result = getDictItemsFromCache(dictCode)
res.success = true
return res
}
//获取字典数组
let res = await ajaxGetDictItems(dictCode);
return res;
// 获取字典数组
const res = await ajaxGetDictItems(dictCode)
return res
}
/**
@@ -34,10 +34,10 @@ export async function initDictOptions(dictCode) {
* @param text 字典值
* @return String
*/
export function filterDictText(dictOptions, text) {
export function filterDictText (dictOptions, text) {
// --update-begin----author:sunjianlei---date:20200323------for: 字典翻译 text 允许逗号分隔 ---
if (text != null && Array.isArray(dictOptions)) {
let result = []
const result = []
// 允许多个逗号分隔,允许传数组对象
let splitText
if (Array.isArray(text)) {
@@ -45,9 +45,9 @@ export function filterDictText(dictOptions, text) {
} else {
splitText = text.toString().trim().split(',')
}
for (let txt of splitText) {
for (const txt of splitText) {
let dictText = txt
for (let dictItem of dictOptions) {
for (const dictItem of dictOptions) {
if (txt.toString() === dictItem.value.toString()) {
dictText = (dictItem.text || dictItem.title || dictItem.label)
break
@@ -67,11 +67,11 @@ export function filterDictText(dictOptions, text) {
* @param text 字典值
* @return String
*/
export function filterMultiDictText(dictOptions, text) {
//js “!text” 认为0为空,所以做提前处理
if(text === 0 || text === '0'){
if(dictOptions){
for (let dictItem of dictOptions) {
export function filterMultiDictText (dictOptions, text) {
// js “!text” 认为0为空,所以做提前处理
if (text === 0 || text === '0') {
if (dictOptions) {
for (const dictItem of dictOptions) {
if (text == dictItem.value) {
return dictItem.text
}
@@ -79,26 +79,26 @@ export function filterMultiDictText(dictOptions, text) {
}
}
if(!text || text=='null' || !dictOptions || dictOptions.length==0){
return ""
if (!text || text == 'null' || !dictOptions || dictOptions.length == 0) {
return ''
}
let re = "";
let re = ''
text = text.toString()
let arr = text.split(",")
const arr = text.split(',')
dictOptions.forEach(function (option) {
if(option){
for(let i=0;i<arr.length;i++){
if (option) {
for (let i = 0; i < arr.length; i++) {
if (arr[i] === option.value) {
re += option.text+",";
break;
re += option.text + ','
break
}
}
}
});
if(re==""){
return text;
})
if (re == '') {
return text
}
return re.substring(0,re.length-1);
return re.substring(0, re.length - 1)
}
/**
@@ -106,42 +106,42 @@ export function filterMultiDictText(dictOptions, text) {
* @param children
* @returns string
*/
export function filterDictTextByCache(dictCode, key) {
if(key==null ||key.length==0){
return;
export function filterDictTextByCache (dictCode, key) {
if (key == null || key.length == 0) {
return
}
if (!dictCode) {
return '字典Code不能为空!';
return '字典Code不能为空!'
}
//优先从缓存中读取字典配置
if(getDictItemsFromCache(dictCode)){
let item = getDictItemsFromCache(dictCode).filter(t => t["value"] == key)
if(item && item.length>0){
return item[0]["text"]
// 优先从缓存中读取字典配置
if (getDictItemsFromCache(dictCode)) {
const item = getDictItemsFromCache(dictCode).filter(t => t.value == key)
if (item && item.length > 0) {
return item[0].text
}
}
}
/** 通过code获取字典数组 */
export async function getDictItems(dictCode, params) {
//优先从缓存中读取字典配置
if(getDictItemsFromCache(dictCode)){
let desformDictItems = getDictItemsFromCache(dictCode).map(item => ({...item, label: item.text}))
return desformDictItems;
}
export async function getDictItems (dictCode, params) {
// 优先从缓存中读取字典配置
if (getDictItemsFromCache(dictCode)) {
const desformDictItems = getDictItemsFromCache(dictCode).map(item => ({ ...item, label: item.text }))
return desformDictItems
}
//缓存中没有,就请求后台
return await ajaxGetDictItems(dictCode, params).then(({success, result}) => {
if (success) {
let res = result.map(item => ({...item, label: item.text}))
console.log('------- 从DB中获取到了字典-------dictCode : ', dictCode, res)
return Promise.resolve(res)
} else {
console.error('getDictItems error: : ', res)
return Promise.resolve([])
}
}).catch((res) => {
console.error('getDictItems error: ', res)
// 缓存中没有,就请求后台
return await ajaxGetDictItems(dictCode, params).then(({ success, result }) => {
if (success) {
const res = result.map(item => ({ ...item, label: item.text }))
console.log('------- 从DB中获取到了字典-------dictCode : ', dictCode, res)
return Promise.resolve(res)
} else {
console.error('getDictItems error: : ', res)
return Promise.resolve([])
})
}
}
}).catch((res) => {
console.error('getDictItems error: ', res)
return Promise.resolve([])
})
}
@@ -20,103 +20,102 @@
</template>
<script>
import {ajaxGetDictItems,getDictItemsFromCache} from '@/api/api'
export default {
name: 'JMultiSelectTag',
props: {
dictCode: String,
placeholder: String,
disabled: Boolean,
value: String,
import { ajaxGetDictItems, getDictItemsFromCache } from '@/api/api'
export default {
name: 'JMultiSelectTag',
props: {
dictCode: String,
placeholder: String,
disabled: Boolean,
value: String,
type: String,
options: Array,
spliter: {
type: String,
options:Array,
spliter:{
type: String,
required: false,
default: ','
},
popContainer:{
type:String,
default:'',
required:false
},
required: false,
default: ','
},
data() {
return {
dictOptions: [],
tagType:"",
arrayValue:!this.value?[]:this.value.split(this.spliter)
}
},
created() {
if(!this.type || this.type==="list_multi"){
this.tagType = "select"
}else{
this.tagType = this.type
}
//获取字典数据
// this.initDictData();
},
watch:{
options (val) {
val.forEach((item, index) => {
this.$set(this.dictOptions, index, item)
})
},
dictCode:{
immediate:true,
handler() {
this.initDictData()
},
},
value (val) {
if(!val){
this.arrayValue = []
}else{
this.arrayValue = this.value.split(this.spliter)
}
}
},
methods: {
initDictData() {
if(this.options && this.options.length>0){
this.dictOptions = [...this.options]
}else{
//优先从缓存中读取字典配置
let cacheOption = getDictItemsFromCache(this.dictCode)
if(cacheOption && cacheOption.length>0){
this.dictOptions = cacheOption
return
}
//根据字典Code, 初始化字典数组
ajaxGetDictItems(this.dictCode, null).then((res) => {
if (res.success) {
this.dictOptions = res.result;
}
})
}
},
onChange (selectedValue) {
this.arrayValue = selectedValue;
this.$emit('change', selectedValue.join(this.spliter));
},
getParentContainer(node){
if(!this.popContainer){
return node.parentNode
}else{
return document.querySelector(this.popContainer)
}
},
// update--begin--autor:lvdandan-----date:20201120------forLOWCOD-1086 下拉多选框,搜索时只字典code进行搜索不能通过字典text搜索
filterOption(input, option) {
return option.componentOptions.children[0].children[0].text.toLowerCase().indexOf(input.toLowerCase()) >= 0
}
// update--end--autor:lvdandan-----date:20201120------forLOWCOD-1086 下拉多选框,搜索时只字典code进行搜索不能通过字典text搜索
},
model: {
prop: 'value',
event: 'change'
popContainer: {
type: String,
default: '',
required: false
}
},
data () {
return {
dictOptions: [],
tagType: '',
arrayValue: !this.value ? [] : this.value.split(this.spliter)
}
},
created () {
if (!this.type || this.type === 'list_multi') {
this.tagType = 'select'
} else {
this.tagType = this.type
}
// 获取字典数据
// this.initDictData();
},
watch: {
options (val) {
val.forEach((item, index) => {
this.$set(this.dictOptions, index, item)
})
},
dictCode: {
immediate: true,
handler () {
this.initDictData()
}
},
value (val) {
if (!val) {
this.arrayValue = []
} else {
this.arrayValue = this.value.split(this.spliter)
}
}
},
methods: {
initDictData () {
if (this.options && this.options.length > 0) {
this.dictOptions = [...this.options]
} else {
// 优先从缓存中读取字典配置
const cacheOption = getDictItemsFromCache(this.dictCode)
if (cacheOption && cacheOption.length > 0) {
this.dictOptions = cacheOption
return
}
// 根据字典Code, 初始化字典数组
ajaxGetDictItems(this.dictCode, null).then((res) => {
if (res.success) {
this.dictOptions = res.result
}
})
}
},
onChange (selectedValue) {
this.arrayValue = selectedValue
this.$emit('change', selectedValue.join(this.spliter))
},
getParentContainer (node) {
if (!this.popContainer) {
return node.parentNode
} else {
return document.querySelector(this.popContainer)
}
},
// update--begin--autor:lvdandan-----date:20201120------forLOWCOD-1086 下拉多选框,搜索时只字典code进行搜索不能通过字典text搜索
filterOption (input, option) {
return option.componentOptions.children[0].children[0].text.toLowerCase().indexOf(input.toLowerCase()) >= 0
}
// update--end--autor:lvdandan-----date:20201120------forLOWCOD-1086 下拉多选框,搜索时只字典code进行搜索不能通过字典text搜索
},
model: {
prop: 'value',
event: 'change'
}
}
</script>
+189 -191
View File
@@ -39,214 +39,212 @@
</template>
<script>
import { ajaxGetDictItems,getDictItemsFromCache } from '@/api/api'
import debounce from 'lodash/debounce';
import { getAction } from '../../api/manage'
import { ajaxGetDictItems, getDictItemsFromCache } from '@/api/api'
import debounce from 'lodash/debounce'
import { getAction } from '../../api/manage'
export default {
name: 'JSearchSelectTag',
props:{
disabled: Boolean,
value: [String, Number],
dict: String,
dictOptions: Array,
async: Boolean,
placeholder:{
type:String,
default:"请选择",
required:false
},
popContainer:{
type:String,
default:'',
required:false
},
pageSize:{
type: Number,
default: 10,
required: false
},
getPopupContainer: {
type:Function,
default: null
},
export default {
name: 'JSearchSelectTag',
props: {
disabled: Boolean,
value: [String, Number],
dict: String,
dictOptions: Array,
async: Boolean,
placeholder: {
type: String,
default: '请选择',
required: false
},
data(){
this.loadData = debounce(this.loadData, 800);//消抖
this.lastLoad = 0;
return {
loading:false,
selectedValue:[],
selectedAsyncValue:[],
options: [],
}
popContainer: {
type: String,
default: '',
required: false
},
created(){
this.initDictData();
pageSize: {
type: Number,
default: 10,
required: false
},
watch:{
"value":{
immediate:true,
handler(val){
if(!val){
if(val==0){
this.initSelectValue()
}else{
this.selectedValue=[]
this.selectedAsyncValue=[]
}
}else{
getPopupContainer: {
type: Function,
default: null
}
},
data () {
this.loadData = debounce(this.loadData, 800)// 消抖
this.lastLoad = 0
return {
loading: false,
selectedValue: [],
selectedAsyncValue: [],
options: []
}
},
created () {
this.initDictData()
},
watch: {
value: {
immediate: true,
handler (val) {
if (!val) {
if (val == 0) {
this.initSelectValue()
} else {
this.selectedValue = []
this.selectedAsyncValue = []
}
}
},
"dict":{
handler(){
this.initDictData()
}
},
'dictOptions':{
deep: true,
handler(val){
if(val && val.length>0){
this.options = [...val]
}
} else {
this.initSelectValue()
}
}
},
methods:{
initSelectValue(){
if(this.async){
if(!this.selectedAsyncValue || !this.selectedAsyncValue.key || this.selectedAsyncValue.key!=this.value){
console.log("这才请求后台")
getAction(`/sys/dict/loadDictItem/${this.dict}`,{key:this.value}).then(res=>{
if(res.success){
let obj = {
key:this.value,
label:res.result
}
this.selectedAsyncValue = {...obj}
}
})
}
}else{
this.selectedValue = this.value.toString()
dict: {
handler () {
this.initDictData()
}
},
dictOptions: {
deep: true,
handler (val) {
if (val && val.length > 0) {
this.options = [...val]
}
},
loadData(value){
console.log("数据加载",value)
this.lastLoad +=1
const currentLoad = this.lastLoad
this.options = []
this.loading=true
// 字典code格式:table,text,code
getAction(`/sys/dict/loadDict/${this.dict}`,{keyword:value, pageSize: this.pageSize}).then(res=>{
this.loading=false
if(res.success){
if(currentLoad!=this.lastLoad){
return
}
this.options = res.result
console.log("我是第一个",res)
}else{
this.$message.warning(res.message)
}
})
},
initDictData(){
if(!this.async){
//如果字典项集合有数据
if(this.dictOptions && this.dictOptions.length>0){
this.options = [...this.dictOptions]
}else{
//根据字典Code, 初始化字典数组
let dictStr = ''
if(this.dict){
let arr = this.dict.split(',')
if(arr[0].indexOf('where')>0){
let tbInfo = arr[0].split('where')
dictStr = tbInfo[0].trim()+','+arr[1]+','+arr[2]+','+encodeURIComponent(tbInfo[1])
}else{
dictStr = this.dict
}
if (this.dict.indexOf(",") == -1) {
//优先从缓存中读取字典配置
if (getDictItemsFromCache(this.dictCode)) {
this.options = getDictItemsFromCache(this.dictCode);
return
}
}
ajaxGetDictItems(dictStr, null).then((res) => {
if (res.success) {
this.options = res.result;
}
})
}
}
}else{
//异步一开始也加载一点数据
this.loading=true
getAction(`/sys/dict/loadDict/${this.dict}`,{pageSize: this.pageSize, keyword:''}).then(res=>{
this.loading=false
if(res.success){
this.options = res.result
}else{
this.$message.warning(res.message)
}
}
},
methods: {
initSelectValue () {
if (this.async) {
if (!this.selectedAsyncValue || !this.selectedAsyncValue.key || this.selectedAsyncValue.key != this.value) {
console.log('这才请求后台')
getAction(`/sys/dict/loadDictItem/${this.dict}`, { key: this.value }).then(res => {
if (res.success) {
const obj = {
key: this.value,
label: res.result
}
this.selectedAsyncValue = { ...obj }
}
})
}
},
filterOption(input, option) {
return option.componentOptions.children[0].text.toLowerCase().indexOf(input.toLowerCase()) >= 0
},
handleChange (selectedValue) {
console.log("selectedValue",selectedValue)
this.selectedValue = selectedValue
this.callback()
},
handleAsyncChange(selectedObj){
//update-begin-author:scott date:20201222 for:【搜索】搜索查询组件,删除条件,默认下拉还是上次的缓存数据,不好 JT-191
if(selectedObj){
this.selectedAsyncValue = selectedObj
this.selectedValue = selectedObj.key
}else{
this.selectedAsyncValue = null
this.selectedValue = null
this.options = null
this.loadData("")
}
this.callback()
//update-end-author:scott date:20201222 for:【搜索】搜索查询组件,删除条件,默认下拉还是上次的缓存数据,不好 JT-191
},
callback(){
this.$emit('change', this.selectedValue);
},
setCurrentDictOptions(dictOptions){
this.options = dictOptions
},
getCurrentDictOptions(){
return this.options
},
getParentContainer(node){
if(typeof this.getPopupContainer === 'function'){
return this.getPopupContainer(node)
} else if(!this.popContainer){
return node.parentNode
}else{
return document.querySelector(this.popContainer)
}
},
} else {
this.selectedValue = this.value.toString()
}
},
model: {
prop: 'value',
event: 'change'
loadData (value) {
console.log('数据加载', value)
this.lastLoad += 1
const currentLoad = this.lastLoad
this.options = []
this.loading = true
// 字典code格式:table,text,code
getAction(`/sys/dict/loadDict/${this.dict}`, { keyword: value, pageSize: this.pageSize }).then(res => {
this.loading = false
if (res.success) {
if (currentLoad != this.lastLoad) {
return
}
this.options = res.result
console.log('我是第一个', res)
} else {
this.$message.warning(res.message)
}
})
},
initDictData () {
if (!this.async) {
// 如果字典项集合有数据
if (this.dictOptions && this.dictOptions.length > 0) {
this.options = [...this.dictOptions]
} else {
// 根据字典Code, 初始化字典数组
let dictStr = ''
if (this.dict) {
const arr = this.dict.split(',')
if (arr[0].indexOf('where') > 0) {
const tbInfo = arr[0].split('where')
dictStr = tbInfo[0].trim() + ',' + arr[1] + ',' + arr[2] + ',' + encodeURIComponent(tbInfo[1])
} else {
dictStr = this.dict
}
if (this.dict.indexOf(',') == -1) {
// 优先从缓存中读取字典配置
if (getDictItemsFromCache(this.dictCode)) {
this.options = getDictItemsFromCache(this.dictCode)
return
}
}
ajaxGetDictItems(dictStr, null).then((res) => {
if (res.success) {
this.options = res.result
}
})
}
}
} else {
// 异步一开始也加载一点数据
this.loading = true
getAction(`/sys/dict/loadDict/${this.dict}`, { pageSize: this.pageSize, keyword: '' }).then(res => {
this.loading = false
if (res.success) {
this.options = res.result
} else {
this.$message.warning(res.message)
}
})
}
},
filterOption (input, option) {
return option.componentOptions.children[0].text.toLowerCase().indexOf(input.toLowerCase()) >= 0
},
handleChange (selectedValue) {
console.log('selectedValue', selectedValue)
this.selectedValue = selectedValue
this.callback()
},
handleAsyncChange (selectedObj) {
// update-begin-author:scott date:20201222 for:【搜索】搜索查询组件,删除条件,默认下拉还是上次的缓存数据,不好 JT-191
if (selectedObj) {
this.selectedAsyncValue = selectedObj
this.selectedValue = selectedObj.key
} else {
this.selectedAsyncValue = null
this.selectedValue = null
this.options = null
this.loadData('')
}
this.callback()
// update-end-author:scott date:20201222 for:【搜索】搜索查询组件,删除条件,默认下拉还是上次的缓存数据,不好 JT-191
},
callback () {
this.$emit('change', this.selectedValue)
},
setCurrentDictOptions (dictOptions) {
this.options = dictOptions
},
getCurrentDictOptions () {
return this.options
},
getParentContainer (node) {
if (typeof this.getPopupContainer === 'function') {
return this.getPopupContainer(node)
} else if (!this.popContainer) {
return node.parentNode
} else {
return document.querySelector(this.popContainer)
}
}
},
model: {
prop: 'value',
event: 'change'
}
}
</script>
<style scoped>
</style>
</style>
+5 -5
View File
@@ -1,16 +1,16 @@
import JDictSelectTag from './JDictSelectTag.vue'
import JMultiSelectTag from './JMultiSelectTag.vue'
import JSearchSelectTag from './JSearchSelectTag.vue'
import { filterMultiDictText,filterDictText,initDictOptions,filterDictTextByCache } from './JDictSelectUtil'
import { filterMultiDictText, filterDictText, initDictOptions, filterDictTextByCache } from './JDictSelectUtil'
export default {
install: function (Vue) {
Vue.component('JDictSelectTag',JDictSelectTag);
Vue.component('JMultiSelectTag',JMultiSelectTag);
Vue.component('JSearchSelectTag',JSearchSelectTag);
Vue.component('JDictSelectTag', JDictSelectTag)
Vue.component('JMultiSelectTag', JMultiSelectTag)
Vue.component('JSearchSelectTag', JSearchSelectTag)
Vue.prototype.$initDictOptions = (dictCode) => initDictOptions(dictCode)
Vue.prototype.$filterMultiDictText = (dictOptions, text) => filterMultiDictText(dictOptions, text)
Vue.prototype.$filterDictText = (dictOptions, text) => filterDictText(dictOptions, text)
Vue.prototype.$filterDictTextByCache = (...param) => filterDictTextByCache(...param)
}
}
}
+108 -108
View File
@@ -29,122 +29,122 @@
</template>
<script>
import Area from '@/components/_util/Area'
import Area from '@/components/_util/Area'
export default {
name: 'JAreaLinkage',
props: {
value: {
type: String,
required:false
export default {
name: 'JAreaLinkage',
props: {
value: {
type: String,
required: false
},
// 组件的类型,可选值:
// select 下拉样式
// cascader 级联样式(默认)
type: {
type: String,
default: 'cascader'
},
width: {
type: String,
default: '100%'
}
},
data () {
return {
pcaa: this.$Jpcaa,
innerValue: [],
usedListeners: ['change'],
enums: {
type: ['cascader', 'select']
},
// 组件的类型,可选值:
// select 下拉样式
// cascader 级联样式(默认)
type: {
type: String,
default: 'cascader'
},
width: {
type: String,
default: '100%'
reloading: false,
areaData: ''
}
},
computed: {
_listeners () {
const listeners = { ...this.$listeners }
// 去掉已使用的事件,防止冲突
this.usedListeners.forEach(key => {
delete listeners[key]
})
return listeners
},
_type () {
if (this.enums.type.includes(this.type)) {
return this.type
} else {
console.error(`JAreaLinkage的type属性只能接收指定的值(${this.enums.type.join('|')}`)
return this.enums.type[0]
}
},
data() {
return {
pcaa: this.$Jpcaa,
innerValue: [],
usedListeners: ['change'],
enums: {
type: ['cascader', 'select']
},
reloading: false,
areaData:''
}
},
watch: {
value: {
immediate: true,
handler () {
this.loadDataByValue(this.value)
}
},
computed: {
_listeners() {
let listeners = { ...this.$listeners }
// 去掉已使用的事件,防止冲突
this.usedListeners.forEach(key => {
delete listeners[key]
})
return listeners
},
_type() {
if (this.enums.type.includes(this.type)) {
return this.type
} else {
console.error(`JAreaLinkage的type属性只能接收指定的值(${this.enums.type.join('|')}`)
return this.enums.type[0]
}
},
},
watch: {
value: {
immediate: true,
handler() {
this.loadDataByValue(this.value)
}
},
},
created() {
this.initAreaData();
},
methods: {
}
},
created () {
this.initAreaData()
},
methods: {
/** 重新加载组件 */
reload() {
this.reloading = true
this.$nextTick(() => this.reloading = false)
},
/** 重新加载组件 */
reload () {
this.reloading = true
this.$nextTick(() => this.reloading = false)
},
/** 通过 value 反推 options */
loadDataByValue(value) {
if (!value || value.length === 0) {
this.innerValue = []
} else {
this.initAreaData()
let arr = this.areaData.getRealCode(value)
this.innerValue = arr
}
this.reload()
},
/** 通过地区code获取子级 */
loadDataByCode(value) {
let options = []
let data = this.pcaa[value]
if (data) {
for (let key in data) {
if (data.hasOwnProperty(key)) {
options.push({ value: key, label: data[key], })
}
/** 通过 value 反推 options */
loadDataByValue (value) {
if (!value || value.length === 0) {
this.innerValue = []
} else {
this.initAreaData()
const arr = this.areaData.getRealCode(value)
this.innerValue = arr
}
this.reload()
},
/** 通过地区code获取子级 */
loadDataByCode (value) {
const options = []
const data = this.pcaa[value]
if (data) {
for (const key in data) {
if (data.hasOwnProperty(key)) {
options.push({ value: key, label: data[key] })
}
return options
} else {
return []
}
},
/** 判断是否有子节点 */
hasChildren(options) {
options.forEach(option => {
let data = this.loadDataByCode(option.value)
option.isLeaf = data.length === 0
})
},
handleChange(values) {
let value = values[values.length - 1]
this.$emit('change', value)
},
initAreaData(){
if(!this.areaData){
this.areaData = new Area(this.$Jpcaa);
}
},
return options
} else {
return []
}
},
model: { prop: 'value', event: 'change' },
}
/** 判断是否有子节点 */
hasChildren (options) {
options.forEach(option => {
const data = this.loadDataByCode(option.value)
option.isLeaf = data.length === 0
})
},
handleChange (values) {
const value = values[values.length - 1]
this.$emit('change', value)
},
initAreaData () {
if (!this.areaData) {
this.areaData = new Area(this.$Jpcaa)
}
}
},
model: { prop: 'value', event: 'change' }
}
</script>
<style lang="less" scoped>
@@ -159,4 +159,4 @@
}
}
</style>
</style>
+233 -233
View File
@@ -17,253 +17,253 @@
</template>
<script>
import { getAction } from '@/api/manage'
import { getAction } from '@/api/manage'
export default {
name: 'JCategorySelect',
props: {
value:{
// type: String,
required: false
},
placeholder:{
type: String,
default: '请选择',
required: false
},
disabled:{
type:Boolean,
default:false,
required:false
},
condition:{
type:String,
default:'',
required:false
},
// 是否支持多选
multiple: {
type: Boolean,
default: false,
},
loadTriggleChange:{
type: Boolean,
default: false,
required:false
},
pid:{
type:String,
default:'',
required:false
},
pCode:{
type:String,
default:'',
required:false
},
back:{
type:String,
default:'',
required:false
}
export default {
name: 'JCategorySelect',
props: {
value: {
// type: String,
required: false
},
data () {
return {
treeValue:"",
treeData:[],
url:"/sys/category/loadTreeData",
view:'/sys/category/loadDictItem/',
tableName:"",
text:"",
code:"",
placeholder: {
type: String,
default: '请选择',
required: false
},
disabled: {
type: Boolean,
default: false,
required: false
},
condition: {
type: String,
default: '',
required: false
},
// 是否支持多选
multiple: {
type: Boolean,
default: false
},
loadTriggleChange: {
type: Boolean,
default: false,
required: false
},
pid: {
type: String,
default: '',
required: false
},
pCode: {
type: String,
default: '',
required: false
},
back: {
type: String,
default: '',
required: false
}
},
data () {
return {
treeValue: '',
treeData: [],
url: '/sys/category/loadTreeData',
view: '/sys/category/loadDictItem/',
tableName: '',
text: '',
code: ''
}
}
},
computed: {
_attrs () {
let attrs
attrs = { ...this.$attrs }
return attrs
},
computed:{
_attrs() {
let attrs
attrs = { ...this.$attrs }
return attrs
},
//透传给下级组件的事件,需要排除本组件使用的change事件
childListeners() {
const vm = this;
let result = Object.assign({},
this.$listeners,
)
delete result.change;
return result;
}
// 透传给下级组件的事件,需要排除本组件使用的change事件
childListeners () {
const vm = this
const result = Object.assign({},
this.$listeners
)
delete result.change
return result
}
},
watch: {
value () {
this.loadItemByCode()
},
watch: {
value () {
this.loadItemByCode()
},
pCode(){
this.loadRoot();
pCode () {
this.loadRoot()
}
},
created () {
this.validateProp().then(() => {
this.loadRoot()
this.loadItemByCode()
})
},
methods: {
/** 加载一级节点 */
loadRoot () {
const param = {
pid: this.pid,
pcode: !this.pCode ? '0' : this.pCode,
condition: this.condition
}
},
created(){
this.validateProp().then(()=>{
this.loadRoot()
this.loadItemByCode()
getAction(this.url, param).then(res => {
if (res.success && res.result) {
for (const i of res.result) {
i.value = i.key
if (i.leaf == false) {
i.isLeaf = false
} else if (i.leaf == true) {
i.isLeaf = true
}
}
this.treeData = [...res.result]
} else {
console.log('树一级节点查询结果-else', res)
}
})
},
methods: {
/**加载一级节点 */
loadRoot(){
let param = {
pid:this.pid,
pcode:!this.pCode?'0':this.pCode,
condition:this.condition
}
getAction(this.url,param).then(res=>{
if(res.success && res.result){
for(let i of res.result){
i.value = i.key
if(i.leaf==false){
i.isLeaf=false
}else if(i.leaf==true){
i.isLeaf=true
}
}
this.treeData = [...res.result]
}else{
console.log("树一级节点查询结果-else",res)
}
})
},
/** 数据回显*/
loadItemByCode(){
if(!this.value || this.value=="0"){
this.treeValue = []
}else{
getAction(this.view,{ids:this.value}).then(res=>{
if(res.success){
if (res.result && res.result.length > 0) {
let values = this.value.split(',')
this.treeValue = res.result.map((item, index) => ({
key: values[index],
value: values[index],
label: item
}))
this.onLoadTriggleChange(res.result[0]);
}
}
})
}
},
onLoadTriggleChange(text){
//只有单选才会触发
if(!this.multiple && this.loadTriggleChange){
this.backValue(this.value,text)
}
},
backValue(value,label){
let obj = {}
if(this.back){
obj[this.back] = label
}
/*
* 使用$listeners向上暴露事件---和$emit一起使用出现的问题:change事件会执行两遍
* 解决办法:改变选中时提交的事件名*/
this.$emit('change', value, obj)
},
asyncLoadTreeData (treeNode) {
return new Promise((resolve) => {
if (treeNode.$vnode.children) {
resolve()
return
}
let pid = treeNode.$vnode.key
let param = {
pid:pid,
condition:this.condition
}
getAction(this.url,param).then(res=>{
if(res.success){
for(let i of res.result){
i.value = i.key
if(i.leaf==false){
i.isLeaf=false
}else if(i.leaf==true){
i.isLeaf=true
}
}
this.addChildren(pid,res.result,this.treeData)
this.treeData = [...this.treeData]
}
resolve()
})
})
},
addChildren(pid,children,treeArray){
if(treeArray && treeArray.length>0){
for(let item of treeArray){
if(item.key == pid){
if(!children || children.length==0){
item.isLeaf=true
}else{
item.children = children
}
break
}else{
this.addChildren(pid,children,item.children)
}
}
}
},
onChange(value){
if(!value){
/*
* 使用$listeners向上暴露事件---和$emit一起使用出现的问题:change事件会执行两遍
* 解决办法:改变选中时提交的事件名*/
this.$emit('change', '');
this.treeValue = ''
} else if (Array.isArray(value)) {
let labels = []
let values = value.map(item => {
labels.push(item.label)
return item.value
})
this.backValue(values.join(','), labels.join(','))
this.treeValue = value
} else {
this.backValue(value.value,value.label)
this.treeValue = value
}
},
getCurrTreeData(){
return this.treeData
},
validateProp(){
let myCondition = this.condition
return new Promise((resolve,reject)=>{
if(!myCondition){
resolve();
}else{
try {
let test=JSON.parse(myCondition);
if(typeof test == 'object' && test){
resolve()
}else{
this.$message.error("组件JTreeSelect-condition传值有误,需要一个json字符串!")
reject()
}
} catch(e) {
this.$message.error("组件JTreeSelect-condition传值有误,需要一个json字符串!")
reject()
/** 数据回显 */
loadItemByCode () {
if (!this.value || this.value == '0') {
this.treeValue = []
} else {
getAction(this.view, { ids: this.value }).then(res => {
if (res.success) {
if (res.result && res.result.length > 0) {
const values = this.value.split(',')
this.treeValue = res.result.map((item, index) => ({
key: values[index],
value: values[index],
label: item
}))
this.onLoadTriggleChange(res.result[0])
}
}
})
}
},
//2.2新增 在组件内定义 指定父组件调用时候的传值属性和事件类型 这个牛逼
model: {
prop: 'value',
event: 'change'
onLoadTriggleChange (text) {
// 只有单选才会触发
if (!this.multiple && this.loadTriggleChange) {
this.backValue(this.value, text)
}
},
backValue (value, label) {
const obj = {}
if (this.back) {
obj[this.back] = label
}
/*
* 使用$listeners向上暴露事件---和$emit一起使用出现的问题:change事件会执行两遍
* 解决办法:改变选中时提交的事件名 */
this.$emit('change', value, obj)
},
asyncLoadTreeData (treeNode) {
return new Promise((resolve) => {
if (treeNode.$vnode.children) {
resolve()
return
}
const pid = treeNode.$vnode.key
const param = {
pid: pid,
condition: this.condition
}
getAction(this.url, param).then(res => {
if (res.success) {
for (const i of res.result) {
i.value = i.key
if (i.leaf == false) {
i.isLeaf = false
} else if (i.leaf == true) {
i.isLeaf = true
}
}
this.addChildren(pid, res.result, this.treeData)
this.treeData = [...this.treeData]
}
resolve()
})
})
},
addChildren (pid, children, treeArray) {
if (treeArray && treeArray.length > 0) {
for (const item of treeArray) {
if (item.key == pid) {
if (!children || children.length == 0) {
item.isLeaf = true
} else {
item.children = children
}
break
} else {
this.addChildren(pid, children, item.children)
}
}
}
},
onChange (value) {
if (!value) {
/*
* 使用$listeners向上暴露事件---和$emit一起使用出现的问题:change事件会执行两遍
* 解决办法:改变选中时提交的事件名 */
this.$emit('change', '')
this.treeValue = ''
} else if (Array.isArray(value)) {
const labels = []
const values = value.map(item => {
labels.push(item.label)
return item.value
})
this.backValue(values.join(','), labels.join(','))
this.treeValue = value
} else {
this.backValue(value.value, value.label)
this.treeValue = value
}
},
getCurrTreeData () {
return this.treeData
},
validateProp () {
const myCondition = this.condition
return new Promise((resolve, reject) => {
if (!myCondition) {
resolve()
} else {
try {
const test = JSON.parse(myCondition)
if (typeof test === 'object' && test) {
resolve()
} else {
this.$message.error('组件JTreeSelect-condition传值有误需要一个json字符串!')
reject()
}
} catch (e) {
this.$message.error('组件JTreeSelect-condition传值有误需要一个json字符串!')
reject()
}
}
})
}
},
// 2.2新增 在组件内定义 指定父组件调用时候的传值属性和事件类型 这个牛逼
model: {
prop: 'value',
event: 'change'
}
}
</script>
+34 -34
View File
@@ -6,41 +6,41 @@
</template>
<script>
export default {
name: 'JCheckbox',
props: {
value:{
type: String,
required: false
},
/*label value*/
options:{
type: Array,
required: true
}
export default {
name: 'JCheckbox',
props: {
value: {
type: String,
required: false
},
data(){
return {
checkboxArray:!this.value?[]:this.value.split(",")
}
},
watch:{
value (val) {
if(!val){
this.checkboxArray = []
}else{
this.checkboxArray = this.value.split(",")
}
}
},
methods:{
onChange (checkedValues) {
this.$emit('change', checkedValues.join(","));
},
},
model: {
prop: 'value',
event: 'change'
/* label value */
options: {
type: Array,
required: true
}
},
data () {
return {
checkboxArray: !this.value ? [] : this.value.split(',')
}
},
watch: {
value (val) {
if (!val) {
this.checkboxArray = []
} else {
this.checkboxArray = this.value.split(',')
}
}
},
methods: {
onChange (checkedValues) {
this.$emit('change', checkedValues.join(','))
}
},
model: {
prop: 'value',
event: 'change'
}
}
</script>
+326 -326
View File
@@ -21,346 +21,346 @@
</template>
<script type="text/ecmascript-6">
// 引入全局实例
import _CodeMirror from 'codemirror'
// 引入全局实例
import _CodeMirror from 'codemirror'
// 核心样式
import 'codemirror/lib/codemirror.css'
// 引入主题后还需要在 options 中指定主题才会生效 darcula gruvbox-dark hopscotch monokai
import 'codemirror/theme/panda-syntax.css'
// 提示css
import 'codemirror/addon/hint/show-hint.css'
// 核心样式
import 'codemirror/lib/codemirror.css'
// 引入主题后还需要在 options 中指定主题才会生效 darcula gruvbox-dark hopscotch monokai
import 'codemirror/theme/panda-syntax.css'
// 提示css
import 'codemirror/addon/hint/show-hint.css'
// 需要引入具体的语法高亮库才会有对应的语法高亮效果
// codemirror 官方其实支持通过 /addon/mode/loadmode.js 和 /mode/meta.js 来实现动态加载对应语法高亮库
// 但 vue 貌似没有无法在实例初始化后再动态加载对应 JS ,所以此处才把对应的 JS 提前引入
import 'codemirror/mode/javascript/javascript.js'
import 'codemirror/mode/css/css.js'
import 'codemirror/mode/xml/xml.js'
import 'codemirror/mode/clike/clike.js'
import 'codemirror/mode/markdown/markdown.js'
import 'codemirror/mode/python/python.js'
import 'codemirror/mode/r/r.js'
import 'codemirror/mode/shell/shell.js'
import 'codemirror/mode/sql/sql.js'
import 'codemirror/mode/swift/swift.js'
import 'codemirror/mode/vue/vue.js'
// 需要引入具体的语法高亮库才会有对应的语法高亮效果
// codemirror 官方其实支持通过 /addon/mode/loadmode.js 和 /mode/meta.js 来实现动态加载对应语法高亮库
// 但 vue 貌似没有无法在实例初始化后再动态加载对应 JS ,所以此处才把对应的 JS 提前引入
import 'codemirror/mode/javascript/javascript.js'
import 'codemirror/mode/css/css.js'
import 'codemirror/mode/xml/xml.js'
import 'codemirror/mode/clike/clike.js'
import 'codemirror/mode/markdown/markdown.js'
import 'codemirror/mode/python/python.js'
import 'codemirror/mode/r/r.js'
import 'codemirror/mode/shell/shell.js'
import 'codemirror/mode/sql/sql.js'
import 'codemirror/mode/swift/swift.js'
import 'codemirror/mode/vue/vue.js'
import { isIE11, isIE } from '@/utils/browser'
import { isIE11, isIE } from '@/utils/browser'
// 尝试获取全局实例
const CodeMirror = window.CodeMirror || _CodeMirror
// 尝试获取全局实例
const CodeMirror = window.CodeMirror || _CodeMirror
export default {
name: 'JCodeEditor',
props: {
// 外部传入的内容,用于实现双向绑定
value: {
type: String,
default: ''
export default {
name: 'JCodeEditor',
props: {
// 外部传入的内容,用于实现双向绑定
value: {
type: String,
default: ''
},
// 外部传入的语法类型
language: {
type: String,
default: null
},
languageChange: {
type: Boolean,
default: false,
required: false
},
placeholder: {
type: String,
default: null
},
// 显示行号
lineNumbers: {
type: Boolean,
default: true
},
// 是否显示全屏按钮
fullScreen: {
type: Boolean,
default: false
},
// 全屏以后的z-index
zIndex: {
type: [Number, String],
default: 999
},
// 是否自适应高度,可以传String或Boolean
// 传 String 类型只能写"!ie"
// 填写这个字符串,代表其他浏览器自适应高度
// 唯独IE下不自适应高度,因为IE下不支持min、max-height样式
// 如果填写的不是"!ie"就视为true
autoHeight: {
type: [String, Boolean],
default: true
},
// 不自适应高度的情况下生效的固定高度
height: {
type: [String, Number],
default: '240px'
}
},
data () {
return {
// 内部真实的内容
code: '',
iconType: 'fullscreen',
hasCode: false,
// 默认的语法类型
mode: 'javascript',
// 编辑器实例
coder: null,
// 默认配置
options: {
// 缩进格式
tabSize: 2,
// 主题,对应主题库 JS 需要提前引入
theme: 'panda-syntax',
line: true,
// extraKeys: {'Ctrl': 'autocomplete'},//自定义快捷键
hintOptions: {
tables: {
users: ['name', 'score', 'birthDate'],
countries: ['name', 'population', 'size']
}
}
},
// 外部传入的语法类型
language: {
type: String,
default: null
},
languageChange: {
type: Boolean,
default: false,
required: false
},
placeholder: {
type: String,
default: null
},
// 显示行号
lineNumbers: {
type: Boolean,
default: true
},
// 是否显示全屏按钮
fullScreen: {
type: Boolean,
default: false
},
// 全屏以后的z-index
zIndex: {
type: [Number, String],
default: 999
},
// 是否自适应高度,可以传String或Boolean
// 传 String 类型只能写"!ie"
// 填写这个字符串,代表其他浏览器自适应高度
// 唯独IE下不自适应高度,因为IE下不支持min、max-height样式
// 如果填写的不是"!ie"就视为true
autoHeight: {
type: [String, Boolean],
default: true
},
// 不自适应高度的情况下生效的固定高度
height: {
type: [String, Number],
default: '240px'
// 支持切换的语法高亮类型,对应 JS 已经提前引入
// 使用的是 MIME-TYPE ,不过作为前缀的 text/ 在后面指定时写死了
modes: [{
value: 'css',
label: 'CSS'
}, {
value: 'javascript',
label: 'Javascript'
}, {
value: 'html',
label: 'XML/HTML'
}, {
value: 'x-java',
label: 'Java'
}, {
value: 'x-objectivec',
label: 'Objective-C'
}, {
value: 'x-python',
label: 'Python'
}, {
value: 'x-rsrc',
label: 'R'
}, {
value: 'x-sh',
label: 'Shell'
}, {
value: 'x-sql',
label: 'SQL'
}, {
value: 'x-swift',
label: 'Swift'
}, {
value: 'x-vue',
label: 'Vue'
}, {
value: 'markdown',
label: 'Markdown'
}],
// code 编辑器 是否全屏
fullCoder: false
}
},
watch: {
fullCoder: {
handler (value) {
if (value) {
this.iconType = 'fullscreen-exit'
} else {
this.iconType = 'fullscreen'
}
}
},
data () {
return {
// 内部真实的内容
code: '',
iconType: 'fullscreen',
hasCode: false,
// 默认的语法类型
mode: 'javascript',
// 编辑器实例
coder: null,
// 默认配置
options: {
// 缩进格式
tabSize: 2,
// 主题,对应主题库 JS 需要提前引入
theme: 'panda-syntax',
line: true,
// extraKeys: {'Ctrl': 'autocomplete'},//自定义快捷键
hintOptions: {
tables: {
users: ['name', 'score', 'birthDate'],
countries: ['name', 'population', 'size']
// value: {
// immediate: false,
// handler(value) {
// this._getCoder().then(() => {
// this.coder.setValue(value)
// })
// }
// },
language: {
immediate: true,
handler (language) {
this._getCoder().then(() => {
// 尝试从父容器获取语法类型
if (language) {
// 获取具体的语法类型对象
const modeObj = this._getLanguage(language)
// 判断父容器传入的语法是否被支持
if (modeObj) {
this.mode = modeObj.label
this.coder.setOption('mode', `text/${modeObj.value}`)
}
}
},
// 支持切换的语法高亮类型,对应 JS 已经提前引入
// 使用的是 MIME-TYPE ,不过作为前缀的 text/ 在后面指定时写死了
modes: [{
value: 'css',
label: 'CSS'
}, {
value: 'javascript',
label: 'Javascript'
}, {
value: 'html',
label: 'XML/HTML'
}, {
value: 'x-java',
label: 'Java'
}, {
value: 'x-objectivec',
label: 'Objective-C'
}, {
value: 'x-python',
label: 'Python'
}, {
value: 'x-rsrc',
label: 'R'
}, {
value: 'x-sh',
label: 'Shell'
}, {
value: 'x-sql',
label: 'SQL'
}, {
value: 'x-swift',
label: 'Swift'
}, {
value: 'x-vue',
label: 'Vue'
}, {
value: 'markdown',
label: 'Markdown'
}],
// code 编辑器 是否全屏
fullCoder: false
}
},
watch: {
fullCoder: {
handler(value) {
if (value) {
this.iconType = 'fullscreen-exit'
} else {
this.iconType = 'fullscreen'
}
}
},
// value: {
// immediate: false,
// handler(value) {
// this._getCoder().then(() => {
// this.coder.setValue(value)
// })
// }
// },
language: {
immediate: true,
handler(language) {
this._getCoder().then(() => {
// 尝试从父容器获取语法类型
if (language) {
// 获取具体的语法类型对象
let modeObj = this._getLanguage(language)
// 判断父容器传入的语法是否被支持
if (modeObj) {
this.mode = modeObj.label
this.coder.setOption('mode', `text/${modeObj.value}`)
}
}
})
}
}
},
computed: {
placeholderShow() {
if (this.placeholder == null) {
return `请在此输入${this.language}代码`
} else {
return this.placeholder
}
},
nullTipStyle() {
if (this.lineNumbers) {
return { left: '36px' }
} else {
return { left: '12px' }
}
},
// coder 配置
coderOptions() {
return {
tabSize: this.options.tabSize,
theme: this.options.theme,
lineNumbers: this.lineNumbers,
line: true,
hintOptions: this.options.hintOptions
}
},
isAutoHeight() {
let { autoHeight } = this
if (typeof autoHeight === 'string' && autoHeight.toLowerCase().trim() === '!ie') {
autoHeight = !(isIE() || isIE11())
} else {
autoHeight = true
}
return autoHeight
},
fullScreenParentProps() {
let props = {
class: {
'full-screen-parent': true,
'full-screen': this.fullCoder,
'auto-height': this.isAutoHeight
},
style: {}
}
if (isIE() || isIE11()) {
props.style['height'] = '240px'
}
if (this.fullCoder) {
props.style['z-index'] = this.zIndex
}
if (!this.isAutoHeight) {
props.style['height'] = (typeof this.height === 'number' ? this.height + 'px' : this.height)
}
return props
}
},
mounted () {
// 初始化
this._initialize()
},
methods: {
// 初始化
_initialize () {
// 初始化编辑器实例,传入需要被实例化的文本域对象和默认配置
this.coder = CodeMirror.fromTextArea(this.$refs.textarea, this.coderOptions)
// 编辑器赋值
if (this.value || this.code) {
this.hasCode = true
// this.coder.setValue(this.value || this.code)
this.setCodeContent(this.value || this.code)
} else {
this.coder.setValue('')
this.hasCode = false
}
// 支持双向绑定
this.coder.on('change', (coder) => {
this.code = coder.getValue()
if (this.code) {
this.hasCode = true
} else {
this.hasCode = false
}
if (this.$emit) {
this.$emit('input', this.code)
}
})
this.coder.on('focus', () => {
this.hasCode = true
})
this.coder.on('blur', () => {
if (this.code) {
this.hasCode = true
} else {
this.hasCode = false
}
})
/* this.coder.on('cursorActivity',()=>{
this.coder.showHint()
}) */
},
getCodeContent() {
return this.code
},
setCodeContent(val) {
setTimeout(() => {
if (!val) {
this.coder.setValue('')
} else {
this.coder.setValue(val)
}
}, 300)
},
// 获取当前语法类型
_getLanguage (language) {
// 在支持的语法类型列表中寻找传入的语法类型
return this.modes.find((mode) => {
// 所有的值都忽略大小写,方便比较
let currentLanguage = language.toLowerCase()
let currentLabel = mode.label.toLowerCase()
let currentValue = mode.value.toLowerCase()
// 由于真实值可能不规范,例如 java 的真实值是 x-java ,所以讲 value 和 label 同时和传入语法进行比较
return currentLabel === currentLanguage || currentValue === currentLanguage
})
},
_getCoder() {
let _this = this
return new Promise((resolve) => {
(function get() {
if (_this.coder) {
resolve(_this.coder)
} else {
setTimeout(get, 10)
}
})()
})
},
// 更改模式
changeMode (val) {
// 修改编辑器的语法配置
this.coder.setOption('mode', `text/${val}`)
// 获取修改后的语法
let label = this._getLanguage(val).label.toLowerCase()
// 允许父容器通过以下函数监听当前的语法值
this.$emit('language-change', label)
},
nullTipClick() {
this.coder.focus()
}
}
},
computed: {
placeholderShow () {
if (this.placeholder == null) {
return `请在此输入${this.language}代码`
} else {
return this.placeholder
}
},
nullTipStyle () {
if (this.lineNumbers) {
return { left: '36px' }
} else {
return { left: '12px' }
}
},
// coder 配置
coderOptions () {
return {
tabSize: this.options.tabSize,
theme: this.options.theme,
lineNumbers: this.lineNumbers,
line: true,
hintOptions: this.options.hintOptions
}
},
isAutoHeight () {
let { autoHeight } = this
if (typeof autoHeight === 'string' && autoHeight.toLowerCase().trim() === '!ie') {
autoHeight = !(isIE() || isIE11())
} else {
autoHeight = true
}
return autoHeight
},
fullScreenParentProps () {
const props = {
class: {
'full-screen-parent': true,
'full-screen': this.fullCoder,
'auto-height': this.isAutoHeight
},
style: {}
}
if (isIE() || isIE11()) {
props.style.height = '240px'
}
if (this.fullCoder) {
props.style['z-index'] = this.zIndex
}
if (!this.isAutoHeight) {
props.style.height = (typeof this.height === 'number' ? this.height + 'px' : this.height)
}
return props
}
},
mounted () {
// 初始化
this._initialize()
},
methods: {
// 初始化
_initialize () {
// 初始化编辑器实例,传入需要被实例化的文本域对象和默认配置
this.coder = CodeMirror.fromTextArea(this.$refs.textarea, this.coderOptions)
// 编辑器赋值
if (this.value || this.code) {
this.hasCode = true
// this.coder.setValue(this.value || this.code)
this.setCodeContent(this.value || this.code)
} else {
this.coder.setValue('')
this.hasCode = false
}
// 支持双向绑定
this.coder.on('change', (coder) => {
this.code = coder.getValue()
if (this.code) {
this.hasCode = true
} else {
this.hasCode = false
}
if (this.$emit) {
this.$emit('input', this.code)
}
})
this.coder.on('focus', () => {
this.hasCode = true
})
this.coder.on('blur', () => {
if (this.code) {
this.hasCode = true
} else {
this.hasCode = false
}
})
/* this.coder.on('cursorActivity',()=>{
this.coder.showHint()
}) */
},
getCodeContent () {
return this.code
},
setCodeContent (val) {
setTimeout(() => {
if (!val) {
this.coder.setValue('')
} else {
this.coder.setValue(val)
}
}, 300)
},
// 获取当前语法类型
_getLanguage (language) {
// 在支持的语法类型列表中寻找传入的语法类型
return this.modes.find((mode) => {
// 所有的值都忽略大小写,方便比较
const currentLanguage = language.toLowerCase()
const currentLabel = mode.label.toLowerCase()
const currentValue = mode.value.toLowerCase()
// 由于真实值可能不规范,例如 java 的真实值是 x-java ,所以讲 value 和 label 同时和传入语法进行比较
return currentLabel === currentLanguage || currentValue === currentLanguage
})
},
_getCoder () {
const _this = this
return new Promise((resolve) => {
(function get () {
if (_this.coder) {
resolve(_this.coder)
} else {
setTimeout(get, 10)
}
})()
})
},
// 更改模式
changeMode (val) {
// 修改编辑器的语法配置
this.coder.setOption('mode', `text/${val}`)
// 获取修改后的语法
const label = this._getLanguage(val).label.toLowerCase()
// 允许父容器通过以下函数监听当前的语法值
this.$emit('language-change', label)
},
nullTipClick () {
this.coder.focus()
}
}
}
</script>
<style lang="less">
+38 -38
View File
@@ -8,46 +8,46 @@
</div>
</template>
<script>
import JCronModal from "./modal/JCronModal";
export default {
name: 'JCron',
components: {
JCronModal
},
props: {
value: {
required: false,
type: String,
}
},
data(){
return {
cron: this.value,
}
},
watch:{
value(val){
this.cron = val
}
},
methods:{
openModal(){
this.$refs.innerVueCron.show();
},
handleOK(val){
this.cron = val;
this.$emit("change", this.cron);
//this.$emit("change", Object.assign({}, this.cron));
},
handleEmpty(){
this.handleOK('')
}
},
model: {
prop: 'value',
event: 'change'
import JCronModal from './modal/JCronModal'
export default {
name: 'JCron',
components: {
JCronModal
},
props: {
value: {
required: false,
type: String
}
},
data () {
return {
cron: this.value
}
},
watch: {
value (val) {
this.cron = val
}
},
methods: {
openModal () {
this.$refs.innerVueCron.show()
},
handleOK (val) {
this.cron = val
this.$emit('change', this.cron)
// this.$emit("change", Object.assign({}, this.cron));
},
handleEmpty () {
this.handleOK('')
}
},
model: {
prop: 'value',
event: 'change'
}
}
</script>
<style scoped>
.components-input-demo-presuffix .anticon-close-circle {
+90 -90
View File
@@ -57,104 +57,104 @@
</span>
</template>
<script>
import moment from 'moment'
export default {
name: 'JDate',
props: {
placeholder:{
type: String,
default: '请选择',
required: false
},
value:{
type: String,
required: false
},
dateFormat:{
type: String,
default: 'YYYY-MM-DD',
required: false
},
readOnly:{
type: Boolean,
required: false,
default: false
},
disabled:{
type: Boolean,
required: false,
default: false
},
//控制选择时分秒
showType:{
type: String,
required: false,
default:'time'
},
getCalendarContainer: {
type: Function,
default: (node) => node.parentNode
}
import moment from 'moment'
export default {
name: 'JDate',
props: {
placeholder: {
type: String,
default: '请选择',
required: false
},
data () {
let dateStr = this.value;
return {
yearShowOne:false, //控制年份模态框的显示与否
year:'', // mode==“year” 专用
momVal:!dateStr?null:moment(dateStr,this.dateFormat)
}
value: {
type: String,
required: false
},
computed: {
//透传给下级组件的事件,需要排除本组件使用的change事件
childListeners() {
const vm = this;
let result = Object.assign({},
this.$listeners,
)
delete result.change;
return result;
}
dateFormat: {
type: String,
default: 'YYYY-MM-DD',
required: false
},
watch: {
value (val) {
let fm = this.dateFormat
moment.prototype.toJSON = function(){
return moment(this).format(fm)
}
if(!val){
this.momVal = null
}else{
this.momVal = moment(val,this.dateFormat)
}
}
readOnly: {
type: Boolean,
required: false,
default: false
},
methods: {
moment,
handleDateChange(mom,dateStr){
this.$emit('change', dateStr);
},
handleMonthChange(mom,dateStr){
this.$emit('change',dateStr)
},
/**
disabled: {
type: Boolean,
required: false,
default: false
},
// 控制选择时分秒
showType: {
type: String,
required: false,
default: 'time'
},
getCalendarContainer: {
type: Function,
default: (node) => node.parentNode
}
},
data () {
const dateStr = this.value
return {
yearShowOne: false, // 控制年份模态框的显示与否
year: '', // mode==“year” 专用
momVal: !dateStr ? null : moment(dateStr, this.dateFormat)
}
},
computed: {
// 透传给下级组件的事件,需要排除本组件使用的change事件
childListeners () {
const vm = this
const result = Object.assign({},
this.$listeners
)
delete result.change
return result
}
},
watch: {
value (val) {
const fm = this.dateFormat
moment.prototype.toJSON = function () {
return moment(this).format(fm)
}
if (!val) {
this.momVal = null
} else {
this.momVal = moment(val, this.dateFormat)
}
}
},
methods: {
moment,
handleDateChange (mom, dateStr) {
this.$emit('change', dateStr)
},
handleMonthChange (mom, dateStr) {
this.$emit('change', dateStr)
},
/**
* 弹出日历和关闭日历的回调
* status:打开或关闭的状态
* */
openChangeOne(status){
this.yearShowOne = status
},
// 得到年份选择器的值
panelChangeOne(value){
this.yearShowOne = false
let year = moment(value,this.dateFormat).year().toString() // 处理成字符串
this.year = value //组件显示的
this.$emit('change',year)
}
openChangeOne (status) {
this.yearShowOne = status
},
//2.2新增 在组件内定义 指定父组件调用时候的传值属性和事件类型
model: {
prop: 'value',
event: 'change'
// 得到年份选择器的值
panelChangeOne (value) {
this.yearShowOne = false
const year = moment(value, this.dateFormat).year().toString() // 处理成字符串
this.year = value // 组件显示的
this.$emit('change', year)
}
},
// 2.2新增 在组件内定义 指定父组件调用时候的传值属性和事件类型
model: {
prop: 'value',
event: 'change'
}
}
</script>
@@ -114,7 +114,7 @@ export default {
default: null
}
},
data() {
data () {
return {
curtab: this.hideSecond ? 'minute' : 'second',
second: '*',
@@ -124,13 +124,13 @@ export default {
month: '*',
week: '?',
year: '*',
inputValues: {second: '', minute: '', hour: '', day: '', month: '', week: '', year: '', cron: ''},
preTimeList: '执行预览,会忽略年份参数',
inputValues: { second: '', minute: '', hour: '', day: '', month: '', week: '', year: '', cron: '' },
preTimeList: '执行预览,会忽略年份参数'
}
},
computed: {
cronValue_c() {
let result = []
cronValue_c () {
const result = []
if (!this.hideSecond) result.push(this.second ? this.second : '*')
result.push(this.minute ? this.minute : '*')
result.push(this.hour ? this.hour : '*')
@@ -140,7 +140,7 @@ export default {
if (!this.hideYear && !this.hideSecond) result.push(this.year ? this.year : '*')
return result.join(' ')
},
cronValue_c2() {
cronValue_c2 () {
const v = this.cronValue_c
if (this.hideYear || this.hideSecond) return v
const vs = v.split(' ')
@@ -149,62 +149,62 @@ export default {
vs[5] = this.convertQuartzWeekToCParser(vs[5])
}
return vs.slice(0, vs.length - 1).join(' ')
},
}
},
watch: {
cronValue(newVal, oldVal) {
cronValue (newVal, oldVal) {
if (newVal === this.cronValue_c) {
// console.info('same cron value: ' + newVal)
return
}
this.formatValue()
},
cronValue_c(newVal, oldVal) {
cronValue_c (newVal, oldVal) {
this.calTriggerList()
this.$emit('change', newVal)
this.assignInput()
},
minute() {
minute () {
if (this.second === '*') {
this.second = '0'
}
},
hour() {
hour () {
if (this.minute === '*') {
this.minute = '0'
}
},
day(day) {
day (day) {
if (day !== '?' && this.hour === '*') {
this.hour = '0'
}
},
week(week) {
week (week) {
if (week !== '?' && this.hour === '*') {
this.hour = '0'
}
},
month() {
month () {
if (this.day === '?' && this.week === '*') {
this.week = '1'
} else if (this.week === '?' && this.day === '*') {
this.day = '1'
}
},
year() {
year () {
if (this.month === '*') {
this.month = '1'
}
},
}
},
created() {
created () {
this.formatValue()
this.$nextTick(() => {
this.calTriggerListInner()
})
},
methods: {
assignInput() {
assignInput () {
Object.assign(this.inputValues, {
second: this.second,
minute: this.minute,
@@ -213,10 +213,10 @@ export default {
month: this.month,
week: this.week,
year: this.year,
cron: this.cronValue_c,
cron: this.cronValue_c
})
},
formatValue() {
formatValue () {
if (!this.cronValue) return
const values = this.cronValue.split(' ').filter(item => !!item)
if (!values || values.length <= 0) return
@@ -233,7 +233,7 @@ export default {
calTriggerList: simpleDebounce(function () {
this.calTriggerListInner()
}, 500),
calTriggerListInner() {
calTriggerListInner () {
// 设置了回调函数
if (this.remote) {
this.remote(this.cronValue_c, +new Date(), v => {
@@ -252,7 +252,7 @@ export default {
}
this.preTimeList = result.length > 0 ? result.join('\n') : '无执行时间'
},
onInputBlur(){
onInputBlur () {
this.second = this.inputValues.second
this.minute = this.inputValues.minute
this.hour = this.inputValues.hour
@@ -261,14 +261,14 @@ export default {
this.week = this.inputValues.week
this.year = this.inputValues.year
},
onInputCronBlur(event){
onInputCronBlur (event) {
this.$emit('change', event.target.value)
},
}
},
model: {
prop: 'cronValue',
event: 'change'
},
}
}
</script>
@@ -24,7 +24,7 @@ import EasyCron from './EasyCron.vue'
export default {
name: 'input-cron',
components: {EasyCron},
components: { EasyCron },
model: {
prop: 'cronValue',
event: 'change'
@@ -63,25 +63,25 @@ export default {
default: null
}
},
data() {
data () {
return {
editCronValue: this.cronValue,
show: false,
show: false
}
},
watch: {
cronValue(newVal, oldVal) {
cronValue (newVal, oldVal) {
if (newVal === this.editCronValue) {
return
}
this.editCronValue = newVal
},
editCronValue(newVal, oldVal) {
editCronValue (newVal, oldVal) {
this.$emit('change', newVal)
}
},
methods: {
showConfigDlg() {
showConfigDlg () {
if (!this.disabled) {
this.show = true
}
@@ -3,4 +3,4 @@
import InputCron from './InputCron.vue'
InputCron.name = 'JEasyCron'
export default InputCron
export default InputCron
@@ -1,11 +1,11 @@
export const WEEK_MAP_EN = {
'SUN': '1',
'MON': '2',
'TUE': '3',
'WED': '4',
'THU': '5',
'FRI': '6',
'SAT': '7'
SUN: '1',
MON: '2',
TUE: '3',
WED: '4',
THU: '5',
FRI: '6',
SAT: '7'
}
export const replaceWeekName = (c) => {
@@ -60,30 +60,30 @@ export default {
default: '?'
}
},
data() {
data () {
return {}
},
computed: {
disableChoice() {
disableChoice () {
return (this.week && this.week !== '?') || this.disabled
}
},
watch: {
value_c(newVal, oldVal) {
value_c (newVal, oldVal) {
// 数值变化
this.updateValue()
},
week(newVal, oldVal) {
week (newVal, oldVal) {
// console.info('new week: ' + newVal)
this.updateValue()
}
},
methods: {
updateValue() {
updateValue () {
this.$emit('change', this.disableChoice ? '?' : this.value_c)
}
},
created() {
created () {
this.DEFAULT_VALUE = '*'
this.minValue = 1
this.maxValue = 31
@@ -41,15 +41,15 @@ import mixin from './mixin'
export default {
name: 'minute',
mixins: [mixin],
data() {
data () {
return {}
},
watch: {
value_c(newVal, oldVal) {
value_c (newVal, oldVal) {
this.$emit('change', newVal)
}
},
created() {
created () {
this.DEFAULT_VALUE = '*'
this.minValue = 0
this.maxValue = 23
@@ -41,15 +41,15 @@ import mixin from './mixin'
export default {
name: 'minute',
mixins: [mixin],
data() {
data () {
return {}
},
watch: {
value_c(newVal, oldVal) {
value_c (newVal, oldVal) {
this.$emit('change', newVal)
}
},
created() {
created () {
this.DEFAULT_VALUE = '*'
this.minValue = 0
this.maxValue = 59
@@ -68,7 +68,7 @@ export default {
},
computed: {
value_c () {
let result = []
const result = []
switch (this.type) {
case TYPE_NOT_SET:
result.push('?')
@@ -101,13 +101,13 @@ export default {
return result.length > 0 ? result.join('') : this.DEFAULT_VALUE
},
// 指定值范围区间,介于最小值和最大值之间
specifyRange() {
let range = []
specifyRange () {
const range = []
for (let i = this.minValue; i <= this.maxValue; i++) {
range.push(i)
}
return range
},
}
},
methods: {
parseProp (value) {
@@ -41,15 +41,15 @@ import mixin from './mixin'
export default {
name: 'month',
mixins: [mixin],
data() {
data () {
return {}
},
watch: {
value_c(newVal, oldVal) {
value_c (newVal, oldVal) {
this.$emit('change', newVal)
}
},
created() {
created () {
this.DEFAULT_VALUE = '*'
this.minValue = 1
this.maxValue = 12
@@ -41,15 +41,15 @@ import mixin from './mixin'
export default {
name: 'second',
mixins: [mixin],
data() {
data () {
return {}
},
watch: {
value_c(newVal, oldVal) {
value_c (newVal, oldVal) {
this.$emit('change', newVal)
}
},
created() {
created () {
this.DEFAULT_VALUE = '*'
this.minValue = 0
this.maxValue = 59
@@ -51,14 +51,14 @@ import mixin from './mixin'
import { replaceWeekName, WEEK_MAP_EN } from './const.js'
const WEEK_MAP = {
'周一': 2,
'周二': 3,
'周三': 4,
'周四': 5,
'周五': 6,
'周六': 7,
周一: 2,
周二: 3,
周三: 4,
周四: 5,
周五: 6,
周六: 7,
// 按照国人习惯,将周日放到每周的最后一天
'周日': 1,
周日: 1
}
export default {
@@ -70,36 +70,36 @@ export default {
default: '*'
}
},
data() {
data () {
return {
WEEK_MAP,
WEEK_MAP_EN
}
},
computed: {
disableChoice() {
disableChoice () {
return (this.day && this.day !== '?') || this.disabled
}
},
watch: {
value_c(newVal, oldVal) {
value_c (newVal, oldVal) {
// 如果设置日,那么星期就直接不设置
this.updateValue()
},
day(newVal) {
day (newVal) {
// console.info('new day: ' + newVal)
this.updateValue()
}
},
methods: {
updateValue() {
updateValue () {
this.$emit('change', this.disableChoice ? '?' : this.value_c)
},
preProcessProp(c) {
preProcessProp (c) {
return replaceWeekName(c)
}
},
created() {
created () {
this.DEFAULT_VALUE = '*'
// 0,7表示周日 1表示周一
this.minValue = 1
@@ -31,16 +31,16 @@ import mixin from './mixin'
export default {
name: 'year',
mixins: [mixin],
data() {
data () {
return {}
},
watch: {
value_c(newVal, oldVal) {
value_c (newVal, oldVal) {
// console.info('change:' + newVal)
this.$emit('change', newVal)
}
},
created() {
created () {
const nowYear = (new Date()).getFullYear()
this.DEFAULT_VALUE = '*'
this.minValue = 0
File diff suppressed because it is too large Load Diff
+134 -134
View File
@@ -11,159 +11,159 @@
</template>
<script>
import tinymce from 'tinymce/tinymce'
import Editor from '@tinymce/tinymce-vue'
import 'tinymce/themes/silver/theme'
import 'tinymce/plugins/image'
import 'tinymce/plugins/link'
import 'tinymce/plugins/media'
import 'tinymce/plugins/table'
import 'tinymce/plugins/lists'
import 'tinymce/plugins/contextmenu'
import 'tinymce/plugins/wordcount'
import 'tinymce/plugins/colorpicker'
import 'tinymce/plugins/textcolor'
import 'tinymce/plugins/fullscreen'
import 'tinymce/icons/default'
import { uploadAction,getFileAccessHttpUrl } from '@/api/manage'
import { getVmParentByName } from '@/utils/util'
export default {
components: {
Editor
import tinymce from 'tinymce/tinymce'
import Editor from '@tinymce/tinymce-vue'
import 'tinymce/themes/silver/theme'
import 'tinymce/plugins/image'
import 'tinymce/plugins/link'
import 'tinymce/plugins/media'
import 'tinymce/plugins/table'
import 'tinymce/plugins/lists'
import 'tinymce/plugins/contextmenu'
import 'tinymce/plugins/wordcount'
import 'tinymce/plugins/colorpicker'
import 'tinymce/plugins/textcolor'
import 'tinymce/plugins/fullscreen'
import 'tinymce/icons/default'
import { uploadAction, getFileAccessHttpUrl } from '@/api/manage'
import { getVmParentByName } from '@/utils/util'
export default {
components: {
Editor
},
props: {
value: {
type: String,
required: false
},
props: {
value: {
type: String,
required:false
},
triggerChange:{
type: Boolean,
default: false,
required:false
},
disabled: {
type: Boolean,
default: false
},
plugins: {
type: [String, Array],
default: 'lists image link media table textcolor wordcount contextmenu fullscreen'
},
toolbar: {
type: [String, Array],
default: 'undo redo | formatselect | bold italic | alignleft aligncenter alignright alignjustify | bullist numlist outdent indent | lists link unlink image media table | removeformat | fullscreen',
branding:false
}
triggerChange: {
type: Boolean,
default: false,
required: false
},
data() {
return {
//初始化配置
init: {
language_url: '/tinymce/langs/zh_CN.js',
language: 'zh_CN',
skin_url: '/tinymce/skins/lightgray',
height: 300,
plugins: this.plugins,
toolbar: this.toolbar,
branding: false,
menubar: false,
toolbar_drawer: false,
images_upload_handler: (blobInfo, success) => {
let formData = new FormData()
formData.append('file', blobInfo.blob(), blobInfo.filename());
formData.append('biz', "jeditor");
formData.append("jeditor","1");
uploadAction(window._CONFIG['domianURL']+"/sys/common/upload", formData).then((res) => {
if (res.success) {
if(res.message == 'local'){
const img = 'data:image/jpeg;base64,' + blobInfo.base64()
success(img)
}else{
let img = getFileAccessHttpUrl(res.message)
success(img)
}
disabled: {
type: Boolean,
default: false
},
plugins: {
type: [String, Array],
default: 'lists image link media table textcolor wordcount contextmenu fullscreen'
},
toolbar: {
type: [String, Array],
default: 'undo redo | formatselect | bold italic | alignleft aligncenter alignright alignjustify | bullist numlist outdent indent | lists link unlink image media table | removeformat | fullscreen',
branding: false
}
},
data () {
return {
// 初始化配置
init: {
language_url: '/tinymce/langs/zh_CN.js',
language: 'zh_CN',
skin_url: '/tinymce/skins/lightgray',
height: 300,
plugins: this.plugins,
toolbar: this.toolbar,
branding: false,
menubar: false,
toolbar_drawer: false,
images_upload_handler: (blobInfo, success) => {
const formData = new FormData()
formData.append('file', blobInfo.blob(), blobInfo.filename())
formData.append('biz', 'jeditor')
formData.append('jeditor', '1')
uploadAction(window._CONFIG.domianURL + '/sys/common/upload', formData).then((res) => {
if (res.success) {
if (res.message == 'local') {
const img = 'data:image/jpeg;base64,' + blobInfo.base64()
success(img)
} else {
const img = getFileAccessHttpUrl(res.message)
success(img)
}
})
}
},
myValue: this.value,
reloading: false,
}
}
})
}
},
myValue: this.value,
reloading: false
}
},
mounted () {
this.initATabsChangeAutoReload()
},
methods: {
reload () {
this.reloading = true
this.$nextTick(() => this.reloading = false)
},
mounted() {
this.initATabsChangeAutoReload()
onClick (e) {
this.$emit('onClick', e, tinymce)
},
// 可以添加一些自己的自定义事件,如清空内容
clear () {
this.myValue = ''
},
methods: {
reload() {
this.reloading = true
this.$nextTick(() => this.reloading = false)
},
onClick(e) {
this.$emit('onClick', e, tinymce)
},
//可以添加一些自己的自定义事件,如清空内容
clear() {
this.myValue = ''
},
/**
/**
* 自动判断父级是否是 <a-tabs/> 组件,然后添加事件监听,自动触发reload()
*
* 由于 tabs 组件切换会导致 tinymce 无法输入,
* 只有重新加载才能使用(无论是vue版的还是jQuery版tinymce都有这个通病)
*/
initATabsChangeAutoReload() {
// 获取父级
let tabs = getVmParentByName(this, 'ATabs')
let tabPane = getVmParentByName(this, 'ATabPane')
if (tabs && tabPane) {
// 用户自定义的 key
let currentKey = tabPane.$vnode.key
// 添加事件监听
tabs.$on('change', (key) => {
// 切换到自己时执行reload
if (currentKey === key) {
this.reload()
}
initATabsChangeAutoReload () {
// 获取父级
const tabs = getVmParentByName(this, 'ATabs')
const tabPane = getVmParentByName(this, 'ATabPane')
if (tabs && tabPane) {
// 用户自定义的 key
const currentKey = tabPane.$vnode.key
// 添加事件监听
tabs.$on('change', (key) => {
// 切换到自己时执行reload
if (currentKey === key) {
this.reload()
}
})
// update--begin--autor:liusq-----date:20210316------for:富文本编辑器tab父组件可能导致的赋值问题------
this.reload()
// update--end--autor:liusq-----date:20210316------for:富文本编辑器tab父组件可能导致的赋值问题------
} else {
// update--begin--autor:wangshuai-----date:20200724------for:富文本编辑器切换tab无法修改------
const tabLayout = getVmParentByName(this, 'TabLayout')
// update--begin--autor:liusq-----date:20210713------for:处理特殊情况excuteCallback不能使用------
try {
tabLayout.excuteCallback(() => {
this.reload()
})
//update--begin--autor:liusq-----date:20210316------for:富文本编辑器tab父组件可能导致的赋值问题------
this.reload()
//update--end--autor:liusq-----date:20210316------for:富文本编辑器tab父组件可能导致的赋值问题------
}else{
//update--begin--autor:wangshuai-----date:20200724------for:富文本编辑器切换tab无法修改------
let tabLayout = getVmParentByName(this, 'TabLayout')
//update--begin--autor:liusq-----date:20210713------for:处理特殊情况excuteCallback不能使用------
try {
tabLayout.excuteCallback(() => {
this.reload()
})
} catch (error) {
if (tabLayout) {
this.reload()
}
} catch (error) {
if (tabLayout) {
this.reload()
}
//update--end--autor:liusq-----date:20210713------for:处理特殊情况excuteCallback不能使用------
//update--begin--autor:wangshuai-----date:20200724------for:文本编辑器切换tab无法修改------
}
},
// update--end--autor:liusq-----date:20210713------for:处理特殊情况excuteCallback不能使用------
// update--begin--autor:wangshuai-----date:20200724------for:文本编辑器切换tab无法修改------
}
}
},
watch: {
value (newValue) {
this.myValue = (newValue == null ? '' : newValue)
},
watch: {
value(newValue) {
this.myValue = (newValue == null ? '' : newValue)
},
myValue(newValue) {
if(this.triggerChange){
this.$emit('change', newValue)
}else{
this.$emit('input', newValue)
}
myValue (newValue) {
if (this.triggerChange) {
this.$emit('change', newValue)
} else {
this.$emit('input', newValue)
}
}
}
}
</script>
<style scoped>
</style>
</style>
+12 -12
View File
@@ -11,20 +11,20 @@
</template>
<script>
export default {
name: 'JEllipsis',
props: {
value: {
type: String,
required: false,
},
length: {
type: Number,
required: false,
default: 25,
}
export default {
name: 'JEllipsis',
props: {
value: {
type: String,
required: false
},
length: {
type: Number,
required: false,
default: 25
}
}
}
</script>
<style scoped>
+13 -13
View File
@@ -11,7 +11,7 @@
</template>
<script>
/**
/**
* 使用方法
* 在form下直接写这个组件就行了,
*<a-form layout="inline" :form="form" >
@@ -20,19 +20,19 @@
* </j-form-container>
*</a-form>
*/
export default {
name: 'JFormContainer',
props:{
disabled:{
type:Boolean,
default:false,
required:false
}
},
mounted(){
console.log("我是表单禁用专用组件,但是我并不支持表单中iframe的内容禁用")
export default {
name: 'JFormContainer',
props: {
disabled: {
type: Boolean,
default: false,
required: false
}
},
mounted () {
console.log('我是表单禁用专用组件,但是我并不支持表单中iframe的内容禁用')
}
}
</script>
<style>
.jero-form-container-disabled{
@@ -58,4 +58,4 @@
.jero-form-container-disabled .ant-upload-list-item .anticon-close{
display: none;
}
</style>
</style>
+188 -188
View File
@@ -27,207 +27,207 @@
</template>
<script>
import Vue from 'vue'
import { ACCESS_TOKEN } from "@/store/mutation-types"
import { getFileAccessHttpUrl } from '@/api/manage'
const Base64 = require('js-base64').Base64
import Vue from 'vue'
import { ACCESS_TOKEN } from '@/store/mutation-types'
import { getFileAccessHttpUrl } from '@/api/manage'
const Base64 = require('js-base64').Base64
const uidGenerator=()=>{
return '-'+parseInt(Math.random()*10000+1,10);
}
export default {
name: 'JImageUpload',
data(){
return {
uploadAction:window._CONFIG['domianURL']+"/sys/common/upload",
uploadLoading:false,
picUrl:false,
headers:{},
fileList: [],
previewImage:"",
}
const uidGenerator = () => {
return '-' + parseInt(Math.random() * 10000 + 1, 10)
}
export default {
name: 'JImageUpload',
data () {
return {
uploadAction: window._CONFIG.domianURL + '/sys/common/upload',
uploadLoading: false,
picUrl: false,
headers: {},
fileList: [],
previewImage: ''
}
},
props: {
text: {
type: String,
required: false,
default: '上传'
},
props:{
text:{
type:String,
required:false,
default:"上传"
},
/*这个属性用于控制文件上传的业务路径*/
bizPath:{
type:String,
required:false,
default:"temp"
},
value:{
type:[String,Array],
required:false
},
disabled:{
type:Boolean,
required:false,
default: false
},
isMultiple:{
type:Boolean,
required:false,
default: false
},
//update-begin-author:wangshuai date:20201021 for:LOWCOD-969 新增number属性,用于判断上传数量
number:{
type:Number,
required:false,
default:0
}
//update-end-author:wangshuai date:20201021 for:LOWCOD-969 新增number属性,用于判断上传数量
/* 这个属性用于控制文件上传的业务路径 */
bizPath: {
type: String,
required: false,
default: 'temp'
},
computed: {
//透传给下级组件的事件,需要排除本组件使用的change事件
childListeners() {
const vm = this;
let result = Object.assign({},
this.$listeners,
)
delete result.change;
return result;
}
value: {
type: [String, Array],
required: false
},
watch:{
value: {
handler(val,oldValue) {
if (val instanceof Array) {
this.initFileList(val.join(','))
} else {
this.initFileList(val)
}
if(!val || val.length==0){
this.picUrl = false;
}
},
//立刻执行handler
immediate: true
}
disabled: {
type: Boolean,
required: false,
default: false
},
created(){
const token = Vue.ls.get(ACCESS_TOKEN);
this.headers = {"X-Access-Token":token}
isMultiple: {
type: Boolean,
required: false,
default: false
},
methods:{
initFileList(paths){
if(!paths || paths.length==0){
this.fileList = [];
return;
// update-begin-author:wangshuai date:20201021 for:LOWCOD-969 新增number属性,用于判断上传数量
number: {
type: Number,
required: false,
default: 0
}
// update-end-author:wangshuai date:20201021 for:LOWCOD-969 新增number属性,用于判断上传数量
},
computed: {
// 透传给下级组件的事件,需要排除本组件使用的change事件
childListeners () {
const vm = this
const result = Object.assign({},
this.$listeners
)
delete result.change
return result
}
},
watch: {
value: {
handler (val, oldValue) {
if (val instanceof Array) {
this.initFileList(val.join(','))
} else {
this.initFileList(val)
}
this.picUrl = true;
let fileList = [];
let arr = paths.split(",")
for(var a=0;a<arr.length;a++){
let url = getFileAccessHttpUrl(arr[a]);
fileList.push({
uid: uidGenerator(),
name: arr[a],
status: 'done',
url: url,
response:{
status:"history",
message:arr[a]
if (!val || val.length == 0) {
this.picUrl = false
}
},
// 立刻执行handler
immediate: true
}
},
created () {
const token = Vue.ls.get(ACCESS_TOKEN)
this.headers = { 'X-Access-Token': token }
},
methods: {
initFileList (paths) {
if (!paths || paths.length == 0) {
this.fileList = []
return
}
this.picUrl = true
const fileList = []
const arr = paths.split(',')
for (var a = 0; a < arr.length; a++) {
const url = getFileAccessHttpUrl(arr[a])
fileList.push({
uid: uidGenerator(),
name: arr[a],
status: 'done',
url: url,
response: {
status: 'history',
message: arr[a]
}
})
}
this.fileList = fileList
},
beforeUpload: function (file) {
var fileType = file.type
if (fileType.indexOf('image') < 0) {
this.$message.warning('请上传图片')
return false
}
},
handleChange (info) {
this.picUrl = false
let fileList = info.fileList
// update-begin-author:wangshuai date:20201022 for:LOWCOD-969 判断number是否大于0和是否多选,返回选定的元素。
if (this.number > 0) {
fileList = fileList.slice(-this.number)
}
// update-end-author:wangshuai date:20201022 for:LOWCOD-969 判断number是否大于0和是否多选,返回选定的元素。
if (info.file.status === 'done') {
if (info.file.response.success) {
this.picUrl = true
fileList = fileList.map((file) => {
if (file.response) {
file.url = `${file.response.result.id}`
}
return file
})
}
this.fileList = fileList
},
beforeUpload: function(file){
var fileType = file.type;
if(fileType.indexOf('image')<0){
this.$message.warning('请上传图片');
return false;
}
},
handleChange(info) {
this.picUrl = false;
let fileList = info.fileList
//update-begin-author:wangshuai date:20201022 for:LOWCOD-969 判断number是否大于0和是否多选,返回选定的元素。
if(this.number>0){
fileList = fileList.slice(-this.number);
}
//update-end-author:wangshuai date:20201022 for:LOWCOD-969 判断number是否大于0和是否多选,返回选定的元素。
if(info.file.status==='done'){
if(info.file.response.success){
this.picUrl = true;
fileList = fileList.map((file) => {
if (file.response) {
file.url = `${file.response.result.id}`;
}
return file;
});
}
//this.$message.success(`${info.file.name} 上传成功!`);
}else if (info.file.status === 'error') {
this.$message.error(`${info.file.name} 上传失败.`);
}else if(info.file.status === 'removed'){
this.handleDelete(info.file)
}
this.fileList = fileList
if(info.file.status==='done' || info.file.status === 'removed'){
this.handlePathChange()
}
},
// 预览
handlePreview(file) {
if (file && file.url) {
var fileFullUrl = `${window._CONFIG['domianWebSocketURL']}/${file.url}`
let url = `${window._CONFIG['onlinePreviewDomainURL']}?url=${encodeURIComponent(Base64.encode(fileFullUrl))}`
window.open(url)
}
},
getAvatarView(){
if(this.fileList.length>0){
let url = this.fileList[this.fileList.length-1].url
return getFileAccessHttpUrl(url)
}
},
handlePathChange(){
let uploadFiles = this.fileList
let path = ''
if(!uploadFiles || uploadFiles.length==0){
path = ''
}
let arr = [];
if(!this.isMultiple && uploadFiles && uploadFiles.length > 0){
arr.push(uploadFiles[uploadFiles.length-1].url)
}else{
for(let a=0;a<uploadFiles.length;a++){
// update-begin-author:taoyan date:20200819 for:【开源问题z】上传图片组件 LOWCOD-783
if(uploadFiles[a].status === 'done' ) {
arr.push(uploadFiles[a].url)
}else{
return;
}
// update-end-author:taoyan date:20200819 for:【开源问题z】上传图片组件 LOWCOD-783
}
}
if(arr.length>0){
path = arr.join(",")
}
this.$emit('change', path);
},
handleDelete(file){
//如有需要新增 删除逻辑
},
handleCancel() {
this.close();
this.previewVisible = false;
},
close () {
},
// this.$message.success(`${info.file.name} 上传成功!`);
} else if (info.file.status === 'error') {
this.$message.error(`${info.file.name} 上传失败.`)
} else if (info.file.status === 'removed') {
this.handleDelete(info.file)
}
this.fileList = fileList
if (info.file.status === 'done' || info.file.status === 'removed') {
this.handlePathChange()
}
},
model: {
prop: 'value',
event: 'change'
// 预览
handlePreview (file) {
if (file && file.url) {
var fileFullUrl = `${window._CONFIG.domianWebSocketURL}/${file.url}`
const url = `${window._CONFIG.onlinePreviewDomainURL}?url=${encodeURIComponent(Base64.encode(fileFullUrl))}`
window.open(url)
}
},
getAvatarView () {
if (this.fileList.length > 0) {
const url = this.fileList[this.fileList.length - 1].url
return getFileAccessHttpUrl(url)
}
},
handlePathChange () {
const uploadFiles = this.fileList
let path = ''
if (!uploadFiles || uploadFiles.length == 0) {
path = ''
}
const arr = []
if (!this.isMultiple && uploadFiles && uploadFiles.length > 0) {
arr.push(uploadFiles[uploadFiles.length - 1].url)
} else {
for (let a = 0; a < uploadFiles.length; a++) {
// update-begin-author:taoyan date:20200819 for:【开源问题z】上传图片组件 LOWCOD-783
if (uploadFiles[a].status === 'done') {
arr.push(uploadFiles[a].url)
} else {
return
}
// update-end-author:taoyan date:20200819 for:【开源问题z】上传图片组件 LOWCOD-783
}
}
if (arr.length > 0) {
path = arr.join(',')
}
this.$emit('change', path)
},
handleDelete (file) {
// 如有需要新增 删除逻辑
},
handleCancel () {
this.close()
this.previewVisible = false
},
close () {
}
},
model: {
prop: 'value',
event: 'change'
}
}
</script>
<style scoped>
+83 -83
View File
@@ -36,94 +36,94 @@
</template>
<script>
import { postAction } from '@/api/manage'
export default {
name: 'JImportModal',
props:{
url:{
type: String,
default: '',
required: false
},
visible:{
type: Boolean,
default: '',
required: false
},
biz:{
type: String,
default: '',
required: false
}
import { postAction } from '@/api/manage'
export default {
name: 'JImportModal',
props: {
url: {
type: String,
default: '',
required: false
},
data(){
return {
uploading:false,
fileList:[],
uploadAction:'',
foreignKeys:''
}
visible: {
type: Boolean,
default: '',
required: false
},
watch: {
url (val) {
if(val){
this.uploadAction = window._CONFIG['domianURL']+val
}
}
},
created () {
console.log(this.$attrs)
this.uploadAction = window._CONFIG['domianURL']+this.url
},
methods:{
handleClose(){
this.visible=false
},
show(arg){
this.fileList = []
this.uploading = false
this.visible = true
this.foreignKeys = arg;
},
handleRemove(file) {
const index = this.fileList.indexOf(file);
const newFileList = this.fileList.slice();
newFileList.splice(index, 1);
this.fileList = newFileList
},
beforeUpload(file) {
this.fileList = [...this.fileList, file]
return false;
},
handleImport() {
const { fileList } = this;
const formData = new FormData();
if(this.biz){
formData.append('isSingleTableImport',this.biz);
}
if(this.foreignKeys && this.foreignKeys.length>0){
formData.append('foreignKeys',this.foreignKeys);
}
fileList.forEach((file) => {
formData.append('files[]', file);
});
this.uploading = true
postAction(this.uploadAction, formData).then((res) => {
this.uploading = false
if(res.success){
this.$message.success(res.message)
this.visible=false
this.$emit('ok')
}else{
this.$message.warning(res.message)
}
})
}
biz: {
type: String,
default: '',
required: false
}
},
data () {
return {
uploading: false,
fileList: [],
uploadAction: '',
foreignKeys: ''
}
},
watch: {
url (val) {
if (val) {
this.uploadAction = window._CONFIG.domianURL + val
}
}
},
created () {
console.log(this.$attrs)
this.uploadAction = window._CONFIG.domianURL + this.url
},
methods: {
handleClose () {
this.visible = false
},
show (arg) {
this.fileList = []
this.uploading = false
this.visible = true
this.foreignKeys = arg
},
handleRemove (file) {
const index = this.fileList.indexOf(file)
const newFileList = this.fileList.slice()
newFileList.splice(index, 1)
this.fileList = newFileList
},
beforeUpload (file) {
this.fileList = [...this.fileList, file]
return false
},
handleImport () {
const { fileList } = this
const formData = new FormData()
if (this.biz) {
formData.append('isSingleTableImport', this.biz)
}
if (this.foreignKeys && this.foreignKeys.length > 0) {
formData.append('foreignKeys', this.foreignKeys)
}
fileList.forEach((file) => {
formData.append('files[]', file)
})
this.uploading = true
postAction(this.uploadAction, formData).then((res) => {
this.uploading = false
if (res.success) {
this.$message.success(res.message)
this.visible = false
this.$emit('ok')
} else {
this.$message.warning(res.message)
}
})
}
}
}
</script>
<style scoped>
</style>
</style>
+99 -99
View File
@@ -9,122 +9,122 @@
<script>
import { Input } from 'ant-design-vue'
import { Input } from 'ant-design-vue'
const JINPUT_QUERY_LIKE = 'like';
const JINPUT_QUERY_NE = 'ne';
const JINPUT_QUERY_GE = 'ge'; //大于等于
const JINPUT_QUERY_LE = 'le'; //小于等于
const JINPUT_QUERY_LIKE = 'like'
const JINPUT_QUERY_NE = 'ne'
const JINPUT_QUERY_GE = 'ge' // 大于等于
const JINPUT_QUERY_LE = 'le' // 小于等于
export default {
name: 'JInput',
props:{
...Input.props, // 拿到全部外部的参数
value: {
type: String,
required: false
},
type: {
type: String,
required: false,
default: JINPUT_QUERY_LIKE
},
placeholder: {
type: String,
required: false,
default: ''
},
trim: {
type: Boolean,
required: false,
default: true
},
export default {
name: 'JInput',
props: {
...Input.props, // 拿到全部外部的参数
value: {
type: String,
required: false
},
data(){
return {
inputVal:''
type: {
type: String,
required: false,
default: JINPUT_QUERY_LIKE
},
placeholder: {
type: String,
required: false,
default: ''
},
trim: {
type: Boolean,
required: false,
default: true
}
},
data () {
return {
inputVal: ''
}
},
computed: {
// 透传给下级组件的事件,需要排除本组件使用的change事件
childListeners () {
const vm = this
const result = Object.assign({},
this.$listeners
)
delete result.change
return result
}
},
watch: {
value: {
immediate: true,
handler: function () {
this.initVal()
}
},
computed: {
//透传给下级组件的事件,需要排除本组件使用的change事件
childListeners() {
const vm = this;
let result = Object.assign({},
this.$listeners,
)
delete result.change;
return result;
}
},
watch:{
value:{
immediate:true,
handler:function(){
this.initVal();
}
},
// 当 type 变化的时候重新计算值
type() {
this.backValue({ target: { value: this.inputVal } })
},
},
methods:{
initVal(){
if(!this.value){
this.inputVal = ''
}else{
let text = this.value
switch (this.type) {
case JINPUT_QUERY_LIKE:
//修复路由传参的值传送到jinput框被前后各截取了一位 #1336
if(text.indexOf("*") != -1){
text = text.substring(1,text.length-1);
}
break;
case JINPUT_QUERY_NE:
text = text.substring(1);
break;
case JINPUT_QUERY_GE:
text = text.substring(2);
break;
case JINPUT_QUERY_LE:
text = text.substring(2);
break;
default:
}
this.inputVal = text
}
},
backValue(e){
let text = e.target.value
if(text && this.trim===true){
text = text.trim()
}
// 当 type 变化的时候重新计算值
type () {
this.backValue({ target: { value: this.inputVal } })
}
},
methods: {
initVal () {
if (!this.value) {
this.inputVal = ''
} else {
let text = this.value
switch (this.type) {
case JINPUT_QUERY_LIKE:
text = "*"+text+"*";
break;
// 修复路由传参的值传送到jinput框被前后各截取了一位 #1336
if (text.indexOf('*') != -1) {
text = text.substring(1, text.length - 1)
}
break
case JINPUT_QUERY_NE:
text = "!"+text;
break;
text = text.substring(1)
break
case JINPUT_QUERY_GE:
text = ">="+text;
break;
text = text.substring(2)
break
case JINPUT_QUERY_LE:
text = "<="+text;
break;
text = text.substring(2)
break
default:
}
this.$emit('change', text);
this.inputVal = text
}
},
model: {
prop: 'value',
event: 'change'
backValue (e) {
let text = e.target.value
if (text && this.trim === true) {
text = text.trim()
}
switch (this.type) {
case JINPUT_QUERY_LIKE:
text = '*' + text + '*'
break
case JINPUT_QUERY_NE:
text = '!' + text
break
case JINPUT_QUERY_GE:
text = '>=' + text
break
case JINPUT_QUERY_LE:
text = '<=' + text
break
default:
}
this.$emit('change', text)
}
},
model: {
prop: 'value',
event: 'change'
}
}
</script>
<style scoped>
</style>
</style>
@@ -27,10 +27,10 @@
<script>
import 'codemirror/lib/codemirror.css'
import '@toast-ui/editor/dist/toastui-editor.css';
import '@toast-ui/editor/dist/i18n/zh-cn';
import '@toast-ui/editor/dist/toastui-editor.css'
import '@toast-ui/editor/dist/i18n/zh-cn'
import Editor from '@toast-ui/editor';
import Editor from '@toast-ui/editor'
import defaultOptions from './default-options'
import JUpload from '@/components/jero/JUpload'
import { getFileAccessHttpUrl } from '@/api/manage'
@@ -38,7 +38,7 @@ import { getFileAccessHttpUrl } from '@/api/manage'
export default {
name: 'JMarkdownEditor',
components: {
JUpload,
JUpload
},
props: {
value: {
@@ -48,13 +48,13 @@ export default {
id: {
type: String,
required: false,
default() {
default () {
return 'markdown-editor-' + +new Date() + ((Math.random() * 1000).toFixed(0) + '')
}
},
options: {
type: Object,
default() {
default () {
return defaultOptions
}
},
@@ -73,22 +73,22 @@ export default {
default: 'zh-CN'
}
},
data() {
data () {
return {
editor: null,
isShow:false,
activeIndex:"1",
dialogVisible:false,
index:"1",
fileList:[],
remark:"",
imageName:"",
imageUrl:"",
networkPic:""
isShow: false,
activeIndex: '1',
dialogVisible: false,
index: '1',
fileList: [],
remark: '',
imageName: '',
imageUrl: '',
networkPic: ''
}
},
computed: {
editorOptions() {
editorOptions () {
const options = Object.assign({}, defaultOptions, this.options)
options.initialEditType = this.mode
options.height = this.height
@@ -97,30 +97,30 @@ export default {
}
},
watch: {
value(newValue, preValue) {
value (newValue, preValue) {
if (newValue !== preValue && newValue !== this.editor.getMarkdown()) {
this.editor.setMarkdown(newValue)
}
},
language(val) {
language (val) {
this.destroyEditor()
this.initEditor()
},
height(newValue) {
height (newValue) {
this.editor.height(newValue)
},
mode(newValue) {
mode (newValue) {
this.editor.changeMode(newValue)
}
},
mounted() {
mounted () {
this.initEditor()
},
destroyed() {
destroyed () {
this.destroyEditor()
},
methods: {
initEditor() {
initEditor () {
this.editor = new Editor({
el: document.getElementById(this.id),
...this.editorOptions
@@ -131,20 +131,20 @@ export default {
this.editor.on('change', () => {
this.$emit('change', this.editor.getMarkdown())
})
//--begin 添加自定义上传按钮
// --begin 添加自定义上传按钮
/*
* 添加自定义按钮
*/
//获取编辑器上的功能条
let toolbar = this.editor.getUI().getToolbar();
let fileDom = this.$refs.files;
//添加图片点击事件
this.editor.eventManager.addEventType('isShowClickEvent');
// 获取编辑器上的功能条
const toolbar = this.editor.getUI().getToolbar()
const fileDom = this.$refs.files
// 添加图片点击事件
this.editor.eventManager.addEventType('isShowClickEvent')
this.editor.eventManager.listen('isShowClickEvent', () => {
this.isShow = true
this.dialogVisible = true
});
//addImageBlobHook图片上传、剪切、拖拽都会走此方法
})
// addImageBlobHook图片上传、剪切、拖拽都会走此方法
// 删除默认监听事件
this.editor.eventManager.removeEventHandler('addImageBlobHook')
// 添加自定义监听事件
@@ -154,85 +154,85 @@ export default {
})
})
// 添加自定义按钮 第二个参数代表位置,不传默认放在最后
toolbar.insertItem(15,{
toolbar.insertItem(15, {
type: 'button',
options:{
options: {
name: 'customize',
className: 'tui-image tui-toolbar-icons',
event: 'isShowClickEvent',
tooltip: '上传图片',
tooltip: '上传图片'
}
//
});
//--end 添加自定义上传按钮
})
// --end 添加自定义上传按钮
},
destroyEditor() {
destroyEditor () {
if (!this.editor) return
this.editor.off('change')
this.editor.remove()
},
setMarkdown(value) {
setMarkdown (value) {
this.editor.setMarkdown(value)
},
getMarkdown() {
getMarkdown () {
return this.editor.getMarkdown()
},
setHtml(value) {
setHtml (value) {
this.editor.setHtml(value)
},
getHtml() {
getHtml () {
return this.editor.getHtml()
},
handleOk(){
if(this.index=='1'){
handleOk () {
if (this.index == '1') {
this.imageUrl = getFileAccessHttpUrl(this.fileList)
if(this.remark){
this.addImgToMd(this.imageUrl,this.remark)
}else{
this.addImgToMd(this.imageUrl,"")
if (this.remark) {
this.addImgToMd(this.imageUrl, this.remark)
} else {
this.addImgToMd(this.imageUrl, '')
}
}else{
if(this.remark){
this.addImgToMd(this.networkPic,this.remark)
}else{
this.addImgToMd(this.networkPic,"")
}
}
this.index="1"
this.fileList=[]
this.imageName="";
this.imageUrl="";
this.remark=""
this.networkPic=""
this.dialogVisible=false
this.isShow=false;
},
handleClose(done) {
done();
},
handleChange(val){
this.fileList=[]
this.remark=""
this.imageName=""
this.imageUrl=""
this.networkPic=""
this.index=val
},
//添加图片到markdown
addImgToMd(data,name) {
let editor = this.editor.getCodeMirror();
let editorHtml = this.editor.getCurrentModeEditor();
let isMarkdownMode = this.editor.isMarkdownMode();
if (isMarkdownMode) {
editor.replaceSelection(`![${name}](${data})`);
} else {
let range = editorHtml.getRange();
let img = document.createElement('img');
img.src = `${data}`;
img.alt = name;
range.insertNode(img);
if (this.remark) {
this.addImgToMd(this.networkPic, this.remark)
} else {
this.addImgToMd(this.networkPic, '')
}
}
this.index = '1'
this.fileList = []
this.imageName = ''
this.imageUrl = ''
this.remark = ''
this.networkPic = ''
this.dialogVisible = false
this.isShow = false
},
handleClose (done) {
done()
},
handleChange (val) {
this.fileList = []
this.remark = ''
this.imageName = ''
this.imageUrl = ''
this.networkPic = ''
this.index = val
},
// 添加图片到markdown
addImgToMd (data, name) {
const editor = this.editor.getCodeMirror()
const editorHtml = this.editor.getCurrentModeEditor()
const isMarkdownMode = this.editor.isMarkdownMode()
if (isMarkdownMode) {
editor.replaceSelection(`![${name}](${data})`)
} else {
const range = editorHtml.getRange()
const img = document.createElement('img')
img.src = `${data}`
img.alt = name
range.insertNode(img)
}
}
},
model: {
prop: 'value',
@@ -252,4 +252,4 @@ export default {
}
}
</style>
</style>
+109 -109
View File
@@ -51,125 +51,125 @@ import { getClass, getStyle } from '@/utils/props-util'
import { triggerWindowResizeEvent } from '@/utils/util'
export default {
name: 'JModal',
props: {
title: String,
// 可使用 .sync 修饰符
visible: Boolean,
// 是否全屏弹窗,当全屏时无论如何都会禁止 body 滚动。可使用 .sync 修饰符
fullscreen: {
type: Boolean,
default: false
},
// 是否允许切换全屏(允许后右上角会出现一个按钮)
switchFullscreen: {
type: Boolean,
default: false
},
// 点击确定按钮的时候是否关闭弹窗
okClose: {
type: Boolean,
default: true
},
name: 'JModal',
props: {
title: String,
// 可使用 .sync 修饰符
visible: Boolean,
// 是否全屏弹窗,当全屏时无论如何都会禁止 body 滚动。可使用 .sync 修饰符
fullscreen: {
type: Boolean,
default: false
},
data() {
// 是否允许切换全屏(允许后右上角会出现一个按钮)
switchFullscreen: {
type: Boolean,
default: false
},
// 点击确定按钮的时候是否关闭弹窗
okClose: {
type: Boolean,
default: true
}
},
data () {
return {
// 内部使用的 slots ,不再处理
usedSlots: ['title'],
// 实际控制是否全屏的参数
innerFullscreen: this.fullscreen
}
},
computed: {
// 一些未处理的参数或特殊处理的参数绑定到 a-modal 上
_attrs () {
const attrs = { ...this.$attrs }
// 如果全屏就将宽度设为 100%
if (this.innerFullscreen) {
attrs.width = '100%'
}
return attrs
},
modalClass () {
return {
// 内部使用的 slots ,不再处理
usedSlots: ['title'],
// 实际控制是否全屏的参数
innerFullscreen: this.fullscreen,
'j-modal-box': true,
fullscreen: this.innerFullscreen,
'no-title': this.isNoTitle,
'no-footer': this.isNoFooter
}
},
computed: {
// 一些未处理的参数或特殊处理的参数绑定到 a-modal 上
_attrs() {
let attrs = { ...this.$attrs }
// 如果全屏就将宽度设为 100%
if (this.innerFullscreen) {
attrs['width'] = '100%'
}
return attrs
},
modalClass() {
return {
'j-modal-box': true,
'fullscreen': this.innerFullscreen,
'no-title': this.isNoTitle,
'no-footer': this.isNoFooter,
}
},
modalStyle() {
let style = {}
// 如果全屏就将top设为 0
if (this.innerFullscreen) {
style['top'] = '0'
}
return style
},
isNoTitle() {
return !this.title && !this.allSlotsKeys.includes('title')
},
isNoFooter() {
return this._attrs['footer'] === null
},
slotsKeys() {
return Object.keys(this.$slots).filter(key => !this.usedSlots.includes(key))
},
scopedSlotsKeys() {
return Object.keys(this.$scopedSlots).filter(key => !this.usedSlots.includes(key))
},
allSlotsKeys() {
return Object.keys(this.$slots).concat(Object.keys(this.$scopedSlots))
},
// 切换全屏的按钮图标
fullscreenButtonIcon() {
return this.innerFullscreen ? 'fullscreen-exit' : 'fullscreen'
},
modalStyle () {
const style = {}
// 如果全屏就将top设为 0
if (this.innerFullscreen) {
style.top = '0'
}
return style
},
watch: {
visible() {
if (this.visible) {
this.innerFullscreen = this.fullscreen
}
},
innerFullscreen(val) {
this.$emit('update:fullscreen', val)
},
isNoTitle () {
return !this.title && !this.allSlotsKeys.includes('title')
},
methods: {
getClass(clazz) {
return { ...getClass(this), ...clazz }
},
getStyle(style) {
return { ...getStyle(this), ...style }
},
close() {
this.$emit('update:visible', false)
},
handleOk() {
if (this.okClose) {
this.close()
}
},
handleCancel() {
this.close()
},
/** 切换全屏 */
toggleFullscreen() {
this.innerFullscreen = !this.innerFullscreen
triggerWindowResizeEvent()
},
isNoFooter () {
return this._attrs.footer === null
},
slotsKeys () {
return Object.keys(this.$slots).filter(key => !this.usedSlots.includes(key))
},
scopedSlotsKeys () {
return Object.keys(this.$scopedSlots).filter(key => !this.usedSlots.includes(key))
},
allSlotsKeys () {
return Object.keys(this.$slots).concat(Object.keys(this.$scopedSlots))
},
// 切换全屏的按钮图标
fullscreenButtonIcon () {
return this.innerFullscreen ? 'fullscreen-exit' : 'fullscreen'
}
},
watch: {
visible () {
if (this.visible) {
this.innerFullscreen = this.fullscreen
}
},
innerFullscreen (val) {
this.$emit('update:fullscreen', val)
}
},
methods: {
getClass (clazz) {
return { ...getClass(this), ...clazz }
},
getStyle (style) {
return { ...getStyle(this), ...style }
},
close () {
this.$emit('update:visible', false)
},
handleOk () {
if (this.okClose) {
this.close()
}
},
handleCancel () {
this.close()
},
/** 切换全屏 */
toggleFullscreen () {
this.innerFullscreen = !this.innerFullscreen
triggerWindowResizeEvent()
}
}
}
</script>
<style lang="less">
.j-modal-box {
&.fullscreen {
top: 0;
@@ -239,4 +239,4 @@ export default {
max-width: 100vw;
}
}
</style>
</style>
+22 -22
View File
@@ -16,37 +16,37 @@ import pick from 'lodash.pick'
export default {
name: 'JPrompt',
data() {
data () {
return {
visible: false,
loading: false,
content: '',
// 弹窗参数
modalProps: {
title: '',
title: ''
},
inputProps: {
placeholder: '',
placeholder: ''
},
// form model
model: {
input: '',
input: ''
},
// 校验
rule: [],
// 回调函数
callback: {},
callback: {}
}
},
computed: {
rules() {
rules () {
return {
input: this.rule
}
},
}
},
methods: {
show(options) {
show (options) {
this.content = options.content
if (Array.isArray(options.rule)) {
this.rule = options.rule
@@ -55,10 +55,10 @@ export default {
this.model.input = options.defaultValue
}
// 取出常用的弹窗参数
let pickModalProps = pick(options, 'title', 'centered', 'cancelText', 'closable', 'mask', 'maskClosable', 'okText', 'okType', 'okButtonProps', 'cancelButtonProps', 'width', 'wrapClassName', 'zIndex', 'dialogStyle', 'dialogClass')
const pickModalProps = pick(options, 'title', 'centered', 'cancelText', 'closable', 'mask', 'maskClosable', 'okText', 'okType', 'okButtonProps', 'cancelButtonProps', 'width', 'wrapClassName', 'zIndex', 'dialogStyle', 'dialogClass')
this.modalProps = Object.assign({}, pickModalProps, options.modalProps)
// 取出常用的input参数
let pickInputProps = pick(options, 'placeholder', 'allowClear')
const pickInputProps = pick(options, 'placeholder', 'allowClear')
this.inputProps = Object.assign({}, pickInputProps, options.inputProps)
// 回调函数
this.callback = pick(options, 'onOk', 'onOkAsync', 'onCancel')
@@ -66,10 +66,10 @@ export default {
this.$nextTick(() => this.$refs.input.focus())
},
onOk() {
onOk () {
this.$refs.form.validate((ok, err) => {
if (ok) {
let event = {value: this.model.input, target: this}
const event = { value: this.model.input, target: this }
// 异步方法优先级高于同步方法
if (typeof this.callback.onOkAsync === 'function') {
this.callback.onOkAsync(event)
@@ -82,43 +82,43 @@ export default {
}
})
},
onCancel() {
onCancel () {
if (typeof this.callback.onCancel === 'function') {
this.callback.onCancel(this.model.input)
}
this.close()
},
onInputPressEnter() {
onInputPressEnter () {
this.onOk()
},
close() {
close () {
this.visible = this.loading ? this.visible : false
},
forceClose() {
forceClose () {
this.visible = false
},
showLoading() {
showLoading () {
this.loading = true
},
hideLoading() {
hideLoading () {
this.loading = false
},
afterClose(e) {
afterClose (e) {
if (typeof this.modalProps.afterClose === 'function') {
this.modalProps.afterClose(e)
}
this.$emit('after-close', e)
},
}
},
}
}
</script>
<style scoped>
</style>
</style>
+3 -3
View File
@@ -2,7 +2,7 @@ import JModal from './JModal'
import JPrompt from './JPrompt'
export default {
install(Vue) {
install (Vue) {
Vue.component(JModal.name, JModal)
const JPromptExtend = Vue.extend(JPrompt)
@@ -14,5 +14,5 @@ export default {
vm.$on('after-close', () => vm.$destroy())
return vm
}
},
}
}
}
+111 -111
View File
@@ -47,125 +47,125 @@
<script>
import { getClass, getStyle } from '@/utils/props-util'
import { triggerWindowResizeEvent } from '@/utils/util'
import { getClass, getStyle } from '@/utils/props-util'
import { triggerWindowResizeEvent } from '@/utils/util'
export default {
name: 'JModal',
props: {
title: String,
// 可使用 .sync 修饰符
visible: Boolean,
// 是否全屏弹窗,当全屏时无论如何都会禁止 body 滚动。可使用 .sync 修饰符
fullscreen: {
type: Boolean,
default: false
},
// 是否允许切换全屏(允许后右上角会出现一个按钮)
switchFullscreen: {
type: Boolean,
default: false
},
// 点击确定按钮的时候是否关闭弹窗
okClose: {
type: Boolean,
default: true
},
export default {
name: 'JModal',
props: {
title: String,
// 可使用 .sync 修饰符
visible: Boolean,
// 是否全屏弹窗,当全屏时无论如何都会禁止 body 滚动。可使用 .sync 修饰符
fullscreen: {
type: Boolean,
default: false
},
data() {
// 是否允许切换全屏(允许后右上角会出现一个按钮)
switchFullscreen: {
type: Boolean,
default: false
},
// 点击确定按钮的时候是否关闭弹窗
okClose: {
type: Boolean,
default: true
}
},
data () {
return {
// 内部使用的 slots ,不再处理
usedSlots: ['title'],
// 实际控制是否全屏的参数
innerFullscreen: this.fullscreen
}
},
computed: {
// 一些未处理的参数或特殊处理的参数绑定到 a-modal 上
_attrs () {
const attrs = { ...this.$attrs }
// 如果全屏就将宽度设为 100%
if (this.innerFullscreen) {
attrs.width = '100%'
}
return attrs
},
modalClass () {
return {
// 内部使用的 slots ,不再处理
usedSlots: ['title'],
// 实际控制是否全屏的参数
innerFullscreen: this.fullscreen,
'j-modal-box': true,
fullscreen: this.innerFullscreen,
'no-title': this.isNoTitle,
'no-footer': this.isNoFooter
}
},
computed: {
// 一些未处理的参数或特殊处理的参数绑定到 a-modal 上
_attrs() {
let attrs = { ...this.$attrs }
// 如果全屏就将宽度设为 100%
if (this.innerFullscreen) {
attrs['width'] = '100%'
}
return attrs
},
modalClass() {
return {
'j-modal-box': true,
'fullscreen': this.innerFullscreen,
'no-title': this.isNoTitle,
'no-footer': this.isNoFooter,
}
},
modalStyle() {
let style = {}
// 如果全屏就将top设为 0
if (this.innerFullscreen) {
style['top'] = '0'
}
return style
},
isNoTitle() {
return !this.title && !this.allSlotsKeys.includes('title')
},
isNoFooter() {
return this._attrs['footer'] === null
},
slotsKeys() {
return Object.keys(this.$slots).filter(key => !this.usedSlots.includes(key))
},
scopedSlotsKeys() {
return Object.keys(this.$scopedSlots).filter(key => !this.usedSlots.includes(key))
},
allSlotsKeys() {
return Object.keys(this.$slots).concat(Object.keys(this.$scopedSlots))
},
// 切换全屏的按钮图标
fullscreenButtonIcon() {
return this.innerFullscreen ? 'fullscreen-exit' : 'fullscreen'
},
modalStyle () {
const style = {}
// 如果全屏就将top设为 0
if (this.innerFullscreen) {
style.top = '0'
}
return style
},
watch: {
visible() {
if (this.visible) {
this.innerFullscreen = this.fullscreen
}
},
innerFullscreen(val) {
this.$emit('update:fullscreen', val)
},
isNoTitle () {
return !this.title && !this.allSlotsKeys.includes('title')
},
methods: {
getClass(clazz) {
return { ...getClass(this), ...clazz }
},
getStyle(style) {
return { ...getStyle(this), ...style }
},
close() {
this.$emit('update:visible', false)
},
handleOk() {
if (this.okClose) {
this.close()
}
},
handleCancel() {
this.close()
},
/** 切换全屏 */
toggleFullscreen() {
this.innerFullscreen = !this.innerFullscreen
triggerWindowResizeEvent()
},
isNoFooter () {
return this._attrs.footer === null
},
slotsKeys () {
return Object.keys(this.$slots).filter(key => !this.usedSlots.includes(key))
},
scopedSlotsKeys () {
return Object.keys(this.$scopedSlots).filter(key => !this.usedSlots.includes(key))
},
allSlotsKeys () {
return Object.keys(this.$slots).concat(Object.keys(this.$scopedSlots))
},
// 切换全屏的按钮图标
fullscreenButtonIcon () {
return this.innerFullscreen ? 'fullscreen-exit' : 'fullscreen'
}
},
watch: {
visible () {
if (this.visible) {
this.innerFullscreen = this.fullscreen
}
},
innerFullscreen (val) {
this.$emit('update:fullscreen', val)
}
},
methods: {
getClass (clazz) {
return { ...getClass(this), ...clazz }
},
getStyle (style) {
return { ...getStyle(this), ...style }
},
close () {
this.$emit('update:visible', false)
},
handleOk () {
if (this.okClose) {
this.close()
}
},
handleCancel () {
this.close()
},
/** 切换全屏 */
toggleFullscreen () {
this.innerFullscreen = !this.innerFullscreen
triggerWindowResizeEvent()
}
}
}
</script>
<style lang="less">
@@ -238,4 +238,4 @@
max-width: 100vw;
}
}
</style>
</style>
+181 -181
View File
@@ -20,196 +20,196 @@
</template>
<script>
import JPopupOnlReport from './modal/JPopupOnlReport'
import JPopupOnlReport from './modal/JPopupOnlReport'
export default {
name: 'JPopup',
components: {
JPopupOnlReport
export default {
name: 'JPopup',
components: {
JPopupOnlReport
},
props: {
code: {
type: String,
default: '',
required: false
},
props: {
code: {
type: String,
default: '',
required: false
},
field: {
type: String,
default: '',
required: false
},
orgFields: {
type: String,
default: '',
required: false
},
destFields: {
type: String,
default: '',
required: false
},
/** 排序列,指定要排序的列,使用方式:列名=desc|asc */
sorter: {
type: String,
default: ''
},
width: {
type: Number,
default: 1200,
required: false
},
placeholder: {
type: String,
default: '请选择',
required: false
},
value: {
type: String,
required: false
},
triggerChange: {
type: Boolean,
required: false,
default: false
},
disabled: {
type: Boolean,
required: false,
default: false
},
multi: {
type: Boolean,
required: false,
default: false
},
//popup动态参数 支持系统变量语法
param:{
type: Object,
required: false,
default: ()=>{}
},
spliter:{
type: String,
required: false,
default: ','
},
/** 分组ID,用于将多个popup的请求合并到一起,不传不分组 */
groupId: String
field: {
type: String,
default: '',
required: false
},
orgFields: {
type: String,
default: '',
required: false
},
destFields: {
type: String,
default: '',
required: false
},
/** 排序列,指定要排序的列,使用方式:列名=desc|asc */
sorter: {
type: String,
default: ''
},
width: {
type: Number,
default: 1200,
required: false
},
placeholder: {
type: String,
default: '请选择',
required: false
},
value: {
type: String,
required: false
},
triggerChange: {
type: Boolean,
required: false,
default: false
},
disabled: {
type: Boolean,
required: false,
default: false
},
multi: {
type: Boolean,
required: false,
default: false
},
// popup动态参数 支持系统变量语法
param: {
type: Object,
required: false,
default: () => {}
},
spliter: {
type: String,
required: false,
default: ','
},
/** 分组ID,用于将多个popup的请求合并到一起,不传不分组 */
groupId: String
},
data() {
return {
showText: '',
title: '',
avalid: true
},
data () {
return {
showText: '',
title: '',
avalid: true
}
},
computed: {
uniqGroupId () {
if (this.groupId) {
const { groupId, code, field, orgFields, destFields } = this
return `${groupId}_${code}_${field}_${orgFields}_${destFields}`
}
},
computed: {
uniqGroupId() {
if (this.groupId) {
let { groupId, code, field, orgFields, destFields } = this
return `${groupId}_${code}_${field}_${orgFields}_${destFields}`
}
}
},
watch: {
value: {
immediate: true,
handler: function(val) {
if (!val) {
this.showText = ''
} else {
this.showText = val.split(this.spliter).join(',')
}
}
}
},
created() {
},
mounted() {
if (!this.orgFields || !this.destFields || !this.code) {
this.$message.error('popup参数未正确配置!')
this.avalid = false
}
if (this.destFields.split(',').length != this.orgFields.split(',').length) {
this.$message.error('popup参数未正确配置,原始值和目标值数量不一致!')
this.avalid = false
}
},
methods: {
openModal() {
if (this.disabled === false) {
this.$refs.jPopupOnlReport.show()
}
},
handleEmpty() {
this.showText = ''
let destFieldsArr = this.destFields.split(',')
if (destFieldsArr.length === 0) {
return
}
let res = {}
for (let i = 0; i < destFieldsArr.length; i++) {
res[destFieldsArr[i]] = ''
}
if (this.triggerChange) {
this.$emit('callback', res)
} else {
this.$emit('input', '', res)
}
},
callBack(rows) {
// update--begin--autor:lvdandan-----date:20200630------for:多选时未带回多个值------
let orgFieldsArr = this.orgFields.split(',')
let destFieldsArr = this.destFields.split(',')
let resetText = false
if (this.field && this.field.length > 0) {
}
},
watch: {
value: {
immediate: true,
handler: function (val) {
if (!val) {
this.showText = ''
resetText = true
}
let res = {}
if (orgFieldsArr.length > 0) {
for (let i = 0; i < orgFieldsArr.length; i++) {
let tempDestArr = []
for(let rw of rows){
let val = rw[orgFieldsArr[i]]
// update--begin--autor:liusq-----date:20210713------for:处理val等于0的情况issues/I3ZL4T------
if(typeof val=='undefined'|| val==null || val.toString()==""){
val = ""
}
// update--end--autor:liusq-----date:20210713------for:处理val等于0的情况issues/I3ZL4T------
tempDestArr.push(val)
}
res[destFieldsArr[i]] = tempDestArr.join(",")
}
if (resetText === true) {
let tempText = []
for(let rw of rows){
let val = rw[orgFieldsArr[destFieldsArr.indexOf(this.field)]]
if(!val){
val = ""
}
tempText.push(val)
}
this.showText = tempText.join(",")
}
// update--end--autor:lvdandan-----date:20200630------for:多选时未带回多个值------
}
if (this.triggerChange) {
//v-dec时即triggerChange为true时 将整个对象给form页面 让他自己setFieldsValue
this.$emit('callback', res)
} else {
//v-model时 需要传一个参数field 表示当前这个字段 从而根据这个字段的顺序找到原始值
// this.$emit("input",row[orgFieldsArr[destFieldsArr.indexOf(this.field)]])
let str = ''
if(this.showText){
str = this.showText.split(',').join(this.spliter)
}
this.$emit('input', str, res)
this.showText = val.split(this.spliter).join(',')
}
}
}
},
created () {
},
mounted () {
if (!this.orgFields || !this.destFields || !this.code) {
this.$message.error('popup参数未正确配置!')
this.avalid = false
}
if (this.destFields.split(',').length != this.orgFields.split(',').length) {
this.$message.error('popup参数未正确配置,原始值和目标值数量不一致!')
this.avalid = false
}
},
methods: {
openModal () {
if (this.disabled === false) {
this.$refs.jPopupOnlReport.show()
}
},
handleEmpty () {
this.showText = ''
const destFieldsArr = this.destFields.split(',')
if (destFieldsArr.length === 0) {
return
}
const res = {}
for (let i = 0; i < destFieldsArr.length; i++) {
res[destFieldsArr[i]] = ''
}
if (this.triggerChange) {
this.$emit('callback', res)
} else {
this.$emit('input', '', res)
}
},
callBack (rows) {
// update--begin--autor:lvdandan-----date:20200630------for:多选时未带回多个值------
const orgFieldsArr = this.orgFields.split(',')
const destFieldsArr = this.destFields.split(',')
let resetText = false
if (this.field && this.field.length > 0) {
this.showText = ''
resetText = true
}
const res = {}
if (orgFieldsArr.length > 0) {
for (let i = 0; i < orgFieldsArr.length; i++) {
const tempDestArr = []
for (const rw of rows) {
let val = rw[orgFieldsArr[i]]
// update--begin--autor:liusq-----date:20210713------for:处理val等于0的情况issues/I3ZL4T------
if (typeof val === 'undefined' || val == null || val.toString() == '') {
val = ''
}
// update--end--autor:liusq-----date:20210713------for:处理val等于0的情况issues/I3ZL4T------
tempDestArr.push(val)
}
res[destFieldsArr[i]] = tempDestArr.join(',')
}
if (resetText === true) {
const tempText = []
for (const rw of rows) {
let val = rw[orgFieldsArr[destFieldsArr.indexOf(this.field)]]
if (!val) {
val = ''
}
tempText.push(val)
}
this.showText = tempText.join(',')
}
// update--end--autor:lvdandan-----date:20200630------for:多选时未带回多个值------
}
if (this.triggerChange) {
// v-dec时即triggerChange为true时 将整个对象给form页面 让他自己setFieldsValue
this.$emit('callback', res)
} else {
// v-model时 需要传一个参数field 表示当前这个字段 从而根据这个字段的顺序找到原始值
// this.$emit("input",row[orgFieldsArr[destFieldsArr.indexOf(this.field)]])
let str = ''
if (this.showText) {
str = this.showText.split(',').join(this.spliter)
}
this.$emit('input', str, res)
}
}
}
}
</script>
<style scoped>
.components-input-demo-presuffix .anticon-close-circle {
@@ -226,4 +226,4 @@
.components-input-demo-presuffix .anticon-close-circle:active {
color: #666;
}
</style>
</style>
@@ -17,78 +17,78 @@
</template>
<script>
//option {label:,value:}
export default {
name: 'JSelectMultiple',
props: {
placeholder:{
type: String,
default:'',
required: false
},
value:{
type: String,
required: false
},
readOnly:{
type: Boolean,
required: false,
default: false
},
options:{
type: Array,
required: true
},
triggerChange:{
type: Boolean,
required: false,
default: false
},
spliter:{
type: String,
required: false,
default: ','
},
popContainer:{
type:String,
default:'',
required:false
},
// option {label:,value:}
export default {
name: 'JSelectMultiple',
props: {
placeholder: {
type: String,
default: '',
required: false
},
data(){
return {
newOptions:[],
arrayValue:!this.value?[]:this.value.split(this.spliter) // arrayValue是已选中的数据
value: {
type: String,
required: false
},
readOnly: {
type: Boolean,
required: false,
default: false
},
options: {
type: Array,
required: true
},
triggerChange: {
type: Boolean,
required: false,
default: false
},
spliter: {
type: String,
required: false,
default: ','
},
popContainer: {
type: String,
default: '',
required: false
}
},
data () {
return {
newOptions: [],
arrayValue: !this.value ? [] : this.value.split(this.spliter) // arrayValue是已选中的数据
}
},
watch: {
value (val) {
if (!val) {
this.arrayValue = []
} else {
this.arrayValue = this.value.split(this.spliter)
}
},
watch:{
value (val) {
if(!val){
this.arrayValue = []
}else{
this.arrayValue = this.value.split(this.spliter)
}
}
},
created(){
}
},
created () {
this.newOptions = this.options
},
methods: {
onChange (selectedValue) {
this.newOptions = this.options
},
methods:{
onChange (selectedValue) {
this.newOptions = this.options
if(this.triggerChange){
this.$emit('change', selectedValue.join(this.spliter));
}else{
this.$emit('input', selectedValue.join(this.spliter));
}
},
getParentContainer(node){
if(!this.popContainer){
return node.parentNode
}else{
return document.querySelector(this.popContainer)
}
if (this.triggerChange) {
this.$emit('change', selectedValue.join(this.spliter))
} else {
this.$emit('input', selectedValue.join(this.spliter))
}
},
getParentContainer (node) {
if (!this.popContainer) {
return node.parentNode
} else {
return document.querySelector(this.popContainer)
}
}
}
}
</script>
+67 -67
View File
@@ -7,74 +7,74 @@
</template>
<script>
export default {
name:"JSlider",
data(){
return {
beginClientX:0, /*距离屏幕左端距离*/
mouseMoveStata:false, /*触发拖动状态 判断*/
maxwidth:'', /*拖动最大宽度,依据滑块宽度算出来的*/
confirmWords:'拖动滑块验证', /*滑块文字*/
confirmSuccess:false /*验证成功判断*/
}
},
methods: {
isSuccess(){
return this.confirmSuccess
},
mousedownFn:function (e) {
if(!this.confirmSuccess){
e.preventDefault && e.preventDefault(); //阻止文字选中等 浏览器默认事件
this.mouseMoveStata = true;
this.beginClientX = e.clientX;
}
}, //mousedoen 事件
successFunction(){
this.confirmSuccess = true
this.confirmWords = '验证通过';
if(window.addEventListener){
document.getElementsByTagName('html')[0].removeEventListener('mousemove',this.mouseMoveFn);
document.getElementsByTagName('html')[0].removeEventListener('mouseup',this.moseUpFn);
}else {
document.getElementsByTagName('html')[0].removeEventListener('mouseup',()=>{});
}
document.getElementsByClassName('drag_text')[0].style.color = '#fff'
document.getElementsByClassName('handler')[0].style.left = this.maxwidth + 'px';
document.getElementsByClassName('drag_bg')[0].style.width = this.maxwidth + 'px';
this.$emit("onSuccess",true)
}, //验证成功函数
mouseMoveFn(e){
if(this.mouseMoveStata){
let width = e.clientX - this.beginClientX;
if(width>0 && width<=this.maxwidth){
document.getElementsByClassName('handler')[0].style.left = width + 'px';
document.getElementsByClassName('drag_bg')[0].style.width = width + 'px';
}else if(width>this.maxwidth){
this.successFunction();
}
}
}, //mousemove事件
moseUpFn(e){
this.mouseMoveStata = false;
var width = e.clientX - this.beginClientX;
if(width<this.maxwidth){
// ---- update-begin- author:sunjianlei --- date:20191009 --- for: 修复获取不到 handler 的时候报错 ----
let handler = document.getElementsByClassName('handler')[0]
if (handler) {
handler.style.left = 0 + 'px'
document.getElementsByClassName('drag_bg')[0].style.width = 0 + 'px'
}
// ---- update-end- author:sunjianlei --- date:20191009 --- for: 修复获取不到 handler 的时候报错 ----
}
} //mouseup事件
},
mounted(){
this.maxwidth = this.$refs.dragDiv.clientWidth - this.$refs.moveDiv.clientWidth;
document.getElementsByTagName('html')[0].addEventListener('mousemove',this.mouseMoveFn);
document.getElementsByTagName('html')[0].addEventListener('mouseup',this.moseUpFn)
export default {
name: 'JSlider',
data () {
return {
beginClientX: 0, /* 距离屏幕左端距离 */
mouseMoveStata: false, /* 触发拖动状态 判断 */
maxwidth: '', /* 拖动最大宽度,依据滑块宽度算出来的 */
confirmWords: '拖动滑块验证', /* 滑块文字 */
confirmSuccess: false /* 验证成功判断 */
}
},
methods: {
isSuccess () {
return this.confirmSuccess
},
mousedownFn: function (e) {
if (!this.confirmSuccess) {
e.preventDefault && e.preventDefault() // 阻止文字选中等 浏览器默认事件
this.mouseMoveStata = true
this.beginClientX = e.clientX
}
}, // mousedoen 事件
successFunction () {
this.confirmSuccess = true
this.confirmWords = '验证通过'
if (window.addEventListener) {
document.getElementsByTagName('html')[0].removeEventListener('mousemove', this.mouseMoveFn)
document.getElementsByTagName('html')[0].removeEventListener('mouseup', this.moseUpFn)
} else {
document.getElementsByTagName('html')[0].removeEventListener('mouseup', () => {})
}
document.getElementsByClassName('drag_text')[0].style.color = '#fff'
document.getElementsByClassName('handler')[0].style.left = this.maxwidth + 'px'
document.getElementsByClassName('drag_bg')[0].style.width = this.maxwidth + 'px'
this.$emit('onSuccess', true)
}, // 验证成功函数
mouseMoveFn (e) {
if (this.mouseMoveStata) {
const width = e.clientX - this.beginClientX
if (width > 0 && width <= this.maxwidth) {
document.getElementsByClassName('handler')[0].style.left = width + 'px'
document.getElementsByClassName('drag_bg')[0].style.width = width + 'px'
} else if (width > this.maxwidth) {
this.successFunction()
}
}
}, // mousemove事件
moseUpFn (e) {
this.mouseMoveStata = false
var width = e.clientX - this.beginClientX
if (width < this.maxwidth) {
// ---- update-begin- author:sunjianlei --- date:20191009 --- for: 修复获取不到 handler 的时候报错 ----
const handler = document.getElementsByClassName('handler')[0]
if (handler) {
handler.style.left = 0 + 'px'
document.getElementsByClassName('drag_bg')[0].style.width = 0 + 'px'
}
// ---- update-end- author:sunjianlei --- date:20191009 --- for: 修复获取不到 handler 的时候报错 ----
}
} // mouseup事件
},
mounted () {
this.maxwidth = this.$refs.dragDiv.clientWidth - this.$refs.moveDiv.clientWidth
document.getElementsByTagName('html')[0].addEventListener('mousemove', this.mouseMoveFn)
document.getElementsByTagName('html')[0].addEventListener('mouseup', this.moseUpFn)
}
}
</script>
<style scoped>
@@ -113,4 +113,4 @@
-o-user-select:none;
-ms-user-select:none;
}
</style>
</style>
+338 -340
View File
@@ -201,11 +201,9 @@
</a-tree>
</a-card>
</a-col>
</a-row>
</a-spin>
<a-modal title="请输入保存的名称" :visible="prompt.visible" @cancel="prompt.visible=false" @ok="handlePromptOk">
@@ -217,21 +215,21 @@
</template>
<script>
import moment from 'moment'
import * as utils from '@/utils/util'
import { mixinDevice } from '@/utils/mixin'
import JDate from '@/components/jero/JDate.vue'
import JSelectDepart from '@/components/jerobiz/JSelectDepart'
import JSelectMultiUser from '@/components/jerobiz/JSelectMultiUser'
import JMultiSelectTag from '@/components/dict/JMultiSelectTag'
import JAreaLinkage from '@comp/jero/JAreaLinkage'
import moment from 'moment'
import * as utils from '@/utils/util'
import { mixinDevice } from '@/utils/mixin'
import JDate from '@/components/jero/JDate.vue'
import JSelectDepart from '@/components/jerobiz/JSelectDepart'
import JSelectMultiUser from '@/components/jerobiz/JSelectMultiUser'
import JMultiSelectTag from '@/components/dict/JMultiSelectTag'
import JAreaLinkage from '@comp/jero/JAreaLinkage'
export default {
name: 'JSuperQuery',
mixins: [mixinDevice],
components: { JAreaLinkage, JMultiSelectTag, JDate, JSelectDepart, JSelectMultiUser },
props: {
/*
export default {
name: 'JSuperQuery',
mixins: [mixinDevice],
components: { JAreaLinkage, JMultiSelectTag, JDate, JSelectDepart, JSelectMultiUser },
props: {
/*
fieldList: [{
value:'',
text:'',
@@ -240,357 +238,357 @@
}]
type:date datetime int number string
* */
fieldList: {
type: Array,
required: true
},
/*
fieldList: {
type: Array,
required: true
},
/*
* 这个回调函数接收一个数组参数 即查询条件
* */
callback: {
type: String,
required: false,
default: 'handleSuperQuery'
},
// 当前是否在加载中
loading: {
type: Boolean,
default: false
},
// 保存查询条件的唯一 code,通过该 code 区分
// 默认为 null,代表以当前路由全路径为区分Code
saveCode: {
type: String,
default: null
}
callback: {
type: String,
required: false,
default: 'handleSuperQuery'
},
data() {
return {
moment,
fieldTreeData: [],
prompt: {
visible: false,
value: ''
},
// 当前是否在加载中
loading: {
type: Boolean,
default: false
},
// 保存查询条件的唯一 code,通过该 code 区分
// 默认为 null,代表以当前路由全路径为区分Code
saveCode: {
type: String,
default: null
}
},
data () {
return {
moment,
fieldTreeData: [],
prompt: {
visible: false,
queryParamsModel: [],
treeIcon: <a-icon type="file-text"/>,
// 保存查询条件的treeData
saveTreeData: [],
// 保存查询条件的前缀名
saveCodeBefore: 'JSuperQuerySaved_',
// 查询类型,过滤条件匹配(and、or
matchType: 'and',
superQueryFlag: false,
value: ''
},
visible: false,
queryParamsModel: [],
treeIcon: <a-icon type="file-text"/>,
// 保存查询条件的treeData
saveTreeData: [],
// 保存查询条件的前缀名
saveCodeBefore: 'JSuperQuerySaved_',
// 查询类型,过滤条件匹配(and、or)
matchType: 'and',
superQueryFlag: false
}
},
computed: {
izMobile () {
return this.device === 'mobile'
},
tooltipProps () {
return this.izMobile ? { visible: false } : {}
},
fullSaveCode () {
let saveCode = this.saveCode
if (saveCode == null || saveCode === '') {
saveCode = this.$route.fullPath
}
},
computed: {
izMobile() {
return this.device === 'mobile'
},
tooltipProps() {
return this.izMobile ? { visible: false } : {}
},
fullSaveCode() {
let saveCode = this.saveCode
if (saveCode == null || saveCode === '') {
saveCode = this.$route.fullPath
}
return this.saveCodeBefore + saveCode
},
},
watch: {
// 当 saveCode 变化时,重新查询已保存的条件
fullSaveCode: {
immediate: true,
handler() {
let list = this.$ls.get(this.fullSaveCode)
if (list instanceof Array) {
this.saveTreeData = list.map(i => this.renderSaveTreeData(i))
}
}
},
fieldList: {
deep: true,
immediate: true,
handler(val) {
let mainData = [], subData = []
val.forEach(item => {
let data = { ...item }
data.label = data.label || data.text
let hasChildren = (data.children instanceof Array)
data.disabled = hasChildren
data.selectable = !hasChildren
if (hasChildren) {
data.children = data.children.map(item2 => {
let child = { ...item2 }
child.label = child.label || child.text
child.label = data.label + '-' + child.label
child.value = data.value + ',' + child.value
child.val = ''
return child
})
data.val = ''
subData.push(data)
} else {
mainData.push(data)
}
})
this.fieldTreeData = mainData.concat(subData)
return this.saveCodeBefore + saveCode
}
},
watch: {
// 当 saveCode 变化时,重新查询已保存的条件
fullSaveCode: {
immediate: true,
handler () {
const list = this.$ls.get(this.fullSaveCode)
if (list instanceof Array) {
this.saveTreeData = list.map(i => this.renderSaveTreeData(i))
}
}
},
methods: {
show() {
if (!this.queryParamsModel || this.queryParamsModel.length === 0) {
this.resetLine()
}
this.visible = true
},
getDictInfo(item) {
let str = ''
if(!item.dictTable){
str = item.dictCode
}else{
str = item.dictTable+','+item.dictText+','+item.dictCode
}
console.log('高级查询字典信息',str)
return str
},
handleOk() {
if (!this.isNullArray(this.queryParamsModel)) {
let event = {
matchType: this.matchType,
params: this.removeEmptyObject(this.queryParamsModel)
fieldList: {
deep: true,
immediate: true,
handler (val) {
const mainData = []; const subData = []
val.forEach(item => {
const data = { ...item }
data.label = data.label || data.text
const hasChildren = (data.children instanceof Array)
data.disabled = hasChildren
data.selectable = !hasChildren
if (hasChildren) {
data.children = data.children.map(item2 => {
const child = { ...item2 }
child.label = child.label || child.text
child.label = data.label + '-' + child.label
child.value = data.value + ',' + child.value
child.val = ''
return child
})
data.val = ''
subData.push(data)
} else {
mainData.push(data)
}
// 移动端模式下关闭弹窗
if (this.izMobile) {
this.visible = false
}
this.emitCallback(event)
} else {
this.$message.warn("不能查询空条件")
}
},
emitCallback(event = {}) {
let { params = [], matchType = this.matchType } = event
this.superQueryFlag = (params && params.length > 0)
for (let param of params) {
if (Array.isArray(param.val)) {
param.val = param.val.join(',')
}
}
console.debug('---高级查询参数--->', { params, matchType })
this.$emit(this.callback, params, matchType)
},
handleCancel() {
this.close()
},
close() {
this.$emit('close')
this.visible = false
},
handleAdd() {
this.addNewLine()
},
addNewLine() {
this.queryParamsModel.push({ rule: 'eq' })
},
resetLine() {
this.superQueryFlag = false
this.queryParamsModel = []
this.addNewLine()
},
handleDel(index) {
this.queryParamsModel.splice(index, 1)
},
handleSelected(node, item) {
let { type, dbType, options, dictCode, dictTable, dictText, customReturnField, popup } = node.dataRef
item['type'] = type
item['dbType'] = dbType
item['options'] = options
item['dictCode'] = dictCode
item['dictTable'] = dictTable
item['dictText'] = dictText
item['customReturnField'] = customReturnField
if (popup) {
item['popup'] = popup
}
this.$set(item, 'val', undefined)
},
handleOpen() {
this.show()
},
handleReset() {
this.resetLine()
this.emitCallback()
},
handleSave() {
let queryParams = this.removeEmptyObject(this.queryParamsModel)
if (this.isNullArray(queryParams)) {
this.$message.warning('空条件不能保存')
} else {
this.prompt.value = ''
this.prompt.visible = true
}
},
handlePromptOk() {
let { value } = this.prompt
if(!value){
this.$message.warning('保存名称不能为空')
return
}
// 取出查询条件
let records = this.removeEmptyObject(this.queryParamsModel)
// 判断有没有重名的
let filterList = this.saveTreeData.filter(i => i.originTitle === value)
if (filterList.length > 0) {
this.$confirm({
content: `${value} 已存在,是否覆盖?`,
onOk: () => {
this.prompt.visible = false
filterList[0].records = records
this.saveToLocalStore()
this.$message.success('保存成功')
}
})
} else {
// 没有重名的,直接添加
this.prompt.visible = false
// 添加到树列表中
this.saveTreeData.push(this.renderSaveTreeData({
title: value,
matchType: this.matchType,
records: records
}))
// 保存到 LocalStore
this.saveToLocalStore()
this.$message.success('保存成功')
}
},
handleTreeSelect(idx, event) {
if (event.selectedNodes[0]) {
let { matchType, records } = event.selectedNodes[0].data.props
// 将保存的matchType取出,兼容旧数据,如果没有保存就还是使用原来的
this.matchType = matchType || this.matchType
this.queryParamsModel = utils.cloneObject(records)
}
},
handleRemoveSaveTreeItem(event, vNode) {
// 阻止事件冒泡
event.stopPropagation()
this.$confirm({
content: '是否删除当前查询?',
onOk: () => {
let { eventKey } = vNode
this.saveTreeData.splice(Number.parseInt(eventKey.substring(2)), 1)
this.saveToLocalStore()
},
})
},
this.fieldTreeData = mainData.concat(subData)
}
}
},
// 将查询保存到 LocalStore 里
saveToLocalStore() {
let saveValue = this.saveTreeData.map(({ originTitle, matchType, records }) => ({ title: originTitle, matchType, records }))
this.$ls.set(this.fullSaveCode, saveValue)
},
methods: {
show () {
if (!this.queryParamsModel || this.queryParamsModel.length === 0) {
this.resetLine()
}
this.visible = true
},
isNullArray(array) {
//判断是不是空数组对象
if (!array || array.length === 0) {
getDictInfo (item) {
let str = ''
if (!item.dictTable) {
str = item.dictCode
} else {
str = item.dictTable + ',' + item.dictText + ',' + item.dictCode
}
console.log('高级查询字典信息', str)
return str
},
handleOk () {
if (!this.isNullArray(this.queryParamsModel)) {
const event = {
matchType: this.matchType,
params: this.removeEmptyObject(this.queryParamsModel)
}
// 移动端模式下关闭弹窗
if (this.izMobile) {
this.visible = false
}
this.emitCallback(event)
} else {
this.$message.warn('不能查询空条件')
}
},
emitCallback (event = {}) {
const { params = [], matchType = this.matchType } = event
this.superQueryFlag = (params && params.length > 0)
for (const param of params) {
if (Array.isArray(param.val)) {
param.val = param.val.join(',')
}
}
console.debug('---高级查询参数--->', { params, matchType })
this.$emit(this.callback, params, matchType)
},
handleCancel () {
this.close()
},
close () {
this.$emit('close')
this.visible = false
},
handleAdd () {
this.addNewLine()
},
addNewLine () {
this.queryParamsModel.push({ rule: 'eq' })
},
resetLine () {
this.superQueryFlag = false
this.queryParamsModel = []
this.addNewLine()
},
handleDel (index) {
this.queryParamsModel.splice(index, 1)
},
handleSelected (node, item) {
const { type, dbType, options, dictCode, dictTable, dictText, customReturnField, popup } = node.dataRef
item.type = type
item.dbType = dbType
item.options = options
item.dictCode = dictCode
item.dictTable = dictTable
item.dictText = dictText
item.customReturnField = customReturnField
if (popup) {
item.popup = popup
}
this.$set(item, 'val', undefined)
},
handleOpen () {
this.show()
},
handleReset () {
this.resetLine()
this.emitCallback()
},
handleSave () {
const queryParams = this.removeEmptyObject(this.queryParamsModel)
if (this.isNullArray(queryParams)) {
this.$message.warning('空条件不能保存')
} else {
this.prompt.value = ''
this.prompt.visible = true
}
},
handlePromptOk () {
const { value } = this.prompt
if (!value) {
this.$message.warning('保存名称不能为空')
return
}
// 取出查询条件
const records = this.removeEmptyObject(this.queryParamsModel)
// 判断有没有重名的
const filterList = this.saveTreeData.filter(i => i.originTitle === value)
if (filterList.length > 0) {
this.$confirm({
content: `${value} 已存在,是否覆盖?`,
onOk: () => {
this.prompt.visible = false
filterList[0].records = records
this.saveToLocalStore()
this.$message.success('保存成功')
}
})
} else {
// 没有重名的,直接添加
this.prompt.visible = false
// 添加到树列表中
this.saveTreeData.push(this.renderSaveTreeData({
title: value,
matchType: this.matchType,
records: records
}))
// 保存到 LocalStore
this.saveToLocalStore()
this.$message.success('保存成功')
}
},
handleTreeSelect (idx, event) {
if (event.selectedNodes[0]) {
const { matchType, records } = event.selectedNodes[0].data.props
// 将保存的matchType取出,兼容旧数据,如果没有保存就还是使用原来的
this.matchType = matchType || this.matchType
this.queryParamsModel = utils.cloneObject(records)
}
},
handleRemoveSaveTreeItem (event, vNode) {
// 阻止事件冒泡
event.stopPropagation()
this.$confirm({
content: '是否删除当前查询?',
onOk: () => {
const { eventKey } = vNode
this.saveTreeData.splice(Number.parseInt(eventKey.substring(2)), 1)
this.saveToLocalStore()
}
})
},
// 将查询保存到 LocalStore 里
saveToLocalStore () {
const saveValue = this.saveTreeData.map(({ originTitle, matchType, records }) => ({ title: originTitle, matchType, records }))
this.$ls.set(this.fullSaveCode, saveValue)
},
isNullArray (array) {
// 判断是不是空数组对象
if (!array || array.length === 0) {
return true
}
if (array.length === 1) {
const obj = array[0]
if (!obj.field || (obj.val == null || obj.val === '') || !obj.rule) {
return true
}
if (array.length === 1) {
let obj = array[0]
if (!obj.field || (obj.val == null || obj.val === '') || !obj.rule) {
return true
}
return false
},
// 去掉数组中的空对象
removeEmptyObject (arr) {
const array = utils.cloneObject(arr)
for (let i = 0; i < array.length; i++) {
const item = array[i]
if (item == null || Object.keys(item).length <= 0) {
array.splice(i--, 1)
} else {
if (Array.isArray(item.options)) {
// 如果有字典属性,就不需要保存 options 了
// update-begin-author:taoyan date:20200819 for:【开源问题】 高级查询 下拉框作为并且选项很多多多 LOWCOD-779
delete item.options
// update-end-author:taoyan date:20200819 for:【开源问题】 高级查询 下拉框作为并且选项很多多多 LOWCOD-779
}
}
return false
},
// 去掉数组中的空对象
removeEmptyObject(arr) {
let array = utils.cloneObject(arr)
for (let i = 0; i < array.length; i++) {
let item = array[i]
if (item == null || Object.keys(item).length <= 0) {
array.splice(i--, 1)
} else {
if (Array.isArray(item.options)) {
// 如果有字典属性,就不需要保存 options 了
//update-begin-author:taoyan date:20200819 for:【开源问题】 高级查询 下拉框作为并且选项很多多多 LOWCOD-779
delete item.options
//update-end-author:taoyan date:20200819 for:【开源问题】 高级查询 下拉框作为并且选项很多多多 LOWCOD-779
}
}
}
return array
},
/** 渲染保存查询条件的 title(加个删除按钮) */
renderSaveTreeData (item) {
item.icon = this.treeIcon
item.originTitle = item.title
item.title = (arg1, arg2) => {
let vNode
// 兼容旧版的Antdv
if (arg1.dataRef) {
vNode = arg1
} else if (arg2.dataRef) {
vNode = arg2
} else {
return <span style="color:red;">Antdv版本不支持</span>
}
return array
},
const { originTitle } = vNode.dataRef
return (
<div class="j-history-tree-title">
<span>{originTitle}</span>
/** 渲染保存查询条件的 title(加个删除按钮) */
renderSaveTreeData(item) {
item.icon = this.treeIcon
item.originTitle = item['title']
item.title = (arg1, arg2) => {
let vNode
// 兼容旧版的Antdv
if (arg1.dataRef) {
vNode = arg1
} else if (arg2.dataRef) {
vNode = arg2
} else {
return <span style="color:red;">Antdv版本不支持</span>
}
let {originTitle} = vNode.dataRef
return (
<div class="j-history-tree-title">
<span>{originTitle}</span>
<div class="j-history-tree-title-closer" onClick={e => this.handleRemoveSaveTreeItem(e, vNode)}>
<a-icon type="close-circle"/>
</div>
<div class="j-history-tree-title-closer" onClick={e => this.handleRemoveSaveTreeItem(e, vNode)}>
<a-icon type="close-circle"/>
</div>
)
}
return item
},
</div>
)
}
return item
},
/** 判断是否允许多选 */
allowMultiple(item) {
return item.rule === 'in'
},
/** 判断是否允许多选 */
allowMultiple (item) {
return item.rule === 'in'
},
handleRuleChange(item, newValue) {
let oldValue = item.rule
this.$set(item, 'rule', newValue)
// 上一个规则是否是 in,且type是字典或下拉
if (oldValue === 'in') {
if (item.dictCode || item.options instanceof Array) {
let value = item.val
if (typeof item.val === 'string') {
value = item.val.split(',')[0]
} else if (Array.isArray(item.val)) {
value = item.val[0]
}
this.$set(item, 'val', value)
handleRuleChange (item, newValue) {
const oldValue = item.rule
this.$set(item, 'rule', newValue)
// 上一个规则是否是 in,且type是字典或下拉
if (oldValue === 'in') {
if (item.dictCode || item.options instanceof Array) {
let value = item.val
if (typeof item.val === 'string') {
value = item.val.split(',')[0]
} else if (Array.isArray(item.val)) {
value = item.val[0]
}
this.$set(item, 'val', value)
}
},
handleChangeJPopup(item, e, values) {
item.val = values[item.popup['destFields']]
},
}
},
handleChangeJPopup (item, e, values) {
item.val = values[item.popup.destFields]
}
}
}
</script>
<style lang="less" scoped>
@@ -677,4 +675,4 @@
}
</style>
</style>
+68 -69
View File
@@ -20,83 +20,82 @@
</template>
<script>
export default {
name: 'JSwitch',
props: {
value:{
type: String | Number,
required: false
},
disabled:{
type: Boolean,
required: false,
default: false
},
options:{
type:Array,
required:false,
default:()=>['Y','N']
},
query:{
type: Boolean,
required: false,
default: false
}
export default {
name: 'JSwitch',
props: {
value: {
type: String | Number,
required: false
},
data () {
return {
checkStatus: false
}
disabled: {
type: Boolean,
required: false,
default: false
},
computed:{
queryOption(){
let arr = []
arr.push({value:this.options[0],text:''})
arr.push({value:this.options[1],text:'否'})
return arr;
},
//透传给下级组件的事件,需要排除本组件使用的change事件
childListeners() {
const vm = this;
let result = Object.assign({},
this.$listeners,
)
delete result.change;
return result;
}
options: {
type: Array,
required: false,
default: () => ['Y', 'N']
},
watch: {
value:{
immediate: true,
handler(val){
if(!this.query){
if(!val){
query: {
type: Boolean,
required: false,
default: false
}
},
data () {
return {
checkStatus: false
}
},
computed: {
queryOption () {
const arr = []
arr.push({ value: this.options[0], text: '是' })
arr.push({ value: this.options[1], text: '否' })
return arr
},
// 透传给下级组件的事件,需要排除本组件使用的change事件
childListeners () {
const vm = this
const result = Object.assign({},
this.$listeners
)
delete result.change
return result
}
},
watch: {
value: {
immediate: true,
handler (val) {
if (!this.query) {
if (!val) {
this.checkStatus = false
this.$emit('change', this.options[1])
} else {
if (this.options[0] == val) {
this.checkStatus = true
} else {
this.checkStatus = false
this.$emit('change', this.options[1]);
}else{
if(this.options[0]==val){
this.checkStatus = true
}else{
this.checkStatus = false
}
}
}
}
}
},
methods: {
handleChange(checked){
let flag = checked===false?this.options[1]:this.options[0];
this.$emit('change', flag);
},
handleSelectChange(value){
this.$emit('change', value);
}
},
model: {
prop: 'value',
event: 'change'
}
},
methods: {
handleChange (checked) {
const flag = checked === false ? this.options[1] : this.options[0]
this.$emit('change', flag)
},
handleSelectChange (value) {
this.$emit('change', value)
}
},
model: {
prop: 'value',
event: 'change'
}
}
</script>
+58 -57
View File
@@ -67,9 +67,9 @@
<script>
import get from 'lodash.get'
const LEFT_FROZEN = 1; // 1为左侧冻结
const RIGHT_FROZEN = 2; // 2为右侧冻结
const NO_FROZEN = 3; // 3为不冻结或解冻
const LEFT_FROZEN = 1 // 1为左侧冻结
const RIGHT_FROZEN = 2 // 2为右侧冻结
const NO_FROZEN = 3 // 3为不冻结或解冻
export default {
name: 'JTable',
@@ -89,33 +89,33 @@ export default {
},
isShowPage: {
type: Boolean,
default() {
default () {
return true
},
}
},
isCheck: {
type: Boolean,
default() {
default () {
return true
},
}
},
isShowDropdown: {
type: Boolean,
default() {
default () {
return true
},
}
},
rowSelection: {
type: Object,
default() {
default () {
return {
type: 'checkbox',
type: 'checkbox'
}
},
}
},
pagination: {
type: Object,
default() {
default () {
return {
current: 1,
pageSize: 10,
@@ -127,43 +127,43 @@ export default {
return range[0] + '-' + range[1] + ' 共' + total + '条'
}
}
},
},
}
}
},
data() {
data () {
return {
key: "customer_cloumns_" + this.$route.path, // 存储当前列表的用户存储信息
defaultOperationKey: "action", // 操作列dataIndex=action不作相关处理,默认去除
key: 'customer_cloumns_' + this.$route.path, // 存储当前列表的用户存储信息
defaultOperationKey: 'action', // 操作列dataIndex=action不作相关处理,默认去除
usedSlots: [], // 内部使用的 slots ,不再处理
needTotalList: [],
selectedRows: [],
selectedRowKeys: [],
curTableColumns: this.columns,
checkedList: [],
plainOptions: [], //筛选显示的列头数组
plainOptions: [], // 筛选显示的列头数组
radioStyle: {
display: 'block',
height: '30px',
lineHeight: '30px',
},
lineHeight: '30px'
}
}
},
computed: {
rowSelect() {
rowSelect () {
if (this.isCheck) {
return this.rowSelection
} else {
return null
}
},
ispagination() {
ispagination () {
if (this.isShowPage) {
return this.pagination
} else {
return false
}
},
isShowIcon() {
isShowIcon () {
if (this.isShowDropdown) {
return true
} else {
@@ -171,26 +171,26 @@ export default {
}
},
// 获取插槽信息
scopedSlotsKeys() {
scopedSlotsKeys () {
return Object.keys(this.$scopedSlots).filter(key => !this.usedSlots.includes(key))
},
// 需要插槽处理的列的信息
columnsSlot() {
let a= this.curTableColumns.filter(
columnsSlot () {
const a = this.curTableColumns.filter(
item => item.slots
);
)
console.log(a)
return a
}
},
mounted() {
mounted () {
// 遍历出筛选列头的所有选项
this.columns.forEach((item) => {
if (item.slots && item.slots.title){
let colItem = {
if (item.slots && item.slots.title) {
const colItem = {
value: item.slots.title,
label: item.slots.title,
disabled: false,
disabled: false
}
this.plainOptions.push(colItem)
}
@@ -204,7 +204,7 @@ export default {
}
// 遍历出筛选列头中的已选项
this.curTableColumns.forEach((item) => {
if (item.slots && item.slots.title){
if (item.slots && item.slots.title) {
this.checkedList.push(item.slots.title)
} else if (item.title) {
this.checkedList.push(item.title)
@@ -212,14 +212,14 @@ export default {
})
console.log(this.checkedList)
},
created() {
created () {
this.needTotalList = this.initTotalList(this.columns)
console.log(this.$route.path)
console.log(this.key)
},
methods: {
// 用户可自行筛选列头显示的字段
onChange(e) {
onChange (e) {
// 只剩一个时候,最后一个多选按钮禁用
if (this.checkedList.length === 1) {
this.plainOptions.forEach((item) => {
@@ -233,10 +233,10 @@ export default {
})
}
let trfList = [] //将中文转换为dataIndex
let initList = [] //最初始list
let diffList = [] //两个数组不同
//转换为dataIndex
const trfList = [] // 将中文转换为dataIndex
const initList = [] // 最初始list
let diffList = [] // 两个数组不同
// 转换为dataIndex
for (let i = 0; i < e.length; i++) {
this.columns.find((item) => {
if (item.slots && item.slots.title === e[i]) {
@@ -264,19 +264,19 @@ export default {
}
},
// 比较两个数组之间的不同,生成新数组
getArrDifference(arr1, arr2) {
let that = this;
getArrDifference (arr1, arr2) {
const that = this
return arr1.concat(arr2).filter(function (v, i, arr) {
if (v !== that.defaultOperationKey){
if (v !== that.defaultOperationKey) {
return arr.indexOf(v) === arr.lastIndexOf(v)
} else {
return false;
return false
}
})
},
fixedChange(e, dataIndex) {
fixedChange (e, dataIndex) {
if (e.target.value === LEFT_FROZEN) {
//左侧冻结
// 左侧冻结
this.curTableColumns.find((item) => {
if (item.dataIndex === dataIndex) {
item.fixed = 'left'
@@ -292,7 +292,7 @@ export default {
// }
// this.curTableColumns.unshift(arr[0])
} else if (e.target.value === RIGHT_FROZEN) {
//右侧冻结
// 右侧冻结
this.curTableColumns.find((item) => {
if (item.dataIndex === dataIndex) {
item.fixed = 'right'
@@ -309,7 +309,7 @@ export default {
// this.curTableColumns.push(arr[0])
} else {
this.curTableColumns.find((item) => {
//解冻
// 解冻
if (item.dataIndex === dataIndex) {
item.fixed = false
}
@@ -318,10 +318,10 @@ export default {
}
},
// 列头重新排序
diffColunms() {
let newColumnsList = [] //没有fixed属性的List
let newFixedLeftList = [] //fixed=left的List
let newFixedRightList = [] //fixed=right的List
diffColunms () {
const newColumnsList = [] // 没有fixed属性的List
const newFixedLeftList = [] // fixed=left的List
const newFixedRightList = [] // fixed=right的List
this.curTableColumns.forEach((item) => {
if (!item.fixed) {
newColumnsList.push(item)
@@ -350,29 +350,30 @@ export default {
},
updateSelect (selectedRowKeys, selectedRows) {
this.selectedRowKeys = selectedRowKeys
let list = this.needTotalList
const list = this.needTotalList
this.needTotalList = list.map(item => {
return {
...item,
total: selectedRows.reduce((sum, val) => {
let total = sum + get(val, item.dataIndex)
const total = sum + get(val, item.dataIndex)
return isNaN(total) ? 0 : total
}, 0)
}
})
},
initTotalList(columns) {
initTotalList (columns) {
const totalList = []
columns && columns instanceof Array && columns.forEach(column => {
if (column.needTotal) {
totalList.push({ ...column,
totalList.push({
...column,
total: 0
})
}
})
return totalList
},
},
}
}
}
</script>
+66 -66
View File
@@ -11,80 +11,80 @@
</template>
<script>
import moment from 'moment'
export default {
name: 'JTime',
props: {
placeholder:{
type: String,
default: '',
required: false
},
value:{
type: String,
required: false
},
dateFormat:{
type: String,
default: 'HH:mm:ss',
required: false
},
readOnly:{
type: Boolean,
required: false,
default: false
},
disabled:{
type: Boolean,
required: false,
default: false
},
getCalendarContainer: {
type: Function,
default: (node) => node.parentNode
}
import moment from 'moment'
export default {
name: 'JTime',
props: {
placeholder: {
type: String,
default: '',
required: false
},
data () {
let timeStr = this.value;
return {
decorator:"",
momVal:!timeStr?null:moment(timeStr,this.dateFormat)
}
value: {
type: String,
required: false
},
computed: {
//透传给下级组件的事件,需要排除本组件使用的change事件
childListeners() {
const vm = this;
let result = Object.assign({},
this.$listeners,
)
delete result.change;
return result;
}
dateFormat: {
type: String,
default: 'HH:mm:ss',
required: false
},
watch: {
value (val) {
if(!val){
this.momVal = null
}else{
this.momVal = moment(val,this.dateFormat)
}
}
readOnly: {
type: Boolean,
required: false,
default: false
},
methods: {
moment,
handleTimeChange(mom,timeStr){
this.$emit('change', timeStr);
}
disabled: {
type: Boolean,
required: false,
default: false
},
//2.2新增 在组件内定义 指定父组件调用时候的传值属性和事件类型 这个牛逼
model: {
prop: 'value',
event: 'change'
getCalendarContainer: {
type: Function,
default: (node) => node.parentNode
}
},
data () {
const timeStr = this.value
return {
decorator: '',
momVal: !timeStr ? null : moment(timeStr, this.dateFormat)
}
},
computed: {
// 透传给下级组件的事件,需要排除本组件使用的change事件
childListeners () {
const vm = this
const result = Object.assign({},
this.$listeners
)
delete result.change
return result
}
},
watch: {
value (val) {
if (!val) {
this.momVal = null
} else {
this.momVal = moment(val, this.dateFormat)
}
}
},
methods: {
moment,
handleTimeChange (mom, timeStr) {
this.$emit('change', timeStr)
}
},
// 2.2新增 在组件内定义 指定父组件调用时候的传值属性和事件类型 这个牛逼
model: {
prop: 'value',
event: 'change'
}
}
</script>
<style scoped>
</style>
</style>
+187 -187
View File
@@ -17,202 +17,202 @@
</template>
<script>
import { getAction } from '@/api/manage'
import { getAction } from '@/api/manage'
export default {
name: 'JTreeDict',
data(){
return {
treeData:[],
treeValue: null,
url_root:"/sys/category/loadTreeRoot",
url_children:"/sys/category/loadTreeChildren",
url_view:'/sys/category/loadOne',
}
export default {
name: 'JTreeDict',
data () {
return {
treeData: [],
treeValue: null,
url_root: '/sys/category/loadTreeRoot',
url_children: '/sys/category/loadTreeChildren',
url_view: '/sys/category/loadOne'
}
},
props: {
value: {
// type: String,
required: false
},
props:{
value:{
// type: String,
required: false
},
placeholder:{
type: String,
default: '请选择',
required: false
},
parentCode:{
type: String,
default: '',
required: false
},
field:{
type: String,
default: 'id',
required: false
},
root:{
type:Object,
required:false,
default:()=>{
return {
pid:'0'
}
}
},
async:{
type:Boolean,
default:false,
required:false
},
disabled:{
type:Boolean,
default:false,
required:false
}
placeholder: {
type: String,
default: '请选择',
required: false
},
watch:{
root:{
handler(val){
console.log("root-change",val)
},
deep:true
},
parentCode:{
handler(){
this.loadRoot()
}
},
value:{
handler(){
this.loadViewInfo()
parentCode: {
type: String,
default: '',
required: false
},
field: {
type: String,
default: 'id',
required: false
},
root: {
type: Object,
required: false,
default: () => {
return {
pid: '0'
}
}
},
computed:{
_attrs(){
let attrs
attrs = { ...this.$attrs }
return attrs
async: {
type: Boolean,
default: false,
required: false
},
disabled: {
type: Boolean,
default: false,
required: false
}
},
watch: {
root: {
handler (val) {
console.log('root-change', val)
},
//透传给下级组件的事件,需要排除本组件使用的change事件
childListeners() {
const vm = this;
let result = Object.assign({},
this.$listeners,
)
delete result.change;
return result;
deep: true
},
parentCode: {
handler () {
this.loadRoot()
}
},
created(){
this.loadRoot()
this.loadViewInfo()
},
model: {
prop: 'value',
event: 'change'
},
methods:{
loadViewInfo(){
if(!this.value || this.value=="0"){
this.treeValue = null
}else{
let param = {
field:this.field,
val:this.value
}
getAction(this.url_view,param).then(res=>{
if(res.success){
this.treeValue = {
value:this.value,
label:res.result.name
}
}
})
}
},
loadRoot(){
let param = {
async:this.async,
pcode:this.parentCode
}
getAction(this.url_root,param).then(res=>{
if(res.success){
this.handleTreeNodeValue(res.result)
this.treeData = [...res.result]
}else{
this.$message.error(res.message)
}
})
},
asyncLoadTreeData (treeNode) {
return new Promise((resolve) => {
if(!this.async){
resolve()
return
}
if (treeNode.$vnode.children) {
resolve()
return
}
let pid = treeNode.$vnode.key
let param = {
pid:pid
}
getAction(this.url_children,param).then(res=>{
if(res.success){
this.handleTreeNodeValue(res.result)
this.addChildren(pid,res.result,this.treeData)
this.treeData = [...this.treeData]
}
resolve()
})
})
},
addChildren(pid,children,treeArray){
if(treeArray && treeArray.length>0){
for(let item of treeArray){
if(item.key == pid){
if(!children || children.length==0){
item.leaf = true
}else{
item.children = children
}
break
}else{
this.addChildren(pid,children,item.children)
}
}
}
},
handleTreeNodeValue(result){
let storeField = this.field=='code'?'code':'key'
for(let i of result){
i.value = i[storeField]
i.isLeaf = (!i.leaf)?false:true
if(i.children && i.children.length>0){
this.handleTreeNodeValue(i.children)
}
}
},
onChange(value){
if(!value){
/*
* 使用$listeners向上暴露事件---和$emit一起使用出现的问题:change事件会执行两遍
* 解决办法:改变选中时提交的事件名*/
this.$emit('change', '');
}else{
this.$emit('change', value.value);
}
this.treeValue = value
},
onSearch(value){
console.log(value)
},
getCurrTreeData(){
return this.treeData
value: {
handler () {
this.loadViewInfo()
}
}
},
computed: {
_attrs () {
let attrs
attrs = { ...this.$attrs }
return attrs
},
// 透传给下级组件的事件,需要排除本组件使用的change事件
childListeners () {
const vm = this
const result = Object.assign({},
this.$listeners
)
delete result.change
return result
}
},
created () {
this.loadRoot()
this.loadViewInfo()
},
model: {
prop: 'value',
event: 'change'
},
methods: {
loadViewInfo () {
if (!this.value || this.value == '0') {
this.treeValue = null
} else {
const param = {
field: this.field,
val: this.value
}
getAction(this.url_view, param).then(res => {
if (res.success) {
this.treeValue = {
value: this.value,
label: res.result.name
}
}
})
}
},
loadRoot () {
const param = {
async: this.async,
pcode: this.parentCode
}
getAction(this.url_root, param).then(res => {
if (res.success) {
this.handleTreeNodeValue(res.result)
this.treeData = [...res.result]
} else {
this.$message.error(res.message)
}
})
},
asyncLoadTreeData (treeNode) {
return new Promise((resolve) => {
if (!this.async) {
resolve()
return
}
if (treeNode.$vnode.children) {
resolve()
return
}
const pid = treeNode.$vnode.key
const param = {
pid: pid
}
getAction(this.url_children, param).then(res => {
if (res.success) {
this.handleTreeNodeValue(res.result)
this.addChildren(pid, res.result, this.treeData)
this.treeData = [...this.treeData]
}
resolve()
})
})
},
addChildren (pid, children, treeArray) {
if (treeArray && treeArray.length > 0) {
for (const item of treeArray) {
if (item.key == pid) {
if (!children || children.length == 0) {
item.leaf = true
} else {
item.children = children
}
break
} else {
this.addChildren(pid, children, item.children)
}
}
}
},
handleTreeNodeValue (result) {
const storeField = this.field == 'code' ? 'code' : 'key'
for (const i of result) {
i.value = i[storeField]
i.isLeaf = !(!i.leaf)
if (i.children && i.children.length > 0) {
this.handleTreeNodeValue(i.children)
}
}
},
onChange (value) {
if (!value) {
/*
* 使用$listeners向上暴露事件---和$emit一起使用出现的问题:change事件会执行两遍
* 解决办法:改变选中时提交的事件名 */
this.$emit('change', '')
} else {
this.$emit('change', value.value)
}
this.treeValue = value
},
onSearch (value) {
console.log(value)
},
getCurrTreeData () {
return this.treeData
}
}
</script>
}
</script>
+272 -272
View File
@@ -39,300 +39,300 @@
</template>
<script>
/*
/*
* 异步树加载组件 通过传入表名 显示字段 存储字段 加载一个树控件
* <j-tree-select dict="aa_tree_test,aad,id" pid-field="pid" ></j-tree-select>
* */
import { getAction } from '@/api/manage'
import { getAction } from '@/api/manage'
export default {
name: 'JTreeSelect',
props: {
isAsync:{ // 是否采用异步方式初始化树
type:Boolean,
required:false,
default:true
},
value:{
// type: String,
required: false
},
placeholder:{
type: String,
default: '请选择',
required: false
},
dict:{
type: String,
default: '',
required: false
},
pidField:{
type: String,
default: 'pid',
required: false
},
pidValue:{
type: String,
default: '',
required: false
},
disabled:{
type:Boolean,
default:false,
required:false
},
hasChildField:{
type: String,
default: '',
required: false
},
condition:{
type:String,
default:'',
required:false
},
// 是否支持多选
multiple: {
type: Boolean,
default: false,
},
loadTriggleChange:{
type: Boolean,
default: false,
required:false
export default {
name: 'JTreeSelect',
props: {
isAsync: { // 是否采用异步方式初始化树
type: Boolean,
required: false,
default: true
},
value: {
// type: String,
required: false
},
placeholder: {
type: String,
default: '请选择',
required: false
},
dict: {
type: String,
default: '',
required: false
},
pidField: {
type: String,
default: 'pid',
required: false
},
pidValue: {
type: String,
default: '',
required: false
},
disabled: {
type: Boolean,
default: false,
required: false
},
hasChildField: {
type: String,
default: '',
required: false
},
condition: {
type: String,
default: '',
required: false
},
// 是否支持多选
multiple: {
type: Boolean,
default: false
},
loadTriggleChange: {
type: Boolean,
default: false,
required: false
}
},
data () {
return {
treeValue: null, // 选中的数据
treeData: [], // 渲染树的数组
url: '/sys/dict/loadTreeData',
view: '/sys/dict/loadDictItem/',
tableName: '',
text: '',
code: ''
}
},
watch: {
value () {
this.loadItemByCode()
},
dict () {
this.initDictInfo()
this.loadRoot()
}
},
computed: {
_attrs () {
let attrs
attrs = { ...this.$attrs }
return attrs
},
// 透传给下级组件的事件,需要排除本组件使用的change事件
childListeners () {
const vm = this
const result = Object.assign({},
this.$listeners
)
delete result.change
return result
}
},
created () {
this.validateProp().then(() => {
this.initDictInfo()
this.loadRoot()
this.loadItemByCode()
})
},
mounted () {
window.that = this
},
methods: {
loadItemByCode () {
if (!this.value || this.value == '0') {
this.treeValue = null
} else {
getAction(`${this.view}${this.dict}`, { key: this.value }).then(res => {
if (res.success) {
const values = this.value.split(',')
this.treeValue = values // v-model接收的是string || string[]
// 将节点名称显示在选择框上
this.treeValue = res.result[0]
this.onLoadTriggleChange(res.result[0])
}
})
}
},
data () {
return {
treeValue: null, // 选中的数据
treeData:[],// 渲染树的数组
url:"/sys/dict/loadTreeData",
view:'/sys/dict/loadDictItem/',
tableName:"",
text:"",
code:"",
onLoadTriggleChange (text) {
// 只有单选才会触发
if (!this.multiple && this.loadTriggleChange) {
this.$emit('change', this.value, text)
}
},
watch: {
value () {
this.loadItemByCode()
},
dict(){
this.initDictInfo()
this.loadRoot()
}
initDictInfo () { // 取出父组件传过来的codetexttableName
const arr = this.dict.split(',')
this.tableName = arr[0]
this.text = arr[1]
this.code = arr[2]
},
computed:{
_attrs() {
let attrs
attrs = { ...this.$attrs }
return attrs
},
//透传给下级组件的事件,需要排除本组件使用的change事件
childListeners() {
const vm = this;
let result = Object.assign({},
this.$listeners,
)
delete result.change;
return result;
}
},
created(){
this.validateProp().then(()=>{
this.initDictInfo()
this.loadRoot()
this.loadItemByCode()
// 异步加载树节点
asyncLoadTreeData (treeNode) {
return new Promise((resolve) => {
if (treeNode.$vnode.children) {
resolve()
return
}
const pid = treeNode.$vnode.key
const param = {
pid: pid,
tableName: this.tableName,
text: this.text,
code: this.code,
pidField: this.pidField,
hasChildField: this.hasChildField,
condition: this.condition
}
getAction(this.url, param).then(res => {
if (res.success) {
for (const i of res.result) {
i.value = i.key
if (i.leaf == false) {
i.isLeaf = false
} else if (i.leaf == true) {
i.isLeaf = true
}
}
this.addChildren(pid, res.result, this.treeData)
this.treeData = [...this.treeData]
}
resolve()
})
})
},
mounted(){
window.that = this
addChildren (pid, children, treeArray) {
if (treeArray && treeArray.length > 0) {
for (const item of treeArray) {
if (item.key == pid) { // 找到当前元素所在的父节点
if (!children || children.length == 0) {
item.isLeaf = true
} else {
item.children = children // 搜索出来的children添加到原树子children
}
break
} else {
this.addChildren(pid, children, item.children)
}
}
}
},
methods: {
loadItemByCode(){
if( !this.value || this.value == "0" ){
this.treeValue = null
}else{
getAction(`${this.view}${this.dict}`,{key:this.value}).then(res=>{
if(res.success){
let values = this.value.split(',')
this.treeValue = values // v-model接收的是string || string[]
//将节点名称显示在选择框上
this.treeValue = res.result[0]
this.onLoadTriggleChange(res.result[0]);
}
})
}
},
onLoadTriggleChange(text){
//只有单选才会触发
if(!this.multiple && this.loadTriggleChange){
this.$emit('change', this.value,text)
}
},
initDictInfo(){ //取出父组件传过来的codetexttableName
let arr = this.dict.split(",")
this.tableName = arr[0]
this.text = arr[1]
this.code = arr[2]
},
//异步加载树节点
asyncLoadTreeData (treeNode) {
return new Promise((resolve) => {
if (treeNode.$vnode.children) {
resolve()
return
}
let pid = treeNode.$vnode.key
let param = {
pid:pid,
tableName:this.tableName,
text:this.text,
code:this.code,
pidField:this.pidField,
hasChildField:this.hasChildField,
condition:this.condition
}
getAction(this.url,param).then(res=>{
if(res.success){
for(let i of res.result){
i.value = i.key
if(i.leaf==false){
i.isLeaf=false
}else if(i.leaf==true){
i.isLeaf=true
}
}
this.addChildren(pid,res.result,this.treeData)
this.treeData = [...this.treeData]
}
resolve()
})
})
},
addChildren(pid,children,treeArray){
if(treeArray && treeArray.length>0){
for(let item of treeArray){
if(item.key == pid){ //找到当前元素所在的父节点
if(!children || children.length==0){
item.isLeaf=true
}else{
item.children = children // 搜索出来的children添加到原树子children
}
break
}else{
this.addChildren(pid,children,item.children)
}
}
}
},
/**
/**
* 初始化树
* isAsynctrue===异步获取 false===同步获取数据 默认异步*/
loadRoot(){
if (this.isAsync){
let param = {
pid:this.pidValue,
tableName:this.tableName,
text:this.text,
code:this.code,
pidField:this.pidField,
hasChildField:this.hasChildField,
condition:this.condition
}
getAction(this.url,param).then(res=>{
if(res.success && res.result){
for(let i of res.result){
i.value = i.key
if(i.leaf==false){
i.isLeaf=false
}else if(i.leaf==true){
i.isLeaf=true
}
}
this.treeData = [...res.result]
}else{
console.log("数根节点查询结果-else",res)
}
})
}else{
//同步
let param = {
code:this.code,
pidField:this.pidField,
tableName:this.tableName,
text:this.text
}
getAction('/sys/dict/queryAllTreeData',param).then((res)=>{
if (res.success){
this.treeData = deepFor(res.result)
}
})
* isAsynctrue===异步获取 false===同步获取数据 默认异步 */
loadRoot () {
if (this.isAsync) {
const param = {
pid: this.pidValue,
tableName: this.tableName,
text: this.text,
code: this.code,
pidField: this.pidField,
hasChildField: this.hasChildField,
condition: this.condition
}
},
onChange(value){
if(!value){
/*
getAction(this.url, param).then(res => {
if (res.success && res.result) {
for (const i of res.result) {
i.value = i.key
if (i.leaf == false) {
i.isLeaf = false
} else if (i.leaf == true) {
i.isLeaf = true
}
}
this.treeData = [...res.result]
} else {
console.log('数根节点查询结果-else', res)
}
})
} else {
// 同步
const param = {
code: this.code,
pidField: this.pidField,
tableName: this.tableName,
text: this.text
}
getAction('/sys/dict/queryAllTreeData', param).then((res) => {
if (res.success) {
this.treeData = deepFor(res.result)
}
})
}
},
onChange (value) {
if (!value) {
/*
* 使用$listeners向上暴露事件---和$emit一起使用出现的问题:change事件会执行两遍
* 解决办法:改变选中时提交的事件名*/
this.$emit('change', '');
this.treeValue = null
} else if (value instanceof Array) {
//多选
this.$emit('change', value.join(',').toString()) //修改第一次选中时,选中为空的情况
this.treeValue = value
* 解决办法:改变选中时提交的事件名 */
this.$emit('change', '')
this.treeValue = null
} else if (value instanceof Array) {
// 多选
this.$emit('change', value.join(',').toString()) // 修改第一次选中时,选中为空的情况
this.treeValue = value
} else {
// 单选
this.$emit('change', value)
this.treeValue = value
}
},
getCurrTreeData () {
return this.treeData
},
validateProp () {
const myCondition = this.condition
return new Promise((resolve, reject) => {
if (!myCondition) {
resolve()
} else {
//单选
this.$emit('change', value)
this.treeValue = value
}
},
getCurrTreeData(){
return this.treeData
},
validateProp(){
let myCondition = this.condition
return new Promise((resolve,reject)=>{
if(!myCondition){
resolve();
}else{
try {
let test=JSON.parse(myCondition);
if(typeof test == 'object' && test){
resolve()
}else{
this.$message.error("组件JTreeSelect-condition传值有误,需要一个json字符串!")
reject()
}
} catch(e) {
this.$message.error("组件JTreeSelect-condition传值有误,需要一个json字符串!")
try {
const test = JSON.parse(myCondition)
if (typeof test === 'object' && test) {
resolve()
} else {
this.$message.error('组件JTreeSelect-condition传值有误需要一个json字符串!')
reject()
}
} catch (e) {
this.$message.error('组件JTreeSelect-condition传值有误需要一个json字符串!')
reject()
}
})
}
},
//2.2新增 在组件内定义 指定父组件调用时候的传值属性和事件类型
model: {
prop: 'value',
event: 'change'
}
})
}
},
// 2.2新增 在组件内定义 指定父组件调用时候的传值属性和事件类型
model: {
prop: 'value',
event: 'change'
}
//递归整个树,判断是否是叶子节点----同步获取数据时用到
function deepFor(source){
for(let i of source){
i.value = i.key
}
// 递归整个树,判断是否是叶子节点----同步获取数据时用到
function deepFor (source) {
for (const i of source) {
i.value = i.key
if(i.leaf==false){
i.isLeaf=false
}else if(i.leaf==true){
i.isLeaf=true
}
if (i.children && i.children.length > 0){
deepFor(i.children)
}
if (i.leaf == false) {
i.isLeaf = false
} else if (i.leaf == true) {
i.isLeaf = true
}
if (i.children && i.children.length > 0) {
deepFor(i.children)
}
return source
}
return source
}
</script>
+149 -149
View File
@@ -17,164 +17,164 @@
</template>
<script>
import { getAction } from '@/api/manage'
import { getAction } from '@/api/manage'
export default {
name: 'JTreeTable',
props: {
rowKey: {
type: String,
default: 'id'
},
// 根据什么查询,如果传递 id 就根据 id 查询
queryKey: {
type: String,
default: 'parentId'
},
queryParams: {
type: Object,
default: () => ({})
},
// 查询顶级时的值,如果顶级为0,则传0
topValue: {
type: String,
default: null
},
columns: {
type: Array,
required: true
},
url: {
type: String,
required: true
},
childrenUrl: {
type: String,
default: null
},
tableProps: {
type: Object,
default: () => ({})
},
/** 是否在创建组件的时候就查询数据 */
immediateRequest: {
type: Boolean,
default: true
},
condition:{
type:String,
default:'',
required:false
}
export default {
name: 'JTreeTable',
props: {
rowKey: {
type: String,
default: 'id'
},
data() {
return {
dataSource: [],
expandedRowKeys: []
}
// 根据什么查询,如果传递 id 就根据 id 查询
queryKey: {
type: String,
default: 'parentId'
},
computed: {
getChildrenUrl() {
if (this.childrenUrl) {
return this.childrenUrl
} else {
return this.url
}
},
slots() {
let slots = []
for (let column of this.columns) {
if (column.scopedSlots && column.scopedSlots.customRender) {
slots.push(column.scopedSlots.customRender)
}
}
return slots
},
tableAttrs() {
return Object.assign(this.$attrs, this.tableProps)
}
queryParams: {
type: Object,
default: () => ({})
},
watch: {
queryParams: {
deep: true,
handler() {
this.loadData()
}
}
// 查询顶级时的值,如果顶级为0,则传0
topValue: {
type: String,
default: null
},
created() {
if (this.immediateRequest) this.loadData()
columns: {
type: Array,
required: true
},
methods: {
/** 加载数据*/
loadData(id = this.topValue, first = true, url = this.url) {
this.$emit('requestBefore', { first })
if (first) {
this.expandedRowKeys = []
}
let params = Object.assign({}, this.queryParams || {})
params[this.queryKey] = id
if(this.condition && this.condition.length>0){
params['condition'] = this.condition
}
return getAction(url, params).then(res => {
let list = []
if (res.result instanceof Array) {
list = res.result
} else if (res.result.records instanceof Array) {
list = res.result.records
} else {
throw '返回数据类型不识别'
}
let dataSource = list.map(item => {
// 判断是否标记了带有子级
if (item.hasChildren === true) {
// 查找第一个带有dataIndex的值的列
let firstColumn
for (let column of this.columns) {
firstColumn = column.dataIndex
if (firstColumn) break
}
// 定义默认展开时显示的loading子级,实际子级数据只在展开时加载
let loadChild = { id: `${item.id}_loadChild`, [firstColumn]: 'loading...', isLoading: true }
item.children = [loadChild]
}
return item
})
if (first) {
this.dataSource = dataSource
}
this.$emit('requestSuccess', { first, dataSource, res })
return Promise.resolve(dataSource)
}).finally(() => this.$emit('requestFinally', { first }))
},
/** 点击展开图标时触发 */
handleExpand(expanded, record) {
// 判断是否是展开状态
if (expanded) {
// 判断子级的首个项的标记是否是“正在加载中”,如果是就加载数据
if (record.children[0].isLoading === true) {
this.loadData(record.id, false, this.getChildrenUrl).then(dataSource => {
// 处理好的数据可直接赋值给children
if (dataSource.length === 0) {
record.children = null
} else {
record.children = dataSource
}
})
}
}
}
url: {
type: String,
required: true
},
childrenUrl: {
type: String,
default: null
},
tableProps: {
type: Object,
default: () => ({})
},
/** 是否在创建组件的时候就查询数据 */
immediateRequest: {
type: Boolean,
default: true
},
condition: {
type: String,
default: '',
required: false
}
},
data () {
return {
dataSource: [],
expandedRowKeys: []
}
},
computed: {
getChildrenUrl () {
if (this.childrenUrl) {
return this.childrenUrl
} else {
return this.url
}
},
slots () {
const slots = []
for (const column of this.columns) {
if (column.scopedSlots && column.scopedSlots.customRender) {
slots.push(column.scopedSlots.customRender)
}
}
return slots
},
tableAttrs () {
return Object.assign(this.$attrs, this.tableProps)
}
},
watch: {
queryParams: {
deep: true,
handler () {
this.loadData()
}
}
},
created () {
if (this.immediateRequest) this.loadData()
},
methods: {
/** 加载数据 */
loadData (id = this.topValue, first = true, url = this.url) {
this.$emit('requestBefore', { first })
if (first) {
this.expandedRowKeys = []
}
const params = Object.assign({}, this.queryParams || {})
params[this.queryKey] = id
if (this.condition && this.condition.length > 0) {
params.condition = this.condition
}
return getAction(url, params).then(res => {
let list = []
if (res.result instanceof Array) {
list = res.result
} else if (res.result.records instanceof Array) {
list = res.result.records
} else {
throw '返回数据类型不识别'
}
const dataSource = list.map(item => {
// 判断是否标记了带有子级
if (item.hasChildren === true) {
// 查找第一个带有dataIndex的值的列
let firstColumn
for (const column of this.columns) {
firstColumn = column.dataIndex
if (firstColumn) break
}
// 定义默认展开时显示的loading子级,实际子级数据只在展开时加载
const loadChild = { id: `${item.id}_loadChild`, [firstColumn]: 'loading...', isLoading: true }
item.children = [loadChild]
}
return item
})
if (first) {
this.dataSource = dataSource
}
this.$emit('requestSuccess', { first, dataSource, res })
return Promise.resolve(dataSource)
}).finally(() => this.$emit('requestFinally', { first }))
},
/** 点击展开图标时触发 */
handleExpand (expanded, record) {
// 判断是否是展开状态
if (expanded) {
// 判断子级的首个项的标记是否是“正在加载中”,如果是就加载数据
if (record.children[0].isLoading === true) {
this.loadData(record.id, false, this.getChildrenUrl).then(dataSource => {
// 处理好的数据可直接赋值给children
if (dataSource.length === 0) {
record.children = null
} else {
record.children = dataSource
}
})
}
}
}
}
}
</script>
<style scoped>
</style>
</style>
+257 -257
View File
@@ -35,275 +35,275 @@
<script>
import Vue from 'vue'
import { ACCESS_TOKEN } from "@/store/mutation-types"
import { getFileAccessHttpUrl } from '@/api/manage';
const Base64 = require('js-base64').Base64
import Vue from 'vue'
import { ACCESS_TOKEN } from '@/store/mutation-types'
import { getFileAccessHttpUrl } from '@/api/manage'
const Base64 = require('js-base64').Base64
const FILE_TYPE_ALL = "all"
const FILE_TYPE_IMG = "image"
const FILE_TYPE_TXT = "file"
const uidGenerator=()=>{
return '-'+parseInt(Math.random()*10000+1,10);
}
export default {
name: 'JUpload',
data(){
return {
uploadAction:window._CONFIG['domianURL']+"/sys/common/upload",
headers:{},
fileList: [],
newFileList: [],
uploadGoOn:true,
}
const FILE_TYPE_ALL = 'all'
const FILE_TYPE_IMG = 'image'
const FILE_TYPE_TXT = 'file'
const uidGenerator = () => {
return '-' + parseInt(Math.random() * 10000 + 1, 10)
}
export default {
name: 'JUpload',
data () {
return {
uploadAction: window._CONFIG.domianURL + '/sys/common/upload',
headers: {},
fileList: [],
newFileList: [],
uploadGoOn: true
}
},
props: {
text: {
type: String,
required: false,
default: '点击上传'
},
props:{
text:{
type:String,
required:false,
default:"点击上传"
},
fileType:{
type:String,
required:false,
default:FILE_TYPE_ALL
},
/*这个属性用于控制文件上传的业务路径*/
bizPath:{
type:String,
required:false,
default:"temp"
},
value:{
type:[String,Array],
required:false
},
// update-begin- --- author:wangshuai ------ date:20190929 ---- for:Jupload组件增加是否能够点击
disabled:{
type:Boolean,
required:false,
default: false
},
// update-end- --- author:wangshuai ------ date:20190929 ---- for:Jupload组件增加是否能够点击
//此属性被废弃了
triggerChange:{
type: Boolean,
required: false,
default: false
},
/**
fileType: {
type: String,
required: false,
default: FILE_TYPE_ALL
},
/* 这个属性用于控制文件上传的业务路径 */
bizPath: {
type: String,
required: false,
default: 'temp'
},
value: {
type: [String, Array],
required: false
},
// update-begin- --- author:wangshuai ------ date:20190929 ---- for:Jupload组件增加是否能够点击
disabled: {
type: Boolean,
required: false,
default: false
},
// update-end- --- author:wangshuai ------ date:20190929 ---- for:Jupload组件增加是否能够点击
// 此属性被废弃了
triggerChange: {
type: Boolean,
required: false,
default: false
},
/**
* update -- author:lvdandan -- date:20190219 -- for:Jupload组件增加是否返回url
* true:仅返回url
* false:返回fileName filePath fileSize
*/
returnUrl:{
type:Boolean,
required:false,
default: true
},
number:{
type:Number,
required:false,
default: 0
},
buttonVisible:{
type:Boolean,
required:false,
default: true
},
multiple: {
type: Boolean,
default: true
},
beforeUpload: {
type: Function
},
isDownload: {
type: Boolean,
default: true
}
returnUrl: {
type: Boolean,
required: false,
default: true
},
watch:{
value:{
immediate: true,
handler() {
let val = this.value
if (val instanceof Array) {
if(this.returnUrl){
this.initFileList(val.join(','))
}else{
this.initFileListArr(val);
}
} else {
this.initFileList(val)
}
}
}
number: {
type: Number,
required: false,
default: 0
},
computed:{
//透传给下级组件的事件,需要排除本组件使用的change事件
childListeners() {
const vm = this;
let result = Object.assign({},
this.$listeners,
)
delete result.change;
return result;
},
isImageComp(){
return this.fileType === FILE_TYPE_IMG
},
complistType(){
return this.fileType === FILE_TYPE_IMG?'picture-card':'text'
},
buttonVisible: {
type: Boolean,
required: false,
default: true
},
created(){
const token = Vue.ls.get(ACCESS_TOKEN);
//---------------------------- begin 图片左右换位置 -------------------------------------
this.headers = {"X-Access-Token":token};
this.containerId = 'container-ty-'+new Date().getTime();
//---------------------------- end 图片左右换位置 -------------------------------------
multiple: {
type: Boolean,
default: true
},
methods:{
initFileListArr(val){
if(!val || val.length==0){
this.fileList = [];
return;
}
for(var a=0;a<val.length;a++){
this.fileList.forEach((item)=>{
if (item.url === val[a]){
item.uid = uidGenerator()
item.response.status = 'done'
}
})
}
},
initFileList(paths){
if(!paths || paths.length==0){
this.fileList = [];
return;
}
let arr = paths.split(",")
for(var a=0;a<arr.length;a++){
this.fileList.forEach((item)=>{
if (item.url === arr[a]){
item.uid = uidGenerator()
item.response.status = 'history'
}
})
}
},
handlePathChange(){
let uploadFiles = this.fileList
let path = ''
if(!uploadFiles || uploadFiles.length==0){
path = ''
}
let arr = [];
for(var a=0;a<uploadFiles.length;a++){
if(uploadFiles[a].status === 'done' ) {
arr.push(uploadFiles[a].url)
}else{
return;
}
}
if(arr.length>0){
path = arr.join(",")
}
this.$emit('change', path);
},
doBeforeUpload(file){
this.uploadGoOn=true
var fileType = file.type;
if(this.fileType===FILE_TYPE_IMG){
if(fileType.indexOf('image')<0){
this.$message.warning('请上传图片');
this.uploadGoOn=false
return false;
}
}
// 扩展 beforeUpload 验证
if (typeof this.beforeUpload === 'function') {
return this.beforeUpload(file)
}
return true
},
handleChange(info) {
if(!info.file.status && this.uploadGoOn === false){
info.fileList.pop();
}
let fileList = info.fileList
if(info.file.status==='done'){
if(this.number>0){
fileList = fileList.slice(-this.number);
}
if(info.file.response.success){
fileList = fileList.map((file) => {
if (file.response) {
let reUrl = `${file.response.result.id}?token=${Vue.ls.get(ACCESS_TOKEN)}&fullfilename=${file.response.result.fileName}`;
file.url = getFileAccessHttpUrl(reUrl);
}
return file;
});
}
//this.$message.success(`${info.file.name} 上传成功!`);
}else if (info.file.status === 'error') {
this.$message.error(`${info.file.name} 上传失败.`);
}else if(info.file.status === 'removed'){
this.handleDelete(info.file)
}
this.fileList = fileList
if(info.file.status==='done' || info.file.status === 'removed'){
//returnUrl为true时仅返回文件路径
if(this.returnUrl){
this.handlePathChange()
}else{
//returnUrl为false时返回文件名称、文件路径及文件大小
this.newFileList = [];
for(var a=0;a<fileList.length;a++){
// update-begin-author:lvdandan date:20200603 for:【TESTA-514】【开源issue】多个文件同时上传时,控制台报错
if(fileList[a].status === 'done' ) {
var fileJson = {
fileName:fileList[a].name,
filePath:fileList[a].url,
fileSize:fileList[a].size
};
this.newFileList.push(fileJson);
}else{
return;
}
// update-end-author:lvdandan date:20200603 for:【TESTA-514】【开源issue】多个文件同时上传时,控制台报错
}
this.$emit('change', this.newFileList);
}
}
},
handleDelete(file){
//如有需要新增 删除逻辑
console.log(file)
},
handlePreview(file) {
if (file && file.url) {
var fileFullUrl = `${window._CONFIG['domianWebSocketURL']}/sys/common/download/${file.response.result.id}?token=${Vue.ls.get(ACCESS_TOKEN)}&fullfilename=${file.name}`
let url = `${window._CONFIG['onlinePreviewDomainURL']}?url=${encodeURIComponent(Base64.encode(fileFullUrl))}`
window.open(url)
}
},
handleDownload(file) {
if (file && file.url) {
var fileFullUrl = `${window._CONFIG['domianWebSocketURL']}/sys/common/download/${file.response.result.id}?token=${Vue.ls.get(ACCESS_TOKEN)}&fullfilename=${file.name}`
window.open(fileFullUrl)
}
}
beforeUpload: {
type: Function
},
mounted(){},
model: {
prop: 'value',
event: 'change'
isDownload: {
type: Boolean,
default: true
}
},
watch: {
value: {
immediate: true,
handler () {
const val = this.value
if (val instanceof Array) {
if (this.returnUrl) {
this.initFileList(val.join(','))
} else {
this.initFileListArr(val)
}
} else {
this.initFileList(val)
}
}
}
},
computed: {
// 透传给下级组件的事件,需要排除本组件使用的change事件
childListeners () {
const vm = this
const result = Object.assign({},
this.$listeners
)
delete result.change
return result
},
isImageComp () {
return this.fileType === FILE_TYPE_IMG
},
complistType () {
return this.fileType === FILE_TYPE_IMG ? 'picture-card' : 'text'
}
},
created () {
const token = Vue.ls.get(ACCESS_TOKEN)
// ---------------------------- begin 图片左右换位置 -------------------------------------
this.headers = { 'X-Access-Token': token }
this.containerId = 'container-ty-' + new Date().getTime()
// ---------------------------- end 图片左右换位置 -------------------------------------
},
methods: {
initFileListArr (val) {
if (!val || val.length == 0) {
this.fileList = []
return
}
for (var a = 0; a < val.length; a++) {
this.fileList.forEach((item) => {
if (item.url === val[a]) {
item.uid = uidGenerator()
item.response.status = 'done'
}
})
}
},
initFileList (paths) {
if (!paths || paths.length == 0) {
this.fileList = []
return
}
const arr = paths.split(',')
for (var a = 0; a < arr.length; a++) {
this.fileList.forEach((item) => {
if (item.url === arr[a]) {
item.uid = uidGenerator()
item.response.status = 'history'
}
})
}
},
handlePathChange () {
const uploadFiles = this.fileList
let path = ''
if (!uploadFiles || uploadFiles.length == 0) {
path = ''
}
const arr = []
for (var a = 0; a < uploadFiles.length; a++) {
if (uploadFiles[a].status === 'done') {
arr.push(uploadFiles[a].url)
} else {
return
}
}
if (arr.length > 0) {
path = arr.join(',')
}
this.$emit('change', path)
},
doBeforeUpload (file) {
this.uploadGoOn = true
var fileType = file.type
if (this.fileType === FILE_TYPE_IMG) {
if (fileType.indexOf('image') < 0) {
this.$message.warning('请上传图片')
this.uploadGoOn = false
return false
}
}
// 扩展 beforeUpload 验证
if (typeof this.beforeUpload === 'function') {
return this.beforeUpload(file)
}
return true
},
handleChange (info) {
if (!info.file.status && this.uploadGoOn === false) {
info.fileList.pop()
}
let fileList = info.fileList
if (info.file.status === 'done') {
if (this.number > 0) {
fileList = fileList.slice(-this.number)
}
if (info.file.response.success) {
fileList = fileList.map((file) => {
if (file.response) {
const reUrl = `${file.response.result.id}?token=${Vue.ls.get(ACCESS_TOKEN)}&fullfilename=${file.response.result.fileName}`
file.url = getFileAccessHttpUrl(reUrl)
}
return file
})
}
// this.$message.success(`${info.file.name} 上传成功!`);
} else if (info.file.status === 'error') {
this.$message.error(`${info.file.name} 上传失败.`)
} else if (info.file.status === 'removed') {
this.handleDelete(info.file)
}
this.fileList = fileList
if (info.file.status === 'done' || info.file.status === 'removed') {
// returnUrl为true时仅返回文件路径
if (this.returnUrl) {
this.handlePathChange()
} else {
// returnUrl为false时返回文件名称、文件路径及文件大小
this.newFileList = []
for (var a = 0; a < fileList.length; a++) {
// update-begin-author:lvdandan date:20200603 for:【TESTA-514】【开源issue】多个文件同时上传时,控制台报错
if (fileList[a].status === 'done') {
var fileJson = {
fileName: fileList[a].name,
filePath: fileList[a].url,
fileSize: fileList[a].size
}
this.newFileList.push(fileJson)
} else {
return
}
// update-end-author:lvdandan date:20200603 for:【TESTA-514】【开源issue】多个文件同时上传时,控制台报错
}
this.$emit('change', this.newFileList)
}
}
},
handleDelete (file) {
// 如有需要新增 删除逻辑
console.log(file)
},
handlePreview (file) {
if (file && file.url) {
var fileFullUrl = `${window._CONFIG.domianWebSocketURL}/sys/common/download/${file.response.result.id}?token=${Vue.ls.get(ACCESS_TOKEN)}&fullfilename=${file.name}`
const url = `${window._CONFIG.onlinePreviewDomainURL}?url=${encodeURIComponent(Base64.encode(fileFullUrl))}`
window.open(url)
}
},
handleDownload (file) {
if (file && file.url) {
var fileFullUrl = `${window._CONFIG.domianWebSocketURL}/sys/common/download/${file.response.result.id}?token=${Vue.ls.get(ACCESS_TOKEN)}&fullfilename=${file.name}`
window.open(fileFullUrl)
}
}
},
mounted () {},
model: {
prop: 'value',
event: 'change'
}
}
</script>
<style lang="less">
@@ -317,4 +317,4 @@
}
}
}
</style>
</style>
@@ -20,46 +20,46 @@
</template>
<script>
import { cloneObject } from '@/utils/util'
import { cloneObject } from '@/utils/util'
export default {
name: 'JVxeDetailsModal',
inject: ['superTrigger'],
data() {
return {
visible: false,
fullscreen: false,
row: null,
column: null,
}
export default {
name: 'JVxeDetailsModal',
inject: ['superTrigger'],
data () {
return {
visible: false,
fullscreen: false,
row: null,
column: null
}
},
created () {
},
methods: {
open (event) {
const { row, column } = event
this.row = cloneObject(row)
this.column = column
this.visible = true
},
created() {
close () {
this.visible = false
},
methods: {
open(event) {
let {row, column} = event
this.row = cloneObject(row)
this.column = column
this.visible = true
},
handleOk () {
this.superTrigger('detailsConfirm', {
row: this.row,
column: this.column,
callback: (success) => {
this.visible = !success
}
})
}
close() {
this.visible = false
},
handleOk() {
this.superTrigger('detailsConfirm', {
row: this.row,
column: this.column,
callback: (success) => {
this.visible = !success
},
})
},
},
}
}
</script>
<style lang="less">
.fade-enter-active,
@@ -72,4 +72,4 @@
.fade-leave-to {
opacity: 0;
}
</style>
</style>
@@ -10,58 +10,58 @@
</template>
<script>
import PropTypes from 'ant-design-vue/es/_util/vue-types'
import PropTypes from 'ant-design-vue/es/_util/vue-types'
export default {
name: 'JVxePagination',
props: {
size: String,
disabled: PropTypes.bool,
pagination: PropTypes.object.def({}),
},
data() {
export default {
name: 'JVxePagination',
props: {
size: String,
disabled: PropTypes.bool,
pagination: PropTypes.object.def({})
},
data () {
return {
defaultPagination: {
current: 1,
pageSize: 10,
pageSizeOptions: ['10', '20', '30'],
showTotal: (total, range) => {
return range[0] + '-' + range[1] + ' 共 ' + total + ' 条'
},
showQuickJumper: true,
showSizeChanger: true,
total: 100
}
}
},
computed: {
bindProps () {
return {
defaultPagination: {
current: 1,
pageSize: 10,
pageSizeOptions: ['10', '20', '30'],
showTotal: (total, range) => {
return range[0] + '-' + range[1] + ' 共 ' + total + ' 条'
},
showQuickJumper: true,
showSizeChanger: true,
total: 100
}
...this.defaultPagination,
...this.pagination,
size: this.size === 'tiny' ? 'small' : ''
}
},
computed: {
bindProps() {
return {
...this.defaultPagination,
...this.pagination,
size: this.size === 'tiny' ? 'small' : ''
}
},
boxClass() {
return {
'j-vxe-pagination': true,
'show-quick-jumper': !!this.bindProps.showQuickJumper
}
},
},
methods: {
handleChange(current, pageSize) {
this.$set(this.pagination, 'current', current)
this.$emit('change', {current, pageSize})
},
handleShowSizeChange(current, pageSize) {
this.$set(this.pagination, 'pageSize', pageSize)
this.$emit('change', {current, pageSize})
},
boxClass () {
return {
'j-vxe-pagination': true,
'show-quick-jumper': !!this.bindProps.showQuickJumper
}
}
},
methods: {
handleChange (current, pageSize) {
this.$set(this.pagination, 'current', current)
this.$emit('change', { current, pageSize })
},
handleShowSizeChange (current, pageSize) {
this.$set(this.pagination, 'pageSize', pageSize)
this.$emit('change', { current, pageSize })
}
}
}
</script>
<style lang="less" scoped>
</style>
</style>
@@ -17,121 +17,120 @@
</a-popover>
</template>
<script>
import domAlign from 'dom-align'
import { getParentNodeByTagName } from '../utils/vxeUtils'
import { cloneObject, triggerWindowResizeEvent } from '@/utils/util'
import domAlign from 'dom-align'
import { getParentNodeByTagName } from '../utils/vxeUtils'
import { cloneObject, triggerWindowResizeEvent } from '@/utils/util'
export default {
name: 'JVxeSubPopover',
data() {
return {
visible: false,
// 当前行
row: null,
column: null,
export default {
name: 'JVxeSubPopover',
data () {
return {
visible: false,
// 当前行
row: null,
column: null,
overlayStyle: {
width: null,
zIndex: 100
},
placement: 'bottom'
overlayStyle: {
width: null,
zIndex: 100
},
placement: 'bottom'
}
},
created () {
},
methods: {
toggle (event) {
// update-begin-author:taoyan date:20200921 for: 弹出子表时,子表会闪一下,类似重新计算子表的位置
if (document.body.clientHeight - event.$event.clientY > 350) {
this.placement = 'bottom'
} else {
this.placement = 'top'
}
// update-end-author:taoyan date:20200921 for: 弹出子表时,子表会闪一下,类似重新计算子表的位置
if (this.row == null) {
this.open(event)
} else {
this.row.id === event.row.id ? this.close() : this.reopen(event)
}
},
created() {
},
methods: {
toggle(event) {
open (event, level = 0) {
if (level > 3) {
this.$message.error('打开子表失败')
console.warn('【JVxeSubPopover】打开子表失败')
return
}
//update-begin-author:taoyan date:20200921 for: 弹出子表时,子表会闪一下,类似重新计算子表的位置
if(document.body.clientHeight - event.$event.clientY > 350){
this.placement = 'bottom'
}else{
this.placement = 'top'
}
//update-end-author:taoyan date:20200921 for: 弹出子表时,子表会闪一下,类似重新计算子表的位置
if (this.row == null) {
this.open(event)
} else {
this.row.id === event.row.id ? this.close() : this.reopen(event)
}
},
const { row, column, $table, $event: { target } } = event
this.row = cloneObject(row)
this.column = column
open(event, level = 0) {
if (level > 3) {
this.$message.error('打开子表失败')
console.warn('【JVxeSubPopover】打开子表失败')
return
}
let className = target.className || ''
className = typeof className === 'string' ? className : className.toString()
let {row, column, $table, $event: {target}} = event
this.row = cloneObject(row)
this.column = column
let className = target.className || ''
className = typeof className === 'string' ? className : className.toString()
// 点击的是expand,不做处理
if (className.includes('vxe-table--expand-btn')) {
return
// 点击的是expand,不做处理
if (className.includes('vxe-table--expand-btn')) {
return
}
// 点击的是checkbox,不做处理
if (className.includes('vxe-checkbox--icon') || className.includes('vxe-cell--checkbox')) {
return
}
// 点击的是radio,不做处理
if (className.includes('vxe-radio--icon') || className.includes('vxe-cell--radio')) {
return
}
const table = $table.$el
const tr = getParentNodeByTagName(target, 'tr')
if (table && tr) {
const clientWidth = table.clientWidth
const clientHeight = tr.clientHeight
this.$refs.div.style.width = clientWidth + 'px'
this.$refs.div.style.height = clientHeight + 'px'
this.overlayStyle.width = Number.parseInt((clientWidth - clientWidth * 0.04)) + 'px'
this.overlayStyle.maxWidth = this.overlayStyle.width
// update-begin-author:taoyan date:20200921 for: 子表弹出位置存在现实位置问题。
// let realTable = getParentNodeByTagName(tr, 'table')
// let left = realTable.parentNode.scrollLeft
let h = event.$event.clientY
if (h) {
h = h - 140
}
// 点击的是checkbox,不做处理
if (className.includes('vxe-checkbox--icon') || className.includes('vxe-cell--checkbox')) {
return
}
// 点击的是radio,不做处理
if (className.includes('vxe-radio--icon') || className.includes('vxe-cell--radio')) {
return
}
let table = $table.$el
let tr = getParentNodeByTagName(target, 'tr')
if (table && tr) {
let clientWidth = table.clientWidth
let clientHeight = tr.clientHeight
this.$refs.div.style.width = clientWidth + 'px'
this.$refs.div.style.height = clientHeight + 'px'
this.overlayStyle.width = Number.parseInt((clientWidth - clientWidth * 0.04)) + 'px'
this.overlayStyle.maxWidth = this.overlayStyle.width
//update-begin-author:taoyan date:20200921 for: 子表弹出位置存在现实位置问题。
//let realTable = getParentNodeByTagName(tr, 'table')
//let left = realTable.parentNode.scrollLeft
let h = event.$event.clientY
if(h){
h = h-140
const toolbar = this.$refs.div.nextSibling
domAlign(this.$refs.div, toolbar, {
points: ['tl', 'tl'],
offset: [0, h],
overflow: {
alwaysByViewport: true
}
let toolbar = this.$refs.div.nextSibling
domAlign(this.$refs.div, toolbar, {
points: ['tl', 'tl'],
offset: [0, h],
overflow: {
alwaysByViewport: true
},
})
//update-end-author:taoyan date:20200921 for: 子表弹出位置存在现实位置问题。
})
// update-end-author:taoyan date:20200921 for: 子表弹出位置存在现实位置问题。
this.$nextTick(() => {
this.visible = true
this.$nextTick(() => {
this.visible = true
this.$nextTick(() => {
triggerWindowResizeEvent()
})
triggerWindowResizeEvent()
})
} else {
let num = ++level
console.warn('【JVxeSubPopover】table or tr 获取失败,正在进行第 ' + num + '次重试', {event, table, tr})
window.setTimeout(() => this.open(event, num), 100)
}
},
close() {
if (this.visible) {
this.row = null
this.visible = false
}
},
reopen(event) {
this.close()
this.open(event)
},
})
} else {
const num = ++level
console.warn('【JVxeSubPopover】table or tr 获取失败,正在进行第 ' + num + '次重试', { event, table, tr })
window.setTimeout(() => this.open(event, num), 100)
}
},
close () {
if (this.visible) {
this.row = null
this.visible = false
}
},
reopen (event) {
this.close()
this.open(event)
}
}
}
</script>
<style scoped lang="less">
.j-vxe-popover-title {
@@ -179,4 +178,4 @@
.fade-leave-to {
opacity: 0;
}
</style>
</style>
File diff suppressed because it is too large Load Diff
@@ -29,89 +29,89 @@
</template>
<script>
export default {
name: 'JVxeToolbar',
props: {
toolbarConfig: Object,
excludeCode: Array,
size: String,
disabled: Boolean,
disabledRows: Object,
selectedRowIds: Array,
},
data() {
export default {
name: 'JVxeToolbar',
props: {
toolbarConfig: Object,
excludeCode: Array,
size: String,
disabled: Boolean,
disabledRows: Object,
selectedRowIds: Array
},
data () {
return {
// 是否收起
collapsed: true
}
},
computed: {
boxClass () {
return {
// 是否收起
collapsed: true,
'j-vxe-toolbar': true,
'j-vxe-toolbar-collapsed': this.collapsed
}
},
computed: {
boxClass() {
return {
'j-vxe-toolbar': true,
'j-vxe-toolbar-collapsed': this.collapsed,
}
},
btns() {
let arr = this.toolbarConfig.btn || ['add', 'remove', 'clearSelection']
let exclude = [...this.excludeCode]
// TODO 需要将remove替换batch_delete
// 系统默认的批量删除编码配置为 batch_delete 此处需要转化一下
if(exclude.indexOf('batch_delete')>=0){
exclude.push('remove')
}
// 按钮权限 需要去掉不被授权的按钮
return arr.filter(item=>{
return exclude.indexOf(item)<0
})
},
slots() {
return this.toolbarConfig.slot || ['prefix', 'suffix']
},
showPrefix() {
return this.slots.includes('prefix')
},
showSuffix() {
return this.slots.includes('suffix')
},
showAdd() {
return this.btns.includes('add')
},
showSave() {
return this.btns.includes('save')
},
showRemove() {
return this.btns.includes('remove')
},
showClearSelection() {
if (this.btns.includes('clearSelection')) {
// 有禁用行时才显示清空选择按钮
// 因为禁用行会阻止选择行,导致无法取消全选
let length = Object.keys(this.disabledRows).length
return length > 0
}
return false
},
showCollapse() {
return this.btns.includes('collapse')
},
btns () {
const arr = this.toolbarConfig.btn || ['add', 'remove', 'clearSelection']
const exclude = [...this.excludeCode]
// TODO 需要将remove替换batch_delete
// 系统默认的批量删除编码配置为 batch_delete 此处需要转化一下
if (exclude.indexOf('batch_delete') >= 0) {
exclude.push('remove')
}
// 按钮权限 需要去掉不被授权的按钮
return arr.filter(item => {
return exclude.indexOf(item) < 0
})
},
slots () {
return this.toolbarConfig.slot || ['prefix', 'suffix']
},
showPrefix () {
return this.slots.includes('prefix')
},
showSuffix () {
return this.slots.includes('suffix')
},
showAdd () {
return this.btns.includes('add')
},
showSave () {
return this.btns.includes('save')
},
showRemove () {
return this.btns.includes('remove')
},
showClearSelection () {
if (this.btns.includes('clearSelection')) {
// 有禁用行时才显示清空选择按钮
// 因为禁用行会阻止选择行,导致无法取消全选
const length = Object.keys(this.disabledRows).length
return length > 0
}
return false
},
showCollapse () {
return this.btns.includes('collapse')
},
btnSize() {
return this.size === 'tiny' ? 'small' : null
},
},
methods: {
/** 触发事件 */
trigger(name) {
this.$emit(name)
},
// 切换展开收起
toggleCollapse() {
this.collapsed = !this.collapsed
},
btnSize () {
return this.size === 'tiny' ? 'small' : null
}
},
methods: {
/** 触发事件 */
trigger (name) {
this.$emit(name)
},
// 切换展开收起
toggleCollapse () {
this.collapsed = !this.collapsed
}
}
}
</script>
<style lang="less">
@@ -124,4 +124,4 @@
.j-vxe-tool-button.div .ant-btn {
margin-right: 8px;
}
</style>
</style>
@@ -10,86 +10,86 @@
</template>
<script>
import { neverNull } from '@/utils/util'
import JVxeCellMixins from '@/components/jero/JVxeTable/mixins/JVxeCellMixins'
import { neverNull } from '@/utils/util'
import JVxeCellMixins from '@/components/jero/JVxeTable/mixins/JVxeCellMixins'
export default {
name: 'JVxeCheckboxCell',
mixins: [JVxeCellMixins],
props: {},
computed: {
bordered() {
return !!this.renderOptions.bordered
},
scrolling() {
return !!this.renderOptions.scrolling
},
clazz() {
return {
'j-vxe-checkbox': true,
'no-animation': this.scrolling
}
},
boxStyle() {
const style = {}
// 如果有边框且未设置align属性,就强制居中
if (this.bordered && !this.originColumn.align) {
style['text-align'] = 'center'
}
return style
},
export default {
name: 'JVxeCheckboxCell',
mixins: [JVxeCellMixins],
props: {},
computed: {
bordered () {
return !!this.renderOptions.bordered
},
methods: {
handleChange(event) {
this.handleChangeCommon(event.target.checked)
},
scrolling () {
return !!this.renderOptions.scrolling
},
// 【组件增强】注释详见:JVxeCellMixins.js
enhanced: {
switches: {
visible: true,
},
getValue(value) {
let {own: col} = this.column
// 处理 customValue
if (Array.isArray(col.customValue)) {
let customValue = getCustomValue(col)
if (typeof value === 'boolean') {
return value ? customValue[0] : customValue[1]
} else {
return value
}
clazz () {
return {
'j-vxe-checkbox': true,
'no-animation': this.scrolling
}
},
boxStyle () {
const style = {}
// 如果有边框且未设置align属性,就强制居中
if (this.bordered && !this.originColumn.align) {
style['text-align'] = 'center'
}
return style
}
},
methods: {
handleChange (event) {
this.handleChangeCommon(event.target.checked)
}
},
// 【组件增强】注释详见:JVxeCellMixins.js
enhanced: {
switches: {
visible: true
},
getValue (value) {
const { own: col } = this.column
// 处理 customValue
if (Array.isArray(col.customValue)) {
const customValue = getCustomValue(col)
if (typeof value === 'boolean') {
return value ? customValue[0] : customValue[1]
} else {
return value
}
},
setValue(value) {
let {own: col} = this.column
// 判断是否设定了customValue(自定义值)
if (Array.isArray(col.customValue)) {
let customValue = getCustomValue(col)
return neverNull(value).toString() === customValue[0].toString()
} else {
return !!value
}
},
createValue({column}) {
let {own: col} = column
if (Array.isArray(col.customValue)) {
let customValue = getCustomValue(col)
return col.defaultChecked ? customValue[0] : customValue[1]
} else {
return !!col.defaultChecked
}
},
} else {
return value
}
},
setValue (value) {
const { own: col } = this.column
// 判断是否设定了customValue(自定义值)
if (Array.isArray(col.customValue)) {
const customValue = getCustomValue(col)
return neverNull(value).toString() === customValue[0].toString()
} else {
return !!value
}
},
createValue ({ column }) {
const { own: col } = column
if (Array.isArray(col.customValue)) {
const customValue = getCustomValue(col)
return col.defaultChecked ? customValue[0] : customValue[1]
} else {
return !!col.defaultChecked
}
}
}
}
function getCustomValue(col) {
let customTrue = neverNull(col.customValue[0], true)
let customFalse = neverNull(col.customValue[1], false)
return [customTrue, customFalse]
}
function getCustomValue (col) {
const customTrue = neverNull(col.customValue[0], true)
const customFalse = neverNull(col.customValue[1], false)
return [customTrue, customFalse]
}
</script>
<style lang="less">
@@ -100,4 +100,4 @@
transition: none !important;
}
}
</style>
</style>
@@ -13,56 +13,56 @@
</template>
<script>
import moment from 'moment'
import { JVXETypes } from '@/components/jero/JVxeTable/index'
import JVxeCellMixins, { dispatchEvent } from '@/components/jero/JVxeTable/mixins/JVxeCellMixins'
import moment from 'moment'
import { JVXETypes } from '@/components/jero/JVxeTable/index'
import JVxeCellMixins, { dispatchEvent } from '@/components/jero/JVxeTable/mixins/JVxeCellMixins'
export default {
name: 'JVxeDateCell',
mixins: [JVxeCellMixins],
props: {},
data() {
return {
innerDateValue: null,
}
export default {
name: 'JVxeDateCell',
mixins: [JVxeCellMixins],
props: {},
data () {
return {
innerDateValue: null
}
},
computed: {
isDatetime () {
return this.$type === JVXETypes.datetime
},
computed: {
isDatetime() {
return this.$type === JVXETypes.datetime
},
dateFormat() {
let format = this.originColumn.format
return format ? format : (this.isDatetime ? 'YYYY-MM-DD HH:mm:ss' : 'YYYY-MM-DD')
},
},
watch: {
innerValue: {
immediate: true,
handler(val) {
if (val == null || val === '') {
this.innerDateValue = null
} else {
this.innerDateValue = moment(val, this.dateFormat)
}
dateFormat () {
const format = this.originColumn.format
return format || (this.isDatetime ? 'YYYY-MM-DD HH:mm:ss' : 'YYYY-MM-DD')
}
},
watch: {
innerValue: {
immediate: true,
handler (val) {
if (val == null || val === '') {
this.innerDateValue = null
} else {
this.innerDateValue = moment(val, this.dateFormat)
}
}
},
methods: {
handleChange(mom, dateStr) {
this.handleChangeCommon(dateStr)
}
},
methods: {
handleChange (mom, dateStr) {
this.handleChangeCommon(dateStr)
}
},
// 【组件增强】注释详见:JVxeCellMixins.js
enhanced: {
aopEvents: {
editActived (event) {
dispatchEvent.call(this, event, 'ant-calendar-picker', el => el.children[0].dispatchEvent(event.$event))
}
},
// 【组件增强】注释详见:JVxeCellMixins.js
enhanced: {
aopEvents: {
editActived(event) {
dispatchEvent.call(this, event, 'ant-calendar-picker', el => el.children[0].dispatchEvent(event.$event))
},
},
}
}
}
</script>
<style scoped>
</style>
</style>
@@ -26,113 +26,113 @@
</template>
<script>
import JVxeCellMixins, { dispatchEvent } from '@/components/jero/JVxeTable/mixins/JVxeCellMixins'
import JSelectDepartModal from '@/components/jerobiz/modal/JSelectDepartModal'
import JVxeCellMixins, { dispatchEvent } from '@/components/jero/JVxeTable/mixins/JVxeCellMixins'
import JSelectDepartModal from '@/components/jerobiz/modal/JSelectDepartModal'
export default {
name: 'JVxeDepartSelectCell',
mixins: [JVxeCellMixins],
components:{
JSelectDepartModal
},
data() {
export default {
name: 'JVxeDepartSelectCell',
mixins: [JVxeCellMixins],
components: {
JSelectDepartModal
},
data () {
return {
departNames: '',
departIds: '',
selectedOptions: [],
customReturnField: 'id'
}
},
computed: {
custProps () {
const { departIds, originColumn: col, caseId, cellProps } = this
return {
departNames: '',
departIds: '',
selectedOptions: [],
customReturnField: 'id'
...cellProps,
value: departIds,
field: col.field || col.key,
groupId: caseId,
class: 'jvxe-select'
}
},
computed: {
custProps() {
const {departIds, originColumn: col, caseId, cellProps} = this
return {
...cellProps,
value: departIds,
field: col.field || col.key,
groupId: caseId,
class: 'jvxe-select'
}
},
componentDisabled(){
if(this.cellProps.disabled==true){
return true
}
componentDisabled () {
if (this.cellProps.disabled == true) {
return true
}
return false
},
modalWidth () {
if (this.cellProps.modalWidth) {
return this.cellProps.modalWidth
} else {
return 500
}
},
multi () {
if (this.cellProps.multi == false) {
return false
},
modalWidth(){
if(this.cellProps.modalWidth){
return this.cellProps.modalWidth
}else{
return 500
}
},
multi(){
if(this.cellProps.multi==false){
return false
}else{
return true
}
},
rootOpened(){
if(this.cellProps.open==false){
return false
}else{
return true
}
} else {
return true
}
},
watch: {
innerValue: {
immediate: true,
handler(val) {
if (val == null || val === '') {
this.departIds = ''
} else {
this.departIds = val
}
}
}
},
methods: {
openSelect(){
this.$refs.innerDepartSelectModal.show()
},
handleEmpty(){
this.handleOK('')
},
handleOK(rows, idstr) {
let value = ''
if (!rows && rows.length <= 0) {
this.departNames = ''
this.departIds = ''
} else {
value = rows.map(row => row[this.customReturnField]).join(',')
this.departNames = rows.map(row => row['departName']).join(',')
this.departIds = idstr
}
this.handleChangeCommon(this.departIds)
},
initComp(departNames){
this.departNames = departNames
},
handleChange(value) {
this.handleChangeCommon(value)
}
},
enhanced: {
switches: {
visible: true
},
translate: {
enabled: false
rootOpened () {
if (this.cellProps.open == false) {
return false
} else {
return true
}
}
},
watch: {
innerValue: {
immediate: true,
handler (val) {
if (val == null || val === '') {
this.departIds = ''
} else {
this.departIds = val
}
}
}
},
methods: {
openSelect () {
this.$refs.innerDepartSelectModal.show()
},
handleEmpty () {
this.handleOK('')
},
handleOK (rows, idstr) {
let value = ''
if (!rows && rows.length <= 0) {
this.departNames = ''
this.departIds = ''
} else {
value = rows.map(row => row[this.customReturnField]).join(',')
this.departNames = rows.map(row => row.departName).join(',')
this.departIds = idstr
}
this.handleChangeCommon(this.departIds)
},
initComp (departNames) {
this.departNames = departNames
},
handleChange (value) {
this.handleChangeCommon(value)
}
},
enhanced: {
switches: {
visible: true
},
translate: {
enabled: false
}
}
}
</script>
<style scoped>
/deep/ .jvxe-select-input .ant-input{
border: none !important;
}
</style>
</style>
@@ -20,51 +20,51 @@
</template>
<script>
import JVxeCellMixins from '@/components/jero/JVxeTable/mixins/JVxeCellMixins'
import JVxeCellMixins from '@/components/jero/JVxeTable/mixins/JVxeCellMixins'
export default {
name: 'JVxeDragSortCell',
mixins: [JVxeCellMixins],
computed: {
// 排序结果保存字段
dragSortKey() {
return this.renderOptions.dragSortKey || 'orderNum'
},
disabledMoveUp() {
return this.rowIndex === 0
},
disabledMoveDown() {
return this.rowIndex === (this.fullDataLength - 1)
},
export default {
name: 'JVxeDragSortCell',
mixins: [JVxeCellMixins],
computed: {
// 排序结果保存字段
dragSortKey () {
return this.renderOptions.dragSortKey || 'orderNum'
},
methods: {
/** 向上移 */
handleRowMoveUp(event) {
// event.target.blur()
if (!this.disabledMoveUp) {
this.trigger('rowMoveUp', this.rowIndex)
}
},
/** 向下移 */
handleRowMoveDown(event) {
// event.target.blur()
if (!this.disabledMoveDown) {
this.trigger('rowMoveDown', this.rowIndex)
}
},
/** 插入一行 */
handleRowInsertDown() {
this.trigger('rowInsertDown', this.rowIndex)
},
disabledMoveUp () {
return this.rowIndex === 0
},
// 【组件增强】注释详见:JVxeCellMixins.js
enhanced: {
// 【功能开关】
switches: {
editRender: false
},
disabledMoveDown () {
return this.rowIndex === (this.fullDataLength - 1)
}
},
methods: {
/** 向上移 */
handleRowMoveUp (event) {
// event.target.blur()
if (!this.disabledMoveUp) {
this.trigger('rowMoveUp', this.rowIndex)
}
},
/** 向下移 */
handleRowMoveDown (event) {
// event.target.blur()
if (!this.disabledMoveDown) {
this.trigger('rowMoveDown', this.rowIndex)
}
},
/** 插入一行 */
handleRowInsertDown () {
this.trigger('rowInsertDown', this.rowIndex)
}
},
// 【组件增强】注释详见:JVxeCellMixins.js
enhanced: {
// 【功能开关】
switches: {
editRender: false
}
}
}
</script>
<style lang="less">
@@ -135,4 +135,4 @@
}
}
}
</style>
</style>
@@ -9,79 +9,79 @@
</template>
<script>
import { JVXETypes } from '@/components/jero/JVxeTable'
import JVxeCellMixins from '@/components/jero/JVxeTable/mixins/JVxeCellMixins'
import { JVXETypes } from '@/components/jero/JVxeTable'
import JVxeCellMixins from '@/components/jero/JVxeTable/mixins/JVxeCellMixins'
const NumberRegExp = /^-?\d+\.?\d*$/
export default {
name: 'JVxeInputCell',
mixins: [JVxeCellMixins],
methods: {
const NumberRegExp = /^-?\d+\.?\d*$/
export default {
name: 'JVxeInputCell',
mixins: [JVxeCellMixins],
methods: {
/** 处理change事件 */
handleChange(event) {
let {$type} = this
let {target} = event
let {value, selectionStart} = target
let change = true
if ($type === JVXETypes.inputNumber) {
// 判断输入的值是否匹配数字正则表达式,不匹配就还原
if (!NumberRegExp.test(value) && (value !== '' && value !== '-')) {
change = false
value = this.innerValue
target.value = value || ''
if (typeof selectionStart === 'number') {
target.selectionStart = selectionStart - 1
target.selectionEnd = selectionStart - 1
}
/** 处理change事件 */
handleChange (event) {
const { $type } = this
const { target } = event
let { value, selectionStart } = target
let change = true
if ($type === JVXETypes.inputNumber) {
// 判断输入的值是否匹配数字正则表达式,不匹配就还原
if (!NumberRegExp.test(value) && (value !== '' && value !== '-')) {
change = false
value = this.innerValue
target.value = value || ''
if (typeof selectionStart === 'number') {
target.selectionStart = selectionStart - 1
target.selectionEnd = selectionStart - 1
}
}
// 触发事件,存储输入的值
if (change) {
this.handleChangeCommon(value)
}
if ($type === JVXETypes.inputNumber) {
// this.recalcOneStatisticsColumn(col.key)
}
},
/** 处理blur失去焦点事件 */
handleBlur(event) {
let {$type} = this
let {target} = event
// 判断输入的值是否匹配数字正则表达式,不匹配就置空
if ($type === JVXETypes.inputNumber) {
if (!NumberRegExp.test(target.value)) {
target.value = ''
} else {
target.value = Number.parseFloat(target.value)
}
this.handleChangeCommon(target.value)
}
this.handleBlurCommon(target.value)
},
}
// 触发事件,存储输入的值
if (change) {
this.handleChangeCommon(value)
}
if ($type === JVXETypes.inputNumber) {
// this.recalcOneStatisticsColumn(col.key)
}
},
// 【组件增强】注释详见:JVxeCellMixins.js
enhanced: {
installOptions: {
// 自动聚焦的 class 类名
autofocus: '.ant-input',
},
getValue(value) {
if (this.$type === JVXETypes.inputNumber && typeof value === 'string') {
if (NumberRegExp.test(value)) {
return Number.parseFloat(value)
}
/** 处理blur失去焦点事件 */
handleBlur (event) {
const { $type } = this
const { target } = event
// 判断输入的值是否匹配数字正则表达式,不匹配就置空
if ($type === JVXETypes.inputNumber) {
if (!NumberRegExp.test(target.value)) {
target.value = ''
} else {
target.value = Number.parseFloat(target.value)
}
return value
},
this.handleChangeCommon(target.value)
}
this.handleBlurCommon(target.value)
}
},
// 【组件增强】注释详见:JVxeCellMixins.js
enhanced: {
installOptions: {
// 自动聚焦的 class 类名
autofocus: '.ant-input'
},
getValue (value) {
if (this.$type === JVXETypes.inputNumber && typeof value === 'string') {
if (NumberRegExp.test(value)) {
return Number.parseFloat(value)
}
}
return value
}
}
}
</script>
<style scoped>
</style>
</style>
@@ -7,36 +7,36 @@
</template>
<script>
import ReloadEffect from './ReloadEffect'
import JVxeCellMixins from '@/components/jero/JVxeTable/mixins/JVxeCellMixins'
import ReloadEffect from './ReloadEffect'
import JVxeCellMixins from '@/components/jero/JVxeTable/mixins/JVxeCellMixins'
export default {
name: 'JVxeNormalCell',
mixins: [JVxeCellMixins],
components: {ReloadEffect},
computed: {
reloadEffectRowKeysMap() {
return this.renderOptions.reloadEffectRowKeysMap
},
reloadEffect() {
return (this.renderOptions.reloadEffect && this.reloadEffectRowKeysMap[this.row.id]) === true
},
export default {
name: 'JVxeNormalCell',
mixins: [JVxeCellMixins],
components: { ReloadEffect },
computed: {
reloadEffectRowKeysMap () {
return this.renderOptions.reloadEffectRowKeysMap
},
methods: {
// 特效结束
handleEffectEnd() {
this.$delete(this.reloadEffectRowKeysMap, this.row.id)
},
},
// 【组件增强】注释详见:JVxeCellMixins.js
enhanced: {
switches: {
editRender: false,
},
reloadEffect () {
return (this.renderOptions.reloadEffect && this.reloadEffectRowKeysMap[this.row.id]) === true
}
},
methods: {
// 特效结束
handleEffectEnd () {
this.$delete(this.reloadEffectRowKeysMap, this.row.id)
}
},
// 【组件增强】注释详见:JVxeCellMixins.js
enhanced: {
switches: {
editRender: false
}
}
}
</script>
<style scoped>
</style>
</style>
@@ -8,45 +8,45 @@
</template>
<script>
import JVxeCellMixins from '@/components/jero/JVxeTable/mixins/JVxeCellMixins'
import JVxeCellMixins from '@/components/jero/JVxeTable/mixins/JVxeCellMixins'
// JVxe 进度条组件
export default {
name: 'JVxeProgressCell',
mixins: [JVxeCellMixins],
data() {
return {}
// JVxe 进度条组件
export default {
name: 'JVxeProgressCell',
mixins: [JVxeCellMixins],
data () {
return {}
},
computed: {
clazz () {
return {
'j-vxe-progress': true,
'no-animation': this.scrolling
}
},
computed: {
clazz() {
return {
'j-vxe-progress': true,
'no-animation': this.scrolling
}
},
scrolling() {
return !!this.renderOptions.scrolling
},
scrolling () {
return !!this.renderOptions.scrolling
}
},
methods: {},
// 【组件增强】注释详见:JVxeCellMixins.js
enhanced: {
switches: {
editRender: false
},
methods: {},
// 【组件增强】注释详见:JVxeCellMixins.js
enhanced: {
switches: {
editRender: false,
},
setValue(value) {
try {
if (typeof value !== 'number') {
return Number.parseFloat(value)
} else {
return value
}
} catch {
return 0
setValue (value) {
try {
if (typeof value !== 'number') {
return Number.parseFloat(value)
} else {
return value
}
},
} catch {
return 0
}
}
}
}
</script>
<style scoped lang="less">
@@ -57,4 +57,4 @@
transition: none !important;
}
}
</style>
</style>
@@ -26,194 +26,193 @@
</template>
<script>
import JVxeCellMixins, { dispatchEvent } from '@/components/jero/JVxeTable/mixins/JVxeCellMixins'
import { JVXETypes } from '@comp/jero/JVxeTable/index'
import { filterDictText } from '@comp/dict/JDictSelectUtil'
import JVxeCellMixins, { dispatchEvent } from '@/components/jero/JVxeTable/mixins/JVxeCellMixins'
import { JVXETypes } from '@comp/jero/JVxeTable/index'
import { filterDictText } from '@comp/dict/JDictSelectUtil'
export default {
name: 'JVxeSelectCell',
mixins: [JVxeCellMixins],
data(){
return {
loading: false,
// 异步加载的options(用于多级联动)
asyncOptions: null,
export default {
name: 'JVxeSelectCell',
mixins: [JVxeCellMixins],
data () {
return {
loading: false,
// 异步加载的options(用于多级联动)
asyncOptions: null
}
},
computed: {
selectProps () {
const props = { ...this.cellProps }
// 判断select是否允许输入
const { allowSearch, allowInput } = this.originColumn
if (allowInput === true || allowSearch === true) {
props.showSearch = true
}
return props
},
computed: {
selectProps() {
let props = {...this.cellProps}
// 判断select是否允许输入
let {allowSearch, allowInput} = this.originColumn
if (allowInput === true || allowSearch === true) {
props['showSearch'] = true
}
return props
},
// 下拉选项
selectOptions() {
if (this.asyncOptions) {
return this.asyncOptions
}
let {linkage} = this.renderOptions
if (linkage) {
let {getLinkageOptionsSibling, config} = linkage
let res = getLinkageOptionsSibling(this.row, this.originColumn, config, true)
// 当返回Promise时,说明是多级联动
if (res instanceof Promise) {
this.loading = true
res.then(opt => {
this.asyncOptions = opt
this.loading = false
}).catch(e => {
console.error(e)
this.loading = false
})
} else {
this.asyncOptions = null
return res
}
}
return this.originColumn.options
},
},
created() {
let multiple = [JVXETypes.selectMultiple, JVXETypes.list_multi]
let search = [JVXETypes.selectSearch, JVXETypes.sel_search]
if (multiple.includes(this.$type)) {
// 处理多选
let props = this.originColumn.props || {}
props['mode'] = 'multiple'
props['maxTagCount'] = 1
this.$set(this.originColumn, 'props', props)
} else if (search.includes(this.$type)) {
// 处理搜索
this.$set(this.originColumn, 'allowSearch', true)
// 下拉选项
selectOptions () {
if (this.asyncOptions) {
return this.asyncOptions
}
const { linkage } = this.renderOptions
if (linkage) {
const { getLinkageOptionsSibling, config } = linkage
const res = getLinkageOptionsSibling(this.row, this.originColumn, config, true)
// 当返回Promise时,说明是多级联动
if (res instanceof Promise) {
this.loading = true
res.then(opt => {
this.asyncOptions = opt
this.loading = false
}).catch(e => {
console.error(e)
this.loading = false
})
} else {
this.asyncOptions = null
return res
}
}
return this.originColumn.options
}
},
created () {
const multiple = [JVXETypes.selectMultiple, JVXETypes.list_multi]
const search = [JVXETypes.selectSearch, JVXETypes.sel_search]
if (multiple.includes(this.$type)) {
// 处理多选
const props = this.originColumn.props || {}
props.mode = 'multiple'
props.maxTagCount = 1
this.$set(this.originColumn, 'props', props)
} else if (search.includes(this.$type)) {
// 处理搜索
this.$set(this.originColumn, 'allowSearch', true)
}
},
methods: {
handleChange (value) {
// 处理下级联动
const linkage = this.renderOptions.linkage
if (linkage) {
linkage.linkageSelectChange(this.row, this.originColumn, linkage.config, value)
}
this.handleChangeCommon(value)
},
methods: {
handleChange(value) {
// 处理下级联动
let linkage = this.renderOptions.linkage
if (linkage) {
linkage.linkageSelectChange(this.row, this.originColumn, linkage.config, value)
}
this.handleChangeCommon(value)
},
/** 处理blur失去焦点事件 */
handleBlur(value) {
let {allowInput, options} = this.originColumn
/** 处理blur失去焦点事件 */
handleBlur (value) {
const { allowInput, options } = this.originColumn
if (allowInput === true) {
// 删除无用的因搜索(用户输入)而创建的项
if (typeof value === 'string') {
let indexes = []
options.forEach((option, index) => {
if (option.value.toLocaleString() === value.toLocaleString()) {
delete option.searchAdd
} else if (option.searchAdd === true) {
indexes.push(index)
}
})
// 翻转删除数组中的项
for (let index of indexes.reverse()) {
options.splice(index, 1)
}
}
}
this.handleBlurCommon(value)
},
/** 用于搜索下拉框中的内容 */
handleSelectFilterOption(input, option) {
let {allowSearch, allowInput} = this.originColumn
if (allowSearch === true || allowInput === true) {
//update-begin-author:taoyan date:20200820 for:【专项任务】大连项目反馈行编辑问题处理 下拉框搜索
return option.componentOptions.children[0].children[0].text.toLowerCase().indexOf(input.toLowerCase()) >= 0
//update-end-author:taoyan date:20200820 for:【专项任务】大连项目反馈行编辑问题处理 下拉框搜索
}
return true
},
/** select 搜索时的事件,用于动态添加options */
handleSearchSelect(value) {
let {allowSearch, allowInput, options} = this.originColumn
if (allowSearch !== true && allowInput === true) {
// 是否找到了对应的项,找不到则添加这一项
let flag = false
for (let option of options) {
if (allowInput === true) {
// 删除无用的因搜索(用户输入)而创建的项
if (typeof value === 'string') {
const indexes = []
options.forEach((option, index) => {
if (option.value.toLocaleString() === value.toLocaleString()) {
flag = true
break
delete option.searchAdd
} else if (option.searchAdd === true) {
indexes.push(index)
}
})
// 翻转删除数组中的项
for (const index of indexes.reverse()) {
options.splice(index, 1)
}
// !!value :不添加空值
if (!flag && !!value) {
// searchAdd 是否是通过搜索添加的
options.push({title: value, value: value, searchAdd: true})
}
}
},
}
this.handleBlurCommon(value)
},
// 【组件增强】注释详见:JVxeCellMixins.js
enhanced: {
aopEvents: {
editActived(event) {
dispatchEvent.call(this, event, 'ant-select')
},
},
translate: {
enabled: true,
async handler(value,) {
let options
let {linkage} = this.renderOptions
// 判断是否是多级联动,如果是就通过接口异步翻译
if (linkage) {
let {getLinkageOptionsSibling, config} = linkage
options = getLinkageOptionsSibling(this.row, this.originColumn, config, true)
if (options instanceof Promise) {
return new Promise(resolve => {
options.then(opt => {
resolve(filterDictText(opt, value))
})
})
}
} else {
options = this.column.own.options
/** 用于搜索下拉框中的内容 */
handleSelectFilterOption (input, option) {
const { allowSearch, allowInput } = this.originColumn
if (allowSearch === true || allowInput === true) {
// update-begin-author:taoyan date:20200820 for:【专项任务】大连项目反馈行编辑问题处理 下拉框搜索
return option.componentOptions.children[0].children[0].text.toLowerCase().indexOf(input.toLowerCase()) >= 0
// update-end-author:taoyan date:20200820 for:【专项任务】大连项目反馈行编辑问题处理 下拉框搜索
}
return true
},
/** select 搜索时的事件,用于动态添加options */
handleSearchSelect (value) {
const { allowSearch, allowInput, options } = this.originColumn
if (allowSearch !== true && allowInput === true) {
// 是否找到了对应的项,找不到则添加这一项
let flag = false
for (const option of options) {
if (option.value.toLocaleString() === value.toLocaleString()) {
flag = true
break
}
return filterDictText(options, value)
},
},
getValue(value) {
if (Array.isArray(value)) {
return value.join(',')
} else {
return value
}
},
setValue(value) {
let {column: {own: col}, params: {$table}} = this
// 判断是否是多选
if ((col.props || {})['mode'] === 'multiple') {
$table.$set(col.props, 'maxTagCount', 1)
}
if (value != null && value !== '') {
if (typeof value === 'string') {
return value === '' ? [] : value.split(',')
}
return value
} else {
return undefined
// !!value :不添加空值
if (!flag && !!value) {
// searchAdd 是否是通过搜索添加的
options.push({ title: value, value: value, searchAdd: true })
}
}
}
},
// 【组件增强】注释详见:JVxeCellMixins.js
enhanced: {
aopEvents: {
editActived (event) {
dispatchEvent.call(this, event, 'ant-select')
}
},
translate: {
enabled: true,
async handler (value) {
let options
const { linkage } = this.renderOptions
// 判断是否是多级联动,如果是就通过接口异步翻译
if (linkage) {
const { getLinkageOptionsSibling, config } = linkage
options = getLinkageOptionsSibling(this.row, this.originColumn, config, true)
if (options instanceof Promise) {
return new Promise(resolve => {
options.then(opt => {
resolve(filterDictText(opt, value))
})
})
}
} else {
options = this.column.own.options
}
return filterDictText(options, value)
}
},
getValue (value) {
if (Array.isArray(value)) {
return value.join(',')
} else {
return value
}
},
setValue (value) {
const { column: { own: col }, params: { $table } } = this
// 判断是否是多选
if ((col.props || {}).mode === 'multiple') {
$table.$set(col.props, 'maxTagCount', 1)
}
if (value != null && value !== '') {
if (typeof value === 'string') {
return value === '' ? [] : value.split(',')
}
return value
} else {
return undefined
}
}
}
}
</script>
<style scoped>
</style>
</style>
@@ -5,7 +5,7 @@ export default {
name: 'JVxeSlotCell',
mixins: [JVxeCellMixins],
computed: {
slotProps() {
slotProps () {
return {
value: this.innerValue,
row: this.row,
@@ -23,12 +23,12 @@ export default {
scrolling: this.renderOptions.scrolling,
reloadEffect: this.renderOptions.reloadEffect,
triggerChange: (v) => this.handleChangeCommon(v),
triggerChange: (v) => this.handleChangeCommon(v)
}
},
}
},
render(h) {
let {slot} = this.renderOptions
render (h) {
const { slot } = this.renderOptions
if (slot) {
return h('div', {}, slot(this.slotProps))
} else {
@@ -39,7 +39,7 @@ export default {
enhanced: {
switches: {
editRender: false
},
}
}
}
@@ -4,31 +4,31 @@ import JVxeCellMixins from '@/components/jero/JVxeTable/mixins/JVxeCellMixins'
export const TagsSpanCell = {
name: 'JVxeTagsCell',
mixins: [JVxeCellMixins],
data() {
data () {
return {
innerTags: [],
innerTags: []
}
},
watch: {
innerValue: {
immediate: true,
handler(value) {
handler (value) {
if (value !== this.innerTags.join(';')) {
let rv = replaceValue(value)
const rv = replaceValue(value)
this.innerTags = rv.split(';')
this.handleChangeCommon(rv)
}
},
},
}
}
},
methods: {
renderTags(h) {
let tags = []
for (let tag of this.innerTags) {
renderTags (h) {
const tags = []
for (const tag of this.innerTags) {
if (tag) {
let tagProps = {}
let tagStyle = {}
let setTagColor = this.originColumn.setTagColor
const tagProps = {}
const tagStyle = {}
const setTagColor = this.originColumn.setTagColor
if (typeof setTagColor === 'function') {
/**
* 设置 tag 颜色
@@ -41,11 +41,11 @@ export const TagsSpanCell = {
* event.column.own 当前列的原始配置
* @return Array | String 可以返回一个数组,数据第一项是tag背景颜色,第二项是字体颜色。也可以返回一个字符串,即tag背景颜色
*/
let color = setTagColor({
const color = setTagColor({
tagValue: tag,
value: this.innerValue,
row: this.row,
column: this.column,
column: this.column
})
if (Array.isArray(color)) {
tagProps.color = color[0]
@@ -56,49 +56,49 @@ export const TagsSpanCell = {
}
tags.push(h('a-tag', {
props: tagProps,
style: tagStyle,
style: tagStyle
}, [tag]))
}
}
return tags
},
}
},
render(h) {
render (h) {
return h('div', {}, [
this.renderTags(h)
])
},
}
}
// tags 组件的输入框
export const TagsInputCell = {
name: 'JVxeTagsInputCell',
mixins: [JVxeCellMixins],
data() {
data () {
return {
innerTagValue: '',
innerTagValue: ''
}
},
watch: {
innerValue: {
immediate: true,
handler(value) {
handler (value) {
if (value !== this.innerTagValue) {
this.handleInputChange(value)
}
},
},
}
}
},
methods: {
handleInputChange(value, event) {
handleInputChange (value, event) {
this.innerTagValue = replaceValue(value, event)
this.handleChangeCommon(this.innerTagValue)
return this.innerTagValue
},
}
},
render(h) {
render (h) {
return h('a-input', {
props: {
value: this.innerValue,
@@ -106,36 +106,36 @@ export const TagsInputCell = {
},
on: {
change: (event) => {
let {target, target: {value}} = event
let newValue = this.handleInputChange(value, event)
const { target, target: { value } } = event
const newValue = this.handleInputChange(value, event)
if (newValue !== value) {
target.value = newValue
}
}
},
}
})
},
}
}
// 将值每隔两位加上一个分号
function replaceValue(value, event) {
function replaceValue (value, event) {
if (value) {
// 首先去掉现有的分号
value = value.replace(/;/g, '')
// 然后再遍历添加分号
let rv = ''
let splitArr = value.split('')
const splitArr = value.split('')
let count = 0
splitArr.forEach((val, index) => {
rv += val
let position = index + 1
const position = index + 1
if (position % 2 === 0 && position < splitArr.length) {
count++
rv += ';'
}
})
if (event && count > 0) {
let {target, target: {selectionStart}} = event
const { target, target: { selectionStart } } = event
target.selectionStart = selectionStart + count
target.selectionEnd = selectionStart + count
}
@@ -10,27 +10,27 @@
</template>
<script>
import JInputPop from '@/components/jero/minipop/JInputPop'
import JVxeCellMixins, { dispatchEvent } from '@/components/jero/JVxeTable/mixins/JVxeCellMixins'
import JInputPop from '@/components/jero/minipop/JInputPop'
import JVxeCellMixins, { dispatchEvent } from '@/components/jero/JVxeTable/mixins/JVxeCellMixins'
export default {
name: 'JVxeTextareaCell',
mixins: [JVxeCellMixins],
components: {JInputPop},
// 【组件增强】注释详见:JVxeCellMixins.js
enhanced: {
installOptions: {
autofocus: '.ant-input',
},
aopEvents: {
editActived(event) {
dispatchEvent.call(this, event, 'anticon-fullscreen')
},
},
export default {
name: 'JVxeTextareaCell',
mixins: [JVxeCellMixins],
components: { JInputPop },
// 【组件增强】注释详见:JVxeCellMixins.js
enhanced: {
installOptions: {
autofocus: '.ant-input'
},
aopEvents: {
editActived (event) {
dispatchEvent.call(this, event, 'anticon-fullscreen')
}
}
}
}
</script>
<style scoped>
</style>
</style>
@@ -61,127 +61,127 @@
</template>
<script>
import JVxeCellMixins from '@/components/jero/JVxeTable/mixins/JVxeCellMixins'
import { ACCESS_TOKEN } from '@/store/mutation-types'
import { getFileAccessHttpUrl } from '@api/manage'
import JVxeCellMixins from '@/components/jero/JVxeTable/mixins/JVxeCellMixins'
import { ACCESS_TOKEN } from '@/store/mutation-types'
import { getFileAccessHttpUrl } from '@api/manage'
export default {
name: 'JVxeUploadCell',
mixins: [JVxeCellMixins],
props: {},
data() {
return {
innerFile: null,
export default {
name: 'JVxeUploadCell',
mixins: [JVxeCellMixins],
props: {},
data () {
return {
innerFile: null
}
},
computed: {
/** upload headers */
uploadHeaders () {
const { originColumn: col } = this
const headers = {}
if (col.token === true) {
headers['X-Access-Token'] = this.$ls.get(ACCESS_TOKEN)
}
return headers
},
computed: {
/** upload headers */
uploadHeaders() {
let {originColumn: col} = this
let headers = {}
if (col.token === true) {
headers['X-Access-Token'] = this.$ls.get(ACCESS_TOKEN)
}
return headers
},
hasFile() {
return this.innerFile != null
},
},
watch: {
innerValue: {
immediate: true,
handler() {
if (this.innerValue) {
this.innerFile = this.innerValue
} else {
this.innerFile = null
}
},
},
},
methods: {
handleChangeUpload(info) {
let {row, originColumn: col} = this
let {file} = info
let value = {
name: file.name,
type: file.type,
size: file.size,
status: file.status,
percent: file.percent
}
if (col.responseName && file.response) {
value['responseName'] = file.response[col.responseName]
}
if (file.status === 'done') {
if (typeof file.response.success === 'boolean') {
if (file.response.success) {
value['path'] = file.response[col.responseName]
} else {
value['status'] = 'error'
value['message'] = file.response.message || '未知错误'
}
} else {
// 考虑到如果设置action上传路径为非jeecg-boot后台,可能不会返回 success 属性的情况,就默认为成功
value['path'] = file.response[col.responseName]
}
} else if (file.status === 'error') {
value['message'] = file.response.message || '未知错误'
}
this.innerFile = value
},
// handleClickPreviewFile(id) {
// this.$message.info('尚未实现')
// },
handleClickDownloadFile(id) {
let {path} = this.value || {}
if (path) {
let url = getFileAccessHttpUrl(path)
window.open(url)
}
},
handleClickDeleteFile() {
this.handleChangeCommon(null)
},
},
// 【组件增强】注释详见:JVxeCellMixins.js
enhanced: {
switches: {visible: true},
getValue: value => fileGetValue(value),
setValue: value => fileSetValue(value),
hasFile () {
return this.innerFile != null
}
}
function fileGetValue(value) {
if (value && value.path) {
return value.path
}
return value
}
function fileSetValue(value) {
if (value) {
let first = value.split(',')[0]
let name = first.substring(first.lastIndexOf('/') + 1)
return {
name: name,
path: value,
status: 'done',
},
watch: {
innerValue: {
immediate: true,
handler () {
if (this.innerValue) {
this.innerFile = this.innerValue
} else {
this.innerFile = null
}
}
}
return value
},
methods: {
handleChangeUpload (info) {
const { row, originColumn: col } = this
const { file } = info
const value = {
name: file.name,
type: file.type,
size: file.size,
status: file.status,
percent: file.percent
}
if (col.responseName && file.response) {
value.responseName = file.response[col.responseName]
}
if (file.status === 'done') {
if (typeof file.response.success === 'boolean') {
if (file.response.success) {
value.path = file.response[col.responseName]
} else {
value.status = 'error'
value.message = file.response.message || '未知错误'
}
} else {
// 考虑到如果设置action上传路径为非jeecg-boot后台,可能不会返回 success 属性的情况,就默认为成功
value.path = file.response[col.responseName]
}
} else if (file.status === 'error') {
value.message = file.response.message || '未知错误'
}
this.innerFile = value
},
// handleClickPreviewFile(id) {
// this.$message.info('尚未实现')
// },
handleClickDownloadFile (id) {
const { path } = this.value || {}
if (path) {
const url = getFileAccessHttpUrl(path)
window.open(url)
}
},
handleClickDeleteFile () {
this.handleChangeCommon(null)
}
},
// 【组件增强】注释详见:JVxeCellMixins.js
enhanced: {
switches: { visible: true },
getValue: value => fileGetValue(value),
setValue: value => fileSetValue(value)
}
}
function fileGetValue (value) {
if (value && value.path) {
return value.path
}
return value
}
function fileSetValue (value) {
if (value) {
const first = value.split(',')[0]
const name = first.substring(first.lastIndexOf('/') + 1)
return {
name: name,
path: value,
status: 'done'
}
}
return value
}
</script>
<style scoped>
</style>
</style>
@@ -31,106 +31,106 @@
</template>
<script>
import JVxeCellMixins, { dispatchEvent } from '@/components/jero/JVxeTable/mixins/JVxeCellMixins'
import JSelectUserByDepModal from '@/components/jerobiz/modal/JSelectUserByDepModal'
import JVxeCellMixins, { dispatchEvent } from '@/components/jero/JVxeTable/mixins/JVxeCellMixins'
import JSelectUserByDepModal from '@/components/jerobiz/modal/JSelectUserByDepModal'
export default {
name: 'JVxeUserSelectCell',
mixins: [JVxeCellMixins],
components: { JSelectUserByDepModal },
data() {
export default {
name: 'JVxeUserSelectCell',
mixins: [JVxeCellMixins],
components: { JSelectUserByDepModal },
data () {
return {
userIds: '',
userNames: '',
innerUserValue: '',
selectedOptions: []
}
},
computed: {
custProps () {
const { userIds, originColumn: col, caseId, cellProps } = this
return {
userIds:'',
userNames:'',
innerUserValue: '',
selectedOptions: []
...cellProps,
value: userIds,
field: col.field || col.key,
groupId: caseId,
class: 'jvxe-select'
}
},
computed: {
custProps() {
const {userIds, originColumn: col, caseId, cellProps} = this
return {
...cellProps,
value: userIds,
field: col.field || col.key,
groupId: caseId,
class: 'jvxe-select'
}
},
componentDisabled(){
console.log('333',this.cellProps)
if(this.cellProps.disabled==true){
return true
}
componentDisabled () {
console.log('333', this.cellProps)
if (this.cellProps.disabled == true) {
return true
}
return false
},
modalWidth () {
if (this.cellProps.modalWidth) {
return this.cellProps.modalWidth
} else {
return 1250
}
},
multi () {
if (this.cellProps.multi == false) {
return false
},
modalWidth(){
if(this.cellProps.modalWidth){
return this.cellProps.modalWidth
}else{
return 1250
}
},
multi(){
if(this.cellProps.multi==false){
return false
}else{
return true
}
}
},
watch: {
innerValue: {
immediate: true,
handler(val) {
if (val == null || val === '') {
this.userIds = ''
} else {
this.userIds = val
}
}
}
},
methods: {
openSelect() {
this.$refs.selectModal.showModal()
},
selectOK(rows, idstr) {
console.log("当前选中用户", rows)
console.log("当前选中用户ID", idstr)
if (!rows) {
this.userNames = ''
this.userIds = ''
} else {
let temp = ''
for (let item of rows) {
temp += ',' + item.realname
}
this.userNames = temp.substring(1)
this.userIds = idstr
}
this.handleChangeCommon(this.userIds)
},
handleEmpty(){
this.selectOK('')
},
initComp(userNames) {
this.userNames = userNames
},
},
enhanced: {
switches: {
visible: true
},
translate: {
enabled: false
} else {
return true
}
}
},
watch: {
innerValue: {
immediate: true,
handler (val) {
if (val == null || val === '') {
this.userIds = ''
} else {
this.userIds = val
}
}
}
},
methods: {
openSelect () {
this.$refs.selectModal.showModal()
},
selectOK (rows, idstr) {
console.log('当前选中用户', rows)
console.log('当前选中用户ID', idstr)
if (!rows) {
this.userNames = ''
this.userIds = ''
} else {
let temp = ''
for (const item of rows) {
temp += ',' + item.realname
}
this.userNames = temp.substring(1)
this.userIds = idstr
}
this.handleChangeCommon(this.userIds)
},
handleEmpty () {
this.selectOK('')
},
initComp (userNames) {
this.userNames = userNames
}
},
enhanced: {
switches: {
visible: true
},
translate: {
enabled: false
}
}
}
</script>
<style scoped>
/deep/ .jvxe-select-input .ant-input {
border: none !important;
}
</style>
</style>
@@ -6,44 +6,44 @@ export default {
props: {
vNode: null,
// 是否启用特效
effect: Boolean,
effect: Boolean
},
data() {
data () {
return {
// vNode: null,
innerEffect: false,
// 应付同时多个特效
effectIdx: 0,
effectList: [],
effectList: []
}
},
watch: {
vNode: {
deep: true,
immediate: true,
handler(vNode, old) {
handler (vNode, old) {
this.innerEffect = this.effect
if (this.innerEffect && old != null) {
let topLayer = this.renderSpan(old, 'top')
const topLayer = this.renderSpan(old, 'top')
this.effectList.push(topLayer)
}
},
},
}
}
},
methods: {
// 条件渲染内容 span
renderVNode() {
renderVNode () {
if (this.vNode == null) {
return null
}
let bottom = this.renderSpan(this.vNode, 'bottom')
const bottom = this.renderSpan(this.vNode, 'bottom')
// 启用了特效,并且有旧数据,就渲染特效顶层
if (this.innerEffect && this.effectList.length > 0) {
this.$emit('effect-begin')
// 1.4s 以后关闭特效
window.setTimeout(() => {
let item = this.effectList[this.effectIdx]
const item = this.effectList[this.effectIdx]
if (item && item.elm) {
// 特效结束后,展示先把 display 设为 none,而不是直接删掉该元素,
// 目的是为了防止页面重新渲染,导致动画重置
@@ -63,22 +63,22 @@ export default {
}
},
// 渲染内容 span
renderSpan(vNode, layer) {
let options = {
renderSpan (vNode, layer) {
const options = {
key: layer + this.effectIdx + randomString(6),
class: ['j-vxe-reload-effect-span', `layer-${layer}`],
style: {},
style: {}
}
if (layer === 'top') {
// 最新渲染的在下面
options.style['z-index'] = (9999 - this.effectIdx)
}
return this.$createElement('span', options, [vNode])
},
}
},
render(h) {
render (h) {
return h('div', {
class: ['j-vxe-reload-effect-box'],
class: ['j-vxe-reload-effect-box']
}, [this.renderVNode()])
},
}
}
}
@@ -16,10 +16,10 @@ import JVxeDragSortCell from './components/cells/JVxeDragSortCell'
import JVxeDepartSelectCell from './components/cells/JVxeDepartSelectCell'
import JVxeUserSelectCell from './components/cells/JVxeUserSelectCell'
//update--begin--autor:lvdandan-----date:20201216------forJVxeTable--JVXETypes 【online】代码结构调整,便于online打包
// update--begin--autor:lvdandan-----date:20201216------forJVxeTable--JVXETypes 【online】代码结构调整,便于online打包
// 组件类型
export const JVXETypes = jvxeTypes.JVXETypes
//update--end--autor:lvdandan-----date:20201216------forJVxeTable--JVXETypes 【online】代码结构调整,便于online打包
// update--end--autor:lvdandan-----date:20201216------forJVxeTable--JVXETypes 【online】代码结构调整,便于online打包
// 注册自定义组件
export const AllCells = {
@@ -28,8 +28,8 @@ export const AllCells = {
...mapCell(JVXETypes.inputNumber, JVxeInputCell),
...mapCell(JVXETypes.checkbox, JVxeCheckboxCell),
...mapCell(JVXETypes.select, JVxeSelectCell),
...mapCell(JVXETypes.selectSearch, JVxeSelectCell), // 下拉搜索
...mapCell(JVXETypes.selectMultiple, JVxeSelectCell), // 下拉多选
...mapCell(JVXETypes.selectSearch, JVxeSelectCell), // 下拉搜索
...mapCell(JVXETypes.selectMultiple, JVxeSelectCell), // 下拉多选
...mapCell(JVXETypes.date, JVxeDateCell),
...mapCell(JVXETypes.datetime, JVxeDateCell),
...mapCell(JVXETypes.upload, JVxeUploadCell),
@@ -48,4 +48,4 @@ export const AllCells = {
export { installCell, mapCell }
export default JVxeTable
export default JVxeTable

Some files were not shown because too many files have changed in this diff Show More