Feature #3143 » add_notes.diff
| app/views/issues/_action_menu.html.erb | ||
|---|---|---|
| 1 | 1 |
<div class="contextual"> |
| 2 |
<%= link_to l(:button_edit), edit_issue_path(@issue), :onclick => 'showAndScrollTo("update", "issue_notes"); return false;', :class => 'icon icon-edit', :accesskey => accesskey(:edit) if @issue.editable? %>
|
|
| 2 |
<%= link_to l(:button_add_notes), edit_issue_path(@issue), :onclick => 'showAndScrollTo("new-notes-form", "new_notes"); return false;', :class =>'icon icon-comment' if User.current.allowed_to?(:add_issue_notes, @project) %>
|
|
| 3 |
<%= link_to l(:button_edit), edit_issue_path(@issue), :onclick => 'showAndScrollTo("update", "issue_notes"); return false;', :class => 'icon icon-edit', :accesskey => accesskey(:edit) if @issue.editable? && User.current.allowed_to?(:edit_issues, @project) %>
|
|
| 3 | 4 |
<%= link_to l(:button_log_time), new_issue_time_entry_path(@issue), :class => 'icon icon-time-add' if User.current.allowed_to?(:log_time, @project) %> |
| 4 | 5 |
<%= watcher_link(@issue, User.current) %> |
| 5 | 6 |
<%= link_to l(:button_copy), project_copy_issue_path(@project, @issue), :class => 'icon icon-copy' if User.current.allowed_to?(:copy_issues, @project) && Issue.allowed_target_projects.any? %> |
| app/views/issues/show.html.erb | ||
|---|---|---|
| 111 | 111 | |
| 112 | 112 |
</div> |
| 113 | 113 | |
| 114 |
<%= render :partial => 'action_menu' %> |
|
| 115 | ||
| 116 |
<div style="clear: both;"></div> |
|
| 117 |
<% if @issue.editable? %> |
|
| 118 |
<div id="update" style="display:none;"> |
|
| 119 |
<h3><%= l(:button_edit) %></h3> |
|
| 120 |
<%= render :partial => 'edit' %> |
|
| 121 |
</div> |
|
| 122 |
<% end %> |
|
| 123 | ||
| 114 | 124 |
<% if @changesets.present? %> |
| 115 | 125 |
<div id="issue-changesets"> |
| 116 | 126 |
<h3><%=l(:label_associated_revisions)%></h3> |
| ... | ... | |
| 125 | 135 |
</div> |
| 126 | 136 |
<% end %> |
| 127 | 137 | |
| 128 | ||
| 129 |
<div style="clear: both;"></div> |
|
| 130 |
<%= render :partial => 'action_menu' %> |
|
| 131 | ||
| 132 |
<div style="clear: both;"></div> |
|
| 133 |
<% if @issue.editable? %> |
|
| 134 |
<div id="update" style="display:none;"> |
|
| 135 |
<h3><%= l(:button_edit) %></h3> |
|
| 136 |
<%= render :partial => 'edit' %> |
|
| 137 |
</div> |
|
| 138 |
<% if @issue.editable? || User.current.allowed_to?(:add_issue_notes, @project) %> |
|
| 139 |
<%= render :partial => 'journals/new_notes_form' %> |
|
| 138 | 140 |
<% end %> |
| 139 | 141 | |
| 140 | 142 |
<% other_formats_links do |f| %> |
| app/views/journals/_new_notes_form.html.erb | ||
|---|---|---|
| 1 |
<div id="new-notes"> |
|
| 2 |
<div style="clear: both"></div> |
|
| 3 |
<%= labelled_form_for @issue, :html => {:id => 'new-notes-form', :multipart => true} do |f| %>
|
|
| 4 |
<h4><%= l(:field_add_notes) %></h4> |
|
| 5 |
<div class="box"> |
|
| 6 |
<fieldset><legend><%= l(:field_notes) %></legend> |
|
| 7 |
<%= f.text_area :notes, :id => "new_notes", :class => 'wiki-edit', :rows => 10, :no_label => true %> |
|
| 8 |
<%= wikitoolbar_for "new_notes" %> |
|
| 9 | ||
| 10 |
<% if @issue.safe_attribute? 'private_notes' %> |
|
| 11 |
<%= f.check_box :private_notes, :id => "private_new_notes", :no_label => true %> |
|
| 12 |
<label for="private_new_notes"><%= l(:field_private_notes) %> </label> |
|
| 13 |
<% end %> |
|
| 14 |
<%= call_hook(:view_issues_edit_notes_bottom, { :issue => @issue, :notes => @notes, :form => f }) %>
|
|
| 15 |
</fieldset> |
|
| 16 |
<fieldset><legend><%= l(:label_attachment_plural) %></legend> |
|
| 17 |
<p><%= render :partial => 'attachments/form', :locals => {:container => @issue} %></p>
|
|
| 18 |
</fieldset> |
|
| 19 |
</div> |
|
| 20 |
<p><%= submit_tag l(:button_submit) %> |
|
| 21 |
<%= preview_link preview_edit_issue_path(:project_id => @project, :id => @issue), |
|
| 22 |
"new-notes-form", |
|
| 23 |
"new_notes_preview" %> |
|
| 24 | ||
| 25 |
<div id="new_notes_preview" class="wiki"></div> |
|
| 26 |
<% end %> |
|
| 27 |
</div> |
|
| app/views/journals/new.js.erb | ||
|---|---|---|
| 1 |
$('#issue_notes').val("<%= raw escape_javascript(@content) %>");
|
|
| 1 |
$('#new_notes').val("<%= raw escape_javascript(@content) %>");
|
|
| 2 | 2 |
<% |
| 3 | 3 |
# when quoting a private journal, check the private checkbox |
| 4 | 4 |
if @journal && @journal.private_notes? |
| 5 | 5 |
%> |
| 6 |
$('#issue_private_notes').prop('checked', true);
|
|
| 6 |
$('#private_new_notes').prop('checked', true);
|
|
| 7 | 7 |
<% end %> |
| 8 | 8 | |
| 9 |
showAndScrollTo("update", "notes");
|
|
| 10 |
$('#notes').scrollTop = $('#notes').scrollHeight - $('#notes').clientHeight;
|
|
| 9 |
showAndScrollTo("new-notes-form", "new_notes");
|
|
| 10 |
$('#new_notes').scrollTop = $('#new_notes').scrollHeight - $('#new_notes').clientHeight;
|
|
| config/locales/en.yml | ||
|---|---|---|
| 268 | 268 |
field_issue: Issue |
| 269 | 269 |
field_status: Status |
| 270 | 270 |
field_notes: Notes |
| 271 |
field_add_notes: Add notes |
|
| 271 | 272 |
field_is_closed: Issue closed |
| 272 | 273 |
field_is_default: Default value |
| 273 | 274 |
field_tracker: Tracker |
| ... | ... | |
| 1013 | 1014 |
button_edit: Edit |
| 1014 | 1015 |
button_edit_associated_wikipage: "Edit associated Wiki page: %{page_title}"
|
| 1015 | 1016 |
button_add: Add |
| 1017 |
button_add_notes: Add notes |
|
| 1016 | 1018 |
button_change: Change |
| 1017 | 1019 |
button_apply: Apply |
| 1018 | 1020 |
button_clear: Clear |
| public/javascripts/attachments.js | ||
|---|---|---|
| 2 | 2 |
Copyright (C) 2006-2016 Jean-Philippe Lang */ |
| 3 | 3 | |
| 4 | 4 |
function addFile(inputEl, file, eagerUpload) {
|
| 5 | ||
| 6 |
if ($('#attachments_fields').children().length < 10) {
|
|
| 5 |
var attachmentsField = $(inputEl).parents('form').find('#attachments_fields')
|
|
| 6 |
if (attachmentsField.children().length < 10) {
|
|
| 7 | 7 | |
| 8 | 8 |
var attachmentId = addFile.nextAttachmentId++; |
| 9 | 9 | |
| ... | ... | |
| 13 | 13 |
$('<input>', { type: 'text', 'class': 'filename readonly', name: 'attachments[' + attachmentId + '][filename]', readonly: 'readonly'} ).val(file.name),
|
| 14 | 14 |
$('<input>', { type: 'text', 'class': 'description', name: 'attachments[' + attachmentId + '][description]', maxlength: 255, placeholder: $(inputEl).data('description-placeholder') } ).toggle(!eagerUpload),
|
| 15 | 15 |
$('<a> </a>').attr({ href: "#", 'class': 'remove-upload' }).click(removeFile).toggle(!eagerUpload)
|
| 16 |
).appendTo('#attachments_fields');
|
|
| 16 |
).appendTo(attachmentsField);
|
|
| 17 | 17 | |
| 18 | 18 |
if(eagerUpload) {
|
| 19 | 19 |
ajaxUpload(file, attachmentId, fileSpan, inputEl); |
| ... | ... | |
| 119 | 119 | |
| 120 | 120 |
function addInputFiles(inputEl) {
|
| 121 | 121 |
var clearedFileInput = $(inputEl).clone().val('');
|
| 122 |
var attachmentsField = $(inputEl).parents('form').find('#attachments_fields')
|
|
| 122 | 123 | |
| 123 | 124 |
if ($.ajaxSettings.xhr().upload && inputEl.files) {
|
| 124 | 125 |
// upload files using ajax |
| ... | ... | |
| 134 | 135 |
} |
| 135 | 136 |
} |
| 136 | 137 | |
| 137 |
clearedFileInput.insertAfter('#attachments_fields');
|
|
| 138 |
clearedFileInput.insertAfter(attachmentsField);
|
|
| 138 | 139 |
} |
| 139 | 140 | |
| 140 | 141 |
function uploadAndAttachFiles(files, inputEl) {
|
| ... | ... | |
| 159 | 160 |
blockEventPropagation(e); |
| 160 | 161 | |
| 161 | 162 |
if ($.inArray('Files', e.dataTransfer.types) > -1) {
|
| 162 |
uploadAndAttachFiles(e.dataTransfer.files, $('input:file.file_selector'));
|
|
| 163 |
uploadAndAttachFiles(e.dataTransfer.files, $(this).find('input:file.file_selector'));
|
|
| 163 | 164 |
} |
| 164 | 165 |
} |
| 165 | 166 | |
| ... | ... | |
| 179 | 180 |
$.event.fixHooks.drop = { props: [ 'dataTransfer' ] };
|
| 180 | 181 | |
| 181 | 182 |
$('form div.box').has('input:file').each(function() {
|
| 182 |
$(this).on({
|
|
| 183 |
$(this).off().on({
|
|
| 183 | 184 |
dragover: dragOverHandler, |
| 184 | 185 |
dragleave: dragOutHandler, |
| 185 | 186 |
drop: handleFileDropEvent |
| public/stylesheets/application.css | ||
|---|---|---|
| 401 | 401 |
#issue_tree td.checkbox, #relations td.checkbox {display:none;}
|
| 402 | 402 |
#relations td.buttons {padding:0;}
|
| 403 | 403 | |
| 404 |
#new-notes {margin-top: 5px; line-height: 1.4em;}
|
|
| 405 |
#new-notes fieldset {margin-top: 5px; background-color: #f6f6f6;}
|
|
| 406 |
#new-notes #new-notes-form {display: inline;}
|
|
| 407 | ||
| 404 | 408 |
fieldset.collapsible {border-width: 1px 0 0 0;}
|
| 405 | 409 |
fieldset.collapsible>legend { padding-left: 16px; background: url(../images/arrow_expanded.png) no-repeat 0% 40%; cursor:pointer; }
|
| 406 | 410 |
fieldset.collapsible.collapsed>legend { background-image: url(../images/arrow_collapsed.png); }
|