project_settings.page=Settings
project_links.page=Links
project_exclusions.page=Exclusions
+project_history.page=History
project_deletion.page=Deletion
quality_profiles.page=Quality Profiles
reviews.page=Reviews
manual_measures.pending_message=Pending measures are marked with orange box. Their values will be integrated to project during next analysis.
+#------------------------------------------------------------------------------
+#
+# PROJECT HISTORY SERVICE
+#
+#------------------------------------------------------------------------------
+
+project_history.page_title=Delete quality snapshots from project history
+project_history.col.year=Year
+project_history.col.month=Month
+project_history.col.time=Time
+project_history.col.events=Events
+project_history.col.action=Action
+project_history.delete=Delete
+project_history.recover=Recover
+project_history.delete_snapshot=Delete snapshot
+project_history.recover_snapshot=Recover snapshot
+project_history.sure_to_delete_snapshot=Are you sure you want to delete this snapshot?
+project_history.x_snapshots_deleted={0} snapshot(s) will be deleted during next analysis.
+project_history.x_snapshots_recovered={0} snapshot(s) will not be deleted during next analysis.
+project_history.snapshot_will_be_deleted_next_analysis=This snapshot will be deleted during next analysis.
+
+
#------------------------------------------------------------------------------
#
# TIME MACHINE
redirect_to_default
end
+ def history
+ @project=Project.by_key(params[:id])
+ return access_denied unless is_admin?(@project)
+
+ if !@project.project?
+ redirect_to :action => 'index', :id => params[:id]
+ end
+
+ @snapshot=@project.last_snapshot
+ @snapshots = Snapshot.find(:all, :conditions => ["project_id=?", @project.id],
+ :include => 'events', :order => 'snapshots.created_at DESC')
+ end
+
+ def snapshot_history
+ project=Project.by_key(params[:id])
+ return access_denied unless is_admin?(@project)
+
+ sids = params[:snapshot_ids]
+ delete_operation = params[:operation] == "delete"
+ unless sids.empty?
+ status = delete_operation ? 'U' : 'P'
+ Snapshot.update_all("status='"+status+"'", ["id IN (?) or root_snapshot_id IN (?)", sids, sids])
+ flash[:notice] = message(delete_operation ? 'project_history.x_snapshots_deleted' : 'project_history.x_snapshots_recovered', :params => sids.size)
+ end
+
+ redirect_to :action => 'history', :id => project.id
+ end
+
def links
@project=Project.by_key(params[:id])
return access_denied unless is_admin?(@project)
--- /dev/null
+<% if @snapshot.root? %>
+<h1><%= message('project_history.page_title') -%></h1>
+<br/>
+
+<script>
+ function updateSelectBox() {
+ var inputs = document.getElementsByName("snapshot_ids[]");
+ var selected = false;
+ for (i=0; i<inputs.length; i++) {
+ if (inputs[i].checked) { selected = true; break;}
+ }
+ $('operation-select-box').disabled = !selected;
+ }
+</script>
+
+<form action="<%= ApplicationController.root_context -%>/project/snapshot_history" method="POST" id="snapshots-form">
+<input type="hidden" name="id" value="<%= @project.id -%>"/>
+<table class="width100 data">
+ <thead>
+ <tr>
+ <th class="thin nowrap"><%= message('project_history.col.year') -%></th>
+ <th class="thin nowrap"><%= message('project_history.col.month') -%></th>
+ <th style="width: 18px"></th>
+ <th class="nowrap"><%= message('project_history.col.time') -%></th>
+ <th class="nowrap"><%= message('project_history.col.events') -%></th>
+ <th class="thin nowrap center"><%= message('project_history.col.action') -%></th>
+ <th class="thin nowrap">
+ <select id="operation-select-box" name="operation" onChange="$('snapshots-form').submit()" disabled>
+ <option value="" selected></option>
+ <option value="delete"><%= message('project_history.delete') -%></option>
+ <option value="recover"><%= message('project_history.recover') -%></option>
+ </select>
+ </th>
+ </tr>
+ </thead>
+ <tbody>
+ <%
+ current_year = nil
+ current_month = nil
+ @snapshots.each do |snapshot|
+ number_of_events = snapshot.events.size
+ time = snapshot.created_at
+ %>
+ <tr class="<%= cycle 'even','odd' -%>">
+ <td class="thin nowrap"><%= time.year unless time.year == current_year -%></td>
+ <td class="thin nowrap"><%= l(time, :format => '%B').capitalize unless time.month == current_month -%></td>
+ <td style="width: 18px">
+ <% if snapshot.status == 'U' %>
+ <img src="<%= image_path '/images/exclamation.png' -%>" title="<%= message('project_history.snapshot_will_be_deleted_next_analysis') -%>">
+ <% end %>
+ </td>
+ <td class="nowrap"><%= l time, :format => :long -%></td>
+ <td>
+ <%= snapshot.events.map{|e| e.name}.join(', ') -%>
+ </td>
+ <td class="thin nowrap center">
+ <%
+ unless snapshot.islast
+ button_value, operation, class_style, confirm_message = nil
+ if snapshot.status == 'P'
+ button_value = message('project_history.delete_snapshot')
+ operation = 'delete'
+ class_style = 'action red-button'
+ confirm_message = message('project_history.sure_to_delete_snapshot')
+ else
+ button_value = message('project_history.recover_snapshot')
+ operation = 'recover'
+ class_style = 'action'
+ end
+ %>
+ <input type="submit" value="<%= button_value-%>" id="delete_exclusions" class="<%= class_style -%>"
+ onclick="if (<%= confirm_message ? "confirm('"+confirm_message+"')" : 'true'-%>) { var f = document.createElement('form'); f.style.display = 'none'; this.parentNode.appendChild(f); f.method = 'POST'; f.action = '<%= url_for :action => "snapshot_history", :id => @project.id, :snapshot_ids => [snapshot.id], :operation => operation -%>';f.submit(); };return false;">
+ <% end %>
+ </td>
+ <td class="center">
+ <% unless snapshot.islast %>
+ <input id="snapshot_ids" name="snapshot_ids[]" type="checkbox" value="<%= snapshot.id -%>" onClick="updateSelectBox()" />
+ <% end %>
+ </td>
+ </tr>
+ <%
+ current_year = time.year
+ current_month = time.month
+ end
+ %>
+ </tbody>
+</table>
+</form>
+
+<% end %>
\ No newline at end of file