summaryrefslogtreecommitdiffstats
path: root/app/views
diff options
context:
space:
mode:
authorJean-Philippe Lang <jp_lang@yahoo.fr>2015-08-14 08:20:32 +0000
committerJean-Philippe Lang <jp_lang@yahoo.fr>2015-08-14 08:20:32 +0000
commit035edd39c422c9434147a1b0ac457cb9383c9b5b (patch)
tree4b25e158e04068c535e828c04f336c769ac9db9c /app/views
parent763d5dddde2c7dda03fe529c9dfe0d553669c277 (diff)
downloadredmine-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.erb82
-rw-r--r--app/views/imports/mapping.html.erb52
-rw-r--r--app/views/imports/mapping.js.erb1
-rw-r--r--app/views/imports/new.html.erb15
-rw-r--r--app/views/imports/run.html.erb20
-rw-r--r--app/views/imports/run.js.erb11
-rw-r--r--app/views/imports/settings.html.erb26
-rw-r--r--app/views/imports/show.html.erb30
-rw-r--r--app/views/issues/_sidebar.html.erb4
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 + " &#187;".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 + " &#187;".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) %>