diff --git a/Gemfile b/Gemfile index 5e839910a5d477820fdb20069e40a3cf6fe35935..e1134327f415a64eda8580996b7b45c591415894 100644 --- a/Gemfile +++ b/Gemfile @@ -69,7 +69,7 @@ gem "rsolr", "~> 1.0.12" #Dspace REST API Integration gem 'dspace_rest_client', '~> 1.1.0' -# pretty logs +# pretty logs gem 'rainbow' #Chart js diff --git a/app/assets/javascripts/application/accessibility.js b/app/assets/javascripts/application/accessibility.js index 7a907ae34bac5eec8e7a310b5118d56de4541a4f..8ef7160ff48f6c90fe7b7dfd13ad39016d03aa69 100644 --- a/app/assets/javascripts/application/accessibility.js +++ b/app/assets/javascripts/application/accessibility.js @@ -62,6 +62,8 @@ var contrast = function() { $('.caret').css('border-top',' 7px solid black'); $('.grey-panel').css('border','none'); $('.button-cancel-setup').css('font-weight','normal'); + $('#label_add_collection').css('background-color','white'); + var select = $('.select-tag-container').select2() .on("select2:open", function() { @@ -83,6 +85,10 @@ var contrast = function() { $('.caret').css('border-top',' 7px solid white'); $('.grey-panel').css('border','7px solid white'); $('.button-cancel-setup').css('font-weight','bold'); + $('#create_collection_form').css('color','black'); + $('#label_add_collection').css('color','black'); + + //contraste select2(menu esquerda) var select = $('.select-tag-container').select2() @@ -134,10 +140,10 @@ function readCookie(name) { var fontSize = fontSize(); var contrast = contrast(); -/* -function HandleBrowseClick() + +function HandleChangeImg() { - var fileinput = document.getElementById("browse"); - fileinput.click(); +// var fileinput = document.getElementById("avatar"); + var iminput = document.getElementById("pic"); +// iminput.src = ;/*"path"+ fileinput.value; } -*/ diff --git a/app/assets/javascripts/application/collections.coffee b/app/assets/javascripts/application/collections.coffee index 46fc726d97a435afe67bfca9934690757b4a6ccf..fa82b5ea8e3042db942ac70bb6138bddfc3e7748 100644 --- a/app/assets/javascripts/application/collections.coffee +++ b/app/assets/javascripts/application/collections.coffee @@ -6,3 +6,14 @@ $ -> title: -> $('#create_collection_popover_title').html() return + +$ -> + $(document).on 'click', 'input[class=collection-element]', -> + url = '/collections/' + encodeURIComponent($(this).data('cid')) + '/learning_object/' + encodeURIComponent($(this).data('loid')) + if this.checked + $.ajax {method: "POST", url: url }, (d) -> + d + else + $.ajax {method: "DELETE", url: url }, (d) -> + d + return diff --git a/app/assets/javascripts/application/learning_objects.coffee b/app/assets/javascripts/application/learning_objects.coffee index f114ec84c6886942ece8cac026ce8d4e9fe3cd9f..88903b52b03bd531978b5ec6244f164c4f0459f5 100644 --- a/app/assets/javascripts/application/learning_objects.coffee +++ b/app/assets/javascripts/application/learning_objects.coffee @@ -1,20 +1,49 @@ $ -> $('.default_btn').toggleClass 'active_btn' - $('.add_to_collection').popover - html: true - container: 'body' - content: -> - url = $(this).data('poload') + $(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) -> - $.parseJSON 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 + + $('.popover-content').html(html) return + return return + $ -> - $('.add_to_collection').on 'click', (e) -> + $(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 - return \ No newline at end of file + return diff --git a/app/assets/javascripts/application/navigation-content.js b/app/assets/javascripts/application/navigation-content.js index 2d9f2e66e1021bf819e7b600e928c58450ee9883..fbc951f84d309954ba4af95f2dad00b06516ab64 100644 --- a/app/assets/javascripts/application/navigation-content.js +++ b/app/assets/javascripts/application/navigation-content.js @@ -44,4 +44,15 @@ var nav_content = function () { $(document).ready(function () { nav_content(); + + // fix bootstrap popover click to dismiss - http://stackoverflow.com/a/14857326 + $('body').on('click', function (e) { + $('[data-toggle="popover"]').each(function () { + //the 'is' for buttons that trigger popups + //the 'has' for icons within a button that triggers a popup + if (!$(this).is(e.target) && $(this).has(e.target).length === 0 && $('.popover').has(e.target).length === 0) { + $(this).popover('hide'); + } + }); + }); }); diff --git a/app/assets/javascripts/application/search.js b/app/assets/javascripts/application/search.js index 42786f18c620b1a70002bba6b03d6255ec4852d1..a32dca97fa40c86284d7e2ac64909562df009c0d 100644 --- a/app/assets/javascripts/application/search.js +++ b/app/assets/javascripts/application/search.js @@ -45,8 +45,6 @@ var search = function() { // add tooltip $('[data-toggle="tooltip"]').tooltip(); - - searchWatchers().attachMoreResults(); }); } @@ -56,6 +54,11 @@ var search = function() { var intervalId = 0; var has_init = false; + if (!has_init) { + init(); + has_init = true; + } + function init() { // watch params to change inputs watchParams(); @@ -65,6 +68,7 @@ var search = function() { // watch inputs to change params watchSearchInput(); + watchMoreButton(); watchFilterPanel(); watchOrder(); watchFilters(); @@ -166,7 +170,7 @@ var search = function() { function watchSearchInput() { $('.search-input input').val(params.get('query')); - $('.search-input form').on('submit', function (event) { + $(document).on('submit', '.search-input form', function (event) { event.preventDefault(); params.reset(); params.add('query', $('input[name="query"]', this).val()); @@ -174,8 +178,16 @@ var search = function() { }); } + function watchMoreButton() { + $(document).on('click', '.search-more', function (event) { + event.preventDefault(); + params.add('page', params.get('page') + 1); + searchFetch(true); + }); + } + function watchFilterPanel() { - $('.filter-panel').on('beforeItemRemove', function(event) { + $(document).on('beforeItemRemove', '.filter-panel', function(event) { if (event.options === undefined) { event.options = {'ignore': false}; } @@ -188,12 +200,12 @@ var search = function() { function watchOrder() { var select = 'select[name="order"]'; - $(select).on('change', function (event) { + $(document).on('change', select, function (event) { params.add('order', this.value); searchFetch(); }); // reset - $(watch).on('reset', function (e) { + $(document).on('reset', watch, function (e) { $(select).val(""); }); } @@ -224,7 +236,7 @@ var search = function() { filtersFetchInterval(); }); // reset - $(watch).on('reset', function (e) { + $(document).on('reset', watch, function (e) { $('#filter-year input[name=singleYear]').val(""); $('#filter-year input[name=startYear]').val(""); $('#filter-year input[name=endYear]').val(""); @@ -273,7 +285,7 @@ var search = function() { } else { // watch for changes - $(input).on('click', function () { + $(document).on('click', input, function () { if (this.checked) { params.add(type, this.value); } @@ -284,7 +296,7 @@ var search = function() { filtersFetchInterval(); }); // reset - $(watch).on('reset', function (e) { + $(document).on('reset', watch, function (e) { $(input).each(function () { $(this).attr('checked', false); }); @@ -302,22 +314,6 @@ var search = function() { clearInterval(intervalId); }, 800); } - - return { - init: function() { - if (!has_init) { - init(); - has_init = true; - } - }, - attachMoreResults: function() { - $('.search-more').on('click', function (event) { - event.preventDefault(); - params.add('page', params.get('page') + 1); - searchFetch(true); - }); - } - } } //// INIT @@ -326,7 +322,7 @@ var search = function() { var fetch_init = false; // run watchers - searchWatchers().init(); + searchWatchers(); // TODO: find a way to manage all requisitions without page reload }; diff --git a/app/assets/stylesheets/application.scss b/app/assets/stylesheets/application.scss index 2cb01d66686fa205f356b5bad5dc6b74fb5e8b9b..6aa177d95f1a6602fca590ae9bfc2ba2fb1cb717 100644 --- a/app/assets/stylesheets/application.scss +++ b/app/assets/stylesheets/application.scss @@ -137,7 +137,7 @@ header { // search .search-input { margin-top: 40px; - margin-bottom: 5px; + margin-bottom: 22px; text-align: right; // text input @@ -267,23 +267,42 @@ header { z-index: 999; max-width: 600px; width: auto; + + .popover-content { + max-height: 300px; + overflow: auto; + } } -//// FOOTER footer { - width: 100%; - height: 100px; - position: relative; - bottom: 0; - left: 0; padding-top: 50px; - border-width: 0px; color: #FFF; .main { background-color: #E6E6E6; padding: 16px 0px 0px 0px; min-height: 256px; + + .logo-footer{ + float: left; + width: 18%; + + .logos-footer{ + height: 70px; + width: auto; + } + .normal{ + margin-left: 18%; + } + .fnde-size{ + height: 100px; + margin-top: -8%; + margin-left: 20px; + } + .ministerio-size{ + margin-left:80px; + } + } } .footerbar{ @@ -293,13 +312,11 @@ footer { .footer-bar { color: #FFF; background-color: #2178F5; - padding-top: 8px; .logo { + margin-left: -12px; margin-top: 10px; - padding: 0; text-align: center; - float: left; width: 165px; h3 { margin-top: 10px; @@ -312,44 +329,6 @@ footer { } } -.starRating:not(old) { - display: inline-block; - width: 7.5em; - height: 1.5em; - overflow: hidden; - vertical-align: bottom; -} - -.starRating:not(old) > input { - margin-right: -100%; - opacity: 0; -} - -.starRating:not(old) > label { - display: block; - float: right; - position: relative; - background: url('star-off.svg'); - background-size: contain; -} - -.starRating:not(old) > label:before { - content: ''; - display: block; - width: 1.5em; - height: 1.5em; - background: url('star-on.svg'); - background-size: contain; - opacity: 0; - transition: opacity 0.2s linear; -} - -.starRating:not(old) > label:hover:before, -.starRating:not(old) > label:hover ~ label:before, -.starRating:not(:hover) > :checked ~ label:before { - opacity: 1; -} - td.stars { width: 22%; } @@ -374,6 +353,11 @@ table.tipo1 p { .contraste { background-color: black !important; color: white; + .white-input{ + a{ + color:yellow; + } + } a { color: yellow; } @@ -405,7 +389,6 @@ table.tipo1 p { color: black !important; } } - .panel-wrapper { background-color: black !important; border: 2px solid white; @@ -415,14 +398,15 @@ table.tipo1 p { border-style: outset; } } - .btn{ + .btn { border:2px solid white; } + .user-header { border: 7px solid white; h3{ - color:white; - } + color:white; + } .btn{ border: 2px solid white; } @@ -435,9 +419,14 @@ table.tipo1 p { .button-save-setup{ color:yellow; } + .btn-singin{ + color: white; + } + .btn-danger{ + color: yellow; + } } footer { - .footerbar{ background-color: black; } @@ -479,7 +468,6 @@ table.tipo1 p { .dropdown-menu { background-color: black; } - } .words { @@ -499,25 +487,43 @@ table.tipo1 p { margin: 5px; padding: 0px 35px; } - .left-edge { + .left-edge1 { position:absolute; left: -35px; } .right-button { padding: 0px 60px; } -.logo-footer{ - float: left; - margin-right: 1%; - margin-left: 1%; - width: 18%; - -} .grey-panel{ background-color: #EEEEEE; width: 100; padding: 40px; text-align:center; margin: 25px; + .btn-singin{ + width: 230px; color:white; background-color: #1676bc; + } + +} + +.add-file{ + .logo-add-file{ + width:250px; height:150px; + } + .btn-remove{ + margin-top: 15px; width: 130px; background-color: #FF2134; + } + .input-add-file{ + font-size:14pt; margin-bottom: 10px; + } + .add_file-save{ + margin-top: -10px; width: 230px; color:white; background-color: #1676bc; + } + .select-add-file{ + width: 345px; + } + .title{ + position:absolute; margin-left:60px; + } } .but { @@ -550,40 +556,63 @@ table.tipo1 p { margin-left: 50px; border: solid 1px #ccc; } + input.chk { margin-top:5px; margin-left:5px; } -.white-input input{ - border:none; +.white-input { + .top-padding-setup{ + margin-top: 25px; + } + .input-width-setup1{ + width:370px; + } + .input-setup-name{ + width:515px; + height:60px; + font-size:18pt; + font-weight:bold; + margin-bottom: 5px; + } + .link-setup{ + color: #1676bc; + } + .link-setup-2{ + color: #FF3300; + } + .btn-file { + position: relative; + overflow: hidden; + } + .btn-file input[type=file] { + position: absolute; + top: 0; + right: 0; + min-width: 100%; + min-height: 100%; + font-size: 100px; + text-align: right; + filter: alpha(opacity=0); + opacity: 0; + outline: none; + background: white; + cursor: inherit; + display: block; + } + input{ + border:none; + } } -.top-padding-setup{ - margin-top: 25px; -} -.input-width-setup1{ - width:370px; -} -.input-setup-name{ - width:515px; - height:60px; - font-size:18pt; - font-weight:bold; - margin-bottom: 5px; -} -.link-setup{ - color: #1676bc; -} -.link-setup-2{ - color: #FF3300; -} .button-cancel-setup{ height: 35px; width: 110px; color:white; background-color: #FF3300; } .button-save-setup{ height: 35px; width: 110px; color:white; background-color: #1676bc; } + .logos-footer{ height: 70px; width: auto; diff --git a/app/assets/stylesheets/application/collections.scss b/app/assets/stylesheets/application/collections.scss new file mode 100644 index 0000000000000000000000000000000000000000..53e901f10cd8f165fb53ea563ed5caf6011aa5ae --- /dev/null +++ b/app/assets/stylesheets/application/collections.scss @@ -0,0 +1,6 @@ +ul.collection-header { + li { + width: 100%; + margin-bottom: 10px; + } +} \ No newline at end of file diff --git a/app/assets/stylesheets/application/learning_objects.scss b/app/assets/stylesheets/application/learning_objects.scss index 38bbd922f6323895b4395884afe7f5905f939afa..3d79699dbb96f38830a595b39e87dde7a1c13e34 100644 --- a/app/assets/stylesheets/application/learning_objects.scss +++ b/app/assets/stylesheets/application/learning_objects.scss @@ -70,6 +70,11 @@ $checked_icon: 'icons/checked.png'; margin-top: 3px; overflow: hidden; text-overflow: ellipsis; + + .media-heading { + overflow: hidden; + text-overflow: ellipsis; + } } .learning-object-thumbnail { diff --git a/app/assets/stylesheets/application/welcome.scss b/app/assets/stylesheets/application/welcome.scss index fdd6587e533635e4a8edff1f70fd230f4048b9c2..0ab1389a7661511af76343f1e399aef77dbc1106 100644 --- a/app/assets/stylesheets/application/welcome.scss +++ b/app/assets/stylesheets/application/welcome.scss @@ -115,4 +115,14 @@ $carousel_size: 400px; .left-edge { position:absolute; } + + .icon{ + width:30px;height: 30px; + } + .icon1{ + width:140px;height: 140px; + } + .bt_cadastrar{ + margin-top: 10px; width: 230px; background-color: #FF2134; + } } diff --git a/app/builders/collection_builder.rb b/app/builders/collection_builder.rb new file mode 100644 index 0000000000000000000000000000000000000000..f64521c9103d97d5eeb9a31a6fadd109aa0f390c --- /dev/null +++ b/app/builders/collection_builder.rb @@ -0,0 +1,48 @@ +class CollectionBuilder + extend RepositoriesProxy + + ## + # receive a list of ids and return a list of collections + def self.build(objects = []) + lo = [] + objects.each do |object| + unless object['rid'].blank? + o = Rails.cache.fetch(cache_key(object['rid'], object['last_modified'])) + o = collection_repository.find object['rid'] if o.nil? + lo << o + end + end + lo + end + + def self.build_from_orientdb(args = {}) + lo = nil + unless args.nil? + # cache object when build + lo = Rails.cache.fetch(cache_key(args['@rid'], args['last_modified']), expires_in: 12.hours) do + obj = Collection.new( + learning_objects: LearningObjectBuilder.build(map_rid_to_object(args['learning_objects']) || []), + privacy: args['privacy'], + name: args['name'], + id: args['@rid'] + ) + obj.created_at = DateTime.strptime(args['created_at'], "%Y-%m-%d %H:%M:%S") unless args['created_at'].nil? + obj.last_modified = DateTime.strptime(args['last_modified'], "%Y-%m-%d %H:%M:%S") unless args['last_modified'].nil? + obj + end + end + lo + end + + def self.cache_key(rid, last_modified) + rid + '/' + last_modified + end + + def self.map_rid_to_object(ids) + return {'rid' => ids} if ids.class == String + + ids.map do |id| + {'rid' => id} + end + end +end diff --git a/app/builders/learning_object_builder.rb b/app/builders/learning_object_builder.rb index b42a03ffb18319850c0c0839de2c0b71152d0d7f..e494291a7d981a88c53460dcae78e2e62df2edd0 100644 --- a/app/builders/learning_object_builder.rb +++ b/app/builders/learning_object_builder.rb @@ -7,19 +7,26 @@ class LearningObjectBuilder # def self.build(objects = []) lo = [] + objects = [objects] if objects.class == String objects.each do |object| - o = Rails.cache.fetch(cache_key(object[:@rid], object[:last_modified])) + unless object['rid'].blank? + o = Rails.cache.fetch(cache_key(object['rid'], object['last_modified'])) unless object['last_modified'].blank? - # TODO: fix learning_object_repository call - o = learning_object_repository.find object[:@rid] if o.nil? + if o.nil? + o = learning_object_repository.find object['rid'] + else + o.update_dynamic_fields + end - lo << o + lo << o + end end lo end def self.build_from_orientdb(args = {}) lo = nil + unless args.nil? # cache object when build lo = Rails.cache.fetch(cache_key(args['@rid'], args['last_modified']), expires_in: 12.hours) do @@ -37,11 +44,12 @@ class LearningObjectBuilder obj.created_at = DateTime.strptime(args['created_at'], "%Y-%m-%d %H:%M:%S") unless args['created_at'].nil? obj.last_modified = DateTime.strptime(args['last_modified'], "%Y-%m-%d %H:%M:%S") unless args['last_modified'].nil? obj.published_at = DateTime.strptime(args['published_at'], "%Y-%m-%d %H:%M:%S") unless args['published_at'].nil? - obj.likes = args.key?('in_Likes') ? args['in_Likes'].size : 0 - obj.views = args.key?('in_Views') ? args['in_Views'].size : 0 obj end + + lo.update_dynamic_fields end + lo end diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 647cc1b6cc5beaf7f28230cf0c04293a40f79014..106b97dbe9c01f0768f25cdb9a2df90a03e47bb6 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -4,13 +4,18 @@ class ApplicationController < ActionController::Base # Prevent CSRF attacks by raising an exception. # For APIs, you may want to use :null_session instead. protect_from_forgery with: :null_session + before_action :count_learning_objects before_action :configure_permitted_parameters, if: :devise_controller? before_action :set_current_user_collections, if: :user_signed_in? protected + def count_learning_objects + @learning_object_count = learning_object_repository.count_all + end + def set_current_user_collections - @user_collections = collection_repository.all current_user + @user_collections = collection_repository.all Collections::UserContext.new(current_user) end def configure_permitted_parameters diff --git a/app/controllers/collections_controller.rb b/app/controllers/collections_controller.rb index 912a6a68c906116a0aa59bb7e075e1a576c9451b..4b7b81f1b5cfb2fc0d05871b6f7b68858890d7fe 100644 --- a/app/controllers/collections_controller.rb +++ b/app/controllers/collections_controller.rb @@ -1,11 +1,15 @@ class CollectionsController < ApplicationController - before_action :set_collection, only: [:show, :update, :destroy, :like, :add_learning_object] - before_action :authenticate_user!, except: [:index, :show] + before_action :set_collection, only: [:show, :update, :destroy, :like, :add_learning_object, :remove_learning_object] + before_action :authenticate_user!, only: [:update, :destroy, :like, :add_learning_object, :remove_learning_object] # GET /collections # GET /collections.json def index - @collections = collection_repository.all current_user + if user_signed_in? + @collections = collection_repository.all Collections::UserContext.new(current_user) + else + @collections = collection_repository.all + end end # GET /collections/1 @@ -60,10 +64,20 @@ class CollectionsController < ApplicationController def add_learning_object learning_object = learning_object_repository.find params[:learning_object_id] @collection.add learning_object - collection_repository.save @collection + + if request.xhr? && collection_repository.save_learning_objects(@collection) + render json: {status: true} + end + end + + # DELETE /collections/1/learning_object/43 + def remove_learning_object + learning_object = learning_object_repository.find params[:learning_object_id] + @collection.remove learning_object + collection_repository.save_learning_objects @collection if request.xhr? - render json: {collections: @collection.learning_objects.as_json} + render json: {status: true} end end diff --git a/app/controllers/learning_objects_controller.rb b/app/controllers/learning_objects_controller.rb index ac12721c749a8c9e0ad7fb1a2a79631f7d3a4601..7d813085d557f243edc4b552fede99d4e433f2e7 100644 --- a/app/controllers/learning_objects_controller.rb +++ b/app/controllers/learning_objects_controller.rb @@ -81,7 +81,7 @@ class LearningObjectsController < ApplicationController def bookmarks bookmarks = current_user.bookmarks bookmarks.add @learning_object - collection_repository.save bookmarks + collection_repository.save_learning_objects bookmarks if request.xhr? render json: {id: params[:id]} diff --git a/app/controllers/management/users_controller.rb b/app/controllers/management/users_controller.rb index f8b9770f5562c484bec2a25b554bdd1947cf1ef0..48cd23d8bdb6d3567279befb67c382aa209a7f0d 100644 --- a/app/controllers/management/users_controller.rb +++ b/app/controllers/management/users_controller.rb @@ -3,6 +3,7 @@ class Management::UsersController < ManagementController before_action :set_roles, only: [:new, :edit] def index + #trocar por chamada ao repositorio @users = User.all @@ -27,6 +28,7 @@ class Management::UsersController < ManagementController def create @user = User.new(user_params) + #trocar por chamada ao repositorio @user.roles.ids = Role.all.ids respond_to do |format| @@ -63,6 +65,7 @@ class Management::UsersController < ManagementController def change_roles @user.roles = [] + #trocar por chamada ao repositório @user.roles << Role.find_by_id(params[:role_id]) respond_to do |format| format.html {redirect_to :back, notice: "Usuário #{@user.name} definido como #{@user.roles[0].name}"} diff --git a/app/controllers/search_controller.rb b/app/controllers/search_controller.rb index b16e7f87be2c1315615a97d119329bb05a083ddb..def79d77fea07a842051ac311d4723dc0d806ce4 100644 --- a/app/controllers/search_controller.rb +++ b/app/controllers/search_controller.rb @@ -4,10 +4,9 @@ class SearchController < ApplicationController def index @types = learning_object_repository.types - @subjects = ['Arte', 'Biologia', 'Ciências', 'Educação FÃsica', 'Filosofia', 'FÃsica', 'Geografia', 'História', 'Matemática', 'Português', 'QuÃmica', 'Sociologia'] + @subjects = Subject.default_list - # 'Ensino Infantil' and 'Ensino Superior' will only exist after creation of new learning objects or update of the old ones - @school_levels = ['Ensino Infantil', 'Ensino Fundamental Inicial', 'Ensino Fundamental', 'Ensino Fundamental Final', 'Ensino Médio', 'Ensino Superior', 'Ensino Profissionalizante'] + @school_levels = ['Educação Infantil', 'Ensino Fundamental', 'Ensino Médio'] end def fetch diff --git a/app/models/collection.rb b/app/models/collection.rb index 7b259a766fbf0489efb3dd33cdd471ee6b625eee..5c7616b2bcb77c4b68cda125cf25c7bce023a8af 100644 --- a/app/models/collection.rb +++ b/app/models/collection.rb @@ -30,7 +30,7 @@ class Collection # After remove some learning object to collection, you must use CollectionRepository to persist # the changes. def remove(learning_object) - learning_objects.delete learning_object + learning_objects.delete_if{|x| x.id == learning_object.id} end def valid? diff --git a/app/models/collections/context.rb b/app/models/collections/context.rb new file mode 100644 index 0000000000000000000000000000000000000000..b2a971487086393f6f43b4b4924625dd5698b9bd --- /dev/null +++ b/app/models/collections/context.rb @@ -0,0 +1,13 @@ +module Collections + class Context + + def from + raise NotImplementedError, 'This method must be implemented' + end + + def privacy + nil + end + + end +end diff --git a/app/models/collections/public_context.rb b/app/models/collections/public_context.rb new file mode 100644 index 0000000000000000000000000000000000000000..ba6b51acab6499e387e277d8b0a245e282baaadd --- /dev/null +++ b/app/models/collections/public_context.rb @@ -0,0 +1,16 @@ +## +# This class represents an specification for listing collections +# The PublicContext class specify all collections with field privacy=public +module Collections + class PublicContext < Context + + def from + 'Collection' + end + + def privacy + 'public' + end + + end +end \ No newline at end of file diff --git a/app/models/collections/user_context.rb b/app/models/collections/user_context.rb new file mode 100644 index 0000000000000000000000000000000000000000..c9c3ea33745e0efaa7fe2f8428ddab63b1198773 --- /dev/null +++ b/app/models/collections/user_context.rb @@ -0,0 +1,13 @@ +module Collections + class UserContext < Context + + def initialize(user) + @user = user + end + + def from + sprintf "(select expand(in('BelongsTo')) from %s)", @user.rid + end + + end +end diff --git a/app/models/collections/user_private_context.rb b/app/models/collections/user_private_context.rb new file mode 100644 index 0000000000000000000000000000000000000000..96e7772c1f964a0140a79d9024f08f0d33d79fb1 --- /dev/null +++ b/app/models/collections/user_private_context.rb @@ -0,0 +1,12 @@ +## +# This class represents an specification for listing collections +# The PublicContext class specify all collections with field privacy=public +module Collections + class UserPrivateContext < UserContext + + def privacy + 'private' + end + + end +end \ No newline at end of file diff --git a/app/models/collections/user_public_context.rb b/app/models/collections/user_public_context.rb new file mode 100644 index 0000000000000000000000000000000000000000..1c5b02014753887eaa6c68f042102028765a0475 --- /dev/null +++ b/app/models/collections/user_public_context.rb @@ -0,0 +1,12 @@ +## +# This class represents an specification for listing collections +# The PublicContext class specify all collections with field privacy=public +module Collections + class UserPublicContext < UserContext + + def privacy + 'public' + end + + end +end \ No newline at end of file diff --git a/app/models/learning_object.rb b/app/models/learning_object.rb index da48bf42e04e35545cf6256bfdbaa3931cfae668..c121c02930f8f98bfc044b70100169cccc710644 100644 --- a/app/models/learning_object.rb +++ b/app/models/learning_object.rb @@ -24,18 +24,6 @@ class LearningObject @publisher ||= learning_object_repository.get_publisher(self) end - def like(user) - learning_object_repository.like user, self - end - - def liked?(user) - learning_object_repository.liked? user, self - end - - def dislike(user) - learning_object_repository.dislike user, self - end - def subjects @subjects ||= learning_object_repository.get_subjects(self) end @@ -48,6 +36,20 @@ class LearningObject get_metadata_value_of 'dc.subject.category' end + ## social actions + def like(user) + learning_object_repository.like user, self + end + + def liked?(user) + learning_object_repository.liked? user, self + end + + def dislike(user) + learning_object_repository.dislike user, self + end + ## end social actions + def get_metadata_value_of key get_metadata_values_of(key).first end @@ -61,6 +63,7 @@ class LearningObject values end + #TODO: move for Bitstream model def get_bitstream_retrievelink_of name values = @bitstreams.select { |v| v["bundleName"] == name } unless values.empty? @@ -68,6 +71,7 @@ class LearningObject end end + #TODO: move for Bitstream model def get_bitstream_filename_of name values = @bitstreams.select { |v| v["bundleName"] == name } unless values.empty? @@ -75,14 +79,21 @@ class LearningObject end end + #TODO: move for Bitstream model def get_retrievelink get_bitstream_retrievelink_of "ORIGINAL" end + #TODO: move for Bitstream model def get_filename get_bitstream_filename_of "ORIGINAL" end + def update_dynamic_fields + self.likes = learning_object_repository.count_likes(self) + self.views = learning_object_repository.count_views(self) + self + end private diff --git a/app/models/subject.rb b/app/models/subject.rb index 78f8f4cebec2cf62d315f5bbe7889c2c7ed904cb..ca0c0852fdc3d5d1ed5767fdf560eabf93c66640 100644 --- a/app/models/subject.rb +++ b/app/models/subject.rb @@ -13,4 +13,8 @@ class Subject def subject_repository Portalmec::Application.repository.for :subject end + + def self.default_list + ['Arte', 'Biologia', 'Ciências', 'Educação FÃsica', 'Filosofia', 'FÃsica', 'Geografia', 'História', 'Matemática', 'Português', 'QuÃmica', 'Sociologia'] + end end diff --git a/app/models/user.rb b/app/models/user.rb index 8d183743fcd9df34be35424c6db0668ca4a57a5f..7086b8c11a49d842f41ef12f77427cc806c50ed5 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -35,7 +35,7 @@ class User < ActiveRecord::Base validates_attachment_content_type :avatar, content_type: /\Aimage\/.*\Z/ def collections - collection_repository.all self + collection_repository.all Collections::UserPrivateContext.new(self) end def bookmarks diff --git a/app/repositories/orient_db/collection_repository.rb b/app/repositories/orient_db/collection_repository.rb index c649a4e5e7edddf1c1367038fd586970b0af05b0..c1d6f2636feb0d61517fd756da61cb0bdb2d611f 100644 --- a/app/repositories/orient_db/collection_repository.rb +++ b/app/repositories/orient_db/collection_repository.rb @@ -4,18 +4,16 @@ module OrientDb include OrientDb::Methods::FinderMethods def build_object(args={}) - Collection.new(map_object_hash(args)) + CollectionBuilder.build_from_orientdb args end - def save(collection = Collection.new) + def save_learning_objects(collection = Collection.new) if collection.id.to_s.empty? raise NotPersistedRecordError, 'Before save learning objects to collection, you must persist using CollectionRepository::create method' end - collection.learning_objects.each do |learning_object| - query = sprintf("update %s add learning_objects = %s", collection.id, learning_object.id) - connection.command query - end + connection.command sprintf('update %s REMOVE learning_objects', collection.id) + connection.command sprintf("update %s ADD learning_objects = [%s] SET last_modified='#{Time.now()}'", collection.id, collection.learning_objects.map(&:id).join(',')) end def get_number_of_collections @@ -45,8 +43,11 @@ module OrientDb destroy_edge "BelongsTo", object.id, object.owner.rid end - def all(user) - query = sprintf("select * from (select expand(in('BelongsTo')) from %s) where name<>'Bookmarks'", user.rid) + ## + # Select all collections in context + def all(context = Collections::PublicContext.new) + query = sprintf("select * from %s where name<>'Bookmarks'", context.from) + query += sprintf("and privacy = '%s'", context.privacy) unless context.privacy.blank? build_objects connection.query(query) end @@ -82,17 +83,6 @@ module OrientDb private - def map_object_hash(hash={}) - { - created_at: hash['created_at'], - last_modified: hash['last_modified'], - learning_objects: hash['created_at'], - privacy: hash['privacy'], - name: hash['name'], - id: hash['@rid'] - } - end - def odb_class 'Collection' end diff --git a/app/repositories/orient_db/learning_object_repository.rb b/app/repositories/orient_db/learning_object_repository.rb index 6fe5b5212d4c9a69ea267f4e268ad6512ad23e6e..96eb55b717ea2c4eb741e6ad30f304d42a7bc9ec 100644 --- a/app/repositories/orient_db/learning_object_repository.rb +++ b/app/repositories/orient_db/learning_object_repository.rb @@ -3,6 +3,7 @@ module OrientDb include OrientDb::Methods::EdgeMethods include RepositoriesProxy + ## # Call this methods for increment the views number of a +learning_object+ # You are creating the 'views' relation between an +user+ and +learning_object+ @@ -10,12 +11,30 @@ module OrientDb # # Nothing is returned def increment_views(user, learning_object) + values = {date: sanitize_orientdb_values(Time.now)} + + # If doesn't exist edges from user and learning object, create it and increment attribute if !edge_exists? "Views", user.rid, learning_object.id - create_edge "Views", user.rid, learning_object.id + create_and_set_edge "Views", user.rid, learning_object.id, values learning_object.views = learning_object.views + 1 + # If exists, update the date property of view + else + edge = get_edges "Views", "in", learning_object.id + edge = edge.first + + puts edge + set_values_edge edge["@rid"], values end end + def download(user, learning_object) + download_edge_class = 'Downloads' + values = {date: sanitize_orientdb_values(Time.now)} + + create_and_set_edge download_edge_class, user.rid, learning_object.id, values + learning_object.downloads = learning_object.downloads + 1 + end + ## # Call this method checks if the +user+ has a like relation with +learning_object+ # This methods returns a boolean @@ -34,8 +53,12 @@ module OrientDb def like(user, learning_object) like_edge_class = 'Likes' + # If not liked, like and set date if !liked? user, learning_object - create_edge like_edge_class, user.rid, learning_object.id + # The properties of edge. In this case, only date for edge 'Likes' + values = {date: sanitize_orientdb_values(Time.now)} + + create_and_set_edge like_edge_class, user.rid, learning_object.id, values learning_object.likes = learning_object.likes + 1 end end @@ -211,19 +234,17 @@ module OrientDb 'score DESC' end - query = "SELECT FROM LearningObject WHERE [name, description] LUCENE '#{qry}'" - query = query + " AND out('IsAbout') CONTAINS (name in ['" + params[:subject].join("','") + "'])" unless params[:subject].blank? - query = query + " AND out('IsAbout') CONTAINS (name in ['" + params[:school_level].join("','") + "'])" unless params[:school_level].blank? + query = "SELECT FROM LearningObject WHERE [name, description, author] LUCENE '#{qry}'" + query += " AND out('IsAbout') CONTAINS (name in ['" + params[:subject].join("','") + "'])" unless params[:subject].blank? + unless params[:school_level].blank? + params[:school_level] << 'Ensino Fundamental Inicial' << 'Ensino Fundamental Final' if params[:school_level].include? 'Ensino Fundamental' + query += " AND out('IsAbout') CONTAINS (name in ['" + params[:school_level].join("','") + "'])" + end query = "SELECT * FROM (" + query + ") WHERE " + fetch_types(params[:type]) unless params[:type].blank? query = "SELECT * FROM (" + query + ") WHERE " + fetch_year(params[:year]) unless params[:year].blank? query = "SELECT * FROM (" + query + ") ORDER BY #{order}" query = "SELECT @rid.asString(), last_modified FROM (" + query + ")" - learning_objects_hash = connection.query query, limit: 10000 - - # return only rids with their modification time - learning_objects_hash.map do |e| - {'@rid' => e['rid'], 'last_modified' => e['last_modified']} - end + connection.query query, limit: 10000 end end @@ -263,6 +284,13 @@ module OrientDb qry end + def count_all + Rails.cache.fetch('learning_object/count_all', expires_in: 6.hours) do + result = connection.query 'SELECT COUNT(*) as count FROM LearningObject', limit: 1 + result[0]["count"] + end + end + def count_likes(learning_object) get_in_edges_count "Likes", learning_object.id end @@ -271,20 +299,33 @@ module OrientDb get_in_edges_count "Views", learning_object.id end + def count_downloads(learning_object) + get_in_edges_count "Downloads", learning_object.id + end + def max_likes Rails.cache.fetch('max_likes', expires_in: 6.hours) do - max = connection.command 'SELECT max(in("Likes").size()) FROM LearningObject' - max["result"][0]["max"] + get_max_from_edge("Likes","in") end end def max_views Rails.cache.fetch('max_views', expires_in: 6.hours) do - max = connection.command 'SELECT max(in("Views").size()) FROM LearningObject' - max["result"][0]["max"] + get_max_from_edge("Views","in") end end + def max_downloads + Rails.cache.fetch('max_downloads', expires_in: 6.hours) do + get_max_from_edge("Downloads","in") + end + end + + def get_max_from_edge(edge_class, type) + max = connection.command "SELECT max(#{type}('#{edge_class}').size()) FROM LearningObject" + max["result"][0]["max"] + end + private def accepted_properties diff --git a/app/views/collections/_collection.html.erb b/app/views/collections/_collection.html.erb index 6f630a4d6b09cd86cb89fd0f77df41c6361ae320..6beee53b085c514af50dc485271f0dc2a7ab490e 100644 --- a/app/views/collections/_collection.html.erb +++ b/app/views/collections/_collection.html.erb @@ -1,4 +1,14 @@ <%= link_to collection do %> - <%= image_tag 'icons/collection', width: 24 %> - <%= collection.name %> -<% end %> \ No newline at end of file + <div class="col-sm-4"> + <div> + <%= image_tag 'icons/collection', width: 250,height:150 %> + </div> + <div class="panel-body"> + <h4 class="media-heading"><%= collection.name %></h4> + <span class="glyphicon glyphicon-eye-open">200 </span> + <span class="glyphicon glyphicon-star">4,5 </span> + <span>Por <a>Usuário </a></span> + </div> + </div> + +<% end %> diff --git a/app/views/collections/_create.html.erb b/app/views/collections/_create.html.erb index cd82e0f513265132c9e8ac418077c60e4d21d6eb..9f15495f7c01453a128fcf6d80ac7a4d7693ba3d 100644 --- a/app/views/collections/_create.html.erb +++ b/app/views/collections/_create.html.erb @@ -5,5 +5,7 @@ </div> <div id="create_collection_popover_title" style="display: none"> +<div id="label_add_collection"> Criar coleção </div> +</div> diff --git a/app/views/collections/_form.html.erb b/app/views/collections/_form.html.erb index 87e3d99acbde775bfe2c39e472ad8dd3d23cbaa1..15c9d26572e1d2eb3ac950b419325d36634d5fe3 100644 --- a/app/views/collections/_form.html.erb +++ b/app/views/collections/_form.html.erb @@ -1,5 +1,7 @@ +<div id="create_collection_form"> <%= form_for collection do |f| %> <%= f.label :name %> <%= f.text_field :name, required: true, style: 'width: 250px;' %> <%= f.submit %> <% end %> +</div> diff --git a/app/views/collections/_group.html.erb b/app/views/collections/_group.html.erb index 0b3af44a684bc00e080136588e1fa5102174c9d9..4e3c131b68ebd4fa034be7b0ad9838dee256efca 100644 --- a/app/views/collections/_group.html.erb +++ b/app/views/collections/_group.html.erb @@ -8,4 +8,4 @@ <% end %> </div> </div> -</div> \ No newline at end of file +</div> diff --git a/app/views/collections/show.html.erb b/app/views/collections/show.html.erb index 8e1d227d64e893b5d5fe48618740671b40d866c6..2049dfb7d0d97ccc6b4e75c39acc162236256118 100644 --- a/app/views/collections/show.html.erb +++ b/app/views/collections/show.html.erb @@ -1,33 +1,102 @@ - <nav class="navigation navbar-default "><br/> <div class="container-fluid"> + <div class="navbar-right"> + <%= link_to '#' do %> + <span style="margin-right: 30px;"><button class="but but-shadow but-rc">EDITAR COLEÇÃO</button></span> + <% end %> + </div> <div class="navbar-header"> <%= image_tag image_path("icons/collection.png"), class: "logo-image", size: "90x66" %> - <ul class="nav navbar-nav navbar-right"><h1> <b>Coleção 1</b></h1> <br/> - <%= image_tag image_path("icons/square.png"), class: "logo-image", size: "20x20" %> 200 itens + <ul class="nav navbar-nav navbar-right collection-header" style="margin-left: 30px;"> + <li><h2><%= @collection.name %></h2></li> + <li> + <%= image_tag image_path("icons/square.png"), class: "logo-image", size: "20x20" %> + <%= collection_length @collection %> + </li> </ul> </div> </div> <br/></nav> <nav class="navigation navbar-inverse "> <div class="container-fluid"> - <a class="navbar-brand" href="#">x arquivo(s) selecionado(s)</a> + <a class="navbar-brand" href="#"><font color="FFFFFF">x arquivo(s) selecionado(s)</font></a> <ul class="nav navbar-nav navbar-right"> - <li><a href="#"><%= image_tag image_path("icons/collection1.png"), class: "logo-image", size: "35x28" %> Salvar no - computador</a></li> - <li><a href="#"><%= image_tag image_path("icons/collection1.png"), class: "logo-image", size: "35x28" %> Copiar - para</a></li> - <li><a href="#"><%= image_tag image_path("icons/collection1.png"), class: "logo-image", size: "35x28" %> Mover - para</a></li> - <li> - <a href="#"><%= image_tag image_path("icons/collection1.png"), class: "logo-image", size: "35x28" %> Remover da - coleção</a></li> + <li class="set-align"> + <a href="#"><span class="left-edge1"><%= image_tag image_path("icons/Download_01.png"), class: "logo-image", size: "35x35" %></span><font color="FFFFFF"> + Salvar no <br>computador</font></br></a></li> + <li class="set-align"> + <a href="#"><span class="left-edge1"><%= image_tag image_path("icons/Copiar_Seleção.png"), class: "logo-image", size: "35x35" %></span><font color="FFFFFF"> + Copiar <br>para</font></br></a></li> + <li class="set-align"> + <a href="#"><span class="left-edge1"><%= image_tag image_path("icons/Mover_Seleção.png"), class: "logo-image", size: "35x35" %></span><font color="FFFFFF"> + Mover <br>para</font></br></a></li> + <li class="set-align"> + <a href="#"><span class="left-edge1"><%= image_tag image_path("icons/Remover_da_Coleção_Seleção.png"), class: "logo-image", size: "35x35" %></span><font color="FFFFFF"> + Remover da <br>coleção</font></br></a></li> </ul> </div> </nav> <div class="row mainpage-subjects"> <br/> - <%= render_collection_objects @collection.learning_objects %> -</div> + + <% @collection.learning_objects.each do |learning_object| %> + <%= render learning_object, orientation: 'vertical' %> + <% end %> + + <!--<div class="col-md-4"> + <div class="thumb"> + <input type="checkbox" class="chk " checked="checked" name="" value="0"/> + <%= image_tag image_path('learning-object-preview.png'), class: "logo" %>Obj1 + </div> + <br/> + + <div class="thumb"> + <input type="checkbox" class="chk " checked="checked" name="" value="0"/> + <%= image_tag image_path('learning-object-preview.png'), class: "logo" %>Obj4 + </div> + <br/> + + <div class="thumb"> + <input type="checkbox" class="chk " checked="checked" name="" value="0"/> + <%= image_tag image_path('learning-object-preview.png'), class: "logo" %>Obj7 + </div> + </div> + <div class="col-md-4"> + <div class="thumb"> + <input type="checkbox" class="chk " checked="checked" name="" value="0"/> + <%= image_tag image_path('learning-object-preview.png'), class: "logo" %>Obj2 + </div> + <br/> + + <div class="thumb"> + <input type="checkbox" class="chk " checked="checked" name="" value="0"/> + <%= image_tag image_path('learning-object-preview.png'), class: "logo" %>Obj5 + </div> + <br/> + + <div class="thumb"> + <input type="checkbox" class="chk " checked="checked" name="" value="0"/> + <%= image_tag image_path('learning-object-preview.png'), class: "logo" %>Obj8 + </div> + </div> + <div class="col-md-4"> + <div class="thumb"> + <input type="checkbox" class="chk " checked="checked" name="" value="0"/> + <%= image_tag image_path('learning-object-preview.png'), class: "logo" %>Obj3 + </div> + <br/> + + <div class="thumb"> + <input type="checkbox" class="chk " checked="checked" name="" value="0"/> + <%= image_tag image_path('learning-object-preview.png'), class: "logo" %>Obj6 + </div> + <br/> + + <div class="thumb"> + <input type="checkbox" class="chk " checked="checked" name="" value="0"/> + <%= image_tag image_path('learning-object-preview.png'), class: "logo" %>Obj9 + </div> + </div> --> +</div> \ No newline at end of file diff --git a/app/views/devise/registrations/edit.html.erb b/app/views/devise/registrations/edit.html.erb index 40a46556efd05565a2cc952aa7743ec81ae32047..fcca50845cc927ff701f74c2e896881c7bd7fd29 100644 --- a/app/views/devise/registrations/edit.html.erb +++ b/app/views/devise/registrations/edit.html.erb @@ -9,10 +9,10 @@ <div class="row"> <div class="white-input"> <div class="col-md-2"><br/> - <%= image_tag image_path('user-anon.png'), class: "logo top-padding-setup" %> + <img id="pic" class="user-image" src="<%= current_user.avatar.url(:thumb) %>" alt="Foto do usuário"/> <!-- <%= link_to 'editar foto','#',{:onclick=>'HandleBrowseClick()',class:'link-setup'} %><br/> <input type="file" id="browse" name="avatar" style="display: none" />--> - </br><span class=" btn-file"><%= link_to 'editar foto','#',class:'link-setup'%><%= f.file_field :avatar%></span> + </br><span class=" btn-file"><%= link_to 'editar foto','#', class:'link-setup'%><%= f.file_field :avatar, :onclick=>'HandleChangeImg()',:id => "avatar"%></span> </div> <div class="col-md-10"> <div style="text-align:left"> diff --git a/app/views/devise/registrations/new.html.erb b/app/views/devise/registrations/new.html.erb index d1b073acf4338c592bc62c9e773bc322d7bbd62d..94219191ce1d9e61fdecd7626bd3e8e0fc754051 100644 --- a/app/views/devise/registrations/new.html.erb +++ b/app/views/devise/registrations/new.html.erb @@ -17,19 +17,19 @@ <%= f.file_field :avatar%> </div> </font><br/></br> - <div class="col-md-10"> - <p style="line-height: 170%"> - <div class="col-md-10"> - <span class="pull-right">Nome: + <div class="col-md-10"> + <p style="line-height: 170%"> + <div class="col-md-10"> + <span class="pull-right">Nome: <%= f.text_field :name, autofocus: true, required: true , style:"width:335px;"%></span><br/> - </p> - <p style="line-height: 15%"><br/></p> - <p style="line-height: 170%"> + </p> + <p style="line-height: 15%"><br/></p> + <p style="line-height: 170%"> <span class="pull-right">Email: <%= f.email_field :email, :value => params[:email], required: true, style:"width:335px;" %></span><br/> </p> - <p style="line-height: 15%"><br/></p> - <p style="line-height: 170%"> + <p style="line-height: 15%"><br/></p> + <p style="line-height: 170%"> <span class="pull-right">Senha: <%= f.password_field :password, autocomplete: "off", style:"width:335px;" %><br/> <% if @minimum_password_length %> @@ -42,24 +42,25 @@ <div class="col-md-10"> <span class="pull-right">Confirmar senha: <%= f.password_field :password_confirmation, autocomplete: "off", style:"width:335px;" %> - </span> - </div><br/><br/></p> - </div> - <div class="container-fluid"> - <div class="col-md-offset-3 col-md-5"> - <div class="center_data"> - <div class="col-md-6"> - <br/><span class="pull-right">Já possui conta?</span><br/> - <span class="pull-right"><%= render "devise/shared/links"%></span> - </div> - <div class=" col-md-5"> - <br/><span class="pull-right"><%= f.submit "Cadastrar", :class=> "but but-shadow but-rc" %></span><br/> + </span> + </div><br/><br/></p> + </div> + <div class="container-fluid"> + <div class="col-md-offset-3 col-md-5"> + <div class="center_data"> + <div class="col-md-6"> + <br/><span class="pull-right">Já possui conta?</span><br/> + <span class="pull-right"><%= render "devise/shared/links"%></span> + </div> + <div class=" col-md-5"> + <br/><span class="pull-right"><%= f.submit "Cadastrar", :class=> "but but-shadow but-rc" %></span><br/> + </div> + </div> </div> </div> </div> </div> - </div> - </div> - </div> + </div> + </div> </div> <% end %> diff --git a/app/views/devise/sessions/new.html.erb b/app/views/devise/sessions/new.html.erb index 5ebf33bcdac285f2677b14cc45f10d5967d91049..6ec13f7f999921b0986c6655c90c79066e4d6135 100644 --- a/app/views/devise/sessions/new.html.erb +++ b/app/views/devise/sessions/new.html.erb @@ -48,7 +48,7 @@ </div> <div class=" col-md-3"> <span class="pull-left"> - <%= f.submit "Entrar", class: "btn", style: ' width: 230px; color:white; background-color: #1676bc;' %> + <%= f.submit "Entrar", class: "btn-singin btn " %> </span> <br/> </div> diff --git a/app/views/learning_objects/_add_to_collection_popover.html.erb b/app/views/learning_objects/_add_to_collection_popover.html.erb index 144f518786c77caaacf9fc529b6abf1738e4438a..d26c583cf49cf913a2e5a9f900896f36887d61d1 100644 --- a/app/views/learning_objects/_add_to_collection_popover.html.erb +++ b/app/views/learning_objects/_add_to_collection_popover.html.erb @@ -2,6 +2,7 @@ <% if collections.empty? %> <%= link_to 'Criar coleção', me_users_path %> <% else %> + <ul> <% collections.each do |collection| %> <li> @@ -9,5 +10,7 @@ </li> <% end %> </ul> + + <% end %> -</div> \ No newline at end of file +</div> diff --git a/app/views/learning_objects/_collections_button.html.erb b/app/views/learning_objects/_collections_button.html.erb index be15549ca0ff1950529da7cb8cd6407c4bf880c5..c35f0f4e2fc7f78ff0138fa05133a8a05a4ccb65 100644 --- a/app/views/learning_objects/_collections_button.html.erb +++ b/app/views/learning_objects/_collections_button.html.erb @@ -1,3 +1,3 @@ -<a tabindex="0" class="btn btn-default btn-xs add_to_collection" role="button" data-toggle="popover" data-placement="left" data-trigger="focus" title="Adicionar as coleções" data-poload="/learning_objects/<%= learning_object.id %>/collections.json"> +<a tabindex="0" class="btn btn-default btn-xs add_to_collection" role="button" data-toggle="popover" data-placement="left" title="Adicionar as coleções" data-loid="<%= learning_object.id %>" data-poload="/learning_objects/<%= ERB::Util.url_encode(learning_object.id) %>/collections.json"> <span class="glyphicon glyphicon-list" aria-hidden="true"></span> </a> diff --git a/app/views/learning_objects/show.html.erb b/app/views/learning_objects/show.html.erb index 6d0809473f9fe3c6d36aa7af460cd00551087e77..8671edd849e48744044e059d03b6f62e80541d58 100644 --- a/app/views/learning_objects/show.html.erb +++ b/app/views/learning_objects/show.html.erb @@ -265,11 +265,12 @@ <!-- /container --> <script type="text/javascript"> - $('.view video').hover(function() { - if (this.hasAttribute("controls")) { - this.removeAttribute("controls") - } else { + $(".view video").hover(function(event) { + if (event.type === "mouseenter") { this.setAttribute("controls","controls") } + else if(event.type === "mouseleave") { + this.removeAttribute("controls") + } }); </script> diff --git a/app/views/search/index.html.erb b/app/views/search/index.html.erb index f05dc2e30b57cb825a405c45516f0516ae425a20..05daf66b3ff69cc5ab6b41f9da91839d3e016743 100644 --- a/app/views/search/index.html.erb +++ b/app/views/search/index.html.erb @@ -1,7 +1,6 @@ <%= content_for(:body_attributes) do %> data-no-turbolink <% end %> <div class="row"> <div class="col-sm-3 search-sidebar" id="menu-left"> - <!-- <h2>Busca Avançada</h2> --> <div class="media filters"> <div class="media-left"> <%= image_tag 'icons/filter.png', width:'40px', height:'40px' %> @@ -22,239 +21,12 @@ <% end %> </div> - <!-- <div class="dropdown-element"> - <h4 class="dropdown">Arte<span class="caret caret-align-right"/></h4> - <div> - <select class="select-tag-container filter-subject" multiple="multiple"> - <option value="Pinturas">Conjuntos</option> - <option value="Historia">História Da Arte</option> - </select> - </div> - <h4 class="dropdown">Biologia<span class="caret caret-align-right"/></h4> - - <div> - <select class="select-tag-container filter-subject" multiple="multiple"> - <option value="">Todos</option> - <option value="Plantas">Plantas</option> - <option value="">...</option> - <option value="">...</option> - </select> - </div> - <h4 class="dropdown">Ciências<span class="caret caret-align-right"/></h4> - - <div> - <select class="select-tag-container filter-subject" multiple="multiple"> - <option value="">Todos</option> - <optgroup label="Básico"> - <option value="">...</option> - <option value="">...</option> - </optgroup> - <optgroup label="Avançada"> - <option value="">...</option> - </optgroup> - </select> - </div> - <h4 class="dropdown">Educação FÃsica<span class="caret caret-align-right"/></h4> - - <div> - <select class="select-tag-container filter-subject" multiple="multiple"> - <option value="">Todos</option> - <optgroup label="Básico"> - <option value="">...</option> - <option value="">...</option> - </optgroup> - <optgroup label="Avançada"> - <option value="">...</option> - </optgroup> - </select> - </div> - <h4 class="dropdown">Ensino Religioso<span class="caret caret-align-right"/></h4> - - <div> - <select class="select-tag-container filter-subject" multiple="multiple"> - <option value="">Todos</option> - <optgroup label="Básico"> - <option value="">...</option> - <option value="">...</option> - </optgroup> - <optgroup label="Avançada"> - <option value="">...</option> - </optgroup> - </select> - </div> - <h4 class="dropdown">FÃsica<span class="caret caret-align-right"/></h4> - - <div> - <select class="select-tag-container filter-subject" multiple="multiple"> - <option value="">Todos</option> - <optgroup label="Básico"> - <option value="">...</option> - <option value="">...</option> - </optgroup> - <optgroup label="Avançada"> - <option value="">...</option> - </optgroup> - </select> - </div> - <h4 class="dropdown">Filosofia<span class="caret caret-align-right"/></h4> - - <div> - <select class="select-tag-container filter-subject" multiple="multiple"> - <option value="">Todos</option> - <optgroup label="Básico"> - <option value="">...</option> - <option value="">...</option> - </optgroup> - <optgroup label="Avançada"> - <option value="">...</option> - </optgroup> - </select> - </div> - <h4 class="dropdown">Geografia<span class="caret caret-align-right"/></h4> - <div> - <select class="select-tag-container filter-subject" multiple="multiple"> - <option value="">Todos</option> - <optgroup label="Básico"> - <option value="">...</option> - <option value="">...</option> - </optgroup> - <optgroup label="Avançada"> - <option value="">...</option> - </optgroup> - </select> - </div> - <h4 class="dropdown">História<span class="caret caret-align-right"/></h4> - - <div> - <select class="select-tag-container filter-subject" multiple="multiple"> - <option value="">Todos</option> - <optgroup label="Básico"> - <option value="">História do Brasil</option> - <option value="">...</option> - </optgroup> - <optgroup label="Avançada"> - <option value="">...</option> - </optgroup> - </select> - </div> - <h4 class="dropdown"> LÃngua estrangeira moderna <span class="caret caret-align-right"/></h4> - - <div> - <select class="select-tag-container filter-subject" multiple="multiple"> - <option value="">Todos</option> - <optgroup label="Básico"> - <option value="">...</option> - <option value="">...</option> - </optgroup> - <optgroup label="Avançada"> - <option value="">...</option> - </optgroup> - </select> - </div> - <h4 class="dropdown">LÃngua Portuguesa<span class="caret caret-align-right"/></h4> - <div> - <select class="select-tag-container filter-subject" multiple="multiple"> - <option value="">Todos</option> - <optgroup label="Básico"> - <option value="">...</option> - <option value="">...</option> - </optgroup> - <optgroup label="Avançada"> - <option value="">...</option> - </optgroup> - </select> - </div> - <h4 class="dropdown">Matemática<span class="caret caret-align-right"/></h4> - - <div> - <select class="select-tag-container filter-subject" multiple="multiple"> - <option value="Conjunto">Conjuntos</option> - <option value="Soma">Soma</option> - <option value="Algebra">Ãlgebra</option> - </select> - </div> - <h4 class="dropdown">QuÃmica<span class="caret caret-align-right"/></h4> - - <div> - <select class="select-tag-container filter-subject" multiple="multiple"> - <option value="">..</option> - <option value="">..</option> - <option value="">..</option> - </select> - </div> - <h4 class="dropdown">Sociologia<span class="caret caret-align-right"/></h4> - - <div> - <select class="select-tag-container filter-subject" multiple="multiple"> - <option value="">..</option> - <option value="">..</option> - <option value="">..</option> - </select> - </div> - </div> --> - <!--fim materias --> <% unless @types.blank? %> <h3 class="dropdown open">Conteúdo<span class="caret caret-align-right"/></h3><!--Tipo 1--> <div class="dropdown-element"> <% @types.each do |type| %> <label class="label-checkbox"><input value="<%= type %>" name="filter-type" type="checkbox"> <%= type %></label><br/> <% end %> - <!-- <table class="tipo1" style="width:100%"> - <tr> - <td><p>MÃdia</p></td> - <td></td> - </tr> - <tr> - <td><input value="Fotos" name="filter-type" type="checkbox"> Fotos</td> - <td><input value="Imagens" name="filter-type" type="checkbox"> Imagens</td> - </tr> - <tr> - <td><input value="Ãudio" name="filter-type" type="checkbox"> Ãudio</td> - <td><input value="VÃdeos" name="filter-type" type="checkbox"> VÃdeos</td> - </tr> - <tr> - <td><input value="Apresentações MultimÃdia" name="filter-type" type="checkbox"> Apresentações MultimÃdia</td> - <td><input value="Apps" name="filter-type" type="checkbox"> Apps</td> - </tr> - <tr> - <td></td> - <td></td> - </tr> - <tr> - <td><p>Textos</p></td> - <td></td> - </tr> - <tr> - <td><input value="Anais" name="filter-type" type="checkbox"> Anais</td> - <td><input value="Artigos Web" name="filter-type" type="checkbox"> Artigos Web</td> - </tr> - <tr> - <td><input value="CapÃtulos de Livros" name="filter-type" type="checkbox"> CapÃtulos de Livros</td> - <td><input value="Dissertações" name="filter-type" type="checkbox"> Dissertações</td> - </tr> - <tr> - <td><input value="Livros" name="filter-type" type="checkbox"> Livros</td> - <td><input value="Monografias" name="filter-type" type="checkbox"> Monografias</td> - </tr> - <tr> - <td><input value="Periódicos" name="filter-type" type="checkbox"> Periódicos</td> - <td><input value="Revistas" name="filter-type" type="checkbox"> Revistas</td> - </tr> - <tr> - <td><input value="Teses" name="filter-type" type="checkbox"> Teses</td> - </tr> - <tr> - <td></td> - <td></td> - </tr> - <tr> - <td><p>Outros</p></td> - <td></td> - </tr> - <tr> - <td><input value="Planos de Aula" name="filter-type" type="checkbox"> Planos de Aula</td> - </tr> - </table> --> </div> <% end %> @@ -266,54 +38,7 @@ <% end %> </div> </div> - <!-- fim div class="nestedAccordion"--> - - <!-- <div class="nestedAccordion"> - <h3 class="dropdown">Ano de Publicação<span class="caret caret-align-right"/></h3> - <div class="dropdown-element"> - <form id="filter-year"> - <input type="radio" name="year" value="single" checked>Ano:<br/> - <input type="text" name="singleYear" size="8"> - <br/> - <input type="radio" name="year" value="range">Intervalo:<br/> - <input type="text" name="startYear" size="8"> - <input type="text" name="endYear" size="8"> - <br/><br/> - <button type="submit" class="btn btn-default">Pesquisar</button> - </form> - </div> - - <h3 class="dropdown">Pesquisa Avançada<span class="caret caret-align-right"/></h3> - <form method="get" class="regex"> - <div class="dropdown-element"> - <table style="width:100%"> - <tr> - <td>Todas estas palavras:</td> - <td><input type="text" name="all" ></td> - </tr> - <tr> - <td>A frase exata:</td> - <td><input type="text" name="exact" ></td> - </tr> - <tr> - <td>Qualquer uma destas palavras:</td> - <td><input type="text" name="any"></td> - </tr> - <tr> - <td>Nenhuma destas palavras:</td> - <td><input type="text" name="none"></td> - </tr> - <tr> - <td></td> - <td align="right"><br> - <button type="submit" class="btn btn-default regex-submit">Pesquisar</button> - </td> - </tr> - </table> - </div> - </form> - </div>--> </div> - <!--/span col sm-4--> <!-- search results --> <div class="col-sm-9"> @@ -326,7 +51,7 @@ <div class="col-sm-6" style="text-align: right"> <form method="get"> <input type="hidden" name="qry" value="<%= params["qry"] %>"> - + <label class="result-info">ordenar por </label> <select class="order sort-dropdown" name="order"> <option value="">relevância</option> <option value="author">autores</option> diff --git a/app/views/shared/application/_faq.html.erb b/app/views/shared/application/_faq.html.erb index f888fb86d476a0c3739e70ec4056438292ea64c9..c2379e78026558e597295dbfd09e16203700356a 100644 --- a/app/views/shared/application/_faq.html.erb +++ b/app/views/shared/application/_faq.html.erb @@ -1,33 +1,25 @@ <div class="row"> <div class="col-md-12"> <div class="faq-row"> - <h4 class="question">In hac habitasse platea dictumst?</h4> - <p class="answer">Phasellus condimentum consectetur purus, at pellentesque purus hendrerit a. Prae- - sent at arcu mauris. In at dolor eu erat mollis sollicitudin. Phasellus condimentum consectetur purus, at pellentesque purus hendrerit a. Prae- - sent at arcu mauris. In at dolor eu erat mollis sollicitudin. Phasellus condimentum consectetur purus, at pellentesque purus hendrerit a. Prae- - sent at arcu mauris. In at dolor eu erat mollis sollicitudin. Phasellus condimentum consectetur purus, at pellentesque purus hendrerit a. Prae- - sent at arcu mauris. In at dolor eu erat mollis sollicitudin. Phasellus condimentum consectetur purus, at pellentesque purus hendrerit a. Prae- - sent at arcu mauris. In at dolor eu erat mollis sollicitudin.</p> + <h4 class="question">Preciso me registrar para participar?</h4> + <p class="answer">Você pode consultar e usufruir conteúdos do Portal MEC sem ter cadastro. + Mas para colocar novos materiais é necessário se registrar.</p> </div> <div class="faq-row"> - <h4 class="question">In hac habitasse platea dictumst?</h4> - <p class="answer">Phasellus condimentum consectetur purus, at pellentesque purus hendrerit a. Prae- - sent at arcu mauris. In at dolor eu erat mollis sollicitudin.</p> + <h4 class="question">Posso alterar meus dados cadastrais?</h4> + <p class="answer">Sim, para isso é preciso clicar na sua foto ou no + seu nome e depois em “Editar Perfilâ€.</p> </div> <div class="faq-row"> - <h4 class="question">In hac habitasse platea dictumst?</h4> - <p class="answer">Phasellus condimentum consectetur purus, at pellentesque purus hendrerit a. Prae- - sent at arcu mauris. In at dolor eu erat mollis sollicitudin.</p> + <h4 class="question">Esqueci minha senha. E agora?</h4> + <p class="answer">Você pode clicar na página inicial, em “entre†e no formulário de entrada + existe um link “Esqueceu sua senhaâ€, ou ainda você pode clicar na sua foto ou no seu nome e + depois em “Editar Perfilâ€, existe um outro link no inÃcio da página “Esqueci a senhaâ€.</p> </div> <div class="faq-row"> - <h4 class="question">In hac habitasse platea dictumst?</h4> - <p class="answer">Phasellus condimentum consectetur purus, at pellentesque purus hendrerit a. Prae- - sent at arcu mauris. In at dolor eu erat mollis sollicitudin.</p> - </div> - <div class="faq-row"> - <h4 class="question">In hac habitasse platea dictumst?</h4> - <p class="answer">Phasellus condimentum consectetur purus, at pellentesque purus hendrerit a. Prae- - sent at arcu mauris. In at dolor eu erat mollis sollicitudin.</p> + <h4 class="question">Posso salvar um objeto educacional do portal em meu computador?</h4> + <p class="answer">Sim, existe a opção “salvar no computador†na página que mostra os detalhes + do objeto educacional.</p> </div> </div> </div> diff --git a/app/views/shared/application/_footer.html.erb b/app/views/shared/application/_footer.html.erb index 014c5cf79625e26d81357cb43b275a7678411891..3ce3c8bd655022f683f94ec814455a1159a15964 100644 --- a/app/views/shared/application/_footer.html.erb +++ b/app/views/shared/application/_footer.html.erb @@ -1,6 +1,6 @@ <footer> <div class="footer-bar"> - <div class="row"> + <div class="container"> <div class="col-md-offset-5 col-md-4"> <div class="logo" > <%= link_to root_path do %> @@ -10,7 +10,6 @@ <% end %> </div> </div> - </div> </div> <div class="main"> @@ -18,29 +17,29 @@ <div class="col-md-12" style="padding-top: 50px"> <div class="logo-footer"> <%= link_to 'http://www.brasil.gov.br/' do %> - <%= image_tag 'logo_brasil.png',class:'logos-footer' %> + <%= image_tag 'logo_brasil.png',class:'logos-footer normal' %> <% end %> - </div> - <div class="logo-footer"> + </div> + <div class="logo-footer"> <%= link_to 'http://www.fnde.gov.br/' do %> - <%= image_tag 'logo_ministerio.png',class:'logos-footer', style: ' margin-left: 18%;' %> + <%= image_tag 'logo_ministerio.png',class:'logos-footer ministerio-size' %> <% end %> - </div> + </div> <div class="logo-footer"> <%= link_to 'http://www.fnde.gov.br/' do %> - <%= image_tag 'fnde.png', style: 'width: auto; height: 100px; margin-top: -8%;' %> + <%= image_tag 'fnde.png', class:'fnde-size' %> <% end %> </div> <div class="logo-footer"> <%= link_to 'http://www.ufpr.br/portalufpr/' do %> - <%= image_tag 'logo_ufpr.jpg',class:'logos-footer'%> + <%= image_tag 'logo_ufpr.jpg',class:'logos-footer normal'%> <% end %> </div> <div class="logo-footer"> <%= link_to 'http://www.c3sl.ufpr.br/' do %> - <%= image_tag 'logo_c3.png', class:'logos-footer'%> + <%= image_tag 'logo_c3.png', class:'logos-footer normal'%> <% end %> - </div> + </div> </div> </div> diff --git a/app/views/shared/application/_header.html.erb b/app/views/shared/application/_header.html.erb index 189269e96931d1d56b22d4140085f330665d9c3a..92d16b03c01b9e78cff9ddf72c33c638020847d1 100644 --- a/app/views/shared/application/_header.html.erb +++ b/app/views/shared/application/_header.html.erb @@ -2,10 +2,9 @@ <div class="barra-brasil"> <div class="container"> <div id="barra-brasil"> - <ul id="menu-barra-temp" style="list-style:none;"> - <li style="display:inline; float:left;padding-right:10px; margin-right:10px; border-right:1px solid #EDEDED"> - <a href="http://brasil.gov.br" style="font-family:sans,sans-serif; text-decoration:none; color:white;">Portal - do Governo Brasileiro</a></li> + <ul> + <li> + <a href="http://brasil.gov.br" >Portal do Governo Brasileiro</a></li> <li> <a style="font-family:sans,sans-serif; text-decoration:none; color:white;" href="http://epwg.governoeletronico.gov.br/barra/atualize.html">Atualize sua Barra de Governo</a></li> @@ -21,7 +20,6 @@ <div class="logo" data-no-turbolink> <%= link_to root_path do %> <%= image_tag image_path("logo.png"), class: "logo-image" %><br/> - <h3>CONTEÚDO EDUCACIONAL</h3> <% end %> </div> @@ -37,17 +35,15 @@ <div class="search-input"> <form action="/search" method="get"> <div class="input-group" id="search"> - <input type="text" placeholder="buscar" class="form-control" name="query" id="main_search"> - - + <input type="text" placeholder="buscar em <%= number_with_delimiter(@learning_object_count, delimiter: ".") %> objetos educacionais" class="form-control" name="query" id="main_search"> <div class="input-group-btn"> <button class="btn btn-default" type="submit"><i class="glyphicon glyphicon-search"></i></button> </div> </div> </form> - <%= link_to 'busca avançada', search_path, class: 'search-label' %> + </div> </div> @@ -119,4 +115,4 @@ </div> </div> </div> -</header> \ No newline at end of file +</header> diff --git a/app/views/shared/application/_links.html.erb b/app/views/shared/application/_links.html.erb index afb8fcb9ca9dea64d3fb95f2f3e95b570f56b4c6..a9a27188266e7edda63cd5569edf85d884f0dd24 100644 --- a/app/views/shared/application/_links.html.erb +++ b/app/views/shared/application/_links.html.erb @@ -3,17 +3,17 @@ <h4><b>Portais nacionais e internacionais</b></h4> <div class="row inner-column"> <ul class="list-bullet col-md-12"> - <li><a href="">Portais Educacionais</a></li> - <li><a href="">Museus</a></li> - <li><a href="">Bibliotecas</a></li> - <li><a href="">Revistas</a></li> - <li><a href="">Projetos Inovadores</a></li> - <li><a href="">Jornais</a></li> - <li><a href="">Projeto de escolas</a></li> - <li><a href="">Um computador por aluno</a></li> - <li><a href="">Geoprocessamento</a></li> - <li><a href="">Prêmio Professores do Brasil</a></li> - <li><a href="">Capacitação ProInfo Integrado</a></li> + <li><a href="http://webeduc.mec.gov.br/educacionais.php">Portais Educacionais</a></li> + <li><a href="https://www.museus.gov.br/">Museus</a></li> + <li><a href="http://www.dominiopublico.gov.br/pesquisa/PesquisaObraForm.jsp">Bibliotecas</a></li> + <li><a href="http://portaldoprofessor.mec.gov.br/link.html?categoria=14">Revistas</a></li> + <li><a href="http://portaldoprofessor.mec.gov.br/link.html?categoria=419">Projetos Inovadores</a></li> + <li><a href="http://jornaisescolares.dge.mec.pt/">Jornais</a></li> + <li><a href="http://portaldoprofessor.mec.gov.br/link.html?categoria=15">Projeto de escolas</a></li> + <li><a href="http://www.uca.gov.br">Um computador por aluno</a></li> + <li><a href="http://www.infoescola.com/cartografia/geoprocessamento/">Geoprocessamento</a></li> + <li><a href="http://premioprofessoresdobrasil.mec.gov.br/">Prêmio Professores do Brasil</a></li> + <li><a href="http://portaldoprofessor.mec.gov.br/link.html?categoria=17">Capacitação ProInfo Integrado</a></li> </ul> </div> </div> @@ -21,11 +21,11 @@ <h4><b>Visite também</b></h4> <div class="row inner-column"> <ul class="list-bullet col-md-12"> - <li><a href="">DomÃnio Público</a></li> - <li><a href="">E-ProInfo</a></li> - <li><a href="">Objetos Educacionais</a></li> - <li><a href="">Plataforma Freire</a></li> - <li><a href="">TV Escola</a></li> + <li><a href="http://www.dominiopublico.gov.br/pesquisa/PesquisaObraForm.jsp">DomÃnio Público</a></li> + <li><a href="http://e-proinfo.mec.gov.br">E-ProInfo</a></li> + <li><a href="http://objetoseducacionais2.mec.gov.br/">Objetos Educacionais</a></li> + <li><a href="http://freire.capes.gov.br/">Plataforma Freire</a></li> + <li><a href="http://tvescola.mec.gov.br/tve/home">TV Escola</a></li> </ul> </div> </div> diff --git a/app/views/welcome/add_file.html.erb b/app/views/welcome/add_file.html.erb index d7b64b59b66aa378834aa9d0555f34cd7b97b13e..2db342c9f5e2aacf218ce1e4645984cb452f0875 100644 --- a/app/views/welcome/add_file.html.erb +++ b/app/views/welcome/add_file.html.erb @@ -1,12 +1,13 @@ -<div class="container"> +<div class="container add-file"> <div class="row"> <div class="col-md-12"> <div class="container-fluid" style="margin-left:10px;"> <%= image_tag image_path('icons/upload.png'), class: "logo",style:"width:50px;" %> - <span class="pull-left"><h3 style="position:absolute; margin-left:60px;">Adicionando x arquivos</h3> + <span class="pull-left"> + <h3 class="title">Adicionando x arquivos</h3> </div> </div><br/> <div class="grey-panel"> @@ -15,7 +16,7 @@ <div class="white-input"> <div class="col-md-3"> - <%= image_tag image_path('icons/square.png'), style:"width:250px; height:150px;" %><br/> + <%= image_tag image_path('icons/square.png'),class:"logo-add-file" %><br/> <%= link_to 'editar foto', search_path,style:'color: #1676bc;' %> </div> <div class="col-md-9"> @@ -23,28 +24,29 @@ <table style="margin-left:0px;"> <tr> <td colspan="2"> - <input type="text" size="70px" style="height:30px;font-size:14pt; margin-bottom: 10px;" placeholder="TÃtulo do arquivo"> + <input class= "input-add-file" type="text" size="70px" style="height:30px;" placeholder="TÃtulo do arquivo"> </td> </tr> <tr> <td colspan="2"> - <input type="text" size="70px" style="height:65px;font-size:14pt; margin-bottom: 10px;" placeholder="Descrição"> + <input class= "input-add-file" type="text" size="70px" style="height:65px;" placeholder="Descrição"> <br/> </td> </tr> <tr> - <td colspan="2"> <input type="text" size="70px" style="height:30px;font-size:14pt; margin-bottom: 10px;" placeholder="Assunto"></td> + <td colspan="2"> + <input class= "input-add-file" type="text" size="70px" style="height:30px;" placeholder="Assunto"></td> </tr> <tr> <td> - <select style="width: 345px; margin-left:8px"> + <select class="select-add-file" style="margin-left:8px"> <option value="">NÃvel</option> <option value="">..</option> </select> </td> <td> - <select style="width: 345px;"> + <select class="select-add-file"> <option value="">Adicionar à coleção</option> <option value="">..</option> </select> @@ -52,7 +54,7 @@ </tr> <tr> <td colspan="2"> - <div class=" pull-right"> <%= button_to "Remover", new_user_registration_path,class: "btn btn-danger", style: 'margin-top: 15px; width: 130px; background-color: #FF2134;'%></div> + <div class=" pull-right"> <%= button_to "Remover", new_user_registration_path,class: "btn btn-danger btn-remove "%></div> </td> </tr> </table> @@ -67,7 +69,7 @@ <div class="pull-right"> <input type="checkbox" > Li e concordo com os <%= link_to 'termos e condições', search_path, style:'color: #1676bc;' %> de upload e copyright<br/><br/> <div class="pull-left"><div style= 'margin-left:130px;'><%= link_to 'Cancelar', search_path %></div></div> - <div class="pull-right"><%= button_to "Salvar", search_path,class: "btn pull-right", style: 'margin-top: -10px; width: 230px; color:white; background-color: #1676bc;'%></div> + <div class="pull-right"><%= button_to "Salvar", search_path,class: "btn pull-right add_file-save"%></div> </div> </div> diff --git a/app/views/welcome/file_outside_user.html.erb b/app/views/welcome/file_outside_user.html.erb new file mode 100644 index 0000000000000000000000000000000000000000..b5adff771d64abf4c00918ff9c7ff682694e9b3c --- /dev/null +++ b/app/views/welcome/file_outside_user.html.erb @@ -0,0 +1,65 @@ +<!-- User visualizing profile from other user !--> + +<div class="grey-panel"> + <div class="container-fluid"> + <div class="navbar-right"> + <span style="margin-right: 100px;"><button class="but but-shadow but-rc but-width">Seguir</button></span> + <br/><br/> + <div style="float: left;"> <b>21</b><br/>seguindo</div> + <div style="float: right; WIDTH: 60%"> <b>30</b><br/>seguidores</div> + <divstyle="clear: both"> + </div> + <div class="navbar-header"> + <%= image_tag image_path("user-anon.png"), class: "logo-image",size: "80x60" %> + <ul class="nav navbar-nav navbar-right"> + <h1> Usuário<br/></h1> + <p> Instituição nome</p> + <p> 200 itens</p></ul> + </div> + </div> +</div> +<div class="row mainpage-subjects"> + <h2><b>Arquivos de usuário</b></h2> + <p>200 itens</p> + <div class="col-md-4"> + <div class="thumb"> + <input type="checkbox" class="chk " checked="checked" name="" value="0" /> + <%= image_tag image_path('learning-object-preview.png'), class: "logo" %>Obj1 + </div><br/> + </div> + <div class="col-md-4"> + <div class="thumb"> + <input type="checkbox" class="chk " checked="checked" name="" value="0" /> + <%= image_tag image_path('learning-object-preview.png'), class: "logo" %>Obj2 + </div><br/> + </div> + <div class="col-md-4"> + <div class="thumb"> + <input type="checkbox" class="chk " checked="checked" name="" value="0" /> + <%= image_tag image_path('learning-object-preview.png'), class: "logo" %>Obj3 + </div><br/> + </div> + <div style="float: right; WIDTH: 11%"><b>ver tudo</b><br/></div> +</div> +<div class="row mainpage-subjects"> + <h2><b>Coleção de usuário</b><br/><br/></h2> + <p>Coleções Automáticas</p> + <div class="navbar-header"> + <%= image_tag image_path("icons/collection.png"), class: "logo-image",size: "45x45" %> + <ul class="nav navbar-nav navbar-right"> Arquivos de usuário<br/> + <%= image_tag image_path("icons/square.png"), class: "logo-image",size: "10x10" %> 200</ul> + </div><br/><br/><br> + <p>Minhas Coleções</p> + <div class="navbar-header"> + <%= image_tag image_path("icons/collection.png"), class: "logo-image",size: "45x45" %> + <ul class="nav navbar-nav navbar-right"> Coleção 1<br/> + <%= image_tag image_path("icons/square.png"), class: "logo-image",size: "10x10" %> 200</ul> + </div><br/><br/><br/> + <p>Coleções Sugeridas</p> + <div class="navbar-header"> + <%= image_tag image_path("icons/collection.png"), class: "logo-image",size: "45x45" %> + <ul class="nav navbar-nav navbar-right"> Coleção 1<br/> + <%= image_tag image_path("icons/square.png"), class: "logo-image",size: "10x10" %> 200 + <%= image_tag image_path("user-anon.png"), class: "logo-image",size: "20x20" %> por Usuário </ul> + </div> +</div> diff --git a/app/views/welcome/index.html.erb b/app/views/welcome/index.html.erb index 4999ce58200a4f14ee0906ca826154a57f8252a2..5eceb4e726c8fff7258f0965369359eb9f799188 100644 --- a/app/views/welcome/index.html.erb +++ b/app/views/welcome/index.html.erb @@ -49,16 +49,16 @@ <div class="registration-banner col-md-3 col-md-offset-1 hidden-xs hidden-sm"> <div class="panel-wrapper"> <div style="padding: 30px; min-height: 400px;"> - <div style="text-align:center"><%= image_tag image_path('icons/signup.png'), class: "logo",size: "140x140" %></div> + <div style="text-align:center"><%= image_tag image_path('icons/signup.png'), class: "logo icon1" %></div> <div style="text-align:center"><h2>Cadastre-se para aproveitar:</h2></div><br/> - <h4><div class="left-edge"><%= image_tag image_path('icons/star-gold.png'), class: "logo",size: "30x30" %></div><div class="right-edge">Avalie, comente e favorite arquivos.</div></h4> - <h4><div class="left-edge"><%= image_tag image_path('icons/foldergreen.png'), class: "logo",size: "30x30" %></div><div class="right-edge">Siga coleções e usuários.</div></h4> - <h4><div class="left-edge"><%= image_tag image_path('icons/downloadred.png'), class: "logo",size: "30x30" %></div><div class="right-edge">Crie coleções para rápido acesso e download.</div></h4> + <h4><div class="left-edge"><%= image_tag image_path('icons/star-gold.png'), class: "logo icon" %></div><div class="right-edge">Avalie, comente e favorite arquivos.</div></h4> + <h4><div class="left-edge"><%= image_tag image_path('icons/foldergreen.png'), class: "logo icon"%></div><div class="right-edge">Siga coleções e usuários.</div></h4> + <h4><div class="left-edge"><%= image_tag image_path('icons/downloadred.png'), class: "logo icon" %></div><div class="right-edge">Crie coleções para rápido acesso e download.</div></h4> </div> <div style="width: 100%; padding: 30px;"> <%= form_tag(new_user_registration_path, method: 'get') do %> <%= text_field_tag :email, '', placeholder: "Seu email", class: 'form-control'%> - <div class="right-button"><%= button_to "Cadastrar", new_user_registration_path,class: "btn btn-danger", style: 'margin-top: 10px; width: 230px; background-color: #FF2134;'%></div> + <div class="right-button"><%= button_to "Cadastrar", new_user_registration_path,class: "btn btn-danger bt_cadastrar"%></div> <% end %> </div> </div> diff --git a/app/workers/score_calculator_worker.rb b/app/workers/score_calculator_worker.rb index 308f6c824517a931a201d0ce257af4cb8f4a6866..794b410b2567e51419b37d090016afd5f284c0e5 100644 --- a/app/workers/score_calculator_worker.rb +++ b/app/workers/score_calculator_worker.rb @@ -7,25 +7,55 @@ class ScoreCalculatorWorker object = learning_object_repository.find(rid) unless object.blank? - weights = {"thumbnail": 40, "likes": 20, "views": 10, "description": 30} - - score = 0 - - # 40 points if it has thumbnail - score += weights[:thumbnail] unless object.thumbnail.blank? - - # 1 point per like - likes = learning_object_repository.count_likes(object) - score += (likes / learning_object_repository.max_likes)*weights[:likes] unless likes < 1 - - # 1 point per view - views = learning_object_repository.count_views(object) - score += (views / learning_object_repository.max_views)*weights[:views] unless views < 1 + # Weights to score. Sum must be 1000 + weights = { + "thumbnail": 250, + "description": 150, + "likes": 250, + "views": 150, + "downloads":200 + } + + score = 0 + + # 250 points if it has thumbnail + score += weights[:thumbnail] unless object.thumbnail.blank? + + # 150 points if it has description + score += weights[:description] unless object.description.blank? + + # range to 250 points, for normalized likes ( maxLikes/actualLike => [0..1] ) + score += divide_by_max( + learning_object_repository.count_likes(object), + learning_object_repository.max_likes, + weights[:likes] + ) + + # range to 200 points, for normalized views ( maxLikes/actualLike => [0..1] ) + score += divide_by_max( + learning_object_repository.count_views(object), + learning_object_repository.max_views, + weights[:views] + ) + + # downloads + score += divide_by_max( + learning_object_repository.count_downloads(object), + learning_object_repository.max_downloads, + weights[:downloads] + ) + + learning_object_repository.update_property(object, 'score', score) + end + end - # 30 points if it has description - score += weights[:description] unless object.description.blank? + private - learning_object_repository.update_property(object, 'score', score) + def divide_by_max(i, max, weight) + if (i > 0 && max > 0) && (i <= max) + (i / max) * weight + else + 0 end end end diff --git a/config/routes.rb b/config/routes.rb index 054234983348e916f3592dcb8e16a7f982f4ee88..23badfd30c83f49fae91b52eeea0f0c2e8b69387 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -53,6 +53,9 @@ Rails.application.routes.draw do member do # add a learning object for some collection post '/learning_object/:learning_object_id', as: :add_learning_object, action: :add_learning_object + + # remove a learning object for some collection + delete '/learning_object/:learning_object_id', as: :destroy_learning_object, action: :remove_learning_object end end @@ -70,8 +73,8 @@ Rails.application.routes.draw do get '/autocomplete' => 'search#autocomplete' get '/subject/:id' => 'welcome#subject', as: 'subject_index' - get '/collection' => 'welcome#collection' get '/add_file' => 'welcome#add_file' get '/signup' => 'welcome#signup' get '/follow_collection' => 'welcome#follow_collection' + get '/file_outside_user' => 'welcome#file_outside_user' end diff --git a/lib/orient_db/methods/edge_methods.rb b/lib/orient_db/methods/edge_methods.rb index 021dc9169707f5f0d0b335013aa3ef567327b72e..2f03e58b75fef03b81cba18b136a37175757e15d 100644 --- a/lib/orient_db/methods/edge_methods.rb +++ b/lib/orient_db/methods/edge_methods.rb @@ -23,6 +23,14 @@ module OrientDb connection.command "CREATE EDGE #{edge_class} FROM #{from_id} TO #{to_id}" end + def create_and_set_edge(edge_class, from_id, to_id, values={}) + query = "CREATE EDGE #{edge_class} FROM #{from_id} TO #{to_id} CONTENT #{values.to_json}" + + puts query + + connection.command query + end + def destroy_edge(edge_class, from_id, to_id) connection.command "DELETE EDGE #{edge_class} FROM #{from_id} TO #{to_id}" end @@ -31,6 +39,14 @@ module OrientDb connection.query sprintf("SELECT expand(%s('%s')) FROM %s", type, edge_class, vertex_id) end + def get_edges(edge_class, type, vertex_id) + connection.query sprintf("SELECT * FROM #{edge_class} WHERE #{type} = #{vertex_id}") + end + + def set_values_edge(edge_id, values={}) + connection.command "UPDATE #{edge_id} CONTENT #{values.to_json}" + end + def edge_exists?(edge_class, from_id, to_id) edge = connection.query sprintf("SELECT outE('%s') FROM %s WHERE out('%s') CONTAINS %s", edge_class, from_id, edge_class, to_id) !edge.empty? diff --git a/lib/tasks/thumbnail.rake b/lib/tasks/thumbnail.rake index 33335851ed1d729f9b6148765d76187e618136a0..2381eb6ee51c94821bfeb001fdbceb429a66a560 100644 --- a/lib/tasks/thumbnail.rake +++ b/lib/tasks/thumbnail.rake @@ -2,7 +2,18 @@ namespace :thumbnail do desc "Generate Thumbnails" task :generate => :environment do + generate + end + + namespace :generate do + task :force => :environment do + generate(true) + end + end + + private + def generate(force = false) include RepositoriesProxy # Quantity of items fetched on each iteration @@ -26,7 +37,7 @@ namespace :thumbnail do break if items.empty? items.each do |item| - ThumbnailGeneratorWorker.perform_async(item.id) if item.thumbnail.blank? + ThumbnailGeneratorWorker.perform_async(item.id) if (item.thumbnail.blank? || force) end # Increment offset, to get new items on next iteration diff --git a/public/system/users/avatars/000/000/001/medium/singup.png b/public/system/users/avatars/000/000/001/medium/singup.png new file mode 100644 index 0000000000000000000000000000000000000000..6c6e2aeed303d3100fab18a8450897c0c4752eac Binary files /dev/null and b/public/system/users/avatars/000/000/001/medium/singup.png differ diff --git a/public/system/users/avatars/000/000/001/original/singup.png b/public/system/users/avatars/000/000/001/original/singup.png new file mode 100644 index 0000000000000000000000000000000000000000..083ccb7ad3cb5f5a4cda6f4efa515d0199754d5a Binary files /dev/null and b/public/system/users/avatars/000/000/001/original/singup.png differ diff --git a/public/system/users/avatars/000/000/001/thumb/singup.png b/public/system/users/avatars/000/000/001/thumb/singup.png new file mode 100644 index 0000000000000000000000000000000000000000..c5315e556d067a1459c8f41c96b9dbcc9a6b9069 Binary files /dev/null and b/public/system/users/avatars/000/000/001/thumb/singup.png differ diff --git a/test/repositories/orient_db/collection_repository_test.rb b/test/repositories/orient_db/collection_repository_test.rb index 60862d4c15d2d139cc30e6ca29ee00c12bb0f13f..5e3745c5d92e31da1bd5ebcb68c630fa09e89eb6 100644 --- a/test/repositories/orient_db/collection_repository_test.rb +++ b/test/repositories/orient_db/collection_repository_test.rb @@ -7,23 +7,22 @@ class OrientDb::CollectionRepositoryTest < ActiveSupport::TestCase collection_repository = OrientDb::CollectionRepository.new odb_client assert_raise NotPersistedRecordError do - collection_repository.save Collection.new + collection_repository.save_learning_objects Collection.new end end test 'save learning objects to persisted collection' do + lo = LearningObject.new(id: '#14:14') + collection = Collection.new(id: '#12:12', learning_objects: [lo]) + + # setup orient4r mock + expected_mock_arg = sprintf("update %s add learning_objects = %s", collection.id, lo.id) odb_client = mock - odb_client.expect :command, nil + odb_client.expect :command, nil, [expected_mock_arg] + collection_repository = OrientDb::CollectionRepository.new odb_client - collection_repository.save Collection.new(id: '#12:12') - assert !mock.verify + collection_repository.save_learning_objects collection + assert mock.verify end - #def save(collection = Collection.new) - #collection.learning_objects.each do |learning_object| - # query = sprintf("update %s add learning_objects = %s", collection.id, learning_object.id) - # connection.command query - #end - #end - end \ No newline at end of file