[ARVADOS] updated: c52a78b386adeebf33c618b669f33ca87c466eee

git at public.curoverse.com git at public.curoverse.com
Mon May 5 11:21:57 EDT 2014


Summary of changes:
 .../app/assets/javascripts/application.js          |    1 -
 apps/workbench/app/assets/javascripts/editable.js  |   43 +++++++++-
 apps/workbench/app/assets/javascripts/folders.js   |    5 +
 .../app/controllers/application_controller.rb      |   13 +--
 .../app/controllers/folders_controller.rb          |   29 ++++++-
 apps/workbench/app/helpers/application_helper.rb   |    2 +-
 apps/workbench/app/models/arvados_base.rb          |   12 ++-
 apps/workbench/app/models/arvados_resource_list.rb |   11 ++-
 .../application/_delete_object_button.html.erb     |    2 +-
 .../workbench/app/views/folders/remove_item.js.erb |    5 +
 apps/workbench/app/views/folders/show.html.erb     |   64 +++++++-------
 .../app/views/layouts/application.html.erb         |    4 +-
 apps/workbench/test/integration/folders_test.rb    |   24 +++++-
 apps/workbench/test/integration/users_test.rb      |    4 +-
 .../test/unit/arvados_resource_list_test.rb        |   20 ++++
 doc/api/methods.html.textile.liquid                |   10 ++-
 .../api/app/controllers/application_controller.rb  |   28 +++++--
 .../app/controllers/arvados/v1/jobs_controller.rb  |    2 +-
 .../arvados/v1/repositories_controller.rb          |    6 ++
 .../controllers/arvados/v1/schema_controller.rb    |   10 ++
 services/api/app/models/arvados_model.rb           |   93 ++++++++++++++------
 services/api/app/models/link.rb                    |    2 +-
 services/api/app/models/node.rb                    |    2 +-
 services/api/lib/current_api_client.rb             |    4 +-
 services/api/lib/load_param.rb                     |   44 +++++++++-
 services/api/test/fixtures/api_clients.yml         |    2 +
 services/api/test/fixtures/authorized_keys.yml     |   15 +++
 services/api/test/fixtures/groups.yml              |   20 ++++
 services/api/test/fixtures/links.yml               |   28 ++++++
 services/api/test/fixtures/specimens.yml           |    6 ++
 .../arvados/v1/repositories_controller_test.rb     |   42 +++++++++
 services/api/test/integration/select_test.rb       |   82 +++++++++++++++++
 services/api/test/test_helper.rb                   |   13 ++-
 services/api/test/unit/group_test.rb               |   60 ++++++++++++-
 services/api/test/unit/log_test.rb                 |    7 --
 services/api/test/unit/permission_test.rb          |   17 ++++
 36 files changed, 616 insertions(+), 116 deletions(-)
 create mode 100644 apps/workbench/app/views/folders/remove_item.js.erb
 create mode 100644 apps/workbench/test/unit/arvados_resource_list_test.rb
 create mode 100644 services/api/test/fixtures/authorized_keys.yml
 create mode 100644 services/api/test/integration/select_test.rb
 create mode 100644 services/api/test/unit/permission_test.rb

       via  c52a78b386adeebf33c618b669f33ca87c466eee (commit)
       via  3e9576ef93a4d86882147b34ef9a28016375b865 (commit)
       via  ec56622b42f85aef2b4e8811378f8c99a6df24ea (commit)
       via  c6ad75e4241247ac18f5a5a8c397537dc6be1e3c (commit)
       via  02b233b2eb80de1b234f3658d86a0e446e33a032 (commit)
       via  428abec08e6ec59c38b7dc640396db950d42702b (commit)
       via  6ada98b925a7b82a87446aacd0f6cca28df1b510 (commit)
       via  11c6f1d759040f2af8a68d80ae78dd57a9b2d976 (commit)
       via  76e20e694fbe708e17e57a2e0b1c36aca6e8d7d0 (commit)
       via  988726079e8e2f8ce4b49115c10a8a1d22040972 (commit)
       via  4e05647f7a5b3971771c5a928634c6b2a41aa591 (commit)
       via  f263c987ad0b144393edd28f281c5b19e84fdf0b (commit)
       via  10d03fd3b09ec9f2eaea62cc665a1022f3744b89 (commit)
       via  3ea6744bcf9cc4812ab24913286c3bc8e123b76a (commit)
       via  af3a38d81374f70d15134813563b7371e8e4127c (commit)
       via  6c8ba53502c29dc9174291c04f3c7bc84777f9cc (commit)
       via  307cf5007269a069b8c80dc14da134ec145cd292 (commit)
       via  1d5a33d2af1e39041177681c8d66007b40b20df4 (commit)
       via  dca6cfe9750d8d1be4f3b63895b8cb73cc6c4cfe (commit)
       via  0ed6856e2dd4c057e34ba5b2079cef0158ebc53f (commit)
       via  bcc477ed88c04b3200a70d16f1fc99da11c670f8 (commit)
       via  de54cdcea8dca015e3b08bb23f7221faa4814ef0 (commit)
       via  0df7a1c38affbc50a9c7d8834f9822e398860d91 (commit)
       via  b4a9aaa3d68129d6e948dde46cee63cd66597aba (commit)
       via  fe78b629dc39298c5990a093e73b7c6231f387b0 (commit)
       via  7a73008bcd015300461c34ce852d660f8244e11f (commit)
      from  b8dc9c22c0a76b5ed8b36a42d06c45bd3069b6f5 (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.


commit c52a78b386adeebf33c618b669f33ca87c466eee
Author: Tom Clegg <tom at curoverse.com>
Date:   Mon May 5 06:58:54 2014 -0400

    Fix ajax->refresh race condition in test case.

diff --git a/apps/workbench/test/integration/users_test.rb b/apps/workbench/test/integration/users_test.rb
index 3bedc6d..6df7ee3 100644
--- a/apps/workbench/test/integration/users_test.rb
+++ b/apps/workbench/test/integration/users_test.rb
@@ -65,7 +65,7 @@ class UsersTest < ActionDispatch::IntegrationTest
       click_button "Submit"
     end
 
-    sleep 0.1
+    visit '/users'
 
     # verify that the new user showed up in the users page and find
     # the new user's UUID

commit 3e9576ef93a4d86882147b34ef9a28016375b865
Author: Tom Clegg <tom at curoverse.com>
Date:   Mon May 5 06:32:27 2014 -0400

    Fix tests, make model.editable? work for new records.

diff --git a/apps/workbench/app/models/arvados_base.rb b/apps/workbench/app/models/arvados_base.rb
index 0418267..1a0da64 100644
--- a/apps/workbench/app/models/arvados_base.rb
+++ b/apps/workbench/app/models/arvados_base.rb
@@ -266,7 +266,8 @@ class ArvadosBase < ActiveRecord::Base
   def editable?
     (current_user and current_user.is_active and
      (current_user.is_admin or
-      current_user.uuid == self.owner_uuid))
+      current_user.uuid == self.owner_uuid or
+      new_record?))
   end
 
   def attribute_editable?(attr)
@@ -277,7 +278,9 @@ class ArvadosBase < ActiveRecord::Base
     elsif "uuid owner_uuid".index(attr.to_s) or current_user.is_admin
       current_user.is_admin
     else
-      current_user.uuid == self.owner_uuid or current_user.uuid == self.uuid
+      current_user.uuid == self.owner_uuid or
+        current_user.uuid == self.uuid or
+        new_record?
     end
   end
 
diff --git a/apps/workbench/test/integration/folders_test.rb b/apps/workbench/test/integration/folders_test.rb
index da3d4c0..c8753ac 100644
--- a/apps/workbench/test/integration/folders_test.rb
+++ b/apps/workbench/test/integration/folders_test.rb
@@ -8,8 +8,7 @@ class FoldersTest < ActionDispatch::IntegrationTest
     Capybara.current_driver = Capybara.javascript_driver
     visit page_with_token 'active', '/'
     find('nav a', text: 'Folders').click
-    find('.side-nav', text: 'A Folder').
-      find('a,button', text: 'Show').
+    find('.side-nav a,button', text: 'A Folder').
       click
     within('.panel', text: api_fixture('groups')['afolder']['name']) do
       find('span', text: api_fixture('groups')['afolder']['name']).click
@@ -26,8 +25,8 @@ class FoldersTest < ActionDispatch::IntegrationTest
     folder_uuid = api_fixture('groups')['afolder']['uuid']
     specimen_uuid = api_fixture('specimens')['owned_by_afolder_with_no_name_link']['uuid']
     visit page_with_token 'active', '/folders/' + folder_uuid
-    within('.panel', text: 'Contents') do
-      find('.tr[data-object-uuid="'+specimen_uuid+'"] .editable[data-name="name"]').click
+    within('.panel tr', text: specimen_uuid) do
+      find(".editable[data-name='name']").click
       find('.editable-input input').set('Now I have a name.')
       find('.glyphicon-ok').click
       find('.editable', text: 'Now I have a name.').click
diff --git a/apps/workbench/test/integration/users_test.rb b/apps/workbench/test/integration/users_test.rb
index bd69f99..3bedc6d 100644
--- a/apps/workbench/test/integration/users_test.rb
+++ b/apps/workbench/test/integration/users_test.rb
@@ -166,7 +166,7 @@ class UsersTest < ActionDispatch::IntegrationTest
       click
 
     # Verify that is_active is set
-    click_link 'Attributes'
+    find('a,button', text: 'Attributes').click
     assert page.has_text? 'modified_by_user_uuid'
     page.within(:xpath, '//span[@data-name="is_active"]') do
       assert_equal "true", text, "Expected user's is_active to be true"

commit ec56622b42f85aef2b4e8811378f8c99a6df24ea
Author: Tom Clegg <tom at curoverse.com>
Date:   Mon May 5 06:06:16 2014 -0400

    Edit objects after creating them with x-editable.

diff --git a/apps/workbench/app/assets/javascripts/editable.js b/apps/workbench/app/assets/javascripts/editable.js
index ce502b3..8eea169 100644
--- a/apps/workbench/app/assets/javascripts/editable.js
+++ b/apps/workbench/app/assets/javascripts/editable.js
@@ -12,11 +12,17 @@ $.fn.editable.defaults.send = 'always';
 $.fn.editable.defaults.params = function (params) {
     var a = {};
     var key = params.pk.key;
-    a.id = params.pk.id;
+    a.id = $(this).attr('data-object-uuid') || params.pk.id;
     a[key] = params.pk.defaults || {};
+    // Remove null values. Otherwise they get transmitted as empty
+    // strings in request params.
+    for (i in a[key]) {
+        if (a[key][i] == null)
+            delete a[key][i];
+    }
     a[key][params.name] = params.value;
-    if (params.pk._method) {
-        a['_method'] = params.pk._method;
+    if (!a.id) {
+        a['_method'] = 'post';
     } else {
         a['_method'] = 'put';
     }
@@ -35,20 +41,34 @@ $(document).
             console.log($(this));
         });
         $('.editable').
-            editable().
-            on('hidden', function(e, reason) {
-                if (reason == 'save') {
-                    var html = $(this).html();
-                    var uuid = $(this).attr('data-object-uuid');
-                    var attr = $(this).attr('data-name');
-                    var edited = this;
-                    if (uuid && attr) {
-                        $("[data-object-uuid='" + uuid + "']" +
-                          "[data-name='" + attr + "']").each(function() {
-                              if (this != edited)
-                                  $(this).html(html);
-                          });
+            editable({
+                success: function(response, newValue) {
+                    // If we just created a new object, stash its UUID
+                    // so we edit it next time instead of creating
+                    // another new object.
+                    if (!$(this).attr('data-object-uuid') && response.uuid) {
+                        $(this).attr('data-object-uuid', response.uuid);
+                    }
+                    if (response.href) {
+                        $(this).editable('option', 'url', response.href);
                     }
+                    return;
+                }
+            }).
+            on('hidden', function(e, reason) {
+                // After saving a new attribute, update the same
+                // information if it appears elsewhere on the page.
+                if (reason != 'save') return;
+                var html = $(this).html();
+                var uuid = $(this).attr('data-object-uuid');
+                var attr = $(this).attr('data-name');
+                var edited = this;
+                if (uuid && attr) {
+                    $("[data-object-uuid='" + uuid + "']" +
+                      "[data-name='" + attr + "']").each(function() {
+                          if (this != edited)
+                              $(this).html(html);
+                      });
                 }
             });
     });
diff --git a/apps/workbench/app/controllers/application_controller.rb b/apps/workbench/app/controllers/application_controller.rb
index 8c540fc..784c06a 100644
--- a/apps/workbench/app/controllers/application_controller.rb
+++ b/apps/workbench/app/controllers/application_controller.rb
@@ -95,7 +95,7 @@ class ApplicationController < ActionController::Base
       return render_not_found("object not found")
     end
     respond_to do |f|
-      f.json { render json: @object }
+      f.json { render json: @object.attributes.merge(href: url_for(@object)) }
       f.html {
         if request.method == 'GET'
           render
@@ -145,14 +145,7 @@ class ApplicationController < ActionController::Base
     @new_resource_attrs.reject! { |k,v| k.to_s == 'uuid' }
     @object ||= model_class.new @new_resource_attrs
     @object.save!
-
-    respond_to do |f|
-      f.json { render json: @object }
-      f.html {
-        redirect_to(params[:return_to] || @object)
-      }
-      f.js { render }
-    end
+    show
   end
 
   def destroy
diff --git a/apps/workbench/app/controllers/folders_controller.rb b/apps/workbench/app/controllers/folders_controller.rb
index e0ac625..906ef27 100644
--- a/apps/workbench/app/controllers/folders_controller.rb
+++ b/apps/workbench/app/controllers/folders_controller.rb
@@ -9,6 +9,7 @@ class FoldersController < ApplicationController
 
   def remove_item
     @removed_uuids = []
+    links = []
     item = ArvadosBase.find params[:item_uuid]
     if (item.class == Link and
         item.link_class == 'name' and
@@ -16,8 +17,15 @@ class FoldersController < ApplicationController
       # Given uuid is a name link, linking an object to this
       # folder. First follow the link to find the item we're removing,
       # then delete the link.
-      link = item
-      item = ArvadosBase.find link.head_uuid
+      links << item
+      item = ArvadosBase.find item.head_uuid
+    else
+      # Given uuid is an object. Delete all names.
+      links += Link.where(tail_uuid: @object.uuid,
+                          head_uuid: item.uuid,
+                          link_class: 'name')
+    end
+    links.each do |link|
       @removed_uuids << link.uuid
       link.destroy
     end
diff --git a/apps/workbench/app/helpers/application_helper.rb b/apps/workbench/app/helpers/application_helper.rb
index 2e85f0f..dbb05d6 100644
--- a/apps/workbench/app/helpers/application_helper.rb
+++ b/apps/workbench/app/helpers/application_helper.rb
@@ -152,7 +152,6 @@ module ApplicationHelper
     else
       ajax_options['data-url'] = url_for(action: "create", controller: object.class.to_s.pluralize.underscore)
       ajax_options['data-pk'][:defaults] = object.attributes
-      ajax_options['data-pk'][:_method] = 'post'
     end
     ajax_options['data-pk'] = ajax_options['data-pk'].to_json
 
diff --git a/apps/workbench/app/views/folders/show.html.erb b/apps/workbench/app/views/folders/show.html.erb
index 7759b55..11bb52c 100644
--- a/apps/workbench/app/views/folders/show.html.erb
+++ b/apps/workbench/app/views/folders/show.html.erb
@@ -132,35 +132,35 @@
               <col width="8%" />
             </colgroup>
             <% @objects_and_names.each do |object, name_link| %>
-            <tr data-object-uuid="<%= (name_link || object).uuid %>">
-              <td>
-                <%= render :partial => "selection_checkbox", :locals => {object: object} %>
-              </td>
-              <td>
-                <%= render :partial => "show_object_button", :locals => {object: object, size: 'xs'} %>
-              </td>
-              <td>
-                <%= render_editable_attribute name_link, 'name', nil, {data: {emptytext: "Unnamed #{object.class_for_display}"}} %>
-              </td>
-              <td>
-                <%= object.content_summary %>
-              </td>
-              <td title="<%= object.modified_at %>">
-                <span>
-                  <%= raw distance_of_time_in_words(object.modified_at, Time.now).sub('about ','~').sub(' ',' ') + ' ago' rescue object.modified_at %>
-                </span>
-              </td>
-              <td class="arvados-uuid">
-                <%= object.uuid %>
-              </td>
-              <td>
-                <% if @object.editable? %>
-                  <%= link_to({action: 'remove_item', id: @object.uuid, item_uuid: (name_link || object).uuid}, method: :delete, remote: true, data: {confirm: "You are about to remove #{object.class_for_display} #{object.uuid} from this folder.\n\nAre you sure?"}, class: 'btn btn-xs btn-default') do %>
-                    Remove <i class="fa fa-fw fa-ban"></i>
+              <tr data-object-uuid="<%= (name_link && name_link.uuid) || object.uuid %>">
+                <td>
+                  <%= render :partial => "selection_checkbox", :locals => {object: object} %>
+                </td>
+                <td>
+                  <%= render :partial => "show_object_button", :locals => {object: object, size: 'xs'} %>
+                </td>
+                <td>
+                  <%= render_editable_attribute name_link, 'name', nil, {data: {emptytext: "Unnamed #{object.class_for_display}"}} %>
+                </td>
+                <td>
+                  <%= object.content_summary %>
+                </td>
+                <td title="<%= object.modified_at %>">
+                  <span>
+                    <%= raw distance_of_time_in_words(object.modified_at, Time.now).sub('about ','~').sub(' ',' ') + ' ago' rescue object.modified_at %>
+                  </span>
+                </td>
+                <td class="arvados-uuid">
+                  <%= object.uuid %>
+                </td>
+                <td>
+                  <% if @object.editable? %>
+                    <%= link_to({action: 'remove_item', id: @object.uuid, item_uuid: ((name_link && name_link.uuid) || object.uuid)}, method: :delete, remote: true, data: {confirm: "You are about to remove #{object.class_for_display} #{object.uuid} from this folder.\n\nAre you sure?"}, class: 'btn btn-xs btn-default') do %>
+                      Remove <i class="fa fa-fw fa-ban"></i>
+                    <% end %>
                   <% end %>
-                <% end %>
-              </td>
-            </tr>
+                </td>
+              </tr>
             <% end %>
           </tbody>
           <thead>
diff --git a/apps/workbench/test/integration/folders_test.rb b/apps/workbench/test/integration/folders_test.rb
index d9322e6..da3d4c0 100644
--- a/apps/workbench/test/integration/folders_test.rb
+++ b/apps/workbench/test/integration/folders_test.rb
@@ -8,7 +8,7 @@ class FoldersTest < ActionDispatch::IntegrationTest
     Capybara.current_driver = Capybara.javascript_driver
     visit page_with_token 'active', '/'
     find('nav a', text: 'Folders').click
-    find('tr', text: 'A Folder').
+    find('.side-nav', text: 'A Folder').
       find('a,button', text: 'Show').
       click
     within('.panel', text: api_fixture('groups')['afolder']['name']) do
@@ -21,4 +21,25 @@ class FoldersTest < ActionDispatch::IntegrationTest
     #find('.panel', text: 'I just edited this.')
   end
 
+  test 'Add a new name, then edit it, without creating a duplicate' do
+    Capybara.current_driver = Capybara.javascript_driver
+    folder_uuid = api_fixture('groups')['afolder']['uuid']
+    specimen_uuid = api_fixture('specimens')['owned_by_afolder_with_no_name_link']['uuid']
+    visit page_with_token 'active', '/folders/' + folder_uuid
+    within('.panel', text: 'Contents') do
+      find('.tr[data-object-uuid="'+specimen_uuid+'"] .editable[data-name="name"]').click
+      find('.editable-input input').set('Now I have a name.')
+      find('.glyphicon-ok').click
+      find('.editable', text: 'Now I have a name.').click
+      find('.editable-input input').set('Now I have a new name.')
+      find('.glyphicon-ok').click
+      find('.editable', text: 'Now I have a new name.')
+    end
+    visit current_path
+    within '.panel', text: 'Contents' do
+      find '.editable', text: 'Now I have a new name.'
+      page.assert_no_selector '.editable', text: 'Now I have a name.'
+    end
+  end
+
 end
diff --git a/services/api/test/fixtures/specimens.yml b/services/api/test/fixtures/specimens.yml
index 3465167..c48bff7 100644
--- a/services/api/test/fixtures/specimens.yml
+++ b/services/api/test/fixtures/specimens.yml
@@ -33,3 +33,9 @@ in_afolder_linked_from_asubfolder:
   owner_uuid: zzzzz-j7d0g-v955i6s2oi1cbso
   created_at: 2014-04-21 15:37:48 -0400
   modified_at: 2014-04-21 15:37:48 -0400
+
+owned_by_afolder_with_no_name_link:
+  uuid: zzzzz-j58dm-ypsjlol9dofwijz
+  owner_uuid: zzzzz-j7d0g-v955i6s2oi1cbso
+  created_at: 2014-05-05 04:11:52 -0400
+  modified_at: 2014-05-05 04:11:52 -0400

commit c6ad75e4241247ac18f5a5a8c397537dc6be1e3c
Author: Tom Clegg <tom at curoverse.com>
Date:   Mon May 5 04:01:48 2014 -0400

    Implement simple client-side folder contents search.

diff --git a/apps/workbench/app/assets/javascripts/folders.js b/apps/workbench/app/assets/javascripts/folders.js
index 2e413b4..10695cf 100644
--- a/apps/workbench/app/assets/javascripts/folders.js
+++ b/apps/workbench/app/assets/javascripts/folders.js
@@ -4,4 +4,9 @@ $(document).
             e.stopPropagation();
             $($(this).attr('data-toggle-selector')).editable('toggle');
         });
+    }).on('paste keyup change', 'input.search-folder-contents', function() {
+        var q = new RegExp($(this).val(), 'i');
+        $(this).closest('div.panel').find('tbody tr').each(function() {
+            $(this).toggle(!!$(this).text().match(q));
+        });
     });
diff --git a/apps/workbench/app/views/folders/show.html.erb b/apps/workbench/app/views/folders/show.html.erb
index 0ee32f2..7759b55 100644
--- a/apps/workbench/app/views/folders/show.html.erb
+++ b/apps/workbench/app/views/folders/show.html.erb
@@ -112,7 +112,7 @@
           </div>
           <div class="col-md-6">
             <div class="input-group input-group-sm pull-right">
-              <input type="text" class="form-control" placeholder="Search folder contents"/>
+              <input type="text" class="form-control search-folder-contents" placeholder="Search folder contents"/>
             </div>
           </div>
         </div>

commit 02b233b2eb80de1b234f3658d86a0e446e33a032
Author: Tom Clegg <tom at curoverse.com>
Date:   Mon May 5 03:47:50 2014 -0400

    Implement "remove from folder"

diff --git a/apps/workbench/app/controllers/folders_controller.rb b/apps/workbench/app/controllers/folders_controller.rb
index 087d2a4..e0ac625 100644
--- a/apps/workbench/app/controllers/folders_controller.rb
+++ b/apps/workbench/app/controllers/folders_controller.rb
@@ -8,7 +8,25 @@ class FoldersController < ApplicationController
   end
 
   def remove_item
-    raise "Not implemented yet!"
+    @removed_uuids = []
+    item = ArvadosBase.find params[:item_uuid]
+    if (item.class == Link and
+        item.link_class == 'name' and
+        item.tail_uuid = @object.uuid)
+      # Given uuid is a name link, linking an object to this
+      # folder. First follow the link to find the item we're removing,
+      # then delete the link.
+      link = item
+      item = ArvadosBase.find link.head_uuid
+      @removed_uuids << link.uuid
+      link.destroy
+    end
+    if item.owner_uuid == @object.uuid
+      # Object is owned by this folder. Remove it from the folder by
+      # changing owner to the current user.
+      item.update_attributes owner_uuid: current_user
+      @removed_uuids << item.uuid
+    end
   end
 
   def index
diff --git a/apps/workbench/app/models/arvados_base.rb b/apps/workbench/app/models/arvados_base.rb
index a4ec7ab..0418267 100644
--- a/apps/workbench/app/models/arvados_base.rb
+++ b/apps/workbench/app/models/arvados_base.rb
@@ -85,6 +85,11 @@ class ArvadosBase < ActiveRecord::Base
       raise 'argument to find() must be a uuid string. Acceptable formats: warehouse locator or string with format xxxxx-xxxxx-xxxxxxxxxxxxxxx'
     end
 
+    if self == ArvadosBase
+      # Determine type from uuid and defer to the appropriate subclass.
+      return resource_class_for_uuid(uuid).find(uuid, opts)
+    end
+
     # Only do one lookup on the API side per {class, uuid, workbench
     # request} unless {cache: false} is given via opts.
     cache_key = "request_#{Thread.current.object_id}_#{self.to_s}_#{uuid}"
diff --git a/apps/workbench/app/views/application/_delete_object_button.html.erb b/apps/workbench/app/views/application/_delete_object_button.html.erb
index 52a568f..69ed9dc 100644
--- a/apps/workbench/app/views/application/_delete_object_button.html.erb
+++ b/apps/workbench/app/views/application/_delete_object_button.html.erb
@@ -1,5 +1,5 @@
 <% if object.editable? %>
-  <%= link_to({action: 'destroy', id: object.uuid}, method: :delete, remote: true, data: {confirm: "You are about to delete #{object.class_for_display} #{object.uuid}.\n\nAre you sure?"}) do %>
+  <%= link_to({action: 'destroy', id: object.uuid}, method: :delete, remote: true, data: {confirm: "You are about to delete #{object.class_for_display.downcase} '#{object.friendly_link_name}' (#{object.uuid}).\n\nAre you sure?"}) do %>
     <i class="glyphicon glyphicon-trash"></i>
   <% end %>
 <% end %>
diff --git a/apps/workbench/app/views/folders/remove_item.js.erb b/apps/workbench/app/views/folders/remove_item.js.erb
new file mode 100644
index 0000000..5444cbe
--- /dev/null
+++ b/apps/workbench/app/views/folders/remove_item.js.erb
@@ -0,0 +1,5 @@
+<% @removed_uuids.each do |uuid| %>
+$('[data-object-uuid=<%= uuid %>]').hide('slow', function() {
+    $(this).remove();
+});
+<% end %>
diff --git a/apps/workbench/app/views/folders/show.html.erb b/apps/workbench/app/views/folders/show.html.erb
index b4e4b24..0ee32f2 100644
--- a/apps/workbench/app/views/folders/show.html.erb
+++ b/apps/workbench/app/views/folders/show.html.erb
@@ -132,7 +132,7 @@
               <col width="8%" />
             </colgroup>
             <% @objects_and_names.each do |object, name_link| %>
-            <tr>
+            <tr data-object-uuid="<%= (name_link || object).uuid %>">
               <td>
                 <%= render :partial => "selection_checkbox", :locals => {object: object} %>
               </td>
@@ -155,7 +155,7 @@
               </td>
               <td>
                 <% if @object.editable? %>
-                  <%= link_to({action: 'remove_item', id: @object.uuid, item_uuid: object.uuid}, method: :delete, remote: true, data: {confirm: "You are about to remove #{object.class_for_display} #{object.uuid} from this folder.\n\nAre you sure?"}, class: 'btn btn-xs btn-default') do %>
+                  <%= link_to({action: 'remove_item', id: @object.uuid, item_uuid: (name_link || object).uuid}, method: :delete, remote: true, data: {confirm: "You are about to remove #{object.class_for_display} #{object.uuid} from this folder.\n\nAre you sure?"}, class: 'btn btn-xs btn-default') do %>
                     Remove <i class="fa fa-fw fa-ban"></i>
                   <% end %>
                 <% end %>
diff --git a/apps/workbench/app/views/layouts/application.html.erb b/apps/workbench/app/views/layouts/application.html.erb
index b2773da..7582ec7 100644
--- a/apps/workbench/app/views/layouts/application.html.erb
+++ b/apps/workbench/app/views/layouts/application.html.erb
@@ -80,7 +80,7 @@
               <a href="#" class="dropdown-toggle" data-toggle="dropdown"><i class="fa fa-lg fa-folder-o fa-fw"></i> Folders <b class="caret"></b></a>
               <ul class="dropdown-menu">
                 <li><%= link_to raw('<i class="fa fa-plus fa-fw"></i> Create new folder'), folders_path, method: :post %></li>
-                <% @my_top_level_folders.call.each do |folder| %>
+                <% @my_top_level_folders.call[0..7].each do |folder| %>
                 <li><%= link_to raw('<i class="fa fa-folder-open fa-fw"></i> ') + folder.name, folder_path(folder) %></li>
                 <% end %>
                 <li><a href="/folders">

commit 428abec08e6ec59c38b7dc640396db950d42702b
Author: Tom Clegg <tom at curoverse.com>
Date:   Mon May 5 03:25:53 2014 -0400

    Name new folders "New folder", fix crash if folder name is nil

diff --git a/apps/workbench/app/controllers/application_controller.rb b/apps/workbench/app/controllers/application_controller.rb
index 46b2085..8c540fc 100644
--- a/apps/workbench/app/controllers/application_controller.rb
+++ b/apps/workbench/app/controllers/application_controller.rb
@@ -394,7 +394,7 @@ class ApplicationController < ActionController::Base
       @top_level_folders ||= Group.
         filter([['group_class','=','folder'],
                 ['owner_uuid','=',current_user.uuid]]).
-        sort_by(&:name)
+        sort_by { |x| x.name || '' }
     end
   end
 
diff --git a/apps/workbench/app/controllers/folders_controller.rb b/apps/workbench/app/controllers/folders_controller.rb
index 0a7f0f9..087d2a4 100644
--- a/apps/workbench/app/controllers/folders_controller.rb
+++ b/apps/workbench/app/controllers/folders_controller.rb
@@ -68,6 +68,7 @@ class FoldersController < ApplicationController
 
   def create
     @new_resource_attrs = (params['folder'] || {}).merge(group_class: 'folder')
+    @new_resource_attrs[:name] ||= 'New folder'
     super
   end
 end

commit 6ada98b925a7b82a87446aacd0f6cca28df1b510
Author: Tom Clegg <tom at curoverse.com>
Date:   Mon May 5 03:21:09 2014 -0400

    Update name in breadcrumb after editing elsewhere on page.

diff --git a/apps/workbench/app/assets/javascripts/application.js b/apps/workbench/app/assets/javascripts/application.js
index 189063b..d66cb92 100644
--- a/apps/workbench/app/assets/javascripts/application.js
+++ b/apps/workbench/app/assets/javascripts/application.js
@@ -29,7 +29,6 @@ jQuery(function($){
             'X-CSRF-Token': $('meta[name="csrf-token"]').attr('content')
         }
     });
-    $('.editable').editable();
     $('[data-toggle=tooltip]').tooltip();
 
     $('.expand-collapse-row').on('click', function(event) {
diff --git a/apps/workbench/app/assets/javascripts/editable.js b/apps/workbench/app/assets/javascripts/editable.js
index 24da286..ce502b3 100644
--- a/apps/workbench/app/assets/javascripts/editable.js
+++ b/apps/workbench/app/assets/javascripts/editable.js
@@ -34,6 +34,23 @@ $(document).
         $('#editable-submit').click(function() {
             console.log($(this));
         });
+        $('.editable').
+            editable().
+            on('hidden', function(e, reason) {
+                if (reason == 'save') {
+                    var html = $(this).html();
+                    var uuid = $(this).attr('data-object-uuid');
+                    var attr = $(this).attr('data-name');
+                    var edited = this;
+                    if (uuid && attr) {
+                        $("[data-object-uuid='" + uuid + "']" +
+                          "[data-name='" + attr + "']").each(function() {
+                              if (this != edited)
+                                  $(this).html(html);
+                          });
+                    }
+                }
+            });
     });
 
 $.fn.editabletypes.text.defaults.tpl = '<input type="text" name="editable-text">'
diff --git a/apps/workbench/app/helpers/application_helper.rb b/apps/workbench/app/helpers/application_helper.rb
index 4e883f5..2e85f0f 100644
--- a/apps/workbench/app/helpers/application_helper.rb
+++ b/apps/workbench/app/helpers/application_helper.rb
@@ -162,6 +162,7 @@ module ApplicationHelper
       "data-type" => input_type,
       "data-title" => "Update #{attr.gsub '_', ' '}",
       "data-name" => attr,
+      "data-object-uuid" => object.uuid,
       :class => "editable"
     }.merge(htmloptions).merge(ajax_options)
   end
diff --git a/apps/workbench/app/views/folders/show.html.erb b/apps/workbench/app/views/folders/show.html.erb
index e2fca64..b4e4b24 100644
--- a/apps/workbench/app/views/folders/show.html.erb
+++ b/apps/workbench/app/views/folders/show.html.erb
@@ -3,7 +3,7 @@
     <div class="panel panel-info">
       <div class="panel-heading">
 	<h3 class="panel-title">
-	  <%= render_editable_attribute @object, 'name', nil, { 'data-emptytext' => "New folder" } %>
+	  <%= render_editable_attribute @object, 'name', nil, {data: {emptytext: "New folder"}} %>
 	</h3>
       </div>
       <div class="panel-body">
@@ -128,8 +128,8 @@
               <col width="30%" />
               <col width="15%" />
               <col width="15%" />
-              <col width="24%" />
-              <col width="5%" />
+              <col width="20%" />
+              <col width="8%" />
             </colgroup>
             <% @objects_and_names.each do |object, name_link| %>
             <tr>
@@ -140,7 +140,7 @@
                 <%= render :partial => "show_object_button", :locals => {object: object, size: 'xs'} %>
               </td>
               <td>
-                <%= render_editable_attribute name_link, 'name', nil, { 'data-emptytext' => "Unnamed #{object.class_for_display}" } %>
+                <%= render_editable_attribute name_link, 'name', nil, {data: {emptytext: "Unnamed #{object.class_for_display}"}} %>
               </td>
               <td>
                 <%= object.content_summary %>
diff --git a/apps/workbench/app/views/layouts/application.html.erb b/apps/workbench/app/views/layouts/application.html.erb
index 0923f8f..b2773da 100644
--- a/apps/workbench/app/views/layouts/application.html.erb
+++ b/apps/workbench/app/views/layouts/application.html.erb
@@ -149,7 +149,7 @@
                   <span class="glyphicon glyphicon-arrow-right"></span>
                 </li>
                 <li>
-                  <%= link_to_if_arvados_object @object %>
+                  <%= link_to_if_arvados_object @object, {friendly_name: true}, {data: {object_uuid: @object.andand.uuid, name: 'name'}} %>
                 </li>
                 <li style="padding: 14px 0 14px">
                   <%= form_tag do |f| %>

commit 11c6f1d759040f2af8a68d80ae78dd57a9b2d976
Merge: f263c98 76e20e6
Author: Tom Clegg <tom at curoverse.com>
Date:   Mon May 5 02:51:30 2014 -0400

    Merge branch '2640-folder-api' into 1970-folder-view


commit f263c987ad0b144393edd28f281c5b19e84fdf0b
Merge: b8dc9c2 10d03fd
Author: Tom Clegg <tom at curoverse.com>
Date:   Fri May 2 23:20:56 2014 -0400

    Merge branch '2640-folder-api' into 1970-folder-view


-----------------------------------------------------------------------


hooks/post-receive
-- 




More information about the arvados-commits mailing list