Feature #3143 » add_notes_button_v3.patch
app/views/issues/show.html.erb | ||
---|---|---|
128 | 128 | |
129 | 129 |
<div style="clear: both;"></div> |
130 | 130 |
<%= render :partial => 'action_menu' %> |
131 |
<% if @issue.editable? || User.current.allowed_to?(:add_issue_notes, @project) %> |
|
132 |
<%= render :partial => 'journals/notes_new_form' %> |
|
133 |
<% end %> |
|
131 | 134 | |
132 | 135 |
<div style="clear: both;"></div> |
133 | 136 |
<% if @issue.editable? %> |
app/views/journals/_notes_new_form.html.erb | ||
---|---|---|
1 |
<div id="quick-note"> |
|
2 |
<%= link_to l('button_add_notes'), {}, :id => "add-note", :class => "icon icon-comment", :onclick => "showAddNotesForm(); return false;"%> |
|
3 | ||
4 |
<div style="clear: both"></div> |
|
5 |
<%= labelled_form_for @issue, :html => {:id => 'journal-new-form', :multipart => true} do |f| %> |
|
6 |
<div class="box" id="a"> |
|
7 |
<fieldset> |
|
8 |
<legend><%= l(:field_notes) %></legend> |
|
9 |
<%= f.text_area :notes, :id => "journal_new_notes", :class => 'wiki-edit', :rows => 10, :no_label => true %> |
|
10 | ||
11 |
<% if @issue.safe_attribute? 'private_notes' %> |
|
12 |
<%= f.check_box :private_notes, :no_label => true %> |
|
13 |
<label for="issue_private_notes"><%= l(:field_private_notes) %> </label> |
|
14 |
<% end %> |
|
15 |
<%= call_hook(:view_issues_edit_notes_bottom, { :issue => @issue, :notes => @notes, :form => f }) %> |
|
16 | ||
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 |
"journal-new-form", |
|
23 |
"journal_new_preview" %> | |
|
24 |
<%= link_to l(:button_cancel), '#', :onclick => "hideAddNotesForm(); return false;" %></p> |
|
25 | ||
26 |
<div id="journal_new_preview" class="wiki"></div> |
|
27 |
<% end %> |
|
28 |
<%= wikitoolbar_for "journal_new_notes" %> |
|
29 |
</div> |
config/locales/en.yml | ||
---|---|---|
1057 | 1057 |
button_reopen: Reopen |
1058 | 1058 |
button_import: Import |
1059 | 1059 |
button_filter: Filter |
1060 |
button_add_notes: Add notes |
|
1060 | 1061 | |
1061 | 1062 |
status_active: active |
1062 | 1063 |
status_registered: registered |
public/javascripts/application.js | ||
---|---|---|
730 | 730 |
$('input[data-disables], input[data-enables], input[data-shows]').each(toggleDisabledOnChange); |
731 | 731 |
} |
732 | 732 | |
733 |
function showAddNotesForm(){ |
|
734 |
$('#journal-new-form').show().find('#journal_new_notes').focus(); |
|
735 |
$("a#add-note").hide(); |
|
736 |
} |
|
737 |
function hideAddNotesForm(){ |
|
738 |
$('#journal-new-form').hide(); |
|
739 |
$('#add-note').show(); |
|
740 |
} |
|
741 | ||
733 | 742 |
function toggleNewObjectDropdown() { |
734 | 743 |
var dropdown = $('#new-object + ul.menu-children'); |
735 | 744 |
if(dropdown.hasClass('visible')){ |
public/javascripts/attachments.js | ||
---|---|---|
1 | 1 |
/* Redmine - project management software |
2 | 2 |
Copyright (C) 2006-2016 Jean-Philippe Lang */ |
3 | ||
4 | 3 |
function addFile(inputEl, file, eagerUpload) { |
5 | ||
6 |
if ($('#attachments_fields').children().length < 10) {
|
|
4 |
var attachmentsField = $(inputEl).parents('form').find('#attachments_fields') |
|
5 |
if (attachmentsField.children().length < 10) {
|
|
7 | 6 | |
8 | 7 |
var attachmentId = addFile.nextAttachmentId++; |
9 | 8 | |
... | ... | |
13 | 12 |
$('<input>', { type: 'text', 'class': 'filename readonly', name: 'attachments[' + attachmentId + '][filename]', readonly: 'readonly'} ).val(file.name), |
14 | 13 |
$('<input>', { type: 'text', 'class': 'description', name: 'attachments[' + attachmentId + '][description]', maxlength: 255, placeholder: $(inputEl).data('description-placeholder') } ).toggle(!eagerUpload), |
15 | 14 |
$('<a> </a>').attr({ href: "#", 'class': 'remove-upload' }).click(removeFile).toggle(!eagerUpload) |
16 |
).appendTo('#attachments_fields');
|
|
15 |
).appendTo(attachmentsField);
|
|
17 | 16 | |
18 | 17 |
if(eagerUpload) { |
19 | 18 |
ajaxUpload(file, attachmentId, fileSpan, inputEl); |
... | ... | |
102 | 101 |
contentType: 'application/octet-stream', |
103 | 102 |
beforeSend: function(jqXhr, settings) { |
104 | 103 |
jqXhr.setRequestHeader('Accept', 'application/js'); |
105 |
// attach proper File object
|
|
104 |
// attach proper File object |
|
106 | 105 |
settings.data = blob; |
107 | 106 |
}, |
108 | 107 |
xhr: function() { |
... | ... | |
119 | 118 | |
120 | 119 |
function addInputFiles(inputEl) { |
121 | 120 |
var clearedFileInput = $(inputEl).clone().val(''); |
121 |
var attachmentsField = $(inputEl).parents('from').find('#attachments_fields') |
|
122 | 122 | |
123 | 123 |
if ($.ajaxSettings.xhr().upload && inputEl.files) { |
124 | 124 |
// upload files using ajax |
... | ... | |
134 | 134 |
} |
135 | 135 |
} |
136 | 136 | |
137 |
clearedFileInput.insertAfter('#attachments_fields');
|
|
137 |
clearedFileInput.insertAfter(attachmentsField);
|
|
138 | 138 |
} |
139 | 139 | |
140 | 140 |
function uploadAndAttachFiles(files, inputEl) { |
141 | ||
142 | 141 |
var maxFileSize = $(inputEl).data('max-file-size'); |
143 | 142 |
var maxFileSizeExceeded = $(inputEl).data('max-file-size-message'); |
144 | 143 | |
... | ... | |
154 | 153 |
} |
155 | 154 | |
156 | 155 |
function handleFileDropEvent(e) { |
157 | ||
158 | 156 |
$(this).removeClass('fileover'); |
159 | 157 |
blockEventPropagation(e); |
160 | 158 | |
161 | 159 |
if ($.inArray('Files', e.dataTransfer.types) > -1) { |
162 |
uploadAndAttachFiles(e.dataTransfer.files, $('input:file.file_selector')); |
|
160 |
uploadAndAttachFiles(e.dataTransfer.files, $(this).find('input:file.file_selector'));
|
|
163 | 161 |
} |
164 | 162 |
} |
165 | 163 | |
... | ... | |
177 | 175 |
if (window.File && window.FileList && window.ProgressEvent && window.FormData) { |
178 | 176 | |
179 | 177 |
$.event.fixHooks.drop = { props: [ 'dataTransfer' ] }; |
180 | ||
181 | 178 |
$('form div.box').has('input:file').each(function() { |
182 |
$(this).on({ |
|
179 |
$(this).off().on({
|
|
183 | 180 |
dragover: dragOverHandler, |
184 | 181 |
dragleave: dragOutHandler, |
185 | 182 |
drop: handleFileDropEvent |
public/stylesheets/application.css | ||
---|---|---|
404 | 404 |
#issue_tree td.checkbox, #relations td.checkbox {display:none;} |
405 | 405 |
#relations td.buttons {padding:0;} |
406 | 406 | |
407 |
#quick-note {margin-top: 5px; line-height: 1.4em;} |
|
408 |
#quick-note fieldset {margin-top: 5px; background-color: #f6f6f6;} |
|
409 |
#quick-note #journal-new-form {display: none;} |
|
410 | ||
407 | 411 |
fieldset.collapsible {border-width: 1px 0 0 0;} |
408 | 412 |
fieldset.collapsible>legend { padding-left: 16px; background: url(../images/arrow_expanded.png) no-repeat 0% 40%; cursor:pointer; } |
409 | 413 |
fieldset.collapsible.collapsed>legend { background-image: url(../images/arrow_collapsed.png); } |