diff options
author | Jean-Philippe Lang <jp_lang@yahoo.fr> | 2015-08-14 08:20:32 +0000 |
---|---|---|
committer | Jean-Philippe Lang <jp_lang@yahoo.fr> | 2015-08-14 08:20:32 +0000 |
commit | 035edd39c422c9434147a1b0ac457cb9383c9b5b (patch) | |
tree | 4b25e158e04068c535e828c04f336c769ac9db9c /app/views | |
parent | 763d5dddde2c7dda03fe529c9dfe0d553669c277 (diff) | |
download | redmine-035edd39c422c9434147a1b0ac457cb9383c9b5b.tar.gz redmine-035edd39c422c9434147a1b0ac457cb9383c9b5b.zip |
Import issues from CSV file (#950).
git-svn-id: http://svn.redmine.org/redmine/trunk@14493 e93f8b46-1217-0410-a6f0-8f06a7374b81
Diffstat (limited to 'app/views')
-rw-r--r-- | app/views/imports/_fields_mapping.html.erb | 82 | ||||
-rw-r--r-- | app/views/imports/mapping.html.erb | 52 | ||||
-rw-r--r-- | app/views/imports/mapping.js.erb | 1 | ||||
-rw-r--r-- | app/views/imports/new.html.erb | 15 | ||||
-rw-r--r-- | app/views/imports/run.html.erb | 20 | ||||
-rw-r--r-- | app/views/imports/run.js.erb | 11 | ||||
-rw-r--r-- | app/views/imports/settings.html.erb | 26 | ||||
-rw-r--r-- | app/views/imports/show.html.erb | 30 | ||||
-rw-r--r-- | app/views/issues/_sidebar.html.erb | 4 |
9 files changed, 241 insertions, 0 deletions
diff --git a/app/views/imports/_fields_mapping.html.erb b/app/views/imports/_fields_mapping.html.erb new file mode 100644 index 000000000..97dac0e66 --- /dev/null +++ b/app/views/imports/_fields_mapping.html.erb @@ -0,0 +1,82 @@ +<div class="splitcontent"> +<div class="splitcontentleft"> +<p> + <label><%= l(:label_project) %></label> + <%= select_tag 'import_settings[mapping][project_id]', + options_for_select(project_tree_options_for_select(@import.allowed_target_projects, :selected => @import.project)), + :id => 'issue_project_id' %> +</p> +<p> + <label><%= l(:label_tracker) %></label> + <%= select_tag 'import_settings[mapping][tracker_id]', + options_for_select(@import.allowed_target_trackers.sorted.map {|t| [t.name, t.id]}, @import.tracker.try(:id)), + :id => 'issue_tracker_id' %> +</p> +<p> + <label><%= l(:field_subject) %></label> + <%= mapping_select_tag @import, 'subject', :required => true %> +</p> +<p> + <label><%= l(:field_description) %></label> + <%= mapping_select_tag @import, 'description' %> +</p> +<p> + <label><%= l(:field_priority) %></label> + <%= mapping_select_tag @import, 'priority' %> +</p> +<p> + <label><%= l(:field_category) %></label> + <%= mapping_select_tag @import, 'category' %> + <% if User.current.allowed_to?(:manage_categories, @import.project) %> + <label class="block"> + <%= check_box_tag 'import_settings[mapping][create_categories]', '1', @import.create_categories? %> + <%= l(:label_create_missing_values) %> + </label> + <% end %> +</p> +<p> + <label><%= l(:field_assigned_to) %></label> + <%= mapping_select_tag @import, 'assigned_to' %> +</p> +<p> + <label><%= l(:field_fixed_version) %></label> + <%= mapping_select_tag @import, 'fixed_version' %> + <% if User.current.allowed_to?(:manage_versions, @import.project) %> + <label class="block"> + <%= check_box_tag 'import_settings[mapping][create_versions]', '1', @import.create_versions? %> + <%= l(:label_create_missing_values) %> + </label> + <% end %> +</p> +<% @custom_fields.each do |field| %> + <p> + <label><%= field.name %></label> + <%= mapping_select_tag @import, "cf_#{field.id}" %> + </p> +<% end %> +</div> + +<div class="splitcontentright"> +<p> + <label><%= l(:field_is_private) %></label> + <%= mapping_select_tag @import, 'is_private' %> +</p> +<p> + <label><%= l(:field_parent_issue) %></label> + <%= mapping_select_tag @import, 'parent_issue_id' %> +</p> +<p> + <label><%= l(:field_start_date) %></label> + <%= mapping_select_tag @import, 'start_date' %> +</p> +<p> + <label><%= l(:field_due_date) %></label> + <%= mapping_select_tag @import, 'due_date' %> +</p> +<p> + <label><%= l(:field_done_ratio) %></label> + <%= mapping_select_tag @import, 'done_ratio' %> +</p> +</div> +</div> + diff --git a/app/views/imports/mapping.html.erb b/app/views/imports/mapping.html.erb new file mode 100644 index 000000000..283bddb04 --- /dev/null +++ b/app/views/imports/mapping.html.erb @@ -0,0 +1,52 @@ +<h2><%= l(:label_import_issues) %></h2> + +<%= form_tag(import_mapping_path(@import), :id => "import-form") do %> + <fieldset class="box tabular"> + <legend><%= l(:label_fields_mapping) %></legend> + <div id="fields-mapping"> + <%= render :partial => 'fields_mapping' %> + </div> + </fieldset> + + <div class="autoscroll"> + <fieldset class="box"> + <legend><%= l(:label_file_content_preview) %></legend> + + <table class="sample-data"> + <% @import.first_rows.each do |row| %> + <tr> + <%= row.map {|c| content_tag 'td', truncate(c.to_s, :length => 50) }.join("").html_safe %> + </tr> + <% end %> + </table> + </fieldset> + </div> + + <p> + <%= button_tag("\xc2\xab " + l(:label_previous), :name => 'previous') %> + <%= submit_tag l(:button_import) %> + </p> +<% end %> + +<% content_for :sidebar do %> + <%= render :partial => 'issues/sidebar' %> +<% end %> + + +<%= javascript_tag do %> +$(document).ready(function() { + $('#fields-mapping').on('change', '#issue_project_id, #issue_tracker_id', function(){ + $.ajax({ + url: '<%= import_mapping_path(@import, :format => 'js') %>', + type: 'post', + data: $('#import-form').serialize() + }); + }); + + $('#import-form').submit(function(){ + $('#import-details').show().addClass('ajax-loading'); + $('#import-progress').progressbar({value: 0, max: <%= @import.total_items || 0 %>}); + }); + +}); +<% end %> diff --git a/app/views/imports/mapping.js.erb b/app/views/imports/mapping.js.erb new file mode 100644 index 000000000..8fdf14a36 --- /dev/null +++ b/app/views/imports/mapping.js.erb @@ -0,0 +1 @@ +$('#fields-mapping').html('<%= escape_javascript(render :partial => 'fields_mapping') %>'); diff --git a/app/views/imports/new.html.erb b/app/views/imports/new.html.erb new file mode 100644 index 000000000..e20be353a --- /dev/null +++ b/app/views/imports/new.html.erb @@ -0,0 +1,15 @@ +<h2><%= l(:label_import_issues) %></h2> + +<%= form_tag(imports_path, :multipart => true) do %> + <fieldset class="box"> + <legend><%= l(:label_select_file_to_import) %> (CSV)</legend> + <p> + <%= file_field_tag 'file' %> + </p> + </fieldset> + <p><%= submit_tag l(:label_next).html_safe + " »".html_safe, :name => nil %></p> +<% end %> + +<% content_for :sidebar do %> + <%= render :partial => 'issues/sidebar' %> +<% end %> diff --git a/app/views/imports/run.html.erb b/app/views/imports/run.html.erb new file mode 100644 index 000000000..2a723537e --- /dev/null +++ b/app/views/imports/run.html.erb @@ -0,0 +1,20 @@ +<h2><%= l(:label_import_issues) %></h2> + +<div id="import-details"> + <div id="import-progress"><div id="progress-label">0 / <%= @import.total_items.to_i %></div></div> +</div> + +<% content_for :sidebar do %> + <%= render :partial => 'issues/sidebar' %> +<% end %> + +<%= javascript_tag do %> +$(document).ready(function() { + $('#import-details').addClass('ajax-loading'); + $('#import-progress').progressbar({value: 0, max: <%= @import.total_items.to_i %>}); + $.ajax({ + url: '<%= import_run_path(@import, :format => 'js') %>', + type: 'post' + }); +}); +<% end %> diff --git a/app/views/imports/run.js.erb b/app/views/imports/run.js.erb new file mode 100644 index 000000000..232904d7c --- /dev/null +++ b/app/views/imports/run.js.erb @@ -0,0 +1,11 @@ +$('#import-progress').progressbar({value: <%= @current.to_i %>}); +$('#progress-label').text("<%= @current.to_i %> / <%= @import.total_items.to_i %>"); + +<% if @import.finished? %> +window.location.href='<%= import_path(@import) %>'; +<% else %> +$.ajax({ + url: '<%= import_run_path(@import, :format => 'js') %>', + type: 'post' +}); +<% end %> diff --git a/app/views/imports/settings.html.erb b/app/views/imports/settings.html.erb new file mode 100644 index 000000000..7afbb84d5 --- /dev/null +++ b/app/views/imports/settings.html.erb @@ -0,0 +1,26 @@ +<h2><%= l(:label_import_issues) %></h2> + +<%= form_tag(import_settings_path(@import), :id => "import-form") do %> + <fieldset class="box tabular"> + <legend><%= l(:label_options) %></legend> + <p> + <label><%= l(:label_fields_separator) %></label> + <%= select_tag 'import_settings[separator]', + options_for_select([[l(:label_coma_char), ','], [l(:label_semi_colon_char), ';']], @import.settings['separator']) %> + </p> + <p> + <label><%= l(:label_fields_wrapper) %></label> + <%= select_tag 'import_settings[wrapper]', + options_for_select([[l(:label_quote_char), "'"], [l(:label_double_quote_char), '"']], @import.settings['wrapper']) %> + </p> + <p> + <label><%= l(:label_encoding) %></label> + <%= select_tag 'import_settings[encoding]', options_for_select(Setting::ENCODINGS, @import.settings['encoding']) %> + </p> + </fieldset> + <p><%= submit_tag l(:label_next).html_safe + " »".html_safe, :name => nil %></p> +<% end %> + +<% content_for :sidebar do %> + <%= render :partial => 'issues/sidebar' %> +<% end %> diff --git a/app/views/imports/show.html.erb b/app/views/imports/show.html.erb new file mode 100644 index 000000000..ad6ae3681 --- /dev/null +++ b/app/views/imports/show.html.erb @@ -0,0 +1,30 @@ +<h2><%= l(:label_import_issues) %></h2> + +<% if @import.unsaved_items.count == 0 %> + <p><%= l(:notice_import_finished, :count => @import.saved_items.count) %></p> + + <ol> + <% @import.saved_objects.each do |issue| %> + <li><%= link_to_issue issue %></li> + <% end %> + </ul> +<% else %> + <p><%= l(:notice_import_finished_with_errors, :count => @import.unsaved_items.count, :total => @import.total_items) %></p> + + <table id="unsaved-items" class="list"> + <tr> + <th>Position</th> + <th>Message</th> + </tr> + <% @import.unsaved_items.each do |item| %> + <tr> + <td><%= item.position %></td> + <td><%= simple_format_without_paragraph item.message %></td> + </tr> + <% end %> + </table> +<% end %> + +<% content_for :sidebar do %> + <%= render :partial => 'issues/sidebar' %> +<% end %> diff --git a/app/views/issues/_sidebar.html.erb b/app/views/issues/_sidebar.html.erb index dbf191813..df9f43b72 100644 --- a/app/views/issues/_sidebar.html.erb +++ b/app/views/issues/_sidebar.html.erb @@ -12,6 +12,10 @@ <% if User.current.allowed_to?(:view_gantt, @project, :global => true) %> <li><%= link_to l(:label_gantt), _project_gantt_path(@project) %></li> <% end %> + +<% if User.current.allowed_to?(:import_issues, @project, :global => true) %> +<li><%= link_to l(:button_import), new_issues_import_path %></li> +<% end %> </ul> <%= call_hook(:view_issues_sidebar_issues_bottom) %> |