pgadmin4/web/pgadmin/browser/static/js/wizard.js

317 lines
12 KiB
JavaScript
Raw Normal View History

2019-01-02 04:24:12 -06:00
/////////////////////////////////////////////////////////////
//
// pgAdmin 4 - PostgreSQL Tools
//
2020-01-02 08:43:50 -06:00
// Copyright (C) 2013 - 2020, The pgAdmin Development Team
2019-01-02 04:24:12 -06:00
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
define([
'underscore', 'jquery', 'backbone', 'sources/pgadmin', 'pgadmin.browser',
'sources/gettext', 'sources/utils',
], function(_, $, Backbone, pgAdmin, pgBrowser, gettext, commonUtils) {
2016-04-13 10:11:43 -05:00
/* Wizard individual Page Model */
pgBrowser.WizardPage = Backbone.Model.extend({
2016-04-13 10:11:43 -05:00
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 */
2016-04-13 10:11:43 -05:00
show_progress_bar: '',
/* Callback for OnLoad */
onLoad: function() {
return true;
},
/* Callback for before Next */
beforeNext: function() {
return true;
},
onNext: function() {},
2016-04-13 10:11:43 -05:00
onBefore: function() {},
/* Callback for before Previous */
beforePrev: function() {
return true;
},
},
2016-04-13 10:11:43 -05:00
});
pgBrowser.Wizard = Backbone.View.extend({
2016-04-13 10:11:43 -05:00
options: {
title: 'Wizard',
/* Main Wizard Title */
image: 'left_panel.png',
/* TODO:: We can use default image here */
curr_page: 0,
/* Current Page to Load */
2016-04-13 10:11:43 -05:00
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,
2016-04-13 10:11:43 -05:00
height: 400,
width: 650,
show_left_panel: true,
wizard_help: '',
2016-04-13 10:11:43 -05:00
},
tmpl: _.template(
' <div class="pgadmin-wizard" style="height: <%= this.options.height %>px;' +
' width: <%= this.options.width %>px">' +
' <div class="wizard-header wizard-badge">' +
' <div class="d-flex">' +
' <div>' +
' <h3><span id="main-title"><%= this.options.title %></span> -' +
' <span id="step-title"><%= page_title %></span></h3>' +
' </div>' +
' <% if (this.options.show_header_cancel_btn) { %>' +
' <div class="ml-auto">' +
' <button aria-label="' + gettext('Close') +'" tabindex="0" class="ajs-close wizard-cancel-event pull-right"' +
' title="' + gettext('Close') + '"></button>' +
' <% if (this.options.show_header_maximize_btn) { %>' +
' <button aria-label="' + gettext('Maximize') + '" tabindex="0" class="ajs-maximize wizard-maximize-event mr-1 pull-right"' +
' title="' + gettext('Maximize') + '"></button>' +
' <% } %>' +
' </div>' +
' <% } %>' +
' </div>' +
' </div>' +
' <div class="wizard-content row m-0">' +
' <% if (this.options.show_left_panel) { %>' +
' <div class="col-sm-3 wizard-left-panel">' +
' <img src="<%= this.options.image %>"' +
' alt="' + gettext('Left panel logo') + '"></div>' +
' <% } %>' +
' <div class="col-sm-<% if (this.options.show_left_panel) { %>9<% }' +
' else { %>12<% } %> wizard-right-panel">' +
' <% if ( typeof show_description != "undefined"){ %>' +
' <div class="wizard-description">' +
' <%= show_description %>' +
' </div>' +
' <% } %>' +
' <div class="wizard-progress-bar"><% if (show_progress_bar) { %>' +
' <p class="alert alert-info col-sm-12"><%= show_progress_bar %></p><% } %>' +
' </div>' +
' <div class="wizard-right-panel_content">' +
' </div>' +
' </div>' +
' </div>' +
' <div class="wizard-footer pg-prop-footer">' +
Fixed following: - Base font size changed from 0.815rem to 0.875rem, for navbar from 0.875rem to 0.925rem. - Dialog sizes made consistent throughout the application. Now there are 3 size options for width and height each - sm, md, lg. Combination of any of these to be used hereafter - Alignment fix for controls of Node properties dialogs which includes showing text and label in one line without dialog size change, checkbox alignment, switch control alignment at places and other minor improvements in other dialogs - Error message design change in dialogs validation - SQL Editor data grid editor popup design changes which were missed - Design change for dashboard server activity grid - Login page language dropdown color fix - Properties accordion collapse design fix - Help, Info icon fixed across all dialogs which were not working if clicked exactly on the text - Added missing icon with buttons at few places - Shadow behind the dialogs is increased to make it look clearly separated and depth. - Control Alignment fix in maintenance dialog - Min height of alertify dialogs set for better UX - File dialog design fix when no files found - Grant wizard fixes - Scroll bar visibility on first page, use full space for SQL generated on the last page - Browser toolbar buttons changed to sync with SQL editor toolbar buttons - Rounded corners for docker floating dialog (no properties) - Renaming file in file dialog should show original file name - SQL data grid text edit popup buttons behaviour was swapped. This is fixed. - Import/Export dialog changes as per new design.
2019-01-02 03:35:15 -06:00
' <div class="pg-prop-status-bar" style="visibility:hidden">' +
' <div class="error-in-footer"> ' +
' <div class="d-flex px-2 py-1"> ' +
' <div class="pr-2"> ' +
' <i class="fa fa-exclamation-triangle text-danger" aria-hidden="true" role="img"></i> ' +
Fixed following: - Base font size changed from 0.815rem to 0.875rem, for navbar from 0.875rem to 0.925rem. - Dialog sizes made consistent throughout the application. Now there are 3 size options for width and height each - sm, md, lg. Combination of any of these to be used hereafter - Alignment fix for controls of Node properties dialogs which includes showing text and label in one line without dialog size change, checkbox alignment, switch control alignment at places and other minor improvements in other dialogs - Error message design change in dialogs validation - SQL Editor data grid editor popup design changes which were missed - Design change for dashboard server activity grid - Login page language dropdown color fix - Properties accordion collapse design fix - Help, Info icon fixed across all dialogs which were not working if clicked exactly on the text - Added missing icon with buttons at few places - Shadow behind the dialogs is increased to make it look clearly separated and depth. - Control Alignment fix in maintenance dialog - Min height of alertify dialogs set for better UX - File dialog design fix when no files found - Grant wizard fixes - Scroll bar visibility on first page, use full space for SQL generated on the last page - Browser toolbar buttons changed to sync with SQL editor toolbar buttons - Rounded corners for docker floating dialog (no properties) - Renaming file in file dialog should show original file name - SQL data grid text edit popup buttons behaviour was swapped. This is fixed. - Import/Export dialog changes as per new design.
2019-01-02 03:35:15 -06:00
' </div> ' +
' <div class="alert-text"></div> ' +
' <div class="ml-auto close-error-bar"> ' +
' <a aria-label="' + gettext('Close error bar') + '" class="close-error fa fa-times text-danger"></a> ' +
Fixed following: - Base font size changed from 0.815rem to 0.875rem, for navbar from 0.875rem to 0.925rem. - Dialog sizes made consistent throughout the application. Now there are 3 size options for width and height each - sm, md, lg. Combination of any of these to be used hereafter - Alignment fix for controls of Node properties dialogs which includes showing text and label in one line without dialog size change, checkbox alignment, switch control alignment at places and other minor improvements in other dialogs - Error message design change in dialogs validation - SQL Editor data grid editor popup design changes which were missed - Design change for dashboard server activity grid - Login page language dropdown color fix - Properties accordion collapse design fix - Help, Info icon fixed across all dialogs which were not working if clicked exactly on the text - Added missing icon with buttons at few places - Shadow behind the dialogs is increased to make it look clearly separated and depth. - Control Alignment fix in maintenance dialog - Min height of alertify dialogs set for better UX - File dialog design fix when no files found - Grant wizard fixes - Scroll bar visibility on first page, use full space for SQL generated on the last page - Browser toolbar buttons changed to sync with SQL editor toolbar buttons - Rounded corners for docker floating dialog (no properties) - Renaming file in file dialog should show original file name - SQL data grid text edit popup buttons behaviour was swapped. This is fixed. - Import/Export dialog changes as per new design.
2019-01-02 03:35:15 -06:00
' </div> ' +
' </div> ' +
' </div> ' +
' </div>' +
' <div class="wizard-buttons d-flex">' +
' <div>' +
' <button tabindex="0" aria-label="' + gettext('Help') + '" title = "' + gettext('Help for this dialog.') + '"' +
' class="btn btn-secondary pull-left wizard-help" <%=this.options.wizard_help ? "" : "disabled" %>>' +
' <span class="fa fa-lg fa-question" role="img"></span></button>' +
' </div>' +
' <div class="ml-auto">' +
' <button class="btn btn-secondary wizard-cancel" <%=this.options.disable_cancel ? "disabled" : ""%>>' +
' <i class="fa fa-close" role="img"></i>&nbsp;' + gettext('Cancel') + '</button>' +
' <button class="btn btn-secondary wizard-back" <%=this.options.disable_prev ? "disabled" : ""%>>' +
' <i class="fa fa-backward" role="img"></i>&nbsp;' + gettext('Back') + '</button>' +
' <button class="btn btn-secondary wizard-next" <%=this.options.disable_next ? "disabled" : ""%>>' +
' ' + gettext('Next') +
Fixed following: - Base font size changed from 0.815rem to 0.875rem, for navbar from 0.875rem to 0.925rem. - Dialog sizes made consistent throughout the application. Now there are 3 size options for width and height each - sm, md, lg. Combination of any of these to be used hereafter - Alignment fix for controls of Node properties dialogs which includes showing text and label in one line without dialog size change, checkbox alignment, switch control alignment at places and other minor improvements in other dialogs - Error message design change in dialogs validation - SQL Editor data grid editor popup design changes which were missed - Design change for dashboard server activity grid - Login page language dropdown color fix - Properties accordion collapse design fix - Help, Info icon fixed across all dialogs which were not working if clicked exactly on the text - Added missing icon with buttons at few places - Shadow behind the dialogs is increased to make it look clearly separated and depth. - Control Alignment fix in maintenance dialog - Min height of alertify dialogs set for better UX - File dialog design fix when no files found - Grant wizard fixes - Scroll bar visibility on first page, use full space for SQL generated on the last page - Browser toolbar buttons changed to sync with SQL editor toolbar buttons - Rounded corners for docker floating dialog (no properties) - Renaming file in file dialog should show original file name - SQL data grid text edit popup buttons behaviour was swapped. This is fixed. - Import/Export dialog changes as per new design.
2019-01-02 03:35:15 -06:00
' &nbsp;<i class="fa fa-forward"></i></button>' +
' <button class="btn btn-primary wizard-finish" <%=this.options.disable_finish ? "disabled" : ""%>>' +
' <i class="fa fa-check" role="img"></i>&nbsp;' + gettext('Finish') + '</button>' +
' </div>' +
' </div>' +
' </div>' +
' </div>'),
2016-04-13 10:11:43 -05:00
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',
2016-04-13 10:11:43 -05:00
},
initialize: function(options) {
this.options = _.extend({}, this.options, options.options);
this.currPage = this.collection.at(this.options.curr_page).toJSON();
},
render: function() {
var self = this,
data = this.currPage;
2016-04-13 10:11:43 -05:00
/* 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));
/* HTML Content */
if (data.html) {
data.content = data.html;
}
2016-04-13 10:11:43 -05:00
/* Backbone View */
else if (data.view) {
data.content = data.view.render().el;
}
2016-04-13 10:11:43 -05:00
$(this.el).html(this.tmpl(data));
$(this.el).find('.wizard-right-panel_content').html(data.content);
2016-04-13 10:11:43 -05:00
/* OnLoad Callback */
this.onLoad();
setTimeout(function() {
var container = $(self.el);
commonUtils.findAndSetFocus(container);
}, 100);
2016-04-13 10:11:43 -05:00
return this;
},
nextPage: function() {
if (!this.beforeNext()) {
return false;
}
2016-04-13 10:11:43 -05:00
var page_id = this.onNext();
2016-04-13 10:11:43 -05:00
if (page_id) {
2016-04-13 10:11:43 -05:00
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)) {
2016-04-13 10:11:43 -05:00
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;
}
2016-04-13 10:11:43 -05:00
var page_id = this.onPrev();
2016-04-13 10:11:43 -05:00
if (page_id) {
2016-04-13 10:11:43 -05:00
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) {
2016-04-13 10:11:43 -05:00
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
2018-07-10 04:59:53 -05:00
this.off(); // Unbind all local event bindings
2016-04-13 10:11:43 -05:00
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;
}
2016-04-13 10:11:43 -05:00
},
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;
}
2016-04-13 10:11:43 -05:00
},
closeErrorMsg: function() {
$(this.el).find('.pg-prop-status-bar .alert-text').empty();
$(this.el).find('.pg-prop-status-bar').css('visibility', 'hidden');
},
beforeNext: function() {
2016-04-13 10:11:43 -05:00
return this.evalASFunc(this.currPage.beforeNext);
},
beforePrev: function() {
2016-04-13 10:11:43 -05:00
return this.evalASFunc(this.currPage.beforePrev);
},
onPrev: function() {
2016-04-13 10:11:43 -05:00
return this.evalASFunc(this.currPage.onPrev);
},
onNext: function() {
2016-04-13 10:11:43 -05:00
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,
_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();
}
},
2016-04-13 10:11:43 -05:00
evalASFunc: function(func, ctx) {
var self = this;
ctx = ctx || self.currPage;
return (_.isFunction(func) ? func.apply(ctx, [self]) : func);
},
onDialogHelp: function() {
window.open(this.options.wizard_help, 'pgadmin_help');
},
2016-04-13 10:11:43 -05:00
});
return pgBrowser;
});