define([ "constants", "storage_utils", "error_messages", "view/changelist", "view/validation", "text!template/submit_assistant.html", "jquery", "underscore", "backbone", "bootstrap", "dropdown", "messagebox", ], function(constants, storage_utils, error_messages, ChangelistView, ValidationView, tmpl_submit_assistant){ /** * Main view, manage all the other views. * Composed of tabs (if jira tab activated) and submit buttons. * Manage validation process. */ var SubmitAssistantView = Backbone.View.extend({ el: "#submit_assistant", events: { "click #validate_button": "validateChange", "click #save_button": "saveChangeAndClose", "click #cancel_button": "closeSA" }, /** * See Backbone documentation. * * @param model - the model of the SA. * @param changelistModel - the model of the CL. * @param filesCollection - the files of the CL. */ initialize: function() { this.changelistModel = this.options.changelistModel; this.filesCollection = this.options.filesCollection; this.checkAPIVersion(); this.render(); //by default changelist view is always displayed this.changelistView = new ChangelistView({ type_SA: this.model.get("type_SA"), model: this.changelistModel, filesCollection: this.filesCollection, }); //enable buttons if a saved CL with the SA is loaded this.updateSubmitButtons(); //listen on CL validity to enable / disable buttons this.changelistModel.on("change:is_valid", this.updateSubmitButtons, this); if (this.model.get("is_validation_branch")) { this.validationView = new ValidationView({ model: this.changelistModel, }); //if validation process is activated, listened on validaton success event to submit CL this.changelistModel.on(constants.event_success_validation, $.proxy(this.submitChange, this)); } }, AskForUserConfirmation: function() { return $.MessageBox({ buttonDone: "Yes", buttonFail: "No", message: "Preflight is mandatory on Just Dance. Are you sure you want to submit WITHOUT preflight?" }); }, render: function() { var viewModel = this; var template = _.template(tmpl_submit_assistant, { model: this.model.toJSON(), constants: constants, }); this.$el.html(template); this.$buttons = this.$("#buttons_div input"); this.$submit_buttons = this.$buttons.filter(".submit"); $(".submitoptions").dropdown(); // this functoin helps in deciding what needs to be done when user select option from submit options dropdown $(".submitoptions .menu .item").on("click", function(event, info) { var idOfButtonClicked = $(event.currentTarget).data('value'); var id = parseInt(idOfButtonClicked); switch (id) { case 1: // preflight only if (viewModel.model.get("type_SA") === constants.type_code) { viewModel.preflightOnly(); } else { viewModel.validate(); } break; case 2: // submit only viewModel.AskForUserConfirmation() .done(function() { viewModel.submitChange(); }); break; } }); $(".preflightAndSaveButton").on("click", function() { if (viewModel.model.get("type_SA") === constants.type_code) { viewModel.preflightAndSubmit(); } else { viewModel.validateAndSubmit(); } }); }, /** * Check P4JsApi version (1.2 needed). * Close the SA if version < 1.2. */ checkAPIVersion: function() { if (this.model.get("version") < constants.API_version_limit) { alert(error_messages.API_version); storage_utils.closeSA(); } }, /** * Save the first tag of the description in the localstorage. */ saveTag: function() { if (this.model.get("type_SA") === constants.type_code) { storage_utils.localSave("scope_tag", this.changelistModel.get("scope_tag")); } else if (this.model.get("type_SA") === constants.type_data) { storage_utils.localSave("domain_tag", this.changelistModel.get("domain_tag")); } }, /** * Save the changelist. And returns the id of the changelist created/saved */ saveChange: function() { this.$buttons.attr("disabled", "disabled"); var id = storage_utils.saveCL(this.changelistModel, this.filesCollection); this.saveTag(); return id; }, saveChangeAndClose: function () { this.saveChange(); storage_utils.closeSA(); }, /** * Submit the changelist. */ submitChange: function () { this.changelistModel.checkAndAddPreflightTag(); this.$buttons.attr("disabled", "disabled"); if (this.validationView) { this.validationView.hide(); } var onSubmit = this.changelistView.getSubmitOptions(); storage_utils.submitCL(this.changelistModel, this.filesCollection, onSubmit); this.saveTag(); storage_utils.closeSA(); }, /** * Enable / disable submit buttons according to changelist validity. */ updateSubmitButtons: function() { if (this.changelistModel.get("is_valid")) { this.$submit_buttons.removeAttr("disabled"); $(".preflightAndSaveButton").removeClass("disabled"); $(".submitoptions").removeClass("disabled"); // for the submit option dropdown $("#save_button").removeClass("disabled"); } else { this.$submit_buttons.attr("disabled", "disabled"); $(".preflightAndSaveButton").addClass("disabled"); $(".submitoptions").addClass("disabled"); $("#save_button").addClass("disabled"); } }, /** * Show the validation window to validate the CL. */ validateChange: function() { this.validationView.show(); }, /** * Close the SA. */ closeSA: function() { this.$buttons.attr("disabled", "disabled"); storage_utils.closeSA(); }, /* * Function to check if the user is trying to submit the default changelist. If yes, then we save it as * a new changelist and return the newly create changelist ID to be used later. */ getOrCreateChangelist: function() { var self = this; var chageListID = P4JsApi.getSubmitChange(); var IsDefaultChangeList = chageListID == "default" ? true : false; // CHECK IF THE USER IS TRYING TO SUBMIT THE DEFAULT CHANGLIST if (IsDefaultChangeList) { // if yes we do following step before trigerring the preflight and submit chageListID = self.saveChange(); } if (!IsDefaultChangeList) { self.saveChange(); } return chageListID; }, /** * Sends an HTTP request to the TeaBuddy to start a preflight and Submit the changlist. */ preflightAndSubmit: function() { var chageListID = this.getOrCreateChangelist(); var shouldCloseJIRA = this.changelistView.getJIRAToBeClosedStatus(); var macroName = "QuickBuild.PreflightMacros.SubmitCodeChangelist"; var macroArguments = { changelistToPreflight: chageListID, closeJira: shouldCloseJIRA }; this.makeRequestToTeaBox(macroName, macroArguments); }, /** * Sends an HTTP request to the TeaBuddy to start a preflight. */ preflightOnly: function () { var chageListID = this.getOrCreateChangelist(); var macroName = "QuickBuild.PreflightMacros.PreflightCodeChangelist"; var macroArguments = { changelistToPreflight: chageListID }; this.makeRequestToTeaBox(macroName, macroArguments); }, validateAndSubmit: function () { var chageListID = this.getOrCreateChangelist(); var shouldCloseJIRA = this.changelistView.getJIRAToBeClosedStatus(); var macroName = "QuickBuild.PreflightMacros.SubmitDataChangelist"; var macroArguments = { changelistToPreflight: chageListID, closeJira: shouldCloseJIRA }; this.makeRequestToTeaBox(macroName, macroArguments); }, validate: function () { var chageListID = this.getOrCreateChangelist(); var macroName = "QuickBuild.PreflightMacros.PreflightDataChangelist"; var args = { changelistToPreflight: chageListID }; this.makeRequestToTeaBox(macroName, args); }, makeRequestToTeaBox: function (macroName, macroArguments) { var self = this; jQuery.ajax({ type: "POST", url: "http://127.0.0.1:4242/", data: JSON.stringify({ name: macroName, args: macroArguments }) }) .done(function(){ document.getElementById("http_error").style.display = "none"; self.closeSA(); }) .fail(function (jqHXR, textStatus, errorThrown) { var error = jqHXR.status >= 400 && jqHXR.status < 500 ? "Could not reach TeaBox. Please make sure it is running.
You can find it in: //JD_CODE//tools/apps/TeaBox/TeaBox.exe" : jqHXR.responseText; document.getElementById("http_error").innerHTML = "Error! " + error; document.getElementById("http_error").style.display = "block"; }); }, }); return SubmitAssistantView; });