define(
['underscore', 'backbone', 'sources/pgadmin', 'pgadmin.browser'],
function(_, Backbone, pgAdmin, pgBrowser) {
pgBrowser = pgBrowser || pgAdmin.Browser || {};
/* Wizard individual Page Model */
var WizardPage = pgBrowser.WizardPage = Backbone.Model.extend({
defaults: {
id: undefined, /* Id */
page_title: undefined, /* Page Title */
view: undefined, /* A Backbone View */
html: undefined, /* HTML tags to be rendered */
image: undefined, /* Left hand side image */
disable_prev: false, /* Previous Button Flag */
disable_next: false, /* Next Button Flag */
disable_cancel: false, /* Cancel Button Flag */
show_progress_bar: '',
/* Callback for OnLoad */
onLoad: function() {
return true;
},
/* Callback for before Next */
beforeNext: function() {
return true;
},
onNext: function(){},
onBefore: function() {},
/* Callback for before Previous */
beforePrev: function() {
return true;
}
}
});
var Wizard = pgBrowser.Wizard = Backbone.View.extend({
options: {
title: 'Wizard', /* Main Wizard Title */
image: 'left_panel.png', /* TODO:: We can use default image here */
curr_page: 0, /* Current Page to Load */
disable_next: false,
disable_prev: false,
disable_finish: false,
disable_cancel: false,
show_header_cancel_btn: false, /* show cancel button at wizard header */
show_header_maximize_btn: false, /* show maximize button at wizard header */
dialog_api: null,
height: 400,
width: 650,
show_left_panel: true,
wizard_help: ''
},
tmpl: _.template(
"
"
+ " "
+ "
"
+ " <% if (this.options.show_left_panel) { %>"
+ "
"
+ "

"
+ " <% } %>"
+ "
"
+ " <% if ( typeof show_description != 'undefined'){ %>"
+ "
"
+ " <%= show_description %>"
+ "
"
+ " <% } %>"
+ "
<% if (show_progress_bar) { %>"
+ "
<%= show_progress_bar %>
<% } %>"
+ "
"
+ "
"
+ "
"
+ "
"
+ "
"
+ "
"
+ " "
+ "
"
+ " "
+ "
"),
events: {
"click button.wizard-next" : "nextPage",
"click button.wizard-back" : "prevPage",
"click button.wizard-cancel" : "onCancel",
"click button.wizard-cancel-event" : "onCancel",
"click button.wizard-maximize-event" : "onMaximize",
"click button.wizard-finish" : "finishWizard",
"click button.wizard-help" : "onDialogHelp",
"click a.close-error" : "closeErrorMsg",
},
initialize: function(options) {
this.options = _.extend({}, this.options, options.options);
this.currPage = this.collection.at(this.options.curr_page).toJSON();
},
render: function() {
var data = this.currPage;
/* Check Status of the buttons */
this.options.disable_next = (this.options.disable_next ? true : this.evalASFunc(this.currPage.disable_next));
this.options.disable_prev = (this.options.disable_prev ? true : this.evalASFunc(this.currPage.disable_prev));
this.options.disable_cancel = (this.currPage.canCancel ? true : this.evalASFunc(this.currPage.disable_cancel));
var that = this;
/* HTML Content */
if (data.html) { data.content = data.html; }
/* Backbone View */
else if (data.view) { data.content = data.view.render().el;}
$(this.el).html(this.tmpl(data));
$(this.el).find(".wizard-right-panel_content").html(data.content);
/* OnLoad Callback */
this.onLoad();
return this;
},
nextPage: function() {
if (!this.beforeNext()) { return false; }
var page_id = this.onNext();
if (page_id ) {
this.currPage = this.collection.get(page_id).toJSON();
this.options.curr_page = this.collection.indexOf(this.collection.get(page_id));
}
else if (this.options.curr_page < (this.collection.length-1)) {
this.options.curr_page = this.options.curr_page + 1;
this.currPage = this.collection.at(this.options.curr_page).toJSON();
}
this.enableDisableNext();
this.enableDisablePrev();
return this.render();
},
prevPage: function() {
if (!this.beforePrev()) { return false; }
var page_id = this.onPrev();
if (page_id){
this.currPage = this.collection.get(page_id).toJSON();
this.options.curr_page = this.collection.indexOf(this.collection.get(page_id));
}
else if (this.options.curr_page > 0) {
this.options.curr_page = this.options.curr_page - 1;
this.currPage = this.collection.at(this.options.curr_page).toJSON();
}
this.enableDisableNext();
this.enableDisablePrev();
return this.render();
},
finishWizard: function() {
this.onFinish();
this.remove(); // Remove view from DOM
this.unbind(); // Unbind all local event bindings
delete this.$el; // Delete the jQuery wrapped object variable
delete this.el; // Delete the variable reference to this node
return true;
},
enableDisableNext: function(disable) {
if (typeof(disable) != 'undefined') {
this.options.disable_next = disable;
}
else if (this.options.curr_page >= (this.collection.length-1)) {
this.options.disable_next = true;
}
else {
this.options.disable_next = false;
}
},
enableDisablePrev: function(disable) {
if (typeof(disable) != 'undefined') {
this.options.disable_prev = disable;
}
else if (this.options.curr_page <= 0) {
this.options.disable_prev = true;
}
else {
this.options.disable_prev = false;
}
},
closeErrorMsg: function() {
$(this.el).find('.pg-prop-status-bar .alert-text').empty();
$(this.el).find('.pg-prop-status-bar').css("visibility", "hidden");
},
beforeNext: function(){
return this.evalASFunc(this.currPage.beforeNext);
},
beforePrev: function(){
return this.evalASFunc(this.currPage.beforePrev);
},
onPrev: function(){
return this.evalASFunc(this.currPage.onPrev);
},
onNext: function(){
return this.evalASFunc(this.currPage.onNext);
},
onLoad: function() {
return this.evalASFunc(this.currPage.onLoad);
},
onFinish: function() {
return true;
},
onCancel: function() {
this.$el.remove();
return true;
},
onMaximize: function() {
var dialog_api = this.options.dialog_api,
old_classes, _el = this.$el.find('.wizard-maximize-event');
// If no dialog api found then return
if(!dialog_api) return;
if(dialog_api.isMaximized()) {
// toggle the icon
_el.removeClass('ajs-maximized');
dialog_api.restore();
} else {
// toggle the icon
_el.addClass('ajs-maximized ' + _el.attr('class'));
dialog_api.maximize();
}
},
evalASFunc: function(func, ctx) {
var self = this;
ctx = ctx || self.currPage;
return (_.isFunction(func) ? func.apply(ctx, [self]) : func);
},
onDialogHelp: function() {
// See if we can find an existing panel, if not, create one
var pnlDialogHelp = pgBrowser.docker.findPanels('pnl_online_help')[0];
if (pnlDialogHelp == null) {
var pnlProperties = pgBrowser.docker.findPanels('properties')[0];
pgBrowser.docker.addPanel('pnl_online_help', wcDocker.DOCK.STACKED, pnlProperties);
pnlDialogHelp = pgBrowser.docker.findPanels('pnl_online_help')[0];
}
// Update the panel
var iframe = $(pnlDialogHelp).data('embeddedFrame');
pnlDialogHelp.focus();
iframe.openURL(this.options.wizard_help);
}
});
return pgBrowser;
});