diff --git a/app/views/issues/show.html.erb b/app/views/issues/show.html.erb index 2cbff32..ac98b98 100644 --- a/app/views/issues/show.html.erb +++ b/app/views/issues/show.html.erb @@ -128,6 +128,9 @@ end %>
<%= render :partial => 'action_menu' %> +<% if @issue.editable? || User.current.allowed_to?(:add_issue_notes, @project) %> + <%= render :partial => 'journals/notes_new_form' %> +<% end %>
<% if @issue.editable? %> diff --git a/app/views/journals/_notes_new_form.html.erb b/app/views/journals/_notes_new_form.html.erb new file mode 100644 index 0000000..254342b --- /dev/null +++ b/app/views/journals/_notes_new_form.html.erb @@ -0,0 +1,29 @@ +
+ <%= link_to l('button_add_notes'), {}, :id => "add-note", :class => "icon icon-comment", :onclick => "showAddNotesForm(); return false;"%> + +
+ <%= labelled_form_for @issue, :html => {:id => 'journal-new-form', :multipart => true} do |f| %> +
+
+ <%= l(:field_notes) %> + <%= f.text_area :notes, :id => "journal_new_notes", :class => 'wiki-edit', :rows => 10, :no_label => true %> + + <% if @issue.safe_attribute? 'private_notes' %> + <%= f.check_box :private_notes, :no_label => true %> + + <% end %> + <%= call_hook(:view_issues_edit_notes_bottom, { :issue => @issue, :notes => @notes, :form => f }) %> + +

<%= render :partial => 'attachments/form', :locals => {:container => @issue} %>

+
+
+

<%= submit_tag l(:button_submit) %> + <%= preview_link preview_edit_issue_path(:project_id => @project, :id => @issue), + "journal-new-form", + "journal_new_preview" %> | + <%= link_to l(:button_cancel), '#', :onclick => "hideAddNotesForm(); return false;" %>

+ +
+<% end %> +<%= wikitoolbar_for "journal_new_notes" %> +
\ No newline at end of file diff --git a/config/locales/en.yml b/config/locales/en.yml index 56a06c7..09323fa 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -1057,6 +1057,7 @@ en: button_reopen: Reopen button_import: Import button_filter: Filter + button_add_notes: Add notes status_active: active status_registered: registered diff --git a/public/javascripts/application.js b/public/javascripts/application.js index 64d3e8e..7c05867 100644 --- a/public/javascripts/application.js +++ b/public/javascripts/application.js @@ -730,6 +730,15 @@ function toggleDisabledInit() { $('input[data-disables], input[data-enables], input[data-shows]').each(toggleDisabledOnChange); } +function showAddNotesForm(){ + $('#journal-new-form').show().find('#journal_new_notes').focus(); + $("a#add-note").hide(); +} +function hideAddNotesForm(){ + $('#journal-new-form').hide(); + $('#add-note').show(); +} + function toggleNewObjectDropdown() { var dropdown = $('#new-object + ul.menu-children'); if(dropdown.hasClass('visible')){ diff --git a/public/javascripts/attachments.js b/public/javascripts/attachments.js index c5e6b96..a15d4ea 100644 --- a/public/javascripts/attachments.js +++ b/public/javascripts/attachments.js @@ -1,9 +1,8 @@ /* Redmine - project management software Copyright (C) 2006-2016 Jean-Philippe Lang */ - function addFile(inputEl, file, eagerUpload) { - - if ($('#attachments_fields').children().length < 10) { + var attachmentsField = $(inputEl).parents('form').find('#attachments_fields') + if (attachmentsField.children().length < 10) { var attachmentId = addFile.nextAttachmentId++; @@ -13,7 +12,7 @@ function addFile(inputEl, file, eagerUpload) { $('', { type: 'text', 'class': 'filename readonly', name: 'attachments[' + attachmentId + '][filename]', readonly: 'readonly'} ).val(file.name), $('', { type: 'text', 'class': 'description', name: 'attachments[' + attachmentId + '][description]', maxlength: 255, placeholder: $(inputEl).data('description-placeholder') } ).toggle(!eagerUpload), $(' ').attr({ href: "#", 'class': 'remove-upload' }).click(removeFile).toggle(!eagerUpload) - ).appendTo('#attachments_fields'); + ).appendTo(attachmentsField); if(eagerUpload) { ajaxUpload(file, attachmentId, fileSpan, inputEl); @@ -102,7 +101,7 @@ function uploadBlob(blob, uploadUrl, attachmentId, options) { contentType: 'application/octet-stream', beforeSend: function(jqXhr, settings) { jqXhr.setRequestHeader('Accept', 'application/js'); - // attach proper File object + // attach proper File object settings.data = blob; }, xhr: function() { @@ -119,6 +118,7 @@ function uploadBlob(blob, uploadUrl, attachmentId, options) { function addInputFiles(inputEl) { var clearedFileInput = $(inputEl).clone().val(''); + var attachmentsField = $(inputEl).parents('from').find('#attachments_fields') if ($.ajaxSettings.xhr().upload && inputEl.files) { // upload files using ajax @@ -134,11 +134,10 @@ function addInputFiles(inputEl) { } } - clearedFileInput.insertAfter('#attachments_fields'); + clearedFileInput.insertAfter(attachmentsField); } function uploadAndAttachFiles(files, inputEl) { - var maxFileSize = $(inputEl).data('max-file-size'); var maxFileSizeExceeded = $(inputEl).data('max-file-size-message'); @@ -154,12 +153,11 @@ function uploadAndAttachFiles(files, inputEl) { } function handleFileDropEvent(e) { - $(this).removeClass('fileover'); blockEventPropagation(e); if ($.inArray('Files', e.dataTransfer.types) > -1) { - uploadAndAttachFiles(e.dataTransfer.files, $('input:file.file_selector')); + uploadAndAttachFiles(e.dataTransfer.files, $(this).find('input:file.file_selector')); } } @@ -177,9 +175,8 @@ function setupFileDrop() { if (window.File && window.FileList && window.ProgressEvent && window.FormData) { $.event.fixHooks.drop = { props: [ 'dataTransfer' ] }; - $('form div.box').has('input:file').each(function() { - $(this).on({ + $(this).off().on({ dragover: dragOverHandler, dragleave: dragOutHandler, drop: handleFileDropEvent diff --git a/public/stylesheets/application.css b/public/stylesheets/application.css index 1f47dd4..4ee8448 100644 --- a/public/stylesheets/application.css +++ b/public/stylesheets/application.css @@ -404,6 +404,10 @@ div.issue.overdue .due-date .value { color: #c22; } #issue_tree td.checkbox, #relations td.checkbox {display:none;} #relations td.buttons {padding:0;} +#quick-note {margin-top: 5px; line-height: 1.4em;} +#quick-note fieldset {margin-top: 5px; background-color: #f6f6f6;} +#quick-note #journal-new-form {display: none;} + fieldset.collapsible {border-width: 1px 0 0 0;} fieldset.collapsible>legend { padding-left: 16px; background: url(../images/arrow_expanded.png) no-repeat 0% 40%; cursor:pointer; } fieldset.collapsible.collapsed>legend { background-image: url(../images/arrow_collapsed.png); }