YNICTE/ClipReport4/ClipReport4/js/clipreport-support.js

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;
}
};
};