>
+ * {
+ * 123 {
+ * A1: aaa,
+ * B5:C5: farray
+ * },
+ * 456 {
+ * C7: map
+ * }
+ * }
+ *
+ * Created by Administrator on 2017/5/11/0011.
+ */
+public class CachedExpressionControl {
+ private static CachedExpressionControl expressionControl;
+ private static final long RELEASE_TIMER = 5 * 60 * 1000L;
+
+ private Map> cachedValue = new ConcurrentHashMap>();
+
+ private Timer timer = PluginContexts.currentContext().newTimer();
+
+ static {
+ ServletContext.addServletContextListener(new ServletContextAdapter() {
+ @Override
+ public void onServletStop() {
+ expressionControl.release();
+ expressionControl = null;
+ }
+ });
+ }
+
+ public static CachedExpressionControl getInstance() {
+ if (expressionControl == null) {
+ expressionControl = new CachedExpressionControl();
+ }
+
+ return expressionControl;
+ }
+
+ private void release() {
+ cachedValue.clear();
+ timer.cancel();
+ }
+
+ private CachedExpressionControl() {
+ initReleaseTimer();
+ }
+
+ private void initReleaseTimer() {
+ timer.schedule(new TimerTask() {
+ @Override
+ public void run() {
+ try {
+ String[] cachedSessionIDs = cachedValue.keySet().toArray(new String[cachedValue.size()]);
+ for (String sessionID : cachedSessionIDs) {
+ SessionIDInfo info = SessionPoolManager.getSessionIDInfor(sessionID, TemplateSessionIDInfo.class);
+
+ if (info == null || info.isTimeout()) {
+ cachedValue.remove(sessionID);
+ }
+ }
+ } catch (Throwable ignored) {
+ // do nth
+ }
+
+ }
+ }, RELEASE_TIMER, RELEASE_TIMER);
+ }
+
+ public boolean whetherExpressionValueChange(String sessionID, String expression, Object newVal) {
+ Map sessionValueMap = cachedValue.get(sessionID);
+ if (sessionValueMap == null) {
+ sessionValueMap = new ConcurrentHashMap();
+ cachedValue.put(sessionID, sessionValueMap);
+ }
+
+ Object oldVal = sessionValueMap.get(expression);
+ // 缓存新的值
+ sessionValueMap.put(expression, newVal);
+ // 如果之前没有值, 可能是刚预览.
+ if (newVal instanceof Painter) {
+ return false;
+ }
+
+ if (newVal instanceof FArray) {
+ Iterator iterator = ((FArray) newVal).iterator();
+ while (iterator.hasNext()) {
+ if (iterator.next() instanceof Painter) {
+ return false;
+ }
+ }
+ }
+ return !ComparatorUtils.equals(newVal, oldVal);
+ }
+
+}
diff --git a/src/main/java/com/fr/plugin/reportRefresh/web/CheckRefreshAreaAction.java b/src/main/java/com/fr/plugin/reportRefresh/web/CheckRefreshAreaAction.java
new file mode 100644
index 0000000..70db7b7
--- /dev/null
+++ b/src/main/java/com/fr/plugin/reportRefresh/web/CheckRefreshAreaAction.java
@@ -0,0 +1,125 @@
+package com.fr.plugin.reportRefresh.web;
+
+import com.fr.base.Formula;
+import com.fr.base.ParameterMapNameSpace;
+import com.fr.data.NetworkHelper;
+import com.fr.data.TableDataSource;
+import com.fr.form.FormElementCaseProvider;
+import com.fr.form.main.Form;
+import com.fr.form.ui.ElementCaseEditor;
+import com.fr.form.ui.Widget;
+import com.fr.general.GeneralUtils;
+import com.fr.log.FineLoggerFactory;
+import com.fr.schedule.util.ExecuteCondition;
+import com.fr.script.Calculator;
+import com.fr.stable.Constants;
+import com.fr.stable.StringUtils;
+import com.fr.stable.web.Repository;
+import com.fr.web.RepositoryDeal;
+import com.fr.web.core.ActionNoSessionCMD;
+import com.fr.web.core.ErrorHandlerHelper;
+import com.fr.web.core.FormSessionIDInfor;
+import com.fr.web.core.SessionPoolManager;
+import com.fr.web.session.SessionIDInfo;
+import com.fr.web.utils.WebUtils;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.PrintWriter;
+import java.util.Map;
+
+/**
+ * Created by Slpire on 2016/10/29.
+ */
+public class CheckRefreshAreaAction extends ActionNoSessionCMD {
+
+ private static final String CMD = "area";
+
+ @Override
+ public String getCMD() {
+ return CMD;
+ }
+
+ @Override
+ public void actionCMD(HttpServletRequest req, HttpServletResponse res, String sessionID) throws Exception {
+ FormSessionIDInfor sessionIDInfo = SessionPoolManager.getSessionIDInfor(sessionID, FormSessionIDInfor.class);
+ if (sessionIDInfo == null) {
+ ErrorHandlerHelper.getErrorHandler().error(req, res, "SessionID: \"" + sessionID + "\" time out.");
+ return;
+ }
+
+ String refreshArea = NetworkHelper.getHTTPRequestParameter(req, "refreshArea");
+ String reportName = NetworkHelper.getHTTPRequestParameter(req, "reportName");
+ boolean valueChange = true;
+
+ if (StringUtils.isNotEmpty(refreshArea)) {
+ if (NetworkHelper.getHTTPRequestBoolParameter(req, "customClass")) {
+ valueChange = exeCustomClass(refreshArea, sessionIDInfo, reportName);
+ } else {
+ valueChange = exeCellValue(req, sessionID, sessionIDInfo, refreshArea, reportName, true);
+ }
+ }
+
+ PrintWriter writer = WebUtils.createPrintWriter(res);
+ writer.write(valueChange + "");
+ writer.flush();
+ writer.close();
+ }
+
+ private boolean exeCellValue(HttpServletRequest req, String sessionID, FormSessionIDInfor sessionIDInfor, String refreshArea, String reportName, boolean valueChange) {
+ Repository repo = new RepositoryDeal(req, sessionIDInfor, Constants.DEFAULT_WEBWRITE_AND_SCREEN_RESOLUTION);
+ Form form = sessionIDInfor.getForm2Show();
+ sessionIDInfor.applySessionIDInforParameters(req);
+ Map para = sessionIDInfor.updatePara();
+ Calculator ca = initExpressionCalculator(sessionID, form, para);
+ para.putAll(form.getWidgetDefaultValueMap(para, repo));
+
+ sessionIDInfor.clearResultElementCase(reportName.toUpperCase());
+ // 计算下指定的报表块
+ executeGivenElements(sessionIDInfor, reportName, form, para);
+
+ try {
+ //用于解析报表块中的格子=reportBlock1~A1这种
+ String formulaContent = "=" + reportName + "~" + refreshArea;
+ Object newVal = ca.eval(new Formula(formulaContent));
+ valueChange = CachedExpressionControl.getInstance().whetherExpressionValueChange(sessionID, formulaContent, newVal);
+ } catch (Throwable e) {
+ // 传入非法的刷新区域, 直接强制刷新.
+ }
+ return valueChange;
+ }
+
+ private boolean exeCustomClass(String refreshArea, FormSessionIDInfor sessionIDInfor, String reportName) {
+ try {
+ ExecuteCondition executeClass = (ExecuteCondition) GeneralUtils.classForName(refreshArea).newInstance();
+ boolean result = executeClass.execute();
+ if (result) {
+ sessionIDInfor.clearResultElementCase(reportName.toUpperCase());
+ }
+ FineLoggerFactory.getLogger().debug("Class Execute Result: " + result);
+ return result;
+ } catch (Throwable throwable) {
+ FineLoggerFactory.getLogger().debug("Class Execute Failed: " + throwable.getMessage());
+ return false;
+ }
+ }
+
+ private void executeGivenElements(FormSessionIDInfor sessionIDInfor, String reportName, Form form, Map para) {
+ Widget widget = form.getWidgetByName(reportName);
+ ElementCaseEditor table = (ElementCaseEditor) widget;
+ FormElementCaseProvider elementcase = table.getElementCase();
+ elementcase.setName(reportName);
+ elementcase.setTabledataSource(form);
+ String[] elems = elementcase.dependenceBlocks();
+ elementcase.executeGivenElements(elems, sessionIDInfor, para);
+ }
+
+ private Calculator initExpressionCalculator(String sessionID, Form form, Map para) {
+ Calculator ca = Calculator.createCalculator();
+ ca.pushNameSpace(ParameterMapNameSpace.create(para));
+ ca.setAttribute(TableDataSource.KEY, form);
+ //用于解析报表块中的格子=reportBlock1~A1这种
+ ca.pushNameSpace(SessionIDInfo.asNameSpace(sessionID));
+ return ca;
+ }
+}
diff --git a/src/main/java/com/fr/plugin/reportRefresh/web/FormGetRefreshConfigAction.java b/src/main/java/com/fr/plugin/reportRefresh/web/FormGetRefreshConfigAction.java
new file mode 100644
index 0000000..6ea05aa
--- /dev/null
+++ b/src/main/java/com/fr/plugin/reportRefresh/web/FormGetRefreshConfigAction.java
@@ -0,0 +1,62 @@
+package com.fr.plugin.reportRefresh.web;
+
+import com.fr.form.main.Form;
+import com.fr.form.stable.RefreshAttrProvider;
+import com.fr.form.ui.ElementCaseEditor;
+import com.fr.form.ui.ElementCaseEditorProvider;
+import com.fr.json.JSONArray;
+import com.fr.json.JSONObject;
+import com.fr.plugin.reportRefresh.ReportExtraRefreshAttr;
+import com.fr.web.core.ActionNoSessionCMD;
+import com.fr.web.core.ErrorHandlerHelper;
+import com.fr.web.core.FormSessionIDInfor;
+import com.fr.web.core.SessionPoolManager;
+import com.fr.web.utils.WebUtils;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+/**
+ * Created by Slpire on 2016/10/29.
+ */
+public class FormGetRefreshConfigAction extends ActionNoSessionCMD {
+
+ public static final String CMD = "config";
+
+ @Override
+ public String getCMD() {
+ return CMD;
+ }
+
+ @Override
+ public void actionCMD(HttpServletRequest req, HttpServletResponse res, String sessionID) throws Exception {
+ FormSessionIDInfor sessionIDInfo;
+ try {
+ sessionIDInfo = SessionPoolManager.getSessionIDInfor(sessionID, FormSessionIDInfor.class);
+ } catch (Exception e) {
+ return;
+ }
+ if (sessionIDInfo == null) {
+ ErrorHandlerHelper.getErrorHandler().error(req, res, "SessionID: \"" + sessionID + "\" time out.");
+ return;
+ }
+ Form form = sessionIDInfo.getForm2Show();
+ ElementCaseEditorProvider[] elems = form.getElementCases();
+ JSONArray reports = JSONArray.create();
+ for (ElementCaseEditorProvider elem : elems) {
+ JSONObject jo = JSONObject.create();
+ String widgetName = elem.getWidgetName();
+ String mark = RefreshAttrProvider.XML_TAG;
+ ReportExtraRefreshAttr attr = ((ElementCaseEditor) elem).getAttrMark(mark);
+ jo.put("widgetName", widgetName);
+ if (attr != null) {
+ jo.put(mark, attr.createJSONConfig());
+ }
+ reports.put(jo);
+ }
+ JSONObject formJo = JSONObject.create();
+ formJo.put("sessionID", sessionID);
+ formJo.put("reports", reports);
+ WebUtils.printAsJSON(res, formJo);
+ }
+}
diff --git a/src/main/java/com/fr/plugin/reportRefresh/web/JavaScriptFile.java b/src/main/java/com/fr/plugin/reportRefresh/web/JavaScriptFile.java
new file mode 100644
index 0000000..21171a8
--- /dev/null
+++ b/src/main/java/com/fr/plugin/reportRefresh/web/JavaScriptFile.java
@@ -0,0 +1,16 @@
+package com.fr.plugin.reportRefresh.web;
+
+import com.fr.stable.fun.impl.AbstractJavaScriptFileHandler;
+
+/**
+ * Created by Slpire on 16/9/22.
+ */
+public class JavaScriptFile extends AbstractJavaScriptFileHandler {
+
+ @Override
+ public String[] pathsForFiles() {
+ return new String[] {
+ "/com/fr/plugin/reportRefresh/web/refresh.js"
+ };
+ }
+}
diff --git a/src/main/java/com/fr/plugin/reportRefresh/web/RefreshFormService.java b/src/main/java/com/fr/plugin/reportRefresh/web/RefreshFormService.java
new file mode 100644
index 0000000..8d8961c
--- /dev/null
+++ b/src/main/java/com/fr/plugin/reportRefresh/web/RefreshFormService.java
@@ -0,0 +1,32 @@
+package com.fr.plugin.reportRefresh.web;
+
+import com.fr.stable.fun.Service;
+import com.fr.stable.web.RequestCMDReceiver;
+import com.fr.web.core.WebActionsDispatcher;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+/**
+ * Created by Slpire on 2016/10/29.
+ */
+public class RefreshFormService implements Service {
+
+ private RequestCMDReceiver[] actions = {
+ new FormGetRefreshConfigAction(),
+ new CheckRefreshAreaAction()
+ };
+
+ public RefreshFormService() {
+ }
+
+ @Override
+ public String actionOP() {
+ return "form_refresh";
+ }
+
+ @Override
+ public void process(HttpServletRequest req, HttpServletResponse res, String op, String sessionID) throws Exception {
+ WebActionsDispatcher.dealForActionDefaultCmd(req, res, sessionID, actions, FormGetRefreshConfigAction.CMD);
+ }
+}
diff --git a/src/main/resources/com/fr/plugin/reportRefresh/locale/refresh.properties b/src/main/resources/com/fr/plugin/reportRefresh/locale/refresh.properties
new file mode 100644
index 0000000..7d7358c
--- /dev/null
+++ b/src/main/resources/com/fr/plugin/reportRefresh/locale/refresh.properties
@@ -0,0 +1,15 @@
+FR-Plugin_Refresh=Refresh
+FR-Plugin_Refresh-Plugin=Refresh PLugin
+FR-Plugin_Monitor-Refresh=Monitor Refresh
+FR-Plugin_Refresh-Area=Refresh Area
+FR-Plugin_Refresh-Interval=Interval:
+FR-Plugin_Refresh-Interval-Refresh=Interval Refresh
+FR-Plugin_Refresh-No-Refresh=No Refresh
+FR-Plugin_Refresh-Sample=eg: A1, C2:C12, E3:J6
+FR-Plugin_Refresh-Second=Second
+FR-Plugin_Refresh-Type=Refresh Type:
+FR-Plugin_Class-Refresh=
+FR-Plugin_Refresh-Class=
+FR-Plugin_Refresh-Label=
+FR-Plugin_Refresh-Example=
+FR-Plugin_Refresh-Tip=
\ No newline at end of file
diff --git a/src/main/resources/com/fr/plugin/reportRefresh/locale/refresh_en_US.properties b/src/main/resources/com/fr/plugin/reportRefresh/locale/refresh_en_US.properties
new file mode 100644
index 0000000..080ce7b
--- /dev/null
+++ b/src/main/resources/com/fr/plugin/reportRefresh/locale/refresh_en_US.properties
@@ -0,0 +1,15 @@
+FR-Plugin_Refresh=Refresh
+FR-Plugin_Refresh-Plugin=Refresh PLugin
+FR-Plugin_Monitor-Refresh=Monitor Refresh
+FR-Plugin_Refresh-Area=Refresh Area
+FR-Plugin_Refresh-Interval=Interval:
+FR-Plugin_Refresh-Interval-Refresh=Interval Refresh
+FR-Plugin_Refresh-No-Refresh=No Refresh
+FR-Plugin_Refresh-Sample=eg: A1, C2:C12, E3:J6
+FR-Plugin_Refresh-Second=Second
+FR-Plugin_Refresh-Type=Refresh Type:
+FR-Plugin_Class-Refresh=Custom Refresh
+FR-Plugin_Refresh-Class=Custom Class
+FR-Plugin_Refresh-Label=Custom:
+FR-Plugin_Refresh-Example=eg: com.fr.RefreshImpl
+FR-Plugin_Refresh-Tip=you can implement ExecuteCondition to return wherher need refresh
\ No newline at end of file
diff --git a/src/main/resources/com/fr/plugin/reportRefresh/locale/refresh_zh_CN.properties b/src/main/resources/com/fr/plugin/reportRefresh/locale/refresh_zh_CN.properties
new file mode 100644
index 0000000..465ff16
--- /dev/null
+++ b/src/main/resources/com/fr/plugin/reportRefresh/locale/refresh_zh_CN.properties
@@ -0,0 +1,15 @@
+FR-Plugin_Refresh=\u5237\u65B0
+FR-Plugin_Refresh-Plugin=\u8868\u5355\u62A5\u8868\u5757\u5237\u65B0\u63D2\u4EF6
+FR-Plugin_Monitor-Refresh=\u76D1\u63A7\u5237\u65B0
+FR-Plugin_Refresh-Area=\u76D1\u63A7\u533A\u57DF:
+FR-Plugin_Refresh-Interval=\u5237\u65B0\u95F4\u9694:\u3000
+FR-Plugin_Refresh-Interval-Refresh=\u5B9A\u671F\u5237\u65B0
+FR-Plugin_Refresh-No-Refresh=\u5173\u95ED
+FR-Plugin_Refresh-Sample=\u683C\u5F0F: A1, C2:C123, E3:J6
+FR-Plugin_Refresh-Second=\u79D2
+FR-Plugin_Refresh-Type=\u5237\u65B0\u673A\u5236: \u3000
+FR-Plugin_Class-Refresh=\u81EA\u5B9A\u4E49\u7C7B\u5237\u65B0
+FR-Plugin_Refresh-Class=\u81EA\u5B9A\u4E49\u7C7B
+FR-Plugin_Refresh-Label=\u81EA\u5B9A\u4E49\u7C7B:
+FR-Plugin_Refresh-Example=\u683C\u5F0F: com.fr.RefreshImpl
+FR-Plugin_Refresh-Tip=\u60A8\u53EF\u4EE5\u901A\u8FC7\u81EA\u5B9A\u4E49\u7C7B\u5B9E\u73B0ExecuteCondition\u63A5\u53E3\u6765\u8FD4\u56DE\u662F\u5426\u9700\u8981\u5237\u65B0\u7EC4\u4EF6.
\ No newline at end of file
diff --git a/src/main/resources/com/fr/plugin/reportRefresh/locale/refresh_zh_TW.properties b/src/main/resources/com/fr/plugin/reportRefresh/locale/refresh_zh_TW.properties
new file mode 100644
index 0000000..16de687
--- /dev/null
+++ b/src/main/resources/com/fr/plugin/reportRefresh/locale/refresh_zh_TW.properties
@@ -0,0 +1,15 @@
+FR-Plugin_Refresh=\u5237\u65B0
+FR-Plugin_Refresh-Plugin=\u8868\u5355\u62A5\u8868\u5757\u5237\u65B0\u63D2\u4EF6
+FR-Plugin_Monitor-Refresh=\u76E3\u63A7\u5237\u65B0
+FR-Plugin_Refresh-Area=\u76E3\u63A7\u55AE\u5143\u683C:
+FR-Plugin_Refresh-Interval=\u5237\u65B0\u9593\u9694:
+FR-Plugin_Refresh-Interval-Refresh=\u5B9A\u671F\u5237\u65B0
+FR-Plugin_Refresh-No-Refresh=\u95DC\u9589
+FR-Plugin_Refresh-Sample=\u683C\u5F0F: A1, C2:C12, E3:J6
+FR-Plugin_Refresh-Second=\u79D2
+FR-Plugin_Refresh-Type=\u5237\u65B0\u6A5F\u5236:
+FR-Plugin_Class-Refresh=\u81EA\u5B9A\u7FA9\u985E\u5237\u65B0
+FR-Plugin_Refresh-Class=\u81EA\u5B9A\u4E49\u7C7B
+FR-Plugin_Refresh-Label=\u81EA\u5B9A\u4E49\u7C7B:
+FR-Plugin_Refresh-Example=\u683C\u5F0F: com.fr.RefreshImpl
+FR-Plugin_Refresh-Tip=\u60A8\u53EF\u4EE5\u901A\u8FC7\u81EA\u5B9A\u4E49\u7C7B\u5B9E\u73B0ExecuteCondition\u63A5\u53E3\u6765\u8FD4\u56DE\u662F\u5426\u9700\u8981\u5237\u65B0\u7EC4\u4EF6.
\ No newline at end of file
diff --git a/src/main/resources/com/fr/plugin/reportRefresh/web/refresh.js b/src/main/resources/com/fr/plugin/reportRefresh/web/refresh.js
new file mode 100644
index 0000000..64cbeaf
--- /dev/null
+++ b/src/main/resources/com/fr/plugin/reportRefresh/web/refresh.js
@@ -0,0 +1,130 @@
+;
+(function ($) {
+ //防止重复设置
+ var flag = false;
+ FR.Form.Plugin.Panel.Events.push({
+ name: FR.Events.AFTERLOAD,
+
+ action: function () {
+ if (isParameterPane(this.options.type) || flag) {
+ return;
+ }
+ flag = true;
+ var sessionID = this.sessionID;
+ FR.ajax({
+ url: FR.servletURL,
+ data: {
+ op: 'form_refresh',
+ cmd: 'config',
+ sessionID: sessionID,
+ _: new Date().getTime()
+ },
+ async: false,
+ complete: function (res, status) {
+ if (status == 'success' && res.responseText) {
+ contenConfig = FR.jsonDecode(res.responseText);
+ doSetRefresh(contenConfig);
+ }
+ }
+ });
+ }
+ });
+
+ var isParameterPane = function(type){
+ //参数面板的form的话不走这边的逻辑
+ return type === "parameter";
+ };
+
+ var doSetRefresh = function (contenConfig) {
+ var reportsConfig = contenConfig.reports;
+ if (FR.isEmpty(reportsConfig)) {
+ return;
+ }
+
+ for (var j = 0, length = reportsConfig.length; j < length; j++) {
+ var opts = reportsConfig[j];
+ if (FR.isEmpty(opts.Refresh)) {
+ continue;
+ }
+
+ var state = opts.Refresh.state;
+ var interval = opts.Refresh.interval;
+
+ if (state === 0 || interval === 0) {
+ continue;
+ }
+ opts.sessionID = contenConfig.sessionID;
+ var refreshFunc = function (opts) {
+ return function () {
+ refreshReport(opts);
+ }
+ };
+ window.setTimeout(refreshFunc(opts), interval * 1000);
+ }
+ };
+
+ var refreshReport = function (opts) {
+ var currentTime = new Date().getTime();
+ var widget = _g().getWidgetByName(opts.widgetName);
+ if (FR.isEmpty(widget)) {
+ //有些控件会在某些操作之后创建,所以这边也要添加定时器
+ window.setTimeout(function() {
+ refreshReport(opts);
+ }, opts.Refresh.interval * 1000);
+ return;
+ }
+ FR.ajax({
+ url: FR.servletURL,
+ data: {
+ op: 'clear_pdl',
+ sessionID: opts.sessionID,
+ _: new Date().getTime()
+ }
+ });
+ function fun(needRefresh) {
+ if(needRefresh){
+ var animateProcessor = FR.Report.Plugin.AnimateProcessor;
+ var item = animateProcessor.item;
+ if (item && FR.Plugin.validLevel(animateProcessor, item) && item.refresh) {
+ item.refresh.call(this, widget, function () {
+ widget.gotoPage(1, "{}", 'lazy', false, false, true);
+ });
+ resetTimer();
+ return;
+ }
+ widget.gotoPage(1, "{}", 'lazy', false, false, true);
+ }
+ resetTimer();
+ }
+
+ function resetTimer() {
+ var proccessTime = opts.Refresh.interval * 1000 - new Date().getTime() + currentTime;
+ var timeout = proccessTime ? proccessTime : 0;
+ window.setTimeout(function () {
+ refreshReport(opts);
+ }, timeout);
+ }
+
+ refreshByArea(opts, fun);
+ };
+
+ var refreshByArea = function (opts, callback) {
+ FR.ajax({
+ url: FR.servletURL,
+ data: {
+ op: 'form_refresh',
+ cmd: 'area',
+ sessionID: opts.sessionID,
+ refreshArea: opts.Refresh.refreshArea,
+ customClass: opts.Refresh.customClass,
+ reportName: opts.widgetName,
+ _: new Date().getTime()
+ },
+ complete: function (res, status) {
+ if (status == 'success') {
+ callback(res.responseText === 'true' || FR.isEmpty(opts.Refresh.refreshArea));
+ }
+ }
+ });
+ };
+})(jQuery);