Merge branch 'dev' into pr@dev@pages

This commit is contained in:
taojinlong 2023-01-17 13:16:28 +08:00
commit 3a18e25b86
38 changed files with 608 additions and 99 deletions

View File

@ -124,8 +124,8 @@
and configuration = #{configuration,jdbcType=LONGVARCHAR}
</if>
</where>
<if test="sort == null">
order by ${sort}
<if test="sort != null">
order by #{sort}
</if>
</select>

View File

@ -165,6 +165,44 @@ public class XEmailTaskServer {
return xpackEmailCreate;
}
@DeRateLimiter
@PostMapping(value = "/screenpdf", produces = {MediaType.APPLICATION_PDF_VALUE})
public ResponseEntity<ByteArrayResource> screenpdf(@RequestBody XpackEmailViewRequest request) {
EmailXpackService emailXpackService = SpringContextUtil.getBean(EmailXpackService.class);
String url = ServletUtils.domain() + "/#/previewScreenShot/" + request.getPanelId() + "/true";
byte[] bytes = null;
try {
String currentToken = ServletUtils.getToken();
Future<?> future = priorityExecutor.submit(() -> {
try {
return emailXpackService.printPdf(url, currentToken, buildPixel(request.getPixel()));
} catch (Exception e) {
LogUtil.error(e.getMessage(), e);
DEException.throwException("预览失败,请联系管理员");
}
return null;
}, 0);
Object object = future.get();
if (ObjectUtils.isNotEmpty(object)) {
bytes = (byte[]) object;
if (ArrayUtil.isNotEmpty(bytes)) {
String fileName = request.getPanelId() + ".pdf";
ByteArrayResource bar = new ByteArrayResource(bytes);
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_PDF);
ContentDisposition contentDisposition = ContentDisposition.parse("attachment; filename=" + URLEncoder.encode(fileName, "UTF-8"));
headers.setContentDisposition(contentDisposition);
return new ResponseEntity(bar, headers, HttpStatus.OK);
}
}
} catch (Exception e) {
LogUtil.error(e.getMessage(), e);
DEException.throwException("预览失败,请联系管理员");
}
return null;
}
@DeRateLimiter
@PostMapping(value = "/screenshot", produces = {MediaType.IMAGE_JPEG_VALUE, MediaType.IMAGE_PNG_VALUE})
public ResponseEntity<ByteArrayResource> screenshot(@RequestBody XpackEmailViewRequest request) {

View File

@ -444,7 +444,7 @@ public class ChartViewService {
fieldMap.put("yAxis", yAxis);
fieldMap.put("extStack", extStack);
fieldMap.put("extBubble", extBubble);
PluginViewParam pluginViewParam = buildPluginParam(fieldMap, fieldCustomFilter, extFilterList, ds, table, view);
PluginViewParam pluginViewParam = buildPluginParam(fieldMap, fieldCustomFilter, extFilterList, ds, table, view, rowPermissionsTree);
String sql = pluginViewSql(pluginViewParam, view);
if (StringUtils.isBlank(sql)) {
return new ArrayList<String[]>();
@ -908,7 +908,7 @@ public class ChartViewService {
fieldMap.put("extBubble", extBubble);
fieldMap.put("xAxis", xAxis);
fieldMap.put("yAxis", yAxis);
PluginViewParam pluginViewParam = buildPluginParam(fieldMap, fieldCustomFilter, extFilterList, ds, table, view);
PluginViewParam pluginViewParam = buildPluginParam(fieldMap, fieldCustomFilter, extFilterList, ds, table, view, rowPermissionsTree);
String sql = pluginViewSql(pluginViewParam, view);
if (StringUtils.isBlank(sql)) {
return emptyChartViewDTO(view);
@ -1358,7 +1358,7 @@ public class ChartViewService {
return dto;
}
private PluginViewParam buildPluginParam(Map<String, List<ChartViewFieldDTO>> fieldMap, List<ChartFieldCustomFilterDTO> customFilters, List<ChartExtFilterRequest> extFilters, Datasource ds, DatasetTable table, ChartViewDTO view) {
private PluginViewParam buildPluginParam(Map<String, List<ChartViewFieldDTO>> fieldMap, List<ChartFieldCustomFilterDTO> customFilters, List<ChartExtFilterRequest> extFilters, Datasource ds, DatasetTable table, ChartViewDTO view, List<DataSetRowPermissionsTreeDTO> rowPermissionsTree) {
PluginViewParam pluginViewParam = new PluginViewParam();
PluginViewSetImpl pluginViewSet = BeanUtils.copyBean(new PluginViewSetImpl(), table);
pluginViewSet.setDsType(ds.getType());
@ -1380,6 +1380,7 @@ public class ChartViewService {
pluginViewParam.setPluginChartFieldCustomFilters(fieldFilters);
pluginViewParam.setPluginChartExtFilters(panelFilters);
pluginViewParam.setPluginViewLimit(pluginViewLimit);
pluginViewParam.setRowPermissionsTree(rowPermissionsTree);
return pluginViewParam;
}

View File

@ -15,6 +15,7 @@ import io.dataease.plugins.common.dto.chart.ChartFieldCustomFilterDTO;
import io.dataease.plugins.common.dto.chart.ChartViewFieldDTO;
import io.dataease.plugins.common.dto.sqlObj.SQLObj;
import io.dataease.plugins.common.request.chart.ChartExtFilterRequest;
import io.dataease.plugins.common.request.permission.DataSetRowPermissionsTreeDTO;
import io.dataease.plugins.common.util.BeanUtils;
import io.dataease.plugins.common.util.ConstantsUtil;
import io.dataease.plugins.datasource.query.QueryProvider;
@ -74,9 +75,9 @@ public class ViewPluginBaseServiceImpl implements ViewPluginBaseService {
String methodName = "transCustomFilterList";
SQLObj sqlObj = BeanUtils.copyBean(SQLObj.builder().build(), pluginViewSQL);
List<ChartFieldCustomFilterDTO> filters = list.stream().map(item -> gson.fromJson(gson.toJson(item), ChartFieldCustomFilterDTO.class)).collect(Collectors.toList());
Object o ;
Object o;
if ((o = execProviderMethod(queryProvider, methodName, sqlObj, filters)) != null) {
return (String)o;
return (String) o;
}
return null;
}
@ -89,30 +90,38 @@ public class ViewPluginBaseServiceImpl implements ViewPluginBaseService {
List<ChartExtFilterRequest> filters = list.stream().map(item -> gson.fromJson(gson.toJson(item), ChartExtFilterRequest.class)).collect(Collectors.toList());
Object o;
if ((o = execProviderMethod(queryProvider, methodName, sqlObj, filters)) != null) {
return (String)o;
return (String) o;
}
return null;
}
@Override
public String permissionWhere(String s, List<DataSetRowPermissionsTreeDTO> list, PluginViewSQL pluginViewSQL) {
QueryProvider queryProvider = ProviderFactory.getQueryProvider(s);
SQLObj sqlObj = BeanUtils.copyBean(SQLObj.builder().build(), pluginViewSQL);
return queryProvider.transFilterTrees(sqlObj, list);
}
private String sqlFix(String sql) {
if (sql.lastIndexOf(";") == (sql.length() - 1)) {
sql = sql.substring(0, sql.length() - 1);
}
return sql;
}
@Override
public PluginViewSQL getTableObj(PluginViewSet pluginViewSet) {
String tableName = null;
DataTableInfoDTO dataTableInfoDTO = new Gson().fromJson(pluginViewSet.getInfo(), DataTableInfoDTO.class);
if (ObjectUtils.isNotEmpty(pluginViewSet.getMode()) && 1 == pluginViewSet.getMode()) {
tableName = TableUtils.tableName(pluginViewSet.getTableId());
}else {
} else {
switch (DatasetType.getEnumObjByKey(pluginViewSet.getType())) {
case DB:
tableName = dataTableInfoDTO.getTable();
break;
case SQL:
String sql = dataTableInfoDTO.isBase64Encryption()? new String(java.util.Base64.getDecoder().decode(dataTableInfoDTO.getSql())): dataTableInfoDTO.getSql();
String sql = dataTableInfoDTO.isBase64Encryption() ? new String(java.util.Base64.getDecoder().decode(dataTableInfoDTO.getSql())) : dataTableInfoDTO.getSql();
tableName = dataSetTableService.handleVariableDefaultValue(sql, null, pluginViewSet.getDsType());
tableName = "(" + sqlFix(tableName) + ")";
@ -139,7 +148,7 @@ public class ViewPluginBaseServiceImpl implements ViewPluginBaseService {
PluginViewSQL tableObj = PluginViewSQL.builder().tableName(realTableName).tableAlias(tableAlias).build();
QueryProvider queryProvider = ProviderFactory.getQueryProvider(pluginViewSet.getDsType());
SQLObj sqlObj = SQLObj.builder().tableName(realTableName).tableAlias(tableAlias).build();
PluginViewSetImpl child = (PluginViewSetImpl)pluginViewSet;
PluginViewSetImpl child = (PluginViewSetImpl) pluginViewSet;
queryProvider.setSchema(sqlObj, child.getDs());
tableObj.setTableName(sqlObj.getTableName());
tableObj.setTableAlias(sqlObj.getTableAlias());
@ -149,9 +158,9 @@ public class ViewPluginBaseServiceImpl implements ViewPluginBaseService {
private String getOriginName(String dsType, PluginViewField pluginViewField, PluginViewSQL tableObj) {
String keyword_fix = ConstantsUtil.constantsValue(dsType, "KEYWORD_FIX");
String originField;
String reflectField = reflectFieldName(dsType, pluginViewField);
String reflectField = reflectFieldName(dsType, pluginViewField);
if (ObjectUtils.isNotEmpty(pluginViewField.getExtField()) && pluginViewField.getExtField() == 2) {
originField = calcFieldRegex(dsType,pluginViewField.getOriginName(), tableObj);
originField = calcFieldRegex(dsType, pluginViewField.getOriginName(), tableObj);
} else if (ObjectUtils.isNotEmpty(pluginViewField.getExtField()) && pluginViewField.getExtField() == 1) {
originField = String.format(keyword_fix, tableObj.getTableAlias(), StringUtils.isNotBlank(reflectField) ? reflectField : pluginViewField.getOriginName());
} else {
@ -164,38 +173,37 @@ public class ViewPluginBaseServiceImpl implements ViewPluginBaseService {
QueryProvider queryProvider = ProviderFactory.getQueryProvider(dsType);
String methodName = "calcFieldRegex";
SQLObj sqlObj = BeanUtils.copyBean(SQLObj.builder().build(), pluginViewSQL);
Object o ;
Object o;
if ((o = execProviderMethod(queryProvider, methodName, originField, sqlObj)) != null) {
return (String)o;
return (String) o;
}
return null;
}
private String reflectFieldName(String dsType, PluginViewField pluginViewField ) {
private String reflectFieldName(String dsType, PluginViewField pluginViewField) {
QueryProvider queryProvider = ProviderFactory.getQueryProvider(dsType);
String methodName = "reflectFieldName";
DatasetTableField field = BeanUtils.copyBean(new DatasetTableField(), pluginViewField);;
Object o ;
DatasetTableField field = BeanUtils.copyBean(new DatasetTableField(), pluginViewField);
Object o;
if ((o = execProviderMethod(queryProvider, methodName, field)) != null) {
return (String)o;
return (String) o;
}
return null;
}
private PluginViewSQL getField(String dsType, PluginViewField field, String originField, String fieldAlias) {
QueryProvider queryProvider = ProviderFactory.getQueryProvider(dsType);
String methodName;
if (StringUtils.equals(field.getTypeField(), "xAxis") || StringUtils.equals(field.getTypeField(), "extStack")) {
methodName = "getXFields";
}else {
} else {
methodName = "getYFields";
}
ChartViewFieldDTO chartViewFieldDTO = BeanUtils.copyBean(new ChartViewFieldDTO(), field);
Object execResult;
if ((execResult = execProviderMethod(queryProvider, methodName, chartViewFieldDTO, originField, fieldAlias)) != null){
SQLObj sqlObj = (SQLObj)execResult;
if ((execResult = execProviderMethod(queryProvider, methodName, chartViewFieldDTO, originField, fieldAlias)) != null) {
SQLObj sqlObj = (SQLObj) execResult;
PluginViewSQL result = PluginViewSQL.builder().build();
return BeanUtils.copyBean(result, sqlObj);
}
@ -215,27 +223,26 @@ public class ViewPluginBaseServiceImpl implements ViewPluginBaseService {
}
private PluginViewSQL addSort(String sort, String originField, String fieldAlias) {
private PluginViewSQL addSort(String sort, String originField, String fieldAlias) {
if (StringUtils.isNotEmpty(sort) && !StringUtils.equalsIgnoreCase(sort, "none")) {
return PluginViewSQL.builder().orderField(originField).orderAlias(fieldAlias).orderDirection(sort).build();
}
return null;
}
private String getWhere(String dsType, PluginViewField field,String originField,String fieldAlias) {
private String getWhere(String dsType, PluginViewField field, String originField, String fieldAlias) {
QueryProvider queryProvider = ProviderFactory.getQueryProvider(dsType);
String methodName;
if (StringUtils.equals(field.getTypeField(), "xAxis") || StringUtils.equals(field.getTypeField(), "extStack")) {
return null;
}else {
} else {
methodName = "getYWheres";
}
ChartViewFieldDTO chartViewFieldDTO = BeanUtils.copyBean(new ChartViewFieldDTO(), field);
Object execResult;
if ((execResult = execProviderMethod(queryProvider, methodName, chartViewFieldDTO, originField, fieldAlias)) != null){
String where = (String)execResult;
if ((execResult = execProviderMethod(queryProvider, methodName, chartViewFieldDTO, originField, fieldAlias)) != null) {
String where = (String) execResult;
return where;
}
return null;

View File

@ -972,7 +972,11 @@ public class DataSetTableService {
return new ArrayList<>();
}
DatasetTable datasetTable = datasetTableMapper.selectByPrimaryKey(id);
return getSqlVariableDetails(type, Arrays.asList(datasetTable));
if (datasetTable != null) {
return getSqlVariableDetails(type, Arrays.asList(datasetTable));
} else {
return null;
}
}
private List<SqlVariableDetails> getSqlVariableDetails(String type, List<DatasetTable> datasetTables) {
@ -2861,7 +2865,8 @@ public class DataSetTableService {
hasSubBinaryExpression = false;
try {
BinaryExpression rightBinaryExpression = (BinaryExpression) expr.getRightExpression();
hasSubBinaryExpression = rightBinaryExpression instanceof AndExpression || rightBinaryExpression instanceof OrExpression;;
hasSubBinaryExpression = rightBinaryExpression instanceof AndExpression || rightBinaryExpression instanceof OrExpression;
;
} catch (Exception e) {
}
if (expr.getRightExpression() instanceof BinaryExpression && !hasSubBinaryExpression && hasVariable(expr.getRightExpression().toString())) {

View File

@ -158,11 +158,17 @@ public class DatasourceService {
}
public List<DatasourceDTO> getDatasourceList(DatasourceUnionRequest request) throws Exception {
request.setSort("update_time desc");
List<DatasourceDTO> datasourceDTOS = extDataSourceMapper.queryUnion(request);
datasourceDTOS.forEach(datasourceDTO -> {
datasourceTrans(datasourceDTO);
});
datasourceDTOS.forEach(this::datasourceTrans);
if (StringUtils.isBlank(request.getSort())) {
datasourceDTOS.sort((o1,o2) -> {
int tmp = StringUtils.compareIgnoreCase(o1.getTypeDesc(), o2.getTypeDesc());
if (tmp == 0) {
tmp = StringUtils.compareIgnoreCase(o1.getName(), o2.getName());
}
return tmp;
});
}
return datasourceDTOS;
}

View File

@ -297,6 +297,9 @@ export default {
// this.$emit('handleDrop', e)
// }
handleDrop(e) {
if (!this.dragComponentInfo) {
return
}
this.dragComponentInfo.moveStatus = 'drop'
//
this.dropComponentInfo = deepCopy(this.dragComponentInfo)

View File

@ -24,7 +24,7 @@
>
<el-tooltip :content="item.tooltip">
<span style="float: left;">
<i :class="item.icon" />
<i :class="item.icon"/>
</span>
</el-tooltip>
</el-radio-button>
@ -47,7 +47,7 @@
:value="item.value"
>
<span style="float: left;">
<i :class="item.icon" />
<i :class="item.icon"/>
</span>
<span style="float: right; color: #8492a6; font-size: 12px">{{ item.label }}</span>
</el-option>
@ -257,7 +257,7 @@
@click="goColor"
/>
</el-tooltip>
<div :style="letterDivColor" />
<div :style="letterDivColor"/>
<el-color-picker
ref="colorPicker"
v-model="styleInfo.color"
@ -279,7 +279,7 @@
@click="goBoardColor"
/>
</el-tooltip>
<div :style="boardDivColor" />
<div :style="boardDivColor"/>
<el-color-picker
ref="boardColorPicker"
v-model="styleInfo.borderColor"
@ -302,7 +302,7 @@
@click="goBackgroundColor"
/>
</el-tooltip>
<div :style="backgroundDivColor" />
<div :style="backgroundDivColor"/>
<el-color-picker
ref="backgroundColorPicker"
v-model="styleInfo.backgroundColor"
@ -318,7 +318,7 @@
style="width: 20px;float: left;margin-top: 2px;margin-left: 2px;"
>
<el-tooltip :content="$t('panel.video_info')">
<VideoLinks :link-info="curComponent.videoLinks" />
<VideoLinks :link-info="curComponent.videoLinks"/>
</el-tooltip>
</div>
@ -327,7 +327,7 @@
style="width: 20px;float: left;margin-top: 2px;margin-left: 2px;"
>
<el-tooltip :content="$t('panel.stream_media_info')">
<StreamMediaLinks :link-info="curComponent.streamMediaLinks" />
<StreamMediaLinks :link-info="curComponent.streamMediaLinks"/>
</el-tooltip>
</div>
@ -336,7 +336,7 @@
style="width: 20px;float: left;margin-top: 2px;margin-left: 2px;"
>
<el-tooltip :content="$t('panel.web_addr')">
<FrameLinks :link-info="curComponent.frameLinks" />
<FrameLinks :link-info="curComponent.frameLinks"/>
</el-tooltip>
</div>
<div
@ -356,7 +356,7 @@
style="width: 20px;float: left;margin-top: 2px;margin-left: 10px;"
>
<el-tooltip :content="$t('panel.tab_inner_style')">
<tab-style :style-info="styleInfo" />
<tab-style :style-info="styleInfo"/>
</el-tooltip>
</div>
@ -616,7 +616,7 @@ export default {
mainStyle() {
const style = {
left: (this.getPositionX(this.curComponent.style.left) - this.scrollLeft) + 'px',
left: (this.getPositionX(this.curComponent.style.left) - this.scrollLeft - 10) + 'px',
top: (this.getPositionY(this.curComponent.style.top) - this.scrollTop + 20) + 'px'
}
return style

View File

@ -153,6 +153,30 @@
@change="styleChange"
/>
</el-dropdown-item>
<el-dropdown-item>
<span>
<svg-icon
style="width: 16px; height: 16px;"
icon-class="page-line"
/>
</span>
<el-tooltip
class="item"
:content="$t('panel.export_pdf_page_remark')"
placement="top-start"
>
<span class="text14 margin-left8">{{ $t('panel.export_pdf_page') }}</span>
</el-tooltip>
<el-switch
v-model="showPageLine"
:class="[{['grid-active']: showPageLine},'margin-left8']"
size="mini"
@change="showPageLineChange"
/>
</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
</span>
@ -247,6 +271,7 @@ export default {
},
data() {
return {
showPageLine: false,
showGridSwitch: false,
mobileLayoutInitStatus: false,
isShowPreview: false,
@ -305,6 +330,7 @@ export default {
this.scale = this.canvasStyleData.scale
this.mobileLayoutInitStatus = this.mobileLayoutStatus
this.showGridSwitch = this.canvasStyleData.aidedDesign.showGrid
this.showPageLine = this.canvasStyleData.pdfPageLine?.showPageLine
this.autoCache()
},
beforeDestroy() {
@ -323,6 +349,7 @@ export default {
},
editPanelInit() {
this.showGridSwitch = this.canvasStyleData.aidedDesign.showGrid
this.showPageLine = this.canvasStyleData.pdfPageLine?.showPageLine
},
close() {
//
@ -589,6 +616,10 @@ export default {
this.$store.commit('canvasChange')
this.canvasStyleData.aidedDesign.showGrid = !this.canvasStyleData.aidedDesign.showGrid
},
showPageLineChange() {
this.$store.commit('canvasChange')
this.canvasStyleData.pdfPageLine.showPageLine = !this.canvasStyleData.pdfPageLine.showPageLine
},
// batch option
batchOption() {
bus.$emit('change_panel_right_draw', !this.batchOptStatus)

View File

@ -204,7 +204,7 @@ export default {
return style
},
componentActiveFlag() {
return !this.mobileLayoutStatus && ((this.curComponent && this.config.id === this.curComponent.id && !this.previewVisible && !this.showPosition.includes('email-task')) || this.showPosition.includes('multiplexing'))
return (!this.mobileLayoutStatus || this.terminal === 'mobile') && ((this.curComponent && this.config.id === this.curComponent.id && !this.previewVisible && !this.showPosition.includes('email-task')) || this.showPosition.includes('multiplexing'))
},
scale() {
return Math.min(this.previewCanvasScale.scalePointWidth, this.previewCanvasScale.scalePointHeight)
@ -279,7 +279,7 @@ export default {
} else {
return {
...
getStyle(style, ['top', 'left', 'width', 'height', 'rotate']),
getStyle(style, ['top', 'left', 'width', 'height', 'rotate']),
position: 'relative'
}
}

View File

@ -12,6 +12,11 @@
@mousedown="handleMouseDown"
@scroll="canvasScroll"
>
<page-line-editor
v-if="showPageLine"
ref="main-page-line"
:canvas-style-data="canvasStyleData"
/>
<!-- 网格线 -->
<Grid
v-if="showGrid"
@ -121,7 +126,7 @@
:canvas-id="canvasId"
/>
<!-- 右击菜单 -->
<ContextMenu/>
<ContextMenu />
<!-- 对齐标线 -->
<span
@ -157,6 +162,7 @@ import MarkLine from './MarkLine'
import Area from './Area'
import eventBus from '@/components/canvas/utils/eventBus'
import Grid from './Grid'
import PageLineEditor from './PageLineEditor'
import PGrid from './PGrid'
import { changeStyleWithScale } from '@/components/canvas/utils/translate'
import UserViewDialog from '@/components/canvas/customComponent/UserViewDialog'
@ -763,7 +769,8 @@ export default {
UserViewDialog,
DeOutWidget,
DragShadow,
LinkJumpSet
LinkJumpSet,
PageLineEditor
},
props: {
parentForbid: {
@ -944,11 +951,26 @@ export default {
return false
}
},
showPageLine() {
if (this.canvasStyleData && this.canvasStyleData.pdfPageLine) {
return this.canvasStyleData.pdfPageLine.showPageLine
}
return false
},
editStyle() {
return {
height: this.outStyle.height + this.scrollTop + 'px !important'
}
},
scrollHeight() {
let baseHeight = 0
this.componentData.forEach(item => {
const top = this.getShapeStyleIntDeDrag(item.style, 'top')
const height = this.getShapeStyleIntDeDrag(item.style, 'height')
baseHeight = Math.max(baseHeight, top + height)
})
return baseHeight
},
customStyle() {
let style = {
width: '100%',
@ -1024,6 +1046,20 @@ export default {
},
deep: true
},
scrollHeight: {
handler(newVal, oldVla) {
this.$nextTick(() => {
if (newVal !== oldVla && this.showPageLine) {
const lineRef = this.$refs['main-page-line']
if (lineRef?.init) {
lineRef.init(newVal)
}
}
console.log(newVal)
})
},
deep: true
},
outStyle: {
handler(newVal, oldVla) {
this.resizeParentBoundsRef()
@ -1251,6 +1287,9 @@ export default {
},
changeStyleWithScale,
handleMouseDown(e) {
if (this.isPageLineTarget(e)) {
return
}
// e.preventDefault() drop
if (!this.curComponent || (this.curComponent.component !== 'v-text' && this.curComponent.component !== 'rect-shape')) {
e.preventDefault()
@ -1259,6 +1298,9 @@ export default {
//
this.containerMouseDown(e)
},
isPageLineTarget(e) {
return e.target.classList && [...e.target.classList].includes('page-line-item')
},
hideArea() {
this.isShowArea = 0
@ -1517,6 +1559,9 @@ export default {
}
},
handleDragOver(e) {
if (!this.dragComponentInfo?.shadowStyle) {
return
}
this.dragComponentInfo.shadowStyle.x = e.pageX - 220
this.dragComponentInfo.shadowStyle.y = e.pageY - 90 + this.scrollTop
this.dragComponentInfo.style.left = this.dragComponentInfo.shadowStyle.x / this.scalePointWidth

View File

@ -0,0 +1,136 @@
<template>
<div class="page-line-container">
<div
v-for="(line, index) in lineLocations"
:key="index"
:ref="baseLineKey + index"
class="page-line-item"
:style="{'top': line + 'px', 'background': panelBg}"
@mousedown="handleMouseDown"
>
<span class="top-span" />
<span class="bottom-span" />
</div>
</div>
</template>
<script>
import { reverseColor } from '@/views/chart/chart/common/common'
export default {
name: 'PageLineEditor',
props: {
canvasStyleData: {
type: Object,
require: true
}
},
data() {
return {
baseLineKey: 'page-line-',
lineLocations: [],
curLineHeight: 0,
clientStartY: 0,
startTop: 0,
movingLineHeight: 0,
scrollHeight: 0,
baseLineColor: '#1F2329'
}
},
computed: {
windowHeight() {
return window.innerHeight - 56
},
panelBg() {
if (this.canvasStyleData.panel.backgroundType === 'color') {
return reverseColor(this.canvasStyleData.panel.color)
}
return this.baseLineColor
},
pdfPageLine() {
return this.$store.state.canvasStyleData.pdfPageLine
}
},
mounted() {
this.$nextTick(() => {
this.init()
})
},
created() {
},
methods: {
resize() {
this.$nextTick(() => {
this.init()
})
},
init(scrollHeight) {
this.lineLocations = []
this.scrollHeight = scrollHeight || document.getElementById('canvas-id-canvas-main').scrollHeight
if (this.pdfPageLine?.proportion) {
this.curLineHeight = this.pdfPageLine.proportion * this.scrollHeight
} else {
this.curLineHeight = this.windowHeight
this.saveLineHeight()
}
let curLineLocation = this.curLineHeight
while (curLineLocation < this.scrollHeight) {
this.lineLocations.push(curLineLocation)
curLineLocation += this.curLineHeight
}
},
handleMouseDown(e) {
this.clientStartY = e.clientY
this.startTop = parseInt(e.target.style.top)
document.onmousemove = ev => this.handleMouseMove(e, ev)
document.onmouseup = () => {
this.curLineHeight = this.movingLineHeight
this.saveLineHeight()
this.init()
document.onmousemove = document.onmouseup = null
}
},
handleMouseMove(e, ev) {
const moveInstance = ev.clientY - this.clientStartY
this.movingLineHeight = this.curLineHeight + moveInstance
e.target.style.top = this.startTop + moveInstance + 'px'
},
saveLineHeight() {
this.$store.commit('canvasChange')
this.canvasStyleData.pdfPageLine.proportion = this.curLineHeight / this.scrollHeight
this.pdfPageLine.proportion = this.curLineHeight / this.scrollHeight
}
}
}
</script>
<style lang="scss" scoped>
.page-line-container {
/* width: 100%;
height: 100%; */
}
.page-line-item {
height: 1px;
width: 100%;
margin: 2px 0;
position: absolute;
z-index: 999;
cursor: row-resize;
span {
width: 20px;
background: #bbb;
left: calc(50% - 5px);
height: 2px;
position: absolute;
}
.top-span {
top: -3px !important;
}
.bottom-span {
top: 3px !important;
}
}
</style>

View File

@ -112,7 +112,7 @@
style="position: absolute;right: 70px;top:15px"
>
<el-button
v-if="showChartInfoType==='enlarge' && showChartInfo && showChartInfo.type !== 'symbol-map'"
v-if="showChartInfoType==='enlarge' && hasDataPermission('export',panelInfo.privileges)&& showChartInfo && showChartInfo.type !== 'symbol-map'"
class="el-icon-picture-outline"
size="mini"
@click="exportViewImg"

View File

@ -5,7 +5,7 @@
trigger="click"
@mouseup="handleMouseUp"
>
<slot name="icon" />
<slot name="icon"/>
<el-dropdown-menu v-if="curComponent">
<el-dropdown-item
v-if="editFilter.includes(curComponent.type)"
@ -17,7 +17,8 @@
v-if="curComponent.type != 'custom-button'"
icon="el-icon-document-copy"
@click.native="copy"
><span>{{ $t('panel.copy') }}(<span v-show="systemOS==='Mac'"><i class="icon iconfont icon-command" />+ D</span> <span v-show="systemOS!=='Mac'">Control + D</span>)</span>
><span>{{ $t('panel.copy') }}&nbsp(<span v-show="systemOS==='Mac'"><i class="icon iconfont icon-command"
/>+ D</span> <span v-show="systemOS!=='Mac'">Control + D</span>)</span>
</el-dropdown-item>
<el-dropdown-item
icon="el-icon-delete"
@ -33,7 +34,7 @@
<el-dropdown-item v-if="!curComponent.auxiliaryMatrix">
<el-dropdown placement="right-start">
<span class="el-icon-copy-document">
{{ $t('panel.level') }} <i class="el-icon-arrow-right el-icon--right" />
{{ $t('panel.level') }} <i class="el-icon-arrow-right el-icon--right"/>
</span>
<el-dropdown-menu slot="dropdown">
<el-dropdown-item
@ -86,15 +87,13 @@
<el-dropdown-item
v-if="curComponent.type != 'custom-button'"
@click.native="hyperlinksSet"
>
<i class="icon iconfont icon-font icon-chaolianjie1" />
{{ $t('panel.hyperlinks') }}
><i class="icon iconfont icon-chaolianjie1"/>{{ $t('panel.hyperlinks') }}
</el-dropdown-item>
<el-dropdown-item
v-if="curComponent.type !== 'view' && !curComponent.auxiliaryMatrix"
@click.native="positionAdjust"
>
<i class="el-icon-map-location" />
<i class="el-icon-map-location"/>
{{ $t('panel.position_adjust') }}
</el-dropdown-item>
</el-dropdown-menu>

View File

@ -141,7 +141,7 @@
style="position: absolute;right: 70px;top:15px"
>
<el-button
v-if="showChartInfoType==='enlarge' && showChartInfo && showChartInfo.type !== 'symbol-map'"
v-if="showChartInfoType==='enlarge' && hasDataPermission('export',panelInfo.privileges)&& showChartInfo && showChartInfo.type !== 'symbol-map'"
class="el-icon-picture-outline"
size="mini"
@click="exportViewImg"

View File

@ -277,8 +277,8 @@ export const THEME_ATTR_TRANS_SLAVE1_BACKGROUND = {
// 移动端特殊属性
export const mobileSpecialProps = {
'lineWidth': 3, // 线宽固定值
'lineSymbolSize': 5// 折点固定值
'lineWidth': 2, // 线宽固定值
'lineSymbolSize': 8// 折点固定值
}
export function getScaleValue(propValue, scale) {

View File

@ -8,7 +8,7 @@ import {
import { ApplicationContext } from '@/utils/ApplicationContext'
import { uuid } from 'vue-uuid'
import store from '@/store'
import { AIDED_DESIGN, MOBILE_SETTING, PANEL_CHART_INFO, TAB_COMMON_STYLE } from '@/views/panel/panel'
import { AIDED_DESIGN, MOBILE_SETTING, PANEL_CHART_INFO, TAB_COMMON_STYLE, PAGE_LINE_DESIGN } from '@/views/panel/panel'
import html2canvas from 'html2canvasde'
export function deepCopy(target) {
@ -83,6 +83,7 @@ export function panelDataPrepare(componentData, componentStyle, callback) {
componentStyle.refreshUnit = (componentStyle.refreshUnit || 'minute')
componentStyle.refreshViewEnable = (componentStyle.refreshViewEnable === undefined ? true : componentStyle.refreshViewEnable)
componentStyle.aidedDesign = (componentStyle.aidedDesign || deepCopy(AIDED_DESIGN))
componentStyle.pdfPageLine = (componentStyle.pdfPageLine || deepCopy(PAGE_LINE_DESIGN))
componentStyle.chartInfo = (componentStyle.chartInfo || deepCopy(PANEL_CHART_INFO))
componentStyle.chartInfo.tabStyle = (componentStyle.chartInfo.tabStyle || deepCopy(TAB_COMMON_STYLE))
componentStyle.themeId = (componentStyle.themeId || 'NO_THEME')

View File

@ -157,6 +157,7 @@ export default {
this.element.options.attrs.fieldId.length > 0 &&
method(param).then(res => {
this.data = this.optionData(res.data)
this.clearDefault(this.data)
bus.$emit('valid-values-change', true)
}).catch(e => {
bus.$emit('valid-values-change', false)
@ -228,6 +229,27 @@ export default {
bus.$off('reset-default-value', this.resetDefaultValue)
},
methods: {
clearDefault(optionList) {
const emptyOption = !optionList?.length
if (!this.inDraw && this.element.options.value) {
if (Array.isArray(this.element.options.value)) {
if (emptyOption) {
this.element.options.value = []
return
}
const tempValueArray = JSON.parse(JSON.stringify(this.element.options.value))
this.element.options.value = tempValueArray.filter(item => optionList.some(option => option === item))
} else {
if (emptyOption) {
this.element.options.value = ''
return
}
const tempValueArray = JSON.parse(JSON.stringify(this.element.options.value.split(',')))
this.element.options.value = tempValueArray.filter(item => optionList.some(option => option === item)).join(',')
}
}
},
clearHandler() {
this.value = this.element.options.attrs.multiple ? [] : null
this.$refs.deSelect && this.$refs.deSelect.resetSelectAll && this.$refs.deSelect.resetSelectAll()

View File

@ -179,6 +179,7 @@ export default {
this.element.options.attrs.fieldId.length > 0 &&
method(param).then(res => {
this.data = this.optionData(res.data)
this.clearDefault(this.data)
this.changeInputStyle()
if (this.element.options.attrs.multiple) {
this.checkAll = this.value.length === this.data.length
@ -250,6 +251,27 @@ export default {
bus.$off('reset-default-value', this.resetDefaultValue)
},
methods: {
clearDefault(optionList) {
const emptyOption = !optionList?.length
if (!this.inDraw && this.element.options.value) {
if (Array.isArray(this.element.options.value)) {
if (emptyOption) {
this.element.options.value = []
return
}
const tempValueArray = JSON.parse(JSON.stringify(this.element.options.value))
this.element.options.value = tempValueArray.filter(item => optionList.some(option => option === item))
} else {
if (emptyOption) {
this.element.options.value = ''
return
}
const tempValueArray = JSON.parse(JSON.stringify(this.element.options.value.split(',')))
this.element.options.value = tempValueArray.filter(item => optionList.some(option => option === item)).join(',')
}
}
},
clearHandler() {
this.value = this.element.options.attrs.multiple ? [] : null
this.checkAll = false

View File

@ -0,0 +1,3 @@
<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M1.16428 9.00002H18.8354C19.1103 9.00002 19.3332 9.22388 19.3332 9.50002V10.5C19.3332 10.7762 19.1103 11 18.8354 11H1.16428C0.889367 11 0.666504 10.7762 0.666504 10.5V9.50002C0.666504 9.22388 0.889367 9.00002 1.16428 9.00002ZM1.16428 0.666687H4.16452C4.43943 0.666687 4.66229 0.890545 4.66229 1.16669V2.16669C4.66229 2.44283 4.43943 2.66669 4.16452 2.66669H1.16428C0.889367 2.66669 0.666504 2.44283 0.666504 2.16669V1.16669C0.666504 0.890545 0.889367 0.666687 1.16428 0.666687ZM8.50118 0.666687H11.5014C11.7763 0.666687 11.9992 0.890545 11.9992 1.16669V2.16669C11.9992 2.44283 11.7763 2.66669 11.5014 2.66669H8.50118C8.22626 2.66669 8.0034 2.44283 8.0034 2.16669V1.16669C8.0034 0.890545 8.22626 0.666687 8.50118 0.666687ZM15.8309 0.666687H18.8312C19.1061 0.666687 19.329 0.890545 19.329 1.16669V2.16669C19.329 2.44283 19.1061 2.66669 18.8312 2.66669H15.8309C15.556 2.66669 15.3332 2.44283 15.3332 2.16669V1.16669C15.3332 0.890545 15.556 0.666687 15.8309 0.666687ZM1.16428 17.3348H4.16452C4.43943 17.3348 4.66229 17.5587 4.66229 17.8348V18.8348C4.66229 19.111 4.43943 19.3348 4.16452 19.3348H1.16428C0.889367 19.3348 0.666504 19.111 0.666504 18.8348V17.8348C0.666504 17.5587 0.889367 17.3348 1.16428 17.3348ZM8.50118 17.3348H11.5014C11.7763 17.3348 11.9992 17.5587 11.9992 17.8348V18.8348C11.9992 19.111 11.7763 19.3348 11.5014 19.3348H8.50118C8.22626 19.3348 8.0034 19.111 8.0034 18.8348V17.8348C8.0034 17.5587 8.22626 17.3348 8.50118 17.3348ZM15.8309 17.3348H18.8312C19.1061 17.3348 19.329 17.5587 19.329 17.8348V18.8348C19.329 19.111 19.1061 19.3348 18.8312 19.3348H15.8309C15.556 19.3348 15.3332 19.111 15.3332 18.8348V17.8348C15.3332 17.5587 15.556 17.3348 15.8309 17.3348Z" fill="#1F2329"/>
</svg>

After

Width:  |  Height:  |  Size: 1.8 KiB

View File

@ -1509,7 +1509,14 @@ export default {
Line (area) chart, Column (Bar) chart, Dashboard: {a} is series name, {b} is category value, {c} is value<br>
Pie chart, Funnel chart: {a} is series name, {b} is data item name, {c} is value, {d} is percentage<br>
Map : {a} (series name), {b} is area name, {c} is merged values, {d} is none<br>
Scatter (Bubble) plot: {a} is series name, {b} is data name, {c} is numeric array, {d} is none`
Scatter (Bubble) plot: {a} is series name, {b} is data name, {c} is numeric array, {d} is none`,
h_position: 'Horizontal Position',
v_position: 'Vertical Position',
p_left: 'Left',
p_right: 'Right',
p_top: 'Top',
p_bottom: 'Bottom',
p_center: 'Center'
},
dataset: {
spend_time: 'Spend',
@ -2244,6 +2251,8 @@ export default {
aided_grid: 'Aided Grid',
aided_grid_open: 'Open',
aided_grid_close: 'Close',
export_pdf_page: 'Pagination Line',
export_pdf_page_remark: 'Only valid for API export dashboard PDF pagination',
subject_no_edit: 'System Subject Can Not Edit',
subject_name_not_null: 'Subject Name Can Not Be Null And Less Than 20 charts',
is_enable: 'Enable',

View File

@ -1503,7 +1503,14 @@ export default {
折線區域柱狀條形儀表盤 : {a}系列名稱{b}類目值{c}數值<br>
餅圖漏鬥圖: {a}系列名稱{b}數據項名稱{c}數值, {d}百分比<br>
地圖 : {a}系列名稱{b}區域名稱{c}合並數值, {d}<br>
散點圖氣泡 : {a}系列名稱{b}數據名稱{c}數值數組, {d}`
散點圖氣泡 : {a}系列名稱{b}數據名稱{c}數值數組, {d}`,
h_position: '水平位置',
v_position: '垂直位置',
p_left: '左對齊',
p_right: '右對齊',
p_top: '上對齊',
p_bottom: '下對齊',
p_center: '居中'
},
dataset: {
spend_time: '耗時',
@ -2238,6 +2245,8 @@ export default {
aided_grid: '輔助設計網格',
aided_grid_open: '打開',
aided_grid_close: '關閉',
export_pdf_page: '分頁線',
export_pdf_page_remark: '僅對API導出儀表板PDF分頁有效',
subject_no_edit: '繫統主題不能修改',
subject_name_not_null: '主題名稱需要1~20字符',
is_enable: '是否啟用',

View File

@ -1502,7 +1502,14 @@ export default {
折线区域柱状条形仪表盘 : {a}系列名称{b}类目值{c}数值<br>
饼图漏斗图: {a}系列名称{b}数据项名称{c}数值, {d}百分比<br>
地图 : {a}系列名称{b}区域名称{c}合并数值, {d}<br>
散点图气泡 : {a}系列名称{b}数据名称{c}数值数组, {d}`
散点图气泡 : {a}系列名称{b}数据名称{c}数值数组, {d}`,
h_position: '水平位置',
v_position: '垂直位置',
p_left: '左对齐',
p_right: '右对齐',
p_top: '上对齐',
p_bottom: '下对齐',
p_center: '居中'
},
dataset: {
spend_time: '耗时',
@ -2238,6 +2245,8 @@ export default {
aided_grid: '辅助设计网格',
aided_grid_open: '打开',
aided_grid_close: '关闭',
export_pdf_page: '分页线',
export_pdf_page_remark: '仅对API导出仪表板PDF分页有效',
subject_no_edit: '系统主题不能修改',
subject_name_not_null: '主题名称需要1~20字符',
is_enable: '是否启用',

View File

@ -127,7 +127,9 @@ export const DEFAULT_SIZE = {
symbolOpacity: 0.7,
symbolStrokeWidth: 2,
showIndex: false,
indexLabel: '序号'
indexLabel: '序号',
hPosition: 'center',
vPosition: 'center'
}
export const DEFAULT_SUSPENSION = {
show: true

View File

@ -206,7 +206,9 @@ export const TYPE_CONFIGS = [
'dimensionFontStyle',
'dimensionLetterSpace',
'dimensionFontShadow',
'spaceSplit'
'spaceSplit',
'hPosition',
'vPosition'
],
'title-selector-ant-v': [
'show',
@ -251,7 +253,9 @@ export const TYPE_CONFIGS = [
'dimensionFontStyle',
'dimensionLetterSpace',
'dimensionFontShadow',
'spaceSplit'
'spaceSplit',
'hPosition',
'vPosition'
],
'title-selector-ant-v': [
'show',
@ -1939,7 +1943,9 @@ export const TYPE_CONFIGS = [
'dimensionFontStyle',
'dimensionLetterSpace',
'dimensionFontShadow',
'spaceSplit'
'spaceSplit',
'hPosition',
'vPosition'
],
'title-selector': [
'show',
@ -1984,7 +1990,9 @@ export const TYPE_CONFIGS = [
'dimensionFontStyle',
'dimensionLetterSpace',
'dimensionFontShadow',
'spaceSplit'
'spaceSplit',
'hPosition',
'vPosition'
],
'title-selector': [
'show',

View File

@ -189,6 +189,9 @@ export default {
this.label_content_class.letterSpacing = (customAttr.size.quotaLetterSpace ? customAttr.size.quotaLetterSpace : DEFAULT_SIZE.quotaLetterSpace) + 'px'
this.label_content_class.textShadow = customAttr.size.quotaFontShadow ? '2px 2px 4px' : 'none'
this.content_class.alignItems = customAttr.size.hPosition ? customAttr.size.hPosition : DEFAULT_SIZE.hPosition
this.content_class.justifyContent = customAttr.size.vPosition ? customAttr.size.vPosition : DEFAULT_SIZE.vPosition
if (!this.dimensionShow) {
this.label_space.marginTop = '0px'
} else {

View File

@ -216,6 +216,9 @@ export default {
this.label_content_class.letterSpacing = (customAttr.size.quotaLetterSpace ? customAttr.size.quotaLetterSpace : DEFAULT_SIZE.quotaLetterSpace) + 'px'
this.label_content_class.textShadow = customAttr.size.quotaFontShadow ? '2px 2px 4px' : 'none'
this.content_class.alignItems = customAttr.size.hPosition ? customAttr.size.hPosition : DEFAULT_SIZE.hPosition
this.content_class.justifyContent = customAttr.size.vPosition ? customAttr.size.vPosition : DEFAULT_SIZE.vPosition
if (!this.dimensionShow) {
this.label_space.marginTop = '0px'
} else {

View File

@ -634,6 +634,54 @@
@change="changeBarSizeCase('spaceSplit')"
/>
</el-form-item>
<el-form-item
v-show="showProperty('hPosition')"
:label="$t('chart.h_position')"
class="form-item"
>
<el-select
v-model="sizeForm.hPosition"
:placeholder="$t('chart.h_position')"
@change="changeBarSizeCase('hPosition')"
>
<el-option
value="start"
:label="$t('chart.p_left')"
>{{ $t('chart.p_left') }}</el-option>
<el-option
value="center"
:label="$t('chart.p_center')"
>{{ $t('chart.p_center') }}</el-option>
<el-option
value="end"
:label="$t('chart.p_right')"
>{{ $t('chart.p_right') }}</el-option>
</el-select>
</el-form-item>
<el-form-item
v-show="showProperty('vPosition')"
:label="$t('chart.v_position')"
class="form-item"
>
<el-select
v-model="sizeForm.vPosition"
:placeholder="$t('chart.v_position')"
@change="changeBarSizeCase('vPosition')"
>
<el-option
value="start"
:label="$t('chart.p_top')"
>{{ $t('chart.p_top') }}</el-option>
<el-option
value="center"
:label="$t('chart.p_center')"
>{{ $t('chart.p_center') }}</el-option>
<el-option
value="end"
:label="$t('chart.p_bottom')"
>{{ $t('chart.p_bottom') }}</el-option>
</el-select>
</el-form-item>
</div>
<!--text&label-end-->
<!--scatter-begin-->
@ -1076,6 +1124,9 @@ export default {
this.sizeForm.dimensionFontIsItalic = this.sizeForm.dimensionFontIsItalic ? this.sizeForm.dimensionFontIsItalic : DEFAULT_SIZE.dimensionFontIsItalic
this.sizeForm.dimensionLetterSpace = this.sizeForm.dimensionLetterSpace ? this.sizeForm.dimensionLetterSpace : DEFAULT_SIZE.dimensionLetterSpace
this.sizeForm.dimensionFontShadow = this.sizeForm.dimensionFontShadow ? this.sizeForm.dimensionFontShadow : DEFAULT_SIZE.dimensionFontShadow
this.sizeForm.hPosition = this.sizeForm.hPosition ? this.sizeForm.hPosition : DEFAULT_SIZE.hPosition
this.sizeForm.vPosition = this.sizeForm.vPosition ? this.sizeForm.vPosition : DEFAULT_SIZE.vPosition
}
}
},

View File

@ -984,6 +984,54 @@
@change="changeBarSizeCase('spaceSplit')"
/>
</el-form-item>
<el-form-item
v-show="showProperty('hPosition')"
:label="$t('chart.h_position')"
class="form-item"
>
<el-select
v-model="sizeForm.hPosition"
:placeholder="$t('chart.h_position')"
@change="changeBarSizeCase('hPosition')"
>
<el-option
value="start"
:label="$t('chart.p_left')"
>{{ $t('chart.p_left') }}</el-option>
<el-option
value="center"
:label="$t('chart.p_center')"
>{{ $t('chart.p_center') }}</el-option>
<el-option
value="end"
:label="$t('chart.p_right')"
>{{ $t('chart.p_right') }}</el-option>
</el-select>
</el-form-item>
<el-form-item
v-show="showProperty('vPosition')"
:label="$t('chart.v_position')"
class="form-item"
>
<el-select
v-model="sizeForm.vPosition"
:placeholder="$t('chart.v_position')"
@change="changeBarSizeCase('vPosition')"
>
<el-option
value="start"
:label="$t('chart.p_top')"
>{{ $t('chart.p_top') }}</el-option>
<el-option
value="center"
:label="$t('chart.p_center')"
>{{ $t('chart.p_center') }}</el-option>
<el-option
value="end"
:label="$t('chart.p_bottom')"
>{{ $t('chart.p_bottom') }}</el-option>
</el-select>
</el-form-item>
</div>
<!--text&label-end-->
<!--scatter-begin-->
@ -1384,6 +1432,9 @@ export default {
this.sizeForm.dimensionFontIsItalic = this.sizeForm.dimensionFontIsItalic ? this.sizeForm.dimensionFontIsItalic : DEFAULT_SIZE.dimensionFontIsItalic
this.sizeForm.dimensionLetterSpace = this.sizeForm.dimensionLetterSpace ? this.sizeForm.dimensionLetterSpace : DEFAULT_SIZE.dimensionLetterSpace
this.sizeForm.dimensionFontShadow = this.sizeForm.dimensionFontShadow ? this.sizeForm.dimensionFontShadow : DEFAULT_SIZE.dimensionFontShadow
this.sizeForm.hPosition = this.sizeForm.hPosition ? this.sizeForm.hPosition : DEFAULT_SIZE.hPosition
this.sizeForm.vPosition = this.sizeForm.vPosition ? this.sizeForm.vPosition : DEFAULT_SIZE.vPosition
}
}
},

View File

@ -250,8 +250,8 @@ export default {
}
li.select {
background: var(--deWhiteHover, #3370ff);
color: var(--TextActive, #f4f4f5);
background: var(--deWhiteHover, #ecf5ff) !important;
color: var(--TextActive, #3370ff) !important;
}
.de-btn-fix {

View File

@ -201,8 +201,8 @@ export default {
}
li.select {
background: var(--deWhiteHover, #3370ff);
color: var(--TextActive, #f4f4f5);
background: var(--deWhiteHover, #ecf5ff) !important;
color: var(--TextActive, #3370ff) !important;
}
.de-btn-fix {

View File

@ -165,12 +165,12 @@
v-show=" show &&showIndex===1"
:canvas-id="canvasId"
/>
<subject-setting v-show=" show &&showIndex===2" />
<assist-component v-show=" show &&showIndex===3" />
<subject-setting v-show=" show &&showIndex===2"/>
<assist-component v-show=" show &&showIndex===3"/>
</div>
</el-drawer>
<!--PC端画布区域-->
<canvas-opt-bar v-if="!previewVisible&&!mobileLayoutStatus" />
<canvas-opt-bar v-if="!previewVisible&&!mobileLayoutStatus"/>
<de-canvas
v-if="!previewVisible&&!mobileLayoutStatus"
ref="canvasMainRef"
@ -196,7 +196,7 @@
:style="customCanvasMobileStyle"
class="this_mobile_canvas"
>
<el-row class="this_mobile_canvas_top" />
<el-row class="this_mobile_canvas_top"/>
<el-row class="this_mobile_canvas_inner_top">
{{ panelInfo.name }}
</el-row>
@ -205,7 +205,7 @@
class="this_mobile_canvas_main"
:style="mobileCanvasStyle"
>
<canvas-opt-bar v-if="!previewVisible&&mobileLayoutStatus" />
<canvas-opt-bar v-if="!previewVisible&&mobileLayoutStatus"/>
<de-canvas
v-if="!previewVisible&&mobileLayoutStatus"
ref="canvasMainRef"
@ -243,14 +243,14 @@
/>
</el-col>
</el-row>
<el-row class="this_mobile_canvas_bottom" />
<el-row class="this_mobile_canvas_bottom"/>
</div>
</el-col>
<el-col
:span="16"
class="this_mobile_canvas_cell this_mobile_canvas_wait_cell"
>
<component-wait />
<component-wait/>
</el-col>
</el-row>
</de-main-container>
@ -268,7 +268,7 @@
/>
</div>
<div v-if="showBatchViewToolsAside">
<chart-style-batch-set />
<chart-style-batch-set/>
</div>
<div v-if="!showViewToolsAside&&!showBatchViewToolsAside">
<el-row style="height: 40px">
@ -287,7 +287,7 @@
>{{ $t('panel.position_adjust') }}</span>
</el-row>
<el-row>
<position-adjust v-if="curComponent&&!curComponent.auxiliaryMatrix" />
<position-adjust v-if="curComponent&&!curComponent.auxiliaryMatrix"/>
<div
v-else
class="view-selected-message-class"
@ -792,6 +792,9 @@ export default {
},
previewVisible(val) {
this.$store.commit('setPreviewVisible', val)
if (!val) {
listenGlobalKeyDown()
}
},
panelInfo: {
handler(newVal, oldVla) {

View File

@ -61,7 +61,6 @@
<span
slot-scope="{ node, data }"
style="display: flex;flex: 1;width: 0%;"
class="custom-tree-node"
>
<span>
<svg-icon

View File

@ -69,6 +69,10 @@ export const CANVAS_STYLE = {
showGrid: false,
matrixBase: 4 // 当前matrix的基数 是pcMatrixCount的几倍
}, // 辅助设计
pdfPageLine: {
showPageLine: false,
proportion: null
},
refreshViewEnable: true, // 开启视图刷新(默认开启)
refreshViewLoading: true, // 仪表板视图loading提示
refreshUnit: 'minute', // 仪表板刷新时间带外 默认 分钟
@ -82,6 +86,11 @@ export const AIDED_DESIGN = {
matrixBase: 1 // 当前matrix的基数 是pcMatrixCount的几倍
}
export const PAGE_LINE_DESIGN = {
showPageLine: false,
proportion: null
}
export const DEFAULT_COMMON_CANVAS_STYLE_STRING = {
...CANVAS_STYLE
}

View File

@ -253,8 +253,8 @@ export default {
}
li.select {
background: var(--deWhiteHover, #3370ff);
color: var(--TextActive, #f4f4f5);
background: var(--deWhiteHover, #ecf5ff) !important;
color: var(--TextActive, #3370ff) !important;
}
.de-btn-fix {

View File

@ -1,6 +1,9 @@
<template>
<div style="width: 100%;display: flex;justify-content: center;">
<el-card class="box-card about-card">
<el-card
class="box-card about-card"
:class="dynamicCardClass"
>
<div
slot="header"
class="clearfix license-header"
@ -110,6 +113,15 @@ export default {
}
},
computed: {
dynamicCardClass() {
if (this.license?.serialNo && this.license?.remark) {
return 'about-card-max'
}
if (!this.license?.serialNo && !this.license?.remark) {
return ''
}
return 'about-card-medium'
},
...mapGetters([
'user'
])
@ -202,6 +214,12 @@ export default {
padding: 0;
}
}
.about-card-medium {
height: 415px !important;
}
.about-card-max {
height: 430px !important;
}
.license-header {
height: 100px;
background-image: url('../../../assets/license_header.png');

View File

@ -32,17 +32,17 @@ export default {
},
watch: {
chartSize: {
handler(val) {
if (this.myChart) {
this.myChart.resize(val)
}
},
deep: true
handler(val) {
if (this.myChart) {
this.myChart.resize(val)
}
},
deep: true
}
},
methods: {
getChartData(current) {
this.current = {...current}
this.current = { ...current }
const { queryType, num: id } = current
this.activeId = id
switch (queryType) {
@ -52,9 +52,14 @@ export default {
case 'dataset':
this.getDatasetRelationship(id)
break
case 'panel':
this.getPanelRelationship(id)
case 'panel': {
let targetId = id
if (current.nodeData?.source) {
targetId = current.nodeData.source
}
this.getPanelRelationship(targetId)
break
}
default:
break
}
@ -485,4 +490,4 @@ export default {
}
}
}
</script>
</script>

View File

@ -39,6 +39,7 @@
placement="bottom"
trigger="manual"
:width="popoverSize"
popper-class="relation-popover"
>
<el-tree
v-show="showTree"
@ -229,7 +230,8 @@ export default {
return {
queryType: this.formInline.queryType,
num: this.formInline.dataSourceName,
label: this.nodeData.name
label: this.nodeData.name,
nodeData: this.nodeData
}
},
queryTypeTitle() {
@ -304,9 +306,14 @@ export default {
case 'dataset':
this.getDatasetRelationship(id)
break
case 'panel':
this.getPanelRelationship(id)
case 'panel': {
let targetId = id
if (this.nodeData.source) {
targetId = this.nodeData.source
}
this.getPanelRelationship(targetId)
break
}
default:
break
}
@ -630,4 +637,8 @@ export default {
/*display: inline;*/
visibility: visible;
}
.relation-popover {
max-height: 70%;
overflow-y: scroll;
}
</style>