Adds a branch for unlimited project hierarchy.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/work@2148 e93f8b46-1217-0410-a6f0-8f06a7374b81
This commit is contained in:
@@ -0,0 +1,14 @@
|
||||
<div id="block_<%= block_name %>" class="mypage-box">
|
||||
|
||||
<div style="float:right;margin-right:16px;z-index:500;">
|
||||
<%= link_to_remote "", {
|
||||
:url => { :action => "remove_block", :block => block_name },
|
||||
:complete => "removeBlock('block_#{block_name}')" },
|
||||
:class => "close-icon"
|
||||
%>
|
||||
</div>
|
||||
|
||||
<div class="handle">
|
||||
<%= render :partial => "my/blocks/#{block_name}", :locals => { :user => user } %>
|
||||
</div>
|
||||
</div>
|
||||
@@ -0,0 +1,8 @@
|
||||
<h3><%=l(:label_my_account)%></h3>
|
||||
|
||||
<p><%=l(:field_login)%>: <strong><%= @user.login %></strong><br />
|
||||
<%=l(:field_created_on)%>: <%= format_time(@user.created_on) %></p>
|
||||
<% if @user.rss_token %>
|
||||
<p><%= l(:label_feeds_access_key_created_on, distance_of_time_in_words(Time.now, @user.rss_token.created_on)) %>
|
||||
(<%= link_to l(:button_reset), {:action => 'reset_rss_key'}, :method => :post %>)</p>
|
||||
<% end %>
|
||||
@@ -0,0 +1,52 @@
|
||||
<div class="contextual">
|
||||
<%= link_to(l(:button_change_password), :action => 'password') unless @user.auth_source_id %>
|
||||
</div>
|
||||
<h2><%=l(:label_my_account)%></h2>
|
||||
<%= error_messages_for 'user' %>
|
||||
|
||||
<% form_for :user, @user, :url => { :action => "account" },
|
||||
:builder => TabularFormBuilder,
|
||||
:lang => current_language,
|
||||
:html => { :id => 'my_account_form' } do |f| %>
|
||||
<div class="splitcontentleft">
|
||||
<h3><%=l(:label_information_plural)%></h3>
|
||||
<div class="box tabular">
|
||||
<p><%= f.text_field :firstname, :required => true %></p>
|
||||
<p><%= f.text_field :lastname, :required => true %></p>
|
||||
<p><%= f.text_field :mail, :required => true %></p>
|
||||
<p><%= f.select :language, lang_options_for_select %></p>
|
||||
</div>
|
||||
|
||||
<%= submit_tag l(:button_save) %>
|
||||
</div>
|
||||
|
||||
<div class="splitcontentright">
|
||||
<h3><%=l(:field_mail_notification)%></h3>
|
||||
<div class="box">
|
||||
<%= select_tag 'notification_option', options_for_select(@notification_options, @notification_option),
|
||||
:onchange => 'if ($("notification_option").value == "selected") {Element.show("notified-projects")} else {Element.hide("notified-projects")}' %>
|
||||
<% content_tag 'div', :id => 'notified-projects', :style => (@notification_option == 'selected' ? '' : 'display:none;') do %>
|
||||
<p><% User.current.projects.each do |project| %>
|
||||
<label><%= check_box_tag 'notified_project_ids[]', project.id, @user.notified_projects_ids.include?(project.id) %> <%=h project.name %></label><br />
|
||||
<% end %></p>
|
||||
<p><em><%= l(:text_user_mail_option) %></em></p>
|
||||
<% end %>
|
||||
<p><label><%= check_box_tag 'no_self_notified', 1, @user.pref[:no_self_notified] %> <%= l(:label_user_mail_no_self_notified) %></label></p>
|
||||
</div>
|
||||
|
||||
<h3><%=l(:label_preferences)%></h3>
|
||||
<div class="box tabular">
|
||||
<% fields_for :pref, @user.pref, :builder => TabularFormBuilder, :lang => current_language do |pref_fields| %>
|
||||
<p><%= pref_fields.check_box :hide_mail %></p>
|
||||
<p><%= pref_fields.select :time_zone, ActiveSupport::TimeZone.all.collect {|z| [ z.to_s, z.name ]}, :include_blank => true %></p>
|
||||
<p><%= pref_fields.select :comments_sorting, [[l(:label_chronological_order), 'asc'], [l(:label_reverse_chronological_order), 'desc']] %></p>
|
||||
<% end %>
|
||||
</div>
|
||||
</div>
|
||||
<% end %>
|
||||
|
||||
<% content_for :sidebar do %>
|
||||
<%= render :partial => 'sidebar' %>
|
||||
<% end %>
|
||||
|
||||
<% html_title(l(:label_my_account)) -%>
|
||||
@@ -0,0 +1,8 @@
|
||||
<h3><%= l(:label_calendar) %></h3>
|
||||
|
||||
<% calendar = Redmine::Helpers::Calendar.new(Date.today, current_language, :week)
|
||||
calendar.events = Issue.find :all,
|
||||
:conditions => ["#{Issue.table_name}.project_id in (#{@user.projects.collect{|m| m.id}.join(',')}) AND ((start_date>=? and start_date<=?) or (due_date>=? and due_date<=?))", calendar.startdt, calendar.enddt, calendar.startdt, calendar.enddt],
|
||||
:include => [:project, :tracker, :priority, :assigned_to] unless @user.projects.empty? %>
|
||||
|
||||
<%= render :partial => 'common/calendar', :locals => {:calendar => calendar } %>
|
||||
@@ -0,0 +1,9 @@
|
||||
<h3><%=l(:label_document_plural)%></h3>
|
||||
|
||||
<% project_ids = @user.projects.select {|p| @user.allowed_to?(:view_documents, p)}.collect(&:id) %>
|
||||
<%= render(:partial => 'documents/document',
|
||||
:collection => Document.find(:all,
|
||||
:limit => 10,
|
||||
:order => "#{Document.table_name}.created_on DESC",
|
||||
:conditions => "#{Document.table_name}.project_id in (#{project_ids.join(',')})",
|
||||
:include => [:project])) unless project_ids.empty? %>
|
||||
@@ -0,0 +1,17 @@
|
||||
<h3><%=l(:label_assigned_to_me_issues)%></h3>
|
||||
<% assigned_issues = Issue.find(:all,
|
||||
:conditions => ["assigned_to_id=? AND #{IssueStatus.table_name}.is_closed=? AND #{Project.table_name}.status=#{Project::STATUS_ACTIVE}", user.id, false],
|
||||
:limit => 10,
|
||||
:include => [ :status, :project, :tracker, :priority ],
|
||||
:order => "#{Enumeration.table_name}.position DESC, #{Issue.table_name}.updated_on DESC") %>
|
||||
<%= render :partial => 'issues/list_simple', :locals => { :issues => assigned_issues } %>
|
||||
<% if assigned_issues.length > 0 %>
|
||||
<p class="small"><%= link_to l(:label_issue_view_all), :controller => 'issues', :action => 'index', :set_filter => 1, :assigned_to_id => 'me' %></p>
|
||||
<% end %>
|
||||
|
||||
<% content_for :header_tags do %>
|
||||
<%= auto_discovery_link_tag(:atom,
|
||||
{:controller => 'issues', :action => 'index', :set_filter => 1,
|
||||
:assigned_to_id => 'me', :format => 'atom', :key => User.current.rss_key},
|
||||
{:title => l(:label_assigned_to_me_issues)}) %>
|
||||
<% end %>
|
||||
@@ -0,0 +1,17 @@
|
||||
<h3><%=l(:label_reported_issues)%></h3>
|
||||
<% reported_issues = Issue.find(:all,
|
||||
:conditions => ["author_id=? AND #{Project.table_name}.status=#{Project::STATUS_ACTIVE}", user.id],
|
||||
:limit => 10,
|
||||
:include => [ :status, :project, :tracker ],
|
||||
:order => "#{Issue.table_name}.updated_on DESC") %>
|
||||
<%= render :partial => 'issues/list_simple', :locals => { :issues => reported_issues } %>
|
||||
<% if reported_issues.length > 0 %>
|
||||
<p class="small"><%= link_to l(:label_issue_view_all), :controller => 'issues', :action => 'index', :set_filter => 1, :author_id => 'me' %></p>
|
||||
<% end %>
|
||||
|
||||
<% content_for :header_tags do %>
|
||||
<%= auto_discovery_link_tag(:atom,
|
||||
{:controller => 'issues', :action => 'index', :set_filter => 1,
|
||||
:author_id => 'me', :format => 'atom', :key => User.current.rss_key},
|
||||
{:title => l(:label_reported_issues)}) %>
|
||||
<% end %>
|
||||
@@ -0,0 +1,10 @@
|
||||
<h3><%=l(:label_watched_issues)%></h3>
|
||||
<% watched_issues = Issue.find(:all,
|
||||
:include => [:status, :project, :tracker, :watchers],
|
||||
:limit => 10,
|
||||
:conditions => ["#{Watcher.table_name}.user_id = ? AND #{Project.table_name}.status=#{Project::STATUS_ACTIVE}", user.id],
|
||||
:order => "#{Issue.table_name}.updated_on DESC") %>
|
||||
<%= render :partial => 'issues/list_simple', :locals => { :issues => watched_issues } %>
|
||||
<% if watched_issues.length > 0 %>
|
||||
<p><%=lwr(:label_last_updates, watched_issues.length)%></p>
|
||||
<% end %>
|
||||
@@ -0,0 +1,8 @@
|
||||
<h3><%=l(:label_news_latest)%></h3>
|
||||
|
||||
<%= render(:partial => 'news/news',
|
||||
:collection => News.find(:all,
|
||||
:limit => 10,
|
||||
:order => "#{News.table_name}.created_on DESC",
|
||||
:conditions => "#{News.table_name}.project_id in (#{@user.projects.collect{|m| m.id}.join(',')})",
|
||||
:include => [:project, :author])) unless @user.projects.empty? %>
|
||||
@@ -0,0 +1,52 @@
|
||||
<h3><%=l(:label_spent_time)%> (<%= l(:label_last_n_days, 7) %>)</h3>
|
||||
<%
|
||||
entries = TimeEntry.find(:all,
|
||||
:conditions => ["#{TimeEntry.table_name}.user_id = ? AND #{TimeEntry.table_name}.spent_on BETWEEN ? AND ?", @user.id, Date.today - 6, Date.today],
|
||||
:include => [:activity, :project, {:issue => [:tracker, :status]}],
|
||||
:order => "#{TimeEntry.table_name}.spent_on DESC, #{Project.table_name}.name ASC, #{Tracker.table_name}.position ASC, #{Issue.table_name}.id ASC")
|
||||
entries_by_day = entries.group_by(&:spent_on)
|
||||
%>
|
||||
|
||||
<div class="total-hours">
|
||||
<p><%= l(:label_total) %>: <%= html_hours("%.2f" % entries.sum(&:hours).to_f) %></p>
|
||||
</div>
|
||||
|
||||
<% if entries.any? %>
|
||||
<table class="list time-entries">
|
||||
<thead>
|
||||
<th><%= l(:label_activity) %></th>
|
||||
<th><%= l(:label_project) %></th>
|
||||
<th><%= l(:field_comments) %></th>
|
||||
<th><%= l(:field_hours) %></th>
|
||||
<th></th>
|
||||
</thead>
|
||||
<tbody>
|
||||
<% entries_by_day.keys.sort.reverse.each do |day| %>
|
||||
<tr class="odd">
|
||||
<td><strong><%= day == Date.today ? l(:label_today).titleize : format_date(day) %></strong></td>
|
||||
<td colspan="2"></td>
|
||||
<td class="hours"><em><%= html_hours("%.2f" % entries_by_day[day].sum(&:hours).to_f) %></em></td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<% entries_by_day[day].each do |entry| -%>
|
||||
<tr class="time-entry" style="border-bottom: 1px solid #f5f5f5;">
|
||||
<td class="activity"><%=h entry.activity %></td>
|
||||
<td class="subject"><%=h entry.project %> <%= ' - ' + link_to_issue(entry.issue, :title => h("#{entry.issue.subject} (#{entry.issue.status})")) if entry.issue %></td>
|
||||
<td class="comments"><%=h entry.comments %></td>
|
||||
<td class="hours"><%= html_hours("%.2f" % entry.hours) %></td>
|
||||
<td align="center">
|
||||
<% if entry.editable_by?(@user) -%>
|
||||
<%= link_to image_tag('edit.png'), {:controller => 'timelog', :action => 'edit', :id => entry},
|
||||
:title => l(:button_edit) %>
|
||||
<%= link_to image_tag('delete.png'), {:controller => 'timelog', :action => 'destroy', :id => entry},
|
||||
:confirm => l(:text_are_you_sure),
|
||||
:method => :post,
|
||||
:title => l(:button_delete) %>
|
||||
<% end -%>
|
||||
</td>
|
||||
</tr>
|
||||
<% end -%>
|
||||
<% end -%>
|
||||
</tbdoy>
|
||||
</table>
|
||||
<% end %>
|
||||
@@ -0,0 +1,42 @@
|
||||
<div class="contextual">
|
||||
<%= link_to l(:label_personalize_page), :action => 'page_layout' %>
|
||||
</div>
|
||||
|
||||
<h2><%=l(:label_my_page)%></h2>
|
||||
|
||||
<div id="list-top">
|
||||
<% @blocks['top'].each do |b|
|
||||
next unless MyController::BLOCKS.keys.include? b %>
|
||||
<div class="mypage-box">
|
||||
<%= render :partial => "my/blocks/#{b}", :locals => { :user => @user } %>
|
||||
</div>
|
||||
<% end if @blocks['top'] %>
|
||||
</div>
|
||||
|
||||
<div id="list-left" class="splitcontentleft">
|
||||
<% @blocks['left'].each do |b|
|
||||
next unless MyController::BLOCKS.keys.include? b %>
|
||||
<div class="mypage-box">
|
||||
<%= render :partial => "my/blocks/#{b}", :locals => { :user => @user } %>
|
||||
</div>
|
||||
<% end if @blocks['left'] %>
|
||||
</div>
|
||||
|
||||
<div id="list-right" class="splitcontentright">
|
||||
<% @blocks['right'].each do |b|
|
||||
next unless MyController::BLOCKS.keys.include? b %>
|
||||
<div class="mypage-box">
|
||||
<%= render :partial => "my/blocks/#{b}", :locals => { :user => @user } %>
|
||||
</div>
|
||||
<% end if @blocks['right'] %>
|
||||
</div>
|
||||
|
||||
<% content_for :header_tags do %>
|
||||
<%= javascript_include_tag 'context_menu' %>
|
||||
<%= stylesheet_link_tag 'context_menu' %>
|
||||
<% end %>
|
||||
|
||||
<div id="context-menu" style="display: none;"></div>
|
||||
<%= javascript_tag "new ContextMenu('#{url_for(:controller => 'issues', :action => 'context_menu')}')" %>
|
||||
|
||||
<% html_title(l(:label_my_page)) -%>
|
||||
@@ -0,0 +1,107 @@
|
||||
<script language="JavaScript">
|
||||
//<![CDATA[
|
||||
function recreateSortables() {
|
||||
Sortable.destroy('list-top');
|
||||
Sortable.destroy('list-left');
|
||||
Sortable.destroy('list-right');
|
||||
|
||||
Sortable.create("list-top", {constraint:false, containment:['list-top','list-left','list-right'], dropOnEmpty:true, handle:'handle', onUpdate:function(){new Ajax.Request('/my/order_blocks?group=top', {asynchronous:true, evalScripts:true, parameters:Sortable.serialize("list-top")})}, only:'mypage-box', tag:'div'})
|
||||
Sortable.create("list-left", {constraint:false, containment:['list-top','list-left','list-right'], dropOnEmpty:true, handle:'handle', onUpdate:function(){new Ajax.Request('/my/order_blocks?group=left', {asynchronous:true, evalScripts:true, parameters:Sortable.serialize("list-left")})}, only:'mypage-box', tag:'div'})
|
||||
Sortable.create("list-right", {constraint:false, containment:['list-top','list-left','list-right'], dropOnEmpty:true, handle:'handle', onUpdate:function(){new Ajax.Request('/my/order_blocks?group=right', {asynchronous:true, evalScripts:true, parameters:Sortable.serialize("list-right")})}, only:'mypage-box', tag:'div'})
|
||||
}
|
||||
|
||||
function updateSelect() {
|
||||
s = $('block-select')
|
||||
for (var i = 0; i < s.options.length; i++) {
|
||||
if ($('block_' + s.options[i].value)) {
|
||||
s.options[i].disabled = true;
|
||||
} else {
|
||||
s.options[i].disabled = false;
|
||||
}
|
||||
}
|
||||
s.options[0].selected = true;
|
||||
}
|
||||
|
||||
function afterAddBlock() {
|
||||
recreateSortables();
|
||||
updateSelect();
|
||||
}
|
||||
|
||||
function removeBlock(block) {
|
||||
Effect.DropOut(block);
|
||||
updateSelect();
|
||||
}
|
||||
//]]>
|
||||
</script>
|
||||
|
||||
<div class="contextual">
|
||||
<% form_tag({:action => "add_block"}, :id => "block-form") do %>
|
||||
<%= select_tag 'block', "<option></option>" + options_for_select(@block_options), :id => "block-select" %>
|
||||
<%= link_to_remote l(:button_add),
|
||||
{:url => { :action => "add_block" },
|
||||
:with => "Form.serialize('block-form')",
|
||||
:update => "list-top",
|
||||
:position => :top,
|
||||
:complete => "afterAddBlock();"
|
||||
}, :class => 'icon icon-add'
|
||||
%>
|
||||
<% end %>
|
||||
<%= link_to l(:button_save), {:action => 'page_layout_save'}, :class => 'icon icon-save' %>
|
||||
<%= link_to l(:button_cancel), {:action => 'page'}, :class => 'icon icon-cancel' %>
|
||||
</div>
|
||||
|
||||
<h2><%=l(:label_my_page)%></h2>
|
||||
|
||||
<div id="list-top" class="block-receiver">
|
||||
<% @blocks['top'].each do |b|
|
||||
next unless MyController::BLOCKS.keys.include? b %>
|
||||
<%= render :partial => 'block', :locals => {:user => @user, :block_name => b} %>
|
||||
<% end if @blocks['top'] %>
|
||||
</div>
|
||||
|
||||
<div id="list-left" class="splitcontentleft block-receiver">
|
||||
<% @blocks['left'].each do |b|
|
||||
next unless MyController::BLOCKS.keys.include? b %>
|
||||
<%= render :partial => 'block', :locals => {:user => @user, :block_name => b} %>
|
||||
<% end if @blocks['left'] %>
|
||||
</div>
|
||||
|
||||
<div id="list-right" class="splitcontentright block-receiver">
|
||||
<% @blocks['right'].each do |b|
|
||||
next unless MyController::BLOCKS.keys.include? b %>
|
||||
<%= render :partial => 'block', :locals => {:user => @user, :block_name => b} %>
|
||||
<% end if @blocks['right'] %>
|
||||
</div>
|
||||
|
||||
<%= sortable_element 'list-top',
|
||||
:tag => 'div',
|
||||
:only => 'mypage-box',
|
||||
:handle => "handle",
|
||||
:dropOnEmpty => true,
|
||||
:containment => ['list-top', 'list-left', 'list-right'],
|
||||
:constraint => false,
|
||||
:url => { :action => "order_blocks", :group => "top" }
|
||||
%>
|
||||
|
||||
|
||||
<%= sortable_element 'list-left',
|
||||
:tag => 'div',
|
||||
:only => 'mypage-box',
|
||||
:handle => "handle",
|
||||
:dropOnEmpty => true,
|
||||
:containment => ['list-top', 'list-left', 'list-right'],
|
||||
:constraint => false,
|
||||
:url => { :action => "order_blocks", :group => "left" }
|
||||
%>
|
||||
|
||||
<%= sortable_element 'list-right',
|
||||
:tag => 'div',
|
||||
:only => 'mypage-box',
|
||||
:handle => "handle",
|
||||
:dropOnEmpty => true,
|
||||
:containment => ['list-top', 'list-left', 'list-right'],
|
||||
:constraint => false,
|
||||
:url => { :action => "order_blocks", :group => "right" }
|
||||
%>
|
||||
|
||||
<%= javascript_tag "updateSelect()" %>
|
||||
@@ -0,0 +1,22 @@
|
||||
<h2><%=l(:button_change_password)%></h2>
|
||||
|
||||
<%= error_messages_for 'user' %>
|
||||
|
||||
<% form_tag({}, :class => "tabular") do %>
|
||||
<div class="box">
|
||||
<p><label for="password"><%=l(:field_password)%> <span class="required">*</span></label>
|
||||
<%= password_field_tag 'password', nil, :size => 25 %></p>
|
||||
|
||||
<p><label for="new_password"><%=l(:field_new_password)%> <span class="required">*</span></label>
|
||||
<%= password_field_tag 'new_password', nil, :size => 25 %><br />
|
||||
<em><%= l(:text_caracters_minimum, 4) %></em></p>
|
||||
|
||||
<p><label for="new_password_confirmation"><%=l(:field_password_confirmation)%> <span class="required">*</span></label>
|
||||
<%= password_field_tag 'new_password_confirmation', nil, :size => 25 %></p>
|
||||
</div>
|
||||
<%= submit_tag l(:button_apply) %>
|
||||
<% end %>
|
||||
|
||||
<% content_for :sidebar do %>
|
||||
<%= render :partial => 'sidebar' %>
|
||||
<% end %>
|
||||
Reference in New Issue
Block a user