月曜から日曜日までの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) = &#171;
    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) = &#187;
    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>

 

さいごに

グループ全員のデータを表示するのは面倒なので、気合が入らなければ完成には程遠いことがわかった。