GIF89a;
| Direktori : /home/serb/www/livechat/js/app/view/admin/ |
| Current File : /home/serb/www/livechat/js/app/view/admin/CannedMessagesView.js |
//==============================================================================
//
// Canned messages view
//
//==============================================================================
(function(app, $, _, config)
{
app.CannedMessagesView = Backbone.View.extend({
events : {
'click #customer-chat-canned-messages-back' : 'showList',
'click #customer-chat-canned-messages-add' : 'showAdd',
'click .customer-chat-canned-messages-edit' : 'showEdit',
'click .customer-chat-canned-messages-remove' : 'deleteMessage',
'click #customer-chat-canned-messages-save' : 'save'
},
initialize : function()
{
// Initialize models
this.model = app.model.cannedMessages;
this.user = app.model.user;
// Cache view elements
this.$list = this.$('#customer-chat-canned-messages-list');
this.$messages = this.$list.find('.customer-chat-content-messages-wrapper');
this.$edit = this.$('#customer-chat-canned-messages-edit');
this.$save = this.$('#customer-chat-canned-messages-save');
this.$back = this.$('#customer-chat-canned-messages-back');
this.$editInputs = this.$edit.find('input');
this.$loading = this.$('.customer-chat-content-loading-icon').hide();
this.$editInputs.blur($.proxy(this.validateEdit, this));
// Handle rendering
this.model.on('change:messages', this.render, this);
this.showList();
this.render();
},
render : function()
{
// Display all of the messages
this.$messages.html('');
var _this = this;
_.each(this.model.get('messages'), function(message)
{
var $item = $(app.template.cannedMessageItem);
// Fill the element with data
$item.find('.customer-chat-canned-message-name').html(message.name);
$item.find('.customer-chat-canned-message-body').html(message.body);
$item.find('.customer-chat-canned-messages-edit') .data('id', message.id);
$item.find('.customer-chat-canned-messages-remove').data('id', message.id);
// Add message to the list
_this.$messages.append($item);
});
},
showList : function()
{
// Store the state
this.state = 'list';
this.$edit.hide();
this.$list.show();
this.enable();
},
showEdit : function(evt, id)
{
var _this = this;
// Store the state
var prevState = this.state;
this.state = 'edit';
// Hide add mode-specific fields
this.$edit.find('.add-only').hide();
this.$edit.find('.edit-only').show();
// Remove old validation classes
this.$edit.find('.customer-chat-input-error').removeClass('customer-chat-input-error');
// Get the message
var $link = evt ? $(evt.currentTarget) : null;
var messageId, message;
// Get the edited message
messageId = $link ? $link.data('id') : id;
message = app.model.selectedMessage = this.model.getById(messageId);
// Show the edit form with message's data
if(message)
{
this.$edit.find('#messageNameField').val(message.name);
this.$edit.find('#messageBodyField').val(message.body);
}
this.$list.hide();
this.$edit.show();
},
deleteMessage : function(evt)
{
var $link = $(evt.currentTarget);
// Get the message in question
var message = this.model.getById($link.data('id'));
// Ask for confirmation
var _this = this;
var buttons = {};
buttons['Remove "%message%"'.replace('%message%', message.name)] = function()
{
// Remove the message
_this.model.deleteMessage(message.id);
$(this).dialog('close');
// Update the scroller
$(window).trigger('resize');
};
app.view.dialogs.confirm(
'Remove "%message%"?'.replace('%message%', message.name),
'Are you sure you want to permanently delete this message?',
buttons
);
},
showAdd : function()
{
// Store the state
this.state = 'add';
// Update tab's header
this.$edit.find('.customer-chat-tabs-header').html('Add new message');
// Show add mode-specific fields
this.$edit.find('.edit-only, .pass-only').hide();
this.$edit.find('.add-only').show();
// Remove old validation classes
this.$edit.find('.customer-chat-input-error').removeClass('customer-chat-input-error');
// Create a new user
app.model.selectedMessage = {};
// Show the edit form with empty data
this.$edit.find('#messageNameField').val('');
this.$edit.find('#messageBodyField').val('');
this.$list.hide();
this.$edit.show();
},
showChangePassword : function()
{
// Store the state
this.state = 'pass';
// Update tab's header
this.$edit.find('.customer-chat-tabs-header').html('Change password');
// Show add mode-specific fields
this.$edit.find('.edit-only, .add-only').hide();
this.$edit.find('.pass-only').show();
if(this.user.hasRole('ADMIN')) this.$edit.find('.current-pass').hide();
// Remove old validation classes
this.$edit.find('.customer-chat-input-error').removeClass('customer-chat-input-error');
// Show the change password form with empty data
this.$edit.find('#changePassCurrentField').val('');
this.$edit.find('#changePassField') .val('');
this.$edit.find('#changePassRetypeField') .val('');
this.$list.hide();
this.$edit.show();
},
save : function()
{
// Return if data not valid
if(!this.isEditValid())
{
return;
}
// Don't allow the operation to run second time simultaneously
if(this.syncing)
{
return;
}
this.disable();
// Update message's data
var message = app.model.selectedMessage;
if(message)
{
message.name = this.$edit.find('#messageNameField').val();
message.body = this.$edit.find('#messageBodyField').val();
var _this = this;
this.model.once('message:saved', function(errors)
{
_this.enable();
_this.showList();
});
this.model.once('message:saveError', function(errors)
{
_this.enable();
app.view.dialogs.formError('Form error', _.values(errors));
});
this.model.saveMessage(message);
}
else
{
this.enable();
}
},
disable : function()
{
this.syncing = true;
this.$save.addClass('button-disabled');
this.$loading.fadeIn();
},
enable : function()
{
var _this = this;
setTimeout(function()
{
_this.$save.removeClass('button-disabled');
_this.$loading.fadeOut();
_this.syncing = false;
if(_this.state == 'add')
{
_this.showList();
}
}, 500);
},
validateEdit : function(evt, full)
{
this.errors = false;
var _this = this;
var $inputs = full ? this.$editInputs : $(evt.target);
if(!full)
{
var matchFieldId = $(evt.target).data('validator-match');
if(matchFieldId)
{
$inputs = $inputs.add(_this.$el.find('#' + matchFieldId));
}
}
_this.errors = [];
function addError($el, msg)
{
$el.addClass('customer-chat-input-error');
if($el.data('validator-msg') !== false)
{
var label = $el.data('validator-label');
if(label) msg = label + ': ' + msg;
_this.errors.push(msg);
}
else
{
_this.errors.push(false);
}
}
$inputs.each(function()
{
var $el = $(this);
// Skip validation if specific state is defined
var state = $el.data('validator-state');
var exState = $el.data('validator-state-ex'); // Exclusive state (not to validate if in this state)
if(state && state !== _this.state) return;
if(exState && exState === _this.state) return;
// Reset validation style
$el.removeClass('customer-chat-input-error');
// Perform validation
switch($el.data('validator'))
{
case 'notEmpty':
if($el.val().length == 0)
{
addError($el, 'Value cannot be empty');
}
break;
}
var matchFieldId = $el.data('validator-match');
if(matchFieldId)
{
var $matchEl = _this.$el.find('#' + matchFieldId);
if($el.val() !== $matchEl.val())
{
addError($el, 'Passwords have to match');
}
}
});
// Display error messages
if(full && this.errors.length > 0)
{
app.view.dialogs.formError('Form error', this.errors);
}
},
isEditValid : function()
{
this.validateEdit(null, true);
return this.errors.length === 0;
}
});
})(window.Application, jQuery, _, window.chatConfig);