You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
SIPRP/trunk/SiprpWebFichasClinicas/WebContent/static/html/app/Main/MainController.js

603 lines
19 KiB

evoapp.controller('MainController', function($rootScope, $scope, $timeout, $compile, $injector, $filter, globals)
{
var me = this;
$scope.storeUserSession = new globals.dataService.store({
model: null,
actions: {
get: 'checkLogin',
destroy: 'doLogout'
}
});
$scope.storeUserSession.broadcastEvents = true;
//will contain all user session info ...
$rootScope.UserSession = null;
//will contain all the application HTML
$scope.viewCache = null;
//the last module rendered by method renderModule.
$scope.moduleRendered = null;
$scope.idCounter = 0;
$scope.currentModuleName = null;
//loaded modules in main view
$scope.loadedModules = [];
//current module in view
$scope.currentModule = null;
$scope.menuItems = [];
//if true, indicates a session timeout
$scope.sessionTimeout = false;
$scope.beforeSessionTimeoutModule = null;
//this div will contain all modules currently not in view
var divTemp = $('<div></div>');
//MAIN APP ENTRANCE
$scope.boot = function(){
$scope.divMainPanel = $('body #main-panel');
$scope.storeUserSession.get(function(response, status, headers, config, items){
if(response.success)
{
//TODO: repeated code ???
$('#main-panel').show();
//globals.plugins.setDefaults();
//globals.plugins.setBootstrap();
$rootScope.$broadcast('loadingStatusInactive');
$rootScope.$emit('onloginsuccessfull', {response: response});
}
else
{
$scope.renderModule('body #main-panel', 'Login', null, true, function(className, scope){
$timeout(function() {
//TODO: repeated code ???
$('#main-panel').show();
//globals.plugins.setDefaults();
//globals.plugins.setBootstrap();
$rootScope.$broadcast('loadingStatusInactive');
});
});
}
});
};
$rootScope.$on('onloginsuccessfull', function(event, args){
//set user session
$rootScope.UserSession = {
userName: args.response.data.username,
tiposFichas: globals.staticData.tiposFichas //TODO: this one needs to come from database
};
// go to the default module and/or landing page
$scope.loadModule({Controller: 'Search'}, function(className, scope, isNewModule){
});
});
//creates/renders a new controller+view into the given placeholder
$scope.renderModule = function(placeholder, className, parameters, broadcastCreation, callback){
var view = (className + 'View'),
controller = (className + 'Controller'),
placeholder = $(placeholder),
domEl = $scope.viewCache.find('#' + view);
if(placeholder.length == 0)
{
throw Error('placeholder ' + placeholder.selector + ' not found!');
}
if(domEl.length > 1)
{
throw Error('more than one view ' + view + ' was found!');
}
if(domEl.length > 0)
{
var html = domEl[0].outerHTML,
controllerView = $(html);
controllerView.attr('ng-controller', controller);
controllerView.attr('id', (view + '-' + $scope.idCounter));
$scope.idCounter++;
html = controllerView[0].outerHTML;
controllerView = $(html);
$injector.invoke(function($rootScope, $compile) {
var compiled = $compile(controllerView)($scope);
placeholder.append(compiled);
var scope = angular.element(compiled).scope();
//add view dom el reference
scope.domEl = $(controllerView[0]);
//¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨
//TODO: WE MIGHT NEED TO ITERATE VIEW TO FIND ALL FORM ELEMENTS AND DO THE SAME AS BELLOW:
//add view form dom el reference if available - the default is editForm
//we cannot be using this fixed form name: editForm !!!???
var editForm = scope.domEl.find('form[name="editForm"]:first');
if(editForm.length > 0 && scope.editForm)
{
scope.editForm['domEl'] = $(editForm[0]);
if(scope.editForm.domEl != undefined && scope.editForm.domEl != null)
{
//reset form function - clear all fields values
scope.editForm['$reset'] = function(){
scope.editForm.domEl.parsley('destroy');
//TODO: should we clear all others fields this way also?
//clear all datepicker fields
var datePickers = scope.editForm.domEl.find('input[datepicker]');
if(datePickers.length > 0)
{
$.each(datePickers, function(index, el) {
$(el).val(null);
});
}
};
//is valid function
scope.editForm['$isValid'] = function(){
return scope.editForm.domEl.parsley('validate');
};
//add/remove from a specific field all the parsley validations (required)
scope.editForm['$removeConstraints'] = function(field, remove){
var fieldDomEl = null;
if(angular.isString(field))
{
fieldDomEl = scope.domEl.find('[name="' + field + '"]:first');
}
else
{
fieldDomEl = field;
}
if(fieldDomEl.length > 0)
{
var fieldEl = $(fieldDomEl[0]);
scope.editForm.domEl.parsley('removeItem', fieldEl);
if(!remove)
{
scope.editForm.domEl.parsley('addItem', fieldEl);
fieldEl.parsley('addConstraint', {'required': true });
}
}
};
scope.editForm['$setDisabled'] = function(disabled){
var fields = scope.editForm.domEl.find('input, select, textarea');
angular.forEach(fields, function (fieldEl) {
var field = $(fieldEl);
if(disabled)
{
field.prop('disabled', true);
}
else
{
field.prop('disabled', false);
}
});
};
//add names to fields who do not have one
var fields = scope.editForm.domEl.find('input[type=checkbox], input[type=radio]');
if(fields.length > 0)
{
var fieldNameCounter = 0;
angular.forEach(fields, function (fieldEl) {
var field = $(fieldEl),
name = field.prop('name'),
type = field.attr('type');
if(name == '')
{
var newFieldName = (type + '-' + fieldNameCounter);
field.prop('name', newFieldName);
fieldNameCounter++;
}
});
}
}
}
//pass parameters to controller, if available.
if(parameters != null)
{
//new controller scope
angular.extend(scope, parameters);
}
//set control class name
scope.ClassName = className;
//notify listeners that a new controller as been created
if(broadcastCreation)
{
$scope.moduleRendered = scope;
}
//broadcast afterrender event
scope.$broadcast('afterrender');
//¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨
//Inject plugins, etc...
globals.plugins.setBootstrap();
//mantain the correct hashtag
window.location.hash = '#/' + className;
$timeout(function() {
controllerView.removeClass('hidden');
//execute callback if available
if(callback != undefined)
{
globals.utils.passArguments(callback, [className, scope]);
}
});
});
}
else
{
throw Error('Controller/View ' + view + ' not found!');
}
};
//load a module into view or render it if it never as been loaded
$scope.loadModule = function(subModule, callback, configs){
$timeout(function() {
var module = $scope.getModule(subModule.Controller);
var isNewModule = module == null;
//render module if not rendered yet...
if(module == null)
{
$scope.$emit('onBeforeMainPanelChange', {mainPanel: $scope.divMainPanel, module: module});
$scope.renderModule('body #main-panel', subModule.Controller, (configs || null), true, function(className, scope){
$("body, html").animate({scrollTop : 0}, 0);
$scope.$emit('onAfterMainPanelChange', {mainPanel: $scope.divMainPanel, module: module});
//execute callback if available
if(callback != undefined)
{
globals.utils.passArguments(callback, [className, scope, isNewModule]);
}
});
}
else
{
//mantain the correct hashtag
window.location.hash = '#/' + module.ClassName;
$scope.showModule(module);
$("body, html").animate({scrollTop : 0}, 0);
//execute callback if available
if(callback != undefined)
{
globals.utils.passArguments(callback, [module.Controller, module, isNewModule]);
}
}
$scope.currentModuleName = subModule.Controller;
});
};
$scope.showModule = function(module){
if($scope.currentModule != null)
{
//remove current module from main-panel
$scope.currentModule.domEl.appendTo(divTemp);
}
$scope.currentModule = module;
var isInMainPanel = ($scope.divMainPanel.find(module.domEl).length > 0);
if(!isInMainPanel)
{
$scope.$emit('onBeforeMainPanelChange', {mainPanel: $scope.divMainPanel, module: module});
//add current module to main-panel if not there yet
module.domEl.appendTo($scope.divMainPanel);
$scope.$emit('onAfterMainPanelChange', {mainPanel: $scope.divMainPanel, module: module});
}
};
$scope.$on('onBeforeMainPanelChange', function(event, args){
//$rootScope.$broadcast('loadingStatusActive');
//$(args.mainPanel).hide();
});
$scope.$on('onAfterMainPanelChange', function(event, args){
$timeout(function () {
//$(args.mainPanel).fadeIn();
//$rootScope.$broadcast('loadingStatusInactive');
}, 0);
});
$scope.getModule = function(className){
var module = _.where($scope.loadedModules, {ClassName: className});
return module.length > 0 ? module[0] : null;
};
//TODO: REMOVE TOP MENU LOGIC FROM HERE!!!
$scope.buildTopMenu = function(){
$scope.menuItems = [
{
Name: 'Form 1',
Controller: 'Form1',
SubMenuItems: []
},
{
Name: 'Form2',
Controller: 'Form2',
SubMenuItems: []
}
];
};
$scope.selectMenuItem = function(item){
if(item.Controller != null)
{
$scope.loadModule(item, function(className, scope, isNewModule){
});
}
};
// executes a logout from the application and perfomrs cleanup operations
$scope.logout = function(){
globals.message.confirm({
question: 'Tem a certeza que deseja sair?',
answer: function(result){
if(result)
{
$rootScope.$broadcast('loadingStatusActive');
$scope.storeUserSession.destroy(null, function(response){
$rootScope.$broadcast('loadingStatusInactive');
if(response.success)
{
$scope.clearSession();
$scope.loadModule({Controller: 'Login'}, function(className, scope, isNewModule){
});
}
else
{
}
});
}
}
});
};
// cleanup all session objects
$scope.clearSession = function(){
$rootScope.UserSession = null;
$scope.currentModuleName = null;
$scope.loadedModules = [];
$scope.currentModule = null;
divTemp.empty();
$('#main-panel').empty();
};
$rootScope.$on('loadingStatusActive', function(event, args){
$('body').modalmanager('loading');
});
$rootScope.$on('loadingStatusInactive', function(event, args){
$('body').modalmanager('removeLoading');
//this on restores the body scrollbar
//$('body').removeClass('modal-open');
});
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
// SERVER RESPONSE
$scope.FirstMessage = null;
$scope.MessageCount = 0;
$scope.isTimerRunning = false;
$scope.ServerResponse = [];
$scope.notification = null;
$scope.defaultExceptionMessage = {
success: false,
data: null,
messages: [
{
type: 'ERROR',
messageData: 'Ocorreu um erro de sistema.'
}
]
};
$rootScope.$on('response', function(event, args){
var response = args.response, msgCss = 'default';
if(response.data == undefined || response.messages == undefined)
{
response = $scope.defaultExceptionMessage;
}
if(response != undefined && response != null && response.messages.length > 0)
{
$scope.ServerResponse = response;
$scope.FirstMessage = response.messages[0];
msgCss = globals.utils.getMessageTypeCSS($scope.FirstMessage.type);
$scope.MessageCount = response.messages.length;
}
if($scope.notification != null)
{
$scope.notification.close();
}
$scope.notification = noty({
layout: 'topRight',
text: $scope.FirstMessage.messageData,
maxVisible: 1,
template:
'<div ng-click="viewServerResponse()" class="bg-' + msgCss + ' noty_message">' +
'<span ng-show="MessageCount > 1" class="label label-default pull-left noty-label">+{{MessageCount-1}}</span>' +
'<span class="noty_text"></span>' +
'<div class="noty_close"></div>' +
'</div>',
timeout: 6000,
animation: {
open: {opacity: 'toggle'},
close: {opacity: 'toggle'},
easing: 'swing',
speed: 125
},
closeWith: ['button'],
});
$compile($scope.notification.$bar[0])($scope);
});
$scope.viewServerResponse = function(){
if($scope.notification != null)
{
$scope.notification.close();
}
//TODO: show all messages modal window ?
//$scope.windowViewServerResponse.show();
//$scope.windowViewServerResponse.viewController.list($scope.ServerResponse);
};
$rootScope.$on('onsessiontimeout', function(event, args){
var eee = args.response;
$scope.sessionTimeout = true;
$scope.beforeSessionTimeoutModule = $scope.currentModule;
$scope.loadModule({Controller: 'Login'}, function(className, scope, isNewModule){
});
});
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
//fires whenever a new module is rendered, if broadcastCreation is true on method renderModule
$scope.$watch('moduleRendered', function(newVal, oldVal){
if(newVal != null)
{
var module = $scope.getModule(newVal.ClassName);
if(module == null)
{
$scope.loadedModules.push(newVal);
$scope.showModule(newVal);
$scope.currentModule = newVal;
}
else
{
$scope.currentModule = module;
}
}
});
});