Browse Source

Pull request #14790: REPORT-132414 & REPORT-132506 优化菜单入口修复弹窗等

Merge in DESIGN/design from ~VITO/c-design:fbp/release to fbp/release

* commit 'eeaf130d80e84a9b67b6034f761fb05d20c7c487':
  无jira任务 删多了
  REPORT-132414 & REPORT-132506  优化菜单入口修复弹窗等
fbp/release
vito-刘恒霖 2 months ago
parent
commit
4b1b0cc962
  1. 59
      designer-base/src/main/java/com/fr/design/data/tabledata/datacenter/DCTableDataPane.java
  2. 46
      designer-base/src/main/java/com/fr/design/data/tabledata/tabledatapane/TableDataPaneHelper.java
  3. 14
      designer-base/src/main/java/com/fr/design/data/tabledata/wrapper/TableDataFactory.java
  4. 17
      designer-base/src/main/java/com/fr/design/gui/controlpane/JControlUpdatePane.java
  5. 21
      designer-base/src/main/java/com/fr/design/jxbrowser/JxUIPane.java
  6. 29
      designer-base/src/test/java/com/fr/design/ui/report/ReportServerParamDemo.java

59
designer-base/src/main/java/com/fr/design/data/tabledata/datacenter/DCTableDataPane.java

@ -6,8 +6,6 @@ import com.fr.datacenters.tabledata.bean.DCNameBean;
import com.fr.datacenters.tabledata.bean.DCTableDataBean; import com.fr.datacenters.tabledata.bean.DCTableDataBean;
import com.fr.design.data.DesignTableDataManager; import com.fr.design.data.DesignTableDataManager;
import com.fr.design.data.tabledata.tabledatapane.AbstractTableDataPane; import com.fr.design.data.tabledata.tabledatapane.AbstractTableDataPane;
import com.fr.design.dialog.DialogActionListener;
import com.fr.design.dialog.UIDialog;
import com.fr.design.i18n.Toolkit; import com.fr.design.i18n.Toolkit;
import com.fr.design.jxbrowser.JxEngine; import com.fr.design.jxbrowser.JxEngine;
import com.fr.design.jxbrowser.JxUIPane; import com.fr.design.jxbrowser.JxUIPane;
@ -15,15 +13,13 @@ import com.fr.json.revise.EmbedJson;
import com.fr.stable.StringUtils; import com.fr.stable.StringUtils;
import com.fr.third.guava.collect.ImmutableMap; import com.fr.third.guava.collect.ImmutableMap;
import com.fr.workspace.WorkContext; import com.fr.workspace.WorkContext;
import com.teamdev.jxbrowser.browser.callback.InjectJsCallback;
import javax.swing.SwingUtilities;
import java.awt.BorderLayout; import java.awt.BorderLayout;
import java.awt.Window;
import java.util.Arrays; import java.util.Arrays;
import static com.fr.design.ui.ModernUIConstants.DOT; import static com.fr.design.ui.ModernUIConstants.DOT;
import static com.fr.design.ui.ModernUIConstants.WINDOW; import static com.fr.design.ui.ModernUIConstants.EMB_TAG;
import static com.fr.design.ui.ModernUIConstants.SCHEME_HEADER;
/** /**
* 数据中心数据集面板 * 数据中心数据集面板
@ -38,26 +34,40 @@ public class DCTableDataPane extends AbstractTableDataPane<DCTableData> {
private static final String DATA_CENTER = "dc"; private static final String DATA_CENTER = "dc";
private static final String DATA_CENTER_HELPER = "dcHelper"; private static final String DATA_CENTER_HELPER = "dcHelper";
private static final String DATA_CENTER_INJECT_URL = "fineServletURL";
private static final String DC_INDEX_HTML = "com/fr/design/data/tabledata/datacenter/web/data-choose.prod.html";
private final JxUIPane<String> dataCenterJxUIPane; private final JxUIPane<String> dataCenterJxUIPane;
private JxTableDataNamePane namePane; private final JxTableDataNamePane namePane = new JxTableDataNamePane(this);
// 用于复制粘贴场景 // 用于复制粘贴场景
private DCTableData dcTableData; private DCTableData dcTableData;
/**
* 用于创建带有名称的面板
*
* @param name 名称
*/
public DCTableDataPane(String name) {
this();
namePane.setObjectName(name);
}
public DCTableDataPane() { public DCTableDataPane() {
setLayout(new BorderLayout()); setLayout(new BorderLayout());
dataCenterJxUIPane = getJxUIPane(); dataCenterJxUIPane = getJxUIPane();
add(dataCenterJxUIPane, BorderLayout.CENTER); add(dataCenterJxUIPane, BorderLayout.CENTER);
dataCenterJxUIPane.addXHRHeaders(ImmutableMap.of("Authorization", dataCenterJxUIPane.addXHRHeaders(ImmutableMap.of("Authorization",
WorkContext.getCurrent().getConnection().getToken())); WorkContext.getCurrent().getConnection().getToken()));
// 关联 bridge 和 pane
DCTableDataJSBridge.relationPanel(this);
} }
private static JxUIPane<String> getJxUIPane() { private static JxUIPane<String> getJxUIPane() {
return new JxUIPane.Builder<String>() return new JxUIPane.Builder<String>()
.engine(JX_ENGINE) .engine(JX_ENGINE)
.namespace(DATA_CENTER) .namespace(DATA_CENTER)
.bindWindow(DATA_CENTER_HELPER, DCTableDataJSBridge::getBridge) .bindWindow(DATA_CENTER_HELPER, DCTableDataJSBridge::getBridge)
.withEMB("com/fr/design/data/tabledata/datacenter/web/data-choose.prod.html", .withEMB(DC_INDEX_HTML, ImmutableMap.of(DATA_CENTER_INJECT_URL, getDatacentersUrl()))
ImmutableMap.of("fineServletURL", getDatacentersUrl()))
.build(); .build();
} }
@ -72,17 +82,37 @@ public class DCTableDataPane extends AbstractTableDataPane<DCTableData> {
@Override @Override
public NamePane asNamePane() { public NamePane asNamePane() {
return namePane = new JxTableDataNamePane(this); return namePane;
} }
@Override @Override
public void populateBean(DCTableData ob) { public void populateBean(DCTableData ob) {
DCTableDataJSBridge.relationPanel(this); reload();
dcTableData = ob; dcTableData = ob;
dataCenterJxUIPane.populate(EmbedJson.encode(ob.toBean())); updateTableDataName(dcTableData, namePane.getObjectName());
dataCenterJxUIPane.populate(EmbedJson.encode(dcTableData.toBean()));
setDatasetNames(dcTableData);
}
private void reload() {
dataCenterJxUIPane.redirect(EMB_TAG + SCHEME_HEADER + DC_INDEX_HTML,
ImmutableMap.of(DATA_CENTER_INJECT_URL, getDatacentersUrl()));
}
private static void updateTableDataName(DCTableData dcTableData, String name) {
if (StringUtils.isNotBlank(name)) {
dcTableData.setDsName(name);
dcTableData.setName(name);
}
}
private void setDatasetNames(DCTableData ob) {
String[] allDSNames = DesignTableDataManager.getAllDSNames(DesignTableDataManager.getEditingTableDataSource()); String[] allDSNames = DesignTableDataManager.getAllDSNames(DesignTableDataManager.getEditingTableDataSource());
dataCenterJxUIPane.executeJS(DATA_CENTER + DOT + "datasetNames=" + EmbedJson.encode(allDSNames)); String[] allName = Arrays.stream(allDSNames)
.filter(name -> !ob.getDsName().equals(name))
.toArray(String[]::new);
dataCenterJxUIPane.executeJS(DATA_CENTER + DOT + "datasetNames=" + EmbedJson.encode(allName));
} }
@ -95,8 +125,7 @@ public class DCTableDataPane extends AbstractTableDataPane<DCTableData> {
return DCTableData.fromBean(tableDataBean); return DCTableData.fromBean(tableDataBean);
} else { } else {
// 复制的场景下,不打开界面需要返回数据集,需同步面板的名称 // 复制的场景下,不打开界面需要返回数据集,需同步面板的名称
dcTableData.setDsName(namePane.getObjectName()); updateTableDataName(dcTableData, namePane.getObjectName());
dcTableData.setName(namePane.getObjectName());
return dcTableData; return dcTableData;
} }
} }

46
designer-base/src/main/java/com/fr/design/data/tabledata/tabledatapane/TableDataPaneHelper.java

@ -0,0 +1,46 @@
package com.fr.design.data.tabledata.tabledatapane;
import com.fr.base.AbstractTableData;
import com.fr.design.data.tabledata.datacenter.DCTableDataPane;
import com.fr.third.guava.collect.Sets;
import java.util.Set;
/**
* 数据集面板帮助类
*
* @author vito
* @since 11.0
* Created on 2024/9/10
*/
public class TableDataPaneHelper {
/**
* 标记优先使用带名称的构造方法
*/
private final static Set<Class<? extends AbstractTableDataPane<? extends AbstractTableData>>> NAMED_TABLE_DATA_PANE =
Sets.newHashSet(
MultiTDTableDataPane.class,
GlobalMultiTDTableDataPane.class,
TreeTableDataPane.class,
GlobalTreeTableDataPane.class,
DCTableDataPane.class);
/**
* 是否为带名称的数据集面板
*
* @param tableDataPaneClass 数据集面板类
* @return 是否为带名称的数据集面板
*/
public static boolean isNamedTableDataPane(Class<?> tableDataPaneClass) {
return NAMED_TABLE_DATA_PANE.contains(tableDataPaneClass);
}
/**
* 注册需要名称的数据集面板
*
* @param tableDataPaneClass 数据集面板类
*/
public static void registerNamedTableDataPane(Class<? extends AbstractTableDataPane<? extends AbstractTableData>> tableDataPaneClass) {
NAMED_TABLE_DATA_PANE.add(tableDataPaneClass);
}
}

14
designer-base/src/main/java/com/fr/design/data/tabledata/wrapper/TableDataFactory.java

@ -16,6 +16,7 @@ import com.fr.datacenters.tabledata.DCTableData;
import com.fr.decision.webservice.bean.dataset.ServerDataSetBean; import com.fr.decision.webservice.bean.dataset.ServerDataSetBean;
import com.fr.design.data.datapane.TableDataNameObjectCreator; import com.fr.design.data.datapane.TableDataNameObjectCreator;
import com.fr.design.data.datapane.preview.ConnectionInfoBeanHelper; import com.fr.design.data.datapane.preview.ConnectionInfoBeanHelper;
import com.fr.design.data.datapane.preview.TableDataBeanHelper;
import com.fr.design.data.tabledata.datacenter.DCTableDataPane; import com.fr.design.data.tabledata.datacenter.DCTableDataPane;
import com.fr.design.data.tabledata.tabledatapane.AbstractTableDataPane; import com.fr.design.data.tabledata.tabledatapane.AbstractTableDataPane;
import com.fr.design.data.tabledata.tabledatapane.ClassTableDataPane; import com.fr.design.data.tabledata.tabledatapane.ClassTableDataPane;
@ -25,13 +26,12 @@ import com.fr.design.data.tabledata.tabledatapane.EmbeddedTableDataPane;
import com.fr.design.data.tabledata.tabledatapane.FileTableDataPane; import com.fr.design.data.tabledata.tabledatapane.FileTableDataPane;
import com.fr.design.data.tabledata.tabledatapane.MultiTDTableDataPane; import com.fr.design.data.tabledata.tabledatapane.MultiTDTableDataPane;
import com.fr.design.data.tabledata.tabledatapane.ProcedureDataPane; import com.fr.design.data.tabledata.tabledatapane.ProcedureDataPane;
import com.fr.design.data.tabledata.tabledatapane.TableDataPaneHelper;
import com.fr.design.data.tabledata.tabledatapane.TreeTableDataPane; import com.fr.design.data.tabledata.tabledatapane.TreeTableDataPane;
import com.fr.general.ComparatorUtils;
import com.fr.log.FineLoggerFactory; import com.fr.log.FineLoggerFactory;
import com.fr.stable.ArrayUtils; import com.fr.stable.ArrayUtils;
import com.fr.stable.StringUtils; import com.fr.stable.StringUtils;
import com.fr.workspace.server.repository.connection.ConnectionRepository; import com.fr.workspace.server.repository.connection.ConnectionRepository;
import com.fr.design.data.datapane.preview.TableDataBeanHelper;
import com.fr.workspace.server.repository.tabledata.TableDataRepository; import com.fr.workspace.server.repository.tabledata.TableDataRepository;
import javax.swing.Icon; import javax.swing.Icon;
@ -56,7 +56,7 @@ public abstract class TableDataFactory {
/** /**
* 有顺序的,用来排序用 * 有顺序的,用来排序用
*/ */
private static Map<String, TableDataNameObjectCreator> map = new java.util.LinkedHashMap<>(); private static Map<String, TableDataNameObjectCreator> map = new LinkedHashMap<>();
private static Map<String, TableDataNameObjectCreator> defaultMap = new LinkedHashMap<>(); private static Map<String, TableDataNameObjectCreator> defaultMap = new LinkedHashMap<>();
@ -129,12 +129,12 @@ public abstract class TableDataFactory {
AbstractTableDataPane datapane = null; AbstractTableDataPane datapane = null;
TableDataNameObjectCreator tableDataNameObjectCreator = getTableDataNameObjectCreator(tabledata); TableDataNameObjectCreator tableDataNameObjectCreator = getTableDataNameObjectCreator(tabledata);
Class<? extends AbstractTableDataPane<?>> creatorClass = (Class<AbstractTableDataPane<?>>) tableDataNameObjectCreator.getUpdatePane(); Class<? extends AbstractTableDataPane<?>> creatorClass = (Class<AbstractTableDataPane<?>>) tableDataNameObjectCreator.getUpdatePane();
if (tableDataNameObjectCreator != null && creatorClass != null) { if (creatorClass != null) {
try { try {
if (ComparatorUtils.equals(creatorClass, MultiTDTableDataPane.class) || ComparatorUtils.equals(creatorClass, TreeTableDataPane.class)) { if (TableDataPaneHelper.isNamedTableDataPane(creatorClass)) {
Constructor constructor = creatorClass.getDeclaredConstructor(new Class[]{String.class}); Constructor<? extends AbstractTableDataPane<?>> constructor = creatorClass.getDeclaredConstructor(String.class);
constructor.setAccessible(true); constructor.setAccessible(true);
datapane = (AbstractTableDataPane) constructor.newInstance(name); datapane = constructor.newInstance(name);
} else { } else {
datapane = creatorClass.newInstance(); datapane = creatorClass.newInstance();
} }

17
designer-base/src/main/java/com/fr/design/gui/controlpane/JControlUpdatePane.java

@ -3,16 +3,12 @@ package com.fr.design.gui.controlpane;
import com.fr.data.impl.Connection; import com.fr.data.impl.Connection;
import com.fr.design.DesignerEnvManager; import com.fr.design.DesignerEnvManager;
import com.fr.design.beans.BasicBeanPane; import com.fr.design.beans.BasicBeanPane;
import com.fr.design.data.tabledata.tabledatapane.GlobalMultiTDTableDataPane; import com.fr.design.data.tabledata.tabledatapane.TableDataPaneHelper;
import com.fr.design.data.tabledata.tabledatapane.GlobalTreeTableDataPane;
import com.fr.design.data.tabledata.tabledatapane.MultiTDTableDataPane;
import com.fr.design.data.tabledata.tabledatapane.TreeTableDataPane;
import com.fr.design.env.DesignerWorkspaceInfo; import com.fr.design.env.DesignerWorkspaceInfo;
import com.fr.design.env.RemoteDesignerWorkspaceInfo; import com.fr.design.env.RemoteDesignerWorkspaceInfo;
import com.fr.design.gui.ilist.ListModelElement; import com.fr.design.gui.ilist.ListModelElement;
import com.fr.design.layout.FRGUIPaneFactory; import com.fr.design.layout.FRGUIPaneFactory;
import com.fr.form.event.Listener; import com.fr.form.event.Listener;
import com.fr.general.ComparatorUtils;
import com.fr.log.FineLoggerFactory; import com.fr.log.FineLoggerFactory;
import javax.swing.JPanel; import javax.swing.JPanel;
@ -70,7 +66,7 @@ class JControlUpdatePane extends JPanel {
Object ob2Populate = creators[i].acceptObject2Populate(el.wrapper); Object ob2Populate = creators[i].acceptObject2Populate(el.wrapper);
if (ob2Populate != null) { if (ob2Populate != null) {
if (updatePanes[i] == null) { if (updatePanes[i] == null) {
if (isMulti(creators[i].getUpdatePane()) || isTree(creators[i].getUpdatePane())) { if (TableDataPaneHelper.isNamedTableDataPane(creators[i].getUpdatePane())) {
updatePanes[i] = listControlPane.createPaneByCreators(creators[i], el.wrapper.getName()); updatePanes[i] = listControlPane.createPaneByCreators(creators[i], el.wrapper.getName());
} else { } else {
updatePanes[i] = listControlPane.createPaneByCreators(creators[i]); updatePanes[i] = listControlPane.createPaneByCreators(creators[i]);
@ -94,15 +90,6 @@ class JControlUpdatePane extends JPanel {
} }
} }
public boolean isMulti(Class _class) {
return ComparatorUtils.equals(_class, GlobalMultiTDTableDataPane.class) || ComparatorUtils.equals(_class, MultiTDTableDataPane.class);
}
public boolean isTree(Class _class) {
return ComparatorUtils.equals(_class, GlobalTreeTableDataPane.class) || ComparatorUtils.equals(_class, TreeTableDataPane.class);
}
public void update() { public void update() {
NameableCreator[] creators = listControlPane.creators(); NameableCreator[] creators = listControlPane.creators();
for (int i = 0; i < updatePanes.length; i++) { for (int i = 0; i < updatePanes.length; i++) {

21
designer-base/src/main/java/com/fr/design/jxbrowser/JxUIPane.java

@ -29,6 +29,7 @@ import java.util.Objects;
import java.util.Optional; import java.util.Optional;
import java.util.concurrent.ExecutorService; import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors; import java.util.concurrent.Executors;
import java.util.function.Consumer;
import static com.fr.design.ui.ModernUIConstants.COMPONENT_TAG; import static com.fr.design.ui.ModernUIConstants.COMPONENT_TAG;
import static com.fr.design.ui.ModernUIConstants.DEFAULT_EXPRESSION; import static com.fr.design.ui.ModernUIConstants.DEFAULT_EXPRESSION;
@ -191,6 +192,14 @@ public class JxUIPane<T> extends BasicPane {
.ifPresent(ns -> ns.putProperty(variable, t)); .ifPresent(ns -> ns.putProperty(variable, t));
return InjectJsCallback.Response.proceed(); return InjectJsCallback.Response.proceed();
}); });
if (browser.mainFrame().isPresent()) {
executeJavaScript(WINDOW + DOT + namespace,
(Consumer<JsObject>) jsObject -> {
if (Objects.nonNull(jsObject)) {
jsObject.putProperty(variable, t);
}
});
}
} }
@Nullable @Nullable
@ -235,6 +244,18 @@ public class JxUIPane<T> extends BasicPane {
} }
} }
/**
* 执行一段js
*
* @param javaScript 待执行的js脚本
* @see JxUIPane#executeJS(String)
*/
public <T> void executeJavaScript(String javaScript, Consumer<T> consumer) {
if (browser != null) {
browser.mainFrame().ifPresent(frame -> frame.executeJavaScript(javaScript, consumer));
}
}
/** /**
* 获取js对象 * 获取js对象
* 注意类内部使用用于简化编码提供 Optional 包装 * 注意类内部使用用于简化编码提供 Optional 包装

29
designer-base/src/test/java/com/fr/design/ui/report/ReportServerParamDemo.java

@ -1,29 +0,0 @@
package com.fr.design.ui.report;
import com.fr.design.DesignerEnvManager;
import com.fr.design.ui.ModernUIPane;
import com.fr.design.ui.ModernUIPaneTest;
import javax.swing.*;
import java.awt.*;
/**
* Created by windy on 2019/3/25.
* 报表服务器参数demo
*/
public class ReportServerParamDemo {
public static void main(String... args) {
final JFrame frame = new JFrame();
frame.setSize(660, 600);
JPanel contentPane = (JPanel) frame.getContentPane();
// 是否需要开启调试窗口
DesignerEnvManager.getEnvManager().setOpenDebug(true);
final ModernUIPane<ModernUIPaneTest.Model> pane = new ModernUIPane.Builder<ModernUIPaneTest.Model>()
.withComponent(ReportServerParamComponent.KEY).build();
contentPane.add(pane, BorderLayout.CENTER);
frame.setVisible(true);
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
}
}
Loading…
Cancel
Save