月曜から日曜日までの1週間表示
redmine203のコードを拝借しつつ作成してみます。
ユーザー毎に一週間のデータを表示させたいので手間が掛かっています。
簡易版
日付ごとの合計値を出しにくいのが欠点
年、月、週の始まりの月曜日の日付で判断します。group_byを使ってスタッフの名前をまとめます。
コントローラー
def week if params[:year] and params[:year].to_i > 1900 @year = params[:year].to_i if params[:month] and params[:month].to_i > 0 and params[:month].to_i < 13 @month = params[:month].to_i if params[:startdt] @startdt=params[:startdt] else @startdt = Date.commercial(@year, Date.new(@year, @month, 1).cweek, 1) end end end @year ||= Date.today.year @month ||= Date.today.month @startdt ||= Date.today - Date.today.wday + 1 @enddt = @startdt.to_date + 1.week events = Miku.find(:all, :conditions =>["started >= ? AND responded <= ?", @startdt, @enddt]) @staffs = events.group_by{|event| event.staff_name } @day = [] 7.times{|i| @day << @startdt.to_date + i.day } end
ヘルパー
redmine203からの流用と、week系は自作です。あっちこっちで使いまわす予定なのでapplication_helper.rbに記述します。
def link_to_previous_month(year, month, options={}) target_year, target_month = if month == 1 [year - 1, 12] else [year, month - 1] end name = if target_month == 12 "#{month_name(target_month)} #{target_year}" else "#{month_name(target_month)}" end # \xc2\xab(utf-8) = « link_to_month(("\xc2\xab " + name), target_year, target_month, options) end def link_to_next_month(year, month, options={}) target_year, target_month = if month == 12 [year + 1, 1] else [year, month + 1] end name = if target_month == 1 "#{month_name(target_month)} #{target_year}" else "#{month_name(target_month)}" end # \xc2\xbb(utf-8) = » link_to_month((name + " \xc2\xbb"), target_year, target_month, options) end def link_to_month(link_name, year, month, options={}) link_to_content_update(h(link_name), params.merge(:year => year, :month => month)) end #week表示用 def link_to_previous_week(year, month, fday) fday = fday.to_date - 1.week link_to("previous_week", params.merge(:year=>fday.year, :month=>fday.month, :startdt=>fday)) end def link_to_next_week(year, month, fday) fday = fday.to_date + 1.week link_to("previous_week", params.merge(:year=>fday.year, :month=>fday.month, :startdt=>fday)) end
ビューのヘッダー部分
簡易版と煩雑版で共通のヘッダー部分
<h2>週間表示</h2> <%= form_tag :action => "week" do %> <div class="calendar"> <div class="navi"> <%= link_to_previous_week(@year, @month, @startdt) %> <%= link_to_previous_month(@year, @month) %> <%= select_year(@year, {:prefix => "year", :discard_type => true}, {:onchange => 'this.form.submit()'}) %> <%= select_month(@month, {:prefix => "month", :discard_type => true}, {:onchange => "this.form.submit()"})%> <%= link_to_next_month(@year, @month) %> <%= link_to_next_week(@year, @month, @startdt) %> </div> <table class="cal"> <thead> <tr> <th class="week-number">name</th> <%- @day.each do |day| %> <th scope="col"><%= day.to_s(:jp_simple) %></th> <%- end %> </tr> </thead>
onchangeがミソです。
ビューの簡易版ボデー
複雑なことはできないとおもう。
<tbody> <%- @staffs.each do |event| %> <tr> <td class='week-number'><%= event[0] %></td> <%- @day.each do |day| %> <td class="<%= day.month==@startdt.to_date.month ? 'even' : 'odd' %> <%= ' weekend' if day.cwday==6 || day.cwday==7 %> <%= ' today' if Date.today == day %>"> <%- event[1].each do |res| %> <%- if res.started.to_s(:date)==day.to_s%> <%== week_link_responses(res) %> <%- end %> <%- end %><%# res %> </td> <%- end %><%# day %> </tr> <%- end %> </tbody> </div> <% end %> </div>
mikuのヘルパー
def week_link_responses(m) rtn="<div class='left tooltip'>" rtn+=link_to m.content.truncate(100), :action=>:new, :id=>m.id rtn+=lapsed_time(m.started, m.responded) rtn+="<span class='tip'>" rtn+=m.content rtn+="</span></div>"
これで週間表示が出るはず。
しかし一日の合計とかでない。
煩雑版
コントローラー
名前でグループ化してから、日付でグループ化する
簡易版に追記する
@event=Hash.new @staffs.each{|name| @event[name[0]]=Hash.new @day.each{|day| @event[name[0]][day]=Array.new } } events.each{|event| @event[event.staff_name][event.started.to_date]<<event }
ヘルパー
トータルタイムを作るヘルパーをmiku_helperに入れる
def week_total_time(m) rtn_hour, rtn_minuts=0 lapsed=0 m.each{|res| lapsed += (res.responded - res.started).to_i } rtn_hour=(lapsed/3600).to_i rtn_minuts=(lapsed%3600 / 60).to_i.to_s rtn_minuts = "0"+rtn_minuts.to_s if rtn_minuts.size==1 return "#{rtn_hour}:#{rtn_minuts}" end
weekって名前だけど、day_total_timeだな。
ビューの煩雑版ボデー
合計値を出すために、あらかじめ日付でまとめている。
<tbody> <%- @event.each do |member| %> <tr> <td class='week-number'><%= member[0] %></td> <%- member[1].each do |day| %> <td class="<%= day[0].month==@startdt.to_date.month ? 'even' : 'odd' %> <%= ' weekend' if day[0].cwday==6 || day[0].cwday==7 %> <%= ' today' if Date.today == day[0] %>"> <%#= day[0] %> <%= day[1].length %>件<%= week_total_time(day[1]) %><br> <div> <%- day[1].each do |event| %> <%== week_link_responses(event) %> <%- end %> </div> </td> <%- end %> </tr> <%- end %> </tbody> </table> </div> <% end %> </div>
さいごに
グループ全員のデータを表示するのは面倒なので、気合が入らなければ完成には程遠いことがわかった。