1061 lines
37 KiB
JavaScript
1061 lines
37 KiB
JavaScript
window.DaemonSupportUI = function (targetElement) {
|
|
|
|
var _this = this;
|
|
var _targetElement = $((targetElement.lenght != undefined ? targetElement = _targetElement[0] : targetElement));
|
|
var _centerBoxHtml = '<div class="report-centerbox-container"><div class="report-centerbox-outer"><div class="report-centerbox-inner"><div class="report-centerbox-centered"></div>';
|
|
var _uid = "";
|
|
|
|
var _currentOpenDialog = null;
|
|
var _paintDivEle = null;
|
|
|
|
this.setUID = function (uidKey) {
|
|
_uid = uidKey;
|
|
_paintDivEle = null;
|
|
selectPaintDiv();
|
|
|
|
}
|
|
|
|
this.showMessageBox = function (innerTag, classNameOrStyle) {
|
|
selectPaintDiv();
|
|
var errorMessageTag = '<span style="font-size: 9pt"> ( '
|
|
+ errorMessageText + ' )</span>'
|
|
_paintDivEle.append($(errorMessageTag));
|
|
};
|
|
|
|
this.showExtraErrorMessage = function (errorCode, errorMessage) {
|
|
if (errorCode == null || errorCode == undefined || errorCode.toUpperCase() === 'SUCCESS') { }
|
|
else {
|
|
|
|
return setTimeout(
|
|
function () {
|
|
|
|
|
|
selectPaintDiv();
|
|
errorCode = errorCode.toUpperCase().replace(/-/g, '_');
|
|
var errorMessageTag = '<span style="font-weight: bold; font-size: 9pt; color : #454545"> ( '
|
|
+ errorCode + ' ) </span>'
|
|
if (errorMessage != undefined && errorMessage != null)
|
|
errorMessageTag += '<div style="margin-top : 7px; font-size: 10pt; color: #898989">'
|
|
+ errorMessage + '</div>';
|
|
_paintDivEle.append($(errorMessageTag));
|
|
}, 350);
|
|
}
|
|
};
|
|
|
|
this.hideProgress = function () {
|
|
selectPaintDiv();
|
|
var reportProgressEle = _paintDivEle.find('.report_progress');
|
|
reportProgressEle.remove();
|
|
}
|
|
|
|
function selectPaintDiv() {
|
|
if (_paintDivEle == null || _paintDivEle.length == 0) {
|
|
_paintDivEle = _targetElement.find('#re_paintDiv' + _uid);
|
|
}
|
|
}
|
|
|
|
var _progress = 0;
|
|
var _currentProgress = 0;
|
|
var _startTimeoutAnimation = false;
|
|
var _lastInputProgress = 0;
|
|
var _progressTextEle = null;
|
|
var _delaySetProgressAndProgress = 1;
|
|
var _aniTimerID = 0;
|
|
var _onExportProgressInSupportUIFunc = null;
|
|
var _intervalForAnimation = 1;
|
|
var _isVisibleExportProgress = false;
|
|
|
|
|
|
var _appendProgressIndicator = function () {
|
|
selectPaintDiv();
|
|
var reportProgressEle = _paintDivEle.find('.report_progress');
|
|
var progressIndicatorEles = reportProgressEle.find('.progressIndicator');
|
|
progressIndicatorEles.remove();
|
|
var progressIndicatorEle = $("<div class='progressIndicator' style='font-family: OpenSans,NanumGothic, sans-serif; color:#7a7a7a;font-size:16pt;font-weight : 900; top: 30%;bottom:50%;position:absolute;left:0px;right:0px;overflow:hidden;'><div style='margin-top : 12px'><span class='progress-text'>"
|
|
+ (_isVisibleExportProgress ? "0" : "")
|
|
+ "</span><span style='font-size:12pt;'>"
|
|
+ (_isVisibleExportProgress ? "%" : "")
|
|
+ "</span></div></div>");
|
|
reportProgressEle.append(progressIndicatorEle);
|
|
_progressTextEle = progressIndicatorEle.find('.progress-text');
|
|
}
|
|
|
|
|
|
var _lastProgress = -1;
|
|
var _lastAniTimeID = -1;
|
|
function _setProgressView(progress) {
|
|
if (_lastAniTimeID == _aniTimerID && _lastProgress == progress) return;
|
|
_lastProgress = progress;
|
|
_lastAniTimeID = _aniTimerID;
|
|
|
|
if (_isVisibleExportProgress) _progressTextEle.text(progress);
|
|
else _progressTextEle.text('');
|
|
if (_onExportProgressInSupportUIFunc != null) _onExportProgressInSupportUIFunc(progress);
|
|
}
|
|
|
|
function _updateProgress() {
|
|
if (_currentProgress < _progress) {
|
|
if (_progress >= 100) {
|
|
_currentProgress += 3;
|
|
_currentProgress = _currentProgress > 100 ? 100 : _currentProgress;
|
|
} else {
|
|
_currentProgress++;
|
|
}
|
|
_setProgressView(_currentProgress);
|
|
}
|
|
else if (_currentProgress == 0) {
|
|
_setProgressView(0);
|
|
}
|
|
if (_startTimeoutAnimation) {
|
|
if (_progress > _currentProgress && _progress != 100) {
|
|
_intervalForAnimation = _delaySetProgressAndProgress / (_progress - _currentProgress);
|
|
|
|
} else if (_progress >= 100) {
|
|
_intervalForAnimation = 1;
|
|
} else {
|
|
_intervalForAnimation = 10;
|
|
}
|
|
|
|
_intervalForAnimation = _intervalForAnimation < 1 ? 10 : _intervalForAnimation;
|
|
setTimeout(_updateProgress, _intervalForAnimation);
|
|
}
|
|
if (_currentProgress >= 100) {
|
|
_startTimeoutAnimation = false;
|
|
}
|
|
|
|
};
|
|
|
|
this._setOnExportProgressCallback = function (onExportProgress) {
|
|
_onExportProgressInSupportUIFunc = onExportProgress;
|
|
}
|
|
|
|
this._setVisibleExportProgress = function (visible) {
|
|
_isVisibleExportProgress = visible;
|
|
}
|
|
|
|
|
|
|
|
this.showProgressIndicator = function (progress) {
|
|
_progress = progress;
|
|
if (progress <= 0) _delaySetProgressAndProgress = 1;
|
|
else _delaySetProgressAndProgress = new Date().getTime() - _lastInputProgress;
|
|
_lastInputProgress = new Date().getTime();
|
|
if (_progress >= 100) {
|
|
_currentProgress = 100;
|
|
if (_progressTextEle == null) _appendProgressIndicator();
|
|
_startTimeoutAnimation = false;
|
|
clearTimeout(_aniTimerID);
|
|
_setProgressView(100);
|
|
}
|
|
else if (_progress <= 0) {
|
|
_appendProgressIndicator();
|
|
_currentProgress = 0;
|
|
if (!_startTimeoutAnimation) {
|
|
_aniTimerID = setTimeout(_updateProgress, 100);
|
|
}
|
|
_startTimeoutAnimation = true;
|
|
}
|
|
}
|
|
|
|
|
|
}
|
|
|
|
/**
|
|
* text에 관하여 서버로 데이터를 전송이 일어나기전에 호출하는 함수입니다.<br>
|
|
* 서버로 text/html 통신이 일어나기전에 아래 선언된 함수를 거쳐서 통신합니다.<br>
|
|
*
|
|
* @param strData
|
|
* {String} 서버로 전송할 데이터
|
|
* @returns
|
|
* @since version 1.0.0.72
|
|
*/
|
|
|
|
window.DaemonSupport = function (apiURL) {
|
|
|
|
var CLIPREPORT_SEPARATOR = '{clipreport_separator}';
|
|
|
|
var FLAG_EXPORT_STANDBY = 8;
|
|
var FLAG_EXPORT_ERROR = 4;
|
|
var FLAG_EXPORT_FOR_PRINT_STATUS = 2;
|
|
var FLAG_EXPORT_STATUS = 1;
|
|
var FLAG_EXPORT_NONE = 0;
|
|
|
|
var _uid = "";
|
|
var _clipApiUrl = _isNil(apiURL) ? "" : apiURL;
|
|
var _keyCount = 0;
|
|
var _ClipAPIUrl = "";
|
|
var _this = this;
|
|
|
|
var _reportStatus = FLAG_EXPORT_NONE;
|
|
/** 비동기 export 의 paramter 값 */
|
|
var _exportParameter = null;
|
|
/** window.ClipReportSupportAPIClient : 데몬 support api 를 지원하기 위한 클라이언트 인스턴스 * */
|
|
var _apiClient = null;
|
|
/** Number : xhr polling 간격 */
|
|
var _xhrPollingInterval = 700;
|
|
/** Boolean : true 일경우 비동기 export 사용. * */
|
|
var _isAsyncExportProcess = true;
|
|
/** Boolean : true 일경우 export 시 진행률 (%) 를 출력한다.* */
|
|
var _isVisibleExportProgress = false;
|
|
/** function object : export progress 를 비동기 상태로 반환하는 이벤트 */
|
|
var _onExportProgress = null;
|
|
/**
|
|
* String : 'pdf' : R08, 인쇄, 'mobile_pdf' : R09 모바일 PDF 다운로드, 'save' : R09
|
|
* 일반 export *
|
|
*/
|
|
var _exportType = "";
|
|
var _report = null; // Object : 리포트 웹 뷰어 객체
|
|
var _daemonSupportUI = null; // window.DaemonSupportUI : 리포트 웹 뷰어의 확장 UI
|
|
// 제공 모듈
|
|
var _isAsyncExportProcess
|
|
|
|
this.UI = null;
|
|
this.ui = null;
|
|
|
|
this.setAsyncExport = function (async) {
|
|
_isAsyncExportProcess = async;
|
|
if (_isNil(_isAsyncExportProcess))
|
|
_isAsyncExportProcess = false;
|
|
}
|
|
|
|
this.asyncExport = function () {
|
|
|
|
window.onBeforeSend = function (strData) {
|
|
var clipID = _parseQueryString(strData).ClipID;
|
|
return strData;
|
|
}
|
|
window.onAfterSend = function (strData) {
|
|
if (_uid == null) {
|
|
_this.bind(_ClipAPIUrl, strData);
|
|
}
|
|
if (strData.indexOf(CLIPREPORT_SEPARATOR) < 0) {
|
|
try {
|
|
var resultObject = (new Function('return ' + strData))();
|
|
} catch (e) {
|
|
return strData;
|
|
}
|
|
if (resultObject === undefined || resultObject === null) return strData;
|
|
|
|
if (resultObject.status == false && _this._daemonSupportUI != null) {
|
|
_this._daemonSupportUI.showExtraErrorMessage(resultObject.supportEvent, resultObject.message);
|
|
}
|
|
}
|
|
return strData;
|
|
};
|
|
window.onSaveBeforeSend = _onSaveBeforeSend;
|
|
};
|
|
|
|
/**
|
|
* report viewer 를 ClipReportSupport 객체에 bind 한다. (적용한다.)
|
|
*
|
|
* @param ClipAPIUrl
|
|
* Clip.jsp 파일의 절대 경로
|
|
* @param uid
|
|
* uid 값을 포함하고 있는 키.
|
|
*/
|
|
this.bind = function (ClipAPIUrl, uid) {
|
|
_uid = ClipReportSupportUtil.obtainUidValue(uid);
|
|
if (_uid == null)
|
|
return;
|
|
|
|
_clipApiUrl = ClipAPIUrl;
|
|
_apiClient = new ClipReportSupportAPIClient(ClipAPIUrl, _uid);
|
|
this.UI.setUID(_uid)
|
|
// 창을 닫았을 때 세션을 바로 제거해주는 동작을 진행한다.
|
|
if (isIE() == true) {
|
|
_bindUnload();
|
|
} else {
|
|
_bindToBeforeunload();
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 리포트 뷰어를 생성한다.
|
|
*
|
|
* @param ClipAPIUrl
|
|
* Clip.jsp 파일의 절대 경로
|
|
* @param oof
|
|
* oof string
|
|
* @param targetTag
|
|
* 대상이 되는 html element 객체
|
|
*
|
|
* @return report 뷰어 객체
|
|
*/
|
|
this.createReport = function (ClipAPIUrl, oof, targetTag) {
|
|
_ClipAPIUrl = ClipAPIUrl;
|
|
var report = createReport(ClipAPIUrl, oof, targetTag);
|
|
_report = report;
|
|
_daemonSupportUI = new DaemonSupportUI(targetTag);
|
|
_this.ui = _this.UI = _daemonSupportUI = new DaemonSupportUI(targetTag);
|
|
_waitForResultUID(function () {
|
|
_this.bind(_ClipAPIUrl, report.getReportKey());
|
|
_this.asyncExport();
|
|
});
|
|
report.exportToken = "";
|
|
report.setSavingFileOption(false);
|
|
return report;
|
|
};
|
|
|
|
/**
|
|
*
|
|
* @param ClipAPIUrl
|
|
* Clip.jsp 파일의 절대 경로
|
|
*
|
|
*/
|
|
this.createJSPReport = function (ClipAPIUrl, userJsp, postData, targetTag) {
|
|
_ClipAPIUrl = ClipAPIUrl;
|
|
var report = createJSPReport(ClipAPIUrl, userJsp, postData, targetTag);
|
|
_report = report;
|
|
_daemonSupportUI = new DaemonSupportUI(targetTag);
|
|
_this.ui = _this.UI = _daemonSupportUI = new DaemonSupportUI(targetTag);
|
|
_waitForResultUID(function () {
|
|
_this.bind(_ClipAPIUrl, report.getReportKey());
|
|
_this.asyncExport();
|
|
});
|
|
report.exportToken = "";
|
|
report.setSavingFileOption(false);
|
|
return report;
|
|
};
|
|
|
|
this.createImportJSPReport = function (ClipAPIUrl, reportKey, targetTag) {
|
|
_ClipAPIUrl = ClipAPIUrl;
|
|
var report = createImportJSPReport(ClipAPIUrl, reportKey, targetTag);
|
|
this.ui = this.UI = _daemonSupportUI = new DaemonSupportUI(targetTag);
|
|
_this.bind(_ClipAPIUrl, reportKey);
|
|
_checkSupportErrorCode(reportKey);
|
|
_report = report;
|
|
_this.asyncExport();
|
|
report.exportToken = "";
|
|
report.setSavingFileOption(false);
|
|
return report;
|
|
}
|
|
|
|
/**
|
|
* export 시 프로그래스 숫자를 표시할 것인지를 설정한다.
|
|
*
|
|
* @param visible
|
|
* boolean 형. true 일 경우 export progress 를 출력하고 false 일 경우는 출력하지
|
|
* 않는다. 기본값 false.
|
|
*/
|
|
this.setVisibleExportProgress = function (visible) {
|
|
_daemonSupportUI._setVisibleExportProgress(visible);
|
|
}
|
|
|
|
this.setOnExportProgressCallback = function (onExportProgressListener) {
|
|
_daemonSupportUI._setOnExportProgressCallback(onExportProgressListener);
|
|
}
|
|
|
|
|
|
function _waitForResultUID(nextFunc) {
|
|
window.onAfterSend = function (strData) {
|
|
if (strData.indexOf(CLIPREPORT_SEPARATOR) < 0) {
|
|
_checkSupportErrorCode(strData);
|
|
}
|
|
return strData;
|
|
};
|
|
var key = _report.getReportKey();
|
|
if (key == null) {
|
|
setTimeout(function () {
|
|
_waitForResultUID(nextFunc);
|
|
}, 500);
|
|
} else {
|
|
nextFunc();
|
|
}
|
|
}
|
|
|
|
function _onSaveBeforeSend(report, strData, printType) {
|
|
|
|
if (!_isAsyncExportProcess)
|
|
return true;
|
|
var obj = _parseQueryString(strData);
|
|
if (!_isNil(obj.ClipID)
|
|
&& (obj.ClipID === "R08" || obj.ClipID === "R09")) {
|
|
|
|
_exportType = printType;
|
|
_reportStatus = obj.ClipID === "R08" ? FLAG_EXPORT_FOR_PRINT_STATUS
|
|
: FLAG_EXPORT_STATUS;
|
|
_exportParameter = obj;
|
|
_startExport();
|
|
}
|
|
|
|
return _reportStatus === FLAG_EXPORT_NONE;
|
|
}
|
|
|
|
function _checkSupportErrorCode(reportKey) {
|
|
var reportKeyObj = (new Function('return ' + reportKey))();
|
|
if (reportKey == null)
|
|
return;
|
|
var supportEvent = reportKeyObj.supportEvent;
|
|
if (supportEvent != undefined && supportEvent != null
|
|
&& supportEvent.toLowerCase() != 'success') {
|
|
_daemonSupportUI.showExtraErrorMessage(supportEvent, reportKeyObj.message);
|
|
}
|
|
}
|
|
|
|
function _startExport() {
|
|
|
|
mRe_report_language()
|
|
|
|
var downloadLink = '';
|
|
|
|
|
|
var TXT_DATA_EXPORT_TYPE = '12';
|
|
if (_exportParameter != null && _exportParameter.exportType == TXT_DATA_EXPORT_TYPE) {
|
|
_downloadExport()
|
|
return;
|
|
}
|
|
_this.UI.showProgressIndicator(0);
|
|
|
|
_apiClient.startExport(_exportParameter,
|
|
function (result) {
|
|
_report.saveFormTag.exportToken = {};
|
|
_report.saveFormTag.exportToken.value = _report.exportToken = result.exportToken;
|
|
if (result.isSuccess === false) {
|
|
_showExportErrorMessage(result);
|
|
_report.removeSAVEProgress();
|
|
} else if (result.isComplete === true) {
|
|
if (_isVisibleExportProgress) _this.UI.showProgressIndicator(100);
|
|
setTimeout(function () {
|
|
downloadLink = _downloadExport(result.exportToken);
|
|
}, 30);
|
|
} else {
|
|
_startUpdateOnExportStatus(1, result.exportToken)
|
|
}
|
|
});
|
|
|
|
}
|
|
|
|
function _showExportErrorMessage(result) {
|
|
if (result.event.includes('session-out')) {
|
|
alert(_report.m_languageMap.sesstion_error)
|
|
} else {
|
|
alert('export error : ' + result.event + " (" + result.message + ")");
|
|
}
|
|
}
|
|
|
|
function _startUpdateOnExportStatus(timeout, exportToken) {
|
|
setTimeout(function () {
|
|
if (_reportStatus == FLAG_EXPORT_FOR_PRINT_STATUS
|
|
|| _reportStatus == FLAG_EXPORT_STATUS) {
|
|
_apiClient.updateExportStatus(exportToken, function (result) {
|
|
if (result.isSuccess === false) {
|
|
_showExportErrorMessage(result);
|
|
_report.removeSAVEProgress();
|
|
} else if (result.isComplete === false) {
|
|
if (result.total > 0) _this.UI.showProgressIndicator(Math.floor(((result.current / result.total) * 100)));
|
|
else _this.UI.showProgressIndicator(0);
|
|
_startUpdateOnExportStatus(_xhrPollingInterval, result.exportToken);
|
|
} else if (result.isComplete === true) {
|
|
_this.UI.showProgressIndicator(100);
|
|
setTimeout(function () {
|
|
_downloadExport(result.exportToken);
|
|
}, 30);
|
|
|
|
}
|
|
});
|
|
}
|
|
}, timeout);
|
|
}
|
|
|
|
/**
|
|
* 뷰어 모드 : export 가 완료된 파일 다운로드를 시작합니다.
|
|
*/
|
|
function _downloadExport(exportToken) {
|
|
window.is_edge = ((agt + '').indexOf('chrome') != -1 && (agt + '').indexOf('edg') != -1) || (agt + '').indexOf("edge") != -1;
|
|
if ('pdf' === _exportType) { // R08
|
|
_report.mRe_printView_demon();
|
|
} else if ('mobile_pdf' === _exportType) { // R09
|
|
try {
|
|
_report.mRe_mobilePDF_demon();
|
|
} catch (ignored) {
|
|
}
|
|
try {
|
|
_report.removeSAVEProgress()
|
|
_report.removePDFProgress();
|
|
} catch (ignored) {
|
|
}
|
|
} else if ('save' === _exportType) {// R09
|
|
_report.mRe_saveFile_demon();
|
|
_report.removeSAVEProgress()
|
|
}
|
|
}
|
|
|
|
// IE 를 제외한 브라우저 전용. 리포트 삭제 명령을 전송한다.
|
|
// IE 10 이하에서 Alert 메세지를 띄우고 그 창을 닫을 때, beforeunload 가 호출되는 버그가 있기 때문에,
|
|
// IE 에서는 사용하지 않는다.
|
|
function _bindToBeforeunload() {
|
|
$(window).bind('beforeunload', function (event) {
|
|
_apiClient.deleteReport();
|
|
});
|
|
}
|
|
|
|
// IE 에서만 동작.
|
|
// 크롬 및 오페라는 unload 가 동작하지 않는 이슈가 있다.
|
|
function _bindUnload() {
|
|
$(window).bind('unload', function (event) {
|
|
_apiClient.deleteReport();
|
|
});
|
|
}
|
|
|
|
/**
|
|
* Query String 을 Object 로 변환한다.
|
|
*/
|
|
function _parseQueryString(query) {
|
|
var params = {}
|
|
var vars = query.split('&');
|
|
for (var i = 0; i < vars.length; i++) {
|
|
var pair = vars[i].split('=');
|
|
params[pair[0]] = decodeURIComponent(pair[1]);
|
|
}
|
|
return params;
|
|
}
|
|
|
|
/**
|
|
* 만약 파라미터가 null 혹은 undefined 혹은 길이가 0일경우 true 를 반홚나다.
|
|
*
|
|
* @param value
|
|
* 검사하기 위한 인자값
|
|
*/
|
|
function _isNil(value) {
|
|
return value == undefined || value == null
|
|
|| (typeof (value) === 'string' && value.length == 0);
|
|
}
|
|
|
|
/**
|
|
* IE 인지 확인한다. 엣지는 IE가 아니다.
|
|
*
|
|
* @return IE 일 경우 true
|
|
*/
|
|
function isIE() {
|
|
var agent = navigator.userAgent.toLowerCase();
|
|
return agent.indexOf('msie') != -1;
|
|
}
|
|
}
|
|
/*
|
|
*//**
|
|
* 새로고침을 막아버린다.
|
|
*
|
|
* function blockRefresh() {
|
|
*
|
|
* $(document).keydown(function(argEvent) { key = (argEvent) ?
|
|
* argEvent.keyCode : event.keyCode;
|
|
*
|
|
* var activeElement = document.activeElement;
|
|
*
|
|
* if (key == 8 || key == 116 || key == 17 || key == 82) {
|
|
*
|
|
* if (key == 8) { if (activeElement.tagName != "INPUT") { if (argEvent) {
|
|
* e.preventDefault(); } else { event.keyCode = 0; event.returnValue =
|
|
* false; } } } else { if (argEvent) { argEvent.preventDefault(); } else {
|
|
* event.keyCode = 0; event.returnValue = false; } } } }); } };
|
|
*
|
|
*
|
|
* /** DaemonSupport 라이브러리를 만든다.
|
|
*
|
|
* @param Clip.jsp
|
|
* 의 url path
|
|
*/
|
|
window.createReportSupport = function (apiUrl) {
|
|
return new DaemonSupport(apiUrl);
|
|
};
|
|
|
|
window.ClipReportSupport = new DaemonSupport();
|
|
|
|
window.ClipReportSupportUtil = new function () {
|
|
|
|
this.obtainUidValue = function (uid) {
|
|
if (uid === undefined)
|
|
return null;
|
|
var uidValue = null;
|
|
// UID 값을 추출한다.
|
|
if (typeof uid === 'string') {
|
|
uidValue = _extractUIDFromStringReportKey(uid);
|
|
if (uidValue == null)
|
|
uidValue = uid;
|
|
} else {
|
|
uidValue = uid['uid'];
|
|
}
|
|
return uidValue;
|
|
}
|
|
|
|
function _extractUIDFromStringReportKey(uid) {
|
|
var uidKey = "'uid'";
|
|
var idx = uid.indexOf(uidKey);
|
|
if (idx < 0)
|
|
return null;
|
|
idx = uid.indexOf("'", idx + uidKey.length);
|
|
if (idx < 0)
|
|
return null;
|
|
var startIdx = idx + 1;
|
|
var endIdx = uid.indexOf("'", idx + 1);
|
|
if (endIdx < 0)
|
|
return null;
|
|
return uid.substring(startIdx, endIdx);
|
|
}
|
|
|
|
}
|
|
|
|
/**
|
|
* SupportAPIClient. 데몬에 추가된 기능을 따로 지원하기 위한 Http API 메소드 모음.
|
|
*/
|
|
window.ClipReportSupportAPIClient = function (apiPageUrl, uidValue) {
|
|
var _this = this;
|
|
var _apiPageUrl = apiPageUrl;
|
|
var _uidValue = uidValue;
|
|
var _clientServerConnectionFailErrorMessage = {
|
|
'event': 'client-server-connection-error',
|
|
'isError': true,
|
|
'message': 'Client server connection fail!!'
|
|
};
|
|
|
|
/**
|
|
* 리포트 생성 상태를 확인한다. (ClipID=R03 호출)
|
|
*
|
|
* @param
|
|
*/
|
|
this.statusReport = function (eventFunc, retryCount) {
|
|
if (retryCount == null || retryCount == undefined)
|
|
retryCount = 5;
|
|
|
|
$.ajax({
|
|
type: "POST",
|
|
url: _apiPageUrl,
|
|
data: {
|
|
ClipID: 'R03',
|
|
uid: _uidValue, clipUID: _uidValue,
|
|
aync: true,
|
|
},
|
|
success: function (data) {
|
|
var success = true;
|
|
var resultMessage = null;
|
|
try {
|
|
data = (new Function('return ' + data))();
|
|
if (data.status === true) {
|
|
resultMessage = new ClipReportExportEvent(true,
|
|
_uidValue, '', '', 'report');
|
|
resultMessage.total = data.count;
|
|
resultMessage.isEndReport = data.endReport;
|
|
resultMessage.isSuccess = true;
|
|
} else {
|
|
resultMessage = new ClipReportExportEvent(true,
|
|
_uidValue, '', data.message,
|
|
data.supportEvent);
|
|
resultMessage.isError = true;
|
|
success = false;
|
|
}
|
|
} catch (e) {
|
|
success = false;
|
|
}
|
|
// 만약 성공했거나 또는 재시도 횟수가 꽉 찼는데, resultMessage는 존재하는 경우.
|
|
if (success || (retryCount >= 0 && resultMessage != null && resultMessage.isError))
|
|
eventFunc(resultMessage);
|
|
else if (--retryCount >= 0) {
|
|
setTimeout(
|
|
function () {
|
|
_this.statusReport(eventFunc, retryCount);
|
|
}, 500);
|
|
} else {
|
|
eventFunc(_clientServerConnectionFailErrorMessage);
|
|
}
|
|
},
|
|
error: function () {
|
|
if (--retryCount >= 0) {
|
|
setTimeout(function () {
|
|
_this.statusReport(eventFunc, retryCount);
|
|
}, 500);
|
|
} else
|
|
eventFunc(_clientServerConnectionFailErrorMessage);
|
|
}
|
|
});
|
|
}
|
|
|
|
/**
|
|
* 세션과 관련 리포트 데이터를 모두 제거한다. 만약 리포트가 생성중이라면 그 동작을 취소한다.
|
|
*
|
|
* @param apiPageUrl
|
|
* Clip.jsp 의 절대 주소
|
|
* @param uidValue
|
|
* 리포트의 uid 값
|
|
*/
|
|
this.deleteReport = function () {
|
|
$.ajax({
|
|
url: _apiPageUrl + '?ClipID=R04&uid=' + _uidValue + '&clipUID=' + _uidValue,
|
|
timeout: 3000,
|
|
async: false
|
|
});
|
|
}
|
|
|
|
this.updateExportStatus = function (exportTokenValue, eventFunc, retryCount) {
|
|
if (retryCount == null || retryCount == undefined)
|
|
retryCount = 5;
|
|
|
|
$.ajax({
|
|
type: "POST",
|
|
url: _apiPageUrl,
|
|
data: {
|
|
ClipID: 'R160',
|
|
uid: _uidValue, clipUID: _uidValue,
|
|
aync: true,
|
|
exportToken: exportTokenValue
|
|
},
|
|
success: function (data) {
|
|
try {
|
|
data = (new Function('return ' + data))();
|
|
if (data.success === true) {
|
|
var resultMessage = new ClipReportExportEvent(
|
|
data.success, _uidValue, data.exportToken, '',
|
|
'export');
|
|
resultMessage.isComplete = data.complete;
|
|
resultMessage.isEndReport = true;
|
|
resultMessage.current = data.current;
|
|
resultMessage.total = data.total;
|
|
} else {
|
|
resultMessage = new ClipReportExportEvent(false,
|
|
_uidValue, null, '', '');
|
|
resultMessage.isComplete = false;
|
|
resultMessage.current = -1;
|
|
resultMessage.total = -1;
|
|
resultMessage.exportToken = '';
|
|
resultMessage.event = data.supportEvent;
|
|
}
|
|
eventFunc(resultMessage);
|
|
} catch (e) {
|
|
if (--retryCount >= 0) {
|
|
setTimeout(function () {
|
|
_this.updateExportStatus(exportTokenValue,
|
|
eventFunc, retryCount);
|
|
}, 500);
|
|
} else
|
|
eventFunc(_clientServerConnectionFailErrorMessage);
|
|
}
|
|
},
|
|
error: function (e) {
|
|
if (--retryCount >= 0) {
|
|
setTimeout(function () {
|
|
_this.updateExportStatus(exportTokenValue, eventFunc,
|
|
retryCount);
|
|
}, 500);
|
|
} else
|
|
eventFunc(_clientServerConnectionFailErrorMessage);
|
|
}
|
|
});
|
|
}
|
|
|
|
function _downloadTXTData() {
|
|
var downloadLink = _apiURL + "?ClipID=R161&uid=" + _uid
|
|
+ "&exportToken=" + exportToken + '&exportType=12';
|
|
_download(downloadLink);
|
|
resultMessage = new ClipReportExportEvent(true, _uidValue,
|
|
data.exportToken, '', '');
|
|
resultMessage.isComplete = true;
|
|
resultMessage.isSuccess = true;
|
|
resultMessage.message = "success";
|
|
return;
|
|
}
|
|
|
|
this.startExport = function (exportOption, eventFunc) {
|
|
|
|
var TXT_DATA_EXPORT_TYPE = '12';
|
|
if (exportOption != null
|
|
&& exportOption.exportType == TXT_DATA_EXPORT_TYPE) {
|
|
_downloadTXTData();
|
|
return;
|
|
}
|
|
|
|
exportOption.async = true;
|
|
$.ajax({
|
|
type: "POST",
|
|
url: _apiPageUrl,
|
|
data: exportOption,
|
|
success: function (data) {
|
|
data = (new Function('return ' + data))();
|
|
var resultMessage = null;
|
|
if (data.success == true) {
|
|
resultMessage = new ClipReportExportEvent(true, _uidValue,
|
|
data.exportToken, '', '');
|
|
resultMessage.isComplete = data.complete;
|
|
resultMessage.current = data.current;
|
|
resultMessage.total = data.total;
|
|
} else {
|
|
resultMessage = new ClipReportExportEvent(false, _uidValue,
|
|
null, '', '');
|
|
resultMessage.isComplete = false;
|
|
resultMessage.current = -1;
|
|
resultMessage.total = -1;
|
|
resultMessage.exportToken = '';
|
|
resultMessage.event = data.supportEvent;
|
|
}
|
|
eventFunc(resultMessage);
|
|
},
|
|
error: function (e) {
|
|
eventFunc(_clientServerConnectionFailErrorMessage);
|
|
}
|
|
});
|
|
}
|
|
}
|
|
|
|
window.ClipReportExportEvent = function (isSuccess, uid, exportToken, message,
|
|
event) {
|
|
|
|
this.isSuccess = isSuccess;
|
|
|
|
/**
|
|
* <String> 이벤트에 대한 텍스트 메세지
|
|
*/
|
|
this.message = message;
|
|
/**
|
|
* 리포트가 아직 생성중이거나 생성되지 않았다면 false. 생성 완료된 리포트라면 true 반환.
|
|
*/
|
|
this.isEndReport = false;
|
|
/**
|
|
* <Boolean> export 가 완료되어 download 될 준비가 끝나면 true.
|
|
*/
|
|
this.isComplete = false;
|
|
|
|
this.isError = false;
|
|
/**
|
|
* <String> 이벤트가 발생한 시점의 export 기능의 상태 값이 들어간다. - REPORT_CREATING : 현재 리포트
|
|
* 생성중 입니다.. - EXPORT_PAGE : export 중, 문서 페이지를 생성중 입니다. - EXPORT_MERGE :
|
|
* export 중, 생성된 페이지들을 문서로 만들고 있습니다. - EXPORT_DOWNLOAD : export 다운로드 시작. -
|
|
* ERROR_LICENSE : 라이센스 오류 - ERROR_FILE_WRITE : 파일 기록 실패 - ERROR_[value] :
|
|
* 별도로 정의된 에러.
|
|
*/
|
|
this.event = event;
|
|
/**
|
|
* <Number> export 될 모든 페이지 수.
|
|
*/
|
|
this.total = 0;
|
|
/**
|
|
* <Number> 이벤트가 발생한 시점에서 export 된 페이지의 수.
|
|
*/
|
|
this.current = 0;
|
|
/**
|
|
* <String> 리포트에 대한 uid 값.
|
|
*/
|
|
this.uid = uid;
|
|
/**
|
|
* <String> 진행중인 export 의 token 값.
|
|
*/
|
|
this.exportToken = exportToken;
|
|
|
|
if (status.indexOf('ERROR') >= 0)
|
|
isError = true;
|
|
else if (status.indexOf('EXPORT') >= 0)
|
|
isEndReport = true;
|
|
|
|
if (status === 'EXPORT_DOWNLOAD') {
|
|
isComplate = true;
|
|
isEndReport = true;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Export 지원.
|
|
*/
|
|
window.startClipReportExport = function (apiURL, oof, exportOption) {
|
|
return new function () {
|
|
var _status = 0;
|
|
var _this = this;
|
|
var _oof = oof;
|
|
var _exportOption = exportOption;
|
|
var _apiURL = apiURL;
|
|
var _apiClient = null; //
|
|
var _onExportStatusCallbackFunc = null;
|
|
var _onCompleteCallbackFunc = null;
|
|
var _onErrorCallbackFunc = null;
|
|
var _xhrPollingInterval = 700;
|
|
|
|
_bindToBrowserCloseEvent();
|
|
setTimeout(_start, 1);
|
|
|
|
function _start() {
|
|
_createReport();
|
|
}
|
|
|
|
function _createReport() {
|
|
$.ajax({
|
|
type: "POST",
|
|
url: _apiURL,
|
|
data: {
|
|
ClipID: 'R01',
|
|
oof: _oof,
|
|
isBigData: false,
|
|
isMemoryDump: false,
|
|
aync: true,
|
|
},
|
|
success: function (data) {
|
|
data = (new Function('return ' + data))();
|
|
if (data.status == true) {
|
|
_uid = data.uid;
|
|
_apiClient = new ClipReportSupportAPIClient(_apiURL,
|
|
_uid);
|
|
_updateStatusReport(1);
|
|
} else {
|
|
if (_onErrorCallbackFunc != null)
|
|
_onErrorCallbackFunc({
|
|
'event': data.supportEvent,
|
|
'message': data.message
|
|
});
|
|
}
|
|
},
|
|
error: function () {
|
|
_onErrorCallbackFunc({
|
|
'event': 'client-server-connection-error',
|
|
'isError': true,
|
|
'message': 'Client server connection fail!!'
|
|
});
|
|
}
|
|
});
|
|
|
|
}
|
|
|
|
function _updateStatusReport(timeout) {
|
|
setTimeout(function () {
|
|
_apiClient
|
|
.statusReport(function (result) {
|
|
if (result.isError === true
|
|
&& _onErrorCallbackFunc != null) {
|
|
_onErrorCallbackFunc(result);
|
|
return;
|
|
}
|
|
if (_onExportStatusCallbackFunc != null)
|
|
_onExportStatusCallbackFunc(result);
|
|
if (result.isEndReport === true) {
|
|
_startExport();
|
|
} else {
|
|
_updateStatusReport(_xhrPollingInterval);
|
|
}
|
|
});
|
|
}, timeout);
|
|
}
|
|
|
|
function _startExport() {
|
|
var parameter = {
|
|
optionValue: _exportOption,
|
|
uid: _uid,
|
|
ClipID: 'R09'
|
|
};
|
|
_apiClient.startExport(parameter, function (result) {
|
|
if (result.isError === true) {
|
|
_showExportErrorMessage(result);
|
|
// _this.UI.hideProgress();
|
|
_report.removeSAVEProgress();
|
|
} else {
|
|
_startUpdateOnExportStatus(1, result.exportToken)
|
|
}
|
|
});
|
|
}
|
|
|
|
function _startUpdateOnExportStatus(timeout, exportToken) {
|
|
|
|
setTimeout(function () {
|
|
_apiClient.updateExportStatus(exportToken, function (result) {
|
|
|
|
if (_onExportStatusCallbackFunc != null) {
|
|
_onExportStatusCallbackFunc(result);
|
|
}
|
|
result.isEndReport = true;
|
|
if (result.isError === true) {
|
|
_showExportErrorMessage(result);
|
|
} else if (result.isComplete === false) {
|
|
_startUpdateOnExportStatus(_xhrPollingInterval,
|
|
result.exportToken);
|
|
} else if (result.isComplete === true) {
|
|
_downloadExport(result.exportToken);
|
|
if (_onCompleteCallbackFunc != null) {
|
|
_onCompleteCallbackFunc(result)
|
|
}
|
|
}
|
|
});
|
|
}, timeout);
|
|
|
|
}
|
|
|
|
function _downloadExport(exportToken) {
|
|
// 다운로드 페이지로 이동한다.
|
|
var downloadLink = _apiURL + "?ClipID=R161&uid=" + _uid
|
|
+ "&exportToken=" + exportToken;
|
|
return _download(downloadLink);
|
|
}
|
|
|
|
function _download(link) {
|
|
// 다운로드 페이지로 이동한다.
|
|
$(window).unbind('beforeunload');
|
|
_isStartDownload = true;
|
|
window.location.replace(link);
|
|
return downloadLink;
|
|
}
|
|
|
|
/**
|
|
* export 과정을 취소합니다.
|
|
*/
|
|
this.cancel = function () {
|
|
_parent._apiClient.deleteReport();
|
|
};
|
|
|
|
/**
|
|
* @param callbackFunc
|
|
* @return 자신(ClipReportExportSupport) 인스턴스
|
|
*/
|
|
this.setOnErrorCallback = function (callbackFunc) {
|
|
_onErrorCallbackFunc = callbackFunc;
|
|
return _this;
|
|
};
|
|
|
|
/**
|
|
* @param callbackFunc
|
|
* @return 자신의 인스턴스
|
|
*/
|
|
this.setOnStatusCallback = function (callbackFunc) {
|
|
_onExportStatusCallbackFunc = callbackFunc;
|
|
return _this;
|
|
};
|
|
|
|
/**
|
|
* @param callbackFunc
|
|
* @return 자신의 인스턴스
|
|
*/
|
|
this.setOnCompleteCallback = function (callbackFunc) {
|
|
_onCompleteCallbackFunc = callbackFunc;
|
|
return _this;
|
|
};
|
|
|
|
/**
|
|
* 창을 닫았을 때 세션을 바로 제거해주는 동작을 진행해주는 이벤트를 등록한다.
|
|
*/
|
|
function _bindToBrowserCloseEvent() {
|
|
if (isIE() == true) {
|
|
_bindUnload();
|
|
} else {
|
|
_bindToBeforeunload();
|
|
}
|
|
}
|
|
|
|
// IE 를 제외한 브라우저 전용. 리포트 삭제 명령을 전송한다.
|
|
// IE 10 이하에서 Alert 메세지를 띄우고 그 창을 닫을 때, beforeunload 가 호출되는 버그가 있기 때문에,
|
|
// IE 에서는 사용하지 않는다.
|
|
function _bindToBeforeunload() {
|
|
$(window).bind('beforeunload', function (event) {
|
|
_apiClient.deleteReport();
|
|
});
|
|
}
|
|
|
|
// IE 에서만 동작.
|
|
// 크롬 및 오페라는 unload 가 동작하지 않는 이슈가 있다.
|
|
function _bindUnload() {
|
|
$(window).bind('unload', function (event) {
|
|
_apiClient.deleteReport();
|
|
});
|
|
}
|
|
|
|
/**
|
|
* IE 인지 확인한다. 엣지는 IE가 아니다.
|
|
*
|
|
* @return IE 일 경우 true
|
|
*/
|
|
function isIE() {
|
|
var agent = navigator.userAgent.toLowerCase();
|
|
return agent.indexOf('msie') != -1;
|
|
}
|
|
};
|
|
}; |