adding messaging function, needs tests...
This commit is contained in:
@@ -1,14 +1,22 @@
|
|||||||
class MessagesController < ApplicationController
|
class MessagesController < ApplicationController
|
||||||
|
|
||||||
def index
|
def index
|
||||||
@messages = Message.where(:receiver_id => current_user.id)
|
@messages = current_user.messages
|
||||||
end
|
end
|
||||||
|
|
||||||
def show
|
def show
|
||||||
@message = Message.where(:id => params[:id])
|
@message = Message.where(:id => params[:id]).first
|
||||||
end
|
end
|
||||||
|
|
||||||
def delete
|
def destroy
|
||||||
|
message = Message.where(:id => params[:id]).first
|
||||||
|
|
||||||
|
if message.destroy
|
||||||
|
flash[:success] = "Your message has been deleted."
|
||||||
|
redirect_to user_messages_path(:user_id => current_user.user_id)
|
||||||
|
else
|
||||||
|
flash[:error] = "Could not delete message."
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def new
|
def new
|
||||||
@@ -16,6 +24,17 @@ class MessagesController < ApplicationController
|
|||||||
end
|
end
|
||||||
|
|
||||||
def create
|
def create
|
||||||
|
if Message.create(params[:message])
|
||||||
|
respond_to do |format|
|
||||||
|
format.html { redirect_to user_messages_path(:user_id => current_user.user_id) }
|
||||||
|
format.json { render :json => {:msg => "success"} }
|
||||||
|
end
|
||||||
|
else
|
||||||
|
respond_to do |format|
|
||||||
|
format.html { redirect_to user_messages_path }
|
||||||
|
format.json { render :json => {:msg => "failure"} }
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
@@ -1,5 +1,10 @@
|
|||||||
class Message < ActiveRecord::Base
|
class Message < ActiveRecord::Base
|
||||||
belongs_to :user
|
belongs_to :user
|
||||||
attr_accessible :creator_id, :message, :read, :receiver_id
|
attr_accessible :creator_id, :message, :read, :receiver_id
|
||||||
|
validates_presence_of :creator_id, :receiver_id, :message
|
||||||
|
|
||||||
|
def creator_name
|
||||||
|
creator = User.where(:id => self.creator_id).first
|
||||||
|
creator.full_name
|
||||||
|
end
|
||||||
end
|
end
|
||||||
+1
-1
@@ -17,7 +17,7 @@ class User < ActiveRecord::Base
|
|||||||
has_one :paid_time_off, :foreign_key => :user_id, :primary_key => :user_id, :dependent => :destroy
|
has_one :paid_time_off, :foreign_key => :user_id, :primary_key => :user_id, :dependent => :destroy
|
||||||
has_one :work_info, :foreign_key => :user_id, :primary_key => :user_id, :dependent => :destroy
|
has_one :work_info, :foreign_key => :user_id, :primary_key => :user_id, :dependent => :destroy
|
||||||
has_many :performance, :foreign_key => :user_id, :primary_key => :user_id, :dependent => :destroy
|
has_many :performance, :foreign_key => :user_id, :primary_key => :user_id, :dependent => :destroy
|
||||||
has_many :message, :foreign_key => :receiver_id, :dependent => :destroy
|
has_many :messages, :foreign_key => :receiver_id, :primary_key => :user_id, :dependent => :destroy
|
||||||
|
|
||||||
|
|
||||||
def build_benefits_data
|
def build_benefits_data
|
||||||
|
|||||||
@@ -5,24 +5,31 @@
|
|||||||
<div class="widget">
|
<div class="widget">
|
||||||
<div class="widget-header">
|
<div class="widget-header">
|
||||||
<div class="title">
|
<div class="title">
|
||||||
<span class="fs1" aria-hidden="true" data-icon=""></span> Messages for <%= current_user.full_name %>
|
<span class="fs1" aria-hidden="true" data-icon=""></span> Messages for <%= current_user.full_name %>
|
||||||
|
<span class="fs1" aria-hidden="true" data-icon=""><%= link_to "Send Message", new_user_message_path %></span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="widget-body">
|
<div class="widget-body">
|
||||||
<table class="table table-bordered table-striped">
|
<table class="table table-bordered table-striped">
|
||||||
<thead>
|
<thead>
|
||||||
<tr>
|
<tr>
|
||||||
<th style="width:10%">From:</th>
|
<th style="width:7%">From:</th>
|
||||||
<th style="width:8%">Date</th>
|
<th style="width:6%">Date</th>
|
||||||
<th style="width:16%">Message</th>
|
<th style="width:16%">Message</th>
|
||||||
|
<th style="width:6%">Actions</th>
|
||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
<% @messages.each do |message| %>
|
|
||||||
<tbody>
|
<tbody>
|
||||||
<tr>
|
<tr>
|
||||||
<td><%= message.creator_id %></td>
|
<% if @messages.empty? %>
|
||||||
<td><%= message.created_at %></td>
|
<td><%= "No messages!" %></td><td></td><td></td><td></td>
|
||||||
|
<% end %>
|
||||||
|
<% @messages.each do |message| %>
|
||||||
|
<td><%= message.creator_name %></td>
|
||||||
|
<td><%= message.created_at.to_date %></td>
|
||||||
<td><%= message.message %></td>
|
<td><%= message.message %></td>
|
||||||
|
<td><%= link_to "Details", user_message_path(:id => message.id), {:class => "btn btn-info pull-left"}%>
|
||||||
|
<%= link_to "Delete", user_message_path(:id => message.id), {:method => 'delete', :class => "btn btn-danger pull-left"}%></td>
|
||||||
</tr>
|
</tr>
|
||||||
</tbody>
|
</tbody>
|
||||||
<% end %>
|
<% end %>
|
||||||
@@ -33,139 +40,5 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!--/.fluid-container-->
|
|
||||||
</div>
|
|
||||||
<footer>
|
|
||||||
<p>
|
|
||||||
© BlackForest 2013
|
|
||||||
</p>
|
|
||||||
</footer>
|
|
||||||
<script src="js/jquery.min.js">
|
|
||||||
</script>
|
|
||||||
<script src="js/bootstrap.js">
|
|
||||||
</script>
|
|
||||||
<script type="text/javascript" src="js/date-picker/date.js">
|
|
||||||
</script>
|
|
||||||
<script type="text/javascript" src="js/date-picker/daterangepicker.js">
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<script type="text/javascript">
|
|
||||||
//ScrollUp
|
|
||||||
$(function () {
|
|
||||||
$.scrollUp({
|
|
||||||
scrollName: 'scrollUp', // Element ID
|
|
||||||
topDistance: '300', // Distance from top before showing element (px)
|
|
||||||
topSpeed: 300, // Speed back to top (ms)
|
|
||||||
animation: 'fade', // Fade, slide, none
|
|
||||||
animationInSpeed: 400, // Animation in speed (ms)
|
|
||||||
animationOutSpeed: 400, // Animation out speed (ms)
|
|
||||||
scrollText: 'Scroll to top', // Text for element
|
|
||||||
activeOverlay: false, // Set CSS color to display scrollUp active point, e.g '#00FFFF'
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
//Tooltip
|
|
||||||
$('a').tooltip('hide');
|
|
||||||
|
|
||||||
//Main menu navigation
|
|
||||||
|
|
||||||
$('.submenu > a').click(function(e){
|
|
||||||
e.preventDefault();
|
|
||||||
var submenu = $(this).siblings('ul');
|
|
||||||
var li = $(this).parents('li');
|
|
||||||
var submenus = $('#mainnav li.submenu ul');
|
|
||||||
var submenus_parents = $('#mainnav li.submenu');
|
|
||||||
if(li.hasClass('open'))
|
|
||||||
{
|
|
||||||
if(($(window).width() > 768) || ($(window).width() < 479)) {
|
|
||||||
submenu.slideUp();
|
|
||||||
} else {
|
|
||||||
submenu.fadeOut(250);
|
|
||||||
}
|
|
||||||
li.removeClass('open');
|
|
||||||
} else
|
|
||||||
{
|
|
||||||
if(($(window).width() > 768) || ($(window).width() < 479)) {
|
|
||||||
submenus.slideUp();
|
|
||||||
submenu.slideDown();
|
|
||||||
} else {
|
|
||||||
submenus.fadeOut(250);
|
|
||||||
submenu.fadeIn(250);
|
|
||||||
}
|
|
||||||
submenus_parents.removeClass('open');
|
|
||||||
li.addClass('open');
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
var ul = $('#mainnav > ul');
|
|
||||||
|
|
||||||
$('#mainnav > a').click(function(e)
|
|
||||||
{
|
|
||||||
e.preventDefault();
|
|
||||||
var mainnav = $('#mainnav');
|
|
||||||
if(mainnav.hasClass('open'))
|
|
||||||
{
|
|
||||||
mainnav.removeClass('open');
|
|
||||||
ul.slideUp(250);
|
|
||||||
} else
|
|
||||||
{
|
|
||||||
mainnav.addClass('open');
|
|
||||||
ul.slideDown(250);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
|
|
||||||
//Range Date Picker
|
|
||||||
|
|
||||||
$('.report_range').daterangepicker({
|
|
||||||
ranges: {
|
|
||||||
'Today': ['today', 'today'],
|
|
||||||
'Yesterday': ['yesterday', 'yesterday'],
|
|
||||||
'Last 7 Days': [Date.today().add({
|
|
||||||
days: -6
|
|
||||||
}), 'today'],
|
|
||||||
'Last 30 Days': [Date.today().add({
|
|
||||||
days: -29
|
|
||||||
}), 'today'],
|
|
||||||
'This Month': [Date.today().moveToFirstDayOfMonth(), Date.today().moveToLastDayOfMonth()],
|
|
||||||
'Last Month': [Date.today().moveToFirstDayOfMonth().add({
|
|
||||||
months: -1
|
|
||||||
}), Date.today().moveToFirstDayOfMonth().add({
|
|
||||||
days: -1
|
|
||||||
})]
|
|
||||||
},
|
|
||||||
opens: 'left',
|
|
||||||
format: 'MM/dd/yyyy',
|
|
||||||
separator: ' to ',
|
|
||||||
startDate: Date.today().add({
|
|
||||||
days: -29
|
|
||||||
}),
|
|
||||||
endDate: Date.today(),
|
|
||||||
minDate: '01/01/2012',
|
|
||||||
maxDate: '12/31/2013',
|
|
||||||
locale: {
|
|
||||||
applyLabel: 'Submit',
|
|
||||||
fromLabel: 'From',
|
|
||||||
toLabel: 'To',
|
|
||||||
customRangeLabel: 'Custom Range',
|
|
||||||
daysOfWeek: ['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa'],
|
|
||||||
monthNames: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'June', 'July', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],
|
|
||||||
firstDay: 1
|
|
||||||
},
|
|
||||||
showWeekNumbers: true,
|
|
||||||
buttonClasses: ['btn-danger']
|
|
||||||
},
|
|
||||||
|
|
||||||
function (start, end) {
|
|
||||||
$('.report_range span').html(start.toString('MMMM d, yyyy') + ' - ' + end.toString('MMMM d, yyyy'));
|
|
||||||
});
|
|
||||||
|
|
||||||
//Set the initial state of the picker label
|
|
||||||
$('.report_range span').html(Date.today().add({
|
|
||||||
days: -29
|
|
||||||
}).toString('MMMM d, yyyy') + ' - ' + Date.today().toString('MMMM d, yyyy'));
|
|
||||||
</script>
|
|
||||||
|
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
@@ -0,0 +1,88 @@
|
|||||||
|
<div class="dashboard-wrapper">
|
||||||
|
<div class="main-container">
|
||||||
|
<div class="row-fluid">
|
||||||
|
<div class="span12">
|
||||||
|
<div id="success" style="display: none;" class="alert alert-block alert-success fade in">
|
||||||
|
<h4 class="alert-heading">
|
||||||
|
Success!
|
||||||
|
</h4>
|
||||||
|
<p>
|
||||||
|
Message successfully sent.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="row-fluid">
|
||||||
|
<div class="span12">
|
||||||
|
<div id="failure" style="display: none;" class="alert alert-block alert-error fade in">
|
||||||
|
<h4 class="alert-heading">
|
||||||
|
Error!
|
||||||
|
</h4>
|
||||||
|
<p>
|
||||||
|
Failed to send message.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="row-fluid">
|
||||||
|
<div class="span6">
|
||||||
|
<div class="widget">
|
||||||
|
<div class="widget-header">
|
||||||
|
<div class="title">
|
||||||
|
<span class="fs1" aria-hidden="true" data-icon=""></span> New Message</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="widget-body">
|
||||||
|
<%= form_for @message, :url => user_messages_path, :method => :post, :html => {:id => "send_message"} do |f|%>
|
||||||
|
<%= f.hidden_field :creator_id, :value => current_user.id %>
|
||||||
|
<%= f.hidden_field :read, :value => '0' %>
|
||||||
|
<div class="control-group">
|
||||||
|
<%= f.label "To:", nil, {:class => "control-label"}%>
|
||||||
|
<%= f.select(:receiver_id, options_from_collection_for_select(User.all, :id, :full_name)) %>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="control-group">
|
||||||
|
<%= f.label :message, nil, {:class => "control-label"}%>
|
||||||
|
<%= f.text_area :message, {:class => "span12"} %>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="form-actions no-margin">
|
||||||
|
<%= f.submit "Submit", {:id => 'submit_button', :class => "btn btn-info pull-right"} %>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="clearfix"></div>
|
||||||
|
<% end %>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<%= javascript_include_tag ('validation.js')%>
|
||||||
|
|
||||||
|
<script type="text/javascript">
|
||||||
|
|
||||||
|
$("#submit_button").click(function(event) {
|
||||||
|
var valuesToSubmit = $("#send_message").serialize();
|
||||||
|
event.preventDefault();
|
||||||
|
$.ajax({
|
||||||
|
url: <%= "/users/#{current_user.user_id}/messages.json".inspect.html_safe %>,
|
||||||
|
data: valuesToSubmit,
|
||||||
|
type: "POST",
|
||||||
|
success: function(response) {
|
||||||
|
if (response.msg == "failure") {
|
||||||
|
$('#failure').show(500).delay(1500).fadeOut();
|
||||||
|
} else {
|
||||||
|
$('#success').show(500).delay(1500).fadeOut();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
error: function(event) {
|
||||||
|
$('#failure').show(500).delay(1500).fadeOut();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
</script>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -0,0 +1,171 @@
|
|||||||
|
<div class="dashboard-wrapper">
|
||||||
|
<div class="main-container">
|
||||||
|
<div class="row-fluid">
|
||||||
|
<div class="span12">
|
||||||
|
<div class="widget">
|
||||||
|
<div class="widget-header">
|
||||||
|
<div class="title">
|
||||||
|
<span class="fs1" aria-hidden="true" data-icon=""></span> Messages for <%= current_user.full_name %>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="widget-body">
|
||||||
|
<table class="table table-bordered table-striped">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th style="width:7%">From:</th>
|
||||||
|
<th style="width:6%">Date</th>
|
||||||
|
<th style="width:30%">Message</th>
|
||||||
|
<th style="width:6%">Actions</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
<tr>
|
||||||
|
<td><%= @message.creator_name %></td>
|
||||||
|
<td><%= @message.created_at.to_date %></td>
|
||||||
|
<td><%= @message.message %></td>
|
||||||
|
<td><%= link_to "Delete", user_message_path, {:id => "@message.id", :method => 'delete', :class => "btn btn-danger pull-left"}%></td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!--/.fluid-container-->
|
||||||
|
</div>
|
||||||
|
<footer>
|
||||||
|
<p>
|
||||||
|
© BlackForest 2013
|
||||||
|
</p>
|
||||||
|
</footer>
|
||||||
|
<script src="js/jquery.min.js">
|
||||||
|
</script>
|
||||||
|
<script src="js/bootstrap.js">
|
||||||
|
</script>
|
||||||
|
<script type="text/javascript" src="js/date-picker/date.js">
|
||||||
|
</script>
|
||||||
|
<script type="text/javascript" src="js/date-picker/daterangepicker.js">
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<script type="text/javascript">
|
||||||
|
//ScrollUp
|
||||||
|
$(function () {
|
||||||
|
$.scrollUp({
|
||||||
|
scrollName: 'scrollUp', // Element ID
|
||||||
|
topDistance: '300', // Distance from top before showing element (px)
|
||||||
|
topSpeed: 300, // Speed back to top (ms)
|
||||||
|
animation: 'fade', // Fade, slide, none
|
||||||
|
animationInSpeed: 400, // Animation in speed (ms)
|
||||||
|
animationOutSpeed: 400, // Animation out speed (ms)
|
||||||
|
scrollText: 'Scroll to top', // Text for element
|
||||||
|
activeOverlay: false, // Set CSS color to display scrollUp active point, e.g '#00FFFF'
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
//Tooltip
|
||||||
|
$('a').tooltip('hide');
|
||||||
|
|
||||||
|
//Main menu navigation
|
||||||
|
|
||||||
|
$('.submenu > a').click(function(e){
|
||||||
|
e.preventDefault();
|
||||||
|
var submenu = $(this).siblings('ul');
|
||||||
|
var li = $(this).parents('li');
|
||||||
|
var submenus = $('#mainnav li.submenu ul');
|
||||||
|
var submenus_parents = $('#mainnav li.submenu');
|
||||||
|
if(li.hasClass('open'))
|
||||||
|
{
|
||||||
|
if(($(window).width() > 768) || ($(window).width() < 479)) {
|
||||||
|
submenu.slideUp();
|
||||||
|
} else {
|
||||||
|
submenu.fadeOut(250);
|
||||||
|
}
|
||||||
|
li.removeClass('open');
|
||||||
|
} else
|
||||||
|
{
|
||||||
|
if(($(window).width() > 768) || ($(window).width() < 479)) {
|
||||||
|
submenus.slideUp();
|
||||||
|
submenu.slideDown();
|
||||||
|
} else {
|
||||||
|
submenus.fadeOut(250);
|
||||||
|
submenu.fadeIn(250);
|
||||||
|
}
|
||||||
|
submenus_parents.removeClass('open');
|
||||||
|
li.addClass('open');
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
var ul = $('#mainnav > ul');
|
||||||
|
|
||||||
|
$('#mainnav > a').click(function(e)
|
||||||
|
{
|
||||||
|
e.preventDefault();
|
||||||
|
var mainnav = $('#mainnav');
|
||||||
|
if(mainnav.hasClass('open'))
|
||||||
|
{
|
||||||
|
mainnav.removeClass('open');
|
||||||
|
ul.slideUp(250);
|
||||||
|
} else
|
||||||
|
{
|
||||||
|
mainnav.addClass('open');
|
||||||
|
ul.slideDown(250);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
//Range Date Picker
|
||||||
|
|
||||||
|
$('.report_range').daterangepicker({
|
||||||
|
ranges: {
|
||||||
|
'Today': ['today', 'today'],
|
||||||
|
'Yesterday': ['yesterday', 'yesterday'],
|
||||||
|
'Last 7 Days': [Date.today().add({
|
||||||
|
days: -6
|
||||||
|
}), 'today'],
|
||||||
|
'Last 30 Days': [Date.today().add({
|
||||||
|
days: -29
|
||||||
|
}), 'today'],
|
||||||
|
'This Month': [Date.today().moveToFirstDayOfMonth(), Date.today().moveToLastDayOfMonth()],
|
||||||
|
'Last Month': [Date.today().moveToFirstDayOfMonth().add({
|
||||||
|
months: -1
|
||||||
|
}), Date.today().moveToFirstDayOfMonth().add({
|
||||||
|
days: -1
|
||||||
|
})]
|
||||||
|
},
|
||||||
|
opens: 'left',
|
||||||
|
format: 'MM/dd/yyyy',
|
||||||
|
separator: ' to ',
|
||||||
|
startDate: Date.today().add({
|
||||||
|
days: -29
|
||||||
|
}),
|
||||||
|
endDate: Date.today(),
|
||||||
|
minDate: '01/01/2012',
|
||||||
|
maxDate: '12/31/2013',
|
||||||
|
locale: {
|
||||||
|
applyLabel: 'Submit',
|
||||||
|
fromLabel: 'From',
|
||||||
|
toLabel: 'To',
|
||||||
|
customRangeLabel: 'Custom Range',
|
||||||
|
daysOfWeek: ['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa'],
|
||||||
|
monthNames: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'June', 'July', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],
|
||||||
|
firstDay: 1
|
||||||
|
},
|
||||||
|
showWeekNumbers: true,
|
||||||
|
buttonClasses: ['btn-danger']
|
||||||
|
},
|
||||||
|
|
||||||
|
function (start, end) {
|
||||||
|
$('.report_range span').html(start.toString('MMMM d, yyyy') + ' - ' + end.toString('MMMM d, yyyy'));
|
||||||
|
});
|
||||||
|
|
||||||
|
//Set the initial state of the picker label
|
||||||
|
$('.report_range span').html(Date.today().add({
|
||||||
|
days: -29
|
||||||
|
}).toString('MMMM d, yyyy') + ' - ' + Date.today().toString('MMMM d, yyyy'));
|
||||||
|
</script>
|
||||||
|
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
Reference in New Issue
Block a user