diff options
| author | Géry Debongnie <ged@odoo.com> | 2015-03-09 16:34:27 +0100 |
|---|---|---|
| committer | Géry Debongnie <ged@odoo.com> | 2015-03-18 09:01:49 +0100 |
| commit | e8a00bc50da435d3859118ca127d20a2eb9a0cab (patch) | |
| tree | 039f6ec40b37392e76c8830a8e518ac40f7e7fec /addons/web/static/src/js/widgets/database_manager.js | |
| parent | 9036084f065c7aca3b2199903f4da67db3501ba7 (diff) | |
[REF] web: add module system to the web client
This commit introduces a new module system for the javascript code.
Instead of using global (namespaced) variables everywhere (like
openerp.web.whatever, ...), each file declare one (or more) module
with its dependencies. Each module will be loaded after its
dependencies, and will be given a reference to the return values.
This change is a massive departure from the way the client worked
previously. It will sadly break some/most history, but I am sure that
the future git ecosystem will allow you to easily browse the history
past this revision (one can dream).
This commit feature:
* main namespace is now odoo instead of openerp
* a way to define modules and dependencies (inspired by requirejs)
* many files have been splitted in simpler subfiles
* basic support for debugging in odoo.__DEBUG__
* no global variable (i.e. nothing in window.openerp)
* many bug fixes, many new bugs
Future vision: this modularization should simplify future code
development, simplify debugging and will allow a serious testing effort
Diffstat (limited to 'addons/web/static/src/js/widgets/database_manager.js')
| -rw-r--r-- | addons/web/static/src/js/widgets/database_manager.js | 217 |
1 files changed, 217 insertions, 0 deletions
diff --git a/addons/web/static/src/js/widgets/database_manager.js b/addons/web/static/src/js/widgets/database_manager.js new file mode 100644 index 00000000000..9bd5b4d05c3 --- /dev/null +++ b/addons/web/static/src/js/widgets/database_manager.js @@ -0,0 +1,217 @@ +odoo.define('web.DatabaseManager', ['web.core', 'web.Dialog', 'web.framework', 'web.web_client', 'web.Widget'], function (require) { +"use strict"; + +var core = require('web.core'); +var Dialog = require('web.Dialog'); +var framework = require('web.framework'); +var Widget = require('web.Widget'); + +var _t = core._t; +var QWeb = core.qweb; + +var DataBaseManager = Widget.extend({ + init: function(parent) { + this._super(parent); + $.validator.addMethod('matches', function (s, _, re) { + return new RegExp(re).test(s); + }, _t("Invalid database name")); + }, + start: function() { + var self = this; + $('.oe_secondary_menus_container,.oe_user_menu_placeholder').empty(); + var fetch_db = this.rpc("/web/database/get_list", {}).then( + function(result) { + self.db_list = result; + }, + function (_, ev) { + ev.preventDefault(); + self.db_list = null; + }); + var fetch_langs = this.rpc("/web/session/get_lang_list", {}).done(function(result) { + self.lang_list = result; + }); + return $.when(fetch_db, fetch_langs).always(self.do_render); + }, + do_render: function() { + var self = this; + core.bus.trigger('web_client_toggle_bars', true); + self.$el.html(QWeb.render("DatabaseManager", { widget : self })); + $('.oe_user_menu_placeholder').append(QWeb.render("DatabaseManager.user_menu",{ widget : self })); + $('.oe_secondary_menus_container').append(QWeb.render("DatabaseManager.menu",{ widget : self })); + $('ul.oe_secondary_submenu > li:first').addClass('active'); + $('ul.oe_secondary_submenu > li').bind('click', function (event) { + var menuitem = $(this); + menuitem.addClass('active').siblings().removeClass('active'); + var form_id =menuitem.find('a').attr('href'); + $(form_id).show().siblings().hide(); + event.preventDefault(); + }); + $('#back-to-login').click(self.do_exit); + self.$el.find("td").addClass("oe_form_group_cell"); + self.$el.find("tr td:first-child").addClass("oe_form_group_cell_label"); + self.$el.find("label").addClass("oe_form_label"); + self.$el.find("form[name=create_db_form]").validate({ submitHandler: self.do_create }); + self.$el.find("form[name=duplicate_db_form]").validate({ submitHandler: self.do_duplicate }); + self.$el.find("form[name=drop_db_form]").validate({ submitHandler: self.do_drop }); + self.$el.find("form[name=backup_db_form]").validate({ submitHandler: self.do_backup }); + self.$el.find("form[name=restore_db_form]").validate({ submitHandler: self.do_restore }); + self.$el.find("form[name=change_pwd_form]").validate({ + messages: { + old_pwd: _t("Please enter your previous password"), + new_pwd: _t("Please enter your new password"), + confirm_pwd: { + required: _t("Please confirm your new password"), + equalTo: _t("The confirmation does not match the password") + } + }, + submitHandler: self.do_change_password + }); + }, + destroy: function () { + this.$el.find('#db-create, #db-drop, #db-backup, #db-restore, #db-change-password, #back-to-login').unbind('click').end().empty(); + this._super(); + }, + /** + * Blocks UI and replaces $.unblockUI by a noop to prevent third parties + * from unblocking the UI + */ + blockUI: function () { + framework.blockUI(); + $.unblockUI = function () {}; + }, + /** + * Reinstates $.unblockUI so third parties can play with blockUI, and + * unblocks the UI + */ + unblockUI: function () { + $.unblockUI = framework.unblockUI; + framework.unblockUI(); + }, + /** + * Displays an error dialog resulting from the various RPC communications + * failing over themselves + * + * @param {Object} error error description + * @param {String} error.title title of the error dialog + * @param {String} error.error message of the error dialog + */ + display_error: function (error) { + return new Dialog(this, { + size: 'medium', + title: error.title, + buttons: [ + {text: _t("Ok"), click: function() { this.parents('.modal').modal('hide'); }} + ] + }, $('<div>').html(error.error)).open(); + }, + do_create: function(form) { + var fields = $(form).serializeArray(); + this.rpc("/web/database/create", {'fields': fields}).done(function(result) { + if (result) { + framework.redirect('/web'); + } else { + alert("Failed to create database"); + } + }); + }, + do_duplicate: function(form) { + var self = this; + var fields = $(form).serializeArray(); + self.rpc("/web/database/duplicate", {'fields': fields}).then(function(result) { + if (result.error) { + self.display_error(result); + return; + } + self.do_notify(_t("Duplicating database"), _t("The database has been duplicated.")); + self.start(); + }); + }, + do_drop: function(form) { + var self = this; + var $form = $(form), + fields = $form.serializeArray(), + $db_list = $form.find('[name=drop_db]'), + db = $db_list.val(); + if (!db || !confirm(_.str.sprintf(_t("Do you really want to delete the database: %s ?"), db))) { + return; + } + self.rpc("/web/database/drop", {'fields': fields}).done(function(result) { + if (result.error) { + self.display_error(result); + return; + } + self.do_notify(_t("Dropping database"), _.str.sprintf(_t("The database %s has been dropped"), db)); + self.start(); + }); + }, + do_backup: function(form) { + var self = this; + self.blockUI(); + self.session.get_file({ + form: form, + success: function () { + self.do_notify(_t("Backed"), _t("Database backed up successfully")); + }, + error: function(error){ + if (error && error[1]) { + self.display_error(error[1][0]); + } + }, + complete: function() { + self.unblockUI(); + } + }); + }, + do_restore: function(form) { + var self = this; + self.blockUI(); + $(form).ajaxSubmit({ + url: '/web/database/restore', + type: 'POST', + resetForm: true, + success: function (body) { + // If empty body, everything went fine + if (!body) { return; } + + if (body.indexOf('403 Forbidden') !== -1) { + self.display_error({ + title: _t("Access Denied"), + error: _t("Incorrect super-administrator password") + }); + } else { + self.display_error({ + title: _t("Restore Database"), + error: _t("Could not restore the database") + }); + } + }, + complete: function() { + self.unblockUI(); + self.do_notify(_t("Restored"), _t("Database restored successfully")); + } + }); + }, + do_change_password: function(form) { + var self = this; + self.rpc("/web/database/change_password", { + 'fields': $(form).serializeArray() + }).done(function(result) { + if (result.error) { + self.display_error(result); + return; + } + self.unblockUI(); + self.do_notify(_t("Changed Password"), _t("Password has been changed successfully")); + }); + }, + do_exit: function () { + this.$el.remove(); + framework.redirect('/web'); + } +}); + +core.action_registry.add("database_manager", DataBaseManager); + +return DataBaseManager; + +}); |
