Merge branch 'dev' into pr@dev@pages
This commit is contained in:
commit
3a18e25b86
@ -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>
|
||||
|
||||
|
||||
@ -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) {
|
||||
|
||||
@ -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;
|
||||
}
|
||||
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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())) {
|
||||
|
||||
@ -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;
|
||||
}
|
||||
|
||||
|
||||
@ -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)
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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)
|
||||
|
||||
@ -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'
|
||||
}
|
||||
}
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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>
|
||||
@ -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"
|
||||
|
||||
@ -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') }} (<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>
|
||||
|
||||
@ -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"
|
||||
|
||||
@ -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) {
|
||||
|
||||
@ -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')
|
||||
|
||||
@ -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()
|
||||
|
||||
@ -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
|
||||
|
||||
3
frontend/src/icons/svg/page-line.svg
Normal file
3
frontend/src/icons/svg/page-line.svg
Normal 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 |
@ -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',
|
||||
|
||||
@ -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: '是否啟用',
|
||||
|
||||
@ -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: '是否启用',
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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',
|
||||
|
||||
@ -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 {
|
||||
|
||||
@ -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 {
|
||||
|
||||
@ -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
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
@ -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
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
@ -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 {
|
||||
|
||||
@ -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 {
|
||||
|
||||
@ -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) {
|
||||
|
||||
@ -61,7 +61,6 @@
|
||||
<span
|
||||
slot-scope="{ node, data }"
|
||||
style="display: flex;flex: 1;width: 0%;"
|
||||
class="custom-tree-node"
|
||||
>
|
||||
<span>
|
||||
<svg-icon
|
||||
|
||||
@ -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
|
||||
}
|
||||
|
||||
@ -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 {
|
||||
|
||||
@ -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');
|
||||
|
||||
@ -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>
|
||||
|
||||
@ -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>
|
||||
|
||||
Loading…
Reference in New Issue
Block a user