diff --git a/app/assets/javascripts/application.js b/app/assets/javascripts/application.js index 9758003e54505227ecf1dbc2099a49d0bbd424cd..e492735487a1459230de4b867ccdd1ec5316254e 100644 --- a/app/assets/javascripts/application.js +++ b/app/assets/javascripts/application.js @@ -11,13 +11,13 @@ // about supported directives. // //= require jquery +//= require jquery.turbolinks //= require jquery_ujs //= require jquery-ui/autocomplete //= require bootstrap-sprockets //= require select2 //= require select2_locale_pt-BR //= require bootstrap-tagsinput -//= require jquery.turbolinks //= require turbolinks //= require_tree ./application diff --git a/app/assets/javascripts/application/collections.coffee b/app/assets/javascripts/application/collections.coffee index 979ceea3f1b9b6ba34751ba8cafc2866d64232fd..5bb2856ea4cfd8adb7186c7e59aaf1ce285b19c5 100644 --- a/app/assets/javascripts/application/collections.coffee +++ b/app/assets/javascripts/application/collections.coffee @@ -1,7 +1,4 @@ $ -> - # valid types of operations in collections - permitted_types = ['add', 'download', 'copy', 'move', 'remove'] - # create collection popover $('#create_collection_popover').popover html: true @@ -9,128 +6,132 @@ $ -> $('#create_collection_popover_content').html() title: -> $('#create_collection_popover_title').html() + return + +# add/remove learning object to collection +$(document).on 'click', '.add-to-collection', -> + $(document).trigger('open_collections_modal', [learning_object: [$(this).data('loid')], type: 'add']) + +# change collection privacy +$(document).on 'click', 'input[name=privacy]', -> + url = '/collections/' + encodeURIComponent($(this).data('cid')) + '/change_privacy' + value = $('input[name=privacy]:checked').val() + $.post url, {'privacy':value}, (d) -> + d + +$(document).on 'open_collections_modal', (evt, params) -> + id = if (params.collection == undefined) then "all" else encodeURIComponent(params.collection) + url = '/collections/' + id + '/list?type=' + params.type + url += '&learning_objects_ids=' + encodeURIComponent(params.learning_object) if params.learning_object != undefined + $.get url, (d) -> + $('#collections-modal').remove() + $('body').append d + $('#collections-modal').modal('show') + return - # add/remove learning object to collection - $(document).on 'click', '.add-to-collection', -> - $(document).trigger('open_collections_modal', [learning_object: [$(this).data('loid')], type: 'add']) - - # change collection privacy - $(document).on 'click', 'input[name=privacy]', -> - url = '/collections/' + encodeURIComponent($(this).data('cid')) + '/change_privacy' - value = $('input[name=privacy]:checked').val() - $.post url, {'privacy':value}, (d) -> - d - - $(document).on 'open_collections_modal', (evt, params) -> - url = '/collections/list?type=' + params.type - url += '&id=' + encodeURIComponent(params.collection) if params.collection != undefined - url += '&learning_objects_ids=' + encodeURIComponent(JSON.stringify(params.learning_object)) if params.learning_object != undefined - $.get url, (d) -> - $('#collections-modal').remove() - $('body').append d - $('#collections-modal').modal('show') - return - - mount_modal_params = (e) -> - array = $(e).serializeArray() - object = {} - collection = "" - type = "" - collections = [] - learning_objects = [] - - i = 0 - length = array.length - while i < length - switch array[i].name - when 'collection' then collections.push(array[i].value) - when 'learning_object' then learning_objects.push(array[i].value) - when 'collection_id' then collection = array[i].value - when 'type' then type = array[i].value - ++i - - object.collection_id = collection - object.collections_ids = collections if collections.length > 0 - object.learning_objects_ids = learning_objects if learning_objects.length > 0 - object.type = type - return object - - $(document).on 'submit', '#collections-modal-form', (evt, params) -> - evt.preventDefault() - - refreshable_type = ['move'] - - data = mount_modal_params(this) - - return false if (data.learning_objects_ids.length < 1) || (data.collections_ids.length < 1) || (permitted_types.indexOf(data.type) < 0) - - id = if (data.collection_id == undefined) then data.collections_ids else data.collection_id - - url = '/collections/' + encodeURIComponent(id) + '/' + data.type - $.ajax {method: "POST", url: url, data: data } - +mount_modal_params = (e) -> + array = $(e).serializeArray() + object = {} + collection = "" + type = "" + collections = [] + learning_objects = [] + + i = 0 + length = array.length + while i < length + switch array[i].name + when 'collection' then collections.push(array[i].value) + when 'learning_object' then learning_objects.push(array[i].value) + when 'collection_id' then collection = array[i].value + when 'type' then type = array[i].value + ++i + + object.collection_id = collection + object.collections_ids = collections if collections.length > 0 + object.learning_objects_ids = learning_objects if learning_objects.length > 0 + object.type = type + return object + +$(document).on 'submit', '#collections-modal-form', (evt, params) -> + evt.preventDefault() + + refreshable_type = ['move'] + + data = mount_modal_params(this) + + return false if (data.learning_objects_ids.length < 1) || (data.collections_ids.length < 1) || (permitted_types.indexOf(data.type) < 0) + + id = if (data.collections_ids == undefined) then data.collection_id else data.collections_ids + url = '/collections/' + encodeURIComponent(id) + '/learning_objects/' + encodeURIComponent(data.learning_objects_ids.join()) + $.ajax {method: "POST", url: url, data: data } + .done () -> + if (data.type == "move") + url = '/collections/' + encodeURIComponent(data.collection_id) + '/learning_objects/' + encodeURIComponent(data.learning_objects_ids.join()) + $.ajax {method: "DELETE", url: url, data: data } location.reload(true) if !(refreshable_type.indexOf(data.type) < 0) $('#collections-modal').modal('hide') - return + return # manipulate collections - $(document).on 'ready page:load', -> - if $('.collection-show-page').val() != undefined - # array with selected objects ids - selected_objects = [] - collection = $('.collection-show-page').data('cid') - - # add selectors - $('.learning-object-vertical').each (e) -> - loid = $(this).data('loid') - $('.learning-object-thumbnail', this).append '<input class="collection-selector" type="checkbox" value="' + loid + '"></input>' - return - - # add/remove object to array when click checkbox - $(document).on 'click', '.collection-selector', -> - if this.checked - if selected_objects.indexOf(this.value) < 0 - selected_objects.push { name: 'learning_object', value: this.value } - $(document).trigger('check_selected_collection'); - return - else - index = selected_objects.indexOf({ name: 'learning_object', value: this.value }) - if !!(~index) - selected_objects.splice(index, 1) - $(document).trigger('check_selected_collection'); - return - - # clear selected objects - $(document).on 'clear_collections', -> - selected_objects = [] - $('.collection-selector').attr('checked', false); - $(document).trigger('check_selected_collection') - - $(document).on 'click', '.collection-show-select-nav .navbar-brand', -> - $(document).trigger('clear_collections') - - # manipulation buttons - $(document).on 'click', '.collection-button', -> - index = permitted_types.indexOf($(this).data('action')) - learning_objects = selected_objects.map (o) -> - return o.value - - if permitted_types[index] == 'remove' - url = '/collections/' + encodeURIComponent(collection) + '/remove' - $.ajax {method: 'DELETE', url: url, data: { learning_objects_ids: learning_objects } } if confirm('Você tem certeza?') - location.reload(true) - else - $(document).trigger('open_collections_modal', [collection: collection, type: permitted_types[index], learning_object: learning_objects ]) if !!(~index) - - # update interface when add/remove an object - $(document).on 'check_selected_collection', (e) -> - length = selected_objects.length - if length == 0 - return $('.collection-show-select-nav').slideUp('slow') - else if (length == 1) - html = "1 objeto selecionado" - else - html = length + " objetos selecionados" - $('.collection-show-select-nav .navbar-brand').html html - $('.collection-show-select-nav').slideDown('slow') +# $(document).on 'ready page:load', -> +# if $('.collection-show-page').val() != undefined +# array with selected objects ids +selected_objects = [] +# valid types of operations in collections +permitted_types = ['add', 'download', 'copy', 'move', 'remove'] + +$(document).on 'ready page:load', -> + if $('.collection-show-page').val() != undefined + # add selectors + $('.learning-object-vertical').each (e) -> + loid = $(this).data('loid') + $('.learning-object-thumbnail', this).append '<input class="collection-selector" type="checkbox" value="' + loid + '"></input>' return + +# add/remove object to array when click checkbox +$(document).on 'click', '.collection-selector', -> + if this.checked + if selected_objects.indexOf(this.value) < 0 + selected_objects.push this.value + $(document).trigger('check_selected_collection') + return + else + index = selected_objects.indexOf(this.value) + if !!(~index) + selected_objects.splice(index, 1) + $(document).trigger('check_selected_collection') + return + +# clear selected objects +$(document).on 'clear_collections', -> + selected_objects = [] + $('.collection-selector').attr('checked', false) + $(document).trigger('check_selected_collection') + +$(document).on 'click', '.collection-show-select-nav .navbar-brand', -> + $(document).trigger('clear_collections') + +# manipulation buttons +$(document).on 'click', '.collection-button', -> + collection = $('.collection-show-page').data('cid') + index = permitted_types.indexOf($(this).data('action')) + + if permitted_types[index] == 'remove' + url = '/collections/' + encodeURIComponent(collection) + '/learning_objects/' + encodeURIComponent(selected_objects.join()) + $.ajax { method: 'DELETE', url: url } if confirm('Você tem certeza?') + location.reload(true) + else + $(document).trigger('open_collections_modal', [collection: collection, type: permitted_types[index], learning_object: selected_objects ]) if !!(~index) + +# update interface when add/remove an object +$(document).on 'check_selected_collection', (e) -> + length = selected_objects.length + if length == 0 + return $('.collection-show-select-nav').slideUp('slow') + else if (length == 1) + html = "1 objeto selecionado" + else + html = length + " objetos selecionados" + $('.collection-show-select-nav .navbar-brand').html html + $('.collection-show-select-nav').slideDown('slow') diff --git a/app/assets/javascripts/application/learning_objects.coffee.erb b/app/assets/javascripts/application/learning_objects.coffee.erb index 42128666805d8190834cb1d22d3cfc21fd4d364b..aff6150bc575ba8429c9df41023542d815781089 100644 --- a/app/assets/javascripts/application/learning_objects.coffee.erb +++ b/app/assets/javascripts/application/learning_objects.coffee.erb @@ -1,50 +1,3 @@ -$ -> - $('.default_btn').toggleClass 'active_btn' - # $(document).on 'click', '*[data-poload]', -> - # e = $(this) - # e.popover({content: "Carregando..."}).popover('show') - # all = undefined - # objects = undefined - # url = $(this).data('poload') - # loid = $(this).data('loid') - # $.get '/collections.json', (d) -> - # all = d - # $.get url, (d) -> - # object = d - # - # # generate a lookup table for object's collections id - # lookup = {} - # i = 0 - # len = object.length - # while i < len - # lookup[object[i].id] = object[i] - # i++ - # - # # mark checked objects - # i = 0 - # len = all.length - # html = '' - # while i < len - # name = 'collection_' + all[i].id.split(':').slice(-1)[0] - # html += '<input type="checkbox" class="collection-element" data-cid="' + all[i].id + '" data-loid="' + loid + '" id="' + name + '" value="' + all[i].id + '"' - # if lookup[all[i].id] != undefined - # html += " checked" - # html += '>' - # html += '<label for="' + name + '">' + all[i].name + '</label><br/>' - # ++i - # - # html = 'Você não possui coleções.<br>É possÃvel criá-las na sua página pessoal.' if html == "" - # - # $('.popover-content').html(html) - # return - # return - # return - -$ -> - $(document).on 'click', '.add_to_collection', (e) -> - $('.add_to_collection').removeClass 'active' - $('.add_to_collection').not(this).popover 'hide' - return $ -> $(document).on 'ajax:success', 'a.vote', (status, data, xhr) -> $('.votes-count[data-id=\'' + data.id + '\']').text data.count diff --git a/app/controllers/collections_controller.rb b/app/controllers/collections_controller.rb index 6e48608711376f05c0b30baed537332b4cc0b0fc..330b2f4fcf50a5e1cb40f6986c874c2453e50003 100644 --- a/app/controllers/collections_controller.rb +++ b/app/controllers/collections_controller.rb @@ -1,6 +1,7 @@ class CollectionsController < ApplicationController - before_action :set_collection, only: [:show, :update, :destroy, :like, :list, :add_learning_object, :remove_learning_object, :move_learning_objects, :copy_learning_objects, :change_privacy] - before_action :authenticate_user!, only: [:update, :destroy, :like, :list, :add_learning_object, :remove_learning_object, :move_learning_objects, :copy_learning_objects, :change_privacy] + before_action :set_collection, only: [:show, :update, :destroy, :like, :change_privacy] + before_action :set_collections, only: [:list, :add_learning_object, :remove_learning_object] + before_action :authenticate_user!, only: [:update, :destroy, :like, :list, :add_learning_object, :remove_learning_object, :change_privacy] # GET /collections # GET /collections.json @@ -74,47 +75,61 @@ class CollectionsController < ApplicationController end def list + @collection = @collections.first + + # list all + @collection = nil if @collection == 'all' + @collections = collection_repository.all(Collections::UserContext.new(current_user)) - @collections.select!{|c| c.id != @collection.id} unless @collection.blank? + @collections.select! { |c| c.id != @collection.id } unless @collection.blank? + + unless params[:type].blank? + @type = params[:type] - @type = params[:type] unless params[:type].blank? + @send = case @type + when 'add' then 'Adicionar' + when 'copy' then 'Copiar' + when 'move' then 'Mover' + else 'Enviar' + end + + @title = (@send == 'Enviar') ? 'Coleções' : @send + ' objeto(s) à s coleções' + end render layout: false end # POST /collections/1/learning_object def add_learning_object - response = learning_objects_to_collections(@learning_objects, @collection) + @collections.each do |collection| + if collection.owner?(current_user) + @learning_objects.each do |learning_object| + collection.add learning_object + end - if request.xhr? - render json: {status: response} + collection_repository.save_learning_objects(collection) + end end - end - - # DELETE /collections/1/learning_object - def remove_learning_object - response = remove_learning_objects_from_collection(@learning_objects, @collection) if request.xhr? - render json: {status: response} + render json: {status: true} end end - def copy_learning_objects - response = learning_objects_to_collections(@learning_objects, @target_collections) + # DELETE /collections/1/learning_object + def remove_learning_object + @collections.each do |collection| + if collection.owner?(current_user) + @learning_objects.each do |learning_object| + collection.remove learning_object + end - if request.xhr? - render json: {status: response} + collection_repository.save_learning_objects(collection) + end end - end - - def move_learning_objects - response = learning_objects_to_collections(@learning_objects, @target_collections) - - remove_learning_objects_from_collection(@learning_objects, @collection) if response if request.xhr? - render json: {status: response} + render json: {status: true} end end @@ -133,25 +148,7 @@ class CollectionsController < ApplicationController end def learning_objects_to_collections(learning_objects, collections) - collections.each do |collection| - if collection.owner?(current_user) - learning_objects.each do |learning_object| - collection.add learning_object - end - - collection_repository.save_learning_objects(collection) - end - end - end - - def remove_learning_objects_from_collection(learning_objects, collection) - learning_objects = [learning_objects] if learning_objects.class == String - - learning_objects.each do |learning_object| - collection.remove learning_object - end - collection_repository.save_learning_objects(collection) end def check_collection_privacy!(collection) @@ -161,12 +158,24 @@ class CollectionsController < ApplicationController end def set_collection - @collection = collection_repository.find params[:id] unless params[:id].blank? + @collection = collection_repository.find params[:id] + end + + def set_collections + if params[:id] == "all" || params[:id].blank? + @collections = ['all'] + else + @collections = (params[:id].class == String) ? [collection_repository.find(params[:id])] : params[:id].map{|id| collection_repository.find id} + end - @target_collections = params[:collections_ids].map{|id| collection_repository.find id} unless params[:collections_ids].blank? + unless params[:learning_objects_ids].blank? + @learning_objects = [] - params[:learning_objects_ids] = JSON.parse(params[:learning_objects_ids]) if params[:learning_objects_ids].class == String - @learning_objects = params[:learning_objects_ids].map{|id| learning_object_repository.find id || false} unless params[:learning_objects_ids].blank? + params[:learning_objects_ids].split(',').each do |id| + object = learning_object_repository.find id + @learning_objects << object unless object.blank? + end + end end # Never trust parameters from the scary internet, only allow the white list through. diff --git a/app/models/learning_object.rb b/app/models/learning_object.rb index e47c19f5e2f0c3f09e113511f788c0ba800e9af1..8975b7a6a02c2035438e58e385fc45618d58c8aa 100644 --- a/app/models/learning_object.rb +++ b/app/models/learning_object.rb @@ -12,8 +12,8 @@ class LearningObject validates_presence_of :name, :created_at, :type - delegate :get_retrievelink, to: :file - delegate :get_filename, to: :file + delegate :get_retrievelink, to: :attachment + delegate :get_filename, to: :attachment def initialize(params={}) super(params.merge(defaults)) diff --git a/app/views/collections/list.html.erb b/app/views/collections/list.html.erb index 22efd618cacefbf4889ea06ed20bb3e01f028973..3c2f0c010bed078ab48e9a645629b4848375864d 100644 --- a/app/views/collections/list.html.erb +++ b/app/views/collections/list.html.erb @@ -3,7 +3,7 @@ <div class="modal-content"> <div class="modal-header"> <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">×</span></button> - <h4 class="modal-title">Coleções</h4> + <h4 class="modal-title"><%= @title %></h4> </div> <form id="collections-modal-form"> <div class="modal-body"> @@ -23,7 +23,7 @@ </div> <div class="modal-footer"> <button type="button" class="btn btn-default" data-dismiss="modal">Cancelar</button> - <button type="submit" class="btn btn-primary">Enviar</button> + <button type="submit" class="btn btn-primary"><%= @send %></button> </div> </form> </div> diff --git a/config/routes.rb b/config/routes.rb index 2a696ece014ef52d51b750a002ed883dae7c16a9..16a664c821c983a78dc861a1bf65a7ec4d63dcdb 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -65,21 +65,17 @@ Rails.application.routes.draw do end end - # collection list - get '/collections/list' => "collections#list", as: 'collection_list' resources :collections do - member do + # collection list + get :list + # change privacy post :change_privacy # add/remove a learning object for some collection - post '/add', as: :add_learning_object, action: :add_learning_object - delete '/remove', as: :remove_learning_object, action: :remove_learning_object - - # copy / move learning objects from a collection to another - post '/copy', as: :copy_learning_objects, action: :copy_learning_objects - post '/move', as: :move_learning_objects, action: :move_learning_objects + post '/learning_objects/:learning_objects_ids', as: :add_learning_object, action: :add_learning_object + delete '/learning_objects/:learning_objects_ids', as: :remove_learning_object, action: :remove_learning_object end end