| | |
| | | { |
| | | "appId": "201912101635586033882D350DED94BC08AB8", |
| | | "appkey": "2019120316231227060CDBAFCB3BF4582BBF8", |
| | | "appId": "202011020835217933120E25C41C54A8988AA", |
| | | "appkey": "20201102081641237BDDE0D5F2E98420BA7EC", |
| | | "mainSystemApi": "https://cloud.positecgroup.com/webapi/dostars", |
| | | "systemType": "", |
| | | "externalDatabase": "", |
| | |
| | | "transfer": true, |
| | | "keepPassword": "true", |
| | | "platforms": ["H5", "wechat", "android", "ios", "wxMiniProgram"], |
| | | "host": "https://css-test.positecgroup.com", |
| | | "service": "" |
| | | "host": "http://oms-test.positecgroup.com", |
| | | "service": "oms_new/" |
| | | } |
| | |
| | | import React, { useState } from 'react' |
| | | import { useDrop } from 'react-dnd' |
| | | import { is, fromJS } from 'immutable' |
| | | import { message } from 'antd' |
| | | import update from 'immutability-helper' |
| | | |
| | | import Card from './card' |
| | |
| | | } |
| | | |
| | | copycard.uuid = Utils.getuuid() |
| | | copycard.originCard = card |
| | | |
| | | try { |
| | | delete _val.$srcId |
| | |
| | | oInput.select() |
| | | document.execCommand('Copy') |
| | | document.body.removeChild(oInput) |
| | | |
| | | message.success('复制成功。') |
| | | } else { |
| | | message.warning('复制失败。') |
| | | } |
| | | |
| | | if (card.eleType !== 'button') { |
| | | _cards.push(copycard) |
| | | |
| | | handleList(_cards) |
| | | handleMenu(copycard) |
| | | } |
| | | } |
| | | |
| | | const changeStyle = id => { |
| | |
| | | |
| | | if (newcard.OpenType === 'excelIn') { |
| | | newcard.label = item.text |
| | | newcard.class = 'dgreen' |
| | | newcard.class = 'border-dgreen' |
| | | newcard.Ot = 'notRequired' |
| | | } else if (item.subType === 'excelOut') { |
| | | newcard.label = item.text |
| | |
| | | |
| | | const cardTypeOptions = { |
| | | sequence: ['eleType', 'width'], |
| | | text: ['eleType', 'datatype', 'format', 'width', 'height', 'prefix', 'postfix', 'link', 'anchors', 'noValue', 'bgImage', 'fixStyle', 'copyable'], |
| | | number: ['eleType', 'datatype', 'width', 'height', 'prefix', 'postfix', 'noValue', 'fixStyle'], |
| | | text: ['eleType', 'datatype', 'format', 'width', 'height', 'prefix', 'postfix', 'link', 'anchors', 'noValue', 'bgImage', 'fixStyle', 'copyable', 'alignItems'], |
| | | number: ['eleType', 'datatype', 'width', 'height', 'prefix', 'postfix', 'noValue', 'fixStyle', 'alignItems'], |
| | | picture: ['eleType', 'datatype', 'width', 'lenWidRadio', 'maxWidth', 'link', 'noValue'], |
| | | video: ['eleType', 'datatype', 'width', 'aspectRatio', 'autoPlay', 'loop', 'startTime', 'noValue', 'posterType'], |
| | | icon: ['eleType', 'datatype', 'width', 'tooltip'], |
| | |
| | | barcode: ['eleType', 'datatype', 'width', 'barHeight', 'displayValue', 'interval', 'noValue'], |
| | | qrcode: ['eleType', 'datatype', 'width', 'qrWidth', 'color', 'url', 'noValue'], |
| | | currentDate: ['eleType', 'width', 'dateFormat', 'prefix', 'postfix', 'fixStyle'], |
| | | formula: ['eleType', 'width', 'height', 'prefix', 'postfix', 'eval', 'formula', 'noValue', 'fixStyle'], |
| | | formula: ['eleType', 'width', 'height', 'prefix', 'postfix', 'eval', 'formula', 'noValue', 'fixStyle', 'alignItems'], |
| | | color: ['eleType', 'datatype', 'width', 'lenWidRadio', 'noValue', 'copyable'], |
| | | } |
| | | |
| | |
| | | tooltip = '在扩展卡片中,动态数据显示值为获取到的第一行数据。' |
| | | } |
| | | |
| | | let width = card.width || 12 |
| | | if (/x/.test(card.width)) { |
| | | width = +width.replace(/x/, '.5') |
| | | } |
| | | |
| | | let forms = [ |
| | | { |
| | | type: 'select', |
| | |
| | | min: 0, |
| | | label: '内容', |
| | | initVal: card.value || '', |
| | | tooltip: '文本类型,会替换内容中的@username@、@fullName@、@mk_city@、@appname@、@bid@。', |
| | | tooltip: '文本类型,会替换内容中的@username@、@fullName@、@mk_city@、@appname@、@bid@、@month@、@week@、@day@', |
| | | required: true |
| | | }, |
| | | { |
| | |
| | | { |
| | | type: 'number', |
| | | key: 'width', |
| | | min: 1, |
| | | min: 0.5, |
| | | max: 24, |
| | | precision: 0, |
| | | precision: 1, |
| | | label: '元素宽度', |
| | | initVal: card.width || 12, |
| | | tooltip: '栅格布局,每行等分为24列。', |
| | | initVal: width, |
| | | tooltip: '栅格布局,每行等分为24列,可设置半列即.5。', |
| | | required: true |
| | | }, |
| | | { |
| | |
| | | type: 'radio', |
| | | key: 'eval', |
| | | label: '解析', |
| | | initVal: card.eval || 'true', |
| | | initVal: card.eval || 'false', |
| | | tooltip: '当公式内容涉及计算时请选择“是”,当公式内容为字段拼接时请选择“否”。', |
| | | required: false, |
| | | options: [{ |
| | |
| | | }, |
| | | { |
| | | type: 'radio', |
| | | key: 'alignItems', |
| | | label: '垂直对齐', |
| | | initVal: card.alignItems || '', |
| | | tooltip: '垂直方向的对齐方式。', |
| | | required: false, |
| | | options: [ |
| | | { value: '', text: '居上' }, |
| | | { value: 'center', text: '居中' }, |
| | | { value: 'end', text: '居下' } |
| | | ] |
| | | }, |
| | | { |
| | | type: 'radio', |
| | | key: 'fixStyle', |
| | | label: '前后缀', |
| | | initVal: card.fixStyle || '', |
| | |
| | | const { elements } = this.state |
| | | |
| | | this.elementFormRef.handleConfirm().then(res => { |
| | | if (res.width % 0.5) { |
| | | res.width = parseInt(res.width / 0.5) * 0.5 |
| | | } |
| | | if (res.width % 1) { |
| | | res.width = (res.width + '').replace(/.5/, 'x') |
| | | } |
| | | |
| | | let _elements = elements.map(cell => { |
| | | if (cell.uuid === res.uuid) { |
| | | res.style = cell.style || {} |
| | |
| | | if (res.show === 'link' || res.show === 'icon') { |
| | | style.color = color[cl] |
| | | style.backgroundColor = 'transparent' |
| | | } else if (res.class === 'default') { |
| | | style.color = 'rgba(0, 0, 0, 0.65)' |
| | | style.backgroundColor = '#fff' |
| | | style.borderColor = '#d9d9d9' |
| | | } else if (res.class.indexOf('border') > -1) { |
| | | style.color = color[cl] |
| | | style.backgroundColor = '#fff' |
| | | style.borderColor = color[cl] |
| | | } else { |
| | | style.color = '#ffffff' |
| | | style.backgroundColor = color[cl] |
| | |
| | | const { elements, visible, actvisible, profVisible, card, record } = this.state |
| | | |
| | | return ( |
| | | <div className="model-menu-card-cell-list"> |
| | | <div className={'model-menu-card-cell-list ' + (cardCell && cardCell.setting && cardCell.setting.layout === 'flex' ? 'mk-flex' : '') }> |
| | | <DragElement |
| | | list={elements} |
| | | parent={cardCell} |
| | |
| | | .card-cell:hover, .card-button-cell:hover { |
| | | box-shadow: 0px 0px 2px #1890ff; |
| | | } |
| | | .card-detail-row { |
| | | .ant-col[class*="x"] { |
| | | float: left; |
| | | box-sizing: border-box; |
| | | } |
| | | >.ant-col-0x { |
| | | width: 2.08333333%; |
| | | } |
| | | >.ant-col-1x { |
| | | width: 6.25%; |
| | | } |
| | | >.ant-col-2x { |
| | | width: 10.41666667%; |
| | | } |
| | | >.ant-col-3x { |
| | | width: 14.58333333%; |
| | | } |
| | | >.ant-col-4x { |
| | | width: 18.75%; |
| | | } |
| | | >.ant-col-5x { |
| | | width: 22.91666667%; |
| | | } |
| | | >.ant-col-6x { |
| | | width: 27.08333333%; |
| | | } |
| | | >.ant-col-7x { |
| | | width: 31.25%; |
| | | } |
| | | >.ant-col-8x { |
| | | width: 35.41666667%; |
| | | } |
| | | >.ant-col-9x { |
| | | width: 39.58333333%; |
| | | } |
| | | >.ant-col-10x { |
| | | width: 43.75%; |
| | | } |
| | | >.ant-col-11x { |
| | | width: 47.91666667%; |
| | | } |
| | | >.ant-col-12x { |
| | | width: 52.08333333%; |
| | | } |
| | | >.ant-col-13x { |
| | | width: 56.25%; |
| | | } |
| | | >.ant-col-14x { |
| | | width: 60.41666667%; |
| | | } |
| | | >.ant-col-15x { |
| | | width: 64.58333333%; |
| | | } |
| | | >.ant-col-16x { |
| | | width: 68.75%; |
| | | } |
| | | >.ant-col-17x { |
| | | width: 72.91666667%; |
| | | } |
| | | >.ant-col-18x { |
| | | width: 77.08333333%; |
| | | } |
| | | >.ant-col-19x { |
| | | width: 81.25%; |
| | | } |
| | | >.ant-col-20x { |
| | | width: 85.41666667%; |
| | | } |
| | | >.ant-col-21x { |
| | | width: 89.58333333%; |
| | | } |
| | | >.ant-col-22x { |
| | | width: 93.75%; |
| | | } |
| | | >.ant-col-23x { |
| | | width: 97.91666667%; |
| | | } |
| | | } |
| | | } |
| | | .model-menu-card-cell-list.mk-flex { |
| | | >.card-detail-row { |
| | | display: flex; |
| | | >.ant-col-1 { |
| | | flex: 1; |
| | | } |
| | | >.ant-col-2 { |
| | | flex: 2; |
| | | } |
| | | >.ant-col-3 { |
| | | flex: 3; |
| | | } |
| | | >.ant-col-4 { |
| | | flex: 4; |
| | | } |
| | | >.ant-col-5 { |
| | | flex: 5; |
| | | } |
| | | >.ant-col-6 { |
| | | flex: 6; |
| | | } |
| | | >.ant-col-7 { |
| | | flex: 7; |
| | | } |
| | | >.ant-col-8 { |
| | | flex: 8; |
| | | } |
| | | >.ant-col-9 { |
| | | flex: 9; |
| | | } |
| | | >.ant-col-10 { |
| | | flex: 10; |
| | | } |
| | | >.ant-col-11 { |
| | | flex: 11; |
| | | } |
| | | >.ant-col-12 { |
| | | flex: 12; |
| | | } |
| | | >.ant-col-13 { |
| | | flex: 13; |
| | | } |
| | | >.ant-col-14 { |
| | | flex: 14; |
| | | } |
| | | >.ant-col-15 { |
| | | flex: 15; |
| | | } |
| | | >.ant-col-16 { |
| | | flex: 16; |
| | | } |
| | | >.ant-col-17 { |
| | | flex: 17; |
| | | } |
| | | >.ant-col-18 { |
| | | flex: 18; |
| | | } |
| | | >.ant-col-19 { |
| | | flex: 19; |
| | | } |
| | | >.ant-col-20 { |
| | | flex: 20; |
| | | } |
| | | >.ant-col-21 { |
| | | flex: 21; |
| | | } |
| | | >.ant-col-22 { |
| | | flex: 22; |
| | | } |
| | | >.ant-col-23 { |
| | | flex: 23; |
| | | } |
| | | >.ant-col-24 { |
| | | flex: 24; |
| | | } |
| | | >.ant-col-0x { |
| | | flex: 0.5; |
| | | } |
| | | >.ant-col-1x { |
| | | flex: 1.5; |
| | | } |
| | | >.ant-col-2x { |
| | | flex: 2.5; |
| | | } |
| | | >.ant-col-3x { |
| | | flex: 3.5; |
| | | } |
| | | >.ant-col-4x { |
| | | flex: 4.5; |
| | | } |
| | | >.ant-col-5x { |
| | | flex: 5.5; |
| | | } |
| | | >.ant-col-6x { |
| | | flex: 6.5; |
| | | } |
| | | >.ant-col-7x { |
| | | flex: 7.5; |
| | | } |
| | | >.ant-col-8x { |
| | | flex: 8.5; |
| | | } |
| | | >.ant-col-9x { |
| | | flex: 9.5; |
| | | } |
| | | >.ant-col-10x { |
| | | flex: 10.5; |
| | | } |
| | | >.ant-col-11x { |
| | | flex: 11.5; |
| | | } |
| | | >.ant-col-12x { |
| | | flex: 12.5; |
| | | } |
| | | >.ant-col-13x { |
| | | flex: 13.5; |
| | | } |
| | | >.ant-col-14x { |
| | | flex: 14.5; |
| | | } |
| | | >.ant-col-15x { |
| | | flex: 15.5; |
| | | } |
| | | >.ant-col-16x { |
| | | flex: 16.5; |
| | | } |
| | | >.ant-col-17x { |
| | | flex: 17.5; |
| | | } |
| | | >.ant-col-18x { |
| | | flex: 18.5; |
| | | } |
| | | >.ant-col-19x { |
| | | flex: 19.5; |
| | | } |
| | | >.ant-col-20x { |
| | | flex: 20.5; |
| | | } |
| | | >.ant-col-21x { |
| | | flex: 21.5; |
| | | } |
| | | >.ant-col-22x { |
| | | flex: 22.5; |
| | | } |
| | | >.ant-col-23x { |
| | | flex: 23.5; |
| | | } |
| | | } |
| | | } |
| | |
| | | }, |
| | | { |
| | | type: 'radio', |
| | | field: 'layout', |
| | | label: '元素布局', |
| | | initval: setting.layout || 'grid', |
| | | required: false, |
| | | options: [ |
| | | {value: 'grid', label: '栅格布局'}, |
| | | {value: 'flex', label: '弹性布局'}, |
| | | ] |
| | | }, |
| | | { |
| | | type: 'radio', |
| | | field: 'clickType', |
| | | label: '触发方式', |
| | | initval: setting.clickType || 'normal', |
| | |
| | | }, |
| | | { |
| | | type: 'radio', |
| | | field: 'layout', |
| | | label: '元素布局', |
| | | initval: setting.layout || 'grid', |
| | | required: false, |
| | | options: [ |
| | | {value: 'grid', label: '栅格布局'}, |
| | | {value: 'flex', label: '弹性布局'}, |
| | | ] |
| | | }, |
| | | { |
| | | type: 'radio', |
| | | field: 'click', |
| | | label: '点击事件', |
| | | initval: setting.click || '', |
| | |
| | | <PlusOutlined className="plus" title="添加卡片" onClick={() => this.addCard()}/> |
| | | {appType !== 'mob' ? <PlusCircleOutlined className="plus" title="添加搜索" onClick={() => this.addSearch()}/> : null} |
| | | <PlusSquareOutlined className="plus" title="添加按钮" onClick={() => this.addButton()}/> |
| | | <NormalForm title="数据卡设置" width={800} update={this.updateWrap} getForms={this.getWrapForms}> |
| | | <NormalForm title="双重数据卡设置" width={800} update={this.updateWrap} getForms={this.getWrapForms}> |
| | | <EditOutlined style={{color: '#1890ff'}} title="编辑"/> |
| | | </NormalForm> |
| | | <CopyComponent type="datacard" card={card}/> |
| | |
| | | required: false |
| | | }, |
| | | { |
| | | type: 'number', |
| | | field: 'minWidth', |
| | | label: '最小宽度', |
| | | min: 0, |
| | | max: 5000, |
| | | precision: 0, |
| | | initval: wrap.minWidth, |
| | | tooltip: '设置卡片区域的最小宽度,显示区域小于此值将出现横向滚动。', |
| | | required: false |
| | | }, |
| | | { |
| | | type: 'radio', |
| | | field: 'permission', |
| | | label: '权限验证', |
| | |
| | | }, |
| | | { |
| | | type: 'radio', |
| | | field: 'layout', |
| | | label: '元素布局', |
| | | initval: setting.layout || 'grid', |
| | | required: false, |
| | | options: [ |
| | | {value: 'grid', label: '栅格布局'}, |
| | | {value: 'flex', label: '弹性布局'}, |
| | | ] |
| | | }, |
| | | { |
| | | type: 'radio', |
| | | field: 'clickType', |
| | | label: '触发方式', |
| | | initval: setting.clickType || 'normal', |
| | |
| | | this.record.pageTemplate = '' |
| | | this.record.funcType = '' |
| | | this.record.sqlType = '' |
| | | |
| | | if (value === 'pop' || value === 'prompt' || value === 'exec') { |
| | | _fieldval.intertype = 'system' |
| | | _fieldval.sqlType = '' |
| | |
| | | _fieldval.Ot = 'notRequired' |
| | | _fieldval.execSuccess = 'grid' |
| | | _fieldval.label = '导入Excel' |
| | | _fieldval.class = 'dgreen' |
| | | _fieldval.class = 'border-dgreen' |
| | | this.record.Ot = 'notRequired' |
| | | this.record.label = '导入Excel' |
| | | this.record.class = 'dgreen' |
| | | this.record.class = 'border-dgreen' |
| | | this.record.execSuccess = 'grid' |
| | | } else if (value === 'excelOut') { |
| | | _fieldval.intertype = 'system' |
| | |
| | | _fieldval.class = 'dgreen' |
| | | _fieldval.execSuccess = 'never' |
| | | _fieldval.Ot = 'requiredOnce' |
| | | _fieldval.control = '' |
| | | this.record.Ot = 'requiredOnce' |
| | | this.record.label = '导出Excel' |
| | | this.record.class = 'dgreen' |
| | | this.record.execSuccess = 'never' |
| | | |
| | | this.record.control = '' |
| | | } else if (value === 'popview') { |
| | | _fieldval.display = 'modal' |
| | | _fieldval.Ot = 'requiredSgl' |
| | |
| | | } else if (value === 'funcbutton') { |
| | | // _fieldval.funcType = '' |
| | | |
| | | } |
| | | if (value === 'excelIn') { |
| | | _fieldval.label = '导入Excel' |
| | | _fieldval.class = 'dgreen' |
| | | } else if (value === 'excelOut') { |
| | | _fieldval.label = '导出Excel' |
| | | _fieldval.class = 'dgreen' |
| | | _fieldval.control = '' |
| | | this.record.control = '' |
| | | } |
| | | |
| | | if (appType !== 'mob' && _fieldval.Ot === 'notRequired') { |
| | |
| | | import React, { useState } from 'react' |
| | | import { useDrop } from 'react-dnd' |
| | | import { is, fromJS } from 'immutable' |
| | | import { message } from 'antd' |
| | | import update from 'immutability-helper' |
| | | |
| | | import Utils from '@/utils/utils.js' |
| | |
| | | } |
| | | |
| | | copycard.uuid = Utils.getuuid() |
| | | copycard.originCard = card |
| | | |
| | | try { |
| | | delete _val.$srcId |
| | |
| | | oInput.select() |
| | | document.execCommand('Copy') |
| | | document.body.removeChild(oInput) |
| | | |
| | | message.success('复制成功。') |
| | | } else { |
| | | message.warning('复制失败。') |
| | | } |
| | | |
| | | const { index: overIndex } = findCard(id) |
| | | // const { index: overIndex } = findCard(id) |
| | | |
| | | const _cards = update(cards, { $splice: [[overIndex + 1, 0, copycard]] }) |
| | | // const _cards = update(cards, { $splice: [[overIndex + 1, 0, copycard]] }) |
| | | |
| | | handleList(_cards, copycard) |
| | | // handleList(_cards, copycard) |
| | | } |
| | | |
| | | const [, drop] = useDrop({ |
| | |
| | | |
| | | if (newcard.OpenType === 'excelIn') { |
| | | newcard.label = item.text |
| | | newcard.class = 'dgreen' |
| | | newcard.class = 'border-dgreen' |
| | | newcard.Ot = 'notRequired' |
| | | } else if (newcard.OpenType === 'excelOut') { |
| | | newcard.label = item.text |
| | |
| | | import { btnCustomClasses, btnClasses } from '@/utils/option.js' |
| | | import { btnClasses } from '@/utils/option.js' |
| | | |
| | | |
| | | /** |
| | |
| | | tooltip: '此颜色为按钮初始化颜色,可在样式调整中修改。', |
| | | required: false, |
| | | forbid: type === 'datacard' && appType === 'mob', // 移动端,滑动显示的按钮不设置通用颜色 |
| | | options: btnCustomClasses |
| | | options: btnClasses |
| | | }, |
| | | { |
| | | type: 'radio', |
| | |
| | | if ((btn.OpenType === 'excelIn' || btn.OpenType === 'excelOut') && (!btn.verify || !btn.verify.columns) && (config.subtype === 'basetable' || config.subtype === 'normaltable')) { |
| | | let columns = [] |
| | | let maps = [] |
| | | let labels = {} |
| | | if (config.subtype === 'normaltable') { |
| | | config.columns.forEach(col => { |
| | | labels[col.field] = col.label |
| | | }) |
| | | } |
| | | |
| | | if (btn.OpenType === 'excelOut') { |
| | | let pushcol = (item) => { |
| | |
| | | } |
| | | |
| | | config.cols.forEach(item => { |
| | | if (item.type === 'colspan' && config.subtype === 'normaltable') { |
| | | if (item.Hide === 'true') return |
| | | |
| | | if (config.subtype === 'normaltable') { |
| | | if (item.type === 'colspan') { |
| | | item.subcols.forEach(cell => { |
| | | if (!cell.field || cell.Hide === 'true' || maps.includes(cell.field)) return |
| | | maps.push(cell.field) |
| | | |
| | | pushcol(cell) |
| | | }) |
| | | } else if (item.type === 'custom') { |
| | | item.elements.forEach(cell => { |
| | | if (!cell.field || maps.includes(cell.field)) return |
| | | maps.push(cell.field) |
| | | |
| | | pushcol({...cell, label: labels[cell.field]}) |
| | | }) |
| | | } |
| | | } |
| | | |
| | | if (!item.field || item.Hide === 'true' || maps.includes(item.field)) return |
| | | if (!item.field || maps.includes(item.field)) return |
| | | maps.push(item.field) |
| | | |
| | | pushcol(item) |
| | |
| | | } |
| | | |
| | | config.cols.forEach(item => { |
| | | if (item.type === 'colspan' && config.subtype === 'normaltable') { |
| | | if (item.Hide === 'true') return |
| | | |
| | | if (config.subtype === 'normaltable') { |
| | | if (item.type === 'colspan') { |
| | | item.subcols.forEach(cell => { |
| | | if (!cell.field || cell.Hide === 'true' || maps.includes(cell.field)) return |
| | | maps.push(cell.field) |
| | | |
| | | pushcol(cell) |
| | | }) |
| | | } else if (item.type === 'custom') { |
| | | item.elements.forEach(cell => { |
| | | if (!cell.field || maps.includes(cell.field)) return |
| | | maps.push(cell.field) |
| | | |
| | | pushcol({...cell, label: labels[cell.field]}) |
| | | }) |
| | | } |
| | | } |
| | | |
| | | if (!item.field || item.Hide === 'true' || maps.includes(item.field)) return |
| | | if (!item.field || maps.includes(item.field)) return |
| | | maps.push(item.field) |
| | | |
| | | pushcol(item) |
| | |
| | | if (btn.show === 'icon') { |
| | | btn.style.color = color[btn.class] |
| | | btn.style.backgroundColor = 'transparent' |
| | | } else if (btn.class === 'default') { |
| | | btn.style.color = 'rgba(0, 0, 0, 0.65)' |
| | | btn.style.backgroundColor = '#fff' |
| | | btn.style.borderColor = '#d9d9d9' |
| | | } else if (btn.class.indexOf('border') > -1) { |
| | | let _c = btn.class.replace('border-', '') |
| | | btn.style.color = color[_c] |
| | | btn.style.backgroundColor = '#fff' |
| | | btn.style.borderColor = color[_c] |
| | | } else { |
| | | btn.style.color = '#ffffff' |
| | | btn.style.backgroundColor = color[btn.class] |
| | |
| | | type: 'radio', |
| | | key: 'eval', |
| | | label: '解析', |
| | | initVal: card.eval || 'true', |
| | | initVal: card.eval || 'false', |
| | | tooltip: '当公式内容涉及计算时请选择“是”,当公式内容为字段拼接时请选择“否”。', |
| | | required: false, |
| | | options: [ |
| | |
| | | type: 'radio', |
| | | key: 'eval', |
| | | label: '解析', |
| | | initVal: card.eval || 'true', |
| | | initVal: card.eval || 'false', |
| | | tooltip: '当公式内容涉及计算时请选择“是”,当公式内容为字段拼接时请选择“否”。', |
| | | required: false, |
| | | options: [ |
| | |
| | | } |
| | | |
| | | handleSubmit = () => { |
| | | // const { columns } = this.props |
| | | // 表单提交时检查输入值是否正确 |
| | | this.props.form.validateFieldsAndScroll((err, values) => { |
| | | if (!err) { |
| | | // if (values.field && columns.filter(col => col.field && col.uuid !== values.uuid && col.field === values.field).length > 0) { |
| | | // notification.warning({ |
| | | // top: 92, |
| | | // message: '字段已添加!', |
| | | // duration: 5 |
| | | // }) |
| | | // return |
| | | // } |
| | | if (values.type === 'number' && values.editable === 'true') { |
| | | if (typeof(values.max) === 'number' && typeof(values.min) === 'number' && values.max < values.min) { |
| | | notification.warning({ |
| | | top: 92, |
| | | message: '最大值不可小于最小值!', |
| | | duration: 5 |
| | | }) |
| | | return |
| | | } |
| | | } |
| | | this.setState({visible: false, formlist: null}) |
| | | this.props.submitCol(values) |
| | | |
| | |
| | | type: 'radio', |
| | | key: 'eval', |
| | | label: '解析', |
| | | initVal: card.eval || 'true', |
| | | initVal: card.eval || 'false', |
| | | tooltip: '当公式内容涉及计算时请选择“是”,当公式内容为字段拼接时请选择“否”。', |
| | | required: false, |
| | | options: [ |
| | |
| | | } |
| | | return item |
| | | }) |
| | | |
| | | res.columns.reverse() |
| | | } |
| | | |
| | | let maxScript = 0 |
| | |
| | | |
| | | if (config.subtype !== 'dualdatacard') { |
| | | delete res.subColumns |
| | | } else { |
| | | res.subColumns.reverse() |
| | | } |
| | | |
| | | this.setState({loading: false, visible: false}) |
| | |
| | | import React, {Component} from 'react' |
| | | import PropTypes from 'prop-types' |
| | | import { fromJS } from 'immutable' |
| | | import { Form, Tabs, Popconfirm, notification, Modal, Typography, Spin, message, Button } from 'antd' |
| | | import { Form, Tabs, Popconfirm, notification, Modal, Typography, Spin, message, Button, Input } from 'antd' |
| | | import { StopOutlined, CheckCircleOutlined, EditOutlined, SwapOutlined, DeleteOutlined, CopyOutlined, BorderOutlined, SnippetsOutlined } from '@ant-design/icons' |
| | | import moment from 'moment' |
| | | |
| | |
| | | |
| | | const { TabPane } = Tabs |
| | | const { Paragraph } = Typography |
| | | const { Search } = Input |
| | | |
| | | const CodeMirror = asyncComponent(() => import('@/templates/zshare/codemirror')) |
| | | const FieldsComponent = asyncComponent(() => import('@/templates/sharecomponent/fieldscomponent')) |
| | |
| | | subColumns: [], |
| | | activeKey: 'setting', |
| | | loading: false, |
| | | searchKey: '', |
| | | initsql: '', // sql验证时变量声明及赋值 |
| | | usefulfields: '', |
| | | defaultsql: '', // 默认Sql |
| | |
| | | |
| | | _search = _search.replace(/@\$@/ig, '') |
| | | _search = _search ? 'where ' + _search : '' |
| | | let columns = config.columns ? fromJS(config.columns).toJS() : [] |
| | | let subColumns = config.subColumns ? fromJS(config.subColumns).toJS() : [] |
| | | |
| | | columns.reverse() |
| | | subColumns.reverse() |
| | | |
| | | this.setState({ |
| | | scripts, |
| | | columns: config.columns ? fromJS(config.columns).toJS() : [], |
| | | subColumns: config.subColumns ? fromJS(config.subColumns).toJS() : [], |
| | | columns: columns, |
| | | subColumns: subColumns, |
| | | setting: _setting, |
| | | median: _setting, |
| | | searches: search, |
| | | defaultSearch: _search |
| | | defaultSearch: _search, |
| | | searchKey: '' |
| | | }) |
| | | |
| | | this.getsysScript() |
| | |
| | | |
| | | values.uuid = Utils.getuuid() |
| | | |
| | | this.setState({ columns: [...columns, values] }) |
| | | this.setState({ columns: [values, ...columns] }) |
| | | } |
| | | |
| | | subColumnChange = (values, resolve) => { |
| | |
| | | |
| | | values.uuid = Utils.getuuid() |
| | | |
| | | this.setState({ subColumns: [...subColumns, values] }) |
| | | this.setState({ subColumns: [values, ...subColumns] }) |
| | | } |
| | | |
| | | deleteScript = (record) => { |
| | |
| | | |
| | | render() { |
| | | const { config } = this.props |
| | | const { columns, subColumns, median, setting, scripts, colColumns, scriptsColumns, activeKey, loading, searches, defaultsql, visible, pvisible, reload, script, scriptValue } = this.state |
| | | const { columns, subColumns, median, setting, scripts, colColumns, scriptsColumns, activeKey, loading, searches, defaultsql, visible, pvisible, reload, script, scriptValue, searchKey } = this.state |
| | | |
| | | return ( |
| | | <div className="model-data-source-wrap"> |
| | |
| | | type="fields" |
| | | updatefield={this.updatefields} |
| | | /> |
| | | <EditTable actions={['edit', 'move', 'copy', 'del', 'clear']} type="datasourcefield" wrappedComponentRef={(inst) => this.datasource = inst} data={columns} columns={colColumns} onChange={(columns) => this.setState({columns})}/> |
| | | <EditTable actions={['edit', 'move', 'copy', 'del', 'clear']} searchKey={searchKey} type="datasourcefield" wrappedComponentRef={(inst) => this.datasource = inst} data={columns} columns={colColumns} onChange={(columns) => this.setState({columns})}/> |
| | | </TabPane> : null} |
| | | {config.subtype === 'dualdatacard' ? <TabPane tab={ |
| | | <span> |
| | |
| | | type="fields" |
| | | updatefield={this.updateSubfields} |
| | | /> |
| | | <EditTable actions={['edit', 'move', 'copy', 'del', 'clear']} type="datasourcefield" wrappedComponentRef={(inst) => this.subdatasource = inst} data={subColumns} columns={colColumns} onChange={(subColumns) => this.setState({subColumns})}/> |
| | | <EditTable actions={['edit', 'move', 'copy', 'del', 'clear']} searchKey={searchKey} type="datasourcefield" wrappedComponentRef={(inst) => this.subdatasource = inst} data={subColumns} columns={colColumns} onChange={(subColumns) => this.setState({subColumns})}/> |
| | | </TabPane> : null} |
| | | <TabPane tab={ |
| | | <span> |
| | |
| | | {config.type !== 'interface' && activeKey === 'setting' ? <SnippetsOutlined title="导入数据源" className="mk-paste-datasource" onClick={(e) => {e.stopPropagation();this.setState({pvisible: true})}}/> : null} |
| | | {activeKey === 'columns' ? <CopyOutlined title="以逗号拼接形式复制字段" className="mk-copy-fields" onClick={(e) => {e.stopPropagation();this.copyColumns()}}/> : null} |
| | | {activeKey === 'subcolumns' ? <CopyOutlined title="以逗号拼接形式复制字段" className="mk-copy-fields" onClick={(e) => {e.stopPropagation();this.copySubColumns()}}/> : null} |
| | | {activeKey === 'subcolumns' || activeKey === 'columns' ? <span onClick={(e) => {e.stopPropagation()}}><Search className="mk-search-fields" defaultValue={searchKey} allowClear onSearch={(val, e) => {e.stopPropagation();this.setState({searchKey: val})}} /></span> : null} |
| | | </span> |
| | | } key="scripts" disabled={median.interType !== 'system'} id="mk-scripts-tabpane"> |
| | | {scripts.length ? <BorderOutlined className="full-scripts" onClick={() => { |
| | |
| | | .mk-copy-fields:hover, .mk-copy-datasource:hover, .mk-paste-datasource:hover { |
| | | opacity: 1; |
| | | } |
| | | .mk-search-fields { |
| | | position: absolute; |
| | | cursor: pointer; |
| | | width: 150px; |
| | | z-index: 1; |
| | | top: 10px; |
| | | right: -240px; |
| | | display: inline-block; |
| | | .ant-input { |
| | | border-radius: 40px; |
| | | height: 30px; |
| | | transition: opacity 0.2s; |
| | | } |
| | | .ant-input:not(:hover):not(:active):not(:focus) { |
| | | opacity: 0.6; |
| | | } |
| | | .ant-input:not(:hover):not(:active):not(:focus) + .ant-input-suffix { |
| | | opacity: 0.6; |
| | | } |
| | | } |
| | | .mk-search-fields:hover { |
| | | .ant-input { |
| | | opacity: 1; |
| | | } |
| | | .ant-input-suffix { |
| | | opacity: 1; |
| | | } |
| | | } |
| | | .count-tip { |
| | | position: absolute; |
| | | top: 0px; |
| | |
| | | } |
| | | } |
| | | }) |
| | | tab.components[0].cols = tab.components[0].cols.filter(col => !(col.field && col.Hide === 'true')) |
| | | tab.components[0].cols.forEach(col => { |
| | | if (col.type !== 'action') return |
| | | col.elements.forEach(btn => { |
| | |
| | | } |
| | | } |
| | | }) |
| | | item.cols = item.cols.filter(col => !(col.field && col.Hide === 'true')) |
| | | item.cols.forEach(col => { |
| | | if (col.type !== 'action') return |
| | | col.elements.forEach(btn => { |
| | |
| | | const presetColors = [ |
| | | '#1890ff', '#f5222d', '#fa541c', '#fa8c16', '#faad14', '#fadb14', '#a0d911', '#52c41a', '#13c2c2', '#2f54eb', '#722ed1', |
| | | '#eb2f96', '#aeb303', '#c32539', '#1d3661', '#ffd591', '#ffe58f', '#fffb8f', '#eaff8f', '#b7eb8f', '#87e8de', '#91d5ff', |
| | | '#adc6ff', '#d3adf7', '#EBE9E9', '#d9d9d9', '#434343', '#000000', '#ffffff', 'transparent' |
| | | '#adc6ff', '#EBE9E9', '#d9d9d9', 'rgba(0, 0, 0, 0.65)', 'rgba(0, 0, 0, 0.85)', '#000000', '#ffffff', 'transparent' |
| | | ] |
| | | const _href = window.location.href.split('#')[0] |
| | | |
| | | class ColorSketch extends Component { |
| | | static propTpyes = { |
| | |
| | | } |
| | | state = { |
| | | color: '', |
| | | initVal: '', |
| | | colors: [], |
| | | allowClear: false |
| | | } |
| | |
| | | |
| | | let _colors = sessionStorage.getItem('app_colors') |
| | | let colors = JSON.parse(JSON.stringify(presetColors)) |
| | | let normal_colors = localStorage.getItem(_href + 'normal_colors') |
| | | |
| | | if (normal_colors) { |
| | | try { |
| | | normal_colors = JSON.parse(normal_colors) |
| | | } catch (e) { |
| | | normal_colors = [] |
| | | } |
| | | |
| | | normal_colors.forEach(item => { |
| | | colors.push({color: item, title: '常用色:' + item}) |
| | | }) |
| | | } else { |
| | | normal_colors = [] |
| | | } |
| | | |
| | | if (_colors) { |
| | | try { |
| | |
| | | } |
| | | |
| | | _colors.forEach(item => { |
| | | if (!colors.includes(item.linkurl)) { |
| | | colors.push(item.linkurl) |
| | | } |
| | | if (normal_colors.includes(item.linkurl)) return |
| | | |
| | | colors.push({color: item.linkurl, title: '系统色:' + item.linkurl}) |
| | | }) |
| | | } |
| | | |
| | | this.setState({color: initVal, allowClear: allowClear === true, colors}) |
| | | if (colors.length < 40) { |
| | | for (let i = colors.length; i < 40; i++) { |
| | | colors.push({color: 'transparent', title: '' + i}) |
| | | } |
| | | } |
| | | |
| | | this.setState({color: initVal, initVal, allowClear: allowClear === true, colors}) |
| | | } |
| | | |
| | | handleChange = (color) => { |
| | |
| | | } |
| | | } |
| | | |
| | | onVisibleChange = (status) => { |
| | | const { initVal, color } = this.state |
| | | |
| | | if (!status && color && color !== initVal && color !== 'rgba(0, 0, 0, 0)' && color !== 'transparent' && !/rgba\(\d+,\s*\d+,\s*\d+,\s*0\)/.test(color)) { |
| | | let normal_colors = localStorage.getItem(_href + 'normal_colors') |
| | | |
| | | if (normal_colors) { |
| | | try { |
| | | normal_colors = JSON.parse(normal_colors) |
| | | } catch (e) { |
| | | normal_colors = [] |
| | | } |
| | | } else { |
| | | normal_colors = [] |
| | | } |
| | | |
| | | normal_colors.unshift(color) |
| | | normal_colors = Array.from(new Set(normal_colors)) |
| | | |
| | | if (normal_colors.length > 10) { |
| | | normal_colors.length = 10 |
| | | } |
| | | |
| | | localStorage.setItem(_href + 'normal_colors', JSON.stringify(normal_colors)) |
| | | } |
| | | } |
| | | |
| | | |
| | | |
| | | render() { |
| | | const { color, allowClear, colors } = this.state |
| | | return ( |
| | | <div className="color-sketch-block"> |
| | | <Popover content={ |
| | | <SketchPicker color={ color } presetColors={colors} onChange={ this.handleChange } /> |
| | | } overlayClassName="color-sketch-popover" placement="bottomRight" title="" trigger="click"> |
| | | } overlayClassName="color-sketch-popover" placement="bottomRight" title="" trigger="click" onVisibleChange={this.onVisibleChange}> |
| | | <div className="color-sketch-block-box"> |
| | | <div className="color-sketch-block-inner" style={ {background: color} }></div> |
| | | </div> |
| | |
| | | padding: 0; |
| | | .sketch-picker { |
| | | width: 250px!important; |
| | | |
| | | .flexbox-fix:last-child { |
| | | overflow: hidden; |
| | | >div:nth-child(30) { |
| | | position: relative; |
| | | margin-bottom: 20px!important; |
| | | } |
| | | >div:nth-child(30)::after { |
| | | content: ' '; |
| | | display: block; |
| | | border-bottom: 1px solid #d9d9d9; |
| | | position: absolute; |
| | | width: 300px; |
| | | bottom: -10px; |
| | | right: -20px; |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | |
| | | let city = sessionStorage.getItem('city') || '' |
| | | let bid = data.$$BID || '' |
| | | val = val.replace(/@username@/ig, userName).replace(/@fullName@/ig, fullName).replace(/@mk_city@/ig, city).replace(/@bid@/ig, bid) |
| | | } else if (/@month@/ig.test(val)) { |
| | | val = val.replace(/@month@/ig, new Date().toLocaleString('en-US', { month: 'long' })) |
| | | } else if (/@week@/ig.test(val)) { |
| | | val = val.replace(/@week@/ig, (() => { |
| | | let day = new Date().getDay() |
| | | let weeks = ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六'] |
| | | return weeks[day] |
| | | })()) |
| | | } else if (/@day@/ig.test(val)) { |
| | | val = val.replace(/@day@/ig, (() => { |
| | | let day = new Date().getDate() |
| | | return day < 10 ? '0' + day : day |
| | | })()) |
| | | } |
| | | } else if (data.hasOwnProperty(card.field)) { |
| | | val = data[card.field] |
| | |
| | | _style.backgroundImage = `url('${data[card.bgImage]}')` |
| | | } |
| | | |
| | | let lineStyle = {height: card.innerHeight || 'auto'} |
| | | if (card.alignItems) { |
| | | lineStyle.display = 'flex' |
| | | lineStyle.alignItems = card.alignItems |
| | | lineStyle.justifyContent = _style.textAlign || 'left' |
| | | } |
| | | |
| | | contents.push( |
| | | <Col key={card.uuid} style={_style_} span={card.width}> |
| | | <div style={_style} onClick={(e) => {this.openNewView(e, card)}}> |
| | | <div className={'ant-mk-text line' + (card.height || '') + className} style={{height: card.innerHeight || 'auto'}}>{val}</div> |
| | | <div className={'ant-mk-text line' + (card.height || '') + className} style={lineStyle}>{val}</div> |
| | | </div> |
| | | </Col> |
| | | ) |
| | |
| | | className = mark.signType |
| | | } |
| | | |
| | | let lineStyle = {height: card.innerHeight || 'auto'} |
| | | if (card.alignItems) { |
| | | lineStyle.display = 'flex' |
| | | lineStyle.alignItems = card.alignItems |
| | | lineStyle.justifyContent = _style.textAlign || 'left' |
| | | } |
| | | |
| | | contents.push( |
| | | <Col key={card.uuid} style={_style_} span={card.width}> |
| | | <div style={_style}> |
| | | <div className={'ant-mk-text line' + (card.height || '') + className} style={{height: card.innerHeight || 'auto'}}>{val}</div> |
| | | <div className={'ant-mk-text line' + (card.height || '') + className} style={lineStyle}>{val}</div> |
| | | </div> |
| | | </Col> |
| | | ) |
| | |
| | | className = mark.signType |
| | | } |
| | | |
| | | let lineStyle = {height: card.innerHeight || 'auto'} |
| | | if (card.alignItems) { |
| | | lineStyle.display = 'flex' |
| | | lineStyle.alignItems = card.alignItems |
| | | lineStyle.justifyContent = _style.textAlign || 'left' |
| | | } |
| | | |
| | | contents.push( |
| | | <Col key={card.uuid} style={_style_} span={card.width}> |
| | | <div style={_style}> |
| | | <div className={'ant-mk-text line' + (card.height || '') + className} style={{height: card.innerHeight || 'auto'}}>{val}</div> |
| | | <div className={'ant-mk-text line' + (card.height || '') + className} style={lineStyle}>{val}</div> |
| | | </div> |
| | | </Col> |
| | | ) |
| | |
| | | } |
| | | |
| | | render() { |
| | | const { cardCell } = this.props |
| | | |
| | | return ( |
| | | <div className="card-cell-list"> |
| | | <div className={'card-cell-list ' + (cardCell && cardCell.setting && cardCell.setting.layout === 'flex' ? 'mk-flex' : '')}> |
| | | {this.getContent()} |
| | | </div> |
| | | ) |
| | |
| | | width: 26px; |
| | | height: 26px; |
| | | } |
| | | |
| | | .ant-col[class*="x"] { |
| | | float: left; |
| | | box-sizing: border-box; |
| | | } |
| | | >.ant-col-0x { |
| | | width: 2.08333333%; |
| | | } |
| | | >.ant-col-1x { |
| | | width: 6.25%; |
| | | } |
| | | >.ant-col-2x { |
| | | width: 10.41666667%; |
| | | } |
| | | >.ant-col-3x { |
| | | width: 14.58333333%; |
| | | } |
| | | >.ant-col-4x { |
| | | width: 18.75%; |
| | | } |
| | | >.ant-col-5x { |
| | | width: 22.91666667%; |
| | | } |
| | | >.ant-col-6x { |
| | | width: 27.08333333%; |
| | | } |
| | | >.ant-col-7x { |
| | | width: 31.25%; |
| | | } |
| | | >.ant-col-8x { |
| | | width: 35.41666667%; |
| | | } |
| | | >.ant-col-9x { |
| | | width: 39.58333333%; |
| | | } |
| | | >.ant-col-10x { |
| | | width: 43.75%; |
| | | } |
| | | >.ant-col-11x { |
| | | width: 47.91666667%; |
| | | } |
| | | >.ant-col-12x { |
| | | width: 52.08333333%; |
| | | } |
| | | >.ant-col-13x { |
| | | width: 56.25%; |
| | | } |
| | | >.ant-col-14x { |
| | | width: 60.41666667%; |
| | | } |
| | | >.ant-col-15x { |
| | | width: 64.58333333%; |
| | | } |
| | | >.ant-col-16x { |
| | | width: 68.75%; |
| | | } |
| | | >.ant-col-17x { |
| | | width: 72.91666667%; |
| | | } |
| | | >.ant-col-18x { |
| | | width: 77.08333333%; |
| | | } |
| | | >.ant-col-19x { |
| | | width: 81.25%; |
| | | } |
| | | >.ant-col-20x { |
| | | width: 85.41666667%; |
| | | } |
| | | >.ant-col-21x { |
| | | width: 89.58333333%; |
| | | } |
| | | >.ant-col-22x { |
| | | width: 93.75%; |
| | | } |
| | | >.ant-col-23x { |
| | | width: 97.91666667%; |
| | | } |
| | | } |
| | | .card-cell-list::after { |
| | | content: ' '; |
| | | display: block; |
| | | clear: both; |
| | | } |
| | | .card-cell-list.mk-flex { |
| | | display: flex; |
| | | >.ant-col-1 { |
| | | flex: 1; |
| | | } |
| | | >.ant-col-2 { |
| | | flex: 2; |
| | | } |
| | | >.ant-col-3 { |
| | | flex: 3; |
| | | } |
| | | >.ant-col-4 { |
| | | flex: 4; |
| | | } |
| | | >.ant-col-5 { |
| | | flex: 5; |
| | | } |
| | | >.ant-col-6 { |
| | | flex: 6; |
| | | } |
| | | >.ant-col-7 { |
| | | flex: 7; |
| | | } |
| | | >.ant-col-8 { |
| | | flex: 8; |
| | | } |
| | | >.ant-col-9 { |
| | | flex: 9; |
| | | } |
| | | >.ant-col-10 { |
| | | flex: 10; |
| | | } |
| | | >.ant-col-11 { |
| | | flex: 11; |
| | | } |
| | | >.ant-col-12 { |
| | | flex: 12; |
| | | } |
| | | >.ant-col-13 { |
| | | flex: 13; |
| | | } |
| | | >.ant-col-14 { |
| | | flex: 14; |
| | | } |
| | | >.ant-col-15 { |
| | | flex: 15; |
| | | } |
| | | >.ant-col-16 { |
| | | flex: 16; |
| | | } |
| | | >.ant-col-17 { |
| | | flex: 17; |
| | | } |
| | | >.ant-col-18 { |
| | | flex: 18; |
| | | } |
| | | >.ant-col-19 { |
| | | flex: 19; |
| | | } |
| | | >.ant-col-20 { |
| | | flex: 20; |
| | | } |
| | | >.ant-col-21 { |
| | | flex: 21; |
| | | } |
| | | >.ant-col-22 { |
| | | flex: 22; |
| | | } |
| | | >.ant-col-23 { |
| | | flex: 23; |
| | | } |
| | | >.ant-col-24 { |
| | | flex: 24; |
| | | } |
| | | >.ant-col-0x { |
| | | flex: 0.5; |
| | | } |
| | | >.ant-col-1x { |
| | | flex: 1.5; |
| | | } |
| | | >.ant-col-2x { |
| | | flex: 2.5; |
| | | } |
| | | >.ant-col-3x { |
| | | flex: 3.5; |
| | | } |
| | | >.ant-col-4x { |
| | | flex: 4.5; |
| | | } |
| | | >.ant-col-5x { |
| | | flex: 5.5; |
| | | } |
| | | >.ant-col-6x { |
| | | flex: 6.5; |
| | | } |
| | | >.ant-col-7x { |
| | | flex: 7.5; |
| | | } |
| | | >.ant-col-8x { |
| | | flex: 8.5; |
| | | } |
| | | >.ant-col-9x { |
| | | flex: 9.5; |
| | | } |
| | | >.ant-col-10x { |
| | | flex: 10.5; |
| | | } |
| | | >.ant-col-11x { |
| | | flex: 11.5; |
| | | } |
| | | >.ant-col-12x { |
| | | flex: 12.5; |
| | | } |
| | | >.ant-col-13x { |
| | | flex: 13.5; |
| | | } |
| | | >.ant-col-14x { |
| | | flex: 14.5; |
| | | } |
| | | >.ant-col-15x { |
| | | flex: 15.5; |
| | | } |
| | | >.ant-col-16x { |
| | | flex: 16.5; |
| | | } |
| | | >.ant-col-17x { |
| | | flex: 17.5; |
| | | } |
| | | >.ant-col-18x { |
| | | flex: 18.5; |
| | | } |
| | | >.ant-col-19x { |
| | | flex: 19.5; |
| | | } |
| | | >.ant-col-20x { |
| | | flex: 20.5; |
| | | } |
| | | >.ant-col-21x { |
| | | flex: 21.5; |
| | | } |
| | | >.ant-col-22x { |
| | | flex: 22.5; |
| | | } |
| | | >.ant-col-23x { |
| | | flex: 23.5; |
| | | } |
| | | } |
| | |
| | | selectedData={selectedData} |
| | | /> : null |
| | | } |
| | | <div className={`data-zoom ${config.wrap.wrapClass}`}> |
| | | <div className={config.wrap.minWidth ? 'data-zoom-box' : ''}> |
| | | <div className={`data-zoom ${config.wrap.wrapClass}`} style={config.wrap.minWidth ? {minWidth: config.wrap.minWidth} : null}> |
| | | <Row className={'card-row-list '}> |
| | | {precards.map((item, index) => ( |
| | | <Col key={'pre' + index} className="extend-card" span={item.setting.width || 6}> |
| | |
| | | </Row> |
| | | {precards.length === 0 && nextcards.length === 0 && (!data || data.length === 0) ? <Empty description={false}/> : null} |
| | | </div> |
| | | </div> |
| | | {config.wrap.pagestyle === 'page' && config.setting.laypage && data ? <Pagination size="small" total={total} showTotal={(t, range) => `${range[0]}-${range[1]} 共 ${total} 条`} pageSize={pageSize} showSizeChanger={true} pageSizeOptions={this.state.pageOptions} onChange={this.changePageIndex} onShowSizeChange={this.pageSizeChange} current={pageIndex}/> : null} |
| | | {config.wrap.pagestyle === 'more' && config.setting.laypage && data && data.length > 0 ? <div className={'mk-more' + (pageSize * pageIndex >= total ? ' disabled' : '')} onClick={this.loadMore}>查看更多<DownOutlined/></div> : null} |
| | | </div> |
| | |
| | | } |
| | | } |
| | | } |
| | | .data-zoom-box { |
| | | width: 100%; |
| | | overflow-x: auto; |
| | | padding-bottom: 10px; |
| | | } |
| | | .data-zoom-box::-webkit-scrollbar { |
| | | height: 7px; |
| | | } |
| | | .data-zoom-box::-webkit-scrollbar-thumb { |
| | | border-radius: 5px; |
| | | box-shadow: inset 0 0 5px rgba(0, 0, 0, 0.13); |
| | | background: rgba(0, 0, 0, 0.13); |
| | | } |
| | | .data-zoom-box::-webkit-scrollbar-track { |
| | | box-shadow: inset 0 0 5px rgba(0, 0, 0, 0.05); |
| | | border-radius: 3px; |
| | | border: 1px solid rgba(0, 0, 0, 0.07); |
| | | background: rgba(0, 0, 0, 0); |
| | | } |
| | | } |
| | | .double-data-card-box::-webkit-scrollbar { |
| | | width: 7px; |
| | |
| | | field: item.field, |
| | | datatype: _t |
| | | } |
| | | items.push(newcard) |
| | | items.unshift(newcard) |
| | | keys.push(item.field.toLowerCase()) |
| | | }) |
| | | |
| | |
| | | import React, {Component} from 'react' |
| | | import PropTypes from 'prop-types' |
| | | import { is, fromJS } from 'immutable' |
| | | import { Dropdown, Menu } from 'antd' |
| | | import { FullscreenOutlined, FullscreenExitOutlined, FontSizeOutlined, FormatPainterOutlined } from '@ant-design/icons' |
| | | import { Dropdown, Menu, Modal, notification } from 'antd' |
| | | import { FullscreenOutlined, FullscreenExitOutlined, FontSizeOutlined, FormatPainterOutlined, SwapOutlined } from '@ant-design/icons' |
| | | |
| | | import {UnControlled as CodeMirror} from 'react-codemirror2' |
| | | import sqlFormatter from '@/utils/sqlFormatter.js' |
| | | import ReplaceForm from './replaceform' |
| | | import 'codemirror/mode/javascript/javascript' |
| | | import 'codemirror/mode/sql/sql' |
| | | import 'codemirror/mode/xml/xml' |
| | |
| | | options: null, // mode : text/xml, text/css, text/javascript、text/x-mysql ; theme : cobalt - 黑底 |
| | | fullScreen: false, |
| | | style: {fontSize: '18px', lineHeight: '32px'}, |
| | | display: true |
| | | display: true, |
| | | visible: false |
| | | } |
| | | |
| | | editor = null |
| | |
| | | this.props.onChange(_sql) |
| | | } |
| | | |
| | | submit = () => { |
| | | let _sql = this.state.value |
| | | |
| | | this.ReplaceRef.handleConfirm().then(res => { |
| | | let reg = new RegExp(res.origin, 'ig') |
| | | let times = _sql.match(reg) |
| | | |
| | | if (!times) { |
| | | notification.warning({ |
| | | top: 92, |
| | | message: '未查询到字符《' + res.origin + '》。', |
| | | duration: 5 |
| | | }) |
| | | return |
| | | } |
| | | |
| | | _sql = _sql.replace(reg, res.value) |
| | | |
| | | this.setState({display: false, defaultVal: _sql}, () => { |
| | | this.setState({display: true}) |
| | | }) |
| | | |
| | | this.props.onChange(_sql) |
| | | |
| | | notification.success({ |
| | | top: 92, |
| | | message: `共替换${times.length}处字符《${res.origin}》。`, |
| | | duration: 5 |
| | | }) |
| | | this.setState({ visible: false }) |
| | | }) |
| | | } |
| | | |
| | | render() { |
| | | const { mode, func } = this.props |
| | | const { defaultVal, options, fullScreen, style, display } = this.state |
| | | const { defaultVal, options, fullScreen, style, display, visible } = this.state |
| | | const menu = ( |
| | | <Menu> |
| | | <Menu.Item |
| | |
| | | ) |
| | | |
| | | return ( |
| | | <div className="code-mirror-wrap" style={fullScreen || func ? style : null}> |
| | | {!mode && !fullScreen ? <FormatPainterOutlined onClick={this.handleFormat}/> : null} |
| | | {!fullScreen ? <FullscreenOutlined onClick={this.fullScreenChange}/> : null} |
| | | {fullScreen ? <FullscreenExitOutlined onClick={this.fullScreenChange}/> : null} |
| | | <> |
| | | <div className={'code-mirror-wrap ' + (fullScreen ? 'mk-fullscreen' : '')} style={fullScreen || func ? style : null}> |
| | | {!mode ? <FormatPainterOutlined title="格式化" onClick={this.handleFormat}/> : null} |
| | | <FullscreenOutlined title="最大化" onClick={this.fullScreenChange}/> |
| | | <FullscreenExitOutlined title="向下还原" onClick={this.fullScreenChange}/> |
| | | {fullScreen || func ? <Dropdown overlayClassName="mk-mirror-font" overlay={menu} placement="bottomRight"> |
| | | <FontSizeOutlined /> |
| | | </Dropdown> : null} |
| | | <SwapOutlined title="字符替换" onClick={() => this.setState({visible: true})}/> |
| | | {display ? <CodeMirror |
| | | className="code-mirror-area" |
| | | value={defaultVal} |
| | |
| | | }} |
| | | /> : null} |
| | | </div> |
| | | <Modal |
| | | title="字符替换" |
| | | visible={visible} |
| | | width={500} |
| | | maskClosable={false} |
| | | okText="替换" |
| | | onOk={this.submit} |
| | | onCancel={() => {this.setState({ visible: false })}} |
| | | destroyOnClose |
| | | > |
| | | <ReplaceForm inputSubmit={this.submit} wrappedComponentRef={(inst) => this.ReplaceRef = inst}/> |
| | | </Modal> |
| | | </> |
| | | ) |
| | | } |
| | | } |
| | |
| | | color: #1890ff; |
| | | cursor: pointer; |
| | | transition: opacity 0.3s; |
| | | display: none; |
| | | } |
| | | .anticon-fullscreen-exit:hover { |
| | | opacity: 1; |
| | |
| | | position: fixed; |
| | | z-index: 11; |
| | | right: 10px; |
| | | top: 40px; |
| | | top: 65px; |
| | | font-size: 20px; |
| | | opacity: 0.7; |
| | | color: #1890ff; |
| | |
| | | background: #f5f5f5; |
| | | } |
| | | } |
| | | .anticon-swap { |
| | | position: absolute; |
| | | left: -25px; |
| | | top: 40px; |
| | | color: #13c2c2; |
| | | font-size: 16px; |
| | | } |
| | | } |
| | | .code-mirror-wrap.mk-fullscreen { |
| | | .anticon-format-painter { |
| | | position: fixed; |
| | | z-index: 11; |
| | | } |
| | | .anticon-fullscreen-exit { |
| | | display: inline-block; |
| | | } |
| | | .anticon-fullscreen { |
| | | display: none; |
| | | } |
| | | |
| | | .anticon-swap { |
| | | position: fixed; |
| | | z-index: 11; |
| | | left: auto; |
| | | right: 10px; |
| | | top: auto; |
| | | bottom: 20px; |
| | | } |
| | | } |
| | | .mk-mirror-font { |
| | | z-index: 1200!important; |
New file |
| | |
| | | import React, {Component} from 'react' |
| | | import PropTypes from 'prop-types' |
| | | import { Form, Row, Col, Input } from 'antd' |
| | | // import './index.scss' |
| | | |
| | | class ReplaceForm extends Component { |
| | | static propTpyes = { |
| | | inputSubmit: PropTypes.func // 回车事件 |
| | | } |
| | | |
| | | componentDidMount () { |
| | | try { |
| | | let _form = document.getElementById('origin') |
| | | if (_form && _form.select) { |
| | | _form.select() |
| | | } |
| | | } catch (e) { |
| | | console.warn('Form focusing error!') |
| | | } |
| | | } |
| | | |
| | | handleConfirm = () => { |
| | | // 表单提交时检查输入值是否正确 |
| | | return new Promise((resolve, reject) => { |
| | | this.props.form.validateFieldsAndScroll((err, values) => { |
| | | if (!err) { |
| | | resolve(values) |
| | | } |
| | | }) |
| | | }) |
| | | } |
| | | |
| | | enterPress = (e) => { |
| | | e.stopPropagation() |
| | | |
| | | setTimeout(() => { |
| | | this.props.inputSubmit() |
| | | }, 200) |
| | | } |
| | | |
| | | render() { |
| | | const { getFieldDecorator } = this.props.form |
| | | const formItemLayout = { |
| | | labelCol: { |
| | | xs: { span: 24 }, |
| | | sm: { span: 8 } |
| | | }, |
| | | wrapperCol: { |
| | | xs: { span: 24 }, |
| | | sm: { span: 14 } |
| | | } |
| | | } |
| | | return ( |
| | | <Form {...formItemLayout}> |
| | | <Row gutter={24}> |
| | | <Col span={24}> |
| | | <Form.Item label="原字符"> |
| | | {getFieldDecorator('origin', { |
| | | initialValue: '', |
| | | rules: [ |
| | | { |
| | | required: true, |
| | | message: '请输入原字符!' |
| | | } |
| | | ] |
| | | })(<Input autoComplete="off" onPressEnter={this.enterPress}/>)} |
| | | </Form.Item> |
| | | </Col> |
| | | <Col span={24}> |
| | | <Form.Item label="替换为"> |
| | | {getFieldDecorator('value', { |
| | | initialValue: '' |
| | | })(<Input autoComplete="off" onPressEnter={this.enterPress}/>)} |
| | | </Form.Item> |
| | | </Col> |
| | | </Row> |
| | | </Form> |
| | | ) |
| | | } |
| | | } |
| | | |
| | | export default Form.create()(ReplaceForm) |
| | |
| | | class EditTable extends Component { |
| | | static propTpyes = { |
| | | actions: PropTypes.any, // 操作项 |
| | | searchKey: PropTypes.any, // 搜索条件 |
| | | data: PropTypes.any, // 数据列表 |
| | | columns: PropTypes.array, // 显示列 |
| | | onChange: PropTypes.func // 数据变化 |
| | |
| | | } |
| | | |
| | | render() { |
| | | const { actions, indexShow } = this.props |
| | | const { actions, indexShow, searchKey } = this.props |
| | | const { editLineId } = this.state |
| | | |
| | | let components = { |
| | |
| | | } |
| | | |
| | | let moveprops = {} |
| | | if (actions.includes('move')) { |
| | | if (actions.includes('move') && !searchKey) { |
| | | components.body.row = DragableBodyRow |
| | | moveprops.moveAble = !this.state.editingKey |
| | | moveprops.moveRow = this.moveRow |
| | |
| | | return item |
| | | }) |
| | | |
| | | let reg = searchKey ? new RegExp(searchKey, 'ig') : null |
| | | |
| | | return ( |
| | | <EditableContext.Provider value={this.props.form}> |
| | | <div className="modal-edit-table"> |
| | |
| | | components={components} |
| | | dataSource={data} |
| | | columns={columns} |
| | | rowClassName={record => !editLineId || editLineId !== record.uuid ? 'editable-row' : 'editable-row active'} |
| | | rowClassName={record => { |
| | | let className = 'editable-row' |
| | | if (editLineId && editLineId === record.uuid) { |
| | | className += ' active' |
| | | } |
| | | if (searchKey) { |
| | | if (!reg.test(record.field) && !reg.test(record.label)) { |
| | | className += ' hidden' |
| | | } |
| | | } |
| | | return className |
| | | }} |
| | | pagination={false} |
| | | onRow={(record, index) => ({ |
| | | index, |
| | |
| | | background-color: #bae7ff!important; |
| | | } |
| | | } |
| | | .editable-row.hidden { |
| | | display: none; |
| | | } |
| | | .mk-index { |
| | | text-align: center; |
| | | white-space: nowrap; |
| | |
| | | type: 'radio', |
| | | key: 'eval', |
| | | label: '解析', |
| | | initVal: card.eval || 'true', |
| | | initVal: card.eval || 'false', |
| | | tooltip: '当公式内容涉及计算时请选择“是”,当公式内容为字段拼接时请选择“否”。', |
| | | required: false, |
| | | options: [{ |
| | |
| | | text: '白底紫框' |
| | | }] |
| | | |
| | | // 按钮颜色集 |
| | | export const btnCustomClasses = [{ |
| | | value: 'primary', |
| | | text: '蓝色' |
| | | }, { |
| | | value: 'yellow', |
| | | text: '黄色' |
| | | }, { |
| | | value: 'orange', |
| | | text: '橙色' |
| | | }, { |
| | | value: 'danger', |
| | | text: '红色' |
| | | }, { |
| | | value: 'green', |
| | | text: '绿色' |
| | | }, { |
| | | value: 'dgreen', |
| | | text: '深绿色' |
| | | }, { |
| | | value: 'purple', |
| | | text: '紫色' |
| | | }, { |
| | | value: 'cyan', |
| | | text: '青色' |
| | | }, { |
| | | value: 'gray', |
| | | text: '灰色' |
| | | }] |
| | | |
| | | export const calendarColors = [ |
| | | {name: 'red', value: '#d0021b'}, |
| | | {name: 'orange', value: '#f5a623'}, |