Browse Source
* commit 'f641635c08159ccfa18758911db9eef48f6649b8': REPORT-101409 【版本管理三期】删除无权限的版本没有失败提示 REPORT-101608 【版本管理三期】通过版本中心入口进入版本详情,未保存的模板触发还原,选择保存还原会失败 代码规范 REPORT-101773 【版本管理三期】版本详情页面选择版本删除,删完一个操作框的按钮就点不动了 REPORT-101608 【版本管理三期】通过版本中心入口进入版本详情,未保存的模板触发还原,选择保存还原会失败 REPORT-101482 【版本管理二期】迁移失败/成功的提示,都有个帮助文档的跳转 REPORT-101608 【版本管理三期】通过版本中心入口进入版本详情,未保存的模板触发还原,选择保存还原会失败 REPORT-101026 【版本管理三期】预览版本文件,有报错 REPORT-99740 FRM报表块,get (-1,-1)类型的ColumnRow报错 REPORT-101605 【版本管理三期】版本中心进入的版本详情入口,删除模板所有版本后,版本中心没有刷新bugfix/11.0
superman
1 year ago
12 changed files with 468 additions and 164 deletions
@ -0,0 +1,60 @@ |
|||||||
|
package com.fr.design.mainframe.vcs; |
||||||
|
|
||||||
|
import com.fr.report.entity.VcsEntity; |
||||||
|
|
||||||
|
import java.util.ArrayList; |
||||||
|
import java.util.List; |
||||||
|
|
||||||
|
/** |
||||||
|
* 版本管理处理失败列表的包装类 |
||||||
|
* |
||||||
|
* @author Destiny.Lin |
||||||
|
* @since 11.0 |
||||||
|
* Created on 2023/7/28 |
||||||
|
*/ |
||||||
|
public class VcsProcessFailedWrapper { |
||||||
|
private static final String PREFIX = "(v."; |
||||||
|
private static final String TAIL = ")"; |
||||||
|
|
||||||
|
private List<VcsEntity> failedList = new ArrayList<>(); |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* 添加处理失败的VcsEntity |
||||||
|
* |
||||||
|
* @param entity entity |
||||||
|
*/ |
||||||
|
public void addFailedEntity(VcsEntity entity) { |
||||||
|
failedList.add(entity); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* 获取用于展示的详细失败信息列表 |
||||||
|
*/ |
||||||
|
public List<String> getDetailFailedList() { |
||||||
|
List<String> detailList = new ArrayList<>(); |
||||||
|
for (VcsEntity entity : failedList) { |
||||||
|
detailList.add(entity.getFilename()+PREFIX+entity.getVersion()+TAIL); |
||||||
|
} |
||||||
|
return detailList; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 获取处理失败的vcsEntity的名称列表 |
||||||
|
*/ |
||||||
|
public List<String> getFailedNameList() { |
||||||
|
List<String> detailList = new ArrayList<>(); |
||||||
|
for (VcsEntity entity : failedList) { |
||||||
|
detailList.add(entity.getFilename()); |
||||||
|
} |
||||||
|
return detailList; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 处理是否全部成功 |
||||||
|
*/ |
||||||
|
public boolean isAllSuccess() { |
||||||
|
return failedList.isEmpty(); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,32 @@ |
|||||||
|
package com.fr.design.mainframe.vcs; |
||||||
|
|
||||||
|
import java.util.List; |
||||||
|
|
||||||
|
/** |
||||||
|
* 版本管理表格操作事件 |
||||||
|
* |
||||||
|
* @author Destiny.Lin |
||||||
|
* @since 11.0 |
||||||
|
* Created on 2023/7/27 |
||||||
|
*/ |
||||||
|
public interface VcsTableOperatorListener { |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* 处理操作 |
||||||
|
*/ |
||||||
|
default void doOperator(List<VcsTableEntity> entityList){} |
||||||
|
|
||||||
|
/** |
||||||
|
* 更新界面 |
||||||
|
*/ |
||||||
|
default void updateUI(){} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* 根据处理失败的内容来更新界面 |
||||||
|
* |
||||||
|
* @param wrapper 失败内容 |
||||||
|
*/ |
||||||
|
default void updateUI(VcsProcessFailedWrapper wrapper){} |
||||||
|
} |
@ -0,0 +1,113 @@ |
|||||||
|
package com.fr.design.mainframe.vcs.common; |
||||||
|
|
||||||
|
import com.fr.base.vcs.DesignerMode; |
||||||
|
import com.fr.design.dialog.BasicDialog; |
||||||
|
import com.fr.design.dialog.FineJOptionPane; |
||||||
|
import com.fr.design.file.HistoryTemplateListCache; |
||||||
|
import com.fr.design.file.MultiTemplateTabPane; |
||||||
|
import com.fr.design.i18n.Toolkit; |
||||||
|
import com.fr.design.mainframe.DesignerContext; |
||||||
|
import com.fr.design.mainframe.JTemplate; |
||||||
|
import com.fr.design.mainframe.vcs.ui.VcsNewPane; |
||||||
|
import com.fr.design.worker.save.CallbackSaveWorker; |
||||||
|
import com.fr.general.ComparatorUtils; |
||||||
|
import com.fr.log.FineLoggerFactory; |
||||||
|
|
||||||
|
import javax.swing.JOptionPane; |
||||||
|
import javax.swing.SwingUtilities; |
||||||
|
|
||||||
|
/** |
||||||
|
* 版本管理关闭模板辅助类 |
||||||
|
* |
||||||
|
* @author Destiny.Lin |
||||||
|
* @since 11.0 |
||||||
|
* Created on 2023/7/27 |
||||||
|
*/ |
||||||
|
public class VcsCloseTemplateHelper { |
||||||
|
|
||||||
|
/** |
||||||
|
* 根据传入的pane与dialog生成指定面板的Vcs模板关闭的处理方法 |
||||||
|
* 如果指定模板已经打开: |
||||||
|
* <p>1.如果该模板已保存,则正常打开新版本管理弹窗 |
||||||
|
* <p>2.如果该模板未保存,触发保存逻辑 |
||||||
|
* <li>a.如果用户选择保存,则保存并不关闭模板,弹出新版本管理弹窗 |
||||||
|
* <li>b.如果用户选择不保存,则关闭当前模板,弹出新版本管理弹窗 |
||||||
|
* <li>c.如果用户选择取消, 则啥操作都不做 |
||||||
|
* |
||||||
|
* @param path 对应模板路径 |
||||||
|
* @param isCurrentEditing 是否是正在编辑的模板 |
||||||
|
* @param parent 生成的新版本管理的详情面板的父面板 |
||||||
|
*/ |
||||||
|
public static void checkTemplateSavedAndShowVcsNewPane(String path, boolean isCurrentEditing, BasicDialog parent, VcsNewPane pane) { |
||||||
|
VcsNewPaneWrapper wrapper = new VcsNewPaneWrapper(path, parent, pane); |
||||||
|
for (JTemplate jTemplate : HistoryTemplateListCache.getInstance().getHistoryList()) { |
||||||
|
if (ComparatorUtils.equals(jTemplate.getEditingFILE().getPath(), path)) { |
||||||
|
if (!jTemplate.isALLSaved()) { |
||||||
|
MultiTemplateTabPane.getInstance().setIsCloseCurrent(isCurrentEditing); |
||||||
|
MultiTemplateTabPane.getInstance().closeFormat(jTemplate); |
||||||
|
confirmCloseAndShowVcsNewPane(jTemplate, wrapper); |
||||||
|
return; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
wrapper.show(); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* 自己生成新的VcsNewPane的Vcs模板关闭的处理方法 |
||||||
|
*/ |
||||||
|
public static void checkTemplateSavedAndShowVcsNewPane(String path, boolean isCurrentEditing) { |
||||||
|
checkTemplateSavedAndShowVcsNewPane(path, isCurrentEditing, null, null); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* 是否是当前编辑的模板 |
||||||
|
* |
||||||
|
* @param path 对应模板路径 |
||||||
|
* @return 是则返回true |
||||||
|
*/ |
||||||
|
public static boolean isCurrentEditing(String path) { |
||||||
|
JTemplate<?, ?> jt = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate(); |
||||||
|
if (JTemplate.isValid(jt)) { |
||||||
|
String editing = jt.getEditingFILE().getPath(); |
||||||
|
return ComparatorUtils.equals(editing, path); |
||||||
|
} |
||||||
|
return false; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
private static void confirmCloseAndShowVcsNewPane(JTemplate<?, ?> specifiedTemplate, VcsNewPaneWrapper wrapper) { |
||||||
|
if (specifiedTemplate == null) { |
||||||
|
return; |
||||||
|
} |
||||||
|
if (!specifiedTemplate.isALLSaved() && !DesignerMode.isVcsMode()) { |
||||||
|
specifiedTemplate.stopEditing(); |
||||||
|
int returnVal = FineJOptionPane.showConfirmDialog(DesignerContext.getDesignerFrame(), |
||||||
|
String.format("%s\"%s\" ?",Toolkit.i18nText("Fine-Design_Basic_Utils_Would_You_Like_To_Save"), specifiedTemplate.getEditingFILE()), |
||||||
|
Toolkit.i18nText("Fine-Design_Basic_Confirm"), JOptionPane.YES_NO_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE); |
||||||
|
if (returnVal == JOptionPane.YES_OPTION) { |
||||||
|
CallbackSaveWorker worker = specifiedTemplate.save(); |
||||||
|
worker.addSuccessCallback(() -> { |
||||||
|
FineLoggerFactory.getLogger().info(Toolkit.i18nText("Fine-Design_Basic_Template_Already_Saved", specifiedTemplate.getEditingFILE().getName())); |
||||||
|
SwingUtilities.invokeLater(wrapper::show); |
||||||
|
}); |
||||||
|
worker.start(specifiedTemplate.getRuntimeId()); |
||||||
|
} else if (returnVal == JOptionPane.NO_OPTION) { |
||||||
|
closeTpl(specifiedTemplate); |
||||||
|
wrapper.show(); |
||||||
|
} |
||||||
|
} else { |
||||||
|
wrapper.show(); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
private static void closeTpl(JTemplate<?, ?> specifiedTemplate) { |
||||||
|
HistoryTemplateListCache.getInstance().closeSelectedReport(specifiedTemplate); |
||||||
|
MultiTemplateTabPane.getInstance().closeAndFreeLock(specifiedTemplate); |
||||||
|
MultiTemplateTabPane.getInstance().activePrevTemplateAfterClose(); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,36 @@ |
|||||||
|
package com.fr.design.mainframe.vcs.common; |
||||||
|
|
||||||
|
import com.fr.design.dialog.BasicDialog; |
||||||
|
import com.fr.design.mainframe.vcs.ui.VcsNewPane; |
||||||
|
|
||||||
|
/** |
||||||
|
* 构建VcsNewPane的包装类 |
||||||
|
* |
||||||
|
* @author Destiny.Lin |
||||||
|
* @since 11.0 |
||||||
|
* Created on 2023/7/27 |
||||||
|
*/ |
||||||
|
public class VcsNewPaneWrapper { |
||||||
|
|
||||||
|
private String path; |
||||||
|
private BasicDialog dialog; |
||||||
|
private VcsNewPane pane; |
||||||
|
|
||||||
|
public VcsNewPaneWrapper(String path, BasicDialog dialog, VcsNewPane pane) { |
||||||
|
this.path = path; |
||||||
|
this.dialog = dialog; |
||||||
|
this.pane = pane; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 显示面板 |
||||||
|
*/ |
||||||
|
public void show() { |
||||||
|
if (pane != null) { |
||||||
|
pane.showDialog(dialog); |
||||||
|
} else { |
||||||
|
VcsNewPane newPane = new VcsNewPane(path); |
||||||
|
newPane.showDialog(dialog); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
Loading…
Reference in new issue