diff --git a/app/assets/javascripts/file_manager/bulk_actions.es6 b/app/assets/javascripts/file_manager/bulk_actions.es6 new file mode 100644 index 000000000..392224cd6 --- /dev/null +++ b/app/assets/javascripts/file_manager/bulk_actions.es6 @@ -0,0 +1,57 @@ +export default class BulkActionManager { + constructor(element) { + this.sortable_element.on("selectablestop", this.stopped_selecting) + this.element = element + } + get stopped_selecting() { + return () => { + let selected_count = this.selected_elements.length + if(selected_count > 0) { + this.initialize_bulk() + } else { + this.element.hide() + this.element.find("input[name=bulk_hint]").off("change") + this.element.find("input[name=bulk_hint]").prop('checked', false) + } + } + } + + initialize_bulk() { + let master = this + if(this.all_values_the_same(this.selected_viewing_hint_values)) { + let selected_val = this.selected_viewing_hint_values[0] + this.element.find(`input[name=bulk_hint][value="${selected_val}"]`).prop('checked', true) + } + this.element.find("input[name=bulk_hint]").on("change", function(event) { + let val = $(this).val() + master.selected_viewing_hints.prop("checked", false) + master.selected_viewing_hints.filter(`*[value="${val}"]`).prop("checked", true).change() + }) + this.element.show() + } + + get selected_elements() { + return this.sortable_element.find("li .panel.ui-selected") + } + + get selected_viewing_hints() { + return this.selected_elements.find('input[name="file_set[viewing_hint]"]') + } + + get selected_viewing_hint_values() { + return this.selected_viewing_hints.filter(":checked").map(function() {return $(this).val()}).toArray() + } + + get sortable_element() { + return $("#order-grid") + } + + all_values_the_same(array) { + for(var i = 1; i < array.length; i++) + { + if(array[i] !== array[0]) + return false + } + return true + } +} diff --git a/app/assets/javascripts/file_manager/plum.es6 b/app/assets/javascripts/file_manager/plum.es6 index 51ecabce8..2f629c5f0 100644 --- a/app/assets/javascripts/file_manager/plum.es6 +++ b/app/assets/javascripts/file_manager/plum.es6 @@ -1,12 +1,14 @@ import RadioTracker from "file_manager/radio_tracker" import SelectTracker from "file_manager/select_tracker" import {InputTracker, FileManagerMember} from "curation_concerns/file_manager/member" +import BulkActionManager from "file_manager/bulk_actions" export default class PlumFileManager { constructor() { this.initialize_radio_buttons() this.sortable_placeholder() this.manage_iiif_fields() this.starting_page() + this.bulk_actions() } initialize_radio_buttons() { @@ -45,4 +47,8 @@ export default class PlumFileManager { $("*[data-member-link=start_canvas]").change() }) } + + bulk_actions() { + this.bulk_action_manager = new BulkActionManager($("#bulk-actions")) + } } diff --git a/app/assets/stylesheets/components/plum_file_manager.scss b/app/assets/stylesheets/components/plum_file_manager.scss index f356d0002..d7296ee0a 100644 --- a/app/assets/stylesheets/components/plum_file_manager.scss +++ b/app/assets/stylesheets/components/plum_file_manager.scss @@ -50,3 +50,9 @@ #file-manager-extra-tools { @extend .clearfix; } +#bulk-actions { + h2 { + margin-top: 0; + } + display: none; +} diff --git a/app/views/curation_concerns/base/_file_manager_actions.html.erb b/app/views/curation_concerns/base/_file_manager_actions.html.erb index 41d024bda..9dbdf5b47 100644 --- a/app/views/curation_concerns/base/_file_manager_actions.html.erb +++ b/app/views/curation_concerns/base/_file_manager_actions.html.erb @@ -1,2 +1,3 @@ <%= render "custom_file_manager_actions" %> +<%= render "file_manager_bulk_form" %> <%= render "file_manager_resource_form" %> diff --git a/app/views/curation_concerns/base/_file_manager_bulk_form.html.erb b/app/views/curation_concerns/base/_file_manager_bulk_form.html.erb new file mode 100644 index 000000000..3e05ed56b --- /dev/null +++ b/app/views/curation_concerns/base/_file_manager_bulk_form.html.erb @@ -0,0 +1,14 @@ +
+

Bulk Actions

+ + <% hints = [["Single Page", :''], ["Non-Paged", :"non-paged"], ["Facing pages",:"facing-pages"]] %> + <% hints.each do |label, val| %> +
+ <%= content_tag :label do %> + <%= tag :input, name: "bulk_hint", id: "bulk_hint_#{val}", type: :radio, value: val, checked: false, class: 'resource-radio-button' %> + <%= label %> + <% end %> +
+ <% end %> + <%# <%= f.input :viewing_hint, collection: [:"", :"non-paged", :"facing-pages"], as: :radio_buttons, label: false, defaults: { input_html: { class: '' }}%> +
diff --git a/spec/javascripts/bulk_actions_spec.coffee b/spec/javascripts/bulk_actions_spec.coffee new file mode 100644 index 000000000..da8dbca0e --- /dev/null +++ b/spec/javascripts/bulk_actions_spec.coffee @@ -0,0 +1,26 @@ +BulkActionManager = require("file_manager/bulk_actions") +describe "bulk actions manager", -> + bulk_manager = null + beforeEach -> + loadFixtures("file_manager_three_children.html") + bulk_manager = new BulkActionManager($("#bulk-actions")) + describe "bulk panel display", -> + it "is made to display when there are selected elements", -> + spyOn(bulk_manager.element, "show") + bulk_manager.sortable_element.find("li .panel").addClass("ui-selected") + bulk_manager.sortable_element.trigger("selectablestop") + expect(bulk_manager.element.show).toHaveBeenCalled() + it "is hidden when there are no elements", -> + spyOn(bulk_manager.element, "hide") + bulk_manager.sortable_element.trigger("selectablestop") + expect(bulk_manager.element.hide).toHaveBeenCalled() + it "marks all selected elements' boxes when selected", -> + bulk_manager.sortable_element.find("li .panel").addClass("ui-selected") + bulk_manager.sortable_element.trigger("selectablestop") + + # Mark non-paged + radio = $("#bulk-actions #bulk_hint_non-paged") + radio.prop('checked', true) + radio.change() + + expect(bulk_manager.selected_viewing_hint_values).toEqual(["non-paged","non-paged","non-paged"]) diff --git a/spec/javascripts/fixtures/file_manager_three_children.html b/spec/javascripts/fixtures/file_manager_three_children.html new file mode 100644 index 000000000..ed01c2c4c --- /dev/null +++ b/spec/javascripts/fixtures/file_manager_three_children.html @@ -0,0 +1,397 @@ +
+
+

Toolbar

+
+
+ +
+ +
+
+
+ +
+ +
+
+
+
+ +
+
+ +
+
+ +
+
+ +
+
+ + +
+ +
+

Bulk Actions

+ +
+
+
+
+
+
+
+ +
+
+
+ +
+
+
+
+
+
+
+
+
+ +
+ +
+
+
+
+
+
+
+ +
+
+
+ + +
+ + +
+
+
+ + +
+