From 3da2a0856d6411a0eb7504e1083d2f857bfd17a4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Yvan-=E6=AC=A7=E9=98=B3=E5=B8=86?= Date: Tue, 20 Dec 2022 10:34:28 +0800 Subject: [PATCH 01/14] =?UTF-8?q?REPORT-75091=20=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E8=84=B1=E6=95=8F=E4=B8=80=E4=BA=8C=E6=9C=9F=E8=A7=A3=E9=99=A4?= =?UTF-8?q?=E5=8A=9F=E8=83=BD=E5=B1=8F=E8=94=BD=20=E3=80=90=E9=97=AE?= =?UTF-8?q?=E9=A2=98=E5=8E=9F=E5=9B=A0=E3=80=91rt=20=E3=80=90=E6=94=B9?= =?UTF-8?q?=E5=8A=A8=E6=80=9D=E8=B7=AF=E3=80=91rt=20=E3=80=90review?= =?UTF-8?q?=E5=BB=BA=E8=AE=AE=E3=80=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/fr/design/data/datapane/preview/PreviewTablePane.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/data/datapane/preview/PreviewTablePane.java b/designer-base/src/main/java/com/fr/design/data/datapane/preview/PreviewTablePane.java index 027afdf5b..f65d4a9cf 100644 --- a/designer-base/src/main/java/com/fr/design/data/datapane/preview/PreviewTablePane.java +++ b/designer-base/src/main/java/com/fr/design/data/datapane/preview/PreviewTablePane.java @@ -162,9 +162,8 @@ public class PreviewTablePane extends BasicPane { JPanel northPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); // 预览行数面板 northPane.add(initPreviewNumberPane(), BorderLayout.CENTER); - /// 迭代延期,暂时屏蔽下功能入口 // 脱敏预览设置面板 -// northPane.add(initDesensitizationPane(), BorderLayout.EAST); + northPane.add(initDesensitizationPane(), BorderLayout.EAST); initDesensitizationPane(); return northPane; } From 5a717baaea4cc0f968841f55dff8675ce5ac932c Mon Sep 17 00:00:00 2001 From: "Cloud.Liu" Date: Thu, 22 Dec 2022 21:46:31 +0800 Subject: [PATCH 02/14] =?UTF-8?q?KERNEL-12978=20fix:=20=E9=80=82=E9=85=8DC?= =?UTF-8?q?BB=E6=94=B9=E5=8A=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/fr/design/actions/file/LocalePane.java | 3 ++- .../main/java/com/fr/design/actions/file/PreferencePane.java | 3 +-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/actions/file/LocalePane.java b/designer-base/src/main/java/com/fr/design/actions/file/LocalePane.java index 634af28b9..843b3bf72 100644 --- a/designer-base/src/main/java/com/fr/design/actions/file/LocalePane.java +++ b/designer-base/src/main/java/com/fr/design/actions/file/LocalePane.java @@ -12,6 +12,7 @@ import com.fr.design.gui.itextfield.UITextField; import com.fr.file.filetree.FileNode; import com.fr.general.GeneralUtils; +import com.fr.general.Inter; import com.fr.locale.InterProviderFactory; import com.fr.log.FineLoggerFactory; import com.fr.stable.ArrayUtils; @@ -121,7 +122,7 @@ public class LocalePane extends BasicPane { private void initPredefinedProperties() { - Map supportLocaleMap = InterProviderFactory.getProvider().getSupportLocaleMap(); + Map supportLocaleMap = Inter.getSupportLocaleMap(); // richie:暂时去掉设计器中国际化键值对的显示 Map map = new HashMap<>(); diff --git a/designer-base/src/main/java/com/fr/design/actions/file/PreferencePane.java b/designer-base/src/main/java/com/fr/design/actions/file/PreferencePane.java index 46485409b..840de5867 100644 --- a/designer-base/src/main/java/com/fr/design/actions/file/PreferencePane.java +++ b/designer-base/src/main/java/com/fr/design/actions/file/PreferencePane.java @@ -46,7 +46,6 @@ import com.fr.general.IOUtils; import com.fr.general.Inter; import com.fr.general.log.Log4jConfig; import com.fr.io.attr.ImageExportAttr; -import com.fr.locale.InterProviderFactory; import com.fr.log.FineLoggerFactory; import com.fr.report.ReportConfigManager; import com.fr.stable.Constants; @@ -634,7 +633,7 @@ public class PreferencePane extends BasicPane { } private UIDictionaryComboBox createLanguageComboBox() { - Map map = InterProviderFactory.getProvider().getSupportLocaleMap(); + Map map = Inter.getSupportLocaleMap(); int size = map.size(); Locale[] keys = new Locale[size]; String[] values = new String[size]; From dfe0ea9969d615c019edf9b87c3d966d8e725a8d Mon Sep 17 00:00:00 2001 From: "Coral.Chen" Date: Mon, 9 Jan 2023 17:07:34 +0800 Subject: [PATCH 03/14] =?UTF-8?q?REPORT-86259=20=E3=80=90=E5=AF=BC?= =?UTF-8?q?=E5=87=BAexcel&word=E3=80=91=E4=BB=85=E9=99=90=E9=A2=84?= =?UTF-8?q?=E8=A7=88=E4=B8=8B=E9=99=90=E5=88=B6=E5=A4=8D=E5=88=B6=20REPORT?= =?UTF-8?q?-86426-=E5=AF=BC=E5=87=BAexcel/pdf=20=E5=AF=86=E7=A0=81?= =?UTF-8?q?=E6=94=AF=E6=8C=81=E5=85=AC=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fr/design/report/ExportUniversalPane.java | 26 ++++++++++++++----- .../design/report/ReportExportAttrPane.java | 5 ++-- 2 files changed, 21 insertions(+), 10 deletions(-) diff --git a/designer-realize/src/main/java/com/fr/design/report/ExportUniversalPane.java b/designer-realize/src/main/java/com/fr/design/report/ExportUniversalPane.java index 3714d66a2..dce865b40 100644 --- a/designer-realize/src/main/java/com/fr/design/report/ExportUniversalPane.java +++ b/designer-realize/src/main/java/com/fr/design/report/ExportUniversalPane.java @@ -1,7 +1,6 @@ package com.fr.design.report; import com.fr.base.CustomConfig; -import com.fr.config.Configuration; import com.fr.design.constants.UIConstants; import com.fr.design.dialog.BasicPane; import com.fr.design.gui.icheckbox.UICheckBox; @@ -11,16 +10,20 @@ import com.fr.design.i18n.Toolkit; import com.fr.design.layout.FRGUIPaneFactory; import com.fr.design.utils.BrowseUtils; import com.fr.general.CloudCenter; +import com.fr.io.attr.ReportExportAttr; import com.fr.transaction.Configurations; import com.fr.transaction.WorkerFacade; + +import javax.swing.BorderFactory; +import javax.swing.JPanel; import java.awt.BorderLayout; import java.awt.Color; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; -import javax.swing.BorderFactory; -import javax.swing.JPanel; /** + * 通用 + * * @author hades * @version 11.0 * Created by hades on 2022/5/26 @@ -30,13 +33,15 @@ public class ExportUniversalPane extends BasicPane { private static final String HELP_URL = CloudCenter.getInstance().acquireUrlByKind("help.alt_font.zh_CN", "https://help.fanruan.com/finereport/doc-view-4707.html"); private UICheckBox specialCharacterExport; + // 密码支持公式 + private UICheckBox passwordSupportFormula; public ExportUniversalPane() { this.setLayout(FRGUIPaneFactory.createBorderLayout()); this.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); - JPanel outerNorthPane =FRGUIPaneFactory.createTitledBorderPane(Toolkit.i18nText("Fine-Design_Report_Universal_Export_Config")); + JPanel outerNorthPane = FRGUIPaneFactory.createTitledBorderPane(Toolkit.i18nText("Fine-Design_Report_Universal_Export_Config")); JPanel northPane = FRGUIPaneFactory.createY_AXISBoxInnerContainer_M_Pane(); - JPanel specialCharacterExportPane =FRGUIPaneFactory.createNormalFlowInnerContainer_M_Pane(); + JPanel specialCharacterExportPane = FRGUIPaneFactory.createNormalFlowInnerContainer_M_Pane(); specialCharacterExport = new UICheckBox(Toolkit.i18nText("Fine-Design_Report_Universal_Export_Special_Character")); specialCharacterExport.setSelected(true); specialCharacterExportPane.add(specialCharacterExport); @@ -55,6 +60,11 @@ public class ExportUniversalPane extends BasicPane { labelPane.add(centerLabel, BorderLayout.CENTER); labelPane.add(rightLabel, BorderLayout.EAST); northPane.add(labelPane); + JPanel passwordSupportPane = FRGUIPaneFactory.createNormalFlowInnerContainer_M_Pane(); + passwordSupportFormula = new UICheckBox(Toolkit.i18nText("Fine-Design_Report_Universal_Export_Password_Support_Formula")); + passwordSupportFormula.setSelected(false); + passwordSupportPane.add(passwordSupportFormula); + northPane.add(passwordSupportPane); outerNorthPane.add(northPane); this.add(outerNorthPane); } @@ -64,15 +74,17 @@ public class ExportUniversalPane extends BasicPane { return "ExportUniversalPane"; } - public void populate() { + public void populate(ReportExportAttr reportExportAttr) { this.specialCharacterExport.setSelected(CustomConfig.getInstance().isOptimizedSpecialCharacterExport()); + this.passwordSupportFormula.setSelected(reportExportAttr.isPwdSupportFormula()); } - public void update() { + public void update(ReportExportAttr reportExportAttr) { Configurations.modify(new WorkerFacade(CustomConfig.class) { @Override public void run() { CustomConfig.getInstance().setOptimizedSpecialCharacterExport(specialCharacterExport.isSelected()); + reportExportAttr.setPwdSupportFormula(passwordSupportFormula.isSelected()); } }); } diff --git a/designer-realize/src/main/java/com/fr/design/report/ReportExportAttrPane.java b/designer-realize/src/main/java/com/fr/design/report/ReportExportAttrPane.java index 2de520d27..cd992c3fd 100644 --- a/designer-realize/src/main/java/com/fr/design/report/ReportExportAttrPane.java +++ b/designer-realize/src/main/java/com/fr/design/report/ReportExportAttrPane.java @@ -61,7 +61,7 @@ public class ReportExportAttrPane extends BasicPane { } if (this.exportUniversalPane != null) { - this.exportUniversalPane.populate(); + this.exportUniversalPane.populate(reportExportAttr); } if (this.excelExportPane != null) { @@ -84,9 +84,8 @@ public class ReportExportAttrPane extends BasicPane { public ReportExportAttr update() { ReportExportAttr reportExportAttr = new ReportExportAttr(); - if (this.exportUniversalPane != null) { - this.exportUniversalPane.update(); + this.exportUniversalPane.update(reportExportAttr); } if (this.excelExportPane != null) { From e18d9c5a16025fb81a16461ac645b9fadcbd0bc7 Mon Sep 17 00:00:00 2001 From: "Coral.Chen" Date: Mon, 9 Jan 2023 17:18:41 +0800 Subject: [PATCH 04/14] =?UTF-8?q?REPORT-86426-=E5=AF=BC=E5=87=BAexcel/pdf?= =?UTF-8?q?=20=E5=AF=86=E7=A0=81=E6=94=AF=E6=8C=81=E5=85=AC=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/fr/design/report/ExportUniversalPane.java | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/designer-realize/src/main/java/com/fr/design/report/ExportUniversalPane.java b/designer-realize/src/main/java/com/fr/design/report/ExportUniversalPane.java index dce865b40..5fe52560d 100644 --- a/designer-realize/src/main/java/com/fr/design/report/ExportUniversalPane.java +++ b/designer-realize/src/main/java/com/fr/design/report/ExportUniversalPane.java @@ -74,11 +74,21 @@ public class ExportUniversalPane extends BasicPane { return "ExportUniversalPane"; } + /** + * 填充数据 + * + * @param reportExportAttr 报表导出属性 + */ public void populate(ReportExportAttr reportExportAttr) { this.specialCharacterExport.setSelected(CustomConfig.getInstance().isOptimizedSpecialCharacterExport()); this.passwordSupportFormula.setSelected(reportExportAttr.isPwdSupportFormula()); } + /** + * 更新界面 + * + * @param reportExportAttr 报表导出属性 + */ public void update(ReportExportAttr reportExportAttr) { Configurations.modify(new WorkerFacade(CustomConfig.class) { @Override From 8f8f92959af47676c17d00637ce32fa6005c8a21 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Yvan-=E6=AC=A7=E9=98=B3=E5=B8=86?= Date: Wed, 11 Jan 2023 10:44:35 +0800 Subject: [PATCH 05/14] =?UTF-8?q?REPORT-83316=20&&=20REPORT-83320=20&&=20R?= =?UTF-8?q?EPORT-83488=20&&=20REPORT-83493=20=E6=95=B0=E6=8D=AE=E8=84=B1?= =?UTF-8?q?=E6=95=8F=E4=B8=80=E6=9C=9F=E8=BF=AD=E4=BB=A3bug=20=E3=80=90?= =?UTF-8?q?=E9=97=AE=E9=A2=98=E5=8E=9F=E5=9B=A0=E3=80=91=E5=9F=BA=E6=9C=AC?= =?UTF-8?q?=E9=83=BD=E6=98=AFUI=E9=97=AE=E9=A2=98=20=E3=80=90=E6=94=B9?= =?UTF-8?q?=E5=8A=A8=E6=80=9D=E8=B7=AF=E3=80=91=E8=B7=9F=E4=BA=A7=E5=93=81?= =?UTF-8?q?=E6=B2=9F=E9=80=9A=E5=90=8E=EF=BC=8C=E4=BF=AE=E6=94=B9=20?= =?UTF-8?q?=E3=80=90review=E5=BB=BA=E8=AE=AE=E3=80=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../datapane/preview/PreviewTablePane.java | 13 +- .../TableDataPreviewDesensitizeManager.java | 16 +- .../view/common/ChooseMark.java | 42 +++ .../rule/DesensitizationRuleChoosePane.java | 66 ++++- .../TableDataDesensitizationTableModel.java | 273 +++++++++++++----- .../gui/icombocheckbox/UICheckListPopup.java | 20 +- .../gui/icombocheckbox/UIComboCheckBox.java | 36 ++- 7 files changed, 377 insertions(+), 89 deletions(-) create mode 100644 designer-base/src/main/java/com/fr/design/data/datapane/preview/desensitization/view/common/ChooseMark.java diff --git a/designer-base/src/main/java/com/fr/design/data/datapane/preview/PreviewTablePane.java b/designer-base/src/main/java/com/fr/design/data/datapane/preview/PreviewTablePane.java index f65d4a9cf..7b9a7a3d2 100644 --- a/designer-base/src/main/java/com/fr/design/data/datapane/preview/PreviewTablePane.java +++ b/designer-base/src/main/java/com/fr/design/data/datapane/preview/PreviewTablePane.java @@ -164,7 +164,6 @@ public class PreviewTablePane extends BasicPane { northPane.add(initPreviewNumberPane(), BorderLayout.CENTER); // 脱敏预览设置面板 northPane.add(initDesensitizationPane(), BorderLayout.EAST); - initDesensitizationPane(); return northPane; } @@ -260,6 +259,16 @@ public class PreviewTablePane extends BasicPane { 0); } + /** + * 根据TableData设置脱敏设置的个数 + */ + private void setDesensitizationCountByTableData() { + desensitizationPane.setDesensitizationCount(isDesensitizeOpened(), + this.tableData instanceof DesensitizationTableData ? + ((DesensitizationTableData) this.tableData).getDesensitizationConfig().getDesensitizationItems().size() : + 0); + } + /** * 初始化centerPane * @@ -722,7 +731,7 @@ public class PreviewTablePane extends BasicPane { * @param previewTableModel */ private void setPreviewTableModel(TableModel previewTableModel) { - setDesensitizationCount(previewTableModel); + setDesensitizationCountByTableData(); setModel(previewTableModel); setCurrentRows(previewTableModel.getRowCount()); fireLoadedListener(); diff --git a/designer-base/src/main/java/com/fr/design/data/datapane/preview/desensitization/TableDataPreviewDesensitizeManager.java b/designer-base/src/main/java/com/fr/design/data/datapane/preview/desensitization/TableDataPreviewDesensitizeManager.java index 3d3c59331..3d8fc8d02 100644 --- a/designer-base/src/main/java/com/fr/design/data/datapane/preview/desensitization/TableDataPreviewDesensitizeManager.java +++ b/designer-base/src/main/java/com/fr/design/data/datapane/preview/desensitization/TableDataPreviewDesensitizeManager.java @@ -5,6 +5,7 @@ import com.fr.base.TableData; import com.fr.data.desensitize.base.DesensitizationTableData; import com.fr.data.desensitize.base.TableDataDesensitizationItem; import com.fr.data.desensitize.manage.DesensitizationManager; +import com.fr.data.desensitize.rule.DesensitizationRuleManager; import com.fr.data.desensitize.util.DesentizationUtils; import com.fr.decision.webservice.bean.user.DepartmentPostBean; import com.fr.decision.webservice.bean.user.RoleBean; @@ -77,7 +78,9 @@ public class TableDataPreviewDesensitizeManager implements DesensitizationManage // 获取此数据集的所有脱敏信息 Collection desensitizationItems = ((DesensitizationTableData) tableData).getDesensitizationConfig().getDesensitizationItems(); if (DesentizationUtils.isCollectionNotEmpty(desensitizationItems)) { - // 先对脱敏配置项集合做过滤和排序处理 + // 更新规则 + dealWithLastedRules(desensitizationItems); + // 对脱敏配置项集合做过滤和排序处理 List items = desensitizationItems.stream() .filter(item -> item.getRule().isEnable() && matchColumnIndex(item, model) >= 0) @@ -92,9 +95,18 @@ public class TableDataPreviewDesensitizeManager implements DesensitizationManage return new DesensitizedPreviewTableModel(model, desensitizationItemMap); } + /** + * 在预览计算前,将Item中的规则替换为最新规则(防止平台规则被临时修改) + */ + private void dealWithLastedRules(Collection desensitizationItems) { + desensitizationItems.forEach(item -> { + // 获取最新的规则 + item.setRule(DesensitizationRuleManager.getInstance().getLastedDesentizationRule(item.getRule())); + }); + } + /** * 通过TableData获取其列名 - * 实现逻辑有点绕,TableData本身并不能返回列名集合,只能先去获取当前模板所有数据集,然后匹配名称拿到TableDataWrapper再获取列名 * * @param tableData * @return diff --git a/designer-base/src/main/java/com/fr/design/data/datapane/preview/desensitization/view/common/ChooseMark.java b/designer-base/src/main/java/com/fr/design/data/datapane/preview/desensitization/view/common/ChooseMark.java new file mode 100644 index 000000000..099e9a960 --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/data/datapane/preview/desensitization/view/common/ChooseMark.java @@ -0,0 +1,42 @@ +package com.fr.design.data.datapane.preview.desensitization.view.common; + +import com.fr.design.gui.ibutton.UIRadioButton; + +import javax.swing.AbstractCellEditor; +import javax.swing.JTable; +import javax.swing.table.TableCellEditor; +import javax.swing.table.TableCellRenderer; +import java.awt.Component; + +/** + * 标记选中的CellEditor + * + * @author Yvan + * @version 11.0 + * Created by Yvan on 2022/12/20 + */ +public class ChooseMark extends AbstractCellEditor implements TableCellEditor, TableCellRenderer { + + private final UIRadioButton selectedButton; + + public ChooseMark() { + this.selectedButton = new UIRadioButton(); + } + + @Override + public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) { + selectedButton.setSelected(isSelected); + return selectedButton; + } + + @Override + public Object getCellEditorValue() { + return selectedButton.isSelected(); + } + + @Override + public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { + selectedButton.setSelected(isSelected); + return selectedButton; + } +} diff --git a/designer-base/src/main/java/com/fr/design/data/datapane/preview/desensitization/view/rule/DesensitizationRuleChoosePane.java b/designer-base/src/main/java/com/fr/design/data/datapane/preview/desensitization/view/rule/DesensitizationRuleChoosePane.java index fd627e8cc..3b44c0b18 100644 --- a/designer-base/src/main/java/com/fr/design/data/datapane/preview/desensitization/view/rule/DesensitizationRuleChoosePane.java +++ b/designer-base/src/main/java/com/fr/design/data/datapane/preview/desensitization/view/rule/DesensitizationRuleChoosePane.java @@ -4,9 +4,10 @@ import com.fr.base.svg.IconUtils; import com.fr.data.desensitize.rule.DesensitizationRuleManager; import com.fr.data.desensitize.rule.base.DesensitizationRule; import com.fr.data.desensitize.rule.base.DesensitizationRuleSource; +import com.fr.data.desensitize.rule.base.DesensitizationRuleStatus; +import com.fr.design.data.datapane.preview.desensitization.view.common.ChooseMark; import com.fr.design.dialog.BasicDialog; import com.fr.design.dialog.DialogActionAdapter; -import com.fr.design.gui.ibutton.UIRadioButton; import com.fr.design.gui.ilable.UILabel; import com.fr.design.gui.itableeditorpane.UITableEditAction; import com.fr.design.gui.itableeditorpane.UITableEditorPane; @@ -22,6 +23,7 @@ import javax.swing.SwingUtilities; import javax.swing.table.TableCellEditor; import javax.swing.table.TableCellRenderer; import java.awt.CardLayout; +import java.awt.Color; import java.awt.Component; import java.awt.event.ActionEvent; import java.util.LinkedHashSet; @@ -107,18 +109,23 @@ public class DesensitizationRuleChoosePane extends JPanel { super(new String[]{ StringUtils.EMPTY, Toolkit.i18nText("Fine-Design_Report_Desensitization_Rule_Name"), - Toolkit.i18nText("Fine-Design_Report_Desensitization_Rule_Description") + Toolkit.i18nText("Fine-Design_Report_Desensitization_Rule_Description"), + Toolkit.i18nText("Fine-Design_Report_Desensitization_Rule_Status"), }); this.parent = parent; this.debugActionOnly = debugActionOnly; this.setColumnClass(new Class[]{ - RuleChoosePane.class, + ChooseMark.class, UILabel.class, - UILabel.class + UILabel.class, + DesensitizationRuleStatusPane.class }); - this.setDefaultEditor(RuleChoosePane.class, new RuleChoosePane()); - this.setDefaultRenderer(RuleChoosePane.class, new RuleChoosePane()); + this.setDefaultEditor(ChooseMark.class, new ChooseMark()); + this.setDefaultRenderer(ChooseMark.class, new ChooseMark()); + this.setDefaultEditor(DesensitizationRuleStatusPane.class, new DesensitizationRuleStatusPane()); + this.setDefaultRenderer(DesensitizationRuleStatusPane.class, new DesensitizationRuleStatusPane()); this.createTable().getColumnModel().getColumn(0).setMaxWidth(20); + this.createTable().getColumnModel().getColumn(3).setMaxWidth(60); } @Override @@ -134,6 +141,11 @@ public class DesensitizationRuleChoosePane extends JPanel { case 2: // 脱敏规则描述 return DesensitizationRule.getDescription(rule); + case 3: + // 脱敏规则状态 + DesensitizationRuleStatus ruleStatus = DesensitizationRuleManager.getInstance().getRuleStatus(rule); + // 非正常状态需要标记为异常 + return ruleStatus == DesensitizationRuleStatus.NORMAL ? StringUtils.EMPTY : Toolkit.i18nText("Fine-Design_Report_Desensitization_Rule_Status_Abnormal"); default: return StringUtils.EMPTY; } @@ -161,29 +173,51 @@ public class DesensitizationRuleChoosePane extends JPanel { .collect(Collectors.toSet()); } - private class RuleChoosePane extends AbstractCellEditor implements TableCellEditor, TableCellRenderer { + /** + * 规则状态展示页面 + */ + private class DesensitizationRuleStatusPane extends AbstractCellEditor implements TableCellEditor, TableCellRenderer { - private UIRadioButton selectedButton; + private UILabel ruleStatusLabel; - public RuleChoosePane() { - this.selectedButton = new UIRadioButton(); + DesensitizationRuleStatusPane() { + // 规则状态 + this.ruleStatusLabel = new UILabel(); + this.ruleStatusLabel.setForeground(Color.RED); + } + + /** + * 根据脱敏规则信息,刷新规则状态,主要用于与规则选择器的联动 + * + * @param rule + */ + public void refreshRuleStatus(DesensitizationRule rule) { + DesensitizationRuleStatus ruleStatus = DesensitizationRuleManager.getInstance().getRuleStatus(rule); + if (ruleStatus == DesensitizationRuleStatus.NORMAL) { + // 正常规则时,重置提示Label + this.ruleStatusLabel.setText(StringUtils.EMPTY); + this.ruleStatusLabel.setToolTipText(null); + } else { + this.ruleStatusLabel.setText(Toolkit.i18nText("Fine-Design_Report_Desensitization_Rule_Status_Abnormal")); + this.ruleStatusLabel.setToolTipText(ruleStatus.getDescription()); + } } @Override public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) { - selectedButton.setSelected(isSelected); - return selectedButton; + refreshRuleStatus(getList().get(row)); + return ruleStatusLabel; } @Override public Object getCellEditorValue() { - return selectedButton.isSelected(); + return ruleStatusLabel; } @Override public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { - selectedButton.setSelected(isSelected); - return selectedButton; + refreshRuleStatus(getList().get(row)); + return ruleStatusLabel; } } @@ -298,7 +332,7 @@ public class DesensitizationRuleChoosePane extends JPanel { @Override public void checkEnabled() { - setEnabled(table.getSelectedRow() != -1); + setEnabled(table.getSelectedRow() != -1 && getList().get(table.getSelectedRow()).isEnable()); } @Override diff --git a/designer-base/src/main/java/com/fr/design/data/datapane/preview/desensitization/view/setting/TableDataDesensitizationTableModel.java b/designer-base/src/main/java/com/fr/design/data/datapane/preview/desensitization/view/setting/TableDataDesensitizationTableModel.java index bbc91efa2..4d6cfa8ff 100644 --- a/designer-base/src/main/java/com/fr/design/data/datapane/preview/desensitization/view/setting/TableDataDesensitizationTableModel.java +++ b/designer-base/src/main/java/com/fr/design/data/datapane/preview/desensitization/view/setting/TableDataDesensitizationTableModel.java @@ -2,11 +2,14 @@ package com.fr.design.data.datapane.preview.desensitization.view.setting; import com.fr.data.desensitize.base.DesensitizationTableData; import com.fr.data.desensitize.base.TableDataDesensitizationItem; +import com.fr.data.desensitize.rule.DesensitizationRuleManager; import com.fr.data.desensitize.rule.base.DesensitizationRule; +import com.fr.data.desensitize.rule.base.DesensitizationRuleStatus; import com.fr.design.data.datapane.preview.desensitization.TableDataPreviewDesensitizeManager; import com.fr.design.data.datapane.preview.desensitization.view.rule.DesensitizationRulePane; import com.fr.design.dialog.BasicDialog; import com.fr.design.dialog.DialogActionAdapter; +import com.fr.design.dialog.FineJOptionPane; import com.fr.design.gui.ibutton.UIButton; import com.fr.design.gui.icombobox.UIComboBox; import com.fr.design.gui.icombocheckbox.UIComboCheckBox; @@ -15,12 +18,14 @@ import com.fr.design.gui.itableeditorpane.UITableEditAction; import com.fr.design.gui.itableeditorpane.UITableModelAdapter; import com.fr.design.gui.itextfield.UITextField; import com.fr.design.i18n.Toolkit; +import com.fr.design.layout.FRGUIPaneFactory; import com.fr.design.layout.TableLayout; import com.fr.design.layout.TableLayoutHelper; import com.fr.stable.StringUtils; import org.jetbrains.annotations.Nullable; import javax.swing.AbstractCellEditor; +import javax.swing.JComponent; import javax.swing.JPanel; import javax.swing.JTable; import javax.swing.SwingUtilities; @@ -28,10 +33,11 @@ import javax.swing.event.CellEditorListener; import javax.swing.event.ChangeEvent; import javax.swing.table.TableCellEditor; import javax.swing.table.TableCellRenderer; +import java.awt.BorderLayout; +import java.awt.Color; import java.awt.Component; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; -import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.LinkedHashSet; @@ -52,6 +58,8 @@ public class TableDataDesensitizationTableModel extends UITableModelAdapter matchRoleNamesByIds(Collection roleIds) { - List result = new ArrayList<>(); + private String matchRoleNamesByIds(Collection roleIds) { + StringBuilder builder = new StringBuilder(); for (String roleId : roleIds) { if (roleMap != null && roleMap.containsKey(roleId)) { - result.add(roleMap.get(roleId)); + builder.append(roleMap.get(roleId)); + builder.append(COMMA); } } - return result; + return builder.length() <= 1 ? StringUtils.EMPTY : builder.substring(0, builder.length() - 1); } @Override public boolean isCellEditable(int row, int col) { - return true; + TableSequences match = TableSequences.match(col); + return match != TableSequences.DesensitizationRuleStatus; } @Override @@ -166,7 +183,7 @@ public class TableDataDesensitizationTableModel extends UITableModelAdapter 0 ? builder.substring(0, builder.length() - 1) : StringUtils.EMPTY; //计算加省略号后的文本 editor.setText(this.showOmitText ? omitEditorText(editor, text) : text); + // tooltips显示原值 + setEditorToolTipText(editor, text); + } + + /** + * 为UITextField设置悬浮提示值 + * + * @param editor + * @param text + */ + protected void setEditorToolTipText(JComponent editor, String text) { + // 默认不做设置 } /** From 4c0a7489464acf5352132b2758d8c2fc4a0a46de Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Yvan-=E6=AC=A7=E9=98=B3=E5=B8=86?= Date: Wed, 11 Jan 2023 11:25:37 +0800 Subject: [PATCH 06/14] =?UTF-8?q?REPORT-83316=20&&=20REPORT-83320=20&&=20R?= =?UTF-8?q?EPORT-83488=20&&=20REPORT-83493=20=E6=95=B0=E6=8D=AE=E8=84=B1?= =?UTF-8?q?=E6=95=8F=E4=B8=80=E6=9C=9F=E8=BF=AD=E4=BB=A3bug=20=E3=80=90?= =?UTF-8?q?=E9=97=AE=E9=A2=98=E5=8E=9F=E5=9B=A0=E3=80=91=E6=A0=B9=E6=8D=AE?= =?UTF-8?q?review=E6=84=8F=E8=A7=81=EF=BC=8C=E6=8A=BD=E5=87=BA=E6=96=B9?= =?UTF-8?q?=E6=B3=95=20=E3=80=90=E6=94=B9=E5=8A=A8=E6=80=9D=E8=B7=AF?= =?UTF-8?q?=E3=80=91=E6=A0=B9=E6=8D=AEreview=E6=84=8F=E8=A7=81=EF=BC=8C?= =?UTF-8?q?=E6=8A=BD=E5=87=BA=E6=96=B9=E6=B3=95=20=E3=80=90review=E5=BB=BA?= =?UTF-8?q?=E8=AE=AE=E3=80=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../TableDataPreviewDesensitizeManager.java | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/data/datapane/preview/desensitization/TableDataPreviewDesensitizeManager.java b/designer-base/src/main/java/com/fr/design/data/datapane/preview/desensitization/TableDataPreviewDesensitizeManager.java index 3d8fc8d02..29e12bfaf 100644 --- a/designer-base/src/main/java/com/fr/design/data/datapane/preview/desensitization/TableDataPreviewDesensitizeManager.java +++ b/designer-base/src/main/java/com/fr/design/data/datapane/preview/desensitization/TableDataPreviewDesensitizeManager.java @@ -82,8 +82,7 @@ public class TableDataPreviewDesensitizeManager implements DesensitizationManage dealWithLastedRules(desensitizationItems); // 对脱敏配置项集合做过滤和排序处理 List items = desensitizationItems.stream() - .filter(item -> item.getRule().isEnable() && - matchColumnIndex(item, model) >= 0) + .filter(item -> isAvaliableItem4Preview(item, model)) .sorted(Comparator.comparingInt(item -> matchColumnIndex(item, model))) .collect(Collectors.toList()); // 然后转换成Map @@ -95,6 +94,18 @@ public class TableDataPreviewDesensitizeManager implements DesensitizationManage return new DesensitizedPreviewTableModel(model, desensitizationItemMap); } + /** + * 判断是否为有效的用于预览脱敏效果的DesensitizationItem + * + * @param item 脱敏配置项 + * @param model 数据集预览数据 + * @return + */ + private boolean isAvaliableItem4Preview(TableDataDesensitizationItem item, PreviewTableModel model) { + return item.getRule().isEnable() && + matchColumnIndex(item, model) >= 0; + } + /** * 在预览计算前,将Item中的规则替换为最新规则(防止平台规则被临时修改) */ From dc7f9fee247f303cf87d969b25a3baa50ce9532b Mon Sep 17 00:00:00 2001 From: "Leo.Qin" Date: Fri, 13 Jan 2023 12:55:34 +0800 Subject: [PATCH 07/14] =?UTF-8?q?REPORT-84645=20lic=E9=99=90=E5=88=B6?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E5=BA=93=E7=B1=BB=E5=9E=8B-=E6=8A=A5?= =?UTF-8?q?=E8=A1=A8=E9=85=8D=E5=90=88=20=E3=80=90=E9=97=AE=E9=A2=98?= =?UTF-8?q?=E5=8E=9F=E5=9B=A0=E3=80=91rt=20=E3=80=90=E6=94=B9=E5=8A=A8?= =?UTF-8?q?=E6=80=9D=E8=B7=AF=E3=80=91=E8=AE=BE=E8=AE=A1=E5=99=A8=E4=B8=AD?= =?UTF-8?q?=E6=B5=8B=E8=AF=95=E6=95=B0=E6=8D=AE=E5=BA=93=E8=BF=9E=E6=8E=A5?= =?UTF-8?q?=E6=97=B6=EF=BC=8C=E6=A0=B9=E6=8D=AElic=E4=B8=AD=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E5=BA=93=E7=B1=BB=E5=9E=8B=E9=99=90=E5=88=B6=EF=BC=8C?= =?UTF-8?q?=E7=BB=99=E5=87=BA=E7=9B=B8=E5=BA=94=E7=9A=84=E9=94=99=E8=AF=AF?= =?UTF-8?q?=E6=8F=90=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../data/datapane/connect/ConnectionListPane.java | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/data/datapane/connect/ConnectionListPane.java b/designer-base/src/main/java/com/fr/design/data/datapane/connect/ConnectionListPane.java index 23c22144b..eaa4c37d8 100644 --- a/designer-base/src/main/java/com/fr/design/data/datapane/connect/ConnectionListPane.java +++ b/designer-base/src/main/java/com/fr/design/data/datapane/connect/ConnectionListPane.java @@ -22,6 +22,7 @@ import com.fr.file.ConnectionConfig; import com.fr.file.ConnectionOperator; import com.fr.general.NameObject; import com.fr.log.FineLoggerFactory; +import com.fr.regist.FRCoreContext; import com.fr.stable.ArrayUtils; import com.fr.stable.Nameable; import com.fr.stable.StringUtils; @@ -118,17 +119,25 @@ public class ConnectionListPane extends JListControlPane implements ConnectionSh * @return 菜单项 */ public NameableCreator[] createNameableCreators() { - NameableCreator[] creators = new NameableCreator[]{new NameObjectCreator( + NameObjectCreator jdbc = new NameObjectCreator( "JDBC", "/com/fr/design/images/data/source/jdbcTableData.png", JDBCDatabaseConnection.class, DatabaseConnectionPane.JDBC.class - ), new NameObjectCreator( + ); + NameObjectCreator jndi = new NameObjectCreator( "JNDI", "/com/fr/design/images/data/source/jdbcTableData.png", JNDIDatabaseConnection.class, DatabaseConnectionPane.JNDI.class - )}; + ); + NameableCreator[] creators; + if (FRCoreContext.getLicense().limitDatabaseType()) { + // 不支持JDNI,屏蔽接口 + creators = new NameableCreator[]{jdbc}; + } else { + creators = new NameableCreator[]{jdbc, jndi}; + } Set pluginCreators = ExtraDesignClassManager.getInstance().getArray(ConnectionProvider.XML_TAG); for (ConnectionProvider provider : pluginCreators) { NameObjectCreator creator = new NameObjectCreator( From 21b9a7304580a03ee4be6e0e1ad3c5dd5b2e209d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Yvan-=E6=AC=A7=E9=98=B3=E5=B8=86?= Date: Fri, 13 Jan 2023 15:44:37 +0800 Subject: [PATCH 08/14] =?UTF-8?q?REPORT-83773=20&&=20REPORT-83838=20&&=20R?= =?UTF-8?q?EPORT-83716=20&&=20REPORT-83738=20=E6=95=B0=E6=8D=AE=E8=84=B1?= =?UTF-8?q?=E6=95=8F=E4=BA=8C=E6=9C=9F=E8=BF=AD=E4=BB=A3bug=20=E3=80=90?= =?UTF-8?q?=E9=97=AE=E9=A2=98=E5=8E=9F=E5=9B=A0=E3=80=91rt=20=E3=80=90?= =?UTF-8?q?=E6=94=B9=E5=8A=A8=E6=80=9D=E8=B7=AF=E3=80=91=E4=B8=BB=E8=A6=81?= =?UTF-8?q?=E6=98=AF=EF=BC=9A=201.=20=E6=B7=BB=E5=8A=A0=E5=9F=8B=E7=82=B9?= =?UTF-8?q?=202.=20=E8=AE=BE=E8=AE=A1=E5=99=A8=E7=AB=AF=E9=99=90=E5=88=B6?= =?UTF-8?q?=E6=9C=8D=E5=8A=A1=E5=99=A8=E6=95=B0=E6=8D=AE=E9=9B=86=E4=B8=AD?= =?UTF-8?q?=E8=84=B1=E6=95=8F=E9=85=8D=E7=BD=AE=E7=9A=84=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=203.=20=E4=B8=80=E4=BA=9B=E9=80=BB=E8=BE=91bug=E4=BF=AE?= =?UTF-8?q?=E6=94=B9=20=E3=80=90review=E5=BB=BA=E8=AE=AE=E3=80=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../design/data/DesignTableDataManager.java | 12 ++++- .../datapane/preview/PreviewTablePane.java | 51 +++++++++++++++---- .../view/PreviewTableDesensitizationPane.java | 13 +++++ .../rule/DesensitizationRuleEditPane.java | 10 ++++ 4 files changed, 74 insertions(+), 12 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/data/DesignTableDataManager.java b/designer-base/src/main/java/com/fr/design/data/DesignTableDataManager.java index 2ce2a7d82..e18b2a47d 100644 --- a/designer-base/src/main/java/com/fr/design/data/DesignTableDataManager.java +++ b/designer-base/src/main/java/com/fr/design/data/DesignTableDataManager.java @@ -661,4 +661,14 @@ public abstract class DesignTableDataManager { public static void setThreadLocal(String value) { threadLocal.set(value); } -} \ No newline at end of file + + /** + * 根据数据集名称判断是否为服务器数据集或服务器存储过程 + * + * @param tableDataName 数据集名称 + * @return + */ + public static boolean isGlobalTableData(String tableDataName) { + return globalDsCache.containsKey(tableDataName); + } +} diff --git a/designer-base/src/main/java/com/fr/design/data/datapane/preview/PreviewTablePane.java b/designer-base/src/main/java/com/fr/design/data/datapane/preview/PreviewTablePane.java index 7b9a7a3d2..27285850a 100644 --- a/designer-base/src/main/java/com/fr/design/data/datapane/preview/PreviewTablePane.java +++ b/designer-base/src/main/java/com/fr/design/data/datapane/preview/PreviewTablePane.java @@ -33,6 +33,7 @@ import com.fr.design.layout.FRGUIPaneFactory; import com.fr.design.mainframe.DesignerContext; import com.fr.design.mainframe.JTemplate; import com.fr.design.ui.util.UIUtil; +import com.fr.esd.query.StrategicTableData; import com.fr.function.TIME; import com.fr.general.FRFont; import com.fr.general.data.DataModel; @@ -223,6 +224,18 @@ public class PreviewTablePane extends BasicPane { * 点击脱敏配置后的操作 */ public void clickDesensitizationLabel() { + // 埋点记录 + recordDesensitization(); + // 判断数据集类型 + if (isGlobalTableData()) { + // 服务器数据集不允许在设计器端修改脱敏配置 + FineJOptionPane.showMessageDialog( + this, + Toolkit.i18nText("Fine-Design_Report_Cannot_Modify_Desensitization_Config_Of_ServerTableData"), + Toolkit.i18nText("Fine-Design_Basic_Alert"), + FineJOptionPane.WARNING_MESSAGE); + return; + } TableDataDesensitizationSettingPane settingPane = new TableDataDesensitizationSettingPane((DesensitizationTableData) tableData); settingPane.populateBean((DesensitizationTableData) tableData); BasicDialog dialog = settingPane.showWindowWithCustomSize(SwingUtilities.getWindowAncestor(PreviewTablePane.this), new DialogActionAdapter() { @@ -248,25 +261,41 @@ public class PreviewTablePane extends BasicPane { } /** - * 设置脱敏设置的个数 + * 触发数据脱敏埋点记录 + * + * @return 数据脱敏字段数量 + */ + private int recordDesensitization() { + return getCurrentTableDataDesensitizaitionCount(); + } + + /** + * 当前tableData是否为服务器数据集或服务器存储过程 * - * @param model + * @return */ - private void setDesensitizationCount(TableModel model) { - desensitizationPane.setDesensitizationCount(isDesensitizeOpened(), - model instanceof DesensitizedPreviewTableModel ? - ((DesensitizedPreviewTableModel) model).getDesensitizeColumnsCount() : - 0); + public boolean isGlobalTableData() { + return this.tableData instanceof StrategicTableData && + DesignTableDataManager.isGlobalTableData(((StrategicTableData) this.tableData).getDsName()); } /** * 根据TableData设置脱敏设置的个数 */ private void setDesensitizationCountByTableData() { - desensitizationPane.setDesensitizationCount(isDesensitizeOpened(), - this.tableData instanceof DesensitizationTableData ? - ((DesensitizationTableData) this.tableData).getDesensitizationConfig().getDesensitizationItems().size() : - 0); + desensitizationPane.setDesensitizationCount(isDesensitizeOpened(), getCurrentTableDataDesensitizaitionCount()); + desensitizationPane.dealWithTableDataType(isGlobalTableData()); + } + + /** + * 获取当前数据集中设置脱敏规则的个数 + * + * @return + */ + private int getCurrentTableDataDesensitizaitionCount() { + return this.tableData instanceof DesensitizationTableData ? + ((DesensitizationTableData) this.tableData).getDesensitizationConfig().getDesensitizationItems().size() : + 0; } /** diff --git a/designer-base/src/main/java/com/fr/design/data/datapane/preview/desensitization/view/PreviewTableDesensitizationPane.java b/designer-base/src/main/java/com/fr/design/data/datapane/preview/desensitization/view/PreviewTableDesensitizationPane.java index 1bf150dd5..01c92e333 100644 --- a/designer-base/src/main/java/com/fr/design/data/datapane/preview/desensitization/view/PreviewTableDesensitizationPane.java +++ b/designer-base/src/main/java/com/fr/design/data/datapane/preview/desensitization/view/PreviewTableDesensitizationPane.java @@ -112,9 +112,22 @@ public class PreviewTableDesensitizationPane extends JPanel { return previewToggle; } + /** + * 设置Label的值,主要是需要动态修改配置的脱敏规则的数量 + * + * @param desensitizeOpen + * @param count + */ public void setDesensitizationCount(boolean desensitizeOpen, int count) { desensitizationLabel.setText(desensitizeOpen ? DATA_DESENSITIZATION_CONFIG + LEFT_BRACKET + count + RIGHT_BRACKET + COUNT : DATA_DESENSITIZATION_CONFIG); } + + /** + * 服务器数据集时,Label需要置灰 + */ + public void dealWithTableDataType(boolean globalTableData) { + desensitizationLabel.setForeground(globalTableData ? UIConstants.DISABLED_ICON_COLOR : UIConstants.NORMAL_BLUE); + } } diff --git a/designer-base/src/main/java/com/fr/design/data/datapane/preview/desensitization/view/rule/DesensitizationRuleEditPane.java b/designer-base/src/main/java/com/fr/design/data/datapane/preview/desensitization/view/rule/DesensitizationRuleEditPane.java index 7354dc0b1..b3c0d2615 100644 --- a/designer-base/src/main/java/com/fr/design/data/datapane/preview/desensitization/view/rule/DesensitizationRuleEditPane.java +++ b/designer-base/src/main/java/com/fr/design/data/datapane/preview/desensitization/view/rule/DesensitizationRuleEditPane.java @@ -2,6 +2,7 @@ package com.fr.design.data.datapane.preview.desensitization.view.rule; import com.fr.data.desensitize.rule.base.DesensitizationCondition; import com.fr.data.desensitize.rule.base.DesensitizationRule; +import com.fr.data.desensitize.rule.base.DesensitizationRuleSource; import com.fr.data.desensitize.rule.base.DesensitizationRuleType; import com.fr.design.beans.BasicBeanPane; import com.fr.design.constants.UIConstants; @@ -271,6 +272,15 @@ public class DesensitizationRuleEditPane extends BasicBeanPane Date: Mon, 30 Jan 2023 18:25:49 +0800 Subject: [PATCH 09/14] =?UTF-8?q?=E6=95=B0=E6=8D=AE=E8=84=B1=E6=95=8F?= =?UTF-8?q?=E4=B8=89=E6=9C=9F=20=E3=80=90=E9=97=AE=E9=A2=98=E5=8E=9F?= =?UTF-8?q?=E5=9B=A0=E3=80=91rt=20=E3=80=90=E6=94=B9=E5=8A=A8=E6=80=9D?= =?UTF-8?q?=E8=B7=AF=E3=80=91rt=20=E9=A1=BA=E4=BE=BF=E8=BF=87=E4=B8=80?= =?UTF-8?q?=E4=B8=8B=E5=BC=80=E5=8F=91=E6=96=87=E6=A1=A3=20https://kms.fin?= =?UTF-8?q?eres.com/pages/viewpage.action=3FpageId=3D576039082?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gui/icombocheckbox/UIComboCheckBox.java | 32 +- .../itableeditorpane/UITableEditorPane.java | 54 ++-- .../itableeditorpane/UITableModelAdapter.java | 96 +++--- .../fr/design/layout/FRGUIPaneFactory.java | 18 ++ .../fr/design/layout/VerticalFlowLayout.java | 46 +++ .../cell/settingpane/CellOtherSetPane.java | 122 ++++++- .../CellDesensitizationGroupsPane.java | 127 ++++++++ .../model/CellDesensitizationTableModel.java | 109 +++++++ .../model/DesensitizationCellEditor.java | 43 +++ .../model/DesensitizationCellPane.java | 304 ++++++++++++++++++ .../model/DesensitizationCellRender.java | 49 +++ 11 files changed, 919 insertions(+), 81 deletions(-) create mode 100644 designer-realize/src/main/java/com/fr/design/mainframe/cell/settingpane/desensitization/CellDesensitizationGroupsPane.java create mode 100644 designer-realize/src/main/java/com/fr/design/mainframe/cell/settingpane/desensitization/model/CellDesensitizationTableModel.java create mode 100644 designer-realize/src/main/java/com/fr/design/mainframe/cell/settingpane/desensitization/model/DesensitizationCellEditor.java create mode 100644 designer-realize/src/main/java/com/fr/design/mainframe/cell/settingpane/desensitization/model/DesensitizationCellPane.java create mode 100644 designer-realize/src/main/java/com/fr/design/mainframe/cell/settingpane/desensitization/model/DesensitizationCellRender.java diff --git a/designer-base/src/main/java/com/fr/design/gui/icombocheckbox/UIComboCheckBox.java b/designer-base/src/main/java/com/fr/design/gui/icombocheckbox/UIComboCheckBox.java index 6936d6150..ce0a9f869 100644 --- a/designer-base/src/main/java/com/fr/design/gui/icombocheckbox/UIComboCheckBox.java +++ b/designer-base/src/main/java/com/fr/design/gui/icombocheckbox/UIComboCheckBox.java @@ -17,9 +17,6 @@ import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.event.PopupMenuEvent; import javax.swing.event.PopupMenuListener; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Component; @@ -32,6 +29,9 @@ import java.awt.event.FocusAdapter; import java.awt.event.FocusEvent; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; /** * 设计器下拉复选框组件 @@ -52,7 +52,7 @@ public class UIComboCheckBox extends JComponent implements UIObserver, GlobalNam //选中的值之间显示的分隔符 private String valueSperator; private static final String DEFAULT_VALUE_SPERATOR = ","; - private static final String OMIT_TEXT = "..."; + protected static final String OMIT_TEXT = "..."; private UIObserverListener uiObserverListener; private GlobalNameListener globalNameListener = null; @@ -60,6 +60,7 @@ public class UIComboCheckBox extends JComponent implements UIObserver, GlobalNam private boolean showOmitText = true; private boolean supportSelectAll = true; + private String placeHolder = StringUtils.EMPTY; public UIComboCheckBox(Object[] value) { this(value, DEFAULT_VALUE_SPERATOR, true); @@ -138,6 +139,14 @@ public class UIComboCheckBox extends JComponent implements UIObserver, GlobalNam return editor; } + public String getPlaceHolder() { + return placeHolder; + } + + public void setPlaceHolder(String placeHolder) { + this.placeHolder = placeHolder; + } + public UIButton getArrowButton() { return arrowButton; } @@ -191,6 +200,9 @@ public class UIComboCheckBox extends JComponent implements UIObserver, GlobalNam @Override public void popupMenuWillBecomeInvisible(PopupMenuEvent e) { attributeChange(); + if (uiObserverListener != null) { + uiObserverListener.doChange(); + } } @Override @@ -290,10 +302,20 @@ public class UIComboCheckBox extends JComponent implements UIObserver, GlobalNam String text = builder.length() > 0 ? builder.substring(0, builder.length() - 1) : StringUtils.EMPTY; //计算加省略号后的文本 editor.setText(this.showOmitText ? omitEditorText(editor, text) : text); + // 添加placeHolder + setEditorPlaceHolder(editor); // tooltips显示原值 setEditorToolTipText(editor, text); } + /** + * 为为添加placeholder + * @param editor + */ + protected void setEditorPlaceHolder(UITextField editor) { + // 默认空实现 + } + /** * 为UITextField设置悬浮提示值 * @@ -311,7 +333,7 @@ public class UIComboCheckBox extends JComponent implements UIObserver, GlobalNam * @param text * @return 省略后的文字 */ - private static String omitEditorText(UITextField textEditor, String text) { + protected String omitEditorText(UITextField textEditor, String text) { char[] omitChars = OMIT_TEXT.toCharArray(); //获取字体的大小 FontMetrics fontMetrics = textEditor.getFontMetrics(textEditor.getFont()); diff --git a/designer-base/src/main/java/com/fr/design/gui/itableeditorpane/UITableEditorPane.java b/designer-base/src/main/java/com/fr/design/gui/itableeditorpane/UITableEditorPane.java index 07756a56b..aca38b28d 100644 --- a/designer-base/src/main/java/com/fr/design/gui/itableeditorpane/UITableEditorPane.java +++ b/designer-base/src/main/java/com/fr/design/gui/itableeditorpane/UITableEditorPane.java @@ -8,10 +8,12 @@ import com.fr.design.gui.icontainer.UIScrollPane; import com.fr.design.gui.ilable.UILabel; import com.fr.design.layout.FRGUIPaneFactory; - -import javax.swing.*; +import javax.swing.JPanel; +import javax.swing.JTable; import javax.swing.event.TableModelListener; -import java.awt.*; +import java.awt.BorderLayout; +import java.awt.GridLayout; +import java.awt.Insets; import java.util.List; /** @@ -31,25 +33,25 @@ public class UITableEditorPane extends BasicPane { private String leftLabelName; private JPanel buttonPane; - public UITableEditorPane(UITableModelAdapter model) { - this.tableModel = model; - this.initComponent(model.createAction()); - } + public UITableEditorPane(UITableModelAdapter model) { + this.tableModel = model; + this.initComponent(model.createAction()); + } - public UITableEditorPane(UITableModelAdapter model, String s) { - leftLabelName = s; - this.tableModel = model; - this.initComponent(model.createAction()); - } + public UITableEditorPane(UITableModelAdapter model, String s) { + leftLabelName = s; + this.tableModel = model; + this.initComponent(model.createAction()); + } - private void initComponent(UITableEditAction[] action) { - this.setLayout(FRGUIPaneFactory.createBorderLayout()); - JPanel pane = new JPanel(new BorderLayout(4, 4)); - this.add(pane, BorderLayout.CENTER); + protected void initComponent(UITableEditAction[] action) { + this.setLayout(FRGUIPaneFactory.createBorderLayout()); + JPanel pane = new JPanel(new BorderLayout(4, 4)); + this.add(pane, BorderLayout.CENTER); - UILabel l = new UILabel(leftLabelName); - editTable = tableModel.createTable(); - editTable.getTableHeader().setBackground(UIConstants.DEFAULT_BG_RULER); + UILabel l = new UILabel(leftLabelName); + editTable = tableModel.createTable(); + editTable.getTableHeader().setBackground(UIConstants.DEFAULT_BG_RULER); UIScrollPane scrollPane = new UIScrollPane(editTable); scrollPane.setBorder(new UIRoundedBorder(UIConstants.TITLED_BORDER_COLOR, 1, UIConstants.ARC)); @@ -62,11 +64,11 @@ public class UITableEditorPane extends BasicPane { } - public UITableModelAdapter getTableModel(){ + public UITableModelAdapter getTableModel() { return tableModel; } - private void initbuttonPane(UITableEditAction[] action) { + protected void initbuttonPane(UITableEditAction[] action) { buttonPane = new JPanel(); if (action != null) { @@ -146,6 +148,14 @@ public class UITableEditorPane extends BasicPane { return buttonPane; } + public JTable getEditTable() { + return editTable; + } + + public void setEditTable(JTable editTable) { + this.editTable = editTable; + } + /** * 停止编辑 */ @@ -157,7 +167,7 @@ public class UITableEditorPane extends BasicPane { /** * 设置表头是否可以改变大小 */ - public void setHeaderResizing(boolean resizingAllowed){ + public void setHeaderResizing(boolean resizingAllowed) { editTable.getTableHeader().setResizingAllowed(resizingAllowed); } diff --git a/designer-base/src/main/java/com/fr/design/gui/itableeditorpane/UITableModelAdapter.java b/designer-base/src/main/java/com/fr/design/gui/itableeditorpane/UITableModelAdapter.java index 4506bb9a6..87e21c75b 100644 --- a/designer-base/src/main/java/com/fr/design/gui/itableeditorpane/UITableModelAdapter.java +++ b/designer-base/src/main/java/com/fr/design/gui/itableeditorpane/UITableModelAdapter.java @@ -219,57 +219,69 @@ public abstract class UITableModelAdapter extends AbstractTableModel implemen protected class DeleteAction extends UITableEditAction { private Component component = null; + // 删除时界面显示的提示语,可自定义 + private String deleteTipText; public DeleteAction() { - this.setName(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Delete")); - this.setSmallIcon(BaseUtils.readIcon("/com/fr/base/images/cell/control/remove.png")); - } - + this.setName(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Delete")); + this.setDeleteTipText(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Utils_Are_You_Sure_To_Remove_The_Selected_Item") + "?"); + this.setSmallIcon(BaseUtils.readIcon("/com/fr/base/images/cell/control/remove.png")); + } + public DeleteAction(Component component){ - this.setName(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Delete")); - this.setSmallIcon(BaseUtils.readIcon("/com/fr/base/images/cell/control/remove.png")); + this.setName(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Delete")); + this.setDeleteTipText(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Utils_Are_You_Sure_To_Remove_The_Selected_Item") + "?"); + this.setSmallIcon(BaseUtils.readIcon("/com/fr/base/images/cell/control/remove.png")); this.component = component; } @Override public void actionPerformed(ActionEvent e) { - int[] selectedRow = table.getSelectedRows(); - if (ismultiSelected()) { - FineJOptionPane.showMessageDialog(DesignerContext.getDesignerFrame(),com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Multiple_Select_Warn_Text")); - return; - } - if (table.getCellEditor() != null) { - try { - table.getCellEditor().stopCellEditing(); - } catch (Exception ee) { + int[] selectedRow = table.getSelectedRows(); + if (ismultiSelected()) { + FineJOptionPane.showMessageDialog(DesignerContext.getDesignerFrame(), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Multiple_Select_Warn_Text")); + return; + } + if (table.getCellEditor() != null) { + try { + table.getCellEditor().stopCellEditing(); + } catch (Exception ee) { FineLoggerFactory.getLogger().error(ee.getMessage(), ee); - } - } - if (getRowCount() < 1) { - return; - } - - if(component == null){ - component = DesignerContext.getDesignerFrame(); - } - int val = FineJOptionPane.showConfirmDialog(component, - com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Utils_Are_You_Sure_To_Remove_The_Selected_Item") + "?", com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Remove"), - JOptionPane.OK_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE); - if (val != JOptionPane.OK_OPTION) { - return; - } - for (int i = 0; i < selectedRow.length; i++) { - if (selectedRow[i] - i < 0) { - continue; - } - removeRow(selectedRow[i] - i); - } - fireTableDataChanged(); - int selection = selectedRow[0] > table.getRowCount() ? table.getRowCount() - 1 - : (selectedRow[0] > 1 ? selectedRow[0] - 1 : 0); - table.getSelectionModel().setSelectionInterval(selection, selection); - } + } + } + if (getRowCount() < 1) { + return; + } + + if (component == null) { + component = DesignerContext.getDesignerFrame(); + } + int val = FineJOptionPane.showConfirmDialog(component, getDeleteTipText() + , com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Remove"), + JOptionPane.OK_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE); + if (val != JOptionPane.OK_OPTION) { + return; + } + for (int i = 0; i < selectedRow.length; i++) { + if (selectedRow[i] - i < 0) { + continue; + } + removeRow(selectedRow[i] - i); + } + fireTableDataChanged(); + int selection = selectedRow[0] > table.getRowCount() ? table.getRowCount() - 1 + : (selectedRow[0] > 1 ? selectedRow[0] - 1 : 0); + table.getSelectionModel().setSelectionInterval(selection, selection); + } + + public String getDeleteTipText() { + return deleteTipText; + } + + public void setDeleteTipText(String deleteTipText) { + this.deleteTipText = deleteTipText; + } - private boolean ismultiSelected(){ + private boolean ismultiSelected() { int[] selectedRow = table.getSelectedRows(); return (selectedRow.length == 1 && (selectedRow[0] > table.getRowCount() - 1 || selectedRow[0] < 0)) || selectedRow.length == 0; } diff --git a/designer-base/src/main/java/com/fr/design/layout/FRGUIPaneFactory.java b/designer-base/src/main/java/com/fr/design/layout/FRGUIPaneFactory.java index ce8fdaa9d..417533465 100644 --- a/designer-base/src/main/java/com/fr/design/layout/FRGUIPaneFactory.java +++ b/designer-base/src/main/java/com/fr/design/layout/FRGUIPaneFactory.java @@ -607,6 +607,24 @@ public class FRGUIPaneFactory { return jp; } + /** + * 创建垂直流布局,水平填充面板 + * + * @param isAlignLeft 是否左对齐 + * @param align the alignment value + * @param hgap the horizontal gap between components + * @param vgap the vertical gap between components + * @param hfill 水平填充组件 + * @return JPanel对象 + */ + public static JPanel createVerticalFlowLayout_F_Pane(boolean isAlignLeft, int align, int hgap, int vgap, boolean hfill) { + JPanel jp = new JPanel(); + VerticalFlowLayout layout = new VerticalFlowLayout(align, hgap, vgap, hfill); + layout.setAlignLeft(isAlignLeft); + jp.setLayout(layout); + return jp; + } + /** * 创建边框面板L * diff --git a/designer-base/src/main/java/com/fr/design/layout/VerticalFlowLayout.java b/designer-base/src/main/java/com/fr/design/layout/VerticalFlowLayout.java index c857c7301..9f91fee50 100644 --- a/designer-base/src/main/java/com/fr/design/layout/VerticalFlowLayout.java +++ b/designer-base/src/main/java/com/fr/design/layout/VerticalFlowLayout.java @@ -95,6 +95,15 @@ public class VerticalFlowLayout implements LayoutManager, java.io.Serializable { */ protected int vgap; + + /** + * true: 水平填充组件 + * + * @see #isHfill() + * @see #setHfill(boolean) + */ + protected boolean hfill; + /** * Constructs a new FlowLayout with a centered alignment and a * default 5-unit horizontal and vertical gap. @@ -135,6 +144,14 @@ public class VerticalFlowLayout implements LayoutManager, java.io.Serializable { setAlignment(align); } + public VerticalFlowLayout(int align, int hgap, int vgap, boolean fill) { + this.hgap = hgap; + this.vgap = vgap; + this.hfill = fill; + + setAlignment(align); + } + /** * Gets the alignment for this layout. * Possible values are FlowLayout.TOP, @@ -219,6 +236,31 @@ public class VerticalFlowLayout implements LayoutManager, java.io.Serializable { * @param name the name of the component * @param comp the component to be added */ + + /** + * Gets the horizontal filling of components in the + * Container.The default is false. + * + * @return the horizontal filling of components in the + * Container + * @see #setHfill(boolean) + */ + public boolean isHfill() { + return hfill; + } + + /** + * Sets the horizontal filling of components in the + * Container.The default is false. + * + * @param hfill the horizontal filling of components in the + * Container + * @see #isHfill() + */ + public void setHfill(boolean hfill) { + this.hfill = hfill; + } + @Override public void addLayoutComponent(String name, Component comp) { } @@ -379,6 +421,7 @@ public class VerticalFlowLayout implements LayoutManager, java.io.Serializable { Insets insets = target.getInsets(); int maxlen = getMaxLen4LayoutContainer(target, insets); + int maxwidth = target.getWidth() - (insets.left + insets.right); int nmembers = target.getComponentCount(); int x = getX4LayoutContainer(insets), y = getY4LayoutContainer(insets); int roww = 0, start = 0; @@ -390,6 +433,9 @@ public class VerticalFlowLayout implements LayoutManager, java.io.Serializable { Component m = target.getComponent(i); if (m.isVisible()) { Dimension d = getPreferredSize(target, m); + if (hfill) { + d.width = maxwidth; + } m.setSize(d.width, d.height); rs = dealWithDim4LayoutContainer(target, insets, d, x, y, roww, start, maxlen, i, ltr); diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/cell/settingpane/CellOtherSetPane.java b/designer-realize/src/main/java/com/fr/design/mainframe/cell/settingpane/CellOtherSetPane.java index 4cddfea73..942bb05c3 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/cell/settingpane/CellOtherSetPane.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/cell/settingpane/CellOtherSetPane.java @@ -3,6 +3,7 @@ package com.fr.design.mainframe.cell.settingpane; import com.fr.base.Style; import com.fr.design.constants.LayoutConstants; import com.fr.design.constants.UIConstants; +import com.fr.design.dialog.link.MessageWithLink; import com.fr.design.editor.ValueEditorPane; import com.fr.design.editor.ValueEditorPaneFactory; import com.fr.design.file.HistoryTemplateListPane; @@ -11,6 +12,7 @@ import com.fr.design.gui.ibutton.UIButtonGroup; import com.fr.design.gui.ibutton.UIRadioButton; import com.fr.design.gui.icheckbox.UICheckBox; import com.fr.design.gui.icombobox.UIComboBox; +import com.fr.design.gui.ilable.MultilineLabel; import com.fr.design.gui.ilable.UILabel; import com.fr.design.gui.ispinner.UISpinner; import com.fr.design.gui.itextfield.UITextField; @@ -21,12 +23,14 @@ import com.fr.design.layout.TableLayoutHelper; import com.fr.design.layout.VerticalFlowLayout; import com.fr.design.mainframe.EastRegionContainerPane; import com.fr.design.mainframe.JTemplate; +import com.fr.design.mainframe.cell.settingpane.desensitization.CellDesensitizationGroupsPane; import com.fr.design.mainframe.theme.utils.DefaultThemedTemplateCellElementCase; import com.fr.design.utils.gui.UIComponentUtils; import com.fr.design.widget.FRWidgetFactory; import com.fr.general.ComparatorUtils; import com.fr.general.FRFont; import com.fr.report.cell.TemplateCellElement; +import com.fr.report.cell.cellattr.CellDesensitizationAttr; import com.fr.report.cell.cellattr.CellGUIAttr; import com.fr.report.cell.cellattr.CellInsertPolicyAttr; import com.fr.report.cell.cellattr.CellPageAttr; @@ -45,10 +49,12 @@ import java.awt.CardLayout; import java.awt.Color; import java.awt.Component; import java.awt.Dimension; +import java.awt.FlowLayout; import java.awt.Insets; import java.awt.Rectangle; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; +import java.util.ArrayList; /** * @author zhou @@ -117,23 +123,85 @@ public class CellOtherSetPane extends AbstractCellAttrPane { private JPanel insertRowPolicyPane; private JPanel defaultValuePane; + // 数据脱敏 + private UILabel scopeLabel; + private UIRadioButton exportButton; + private UIRadioButton previewAndExportButton; + private UIRadioButton[] desensitizationButtons; + private CellDesensitizationGroupsPane groupsPane; + private final int EXPORT_SCOPE = 0; + private final int PREVIEW_AND_EXPORT_SCOPE = 1; + private static final Color TIPS_FONT_COLOR = new Color(0x8f8f92); + /** * 初始化 * * @return 面板 */ public JPanel createContentPane() { - JPanel downPane = new JPanel(new BorderLayout()); - downPane.add(new UIExpandablePane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Advaced"), HEAD_WDITH, HEAD_HEIGTH, seniorPane()), BorderLayout.NORTH); - downPane.add(new UIExpandablePane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Pagination"), HEAD_WDITH, HEAD_HEIGTH, pagePane()), BorderLayout.CENTER); - JPanel contentPane = new JPanel(new BorderLayout(0, 0)); - contentPane.add(new UIExpandablePane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Basic"), HEAD_WDITH, HEAD_HEIGTH, basicPane()), BorderLayout.NORTH); - contentPane.add(downPane, BorderLayout.CENTER); - initAllNames(); + JPanel contentPane = FRGUIPaneFactory.createVerticalFlowLayout_F_Pane(true, VerticalFlowLayout.TOP, 0, 0, true); + + contentPane.add(new UIExpandablePane(Toolkit.i18nText("Fine-Design_Report_Basic"), HEAD_WDITH, HEAD_HEIGTH, basicPane())); + contentPane.add(new UIExpandablePane(Toolkit.i18nText("Fine-Design_Report_Advaced"), HEAD_WDITH, HEAD_HEIGTH, seniorPane())); + contentPane.add(new UIExpandablePane(Toolkit.i18nText("Fine-Design_Report_Pagination"), HEAD_WDITH, HEAD_HEIGTH, pagePane())); + contentPane.add(new UIExpandablePane(Toolkit.i18nText("Fine-Design_Report_Desensitization"), HEAD_WDITH, HEAD_HEIGTH, desensitizePane())); + // VerticalFlowLayout 与 实现的滚动条有冲突,因此再加一层panel + JPanel jPanel = new JPanel(); + jPanel.add(contentPane); + return jPanel; + } + + private JPanel desensitizePane() { + JPanel scopePane = initScopePane(); + + // 带超链的提示信息 + UILabel label = new UILabel(); + MessageWithLink hyperlink = new MessageWithLink( + Toolkit.i18nText("Fine-Design_Report_Desensitization_Tip"), + Toolkit.i18nText("Fine-Design_Report_Desensitization_Hyperlink"), + Toolkit.i18nText("Fine-Design_Report_Desensitization_Help_Document_Url"), + StringUtils.EMPTY, + label.getBackground(), + label.getFont(), + Color.LIGHT_GRAY + ); + + groupsPane = new CellDesensitizationGroupsPane(this); + + JPanel contentPane = FRGUIPaneFactory.createVerticalFlowLayout_F_Pane(true, VerticalFlowLayout.TOP, 0, 0, true); + contentPane.add(scopePane); + contentPane.add(hyperlink); + contentPane.add(groupsPane); + return contentPane; } + /** + * 脱敏设置应用范围panel + * @return + */ + private JPanel initScopePane() { + scopeLabel = new UILabel(Toolkit.i18nText("Fine-Design_Report_Desensitization_Scope")); + exportButton = new UIRadioButton(Toolkit.i18nText("Fine-Design_Report_Desensitization_Export")); + previewAndExportButton = new UIRadioButton(Toolkit.i18nText("Fine-Design_Report_Desensitization_Preview_Export")); + desensitizationButtons = new UIRadioButton[]{ + exportButton, previewAndExportButton + }; + + ButtonGroup buttonGroup = new ButtonGroup(); + for (UIRadioButton radioButton : desensitizationButtons) { + buttonGroup.add(radioButton); + } + + JPanel head = new JPanel(); + head.setLayout(new FlowLayout(FlowLayout.LEFT)); + head.add(scopeLabel); + head.add(exportButton); + head.add(previewAndExportButton); + return head; + } + private JPanel basicPane() { defaultAutoRadioButton = new UIRadioButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Follow_Paper_Settings")); noAutoRadioButton = new UIRadioButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_No_Auto_Adjust")); @@ -211,7 +279,7 @@ public class CellOtherSetPane extends AbstractCellAttrPane { double[] rowSize = {p, p, p}; double[] columnSize = {f}; - Component[][] components = new Component[][] { + Component[][] components = new Component[][]{ new Component[]{insertRowPolicyLabel}, new Component[]{insertRowPolicyButtonGroup}, new Component[]{insertRowPane}, @@ -220,7 +288,7 @@ public class CellOtherSetPane extends AbstractCellAttrPane { } else { double[] rowSize = {p, p}; double[] columnSize = {f, BUTTON_GROUP_WIDTH}; - Component[][] components = new Component[][] { + Component[][] components = new Component[][]{ new Component[]{insertRowPolicyLabel, insertRowPolicyButtonGroup}, new Component[]{null, insertRowPane}, }; @@ -243,7 +311,7 @@ public class CellOtherSetPane extends AbstractCellAttrPane { int[][] rowCount = {{1, 1}, {1, 1}, {1, 1}, {1, 1}}; JPanel fileNamePane = createNormal(); - fileNamePane.setBorder(BorderFactory.createEmptyBorder(0,12,0,0)); + fileNamePane.setBorder(BorderFactory.createEmptyBorder(0, 12, 0, 0)); UILabel showContentLabel = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Show_Content"), SwingConstants.LEFT); UIComponentUtils.setLineWrap(showContentLabel); @@ -389,9 +457,9 @@ public class CellOtherSetPane extends AbstractCellAttrPane { currentPageFixedRowDataTipLabel.setBorder(UIConstants.CELL_ATTR_ZEROBORDER); currentPageFixedRowDataTipLabel.setForeground(TIPS_FONT_COLOR); double p = TableLayout.PREFERRED; - double[] rowSize = {p, p, p, p, p, p, p, p, p, p, p,p}; + double[] rowSize = {p, p, p, p, p, p, p, p, p, p, p, p}; double[] columnSize = {p}; - int[][] rowCount = {{1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1},{1,1},{1,1}}; + int[][] rowCount = {{1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}}; Component[][] components = new Component[][]{ new Component[]{null}, new Component[]{pageBeforeRowCheckBox}, @@ -622,6 +690,19 @@ public class CellOtherSetPane extends AbstractCellAttrPane { if (!jTemplate.isJWorkBook()) { //表单中报表块编辑屏蔽掉 插入行策略 insertRowPolicyPane.setVisible(false); } + + populateDesensitizationBean(cellElement); + } + + private void populateDesensitizationBean(TemplateCellElement cellElement) { + CellDesensitizationAttr cellDesensitizationAttr = cellElement.getCellDesensitizationAttr(); + if (cellDesensitizationAttr == null) { + cellDesensitizationAttr = new CellDesensitizationAttr(); + } + boolean exportSelected = cellDesensitizationAttr.getScope() == 0; + exportButton.setSelected(exportSelected); + previewAndExportButton.setSelected(!exportSelected); + groupsPane.populate(cellDesensitizationAttr.getDesensitizationBeans()); } /** @@ -714,6 +795,23 @@ public class CellOtherSetPane extends AbstractCellAttrPane { cellElement.setCellGUIAttr(cellGUIAttr); } updatePageAttr(cellElement); + + updateDesensitizationAttr(cellElement); + } + + /** + * 更新数据脱敏设置 + * + * @param cellElement + */ + private void updateDesensitizationAttr(TemplateCellElement cellElement) { + CellDesensitizationAttr cellDesensitizationAttr = cellElement.getCellDesensitizationAttr(); + if (cellDesensitizationAttr == null) { + cellDesensitizationAttr = new CellDesensitizationAttr(); + } + cellDesensitizationAttr.setScope(exportButton.isSelected() ? EXPORT_SCOPE : PREVIEW_AND_EXPORT_SCOPE); + cellDesensitizationAttr.setDesensitizationBeans(new ArrayList<>(groupsPane.update())); + cellElement.setCellDesensitizationAttr(cellDesensitizationAttr); } diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/cell/settingpane/desensitization/CellDesensitizationGroupsPane.java b/designer-realize/src/main/java/com/fr/design/mainframe/cell/settingpane/desensitization/CellDesensitizationGroupsPane.java new file mode 100644 index 000000000..1c4f200cb --- /dev/null +++ b/designer-realize/src/main/java/com/fr/design/mainframe/cell/settingpane/desensitization/CellDesensitizationGroupsPane.java @@ -0,0 +1,127 @@ +package com.fr.design.mainframe.cell.settingpane.desensitization; + +import com.fr.design.constants.UIConstants; +import com.fr.design.gui.ibutton.UIButton; +import com.fr.design.gui.ilable.UILabel; +import com.fr.design.gui.itableeditorpane.UITableEditAction; +import com.fr.design.gui.itableeditorpane.UITableEditorPane; +import com.fr.design.i18n.Toolkit; +import com.fr.design.layout.FRGUIPaneFactory; +import com.fr.design.layout.TableLayout; +import com.fr.design.layout.TableLayoutHelper; +import com.fr.design.layout.VerticalFlowLayout; +import com.fr.design.mainframe.cell.settingpane.AbstractCellAttrPane; +import com.fr.design.mainframe.cell.settingpane.desensitization.model.CellDesensitizationTableModel; +import com.fr.report.cell.desensitization.CellDesensitizationBean; + +import javax.swing.JPanel; +import javax.swing.JTable; +import java.awt.BorderLayout; +import java.awt.Color; +import java.awt.Component; +import java.util.List; +import java.util.Objects; + +/** + * 数据脱敏规则设置面板 + * + * @author Leo.Qin + * @version 11.0 + * Created by Leo.Qin on 2022/11/15 + */ +public class CellDesensitizationGroupsPane extends JPanel { + private final CellDesensitizationTableModel model; + + // 规则编辑面板 + UITableEditorPane editorPane; + + // 添加规则按钮面板 + private JPanel addRulePane; + + public CellDesensitizationGroupsPane(AbstractCellAttrPane pane) { + model = new CellDesensitizationTableModel(pane, this); + + initComponent(); + } + + private void initComponent() { + this.setLayout(new VerticalFlowLayout(VerticalFlowLayout.TOP, 0, 10, true)); + + addRulePane = initAddPane(model); + editorPane = initEditorPane(model); + + this.add(addRulePane); + this.add(editorPane); + } + + /** + * 初始化添加脱敏设置面板 + * + * @param model + * @return + */ + private JPanel initAddPane(CellDesensitizationTableModel model) { + UIButton addButton = new UIButton(model.getAction()); + UILabel addLabel = new UILabel(Toolkit.i18nText("Fine-Design_Report_Desensitization_Setting")); + + double p = TableLayout.PREFERRED; + double f = TableLayout.FILL; + double[] columnSize = {p, f}; + double[] rowSize = {p, p}; + + Component[][] components = new Component[][]{ + new Component[]{addLabel, addButton} + }; + + return TableLayoutHelper.createGapTableLayoutPane(components, rowSize, columnSize, 20, 0); + } + + /** + * 初始化脱敏设置编辑面板 + * + * @param model + * @return + */ + private UITableEditorPane initEditorPane(CellDesensitizationTableModel model) { + UITableEditorPane tableEditorPane = new UITableEditorPane(model) { + @Override + protected void initComponent(UITableEditAction[] action) { + this.setLayout(FRGUIPaneFactory.createBorderLayout()); + + JTable editTable = getTableModel().createTable(); + editTable.getTableHeader().setBackground(UIConstants.DEFAULT_BG_RULER); + setEditTable(editTable); + + initbuttonPane(action); + getbuttonPane().setBackground(UIConstants.DEFAULT_BG_RULER); + + JPanel controlPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); + controlPane.setBackground(Color.WHITE); + controlPane.add(getbuttonPane(), BorderLayout.WEST); + + JPanel pane = new JPanel(new BorderLayout(4, 4)); + pane.add(editTable, BorderLayout.CENTER); + pane.add(controlPane, BorderLayout.NORTH); + + this.add(pane, BorderLayout.CENTER); + } + }; + return tableEditorPane; + } + + /** + * 更新数据 + */ + public List update() { + return editorPane.update(); + } + + /** + * 填充数据 + */ + public void populate(List desensitizationBeans) { + if (Objects.nonNull(desensitizationBeans)) { + editorPane.populate(desensitizationBeans.toArray(new CellDesensitizationBean[]{})); + } + } +} diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/cell/settingpane/desensitization/model/CellDesensitizationTableModel.java b/designer-realize/src/main/java/com/fr/design/mainframe/cell/settingpane/desensitization/model/CellDesensitizationTableModel.java new file mode 100644 index 000000000..f73b344a8 --- /dev/null +++ b/designer-realize/src/main/java/com/fr/design/mainframe/cell/settingpane/desensitization/model/CellDesensitizationTableModel.java @@ -0,0 +1,109 @@ +package com.fr.design.mainframe.cell.settingpane.desensitization.model; + +import com.fr.design.gui.itableeditorpane.UITableEditAction; +import com.fr.design.gui.itableeditorpane.UITableModelAdapter; +import com.fr.design.i18n.Toolkit; +import com.fr.design.mainframe.cell.settingpane.AbstractCellAttrPane; +import com.fr.report.cell.desensitization.CellDesensitizationBean; +import com.fr.stable.StringUtils; + +import java.awt.Component; +import java.awt.event.ActionEvent; + +/** + * 单元格数据脱敏model + * + * @author Leo.Qin + * @version 11.0 + * Created by Leo.Qin on 2023/1/4 + */ +public class CellDesensitizationTableModel extends UITableModelAdapter { + private final int ROW_HEIGHT = 60; + /** + * 属性面板 + */ + private AbstractCellAttrPane attrPane; + /** + * 添加脱敏设置action + */ + private AddDesensitizationAction action; + + public CellDesensitizationTableModel(AbstractCellAttrPane attrPane, Component parent) { + super(new String[]{StringUtils.EMPTY}); + this.attrPane = attrPane; + this.action = new AddDesensitizationAction(); + this.table.getTableHeader().setVisible(false); + this.table.setRowHeight(ROW_HEIGHT); + + setColumnClass(new Class[]{ + DesensitizationCellEditor.class + }); + + this.setDefaultEditor(DesensitizationCellEditor.class, new DesensitizationCellEditor(parent, this)); + this.setDefaultRenderer(DesensitizationCellEditor.class, new DesensitizationCellRender(parent, this)); + } + + @Override + public UITableEditAction[] createAction() { + + return new UITableEditAction[]{ + new MoveUpAction(), + new MoveDownAction(), + new DeleteDesensitizationAction() + }; + } + + public AddDesensitizationAction getAction() { + return action; + } + + /** + * 添加脱敏规则action + */ + public class AddDesensitizationAction extends AddTableRowAction { + + public AddDesensitizationAction() { + this.setName(StringUtils.EMPTY); + } + + @Override + public void actionPerformed(ActionEvent e) { + super.actionPerformed(e); + // 添加一条空白数据 + addRow(CellDesensitizationBean.createEmptyBean()); + table.getSelectionModel().setSelectionInterval(table.getRowCount() - 1, table.getRowCount() - 1); + fireTableDataChanged(); + } + + } + + private class DeleteDesensitizationAction extends DeleteAction { + public DeleteDesensitizationAction() { + super(); + this.setDeleteTipText(Toolkit.i18nText("Fine-Design_Report_Desensitization_Remove_Tip")); + } + } + + + @Override + public Object getValueAt(int rowIndex, int columnIndex) { + CellDesensitizationBean desensitizationBean = getList().get(rowIndex); + if (desensitizationBean == null) { + desensitizationBean = CellDesensitizationBean.createEmptyBean(); + } + return desensitizationBean; + } + + @Override + public boolean isCellEditable(int row, int col) { + return true; + } + + /** + * 手动触发模版变化,用于更新单元格脱敏设置属性 + */ + public void fireAttrChanged() { + attrPane.attributeChanged(); + } + +} diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/cell/settingpane/desensitization/model/DesensitizationCellEditor.java b/designer-realize/src/main/java/com/fr/design/mainframe/cell/settingpane/desensitization/model/DesensitizationCellEditor.java new file mode 100644 index 000000000..a20483364 --- /dev/null +++ b/designer-realize/src/main/java/com/fr/design/mainframe/cell/settingpane/desensitization/model/DesensitizationCellEditor.java @@ -0,0 +1,43 @@ +package com.fr.design.mainframe.cell.settingpane.desensitization.model; + +import com.fr.report.cell.desensitization.CellDesensitizationBean; + +import javax.swing.AbstractCellEditor; +import javax.swing.JPanel; +import javax.swing.JTable; +import javax.swing.border.LineBorder; +import javax.swing.table.TableCellEditor; +import java.awt.Color; +import java.awt.Component; + +/** + * 脱敏规则设置cellEditor + * @author Leo.Qin + * @version 11.0 + * Created by Leo.Qin on 2023/1/4 + */ +public class DesensitizationCellEditor extends AbstractCellEditor implements TableCellEditor { + private final DesensitizationCellPane editPane; + + DesensitizationCellEditor(Component parent, CellDesensitizationTableModel model) { + editPane = new DesensitizationCellPane(parent, model); + } + + + @Override + public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) { + + editPane.populate((CellDesensitizationBean) value, row); + + JPanel editPanel = editPane.getEditPanel(); + editPanel.setBorder(new LineBorder(Color.LIGHT_GRAY)); + + return editPanel; + + } + + @Override + public Object getCellEditorValue() { + return editPane.getCellEditorValue(); + } +} diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/cell/settingpane/desensitization/model/DesensitizationCellPane.java b/designer-realize/src/main/java/com/fr/design/mainframe/cell/settingpane/desensitization/model/DesensitizationCellPane.java new file mode 100644 index 000000000..b4a21a48c --- /dev/null +++ b/designer-realize/src/main/java/com/fr/design/mainframe/cell/settingpane/desensitization/model/DesensitizationCellPane.java @@ -0,0 +1,304 @@ +package com.fr.design.mainframe.cell.settingpane.desensitization.model; + +import com.fr.data.desensitize.rule.DesensitizationRuleManager; +import com.fr.data.desensitize.rule.base.DesensitizationRule; +import com.fr.data.desensitize.rule.base.DesensitizationRuleStatus; +import com.fr.design.beans.BasicBeanPane; +import com.fr.design.data.datapane.preview.desensitization.TableDataPreviewDesensitizeManager; +import com.fr.design.data.datapane.preview.desensitization.view.rule.DesensitizationRulePane; +import com.fr.design.dialog.BasicDialog; +import com.fr.design.dialog.DialogActionAdapter; +import com.fr.design.event.UIObserverListener; +import com.fr.design.gui.ibutton.UIButton; +import com.fr.design.gui.icombocheckbox.UIComboCheckBox; +import com.fr.design.gui.ilable.UILabel; +import com.fr.design.gui.itextfield.UITextField; +import com.fr.design.i18n.Toolkit; +import com.fr.design.layout.FRGUIPaneFactory; +import com.fr.design.layout.TableLayout; +import com.fr.design.layout.TableLayoutHelper; +import com.fr.design.layout.VerticalFlowLayout; +import com.fr.report.cell.desensitization.CellDesensitizationBean; +import com.fr.stable.StringUtils; +import com.fr.third.org.apache.commons.collections4.map.HashedMap; + +import javax.swing.JComponent; +import javax.swing.JPanel; +import javax.swing.SwingUtilities; +import java.awt.BorderLayout; +import java.awt.Color; +import java.awt.Component; +import java.awt.FontMetrics; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.util.HashMap; +import java.util.LinkedHashSet; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; +import java.util.Set; + +/** + * 单元格脱敏规则设置面板 + * + * @author Leo.Qin + * @version 11.0 + * Created by Leo.Qin on 2023/1/5 + */ +public class DesensitizationCellPane extends BasicBeanPane { + private Component parent; + private JPanel editPanel; + private UILabel label; + private UITextField emptyTextField; + private UIButton ruleButton; + private UITextField ruleTextField; + private UIComboCheckBox rolesComboBox; + private static final String APOSTROPHE = "..."; + private Map roleMap; + private DesensitizationRule rule; + private CellDesensitizationTableModel model; + + + DesensitizationCellPane(Component parent, CellDesensitizationTableModel model) { + this.parent = parent; + this.model = model; + + initComponent(); + + addListener(); + } + + private void initComponent() { + editPanel = new JPanel(); + editPanel.setLayout(new VerticalFlowLayout(VerticalFlowLayout.TOP, 0, 0, true)); + + label = new UILabel(); + label.setEnabled(false); + editPanel.add(label); + + ruleButton = new UIButton(APOSTROPHE); + + ruleTextField = new UITextField(); + ruleTextField.setEnabled(true); + ruleTextField.setEditable(false); + ruleTextField.setPlaceholder(Toolkit.i18nText("Fine-Design_Report_Desensitization_Rule_Place_Holder")); + + roleMap = new HashedMap<>(); + rolesComboBox = new RuleUIComboCheckBox(); + rolesComboBox.setPlaceHolder(Toolkit.i18nText("Fine-Design_Report_Desensitization_Role_Place_Holder")); + rolesComboBox.setEnabled(true); + + emptyTextField = new UITextField(); + emptyTextField.setEnabled(false); + emptyTextField.setOpaque(false); + + editPanel.add(initTableCellPanel()); + } + + + /** + * 初始化单元格中的panel + */ + private JPanel initTableCellPanel() { + double f = TableLayout.FILL; + double p = TableLayout.PREFERRED; + + double[] rowSize = new double[]{f, f}; + double[] columnSize = new double[]{p, f}; + + Component[][] components = new Component[][]{ + new Component[]{ruleButton, ruleTextField}, + new Component[]{emptyTextField, rolesComboBox} + }; + return TableLayoutHelper.createGapTableLayoutPane(components, rowSize, columnSize, 0, 0); + } + + private void addListener() { + ruleButton.addActionListener(chooseRuleListener); + + rolesComboBox.registerChangeListener(uiObserverListener); + } + + + private final UIObserverListener uiObserverListener = new UIObserverListener() { + @Override + public void doChange() { + CellDesensitizationBean selectBean = model.getSelectedValue(); + Set roleIds = generateRolesIdsBySelectedValues(); + if (Objects.nonNull(selectBean) && !selectBean.getRoleIds().equals(roleIds)) { + selectBean.setRoleIds(generateRolesIdsBySelectedValues()); + model.fireAttrChanged(); + } + } + }; + + private final ActionListener chooseRuleListener = new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + CellDesensitizationBean selectBean = model.getSelectedValue(); + DesensitizationRulePane rulePane = new DesensitizationRulePane(); + BasicDialog ruleDialog = rulePane.showWindowWithCustomSize(SwingUtilities.getWindowAncestor(parent), new DialogActionAdapter() { + + @Override + public void doOk() { + rule = rulePane.updateBean(); + if (Objects.nonNull(selectBean) && Objects.nonNull(rule) && !selectBean.getDesensitizationRule().equals(rule)) { + selectBean.setDesensitizationRule(rule); + ruleTextField.setText(rule.getRuleName()); + + // 非正常状态需要颜色修改为红色 + refreshRuleState(selectBean); + + model.fireAttrChanged(); + } + rule = null; + } + }, BasicDialog.DEFAULT); + + ruleDialog.setVisible(true); + } + }; + + /** + * 根据当前的规则配置信息,生成选中的rolesMap用来展示 + */ + public Map generateRolesCheckBoxSelectedValues(CellDesensitizationBean bean) { + Map result = new HashMap<>(roleMap.size()); + for (Map.Entry roleEntry : roleMap.entrySet()) { + String roleId = roleEntry.getKey(); + String roleName = roleEntry.getValue(); + result.put(roleName, bean.getRoleIds().contains(roleId)); + } + return result; + } + + /** + * 根据当前的RoleName选择项,生成其对应的RoleId的set存入规则配置信息 + */ + public Set generateRolesIdsBySelectedValues() { + Set result = new LinkedHashSet<>(); + Object[] selectedValues = rolesComboBox.getSelectedValues(); + for (Object selectedValue : selectedValues) { + String selectedRoleName = (String) selectedValue; + if (roleMap.containsValue(selectedRoleName)) { + Optional> matchedEntry = roleMap.entrySet().stream().filter(entry -> StringUtils.equals(entry.getValue(), selectedRoleName)).findFirst(); + matchedEntry.ifPresent(stringStringEntry -> result.add(stringStringEntry.getKey())); + } + } + return result; + } + + public JPanel getEditPanel() { + return editPanel; + } + + /** + * 填充数据 + */ + public void populate(CellDesensitizationBean value, int row) { + + refreshRoles(); + + String ruleName = value.getDesensitizationRule().getRuleName(); + ruleTextField.setText(ruleName); + + // 非正常状态需要颜色修改为红色 + refreshRuleState(value); + + Map map = generateRolesCheckBoxSelectedValues(value); + rolesComboBox.setSelectedValues(map); + + label.setText(Toolkit.i18nText("Fine-Design_Report_Desensitization_Setting") + row); + } + + private void refreshRoles() { + Map roles = TableDataPreviewDesensitizeManager.getInstance().getAllRoles(); + if (!roleMap.equals(roles)) { + roleMap = roles; + rolesComboBox.refreshCombo(roles.values().toArray()); + } + } + + private void refreshRuleState(CellDesensitizationBean value) { + DesensitizationRuleStatus ruleStatus = DesensitizationRuleManager.getInstance().getRuleStatus(value.getDesensitizationRule()); + if (value.equals(CellDesensitizationBean.createEmptyBean())) { + ruleTextField.setForeground(Color.GRAY); + } else if (ruleStatus != DesensitizationRuleStatus.NORMAL) { + ruleTextField.setForeground(Color.RED); + } else { + ruleTextField.setForeground(Color.BLACK); + } + } + + @Deprecated + @Override + public void populateBean(Object ob) { + } + + @Deprecated + @Override + public Object updateBean() { + return null; + } + + @Deprecated + @Override + protected String title4PopupWindow() { + return null; + } + + public Object getCellEditorValue() { + return ruleTextField.getText(); + } + + + private class RuleUIComboCheckBox extends UIComboCheckBox { + public RuleUIComboCheckBox() { + super(DesensitizationCellPane.this.roleMap.values().toArray(), true); + } + + @Override + protected void setLayoutAndAddComponents() { + // 使用BorderLayout,否则默认使用的FlowLayout会让整个下拉选框使用最小Size,然后TableCell这边会出现空白 + this.setLayout(FRGUIPaneFactory.createBorderLayout()); + this.add(getEditor(), BorderLayout.CENTER); + this.add(getArrowButton(), BorderLayout.EAST); + } + + @Override + protected void setEditorToolTipText(JComponent editor, String text) { + // 选项过多时,已选中的值会做省略显示处理,此处添加一个Tooltips,显示完整值 + if (text != null) { + editor.setToolTipText(text); + } + } + + @Override + protected void setEditorPlaceHolder(UITextField editor) { + editor.setPlaceholder(this.getPlaceHolder()); + } + + @Override + protected String omitEditorText(UITextField textEditor, String text) { + char[] omitChars = OMIT_TEXT.toCharArray(); + //获取字体的大小 + FontMetrics fontMetrics = textEditor.getFontMetrics(textEditor.getFont()); + //计算省略号的长度 + int omitLength = fontMetrics.charsWidth(omitChars, 0, omitChars.length); + String omitText = StringUtils.EMPTY; + char[] chars = text.toCharArray(); + + for (int i = 1; i <= chars.length; i++) { + //如果原文本+省略号长度超过文本框 + int width = textEditor.getWidth(); + if (width != 0 && fontMetrics.charsWidth(chars, 0, i) + omitLength > width) { + //从第i-1的位置截断再拼上省略号 + omitText = text.substring(0, i - 2) + OMIT_TEXT; + break; + } + } + + return omitText.equals(StringUtils.EMPTY) ? text : omitText; + } + } +} diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/cell/settingpane/desensitization/model/DesensitizationCellRender.java b/designer-realize/src/main/java/com/fr/design/mainframe/cell/settingpane/desensitization/model/DesensitizationCellRender.java new file mode 100644 index 000000000..fe04fa5b5 --- /dev/null +++ b/designer-realize/src/main/java/com/fr/design/mainframe/cell/settingpane/desensitization/model/DesensitizationCellRender.java @@ -0,0 +1,49 @@ +package com.fr.design.mainframe.cell.settingpane.desensitization.model; + +import com.fr.report.cell.desensitization.CellDesensitizationBean; + +import javax.swing.BorderFactory; +import javax.swing.JTable; +import javax.swing.border.LineBorder; +import javax.swing.table.DefaultTableCellRenderer; +import java.awt.Color; +import java.awt.Component; + +/** + * 脱敏规则设置cellRenderer + * + * @author Leo.Qin + * @version 11.0 + * Created by Leo.Qin on 2023/1/4 + */ +public class DesensitizationCellRender extends DefaultTableCellRenderer { + + private final DesensitizationCellPane editPane; + + + DesensitizationCellRender(Component parent, CellDesensitizationTableModel model) { + editPane = new DesensitizationCellPane(parent, model); + } + + + public Object getCellEditorValue() { + return editPane.getCellEditorValue(); + } + + + @Override + public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { + + editPane.populate((CellDesensitizationBean) value, row); + if (table.isCellSelected(row, column)) { + // 设置选中框 + editPane.getEditPanel().setBorder(new LineBorder(Color.LIGHT_GRAY)); + } else { + editPane.getEditPanel().setBorder(BorderFactory.createEmptyBorder()); + } + + return editPane.getEditPanel(); + } + + +} From 6123c5ff59e285e4dbed6efff7df2911ecd2d172 Mon Sep 17 00:00:00 2001 From: "Leo.Qin" Date: Tue, 31 Jan 2023 15:42:06 +0800 Subject: [PATCH 10/14] =?UTF-8?q?REPORT-88365=20=E5=86=B3=E7=AD=96?= =?UTF-8?q?=E6=8A=A5=E8=A1=A8=EF=BC=8C=E5=8D=95=E5=85=83=E6=A0=BC=E6=8F=92?= =?UTF-8?q?=E5=85=A5=E6=95=B0=E6=8D=AE=E5=88=97=EF=BC=8C=E5=8D=95=E5=85=83?= =?UTF-8?q?=E6=A0=BC=E5=85=83=E7=B4=A0=E9=A1=B5=E9=9D=A2=E6=9C=89=E5=BC=82?= =?UTF-8?q?=E5=B8=B8=20=E3=80=90=E9=97=AE=E9=A2=98=E5=8E=9F=E5=9B=A0?= =?UTF-8?q?=E3=80=91=E5=8D=95=E9=80=89=E6=97=B6=E9=BB=98=E8=AE=A4=E5=B0=86?= =?UTF-8?q?cellDSColumnAdvancedPane=E7=9A=84visible=E8=AE=BE=E4=B8=BAtrue?= =?UTF-8?q?=EF=BC=8C=E5=AF=BC=E8=87=B4=E6=98=BE=E7=A4=BA=E5=BC=82=E5=B8=B8?= =?UTF-8?q?=20=E3=80=90=E6=94=B9=E5=8A=A8=E6=80=9D=E8=B7=AF=E3=80=91?= =?UTF-8?q?=E7=BB=93=E5=90=88cellDSColumnAdvancedPane=E7=9A=84=E5=8E=9F?= =?UTF-8?q?=E5=A7=8Bvisible=E7=8A=B6=E6=80=81=E5=8F=8A=E5=8D=95=E5=85=83?= =?UTF-8?q?=E6=A0=BC=E7=9A=84=E5=8D=95=E9=80=89=E5=A4=9A=E9=80=89=E7=8A=B6?= =?UTF-8?q?=E6=80=81=E5=86=8D=E8=BF=9B=E8=A1=8C=E8=AE=BE=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/fr/quickeditor/cellquick/CellDSColumnEditor.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/designer-realize/src/main/java/com/fr/quickeditor/cellquick/CellDSColumnEditor.java b/designer-realize/src/main/java/com/fr/quickeditor/cellquick/CellDSColumnEditor.java index 575f89fb0..e9917d2c2 100644 --- a/designer-realize/src/main/java/com/fr/quickeditor/cellquick/CellDSColumnEditor.java +++ b/designer-realize/src/main/java/com/fr/quickeditor/cellquick/CellDSColumnEditor.java @@ -162,6 +162,7 @@ public class CellDSColumnEditor extends CellQuickEditor { // 由于多选的时候修改了 cellDSColumnBasicPane 中组件的visiable属性,切换时需要将其设置为false cellDSColumnBasicPane.setVisible(false); + cellDSColumnAdvancedPane.setVisible(false); card.show(cardContainer, paneList.get(index).title4PopupWindow()); paneList.get(index).populate(); @@ -1064,7 +1065,10 @@ public class CellDSColumnEditor extends CellQuickEditor { @Override public void refreshMultipleDetails() { tabsHeaderIconPane.setVisible(tc.isSelectedOneCell()); - cellDSColumnAdvancedPane.setVisible(tc.isSelectedOneCell()); + + // 需要结合AdvancedPane的原始visible状态设置单选多选visible + boolean advancedPaneVisible = cellDSColumnAdvancedPane.isVisible(); + cellDSColumnAdvancedPane.setVisible(advancedPaneVisible && tc.isSelectedOneCell()); cellDSColumnBasicPane.setMultipleVisible(tc.isSelectedOneCell()); } From 5bb7f1ac93204f145ecf60f932d125f6f61c628b Mon Sep 17 00:00:00 2001 From: "Leo.Qin" Date: Wed, 1 Feb 2023 13:33:52 +0800 Subject: [PATCH 11/14] =?UTF-8?q?REPORT-82899=20=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E8=84=B1=E6=95=8F=E4=B8=89=E6=9C=9F=20=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=8D=95=E5=85=83=E6=A0=BC=E8=84=B1=E6=95=8F?= =?UTF-8?q?=E5=B1=9E=E6=80=A7=E7=9A=84=E5=AE=9E=E7=8E=B0=E6=96=B9=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cell/settingpane/CellOtherSetPane.java | 14 +++++++------- .../model/DesensitizationCellPane.java | 2 +- .../quickeditor/cellquick/CellDSColumnEditor.java | 1 - 3 files changed, 8 insertions(+), 9 deletions(-) diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/cell/settingpane/CellOtherSetPane.java b/designer-realize/src/main/java/com/fr/design/mainframe/cell/settingpane/CellOtherSetPane.java index 942bb05c3..bd197d89e 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/cell/settingpane/CellOtherSetPane.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/cell/settingpane/CellOtherSetPane.java @@ -12,7 +12,6 @@ import com.fr.design.gui.ibutton.UIButtonGroup; import com.fr.design.gui.ibutton.UIRadioButton; import com.fr.design.gui.icheckbox.UICheckBox; import com.fr.design.gui.icombobox.UIComboBox; -import com.fr.design.gui.ilable.MultilineLabel; import com.fr.design.gui.ilable.UILabel; import com.fr.design.gui.ispinner.UISpinner; import com.fr.design.gui.itextfield.UITextField; @@ -129,8 +128,8 @@ public class CellOtherSetPane extends AbstractCellAttrPane { private UIRadioButton previewAndExportButton; private UIRadioButton[] desensitizationButtons; private CellDesensitizationGroupsPane groupsPane; - private final int EXPORT_SCOPE = 0; - private final int PREVIEW_AND_EXPORT_SCOPE = 1; + private final int EXPORT_SCOPE = CellDesensitizationAttr.EXPORT_SCOPE; + private final int PREVIEW_AND_EXPORT_SCOPE = CellDesensitizationAttr.PREVIEW_AND_EXPORT_SCOPE; private static final Color TIPS_FONT_COLOR = new Color(0x8f8f92); @@ -695,11 +694,11 @@ public class CellOtherSetPane extends AbstractCellAttrPane { } private void populateDesensitizationBean(TemplateCellElement cellElement) { - CellDesensitizationAttr cellDesensitizationAttr = cellElement.getCellDesensitizationAttr(); + CellDesensitizationAttr cellDesensitizationAttr = cellElement.getCellAttr(CellDesensitizationAttr.ATTR_TAG); if (cellDesensitizationAttr == null) { cellDesensitizationAttr = new CellDesensitizationAttr(); } - boolean exportSelected = cellDesensitizationAttr.getScope() == 0; + boolean exportSelected = cellDesensitizationAttr.getScope() == EXPORT_SCOPE; exportButton.setSelected(exportSelected); previewAndExportButton.setSelected(!exportSelected); groupsPane.populate(cellDesensitizationAttr.getDesensitizationBeans()); @@ -805,13 +804,14 @@ public class CellOtherSetPane extends AbstractCellAttrPane { * @param cellElement */ private void updateDesensitizationAttr(TemplateCellElement cellElement) { - CellDesensitizationAttr cellDesensitizationAttr = cellElement.getCellDesensitizationAttr(); + + CellDesensitizationAttr cellDesensitizationAttr = cellElement.getCellAttr(CellDesensitizationAttr.XML_TAG); if (cellDesensitizationAttr == null) { cellDesensitizationAttr = new CellDesensitizationAttr(); } cellDesensitizationAttr.setScope(exportButton.isSelected() ? EXPORT_SCOPE : PREVIEW_AND_EXPORT_SCOPE); cellDesensitizationAttr.setDesensitizationBeans(new ArrayList<>(groupsPane.update())); - cellElement.setCellDesensitizationAttr(cellDesensitizationAttr); + cellElement.addCellAttr(cellDesensitizationAttr); } diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/cell/settingpane/desensitization/model/DesensitizationCellPane.java b/designer-realize/src/main/java/com/fr/design/mainframe/cell/settingpane/desensitization/model/DesensitizationCellPane.java index b4a21a48c..49d32e7b2 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/cell/settingpane/desensitization/model/DesensitizationCellPane.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/cell/settingpane/desensitization/model/DesensitizationCellPane.java @@ -291,7 +291,7 @@ public class DesensitizationCellPane extends BasicBeanPane { for (int i = 1; i <= chars.length; i++) { //如果原文本+省略号长度超过文本框 int width = textEditor.getWidth(); - if (width != 0 && fontMetrics.charsWidth(chars, 0, i) + omitLength > width) { + if (width > 0 && fontMetrics.charsWidth(chars, 0, i) + omitLength > width) { //从第i-1的位置截断再拼上省略号 omitText = text.substring(0, i - 2) + OMIT_TEXT; break; diff --git a/designer-realize/src/main/java/com/fr/quickeditor/cellquick/CellDSColumnEditor.java b/designer-realize/src/main/java/com/fr/quickeditor/cellquick/CellDSColumnEditor.java index 575f89fb0..24ca54277 100644 --- a/designer-realize/src/main/java/com/fr/quickeditor/cellquick/CellDSColumnEditor.java +++ b/designer-realize/src/main/java/com/fr/quickeditor/cellquick/CellDSColumnEditor.java @@ -1064,7 +1064,6 @@ public class CellDSColumnEditor extends CellQuickEditor { @Override public void refreshMultipleDetails() { tabsHeaderIconPane.setVisible(tc.isSelectedOneCell()); - cellDSColumnAdvancedPane.setVisible(tc.isSelectedOneCell()); cellDSColumnBasicPane.setMultipleVisible(tc.isSelectedOneCell()); } From de0905d7fa1ed0ef8c684b599b46d89f995a062b Mon Sep 17 00:00:00 2001 From: "Leo.Qin" Date: Thu, 2 Feb 2023 18:00:03 +0800 Subject: [PATCH 12/14] =?UTF-8?q?REPORT-88826=20=E8=AE=BE=E8=AE=A1?= =?UTF-8?q?=E5=99=A8=E6=96=B0=E5=A2=9E=E4=B8=8D=E6=94=AF=E6=8C=81=E7=9A=84?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E5=BA=93=E7=B1=BB=E5=9E=8B=E6=9C=AA=E5=8F=97?= =?UTF-8?q?=E5=88=B0=E9=99=90=E5=88=B6=20=E3=80=90=E9=97=AE=E9=A2=98?= =?UTF-8?q?=E5=8E=9F=E5=9B=A0=E3=80=91=20=E3=80=90=E6=94=B9=E5=8A=A8?= =?UTF-8?q?=E6=80=9D=E8=B7=AF=E3=80=91=E6=96=B0=E5=A2=9E=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E8=BF=9E=E6=8E=A5=E6=97=B6=EF=BC=8C=E7=82=B9=E5=87=BB=E7=A1=AE?= =?UTF-8?q?=E8=AE=A4=E5=90=8E=E6=A0=A1=E9=AA=8C=E6=98=AF=E5=90=A6=E4=B8=BA?= =?UTF-8?q?=E5=8F=97=E9=99=90=E5=88=B6=E7=9A=84=E6=95=B0=E6=8D=AE=E5=BA=93?= =?UTF-8?q?=E7=B1=BB=E5=9E=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ConnectionListDialogActionAdapter.java | 3 +++ .../connect/ConnectionManagerPane.java | 26 ++++++++++++++++++- 2 files changed, 28 insertions(+), 1 deletion(-) diff --git a/designer-base/src/main/java/com/fr/design/data/datapane/connect/ConnectionListDialogActionAdapter.java b/designer-base/src/main/java/com/fr/design/data/datapane/connect/ConnectionListDialogActionAdapter.java index 947cb6e75..635076b59 100644 --- a/designer-base/src/main/java/com/fr/design/data/datapane/connect/ConnectionListDialogActionAdapter.java +++ b/designer-base/src/main/java/com/fr/design/data/datapane/connect/ConnectionListDialogActionAdapter.java @@ -37,6 +37,9 @@ public class ConnectionListDialogActionAdapter extends DialogActionAdapter { return; } try { + // 校验数据库类型 + connectionManagerPane.validateDatabaseType(connectionConfig); + connectionManagerPane.update(connectionConfig); } catch (Exception e) { connectionListDialog.setDoOKSucceed(false); diff --git a/designer-base/src/main/java/com/fr/design/data/datapane/connect/ConnectionManagerPane.java b/designer-base/src/main/java/com/fr/design/data/datapane/connect/ConnectionManagerPane.java index 33925dcd3..0c1d88022 100644 --- a/designer-base/src/main/java/com/fr/design/data/datapane/connect/ConnectionManagerPane.java +++ b/designer-base/src/main/java/com/fr/design/data/datapane/connect/ConnectionManagerPane.java @@ -1,9 +1,14 @@ package com.fr.design.data.datapane.connect; +import com.fr.data.impl.Connection; import com.fr.design.gui.frpane.LoadingBasicPane; +import com.fr.design.gui.ilist.ListModelElement; import com.fr.design.layout.FRGUIPaneFactory; import com.fr.file.ConnectionConfig; - +import com.fr.general.NameObject; +import com.fr.license.database.DatabaseTypeValidateUtil; +import com.fr.license.exception.DataBaseNotSupportedException; +import com.fr.stable.Nameable; import javax.swing.JPanel; import java.awt.BorderLayout; @@ -61,4 +66,23 @@ public class ConnectionManagerPane extends LoadingBasicPane implements Connectio return connectionListPane.isNamePermitted(); } + /** + * 校验是否支持当前选中连接的数据库类型 + */ + public void validateDatabaseType(ConnectionConfig connectionConfig) { + ListModelElement selectedValue = this.connectionListPane.getSelectedValue(); + if (selectedValue != null) { + Nameable wrapper = selectedValue.wrapper; + try { + Connection connection = (Connection) ((NameObject) wrapper).getObject(); + DatabaseTypeValidateUtil.validateDatabaseType(connection.getDriver(), connection.feature()); + } catch (DataBaseNotSupportedException e) { + // 仅抛出数据库类型不支持异常 + throw e; + } catch (Exception e) { + // ignore + } + } + } + } \ No newline at end of file From 4e04a847b151804c3fd69f447217f13723d33f55 Mon Sep 17 00:00:00 2001 From: "Leo.Qin" Date: Fri, 3 Feb 2023 15:16:41 +0800 Subject: [PATCH 13/14] =?UTF-8?q?REPORT-88365=20=E5=86=B3=E7=AD=96?= =?UTF-8?q?=E6=8A=A5=E8=A1=A8=EF=BC=8C=E5=8D=95=E5=85=83=E6=A0=BC=E6=8F=92?= =?UTF-8?q?=E5=85=A5=E6=95=B0=E6=8D=AE=E5=88=97=EF=BC=8C=E5=8D=95=E5=85=83?= =?UTF-8?q?=E6=A0=BC=E5=85=83=E7=B4=A0=E9=A1=B5=E9=9D=A2=E6=9C=89=E5=BC=82?= =?UTF-8?q?=E5=B8=B8=20=E3=80=90=E9=97=AE=E9=A2=98=E5=8E=9F=E5=9B=A0?= =?UTF-8?q?=E3=80=91=E5=8D=95=E9=80=89=E6=97=B6=E9=BB=98=E8=AE=A4=E5=B0=86?= =?UTF-8?q?cellDSColumnAdvancedPane=E7=9A=84visible=E8=AE=BE=E4=B8=BAtrue?= =?UTF-8?q?=EF=BC=8C=E5=AF=BC=E8=87=B4=E6=98=BE=E7=A4=BA=E5=BC=82=E5=B8=B8?= =?UTF-8?q?=20=E3=80=90=E6=94=B9=E5=8A=A8=E6=80=9D=E8=B7=AF=E3=80=91?= =?UTF-8?q?=E7=BB=93=E5=90=88cellDSColumnAdvancedPane=E7=9A=84=E5=8E=9F?= =?UTF-8?q?=E5=A7=8Bvisible=E7=8A=B6=E6=80=81=E5=8F=8A=E5=8D=95=E5=85=83?= =?UTF-8?q?=E6=A0=BC=E7=9A=84=E5=8D=95=E9=80=89=E5=A4=9A=E9=80=89=E7=8A=B6?= =?UTF-8?q?=E6=80=81=E5=86=8D=E8=BF=9B=E8=A1=8C=E8=AE=BE=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/fr/quickeditor/cellquick/CellDSColumnEditor.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/designer-realize/src/main/java/com/fr/quickeditor/cellquick/CellDSColumnEditor.java b/designer-realize/src/main/java/com/fr/quickeditor/cellquick/CellDSColumnEditor.java index 24ca54277..e9917d2c2 100644 --- a/designer-realize/src/main/java/com/fr/quickeditor/cellquick/CellDSColumnEditor.java +++ b/designer-realize/src/main/java/com/fr/quickeditor/cellquick/CellDSColumnEditor.java @@ -162,6 +162,7 @@ public class CellDSColumnEditor extends CellQuickEditor { // 由于多选的时候修改了 cellDSColumnBasicPane 中组件的visiable属性,切换时需要将其设置为false cellDSColumnBasicPane.setVisible(false); + cellDSColumnAdvancedPane.setVisible(false); card.show(cardContainer, paneList.get(index).title4PopupWindow()); paneList.get(index).populate(); @@ -1065,6 +1066,10 @@ public class CellDSColumnEditor extends CellQuickEditor { public void refreshMultipleDetails() { tabsHeaderIconPane.setVisible(tc.isSelectedOneCell()); + // 需要结合AdvancedPane的原始visible状态设置单选多选visible + boolean advancedPaneVisible = cellDSColumnAdvancedPane.isVisible(); + cellDSColumnAdvancedPane.setVisible(advancedPaneVisible && tc.isSelectedOneCell()); + cellDSColumnBasicPane.setMultipleVisible(tc.isSelectedOneCell()); } From 9baf1437ce3a9e21c50eb7fb47e68438e440dac4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Yvan-=E6=AC=A7=E9=98=B3=E5=B8=86?= Date: Tue, 7 Feb 2023 12:25:17 +0800 Subject: [PATCH 14/14] =?UTF-8?q?REPORT-89167=20&&=20REPORT-83493=20?= =?UTF-8?q?=E5=B9=B3=E5=8F=B0=E8=84=B1=E6=95=8F=E8=A7=84=E5=88=99=E5=8F=98?= =?UTF-8?q?=E5=8A=A8=E6=97=B6=E7=9A=84=E4=BA=A4=E4=BA=92=E9=97=AE=E9=A2=98?= =?UTF-8?q?=20=E3=80=90=E9=97=AE=E9=A2=98=E5=8E=9F=E5=9B=A0=E3=80=91?= =?UTF-8?q?=E4=B8=8E=E4=BA=A7=E5=93=81=E6=B2=9F=E9=80=9A=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E6=88=90=E6=9B=B4=E5=AE=B9=E6=98=93=E7=90=86=E8=A7=A3=E7=9A=84?= =?UTF-8?q?=E4=BA=A4=E4=BA=92=E8=BF=98=E6=9C=89=E8=A7=84=E5=88=99=E5=8F=98?= =?UTF-8?q?=E5=8A=A8=E6=97=B6=E7=9A=84=E7=94=9F=E6=95=88=E9=80=BB=E8=BE=91?= =?UTF-8?q?=EF=BC=8C=E5=A4=A7=E8=87=B4=E5=A6=82=E4=B8=8B=EF=BC=9A=201.=20?= =?UTF-8?q?=E8=A7=84=E5=88=99=E5=BC=82=E5=B8=B8=E7=9A=84=E6=8F=90=E7=A4=BA?= =?UTF-8?q?=E6=94=BE=E5=9C=A8=E6=95=B0=E6=8D=AE=E9=9B=86"=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E8=84=B1=E6=95=8F=E8=AE=BE=E7=BD=AE"=E9=A1=B5?= =?UTF-8?q?=E9=9D=A2=E4=B8=AD=EF=BC=8C=E9=BC=A0=E6=A0=87=E6=82=AC=E5=81=9C?= =?UTF-8?q?"=E5=BC=82=E5=B8=B8"=E6=96=87=E5=AD=97=E6=97=B6=EF=BC=8C?= =?UTF-8?q?=E5=87=BA=E7=8E=B0=E6=B0=94=E6=B3=A1=E6=8F=90=E7=A4=BA=EF=BC=8C?= =?UTF-8?q?=E6=B0=94=E6=B3=A1=E6=97=A0=E6=B3=95=E7=82=B9=E5=87=BB=EF=BC=9B?= =?UTF-8?q?"=E6=95=B0=E6=8D=AE=E8=84=B1=E6=95=8F=E8=AE=BE=E7=BD=AE"?= =?UTF-8?q?=E9=A1=B5=E9=9D=A2=E4=B8=AD=E7=9A=84=E8=A7=84=E5=88=99=E8=A1=A8?= =?UTF-8?q?=EF=BC=8C=E8=A1=A8=E4=B8=8A=E5=A2=9E=E5=8A=A0=E5=88=B7=E6=96=B0?= =?UTF-8?q?=E6=8C=89=E9=92=AE=EF=BC=8C=E7=82=B9=E5=87=BB=E5=88=B7=E6=96=B0?= =?UTF-8?q?=E5=90=8E=E4=BC=9A=E5=88=B7=E6=96=B0=E5=BD=93=E5=89=8D=E8=A7=84?= =?UTF-8?q?=E5=88=99=EF=BC=8C=E5=88=B7=E6=96=B0=E9=80=BB=E8=BE=91=EF=BC=9A?= =?UTF-8?q?=20=E8=A7=84=E5=88=99=E8=A2=AB=E7=A6=81=E7=94=A8=20----=20?= =?UTF-8?q?=E5=8E=9F=E8=A7=84=E5=88=99=E4=B8=8D=E5=8F=98=20=E8=A7=84?= =?UTF-8?q?=E5=88=99=E8=A2=AB=E5=88=A0=E9=99=A4=20----=20=E5=8E=9F?= =?UTF-8?q?=E8=A7=84=E5=88=99=E5=88=A0=E9=99=A4=20=E8=A7=84=E5=88=99?= =?UTF-8?q?=E8=A2=AB=E4=BF=AE=E6=94=B9=20----=20=E5=8E=9F=E8=A7=84?= =?UTF-8?q?=E5=88=99B=E8=A2=AB=E6=9B=BF=E6=8D=A2=E6=88=90B*=202.=20?= =?UTF-8?q?=E5=81=87=E5=A6=82=E6=A8=A1=E6=9D=BF=E4=B8=AD=E5=AD=98=E5=9C=A8?= =?UTF-8?q?A=E3=80=81B=E5=B9=B3=E5=8F=B0=E8=A7=84=E5=88=99=EF=BC=8CA?= =?UTF-8?q?=E8=A7=84=E5=88=99=E6=AD=A3=E5=B8=B8=EF=BC=8CB=E8=A7=84?= =?UTF-8?q?=E5=88=99=E8=A2=AB=E4=BF=AE=E6=94=B9=E6=88=90=E4=BA=86B*?= =?UTF-8?q?=E8=A7=84=E5=88=99=EF=BC=8C=E6=AD=A4=E6=97=B6=E4=B8=8D=E7=AE=A1?= =?UTF-8?q?=E6=98=AF=E6=A8=A1=E6=9D=BF=E9=A2=84=E8=A7=88=E3=80=81=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E9=9B=86=E8=84=B1=E6=95=8F=E6=95=88=E6=9E=9C=E9=A2=84?= =?UTF-8?q?=E8=A7=88=E7=AD=89=E8=AE=A1=E7=AE=97=E7=9B=B8=E5=85=B3=E7=9A=84?= =?UTF-8?q?=E9=80=BB=E8=BE=91=E9=87=8C=EF=BC=8C=E7=94=9F=E6=95=88=E8=A7=84?= =?UTF-8?q?=E5=88=99=E4=B8=BAA=E5=92=8CB*=E3=80=82=E5=8D=B3=E8=AE=A1?= =?UTF-8?q?=E7=AE=97=E5=9C=BA=E6=99=AF=E9=87=8C=E4=BC=9A=E8=87=AA=E5=8A=A8?= =?UTF-8?q?=E6=9B=BF=E6=8D=A2=E8=A2=AB=E4=BF=AE=E6=94=B9=E7=9A=84=E8=A7=84?= =?UTF-8?q?=E5=88=99=203.=20=E4=B8=8A=E9=9D=A2=E7=9A=84=E6=9B=BF=E6=8D=A2?= =?UTF-8?q?=E6=98=AF=E4=B8=B4=E6=97=B6=E6=9B=BF=E6=8D=A2=EF=BC=8C=E4=BF=9D?= =?UTF-8?q?=E5=AD=98=E6=A8=A1=E6=9D=BF=E6=97=B6=E5=B9=B6=E4=B8=8D=E4=BC=9A?= =?UTF-8?q?=E5=B0=86B*=E5=86=99=E5=85=A5=E6=A8=A1=E6=9D=BFxml=E4=B8=AD?= =?UTF-8?q?=E3=80=82=E4=BB=85=E5=9C=A8"=E6=95=B0=E6=8D=AE=E8=84=B1?= =?UTF-8?q?=E6=95=8F=E8=AE=BE=E7=BD=AE"=E9=A1=B5=E9=9D=A2=E9=87=8C?= =?UTF-8?q?=EF=BC=8C=E7=94=A8=E6=88=B7=E5=9C=A8=E7=82=B9=E5=87=BB"?= =?UTF-8?q?=E5=BC=82=E5=B8=B8"=EF=BC=8C=E5=BC=B9=E7=AA=97=E6=8F=90?= =?UTF-8?q?=E7=A4=BA=E5=87=BA=E7=8E=B0=E5=90=8E=EF=BC=8C=E5=86=8D=E7=82=B9?= =?UTF-8?q?=E5=87=BB=E7=A1=AE=E5=AE=9A=20+=20=E4=BF=9D=E5=AD=98=E6=A8=A1?= =?UTF-8?q?=E6=9D=BF=E6=97=B6=EF=BC=8C=E6=89=8D=E4=BC=9A=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E6=A8=A1=E6=9D=BFxml=E6=96=87=E4=BB=B6=20=E3=80=90=E6=94=B9?= =?UTF-8?q?=E5=8A=A8=E6=96=B9=E6=A1=88=E3=80=91=E5=90=8C=E4=B8=8A=20?= =?UTF-8?q?=E3=80=90review=E5=BB=BA=E8=AE=AE=E3=80=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../TableDataPreviewDesensitizeManager.java | 18 ++--- .../TableDataDesensitizationTableModel.java | 67 ++++++++++++++++--- .../standard/refresh/refresh_normal.svg | 7 ++ 3 files changed, 68 insertions(+), 24 deletions(-) create mode 100644 designer-base/src/main/resources/com/fr/design/standard/refresh/refresh_normal.svg diff --git a/designer-base/src/main/java/com/fr/design/data/datapane/preview/desensitization/TableDataPreviewDesensitizeManager.java b/designer-base/src/main/java/com/fr/design/data/datapane/preview/desensitization/TableDataPreviewDesensitizeManager.java index 29e12bfaf..1fbed9f43 100644 --- a/designer-base/src/main/java/com/fr/design/data/datapane/preview/desensitization/TableDataPreviewDesensitizeManager.java +++ b/designer-base/src/main/java/com/fr/design/data/datapane/preview/desensitization/TableDataPreviewDesensitizeManager.java @@ -2,10 +2,10 @@ package com.fr.design.data.datapane.preview.desensitization; import com.fr.base.TableData; +import com.fr.data.desensitize.TableDataDesensitizeManager; import com.fr.data.desensitize.base.DesensitizationTableData; import com.fr.data.desensitize.base.TableDataDesensitizationItem; import com.fr.data.desensitize.manage.DesensitizationManager; -import com.fr.data.desensitize.rule.DesensitizationRuleManager; import com.fr.data.desensitize.util.DesentizationUtils; import com.fr.decision.webservice.bean.user.DepartmentPostBean; import com.fr.decision.webservice.bean.user.RoleBean; @@ -79,7 +79,7 @@ public class TableDataPreviewDesensitizeManager implements DesensitizationManage Collection desensitizationItems = ((DesensitizationTableData) tableData).getDesensitizationConfig().getDesensitizationItems(); if (DesentizationUtils.isCollectionNotEmpty(desensitizationItems)) { // 更新规则 - dealWithLastedRules(desensitizationItems); + desensitizationItems = TableDataDesensitizeManager.getInstance().dealWithLastedRules(desensitizationItems); // 对脱敏配置项集合做过滤和排序处理 List items = desensitizationItems.stream() .filter(item -> isAvaliableItem4Preview(item, model)) @@ -106,16 +106,6 @@ public class TableDataPreviewDesensitizeManager implements DesensitizationManage matchColumnIndex(item, model) >= 0; } - /** - * 在预览计算前,将Item中的规则替换为最新规则(防止平台规则被临时修改) - */ - private void dealWithLastedRules(Collection desensitizationItems) { - desensitizationItems.forEach(item -> { - // 获取最新的规则 - item.setRule(DesensitizationRuleManager.getInstance().getLastedDesentizationRule(item.getRule())); - }); - } - /** * 通过TableData获取其列名 * @@ -185,7 +175,7 @@ public class TableDataPreviewDesensitizeManager implements DesensitizationManage * @param positionName * @return */ - public String mergeRoleText(String departmentName, String positionName) { + private String mergeRoleText(String departmentName, String positionName) { return departmentName + positionName; } @@ -196,7 +186,7 @@ public class TableDataPreviewDesensitizeManager implements DesensitizationManage * @param positionId * @return */ - public String mergeRoleId(String departmentId, String positionId) { + private String mergeRoleId(String departmentId, String positionId) { return departmentId + CONNECTOR + positionId; } diff --git a/designer-base/src/main/java/com/fr/design/data/datapane/preview/desensitization/view/setting/TableDataDesensitizationTableModel.java b/designer-base/src/main/java/com/fr/design/data/datapane/preview/desensitization/view/setting/TableDataDesensitizationTableModel.java index 4d6cfa8ff..c1d958bf9 100644 --- a/designer-base/src/main/java/com/fr/design/data/datapane/preview/desensitization/view/setting/TableDataDesensitizationTableModel.java +++ b/designer-base/src/main/java/com/fr/design/data/datapane/preview/desensitization/view/setting/TableDataDesensitizationTableModel.java @@ -40,6 +40,7 @@ import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.Collection; import java.util.HashMap; +import java.util.Iterator; import java.util.LinkedHashSet; import java.util.List; import java.util.Map; @@ -132,9 +133,7 @@ public class TableDataDesensitizationTableModel extends UITableModelAdapter items = getList(); + Iterator iterator = items.iterator(); + while (iterator.hasNext()) { + TableDataDesensitizationItem item = iterator.next(); + DesensitizationRuleStatus ruleStatus = DesensitizationRuleManager.getInstance().getRuleStatus(item.getRule()); + if (ruleStatus == DesensitizationRuleStatus.REMOVED) { + // 规则被移除,则删除整条脱敏Item + iterator.remove(); + } else { + // 规则被修改、禁用等,更新一下规则 + item.setRule(DesensitizationRuleManager.getInstance().getLastedDesentizationRule(item.getRule())); + } + } + fireTableDataChanged(); + } + + @Override + public void checkEnabled() {} + } + /** * 规则表-列字段编号 */ @@ -580,4 +615,16 @@ public class TableDataDesensitizationTableModel extends UITableModelAdapter + + icon_刷新_normal + + + + \ No newline at end of file