diff --git a/Gemfile b/Gemfile index 7e59067d3aa677f47d5557f309a33ed7b150184e..d4f33ea316da3d1fad8ad212de25f686241954c0 100644 --- a/Gemfile +++ b/Gemfile @@ -143,3 +143,9 @@ gem 'gitlab' # upload gem 'resumablejs-rails' + +#authorization +gem 'pundit' + +# elasticsearch integration +gem 'searchkick' diff --git a/Gemfile.lock b/Gemfile.lock index 4c1f98d4f65ec8f2f528588670a012af3ccc1887..73890adc6f5fbedcca9c4b1b1872cc7c5564e804 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,7 +1,6 @@ GEM remote: https://rubygems.org/ specs: - abstract_type (0.0.7) actionmailer (4.2.0) actionpack (= 4.2.0) actionview (= 4.2.0) @@ -37,13 +36,10 @@ GEM minitest (~> 5.1) thread_safe (~> 0.3, >= 0.3.4) tzinfo (~> 1.1) - adamantium (0.2.0) - ice_nine (~> 0.11.0) - memoizable (~> 0.4.0) addressable (2.3.8) arel (6.0.3) - ast (2.1.0) - autoprefixer-rails (6.1.2) + ast (2.2.0) + autoprefixer-rails (6.3.1) execjs json axiom-types (0.1.1) @@ -61,7 +57,7 @@ GEM autoprefixer-rails (>= 5.2.1) sass (>= 3.3.4) builder (3.2.2) - bullet (4.14.10) + bullet (5.0.0) activesupport (>= 3.0.0) uniform_notifier (~> 1.9.0) byebug (8.2.1) @@ -77,42 +73,47 @@ GEM coderay (1.1.0) coercible (1.0.0) descendants_tracker (~> 0.0.1) - coffee-rails (4.1.0) + coffee-rails (4.1.1) coffee-script (>= 2.2.0) - railties (>= 4.0.0, < 5.0) + railties (>= 4.0.0, < 5.1.x) coffee-script (2.4.1) coffee-script-source execjs coffee-script-source (1.10.0) - concord (0.1.5) - adamantium (~> 0.2.0) - equalizer (~> 0.0.9) + colorize (0.7.7) concurrent-ruby (1.0.0) connection_pool (2.2.0) curb (0.8.8) - dalli (2.7.4) + dalli (2.7.5) debug_inspector (0.0.2) descendants_tracker (0.0.4) thread_safe (~> 0.3, >= 0.3.1) - devise (3.5.3) + devise (3.5.6) bcrypt (~> 3.0) orm_adapter (~> 0.1) railties (>= 3.2.6, < 5) responders thread_safe (~> 0.1) warden (~> 1.2.3) - devise_token_auth (0.1.36) - devise (~> 3.5.2) - rails (~> 4.2) - diff-lcs (1.2.5) - domain_name (0.5.25) + devise_token_auth (0.1.37) + devise (> 3.5.2, < 4.1) + rails (< 6) + domain_name (0.5.20160128) unf (>= 0.0.5, < 1.0.0) - dspace_rest_client (2.2.1) + dspace_rest_client (2.2.2) activesupport (~> 4.2, >= 4.2.0) faraday (~> 0.9.2) json (~> 1.8, >= 1.8.3) net-http-persistent (~> 2.9, >= 2.9.4) resource_kit (~> 0.1.4) + elasticsearch (1.0.15) + elasticsearch-api (= 1.0.15) + elasticsearch-transport (= 1.0.15) + elasticsearch-api (1.0.15) + multi_json + elasticsearch-transport (1.0.15) + faraday + multi_json equalizer (0.0.11) erubis (2.7.0) execjs (2.6.0) @@ -134,17 +135,18 @@ GEM terminal-table globalid (0.3.6) activesupport (>= 4.1.0) + hashie (3.4.3) http-cookie (1.0.2) domain_name (~> 0.5) httparty (0.13.7) json (~> 1.8) multi_xml (>= 0.5.2) i18n (0.7.0) - ice_nine (0.11.1) - jbuilder (2.3.2) - activesupport (>= 3.0.0, < 5) + ice_nine (0.11.2) + jbuilder (2.4.0) + activesupport (>= 3.0.0, < 5.1) multi_json (~> 1.2) - jquery-rails (4.0.5) + jquery-rails (4.1.0) rails-dom-testing (~> 1.0) railties (>= 4.2.0) thor (>= 0.14, < 2.0) @@ -157,45 +159,46 @@ GEM kaminari (0.16.3) actionpack (>= 3.0.0) activesupport (>= 3.0.0) + launchy (2.4.3) + addressable (~> 2.3) libarchive-static (1.0.5) libv8 (3.16.14.13) - locastyle (0.0.2) + locastyle (0.0.3) loofah (2.0.3) nokogiri (>= 1.5.9) mail (2.6.3) mime-types (>= 1.16, < 3) - memoizable (0.4.2) - thread_safe (~> 0.3, >= 0.3.1) mime-types (2.99) mimemagic (0.3.0) - mina (0.3.7) + mina (0.3.8) open4 (~> 1.3.4) rake mini_portile2 (2.0.0) - minitest (5.8.3) + minitest (5.8.4) multi_json (1.11.2) multi_xml (0.5.5) multipart-post (2.0.0) net-http-persistent (2.9.4) netrc (0.11.0) - nokogiri (1.6.7) + nokogiri (1.6.7.2) mini_portile2 (~> 2.0.0.rc2) open4 (1.3.4) orientdb4r (0.5.1) rest-client (~> 1.7) orm_adapter (0.5.0) - paperclip (4.3.2) + paperclip (4.3.3) activemodel (>= 3.2.0) activesupport (>= 3.2.0) cocaine (~> 0.5.5) mime-types mimemagic (= 0.3.0) - parser (2.2.3.0) - ast (>= 1.1, < 3.0) + parser (2.3.0.2) + ast (~> 2.2) pg (0.18.4) private_attr (1.1.0) - procto (0.0.2) - puma (2.15.3) + puma (2.16.0) + pundit (1.1.0) + activesupport (>= 3.0.0) rack (1.6.4) rack-cors (0.4.0) rack-mini-profiler (0.9.8) @@ -221,30 +224,30 @@ GEM activesupport (>= 4.2.0.beta, < 5.0) nokogiri (~> 1.6.0) rails-deprecated_sanitizer (>= 1.0.1) - rails-html-sanitizer (1.0.2) + rails-html-sanitizer (1.0.3) loofah (~> 2.0) railties (4.2.0) actionpack (= 4.2.0) activesupport (= 4.2.0) rake (>= 0.8.7) thor (>= 0.18.1, < 2.0) - rainbow (2.0.0) - rake (10.4.2) + rainbow (2.1.0) + rake (10.5.0) rake-compiler (0.9.5) rake - rdoc (4.2.0) + rdoc (4.2.1) + json (~> 1.4) redis (3.2.2) - reek (3.7.1) + reek (3.9.1) codeclimate-engine-rb (~> 0.1.0) - parser (~> 2.2, >= 2.2.2.5) + parser (~> 2.3) private_attr (~> 1.1) rainbow (~> 2.0) - unparser (~> 0.2.2) ref (2.0.0) resource_kit (0.1.4) addressable (~> 2.3.6) - responders (2.1.0) - railties (>= 4.2.0, < 5) + responders (2.1.1) + railties (>= 4.2.0, < 5.1) rest-client (1.8.0) http-cookie (>= 1.0.2, < 2.0) mime-types (>= 1.16, < 3.0) @@ -254,15 +257,17 @@ GEM rmagick (2.15.4) rsolr (1.0.13) builder (>= 2.1.2) - ruby_parser (3.7.2) + ruby_parser (3.7.3) sexp_processor (~> 4.1) - rubycritic (2.3.0) + rubycritic (2.7.0) + colorize flay (= 2.6.1) flog (= 4.3.2) - parser (>= 2.2.0, < 3.0) - reek (= 3.7.1) + launchy (= 2.4.3) + parser (~> 2.3) + reek (= 3.9.1) virtus (~> 1.0) - sass (3.4.20) + sass (3.4.21) sass-rails (5.0.4) railties (>= 4.0.0, < 5.0) sass (~> 3.1) @@ -272,9 +277,13 @@ GEM sdoc (0.4.1) json (~> 1.7, >= 1.7.7) rdoc (~> 4.0) - select2-rails (4.0.0) + searchkick (1.1.2) + activemodel + elasticsearch (>= 1) + hashie + select2-rails (4.0.1) thor (~> 0.14) - sexp_processor (4.6.0) + sexp_processor (4.6.1) shoulda (3.5.0) shoulda-context (~> 1.0, >= 1.0.1) shoulda-matchers (>= 1.4.1, < 3.0) @@ -283,28 +292,27 @@ GEM shoulda-context (1.2.1) shoulda-matchers (2.8.0) activesupport (>= 3.0.0) - sidekiq (4.0.1) + sidekiq (4.1.0) concurrent-ruby (~> 1.0) connection_pool (~> 2.2, >= 2.2.0) - json (~> 1.0) redis (~> 3.2, >= 3.2.1) - sinatra (1.4.6) - rack (~> 1.4) + sinatra (1.4.7) + rack (~> 1.5) rack-protection (~> 1.4) tilt (>= 1.3, < 3) slim (3.0.6) temple (~> 0.7.3) tilt (>= 1.3.3, < 2.1) - spring (1.5.0) + spring (1.6.2) sprockets (3.5.2) concurrent-ruby (~> 1.0) rack (> 1, < 3) - sprockets-rails (2.3.3) - actionpack (>= 3.0) - activesupport (>= 3.0) - sprockets (>= 2.8, < 4.0) + sprockets-rails (3.0.1) + actionpack (>= 4.0) + activesupport (>= 4.0) + sprockets (>= 3.0.0) sqlite3 (1.3.11) - stackprof (0.2.7) + stackprof (0.2.8) streamio-ffmpeg (1.0.0) temple (0.7.6) terminal-table (1.5.2) @@ -313,7 +321,7 @@ GEM ref thor (0.19.1) thread_safe (0.3.5) - tilt (2.0.1) + tilt (2.0.2) turbolinks (2.5.3) coffee-rails tzinfo (1.2.2) @@ -325,22 +333,14 @@ GEM unf_ext unf_ext (0.0.7.1) uniform_notifier (1.9.0) - unparser (0.2.4) - abstract_type (~> 0.0.7) - adamantium (~> 0.2.0) - concord (~> 0.1.5) - diff-lcs (~> 1.2.5) - equalizer (~> 0.0.9) - parser (~> 2.2.2) - procto (~> 0.0.2) virtus (1.0.5) axiom-types (~> 0.1) coercible (~> 1.0) descendants_tracker (~> 0.0, >= 0.0.3) equalizer (~> 0.0, >= 0.0.9) - warden (1.2.4) + warden (1.2.6) rack (>= 1.0) - web-console (2.2.1) + web-console (2.3.0) activemodel (>= 4.0) binding_of_caller (>= 0.7.2) railties (>= 4.0) @@ -379,6 +379,7 @@ DEPENDENCIES paperclip pg puma + pundit rack-cors rack-mini-profiler rails (= 4.2.0) @@ -390,6 +391,7 @@ DEPENDENCIES rubycritic sass-rails (~> 5.0) sdoc (~> 0.4.0) + searchkick select2-rails shoulda shoulda-callback-matchers (~> 1.1.1) diff --git a/app/assets/javascripts/application/autocomplete.js b/app/assets/javascripts/application/autocomplete.js index 8e42ea9a6997c1d0d63167d6d45b3f856eb4350d..6d532090f9258290ba92a88269fc08cc03b7491c 100644 --- a/app/assets/javascripts/application/autocomplete.js +++ b/app/assets/javascripts/application/autocomplete.js @@ -4,7 +4,7 @@ $(document).ready(function() { source: function (request, response) { $.ajax({ url: "/autocomplete", - data: { q: request.term }, + data: { query: request.term }, dataType: "json", success: response, error: function () { diff --git a/app/assets/javascripts/management/institutions.coffee b/app/assets/javascripts/management/institutions.coffee index 24edb353d62c2955277978889d478edf15b0666b..b9fc9e9669381a293bbe1c93a9a5910a3ab0c590 100644 --- a/app/assets/javascripts/management/institutions.coffee +++ b/app/assets/javascripts/management/institutions.coffee @@ -24,7 +24,7 @@ $ -> len = all.length html = '' while i < len - name = 'user_' + all[i].rid.split(':').slice(-1)[0] + name = 'user_' + all[i].id html += '<input type="checkbox" class="institutional-user-element" data-uid="' + all[i].id + '" data-institution-id="' + institution_id + '" id="' + name + '"' if lookup[all[i].id] != undefined html += " checked" diff --git a/app/assets/stylesheets/application.scss b/app/assets/stylesheets/application.scss index 72738b2576c586728bb1990ed969421a3a18a1c5..fa2e1abfe2cbb1a83f18fa94066f136fdfe8444a 100644 --- a/app/assets/stylesheets/application.scss +++ b/app/assets/stylesheets/application.scss @@ -21,6 +21,7 @@ @import "select2"; @import "select2-bootstrap"; @import "bootstrap-tagsinput"; +@import "spinners"; $header-blue: #1676bc; $link-grey: #343D3E; diff --git a/app/builders/attribute_builder.rb b/app/builders/attribute_builder.rb index 2e6526c3de74377e4a5a3f5385f054f99c8c21a8..b471ea786fd67304389e0af79a0047ae0562248b 100644 --- a/app/builders/attribute_builder.rb +++ b/app/builders/attribute_builder.rb @@ -8,7 +8,7 @@ class AttributeBuilder < Builder def self.build_from_orientdb(args = {}) super(args) do - Attribute.new( + ::Orientdb::Attribute.new( id: args['@rid'], key: args['key'], value: args['value'] diff --git a/app/builders/collection_builder.rb b/app/builders/collection_builder.rb index c26d1fc920b697edc8071c0a03c954879889877e..83bb9fa94699243070d53cf5cd4a63a12973da25 100644 --- a/app/builders/collection_builder.rb +++ b/app/builders/collection_builder.rb @@ -14,7 +14,7 @@ class CollectionBuilder < Builder def self.build_from_orientdb(args = {}) super(args) do learning_objects = args['learning_objects'].nil? ? [] : LearningObjectBuilder.build(map_rid_to_object(args['learning_objects'])) - obj = Collection.new( + obj = Orientdb::Collection.new( learning_objects: learning_objects, privacy: args['privacy'], id: args['@rid'], diff --git a/app/builders/complaint_builder.rb b/app/builders/complaint_builder.rb index ea434a24bbc8a18f3fa46cdf4332928b02ff950a..2bfa6416852ab094e8aaa1ac8dfdf24ab1d360ac 100644 --- a/app/builders/complaint_builder.rb +++ b/app/builders/complaint_builder.rb @@ -11,12 +11,12 @@ class ComplaintBuilder < Builder created = DateTime.now.strftime("%Y-%m-%d %H:%M:%S") created = DateTime.strptime(args['created_at'], "%Y-%m-%d %H:%M:%S") unless args['created_at'].blank? - Complaint.new( + Orientdb::Complaint.new( id: args['@rid'], user: user_repository.get_by_rid(args['out']), created_at: created, object: learning_object_repository.find(args['in'].to_s), - message: ComplaintMessage.new(args['message']), + message: Orientdb::ComplaintMessage.new(args['message']), description: args['description'] || '' ) end diff --git a/app/builders/institution_builder.rb b/app/builders/institution_builder.rb index e41388c00dfed1e528b3ce2c7353fd3012421319..41e49bd6ff4e3b3c50d5c4f1a5702e305c16937d 100644 --- a/app/builders/institution_builder.rb +++ b/app/builders/institution_builder.rb @@ -8,7 +8,7 @@ class InstitutionBuilder < Builder def self.build_from_orientdb(args = {}) super(args) - Institution.new( + Orientdb::Institution.new( id: args['@rid'], name: args['name'], created_at: args['created_at'], diff --git a/app/builders/learning_object/attachment_builder.rb b/app/builders/learning_object/attachment_builder.rb index 82fde31334d66407faf66202ba54ac5664a81c4a..30dae96ad3aca4e8d904375711349753efed29fd 100644 --- a/app/builders/learning_object/attachment_builder.rb +++ b/app/builders/learning_object/attachment_builder.rb @@ -8,7 +8,7 @@ class LearningObject::AttachmentBuilder < ::Builder def self.build_from_orientdb(args = {}) build_from_cache args do - ::LearningObject::Attachment.new(sanitize_args(args)) + ::Orientdb::LearningObject::Attachment.new(sanitize_args(args)) end end diff --git a/app/builders/learning_object_builder.rb b/app/builders/learning_object_builder.rb index 8f7eec29af5b9cfda451a3dfe90c724cc185e485..485c92c0701682e1dd82b9ce576a3e7ec0b93e26 100644 --- a/app/builders/learning_object_builder.rb +++ b/app/builders/learning_object_builder.rb @@ -7,11 +7,28 @@ class LearningObjectBuilder < Builder super(learning_object_repository, objects, true, 'rid') end + def self.build_from_dspace(item) + lo = LearningObject.new( + name: item.name, + id_dspace: item.id, + thumbnail: nil, + metadata: item.metadata.to_json + ) + + lo.author = lo.get_metadata_values_of('dc.contributor.author').join(', ') + lo.description = lo.get_metadata_value_of('dc.description') + lo.object_type = lo.get_metadata_value_of('dc.type') + lo.language = lo.get_metadata_value_of('dc.language') + date = lo.get_metadata_value_of('dc.date.issued') + lo.published_at = Time.iso8601(date) unless date.nil? + lo + end + def self.build_from_orientdb(args = {}) super(args) do # args['metadata'] = [] args['metadata'] = JSON.parse(args['metadata']) if args['metadata'].class == String - obj = LearningObject.new( + obj = Orientdb::LearningObject.new( id: args['@rid'], name: args['name'], description: args['description'], diff --git a/app/builders/subject_builder.rb b/app/builders/subject_builder.rb index b211cbc497c9b36befe3df9547e91f2359502807..3f8e0c53f83f9ed3dc54e07a2129f1abffc0a32d 100644 --- a/app/builders/subject_builder.rb +++ b/app/builders/subject_builder.rb @@ -12,7 +12,7 @@ class SubjectBuilder < Builder def self.build_from_orientdb(args = {}) super(args) do - Subject.new( + Orientdb::Subject.new( id: args['@rid'], name: args['name'], created_at: args['created_at'], diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 106b97dbe9c01f0768f25cdb9a2df90a03e47bb6..63c441455e67618f7c7a8859a45386ee9a7bf1bd 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -6,16 +6,11 @@ class ApplicationController < ActionController::Base 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 Collections::UserContext.new(current_user) + @learning_object_count = LearningObject.count end def configure_permitted_parameters @@ -32,17 +27,4 @@ class ApplicationController < ActionController::Base end end - def dspace_service - @dspace_service ||= DspaceService.new( - DspaceService.create_dspace_client( - Rails.application.secrets.dspace_host, - get_dspace_authenticable_token - ) - ) - end - - def get_dspace_authenticable_token - session[:dspace_auth_token] || nil - end - end diff --git a/app/controllers/collections_controller.rb b/app/controllers/collections_controller.rb index 377bcf070322933996b6abee984ba97c8858d96b..579ac97593418960f11e7cce6a570e003b3116ad 100644 --- a/app/controllers/collections_controller.rb +++ b/app/controllers/collections_controller.rb @@ -9,8 +9,7 @@ class CollectionsController < ApplicationController respond_to do |format| # for HTML page, returns institutional collections format.html do - context = Collections::InstitutionsContext.new(institution_repository.all) - @collections = collection_repository.all context + @collections = Collection.all.where(owner: Institution.all) end # returns all collection of logged user as JSON for UI actions @@ -37,7 +36,7 @@ class CollectionsController < ApplicationController @own = user_signed_in? ? @collection.owner?(current_user) : false end - render partial: 'list' if params[:list] == "true" + render partial: 'list' if params[:list] == 'true' end # POST /collections/1/like @@ -52,7 +51,7 @@ class CollectionsController < ApplicationController @collection.owner = current_user if collection_params[:owner].blank? respond_to do |format| - if collection_repository.create @collection + if @collection.save format.html { redirect_to :back, notice: 'Coleção criada com sucesso.' } else format.html { render :new } @@ -88,7 +87,7 @@ class CollectionsController < ApplicationController # list all @collection = nil if @collection == 'all' - @collections = collection_repository.all(Collections::UserContext.new(current_user)) + @collections = Collection.from_user(current_user) @collections.select! { |c| c.id != @collection.id } unless @collection.blank? unless params[:type].blank? @@ -125,16 +124,13 @@ class CollectionsController < ApplicationController @collections.each do |collection| if collection.owner?(current_user) @learning_objects.each do |learning_object| - collection.add learning_object + collection.learning_objects << learning_object end - - collection_repository.save_learning_objects(collection) + collection.save end end - if request.xhr? - render json: {status: true} - end + render json: { status: true } if request.xhr? end # DELETE /collections/1/learning_object @@ -142,50 +138,48 @@ class CollectionsController < ApplicationController @collections.each do |collection| if collection.owner?(current_user) @learning_objects.each do |learning_object| - collection.remove learning_object + collection.learning_objects.destroy(learning_object) end - - collection_repository.save_learning_objects(collection) + collection.save end end - if request.xhr? - render json: {status: true} - end + render json: { status: true } if request.xhr? end # change collection privacy def change_privacy - collection_repository.change_privacy(@collection, params[:privacy]) + @collection.privacy = params[:privacy] - if request.xhr? - render json: {status: true} - end + response = @collection.save + + render json: { status: response } if request.xhr? end private + def check_collection_privacy!(collection) - if collection.privacy == "private" + if collection.private? redirect_to :root, notice: 'Está é uma coleção privada.' unless collection.owner?(current_user) end end def set_collection - @collection = collection_repository.find params[:id] + @collection = Collection.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} + @collections = (params[:id].class == String) ? [Collection.find(params[:id])] : params[:id].map{|id| Collection.find id} end unless params[:learning_objects_ids].blank? @learning_objects = [] params[:learning_objects_ids].split(',').each do |id| - object = learning_object_repository.find id + object = LearningObject.find id @learning_objects << object unless object.blank? end end @@ -201,7 +195,7 @@ class CollectionsController < ApplicationController # Never trust parameters from the scary internet, only allow the white list through. def collection_params - params.require(:collection).permit(:name, :description, :owner,learning_objects: []) + params.require(:collection).permit(:name, :description, :owner, learning_objects: []) end end diff --git a/app/controllers/institutions_controller.rb b/app/controllers/institutions_controller.rb index 9bc354c56c7823d2b44ef7eb378807a43ab2ec7e..15c60d0212fde1e5f4dd7893a16bf9a1089d6191 100644 --- a/app/controllers/institutions_controller.rb +++ b/app/controllers/institutions_controller.rb @@ -58,13 +58,13 @@ class InstitutionsController < ApplicationController end def users - @users = institution_repository.associated_with @institution + @users = @institution.users end private def set_institution - @institution = institution_repository.find(params[:id]) + @institution = Institution.find(params[:id]) end # Never trust parameters from the scary internet, only allow the white list through. diff --git a/app/controllers/learning_objects_controller.rb b/app/controllers/learning_objects_controller.rb index 135da181b20d402d92689bec79bc7aa7d3a3c0e4..847ded97dc0c2a250359137e641bc0344946e551 100644 --- a/app/controllers/learning_objects_controller.rb +++ b/app/controllers/learning_objects_controller.rb @@ -14,7 +14,7 @@ class LearningObjectsController < ApplicationController # GET /learning_objects/1 # GET /learning_objects/1.json def show - @liked = learning_object_repository.liked?(current_user, @learning_object) if user_signed_in? + @liked = !@learning_object.likes.where(user: current_user).blank? if user_signed_in? end # GET /learning_objects/new @@ -83,7 +83,7 @@ class LearningObjectsController < ApplicationController end if request.xhr? - render json: {count: @learning_object.likes, id: params[:id]} + render json: {count: @learning_object.likes.count, id: params[:id]} end end @@ -118,14 +118,14 @@ class LearningObjectsController < ApplicationController # Use callbacks to share common setup or constraints between actions. def set_learning_object - @learning_object = learning_object_repository.find params[:id] + @learning_object = LearningObject.find params[:id] end def set_learning_object_type allowed_types = ['VÃdeo', 'Imagem', 'Ãudio'] - if allowed_types.include? @learning_object.type - @type = @learning_object.type + if allowed_types.include? @learning_object.object_type + @type = @learning_object.object_type else @type = case @learning_object.default_attachment.mime_type when /image\//i then 'Imagem' @@ -142,9 +142,7 @@ class LearningObjectsController < ApplicationController end def increment_learning_object_views - if user_signed_in? - learning_object_repository.increment_views current_user, @learning_object - end + View.create(viewable: @learning_object, user: current_user) if user_signed_in? end def success_redirect(learning_object) diff --git a/app/controllers/management/carousels_controller.rb b/app/controllers/management/carousels_controller.rb index b39f2c5bb0e2d4a120d6c6111dba53d9ff836c4b..9eb9c5e295db8333ece0da6cb17452b3707780e1 100644 --- a/app/controllers/management/carousels_controller.rb +++ b/app/controllers/management/carousels_controller.rb @@ -2,7 +2,7 @@ class Management::CarouselsController < ManagementController before_action :set_carousel, only: [:edit, :update, :destroy] def index - @carousels = carousel_repository.all + @carousels = Carousel.all end def new @@ -13,7 +13,7 @@ class Management::CarouselsController < ManagementController @carousel = Carousel.new(carousel_params) respond_to do |format| - if carousel_repository.save @carousel + if @carousel.save format.html { redirect_to management_carousels_path } else format.html { render :new } @@ -26,7 +26,7 @@ class Management::CarouselsController < ManagementController def update respond_to do |format| - if carousel_repository.update(@carousel, carousel_params) + if @carousel.update(carousel_params) format.html { redirect_to management_carousels_path } else format.html { render :edit } @@ -36,7 +36,7 @@ class Management::CarouselsController < ManagementController def destroy @carousel.image = nil - carousel_repository.destroy @carousel + @carousel.destroy respond_to do |format| format.html { redirect_to management_carousels_path } end @@ -45,7 +45,7 @@ class Management::CarouselsController < ManagementController private def set_carousel - @carousel = carousel_repository.find params[:id] + @carousel = Carousel.find params[:id] end def carousel_params diff --git a/app/controllers/management/institutions_controller.rb b/app/controllers/management/institutions_controller.rb index 7ae24fe55649646028423c0171b9fbb2fd3ae115..9cc46be075da09ef71d754c0a5db64aef3f6ec42 100644 --- a/app/controllers/management/institutions_controller.rb +++ b/app/controllers/management/institutions_controller.rb @@ -4,7 +4,7 @@ class Management::InstitutionsController < ManagementController # GET /management/institutions # GET /management/institutions.json def index - @institutions = institution_repository.all || [] + @institutions = Institution.all end # GET /management/institutions/1 @@ -27,7 +27,7 @@ class Management::InstitutionsController < ManagementController @institution = Institution.new(institution_params) respond_to do |format| - if institution_repository.create @institution + if @institution.save format.html { redirect_to [:management, @institution], notice: 'Instituição criada com sucesso.' } format.json { render :show, status: :created, location: @institution } else @@ -42,7 +42,10 @@ class Management::InstitutionsController < ManagementController def add_user user = User.find(params[:user_id]) - institution_repository.add_user(user, @institution) unless user.blank? + unless user.blank? + @institution.users << user + @institution.save + end render json: true end @@ -50,9 +53,7 @@ class Management::InstitutionsController < ManagementController # DELETE /management/institutions/:id/user/:user_id # remove user from institution def remove_user - user = User.find(params[:user_id]) - - institution_repository.remove_user(user, @institution) unless user.blank? + @institution.users.delete(params[:user_id]) render json: true end @@ -61,7 +62,7 @@ class Management::InstitutionsController < ManagementController # PATCH/PUT /management/institutions/1.json def update respond_to do |format| - if @institution.update(institution_params) + if @institution.update institution_params format.html { redirect_to [:management, @institution], notice: 'Instituição modificada com sucesso.' } format.json { render :show, status: :ok, location: @institution } else @@ -74,7 +75,7 @@ class Management::InstitutionsController < ManagementController # DELETE /management/institutions/1 # DELETE /management/institutions/1.json def destroy - institution_repository.destroy @institution + @institution.destroy respond_to do |format| format.html { redirect_to management_institutions_url, notice: 'Instituição deletada com sucesso.' } format.json { head :no_content } @@ -82,13 +83,13 @@ class Management::InstitutionsController < ManagementController end private - # Use callbacks to share common setup or constraints between actions. - def set_institution - @institution = institution_repository.find(params[:id]) - end + # Use callbacks to share common setup or constraints between actions. + def set_institution + @institution = Institution.find params[:id] + end - # Never trust parameters from the scary internet, only allow the white list through. - def institution_params - params[:institution] - end + # Never trust parameters from the scary internet, only allow the white list through. + def institution_params + params.require(:institution).permit(:name, :city, :country, :address, :description) + end end diff --git a/app/controllers/management/statistics_controller.rb b/app/controllers/management/statistics_controller.rb index c073cd2c2de8a2ed88f5f75547dce5896ace44da..a2b32010c871c2ac8f53c744fc2f319300f56ef0 100644 --- a/app/controllers/management/statistics_controller.rb +++ b/app/controllers/management/statistics_controller.rb @@ -24,21 +24,9 @@ class Management::StatisticsController < ManagementController def users #missing roles @n_users = User.count - @n_curators = 0 - @n_admins = 0 - @n_teachers = 0 - User.includes(:roles).all.each do |u| - if !u.roles[0].nil? - if u.roles[0]["name"] == "curator" - @n_curators += 1 - elsif u.roles[0]["name"] == "admin" - @n_admins += 1 - elsif u.roles[0]["name"] == "teacher" - @n_teachers +=1 - end - end - end - + @n_curators = Role.find_by(name: "curator").users.size + @n_admins = Role.find_by(name: "admin").users.size + @n_teachers = Role.find_by(name: "teacher").users.size end def accesses @@ -74,11 +62,11 @@ class Management::StatisticsController < ManagementController def set_statistics @@n_users = User.count - @@n_collections = collection_repository.get_number_of_collections || [] - @@n_learning_objects = learning_object_repository.count_all || [] - @@n_non_visualised = learning_object_repository.get_number_of_non_visualised || [] - @@most_visualised = learning_object_repository.get_most_visualised || [] - @@n_views = learning_object_repository.get_number_of("Views") || [] + @@n_collections = Collection.all.size + @@n_learning_objects = LearningObject.all.size + @@n_non_visualised = LearningObject.where(views_count: 0).size + @@most_visualised = LearningObject.order(:views_count) + @@n_views = LearningObject.sum(:views_count) end def views diff --git a/app/controllers/management/users_controller.rb b/app/controllers/management/users_controller.rb index 73bdc0ff6cab056350dba03b882e2ce658f69068..61eaf953179d25dd84bdeaf0c1414021824dde03 100644 --- a/app/controllers/management/users_controller.rb +++ b/app/controllers/management/users_controller.rb @@ -3,7 +3,7 @@ class Management::UsersController < ManagementController before_action :set_roles, only: [:new, :edit] def index - @users = user_repository.all + @users = User.includes(:roles).all end # GET /users/1 @@ -24,11 +24,10 @@ class Management::UsersController < ManagementController # POST /users.json def create @user = User.new(user_params) - @user.roles.ids = role_repository.all.ids respond_to do |format| - if user_repository.save @user - format.html { redirect_to management_user_path(@user), notice: "User created!" } + if @user.save + format.html { redirect_to management_users_path, notice: "User created!" } format.json { render :show, status: :created, location: @user } else format.html { render :new } @@ -41,8 +40,8 @@ class Management::UsersController < ManagementController # PATCH/PUT /users/1.json def update respond_to do |format| - if user_repository.update(@user, user_params) - format.html { redirect_to management_user_path(@user), notice: "User updated!" } + if @user.update(user_params) + format.html { redirect_to management_users_path, notice: "User updated!" } else format.html { render :edit } end @@ -52,7 +51,7 @@ class Management::UsersController < ManagementController # DELETE /users/1 # DELETE /users/1.json def destroy - user_repository.destroy @user + @user.destroy respond_to do |format| format.html { redirect_to management_users_path, notice: "User destroyed!" } end @@ -60,10 +59,10 @@ class Management::UsersController < ManagementController def change_roles @user.roles = [] - @user.roles << role_repository.find_by_id(params[:role_id]) + @user.roles << Role.find(params[:role_id]) respond_to do |format| - if user_repository.save @user + if @user.save format.html {redirect_to :back, notice: "Usuário #{@user.name} definido como #{@user.roles[0].name}"} else format.html {redirect_to :back, notice: "Erro na atribuição!"} @@ -77,7 +76,7 @@ class Management::UsersController < ManagementController @users = User.includes(:roles).all @users.all.each do |user| if !user.roles[0].nil? - @curators << user unless !(user.roles[0].name == "curator") + @curators << user unless !(user.roles[0].name == "curator") end end end @@ -96,7 +95,7 @@ class Management::UsersController < ManagementController # Use callbacks to share common setup or constraints between actions. def set_user - @user = user_repository.find(params[:id]) + @user = User.find(params[:id]) end # Never trust parameters from the scary internet, only allow the white list through. @@ -105,7 +104,7 @@ class Management::UsersController < ManagementController end def set_roles - @roles = role_repository.all + @roles = Role.all end end diff --git a/app/controllers/search_controller.rb b/app/controllers/search_controller.rb index 98cb38d14bb84b25f7345937b55dc3cb09c3143b..70e9f5b69c8640ea40d04aa5e4e589df12ecd55a 100644 --- a/app/controllers/search_controller.rb +++ b/app/controllers/search_controller.rb @@ -1,52 +1,60 @@ class SearchController < ApplicationController - include SearchEngine::OrientdbLucene - def index @types = learning_object_repository.types - @subjects = Subject.default_list + @subjects = Topic.default_list - @school_levels = ['Educação Infantil', 'Ensino Fundamental', 'Ensino Médio'] + @school_levels = ['Educação Infantil', 'Ensino Fundamental', 'Ensino Médio'].map { |o| Topic.find_by_name(o) } - @source = institution_repository.all + @source = Institution.all end def fetch - objectsFound = [] - - params[:subject]= params[:subject].split(', ') unless params[:subject].nil? - params[:type] = params[:type].split(', ') unless params[:type].nil? - params[:school_level] = params[:school_level].split(', ') unless params[:school_level].nil? - params[:year] = params[:year].split('-').take(2) unless params[:year].nil? - page=1 - if (params[:page]) - page = params[:page].to_i - end + params[:query] = "*" if params[:query].blank? - @pagination_limit=10 + @result = LearningObject.search params[:query], where: where_hash(params), order: order_hash(params), page: params[:page] || 1, per_page: 10 - unless params[:query].blank? - objectsFound = search params - @numFound = objectsFound.length - end + render partial: 'search/fetch' + end + + def autocomplete + render json: LearningObject.search(params[:query], { + fields: ['name^5', 'author'], + limit: 10, + load: false, + misspellings: { below: 5 } + }).map(&:name) + end - @result = Kaminari.paginate_array(objectsFound).page(page).per(@pagination_limit) - @last_page = (@result.num_pages <= page) ? true : false; + private - # build objects from one page only - @objects = GenericBuilder.build(@result) + def where_hash(params) + hash = {} - render partial: 'search/fetch' + topics = params[:subject] unless params[:subject].blank? + topics += ", " unless topics.nil? + topics = topics.to_s + params[:school_level] unless params[:school_level].blank? + + # build hash + hash[:topics_name] = topics.split(', ') unless topics.nil? + hash[:object_type] = params[:type].split(', ') unless params[:type].blank? + # year = params[:year].blank? ? nil : params[:year].split('-').take(2) + + hash.blank? ? nil : hash end - def autocomplete - begin - auto = AutocompleteService.new - query = params['q'] || '' - json_data = auto.query(query) - render text: json_data - rescue - render text: '[]' + def order_hash(params) + case params[:order] + when 'author' + { author: :asc } + when 'publicationasc' + { published_at: :asc } + when 'publicationdesc' + { published_at: :desc } + when 'title' + { name: :asc } + else + { score: :desc } end end diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb index d8ae7a02f5bf663c5c7cb01f639f158241d2e4f5..0d05825874299f4a0adc22779709c322c8ac3035 100644 --- a/app/controllers/users_controller.rb +++ b/app/controllers/users_controller.rb @@ -21,7 +21,7 @@ class UsersController < ApplicationController end def me - @publishers = publishers_for current_user + @publishers = current_user.institutions @objects = current_user.learning_objects @bookmarks = current_user.bookmarks @groups = [ @@ -33,7 +33,7 @@ class UsersController < ApplicationController end def list - @users = user_repository.all + @users = User.all end private diff --git a/app/controllers/welcome_controller.rb b/app/controllers/welcome_controller.rb index ff6597b91f18eccd4015ee14220eee7cdd352350..3b374228aab799a0fd298d23d90e8f780c152742 100644 --- a/app/controllers/welcome_controller.rb +++ b/app/controllers/welcome_controller.rb @@ -1,9 +1,9 @@ class WelcomeController < ApplicationController def index - @carousel = carousel_repository.all || [] + @carousel = Carousel.all || [] - @highlights = learning_object_repository.all_by_score_from_offset_to_limit 0, 6 + @highlights = LearningObject.order(:score).limit(6) end def faq diff --git a/app/helpers/bookmarks_helper.rb b/app/helpers/bookmarks_helper.rb new file mode 100644 index 0000000000000000000000000000000000000000..433821fa2298397dc533180373ea9d942da37f14 --- /dev/null +++ b/app/helpers/bookmarks_helper.rb @@ -0,0 +1,15 @@ +module BookmarksHelper + + ## + # x objetos educacionais + def bookmark_length(user) + count = user.bookmarks.count + + if count > 0 + "#{count} objetos" + else + 'nenhum item' + end + end + +end diff --git a/app/helpers/learning_objects_helper.rb b/app/helpers/learning_objects_helper.rb index f561f4e9964b43f0c92376e692c0a367d4202601..3f052804f0e2f6cb83f9cdd3827b63721ce98b24 100644 --- a/app/helpers/learning_objects_helper.rb +++ b/app/helpers/learning_objects_helper.rb @@ -6,7 +6,7 @@ module LearningObjectsHelper def learning_object_thumbnail(learning_object, size = "") if learning_object.thumbnail.blank? - thumbnail = case learning_object.type + thumbnail = case learning_object.object_type when "VÃdeo" then 'video.png' when "Imagem" then 'image.png' when "Hipertexto" then 'text.png' diff --git a/app/models/bookmark.rb b/app/models/bookmark.rb new file mode 100644 index 0000000000000000000000000000000000000000..e3440ab12cbb8f3339587e9524a88c3418de6461 --- /dev/null +++ b/app/models/bookmark.rb @@ -0,0 +1,6 @@ +class Bookmark < ActiveRecord::Base + belongs_to :user, counter_cache: true + belongs_to :bookmarkable, polymorphic: true + + validates :user_id, uniqueness: { scope: [:bookmarkable_id, :bookmarkable_type] } +end diff --git a/app/models/collection.rb b/app/models/collection.rb index a39ca74c501250bda6cccc9421a479b274034b28..c602de343fc999ded56ed4db1d640b96948573f3 100644 --- a/app/models/collection.rb +++ b/app/models/collection.rb @@ -1,62 +1,24 @@ -class Collection - include ActiveModel::Model - include OrientDbSerializable - include RepositoriesProxy - attr_accessor :id, :created_at, :last_modified, :name, :description, :privacy, - :owner, :learning_objects - validates_presence_of :name, :created_at, :owner, :learning_objects +class Collection < ActiveRecord::Base + include Reviewable + include Sociable + include Followable - def initialize(params = {}) - super(defaults.merge(params)) - end - - ## - # Add +learning_object+ to collection - # - # After adding some learning object to collection, you must use CollectionRepository to persist - # the changes. - # - # Example: - # @test_collection = Collection.new(name: 'test', description: 'test', owner: current_user) - # @test_collection.add @learning_object - # - # @test_collection.learning_objects # [@learning_object] - # collection_repository.save @test_collection - def add(learning_object) - learning_objects.append learning_object - end - - ## - # Remove +learning_object+ from collection - # - # After remove some learning object to collection, you must use CollectionRepository to persist - # the changes. - def remove(learning_object) - learning_objects.delete_if { |x| x.id == learning_object.id } - end + has_many :collection_items, as: :collectionable + has_many :collections, through: :collection_items, source: :collectionable, source_type: 'Collection' + has_many :learning_objects, through: :collection_items, source: :collectionable, source_type: 'LearningObject' + has_many :collection_items - def owner?(user) - collection_repository.owner?(self, user) - end + belongs_to :owner, polymorphic: true - def valid? - !@name.blank? - end + validates :privacy, inclusion: { in: %w(public private), message: "%{value} is not a valid privacy" } - protected + scope :from_user, ->(user) { where(owner: user) } - def excluded_orientdb_properties - ['owner'] + def owner?(candidate) + owner == candidate end - def defaults - { - created_at: DateTime.now.strftime("%Y-%m-%d %H:%M:%S"), - last_modified: DateTime.now.strftime("%Y-%m-%d %H:%M:%S"), - owner: User.new, - learning_objects: [], - privacy: 'private' - } + def private? + privacy == 'private' end - end diff --git a/app/models/collection_item.rb b/app/models/collection_item.rb new file mode 100644 index 0000000000000000000000000000000000000000..5aba4c6d945baf546d28cde15fd3060dbd811353 --- /dev/null +++ b/app/models/collection_item.rb @@ -0,0 +1,7 @@ +class CollectionItem < ActiveRecord::Base + belongs_to :collection + + belongs_to :collectionable, polymorphic: true + + validates_presence_of :collection, :collectionable +end diff --git a/app/models/collections/context.rb b/app/models/collections/context.rb deleted file mode 100644 index b2a971487086393f6f43b4b4924625dd5698b9bd..0000000000000000000000000000000000000000 --- a/app/models/collections/context.rb +++ /dev/null @@ -1,13 +0,0 @@ -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/institutions_context.rb b/app/models/collections/institutions_context.rb deleted file mode 100644 index 1ffa31c4f366984628bb5e06c95081219d88fc70..0000000000000000000000000000000000000000 --- a/app/models/collections/institutions_context.rb +++ /dev/null @@ -1,21 +0,0 @@ -## -# This class represents an specification for listing collections -# The PublicContext class specify all collections with field privacy=public -module Collections - class InstitutionsContext < Context - - def initialize(institutions) - @institutions = institutions - end - - def from - ids = @institutions.map(&:id).join(',') - sprintf "(SELECT FROM (select expand(in('BelongsTo')) from [%s]) WHERE @class = 'Collection')", ids - end - - def privacy - 'public' - end - - end -end \ No newline at end of file diff --git a/app/models/collections/public_context.rb b/app/models/collections/public_context.rb deleted file mode 100644 index ba6b51acab6499e387e277d8b0a245e282baaadd..0000000000000000000000000000000000000000 --- a/app/models/collections/public_context.rb +++ /dev/null @@ -1,16 +0,0 @@ -## -# 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 deleted file mode 100644 index e9610f1625ec967cdc43b5db4b18c772b5dfe976..0000000000000000000000000000000000000000 --- a/app/models/collections/user_context.rb +++ /dev/null @@ -1,20 +0,0 @@ -module Collections - - ## - # This class represents a context for select collections - # where select all collections that *user* can see, including institutional collections - class UserContext < Context - - def initialize(user) - @user = user - end - - def from - institutions = @user.institutions - ids = (institutions.blank?) ? @user.rid : @user.rid + ',' + institutions.map(&:id).join(',') - - sprintf "(SELECT FROM (select expand(in('BelongsTo')) from [%s]) WHERE @class = 'Collection')", ids - end - - end -end diff --git a/app/models/collections/user_private_context.rb b/app/models/collections/user_private_context.rb deleted file mode 100644 index 96e7772c1f964a0140a79d9024f08f0d33d79fb1..0000000000000000000000000000000000000000 --- a/app/models/collections/user_private_context.rb +++ /dev/null @@ -1,12 +0,0 @@ -## -# 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 deleted file mode 100644 index 1c5b02014753887eaa6c68f042102028765a0475..0000000000000000000000000000000000000000 --- a/app/models/collections/user_public_context.rb +++ /dev/null @@ -1,12 +0,0 @@ -## -# 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/complaint.rb b/app/models/complaint.rb index 83ae4172ac55d6be0709eb7aa170ca546952be57..1727c93151b29a49afa3ad2e353f394462f9f0fd 100644 --- a/app/models/complaint.rb +++ b/app/models/complaint.rb @@ -1,44 +1,5 @@ -class Complaint - include ActiveModel::Model - include OrientDbSerializable - - attr_accessor :id, :user, :object, :message, :description, :created_at - validates_presence_of :user, :object, :message, :created_at - - def initialize(params={}) - super(params.merge(defaults)) - end - - def self.copyrights - ComplaintMessage.new("Objeto viola direitos autorais") - end - - def self.ofensive_content - ComplaintMessage.new "Objeto contém conteúdo ofensivo/abusivo" - end - - def self.ofensive_user - ComplaintMessage.new "Usuário ofensivo/agressivo" - end - - def self.fake_user - ComplaintMessage.new "Usuário falso" - end - - def to_orientdb_hash - super.merge("message" => @message.to_s) - end - - private - - def excluded_orientdb_properties - ['user', 'object', '@class'] - end - - def defaults - { - created_at: DateTime.now.strftime("%Y-%m-%d %H:%M:%S") - } - end - +class Complaint < ActiveRecord::Base + belongs_to :user + belongs_to :learning_object + belongs_to :complaint_reason end diff --git a/app/models/complaint_reason.rb b/app/models/complaint_reason.rb new file mode 100644 index 0000000000000000000000000000000000000000..f81ffb9976210e191414fe16d854e16de4a026a7 --- /dev/null +++ b/app/models/complaint_reason.rb @@ -0,0 +1,3 @@ +class ComplaintReason < ActiveRecord::Base + has_many :complaints +end diff --git a/app/models/concerns/followable.rb b/app/models/concerns/followable.rb new file mode 100644 index 0000000000000000000000000000000000000000..743d8712f5933daa5a80e0211e41b71e3366d733 --- /dev/null +++ b/app/models/concerns/followable.rb @@ -0,0 +1,20 @@ +module Followable + extend ActiveSupport::Concern + + included do + has_many :follows, as: :followable + end + + def follow(user) + Follow.create(user: user, followable: self) + end + + def unfollow(user) + Follow.where(user: user, followable: self).destroy_all + end + + def following?(user) + !follows.where(user: user).blank? + end + +end \ No newline at end of file diff --git a/app/models/concerns/metadatable.rb b/app/models/concerns/metadatable.rb index 57171e4e142451764c9fb1103f165cb690ee899f..a06b88994e4730e442dafdb0f5330f1f0a60e9dc 100644 --- a/app/models/concerns/metadatable.rb +++ b/app/models/concerns/metadatable.rb @@ -9,8 +9,9 @@ module Metadatable def get_metadata_values_of key values = [] - if @metadata.is_a? Array - @metadata.each do |m| + metadata = JSON.parse(metadata) if metadata.class == String + unless metadata.blank? + metadata.each do |m| m = m.with_indifferent_access values << m["value"] if m["key"] == key end @@ -18,4 +19,4 @@ module Metadatable values end -end \ No newline at end of file +end diff --git a/app/models/concerns/reviewable.rb b/app/models/concerns/reviewable.rb new file mode 100644 index 0000000000000000000000000000000000000000..e42b0a8715cbc1e56bd2992932017df4984bb6fb --- /dev/null +++ b/app/models/concerns/reviewable.rb @@ -0,0 +1,8 @@ +module Reviewable + extend ActiveSupport::Concern + + included do + has_many :reviews, as: :reviewable + end + +end \ No newline at end of file diff --git a/app/models/concerns/sociable.rb b/app/models/concerns/sociable.rb new file mode 100644 index 0000000000000000000000000000000000000000..21ce5ed2a0b626e175aac1f7cef3bfec4df91a21 --- /dev/null +++ b/app/models/concerns/sociable.rb @@ -0,0 +1,23 @@ +module Sociable + extend ActiveSupport::Concern + + included do + has_many :views, as: :viewable + has_many :downloads, as: :downloadable + has_many :likes, as: :likeable + has_many :shares, as: :shareable + end + + def liked?(user) + !likes.where(user: user).blank? + end + + def like(user) + Like.create(user: user, likeable: self) + end + + def dislike(user) + Like.where(user: user, likeable: self).destroy_all + end + +end \ No newline at end of file diff --git a/app/models/concerns/stateful.rb b/app/models/concerns/stateful.rb new file mode 100644 index 0000000000000000000000000000000000000000..b0e24aa10de8d929e3b2b5804672d299d2272367 --- /dev/null +++ b/app/models/concerns/stateful.rb @@ -0,0 +1,20 @@ +module Stateful + extend ActiveSupport::Concern + + included do + validates_presence_of :state + end + + def is_published? + 'published' == @state + end + + def is_draft? + 'draft' == @state + end + + def publish + @state = 'published' + end + +end \ No newline at end of file diff --git a/app/models/download.rb b/app/models/download.rb new file mode 100644 index 0000000000000000000000000000000000000000..23f240594ba80c4c0cd7ac9feec02683a2b02f84 --- /dev/null +++ b/app/models/download.rb @@ -0,0 +1,4 @@ +class Download < ActiveRecord::Base + belongs_to :downloadable, polymorphic: true, counter_cache: true + belongs_to :user +end diff --git a/app/models/duplicated_user_index_error.rb b/app/models/duplicated_user_index_error.rb deleted file mode 100644 index 1356e37c37b4b85f197f64f42071e9fc702438d0..0000000000000000000000000000000000000000 --- a/app/models/duplicated_user_index_error.rb +++ /dev/null @@ -1,2 +0,0 @@ -class DuplicatedUserIndexError < Orientdb4r::ServerError -end \ No newline at end of file diff --git a/app/models/feedback.rb b/app/models/feedback.rb deleted file mode 100644 index a43add1966c039ed14e2163d840965dca0eb42c0..0000000000000000000000000000000000000000 --- a/app/models/feedback.rb +++ /dev/null @@ -1,5 +0,0 @@ -##Feedback is an user review of the system -class Feedback < ActiveRecord::Base - belongs_to :user - has_and_belongs_to_many :feedback_ratings -end diff --git a/app/models/feedback_rating.rb b/app/models/feedback_rating.rb deleted file mode 100644 index a15178b4cc66a8cf83af98bdfe342cd93a55d697..0000000000000000000000000000000000000000 --- a/app/models/feedback_rating.rb +++ /dev/null @@ -1,3 +0,0 @@ -class FeedbackRating < ActiveRecord::Base - has_and_belongs_to_many :feedbacks -end diff --git a/app/models/follow.rb b/app/models/follow.rb new file mode 100644 index 0000000000000000000000000000000000000000..c2384eec7188ec3cf9131488fa74045e2dae4a60 --- /dev/null +++ b/app/models/follow.rb @@ -0,0 +1,6 @@ +class Follow < ActiveRecord::Base + belongs_to :followable, polymorphic: true, counter_cache: true + belongs_to :user + + validates :user_id, uniqueness: { scope: [:followable_id, :followable_type] } +end diff --git a/app/models/institution.rb b/app/models/institution.rb index 6980161060195312aad709c441162a223c2f5038..16ad8b8a3c846c316093348f51a73ca4ceb6e527 100644 --- a/app/models/institution.rb +++ b/app/models/institution.rb @@ -1,4 +1,5 @@ -class Institution - include ActiveModel::Model - attr_accessor :id, :name, :created_at, :last_modified, :country, :city, :description, :thumbnail, :address -end \ No newline at end of file +class Institution < ActiveRecord::Base + has_and_belongs_to_many :users + + has_many :learning_objects, as: :publisher +end diff --git a/app/models/learning_object.rb b/app/models/learning_object.rb index 18163e425f4cdd044ac3e8f90d4f4961b2c6f63b..559758044fac2f0cec5a0df882034820010fb2ab 100644 --- a/app/models/learning_object.rb +++ b/app/models/learning_object.rb @@ -1,97 +1,49 @@ -class LearningObject - include ActiveModel::Model - include RepositoriesProxy - include OrientDbSerializable +class LearningObject < ActiveRecord::Base include Metadatable + include Reviewable + include Sociable + include Stateful - EXTERNAL_LINK_TYPE = 'Link Externo' + has_and_belongs_to_many :topics - attr_accessor :id, :id_dspace, :rid, :name, :author, :description, - :published_at, :thumbnail, :created_at, :last_modified, - :type, :metadata, :score, :school_level, :language, - :source, :license, :keywords, :attachments + has_many :collection_items, as: :collectionable + has_many :collections, through: :collection_items - #not implemented yet - attr_accessor :grade_level + has_many :complaints + has_many :attachments, class_name: 'LearningObject::Attachment', dependent: :destroy - # associations - attr_accessor :likes, :views, :downloads, :subjects, :attributes, :publisher + belongs_to :publisher, polymorphic: true - # flags - attr_accessor :status + searchkick language: 'brazilian', searchable: [:name, :description, :author, :object_type] - validates_presence_of :name, :created_at, :type - - def initialize(params={}) - super(params.merge(defaults) { |key, oldval, newval| oldval.blank? ? newval : oldval }) - end - - def retrievelink - "#{DspaceService.link}/rest#{default_attachment.retrieve_link}" - end - - def default_attachment - return attachments.find { |a| a.bundle_name == 'ORIGINAL' } unless attachments.blank? - return attachments.first || LearningObject::Attachment.new - end - - def collections - collection_repository.find_by_learning_object self + def search_data + { + name: name, + description: description, + author: author, + object_type: object_type, + score: score, + published_at: published_at, + # publisher_id: publisher.id, + topics_name: topics.map(&:name) + } end def categories 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 - - def download(user) - learning_object_repository.download user, self - end - ## end social actions - - def likes - learning_object_repository.count('Likes', self) - end - - def views - learning_object_repository.count('Views', self) - end - - def to_orientdb_hash - bitstreams = attachments.map { |attachment| attachment.to_orientdb_hash } - super.merge({'bitstreams' => bitstreams}) + def default_attachment + attachments.where(bundle_name: 'ORIGINAL').first end - def excluded_orientdb_properties - ['likes', 'views', 'downloads', 'subjects', 'attributes', 'publisher', 'attachments', 'language'] + def url_reference + get_metadata_value_of 'dc.object.url' end - private - - def defaults - { - downloads: 0, - score: 0, - status: 'active', - attachments: [], - attributes: [], - subjects: [], - metadata: [], - created_at: DateTime.now.strftime("%Y-%m-%d %H:%M:%S"), - last_modified: DateTime.now.strftime("%Y-%m-%d %H:%M:%S") - } + ##checks if learning object link to an url. + #returns boolean + def has_url_reference? + !url_reference.blank? end - end diff --git a/app/models/learning_object/attachment.rb b/app/models/learning_object/attachment.rb index 60f65a5300facc96bcdc9023369f303e6f9a499a..7b93f32b805630d528aba18fee9f16308b8f5393 100644 --- a/app/models/learning_object/attachment.rb +++ b/app/models/learning_object/attachment.rb @@ -1,29 +1,3 @@ -class LearningObject::Attachment - include ActiveModel::Model - include OrientDbSerializable - - #this attributes mirror Dspace bitstream values - attr_accessor :id, :name, :link, :retrieve_link, :description, :format, :mime_type, :size, :bundle_name, :uptodate, :sync_feature - - def to_orientdb_hash - super.merge('retrieveLink' => @retrieve_link, 'mimeType' => @mime_type, 'sizeBytes' => @size, 'bundleName' => @bundle_name) - end - - def excluded_orientdb_properties - super + ['retrieve_link', 'mime_type', 'bundle_name', 'size', '@class'] - end - - def initialize(params={}) - @sync_feature = false - super(params) - end - - #set attachment up to date with dspace - def uptodate! - @uptodate, @sync_feature = true - end - - def uptodate? - @uptodate && @sync_feature - end +class LearningObject::Attachment < ActiveRecord::Base + belongs_to :learning_object end diff --git a/app/models/learning_object/draft.rb b/app/models/learning_object/draft.rb index cee1b97ec8094b59979f51003be172b16387ca91..36c59c60019d40172a1b44314d67ac5f7f035b1b 100644 --- a/app/models/learning_object/draft.rb +++ b/app/models/learning_object/draft.rb @@ -1,17 +1,9 @@ class LearningObject::Draft < LearningObject - def valid? - true - end - - def to_orientdb_hash - super.merge('@class' => 'LearningObject') - end - - private - - def defaults - super.merge(status: 'draft') + ##overwrites initialize method to force @state value as draft + def initialize(attributes = nil, options = {}) + super(attributes, options) + @state = 'draft' end end \ No newline at end of file diff --git a/app/models/learning_object/type.rb b/app/models/learning_object/type.rb new file mode 100644 index 0000000000000000000000000000000000000000..5c7496f1c8a180fab03a32f80cd6813f361c95f8 --- /dev/null +++ b/app/models/learning_object/type.rb @@ -0,0 +1,5 @@ +class LearningObject::Type + URL_REFERENCE = 'url_reference' + VIDEO = 'video' + IMAGE = 'imagem' +end diff --git a/app/models/like.rb b/app/models/like.rb new file mode 100644 index 0000000000000000000000000000000000000000..3b7e6fcbd203b42b74c950cad41ade236fdc11c6 --- /dev/null +++ b/app/models/like.rb @@ -0,0 +1,6 @@ +class Like < ActiveRecord::Base + belongs_to :likeable, polymorphic: true, counter_cache: true + belongs_to :user + + validates :user_id, uniqueness: { scope: [:likeable_id, :likeable_type] } +end diff --git a/app/models/attribute.rb b/app/models/orientdb/attribute.rb similarity index 76% rename from app/models/attribute.rb rename to app/models/orientdb/attribute.rb index 403de827e79c89db129ffb655cd0e36587ad9c0b..31a726ed47221d347c5af27e5e2c5afd7b1a6731 100644 --- a/app/models/attribute.rb +++ b/app/models/orientdb/attribute.rb @@ -1,6 +1,6 @@ -class Attribute +class Orientdb::Attribute include ActiveModel::Model include OrientDbSerializable attr_accessor :id, :key, :value -end \ No newline at end of file +end diff --git a/app/models/bookmarks.rb b/app/models/orientdb/bookmarks.rb similarity index 90% rename from app/models/bookmarks.rb rename to app/models/orientdb/bookmarks.rb index 336d216106b993748f43d308095bd5e30e949e21..fae461b14c33b79d67d251b49275aa52992187f8 100644 --- a/app/models/bookmarks.rb +++ b/app/models/orientdb/bookmarks.rb @@ -1,7 +1,8 @@ -class Bookmarks < Collection +class Orientdb::Bookmarks < Collection include ActiveModel::Model include OrientDbSerializable include RepositoriesProxy + attr_accessor :id, :owner, :learning_objects, :last_modified validates_presence_of :id, :owner diff --git a/app/models/orientdb/collection.rb b/app/models/orientdb/collection.rb new file mode 100644 index 0000000000000000000000000000000000000000..65c8546e472d1dad9683eb4757d2e868ef56f90c --- /dev/null +++ b/app/models/orientdb/collection.rb @@ -0,0 +1,62 @@ +class Orientdb::Collection + include ActiveModel::Model + include OrientDbSerializable + include RepositoriesProxy + attr_accessor :id, :created_at, :last_modified, :name, :description, :privacy, + :owner, :learning_objects + validates_presence_of :name, :created_at, :owner, :learning_objects + + def initialize(params = {}) + super(defaults.merge(params)) + end + + ## + # Add +learning_object+ to collection + # + # After adding some learning object to collection, you must use CollectionRepository to persist + # the changes. + # + # Example: + # @test_collection = Collection.new(name: 'test', description: 'test', owner: current_user) + # @test_collection.add @learning_object + # + # @test_collection.learning_objects # [@learning_object] + # collection_repository.save @test_collection + def add(learning_object) + learning_objects.append learning_object + end + + ## + # Remove +learning_object+ from collection + # + # After remove some learning object to collection, you must use CollectionRepository to persist + # the changes. + def remove(learning_object) + learning_objects.delete_if { |x| x.id == learning_object.id } + end + + def owner?(user) + collection_repository.owner?(self, user) + end + + def valid? + !@name.blank? + end + + protected + + def excluded_orientdb_properties + ['owner'] + end + + def defaults + { + created_at: DateTime.now.strftime("%Y-%m-%d %H:%M:%S"), + last_modified: DateTime.now.strftime("%Y-%m-%d %H:%M:%S"), + owner: User.new, + learning_objects: [], + privacy: 'private' + } + end + +end diff --git a/app/models/orientdb/complaint.rb b/app/models/orientdb/complaint.rb new file mode 100644 index 0000000000000000000000000000000000000000..5bd5ad106071d6f03c12b7418da4f64fd4415a4e --- /dev/null +++ b/app/models/orientdb/complaint.rb @@ -0,0 +1,44 @@ +class Orientdb::Complaint + include ActiveModel::Model + include OrientDbSerializable + + attr_accessor :id, :user, :object, :message, :description, :created_at + validates_presence_of :user, :object, :message, :created_at + + def initialize(params={}) + super(params.merge(defaults)) + end + + def self.copyrights + ComplaintMessage.new("Objeto viola direitos autorais") + end + + def self.ofensive_content + ComplaintMessage.new "Objeto contém conteúdo ofensivo/abusivo" + end + + def self.ofensive_user + ComplaintMessage.new "Usuário ofensivo/agressivo" + end + + def self.fake_user + ComplaintMessage.new "Usuário falso" + end + + def to_orientdb_hash + super.merge("message" => @message.to_s) + end + + private + + def excluded_orientdb_properties + ['user', 'object', '@class'] + end + + def defaults + { + created_at: DateTime.now.strftime("%Y-%m-%d %H:%M:%S") + } + end + +end diff --git a/app/models/complaint_message.rb b/app/models/orientdb/complaint_message.rb similarity index 78% rename from app/models/complaint_message.rb rename to app/models/orientdb/complaint_message.rb index a87abecbfeac95fbc8431adc9c7ad80fc40dc3f3..492b58c5e3330b7eaa205d8866598afcfd7db978 100644 --- a/app/models/complaint_message.rb +++ b/app/models/orientdb/complaint_message.rb @@ -1,4 +1,4 @@ -class ComplaintMessage +class Orientdb::ComplaintMessage attr_accessor :message def initialize(message) diff --git a/app/models/orientdb/institution.rb b/app/models/orientdb/institution.rb new file mode 100644 index 0000000000000000000000000000000000000000..085632c9b1ae55a03be1974e9946713c3373814f --- /dev/null +++ b/app/models/orientdb/institution.rb @@ -0,0 +1,4 @@ +class Orientdb::Institution + include ActiveModel::Model + attr_accessor :id, :name, :created_at, :last_modified, :country, :city, :description, :thumbnail, :address +end \ No newline at end of file diff --git a/app/models/orientdb/learning_object.rb b/app/models/orientdb/learning_object.rb new file mode 100644 index 0000000000000000000000000000000000000000..f651dc134d8ab9a105ba77f31f43f6d698d7ef57 --- /dev/null +++ b/app/models/orientdb/learning_object.rb @@ -0,0 +1,100 @@ +class Orientdb::LearningObject + include ActiveModel::Model + include RepositoriesProxy + include OrientDbSerializable + include Metadatable + + attr_accessor :id, :id_dspace, :rid, :name, :author, :description, + :published_at, :thumbnail, :created_at, :last_modified, + :type, :metadata, :score, :school_level, :language, + :source, :license, :keywords, :attachments + + #not implemented yet + attr_accessor :grade_level + + # associations + attr_accessor :likes, :views, :downloads, :subjects, :attributes, :publisher + + # flags + attr_accessor :status + + validates_presence_of :name, :created_at, :type + + def initialize(params={}) + super(params.merge(defaults) { |key, oldval, newval| oldval.blank? ? newval : oldval }) + end + + def retrievelink + "#{DspaceService.link}/rest#{default_attachment.retrieve_link}" + end + + def default_attachment + return attachments.find { |a| a.bundle_name == 'ORIGINAL' } unless attachments.blank? + ::LearningObject::Attachment.new + end + + def collections + collection_repository.find_by_learning_object self + end + + def categories + 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 + + def download(user) + learning_object_repository.download user, self + end + ## end social actions + + ## metadata methods + def get_metadata_value_of key + get_metadata_values_of(key).first + end + + def likes + learning_object_repository.count('Likes', self) + end + + def views + learning_object_repository.count('Views', self) + end + + def to_orientdb_hash + bitstreams = attachments.map { |attachment| attachment.to_orientdb_hash } + super.merge({'bitstreams' => bitstreams}) + end + + def excluded_orientdb_properties + ['likes', 'views', 'downloads', 'subjects', 'attributes', 'publisher', 'attachments'] + end + + private + + def defaults + { + downloads: 0, + score: 0, + status: 'active', + attachments: [], + attributes: [], + subjects: [], + metadata: [], + created_at: DateTime.now.strftime("%Y-%m-%d %H:%M:%S"), + last_modified: DateTime.now.strftime("%Y-%m-%d %H:%M:%S") + } + end + +end diff --git a/app/models/orientdb/learning_object/attachment.rb b/app/models/orientdb/learning_object/attachment.rb new file mode 100644 index 0000000000000000000000000000000000000000..ae67a909a06459e620abf643bdb3468c8b19596c --- /dev/null +++ b/app/models/orientdb/learning_object/attachment.rb @@ -0,0 +1,6 @@ +class Orientdb::LearningObject::Attachment + include ActiveModel::Model + + #this attributes mirror Dspace bitstream values + attr_accessor :id, :name, :link, :retrieve_link, :description, :format, :mime_type, :size, :bundle_name +end diff --git a/app/models/orientdb/learning_object/draft.rb b/app/models/orientdb/learning_object/draft.rb new file mode 100644 index 0000000000000000000000000000000000000000..b2413a5fa23328cf804e432e3146b0ac3be63dfa --- /dev/null +++ b/app/models/orientdb/learning_object/draft.rb @@ -0,0 +1,17 @@ +class Orientdb::LearningObject::Draft < LearningObject + + def valid? + true + end + + def to_orientdb_hash + super.merge('@class' => 'LearningObject') + end + + private + + def defaults + super.merge(status: 'draft') + end + +end \ No newline at end of file diff --git a/app/models/subject.rb b/app/models/orientdb/subject.rb similarity index 97% rename from app/models/subject.rb rename to app/models/orientdb/subject.rb index 89aebfefcab464124fe5f2e3eb60f396e274c3f8..c97802a4dde2096ad24e1a3daa9e95110ae0fee1 100644 --- a/app/models/subject.rb +++ b/app/models/orientdb/subject.rb @@ -1,4 +1,4 @@ -class Subject +class Orientdb::Subject include ActiveModel::Model include RepositoriesProxy diff --git a/app/models/rating.rb b/app/models/rating.rb new file mode 100644 index 0000000000000000000000000000000000000000..a8a63a00385218a107c257a88a15f3509be78bbb --- /dev/null +++ b/app/models/rating.rb @@ -0,0 +1,4 @@ +class Rating < ActiveRecord::Base + has_many :review_ratings + has_many :reviews, through: :review_ratings +end diff --git a/app/models/review.rb b/app/models/review.rb new file mode 100644 index 0000000000000000000000000000000000000000..36bb8b6143f9cdd8db2b180afd4ad35eabbf7e19 --- /dev/null +++ b/app/models/review.rb @@ -0,0 +1,8 @@ +class Review < ActiveRecord::Base + belongs_to :reviewable, polymorphic: true + + belongs_to :user + + has_many :review_ratings + has_many :ratings, through: :review_ratings +end diff --git a/app/models/review_rating.rb b/app/models/review_rating.rb new file mode 100644 index 0000000000000000000000000000000000000000..d14a06f2bda17add57a68ebe1aaf6a018f216dcc --- /dev/null +++ b/app/models/review_rating.rb @@ -0,0 +1,4 @@ +class ReviewRating < ActiveRecord::Base + belongs_to :review + belongs_to :rating +end diff --git a/app/models/share.rb b/app/models/share.rb new file mode 100644 index 0000000000000000000000000000000000000000..0956dc88923714211aa33176a0788c8cdaa76118 --- /dev/null +++ b/app/models/share.rb @@ -0,0 +1,4 @@ +class Share < ActiveRecord::Base + belongs_to :shareable, polymorphic: true, counter_cache: true + belongs_to :user +end diff --git a/app/models/topic.rb b/app/models/topic.rb new file mode 100644 index 0000000000000000000000000000000000000000..330ded6c55b6e5ec71304afa8030fe6ff9c228a0 --- /dev/null +++ b/app/models/topic.rb @@ -0,0 +1,16 @@ +class Topic < ActiveRecord::Base + has_and_belongs_to_many :learning_objects + + has_many :topic_relationships, foreign_key: "parent_id" + has_many :subtopics, through: :topic_relationships, source: :child + + has_many :topic_highlights + has_many :highlights, through: :topic_highlights, source: :learning_object + + def self.default_list + ['Artes', 'Biologia', 'Ciências', 'Educação FÃsica', 'Filosofia', + 'FÃsica', 'Geografia', 'História', 'Matemática', 'LÃngua Portuguesa', 'QuÃmica', 'Sociologia'].map do |topic| + Topic.find_by_name(topic) + end + end +end diff --git a/app/models/topic_highlight.rb b/app/models/topic_highlight.rb new file mode 100644 index 0000000000000000000000000000000000000000..3c626c3f3cda19f86389527cdcdb1c44c42ff7e3 --- /dev/null +++ b/app/models/topic_highlight.rb @@ -0,0 +1,4 @@ +class TopicHighlight < ActiveRecord::Base + belongs_to :topic + belongs_to :learning_object +end diff --git a/app/models/topic_relationship.rb b/app/models/topic_relationship.rb new file mode 100644 index 0000000000000000000000000000000000000000..5dd3f84bb5ab5e127c95f4725304d88af5059f71 --- /dev/null +++ b/app/models/topic_relationship.rb @@ -0,0 +1,6 @@ +class TopicRelationship < ActiveRecord::Base + belongs_to :parent, class_name: 'Topic' + belongs_to :child, class_name: 'Topic' + + validates_presence_of :parent, :child +end diff --git a/app/models/user.rb b/app/models/user.rb index 58cc3281e2e9fd7b7fbebd16124b2e66bfcbcdbd..571f0048651b9a17914198a8f6a36598f3db24bf 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -1,56 +1,34 @@ -# For now, the User model is being persisted in two repositories: -# * On postgres, using ActiveRecord -# * OrientDb as graph nodes -# -# Goals: Keep the users in both (postgres, orientdb) -# -# Devise Controllers -----> User model (with active record api) -# / -# Client -/ -# \ -# \ -# Portal Mec Controllers -> User repository -# -# How works? -# For keep simple, user node in orientdb stored only a reference to the real user in postgres. -# So, the user node will be only created or destroyed. -# -# When devise create user, the active record hooks will sync with user repository -# And, when the application call the user repository, it will keep sync with active record user model class User < ActiveRecord::Base include RepositoriesProxy + include Followable # Include default devise modules. Others available are: # :confirmable, :lockable, :timeoutable and :omniauthable devise :database_authenticatable, :registerable, :recoverable, :rememberable, :trackable, :validatable - has_and_belongs_to_many :roles - after_create SyncUserRepositoryService.new - after_create :default_role + has_and_belongs_to_many :roles + has_and_belongs_to_many :institutions - after_destroy SyncUserRepositoryService.new + has_many :bookmarks, as: :bookmarkable + has_many :bookmark_collections, through: :bookmarks, source: :bookmarkable, source_type: 'Collection' + has_many :bookmark_learning_objects, through: :bookmarks, source: :bookmarkable, source_type: 'LearningObject' + has_many :bookmarks - has_attached_file :avatar, styles: {medium: "300x300>", thumb: "60x60>"}, default_url: lambda { |image| ActionController::Base.helpers.asset_path('user-anon.png') } - validates_attachment_content_type :avatar, content_type: /\Aimage\/.*\Z/ + has_many :collections, as: :owner - def collections - public_collections = collection_repository.all(Collections::UserPublicContext.new(self)) - private_collections = collection_repository.all(Collections::UserPrivateContext.new(self)) - @collections = public_collections + private_collections - end + has_many :learning_objects, as: :publisher - def institutions - institution_repository.associated_with self - end + has_many :views + has_many :downloads + has_many :likes + has_many :shares + has_many :follows - def bookmarks - collection_repository.bookmarks self - end + after_create :default_role - def learning_objects - learning_object_repository.all self - end + has_attached_file :avatar, styles: {medium: "300x300>", thumb: "60x60>"}, default_url: lambda { |image| ActionController::Base.helpers.asset_path('user-anon.png') } + validates_attachment_content_type :avatar, content_type: /\Aimage\/.*\Z/ def is_admin? roles.each do |role| @@ -62,7 +40,7 @@ class User < ActiveRecord::Base private def default_role - roles << role_repository.find_by_name("teacher") + # roles << role_repository.find_by_name("teacher") end end diff --git a/app/models/validators/collection_owner_validator.rb b/app/models/validators/collection_owner_validator.rb deleted file mode 100644 index a0412d1ce29e772b9c77a2c3406b877a5e21897e..0000000000000000000000000000000000000000 --- a/app/models/validators/collection_owner_validator.rb +++ /dev/null @@ -1,9 +0,0 @@ -class Validators::CollectionOwnerValidator < ActiveModel::Validator - - def validate(record) - unless record.owner.is_a?(User) || record.owner.is_a?(Institution) - record.errors.add :base, 'The owner must be an User or an Institution' - end - end - -end diff --git a/app/models/view.rb b/app/models/view.rb new file mode 100644 index 0000000000000000000000000000000000000000..33078c9c91d76e67de379b133ef11ed22964da5e --- /dev/null +++ b/app/models/view.rb @@ -0,0 +1,20 @@ +class View < ActiveRecord::Base + belongs_to :viewable, polymorphic: true, counter_cache: true + belongs_to :user + + scope :created_last, ->(user) { where(user: user).order('created_at DESC').limit(1).first } + + before_create :current_time_greater_than_last + + private + + def current_time_greater_than_last + last_view = viewable.views.created_last(user) + + unless last_view.blank? + return false if Time.now < (last_view.created_at + 1.days) + end + + true + end +end diff --git a/app/services/dspace/attachment_mapper.rb b/app/services/dspace/attachment_mapper.rb new file mode 100644 index 0000000000000000000000000000000000000000..40087ca9edccf146dba48d5d65e6a1abda4d6eb8 --- /dev/null +++ b/app/services/dspace/attachment_mapper.rb @@ -0,0 +1,11 @@ +class Dspace::AttachmentMapper + + ##Map Dspace::Bitstream to Attachment model compatible hash + def self.call(bitstream, options = {}) + {id_dspace: bitstream.id, name: bitstream.name, link: bitstream.link, + retrieve_link: bitstream.retrieve_link, description: bitstream.description, + format: bitstream.format, mime_type: bitstream.mime_type, size: bitstream.size_bytes, + bundle_name: bitstream.bundle_name}.merge(options) + end + +end \ No newline at end of file diff --git a/app/services/dspace/learning_object_importer.rb b/app/services/dspace/learning_object_importer.rb new file mode 100644 index 0000000000000000000000000000000000000000..0413ee7687d29f6f988366514fc46c6901194004 --- /dev/null +++ b/app/services/dspace/learning_object_importer.rb @@ -0,0 +1,30 @@ +class Dspace::LearningObjectImporter + + def initialize(items) + @items = items + end + + def import + @items.each do |item| + if !item_exists? item + learning_object = LearningObjectBuilder.build_from_dspace item + create_attachments learning_object, item.bit_streams if learning_object.save + yield(learning_object) if block_given? + end + end + end + + private + + def create_attachments(learning_object, bitstreams) + bitstreams = JSON.parse bitstreams if bitstreams.class == String + bitstreams.each do |bitstream| + learning_object.attachments.create ::Dspace::AttachmentMapper.call(bitstream) + end + end + + def item_exists? item + LearningObject.exists? id_dspace: item.id + end + +end \ No newline at end of file diff --git a/app/services/learning_object_publisher.rb b/app/services/learning_object_publisher.rb index 55d4fd456a897050ab5d13992221f9c9a227442c..06b1ad7be6294c62c51c830703cf96c9e546bd75 100644 --- a/app/services/learning_object_publisher.rb +++ b/app/services/learning_object_publisher.rb @@ -1,7 +1,6 @@ require 'dspace' class LearningObjectPublisher - include RepositoriesProxy def initialize(dspace_client) @dspace = dspace_client @@ -12,8 +11,8 @@ class LearningObjectPublisher def create_draft(draft) item = @dspace.collections.create_item(build_dspace_item(draft), id: DspaceService::TEST_COLLECTION) draft.id_dspace = item.id - draft = learning_object_repository.create draft - publish! draft if draft.type == LearningObject::EXTERNAL_LINK_TYPE + draft.save! + publish! draft if draft.has_url_reference? draft end @@ -22,27 +21,19 @@ class LearningObjectPublisher DspaceUploadWorker.perform_async learning_object.id, learning_object.id_dspace, media_path end + ##publish *learning_object* + #this method will create thumbnails, change state to published and will save it. def publish!(learning_object) - activate! learning_object - update_attachments! learning_object - create_thumbnail! learning_object - end - - private + if learning_object.is_draft? + create_thumbnail! learning_object + learning_object.publish + end - # change *learning_object* status to active - def activate!(learning_object) - learning_object.status = 'active' - learning_object_repository.update_property(learning_object, 'status', learning_object.status) + learning_object.save end - def update_attachments!(learning_object) - bitstreams_list = learning_object.attachments.each do |attachment| - if !attachment.uptodate? - attachment.uptodate! - learning_object_repository.add_attachment learning_object, attachment - end - end + def create_thumbnail!(learning_object) + #call thumbnail worker end def create_thumbnail!(learning_object) @@ -55,4 +46,4 @@ class LearningObjectPublisher }) end -end \ No newline at end of file +end diff --git a/app/services/sync_user_repository_service.rb b/app/services/sync_user_repository_service.rb deleted file mode 100644 index 65f9008243b80b2c17a5f709fcf3caef5c1b38a5..0000000000000000000000000000000000000000 --- a/app/services/sync_user_repository_service.rb +++ /dev/null @@ -1,12 +0,0 @@ -class SyncUserRepositoryService - include RepositoriesProxy - - def after_create(user) - user_repository.create_graph_node user - end - - def after_destroy(user) - user_repository.destroy_graph_node user - end - -end diff --git a/app/views/bookmarks/_bookmark.html.erb b/app/views/bookmarks/_bookmark.html.erb new file mode 100644 index 0000000000000000000000000000000000000000..aab483bbcef093a28e71c1652f20dc69b8861b82 --- /dev/null +++ b/app/views/bookmarks/_bookmark.html.erb @@ -0,0 +1,11 @@ +<%= link_to bookmark_path do %> + <div class="col-sm-4"> + <div> + <%= image_tag 'icons/star-grey.png', style: 'max-height: 100px;' %> + </div> + <div class="panel-body"> + <h4 class="media-heading">Favoritos</h4> + <span><a><%= bookmark_length current_user %></a></span> + </div> + </div> +<% end %> diff --git a/app/views/bookmarks/_bookmarks.html.erb b/app/views/bookmarks/_bookmarks.html.erb deleted file mode 100644 index 3478a96108a5f3d4d2697f577d5cb27176767fed..0000000000000000000000000000000000000000 --- a/app/views/bookmarks/_bookmarks.html.erb +++ /dev/null @@ -1 +0,0 @@ -<%= render 'collections/bookmarks', collection: bookmarks %> \ No newline at end of file diff --git a/app/views/bookmarks/show.html.erb b/app/views/bookmarks/show.html.erb new file mode 100644 index 0000000000000000000000000000000000000000..764dc5519603bfb2874dcebef68a9db16a7093ab --- /dev/null +++ b/app/views/bookmarks/show.html.erb @@ -0,0 +1,50 @@ +<nav class="navigation navbar-default collection-show-page" data-cid="<%= @user.id %>"> + <br/> + <div class="container-fluid"> + <div class="navbar-header"> + <%= image_tag image_path("icons/star-grey.png"), class: "logo-image", style: 'max-height: 80px;' %> + <ul class="nav navbar-nav navbar-right collection-header" style="margin-left: 30px;"> + <li><h2>Favoritos</h2></li> + <li> + <a class="count-collections-objects" data-toggle="tooltip" data-placement="bottom" title="Selecionar todos"> + <%= image_tag image_path("icons/square.png"), class: "logo-image", size: "20x20" %> + <%= bookmark_length @user %> + </a> + </li> + </ul> + </div> + </div> + <br/> +</nav> +<nav class="navigation navbar-inverse collection-show-select-nav" style="display:none;"> + <div class="container-fluid"> + <a class="navbar-brand" href="javascript:void(0);" data-toggle="tooltip" data-placement="bottom" title="Limpar seleção"></a> + <ul class="nav navbar-nav navbar-right"> + <li class="set-align collection-button" data-action="download"> + <a href="javascript:void(0);"><span class="left-edge1"><%= image_tag image_path("icons/Download_01.png"), class: "logo-image", size: "35x35" %></span><span style="color: white"> + Salvar no <br>computador</span></a> + </li> + <li class="set-align collection-button" data-action="copy"> + <a href="javascript:void(0);"><span class="left-edge1"><%= image_tag image_path("icons/Copiar_Seleção.png"), class: "logo-image", size: "35x35" %></span><span style="color: white"> + Copiar <br>para</span></a> + </li> + <li class="set-align collection-button" data-action="move"> + <a href="javascript:void(0);"><span class="left-edge1"><%= image_tag image_path("icons/Mover_Seleção.png"), class: "logo-image", size: "35x35" %></span><span style="color: white"> + Mover <br>para</span></a> + </li> + <li class="set-align collection-button" data-action="remove"> + <a href="javascript:void(0);"><span class="left-edge1"><%= image_tag image_path("icons/Remover_da_Coleção_Seleção.png"), class: "logo-image", size: "35x35" %></span><span style="color: white"> + Remover da <br>coleção</span></a> + </li> + </ul> + </div> +</nav> + +<div class= "row"> + <div class="learning-object-columns"> + <br/> + <% @user.bookmark_learning_objects.each do |object| %> + <%= render object, orientation: 'vertical' %> + <% end %> + </div> +</div> diff --git a/app/views/collections/_bookmarks.html.erb b/app/views/collections/_bookmarks.html.erb deleted file mode 100644 index d1b7a91e344d3ceb821741b0d2fe4c2ee96b8eb1..0000000000000000000000000000000000000000 --- a/app/views/collections/_bookmarks.html.erb +++ /dev/null @@ -1,11 +0,0 @@ -<%= link_to collection_path(id: collection.id) do %> - <div class="col-sm-4"> - <div> - <%= image_tag 'icons/star-grey.png', style: 'max-height: 100px;' %> - </div> - <div class="panel-body"> - <h4 class="media-heading">Favoritos</h4> - <span><a><%= collection_length collection %></a></span> - </div> - </div> -<% end %> diff --git a/app/views/collections/show.html.erb b/app/views/collections/show.html.erb index ea3e4c77f6ffb39e3fe68f9b0e99068c16149551..ea55f316b1f555b7d914dce1f1fddfd0e0015b1c 100644 --- a/app/views/collections/show.html.erb +++ b/app/views/collections/show.html.erb @@ -3,7 +3,7 @@ <div class="container-fluid"> <div class="navbar-right" style="text-align:right"> <% if @own %> - <% if @collection.class != Bookmarks %> + <% if @collection.class != Bookmark %> <%= link_to '#' do %> <%= link_to 'APAGAR', collection_path(@collection.id), method: :delete, class: 'btn btn-danger btn-remove', style: 'margin-right: 30px', data: {confirm: 'Não será possÃvel recuperá-la, você tem certeza?'} %></span> <% end %> @@ -18,13 +18,13 @@ </div> <div class="navbar-header"> - <% if @collection.class != Bookmarks %> + <% if @collection.class != Bookmark %> <%= image_tag image_path("icons/collection.png"), class: "logo-image", size: "90x66" %> <% else %> <%= image_tag image_path("icons/star-grey.png"), class: "logo-image", style: 'max-height: 80px;' %> <% end %> <ul class="nav navbar-nav navbar-right collection-header" style="margin-left: 30px;"> - <li><h2><%= (@collection.class != Bookmarks) ? @collection.name : "Favoritos" %></h2></li> + <li><h2><%= (@collection.class != Bookmark) ? @collection.name : "Favoritos" %></h2></li> <li> <a class="count-collections-objects" data-toggle="tooltip" data-placement="bottom" title="Selecionar todos"> <%= image_tag image_path("icons/square.png"), class: "logo-image", size: "20x20" %> diff --git a/app/views/learning_objects/_bookmarks_button.html.erb b/app/views/learning_objects/_bookmarks_button.html.erb index 9a5885c16f2560599bc1fab75aacc9592b7e1f12..f5aaa1ab7eb253c16099de9f8e64120c86036204 100644 --- a/app/views/learning_objects/_bookmarks_button.html.erb +++ b/app/views/learning_objects/_bookmarks_button.html.erb @@ -1,3 +1,3 @@ -<%= link_to bookmarks_learning_object_path(id: learning_object.id), class: 'btn btn-default btn-xs', title: "Adicionar aos favoritos", method: :post, remote: true do %> +<%= link_to bookmark_add_path(id: learning_object.id, type: learning_object.class.to_s), class: 'btn btn-default btn-xs', title: "Adicionar aos favoritos", method: :post, remote: true do %> <span class="glyphicon glyphicon-bookmark" aria-hidden="true"></span> <% end %> diff --git a/app/views/learning_objects/_learning_object_horizontal.erb b/app/views/learning_objects/_learning_object_horizontal.erb index db10f2ae074254e81234f4758d61eb47973cc462..b4b8f123dbd917baf50a748c4d743292a728fe69 100644 --- a/app/views/learning_objects/_learning_object_horizontal.erb +++ b/app/views/learning_objects/_learning_object_horizontal.erb @@ -18,8 +18,8 @@ <% end %> <span class="author-label">Por <%= learning_object.get_metadata_value_of("dc.contributor.author") %></span><br/> - <span class="glyphicon glyphicon-eye-open" data-toggle="tooltip" data-placement="bottom" title="Visualizações"><%= learning_object.views %></span> - <span class="glyphicon glyphicon-star votes-count" data-id="<%= learning_object.id %>" data-toggle="tooltip" data-placement="bottom" title="Curtidas"><%= learning_object.likes %></span><br> + <span class="glyphicon glyphicon-eye-open" data-toggle="tooltip" data-placement="bottom" title="Visualizações"><%= learning_object.views.count %></span> + <span class="glyphicon glyphicon-star votes-count" data-id="<%= learning_object.id %>" data-toggle="tooltip" data-placement="bottom" title="Curtidas"><%= learning_object.likes.count %></span><br> <% unless learning_object.description.nil? %> <div class="learning-object-text"> diff --git a/app/views/learning_objects/_learning_object_vertical.erb b/app/views/learning_objects/_learning_object_vertical.erb index 50156e91a5d71e5c8a1d031ca628320e16ab6ec1..58aada1502d2ae275eced9af1e1f714b09abab78 100644 --- a/app/views/learning_objects/_learning_object_vertical.erb +++ b/app/views/learning_objects/_learning_object_vertical.erb @@ -10,8 +10,8 @@ </div> <div class="panel-body"> <h4 class="media-heading"><%= learning_object_title(learning_object) %></h4> - <span class="glyphicon glyphicon-eye-open" data-toggle="tooltip" data-placement="bottom" title="Visualizações"><%= learning_object.views %></span> - <span class="glyphicon glyphicon-star votes-count" data-id="<%= learning_object.id %>" data-toggle="tooltip" data-placement="bottom" title="Curtidas"><%= learning_object.likes %></span> + <span class="glyphicon glyphicon-eye-open" data-toggle="tooltip" data-placement="bottom" title="Visualizações"><%= learning_object.views.size %></span> + <span class="glyphicon glyphicon-star votes-count" data-id="<%= learning_object.id %>" data-toggle="tooltip" data-placement="bottom" title="Curtidas"><%= learning_object.likes.size %></span> <span class="author-label">Por <%= learning_object.get_metadata_value_of("dc.contributor.author") %></span> </div> </div> diff --git a/app/views/learning_objects/show.html.erb b/app/views/learning_objects/show.html.erb index 229c9f0087be9d4963936bac62a621fd593e8af8..c6603abcbc0ba7815a29a6339ae2c6a09011d4f3 100644 --- a/app/views/learning_objects/show.html.erb +++ b/app/views/learning_objects/show.html.erb @@ -12,8 +12,8 @@ %> </div> <div class="pull-right" style="padding-right:122px"> - <span class="glyphicon glyphicon-eye-open"><%= @learning_object.views %> </span> - <span class="glyphicon glyphicon-star votes-count" data-id="<%= @learning_object.id %>" data-toggle="tooltip" data-placement="bottom" title="Curtidas"><%= @learning_object.likes %></span> + <span class="glyphicon glyphicon-eye-open"><%= @learning_object.views.size %> </span> + <span class="glyphicon glyphicon-star votes-count" data-id="<%= @learning_object.id %>" data-toggle="tooltip" data-placement="bottom" title="Curtidas"><%= @learning_object.likes.size %></span> </div> <br/><br/> <h2 class="title"><%= @learning_object.name %></h2> @@ -36,16 +36,18 @@ </div> </div> <% end %> - <div class="media"> - <div class="media-left"> - <a href="#"><img class="user-image-small" src="<%#= current_user.avatar.url(:thumb) %><%= asset_path('user-anon.png')%>" alt="Foto do usuário"/></a> - </div> - <div class="media-body"> - <% publisher_type = @learning_object.publisher.class %> - <h5><%= publisher_type == User ? 'Adicionado por' : 'Origem'%></h5> - <h3 class="media-heading"><%= @learning_object.publisher.name %></h3> + <% unless @learning_object.publisher.nil? %> + <div class="media"> + <div class="media-left"> + <a href="#"><img class="user-image-small" src="<%#= current_user.avatar.url(:thumb) %><%= asset_path('user-anon.png')%>" alt="Foto do usuário"/></a> + </div> + <div class="media-body"> + <% publisher_type = @learning_object.publisher.class %> + <h5><%= publisher_type == User ? 'Adicionado por' : 'Origem'%></h5> + <h3 class="media-heading"><%= @learning_object.publisher.name %></h3> + </div> </div> - </div> + <% end %> <div class="rating-panel"> <% if user_signed_in? %> <div class="actions"> diff --git a/app/views/management/institutions/show.html.erb b/app/views/management/institutions/show.html.erb index 675726e73ddedc66946cc170b3c4fd0cf17689b8..de1e5d1e4b50bd48157719ac7bfa5ab6529ab787 100644 --- a/app/views/management/institutions/show.html.erb +++ b/app/views/management/institutions/show.html.erb @@ -1,4 +1,4 @@ <p id="notice"><%= notice %></p> -<%= link_to 'Edit', edit_management_institution_path(@management_institution) %> | +<%= link_to 'Edit', edit_management_institution_path(@institution) %> | <%= link_to 'Back', management_institutions_path %> diff --git a/app/views/management/statistics/index.html.erb b/app/views/management/statistics/index.html.erb index 08f372ad15e21e249096a0dfb600e49fcaa2930a..35e6504b01803bee13fd9efa0857efbb25daee2d 100644 --- a/app/views/management/statistics/index.html.erb +++ b/app/views/management/statistics/index.html.erb @@ -4,4 +4,4 @@ <li>EstatÃsticas</li> </ol> -<%= render 'general_stats', users_number: 10, collections_number: 20, learning_objects_number: 12333, total_accesses: 1000283474 %> +<%= render 'general_stats', users_number: @n_users, collections_number: @n_collections, learning_objects_number: @n_learning_objects, total_accesses: @total_accesses %> diff --git a/app/views/management/statistics/learning_objects.html.erb b/app/views/management/statistics/learning_objects.html.erb index 999870e07de6c60c307478b9c926e4957adaaae6..68d09eb00dcedd06336bfd4407b71b3145727a05 100644 --- a/app/views/management/statistics/learning_objects.html.erb +++ b/app/views/management/statistics/learning_objects.html.erb @@ -53,7 +53,7 @@ <div class="row learning-object-columns"> <% @most_visualised.each do |most| %> <%#= render_learning_object("vertical", most) %> - <li><%= link_to most["name"], learning_object_path(most["@rid"]) %></li><BR> + <li><%= link_to most["name"], learning_object_path(most["id"]) %></li><BR> <% end %> </div> </div> diff --git a/app/views/management/users/admins.html.erb b/app/views/management/users/admins.html.erb index 0e0624ec950eaae99c2b316b87d03dcb6fc2c0ed..87d84d49a6d264e1db68bf48d2ba51f1ee540664 100644 --- a/app/views/management/users/admins.html.erb +++ b/app/views/management/users/admins.html.erb @@ -1,7 +1,6 @@ <h1 class="ls-title-intro ls-ico-users">Administradores</h1> -<a href="#" class="ls-btn-primary" aria-expanded="false" role="combobox">Cadastrar - novo</a> +<%= link_to "Cadastrar novo", new_management_user_path, class:"ls-btn-primary", 'aria-expanded' => 'false', 'role' => 'combobox'%> <% if @admins.empty? %> <br /><br /><h3>Não há adminstradores cadastrados</h3> @@ -50,11 +49,15 @@ <td> <a href="#"><%= c.name %></a> <% nome = translate_role(c.roles[0].name) %> - <span class="ls-tag hidden-xs"><%= nome %></span> - </td> + <span class="ls-tag hidden-xs"><%= nome %></span> + </td> </td> <td class="ls-txt-center hidden-xs"> - <small class="ls-display-block"><b>Último acesso:</b> <%= c.current_sign_in_at.to_date %></small> + <% if c.current_sign_in_at %> + <small class="ls-display-block"><b>Último acesso:</b> <%= c.current_sign_in_at.to_date %></small> + <% else %> + <small class="ls-display-block"><b>Último acesso:</b>Nunca acessou</small> + <% end %> <small class="ls-display-block"><b>Total de acessos:</b> <%= c.sign_in_count %></small> </td> <td class="ls-txt-center"> @@ -67,7 +70,7 @@ <a href="#" class="ls-btn ls-btn-sm" aria-expanded="false" role="combobox">NÃvel</a> <ul class="ls-dropdown-nav" aria-hidden="true"> <% Role.all.each do |r| %> - <% nome = translate_role(r.name) %> + <% nome = translate_role(r.name) %> <li><%= link_to "Definir como #{nome}", change_roles_management_user_path(:id => c.id, :role_id => r.id), :method => :post %></li> <% end %> </ul> diff --git a/app/views/management/users/curators.html.erb b/app/views/management/users/curators.html.erb index 41cf35c40cde8c763859e021ee0b8d851d020d9e..720b04eeac6bdbacc015bf930715b12d7ded22a7 100644 --- a/app/views/management/users/curators.html.erb +++ b/app/views/management/users/curators.html.erb @@ -1,7 +1,6 @@ <h1 class="ls-title-intro ls-ico-users">Curadores</h1> -<a href="#" class="ls-btn-primary" aria-expanded="false" role="combobox">Cadastrar - novo</a> +<%= link_to "Cadastrar novo", new_management_user_path, class:"ls-btn-primary", 'aria-expanded' => 'false', 'role' => 'combobox'%> <% if @curators.empty? %> <br /><br /><h3>Não há curadores cadastrados</h3> @@ -46,15 +45,19 @@ <tbody> - <% @curators.each do |c| %> - <tr> - <td> - <a href="#"><%= c.name %></a> - <%nome = translate_role(c.roles[0].name) %> - <span class="ls-tag hidden-xs"><%= nome %></span> + <% @curators.each do |c| %> + <tr> + <td> + <a href="#"><%= c.name %></a> + <%nome = translate_role(c.roles[0].name) %> + <span class="ls-tag hidden-xs"><%= nome %></span> </td> <td class="ls-txt-center hidden-xs"> - <small class="ls-display-block"><b>Último acesso:</b> <%= c.current_sign_in_at.to_date %></small> + <% if c.current_sign_in_at %> + <small class="ls-display-block"><b>Último acesso:</b> <%= c.current_sign_in_at.to_date %></small> + <% else %> + <small class="ls-display-block"><b>Último acesso:</b>Nunca acessou</small> + <% end %> <small class="ls-display-block"><b>Total de acessos:</b> <%= c.sign_in_count %></small> </td> <td class="ls-txt-center"> @@ -67,7 +70,7 @@ <a href="#" class="ls-btn ls-btn-sm" aria-expanded="false" role="combobox">NÃvel</a> <ul class="ls-dropdown-nav" aria-hidden="true"> <% Role.all.each do |r| %> - <% nome = translate_role(r.name) %> + <% nome = translate_role(r.name) %> <li><%= link_to "Definir como #{nome}", change_roles_management_user_path(:id => c.id, :role_id => r.id), :method => :post %></li> <% end %> </ul> diff --git a/app/views/management/users/index.html.erb b/app/views/management/users/index.html.erb index 57654c29077c60062ed2322a0eac7c5f0c88fc4d..a48ce9277ca77aefd456c0e9d68c5210303568c8 100644 --- a/app/views/management/users/index.html.erb +++ b/app/views/management/users/index.html.erb @@ -1,7 +1,6 @@ <h1 class="ls-title-intro ls-ico-users">Usuários</h1> -<a href="#" class="ls-btn-primary" aria-expanded="false" role="combobox">Cadastrar - novo</a> +<%= link_to "Cadastrar novo", new_management_user_path, class:"ls-btn-primary", 'aria-expanded' => 'false'%> <div class="ls-box-filter"> <form action="" class="ls-form ls-form-inline ls-float-left"> @@ -47,37 +46,41 @@ <a href="#"><%= u.name %></a> <% u.roles.each do |r| %> - <% nome = translate_role(u.roles[0].name) %> + <% nome = translate_role(u.roles[0].name) %> <span class="ls-tag hidden-xs"><%= nome %></span> - </td> + </td> <% end %> - </td> + </td> <td class="ls-txt-center hidden-xs"> - <small class="ls-display-block"><b>Último acesso:</b> <%= u.current_sign_in_at.to_date %></small> + <%if u.current_sign_in_at%> + <small class="ls-display-block"><b>Último acesso:</b> <%= u.current_sign_in_at.to_date %></small> + <% else %> + <small class="ls-display-block"><b>Último acesso:</b>Nunca acessou</small> + <% end %> <small class="ls-display-block"><b>Total de acessos:</b> <%= u.sign_in_count %></small> </td> - <td class="ls-txt-center"> - <%= u.email %> - </td> - <td class="ls-txt-right ls-regroup"> + <td class="ls-txt-center"> + <%= u.email %> + </td> + <td class="ls-txt-right ls-regroup"> - <%= link_to 'Administrar', edit_management_user_path(u), {class: 'ls-btn ls-btn-sm', aria: {expanded: false}, role: 'combobox'} %> - <%= link_to 'Excluir', management_user_path(u), {method: :delete, data: {confirm: 'Tem certeza que deseja excluir?'}, title: 'Apagar usuário', class: 'ls-btn ls-btn-sm', role: 'option'} %> - <div data-ls-module="dropdown" class="ls-dropdown ls-pos-right"> - <a href="#" class="ls-btn ls-btn-sm" aria-expanded="false" role="combobox">NÃvel</a> - <ul class="ls-dropdown-nav"> - <% @user = u %> - <% Role.all.each do |r| %> - <% nome = translate_role(r.name) %> - <li><%= link_to "Definir como #{nome}", change_roles_management_user_path( :id => u, :role_id => r.id),:method => :post %></li> - <% end %> - </ul> - </div> + <%= link_to 'Administrar', edit_management_user_path(u), {class: 'ls-btn ls-btn-sm', aria: {expanded: false}, role: 'combobox'} %> + <%= link_to 'Excluir', management_user_path(u), {method: :delete, data: {confirm: 'Tem certeza que deseja excluir?'}, title: 'Apagar usuário', class: 'ls-btn ls-btn-sm', role: 'option'} %> + <div data-ls-module="dropdown" class="ls-dropdown ls-pos-right"> + <a href="#" class="ls-btn ls-btn-sm" aria-expanded="false" role="combobox">NÃvel</a> + <ul class="ls-dropdown-nav"> + <% @user = u %> + <% Role.all.each do |r| %> + <% nome = translate_role(r.name) %> + <li><%= link_to "Definir como #{nome}", change_roles_management_user_path( :id => u, :role_id => r.id),:method => :post %></li> + <% end %> + </ul> + </div> - </td> - </tr> + </td> + </tr> <% end %> </tbody> diff --git a/app/views/orientdb/learning_objects/_actions_buttons.html.erb b/app/views/orientdb/learning_objects/_actions_buttons.html.erb new file mode 100644 index 0000000000000000000000000000000000000000..ab828128232d17171862d63e352460910dbb62ba --- /dev/null +++ b/app/views/orientdb/learning_objects/_actions_buttons.html.erb @@ -0,0 +1,5 @@ +<div class="learning-object-actions"> + <%= render 'learning_objects/like_button', learning_object: learning_object %> + <%= render 'learning_objects/bookmarks_button', learning_object: learning_object %> + <%= render 'learning_objects/collections_button', learning_object: learning_object %> +</div> diff --git a/app/views/orientdb/learning_objects/_add_to_collection_popover.html.erb b/app/views/orientdb/learning_objects/_add_to_collection_popover.html.erb new file mode 100644 index 0000000000000000000000000000000000000000..d26c583cf49cf913a2e5a9f900896f36887d61d1 --- /dev/null +++ b/app/views/orientdb/learning_objects/_add_to_collection_popover.html.erb @@ -0,0 +1,16 @@ +<div id="collections_list_popover-<%= learning_object.id %>"> + <% if collections.empty? %> + <%= link_to 'Criar coleção', me_users_path %> + <% else %> + + <ul> + <% collections.each do |collection| %> + <li> + <%= link_to collection.name, add_learning_object_collection(id: collection.id, learning_object_id: learning_object.id), class: 'default_btn', method: :post, remote: true %> + </li> + <% end %> + </ul> + + + <% end %> +</div> diff --git a/app/views/orientdb/learning_objects/_bookmarks_button.html.erb b/app/views/orientdb/learning_objects/_bookmarks_button.html.erb new file mode 100644 index 0000000000000000000000000000000000000000..9a5885c16f2560599bc1fab75aacc9592b7e1f12 --- /dev/null +++ b/app/views/orientdb/learning_objects/_bookmarks_button.html.erb @@ -0,0 +1,3 @@ +<%= link_to bookmarks_learning_object_path(id: learning_object.id), class: 'btn btn-default btn-xs', title: "Adicionar aos favoritos", method: :post, remote: true do %> + <span class="glyphicon glyphicon-bookmark" aria-hidden="true"></span> +<% end %> diff --git a/app/views/orientdb/learning_objects/_collections_button.html.erb b/app/views/orientdb/learning_objects/_collections_button.html.erb new file mode 100644 index 0000000000000000000000000000000000000000..1f2b4f7802cf33b365f73a207f3e9620a0124aad --- /dev/null +++ b/app/views/orientdb/learning_objects/_collections_button.html.erb @@ -0,0 +1,3 @@ +<a tabindex="0" class="add-to-collection btn btn-default btn-xs" role="button" title="Adicionar as coleções" data-loid="<%= learning_object.id %>"> + <span class="glyphicon glyphicon-list" aria-hidden="true"></span> +</a> diff --git a/app/views/orientdb/learning_objects/_file_upload_form.html.erb b/app/views/orientdb/learning_objects/_file_upload_form.html.erb new file mode 100644 index 0000000000000000000000000000000000000000..f35e007fa56149c64b46e9892022c7c74937da03 --- /dev/null +++ b/app/views/orientdb/learning_objects/_file_upload_form.html.erb @@ -0,0 +1,111 @@ +<div class="row"> + <div class="small-12 columns"> + <fieldset> + <legend>Enviar arquivo do objeto educacional</legend> + <div class="small-12 columns"> + <div class="file"> + <a href="#" id="browseButton" class="expand button">Selecionar o arquivo</a> + </div> + <div class="controls" style="display: none"> + <a href="#" id="continueButton" class="success radius small button">Continuar</a> + <a href="#" id="pauseButton" class="radius small button">Pausar</a> + <a href="#" id="cancelButton" class="alert radius small button">Cancelar</a> + </div> + <div class="progress" style="display: none"> + <span class="meter text-right" style="width: 0%; font-weight: bold;"></span> + </div> + <div class="row"> + <label id="alertSuccess" class="text-center" style="display: none"> + Seu arquivo foi enviado e está sendo processado, em alguns minutos ele será publicado! + </label> + </div> + </fieldset> + </div> +</div> + +<script type="text/javascript" charset="utf-8"> + // resumable + var r = new Resumable({ + target: "<%= chunk_path %>", + query: {learning_object_id: "<%= ERB::Util.url_encode(@learning_object.id) %>"}, + headers: { + 'X-CSRF-Token': $('meta[name="csrf-token"]').attr('content') + }, + //source: https://gist.github.com/JAndritsch/3920385 + chunkSize: 1024 * 256 + }); + + // buttons + r.assignBrowse(document.getElementById('browseButton')); + $("#continueButton").click(function () { + $('#continueButton').hide(); + $('#pauseButton').show(); + r.upload(); + }); + $("#pauseButton").click(function () { + r.pause() + }); + $("#cancelButton").click(function () { + r.cancel() + }); + + // events + var progress_percent = 0; + r.on('fileSuccess', function (file) { + $('.file').hide(); + $('.controls').hide(); + $('.progress').show(); + $('.progress').addClass('success'); + $('#alertSuccess').show(); + $('.links').show(); + //console.debug(file); + }); + r.on('fileProgress', function (file) { + progress_percent = Math.floor(file.progress() * 100); + $('.progress > .meter').html(progress_percent + '%'); + $('.progress > .meter').css('width', progress_percent + '%'); + //console.debug(file); + }); + r.on('fileAdded', function (file, event) { + $('#continueButton').hide(); + $('#pauseButton').show(); + $('#cancelButton').show(); + $('.file').hide(); + $('.controls').show(); + $('.progress').show(); + r.upload(); + //console.debug(file, event); + }); + r.on('fileRetry', function (file) { + //console.debug(file); + }); + r.on('fileError', function (file, message) { + //console.debug(file, message); + }); + r.on('uploadStart', function () { + $('.progress').show(); + //console.debug(); + }); + r.on('complete', function () { + //console.debug(); + }); + r.on('progress', function () { + //console.debug(); + }); + r.on('error', function (message, file) { + //console.debug(message, file); + }); + r.on('pause', function () { + $('#continueButton').show(); + $('#pauseButton').hide(); + $('#cancelButton').show(); + }); + r.on('cancel', function () { + $('.file').show(); + $('.controls').hide(); + $('.progress').hide(); + $('.progress > .meter').html(''); + $('.progress > .meter').css('width', '0%'); + //console.debug(); + }); +</script> \ No newline at end of file diff --git a/app/views/orientdb/learning_objects/_form.html.erb b/app/views/orientdb/learning_objects/_form.html.erb new file mode 100644 index 0000000000000000000000000000000000000000..c82330503d3626ac311a5d29cae3ff31e0a9a9bd --- /dev/null +++ b/app/views/orientdb/learning_objects/_form.html.erb @@ -0,0 +1,68 @@ +<%= form_for(@learning_object) do |f| %> + <% if @learning_object.errors.any? %> + <div id="error_explanation"> + <h2><%= pluralize(@learning_object.errors.count, "error") %> prohibited this learning_object from being + saved:</h2> + + <ul> + <% @learning_object.errors.full_messages.each do |message| %> + <li><%= message %></li> + <% end %> + </ul> + </div> + <% end %> + + <div class="row"> + <div class="col-md-12"> + + </div> + + <div class="row"> + <div class="col-md-12"> + <fieldset> + <legend>Envie seu objeto educacional</legend> + <%= f.label :name, "TÃtulo" %> + <%= f.text_field :name, class: "form-control" %> <br> + + <%= f.label :description, "Descreva seu objeto" %> + <%= f.text_area :description, class: "form-control" %><br> + + <%= f.label :language, "Idioma do objeto" %> + <%= f.text_field :language, class: "form-control" %><br> + + <%= f.label :author, "Autor" %> + <%= f.text_field :author, class: "form-control" %><br> + + <%= f.label :type, "Tipo do objeto" %> + <% @types.each do |type| %> + <br><input type="radio" name="learning_object[type]" value="<%= type %>"> <%= type %> + <% end %> + <br><br> + + <%= f.label :subjects, 'Assuntos (Selecione 1 ou mais assuntos)' %> + <select id='subjectSelect' name="learning_object[subjects][]" multiple> + <%= @subjects.each do |subject| %> + <option value='<%= subject.id %>'><%= subject.name %></option> + <% end %> + </select> + <br><br> + + <%= f.label :school_level, "NÃvel Escolar" %><br> + <select name="learning_object[school_level]"> + <%= @school_levels.each do |school_level| %> + <option value="<%= school_level %>"><%= school_level %></option> + <% end %> + </select> + <br><br> + <%= f.submit 'Criar Objeto' %> + </fieldset> + </div> + </div> + </div> + +<% end %> +<script> + $("#subjectSelect").select2({ + placeholder: "Assuntos" + }); +</script> diff --git a/app/views/orientdb/learning_objects/_learning_object.erb b/app/views/orientdb/learning_objects/_learning_object.erb new file mode 100644 index 0000000000000000000000000000000000000000..db67c9c3b6b5b6f3e7e351ae921e2b7dbb388565 --- /dev/null +++ b/app/views/orientdb/learning_objects/_learning_object.erb @@ -0,0 +1 @@ +<%= render_learning_object orientation, learning_object %> diff --git a/app/views/orientdb/learning_objects/_learning_object_horizontal.erb b/app/views/orientdb/learning_objects/_learning_object_horizontal.erb new file mode 100644 index 0000000000000000000000000000000000000000..db10f2ae074254e81234f4758d61eb47973cc462 --- /dev/null +++ b/app/views/orientdb/learning_objects/_learning_object_horizontal.erb @@ -0,0 +1,39 @@ + + <% link = learning_object_path(id: learning_object.id) %> + <div class="learning-object-horizontal row"> + <!-- <div class="col-md-5"> --> + <div class="learning-object-thumbnail"> + <%= link_to link do + learning_object_thumbnail learning_object + end %> + + <% if user_signed_in? %> + <%= render 'learning_objects/actions_buttons', learning_object: learning_object %> + <% end %> + </div> + <!-- </div> --> + <div class="learning-object-body"> + <%= link_to link do %> + <h4 class="learning-object-heading"><%= learning_object_title learning_object %></h4> + <% end %> + + <span class="author-label">Por <%= learning_object.get_metadata_value_of("dc.contributor.author") %></span><br/> + <span class="glyphicon glyphicon-eye-open" data-toggle="tooltip" data-placement="bottom" title="Visualizações"><%= learning_object.views %></span> + <span class="glyphicon glyphicon-star votes-count" data-id="<%= learning_object.id %>" data-toggle="tooltip" data-placement="bottom" title="Curtidas"><%= learning_object.likes %></span><br> + + <% unless learning_object.description.nil? %> + <div class="learning-object-text"> + <%= + if learning_object.description.length > 150 + d = learning_object.description[0..150] + d = d[0...d.rindex(' ')] + d << "..." + else + learning_object.description + end + %> + </div> + <br/> + <% end %> + </div> + </div> diff --git a/app/views/orientdb/learning_objects/_learning_object_vertical.erb b/app/views/orientdb/learning_objects/_learning_object_vertical.erb new file mode 100644 index 0000000000000000000000000000000000000000..50156e91a5d71e5c8a1d031ca628320e16ab6ec1 --- /dev/null +++ b/app/views/orientdb/learning_objects/_learning_object_vertical.erb @@ -0,0 +1,18 @@ +<div class="learning-object-vertical" data-loid="<%= learning_object.id %>"> + <div class="panel"> + <div class="learning-object-thumbnail"> + <%= link_to learning_object_path(id: learning_object.id) do + learning_object_thumbnail learning_object + end %> + <% if user_signed_in? %> + <%= render 'learning_objects/actions_buttons', learning_object: learning_object %> + <% end %> + </div> + <div class="panel-body"> + <h4 class="media-heading"><%= learning_object_title(learning_object) %></h4> + <span class="glyphicon glyphicon-eye-open" data-toggle="tooltip" data-placement="bottom" title="Visualizações"><%= learning_object.views %></span> + <span class="glyphicon glyphicon-star votes-count" data-id="<%= learning_object.id %>" data-toggle="tooltip" data-placement="bottom" title="Curtidas"><%= learning_object.likes %></span> + <span class="author-label">Por <%= learning_object.get_metadata_value_of("dc.contributor.author") %></span> + </div> + </div> +</div> diff --git a/app/views/orientdb/learning_objects/_like_button.html.erb b/app/views/orientdb/learning_objects/_like_button.html.erb new file mode 100644 index 0000000000000000000000000000000000000000..45a5e00594c3d1309068f409a1fa4466f28321af --- /dev/null +++ b/app/views/orientdb/learning_objects/_like_button.html.erb @@ -0,0 +1,3 @@ +<%= link_to like_learning_object_path(id: learning_object.id), class: 'btn btn-primary btn-xs vote', method: :post, remote: true do %> + <span class="glyphicon glyphicon-thumbs-up" aria-hidden="true"></span> +<% end %> \ No newline at end of file diff --git a/app/views/orientdb/learning_objects/collections.json.jbuilder b/app/views/orientdb/learning_objects/collections.json.jbuilder new file mode 100644 index 0000000000000000000000000000000000000000..5a5e53a6c7785008f21f843e09b65aa42e172cba --- /dev/null +++ b/app/views/orientdb/learning_objects/collections.json.jbuilder @@ -0,0 +1,3 @@ +json.array!(@collections) do |collection| + json.extract! collection, :id, :name +end diff --git a/app/views/orientdb/learning_objects/edit.html.erb b/app/views/orientdb/learning_objects/edit.html.erb new file mode 100644 index 0000000000000000000000000000000000000000..9564e46a360dbe30ce2a24e697d60eae386dffe0 --- /dev/null +++ b/app/views/orientdb/learning_objects/edit.html.erb @@ -0,0 +1,6 @@ +<h1>Editing Learning Object</h1> + +<%= render 'form' %> + +<%= link_to 'Show', @learning_object %> | +<%= link_to 'Back', learning_objects_path %> diff --git a/app/views/orientdb/learning_objects/new.html.erb b/app/views/orientdb/learning_objects/new.html.erb new file mode 100644 index 0000000000000000000000000000000000000000..bcaa506113f69d69ab3ca0a7249be1cb43573571 --- /dev/null +++ b/app/views/orientdb/learning_objects/new.html.erb @@ -0,0 +1,3 @@ +<%= render 'form' %> + +<%= link_to 'Voltar', learning_objects_path %> diff --git a/app/views/orientdb/learning_objects/show.html.erb b/app/views/orientdb/learning_objects/show.html.erb new file mode 100644 index 0000000000000000000000000000000000000000..229c9f0087be9d4963936bac62a621fd593e8af8 --- /dev/null +++ b/app/views/orientdb/learning_objects/show.html.erb @@ -0,0 +1,138 @@ +<% content_for(:body_attributes) do %>data-no-turbolink="true"<% end %> +<div class="row learning-object"> + <div class="col-md-7"> + <div class="view"> + <%= + case @type + when 'Ãudio' then audio_tag(@learning_object.retrievelink, controls: true) + when 'VÃdeo' then video_tag(@learning_object.retrievelink, autobuffer: true, poster: @learning_object.thumbnail) + when 'PDF' then "<iframe src=\"/pdfjs/web/viewer.html?file=#{@learning_object.retrievelink }\" style=\"border: 0 \" width=\"125%\" height=\"280\" frameborder=\"0\" scrolling=\"no\"></iframe>".html_safe + else learning_object_thumbnail @learning_object, "large" + end + %> + </div> + <div class="pull-right" style="padding-right:122px"> + <span class="glyphicon glyphicon-eye-open"><%= @learning_object.views %> </span> + <span class="glyphicon glyphicon-star votes-count" data-id="<%= @learning_object.id %>" data-toggle="tooltip" data-placement="bottom" title="Curtidas"><%= @learning_object.likes %></span> + </div> + <br/><br/> + <h2 class="title"><%= @learning_object.name %></h2> + <% unless @learning_object.description.nil? %> + <p class="description"><%= @learning_object.description %></p> + <% end %> + <span class="category"><%= ("Em " + show_categories(@learning_object.categories)) unless @learning_object.categories.nil? %></span> + </div> + <div class="col-md-5"> + <div class="rightbar"> + <% author = @learning_object.get_metadata_value_of("dc.contributor.author") %> + <% unless author.blank? %> + <div class="media"> + <div class="media-left"> + <a href="#"><img class="user-image-small" src="<%#= current_user.avatar.url(:thumb) %><%= asset_path('user-anon.png')%>" alt="Foto do usuário"/></a> + </div> + <div class="media-body"> + <h5>Autor</h5> + <h3 class="media-heading"><%= author %></h3> + </div> + </div> + <% end %> + <div class="media"> + <div class="media-left"> + <a href="#"><img class="user-image-small" src="<%#= current_user.avatar.url(:thumb) %><%= asset_path('user-anon.png')%>" alt="Foto do usuário"/></a> + </div> + <div class="media-body"> + <% publisher_type = @learning_object.publisher.class %> + <h5><%= publisher_type == User ? 'Adicionado por' : 'Origem'%></h5> + <h3 class="media-heading"><%= @learning_object.publisher.name %></h3> + </div> + </div> + <div class="rating-panel"> + <% if user_signed_in? %> + <div class="actions"> + <div class="col-sm-3 action"> + <%= link_to like_learning_object_path(id: @learning_object.id), class: 'vote',method: :post, remote: true do %> + <% if @liked %> + <%= image_tag "icons/Curtir_02.png", alt: "Descurtir" %> + <% else %> + <%= image_tag "icons/Curtir_01.png", alt: "Curtir" %> + <% end %> + <h6>curtir objeto</h6> + <% end %> + </div> + <div class="col-sm-3 action"> + <%= link_to download_learning_object_path, target: "_blank" do %> + <%#= @learning_object.retrievelink %> + <%= image_tag "icons/download.png", alt: "Download do objeto" %> + <h6>salvar no computador</h6> + <%end%> + </div> + <div class="col-sm-3 action"> + <a tabindex="0" class="add-to-collection" role="button" title="Adicionar as coleções" data-loid="<%= @learning_object.id %>"> + <%= image_tag "icons/collection-add.png", alt: "Adicionar à coleção" %> + <h6>adicionar à coleção</h6> + </a> + </div> + <div class="col-sm-3 action"> + <%= render 'complaints/complaints_button' %> + </div> + </div> + <% else %> + <br/> + <h4>Logue-se para poder curtir, adicionar o objeto em uma coleção, baixar o counteúdo ou denunciar.</h4> + <% end %> + </div> + </div> + </div> +</div> +<br/> + +<a class="btn btn-primary" type="button" data-toggle="modal" data-target="#extra_metadata_modal" title="Metadados Adicionais">Metadados Adicionais</a> +<div class="modal fade" id="extra_metadata_modal" tabindex="-1" role="dialog" aria-labelledby="extra_metadata_modal_label"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <button type="button" class="close" data-dismiss="modal" aria-label="Fechar"><span aria-hidden="true">×</span></button> + <h4 class="modal-title" id="extra_metadata_modal_label">Metadados Adicionais</h4> + </div> + <div class="modal-body" style="text-align:justify"> + + <div class="container-fluid"> + <div class="row"> + <div class="col-sm-12"> + <ul> + <li><b>Autor:</b> <%= @learning_object.get_metadata_value_of("dc.contributor.author") %></li> + <li><b>Tipo:</b> <%= @learning_object.get_metadata_value_of("dc.type") %></li> + <li><b>Data:</b> <%= @learning_object.get_metadata_value_of("dc.date.available") %></li> + <li><b>Linguagem:</b> <%= @learning_object.get_metadata_value_of("dc.language") %></li> + </ul> + <table class="table table-striped"> + <% @learning_object.metadata.each do |m| %> + <tr> + <th><span><%= "#{m["key"]}:" %></span></th> + <td><%= "#{m["value"]}" %></td> + </tr> + <% end %> + </table> + </div> + </div> + </div> + + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default" data-dismiss="modal">Fechar</button> + </div> + </div> + </div> +</div> + + +<script type="text/javascript"> + $(".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/orientdb/learning_objects/show.json.jbuilder b/app/views/orientdb/learning_objects/show.json.jbuilder new file mode 100644 index 0000000000000000000000000000000000000000..7e33e8d0f96501cf92c3c34101365723a62f0d53 --- /dev/null +++ b/app/views/orientdb/learning_objects/show.json.jbuilder @@ -0,0 +1 @@ +json.extract! @learning_object, :id, :created_at, :updated_at diff --git a/app/views/orientdb/learning_objects/upload.html.erb b/app/views/orientdb/learning_objects/upload.html.erb new file mode 100644 index 0000000000000000000000000000000000000000..d68577e9a20f31d56ac58e625ff75375b68a58ca --- /dev/null +++ b/app/views/orientdb/learning_objects/upload.html.erb @@ -0,0 +1,3 @@ +<%= render 'file_upload_form' %> + +<%= link_to 'Voltar', learning_objects_path %> diff --git a/app/views/search/_fetch.html.erb b/app/views/search/_fetch.html.erb index b0f414da55524e3811335079fde2d6d381c3f310..dd7384b56e05e66b962f05fc84a3cd9526622509 100644 --- a/app/views/search/_fetch.html.erb +++ b/app/views/search/_fetch.html.erb @@ -1,5 +1,5 @@ <input type="hidden" name="learning-objects-count" value="<%= @result.total_count %>"/> <div class="row"> - <%= render @objects, orientation: "horizontal" %> + <%= render @result, orientation: "horizontal" %> <%= paginate @result %> </div> diff --git a/app/views/search/index.html.erb b/app/views/search/index.html.erb index 58e26782491ed6471546f26244643c75d8d65e31..d1d372028b61a3289ebccd0acf1de1dafbb5c6db 100644 --- a/app/views/search/index.html.erb +++ b/app/views/search/index.html.erb @@ -34,7 +34,7 @@ <h3 class="dropdown">NÃveis de Ensino<span class="caret caret-align-right"/></h3> <div class="dropdown-element"> <% @school_levels.each do |school_level|%> - <label class="label-checkbox"><%= school_level %><input value="<%= school_level %>" name="filter-school-level" type="checkbox"/></label><br> + <label class="label-checkbox"><%= school_level.name %><input value="<%= school_level.name %>" name="filter-school-level" type="checkbox"/></label><br> <% end %> </div> @@ -42,7 +42,7 @@ <h3 class="dropdown">Origem<span class="caret caret-align-right"/></h3> <div class="dropdown-element"> <% @source.each do |source|%> - <label class="label-checkbox"><%= source.name %><input value="<%= source.name %>" name="filter-source" type="checkbox"/></label><br> + <label class="label-checkbox"><%= source.name %><input value="<%= source.id %>" name="filter-source" type="checkbox"/></label><br> <% end %> </div> <% end %> diff --git a/app/views/shared/application/_header.html.erb b/app/views/shared/application/_header.html.erb index c94bdbf9417c4ca23b489cfff5cec53ab5585488..3bd7359b6be4b726c9bbf9a9263507b5367d4326 100644 --- a/app/views/shared/application/_header.html.erb +++ b/app/views/shared/application/_header.html.erb @@ -35,7 +35,7 @@ <div class="search-input"> <form action="/search" method="get"> <div class="input-group" id="search"> - <input type="text" placeholder="buscar em <%= number_with_delimiter(@learning_object_count, delimiter: ".") %> objetos" class="form-control" name="query" id="main_search"> + <input type="text" placeholder="buscar em <%= number_with_delimiter(LearningObject.count, delimiter: ".") %> objetos" 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> diff --git a/app/workers/dspace_upload_worker.rb b/app/workers/dspace_upload_worker.rb index 0c582c3eede3b38640803bc36e02d645b1193b32..0666a13ddf8004e5e2c9478c324dd04f31773d81 100644 --- a/app/workers/dspace_upload_worker.rb +++ b/app/workers/dspace_upload_worker.rb @@ -12,19 +12,15 @@ class DspaceUploadWorker bitstream = dspace.items.add_bitstream(file, id: item_id, name: File.basename(media_path), description: get_description(options)) #find learning object - learning_object = learning_object_repository.find learning_object_id - learning_object.attachments << build_attachment(bitstream) - - #build attachments and publish + learning_object = LearningObject.find learning_object_id + learning_object.attachments.create map_bitstream2attachment(bitstream) publisher.publish! learning_object end private - def build_attachment(bitstream) - ::LearningObject::Attachment.new(id: bitstream.id, name: bitstream.name, link: bitstream.link, - retrieve_link: bitstream.retrieve_link, description: bitstream.description, - format: bitstream.format, mime_type: bitstream.mime_type, size: bitstream.size_bytes, bundle_name: bitstream.bundle_name, uptodate: false) + def map_bitstream2attachment(bitstream) + ::Dspace::AttachmentMapper.call bitstream end def publisher diff --git a/app/workers/import_learning_object_worker.rb b/app/workers/import_learning_object_worker.rb new file mode 100644 index 0000000000000000000000000000000000000000..12ffcd0a5f668f4ffbd8656755662c104dd088d7 --- /dev/null +++ b/app/workers/import_learning_object_worker.rb @@ -0,0 +1,25 @@ +class ImportLearningObjectWorker + include Sidekiq::Worker + sidekiq_options queue: :import + include RepositoriesProxy + + def perform(rid) + object = learning_object_repository.find(rid) + + LearningObject.create do |o| + o.name = object.name + o.created_at = object.created_at + o.updated_at = object.last_modified + o.status = object.status + o.author = object.author + o.description = object.description + o.school_level = object.grade_level + o.id_dspace = object.id_dspace + o.published_at = object.published_at + o.score = object.score + o.thumbnail = object.thumbnail + o.type = object.type + end + + end +end diff --git a/app/workers/massive_dspace_sync_worker.rb b/app/workers/massive_dspace_sync_worker.rb deleted file mode 100644 index bfce0c92a2ff9aa1022e37ebb3959a607116ad7c..0000000000000000000000000000000000000000 --- a/app/workers/massive_dspace_sync_worker.rb +++ /dev/null @@ -1,28 +0,0 @@ -class MassiveDspaceSyncWorker - - include Sidekiq::Worker - include RepositoriesProxy - - def perform(item_ids) - item_ids.each do |id| - begin - dspace_repository.items.find(id: id["id_dspace"]) - rescue - puts "----------------------------------------------" - puts "ITEM WILL BE REMOVED: #{item.to_json}" - puts "----------------------------------------------" - broken_item = learning_object_repository.find id["id"] - learning_object_repository.destroy broken_item - - end - end - - end - - private - - def dspace_repository - DspaceService.create_client - end - -end diff --git a/app/workers/massive_likes_creator_worker.rb b/app/workers/massive_likes_creator_worker.rb deleted file mode 100644 index 79506a6831d6571a912b2a24990054f0f60ed616..0000000000000000000000000000000000000000 --- a/app/workers/massive_likes_creator_worker.rb +++ /dev/null @@ -1,21 +0,0 @@ -class MassiveLikesCreatorWorker - - include Sidekiq::Worker - include RepositoriesProxy - - def perform(item_id, users_ids) - - item = learning_object_repository.find item_id - - users_ids.each do |user_id| - user = User.find user_id - begin - learning_object_repository.like user, item - rescue - next - end - end - - end - -end diff --git a/app/workers/massive_views_creator_worker.rb b/app/workers/massive_views_creator_worker.rb deleted file mode 100644 index a5903a0a87314ecb87074abfc47cf1e90e4ab418..0000000000000000000000000000000000000000 --- a/app/workers/massive_views_creator_worker.rb +++ /dev/null @@ -1,21 +0,0 @@ -class MassiveViewsCreatorWorker - - include Sidekiq::Worker - include RepositoriesProxy - - def perform(item_id, users_ids) - - item = learning_object_repository.find item_id - - users_ids.each do |user_id| - user = User.find user_id - begin - learning_object_repository.increment_views user, item - rescue - next - end - end - - end - -end diff --git a/config/routes.rb b/config/routes.rb index cb8c4cdd22dd9b3311e701a4036fe606fb0e71da..f5a3db21c2ed045ea6813c6447df56b12d71790d 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -64,7 +64,6 @@ Rails.application.routes.draw do resources :learning_objects do member do post :like - post :bookmarks get :collections get :upload get :download @@ -89,6 +88,10 @@ Rails.application.routes.draw do end end + get '/bookmarks' => 'bookmarks#show', as: 'bookmark' + post '/bookmarks/:type/:id' => 'bookmarks#add_object', as: :bookmark_add + delete '/bookmarks/:type/:id' => 'bookmarks#remove_object', as: :bookmark_remove + get '/users/list' => 'users#list', as: :list_all_users resources :users, only: [:show] do collection do diff --git a/db/migrate/20150918134417_add_rid_column_to_users.rb b/db/migrate/20150918134417_add_rid_column_to_users.rb deleted file mode 100644 index b31a51e799c6f0a54fe2aaa7e8680606f670e7d4..0000000000000000000000000000000000000000 --- a/db/migrate/20150918134417_add_rid_column_to_users.rb +++ /dev/null @@ -1,5 +0,0 @@ -class AddRidColumnToUsers < ActiveRecord::Migration - def change - add_column :users, :rid, :string - end -end diff --git a/db/migrate/20151218130048_create_feedback_ratings.rb b/db/migrate/20151218130048_create_feedback_ratings.rb deleted file mode 100644 index 59431ce4445d2a3aa009a0556387a8fc37eb01ec..0000000000000000000000000000000000000000 --- a/db/migrate/20151218130048_create_feedback_ratings.rb +++ /dev/null @@ -1,9 +0,0 @@ -class CreateFeedbackRatings < ActiveRecord::Migration - def change - create_table :feedback_ratings do |t| - t.string :name - - t.timestamps null: false - end - end -end diff --git a/db/migrate/20151218130232_create_feedbacks.rb b/db/migrate/20151218130232_create_feedbacks.rb deleted file mode 100644 index 2381556153e73deae75b393cd62d34b2f0bcbc26..0000000000000000000000000000000000000000 --- a/db/migrate/20151218130232_create_feedbacks.rb +++ /dev/null @@ -1,11 +0,0 @@ -class CreateFeedbacks < ActiveRecord::Migration - def change - create_table :feedbacks do |t| - t.belongs_to :user, index: true - t.text :message - - t.timestamps null: false - end - add_foreign_key :feedbacks, :users - end -end diff --git a/db/migrate/20151218131811_create_feedbacks_ratings_join_table.rb b/db/migrate/20151218131811_create_feedbacks_ratings_join_table.rb deleted file mode 100644 index acf847d144b914f7529c7588762503f7e140ca14..0000000000000000000000000000000000000000 --- a/db/migrate/20151218131811_create_feedbacks_ratings_join_table.rb +++ /dev/null @@ -1,12 +0,0 @@ -class CreateFeedbacksRatingsJoinTable < ActiveRecord::Migration - def change - create_table :feedbacks_feedback_ratings, id: false do |t| - t.integer :feedback_id - t.integer :feedback_rating_id - t.integer :rating - end - - add_index :feedbacks_feedback_ratings, :feedback_id - add_index :feedbacks_feedback_ratings, :feedback_rating_id - end -end diff --git a/db/migrate/20160125120915_create_learning_objects.rb b/db/migrate/20160125120915_create_learning_objects.rb new file mode 100644 index 0000000000000000000000000000000000000000..30a512e9c11ef20851258894b35b784985663f6a --- /dev/null +++ b/db/migrate/20160125120915_create_learning_objects.rb @@ -0,0 +1,23 @@ +class CreateLearningObjects < ActiveRecord::Migration + def change + create_table :learning_objects do |t| + t.integer :id_dspace, index: true + t.string :name + t.string :author + t.text :description + t.datetime :published_at + t.string :object_type + t.integer :score, default: 0 + t.integer :school_level + t.string :language + t.jsonb :metadata, default: {} + t.text :bitstreams + t.string :thumbnail + t.text :keywords + + t.references :publisher, polymorphic: true, index: true + + t.timestamps null: false + end + end +end diff --git a/db/migrate/20160125121603_create_topics.rb b/db/migrate/20160125121603_create_topics.rb new file mode 100644 index 0000000000000000000000000000000000000000..5d483cc840d6660fc8bf987957fc71f5e73cf53b --- /dev/null +++ b/db/migrate/20160125121603_create_topics.rb @@ -0,0 +1,9 @@ +class CreateTopics < ActiveRecord::Migration + def change + create_table :topics do |t| + t.string :name + + t.timestamps null: false + end + end +end diff --git a/db/migrate/20160125122642_learning_objects_topics.rb b/db/migrate/20160125122642_learning_objects_topics.rb new file mode 100644 index 0000000000000000000000000000000000000000..1a5f0e26fb0de1deacc23aa8d8e92fbc5c398c7b --- /dev/null +++ b/db/migrate/20160125122642_learning_objects_topics.rb @@ -0,0 +1,10 @@ +class LearningObjectsTopics < ActiveRecord::Migration + def change + create_table :learning_objects_topics do |t| + t.integer :learning_object_id + t.integer :topic_id + + t.timestamps null: false + end + end +end diff --git a/db/migrate/20160125122943_create_institutions.rb b/db/migrate/20160125122943_create_institutions.rb new file mode 100644 index 0000000000000000000000000000000000000000..b2d1ca55b3af8743a0836f1585f613c6c02ca0c6 --- /dev/null +++ b/db/migrate/20160125122943_create_institutions.rb @@ -0,0 +1,13 @@ +class CreateInstitutions < ActiveRecord::Migration + def change + create_table :institutions do |t| + t.string :name + t.string :address + t.string :city + t.string :country + t.text :description + + t.timestamps null: false + end + end +end diff --git a/db/migrate/20160125123423_create_collections.rb b/db/migrate/20160125123423_create_collections.rb new file mode 100644 index 0000000000000000000000000000000000000000..e325052aa8dc079bbe13dcd41144b8d89a93d065 --- /dev/null +++ b/db/migrate/20160125123423_create_collections.rb @@ -0,0 +1,13 @@ +class CreateCollections < ActiveRecord::Migration + def change + create_table :collections do |t| + t.string :name + t.text :description + t.string :privacy, default: 'private' + + t.references :owner, index: true, polymorphic: true + + t.timestamps null: false + end + end +end diff --git a/db/migrate/20160125124125_institutions_users.rb b/db/migrate/20160125124125_institutions_users.rb new file mode 100644 index 0000000000000000000000000000000000000000..1e1da18f7911a129348814505b0a7bf53ec2442e --- /dev/null +++ b/db/migrate/20160125124125_institutions_users.rb @@ -0,0 +1,10 @@ +class InstitutionsUsers < ActiveRecord::Migration + def change + create_table :institutions_users do |t| + t.integer :institution_id + t.integer :user_id + + t.timestamps null: false + end + end +end diff --git a/db/migrate/20160125124508_create_complaints.rb b/db/migrate/20160125124508_create_complaints.rb new file mode 100644 index 0000000000000000000000000000000000000000..1552127562b86827e1107330e14b54d25068f59b --- /dev/null +++ b/db/migrate/20160125124508_create_complaints.rb @@ -0,0 +1,12 @@ +class CreateComplaints < ActiveRecord::Migration + def change + create_table :complaints do |t| + t.text :description + t.belongs_to :user + t.belongs_to :learning_object + t.belongs_to :complaint_reason + + t.timestamps null: false + end + end +end diff --git a/db/migrate/20160125124545_create_complaint_reasons.rb b/db/migrate/20160125124545_create_complaint_reasons.rb new file mode 100644 index 0000000000000000000000000000000000000000..c5a2764e7de12ddfd9948a716d55f36bb8952b71 --- /dev/null +++ b/db/migrate/20160125124545_create_complaint_reasons.rb @@ -0,0 +1,9 @@ +class CreateComplaintReasons < ActiveRecord::Migration + def change + create_table :complaint_reasons do |t| + t.text :reason + + t.timestamps null: false + end + end +end diff --git a/db/migrate/20160125132447_create_bookmarks.rb b/db/migrate/20160125132447_create_bookmarks.rb new file mode 100644 index 0000000000000000000000000000000000000000..79e5cbed98c256237144eda5576b73a0df1ab645 --- /dev/null +++ b/db/migrate/20160125132447_create_bookmarks.rb @@ -0,0 +1,12 @@ +class CreateBookmarks < ActiveRecord::Migration + def change + create_table :bookmarks do |t| + t.references :user, index: true + t.references :bookmarkable, polymorphic: true, index: true + + t.timestamps null: false + end + + add_column :users, :bookmarks_count, :integer, default: 0 + end +end diff --git a/db/migrate/20160127135807_create_reviews.rb b/db/migrate/20160127135807_create_reviews.rb new file mode 100644 index 0000000000000000000000000000000000000000..dba1b25503dc8edf9616e977bd0cc6746c80d371 --- /dev/null +++ b/db/migrate/20160127135807_create_reviews.rb @@ -0,0 +1,15 @@ +class CreateReviews < ActiveRecord::Migration + def change + create_table :reviews do |t| + t.string :name + t.text :description + t.text :pros + t.text :cons + t.references :reviewable, polymorphic: true, index: true + + t.references :user, index: true + + t.timestamps null: false + end + end +end diff --git a/db/migrate/20160128115107_create_views.rb b/db/migrate/20160128115107_create_views.rb new file mode 100644 index 0000000000000000000000000000000000000000..4a4a68cbdd34743b1036b19f45ef638e8a106ebe --- /dev/null +++ b/db/migrate/20160128115107_create_views.rb @@ -0,0 +1,11 @@ +class CreateViews < ActiveRecord::Migration + def change + create_table :views do |t| + t.references :viewable, polymorphic: true, index: true + + t.references :user, index: true + + t.timestamps null: false + end + end +end diff --git a/db/migrate/20160128115428_create_downloads.rb b/db/migrate/20160128115428_create_downloads.rb new file mode 100644 index 0000000000000000000000000000000000000000..51e72c889239738bc00504ae7ae5e98eb1129ef8 --- /dev/null +++ b/db/migrate/20160128115428_create_downloads.rb @@ -0,0 +1,11 @@ +class CreateDownloads < ActiveRecord::Migration + def change + create_table :downloads do |t| + t.references :downloadable, polymorphic: true, index: true + + t.references :user, index: true + + t.timestamps null: false + end + end +end diff --git a/db/migrate/20160128115555_create_likes.rb b/db/migrate/20160128115555_create_likes.rb new file mode 100644 index 0000000000000000000000000000000000000000..72febb8fa4ac3c3f24c53fda6b73c73062a012a7 --- /dev/null +++ b/db/migrate/20160128115555_create_likes.rb @@ -0,0 +1,13 @@ +class CreateLikes < ActiveRecord::Migration + def change + create_table :likes do |t| + t.references :likeable, polymorphic: true, index: true + + t.references :user, index: true + + t.timestamps null: false + end + + add_index :likes, [:user_id, :likeable_id, :likeable_type], unique: true, name: 'user_and_likeable' + end +end diff --git a/db/migrate/20160128115721_create_shares.rb b/db/migrate/20160128115721_create_shares.rb new file mode 100644 index 0000000000000000000000000000000000000000..8ff08d5739fb38f1731a281ec9fd7500bff258e2 --- /dev/null +++ b/db/migrate/20160128115721_create_shares.rb @@ -0,0 +1,11 @@ +class CreateShares < ActiveRecord::Migration + def change + create_table :shares do |t| + t.references :shareable, polymorphic: true, index: true + + t.references :user, index: true + + t.timestamps null: false + end + end +end diff --git a/db/migrate/20160128122557_create_ratings.rb b/db/migrate/20160128122557_create_ratings.rb new file mode 100644 index 0000000000000000000000000000000000000000..5a03ba45194ac4403deedecb7228b7b45e2ef50a --- /dev/null +++ b/db/migrate/20160128122557_create_ratings.rb @@ -0,0 +1,9 @@ +class CreateRatings < ActiveRecord::Migration + def change + create_table :ratings do |t| + t.string :name + + t.timestamps null: false + end + end +end diff --git a/db/migrate/20160128123028_create_review_ratings.rb b/db/migrate/20160128123028_create_review_ratings.rb new file mode 100644 index 0000000000000000000000000000000000000000..f8f2d48caefc5a9d9854aa43b16503263676d882 --- /dev/null +++ b/db/migrate/20160128123028_create_review_ratings.rb @@ -0,0 +1,12 @@ +class CreateReviewRatings < ActiveRecord::Migration + def change + create_table :review_ratings do |t| + t.references :review, index: true + t.references :rating, index: true + + t.integer :value + + t.timestamps null: false + end + end +end diff --git a/db/migrate/20160128123901_create_follows.rb b/db/migrate/20160128123901_create_follows.rb new file mode 100644 index 0000000000000000000000000000000000000000..724308c4343ebcf729f4db37d0a893cc19e506a3 --- /dev/null +++ b/db/migrate/20160128123901_create_follows.rb @@ -0,0 +1,13 @@ +class CreateFollows < ActiveRecord::Migration + def change + create_table :follows do |t| + t.references :followable, polymorphic: true, index: true + + t.references :user, index: true + + t.timestamps null: false + end + + add_index :follows, [:user_id, :followable_id, :followable_type], unique: true, name: 'user_and_followable' + end +end diff --git a/db/migrate/20160128125336_create_collection_items.rb b/db/migrate/20160128125336_create_collection_items.rb new file mode 100644 index 0000000000000000000000000000000000000000..735387e2e3a61606590b3a07027f22be655c1d54 --- /dev/null +++ b/db/migrate/20160128125336_create_collection_items.rb @@ -0,0 +1,13 @@ +class CreateCollectionItems < ActiveRecord::Migration + def change + create_table :collection_items do |t| + t.references :collectionable, polymorphic: true, index: {name: "index_citems_on_ctype_and_cid"} + + t.references :collection, index: true + + t.integer :order + + t.timestamps null: false + end + end +end diff --git a/db/migrate/20160129191739_create_topic_highlights.rb b/db/migrate/20160129191739_create_topic_highlights.rb new file mode 100644 index 0000000000000000000000000000000000000000..62f79f78bd416ccb723da143328f5bfe2555a291 --- /dev/null +++ b/db/migrate/20160129191739_create_topic_highlights.rb @@ -0,0 +1,12 @@ +class CreateTopicHighlights < ActiveRecord::Migration + def change + create_table :topic_highlights do |t| + t.references :topic, index: true + t.references :learning_object, index: true + + t.timestamps null: false + end + add_foreign_key :topic_highlights, :topics + add_foreign_key :topic_highlights, :learning_objects + end +end diff --git a/db/migrate/20160130191533_create_topic_relationships.rb b/db/migrate/20160130191533_create_topic_relationships.rb new file mode 100644 index 0000000000000000000000000000000000000000..bd03053afb5a63b9aaa8cea9817ffe547b77c013 --- /dev/null +++ b/db/migrate/20160130191533_create_topic_relationships.rb @@ -0,0 +1,10 @@ +class CreateTopicRelationships < ActiveRecord::Migration + def change + create_table :topic_relationships do |t| + t.references :parent, index: true + t.references :child, index: true + + t.timestamps null: false + end + end +end diff --git a/db/migrate/20160131115733_add_counter_to_view_like_share_download.rb b/db/migrate/20160131115733_add_counter_to_view_like_share_download.rb new file mode 100644 index 0000000000000000000000000000000000000000..7df3a140b48f5d272e923c9c962e8b42a8968758 --- /dev/null +++ b/db/migrate/20160131115733_add_counter_to_view_like_share_download.rb @@ -0,0 +1,13 @@ +class AddCounterToViewLikeShareDownload < ActiveRecord::Migration + def change + add_column :learning_objects, :views_count, :integer, default: 0 + add_column :learning_objects, :downloads_count, :integer, default: 0 + add_column :learning_objects, :likes_count, :integer, default: 0 + add_column :learning_objects, :shares_count, :integer, default: 0 + + add_column :collections, :views_count, :integer, default: 0 + add_column :collections, :downloads_count, :integer, default: 0 + add_column :collections, :likes_count, :integer, default: 0 + add_column :collections, :shares_count, :integer, default: 0 + end +end diff --git a/db/migrate/20160201135415_create_learning_object_attachments.rb b/db/migrate/20160201135415_create_learning_object_attachments.rb new file mode 100644 index 0000000000000000000000000000000000000000..fbcdecef74ce086e64edba3726739c4824526a6f --- /dev/null +++ b/db/migrate/20160201135415_create_learning_object_attachments.rb @@ -0,0 +1,18 @@ +class CreateLearningObjectAttachments < ActiveRecord::Migration + def change + create_table :learning_object_attachments do |t| + t.string :name + t.string :link + t.string :retrieve_link + t.text :description + t.string :format + t.string :mime_type + t.integer :size + t.string :bundle_name + t.belongs_to :learning_object, index: true + + t.timestamps null: false + end + add_foreign_key :learning_object_attachments, :learning_objects + end +end diff --git a/db/migrate/20160201140345_remove_bitstreams_column_from_learning_objects.rb b/db/migrate/20160201140345_remove_bitstreams_column_from_learning_objects.rb new file mode 100644 index 0000000000000000000000000000000000000000..56da4dd0fffbfabf1e60ad481e3656b14208942c --- /dev/null +++ b/db/migrate/20160201140345_remove_bitstreams_column_from_learning_objects.rb @@ -0,0 +1,5 @@ +class RemoveBitstreamsColumnFromLearningObjects < ActiveRecord::Migration + def change + remove_column :learning_objects, :bitstreams + end +end diff --git a/db/migrate/20160202121737_add_state_column_for_learning_objects.rb b/db/migrate/20160202121737_add_state_column_for_learning_objects.rb new file mode 100644 index 0000000000000000000000000000000000000000..3597ebca1ef2edf9ebeb18b1878e063192948cb4 --- /dev/null +++ b/db/migrate/20160202121737_add_state_column_for_learning_objects.rb @@ -0,0 +1,5 @@ +class AddStateColumnForLearningObjects < ActiveRecord::Migration + def change + add_column :learning_objects, :state, :string, default: 'published' + end +end diff --git a/db/migrate/20160202134938_add_id_dspace_column_for_attachments.rb b/db/migrate/20160202134938_add_id_dspace_column_for_attachments.rb new file mode 100644 index 0000000000000000000000000000000000000000..f11460ceea8cd04c5be23dfc8d5e6f9c3e0aa91d --- /dev/null +++ b/db/migrate/20160202134938_add_id_dspace_column_for_attachments.rb @@ -0,0 +1,5 @@ +class AddIdDspaceColumnForAttachments < ActiveRecord::Migration + def change + add_column :learning_object_attachments, :id_dspace, :integer + end +end diff --git a/db/seeds.rb b/db/seeds.rb index 658adbf35b6cc6e8dd608da47241174be24b2163..dce80d0f0c00172a7423abb06578ffed91228f08 100644 --- a/db/seeds.rb +++ b/db/seeds.rb @@ -16,3 +16,11 @@ User.create!( password: '123mudar', roles: [Role.admin] ) + +# data for portalmec +Institution.create(name: 'C3SL/UFPR', address: 'Centro Politécnico', city: 'Curitiba', country: 'Brasil', description: 'Centro de Computação CientÃfica e Software Livre') +Institution.create(name: 'University of Colorado at Boulder, Physics Education Technology (PhET)') +Institution.create(name: 'TV Escola') +Institution.create(name: 'Portal DomÃnio Público') +Institution.create(name: 'Portal Dia-a-dia Educação') +Institution.create(name: 'Banco Internacional de Objetos Educacionais', description: 'Itens carregados do site http://objetoseducacionais2.mec.gov.br/') diff --git a/lib/bitstream/accepted_formats.rb b/lib/bitstream/accepted_formats.rb deleted file mode 100644 index 8b8088d0e86e1701fc3da15a59d151f3cc23f822..0000000000000000000000000000000000000000 --- a/lib/bitstream/accepted_formats.rb +++ /dev/null @@ -1,59 +0,0 @@ -module Bitstream - module AcceptedFormats - - def get_file_basename file - unless file.nil? - file_format = File.basename(file) - else - file_format = "" - end - file_format - end - - def get_file_extname file - unless file.nil? - file_name = File.extname(file) - else - file_name = "" - end - file_name - end - - def array_to_upcase array - upcase_array = [] - array.each do |a| - upcase_array << a.upcase - end - upcase_array - end - - def accepted_archive_formats - lower = [".zip", ".gzip", ".bzip", ".tar"] - upper = array_to_upcase lower - return lower + upper - end - - def accepted_video_formats - lower = [".mp4", ".wmv", ".3gp", ".asf", ".avi", ".flv", ".swf", ".mov", ".mpg", ".mpeg", ".rmvb", ".rm", ".vob", ".webm"] - upper = array_to_upcase lower - return lower + upper - end - - def accepted_image_formats - lower = [".jpg", ".jpeg", ".gif", ".png", ".bmp", ".tif", ".wmf"] - upper = array_to_upcase lower - return lower + upper - end - - def accepted_other_formats - lower = [".pdf", ".pps"] - upper = array_to_upcase lower - return lower + upper - end - - def accepted_formats - return accepted_video_formats + accepted_image_formats + accepted_other_formats - end - - end -end diff --git a/lib/bitstream/utils.rb b/lib/bitstream/utils.rb deleted file mode 100644 index a01ff78e697a00e68d03612c99896c452d82651c..0000000000000000000000000000000000000000 --- a/lib/bitstream/utils.rb +++ /dev/null @@ -1,122 +0,0 @@ -module Bitstream - module Utils - - include AcceptedFormats - - def clean_tmpfiles(workdir,files) - files.each do |f| - delete_file f - end - delete_dir workdir - end - - def tmpdir_path(id) - tmpdir = "/tmp/#{id}/" - create_dir tmpdir - return tmpdir - end - - def create_dir(dirname) - FileUtils.mkdir_p(dirname) unless File.directory?(dirname) - end - - def delete_dir(dir) - FileUtils.rmdir(dir) if File.directory?(dir) - end - - def delete_file(file) - FileUtils.rm(file) if File.exist?(file) - end - - def public_dir - @public_dir ||= Rails.root.join('public') - end - - def get_accepted_bitstreams(filename,retrieve_link,workdir) - - file_format = get_file_extname filename - - accepted_files = [] - - if accepted_formats.include? file_format or accepted_archive_formats.include? file_format - begin - file = workdir + filename - download_bitstream(retrieve_link,file) - rescue Exception => e - puts "#{method_log_tag} #{e}" - else - if accepted_archive_formats.include? file_format - extract_accepted_bitstreams(file,workdir).each do |f| - accepted_files << f - end - delete_file file - else - accepted_files << file - end - end - end - - return accepted_files - end - - def extract_accepted_bitstreams(archive_file,workdir) - - return [] if archive_file.nil? - - extracted_files = [] - - puts "#{method_log_tag} Extracting accepted files out from '#{get_file_basename(archive_file)}'" - begin - Archive.read_open_filename(archive_file) do |archive| - while entry = archive.next_header - if accepted_formats.include? get_file_extname(entry.pathname) - filename = get_file_basename(entry.pathname) - file = workdir + filename - begin - File.open(file, 'wb') do |f| - archive.read_data(1024) do |d| - f << d - end - end - rescue Exception => e - puts "#{method_log_tag} #{e} - \r#{method_log_tag} ERROR: Some error occurred while extracting file '#{filename}'" - else - puts "#{method_log_tag} SUCCESS: Extracted '#{filename}' to '#{file}'" - extracted_files << file - end - end - end - end - rescue Exception => e - puts "#{method_log_tag} #{e} - \r#{method_log_tag} ERROR: Some error occurred while extracting files from '#{get_file_basename(archive_file)}'" - end - - return extracted_files - end - - def download_bitstream(url,output) - puts "#{method_log_tag} Downloading bitstream: '#{url}' => '#{output}'" - begin - c = Curl::Easy.new(url) - c.ssl_verify_peer = false - c.ssl_verify_host = false - File.open(output, 'wb') do |f| - c.on_body {|data| f << data; data.size } - c.perform - end - rescue Exception => e - raise "#{method_log_tag} #{e} - \r#{method_log_tag} ERROR: Some error occurred during file download." - else - return true - end - end - - def method_log_tag - return "[#{caller_locations(1,1)[0].label}]" - end - - end -end diff --git a/lib/ranking/README.md b/lib/ranking/README.md deleted file mode 100644 index f41dc954faec97127360ce65987cec7704697365..0000000000000000000000000000000000000000 --- a/lib/ranking/README.md +++ /dev/null @@ -1,56 +0,0 @@ -# Ranking Module - -To use you'll need to instanciate a Rater, and call its method sortByRate with an Item array. (see below) - -The ranking module will generate ranking score for each item, order them by that score and return this ordered list. - -- **Input:** Array of Item -- **Output:** Ordered array of Item, most ranked coming first - -### Ranking::Item Class - -- +name+: name of object -- +views+: view count -- +downloads+: download count -- +likes+: like count -- +info+: anything, just for convinience of sorting it together, won't be modified - - -### Usage Example - -```ruby - -items = [] -items << Ranking::Item.new("ax",1,1,1,["otherStuffA","lala",'a']) -items << Ranking::Item.new("bx",2,2,2,[1,2,3,"teste","lblb",'b']) -items << Ranking::Item.new("cx",1,1,99,[3,2,1,"teste","lclc",'c']) - -rater = Ranking::Rater.new(Ranking::Strategies::BasicRater.new(1000, 1, 100)) -rater.sortByRate(items).each do |i| - p i.name -end -``` - -## Output - - ordered array of Items, starting from the most ranked to the least - -``` ruby -rater = Ranking::Rater.new( - Ranking::Strategies::BasicRater.new( - #define sorting weights - positionWeight = 1000, - useWeight = 1, - likeWeight = 100 - ) - ) - -sorted_item_array = rater.sortByRate(items) # Returns sorted array of items -``` - -### Sorting Weights - -| **Weight** | **Ranking Points** | -| :---------- | :-------------- | -| ***Position*** | If two items A and B are in positions 1(first) and 2, respectively, A will have [positionWeight] more rank points than B. This basically means that the higher the position weight the more dificult is to items change positions by likes, views and downloads. | -| ***Use*** | Ranking Points = [useWeight] * minimum ( views , downloads ) | -| ***Like*** | For each like, items receive [likeWeight] ranking points | diff --git a/lib/ranking/item.rb b/lib/ranking/item.rb deleted file mode 100644 index 33fc5009b43282fb1ab453f477ff8fcbadd47ae3..0000000000000000000000000000000000000000 --- a/lib/ranking/item.rb +++ /dev/null @@ -1,18 +0,0 @@ -# This class represents an item of ranking -class Ranking::Item - # name = name of object - # views = view count - # downloads = download count - # likes = like count - # info = just for convinience of sorting it together, won't be touched - attr_accessor :name, :views, :downloads, :likes, :info - - def initialize(name, views = 0, downloads = 0, likes = 0, info = nil) - @name = name - @views = views - @downloads = downloads - @likes = likes - @info = info - end - -end \ No newline at end of file diff --git a/lib/ranking/rated_item.rb b/lib/ranking/rated_item.rb deleted file mode 100644 index baa5aa8ec8a304efd2bdbad02187b7093b0e7ea7..0000000000000000000000000000000000000000 --- a/lib/ranking/rated_item.rb +++ /dev/null @@ -1,10 +0,0 @@ -# This class represents an item rated in ranking -# Have an association with a rank item -class Ranking::RatedItem - attr_accessor :item, :rate - - def initialize(item, rate) - @item = item - @rate = rate - end -end \ No newline at end of file diff --git a/lib/ranking/rater.rb b/lib/ranking/rater.rb deleted file mode 100644 index 75b3d40181a6f580dfef543a4e56e872e59edb74..0000000000000000000000000000000000000000 --- a/lib/ranking/rater.rb +++ /dev/null @@ -1,11 +0,0 @@ -class Ranking::Rater - - def initialize(rater_strategy) - @rater = rater_strategy - end - - def sortByRate(items) - @rater.sortByRate items - end - -end \ No newline at end of file diff --git a/lib/ranking/strategies/basic_rater.rb b/lib/ranking/strategies/basic_rater.rb deleted file mode 100644 index d88d4951319be14be40f90ce16d2c461c249ca27..0000000000000000000000000000000000000000 --- a/lib/ranking/strategies/basic_rater.rb +++ /dev/null @@ -1,22 +0,0 @@ -class Ranking::Strategies::BasicRater < Ranking::Strategy - - def sortByRate(items) - items.zip( items.size.downto(1) ) - .collect { |item,reverseIndex| rateItem( item, reverseIndex ) } - .sort { |itemA,itemB| itemA.rate <=> itemB.rate } - .collect { |ri| ri.item } - .reverse # Best ranked comes first - end - - private - - def rateItem(item, inversePosition) - positionRating = inversePosition * @positionWeight - useRating = (item.downloads < item.views ? item.downloads : item.views) * @useWeight - likeRating = item.likes * @likeWeight - - rate = positionRating + useRating + likeRating - build_rated_item item, rate - end - -end diff --git a/lib/ranking/strategy.rb b/lib/ranking/strategy.rb deleted file mode 100644 index 3568addcb0a194e276c2f603019c9a51b2d5494a..0000000000000000000000000000000000000000 --- a/lib/ranking/strategy.rb +++ /dev/null @@ -1,15 +0,0 @@ -class Ranking::Strategy - - def initialize(positionWeight = 1000, useWeight = 3, likeWeight = 100) - @positionWeight = positionWeight - @useWeight = useWeight - @likeWeight = likeWeight - end - - protected - - def build_rated_item(item, rate) - Ranking::RatedItem.new(item, rate) - end - -end \ No newline at end of file diff --git a/lib/search_engine/dspace_solr.rb b/lib/search_engine/dspace_solr.rb deleted file mode 100644 index 4ddc03ced7b015e260e28a8c581415017df37bab..0000000000000000000000000000000000000000 --- a/lib/search_engine/dspace_solr.rb +++ /dev/null @@ -1,64 +0,0 @@ -module SearchEngine - module DspaceSolr - - def search(qry) - - queryParams = merge_search_parameters( - {:q => '*:*', :fq => qry}, - solr_search_default_parameters - ) - results = solr_client.get 'select', :params => queryParams - objectsFound = select_items_from_results(results) - - return objectsFound - end - - private - - #Resource types: - # 2 = Item - # 3 = Collection - # 4 = Community - def select_items_from_results(results) - resultList = Set.new - results["response"]["docs"].select { |r| - r["search.resourcetype"].to_i.equal? 2 - }.each do |i| - resultList.add i - end - return resultList - end - - def solr_client - return RSolr.connect :url => 'http://portalmecdev.c3sl.ufpr.br:8080/solr/search/' - end - - def merge_search_parameters(p1, p2) - return p1.merge(p2) { |key,oldval,newval| key = [newval,oldval].flatten } - end - - def solr_search_default_parameters - return { - "fl"=>[" - search.resourcetype, search.resourceid, - handle, author, title, dc.description - "], - "type"=>"0", - "start"=>"0", - "rows"=>"1000", - "facet"=>"true", - "facet.offset"=>"0", - "facet.mincount"=>"1", - "f.subject_tax_0_filter.facet.sort"=>"count", - "f.subject_tax_0_filter.facet.limit"=>"11", - "f.author_filter.facet.limit"=>"11", - "f.dateIssued.year.facet.sort"=>"index", - "f.dateIssued.year.facet.limit"=>"10", - "f.author_filter.facet.sort"=>"count", - "facet.field"=>["author_filter","subject_tax_0_filter","dateIssued.year"], - "fq"=>["NOT(withdrawn:true)","NOT(discoverable:false)","read:(g0 OR g0)"] - } - end - - end -end diff --git a/lib/tasks/dspace.rake b/lib/tasks/dspace.rake index 76315b4026796d36140da1887c3a9c790d54c5db..6b9d1efcce51ada2c0fb8958fb29552746bf7f2f 100644 --- a/lib/tasks/dspace.rake +++ b/lib/tasks/dspace.rake @@ -13,7 +13,7 @@ namespace :dspace do logger.level = Log::DatabaseLogger::CREATE # Quantity of items fetched on each iteration - limit = 500 + limit = 1000 # Start point from where items will be fetched offset = 0 @@ -24,7 +24,7 @@ namespace :dspace do begin # Get items from dspace (from offset to offset+limit) - dspace_items = get_items_from_dspace(limit,offset, ['metadata','bitstreams']) + dspace_items = get_items_from_dspace(limit, offset, ['metadata', 'bitstreams']) rescue => e logger.warn "Database error, going to sleep" logger.error e @@ -36,6 +36,12 @@ namespace :dspace do # Terminate loop if there are no more items to import break if dspace_items.empty? + # continue if receive an error string + if dspace_items.is_a? String + logger.warn "Received a string instead of items: #{dspace_items}" + next + end + # Increment offset, to get new items on next iteration offset = offset + limit @@ -43,15 +49,8 @@ namespace :dspace do # Verifies if item is already on repository # Initializes new LearningObjects # and saves them on LearningObjects's repository - dspace_items.each do |item| - result = learning_object_repository.get_by_dspace_id item.id - if result.nil? - learning_object = initialize_learning_object item - learning_object_repository.create learning_object - # Comment the line below if you don't want print the itens - logger.create "Imported: #{item.id} -> #{learning_object.id} " - end - end + importer = Dspace::LearningObjectImporter.new(dspace_items) + importer.import { |learning_object| logger.create "Imported: #{learning_object.id_dspace} -> #{learning_object.id}" } end end logger.close @@ -74,7 +73,7 @@ namespace :dspace do begin # Get items from dspace (from offset to offset+limit) - dspace_items = get_items_from_dspace(limit,offset, ['parentCollection']) + dspace_items = get_items_from_dspace(limit, offset, ['parentCollection']) rescue # Sleeps for a while to wait database's recovery sleep(10.seconds) @@ -126,8 +125,8 @@ namespace :dspace do def get_items_from_dspace(limit, offset, expand=[]) dspace_repository.items.all( - expand: expand, - limit: limit, offset: offset + expand: expand.join(','), + limit: limit, offset: offset ) end @@ -136,38 +135,16 @@ namespace :dspace do current_date = Time.now inst = Institution.new( - :name => item.name, - :last_modified => current_date, - :created_at => current_date, - :country => "", - :city => "", - :description => item.short_description + :name => item.name, + :last_modified => current_date, + :created_at => current_date, + :country => "", + :city => "", + :description => item.short_description ) end - def initialize_learning_object item - metadata = build_array_of(item.metadata) - bitstreams = build_array_of(item.bit_streams) - current_date = Time.now - - lo = LearningObject.new( - :name => item.name, - :last_modified => current_date, - :created_at => current_date, - :id_dspace => item.id, - :thumbnail => nil, - :bitstreams => bitstreams, - :metadata => metadata - ) - lo.author = lo.get_metadata_values_of("dc.contributor.author").join(', ') - lo.description = lo.get_metadata_value_of("dc.description") - lo.type = lo.get_metadata_value_of("dc.type") - date = lo.get_metadata_value_of("dc.date.issued") - lo.published_at = Time.iso8601(date) unless date.nil? - lo - end - def build_array_of(item_content=[]) return item_content if item_content.nil? content_array = [] diff --git a/lib/tasks/mainPage.rake b/lib/tasks/mainPage.rake deleted file mode 100644 index bb6e25e0c90acd0dc5a38358aeb351779d7be14d..0000000000000000000000000000000000000000 --- a/lib/tasks/mainPage.rake +++ /dev/null @@ -1,37 +0,0 @@ -namespace :mainPage do - desc "Generate the MainPage" - task :highlights => :environment do - include RepositoriesProxy - # repository = Portalmec::Application.repository - puts 'Generate the main page subject highlights' - general_highlights = Array.new - subjects = subject_repository.all - subjects.each do |subject| - # select all the learning objects about that subject - objects = subject.learning_objects - # transform the objects to RankingItem - objects = objects.collect do |object| - Ranking::Item.new(object.id,object.views,object.downloads,object.likes) - end - # rank them - rater = Ranking::Rater.new(Ranking::Strategies::BasicRater.new(0,1,100)) - objects = rater.sortByRate(objects) - # select the five first objects to the general highlight - (general_highlights << objects.take(5)).flatten! - - # add the object to the subject highlight - puts subject.name - subject_repository.update(subject.id,'set','highlights','[]') - objects.each do |object| - subject_repository.update(subject.id,'add','highlights',object.name) - end - end - puts 'Generating the main page highlights' - mainPage = main_page_repository.all.first - rid = mainPage['@rid'] - main_page_repository.update(rid,'set','highlights','[]') - general_highlights.each do |general_highlight| - main_page_repository.update(rid,'add','highlights',general_highlight.name) - end - end -end diff --git a/lib/tasks/orientdb.rake b/lib/tasks/orientdb.rake index 3508f153293b0c501b66b8c9b9744b0979b50d39..5f39f9dea65dafb55397d8c571949619ffa2b745 100644 --- a/lib/tasks/orientdb.rake +++ b/lib/tasks/orientdb.rake @@ -102,7 +102,7 @@ namespace :orientdb do lo.attributes << helper.get_attribute(key, v, create_first_attr) end end - + # Create LearningObject relations that were added to its attrs learning_object_repository.create_relations(lo) end @@ -118,7 +118,7 @@ namespace :orientdb do include RepositoriesProxy include Log::Logging - + args.with_defaults(:log => STDOUT) Log::Logging.logger = Log::DatabaseLogger.new(args.log) logger.level = Log::DatabaseLogger::UPDATE @@ -131,4 +131,45 @@ namespace :orientdb do logger.close end + + task :import_subjects, [:log] => [:environment] do |t, args| + include RepositoriesProxy + include Log::Logging + + args.with_defaults(:log => STDOUT) + Log::Logging.logger = Log::DatabaseLogger.new(args.log) + logger.level = Log::DatabaseLogger::UPDATE + + subject_repository.all.each do |subject| + Topic.where(name: subject.name).first_or_create + end + + logger.info "all topics imported!" + + subject_repository.all.each do |subject| + topic = Topic.where(name: subject.name).first_or_create + + subject_repository.get_subtopics(subject).each do |subtopic| + subtopic = Topic.where(name: subtopic.name).first_or_create + + TopicRelationship.create(parent: topic, child: subtopic) + end + + subject_repository.get_learning_objects(subject).each do |lo| + object = LearningObject.where(id_dspace: lo.id_dspace) + + topic.learning_objects << object unless object.blank? + end + + subject_repository.get_highlights(subject).each do |highlight| + object = LearningObject.where(id_dspace: highlight.id_dspace) + + topic.highlights << object unless object.blank? + end + + logger.info "topic '#{topic.name}' associations imported!" + end + + logger.info "all topics associations imported!" + end end diff --git a/test/fixtures/bookmarks.yml b/test/fixtures/bookmarks.yml new file mode 100644 index 0000000000000000000000000000000000000000..d9098d9934714fbe4ea20f4003a7c8beacfb73c6 --- /dev/null +++ b/test/fixtures/bookmarks.yml @@ -0,0 +1,7 @@ +# Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html + +one: + user_id: + +two: + user_id: diff --git a/test/fixtures/collection_items.yml b/test/fixtures/collection_items.yml new file mode 100644 index 0000000000000000000000000000000000000000..937a0c002e426861e33bb25a2a8ce2b20b3efaa3 --- /dev/null +++ b/test/fixtures/collection_items.yml @@ -0,0 +1,11 @@ +# Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html + +# This model initially had no columns defined. If you add columns to the +# model remove the '{}' from the fixture names and add the columns immediately +# below each fixture, per the syntax in the comments below +# +one: {} +# column: value +# +two: {} +# column: value diff --git a/test/fixtures/collections.yml b/test/fixtures/collections.yml new file mode 100644 index 0000000000000000000000000000000000000000..be5d2e5138faca1e2c1b2c1a69b6fd2db1c3422a --- /dev/null +++ b/test/fixtures/collections.yml @@ -0,0 +1,11 @@ +# Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html + +one: + name: MyString + description: MyText + privacy: MyString + +two: + name: MyString + description: MyText + privacy: MyString diff --git a/test/fixtures/complaint_reasons.yml b/test/fixtures/complaint_reasons.yml new file mode 100644 index 0000000000000000000000000000000000000000..da295fd51a59cdbdc988d07823748ad7a3772934 --- /dev/null +++ b/test/fixtures/complaint_reasons.yml @@ -0,0 +1,7 @@ +# Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html + +one: + reason: MyText + +two: + reason: MyText diff --git a/test/fixtures/complaints.yml b/test/fixtures/complaints.yml new file mode 100644 index 0000000000000000000000000000000000000000..2e0c8cd169031d5a07b8f13b498743093d6310b7 --- /dev/null +++ b/test/fixtures/complaints.yml @@ -0,0 +1,7 @@ +# Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html + +one: + description: MyText + +two: + description: MyText diff --git a/test/fixtures/downloads.yml b/test/fixtures/downloads.yml new file mode 100644 index 0000000000000000000000000000000000000000..1afd2aa2c6cc5e33cf90cf2d48fe9b3f20b3a653 --- /dev/null +++ b/test/fixtures/downloads.yml @@ -0,0 +1,7 @@ +# Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html + +one: + date: 2016-01-28 09:54:28 + +two: + date: 2016-01-28 09:54:28 diff --git a/test/fixtures/follows.yml b/test/fixtures/follows.yml new file mode 100644 index 0000000000000000000000000000000000000000..937a0c002e426861e33bb25a2a8ce2b20b3efaa3 --- /dev/null +++ b/test/fixtures/follows.yml @@ -0,0 +1,11 @@ +# Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html + +# This model initially had no columns defined. If you add columns to the +# model remove the '{}' from the fixture names and add the columns immediately +# below each fixture, per the syntax in the comments below +# +one: {} +# column: value +# +two: {} +# column: value diff --git a/test/fixtures/institutions.yml b/test/fixtures/institutions.yml new file mode 100644 index 0000000000000000000000000000000000000000..fe0cfd491980a84ebfad5d27bfdfd4c03156ecf9 --- /dev/null +++ b/test/fixtures/institutions.yml @@ -0,0 +1,15 @@ +# Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html + +one: + name: MyString + address: MyString + city: MyString + country: MyString + description: MyText + +two: + name: MyString + address: MyString + city: MyString + country: MyString + description: MyText diff --git a/test/fixtures/learning_object/attachments.yml b/test/fixtures/learning_object/attachments.yml new file mode 100644 index 0000000000000000000000000000000000000000..cf9b5d498a8df28b59ea854eb13a353b00f3f5a6 --- /dev/null +++ b/test/fixtures/learning_object/attachments.yml @@ -0,0 +1,23 @@ +# Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html + +one: + name: MyString + link: MyString + retrieve_link: MyString + description: MyText + format: MyString + mime_type: MyString + size: 1 + bundle_name: MyString + learning_object_id: + +two: + name: MyString + link: MyString + retrieve_link: MyString + description: MyText + format: MyString + mime_type: MyString + size: 1 + bundle_name: MyString + learning_object_id: diff --git a/test/fixtures/learning_objects.yml b/test/fixtures/learning_objects.yml new file mode 100644 index 0000000000000000000000000000000000000000..7c75fb6710d6fc594b31b98a3a5d720bf587e0ff --- /dev/null +++ b/test/fixtures/learning_objects.yml @@ -0,0 +1,25 @@ +# Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html + +one: + id_dspace: 1 + name: MyString + author: MyString + description: MyText + published_at: 2016-01-25 10:09:28 + type: + score: 1 + school_level: 1 + language: MyString + keywords: MyText + +two: + id_dspace: 1 + name: MyString + author: MyString + description: MyText + published_at: 2016-01-25 10:09:28 + type: + score: 1 + school_level: 1 + language: MyString + keywords: MyText diff --git a/test/fixtures/likes.yml b/test/fixtures/likes.yml new file mode 100644 index 0000000000000000000000000000000000000000..9dc57b68dd5ad1d883dda1bc093a8900ef1e745e --- /dev/null +++ b/test/fixtures/likes.yml @@ -0,0 +1,7 @@ +# Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html + +one: + date: 2016-01-28 09:55:55 + +two: + date: 2016-01-28 09:55:55 diff --git a/test/fixtures/metadata.yml b/test/fixtures/metadata.yml new file mode 100644 index 0000000000000000000000000000000000000000..fe5d943f69d2c6a8061a1f0adf2ee2ccecc29f81 --- /dev/null +++ b/test/fixtures/metadata.yml @@ -0,0 +1,11 @@ +# Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html + +one: + key: MyString + value: MyText + language: MyString + +two: + key: MyString + value: MyText + language: MyString diff --git a/test/fixtures/ratings.yml b/test/fixtures/ratings.yml new file mode 100644 index 0000000000000000000000000000000000000000..56066c68af42f307f5780e9ac146e3651cea3979 --- /dev/null +++ b/test/fixtures/ratings.yml @@ -0,0 +1,7 @@ +# Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html + +one: + name: MyString + +two: + name: MyString diff --git a/test/fixtures/review_ratings.yml b/test/fixtures/review_ratings.yml new file mode 100644 index 0000000000000000000000000000000000000000..8572d47bb22aff1982ccd334b08f16f0cb1bd027 --- /dev/null +++ b/test/fixtures/review_ratings.yml @@ -0,0 +1,9 @@ +# Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html + +one: + review: + rating: + +two: + review: + rating: diff --git a/test/fixtures/reviews.yml b/test/fixtures/reviews.yml new file mode 100644 index 0000000000000000000000000000000000000000..de59d391dbd04461c963962a78e1761c203693d9 --- /dev/null +++ b/test/fixtures/reviews.yml @@ -0,0 +1,15 @@ +# Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html + +one: + name: MyString + description: MyText + pros: MyText + cons: MyText + reviewable_id: + +two: + name: MyString + description: MyText + pros: MyText + cons: MyText + reviewable_id: diff --git a/test/fixtures/shares.yml b/test/fixtures/shares.yml new file mode 100644 index 0000000000000000000000000000000000000000..18c323239a0eec3362ec5b1f64da298702dc123a --- /dev/null +++ b/test/fixtures/shares.yml @@ -0,0 +1,7 @@ +# Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html + +one: + date: 2016-01-28 09:57:21 + +two: + date: 2016-01-28 09:57:21 diff --git a/test/fixtures/subjects.yml b/test/fixtures/subjects.yml new file mode 100644 index 0000000000000000000000000000000000000000..56066c68af42f307f5780e9ac146e3651cea3979 --- /dev/null +++ b/test/fixtures/subjects.yml @@ -0,0 +1,7 @@ +# Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html + +one: + name: MyString + +two: + name: MyString diff --git a/test/fixtures/topic_highlights.yml b/test/fixtures/topic_highlights.yml new file mode 100644 index 0000000000000000000000000000000000000000..2d9646a7ee4cb282a40ccdf6a949543ece5b364c --- /dev/null +++ b/test/fixtures/topic_highlights.yml @@ -0,0 +1,9 @@ +# Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html + +one: + subject_id: + learning_object_id: + +two: + subject_id: + learning_object_id: diff --git a/test/fixtures/topic_relationships.yml b/test/fixtures/topic_relationships.yml new file mode 100644 index 0000000000000000000000000000000000000000..937a0c002e426861e33bb25a2a8ce2b20b3efaa3 --- /dev/null +++ b/test/fixtures/topic_relationships.yml @@ -0,0 +1,11 @@ +# Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html + +# This model initially had no columns defined. If you add columns to the +# model remove the '{}' from the fixture names and add the columns immediately +# below each fixture, per the syntax in the comments below +# +one: {} +# column: value +# +two: {} +# column: value diff --git a/test/fixtures/views.yml b/test/fixtures/views.yml new file mode 100644 index 0000000000000000000000000000000000000000..2450a5d83c100365f3b24912a5ba086970603d0a --- /dev/null +++ b/test/fixtures/views.yml @@ -0,0 +1,7 @@ +# Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html + +one: + date: 2016-01-28 09:51:07 + +two: + date: 2016-01-28 09:51:07 diff --git a/test/models/bookmark_test.rb b/test/models/bookmark_test.rb new file mode 100644 index 0000000000000000000000000000000000000000..5051073b52ebb4119518c2adb27978a85817d2eb --- /dev/null +++ b/test/models/bookmark_test.rb @@ -0,0 +1,7 @@ +require 'test_helper' + +class BookmarkTest < ActiveSupport::TestCase + # test "the truth" do + # assert true + # end +end diff --git a/test/models/collection_item_test.rb b/test/models/collection_item_test.rb new file mode 100644 index 0000000000000000000000000000000000000000..550996a8c0c8f0bfb2d3e41617501655ec722805 --- /dev/null +++ b/test/models/collection_item_test.rb @@ -0,0 +1,7 @@ +require 'test_helper' + +class CollectionItemTest < ActiveSupport::TestCase + # test "the truth" do + # assert true + # end +end diff --git a/test/models/collection_test.rb b/test/models/collection_test.rb index eac7a38bfd207529fac40053bc58f206de882290..4f73670750e0f2ab0d70425f7d880dd2ab9da7b2 100644 --- a/test/models/collection_test.rb +++ b/test/models/collection_test.rb @@ -1,55 +1,7 @@ require 'test_helper' class CollectionTest < ActiveSupport::TestCase - - test 'collection is invalid when name attribute is empty' do - collection = Collection.new - assert !collection.valid? - end - - test 'collection is valid when name attribute is not empty' do - collection = Collection.new(name: 'Minha coleção de teste') - assert collection.valid? - end - - test 'append learning objects to collection' do - collection = Collection.new(name: 'Minha coleção de teste') - collection.add LearningObject.new - collection.add LearningObject.new - - assert_count 2, collection.learning_objects - end - - test 'remove learning object from collection' do - lo1 = LearningObject.new(id: '#45:2') - collection = Collection.new(name: 'Minha coleção de teste') - collection.add lo1 - collection.add LearningObject.new(id: '#43:34') - assert_count 2, collection.learning_objects - - collection.remove lo1 - assert_count 1, collection.learning_objects - end - - test 'serialize collection for orientdb' do - collection = Collection.new(name: 'Minha coleção de teste') - assert_equal(build_collection_hash(collection), collection.to_orientdb_hash) - #collection.add LearningObject.new(id: '#43:34') - #collection.add LearningObject.new(id: '#43:53') - #assert_equal({"@class" => "Collection", "created_at" => "2015-11-18 16:10:52", "last_modified" => "2015-11-18 16:10:52", "learning_objects" => ['#43:34', '#43:53'], "privacy" => "private", "name" => "Minha coleção de teste"}, collection.to_orientdb_hash) - end - - private - - def build_collection_hash(collection) - { - "@class" => "Collection", - "created_at" => collection.created_at, - "last_modified" => collection.last_modified, - "learning_objects" => [], - "privacy" => collection.privacy, - "name" => collection.name - } - end - -end \ No newline at end of file + # test "the truth" do + # assert true + # end +end diff --git a/test/models/complaint_reason_test.rb b/test/models/complaint_reason_test.rb new file mode 100644 index 0000000000000000000000000000000000000000..940c0c24c1ec5b1f1822a186f246db882a1e30ac --- /dev/null +++ b/test/models/complaint_reason_test.rb @@ -0,0 +1,7 @@ +require 'test_helper' + +class ComplaintReasonTest < ActiveSupport::TestCase + # test "the truth" do + # assert true + # end +end diff --git a/test/models/complaint_test.rb b/test/models/complaint_test.rb index 02a3bb18a66da317ecefcd4b2db5dd8cc9278388..ccd8f10a73688f4a7b14721e33455616cd7e3478 100644 --- a/test/models/complaint_test.rb +++ b/test/models/complaint_test.rb @@ -1,42 +1,7 @@ require 'test_helper' class ComplaintTest < ActiveSupport::TestCase - should validate_presence_of :user - should validate_presence_of :object - should validate_presence_of :message - - test 'serialize for orientdb' do - complaint = Complaint.new( - user: User.new(rid: '#14:15'), - object: LearningObject.new(id: '#16:43'), - message: Complaint.copyrights, - description: 'teste', - created_at: DateTime.now.strftime("%Y-%m-%d %H:%M:%S") - ) - - expected_hash = {"created_at" => complaint.created_at.to_s, "description" => complaint.description, "message" => complaint.message.to_s} - assert_equal(expected_hash, complaint.to_orientdb_hash) - end - - test 'should returns copyright message' do - assert_complaint_message Complaint.copyrights - end - - test 'should returns ofensive content message' do - assert_complaint_message Complaint.ofensive_content - end - - test 'should returns ofensive user message' do - assert_complaint_message Complaint.ofensive_user - end - - test 'should returns fake user message' do - assert_complaint_message Complaint.fake_user - end - - private - - def assert_complaint_message(complaint_message) - assert_instance_of ComplaintMessage, complaint_message - end + # test "the truth" do + # assert true + # end end diff --git a/test/models/download_test.rb b/test/models/download_test.rb new file mode 100644 index 0000000000000000000000000000000000000000..471c30070e50d48ce3b1e10e4f07bd277878dc37 --- /dev/null +++ b/test/models/download_test.rb @@ -0,0 +1,7 @@ +require 'test_helper' + +class DownloadTest < ActiveSupport::TestCase + # test "the truth" do + # assert true + # end +end diff --git a/test/models/follow_test.rb b/test/models/follow_test.rb new file mode 100644 index 0000000000000000000000000000000000000000..e314829c2feb503f9432c654d782da44df27ef39 --- /dev/null +++ b/test/models/follow_test.rb @@ -0,0 +1,7 @@ +require 'test_helper' + +class FollowTest < ActiveSupport::TestCase + # test "the truth" do + # assert true + # end +end diff --git a/test/models/institution_test.rb b/test/models/institution_test.rb new file mode 100644 index 0000000000000000000000000000000000000000..1bfb14f7160add281dda354154be23c3b52e09df --- /dev/null +++ b/test/models/institution_test.rb @@ -0,0 +1,7 @@ +require 'test_helper' + +class InstitutionTest < ActiveSupport::TestCase + # test "the truth" do + # assert true + # end +end diff --git a/test/models/learning_object/attachment_test.rb b/test/models/learning_object/attachment_test.rb new file mode 100644 index 0000000000000000000000000000000000000000..bb5827e84db32533af7aec00b87dffd4effa6b7f --- /dev/null +++ b/test/models/learning_object/attachment_test.rb @@ -0,0 +1,7 @@ +require 'test_helper' + +class LearningObject::AttachmentTest < ActiveSupport::TestCase + # test "the truth" do + # assert true + # end +end diff --git a/test/models/learning_object_test.rb b/test/models/learning_object_test.rb index 3a7c972ea22a714e93b038298a11c7c1db55d486..c37c3d8078e4090bc576e56276b62549e38caa4e 100644 --- a/test/models/learning_object_test.rb +++ b/test/models/learning_object_test.rb @@ -1,25 +1,7 @@ require 'test_helper' class LearningObjectTest < ActiveSupport::TestCase - should validate_presence_of(:name) - should validate_presence_of(:created_at) - should validate_presence_of(:type) - - test 'serialize for orientdb' do - learning_object = LearningObject.new( - id: '#15:23', - name: 'Teste', - description: 'teste de serialização', - thumbnail: '/asdasdasd.jpg', - id_dspace: '123213', - type: 'image', - attachment: LearningObject::Attachment.new('[{"id":2203,"name":"Pontociencia_Efe_chamas_na_horizontal.flv","type":"bitstream","link":"/rest/bitstreams/2203","bundleName":"ORIGINAL","description":null,"format":"Unknown","mimeType":"application/octet-stream","sizeBytes":4108209,"parentObject":null,"retrieveLink":"/bitstreams/2203/retrieve","checkSum":{"value":"43bd43bea944dcb8708d6ec708fb510d","checkSumAlgorithm":"MD5"},"sequenceId":-1,"policies":null,"expand":["parent","policies","all"]}]'), - last_modified: '2015-03-10 15:33:45', - metadata: [] - ) - - expected_hash = {"@class" => "LearningObject", "score" => 0, "name" => "Teste", "description" => "teste de serialização", "thumbnail" => "/asdasdasd.jpg", "id_dspace" => "123213", "type" => "image", "last_modified" => "2015-03-10 15:33:45", "metadata" => [], "bitstreams" => "[{\"id\":2203,\"name\":\"Pontociencia_Efe_chamas_na_horizontal.flv\",\"type\":\"bitstream\",\"link\":\"/rest/bitstreams/2203\",\"bundleName\":\"ORIGINAL\",\"description\":null,\"format\":\"Unknown\",\"mimeType\":\"application/octet-stream\",\"sizeBytes\":4108209,\"parentObject\":null,\"retrieveLink\":\"/bitstreams/2203/retrieve\",\"checkSum\":{\"value\":\"43bd43bea944dcb8708d6ec708fb510d\",\"checkSumAlgorithm\":\"MD5\"},\"sequenceId\":-1,\"policies\":null,\"expand\":[\"parent\",\"policies\",\"all\"]}]"} - assert_equal(expected_hash, learning_object.to_orientdb_hash) - end - + # test "the truth" do + # assert true + # end end diff --git a/test/models/like_test.rb b/test/models/like_test.rb new file mode 100644 index 0000000000000000000000000000000000000000..1eea9915b68a28a21919fb50394338431984af7b --- /dev/null +++ b/test/models/like_test.rb @@ -0,0 +1,7 @@ +require 'test_helper' + +class LikeTest < ActiveSupport::TestCase + # test "the truth" do + # assert true + # end +end diff --git a/test/models/metadatum_test.rb b/test/models/metadatum_test.rb new file mode 100644 index 0000000000000000000000000000000000000000..1fd95dbec6d44f86691843c5ee686c0150588d93 --- /dev/null +++ b/test/models/metadatum_test.rb @@ -0,0 +1,7 @@ +require 'test_helper' + +class MetadatumTest < ActiveSupport::TestCase + # test "the truth" do + # assert true + # end +end diff --git a/test/models/rating_test.rb b/test/models/rating_test.rb new file mode 100644 index 0000000000000000000000000000000000000000..febf8586ae3878c3996c4f3102f7fa75b84a12c7 --- /dev/null +++ b/test/models/rating_test.rb @@ -0,0 +1,7 @@ +require 'test_helper' + +class RatingTest < ActiveSupport::TestCase + # test "the truth" do + # assert true + # end +end diff --git a/test/models/review_rating_test.rb b/test/models/review_rating_test.rb new file mode 100644 index 0000000000000000000000000000000000000000..d4c6ce96df2d1d05430046b8a1923cce09344e62 --- /dev/null +++ b/test/models/review_rating_test.rb @@ -0,0 +1,7 @@ +require 'test_helper' + +class ReviewRatingTest < ActiveSupport::TestCase + # test "the truth" do + # assert true + # end +end diff --git a/test/models/review_test.rb b/test/models/review_test.rb new file mode 100644 index 0000000000000000000000000000000000000000..11aa5204f0dd5b20006590706ee5d4179cae2b0a --- /dev/null +++ b/test/models/review_test.rb @@ -0,0 +1,7 @@ +require 'test_helper' + +class ReviewTest < ActiveSupport::TestCase + # test "the truth" do + # assert true + # end +end diff --git a/test/models/share_test.rb b/test/models/share_test.rb new file mode 100644 index 0000000000000000000000000000000000000000..199d2709b3512e02b7c1aba7feafdb18b19aa76d --- /dev/null +++ b/test/models/share_test.rb @@ -0,0 +1,7 @@ +require 'test_helper' + +class ShareTest < ActiveSupport::TestCase + # test "the truth" do + # assert true + # end +end diff --git a/test/models/subject_test.rb b/test/models/subject_test.rb new file mode 100644 index 0000000000000000000000000000000000000000..d54e76f758ea59928ad5c1d8d014fddbaf3eb378 --- /dev/null +++ b/test/models/subject_test.rb @@ -0,0 +1,7 @@ +require 'test_helper' + +class SubjectTest < ActiveSupport::TestCase + # test "the truth" do + # assert true + # end +end diff --git a/test/models/topic_highlight_test.rb b/test/models/topic_highlight_test.rb new file mode 100644 index 0000000000000000000000000000000000000000..713a19b743250ba8747c320795a5ec79896c7f22 --- /dev/null +++ b/test/models/topic_highlight_test.rb @@ -0,0 +1,7 @@ +require 'test_helper' + +class HighlightTest < ActiveSupport::TestCase + # test "the truth" do + # assert true + # end +end diff --git a/test/models/topic_relationship_test.rb b/test/models/topic_relationship_test.rb new file mode 100644 index 0000000000000000000000000000000000000000..aafd0d273d62c8629edac0697975fa2c36f1c9b3 --- /dev/null +++ b/test/models/topic_relationship_test.rb @@ -0,0 +1,7 @@ +require 'test_helper' + +class SubtopicTest < ActiveSupport::TestCase + # test "the truth" do + # assert true + # end +end diff --git a/test/models/view_test.rb b/test/models/view_test.rb new file mode 100644 index 0000000000000000000000000000000000000000..08f73486899f884148b0e421792c4b2975a39663 --- /dev/null +++ b/test/models/view_test.rb @@ -0,0 +1,7 @@ +require 'test_helper' + +class ViewTest < ActiveSupport::TestCase + # test "the truth" do + # assert true + # end +end diff --git a/vendor/assets/stylesheets/spinners.css b/vendor/assets/stylesheets/spinners.css index 509fa18d959bdf783cc2b165339e88ca37dc483d..a308762e5dab94f01a5e9842024fc7deaf375d2f 100644 --- a/vendor/assets/stylesheets/spinners.css +++ b/vendor/assets/stylesheets/spinners.css @@ -21,3053 +21,6 @@ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -@-moz-keyframes spinner-loader { - 0% { - -moz-transform: rotate(0deg); - transform: rotate(0deg); - } - 100% { - -moz-transform: rotate(360deg); - transform: rotate(360deg); - } -} -@-webkit-keyframes spinner-loader { - 0% { - -webkit-transform: rotate(0deg); - transform: rotate(0deg); - } - 100% { - -webkit-transform: rotate(360deg); - transform: rotate(360deg); - } -} -@keyframes spinner-loader { - 0% { - -moz-transform: rotate(0deg); - -ms-transform: rotate(0deg); - -webkit-transform: rotate(0deg); - transform: rotate(0deg); - } - 100% { - -moz-transform: rotate(360deg); - -ms-transform: rotate(360deg); - -webkit-transform: rotate(360deg); - transform: rotate(360deg); - } -} -/* :not(:required) hides this rule from IE9 and below */ -.spinner-loader:not(:required) { - -moz-animation: spinner-loader 1500ms infinite linear; - -webkit-animation: spinner-loader 1500ms infinite linear; - animation: spinner-loader 1500ms infinite linear; - -moz-border-radius: 0.5em; - -webkit-border-radius: 0.5em; - border-radius: 0.5em; - -moz-box-shadow: rgba(0, 0, 51, 0.3) 1.5em 0 0 0, rgba(0, 0, 51, 0.3) 1.1em 1.1em 0 0, rgba(0, 0, 51, 0.3) 0 1.5em 0 0, rgba(0, 0, 51, 0.3) -1.1em 1.1em 0 0, rgba(0, 0, 51, 0.3) -1.5em 0 0 0, rgba(0, 0, 51, 0.3) -1.1em -1.1em 0 0, rgba(0, 0, 51, 0.3) 0 -1.5em 0 0, rgba(0, 0, 51, 0.3) 1.1em -1.1em 0 0; - -webkit-box-shadow: rgba(0, 0, 51, 0.3) 1.5em 0 0 0, rgba(0, 0, 51, 0.3) 1.1em 1.1em 0 0, rgba(0, 0, 51, 0.3) 0 1.5em 0 0, rgba(0, 0, 51, 0.3) -1.1em 1.1em 0 0, rgba(0, 0, 51, 0.3) -1.5em 0 0 0, rgba(0, 0, 51, 0.3) -1.1em -1.1em 0 0, rgba(0, 0, 51, 0.3) 0 -1.5em 0 0, rgba(0, 0, 51, 0.3) 1.1em -1.1em 0 0; - box-shadow: rgba(0, 0, 51, 0.3) 1.5em 0 0 0, rgba(0, 0, 51, 0.3) 1.1em 1.1em 0 0, rgba(0, 0, 51, 0.3) 0 1.5em 0 0, rgba(0, 0, 51, 0.3) -1.1em 1.1em 0 0, rgba(0, 0, 51, 0.3) -1.5em 0 0 0, rgba(0, 0, 51, 0.3) -1.1em -1.1em 0 0, rgba(0, 0, 51, 0.3) 0 -1.5em 0 0, rgba(0, 0, 51, 0.3) 1.1em -1.1em 0 0; - display: inline-block; - font-size: 10px; - width: 1em; - height: 1em; - margin: 1.5em; - overflow: hidden; - text-indent: 100%; -} - -@-moz-keyframes refreshing-loader { - 0% { - -moz-transform: rotate(0deg); - transform: rotate(0deg); - } - 100% { - -moz-transform: rotate(360deg); - transform: rotate(360deg); - } -} -@-webkit-keyframes refreshing-loader { - 0% { - -webkit-transform: rotate(0deg); - transform: rotate(0deg); - } - 100% { - -webkit-transform: rotate(360deg); - transform: rotate(360deg); - } -} -@keyframes refreshing-loader { - 0% { - -moz-transform: rotate(0deg); - -ms-transform: rotate(0deg); - -webkit-transform: rotate(0deg); - transform: rotate(0deg); - } - 100% { - -moz-transform: rotate(360deg); - -ms-transform: rotate(360deg); - -webkit-transform: rotate(360deg); - transform: rotate(360deg); - } -} -/* :not(:required) hides this rule from IE9 and below */ -.refreshing-loader:not(:required) { - -moz-animation: refreshing-loader 1000ms infinite linear; - -webkit-animation: refreshing-loader 1000ms infinite linear; - animation: refreshing-loader 1000ms infinite linear; - -moz-border-radius: 2.4em; - -webkit-border-radius: 2.4em; - border-radius: 2.4em; - border: 0.4em solid #9ac; - border-left-color: transparent; - color: transparent; - display: inline-block; - font-size: 10px; - line-height: 1.2; - width: 3em; - height: 3em; - text-indent: 100%; -} -.refreshing-loader:not(:required):after { - display: block; - border: 0.5em solid transparent; - border-top-color: #9ac; - border-left-color: #9ac; - content: ''; - width: 0; - height: 0; - overflow: hidden; - margin-left: -0.2em; - margin-top: 1em; -} - -@-moz-keyframes throbber-loader { - 0% { - background: #dde2e7; - } - 10% { - background: #6b9dc8; - } - 40% { - background: #dde2e7; - } -} -@-webkit-keyframes throbber-loader { - 0% { - background: #dde2e7; - } - 10% { - background: #6b9dc8; - } - 40% { - background: #dde2e7; - } -} -@keyframes throbber-loader { - 0% { - background: #dde2e7; - } - 10% { - background: #6b9dc8; - } - 40% { - background: #dde2e7; - } -} -/* :not(:required) hides these rules from IE9 and below */ -.throbber-loader:not(:required) { - -moz-animation: throbber-loader 2000ms 300ms infinite ease-out; - -webkit-animation: throbber-loader 2000ms 300ms infinite ease-out; - animation: throbber-loader 2000ms 300ms infinite ease-out; - background: #dde2e7; - display: inline-block; - position: relative; - text-indent: -9999px; - width: 0.9em; - height: 1.5em; - margin: 0 1.6em; -} -.throbber-loader:not(:required):before, .throbber-loader:not(:required):after { - background: #dde2e7; - content: '\x200B'; - display: inline-block; - width: 0.9em; - height: 1.5em; - position: absolute; - top: 0; -} -.throbber-loader:not(:required):before { - -moz-animation: throbber-loader 2000ms 150ms infinite ease-out; - -webkit-animation: throbber-loader 2000ms 150ms infinite ease-out; - animation: throbber-loader 2000ms 150ms infinite ease-out; - left: -1.6em; -} -.throbber-loader:not(:required):after { - -moz-animation: throbber-loader 2000ms 450ms infinite ease-out; - -webkit-animation: throbber-loader 2000ms 450ms infinite ease-out; - animation: throbber-loader 2000ms 450ms infinite ease-out; - right: -1.6em; -} - -@-moz-keyframes heartbeat-loader { - 0% { - -moz-transform: rotate(45deg) scale(1); - transform: rotate(45deg) scale(1); - } - 14% { - -moz-transform: rotate(45deg) scale(1.3); - transform: rotate(45deg) scale(1.3); - } - 28% { - -moz-transform: rotate(45deg) scale(1); - transform: rotate(45deg) scale(1); - } - 42% { - -moz-transform: rotate(45deg) scale(1.3); - transform: rotate(45deg) scale(1.3); - } - 70% { - -moz-transform: rotate(45deg) scale(1); - transform: rotate(45deg) scale(1); - } -} -@-webkit-keyframes heartbeat-loader { - 0% { - -webkit-transform: rotate(45deg) scale(1); - transform: rotate(45deg) scale(1); - } - 14% { - -webkit-transform: rotate(45deg) scale(1.3); - transform: rotate(45deg) scale(1.3); - } - 28% { - -webkit-transform: rotate(45deg) scale(1); - transform: rotate(45deg) scale(1); - } - 42% { - -webkit-transform: rotate(45deg) scale(1.3); - transform: rotate(45deg) scale(1.3); - } - 70% { - -webkit-transform: rotate(45deg) scale(1); - transform: rotate(45deg) scale(1); - } -} -@keyframes heartbeat-loader { - 0% { - -moz-transform: rotate(45deg) scale(1); - -ms-transform: rotate(45deg) scale(1); - -webkit-transform: rotate(45deg) scale(1); - transform: rotate(45deg) scale(1); - } - 14% { - -moz-transform: rotate(45deg) scale(1.3); - -ms-transform: rotate(45deg) scale(1.3); - -webkit-transform: rotate(45deg) scale(1.3); - transform: rotate(45deg) scale(1.3); - } - 28% { - -moz-transform: rotate(45deg) scale(1); - -ms-transform: rotate(45deg) scale(1); - -webkit-transform: rotate(45deg) scale(1); - transform: rotate(45deg) scale(1); - } - 42% { - -moz-transform: rotate(45deg) scale(1.3); - -ms-transform: rotate(45deg) scale(1.3); - -webkit-transform: rotate(45deg) scale(1.3); - transform: rotate(45deg) scale(1.3); - } - 70% { - -moz-transform: rotate(45deg) scale(1); - -ms-transform: rotate(45deg) scale(1); - -webkit-transform: rotate(45deg) scale(1); - transform: rotate(45deg) scale(1); - } -} -/* :not(:required) hides this rule from IE9 and below */ -.heartbeat-loader:not(:required) { - -moz-animation: heartbeat-loader 1300ms ease 0s infinite normal; - -webkit-animation: heartbeat-loader 1300ms ease 0s infinite normal; - animation: heartbeat-loader 1300ms ease 0s infinite normal; - display: inline-block; - position: relative; - overflow: hidden; - text-indent: -9999px; - width: 36px; - height: 36px; - -moz-transform: rotate(45deg) scale(1); - -ms-transform: rotate(45deg) scale(1); - -webkit-transform: rotate(45deg) scale(1); - transform: rotate(45deg) scale(1); - -moz-transform-origin: 50% 50%; - -ms-transform-origin: 50% 50%; - -webkit-transform-origin: 50% 50%; - transform-origin: 50% 50%; -} -.heartbeat-loader:not(:required):after, .heartbeat-loader:not(:required):before { - position: absolute; - content: ""; - background: #e87; -} -.heartbeat-loader:not(:required):before { - -moz-border-radius-topleft: 12px; - -webkit-border-top-left-radius: 12px; - border-top-left-radius: 12px; - -moz-border-radius-bottomleft: 12px; - -webkit-border-bottom-left-radius: 12px; - border-bottom-left-radius: 12px; - top: 12px; - left: 0; - width: 36px; - height: 24px; -} -.heartbeat-loader:not(:required):after { - -moz-border-radius-topleft: 12px; - -webkit-border-top-left-radius: 12px; - border-top-left-radius: 12px; - -moz-border-radius-topright: 12px; - -webkit-border-top-right-radius: 12px; - border-top-right-radius: 12px; - top: 0; - left: 12px; - width: 24px; - height: 12px; -} - -@-moz-keyframes gauge-loader { - 0% { - -moz-transform: rotate(-50deg); - transform: rotate(-50deg); - } - 10% { - -moz-transform: rotate(20deg); - transform: rotate(20deg); - } - 20% { - -moz-transform: rotate(60deg); - transform: rotate(60deg); - } - 24% { - -moz-transform: rotate(60deg); - transform: rotate(60deg); - } - 40% { - -moz-transform: rotate(-20deg); - transform: rotate(-20deg); - } - 54% { - -moz-transform: rotate(70deg); - transform: rotate(70deg); - } - 56% { - -moz-transform: rotate(78deg); - transform: rotate(78deg); - } - 58% { - -moz-transform: rotate(73deg); - transform: rotate(73deg); - } - 60% { - -moz-transform: rotate(75deg); - transform: rotate(75deg); - } - 62% { - -moz-transform: rotate(70deg); - transform: rotate(70deg); - } - 70% { - -moz-transform: rotate(-20deg); - transform: rotate(-20deg); - } - 80% { - -moz-transform: rotate(20deg); - transform: rotate(20deg); - } - 83% { - -moz-transform: rotate(25deg); - transform: rotate(25deg); - } - 86% { - -moz-transform: rotate(20deg); - transform: rotate(20deg); - } - 89% { - -moz-transform: rotate(25deg); - transform: rotate(25deg); - } - 100% { - -moz-transform: rotate(-50deg); - transform: rotate(-50deg); - } -} -@-webkit-keyframes gauge-loader { - 0% { - -webkit-transform: rotate(-50deg); - transform: rotate(-50deg); - } - 10% { - -webkit-transform: rotate(20deg); - transform: rotate(20deg); - } - 20% { - -webkit-transform: rotate(60deg); - transform: rotate(60deg); - } - 24% { - -webkit-transform: rotate(60deg); - transform: rotate(60deg); - } - 40% { - -webkit-transform: rotate(-20deg); - transform: rotate(-20deg); - } - 54% { - -webkit-transform: rotate(70deg); - transform: rotate(70deg); - } - 56% { - -webkit-transform: rotate(78deg); - transform: rotate(78deg); - } - 58% { - -webkit-transform: rotate(73deg); - transform: rotate(73deg); - } - 60% { - -webkit-transform: rotate(75deg); - transform: rotate(75deg); - } - 62% { - -webkit-transform: rotate(70deg); - transform: rotate(70deg); - } - 70% { - -webkit-transform: rotate(-20deg); - transform: rotate(-20deg); - } - 80% { - -webkit-transform: rotate(20deg); - transform: rotate(20deg); - } - 83% { - -webkit-transform: rotate(25deg); - transform: rotate(25deg); - } - 86% { - -webkit-transform: rotate(20deg); - transform: rotate(20deg); - } - 89% { - -webkit-transform: rotate(25deg); - transform: rotate(25deg); - } - 100% { - -webkit-transform: rotate(-50deg); - transform: rotate(-50deg); - } -} -@keyframes gauge-loader { - 0% { - -moz-transform: rotate(-50deg); - -ms-transform: rotate(-50deg); - -webkit-transform: rotate(-50deg); - transform: rotate(-50deg); - } - 10% { - -moz-transform: rotate(20deg); - -ms-transform: rotate(20deg); - -webkit-transform: rotate(20deg); - transform: rotate(20deg); - } - 20% { - -moz-transform: rotate(60deg); - -ms-transform: rotate(60deg); - -webkit-transform: rotate(60deg); - transform: rotate(60deg); - } - 24% { - -moz-transform: rotate(60deg); - -ms-transform: rotate(60deg); - -webkit-transform: rotate(60deg); - transform: rotate(60deg); - } - 40% { - -moz-transform: rotate(-20deg); - -ms-transform: rotate(-20deg); - -webkit-transform: rotate(-20deg); - transform: rotate(-20deg); - } - 54% { - -moz-transform: rotate(70deg); - -ms-transform: rotate(70deg); - -webkit-transform: rotate(70deg); - transform: rotate(70deg); - } - 56% { - -moz-transform: rotate(78deg); - -ms-transform: rotate(78deg); - -webkit-transform: rotate(78deg); - transform: rotate(78deg); - } - 58% { - -moz-transform: rotate(73deg); - -ms-transform: rotate(73deg); - -webkit-transform: rotate(73deg); - transform: rotate(73deg); - } - 60% { - -moz-transform: rotate(75deg); - -ms-transform: rotate(75deg); - -webkit-transform: rotate(75deg); - transform: rotate(75deg); - } - 62% { - -moz-transform: rotate(70deg); - -ms-transform: rotate(70deg); - -webkit-transform: rotate(70deg); - transform: rotate(70deg); - } - 70% { - -moz-transform: rotate(-20deg); - -ms-transform: rotate(-20deg); - -webkit-transform: rotate(-20deg); - transform: rotate(-20deg); - } - 80% { - -moz-transform: rotate(20deg); - -ms-transform: rotate(20deg); - -webkit-transform: rotate(20deg); - transform: rotate(20deg); - } - 83% { - -moz-transform: rotate(25deg); - -ms-transform: rotate(25deg); - -webkit-transform: rotate(25deg); - transform: rotate(25deg); - } - 86% { - -moz-transform: rotate(20deg); - -ms-transform: rotate(20deg); - -webkit-transform: rotate(20deg); - transform: rotate(20deg); - } - 89% { - -moz-transform: rotate(25deg); - -ms-transform: rotate(25deg); - -webkit-transform: rotate(25deg); - transform: rotate(25deg); - } - 100% { - -moz-transform: rotate(-50deg); - -ms-transform: rotate(-50deg); - -webkit-transform: rotate(-50deg); - transform: rotate(-50deg); - } -} -/* :not(:required) hides this rule from IE9 and below */ -.gauge-loader:not(:required) { - background: #6ca; - -moz-border-radius-topleft: 32px; - -webkit-border-top-left-radius: 32px; - border-top-left-radius: 32px; - -moz-border-radius-topright: 32px; - -webkit-border-top-right-radius: 32px; - border-top-right-radius: 32px; - display: inline-block; - width: 64px; - height: 32px; - overflow: hidden; - position: relative; - text-indent: -9999px; -} -.gauge-loader:not(:required)::before { - -moz-animation: gauge-loader 4000ms infinite ease; - -webkit-animation: gauge-loader 4000ms infinite ease; - animation: gauge-loader 4000ms infinite ease; - background: white; - -moz-border-radius: 2px; - -webkit-border-radius: 2px; - border-radius: 2px; - content: ''; - position: absolute; - left: 30px; - top: 5.33333px; - width: 4px; - height: 26.66667px; - -moz-transform-origin: 50% 100%; - -ms-transform-origin: 50% 100%; - -webkit-transform-origin: 50% 100%; - transform-origin: 50% 100%; -} -.gauge-loader:not(:required)::after { - content: ''; - background: white; - -moz-border-radius: 8px; - -webkit-border-radius: 8px; - border-radius: 8px; - position: absolute; - left: 25.6px; - top: 25.6px; - width: 12.8px; - height: 12.8px; -} - -@-moz-keyframes timer-loader { - 0% { - -moz-transform: rotate(0deg); - transform: rotate(0deg); - } - 100% { - -moz-transform: rotate(360deg); - transform: rotate(360deg); - } -} -@-webkit-keyframes timer-loader { - 0% { - -webkit-transform: rotate(0deg); - transform: rotate(0deg); - } - 100% { - -webkit-transform: rotate(360deg); - transform: rotate(360deg); - } -} -@keyframes timer-loader { - 0% { - -moz-transform: rotate(0deg); - -ms-transform: rotate(0deg); - -webkit-transform: rotate(0deg); - transform: rotate(0deg); - } - 100% { - -moz-transform: rotate(360deg); - -ms-transform: rotate(360deg); - -webkit-transform: rotate(360deg); - transform: rotate(360deg); - } -} -/* :not(:required) hides this rule from IE9 and below */ -.timer-loader:not(:required) { - border: 6px solid #c8d; - -moz-border-radius: 24px; - -webkit-border-radius: 24px; - border-radius: 24px; - -moz-box-sizing: border-box; - -webkit-box-sizing: border-box; - box-sizing: border-box; - display: inline-block; - overflow: hidden; - position: relative; - text-indent: -9999px; - width: 48px; - height: 48px; -} -.timer-loader:not(:required)::before { - -moz-animation: timer-loader 1250ms infinite linear; - -webkit-animation: timer-loader 1250ms infinite linear; - animation: timer-loader 1250ms infinite linear; - -moz-transform-origin: 3px 3px; - -ms-transform-origin: 3px 3px; - -webkit-transform-origin: 3px 3px; - transform-origin: 3px 3px; - background: #c8d; - -moz-border-radius: 3px; - -webkit-border-radius: 3px; - border-radius: 3px; - content: ''; - display: block; - position: absolute; - width: 6px; - height: 19.2px; - left: 15px; - top: 15px; -} -.timer-loader:not(:required)::after { - -moz-animation: timer-loader 15000ms infinite linear; - -webkit-animation: timer-loader 15000ms infinite linear; - animation: timer-loader 15000ms infinite linear; - -moz-transform-origin: 3px 3px; - -ms-transform-origin: 3px 3px; - -webkit-transform-origin: 3px 3px; - transform-origin: 3px 3px; - background: #c8d; - -moz-border-radius: 3px; - -webkit-border-radius: 3px; - border-radius: 3px; - content: ''; - display: block; - position: absolute; - width: 6px; - height: 16px; - left: 15px; - top: 15px; -} - -@-moz-keyframes three-quarters-loader { - 0% { - -moz-transform: rotate(0deg); - transform: rotate(0deg); - } - 100% { - -moz-transform: rotate(360deg); - transform: rotate(360deg); - } -} -@-webkit-keyframes three-quarters-loader { - 0% { - -webkit-transform: rotate(0deg); - transform: rotate(0deg); - } - 100% { - -webkit-transform: rotate(360deg); - transform: rotate(360deg); - } -} -@keyframes three-quarters-loader { - 0% { - -moz-transform: rotate(0deg); - -ms-transform: rotate(0deg); - -webkit-transform: rotate(0deg); - transform: rotate(0deg); - } - 100% { - -moz-transform: rotate(360deg); - -ms-transform: rotate(360deg); - -webkit-transform: rotate(360deg); - transform: rotate(360deg); - } -} -/* :not(:required) hides this rule from IE9 and below */ -.three-quarters-loader:not(:required) { - -moz-animation: three-quarters-loader 1250ms infinite linear; - -webkit-animation: three-quarters-loader 1250ms infinite linear; - animation: three-quarters-loader 1250ms infinite linear; - border: 8px solid #38e; - border-right-color: transparent; - border-radius: 16px; - box-sizing: border-box; - display: inline-block; - position: relative; - overflow: hidden; - text-indent: -9999px; - width: 32px; - height: 32px; -} - -@-moz-keyframes wobblebar-loader { - 0% { - left: 4px; - } - 3% { - left: 104px; - } - 6% { - left: 4px; - } - 9% { - left: 104px; - } - 12% { - left: 4px; - } - 15% { - left: 104px; - } - 18% { - left: 32px; - } - 27% { - left: 32px; - } - 30% { - left: 104px; - } - 33% { - left: 4px; - } - 36% { - left: 104px; - } - 39% { - left: 4px; - } - 42% { - left: 104px; - } - 45% { - left: 4px; - } - 48% { - left: 104px; - } - 51% { - left: 52px; - } - 63% { - left: 52px; - } - 66% { - left: 4px; - } - 69% { - left: 104px; - } - 72% { - left: 4px; - } - 75% { - left: 104px; - } - 78% { - left: 4px; - } - 81% { - left: 104px; - } - 84% { - left: 72px; - } - 94% { - left: 72px; - } - 97% { - left: 104px; - } -} -@-webkit-keyframes wobblebar-loader { - 0% { - left: 4px; - } - 3% { - left: 104px; - } - 6% { - left: 4px; - } - 9% { - left: 104px; - } - 12% { - left: 4px; - } - 15% { - left: 104px; - } - 18% { - left: 32px; - } - 27% { - left: 32px; - } - 30% { - left: 104px; - } - 33% { - left: 4px; - } - 36% { - left: 104px; - } - 39% { - left: 4px; - } - 42% { - left: 104px; - } - 45% { - left: 4px; - } - 48% { - left: 104px; - } - 51% { - left: 52px; - } - 63% { - left: 52px; - } - 66% { - left: 4px; - } - 69% { - left: 104px; - } - 72% { - left: 4px; - } - 75% { - left: 104px; - } - 78% { - left: 4px; - } - 81% { - left: 104px; - } - 84% { - left: 72px; - } - 94% { - left: 72px; - } - 97% { - left: 104px; - } -} -@keyframes wobblebar-loader { - 0% { - left: 4px; - } - 3% { - left: 104px; - } - 6% { - left: 4px; - } - 9% { - left: 104px; - } - 12% { - left: 4px; - } - 15% { - left: 104px; - } - 18% { - left: 32px; - } - 27% { - left: 32px; - } - 30% { - left: 104px; - } - 33% { - left: 4px; - } - 36% { - left: 104px; - } - 39% { - left: 4px; - } - 42% { - left: 104px; - } - 45% { - left: 4px; - } - 48% { - left: 104px; - } - 51% { - left: 52px; - } - 63% { - left: 52px; - } - 66% { - left: 4px; - } - 69% { - left: 104px; - } - 72% { - left: 4px; - } - 75% { - left: 104px; - } - 78% { - left: 4px; - } - 81% { - left: 104px; - } - 84% { - left: 72px; - } - 94% { - left: 72px; - } - 97% { - left: 104px; - } -} -/* :not(:required) hides this rule from IE9 and below */ -.wobblebar-loader:not(:required) { - background: #a9d; - -moz-border-radius: 10.66667px; - -webkit-border-radius: 10.66667px; - border-radius: 10.66667px; - display: inline-block; - overflow: hidden; - text-indent: -9999px; - width: 128px; - height: 21.33333px; - position: relative; -} -.wobblebar-loader:not(:required)::after { - -moz-animation: wobblebar-loader 15000ms infinite ease; - -webkit-animation: wobblebar-loader 15000ms infinite ease; - animation: wobblebar-loader 15000ms infinite ease; - background: white; - display: block; - -moz-border-radius: 7.11111px; - -webkit-border-radius: 7.11111px; - border-radius: 7.11111px; - content: ''; - position: absolute; - top: 3.55556px; - left: 4px; - width: 21.33333px; - height: 14.22222px; -} - -@-moz-keyframes atebits-loader { - 0% { - -moz-transform: rotate(0deg); - transform: rotate(0deg); - } - 3% { - -moz-transform: rotate(90deg); - transform: rotate(90deg); - } - 10% { - -moz-transform: rotate(90deg); - transform: rotate(90deg); - } - 13% { - -moz-transform: rotate(180deg); - transform: rotate(180deg); - } - 20% { - -moz-transform: rotate(180deg); - transform: rotate(180deg); - } - 23% { - -moz-transform: rotate(90deg); - transform: rotate(90deg); - } - 30% { - -moz-transform: rotate(90deg); - transform: rotate(90deg); - } - 33% { - -moz-transform: rotate(180deg); - transform: rotate(180deg); - } - 40% { - -moz-transform: rotate(180deg); - transform: rotate(180deg); - } - 43% { - -moz-transform: rotate(270deg); - transform: rotate(270deg); - } - 50% { - -moz-transform: rotate(270deg); - transform: rotate(270deg); - } - 53% { - -moz-transform: rotate(180deg); - transform: rotate(180deg); - } - 60% { - -moz-transform: rotate(180deg); - transform: rotate(180deg); - } - 63% { - -moz-transform: rotate(90deg); - transform: rotate(90deg); - } - 70% { - -moz-transform: rotate(90deg); - transform: rotate(90deg); - } - 73% { - -moz-transform: rotate(0deg); - transform: rotate(0deg); - } - 80% { - -moz-transform: rotate(0deg); - transform: rotate(0deg); - } - 83% { - -moz-transform: rotate(-90deg); - transform: rotate(-90deg); - } - 90% { - -moz-transform: rotate(-90deg); - transform: rotate(-90deg); - } - 93% { - -moz-transform: rotate(0deg); - transform: rotate(0deg); - } -} -@-webkit-keyframes atebits-loader { - 0% { - -webkit-transform: rotate(0deg); - transform: rotate(0deg); - } - 3% { - -webkit-transform: rotate(90deg); - transform: rotate(90deg); - } - 10% { - -webkit-transform: rotate(90deg); - transform: rotate(90deg); - } - 13% { - -webkit-transform: rotate(180deg); - transform: rotate(180deg); - } - 20% { - -webkit-transform: rotate(180deg); - transform: rotate(180deg); - } - 23% { - -webkit-transform: rotate(90deg); - transform: rotate(90deg); - } - 30% { - -webkit-transform: rotate(90deg); - transform: rotate(90deg); - } - 33% { - -webkit-transform: rotate(180deg); - transform: rotate(180deg); - } - 40% { - -webkit-transform: rotate(180deg); - transform: rotate(180deg); - } - 43% { - -webkit-transform: rotate(270deg); - transform: rotate(270deg); - } - 50% { - -webkit-transform: rotate(270deg); - transform: rotate(270deg); - } - 53% { - -webkit-transform: rotate(180deg); - transform: rotate(180deg); - } - 60% { - -webkit-transform: rotate(180deg); - transform: rotate(180deg); - } - 63% { - -webkit-transform: rotate(90deg); - transform: rotate(90deg); - } - 70% { - -webkit-transform: rotate(90deg); - transform: rotate(90deg); - } - 73% { - -webkit-transform: rotate(0deg); - transform: rotate(0deg); - } - 80% { - -webkit-transform: rotate(0deg); - transform: rotate(0deg); - } - 83% { - -webkit-transform: rotate(-90deg); - transform: rotate(-90deg); - } - 90% { - -webkit-transform: rotate(-90deg); - transform: rotate(-90deg); - } - 93% { - -webkit-transform: rotate(0deg); - transform: rotate(0deg); - } -} -@keyframes atebits-loader { - 0% { - -moz-transform: rotate(0deg); - -ms-transform: rotate(0deg); - -webkit-transform: rotate(0deg); - transform: rotate(0deg); - } - 3% { - -moz-transform: rotate(90deg); - -ms-transform: rotate(90deg); - -webkit-transform: rotate(90deg); - transform: rotate(90deg); - } - 10% { - -moz-transform: rotate(90deg); - -ms-transform: rotate(90deg); - -webkit-transform: rotate(90deg); - transform: rotate(90deg); - } - 13% { - -moz-transform: rotate(180deg); - -ms-transform: rotate(180deg); - -webkit-transform: rotate(180deg); - transform: rotate(180deg); - } - 20% { - -moz-transform: rotate(180deg); - -ms-transform: rotate(180deg); - -webkit-transform: rotate(180deg); - transform: rotate(180deg); - } - 23% { - -moz-transform: rotate(90deg); - -ms-transform: rotate(90deg); - -webkit-transform: rotate(90deg); - transform: rotate(90deg); - } - 30% { - -moz-transform: rotate(90deg); - -ms-transform: rotate(90deg); - -webkit-transform: rotate(90deg); - transform: rotate(90deg); - } - 33% { - -moz-transform: rotate(180deg); - -ms-transform: rotate(180deg); - -webkit-transform: rotate(180deg); - transform: rotate(180deg); - } - 40% { - -moz-transform: rotate(180deg); - -ms-transform: rotate(180deg); - -webkit-transform: rotate(180deg); - transform: rotate(180deg); - } - 43% { - -moz-transform: rotate(270deg); - -ms-transform: rotate(270deg); - -webkit-transform: rotate(270deg); - transform: rotate(270deg); - } - 50% { - -moz-transform: rotate(270deg); - -ms-transform: rotate(270deg); - -webkit-transform: rotate(270deg); - transform: rotate(270deg); - } - 53% { - -moz-transform: rotate(180deg); - -ms-transform: rotate(180deg); - -webkit-transform: rotate(180deg); - transform: rotate(180deg); - } - 60% { - -moz-transform: rotate(180deg); - -ms-transform: rotate(180deg); - -webkit-transform: rotate(180deg); - transform: rotate(180deg); - } - 63% { - -moz-transform: rotate(90deg); - -ms-transform: rotate(90deg); - -webkit-transform: rotate(90deg); - transform: rotate(90deg); - } - 70% { - -moz-transform: rotate(90deg); - -ms-transform: rotate(90deg); - -webkit-transform: rotate(90deg); - transform: rotate(90deg); - } - 73% { - -moz-transform: rotate(0deg); - -ms-transform: rotate(0deg); - -webkit-transform: rotate(0deg); - transform: rotate(0deg); - } - 80% { - -moz-transform: rotate(0deg); - -ms-transform: rotate(0deg); - -webkit-transform: rotate(0deg); - transform: rotate(0deg); - } - 83% { - -moz-transform: rotate(-90deg); - -ms-transform: rotate(-90deg); - -webkit-transform: rotate(-90deg); - transform: rotate(-90deg); - } - 90% { - -moz-transform: rotate(-90deg); - -ms-transform: rotate(-90deg); - -webkit-transform: rotate(-90deg); - transform: rotate(-90deg); - } - 93% { - -moz-transform: rotate(0deg); - -ms-transform: rotate(0deg); - -webkit-transform: rotate(0deg); - transform: rotate(0deg); - } -} -/* :not(:required) hides this rule from IE9 and below */ -.atebits-loader:not(:required) { - background: rgba(0, 0, 0, 0.5); - display: inline-block; - width: 9px; - height: 9px; - overflow: hidden; - position: relative; - text-indent: -9999px; - -moz-box-shadow: rgba(0, 0, 0, 0.5) -12px -12px 0 0, rgba(0, 0, 0, 0.5) 12px -12px 0 0, rgba(0, 0, 0, 0.5) -12px 0 0 0, rgba(0, 0, 0, 0.5) 12px 0 0 0, rgba(0, 0, 0, 0.5) -12px 12px 0 0, rgba(0, 0, 0, 0.5) 0 12px 0 0, rgba(0, 0, 0, 0.5) 12px 12px 0 0; - -webkit-box-shadow: rgba(0, 0, 0, 0.5) -12px -12px 0 0, rgba(0, 0, 0, 0.5) 12px -12px 0 0, rgba(0, 0, 0, 0.5) -12px 0 0 0, rgba(0, 0, 0, 0.5) 12px 0 0 0, rgba(0, 0, 0, 0.5) -12px 12px 0 0, rgba(0, 0, 0, 0.5) 0 12px 0 0, rgba(0, 0, 0, 0.5) 12px 12px 0 0; - box-shadow: rgba(0, 0, 0, 0.5) -12px -12px 0 0, rgba(0, 0, 0, 0.5) 12px -12px 0 0, rgba(0, 0, 0, 0.5) -12px 0 0 0, rgba(0, 0, 0, 0.5) 12px 0 0 0, rgba(0, 0, 0, 0.5) -12px 12px 0 0, rgba(0, 0, 0, 0.5) 0 12px 0 0, rgba(0, 0, 0, 0.5) 12px 12px 0 0; - -moz-animation: atebits-loader 8s infinite ease-in-out; - -webkit-animation: atebits-loader 8s infinite ease-in-out; - animation: atebits-loader 8s infinite ease-in-out; - -moz-transform-origin: 50% 50%; - -ms-transform-origin: 50% 50%; - -webkit-transform-origin: 50% 50%; - transform-origin: 50% 50%; -} - -@-moz-keyframes whirly-loader { - 0% { - -moz-transform: rotate(0deg); - transform: rotate(0deg); - } - 100% { - -moz-transform: rotate(360deg); - transform: rotate(360deg); - } -} -@-webkit-keyframes whirly-loader { - 0% { - -webkit-transform: rotate(0deg); - transform: rotate(0deg); - } - 100% { - -webkit-transform: rotate(360deg); - transform: rotate(360deg); - } -} -@keyframes whirly-loader { - 0% { - -moz-transform: rotate(0deg); - -ms-transform: rotate(0deg); - -webkit-transform: rotate(0deg); - transform: rotate(0deg); - } - 100% { - -moz-transform: rotate(360deg); - -ms-transform: rotate(360deg); - -webkit-transform: rotate(360deg); - transform: rotate(360deg); - } -} -/* :not(:required) hides this rule from IE9 and below */ -.whirly-loader:not(:required) { - overflow: hidden; - position: relative; - text-indent: -9999px; - display: inline-block; - width: 8px; - height: 8px; - background: transparent; - -moz-border-radius: 100%; - -webkit-border-radius: 100%; - border-radius: 100%; - -moz-box-shadow: #e66 0px 26px 0 6px, #e66 0.90971px 26.05079px 0 5.93333px, #e66 1.82297px 26.06967px 0 5.86667px, #e66 2.73865px 26.05647px 0 5.8px, #e66 3.65561px 26.01104px 0 5.73333px, #e66 4.57274px 25.93327px 0 5.66667px, #e66 5.48887px 25.8231px 0 5.6px, #e66 6.40287px 25.68049px 0 5.53333px, #e66 7.31358px 25.50548px 0 5.46667px, #e66 8.21985px 25.2981px 0 5.4px, #e66 9.12054px 25.05847px 0 5.33333px, #e66 10.01448px 24.78672px 0 5.26667px, #e66 10.90054px 24.48302px 0 5.2px, #e66 11.77757px 24.1476px 0 5.13333px, #e66 12.64443px 23.78072px 0 5.06667px, #e66 13.5px 23.38269px 0 5px, #e66 14.34315px 22.95384px 0 4.93333px, #e66 15.17277px 22.49455px 0 4.86667px, #e66 15.98776px 22.00526px 0 4.8px, #e66 16.78704px 21.48643px 0 4.73333px, #e66 17.56953px 20.93855px 0 4.66667px, #e66 18.33418px 20.36217px 0 4.6px, #e66 19.07995px 19.75787px 0 4.53333px, #e66 19.80582px 19.12626px 0 4.46667px, #e66 20.5108px 18.468px 0 4.4px, #e66 21.1939px 17.78379px 0 4.33333px, #e66 21.85416px 17.07434px 0 4.26667px, #e66 22.49067px 16.34043px 0 4.2px, #e66 23.10251px 15.58284px 0 4.13333px, #e66 23.68881px 14.80241px 0 4.06667px, #e66 24.24871px 14.0px 0 4px, #e66 24.7814px 13.1765px 0 3.93333px, #e66 25.28607px 12.33284px 0 3.86667px, #e66 25.76198px 11.46997px 0 3.8px, #e66 26.2084px 10.58888px 0 3.73333px, #e66 26.62462px 9.69057px 0 3.66667px, #e66 27.01001px 8.77608px 0 3.6px, #e66 27.36392px 7.84648px 0 3.53333px, #e66 27.68577px 6.90284px 0 3.46667px, #e66 27.97502px 5.94627px 0 3.4px, #e66 28.23116px 4.97791px 0 3.33333px, #e66 28.4537px 3.99891px 0 3.26667px, #e66 28.64223px 3.01042px 0 3.2px, #e66 28.79635px 2.01364px 0 3.13333px, #e66 28.91571px 1.00976px 0 3.06667px, #e66 29px 0.0px 0 3px, #e66 29.04896px -1.01441px 0 2.93333px, #e66 29.06237px -2.03224px 0 2.86667px, #e66 29.04004px -3.05223px 0 2.8px, #e66 28.98185px -4.07313px 0 2.73333px, #e66 28.88769px -5.09368px 0 2.66667px, #e66 28.75754px -6.1126px 0 2.6px, #e66 28.59138px -7.12863px 0 2.53333px, #e66 28.38926px -8.14049px 0 2.46667px, #e66 28.15127px -9.1469px 0 2.4px, #e66 27.87755px -10.1466px 0 2.33333px, #e66 27.56827px -11.1383px 0 2.26667px, #e66 27.22365px -12.12075px 0 2.2px, #e66 26.84398px -13.09268px 0 2.13333px, #e66 26.42956px -14.05285px 0 2.06667px, #e66 25.98076px -15.0px 0 2px, #e66 25.49798px -15.93291px 0 1.93333px, #e66 24.98167px -16.85035px 0 1.86667px, #e66 24.43231px -17.75111px 0 1.8px, #e66 23.85046px -18.63402px 0 1.73333px, #e66 23.23668px -19.49789px 0 1.66667px, #e66 22.5916px -20.34157px 0 1.6px, #e66 21.91589px -21.16393px 0 1.53333px, #e66 21.21024px -21.96384px 0 1.46667px, #e66 20.4754px -22.74023px 0 1.4px, #e66 19.71215px -23.49203px 0 1.33333px, #e66 18.92133px -24.2182px 0 1.26667px, #e66 18.10379px -24.91772px 0 1.2px, #e66 17.26042px -25.58963px 0 1.13333px, #e66 16.39217px -26.23295px 0 1.06667px, #e66 15.5px -26.84679px 0 1px, #e66 14.58492px -27.43024px 0 0.93333px, #e66 13.64796px -27.98245px 0 0.86667px, #e66 12.69018px -28.50262px 0 0.8px, #e66 11.7127px -28.98995px 0 0.73333px, #e66 10.71663px -29.4437px 0 0.66667px, #e66 9.70313px -29.86317px 0 0.6px, #e66 8.67339px -30.2477px 0 0.53333px, #e66 7.6286px -30.59666px 0 0.46667px, #e66 6.57001px -30.90946px 0 0.4px, #e66 5.49886px -31.18558px 0 0.33333px, #e66 4.41643px -31.42451px 0 0.26667px, #e66 3.32401px -31.6258px 0 0.2px, #e66 2.22291px -31.78904px 0 0.13333px, #e66 1.11446px -31.91388px 0 0.06667px, #e66 0.0px -32px 0 0px, #e66 -1.11911px -32.04713px 0 -0.06667px, #e66 -2.24151px -32.05506px 0 -0.13333px, #e66 -3.36582px -32.02361px 0 -0.2px, #e66 -4.49065px -31.95265px 0 -0.26667px, #e66 -5.61462px -31.84212px 0 -0.33333px, #e66 -6.73634px -31.69198px 0 -0.4px, #e66 -7.8544px -31.50227px 0 -0.46667px, #e66 -8.9674px -31.27305px 0 -0.53333px, #e66 -10.07395px -31.00444px 0 -0.6px, #e66 -11.17266px -30.69663px 0 -0.66667px, #e66 -12.26212px -30.34982px 0 -0.73333px, #e66 -13.34096px -29.96429px 0 -0.8px, #e66 -14.4078px -29.54036px 0 -0.86667px, #e66 -15.46126px -29.07841px 0 -0.93333px, #e66 -16.5px -28.57884px 0 -1px, #e66 -17.52266px -28.04212px 0 -1.06667px, #e66 -18.52792px -27.46878px 0 -1.13333px, #e66 -19.51447px -26.85936px 0 -1.2px, #e66 -20.48101px -26.21449px 0 -1.26667px, #e66 -21.42625px -25.53481px 0 -1.33333px, #e66 -22.34896px -24.82104px 0 -1.4px, #e66 -23.2479px -24.07391px 0 -1.46667px, #e66 -24.12186px -23.29421px 0 -1.53333px, #e66 -24.96967px -22.48279px 0 -1.6px, #e66 -25.79016px -21.64052px 0 -1.66667px, #e66 -26.58223px -20.76831px 0 -1.73333px, #e66 -27.34477px -19.86714px 0 -1.8px, #e66 -28.07674px -18.938px 0 -1.86667px, #e66 -28.7771px -17.98193px 0 -1.93333px, #e66 -29.44486px -17.0px 0 -2px, #e66 -30.07908px -15.99333px 0 -2.06667px, #e66 -30.67884px -14.96307px 0 -2.13333px, #e66 -31.24325px -13.91039px 0 -2.2px, #e66 -31.7715px -12.83652px 0 -2.26667px, #e66 -32.26278px -11.74269px 0 -2.33333px, #e66 -32.71634px -10.63018px 0 -2.4px, #e66 -33.13149px -9.5003px 0 -2.46667px, #e66 -33.50755px -8.35437px 0 -2.53333px, #e66 -33.84391px -7.19374px 0 -2.6px, #e66 -34.14px -6.0198px 0 -2.66667px, #e66 -34.39531px -4.83395px 0 -2.73333px, #e66 -34.60936px -3.63759px 0 -2.8px, #e66 -34.78173px -2.43218px 0 -2.86667px, #e66 -34.91205px -1.21916px 0 -2.93333px, #e66 -35px 0.0px 0 -3px, #e66 -35.04531px 1.22381px 0 -3.06667px, #e66 -35.04775px 2.45078px 0 -3.13333px, #e66 -35.00717px 3.6794px 0 -3.2px, #e66 -34.92345px 4.90817px 0 -3.26667px, #e66 -34.79654px 6.13557px 0 -3.33333px, #e66 -34.62643px 7.36007px 0 -3.4px, #e66 -34.41316px 8.58016px 0 -3.46667px, #e66 -34.15683px 9.79431px 0 -3.53333px, #e66 -33.85761px 11.001px 0 -3.6px, #e66 -33.5157px 12.19872px 0 -3.66667px, #e66 -33.13137px 13.38594px 0 -3.73333px, #e66 -32.70493px 14.56117px 0 -3.8px, #e66 -32.23675px 15.72291px 0 -3.86667px, #e66 -31.72725px 16.86968px 0 -3.93333px, #e66 -31.17691px 18px 0 -4px, #e66 -30.58627px 19.11242px 0 -4.06667px, #e66 -29.95589px 20.2055px 0 -4.13333px, #e66 -29.28642px 21.27783px 0 -4.2px, #e66 -28.57852px 22.32799px 0 -4.26667px, #e66 -27.83295px 23.35462px 0 -4.33333px, #e66 -27.05047px 24.35635px 0 -4.4px, #e66 -26.23192px 25.33188px 0 -4.46667px, #e66 -25.37819px 26.27988px 0 -4.53333px, #e66 -24.49018px 27.1991px 0 -4.6px, #e66 -23.56888px 28.0883px 0 -4.66667px, #e66 -22.6153px 28.94626px 0 -4.73333px, #e66 -21.6305px 29.77183px 0 -4.8px, #e66 -20.61558px 30.56385px 0 -4.86667px, #e66 -19.57168px 31.32124px 0 -4.93333px, #e66 -18.5px 32.04294px 0 -5px, #e66 -17.40175px 32.72792px 0 -5.06667px, #e66 -16.27818px 33.37522px 0 -5.13333px, #e66 -15.1306px 33.98389px 0 -5.2px, #e66 -13.96034px 34.55305px 0 -5.26667px, #e66 -12.76875px 35.08186px 0 -5.33333px, #e66 -11.55724px 35.56951px 0 -5.4px, #e66 -10.32721px 36.01527px 0 -5.46667px, #e66 -9.08014px 36.41843px 0 -5.53333px, #e66 -7.81748px 36.77835px 0 -5.6px, #e66 -6.54075px 37.09443px 0 -5.66667px, #e66 -5.25147px 37.36612px 0 -5.73333px, #e66 -3.95118px 37.59293px 0 -5.8px, #e66 -2.64145px 37.77443px 0 -5.86667px, #e66 -1.32385px 37.91023px 0 -5.93333px; - -webkit-box-shadow: #e66 0px 26px 0 6px, #e66 0.90971px 26.05079px 0 5.93333px, #e66 1.82297px 26.06967px 0 5.86667px, #e66 2.73865px 26.05647px 0 5.8px, #e66 3.65561px 26.01104px 0 5.73333px, #e66 4.57274px 25.93327px 0 5.66667px, #e66 5.48887px 25.8231px 0 5.6px, #e66 6.40287px 25.68049px 0 5.53333px, #e66 7.31358px 25.50548px 0 5.46667px, #e66 8.21985px 25.2981px 0 5.4px, #e66 9.12054px 25.05847px 0 5.33333px, #e66 10.01448px 24.78672px 0 5.26667px, #e66 10.90054px 24.48302px 0 5.2px, #e66 11.77757px 24.1476px 0 5.13333px, #e66 12.64443px 23.78072px 0 5.06667px, #e66 13.5px 23.38269px 0 5px, #e66 14.34315px 22.95384px 0 4.93333px, #e66 15.17277px 22.49455px 0 4.86667px, #e66 15.98776px 22.00526px 0 4.8px, #e66 16.78704px 21.48643px 0 4.73333px, #e66 17.56953px 20.93855px 0 4.66667px, #e66 18.33418px 20.36217px 0 4.6px, #e66 19.07995px 19.75787px 0 4.53333px, #e66 19.80582px 19.12626px 0 4.46667px, #e66 20.5108px 18.468px 0 4.4px, #e66 21.1939px 17.78379px 0 4.33333px, #e66 21.85416px 17.07434px 0 4.26667px, #e66 22.49067px 16.34043px 0 4.2px, #e66 23.10251px 15.58284px 0 4.13333px, #e66 23.68881px 14.80241px 0 4.06667px, #e66 24.24871px 14.0px 0 4px, #e66 24.7814px 13.1765px 0 3.93333px, #e66 25.28607px 12.33284px 0 3.86667px, #e66 25.76198px 11.46997px 0 3.8px, #e66 26.2084px 10.58888px 0 3.73333px, #e66 26.62462px 9.69057px 0 3.66667px, #e66 27.01001px 8.77608px 0 3.6px, #e66 27.36392px 7.84648px 0 3.53333px, #e66 27.68577px 6.90284px 0 3.46667px, #e66 27.97502px 5.94627px 0 3.4px, #e66 28.23116px 4.97791px 0 3.33333px, #e66 28.4537px 3.99891px 0 3.26667px, #e66 28.64223px 3.01042px 0 3.2px, #e66 28.79635px 2.01364px 0 3.13333px, #e66 28.91571px 1.00976px 0 3.06667px, #e66 29px 0.0px 0 3px, #e66 29.04896px -1.01441px 0 2.93333px, #e66 29.06237px -2.03224px 0 2.86667px, #e66 29.04004px -3.05223px 0 2.8px, #e66 28.98185px -4.07313px 0 2.73333px, #e66 28.88769px -5.09368px 0 2.66667px, #e66 28.75754px -6.1126px 0 2.6px, #e66 28.59138px -7.12863px 0 2.53333px, #e66 28.38926px -8.14049px 0 2.46667px, #e66 28.15127px -9.1469px 0 2.4px, #e66 27.87755px -10.1466px 0 2.33333px, #e66 27.56827px -11.1383px 0 2.26667px, #e66 27.22365px -12.12075px 0 2.2px, #e66 26.84398px -13.09268px 0 2.13333px, #e66 26.42956px -14.05285px 0 2.06667px, #e66 25.98076px -15.0px 0 2px, #e66 25.49798px -15.93291px 0 1.93333px, #e66 24.98167px -16.85035px 0 1.86667px, #e66 24.43231px -17.75111px 0 1.8px, #e66 23.85046px -18.63402px 0 1.73333px, #e66 23.23668px -19.49789px 0 1.66667px, #e66 22.5916px -20.34157px 0 1.6px, #e66 21.91589px -21.16393px 0 1.53333px, #e66 21.21024px -21.96384px 0 1.46667px, #e66 20.4754px -22.74023px 0 1.4px, #e66 19.71215px -23.49203px 0 1.33333px, #e66 18.92133px -24.2182px 0 1.26667px, #e66 18.10379px -24.91772px 0 1.2px, #e66 17.26042px -25.58963px 0 1.13333px, #e66 16.39217px -26.23295px 0 1.06667px, #e66 15.5px -26.84679px 0 1px, #e66 14.58492px -27.43024px 0 0.93333px, #e66 13.64796px -27.98245px 0 0.86667px, #e66 12.69018px -28.50262px 0 0.8px, #e66 11.7127px -28.98995px 0 0.73333px, #e66 10.71663px -29.4437px 0 0.66667px, #e66 9.70313px -29.86317px 0 0.6px, #e66 8.67339px -30.2477px 0 0.53333px, #e66 7.6286px -30.59666px 0 0.46667px, #e66 6.57001px -30.90946px 0 0.4px, #e66 5.49886px -31.18558px 0 0.33333px, #e66 4.41643px -31.42451px 0 0.26667px, #e66 3.32401px -31.6258px 0 0.2px, #e66 2.22291px -31.78904px 0 0.13333px, #e66 1.11446px -31.91388px 0 0.06667px, #e66 0.0px -32px 0 0px, #e66 -1.11911px -32.04713px 0 -0.06667px, #e66 -2.24151px -32.05506px 0 -0.13333px, #e66 -3.36582px -32.02361px 0 -0.2px, #e66 -4.49065px -31.95265px 0 -0.26667px, #e66 -5.61462px -31.84212px 0 -0.33333px, #e66 -6.73634px -31.69198px 0 -0.4px, #e66 -7.8544px -31.50227px 0 -0.46667px, #e66 -8.9674px -31.27305px 0 -0.53333px, #e66 -10.07395px -31.00444px 0 -0.6px, #e66 -11.17266px -30.69663px 0 -0.66667px, #e66 -12.26212px -30.34982px 0 -0.73333px, #e66 -13.34096px -29.96429px 0 -0.8px, #e66 -14.4078px -29.54036px 0 -0.86667px, #e66 -15.46126px -29.07841px 0 -0.93333px, #e66 -16.5px -28.57884px 0 -1px, #e66 -17.52266px -28.04212px 0 -1.06667px, #e66 -18.52792px -27.46878px 0 -1.13333px, #e66 -19.51447px -26.85936px 0 -1.2px, #e66 -20.48101px -26.21449px 0 -1.26667px, #e66 -21.42625px -25.53481px 0 -1.33333px, #e66 -22.34896px -24.82104px 0 -1.4px, #e66 -23.2479px -24.07391px 0 -1.46667px, #e66 -24.12186px -23.29421px 0 -1.53333px, #e66 -24.96967px -22.48279px 0 -1.6px, #e66 -25.79016px -21.64052px 0 -1.66667px, #e66 -26.58223px -20.76831px 0 -1.73333px, #e66 -27.34477px -19.86714px 0 -1.8px, #e66 -28.07674px -18.938px 0 -1.86667px, #e66 -28.7771px -17.98193px 0 -1.93333px, #e66 -29.44486px -17.0px 0 -2px, #e66 -30.07908px -15.99333px 0 -2.06667px, #e66 -30.67884px -14.96307px 0 -2.13333px, #e66 -31.24325px -13.91039px 0 -2.2px, #e66 -31.7715px -12.83652px 0 -2.26667px, #e66 -32.26278px -11.74269px 0 -2.33333px, #e66 -32.71634px -10.63018px 0 -2.4px, #e66 -33.13149px -9.5003px 0 -2.46667px, #e66 -33.50755px -8.35437px 0 -2.53333px, #e66 -33.84391px -7.19374px 0 -2.6px, #e66 -34.14px -6.0198px 0 -2.66667px, #e66 -34.39531px -4.83395px 0 -2.73333px, #e66 -34.60936px -3.63759px 0 -2.8px, #e66 -34.78173px -2.43218px 0 -2.86667px, #e66 -34.91205px -1.21916px 0 -2.93333px, #e66 -35px 0.0px 0 -3px, #e66 -35.04531px 1.22381px 0 -3.06667px, #e66 -35.04775px 2.45078px 0 -3.13333px, #e66 -35.00717px 3.6794px 0 -3.2px, #e66 -34.92345px 4.90817px 0 -3.26667px, #e66 -34.79654px 6.13557px 0 -3.33333px, #e66 -34.62643px 7.36007px 0 -3.4px, #e66 -34.41316px 8.58016px 0 -3.46667px, #e66 -34.15683px 9.79431px 0 -3.53333px, #e66 -33.85761px 11.001px 0 -3.6px, #e66 -33.5157px 12.19872px 0 -3.66667px, #e66 -33.13137px 13.38594px 0 -3.73333px, #e66 -32.70493px 14.56117px 0 -3.8px, #e66 -32.23675px 15.72291px 0 -3.86667px, #e66 -31.72725px 16.86968px 0 -3.93333px, #e66 -31.17691px 18px 0 -4px, #e66 -30.58627px 19.11242px 0 -4.06667px, #e66 -29.95589px 20.2055px 0 -4.13333px, #e66 -29.28642px 21.27783px 0 -4.2px, #e66 -28.57852px 22.32799px 0 -4.26667px, #e66 -27.83295px 23.35462px 0 -4.33333px, #e66 -27.05047px 24.35635px 0 -4.4px, #e66 -26.23192px 25.33188px 0 -4.46667px, #e66 -25.37819px 26.27988px 0 -4.53333px, #e66 -24.49018px 27.1991px 0 -4.6px, #e66 -23.56888px 28.0883px 0 -4.66667px, #e66 -22.6153px 28.94626px 0 -4.73333px, #e66 -21.6305px 29.77183px 0 -4.8px, #e66 -20.61558px 30.56385px 0 -4.86667px, #e66 -19.57168px 31.32124px 0 -4.93333px, #e66 -18.5px 32.04294px 0 -5px, #e66 -17.40175px 32.72792px 0 -5.06667px, #e66 -16.27818px 33.37522px 0 -5.13333px, #e66 -15.1306px 33.98389px 0 -5.2px, #e66 -13.96034px 34.55305px 0 -5.26667px, #e66 -12.76875px 35.08186px 0 -5.33333px, #e66 -11.55724px 35.56951px 0 -5.4px, #e66 -10.32721px 36.01527px 0 -5.46667px, #e66 -9.08014px 36.41843px 0 -5.53333px, #e66 -7.81748px 36.77835px 0 -5.6px, #e66 -6.54075px 37.09443px 0 -5.66667px, #e66 -5.25147px 37.36612px 0 -5.73333px, #e66 -3.95118px 37.59293px 0 -5.8px, #e66 -2.64145px 37.77443px 0 -5.86667px, #e66 -1.32385px 37.91023px 0 -5.93333px; - box-shadow: #e66 0px 26px 0 6px, #e66 0.90971px 26.05079px 0 5.93333px, #e66 1.82297px 26.06967px 0 5.86667px, #e66 2.73865px 26.05647px 0 5.8px, #e66 3.65561px 26.01104px 0 5.73333px, #e66 4.57274px 25.93327px 0 5.66667px, #e66 5.48887px 25.8231px 0 5.6px, #e66 6.40287px 25.68049px 0 5.53333px, #e66 7.31358px 25.50548px 0 5.46667px, #e66 8.21985px 25.2981px 0 5.4px, #e66 9.12054px 25.05847px 0 5.33333px, #e66 10.01448px 24.78672px 0 5.26667px, #e66 10.90054px 24.48302px 0 5.2px, #e66 11.77757px 24.1476px 0 5.13333px, #e66 12.64443px 23.78072px 0 5.06667px, #e66 13.5px 23.38269px 0 5px, #e66 14.34315px 22.95384px 0 4.93333px, #e66 15.17277px 22.49455px 0 4.86667px, #e66 15.98776px 22.00526px 0 4.8px, #e66 16.78704px 21.48643px 0 4.73333px, #e66 17.56953px 20.93855px 0 4.66667px, #e66 18.33418px 20.36217px 0 4.6px, #e66 19.07995px 19.75787px 0 4.53333px, #e66 19.80582px 19.12626px 0 4.46667px, #e66 20.5108px 18.468px 0 4.4px, #e66 21.1939px 17.78379px 0 4.33333px, #e66 21.85416px 17.07434px 0 4.26667px, #e66 22.49067px 16.34043px 0 4.2px, #e66 23.10251px 15.58284px 0 4.13333px, #e66 23.68881px 14.80241px 0 4.06667px, #e66 24.24871px 14.0px 0 4px, #e66 24.7814px 13.1765px 0 3.93333px, #e66 25.28607px 12.33284px 0 3.86667px, #e66 25.76198px 11.46997px 0 3.8px, #e66 26.2084px 10.58888px 0 3.73333px, #e66 26.62462px 9.69057px 0 3.66667px, #e66 27.01001px 8.77608px 0 3.6px, #e66 27.36392px 7.84648px 0 3.53333px, #e66 27.68577px 6.90284px 0 3.46667px, #e66 27.97502px 5.94627px 0 3.4px, #e66 28.23116px 4.97791px 0 3.33333px, #e66 28.4537px 3.99891px 0 3.26667px, #e66 28.64223px 3.01042px 0 3.2px, #e66 28.79635px 2.01364px 0 3.13333px, #e66 28.91571px 1.00976px 0 3.06667px, #e66 29px 0.0px 0 3px, #e66 29.04896px -1.01441px 0 2.93333px, #e66 29.06237px -2.03224px 0 2.86667px, #e66 29.04004px -3.05223px 0 2.8px, #e66 28.98185px -4.07313px 0 2.73333px, #e66 28.88769px -5.09368px 0 2.66667px, #e66 28.75754px -6.1126px 0 2.6px, #e66 28.59138px -7.12863px 0 2.53333px, #e66 28.38926px -8.14049px 0 2.46667px, #e66 28.15127px -9.1469px 0 2.4px, #e66 27.87755px -10.1466px 0 2.33333px, #e66 27.56827px -11.1383px 0 2.26667px, #e66 27.22365px -12.12075px 0 2.2px, #e66 26.84398px -13.09268px 0 2.13333px, #e66 26.42956px -14.05285px 0 2.06667px, #e66 25.98076px -15.0px 0 2px, #e66 25.49798px -15.93291px 0 1.93333px, #e66 24.98167px -16.85035px 0 1.86667px, #e66 24.43231px -17.75111px 0 1.8px, #e66 23.85046px -18.63402px 0 1.73333px, #e66 23.23668px -19.49789px 0 1.66667px, #e66 22.5916px -20.34157px 0 1.6px, #e66 21.91589px -21.16393px 0 1.53333px, #e66 21.21024px -21.96384px 0 1.46667px, #e66 20.4754px -22.74023px 0 1.4px, #e66 19.71215px -23.49203px 0 1.33333px, #e66 18.92133px -24.2182px 0 1.26667px, #e66 18.10379px -24.91772px 0 1.2px, #e66 17.26042px -25.58963px 0 1.13333px, #e66 16.39217px -26.23295px 0 1.06667px, #e66 15.5px -26.84679px 0 1px, #e66 14.58492px -27.43024px 0 0.93333px, #e66 13.64796px -27.98245px 0 0.86667px, #e66 12.69018px -28.50262px 0 0.8px, #e66 11.7127px -28.98995px 0 0.73333px, #e66 10.71663px -29.4437px 0 0.66667px, #e66 9.70313px -29.86317px 0 0.6px, #e66 8.67339px -30.2477px 0 0.53333px, #e66 7.6286px -30.59666px 0 0.46667px, #e66 6.57001px -30.90946px 0 0.4px, #e66 5.49886px -31.18558px 0 0.33333px, #e66 4.41643px -31.42451px 0 0.26667px, #e66 3.32401px -31.6258px 0 0.2px, #e66 2.22291px -31.78904px 0 0.13333px, #e66 1.11446px -31.91388px 0 0.06667px, #e66 0.0px -32px 0 0px, #e66 -1.11911px -32.04713px 0 -0.06667px, #e66 -2.24151px -32.05506px 0 -0.13333px, #e66 -3.36582px -32.02361px 0 -0.2px, #e66 -4.49065px -31.95265px 0 -0.26667px, #e66 -5.61462px -31.84212px 0 -0.33333px, #e66 -6.73634px -31.69198px 0 -0.4px, #e66 -7.8544px -31.50227px 0 -0.46667px, #e66 -8.9674px -31.27305px 0 -0.53333px, #e66 -10.07395px -31.00444px 0 -0.6px, #e66 -11.17266px -30.69663px 0 -0.66667px, #e66 -12.26212px -30.34982px 0 -0.73333px, #e66 -13.34096px -29.96429px 0 -0.8px, #e66 -14.4078px -29.54036px 0 -0.86667px, #e66 -15.46126px -29.07841px 0 -0.93333px, #e66 -16.5px -28.57884px 0 -1px, #e66 -17.52266px -28.04212px 0 -1.06667px, #e66 -18.52792px -27.46878px 0 -1.13333px, #e66 -19.51447px -26.85936px 0 -1.2px, #e66 -20.48101px -26.21449px 0 -1.26667px, #e66 -21.42625px -25.53481px 0 -1.33333px, #e66 -22.34896px -24.82104px 0 -1.4px, #e66 -23.2479px -24.07391px 0 -1.46667px, #e66 -24.12186px -23.29421px 0 -1.53333px, #e66 -24.96967px -22.48279px 0 -1.6px, #e66 -25.79016px -21.64052px 0 -1.66667px, #e66 -26.58223px -20.76831px 0 -1.73333px, #e66 -27.34477px -19.86714px 0 -1.8px, #e66 -28.07674px -18.938px 0 -1.86667px, #e66 -28.7771px -17.98193px 0 -1.93333px, #e66 -29.44486px -17.0px 0 -2px, #e66 -30.07908px -15.99333px 0 -2.06667px, #e66 -30.67884px -14.96307px 0 -2.13333px, #e66 -31.24325px -13.91039px 0 -2.2px, #e66 -31.7715px -12.83652px 0 -2.26667px, #e66 -32.26278px -11.74269px 0 -2.33333px, #e66 -32.71634px -10.63018px 0 -2.4px, #e66 -33.13149px -9.5003px 0 -2.46667px, #e66 -33.50755px -8.35437px 0 -2.53333px, #e66 -33.84391px -7.19374px 0 -2.6px, #e66 -34.14px -6.0198px 0 -2.66667px, #e66 -34.39531px -4.83395px 0 -2.73333px, #e66 -34.60936px -3.63759px 0 -2.8px, #e66 -34.78173px -2.43218px 0 -2.86667px, #e66 -34.91205px -1.21916px 0 -2.93333px, #e66 -35px 0.0px 0 -3px, #e66 -35.04531px 1.22381px 0 -3.06667px, #e66 -35.04775px 2.45078px 0 -3.13333px, #e66 -35.00717px 3.6794px 0 -3.2px, #e66 -34.92345px 4.90817px 0 -3.26667px, #e66 -34.79654px 6.13557px 0 -3.33333px, #e66 -34.62643px 7.36007px 0 -3.4px, #e66 -34.41316px 8.58016px 0 -3.46667px, #e66 -34.15683px 9.79431px 0 -3.53333px, #e66 -33.85761px 11.001px 0 -3.6px, #e66 -33.5157px 12.19872px 0 -3.66667px, #e66 -33.13137px 13.38594px 0 -3.73333px, #e66 -32.70493px 14.56117px 0 -3.8px, #e66 -32.23675px 15.72291px 0 -3.86667px, #e66 -31.72725px 16.86968px 0 -3.93333px, #e66 -31.17691px 18px 0 -4px, #e66 -30.58627px 19.11242px 0 -4.06667px, #e66 -29.95589px 20.2055px 0 -4.13333px, #e66 -29.28642px 21.27783px 0 -4.2px, #e66 -28.57852px 22.32799px 0 -4.26667px, #e66 -27.83295px 23.35462px 0 -4.33333px, #e66 -27.05047px 24.35635px 0 -4.4px, #e66 -26.23192px 25.33188px 0 -4.46667px, #e66 -25.37819px 26.27988px 0 -4.53333px, #e66 -24.49018px 27.1991px 0 -4.6px, #e66 -23.56888px 28.0883px 0 -4.66667px, #e66 -22.6153px 28.94626px 0 -4.73333px, #e66 -21.6305px 29.77183px 0 -4.8px, #e66 -20.61558px 30.56385px 0 -4.86667px, #e66 -19.57168px 31.32124px 0 -4.93333px, #e66 -18.5px 32.04294px 0 -5px, #e66 -17.40175px 32.72792px 0 -5.06667px, #e66 -16.27818px 33.37522px 0 -5.13333px, #e66 -15.1306px 33.98389px 0 -5.2px, #e66 -13.96034px 34.55305px 0 -5.26667px, #e66 -12.76875px 35.08186px 0 -5.33333px, #e66 -11.55724px 35.56951px 0 -5.4px, #e66 -10.32721px 36.01527px 0 -5.46667px, #e66 -9.08014px 36.41843px 0 -5.53333px, #e66 -7.81748px 36.77835px 0 -5.6px, #e66 -6.54075px 37.09443px 0 -5.66667px, #e66 -5.25147px 37.36612px 0 -5.73333px, #e66 -3.95118px 37.59293px 0 -5.8px, #e66 -2.64145px 37.77443px 0 -5.86667px, #e66 -1.32385px 37.91023px 0 -5.93333px; - -moz-animation: whirly-loader 1.25s infinite linear; - -webkit-animation: whirly-loader 1.25s infinite linear; - animation: whirly-loader 1.25s infinite linear; - -moz-transform-origin: 50% 50%; - -ms-transform-origin: 50% 50%; - -webkit-transform-origin: 50% 50%; - transform-origin: 50% 50%; -} - -@-moz-keyframes flower-loader { - 0% { - -moz-transform: rotate(0deg); - transform: rotate(0deg); - -moz-box-shadow: white 0 0 15px 0, #fd8 -12px -12px 0 4px, #fd8 12px -12px 0 4px, #fd8 12px 12px 0 4px, #fd8 -12px 12px 0 4px; - box-shadow: white 0 0 15px 0, #fd8 -12px -12px 0 4px, #fd8 12px -12px 0 4px, #fd8 12px 12px 0 4px, #fd8 -12px 12px 0 4px; - } - 50% { - -moz-transform: rotate(1080deg); - transform: rotate(1080deg); - -moz-box-shadow: white 0 0 15px 0, #fd8 12px 12px 0 4px, #fd8 -12px 12px 0 4px, #fd8 -12px -12px 0 4px, #fd8 12px -12px 0 4px; - box-shadow: white 0 0 15px 0, #fd8 12px 12px 0 4px, #fd8 -12px 12px 0 4px, #fd8 -12px -12px 0 4px, #fd8 12px -12px 0 4px; - } -} -@-webkit-keyframes flower-loader { - 0% { - -webkit-transform: rotate(0deg); - transform: rotate(0deg); - -webkit-box-shadow: white 0 0 15px 0, #fd8 -12px -12px 0 4px, #fd8 12px -12px 0 4px, #fd8 12px 12px 0 4px, #fd8 -12px 12px 0 4px; - box-shadow: white 0 0 15px 0, #fd8 -12px -12px 0 4px, #fd8 12px -12px 0 4px, #fd8 12px 12px 0 4px, #fd8 -12px 12px 0 4px; - } - 50% { - -webkit-transform: rotate(1080deg); - transform: rotate(1080deg); - -webkit-box-shadow: white 0 0 15px 0, #fd8 12px 12px 0 4px, #fd8 -12px 12px 0 4px, #fd8 -12px -12px 0 4px, #fd8 12px -12px 0 4px; - box-shadow: white 0 0 15px 0, #fd8 12px 12px 0 4px, #fd8 -12px 12px 0 4px, #fd8 -12px -12px 0 4px, #fd8 12px -12px 0 4px; - } -} -@keyframes flower-loader { - 0% { - -moz-transform: rotate(0deg); - -ms-transform: rotate(0deg); - -webkit-transform: rotate(0deg); - transform: rotate(0deg); - -moz-box-shadow: white 0 0 15px 0, #fd8 -12px -12px 0 4px, #fd8 12px -12px 0 4px, #fd8 12px 12px 0 4px, #fd8 -12px 12px 0 4px; - -webkit-box-shadow: white 0 0 15px 0, #fd8 -12px -12px 0 4px, #fd8 12px -12px 0 4px, #fd8 12px 12px 0 4px, #fd8 -12px 12px 0 4px; - box-shadow: white 0 0 15px 0, #fd8 -12px -12px 0 4px, #fd8 12px -12px 0 4px, #fd8 12px 12px 0 4px, #fd8 -12px 12px 0 4px; - } - 50% { - -moz-transform: rotate(1080deg); - -ms-transform: rotate(1080deg); - -webkit-transform: rotate(1080deg); - transform: rotate(1080deg); - -moz-box-shadow: white 0 0 15px 0, #fd8 12px 12px 0 4px, #fd8 -12px 12px 0 4px, #fd8 -12px -12px 0 4px, #fd8 12px -12px 0 4px; - -webkit-box-shadow: white 0 0 15px 0, #fd8 12px 12px 0 4px, #fd8 -12px 12px 0 4px, #fd8 -12px -12px 0 4px, #fd8 12px -12px 0 4px; - box-shadow: white 0 0 15px 0, #fd8 12px 12px 0 4px, #fd8 -12px 12px 0 4px, #fd8 -12px -12px 0 4px, #fd8 12px -12px 0 4px; - } -} -/* :not(:required) hides this rule from IE9 and below */ -.flower-loader:not(:required) { - overflow: hidden; - position: relative; - text-indent: -9999px; - display: inline-block; - width: 16px; - height: 16px; - background: #e96; - border-radius: 100%; - -moz-box-shadow: white 0 0 15px 0, #fd8 -12px -12px 0 4px, #fd8 12px -12px 0 4px, #fd8 12px 12px 0 4px, #fd8 -12px 12px 0 4px; - -webkit-box-shadow: white 0 0 15px 0, #fd8 -12px -12px 0 4px, #fd8 12px -12px 0 4px, #fd8 12px 12px 0 4px, #fd8 -12px 12px 0 4px; - box-shadow: white 0 0 15px 0, #fd8 -12px -12px 0 4px, #fd8 12px -12px 0 4px, #fd8 12px 12px 0 4px, #fd8 -12px 12px 0 4px; - -moz-animation: flower-loader 5s infinite ease-in-out; - -webkit-animation: flower-loader 5s infinite ease-in-out; - animation: flower-loader 5s infinite ease-in-out; - -moz-transform-origin: 50% 50%; - -ms-transform-origin: 50% 50%; - -webkit-transform-origin: 50% 50%; - transform-origin: 50% 50%; -} - -@-moz-keyframes dots-loader { - 0% { - -moz-box-shadow: #f86 -14px -14px 0 7px, #fc6 14px -14px 0 7px, #6d7 14px 14px 0 7px, #4ae -14px 14px 0 7px; - box-shadow: #f86 -14px -14px 0 7px, #fc6 14px -14px 0 7px, #6d7 14px 14px 0 7px, #4ae -14px 14px 0 7px; - } - 8.33% { - -moz-box-shadow: #f86 14px -14px 0 7px, #fc6 14px -14px 0 7px, #6d7 14px 14px 0 7px, #4ae -14px 14px 0 7px; - box-shadow: #f86 14px -14px 0 7px, #fc6 14px -14px 0 7px, #6d7 14px 14px 0 7px, #4ae -14px 14px 0 7px; - } - 16.67% { - -moz-box-shadow: #f86 14px 14px 0 7px, #fc6 14px 14px 0 7px, #6d7 14px 14px 0 7px, #4ae -14px 14px 0 7px; - box-shadow: #f86 14px 14px 0 7px, #fc6 14px 14px 0 7px, #6d7 14px 14px 0 7px, #4ae -14px 14px 0 7px; - } - 25% { - -moz-box-shadow: #f86 -14px 14px 0 7px, #fc6 -14px 14px 0 7px, #6d7 -14px 14px 0 7px, #4ae -14px 14px 0 7px; - box-shadow: #f86 -14px 14px 0 7px, #fc6 -14px 14px 0 7px, #6d7 -14px 14px 0 7px, #4ae -14px 14px 0 7px; - } - 33.33% { - -moz-box-shadow: #f86 -14px -14px 0 7px, #fc6 -14px 14px 0 7px, #6d7 -14px -14px 0 7px, #4ae -14px -14px 0 7px; - box-shadow: #f86 -14px -14px 0 7px, #fc6 -14px 14px 0 7px, #6d7 -14px -14px 0 7px, #4ae -14px -14px 0 7px; - } - 41.67% { - -moz-box-shadow: #f86 14px -14px 0 7px, #fc6 -14px 14px 0 7px, #6d7 -14px -14px 0 7px, #4ae 14px -14px 0 7px; - box-shadow: #f86 14px -14px 0 7px, #fc6 -14px 14px 0 7px, #6d7 -14px -14px 0 7px, #4ae 14px -14px 0 7px; - } - 50% { - -moz-box-shadow: #f86 14px 14px 0 7px, #fc6 -14px 14px 0 7px, #6d7 -14px -14px 0 7px, #4ae 14px -14px 0 7px; - box-shadow: #f86 14px 14px 0 7px, #fc6 -14px 14px 0 7px, #6d7 -14px -14px 0 7px, #4ae 14px -14px 0 7px; - } - 58.33% { - -moz-box-shadow: #f86 -14px 14px 0 7px, #fc6 -14px 14px 0 7px, #6d7 -14px -14px 0 7px, #4ae 14px -14px 0 7px; - box-shadow: #f86 -14px 14px 0 7px, #fc6 -14px 14px 0 7px, #6d7 -14px -14px 0 7px, #4ae 14px -14px 0 7px; - } - 66.67% { - -moz-box-shadow: #f86 -14px -14px 0 7px, #fc6 -14px -14px 0 7px, #6d7 -14px -14px 0 7px, #4ae 14px -14px 0 7px; - box-shadow: #f86 -14px -14px 0 7px, #fc6 -14px -14px 0 7px, #6d7 -14px -14px 0 7px, #4ae 14px -14px 0 7px; - } - 75% { - -moz-box-shadow: #f86 14px -14px 0 7px, #fc6 14px -14px 0 7px, #6d7 14px -14px 0 7px, #4ae 14px -14px 0 7px; - box-shadow: #f86 14px -14px 0 7px, #fc6 14px -14px 0 7px, #6d7 14px -14px 0 7px, #4ae 14px -14px 0 7px; - } - 83.33% { - -moz-box-shadow: #f86 14px 14px 0 7px, #fc6 14px -14px 0 7px, #6d7 14px 14px 0 7px, #4ae 14px 14px 0 7px; - box-shadow: #f86 14px 14px 0 7px, #fc6 14px -14px 0 7px, #6d7 14px 14px 0 7px, #4ae 14px 14px 0 7px; - } - 91.67% { - -moz-box-shadow: #f86 -14px 14px 0 7px, #fc6 14px -14px 0 7px, #6d7 14px 14px 0 7px, #4ae -14px 14px 0 7px; - box-shadow: #f86 -14px 14px 0 7px, #fc6 14px -14px 0 7px, #6d7 14px 14px 0 7px, #4ae -14px 14px 0 7px; - } - 100% { - -moz-box-shadow: #f86 -14px -14px 0 7px, #fc6 14px -14px 0 7px, #6d7 14px 14px 0 7px, #4ae -14px 14px 0 7px; - box-shadow: #f86 -14px -14px 0 7px, #fc6 14px -14px 0 7px, #6d7 14px 14px 0 7px, #4ae -14px 14px 0 7px; - } -} -@-webkit-keyframes dots-loader { - 0% { - -webkit-box-shadow: #f86 -14px -14px 0 7px, #fc6 14px -14px 0 7px, #6d7 14px 14px 0 7px, #4ae -14px 14px 0 7px; - box-shadow: #f86 -14px -14px 0 7px, #fc6 14px -14px 0 7px, #6d7 14px 14px 0 7px, #4ae -14px 14px 0 7px; - } - 8.33% { - -webkit-box-shadow: #f86 14px -14px 0 7px, #fc6 14px -14px 0 7px, #6d7 14px 14px 0 7px, #4ae -14px 14px 0 7px; - box-shadow: #f86 14px -14px 0 7px, #fc6 14px -14px 0 7px, #6d7 14px 14px 0 7px, #4ae -14px 14px 0 7px; - } - 16.67% { - -webkit-box-shadow: #f86 14px 14px 0 7px, #fc6 14px 14px 0 7px, #6d7 14px 14px 0 7px, #4ae -14px 14px 0 7px; - box-shadow: #f86 14px 14px 0 7px, #fc6 14px 14px 0 7px, #6d7 14px 14px 0 7px, #4ae -14px 14px 0 7px; - } - 25% { - -webkit-box-shadow: #f86 -14px 14px 0 7px, #fc6 -14px 14px 0 7px, #6d7 -14px 14px 0 7px, #4ae -14px 14px 0 7px; - box-shadow: #f86 -14px 14px 0 7px, #fc6 -14px 14px 0 7px, #6d7 -14px 14px 0 7px, #4ae -14px 14px 0 7px; - } - 33.33% { - -webkit-box-shadow: #f86 -14px -14px 0 7px, #fc6 -14px 14px 0 7px, #6d7 -14px -14px 0 7px, #4ae -14px -14px 0 7px; - box-shadow: #f86 -14px -14px 0 7px, #fc6 -14px 14px 0 7px, #6d7 -14px -14px 0 7px, #4ae -14px -14px 0 7px; - } - 41.67% { - -webkit-box-shadow: #f86 14px -14px 0 7px, #fc6 -14px 14px 0 7px, #6d7 -14px -14px 0 7px, #4ae 14px -14px 0 7px; - box-shadow: #f86 14px -14px 0 7px, #fc6 -14px 14px 0 7px, #6d7 -14px -14px 0 7px, #4ae 14px -14px 0 7px; - } - 50% { - -webkit-box-shadow: #f86 14px 14px 0 7px, #fc6 -14px 14px 0 7px, #6d7 -14px -14px 0 7px, #4ae 14px -14px 0 7px; - box-shadow: #f86 14px 14px 0 7px, #fc6 -14px 14px 0 7px, #6d7 -14px -14px 0 7px, #4ae 14px -14px 0 7px; - } - 58.33% { - -webkit-box-shadow: #f86 -14px 14px 0 7px, #fc6 -14px 14px 0 7px, #6d7 -14px -14px 0 7px, #4ae 14px -14px 0 7px; - box-shadow: #f86 -14px 14px 0 7px, #fc6 -14px 14px 0 7px, #6d7 -14px -14px 0 7px, #4ae 14px -14px 0 7px; - } - 66.67% { - -webkit-box-shadow: #f86 -14px -14px 0 7px, #fc6 -14px -14px 0 7px, #6d7 -14px -14px 0 7px, #4ae 14px -14px 0 7px; - box-shadow: #f86 -14px -14px 0 7px, #fc6 -14px -14px 0 7px, #6d7 -14px -14px 0 7px, #4ae 14px -14px 0 7px; - } - 75% { - -webkit-box-shadow: #f86 14px -14px 0 7px, #fc6 14px -14px 0 7px, #6d7 14px -14px 0 7px, #4ae 14px -14px 0 7px; - box-shadow: #f86 14px -14px 0 7px, #fc6 14px -14px 0 7px, #6d7 14px -14px 0 7px, #4ae 14px -14px 0 7px; - } - 83.33% { - -webkit-box-shadow: #f86 14px 14px 0 7px, #fc6 14px -14px 0 7px, #6d7 14px 14px 0 7px, #4ae 14px 14px 0 7px; - box-shadow: #f86 14px 14px 0 7px, #fc6 14px -14px 0 7px, #6d7 14px 14px 0 7px, #4ae 14px 14px 0 7px; - } - 91.67% { - -webkit-box-shadow: #f86 -14px 14px 0 7px, #fc6 14px -14px 0 7px, #6d7 14px 14px 0 7px, #4ae -14px 14px 0 7px; - box-shadow: #f86 -14px 14px 0 7px, #fc6 14px -14px 0 7px, #6d7 14px 14px 0 7px, #4ae -14px 14px 0 7px; - } - 100% { - -webkit-box-shadow: #f86 -14px -14px 0 7px, #fc6 14px -14px 0 7px, #6d7 14px 14px 0 7px, #4ae -14px 14px 0 7px; - box-shadow: #f86 -14px -14px 0 7px, #fc6 14px -14px 0 7px, #6d7 14px 14px 0 7px, #4ae -14px 14px 0 7px; - } -} -@keyframes dots-loader { - 0% { - -moz-box-shadow: #f86 -14px -14px 0 7px, #fc6 14px -14px 0 7px, #6d7 14px 14px 0 7px, #4ae -14px 14px 0 7px; - -webkit-box-shadow: #f86 -14px -14px 0 7px, #fc6 14px -14px 0 7px, #6d7 14px 14px 0 7px, #4ae -14px 14px 0 7px; - box-shadow: #f86 -14px -14px 0 7px, #fc6 14px -14px 0 7px, #6d7 14px 14px 0 7px, #4ae -14px 14px 0 7px; - } - 8.33% { - -moz-box-shadow: #f86 14px -14px 0 7px, #fc6 14px -14px 0 7px, #6d7 14px 14px 0 7px, #4ae -14px 14px 0 7px; - -webkit-box-shadow: #f86 14px -14px 0 7px, #fc6 14px -14px 0 7px, #6d7 14px 14px 0 7px, #4ae -14px 14px 0 7px; - box-shadow: #f86 14px -14px 0 7px, #fc6 14px -14px 0 7px, #6d7 14px 14px 0 7px, #4ae -14px 14px 0 7px; - } - 16.67% { - -moz-box-shadow: #f86 14px 14px 0 7px, #fc6 14px 14px 0 7px, #6d7 14px 14px 0 7px, #4ae -14px 14px 0 7px; - -webkit-box-shadow: #f86 14px 14px 0 7px, #fc6 14px 14px 0 7px, #6d7 14px 14px 0 7px, #4ae -14px 14px 0 7px; - box-shadow: #f86 14px 14px 0 7px, #fc6 14px 14px 0 7px, #6d7 14px 14px 0 7px, #4ae -14px 14px 0 7px; - } - 25% { - -moz-box-shadow: #f86 -14px 14px 0 7px, #fc6 -14px 14px 0 7px, #6d7 -14px 14px 0 7px, #4ae -14px 14px 0 7px; - -webkit-box-shadow: #f86 -14px 14px 0 7px, #fc6 -14px 14px 0 7px, #6d7 -14px 14px 0 7px, #4ae -14px 14px 0 7px; - box-shadow: #f86 -14px 14px 0 7px, #fc6 -14px 14px 0 7px, #6d7 -14px 14px 0 7px, #4ae -14px 14px 0 7px; - } - 33.33% { - -moz-box-shadow: #f86 -14px -14px 0 7px, #fc6 -14px 14px 0 7px, #6d7 -14px -14px 0 7px, #4ae -14px -14px 0 7px; - -webkit-box-shadow: #f86 -14px -14px 0 7px, #fc6 -14px 14px 0 7px, #6d7 -14px -14px 0 7px, #4ae -14px -14px 0 7px; - box-shadow: #f86 -14px -14px 0 7px, #fc6 -14px 14px 0 7px, #6d7 -14px -14px 0 7px, #4ae -14px -14px 0 7px; - } - 41.67% { - -moz-box-shadow: #f86 14px -14px 0 7px, #fc6 -14px 14px 0 7px, #6d7 -14px -14px 0 7px, #4ae 14px -14px 0 7px; - -webkit-box-shadow: #f86 14px -14px 0 7px, #fc6 -14px 14px 0 7px, #6d7 -14px -14px 0 7px, #4ae 14px -14px 0 7px; - box-shadow: #f86 14px -14px 0 7px, #fc6 -14px 14px 0 7px, #6d7 -14px -14px 0 7px, #4ae 14px -14px 0 7px; - } - 50% { - -moz-box-shadow: #f86 14px 14px 0 7px, #fc6 -14px 14px 0 7px, #6d7 -14px -14px 0 7px, #4ae 14px -14px 0 7px; - -webkit-box-shadow: #f86 14px 14px 0 7px, #fc6 -14px 14px 0 7px, #6d7 -14px -14px 0 7px, #4ae 14px -14px 0 7px; - box-shadow: #f86 14px 14px 0 7px, #fc6 -14px 14px 0 7px, #6d7 -14px -14px 0 7px, #4ae 14px -14px 0 7px; - } - 58.33% { - -moz-box-shadow: #f86 -14px 14px 0 7px, #fc6 -14px 14px 0 7px, #6d7 -14px -14px 0 7px, #4ae 14px -14px 0 7px; - -webkit-box-shadow: #f86 -14px 14px 0 7px, #fc6 -14px 14px 0 7px, #6d7 -14px -14px 0 7px, #4ae 14px -14px 0 7px; - box-shadow: #f86 -14px 14px 0 7px, #fc6 -14px 14px 0 7px, #6d7 -14px -14px 0 7px, #4ae 14px -14px 0 7px; - } - 66.67% { - -moz-box-shadow: #f86 -14px -14px 0 7px, #fc6 -14px -14px 0 7px, #6d7 -14px -14px 0 7px, #4ae 14px -14px 0 7px; - -webkit-box-shadow: #f86 -14px -14px 0 7px, #fc6 -14px -14px 0 7px, #6d7 -14px -14px 0 7px, #4ae 14px -14px 0 7px; - box-shadow: #f86 -14px -14px 0 7px, #fc6 -14px -14px 0 7px, #6d7 -14px -14px 0 7px, #4ae 14px -14px 0 7px; - } - 75% { - -moz-box-shadow: #f86 14px -14px 0 7px, #fc6 14px -14px 0 7px, #6d7 14px -14px 0 7px, #4ae 14px -14px 0 7px; - -webkit-box-shadow: #f86 14px -14px 0 7px, #fc6 14px -14px 0 7px, #6d7 14px -14px 0 7px, #4ae 14px -14px 0 7px; - box-shadow: #f86 14px -14px 0 7px, #fc6 14px -14px 0 7px, #6d7 14px -14px 0 7px, #4ae 14px -14px 0 7px; - } - 83.33% { - -moz-box-shadow: #f86 14px 14px 0 7px, #fc6 14px -14px 0 7px, #6d7 14px 14px 0 7px, #4ae 14px 14px 0 7px; - -webkit-box-shadow: #f86 14px 14px 0 7px, #fc6 14px -14px 0 7px, #6d7 14px 14px 0 7px, #4ae 14px 14px 0 7px; - box-shadow: #f86 14px 14px 0 7px, #fc6 14px -14px 0 7px, #6d7 14px 14px 0 7px, #4ae 14px 14px 0 7px; - } - 91.67% { - -moz-box-shadow: #f86 -14px 14px 0 7px, #fc6 14px -14px 0 7px, #6d7 14px 14px 0 7px, #4ae -14px 14px 0 7px; - -webkit-box-shadow: #f86 -14px 14px 0 7px, #fc6 14px -14px 0 7px, #6d7 14px 14px 0 7px, #4ae -14px 14px 0 7px; - box-shadow: #f86 -14px 14px 0 7px, #fc6 14px -14px 0 7px, #6d7 14px 14px 0 7px, #4ae -14px 14px 0 7px; - } - 100% { - -moz-box-shadow: #f86 -14px -14px 0 7px, #fc6 14px -14px 0 7px, #6d7 14px 14px 0 7px, #4ae -14px 14px 0 7px; - -webkit-box-shadow: #f86 -14px -14px 0 7px, #fc6 14px -14px 0 7px, #6d7 14px 14px 0 7px, #4ae -14px 14px 0 7px; - box-shadow: #f86 -14px -14px 0 7px, #fc6 14px -14px 0 7px, #6d7 14px 14px 0 7px, #4ae -14px 14px 0 7px; - } -} -/* :not(:required) hides this rule from IE9 and below */ -.dots-loader:not(:required) { - overflow: hidden; - position: relative; - text-indent: -9999px; - display: inline-block; - width: 7px; - height: 7px; - background: transparent; - border-radius: 100%; - -moz-box-shadow: #f86 -14px -14px 0 7px, #fc6 14px -14px 0 7px, #6d7 14px 14px 0 7px, #4ae -14px 14px 0 7px; - -webkit-box-shadow: #f86 -14px -14px 0 7px, #fc6 14px -14px 0 7px, #6d7 14px 14px 0 7px, #4ae -14px 14px 0 7px; - box-shadow: #f86 -14px -14px 0 7px, #fc6 14px -14px 0 7px, #6d7 14px 14px 0 7px, #4ae -14px 14px 0 7px; - -moz-animation: dots-loader 5s infinite ease-in-out; - -webkit-animation: dots-loader 5s infinite ease-in-out; - animation: dots-loader 5s infinite ease-in-out; - -moz-transform-origin: 50% 50%; - -ms-transform-origin: 50% 50%; - -webkit-transform-origin: 50% 50%; - transform-origin: 50% 50%; -} - -@-moz-keyframes circles-loader { - 0% { - -moz-transform: rotate(-720deg); - transform: rotate(-720deg); - } - 50% { - -moz-transform: rotate(720deg); - transform: rotate(720deg); - } -} -@-webkit-keyframes circles-loader { - 0% { - -webkit-transform: rotate(-720deg); - transform: rotate(-720deg); - } - 50% { - -webkit-transform: rotate(720deg); - transform: rotate(720deg); - } -} -@keyframes circles-loader { - 0% { - -moz-transform: rotate(-720deg); - -ms-transform: rotate(-720deg); - -webkit-transform: rotate(-720deg); - transform: rotate(-720deg); - } - 50% { - -moz-transform: rotate(720deg); - -ms-transform: rotate(720deg); - -webkit-transform: rotate(720deg); - transform: rotate(720deg); - } -} -/* :not(:required) hides this rule from IE9 and below */ -.circles-loader:not(:required) { - position: relative; - text-indent: -9999px; - display: inline-block; - width: 25px; - height: 25px; - background: rgba(255, 204, 51, 0.9); - border-radius: 100%; - -moz-animation: circles-loader 3s infinite ease-in-out; - -webkit-animation: circles-loader 3s infinite ease-in-out; - animation: circles-loader 3s infinite ease-in-out; - -moz-transform-origin: 50% 100%; - -ms-transform-origin: 50% 100%; - -webkit-transform-origin: 50% 100%; - transform-origin: 50% 100%; -} -.circles-loader:not(:required)::before { - background: rgba(255, 102, 0, 0.6); - border-radius: 100%; - content: ''; - position: absolute; - width: 25px; - height: 25px; - top: 18.75px; - left: -10.82532px; -} -.circles-loader:not(:required)::after { - background: rgba(255, 51, 0, 0.4); - border-radius: 100%; - content: ''; - position: absolute; - width: 25px; - height: 25px; - top: 18.75px; - left: 10.82532px; -} - -@-moz-keyframes plus-loader-top { - 2.5% { - background: #f86; - -moz-transform: rotateY(0deg); - transform: rotateY(0deg); - -moz-animation-timing-function: ease-in; - animation-timing-function: ease-in; - } - 13.75% { - background: #ff430d; - -moz-transform: rotateY(90deg); - transform: rotateY(90deg); - -moz-animation-timing-function: step-start; - animation-timing-function: step-start; - } - 13.76% { - background: #ffae0d; - -moz-transform: rotateY(90deg); - transform: rotateY(90deg); - -moz-animation-timing-function: ease-out; - animation-timing-function: ease-out; - } - 25% { - background: #fc6; - -moz-transform: rotateY(180deg); - transform: rotateY(180deg); - } - 27.5% { - background: #fc6; - -moz-transform: rotateY(180deg); - transform: rotateY(180deg); - -moz-animation-timing-function: ease-in; - animation-timing-function: ease-in; - } - 41.25% { - background: #ffae0d; - -moz-transform: rotateY(90deg); - transform: rotateY(90deg); - -moz-animation-timing-function: step-start; - animation-timing-function: step-start; - } - 41.26% { - background: #2cc642; - -moz-transform: rotateY(90deg); - transform: rotateY(90deg); - -moz-animation-timing-function: ease-out; - animation-timing-function: ease-out; - } - 50% { - background: #6d7; - -moz-transform: rotateY(0deg); - transform: rotateY(0deg); - } - 52.5% { - background: #6d7; - -moz-transform: rotateY(0deg); - transform: rotateY(0deg); - -moz-animation-timing-function: ease-in; - animation-timing-function: ease-in; - } - 63.75% { - background: #2cc642; - -moz-transform: rotateY(90deg); - transform: rotateY(90deg); - -moz-animation-timing-function: step-start; - animation-timing-function: step-start; - } - 63.76% { - background: #1386d2; - -moz-transform: rotateY(90deg); - transform: rotateY(90deg); - -moz-animation-timing-function: ease-out; - animation-timing-function: ease-out; - } - 75% { - background: #4ae; - -moz-transform: rotateY(180deg); - transform: rotateY(180deg); - } - 77.5% { - background: #4ae; - -moz-transform: rotateY(180deg); - transform: rotateY(180deg); - -moz-animation-timing-function: ease-in; - animation-timing-function: ease-in; - } - 91.25% { - background: #1386d2; - -moz-transform: rotateY(90deg); - transform: rotateY(90deg); - -moz-animation-timing-function: step-start; - animation-timing-function: step-start; - } - 91.26% { - background: #ff430d; - -moz-transform: rotateY(90deg); - transform: rotateY(90deg); - -moz-animation-timing-function: ease-in; - animation-timing-function: ease-in; - } - 100% { - background: #f86; - -moz-transform: rotateY(0deg); - transform: rotateY(0deg); - -moz-animation-timing-function: step-start; - animation-timing-function: step-start; - } -} -@-webkit-keyframes plus-loader-top { - 2.5% { - background: #f86; - -webkit-transform: rotateY(0deg); - transform: rotateY(0deg); - -webkit-animation-timing-function: ease-in; - animation-timing-function: ease-in; - } - 13.75% { - background: #ff430d; - -webkit-transform: rotateY(90deg); - transform: rotateY(90deg); - -webkit-animation-timing-function: step-start; - animation-timing-function: step-start; - } - 13.76% { - background: #ffae0d; - -webkit-transform: rotateY(90deg); - transform: rotateY(90deg); - -webkit-animation-timing-function: ease-out; - animation-timing-function: ease-out; - } - 25% { - background: #fc6; - -webkit-transform: rotateY(180deg); - transform: rotateY(180deg); - } - 27.5% { - background: #fc6; - -webkit-transform: rotateY(180deg); - transform: rotateY(180deg); - -webkit-animation-timing-function: ease-in; - animation-timing-function: ease-in; - } - 41.25% { - background: #ffae0d; - -webkit-transform: rotateY(90deg); - transform: rotateY(90deg); - -webkit-animation-timing-function: step-start; - animation-timing-function: step-start; - } - 41.26% { - background: #2cc642; - -webkit-transform: rotateY(90deg); - transform: rotateY(90deg); - -webkit-animation-timing-function: ease-out; - animation-timing-function: ease-out; - } - 50% { - background: #6d7; - -webkit-transform: rotateY(0deg); - transform: rotateY(0deg); - } - 52.5% { - background: #6d7; - -webkit-transform: rotateY(0deg); - transform: rotateY(0deg); - -webkit-animation-timing-function: ease-in; - animation-timing-function: ease-in; - } - 63.75% { - background: #2cc642; - -webkit-transform: rotateY(90deg); - transform: rotateY(90deg); - -webkit-animation-timing-function: step-start; - animation-timing-function: step-start; - } - 63.76% { - background: #1386d2; - -webkit-transform: rotateY(90deg); - transform: rotateY(90deg); - -webkit-animation-timing-function: ease-out; - animation-timing-function: ease-out; - } - 75% { - background: #4ae; - -webkit-transform: rotateY(180deg); - transform: rotateY(180deg); - } - 77.5% { - background: #4ae; - -webkit-transform: rotateY(180deg); - transform: rotateY(180deg); - -webkit-animation-timing-function: ease-in; - animation-timing-function: ease-in; - } - 91.25% { - background: #1386d2; - -webkit-transform: rotateY(90deg); - transform: rotateY(90deg); - -webkit-animation-timing-function: step-start; - animation-timing-function: step-start; - } - 91.26% { - background: #ff430d; - -webkit-transform: rotateY(90deg); - transform: rotateY(90deg); - -webkit-animation-timing-function: ease-in; - animation-timing-function: ease-in; - } - 100% { - background: #f86; - -webkit-transform: rotateY(0deg); - transform: rotateY(0deg); - -webkit-animation-timing-function: step-start; - animation-timing-function: step-start; - } -} -@keyframes plus-loader-top { - 2.5% { - background: #f86; - -moz-transform: rotateY(0deg); - -ms-transform: rotateY(0deg); - -webkit-transform: rotateY(0deg); - transform: rotateY(0deg); - -moz-animation-timing-function: ease-in; - -webkit-animation-timing-function: ease-in; - animation-timing-function: ease-in; - } - 13.75% { - background: #ff430d; - -moz-transform: rotateY(90deg); - -ms-transform: rotateY(90deg); - -webkit-transform: rotateY(90deg); - transform: rotateY(90deg); - -moz-animation-timing-function: step-start; - -webkit-animation-timing-function: step-start; - animation-timing-function: step-start; - } - 13.76% { - background: #ffae0d; - -moz-transform: rotateY(90deg); - -ms-transform: rotateY(90deg); - -webkit-transform: rotateY(90deg); - transform: rotateY(90deg); - -moz-animation-timing-function: ease-out; - -webkit-animation-timing-function: ease-out; - animation-timing-function: ease-out; - } - 25% { - background: #fc6; - -moz-transform: rotateY(180deg); - -ms-transform: rotateY(180deg); - -webkit-transform: rotateY(180deg); - transform: rotateY(180deg); - } - 27.5% { - background: #fc6; - -moz-transform: rotateY(180deg); - -ms-transform: rotateY(180deg); - -webkit-transform: rotateY(180deg); - transform: rotateY(180deg); - -moz-animation-timing-function: ease-in; - -webkit-animation-timing-function: ease-in; - animation-timing-function: ease-in; - } - 41.25% { - background: #ffae0d; - -moz-transform: rotateY(90deg); - -ms-transform: rotateY(90deg); - -webkit-transform: rotateY(90deg); - transform: rotateY(90deg); - -moz-animation-timing-function: step-start; - -webkit-animation-timing-function: step-start; - animation-timing-function: step-start; - } - 41.26% { - background: #2cc642; - -moz-transform: rotateY(90deg); - -ms-transform: rotateY(90deg); - -webkit-transform: rotateY(90deg); - transform: rotateY(90deg); - -moz-animation-timing-function: ease-out; - -webkit-animation-timing-function: ease-out; - animation-timing-function: ease-out; - } - 50% { - background: #6d7; - -moz-transform: rotateY(0deg); - -ms-transform: rotateY(0deg); - -webkit-transform: rotateY(0deg); - transform: rotateY(0deg); - } - 52.5% { - background: #6d7; - -moz-transform: rotateY(0deg); - -ms-transform: rotateY(0deg); - -webkit-transform: rotateY(0deg); - transform: rotateY(0deg); - -moz-animation-timing-function: ease-in; - -webkit-animation-timing-function: ease-in; - animation-timing-function: ease-in; - } - 63.75% { - background: #2cc642; - -moz-transform: rotateY(90deg); - -ms-transform: rotateY(90deg); - -webkit-transform: rotateY(90deg); - transform: rotateY(90deg); - -moz-animation-timing-function: step-start; - -webkit-animation-timing-function: step-start; - animation-timing-function: step-start; - } - 63.76% { - background: #1386d2; - -moz-transform: rotateY(90deg); - -ms-transform: rotateY(90deg); - -webkit-transform: rotateY(90deg); - transform: rotateY(90deg); - -moz-animation-timing-function: ease-out; - -webkit-animation-timing-function: ease-out; - animation-timing-function: ease-out; - } - 75% { - background: #4ae; - -moz-transform: rotateY(180deg); - -ms-transform: rotateY(180deg); - -webkit-transform: rotateY(180deg); - transform: rotateY(180deg); - } - 77.5% { - background: #4ae; - -moz-transform: rotateY(180deg); - -ms-transform: rotateY(180deg); - -webkit-transform: rotateY(180deg); - transform: rotateY(180deg); - -moz-animation-timing-function: ease-in; - -webkit-animation-timing-function: ease-in; - animation-timing-function: ease-in; - } - 91.25% { - background: #1386d2; - -moz-transform: rotateY(90deg); - -ms-transform: rotateY(90deg); - -webkit-transform: rotateY(90deg); - transform: rotateY(90deg); - -moz-animation-timing-function: step-start; - -webkit-animation-timing-function: step-start; - animation-timing-function: step-start; - } - 91.26% { - background: #ff430d; - -moz-transform: rotateY(90deg); - -ms-transform: rotateY(90deg); - -webkit-transform: rotateY(90deg); - transform: rotateY(90deg); - -moz-animation-timing-function: ease-in; - -webkit-animation-timing-function: ease-in; - animation-timing-function: ease-in; - } - 100% { - background: #f86; - -moz-transform: rotateY(0deg); - -ms-transform: rotateY(0deg); - -webkit-transform: rotateY(0deg); - transform: rotateY(0deg); - -moz-animation-timing-function: step-start; - -webkit-animation-timing-function: step-start; - animation-timing-function: step-start; - } -} -@-moz-keyframes plus-loader-bottom { - 0% { - background: #fc6; - -moz-animation-timing-function: step-start; - animation-timing-function: step-start; - } - 50% { - background: #fc6; - -moz-animation-timing-function: step-start; - animation-timing-function: step-start; - } - 75% { - background: #4ae; - -moz-animation-timing-function: step-start; - animation-timing-function: step-start; - } - 100% { - background: #4ae; - -moz-animation-timing-function: step-start; - animation-timing-function: step-start; - } -} -@-webkit-keyframes plus-loader-bottom { - 0% { - background: #fc6; - -webkit-animation-timing-function: step-start; - animation-timing-function: step-start; - } - 50% { - background: #fc6; - -webkit-animation-timing-function: step-start; - animation-timing-function: step-start; - } - 75% { - background: #4ae; - -webkit-animation-timing-function: step-start; - animation-timing-function: step-start; - } - 100% { - background: #4ae; - -webkit-animation-timing-function: step-start; - animation-timing-function: step-start; - } -} -@keyframes plus-loader-bottom { - 0% { - background: #fc6; - -moz-animation-timing-function: step-start; - -webkit-animation-timing-function: step-start; - animation-timing-function: step-start; - } - 50% { - background: #fc6; - -moz-animation-timing-function: step-start; - -webkit-animation-timing-function: step-start; - animation-timing-function: step-start; - } - 75% { - background: #4ae; - -moz-animation-timing-function: step-start; - -webkit-animation-timing-function: step-start; - animation-timing-function: step-start; - } - 100% { - background: #4ae; - -moz-animation-timing-function: step-start; - -webkit-animation-timing-function: step-start; - animation-timing-function: step-start; - } -} -@-moz-keyframes plus-loader-background { - 0% { - background: #f86; - -moz-transform: rotateZ(180deg); - transform: rotateZ(180deg); - } - 25% { - background: #f86; - -moz-transform: rotateZ(180deg); - transform: rotateZ(180deg); - -moz-animation-timing-function: step-start; - animation-timing-function: step-start; - } - 27.5% { - background: #6d7; - -moz-transform: rotateZ(90deg); - transform: rotateZ(90deg); - } - 50% { - background: #6d7; - -moz-transform: rotateZ(90deg); - transform: rotateZ(90deg); - -moz-animation-timing-function: step-start; - animation-timing-function: step-start; - } - 52.5% { - background: #6d7; - -moz-transform: rotateZ(0deg); - transform: rotateZ(0deg); - } - 75% { - background: #6d7; - -moz-transform: rotateZ(0deg); - transform: rotateZ(0deg); - -moz-animation-timing-function: step-start; - animation-timing-function: step-start; - } - 77.5% { - background: #f86; - -moz-transform: rotateZ(270deg); - transform: rotateZ(270deg); - } - 100% { - background: #f86; - -moz-transform: rotateZ(270deg); - transform: rotateZ(270deg); - -moz-animation-timing-function: step-start; - animation-timing-function: step-start; - } -} -@-webkit-keyframes plus-loader-background { - 0% { - background: #f86; - -webkit-transform: rotateZ(180deg); - transform: rotateZ(180deg); - } - 25% { - background: #f86; - -webkit-transform: rotateZ(180deg); - transform: rotateZ(180deg); - -webkit-animation-timing-function: step-start; - animation-timing-function: step-start; - } - 27.5% { - background: #6d7; - -webkit-transform: rotateZ(90deg); - transform: rotateZ(90deg); - } - 50% { - background: #6d7; - -webkit-transform: rotateZ(90deg); - transform: rotateZ(90deg); - -webkit-animation-timing-function: step-start; - animation-timing-function: step-start; - } - 52.5% { - background: #6d7; - -webkit-transform: rotateZ(0deg); - transform: rotateZ(0deg); - } - 75% { - background: #6d7; - -webkit-transform: rotateZ(0deg); - transform: rotateZ(0deg); - -webkit-animation-timing-function: step-start; - animation-timing-function: step-start; - } - 77.5% { - background: #f86; - -webkit-transform: rotateZ(270deg); - transform: rotateZ(270deg); - } - 100% { - background: #f86; - -webkit-transform: rotateZ(270deg); - transform: rotateZ(270deg); - -webkit-animation-timing-function: step-start; - animation-timing-function: step-start; - } -} -@keyframes plus-loader-background { - 0% { - background: #f86; - -moz-transform: rotateZ(180deg); - -ms-transform: rotateZ(180deg); - -webkit-transform: rotateZ(180deg); - transform: rotateZ(180deg); - } - 25% { - background: #f86; - -moz-transform: rotateZ(180deg); - -ms-transform: rotateZ(180deg); - -webkit-transform: rotateZ(180deg); - transform: rotateZ(180deg); - -moz-animation-timing-function: step-start; - -webkit-animation-timing-function: step-start; - animation-timing-function: step-start; - } - 27.5% { - background: #6d7; - -moz-transform: rotateZ(90deg); - -ms-transform: rotateZ(90deg); - -webkit-transform: rotateZ(90deg); - transform: rotateZ(90deg); - } - 50% { - background: #6d7; - -moz-transform: rotateZ(90deg); - -ms-transform: rotateZ(90deg); - -webkit-transform: rotateZ(90deg); - transform: rotateZ(90deg); - -moz-animation-timing-function: step-start; - -webkit-animation-timing-function: step-start; - animation-timing-function: step-start; - } - 52.5% { - background: #6d7; - -moz-transform: rotateZ(0deg); - -ms-transform: rotateZ(0deg); - -webkit-transform: rotateZ(0deg); - transform: rotateZ(0deg); - } - 75% { - background: #6d7; - -moz-transform: rotateZ(0deg); - -ms-transform: rotateZ(0deg); - -webkit-transform: rotateZ(0deg); - transform: rotateZ(0deg); - -moz-animation-timing-function: step-start; - -webkit-animation-timing-function: step-start; - animation-timing-function: step-start; - } - 77.5% { - background: #f86; - -moz-transform: rotateZ(270deg); - -ms-transform: rotateZ(270deg); - -webkit-transform: rotateZ(270deg); - transform: rotateZ(270deg); - } - 100% { - background: #f86; - -moz-transform: rotateZ(270deg); - -ms-transform: rotateZ(270deg); - -webkit-transform: rotateZ(270deg); - transform: rotateZ(270deg); - -moz-animation-timing-function: step-start; - -webkit-animation-timing-function: step-start; - animation-timing-function: step-start; - } -} -/* :not(:required) hides this rule from IE9 and below */ -.plus-loader:not(:required) { - overflow: hidden; - position: relative; - text-indent: -9999px; - display: inline-block; - width: 48px; - height: 48px; - background: #f86; - -moz-border-radius: 24px; - -webkit-border-radius: 24px; - border-radius: 24px; - -moz-transform: rotateZ(90deg); - -ms-transform: rotateZ(90deg); - -webkit-transform: rotateZ(90deg); - transform: rotateZ(90deg); - -moz-transform-origin: 50% 50%; - -ms-transform-origin: 50% 50%; - -webkit-transform-origin: 50% 50%; - transform-origin: 50% 50%; - -moz-animation: plus-loader-background 3s infinite ease-in-out; - -webkit-animation: plus-loader-background 3s infinite ease-in-out; - animation: plus-loader-background 3s infinite ease-in-out; -} -.plus-loader:not(:required)::after { - background: #f86; - -moz-border-radius: 24px 0 0 24px; - -webkit-border-radius: 24px; - border-radius: 24px 0 0 24px; - content: ''; - position: absolute; - right: 50%; - top: 0; - width: 50%; - height: 100%; - -moz-transform-origin: 100% 50%; - -ms-transform-origin: 100% 50%; - -webkit-transform-origin: 100% 50%; - transform-origin: 100% 50%; - -moz-animation: plus-loader-top 3s infinite linear; - -webkit-animation: plus-loader-top 3s infinite linear; - animation: plus-loader-top 3s infinite linear; -} -.plus-loader:not(:required)::before { - background: #fc6; - -moz-border-radius: 24px 0 0 24px; - -webkit-border-radius: 24px; - border-radius: 24px 0 0 24px; - content: ''; - position: absolute; - right: 50%; - top: 0; - width: 50%; - height: 100%; - -moz-transform-origin: 100% 50%; - -ms-transform-origin: 100% 50%; - -webkit-transform-origin: 100% 50%; - transform-origin: 100% 50%; - -moz-animation: plus-loader-bottom 3s infinite linear; - -webkit-animation: plus-loader-bottom 3s infinite linear; - animation: plus-loader-bottom 3s infinite linear; -} - -@-moz-keyframes ball-loader { - 0% { - -moz-transform: translate3d(0, 0, 0) scale3d(1, 1, 1); - transform: translate3d(0, 0, 0) scale3d(1, 1, 1); - -moz-animation-timing-function: ease-in; - animation-timing-function: ease-in; - } - 45% { - -moz-transform: translate3d(0, 150px, -10px) scale3d(1, 0.95, 1); - transform: translate3d(0, 150px, -10px) scale3d(1, 0.95, 1); - -moz-animation-timing-function: ease-in; - animation-timing-function: ease-in; - } - 50% { - -moz-transform: translate3d(0, 150px, -10px) scale3d(1, 0.5, 1); - transform: translate3d(0, 150px, -10px) scale3d(1, 0.5, 1); - -moz-animation-timing-function: linear; - animation-timing-function: linear; - } - 55% { - -moz-transform: translate3d(0, 150px, -10px) scale3d(1, 1.25, 1); - transform: translate3d(0, 150px, -10px) scale3d(1, 1.25, 1); - -moz-animation-timing-function: ease-out; - animation-timing-function: ease-out; - } -} -@-webkit-keyframes ball-loader { - 0% { - -webkit-transform: translate3d(0, 0, 0) scale3d(1, 1, 1); - transform: translate3d(0, 0, 0) scale3d(1, 1, 1); - -webkit-animation-timing-function: ease-in; - animation-timing-function: ease-in; - } - 45% { - -webkit-transform: translate3d(0, 150px, -10px) scale3d(1, 0.95, 1); - transform: translate3d(0, 150px, -10px) scale3d(1, 0.95, 1); - -webkit-animation-timing-function: ease-in; - animation-timing-function: ease-in; - } - 50% { - -webkit-transform: translate3d(0, 150px, -10px) scale3d(1, 0.5, 1); - transform: translate3d(0, 150px, -10px) scale3d(1, 0.5, 1); - -webkit-animation-timing-function: linear; - animation-timing-function: linear; - } - 55% { - -webkit-transform: translate3d(0, 150px, -10px) scale3d(1, 1.25, 1); - transform: translate3d(0, 150px, -10px) scale3d(1, 1.25, 1); - -webkit-animation-timing-function: ease-out; - animation-timing-function: ease-out; - } -} -@keyframes ball-loader { - 0% { - -moz-transform: translate3d(0, 0, 0) scale3d(1, 1, 1); - -ms-transform: translate3d(0, 0, 0) scale3d(1, 1, 1); - -webkit-transform: translate3d(0, 0, 0) scale3d(1, 1, 1); - transform: translate3d(0, 0, 0) scale3d(1, 1, 1); - -moz-animation-timing-function: ease-in; - -webkit-animation-timing-function: ease-in; - animation-timing-function: ease-in; - } - 45% { - -moz-transform: translate3d(0, 150px, -10px) scale3d(1, 0.95, 1); - -ms-transform: translate3d(0, 150px, -10px) scale3d(1, 0.95, 1); - -webkit-transform: translate3d(0, 150px, -10px) scale3d(1, 0.95, 1); - transform: translate3d(0, 150px, -10px) scale3d(1, 0.95, 1); - -moz-animation-timing-function: ease-in; - -webkit-animation-timing-function: ease-in; - animation-timing-function: ease-in; - } - 50% { - -moz-transform: translate3d(0, 150px, -10px) scale3d(1, 0.5, 1); - -ms-transform: translate3d(0, 150px, -10px) scale3d(1, 0.5, 1); - -webkit-transform: translate3d(0, 150px, -10px) scale3d(1, 0.5, 1); - transform: translate3d(0, 150px, -10px) scale3d(1, 0.5, 1); - -moz-animation-timing-function: linear; - -webkit-animation-timing-function: linear; - animation-timing-function: linear; - } - 55% { - -moz-transform: translate3d(0, 150px, -10px) scale3d(1, 1.25, 1); - -ms-transform: translate3d(0, 150px, -10px) scale3d(1, 1.25, 1); - -webkit-transform: translate3d(0, 150px, -10px) scale3d(1, 1.25, 1); - transform: translate3d(0, 150px, -10px) scale3d(1, 1.25, 1); - -moz-animation-timing-function: ease-out; - -webkit-animation-timing-function: ease-out; - animation-timing-function: ease-out; - } -} -@-moz-keyframes ball-loader-highlight { - 0% { - -moz-transform: skew(-20deg, 0) translate3d(0, 2.5px, 1px); - transform: skew(-20deg, 0) translate3d(0, 2.5px, 1px); - -moz-animation-timing-function: ease-in; - animation-timing-function: ease-in; - } - 45% { - -moz-transform: skew(-30deg, 0) translate3d(0, 0, 1px); - transform: skew(-30deg, 0) translate3d(0, 0, 1px); - -moz-animation-timing-function: ease-in; - animation-timing-function: ease-in; - } - 50% { - -moz-transform: skew(-30deg, 0) translate3d(0, 0, 1px); - transform: skew(-30deg, 0) translate3d(0, 0, 1px); - -moz-animation-timing-function: linear; - animation-timing-function: linear; - } - 55% { - -moz-transform: skew(-30deg, 0) translate3d(0, 0, 1px); - transform: skew(-30deg, 0) translate3d(0, 0, 1px); - -moz-animation-timing-function: ease-out; - animation-timing-function: ease-out; - } - 100% { - -moz-transform: skew(-20deg, 0) translate3d(0, 2.5px, 1px); - transform: skew(-20deg, 0) translate3d(0, 2.5px, 1px); - -moz-animation-timing-function: ease-in; - animation-timing-function: ease-in; - } -} -@-webkit-keyframes ball-loader-highlight { - 0% { - -webkit-transform: skew(-20deg, 0) translate3d(0, 2.5px, 1px); - transform: skew(-20deg, 0) translate3d(0, 2.5px, 1px); - -webkit-animation-timing-function: ease-in; - animation-timing-function: ease-in; - } - 45% { - -webkit-transform: skew(-30deg, 0) translate3d(0, 0, 1px); - transform: skew(-30deg, 0) translate3d(0, 0, 1px); - -webkit-animation-timing-function: ease-in; - animation-timing-function: ease-in; - } - 50% { - -webkit-transform: skew(-30deg, 0) translate3d(0, 0, 1px); - transform: skew(-30deg, 0) translate3d(0, 0, 1px); - -webkit-animation-timing-function: linear; - animation-timing-function: linear; - } - 55% { - -webkit-transform: skew(-30deg, 0) translate3d(0, 0, 1px); - transform: skew(-30deg, 0) translate3d(0, 0, 1px); - -webkit-animation-timing-function: ease-out; - animation-timing-function: ease-out; - } - 100% { - -webkit-transform: skew(-20deg, 0) translate3d(0, 2.5px, 1px); - transform: skew(-20deg, 0) translate3d(0, 2.5px, 1px); - -webkit-animation-timing-function: ease-in; - animation-timing-function: ease-in; - } -} -@keyframes ball-loader-highlight { - 0% { - -moz-transform: skew(-20deg, 0) translate3d(0, 2.5px, 1px); - -ms-transform: skew(-20deg, 0) translate3d(0, 2.5px, 1px); - -webkit-transform: skew(-20deg, 0) translate3d(0, 2.5px, 1px); - transform: skew(-20deg, 0) translate3d(0, 2.5px, 1px); - -moz-animation-timing-function: ease-in; - -webkit-animation-timing-function: ease-in; - animation-timing-function: ease-in; - } - 45% { - -moz-transform: skew(-30deg, 0) translate3d(0, 0, 1px); - -ms-transform: skew(-30deg, 0) translate3d(0, 0, 1px); - -webkit-transform: skew(-30deg, 0) translate3d(0, 0, 1px); - transform: skew(-30deg, 0) translate3d(0, 0, 1px); - -moz-animation-timing-function: ease-in; - -webkit-animation-timing-function: ease-in; - animation-timing-function: ease-in; - } - 50% { - -moz-transform: skew(-30deg, 0) translate3d(0, 0, 1px); - -ms-transform: skew(-30deg, 0) translate3d(0, 0, 1px); - -webkit-transform: skew(-30deg, 0) translate3d(0, 0, 1px); - transform: skew(-30deg, 0) translate3d(0, 0, 1px); - -moz-animation-timing-function: linear; - -webkit-animation-timing-function: linear; - animation-timing-function: linear; - } - 55% { - -moz-transform: skew(-30deg, 0) translate3d(0, 0, 1px); - -ms-transform: skew(-30deg, 0) translate3d(0, 0, 1px); - -webkit-transform: skew(-30deg, 0) translate3d(0, 0, 1px); - transform: skew(-30deg, 0) translate3d(0, 0, 1px); - -moz-animation-timing-function: ease-out; - -webkit-animation-timing-function: ease-out; - animation-timing-function: ease-out; - } - 100% { - -moz-transform: skew(-20deg, 0) translate3d(0, 2.5px, 1px); - -ms-transform: skew(-20deg, 0) translate3d(0, 2.5px, 1px); - -webkit-transform: skew(-20deg, 0) translate3d(0, 2.5px, 1px); - transform: skew(-20deg, 0) translate3d(0, 2.5px, 1px); - -moz-animation-timing-function: ease-in; - -webkit-animation-timing-function: ease-in; - animation-timing-function: ease-in; - } -} -@-moz-keyframes ball-loader-shadow { - 0% { - -moz-transform: translate3d(66.66667px, 66.66667px, -1px) scale3d(1.25, 1.25, 1); - transform: translate3d(66.66667px, 66.66667px, -1px) scale3d(1.25, 1.25, 1); - -moz-animation-timing-function: ease-in; - animation-timing-function: ease-in; - } - 45% { - -moz-transform: translate3d(12.5px, -15px, -1px); - transform: translate3d(12.5px, -15px, -1px); - -moz-animation-timing-function: ease-in; - animation-timing-function: ease-in; - } - 50% { - -moz-transform: translate3d(12.5px, -15px, -1px) scale3d(1, 1, 1); - transform: translate3d(12.5px, -15px, -1px) scale3d(1, 1, 1); - -moz-animation-timing-function: linear; - animation-timing-function: linear; - } - 55% { - -moz-transform: translate3d(12.5px, -15px, -1px); - transform: translate3d(12.5px, -15px, -1px); - -moz-animation-timing-function: ease-out; - animation-timing-function: ease-out; - } - 100% { - -moz-transform: translate3d(66.66667px, 66.66667px, -1px) scale3d(1.25, 1.25, 1); - transform: translate3d(66.66667px, 66.66667px, -1px) scale3d(1.25, 1.25, 1); - -moz-animation-timing-function: ease-in; - animation-timing-function: ease-in; - } -} -@-webkit-keyframes ball-loader-shadow { - 0% { - -webkit-transform: translate3d(66.66667px, 66.66667px, -1px) scale3d(1.25, 1.25, 1); - transform: translate3d(66.66667px, 66.66667px, -1px) scale3d(1.25, 1.25, 1); - -webkit-animation-timing-function: ease-in; - animation-timing-function: ease-in; - } - 45% { - -webkit-transform: translate3d(12.5px, -15px, -1px); - transform: translate3d(12.5px, -15px, -1px); - -webkit-animation-timing-function: ease-in; - animation-timing-function: ease-in; - } - 50% { - -webkit-transform: translate3d(12.5px, -15px, -1px) scale3d(1, 1, 1); - transform: translate3d(12.5px, -15px, -1px) scale3d(1, 1, 1); - -webkit-animation-timing-function: linear; - animation-timing-function: linear; - } - 55% { - -webkit-transform: translate3d(12.5px, -15px, -1px); - transform: translate3d(12.5px, -15px, -1px); - -webkit-animation-timing-function: ease-out; - animation-timing-function: ease-out; - } - 100% { - -webkit-transform: translate3d(66.66667px, 66.66667px, -1px) scale3d(1.25, 1.25, 1); - transform: translate3d(66.66667px, 66.66667px, -1px) scale3d(1.25, 1.25, 1); - -webkit-animation-timing-function: ease-in; - animation-timing-function: ease-in; - } -} -@keyframes ball-loader-shadow { - 0% { - -moz-transform: translate3d(66.66667px, 66.66667px, -1px) scale3d(1.25, 1.25, 1); - -ms-transform: translate3d(66.66667px, 66.66667px, -1px) scale3d(1.25, 1.25, 1); - -webkit-transform: translate3d(66.66667px, 66.66667px, -1px) scale3d(1.25, 1.25, 1); - transform: translate3d(66.66667px, 66.66667px, -1px) scale3d(1.25, 1.25, 1); - -moz-animation-timing-function: ease-in; - -webkit-animation-timing-function: ease-in; - animation-timing-function: ease-in; - } - 45% { - -moz-transform: translate3d(12.5px, -15px, -1px); - -ms-transform: translate3d(12.5px, -15px, -1px); - -webkit-transform: translate3d(12.5px, -15px, -1px); - transform: translate3d(12.5px, -15px, -1px); - -moz-animation-timing-function: ease-in; - -webkit-animation-timing-function: ease-in; - animation-timing-function: ease-in; - } - 50% { - -moz-transform: translate3d(12.5px, -15px, -1px) scale3d(1, 1, 1); - -ms-transform: translate3d(12.5px, -15px, -1px) scale3d(1, 1, 1); - -webkit-transform: translate3d(12.5px, -15px, -1px) scale3d(1, 1, 1); - transform: translate3d(12.5px, -15px, -1px) scale3d(1, 1, 1); - -moz-animation-timing-function: linear; - -webkit-animation-timing-function: linear; - animation-timing-function: linear; - } - 55% { - -moz-transform: translate3d(12.5px, -15px, -1px); - -ms-transform: translate3d(12.5px, -15px, -1px); - -webkit-transform: translate3d(12.5px, -15px, -1px); - transform: translate3d(12.5px, -15px, -1px); - -moz-animation-timing-function: ease-out; - -webkit-animation-timing-function: ease-out; - animation-timing-function: ease-out; - } - 100% { - -moz-transform: translate3d(66.66667px, 66.66667px, -1px) scale3d(1.25, 1.25, 1); - -ms-transform: translate3d(66.66667px, 66.66667px, -1px) scale3d(1.25, 1.25, 1); - -webkit-transform: translate3d(66.66667px, 66.66667px, -1px) scale3d(1.25, 1.25, 1); - transform: translate3d(66.66667px, 66.66667px, -1px) scale3d(1.25, 1.25, 1); - -moz-animation-timing-function: ease-in; - -webkit-animation-timing-function: ease-in; - animation-timing-function: ease-in; - } -} -/* :not(:required) hides this rule from IE9 and below */ -.ball-loader:not(:required) { - position: relative; - display: inline-block; - font-size: 0; - letter-spacing: -1px; - border-radius: 100%; - background: #f86; - width: 50px; - height: 50px; - -moz-transform-style: preserve-3d; - -webkit-transform-style: preserve-3d; - transform-style: preserve-3d; - -moz-transform: translate3d(0, 0, 0) scale3d(1, 1, 1); - -ms-transform: translate3d(0, 0, 0) scale3d(1, 1, 1); - -webkit-transform: translate3d(0, 0, 0) scale3d(1, 1, 1); - transform: translate3d(0, 0, 0) scale3d(1, 1, 1); - -moz-transform-origin: 0 100%; - -ms-transform-origin: 0 100%; - -webkit-transform-origin: 0 100%; - transform-origin: 0 100%; - -moz-animation: ball-loader 1500ms infinite linear; - -webkit-animation: ball-loader 1500ms infinite linear; - animation: ball-loader 1500ms infinite linear; -} -.ball-loader:not(:required)::after { - content: ''; - position: absolute; - top: 4.5px; - left: 5.5px; - width: 15px; - height: 15px; - background: #ffb099; - border-radius: 100%; - -moz-transform: skew(-20deg, 0) translate3d(0, 2.5px, 1px); - -ms-transform: skew(-20deg, 0) translate3d(0, 2.5px, 1px); - -webkit-transform: skew(-20deg, 0) translate3d(0, 2.5px, 1px); - transform: skew(-20deg, 0) translate3d(0, 2.5px, 1px); - -moz-animation: ball-loader-highlight 1500ms infinite linear; - -webkit-animation: ball-loader-highlight 1500ms infinite linear; - animation: ball-loader-highlight 1500ms infinite linear; -} -.ball-loader:not(:required)::before { - content: ''; - position: absolute; - top: 50px; - left: 5.5px; - width: 50px; - height: 15px; - background: rgba(0, 0, 0, 0.2); - border-radius: 100%; - -moz-transform: translate3d(66.66667px, 66.66667px, -1px) scale3d(1.25, 1.25, 1); - -ms-transform: translate3d(66.66667px, 66.66667px, -1px) scale3d(1.25, 1.25, 1); - -webkit-transform: translate3d(66.66667px, 66.66667px, -1px) scale3d(1.25, 1.25, 1); - transform: translate3d(66.66667px, 66.66667px, -1px) scale3d(1.25, 1.25, 1); - -moz-animation: ball-loader-shadow 1500ms infinite linear; - -webkit-animation: ball-loader-shadow 1500ms infinite linear; - animation: ball-loader-shadow 1500ms infinite linear; - -webkit-filter: blur(1px); - filter: blur(1px); -} - -@-moz-keyframes hexdots-loader { - 0% { - -moz-box-shadow: #666666 0 -30px 0 7px, #999 0 -30px 0 7px, #999 26px -15px 0 7px, #999 26px 15px 0 7px, #999 0 30px 0 7px, #999 -26px 15px 0 7px, #999 -26px -15px 0 7px; - box-shadow: #666666 0 -30px 0 7px, #999 0 -30px 0 7px, #999 26px -15px 0 7px, #999 26px 15px 0 7px, #999 0 30px 0 7px, #999 -26px 15px 0 7px, #999 -26px -15px 0 7px; - } - 8.33% { - -moz-box-shadow: #666666 26px -15px 0 7px, #999 26px -15px 0 7px, #999 26px -15px 0 7px, #999 26px 15px 0 7px, #999 0 30px 0 7px, #999 -26px 15px 0 7px, #999 -26px -15px 0 7px; - box-shadow: #666666 26px -15px 0 7px, #999 26px -15px 0 7px, #999 26px -15px 0 7px, #999 26px 15px 0 7px, #999 0 30px 0 7px, #999 -26px 15px 0 7px, #999 -26px -15px 0 7px; - } - 16.67% { - -moz-box-shadow: #666666 26px 15px 0 7px, #999 26px 15px 0 7px, #999 26px 15px 0 7px, #999 26px 15px 0 7px, #999 0 30px 0 7px, #999 -26px 15px 0 7px, #999 -26px -15px 0 7px; - box-shadow: #666666 26px 15px 0 7px, #999 26px 15px 0 7px, #999 26px 15px 0 7px, #999 26px 15px 0 7px, #999 0 30px 0 7px, #999 -26px 15px 0 7px, #999 -26px -15px 0 7px; - } - 25% { - -moz-box-shadow: #666666 0 30px 0 7px, #999 0 30px 0 7px, #999 0 30px 0 7px, #999 0 30px 0 7px, #999 0 30px 0 7px, #999 -26px 15px 0 7px, #999 -26px -15px 0 7px; - box-shadow: #666666 0 30px 0 7px, #999 0 30px 0 7px, #999 0 30px 0 7px, #999 0 30px 0 7px, #999 0 30px 0 7px, #999 -26px 15px 0 7px, #999 -26px -15px 0 7px; - } - 33.33% { - -moz-box-shadow: #666666 -26px 15px 0 7px, #999 -26px 15px 0 7px, #999 -26px 15px 0 7px, #999 -26px 15px 0 7px, #999 -26px 15px 0 7px, #999 -26px 15px 0 7px, #999 -26px -15px 0 7px; - box-shadow: #666666 -26px 15px 0 7px, #999 -26px 15px 0 7px, #999 -26px 15px 0 7px, #999 -26px 15px 0 7px, #999 -26px 15px 0 7px, #999 -26px 15px 0 7px, #999 -26px -15px 0 7px; - } - 41.67% { - -moz-box-shadow: #666666 -26px -15px 0 7px, #999 -26px -15px 0 7px, #999 -26px -15px 0 7px, #999 -26px -15px 0 7px, #999 -26px -15px 0 7px, #999 -26px -15px 0 7px, #999 -26px -15px 0 7px; - box-shadow: #666666 -26px -15px 0 7px, #999 -26px -15px 0 7px, #999 -26px -15px 0 7px, #999 -26px -15px 0 7px, #999 -26px -15px 0 7px, #999 -26px -15px 0 7px, #999 -26px -15px 0 7px; - } - 50% { - -moz-box-shadow: #666666 0 -30px 0 7px, #999 0 -30px 0 7px, #999 0 -30px 0 7px, #999 0 -30px 0 7px, #999 0 -30px 0 7px, #999 0 -30px 0 7px, #999 0 -30px 0 7px; - box-shadow: #666666 0 -30px 0 7px, #999 0 -30px 0 7px, #999 0 -30px 0 7px, #999 0 -30px 0 7px, #999 0 -30px 0 7px, #999 0 -30px 0 7px, #999 0 -30px 0 7px; - } - 58.33% { - -moz-box-shadow: #666666 26px -15px 0 7px, #999 0 -30px 0 7px, #999 26px -15px 0 7px, #999 26px -15px 0 7px, #999 26px -15px 0 7px, #999 26px -15px 0 7px, #999 26px -15px 0 7px; - box-shadow: #666666 26px -15px 0 7px, #999 0 -30px 0 7px, #999 26px -15px 0 7px, #999 26px -15px 0 7px, #999 26px -15px 0 7px, #999 26px -15px 0 7px, #999 26px -15px 0 7px; - } - 66.67% { - -moz-box-shadow: #666666 26px 15px 0 7px, #999 0 -30px 0 7px, #999 26px -15px 0 7px, #999 26px 15px 0 7px, #999 26px 15px 0 7px, #999 26px 15px 0 7px, #999 26px 15px 0 7px; - box-shadow: #666666 26px 15px 0 7px, #999 0 -30px 0 7px, #999 26px -15px 0 7px, #999 26px 15px 0 7px, #999 26px 15px 0 7px, #999 26px 15px 0 7px, #999 26px 15px 0 7px; - } - 75% { - -moz-box-shadow: #666666 0 30px 0 7px, #999 0 -30px 0 7px, #999 26px -15px 0 7px, #999 26px 15px 0 7px, #999 0 30px 0 7px, #999 0 30px 0 7px, #999 0 30px 0 7px; - box-shadow: #666666 0 30px 0 7px, #999 0 -30px 0 7px, #999 26px -15px 0 7px, #999 26px 15px 0 7px, #999 0 30px 0 7px, #999 0 30px 0 7px, #999 0 30px 0 7px; - } - 83.33% { - -moz-box-shadow: #666666 -26px 15px 0 7px, #999 0 -30px 0 7px, #999 26px -15px 0 7px, #999 26px 15px 0 7px, #999 0 30px 0 7px, #999 -26px 15px 0 7px, #999 -26px 15px 0 7px; - box-shadow: #666666 -26px 15px 0 7px, #999 0 -30px 0 7px, #999 26px -15px 0 7px, #999 26px 15px 0 7px, #999 0 30px 0 7px, #999 -26px 15px 0 7px, #999 -26px 15px 0 7px; - } - 91.67% { - -moz-box-shadow: #666666 -26px -15px 0 7px, #999 0 -30px 0 7px, #999 26px -15px 0 7px, #999 26px 15px 0 7px, #999 0 30px 0 7px, #999 -26px 15px 0 7px, #999 -26px -15px 0 7px; - box-shadow: #666666 -26px -15px 0 7px, #999 0 -30px 0 7px, #999 26px -15px 0 7px, #999 26px 15px 0 7px, #999 0 30px 0 7px, #999 -26px 15px 0 7px, #999 -26px -15px 0 7px; - } - 100% { - -moz-box-shadow: #666666 0 -30px 0 7px, #999 0 -30px 0 7px, #999 26px -15px 0 7px, #999 26px 15px 0 7px, #999 0 30px 0 7px, #999 -26px 15px 0 7px, #999 -26px -15px 0 7px; - box-shadow: #666666 0 -30px 0 7px, #999 0 -30px 0 7px, #999 26px -15px 0 7px, #999 26px 15px 0 7px, #999 0 30px 0 7px, #999 -26px 15px 0 7px, #999 -26px -15px 0 7px; - } -} -@-webkit-keyframes hexdots-loader { - 0% { - -webkit-box-shadow: #666666 0 -30px 0 7px, #999 0 -30px 0 7px, #999 26px -15px 0 7px, #999 26px 15px 0 7px, #999 0 30px 0 7px, #999 -26px 15px 0 7px, #999 -26px -15px 0 7px; - box-shadow: #666666 0 -30px 0 7px, #999 0 -30px 0 7px, #999 26px -15px 0 7px, #999 26px 15px 0 7px, #999 0 30px 0 7px, #999 -26px 15px 0 7px, #999 -26px -15px 0 7px; - } - 8.33% { - -webkit-box-shadow: #666666 26px -15px 0 7px, #999 26px -15px 0 7px, #999 26px -15px 0 7px, #999 26px 15px 0 7px, #999 0 30px 0 7px, #999 -26px 15px 0 7px, #999 -26px -15px 0 7px; - box-shadow: #666666 26px -15px 0 7px, #999 26px -15px 0 7px, #999 26px -15px 0 7px, #999 26px 15px 0 7px, #999 0 30px 0 7px, #999 -26px 15px 0 7px, #999 -26px -15px 0 7px; - } - 16.67% { - -webkit-box-shadow: #666666 26px 15px 0 7px, #999 26px 15px 0 7px, #999 26px 15px 0 7px, #999 26px 15px 0 7px, #999 0 30px 0 7px, #999 -26px 15px 0 7px, #999 -26px -15px 0 7px; - box-shadow: #666666 26px 15px 0 7px, #999 26px 15px 0 7px, #999 26px 15px 0 7px, #999 26px 15px 0 7px, #999 0 30px 0 7px, #999 -26px 15px 0 7px, #999 -26px -15px 0 7px; - } - 25% { - -webkit-box-shadow: #666666 0 30px 0 7px, #999 0 30px 0 7px, #999 0 30px 0 7px, #999 0 30px 0 7px, #999 0 30px 0 7px, #999 -26px 15px 0 7px, #999 -26px -15px 0 7px; - box-shadow: #666666 0 30px 0 7px, #999 0 30px 0 7px, #999 0 30px 0 7px, #999 0 30px 0 7px, #999 0 30px 0 7px, #999 -26px 15px 0 7px, #999 -26px -15px 0 7px; - } - 33.33% { - -webkit-box-shadow: #666666 -26px 15px 0 7px, #999 -26px 15px 0 7px, #999 -26px 15px 0 7px, #999 -26px 15px 0 7px, #999 -26px 15px 0 7px, #999 -26px 15px 0 7px, #999 -26px -15px 0 7px; - box-shadow: #666666 -26px 15px 0 7px, #999 -26px 15px 0 7px, #999 -26px 15px 0 7px, #999 -26px 15px 0 7px, #999 -26px 15px 0 7px, #999 -26px 15px 0 7px, #999 -26px -15px 0 7px; - } - 41.67% { - -webkit-box-shadow: #666666 -26px -15px 0 7px, #999 -26px -15px 0 7px, #999 -26px -15px 0 7px, #999 -26px -15px 0 7px, #999 -26px -15px 0 7px, #999 -26px -15px 0 7px, #999 -26px -15px 0 7px; - box-shadow: #666666 -26px -15px 0 7px, #999 -26px -15px 0 7px, #999 -26px -15px 0 7px, #999 -26px -15px 0 7px, #999 -26px -15px 0 7px, #999 -26px -15px 0 7px, #999 -26px -15px 0 7px; - } - 50% { - -webkit-box-shadow: #666666 0 -30px 0 7px, #999 0 -30px 0 7px, #999 0 -30px 0 7px, #999 0 -30px 0 7px, #999 0 -30px 0 7px, #999 0 -30px 0 7px, #999 0 -30px 0 7px; - box-shadow: #666666 0 -30px 0 7px, #999 0 -30px 0 7px, #999 0 -30px 0 7px, #999 0 -30px 0 7px, #999 0 -30px 0 7px, #999 0 -30px 0 7px, #999 0 -30px 0 7px; - } - 58.33% { - -webkit-box-shadow: #666666 26px -15px 0 7px, #999 0 -30px 0 7px, #999 26px -15px 0 7px, #999 26px -15px 0 7px, #999 26px -15px 0 7px, #999 26px -15px 0 7px, #999 26px -15px 0 7px; - box-shadow: #666666 26px -15px 0 7px, #999 0 -30px 0 7px, #999 26px -15px 0 7px, #999 26px -15px 0 7px, #999 26px -15px 0 7px, #999 26px -15px 0 7px, #999 26px -15px 0 7px; - } - 66.67% { - -webkit-box-shadow: #666666 26px 15px 0 7px, #999 0 -30px 0 7px, #999 26px -15px 0 7px, #999 26px 15px 0 7px, #999 26px 15px 0 7px, #999 26px 15px 0 7px, #999 26px 15px 0 7px; - box-shadow: #666666 26px 15px 0 7px, #999 0 -30px 0 7px, #999 26px -15px 0 7px, #999 26px 15px 0 7px, #999 26px 15px 0 7px, #999 26px 15px 0 7px, #999 26px 15px 0 7px; - } - 75% { - -webkit-box-shadow: #666666 0 30px 0 7px, #999 0 -30px 0 7px, #999 26px -15px 0 7px, #999 26px 15px 0 7px, #999 0 30px 0 7px, #999 0 30px 0 7px, #999 0 30px 0 7px; - box-shadow: #666666 0 30px 0 7px, #999 0 -30px 0 7px, #999 26px -15px 0 7px, #999 26px 15px 0 7px, #999 0 30px 0 7px, #999 0 30px 0 7px, #999 0 30px 0 7px; - } - 83.33% { - -webkit-box-shadow: #666666 -26px 15px 0 7px, #999 0 -30px 0 7px, #999 26px -15px 0 7px, #999 26px 15px 0 7px, #999 0 30px 0 7px, #999 -26px 15px 0 7px, #999 -26px 15px 0 7px; - box-shadow: #666666 -26px 15px 0 7px, #999 0 -30px 0 7px, #999 26px -15px 0 7px, #999 26px 15px 0 7px, #999 0 30px 0 7px, #999 -26px 15px 0 7px, #999 -26px 15px 0 7px; - } - 91.67% { - -webkit-box-shadow: #666666 -26px -15px 0 7px, #999 0 -30px 0 7px, #999 26px -15px 0 7px, #999 26px 15px 0 7px, #999 0 30px 0 7px, #999 -26px 15px 0 7px, #999 -26px -15px 0 7px; - box-shadow: #666666 -26px -15px 0 7px, #999 0 -30px 0 7px, #999 26px -15px 0 7px, #999 26px 15px 0 7px, #999 0 30px 0 7px, #999 -26px 15px 0 7px, #999 -26px -15px 0 7px; - } - 100% { - -webkit-box-shadow: #666666 0 -30px 0 7px, #999 0 -30px 0 7px, #999 26px -15px 0 7px, #999 26px 15px 0 7px, #999 0 30px 0 7px, #999 -26px 15px 0 7px, #999 -26px -15px 0 7px; - box-shadow: #666666 0 -30px 0 7px, #999 0 -30px 0 7px, #999 26px -15px 0 7px, #999 26px 15px 0 7px, #999 0 30px 0 7px, #999 -26px 15px 0 7px, #999 -26px -15px 0 7px; - } -} -@keyframes hexdots-loader { - 0% { - -moz-box-shadow: #666666 0 -30px 0 7px, #999 0 -30px 0 7px, #999 26px -15px 0 7px, #999 26px 15px 0 7px, #999 0 30px 0 7px, #999 -26px 15px 0 7px, #999 -26px -15px 0 7px; - -webkit-box-shadow: #666666 0 -30px 0 7px, #999 0 -30px 0 7px, #999 26px -15px 0 7px, #999 26px 15px 0 7px, #999 0 30px 0 7px, #999 -26px 15px 0 7px, #999 -26px -15px 0 7px; - box-shadow: #666666 0 -30px 0 7px, #999 0 -30px 0 7px, #999 26px -15px 0 7px, #999 26px 15px 0 7px, #999 0 30px 0 7px, #999 -26px 15px 0 7px, #999 -26px -15px 0 7px; - } - 8.33% { - -moz-box-shadow: #666666 26px -15px 0 7px, #999 26px -15px 0 7px, #999 26px -15px 0 7px, #999 26px 15px 0 7px, #999 0 30px 0 7px, #999 -26px 15px 0 7px, #999 -26px -15px 0 7px; - -webkit-box-shadow: #666666 26px -15px 0 7px, #999 26px -15px 0 7px, #999 26px -15px 0 7px, #999 26px 15px 0 7px, #999 0 30px 0 7px, #999 -26px 15px 0 7px, #999 -26px -15px 0 7px; - box-shadow: #666666 26px -15px 0 7px, #999 26px -15px 0 7px, #999 26px -15px 0 7px, #999 26px 15px 0 7px, #999 0 30px 0 7px, #999 -26px 15px 0 7px, #999 -26px -15px 0 7px; - } - 16.67% { - -moz-box-shadow: #666666 26px 15px 0 7px, #999 26px 15px 0 7px, #999 26px 15px 0 7px, #999 26px 15px 0 7px, #999 0 30px 0 7px, #999 -26px 15px 0 7px, #999 -26px -15px 0 7px; - -webkit-box-shadow: #666666 26px 15px 0 7px, #999 26px 15px 0 7px, #999 26px 15px 0 7px, #999 26px 15px 0 7px, #999 0 30px 0 7px, #999 -26px 15px 0 7px, #999 -26px -15px 0 7px; - box-shadow: #666666 26px 15px 0 7px, #999 26px 15px 0 7px, #999 26px 15px 0 7px, #999 26px 15px 0 7px, #999 0 30px 0 7px, #999 -26px 15px 0 7px, #999 -26px -15px 0 7px; - } - 25% { - -moz-box-shadow: #666666 0 30px 0 7px, #999 0 30px 0 7px, #999 0 30px 0 7px, #999 0 30px 0 7px, #999 0 30px 0 7px, #999 -26px 15px 0 7px, #999 -26px -15px 0 7px; - -webkit-box-shadow: #666666 0 30px 0 7px, #999 0 30px 0 7px, #999 0 30px 0 7px, #999 0 30px 0 7px, #999 0 30px 0 7px, #999 -26px 15px 0 7px, #999 -26px -15px 0 7px; - box-shadow: #666666 0 30px 0 7px, #999 0 30px 0 7px, #999 0 30px 0 7px, #999 0 30px 0 7px, #999 0 30px 0 7px, #999 -26px 15px 0 7px, #999 -26px -15px 0 7px; - } - 33.33% { - -moz-box-shadow: #666666 -26px 15px 0 7px, #999 -26px 15px 0 7px, #999 -26px 15px 0 7px, #999 -26px 15px 0 7px, #999 -26px 15px 0 7px, #999 -26px 15px 0 7px, #999 -26px -15px 0 7px; - -webkit-box-shadow: #666666 -26px 15px 0 7px, #999 -26px 15px 0 7px, #999 -26px 15px 0 7px, #999 -26px 15px 0 7px, #999 -26px 15px 0 7px, #999 -26px 15px 0 7px, #999 -26px -15px 0 7px; - box-shadow: #666666 -26px 15px 0 7px, #999 -26px 15px 0 7px, #999 -26px 15px 0 7px, #999 -26px 15px 0 7px, #999 -26px 15px 0 7px, #999 -26px 15px 0 7px, #999 -26px -15px 0 7px; - } - 41.67% { - -moz-box-shadow: #666666 -26px -15px 0 7px, #999 -26px -15px 0 7px, #999 -26px -15px 0 7px, #999 -26px -15px 0 7px, #999 -26px -15px 0 7px, #999 -26px -15px 0 7px, #999 -26px -15px 0 7px; - -webkit-box-shadow: #666666 -26px -15px 0 7px, #999 -26px -15px 0 7px, #999 -26px -15px 0 7px, #999 -26px -15px 0 7px, #999 -26px -15px 0 7px, #999 -26px -15px 0 7px, #999 -26px -15px 0 7px; - box-shadow: #666666 -26px -15px 0 7px, #999 -26px -15px 0 7px, #999 -26px -15px 0 7px, #999 -26px -15px 0 7px, #999 -26px -15px 0 7px, #999 -26px -15px 0 7px, #999 -26px -15px 0 7px; - } - 50% { - -moz-box-shadow: #666666 0 -30px 0 7px, #999 0 -30px 0 7px, #999 0 -30px 0 7px, #999 0 -30px 0 7px, #999 0 -30px 0 7px, #999 0 -30px 0 7px, #999 0 -30px 0 7px; - -webkit-box-shadow: #666666 0 -30px 0 7px, #999 0 -30px 0 7px, #999 0 -30px 0 7px, #999 0 -30px 0 7px, #999 0 -30px 0 7px, #999 0 -30px 0 7px, #999 0 -30px 0 7px; - box-shadow: #666666 0 -30px 0 7px, #999 0 -30px 0 7px, #999 0 -30px 0 7px, #999 0 -30px 0 7px, #999 0 -30px 0 7px, #999 0 -30px 0 7px, #999 0 -30px 0 7px; - } - 58.33% { - -moz-box-shadow: #666666 26px -15px 0 7px, #999 0 -30px 0 7px, #999 26px -15px 0 7px, #999 26px -15px 0 7px, #999 26px -15px 0 7px, #999 26px -15px 0 7px, #999 26px -15px 0 7px; - -webkit-box-shadow: #666666 26px -15px 0 7px, #999 0 -30px 0 7px, #999 26px -15px 0 7px, #999 26px -15px 0 7px, #999 26px -15px 0 7px, #999 26px -15px 0 7px, #999 26px -15px 0 7px; - box-shadow: #666666 26px -15px 0 7px, #999 0 -30px 0 7px, #999 26px -15px 0 7px, #999 26px -15px 0 7px, #999 26px -15px 0 7px, #999 26px -15px 0 7px, #999 26px -15px 0 7px; - } - 66.67% { - -moz-box-shadow: #666666 26px 15px 0 7px, #999 0 -30px 0 7px, #999 26px -15px 0 7px, #999 26px 15px 0 7px, #999 26px 15px 0 7px, #999 26px 15px 0 7px, #999 26px 15px 0 7px; - -webkit-box-shadow: #666666 26px 15px 0 7px, #999 0 -30px 0 7px, #999 26px -15px 0 7px, #999 26px 15px 0 7px, #999 26px 15px 0 7px, #999 26px 15px 0 7px, #999 26px 15px 0 7px; - box-shadow: #666666 26px 15px 0 7px, #999 0 -30px 0 7px, #999 26px -15px 0 7px, #999 26px 15px 0 7px, #999 26px 15px 0 7px, #999 26px 15px 0 7px, #999 26px 15px 0 7px; - } - 75% { - -moz-box-shadow: #666666 0 30px 0 7px, #999 0 -30px 0 7px, #999 26px -15px 0 7px, #999 26px 15px 0 7px, #999 0 30px 0 7px, #999 0 30px 0 7px, #999 0 30px 0 7px; - -webkit-box-shadow: #666666 0 30px 0 7px, #999 0 -30px 0 7px, #999 26px -15px 0 7px, #999 26px 15px 0 7px, #999 0 30px 0 7px, #999 0 30px 0 7px, #999 0 30px 0 7px; - box-shadow: #666666 0 30px 0 7px, #999 0 -30px 0 7px, #999 26px -15px 0 7px, #999 26px 15px 0 7px, #999 0 30px 0 7px, #999 0 30px 0 7px, #999 0 30px 0 7px; - } - 83.33% { - -moz-box-shadow: #666666 -26px 15px 0 7px, #999 0 -30px 0 7px, #999 26px -15px 0 7px, #999 26px 15px 0 7px, #999 0 30px 0 7px, #999 -26px 15px 0 7px, #999 -26px 15px 0 7px; - -webkit-box-shadow: #666666 -26px 15px 0 7px, #999 0 -30px 0 7px, #999 26px -15px 0 7px, #999 26px 15px 0 7px, #999 0 30px 0 7px, #999 -26px 15px 0 7px, #999 -26px 15px 0 7px; - box-shadow: #666666 -26px 15px 0 7px, #999 0 -30px 0 7px, #999 26px -15px 0 7px, #999 26px 15px 0 7px, #999 0 30px 0 7px, #999 -26px 15px 0 7px, #999 -26px 15px 0 7px; - } - 91.67% { - -moz-box-shadow: #666666 -26px -15px 0 7px, #999 0 -30px 0 7px, #999 26px -15px 0 7px, #999 26px 15px 0 7px, #999 0 30px 0 7px, #999 -26px 15px 0 7px, #999 -26px -15px 0 7px; - -webkit-box-shadow: #666666 -26px -15px 0 7px, #999 0 -30px 0 7px, #999 26px -15px 0 7px, #999 26px 15px 0 7px, #999 0 30px 0 7px, #999 -26px 15px 0 7px, #999 -26px -15px 0 7px; - box-shadow: #666666 -26px -15px 0 7px, #999 0 -30px 0 7px, #999 26px -15px 0 7px, #999 26px 15px 0 7px, #999 0 30px 0 7px, #999 -26px 15px 0 7px, #999 -26px -15px 0 7px; - } - 100% { - -moz-box-shadow: #666666 0 -30px 0 7px, #999 0 -30px 0 7px, #999 26px -15px 0 7px, #999 26px 15px 0 7px, #999 0 30px 0 7px, #999 -26px 15px 0 7px, #999 -26px -15px 0 7px; - -webkit-box-shadow: #666666 0 -30px 0 7px, #999 0 -30px 0 7px, #999 26px -15px 0 7px, #999 26px 15px 0 7px, #999 0 30px 0 7px, #999 -26px 15px 0 7px, #999 -26px -15px 0 7px; - box-shadow: #666666 0 -30px 0 7px, #999 0 -30px 0 7px, #999 26px -15px 0 7px, #999 26px 15px 0 7px, #999 0 30px 0 7px, #999 -26px 15px 0 7px, #999 -26px -15px 0 7px; - } -} -/* :not(:required) hides this rule from IE9 and below */ -.hexdots-loader:not(:required) { - overflow: hidden; - position: relative; - text-indent: -9999px; - display: inline-block; - width: 7px; - height: 7px; - background: transparent; - border-radius: 100%; - -moz-box-shadow: #666666 0 -30px 0 7px, #999 26px -15px 0 7px, #999 26px 15px 0 7px, #999 0 30px 0 7px, #999 0 30px 0 7px, #999 0 30px 0 7px; - -webkit-box-shadow: #666666 0 -30px 0 7px, #999 26px -15px 0 7px, #999 26px 15px 0 7px, #999 0 30px 0 7px, #999 0 30px 0 7px, #999 0 30px 0 7px; - box-shadow: #666666 0 -30px 0 7px, #999 26px -15px 0 7px, #999 26px 15px 0 7px, #999 0 30px 0 7px, #999 0 30px 0 7px, #999 0 30px 0 7px; - -moz-animation: hexdots-loader 5s infinite ease-in-out; - -webkit-animation: hexdots-loader 5s infinite ease-in-out; - animation: hexdots-loader 5s infinite ease-in-out; - -moz-transform-origin: 50% 50%; - -ms-transform-origin: 50% 50%; - -webkit-transform-origin: 50% 50%; - transform-origin: 50% 50%; -} - -/* :not(:required) hides this rule from IE9 and below */ -.inner-circles-loader:not(:required) { - -moz-transform: translate3d(0, 0, 0); - -ms-transform: translate3d(0, 0, 0); - -webkit-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); - position: relative; - display: inline-block; - width: 50px; - height: 50px; - background: rgba(25, 165, 152, 0.5); - border-radius: 50%; - overflow: hidden; - text-indent: -9999px; - /* Hides inner circles outside base circle at safari */ - -webkit-mask-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAIAAACQd1PeAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAA5JREFUeNpiYGBgAAgwAAAEAAGbA+oJAAAAAElFTkSuQmCC); -} -.inner-circles-loader:not(:required):before, .inner-circles-loader:not(:required):after { - content: ''; - position: absolute; - top: 0; - display: inline-block; - width: 50px; - height: 50px; - border-radius: 50%; -} -.inner-circles-loader:not(:required):before { - -moz-animation: inner-circles-loader 3s infinite; - -webkit-animation: inner-circles-loader 3s infinite; - animation: inner-circles-loader 3s infinite; - -moz-transform-origin: 0 50%; - -ms-transform-origin: 0 50%; - -webkit-transform-origin: 0 50%; - transform-origin: 0 50%; - left: 0; - background: #c7efcf; -} -.inner-circles-loader:not(:required):after { - -moz-animation: inner-circles-loader 3s 0.2s reverse infinite; - -webkit-animation: inner-circles-loader 3s 0.2s reverse infinite; - animation: inner-circles-loader 3s 0.2s reverse infinite; - -moz-transform-origin: 100% 50%; - -ms-transform-origin: 100% 50%; - -webkit-transform-origin: 100% 50%; - transform-origin: 100% 50%; - right: 0; - background: #eef5db; -} - -@-moz-keyframes inner-circles-loader { - 0% { - -moz-transform: rotate(0deg); - transform: rotate(0deg); - } - 50% { - -moz-transform: rotate(360deg); - transform: rotate(360deg); - } - 100% { - -moz-transform: rotate(0deg); - transform: rotate(0deg); - } -} -@-webkit-keyframes inner-circles-loader { - 0% { - -webkit-transform: rotate(0deg); - transform: rotate(0deg); - } - 50% { - -webkit-transform: rotate(360deg); - transform: rotate(360deg); - } - 100% { - -webkit-transform: rotate(0deg); - transform: rotate(0deg); - } -} -@keyframes inner-circles-loader { - 0% { - -moz-transform: rotate(0deg); - -ms-transform: rotate(0deg); - -webkit-transform: rotate(0deg); - transform: rotate(0deg); - } - 50% { - -moz-transform: rotate(360deg); - -ms-transform: rotate(360deg); - -webkit-transform: rotate(360deg); - transform: rotate(360deg); - } - 100% { - -moz-transform: rotate(0deg); - -ms-transform: rotate(0deg); - -webkit-transform: rotate(0deg); - transform: rotate(0deg); - } -} @-moz-keyframes pong-loader { 0% { left: 5px; @@ -3342,64 +295,3 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. height: 10px; background: #8cdb8b; } - -.pulse-loader:not(:required) { - display: inline-block; - width: 50px; - height: 50px; - -moz-animation: pulse-loader 0.7s linear infinite alternate; - -webkit-animation: pulse-loader 0.7s linear infinite alternate; - animation: pulse-loader 0.7s linear infinite alternate; - border: 2px solid #e67e22; - -moz-border-radius: 50%; - -webkit-border-radius: 50%; - border-radius: 50%; - overflow: hidden; - text-indent: 50px; -} - -@-moz-keyframes pulse-loader { - 0% { - -moz-box-shadow: #e67e22 0 0 0px 20px; - box-shadow: #e67e22 0 0 0px 20px; - } - 40% { - -moz-box-shadow: none; - box-shadow: none; - } - 100% { - -moz-box-shadow: #e67e22 0 0 0px 25px inset; - box-shadow: #e67e22 0 0 0px 25px inset; - } -} -@-webkit-keyframes pulse-loader { - 0% { - -webkit-box-shadow: #e67e22 0 0 0px 20px; - box-shadow: #e67e22 0 0 0px 20px; - } - 40% { - -webkit-box-shadow: none; - box-shadow: none; - } - 100% { - -webkit-box-shadow: #e67e22 0 0 0px 25px inset; - box-shadow: #e67e22 0 0 0px 25px inset; - } -} -@keyframes pulse-loader { - 0% { - -moz-box-shadow: #e67e22 0 0 0px 20px; - -webkit-box-shadow: #e67e22 0 0 0px 20px; - box-shadow: #e67e22 0 0 0px 20px; - } - 40% { - -moz-box-shadow: none; - -webkit-box-shadow: none; - box-shadow: none; - } - 100% { - -moz-box-shadow: #e67e22 0 0 0px 25px inset; - -webkit-box-shadow: #e67e22 0 0 0px 25px inset; - box-shadow: #e67e22 0 0 0px 25px inset; - } -}