/*******************************************************************************
* IBM Confidential
*
* OCO Source Materials
*
* A and PM: PD
*
* (c) Copyright IBM Corp. 2014, 2015
*
* The source code for this program is not published or otherwise divested of
* its trade secrets, irrespective of what has been deposited with the U.S.
* Copyright Office.
******************************************************************************/
define([
"dojo/_base/declare",
"dijit/_WidgetBase",
"dijit/_TemplatedMixin",
"dijit/_WidgetsInTemplateMixin",
"dojo/text!pd/ui/templates/_base.html",
"dojo/dom",
"pd/widgets/ColumnGrid",
"pd/widgets/PreviewGrid",
"pd/data/PdSpecStore",
"dojo/data/ObjectStore",
"dojo/string",
"pd/widgets/ComboBox",
"pd/data/PdDataStore",
"pd/widgets/SaveDialog",
"pd/widgets/MessageDialog",
"dojo/dom-construct",
"bux/application/controllers/ForestModelsSubController",
"bux/data/RestStore",
"bux/data/AtomHelper",
"pd/widgets/Uploader",
"pd/widgets/ProgressBar",
"dojo/domReady!"
], function(declare, _WidgetBase, _TemplatedMixin, _WidgetsInTemplateMixin,
template, dom, ColumnGrid, PreviewGrid, PdSpecStore, ObjectStore,
string, ComboBox, PdDataStore, SaveDialog, MessageDialog, domConstruct, ForestModelsSubController) {
var self = this;
new ForestModelsSubController();
return declare("pd/ui/_base", [_WidgetBase, _TemplatedMixin, _WidgetsInTemplateMixin], {
//default to "normal", can be "edit", "refresh"
mode: pd.statics.MODE_NORMAL,
//left side meta data grid
columnGrid: null,
//data preview grid
previewGrid: null,
//column name comboBox
comboBox: null,
//data set name
dataSetName: "",
//save as package name
saveAsPackageName: "",
templateString : template,
getDataSetName: function() {
//to be overridden
},
getDataSetStoreID: function() {
//to be overridden
},
renderMainContent: function(pdSpecValue) {
//to be overridden
},
_getFileFullName: function() {
return pd_uploader.get("value")[0].name;
},
_getFileName: function() {
var fileName = this._getFileFullName();
var lastPeriod = fileName.lastIndexOf(".");
if (lastPeriod > 0) {
fileName = fileName.substring(0, lastPeriod);
}
return fileName;
},
_getFileType: function() {
// Summary:
// According to the current External Data implementation, the supported file types are CSV,
// Excel2003 and XML, and the file type is determined by the file extension. For xls
// and xlsx, it's always Excel2003
var type = "";
var extension = pd_uploader.getFileType(this._getFileFullName())
switch (extension) {
case "XLS":
case "XLSX":
type = "Excel2003";
break;
case "CSV":
type = "CSV";
break;
default:
// for now, rely on server side to throw an exception.
}
return type;
},
setStatus: function(status) {
switch(status){
case pd.statics.STATUS_INIT:
self.isProcessing = false;
pd_progressBar.init(pd_uploader.uploadType);
pd_uploader.uploadUrl = this.getTargetUrl();
break;
case pd.statics.STATUS_UPLOAD:
self.isProcessing = false;
pd_progressBar.onStageZero();
pd_uploader.set("disabled", true);
break;
case pd.statics.STATUS_PROCESS:
self.isProcessing = true;
pd_progressBar.onStageTwo(PDMSG.IPT.IDS_IPT_PROGRESS_STAGE_LOAD);
pd_uploader.set("disabled", true);
break;
case pd.statics.STATUS_FINISH:
self.isProcessing = false;
pd_progressBar.onStageThree();
pd_uploader.set("disabled", false);
break;
default:
}
},
_uploaderOnchangeHandler: function() {
this.dataSetName = this.getDataSetName();
this.pd_uploaderForm.inSpec.value = '' + this._getFileName() + ''
+ ''
+ this._getFileFullName()
+ ''
+ ''
+ '';
this.setStatus(pd.statics.STATUS_UPLOAD);
},
_uploaderOnerrorHandler: function(err) {
pd_uploader.reset();
this.setStatus(pd.statics.STATUS_FINISH);
var pdError = {};
if (typeof err == "string"){
pdError.message = err;
} else {
pdError = err;
}
//try to analysis unexpected response and improve the error messages.
var response = pdError.response;
if (response) {
if (dojo.isSafari) {
//safari response is plain text.
pdError.detail = response;
} else if (dojo.isIE){
var doc = response.documentElement;
if (doc && doc.document) {
if (!pdError.message){
pdError.message = doc.document.title;
}
pdError.detail = doc.innerHTML;
}
} else {
if (!pdError.message){
pdError.message = response.title;
}
if (response.parseError){
pdError.detail = null;
} else {
pdError.detail = response.body?response.body.innerHTML : response.xml;
}
}
}
if (pdError.name == pd.CAM_PASSPORT_ERROR){
pd.showLogonDialog();
return;
} else {
//RTC 12700: The error message displayed when the importing phase of large files times out could be improved
if (pdError.name == "504" || pdError.message.indexOf("504") > -1) {
pd.messageBox(pd.statics.MB_WARNING, pdError.message,
PDMSG.ERR.IDS_ERR_BACKGROUND_RUNNING_MESSAGE, pdError.detail);
return;
}
//RTC 15489, handle IE permission denied in case of IIS and PassThrough case.
if (pdError.message.indexOf("Permission denied") > -1) {
pd.messageBox(pd.statics.MB_ERROR, pdError.message,
PDMSG.ERR.IDS_ERR_EXCEED_REQUEST_CONTENT_LENGTH, null);
return;
}
//in IIS case
if (pdError.name == "404" || pdError.message.indexOf("404") > -1) {
pd.messageBox(pd.statics.MB_ERROR, pdError.message,
PDMSG.ERR.IDS_ERR_EXCEED_REQUEST_CONTENT_LENGTH, pdError.detail);
return;
}
//in IHS, Apache cases
if (pdError.name == "413" || pdError.message.indexOf("413") > -1) {
pd.messageBox(pd.statics.MB_ERROR, pdError.message,
PDMSG.ERR.IDS_ERR_EXCEED_REQUEST_CONTENT_LENGTH, null);
return;
}
//Display generic error if none of above
pd.messageBox(pd.statics.MB_ERROR, PDMSG.ERR.IDS_ERR_FILE_UPLOAD, pdError.message, pdError.detail);
return;
}
},
_uploaderOnprogressHandler: function(evt) {
if (evt.type == "progress"){
if (this.mode == pd.statics.MODE_EDIT){
self.isProcessing = true;
pd_progressBar.onStageTwo(PDMSG.IPT.IDS_IPT_PROGRESS_STAGE_LOAD);
} else {
var percent = Math.round(evt.decimal * 100);
var currentLoad = evt.bytesLoaded - pd_progressBar.previousBytesLoaded;
if (currentLoad > pd_progressBar.maxBytesPerLoad){
pd_progressBar.maxBytesPerLoad = currentLoad;
}
if ((evt.bytesTotal - evt.bytesLoaded) < pd_progressBar.maxBytesPerLoad) {
self.isProcessing = true;
pd_progressBar.onStageOne(100);
pd_progressBar.onStageTwo();
} else {
pd_progressBar.onStageOne(percent);
}
pd_progressBar.previousBytesLoaded = evt.bytesLoaded;
}
} else {
self.isProcessing = false;
}
},
_uploaderOncompleteHandler: function(response, isGovernorCheck) {
try {
if (!isGovernorCheck) {
this.setStatus(pd.statics.STATUS_FINISH);
}
pd.parseResponse(response);
var pdSpecDoc = null;
if (dojo.isSafari) {
var responseNode = domConstruct.toDom(response);
if (responseNode.querySelector) {
pdSpecDoc = responseNode.querySelector("#pdSpec");
}
} else {
pdSpecDoc = response.getElementById("pdSpec");
}
if (pdSpecDoc) {
if (!isGovernorCheck) {
var pdSpecValue = pdSpecDoc.textContent || pdSpecDoc.innerText;
this.renderMainContent(pdSpecValue);
}
} else {
//something wrong, let error handler take care of it
throw({
response: response
});
}
return true;
} catch (err) {
this._uploaderOnerrorHandler(err);
return false;
}
},
_renderMainContent: function(pdSpecValue) {
this.destroy();
//create preview grid
var pdDataStore = new PdDataStore({xmlInput: pdSpecValue});
var dataStore = ObjectStore({objectStore: pdDataStore});
pd.placeDiv("pd_preview_grid_div", pd_previewContainer.domNode);
this.previewGrid = new PreviewGrid({
store: dataStore,
"aria-label":PDMSG.ACC.IDS_ACC_GROUP_LABEL_PREVIEW_PANE
},"pd_preview_grid_div");
this.previewGrid.startup();
//create column view grid
var pdSpecStore = new PdSpecStore({xmlInput: pdSpecValue});
var specStore = ObjectStore({objectStore: pdSpecStore});
pd.placeDiv("pd_column_grid_div", pd_columnGridContainer.domNode);
this.columnGrid = new ColumnGrid({
store: specStore,
previewGrid: this.previewGrid,
"aria-label":PDMSG.ACC.IDS_ACC_GROUP_LABEL_METADATA_TABLE
},"pd_column_grid_div");
this.columnGrid.startup();
//create comboBox
pd.placeDiv("pd_column_combobox_div", pd_columnComboboxContainer.domNode);
this.comboBox = new ComboBox({
store: pdSpecStore,
searchAttr: "name",
columnGrid: this.columnGrid,
"aria-label":PDMSG.ACC.IDS_ACC_GROUP_LABEL_COLUMN_NAME_SEARCH_BOX
},"pd_column_combobox_div");
this.comboBox.startup();
},
_publishBtnOnclickHandler: function(){
if (this.columnGrid.selection.getSelected().length == 0){
pd.messageBox(pd.statics.MB_ERROR, PDMSG.ERR.IDS_ERR_NO_COLUMN_INCLUDED);
return false;
}
if (!this.columnGrid.hasFactSelected()) {
var dlg = new MessageDialog.Confirm(PDMSG.IPT.IDS_IPT_APPLICATION_TITLE,
PDMSG.IPT.IDS_IPT_NO_FACT_CONFIRM_MESSAGE,
PDMSG.IPT.IDS_IPT_NO_FACT_CONFIRM_DETAILS,
dojo.hitch(this, this._showPackageExplorer));
dlg.startup();
dlg.show();
} else {
this._showPackageExplorer();
}
},
_closeBtnOnclickHandler: function() {
pd_uploader.set("disabled", true);
if (this.mode == pd.statics.MODE_NORMAL && self.isProcessing) {
pd_progressBar.onCancel();
this._removeEventListeners();
pd_onClose(self.isProcessing,g_pd_backURL);
} else {
this._removeEventListeners();
location.href = g_pd_backURL;
}
},
_showPackageExplorer: function() {
var oDlg = new SaveDialog({
title: PDMSG.IPT.IDS_IPT_FILE_DIALOG_TITLE,
filter: 'content-folder',
sMainActionButtonLabel: PDMSG.IPT.IDS_IPT_PUBLISH_BUTTON,
"class": "bux-fileDialog",
saveAsHandler: dojo.hitch(this, this._saveAsHandler),
sLocationLabel: BUXMSG.FDG.IDS_FDG_SAVE_AS_LOCATION,
pdDefaultName: this.dataSetName
});
oDlg.startup();
oDlg.show();
},
_saveAsHandler: function(saveAsName, oLink, _callBackFunction, oContainerItem){
this.folderSearchPath = oContainerItem.i.cm$searchPath;
D_ManagePersonalData.m_sTargetPath = this.folderSearchPath;
D_ManagePersonalData.m_sTargetName = this.saveAsPackageName = saveAsName;
D_ManagePersonalData.m_docInputXML = this.columnGrid.pdGetXml();
D_ManagePersonalData.pd_packageOverwriteConfirm = dojo.hitch(this, this.packageOverwriteConfirm);
D_ManagePersonalData.f_checkPackageNameOnOK();
},
packageOverwriteConfirm: function(){
var dlg = new MessageDialog.Confirm(PDMSG.IPT.IDS_IPT_APPLICATION_TITLE,
string.substitute(PDMSG.IPT.IDS_IPT_OVERWRITE_PACKAGE_CONFIRM_MESSAGE,
{0: this.saveAsPackageName}), null,
dojo.hitch(D_ManagePersonalData, D_ManagePersonalData.f_publishPackage));
dlg.startup();
dlg.show();
return dlg;
},
postCreate : function() {
this.pdsContentLabelNode.innerHTML = PDMSG.IPT.IDS_IPT_FILE_NAME_LABEL+" ";
this.pd_uploaderForm = dom.byId("pd_uploaderForm");
this.setStatus(pd.statics.STATUS_INIT);
this._eventListeners[this._eventListeners.length] = this.connect(pd_uploader, "onChange", this._uploaderOnchangeHandler);
this._eventListeners[this._eventListeners.length] = this.connect(pd_uploader, "onProgress", dojo.hitch(this, this._uploaderOnprogressHandler));
this._eventListeners[this._eventListeners.length] = this.connect(pd_uploader, "onComplete", this._uploaderOncompleteHandler);
this._eventListeners[this._eventListeners.length] = this.connect(pd_uploader, "onError", this._uploaderOnerrorHandler);
},
startup: function() {
this.inherited(arguments);
this._eventListeners[this._eventListeners.length] = this.connect(pd_publishBtn, "onClick", this._publishBtnOnclickHandler);
this._eventListeners[this._eventListeners.length] = this.connect(pd_cancelBtn, "onClick", dojo.hitch(this, this._closeBtnOnclickHandler));
this._eventListeners[this._eventListeners.length] = this.connect(pd_closeBtn, "onclick", dojo.hitch(this, this._closeBtnOnclickHandler));
pd.connect.subscribe("/pd/widgets/grid/cells/applyChange", dojo.hitch(this, function(){
this.columnGrid.edit.apply();
}));
pd.setSupplementId(pd_publishBtn.domNode, "IMPORT_DIALOG_PUBLISH_BUTTON");
pd.setSupplementId(pd_cancelBtn.domNode, "IMPORT_DIALOG_CANCEL_BUTTON");
},
destroy: function() {
if (this.columnGrid){
this.columnGrid.destroy();
}
if (this.comboBox){
this.comboBox.destroy();
}
if (this.previewGrid){
this.previewGrid.destroy();
}
},
_removeEventListeners: function() {
for (var i=0; i < this._eventListeners.length; i++) {
dojo.disconnect(this._eventListeners[i]);
}
},
isProcessing: false,
_eventListeners: []
});
}
);