Diffstat (limited to 'frontend/beta/js/Clipperz/PM/Components/Import/GenericImportComponent.js') (more/less context) (show whitespace changes)
-rw-r--r-- | frontend/beta/js/Clipperz/PM/Components/Import/GenericImportComponent.js | 523 |
1 files changed, 523 insertions, 0 deletions
diff --git a/frontend/beta/js/Clipperz/PM/Components/Import/GenericImportComponent.js b/frontend/beta/js/Clipperz/PM/Components/Import/GenericImportComponent.js new file mode 100644 index 0000000..4f6b1e4 --- a/dev/null +++ b/frontend/beta/js/Clipperz/PM/Components/Import/GenericImportComponent.js @@ -0,0 +1,523 @@ +/* + +Copyright 2008-2011 Clipperz Srl + +This file is part of Clipperz's Javascript Crypto Library. +Javascript Crypto Library provides web developers with an extensive +and efficient set of cryptographic functions. The library aims to +obtain maximum execution speed while preserving modularity and +reusability. +For further information about its features and functionalities please +refer to http://www.clipperz.com + +* Javascript Crypto Library is free software: you can redistribute + it and/or modify it under the terms of the GNU Affero General Public + License as published by the Free Software Foundation, either version + 3 of the License, or (at your option) any later version. + +* Javascript Crypto Library is distributed in the hope that it will + be useful, but WITHOUT ANY WARRANTY; without even the implied + warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Javascript Crypto Library. If not, see + <http://www.gnu.org/licenses/>. + +*/ + +if (typeof(Clipperz) == 'undefined') { Clipperz = {}; } +if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; } +if (typeof(Clipperz.PM.Components) == 'undefined') { Clipperz.PM.Components = {}; } +if (typeof(Clipperz.PM.Components.Import) == 'undefined') { Clipperz.PM.Components.Import = {}; } + +//############################################################################# + +Clipperz.PM.Components.Import.GenericImportComponent = function(anElement, args) { + args = args || {}; + + this._steps = this._steps || ['EDIT', 'PREVIEW', 'IMPORT']; + + Clipperz.PM.Components.Import.GenericImportComponent.superclass.constructor.call(this, anElement, args); + + this._user = args['user']; + + this._currentStep = 0; + this._currentStatus = 'IDLE'; // 'PROCESSING' + + this._parsedValues = null; + this._processedValues = null; + + this._backButton = null; + this._nextButton = null; + + Clipperz.NotificationCenter.register(null, 'importProcessorProgressUpdate', this, 'updateProgressDialogStatus'); + + return this; +} + +//============================================================================= + +YAHOO.extendX(Clipperz.PM.Components.Import.GenericImportComponent, Clipperz.PM.Components.BaseComponent, { + + 'toString': function() { + return "Clipperz.PM.Components.Import.GenericImportComponent component"; + }, + + //------------------------------------------------------------------------- + + 'user': function() { + return this._user; + }, + + //------------------------------------------------------------------------- + + 'textAreaConfig': function() { + return {tag:'textarea', name:this.getId('importTextArea'), cls:'importTextArea', id:this.getId('importTextArea'), cols:60, rows:15, html:""}; + }, + + 'textAreaContent': function() { + return this.getDom('importTextArea').value + }, + + //------------------------------------------------------------------------- + + 'steps': function() { + return this._steps; + }, + + 'currentStep': function() { + return this._currentStep; + }, + + 'setCurrentStep': function(aValue) { + this._currentStep = aValue; + this.updateSteps(); + }, + + //------------------------------------------------------------------------- + + 'currentStatus': function() { + return this._currentStatus; + }, + + 'startProcessing': function() { + this._currentStatus = 'PROCESSING'; + this.updateSteps(); + }, + + 'processingDone': function() { + this._currentStatus = 'IDLE'; + this.setCurrentStep(this.currentStep() + 1); + }, + + 'processingAborted': function() { + this._currentStatus = 'IDLE'; + this.updateSteps(); + }, + + //------------------------------------------------------------------------- + + 'stepsConfig': function() { + var result; + var i,c; + + result = []; + c = this.steps().length; + for (i=0; i<c; i++) { + var cls; + + if (this.currentStep() == i) { + if (this.currentStatus() == 'IDLE') { + cls = 'current'; + } else { + cls = 'currentProcessing'; + } + } else { + cls = ""; + } + + result.push({tag:'td', cls:cls, children:[ + {tag:'div', children:[{tag:'span', htmlString:Clipperz.PM.Strings['ImportWizard'][this.steps()[i]]}]} + ]}) + if (i < (c-1)) { + if ((this.currentStep() == i) && (this.currentStatus() == 'PROCESSING')) { + cls = 'stepSeparatorProcessing'; + } else { + cls = 'stepSeparator'; + } + + result.push({tag:'td', cls:cls, children:[ + {tag:'div', children:[{tag:'span', html:">"}]} + ]}); + } + } + + result = [{tag:'div', cls:'importWizardStepsBox', children:[ + {tag:'div', cls:'importWizardStepsInnerBox', children:[ + {tag:'table', cls:'importWizardSteps', children:[ + {tag:'tbody', children:[ + {tag:'tr', children:result} + ]} + ]} + ]}, + {tag:'div', cls:'importWizardStepsBoxFooter'} + ]}]; + + return result; + }, + + 'updateSteps': function() { + this.getElement('importSteps').update(""); + Clipperz.YUI.DomHelper.append(this.getDom('importSteps'), {tag:'div', children:this.stepsConfig()}); + }, + + //------------------------------------------------------------------------- + + 'backAction': function() { +//MochiKit.Logging.logDebug(">>> backAction"); + if (this.currentStep() == 0) { + Clipperz.NotificationCenter.notify(this, 'importCancelled'); + } else { + this.getElement('step_' + this.currentStep()).hide(); + this.setCurrentStep(this.currentStep() - 1); + this.getElement('step_' + this.currentStep()).show(); + + this.nextButton().enable(); + } +//MochiKit.Logging.logDebug("<<< backAction"); + }, + + //------------------------------------------------------------------------- + + 'backButton': function() { + return this._backButton; + }, + + 'setBackButton': function(aValue) { + this._backButton = aValue; + }, + + 'nextButton': function() { + return this._nextButton; + }, + + 'setNextButton': function(aValue) { + this._nextButton = aValue; + }, + + //------------------------------------------------------------------------- + + 'render': function() { +//MochiKit.Logging.logDebug(">>> Import.GenericImportComponent.render"); + this.domHelper().append(this.element(), {tag:'div', children:[ + {tag:'h2', html:this.toString()} + ]}); +//MochiKit.Logging.logDebug("<<< Import.GenericImportComponent.render"); + }, + + //------------------------------------------------------------------------- + + 'previewValues': function() { + Clipperz.PM.Components.MessageBox.showProgressPanel( + MochiKit.Base.method(this, 'deferredPreviewValues'), + MochiKit.Base.method(this, 'handlePreviewError'), + this.getDom('nextActionButton') + ); + }, + + 'deferredPreviewValues': function() { + throw Clipperz.Base.exception.AbstractMethod; + }, + + 'handlePreviewError': function(anError) { +console.log("anError", anError); + MochiKit.Logging.logError("An error occurred while previewing the data: " + anError); + alert("An error occurred while previewing the data"); + Clipperz.PM.Components.MessageBox().hide(); + }, + + //------------------------------------------------------------------------- + + 'previewRecordValues': function(someProcessedRecords) { +//MochiKit.Logging.logDebug(">>> previewRecordValues"); + this.getElement('previewDiv').update(""); +//MochiKit.Logging.logDebug("--- previewRecordValues - 1"); + this.domHelper().append(this.getElement('previewDiv'), {tag:'div', cls:'importPreviewDiv', children:[{tag:'table', id:'importPreview', cellspacing:'0', children:[ + {tag:'tbody', children: + MochiKit.Base.map(MochiKit.Base.bind(function(aRecord) { + var result; +//MochiKit.Logging.logDebug("--- previewRecordValues - 1.1"); +//console.log("fields", aRecord.currentVersion().fields()); + result = {tag:'tr', children:[{tag:'td', children:[ + {tag:'table', cls:'importPreview_record', children:[ + {tag:'tbody', children:[ + {tag:'tr', children:[ + {tag:'td', rowspan:'2', valign:'top', children:[ + {tag:'input', type:'checkbox', id:this.getId(aRecord.reference()), value:"aRecord.reference()", checked:true} + ]}, + {tag:'td', colspan:'2', children:[ + {tag:'span', cls:'importPreview_title', html:aRecord.label()} + ]} + ]}, + {tag:'tr', children:[ + {tag:'td', valign:'top', children:[ + {tag:'span', cls:'importPreview_notes', html:(MochiKit.Base.isNotEmpty(aRecord.notes()) ? aRecord.notes().replace(/\n/g, '<br>') : ' ')} + ]}, + {tag:'td', valign:'top', cls:'importPreview_fieds', children:[ + {tag:'table', cls:'importPreview_fields', children:[ + {tag:'tbody', children:MochiKit.Base.map(function(aField) { + var result; +//MochiKit.Logging.logDebug("--- previewRecordValues - 1.1.1"); + result = {tag:'tr', children:[ + {tag:'td', valign:'top', children:[ + {tag:'span', cls:'importPreview_fields_label', html:aField.label()} + ]}, + {tag:'td', valign:'top', children:[ + {tag:'span', cls:'importPreview_fields_value', html:aField.value()} + ]} + ]}; +//MochiKit.Logging.logDebug("--- previewRecordValues - 1.1.2"); + return result; + }, MochiKit.Base.values(aRecord.currentVersion().fields()))} + ]} + ]} + ]} + ]} + ]} + ]}]}; +//MochiKit.Logging.logDebug("--- previewRecordValues - 1.2"); + return result; + }, this), someProcessedRecords) + } + ]}]}); +//MochiKit.Logging.logDebug("--- previewRecordValues - 2"); + + MochiKit.Base.map(MochiKit.Base.bind(function(aRecord) { + this.getElement(aRecord.reference()).dom.value = aRecord.reference(); + }, this), someProcessedRecords); + + Clipperz.Style.applyZebraStylesToTable('importPreview'); +//MochiKit.Logging.logDebug("<<< previewRecordValues"); + }, + + //------------------------------------------------------------------------- + + 'updateProgressDialogStatus': function(anEvent) { + Clipperz.PM.Components.MessageBox().update({step:anEvent.parameters().progress}); + }, + + //------------------------------------------------------------------------- + + 'parsedValues': function() { + return this._parsedValues; + }, + + 'setParsedValues': function(aValue) { + this._parsedValues = aValue; + + return this._parsedValues; + }, + + //------------------------------------------------------------------------- + + 'processedValues': function() { + return this._processedValues; + }, + + 'setProcessedValues': function(aValue) { + this._processedValues = aValue; + return this._processedValues; + }, + + //------------------------------------------------------------------------- + + 'importValues': function() { + var deferredResult; + + deferredResult = new MochiKit.Async.Deferred(); + + deferredResult.addCallback(MochiKit.Base.bind(function() { + this.nextButton().disable(); + this.startProcessing(); + },this)); + deferredResult.addCallback(MochiKit.Base.method(this, 'importProcessedValues')); + deferredResult.addCallback(MochiKit.Base.method(this, 'processingDone')); + deferredResult.addErrback (MochiKit.Base.method(this, 'processingAborted')); + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'importProcessedValues': function() { + var deferredResult; + var processedValues; + var selectedRecords; + var i,c; + +//MochiKit.Logging.logDebug(">>> GenericImportComponent.importProcessedValues"); + processedValues = this.processedValues(); + selectedRecords = []; + + c = processedValues.length; + for (i=0; i<c; i++) { + var currentRecord; + + currentRecord = processedValues[i]; + if (this.getDom(currentRecord.reference()).checked == true) { + selectedRecords.push(currentRecord); + } + } + + deferredResult = new MochiKit.Async.Deferred(); +//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("GenericImportComponent - 1: " + res); return res;}); + deferredResult.addCallback(function(someRecords) { + var innerDeferredResult; + var text; + + text = Clipperz.PM.Strings['importData_importConfirmation_text']; + text = text.replace(/__numberOfRecords__/, someRecords.length); + + innerDeferredResult = new MochiKit.Async.Deferred(); +//innerDeferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("GenericImportComponent - 1.1: " + res); return res;}); + innerDeferredResult.addCallback(MochiKit.Async.succeed, someRecords); +//innerDeferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("GenericImportComponent - 1.2: " + res); return res;}); + + Clipperz.PM.Components.MessageBox().deferredShow({ + title:Clipperz.PM.Strings['importData_importConfirmation_title'], + text:text, + width:240, + showProgressBar:false, + showCloseButton:false, + buttons:{ + 'yes':"yes", // Clipperz.PM.Strings['mainPanelDeleteRecordPanelConfirmButtonLabel'], + 'no':"no" // Clipperz.PM.Strings['mainPanelDeleteRecordPanelDenyButtonLabel'] + }, + fn:MochiKit.Base.partial(function(aDeferred, aResult) { + if (aResult == 'yes') { + aDeferred.callback(aResult); + } else { + aDeferred.errback(aResult); + } + }, innerDeferredResult) + }/*, this.getId('nextActionButton')*/); + + return innerDeferredResult; + }); + +//------------------- +// deferredResult.addCallback(MochiKit.Base.bind(function(someRecords) { +// Clipperz.PM.Components.MessageBox.showProgressPanel( +// MochiKit.Base.method(this, 'importProcessedValues_core', someRecords), +// MochiKit.Base.method(this, 'handleProcessError'), +// this.getDom('mainDiv') +// ); +// }, this)); + +//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("GenericImportComponent - 2: " + res); return res;}); + deferredResult.addCallback(MochiKit.Base.method(Clipperz.PM.Components.MessageBox(), 'deferredShow'), + { +// title:Clipperz.PM.Strings['accountPanelDeletingAccountPanelProgressTitle'], +// text:Clipperz.PM.Strings['accountPanelDeletingAccountPanelProgressText'], + width:240, + showProgressBar:true, + showCloseButton:false + } + ); +//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("GenericImportComponent - 3: " + res); return res;}); + + deferredResult.addCallback(MochiKit.Base.bind(function(someRecords) { + var innerDeferredResult; + +//MochiKit.Logging.logDebug(">>> inner deferred"); + innerDeferredResult = new MochiKit.Async.Deferred(); + +//innerDeferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("GenericImportComponent - 3.1: " + res); return res;}); + innerDeferredResult.addCallback(MochiKit.Base.method(this, 'importProcessedValues_core', someRecords)); +//innerDeferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("GenericImportComponent - 3.2: " + res); return res;}); + innerDeferredResult.addErrback(MochiKit.Base.method(this, 'handleProcessError')); +//innerDeferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("GenericImportComponent - 3.3: " + res); return res;}); + innerDeferredResult.callback(someRecords); +//MochiKit.Logging.logDebug("<<< inner deferred"); + + return innerDeferredResult; + }, this), selectedRecords); +//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("GenericImportComponent - 4: " + res); return res;}); + + deferredResult.addCallback(MochiKit.Base.method(Clipperz.PM.Components.MessageBox(), 'hide'), 'mainDiv'); + + deferredResult.addErrback(MochiKit.Base.bind(function() { + this.nextButton().enable(); + this.setCurrentStep(this.currentStep() -1); + }, this)); +//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("GenericImportComponent - 5: " + res); return res;}); + + deferredResult.callback(selectedRecords); +//MochiKit.Logging.logDebug("<<< GenericImportComponent.importProcessedValues"); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'importProcessedValues_core': function(someRecords) { + var deferredResult; + + deferredResult = new MochiKit.Async.Deferred(); + + deferredResult.addCallback(Clipperz.NotificationCenter.deferredNotification, this, 'updatedProgressState', 'processingImportData'); + deferredResult.addCallback(Clipperz.NotificationCenter.deferredNotification, this, 'updatedProgressState', {steps:(someRecords.length + 6 + 1)}); + deferredResult.addCallback(MochiKit.Async.wait, 0.5); +//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("importProcessedValues_core - 3: " + res); return res;}); + deferredResult.addCallback(MochiKit.Base.bind(function(someRecords) { + var i,c; + + c = someRecords.length; + for (i=0; i<c; i++) { + this.user().addRecord(someRecords[i], true); + } + + return someRecords; + }, this)); + deferredResult.addCallback(MochiKit.Async.wait, 0.5); +//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("importProcessedValues_core - 4: " + res); return res;}); + deferredResult.addCallback(Clipperz.NotificationCenter.deferredNotification, this, 'recordAdded', null); +//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("importProcessedValues_core - 5: " + res); return res;}); + deferredResult.addCallback(MochiKit.Base.method(this.user(), 'saveRecords')); +//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("importProcessedValues_core - 6: " + res); return res;}); + deferredResult.addCallback(Clipperz.NotificationCenter.deferredNotification, this, 'selectTab', 'mainTabPanel.recordsTab'); +//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("importProcessedValues_core - 7: " + res); return res;}); + + if (this.user().preferences().shouldShowDonationPanel()) { + deferredResult.addCallback(Clipperz.PM.showDonationSplashScreen, this.user(), 'mainDiv'); + } + + deferredResult.addCallback(Clipperz.NotificationCenter.deferredNotification, this, 'importCompleted', null); + + deferredResult.callback(someRecords); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'handleParseError': function(res) { + this.processingAborted(); + MochiKit.Logging.logError("An error occurred while parsing the values: " + res); + alert("An error occurred while parsing the values: " + res); + Clipperz.PM.Components.MessageBox().hide(); + }, + + 'handleProcessError': function(res) { + this.processingAborted(); + MochiKit.Logging.logError("An error occurred while processing the values: " + res); + alert("An error occurred while processing the values: " + res); + Clipperz.PM.Components.MessageBox().hide(); + }, + + //------------------------------------------------------------------------- + __syntaxFix__: "syntax fix" +}); + |