Defect #34922 ยป 34922.patch
| app/views/timelog/_form.html.erb | ||
|---|---|---|
| 1 | 1 | 
    <%= error_messages_for 'time_entry' %>  | 
| 2 | 2 | 
    <%= back_url_hidden_field_tag %>  | 
| 3 | 3 | |
| 4 | 
    <div class="box tabular">
   | 
|
| 4 | 
    <%= labelled_fields_for :time_entry, @time_entry do |f| %>
   | 
|
| 5 | 5 | 
    <% if @time_entry.new_record? && params[:project_id] %>  | 
| 6 | 6 | 
    <%= hidden_field_tag 'project_id', params[:project_id] %>  | 
| 7 | 7 | 
    <% elsif @time_entry.new_record? && params[:issue_id] %>  | 
| ... | ... | |
| 36 | 36 | 
    <% end %>  | 
| 37 | 37 | 
    <% end %>  | 
| 38 | 38 | 
      <%= call_hook(:view_timelog_edit_form_bottom, { :time_entry => @time_entry, :form => f }) %>
   | 
| 39 | 
    </div>
   | 
|
| 39 | 
    <% end %>
   | 
|
| 40 | 40 | |
| 41 | 41 | 
    <%= javascript_tag do %>  | 
| 42 | 42 | 
      $(document).ready(function(){
   | 
| ... | ... | |
| 44 | 44 | 
          $('#time_entry_issue_id').val('');
   | 
| 45 | 45 | 
    });  | 
| 46 | 46 | 
        $('#time_entry_project_id, #time_entry_issue_id').change(function(){
   | 
| 47 | 
          $.ajax({
   | 
|
| 48 | 
    url: '<%= escape_javascript(@time_entry.new_record? ? new_time_entry_path(:format => 'js') : edit_time_entry_path(:format => 'js')) %>',  | 
|
| 49 | 
    type: 'post',  | 
|
| 50 | 
            data: $(this).closest('form').serialize()
   | 
|
| 51 | 
    });  | 
|
| 47 | 
          updateTimeEntryForm('<%= escape_javascript(@time_entry.new_record? ? new_time_entry_path(:format => 'js') : edit_time_entry_path(:format => 'js')) %>');
   | 
|
| 52 | 48 | 
    });  | 
| 53 | 49 | 
    });  | 
| 54 | 50 | |
| app/views/timelog/edit.html.erb | ||
|---|---|---|
| 1 | 1 | 
    <h2><%= l(:label_spent_time) %></h2>  | 
| 2 | 2 | |
| 3 | 
    <%= labelled_form_for @time_entry, :url => time_entry_path(@time_entry), :html => {:multipart => true} do |f| %>
   | 
|
| 3 | 
    <%= labelled_form_for @time_entry, :url => time_entry_path(@time_entry), :html => {:id =>'time-entry-form', :multipart => true} do |f| %>
   | 
|
| 4 | 
    <div class="box tabular" id="all_attributes">  | 
|
| 4 | 5 | 
      <%= render :partial => 'form', :locals => {:f => f} %>
   | 
| 6 | 
    </div>  | 
|
| 5 | 7 | 
    <%= submit_tag l(:button_save) %>  | 
| 6 | 8 | 
    <%= cancel_button_tag_for_time_entry(@project) %>  | 
| 7 | 9 | 
    <% end %>  | 
| app/views/timelog/edit.js.erb | ||
|---|---|---|
| 1 | 
    $('#time_entry_activity_id').html('<%= escape_javascript options_for_select(activity_collection_for_select_options(@time_entry), @time_entry.activity_id) %>');
   | 
|
| 2 | 
    $('#time_entry_issue').html('<%= escape_javascript link_to_issue(@time_entry.issue) if @time_entry.issue.try(:visible?) %>');
   | 
|
| 1 | 
    replaceTimeEntryFormWith('<%= escape_javascript(render :partial => 'form') %>');
   | 
|
| app/views/timelog/new.html.erb | ||
|---|---|---|
| 1 | 1 | 
    <h2><%= l(:label_spent_time) %></h2>  | 
| 2 | 2 | |
| 3 | 
    <%= labelled_form_for @time_entry, :url => time_entries_path, :html => {:multipart => true} do |f| %>
   | 
|
| 3 | 
    <%= labelled_form_for @time_entry, :url => time_entries_path, :html => {:id =>'time-entry-form', :multipart => true} do |f| %>
   | 
|
| 4 | 
    <div class="box tabular" id="all_attributes">  | 
|
| 4 | 5 | 
      <%= render :partial => 'form', :locals => {:f => f} %>
   | 
| 6 | 
    </div>  | 
|
| 5 | 7 | 
    <%= submit_tag l(:button_create) %>  | 
| 6 | 8 | 
    <%= submit_tag l(:button_create_and_continue), :name => 'continue' %>  | 
| 7 | 9 | 
    <%= cancel_button_tag_for_time_entry(@project) %>  | 
| app/views/timelog/new.js.erb | ||
|---|---|---|
| 1 | 
    $('#time_entry_activity_id').html('<%= escape_javascript options_for_select(activity_collection_for_select_options(@time_entry), @time_entry.activity_id) %>');
   | 
|
| 2 | 
    $('#time_entry_issue').html('<%= escape_javascript link_to_issue(@time_entry.issue) if @time_entry.issue.try(:visible?) %>');
   | 
|
| 1 | 
    replaceTimeEntryFormWith('<%= escape_javascript(render :partial => 'form') %>');
   | 
|
| public/javascripts/application.js | ||
|---|---|---|
| 634 | 634 | 
    });  | 
| 635 | 635 | 
    }  | 
| 636 | 636 | |
| 637 | 
    function updateTimeEntryForm(url) {
   | 
|
| 638 | 
      $('#all_attributes input, #all_attributes textarea, #all_attributes select').each(function(){
   | 
|
| 639 | 
        $(this).data('valuebeforeupdate', $(this).val());
   | 
|
| 640 | 
    });  | 
|
| 641 | 
      return $.ajax({
   | 
|
| 642 | 
    url: url,  | 
|
| 643 | 
    type: 'post',  | 
|
| 644 | 
        data: $('#time-entry-form').serialize()
   | 
|
| 645 | 
    });  | 
|
| 646 | 
    }  | 
|
| 647 | ||
| 648 | 
    function replaceTimeEntryFormWith(html){
   | 
|
| 649 | 
    var replacement = $(html);  | 
|
| 650 | 
      $('#all_attributes input, #all_attributes textarea, #all_attributes select').each(function(){
   | 
|
| 651 | 
        var object_id = $(this).attr('id');
   | 
|
| 652 | 
        if (object_id && $(this).data('valuebeforeupdate')!=$(this).val()) {
   | 
|
| 653 | 
          replacement.find('#'+object_id).val($(this).val());
   | 
|
| 654 | 
    }  | 
|
| 655 | 
    });  | 
|
| 656 | 
      $('#all_attributes').empty();
   | 
|
| 657 | 
      $('#all_attributes').prepend(replacement);
   | 
|
| 658 | 
    }  | 
|
| 659 | ||
| 637 | 660 | 
    function observeAutocompleteField(fieldId, url, options) {
   | 
| 638 | 661 | 
      $(document).ready(function() {
   | 
| 639 | 662 | 
        $('#'+fieldId).autocomplete($.extend({
   | 
| test/application_system_test_case.rb | ||
|---|---|---|
| 81 | 81 | 
    assert_equal '/my/page', current_path  | 
| 82 | 82 | 
    end  | 
| 83 | 83 | |
| 84 | 
    def wait_for_ajax  | 
|
| 85 | 
    Timeout.timeout(Capybara.default_max_wait_time) do  | 
|
| 86 | 
          loop until page.evaluate_script("jQuery.active").zero?
   | 
|
| 87 | 
    end  | 
|
| 88 | 
    end  | 
|
| 89 | ||
| 84 | 90 | 
    def clear_downloaded_files  | 
| 85 | 91 | 
    FileUtils.rm downloaded_files  | 
| 86 | 92 | 
    end  | 
| test/functional/timelog_controller_test.rb | ||
|---|---|---|
| 143 | 143 | 
    @request.session[:user_id] = 3  | 
| 144 | 144 | 
        post :new, :params => {:time_entry => {:project_id => 1}, :format => 'js'}
   | 
| 145 | 145 | 
    assert_response :success  | 
| 146 | 
        assert_include '#time_entry_activity_id', response.body
   | 
|
| 146 | 
        assert_include 'id=\"time_entry_activity_id\"', response.body
   | 
|
| 147 | 147 | 
    end  | 
| 148 | 148 | |
| 149 | 149 | 
    def test_get_edit_existing_time  | 
| test/system/timelog_test.rb | ||
|---|---|---|
| 38 | 38 | 
          assert has_content?('Design')
   | 
| 39 | 39 | 
    end  | 
| 40 | 40 | |
| 41 | 
        within 'form#new_time_entry' do
   | 
|
| 41 | 
        within 'form#time-entry-form' do
   | 
|
| 42 | 42 | 
    select 'eCookbook', :from => 'Project'  | 
| 43 | 43 | 
    end  | 
| 44 | 
    wait_for_ajax  | 
|
| 44 | 45 | 
    within 'select#time_entry_activity_id' do  | 
| 45 | 46 | 
          assert has_content?('Development')
   | 
| 46 | 47 | 
          assert !has_content?('Design')
   | 
| 47 | 48 | 
    end  | 
| 48 | 49 | 
    end  | 
| 49 | 50 | |
| 51 | 
    def test_changing_project_should_switch_show_or_hide_custom_fields_depending_on_roles  | 
|
| 52 | 
    project1 = Project.find(1) # eCookbook  | 
|
| 53 | 
    project2 = Project.find(2) # OnlineStore  | 
|
| 54 | 
    project2.enable_module!(:time_tracking)  | 
|
| 55 | 
    user = User.find(2) # jsmith  | 
|
| 56 | 
    assert_equal [1], user.roles_for_project(project1).collect(&:id).sort  | 
|
| 57 | 
    assert_equal [2], user.roles_for_project(project2).collect(&:id).sort  | 
|
| 58 | 
    custom_field = TimeEntryCustomField.find(10) # Overtime  | 
|
| 59 | 
    custom_field.visible = 0  | 
|
| 60 | 
    custom_field.role_ids = [1]  | 
|
| 61 | 
    custom_field.save!  | 
|
| 62 | ||
| 63 | 
    log_user 'jsmith', 'jsmith'  | 
|
| 64 | 
    visit '/time_entries/new'  | 
|
| 65 | ||
| 66 | 
    within 'form#time-entry-form' do  | 
|
| 67 | 
          assert has_no_content?('Overtime')
   | 
|
| 68 | ||
| 69 | 
    select 'eCookbook', from: 'Project'  | 
|
| 70 | 
    wait_for_ajax  | 
|
| 71 | 
          assert has_content?('Overtime')
   | 
|
| 72 | ||
| 73 | 
    select 'OnlineStore', from: 'Project'  | 
|
| 74 | 
    wait_for_ajax  | 
|
| 75 | 
          assert has_no_content?('Overtime')
   | 
|
| 76 | 
    end  | 
|
| 77 | 
    end  | 
|
| 78 | ||
| 50 | 79 | 
    def test_bulk_edit  | 
| 51 | 80 | 
    log_user 'jsmith', 'jsmith'  | 
| 52 | 81 | 
    visit '/time_entries/bulk_edit?ids[]=1&ids[]=2&ids[]=3'  |