Added meta where and jquery observe field. Fixed members view.

This commit is contained in:
benni 2011-05-15 23:43:23 +02:00
parent 6c98c7c755
commit c87ead8da9
10 changed files with 102 additions and 51 deletions

View file

@ -11,6 +11,7 @@ gem "will_paginate", "~> 3.0.pre2"
gem 'jquery-rails' gem 'jquery-rails'
gem 'simple_form' gem 'simple_form'
gem 'rails3_acts_as_paranoid' gem 'rails3_acts_as_paranoid'
gem 'meta_where'
group :development do group :development do
gem 'annotate' gem 'annotate'

View file

@ -46,6 +46,10 @@ GEM
i18n (>= 0.4.0) i18n (>= 0.4.0)
mime-types (~> 1.16) mime-types (~> 1.16)
treetop (~> 1.4.8) treetop (~> 1.4.8)
meta_where (1.0.4)
activerecord (~> 3.0.0)
activesupport (~> 3.0.0)
arel (~> 2.0.7)
mime-types (1.16) mime-types (1.16)
mysql (2.8.1) mysql (2.8.1)
polyglot (0.3.1) polyglot (0.3.1)
@ -97,6 +101,7 @@ DEPENDENCIES
haml haml
hirb hirb
jquery-rails jquery-rails
meta_where
mysql mysql
prawn (<= 0.6.3) prawn (<= 0.6.3)
rails (= 3.0.7) rails (= 3.0.7)

View file

@ -1,16 +1,18 @@
class Foodcoop::UsersController < ApplicationController class Foodcoop::UsersController < ApplicationController
def index def index
@users = User.order(:nick.asc)
# if somebody uses the search field:
unless params[:query].blank?
@users = @users.where(({:first_name.matches => "%#{params[:query]}%"}) | ({:last_name.matches => "%#{params[:query]}%"}) | ({:nick.matches => "%#{params[:query]}%"}))
end
# sort by ordergroups # sort by ordergroups
if params[:sort_by_ordergroups] # if params[:sort_by_ordergroups]
@users = [] # @users = @users.joins(:ordergroup).order(:ordergroup => :name.asc) # Retunr dubbled entries, why?
Ordergroup.find(:all, :order => "name").each do |group| # end
group.users.each do |user|
@users << user
end
end
@total = @users.size
else
# sort by nick, thats default # sort by nick, thats default
if (params[:per_page] && params[:per_page].to_i > 0 && params[:per_page].to_i <= 100) if (params[:per_page] && params[:per_page].to_i > 0 && params[:per_page].to_i <= 100)
@per_page = params[:per_page].to_i @per_page = params[:per_page].to_i
@ -18,19 +20,11 @@ class Foodcoop::UsersController < ApplicationController
@per_page = 20 @per_page = 20
end end
# if somebody uses the search field: @users = @users.paginate(:page => params[:page], :per_page => @per_page)
unless params[:query].blank?
conditions = ["first_name LIKE ? OR last_name LIKE ? OR nick LIKE ?",
"%#{params[:query]}%", "%#{params[:query]}%", "%#{params[:query]}%"]
end
@total = User.count(:conditions => conditions)
@users = User.paginate(:page => params[:page], :per_page => @per_page, :conditions => conditions, :order => "nick", :include => :groups)
respond_to do |format| respond_to do |format|
format.html # index.html.erb format.html # index.html.haml
format.js { render :partial => "users" } format.js { render :layout => false } # index.js.erb
end
end end
end end

View file

@ -8,6 +8,8 @@ class Group < ActiveRecord::Base
validates_uniqueness_of :name validates_uniqueness_of :name
validate :last_admin_on_earth, :on => :update validate :last_admin_on_earth, :on => :update
before_destroy :check_last_admin_group
# Returns true if the given user if is an member of this group. # Returns true if the given user if is an member of this group.
def member?(user) def member?(user)
memberships.find_by_user_id(user.id) memberships.find_by_user_id(user.id)
@ -18,15 +20,15 @@ class Group < ActiveRecord::Base
User.all(:order => 'nick').reject { |u| users.include?(u) } User.all(:order => 'nick').reject { |u| users.include?(u) }
end end
protected
# Check before destroy a group, if this is the last group with admin role # Check before destroy a group, if this is the last group with admin role
def before_destroy def check_last_admin_group
if self.role_admin == true && Group.find_all_by_role_admin(true).size == 1 if self.role_admin == true && Group.find_all_by_role_admin(true).size == 1
raise "Die letzte Gruppe mit Admin-Rechten darf nicht gelöscht werden" raise "Die letzte Gruppe mit Admin-Rechten darf nicht gelöscht werden"
end end
end end
protected
# validates uniqueness of the Group.name. Checks groups and ordergroups # validates uniqueness of the Group.name. Checks groups and ordergroups
def validate def validate
errors.add(:name, "ist schon vergeben") if (group = Group.find_by_name(name) || group = Ordergroup.find_by_name(name)) && self != group errors.add(:name, "ist schon vergeben") if (group = Group.find_by_name(name) || group = Ordergroup.find_by_name(name)) && self != group

View file

@ -3,11 +3,15 @@ class Membership < ActiveRecord::Base
belongs_to :user belongs_to :user
belongs_to :group belongs_to :group
before_destroy :check_last_admin
# messages # messages
ERR_NO_ADMIN_MEMBER_DELETE = "Mitgliedschaft kann nicht beendet werden. Du bist die letzte Administratorin" ERR_NO_ADMIN_MEMBER_DELETE = "Mitgliedschaft kann nicht beendet werden. Du bist die letzte Administratorin"
protected
# check if this is the last admin-membership and deny # check if this is the last admin-membership and deny
def before_destroy def check_last_admin
raise ERR_NO_ADMIN_MEMBER_DELETE if self.group.role_admin? && self.group.memberships.size == 1 && Group.find_all_by_role_admin(true).size == 1 raise ERR_NO_ADMIN_MEMBER_DELETE if self.group.role_admin? && self.group.memberships.size == 1 && Group.find_all_by_role_admin(true).size == 1
end end
end end

View file

@ -5,7 +5,7 @@
%td %td
= pagination_links_remote @users, :update => :users = pagination_links_remote @users, :update => :users
%td{:style => "text-align:right"} %td{:style => "text-align:right"}
- if @total > 20 - if @users.size > 20
= items_per_page :update => :users = items_per_page :update => :users
%table.list %table.list
%thead %thead
@ -17,7 +17,8 @@
%th Bestellgruppe %th Bestellgruppe
%th Arbeitsgruppe(n) %th Arbeitsgruppe(n)
%tbody %tbody
- for user in @users - users = params[:sort_by_ordergroups] ? @users.sort { |a,b| a.ordergroup.name <=> b.ordergroup.name } : @users
- for user in users
%tr{:class => cycle('even','odd', :name => 'users')} %tr{:class => cycle('even','odd', :name => 'users')}
%td= link_to user.nick, user_message_path(user), :title => _('Send user an email') %td= link_to user.nick, user_message_path(user), :title => _('Send user an email')
%td=h user.name if @current_user.role_admin? || user.settings["profile.nameIsPublic"] == '1' %td=h user.name if @current_user.role_admin? || user.settings["profile.nameIsPublic"] == '1'

View file

@ -1,3 +1,14 @@
- content_for :head do
:javascript
$(function() {
$('#query').observe_field(1, function() {
$('#user_search').submit();
});
$('#sort_by_ordergroups').click(function() {
$('#user_search').submit();
});
});
%h1 Mitglieder der Foodcoop %h1 Mitglieder der Foodcoop
%p %p
%i %i
@ -13,20 +24,11 @@
.column_content .column_content
- unless params[:sort_by_ordergroups] - unless params[:sort_by_ordergroups]
#user_filter{:style => "float:left; margin-right:2em;"} #user_filter{:style => "float:left; margin-right:2em;"}
%form{:name=>"sform", :action=>"", :style=>"display:inline;"} = form_tag foodcoop_users_path, :method => :get, :style=>"display:inline;", :id => 'user_search', :remote => true do
%label{:for => 'article_name'} Suche nach Name: %label{:for => 'article_name'} Suche nach Name:
= text_field_tag("query", params['query'], :size => 10 ) = text_field_tag(:query, params[:query], :size => 10 )
= observe_field 'query', :frequency => 2, | Nach Bestellgruppen sortieren:
:before => "Element.show('loader')", | = check_box_tag :sort_by_ordergroups, 1, params[:sort_by_ordergroups]
:success => "Element.hide('loader')", |
:url => foodcoop_users_path, |
:update => :users, |
:with => 'query', |
:method => :get |
=_ "Nach Bestellgruppen sortieren:"
- form_tag(foodcoop_users_path, :method => "get", :style=>"display:inline;") do
= check_box_tag :sort_by_ordergroups, 1, params[:sort_by_ordergroups], :onclick => "submit();"
#users #users
= render :partial => "users" = render :partial => "users"

View file

@ -0,0 +1 @@
$('#users').html('<%= escape_javascript(render("users")) %>');

View file

@ -8,14 +8,16 @@
<!--[if lte IE 7]> <!--[if lte IE 7]>
= stylesheet_link_tag 'ie_hacks' = stylesheet_link_tag 'ie_hacks'
<![endif]--> <![endif]-->
= javascript_include_tag 'jquery.min', 'jquery-ui.min', 'jquery_ujs', 'jquery.tokeninput', 'application', 'ordering', :cache => "all_cached" = javascript_include_tag 'jquery.min', 'jquery-ui.min', 'jquery_ujs', 'jquery.tokeninput', 'jquery.observe_field',
'application', 'ordering', :cache => "all_cached"
= csrf_meta_tag
= yield(:head) = yield(:head)
%body %body
#logininfo= render :partial => 'shared/loginInfo' #logininfo= render :partial => 'shared/loginInfo'
#header #header
#logo #logo
- link_to root_path do = link_to root_path do
<span>food</span>soft <span>food</span>soft
%span{:style => "color:white; font-size:45%; letter-spacing: -1px;"}= Foodsoft.config[:name] %span{:style => "color:white; font-size:45%; letter-spacing: -1px;"}= Foodsoft.config[:name]
#nav= render :partial => 'layouts/main_tabnav' #nav= render :partial => 'layouts/main_tabnav'

View file

@ -0,0 +1,39 @@
// jquery.observe_field.js
(function( $ ){
jQuery.fn.observe_field = function(frequency, callback) {
frequency = frequency * 1000; // translate to milliseconds
return this.each(function(){
var $this = $(this);
var prev = $this.val();
var check = function() {
var val = $this.val();
if(prev != val){
prev = val;
$this.map(callback); // invokes the callback on $this
}
};
var reset = function() {
if(ti){
clearInterval(ti);
ti = setInterval(check, frequency);
}
};
check();
var ti = setInterval(check, frequency); // invoke check periodically
// reset counter after user interaction
$this.bind('keyup click mousemove', reset); //mousemove is for selects
});
};
})( jQuery );