From 66c7b785c31ec331649a914f1defb08db5f0c0b6 Mon Sep 17 00:00:00 2001 From: Victor Costa Date: Mon, 9 Mar 2015 18:03:49 -0300 Subject: [PATCH] Block store: improve usability of adding/moving blocks --- app/controllers/box_organizer_controller.rb | 48 +++++++++++++++++++++++++++--------------------- app/controllers/my_profile/profile_design_controller.rb | 3 ++- app/helpers/box_organizer_helper.rb | 44 +++++++++++++++++++++++++++++++++++++++++++- app/helpers/boxes_helper.rb | 25 ++++++++++++++++++++++--- app/models/article_block.rb | 10 +++++++++- app/models/block.rb | 30 ++++++++++++++++++++++++++++++ app/models/communities_block.rb | 8 ++++++++ app/models/featured_products_block.rb | 4 ++++ app/models/feed_reader_block.rb | 4 ++++ app/models/highlights_block.rb | 2 +- app/models/link_list_block.rb | 4 ++++ app/models/profile_info_block.rb | 10 +++++++++- app/models/raw_html_block.rb | 4 ++++ app/models/recent_documents_block.rb | 10 +++++++++- app/models/sellers_search_block.rb | 4 ++++ app/models/tags_block.rb | 10 +++++++++- app/models/theme.rb | 14 +++++++++++++- app/views/box_organizer/add_block.html.erb | 49 ------------------------------------------------- app/views/box_organizer/index.html.erb | 28 +++++++++++++++++++++++++++- app/views/box_organizer/show_block_type_info.html.erb | 21 +++++++++++++++++++++ lib/noosfero/plugin.rb | 4 ++++ plugins/breadcrumbs/lib/breadcrumbs_plugin/content_breadcrumbs_block.rb | 10 +++++++++- plugins/breadcrumbs/public/images/blocks/content_breadcrumbs_block/breadcrumb.svg | 961 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ plugins/breadcrumbs/public/images/blocks/content_breadcrumbs_block/icon.png | Bin 0 -> 1535 bytes plugins/breadcrumbs/public/images/blocks/content_breadcrumbs_block/previews/edit_block.png | Bin 0 -> 14533 bytes plugins/breadcrumbs/public/images/blocks/content_breadcrumbs_block/previews/view_block.png | Bin 0 -> 3762 bytes plugins/community_track/lib/community_track_plugin/track_card_list_block.rb | 4 ++++ plugins/community_track/lib/community_track_plugin/track_list_block.rb | 4 ++++ plugins/container_block/public/style.css | 10 ++++++---- plugins/container_block/views/blocks/container.html.erb | 8 +++----- public/articles/0000/1155/eventos.tar.gz | Bin 0 -> 222 bytes public/articles/0000/1156/rankings.tar.gz | Bin 0 -> 339 bytes public/articles/0000/1157/propostas.csv | 95 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ public/articles/0000/1158/propostas.csv | 95 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ public/articles/0000/1159/rankings.tar.gz | Bin 0 -> 339 bytes public/articles/0000/1160/eventos.tar.gz | Bin 0 -> 226 bytes public/articles/0000/1162/propostas.csv | 95 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ public/articles/0000/1163/rankings.tar.gz | Bin 0 -> 338 bytes public/articles/0000/1164/eventos.tar.gz | Bin 0 -> 223 bytes public/fonts/slick.eot | Bin 0 -> 2048 bytes public/fonts/slick.svg | 14 ++++++++++++++ public/fonts/slick.ttf | Bin 0 -> 1892 bytes public/fonts/slick.woff | Bin 0 -> 1380 bytes public/images/block_preview.png | Bin 0 -> 3223 bytes public/images/blocks/blog_archives_block/icon.png | Bin 0 -> 3874 bytes public/images/blocks/blog_archives_block/icon.svg | 556 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ public/images/blocks/communities_block/icon.png | Bin 0 -> 4891 bytes public/images/blocks/communities_block/icon.svg | 851 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ public/images/blocks/communities_block/previews/edit_block.png | Bin 0 -> 28274 bytes public/images/blocks/communities_block/previews/view_block.png | Bin 0 -> 16066 bytes public/images/blocks/friends_block | 1 + public/images/blocks/highlights_block/icon.png | Bin 0 -> 2361 bytes public/images/blocks/highlights_block/icon.svg | 519 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ public/images/blocks/highlights_block/previews/edit_block.png | Bin 0 -> 32114 bytes public/images/blocks/highlights_block/previews/show_block.png | Bin 0 -> 75236 bytes public/images/blocks/members_block | 1 + public/images/blocks/people_block/icon.png | Bin 0 -> 4680 bytes public/images/blocks/people_block/icon.svg | 465 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ public/images/blocks/profile_image_block/icon.png | Bin 0 -> 3738 bytes public/images/blocks/profile_image_block/icon.svg | 610 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ public/images/icon_block.png | Bin 0 -> 903 bytes public/javascripts/application.js | 2 ++ public/javascripts/block-store.js | 63 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ public/javascripts/slick.js | 2249 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ public/proposal-app | 1 + public/stylesheets/block-store.css | 164 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ public/stylesheets/slick-theme.css | 201 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ public/stylesheets/slick.css | 116 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ test/functional/environment_design_controller_test.rb | 77 ++++++----------------------------------------------------------------------- test/functional/profile_design_controller_test.rb | 118 +++++++++++++++++++++++++++++++--------------------------------------------------------------------------------------- test/performance/user_test.rb | 28 ++++++++++++++++++++++++++++ test/unit/box_organizer_helper_test.rb | 312 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 72 files changed, 7716 insertions(+), 250 deletions(-) delete mode 100644 app/views/box_organizer/add_block.html.erb create mode 100644 app/views/box_organizer/show_block_type_info.html.erb create mode 100644 plugins/breadcrumbs/public/images/blocks/content_breadcrumbs_block/breadcrumb.svg create mode 100644 plugins/breadcrumbs/public/images/blocks/content_breadcrumbs_block/icon.png create mode 100644 plugins/breadcrumbs/public/images/blocks/content_breadcrumbs_block/previews/edit_block.png create mode 100644 plugins/breadcrumbs/public/images/blocks/content_breadcrumbs_block/previews/view_block.png create mode 100644 public/articles/0000/1155/eventos.tar.gz create mode 100644 public/articles/0000/1156/rankings.tar.gz create mode 100644 public/articles/0000/1157/propostas.csv create mode 100644 public/articles/0000/1158/propostas.csv create mode 100644 public/articles/0000/1159/rankings.tar.gz create mode 100644 public/articles/0000/1160/eventos.tar.gz create mode 100644 public/articles/0000/1162/propostas.csv create mode 100644 public/articles/0000/1163/rankings.tar.gz create mode 100644 public/articles/0000/1164/eventos.tar.gz create mode 100644 public/fonts/slick.eot create mode 100644 public/fonts/slick.svg create mode 100644 public/fonts/slick.ttf create mode 100644 public/fonts/slick.woff create mode 100644 public/images/block_preview.png create mode 100644 public/images/blocks/blog_archives_block/icon.png create mode 100644 public/images/blocks/blog_archives_block/icon.svg create mode 100644 public/images/blocks/communities_block/icon.png create mode 100644 public/images/blocks/communities_block/icon.svg create mode 100644 public/images/blocks/communities_block/previews/edit_block.png create mode 100644 public/images/blocks/communities_block/previews/view_block.png create mode 120000 public/images/blocks/friends_block create mode 100644 public/images/blocks/highlights_block/icon.png create mode 100644 public/images/blocks/highlights_block/icon.svg create mode 100644 public/images/blocks/highlights_block/previews/edit_block.png create mode 100644 public/images/blocks/highlights_block/previews/show_block.png create mode 120000 public/images/blocks/members_block create mode 100644 public/images/blocks/people_block/icon.png create mode 100644 public/images/blocks/people_block/icon.svg create mode 100644 public/images/blocks/profile_image_block/icon.png create mode 100644 public/images/blocks/profile_image_block/icon.svg create mode 100644 public/images/icon_block.png create mode 100644 public/javascripts/block-store.js create mode 100644 public/javascripts/slick.js create mode 160000 public/proposal-app create mode 100644 public/stylesheets/block-store.css create mode 100644 public/stylesheets/slick-theme.css create mode 100644 public/stylesheets/slick.css create mode 100644 test/performance/user_test.rb create mode 100644 test/unit/box_organizer_helper_test.rb diff --git a/app/controllers/box_organizer_controller.rb b/app/controllers/box_organizer_controller.rb index eb13d5d..c942210 100644 --- a/app/controllers/box_organizer_controller.rb +++ b/app/controllers/box_organizer_controller.rb @@ -3,12 +3,11 @@ class BoxOrganizerController < ApplicationController before_filter :login_required def index + @available_blocks = available_blocks.uniq.sort_by(&:pretty_name) end def move_block - @block = boxes_holder.blocks.find(params[:id].gsub(/^block-/, '')) - - @source_box = @block.box + @block = params[:id] ? boxes_holder.blocks.find(params[:id].gsub(/^block-/, '')) : nil target_position = nil @@ -20,9 +19,12 @@ class BoxOrganizerController < ApplicationController else (params[:target] =~ /end-of-box-([0-9]+)/) - @target_box = boxes_holder.boxes.find($1) + @target_box = boxes_holder.boxes.find_by_id($1) end + @block = new_block(params[:type], @target_box) if @block.nil? + @source_box = @block.box + if (@source_box != @target_box) @block.remove_from_list @block.box = @target_box @@ -58,23 +60,6 @@ class BoxOrganizerController < ApplicationController redirect_to :action => 'index' end - def add_block - type = params[:type] - if ! type.blank? - if available_blocks.map(&:name).include?(type) - boxes_holder.boxes.find(params[:box_id]).blocks << type.constantize.new - redirect_to :action => 'index' - else - raise ArgumentError.new("Type %s is not allowed. Go away." % type) - end - else - @center_block_types = (Box.acceptable_center_blocks & available_blocks) + plugins.dispatch(:extra_blocks, :type => boxes_holder.class, :position => 1) - @side_block_types = (Box.acceptable_side_blocks & available_blocks) + plugins.dispatch(:extra_blocks, :type => boxes_holder.class, :position => [2,3]) - @boxes = boxes_holder.boxes.with_position - render :action => 'add_block', :layout => false - end - end - def edit @block = boxes_holder.blocks.find(params[:id]) render :action => 'edit', :layout => false @@ -121,6 +106,27 @@ class BoxOrganizerController < ApplicationController redirect_to :action => 'index' end + def show_block_type_info + type = params[:type] + if type.blank? || !available_blocks.map(&:name).include?(type) + raise ArgumentError.new("Type %s is not allowed. Go away." % type) + end + @block = type.constantize.new + @block.box = Box.new(:owner => boxes_holder) + render :action => 'show_block_type_info', :layout => false + end + protected :boxes_editor? + protected + + def new_block(type, box) + if !available_blocks.map(&:name).include?(type) + raise ArgumentError.new("Type %s is not allowed. Go away." % type) + end + block = type.constantize.new + box.blocks << block + block + end + end diff --git a/app/controllers/my_profile/profile_design_controller.rb b/app/controllers/my_profile/profile_design_controller.rb index 7a5ee5a..fecb028 100644 --- a/app/controllers/my_profile/profile_design_controller.rb +++ b/app/controllers/my_profile/profile_design_controller.rb @@ -15,8 +15,9 @@ class ProfileDesignController < BoxOrganizerController end def protect_fixed_block + return if params[:id].blank? block = boxes_holder.blocks.find(params[:id].gsub(/^block-/, '')) - if !current_person.is_admin? && !block.movable? + if block.present? && !current_person.is_admin? && !block.movable? render_access_denied end end diff --git a/app/helpers/box_organizer_helper.rb b/app/helpers/box_organizer_helper.rb index ba05552..5003cde 100644 --- a/app/helpers/box_organizer_helper.rb +++ b/app/helpers/box_organizer_helper.rb @@ -1,5 +1,47 @@ module BoxOrganizerHelper + def display_icon(block) + image_path = nil + plugin = @plugins.fetch_first_plugin(:has_block?, block) + + theme = Theme.new(environment.theme) # remove this + if File.exists?(File.join(theme.filesystem_path, block.icon_path)) + image_path = File.join(theme.public_path, block.icon_path) + elsif plugin && File.exists?(File.join(Rails.root, 'public', plugin.public_path, block.icon_path)) + image_path = File.join('/', plugin.public_path, block.icon_path) + elsif File.exists?(File.join(Rails.root, 'public', block.icon_path)) + image_path = block.icon_path + else + image_path = block.default_icon_path + end + + image_tag(image_path, height: '48', width: '48', class: 'block-type-icon', alt: '' ) + end + + def display_previews(block) + images_path = nil + plugin = @plugins.fetch_first_plugin(:has_block?, block) + + theme = Theme.new(environment.theme) # remove this + + images_path = Dir.glob(File.join(theme.filesystem_path, 'images', block.preview_path, '*')) + images_path = images_path.map{|path| path.gsub(theme.filesystem_path, theme.public_path) } unless images_path.empty? + + images_path = Dir.glob(File.join(Rails.root, 'public', plugin.public_path, 'images', block.preview_path, '*')) if plugin && images_path.empty? + images_path = images_path.map{|path| path.gsub(File.join(Rails.root, 'public'), '') } unless images_path.empty? + + images_path = Dir.glob(File.join(Rails.root, 'public', 'images', block.preview_path, '*')) if images_path.empty? + images_path = images_path.map{|path| path.gsub(File.join(Rails.root, 'public'), '') } unless images_path.empty? + + images_path = 1.upto(3).map{block.default_preview_path} if images_path.empty? + + content_tag(:ul, + images_path.map do |preview| + content_tag(:li, image_tag(preview, height: '240', alt: '')) + end.join("\n") + ) + end + def icon_selector(icon = 'no-ico') render :partial => 'icon_selector', :locals => { :icon => icon } end @@ -10,4 +52,4 @@ module BoxOrganizerHelper end end -end \ No newline at end of file +end diff --git a/app/helpers/boxes_helper.rb b/app/helpers/boxes_helper.rb index 028e1e1..0536bd4 100644 --- a/app/helpers/boxes_helper.rb +++ b/app/helpers/boxes_helper.rb @@ -190,8 +190,9 @@ module BoxesHelper else "before-block-#{block.id}" end - if block.nil? || movable?(block) - content_tag('div', ' ', :id => id, :class => 'block-target' ) + drop_receiving_element(id, :url => { :action => 'move_block', :target => id }, :accept => box.acceptable_blocks, :hoverclass => 'block-target-hover') + if block.nil? or movable?(block) + url = url_for(:action => 'move_block', :target => id) + content_tag('div', _('Drop Here'), :id => id, :class => 'block-target' ) + drop_receiving_element(id, :accept => box.acceptable_blocks, :hoverclass => 'block-target-hover', :activeClass => 'block-target-active', :tolerance => 'pointer', :onDrop => "function(ev, ui) { dropBlock('#{url}', '#{_('loading...')}', ev, ui);}") else "" end @@ -199,7 +200,25 @@ module BoxesHelper # makes the given block draggable so it can be moved away. def block_handle(block) - movable?(block) ? draggable_element("block-#{block.id}", :revert => true) : "" + return "" unless movable?(block) + icon = "
#{display_icon(block.class)}
#{_(block.class.pretty_name)}
" + block_draggable("block-#{block.id}", + :helper => "function() {return cloneDraggableBlock($(this), '#{icon}')}") + end + + def block_draggable(element_id, options={}) + draggable_options = { + :revert => "'invalid'", + :appendTo => "'#block-store-draggables'", + :helper => '"clone"', + :revertDuration => 200, + :scroll => false, + :start => "startDragBlock", + :stop => "stopDragBlock", + :cursor => "'move'", + :cursorAt => '{ left: 0, top:0, right:0, bottom:0 }', + }.merge(options) + draggable_element(element_id, draggable_options) end def block_edit_buttons(block) diff --git a/app/models/article_block.rb b/app/models/article_block.rb index 55ef642..6104384 100644 --- a/app/models/article_block.rb +++ b/app/models/article_block.rb @@ -3,7 +3,15 @@ class ArticleBlock < Block attr_accessible :article_id def self.description - _('Display one of your contents') + _('Display one of your contents.') + end + + def self.short_description + _('Show one article') + end + + def self.pretty_name + _('Article') end def help diff --git a/app/models/block.rb b/app/models/block.rb index a18a5b3..f5df8d7 100644 --- a/app/models/block.rb +++ b/app/models/block.rb @@ -141,6 +141,36 @@ class Block < ActiveRecord::Base '(dummy)' end + def self.short_description + self.pretty_name + end + + def self.icon + "/images/icon_block.png" + end + + def self.icon_path + basename = self.name.split('::').last.underscore + File.join('images', 'blocks', basename, 'icon.png') + end + + def self.pretty_name + self.name.split('::').last.gsub('Block','') + end + + def self.default_icon_path + '/images/icon_block.png' + end + + def self.preview_path + base_name = self.name.split('::').last.underscore + File.join('blocks', base_name,'previews') + end + + def self.default_preview_path + "/images/block_preview.png" + end + # Returns the content to be used for this block. # # This method can return several types of objects: diff --git a/app/models/communities_block.rb b/app/models/communities_block.rb index 1f2b9cc..33f3330 100644 --- a/app/models/communities_block.rb +++ b/app/models/communities_block.rb @@ -3,9 +3,17 @@ class CommunitiesBlock < ProfileListBlock attr_accessible :accessor_id, :accessor_type, :role_id, :resource_id, :resource_type def self.description + _("

Display all of your communities.

You could choose the amount of communities will be displayed and you could priorize that profiles with images.

The view all button is always present in the block.

") + end + + def self.short_description _('Communities') end + def self.pretty_name + _('Communities Block') + end + def default_title n_('{#} community', '{#} communities', profile_count) end diff --git a/app/models/featured_products_block.rb b/app/models/featured_products_block.rb index 426cf3c..ae2b78f 100644 --- a/app/models/featured_products_block.rb +++ b/app/models/featured_products_block.rb @@ -20,6 +20,10 @@ class FeaturedProductsBlock < Block _('Featured Products') end + def self.pretty_name + _('Featured Products') + end + def products Product.find(self.product_ids) || [] end diff --git a/app/models/feed_reader_block.rb b/app/models/feed_reader_block.rb index 555feeb..62cd003 100644 --- a/app/models/feed_reader_block.rb +++ b/app/models/feed_reader_block.rb @@ -40,6 +40,10 @@ class FeedReaderBlock < Block _('Feed reader') end + def self.pretty_name + _('Feed Reader') + end + def help _('This block can be used to list the latest new from any site you want. You just need to inform the address of a RSS feed.') end diff --git a/app/models/highlights_block.rb b/app/models/highlights_block.rb index 9ee66b7..728a083 100644 --- a/app/models/highlights_block.rb +++ b/app/models/highlights_block.rb @@ -25,7 +25,7 @@ class HighlightsBlock < Block end def self.description - _('Highlights') + _('Creates image slideshow') end def featured_images diff --git a/app/models/link_list_block.rb b/app/models/link_list_block.rb index 4068a68..b714521 100644 --- a/app/models/link_list_block.rb +++ b/app/models/link_list_block.rb @@ -55,6 +55,10 @@ class LinkListBlock < Block _('This block can be used to create a menu of links. You can add, remove and update the links as you wish.') end + def self.pretty_name + _('Link list') + end + def content(args={}) block_title(title) + content_tag('ul', diff --git a/app/models/profile_info_block.rb b/app/models/profile_info_block.rb index de75947..153dba4 100644 --- a/app/models/profile_info_block.rb +++ b/app/models/profile_info_block.rb @@ -1,7 +1,15 @@ class ProfileInfoBlock < Block def self.description - _('Profile information') + _('Display profile image and links to access initial homepage, control panel and profile activities.') + end + + def self.short_description + _('Show profile information') + end + + def self.pretty_name + _('Profile Information') end def help diff --git a/app/models/raw_html_block.rb b/app/models/raw_html_block.rb index 652f90c..8a4ac03 100644 --- a/app/models/raw_html_block.rb +++ b/app/models/raw_html_block.rb @@ -4,6 +4,10 @@ class RawHTMLBlock < Block _('Raw HTML') end + def self.pretty_name + _('Raw HTML') + end + settings_items :html, :type => :text attr_accessible :html diff --git a/app/models/recent_documents_block.rb b/app/models/recent_documents_block.rb index 052f0f9..5749e88 100644 --- a/app/models/recent_documents_block.rb +++ b/app/models/recent_documents_block.rb @@ -1,7 +1,15 @@ class RecentDocumentsBlock < Block def self.description - _('Last updates') + _('Display the last content produced in the context where the block is available.') + end + + def self.short_description + _('Show last updates') + end + + def self.pretty_name + _('Recent Content') end def default_title diff --git a/app/models/sellers_search_block.rb b/app/models/sellers_search_block.rb index 6aff8ac..ae98ca6 100644 --- a/app/models/sellers_search_block.rb +++ b/app/models/sellers_search_block.rb @@ -10,6 +10,10 @@ class SellersSearchBlock < Block _('Products/Enterprises search') end + def self.pretty_name + _('Sellers Search') + end + def default_title _('Search for sellers') end diff --git a/app/models/tags_block.rb b/app/models/tags_block.rb index c734ca0..9a94712 100644 --- a/app/models/tags_block.rb +++ b/app/models/tags_block.rb @@ -8,7 +8,15 @@ class TagsBlock < Block settings_items :limit, :type => :integer, :default => 12 def self.description - _('Tags') + _('

Display a tag cloud with the content produced where the block is applied.

The user could limit the number of tags will be displayed.

') + end + + def self.short_description + _('Display a tag cloud about current content') + end + + def self.pretty_name + _('Tag Cloud') end def default_title diff --git a/app/models/theme.rb b/app/models/theme.rb index 6a24801..baedfb3 100644 --- a/app/models/theme.rb +++ b/app/models/theme.rb @@ -14,7 +14,11 @@ class Theme end def system_themes_dir - Rails.root.join('public', 'designs', 'themes') + Rails.root.join('public', relative_themes_dir) + end + + def relative_themes_dir + File.join('designs', 'themes') end def create(id, attributes = {}) @@ -93,6 +97,14 @@ class Theme config['public'] = value end + def public_path + File.join('/', self.class.relative_themes_dir, self.id) + end + + def filesystem_path + File.join(self.class.system_themes_dir, self.id) + end + def ==(other) other.is_a?(self.class) && (other.id == self.id) end diff --git a/app/views/box_organizer/add_block.html.erb b/app/views/box_organizer/add_block.html.erb deleted file mode 100644 index ed647ea..0000000 --- a/app/views/box_organizer/add_block.html.erb +++ /dev/null @@ -1,49 +0,0 @@ -
- <%= form_tag do %> - -

<%= _('In what area do you want to put your new block?') %>

- -
- <% @boxes.each do |box| %> - <% name = box.central? ? _('Main area') : _('Area %d') % box.position %> - <%= labelled_radio_button(name, :box_id, box.id, box.central?, { 'data-position' => box.position }) %> - <% end %> -
- - - -

<%= _('Select the type of block you want to add to your page.') %>

- -
- <% @center_block_types.each do |block| %> -
- <%= labelled_radio_button(block.description, :type, block.name) %> -
- <% end %> -
- - - -
- - <% button_bar do %> - <%= submit_button(:add, _("Add")) %> - <%= modal_close_button(_('Close')) %> - <% end %> - - <% end %> -
diff --git a/app/views/box_organizer/index.html.erb b/app/views/box_organizer/index.html.erb index fa0e337..89ab1ee 100644 --- a/app/views/box_organizer/index.html.erb +++ b/app/views/box_organizer/index.html.erb @@ -1,6 +1,32 @@ +<%= stylesheet_link_tag 'slick.css' %> +<%= stylesheet_link_tag 'slick-theme.css' %> +

<%= _('Editing sideboxes')%>

<% button_bar :class=>'design-menu' do %> - <%= modal_button('add', _('Add a block'), { :action => 'add_block' }) %> <%= button(:back, _('Back to control panel'), :controller => (profile.nil? ? 'admin_panel': 'profile_editor')) %> <% end %> + +
+ +
+ <% @available_blocks.each do |block| %> +
+
+ <%= modal_button 'help', _('Help on this block'), + {:action => 'show_block_type_info', :type => block.name}, + :title => _('Help on this block') %> +
+
+ <%= display_icon(block) %> +
+ <%= _(block.pretty_name) %> + <%= block_draggable("block-#{block.name.to_css_class}", + :cursorAt => '{bottom: 30, left: 0}') %> +
+ <% end %> +
+
+
+ + diff --git a/app/views/box_organizer/show_block_type_info.html.erb b/app/views/box_organizer/show_block_type_info.html.erb new file mode 100644 index 0000000..1758c28 --- /dev/null +++ b/app/views/box_organizer/show_block_type_info.html.erb @@ -0,0 +1,21 @@ +
+ +
+ <%= display_icon(@block.class) %> +

<%= @block.class.pretty_name %>

+

<%= @block.class.short_description %>

+
+ +
+
+ <%= display_previews(@block.class) %> +
+
+ +
+

<%= _('Description') %>

+

<%= @block.class.description %>

+

<%= @block.help if @block.class.method_defined?(:help) %>

+
+ +
diff --git a/lib/noosfero/plugin.rb b/lib/noosfero/plugin.rb index 34b05a0..d2b280b 100644 --- a/lib/noosfero/plugin.rb +++ b/lib/noosfero/plugin.rb @@ -173,6 +173,10 @@ class Noosfero::Plugin end end + def has_block?(block) + self.class.extra_blocks.keys.include?(block) + end + def expanded_template(file_path, locals = {}) views_path = Rails.root.join('plugins', "#{self.class.public_name}", 'views') ERB.new(File.read("#{views_path}/#{file_path}")).result(binding) diff --git a/plugins/breadcrumbs/lib/breadcrumbs_plugin/content_breadcrumbs_block.rb b/plugins/breadcrumbs/lib/breadcrumbs_plugin/content_breadcrumbs_block.rb index dbc2a0c..d028037 100644 --- a/plugins/breadcrumbs/lib/breadcrumbs_plugin/content_breadcrumbs_block.rb +++ b/plugins/breadcrumbs/lib/breadcrumbs_plugin/content_breadcrumbs_block.rb @@ -7,7 +7,15 @@ class BreadcrumbsPlugin::ContentBreadcrumbsBlock < Block attr_accessible :show_cms_action, :show_profile, :show_section_name def self.description - _('Content Breadcrumbs') + _("

Display a breadcrumb of the current content navigation.

You could choose if the breadcrumb is going to appear in the cms editing or not.

There is either the option of display the profile location in the breadcrumb path.

") + end + + def self.short_description + _('Breadcrumb') + end + + def self.pretty_name + _('Breadcrumbs Block') end def help diff --git a/plugins/breadcrumbs/public/images/blocks/content_breadcrumbs_block/breadcrumb.svg b/plugins/breadcrumbs/public/images/blocks/content_breadcrumbs_block/breadcrumb.svg new file mode 100644 index 0000000..3dd1703 --- /dev/null +++ b/plugins/breadcrumbs/public/images/blocks/content_breadcrumbs_block/breadcrumb.svg @@ -0,0 +1,961 @@ + + + + + + image/svg+xml + + blue foot + + + + + + blue foot + + + Layer 1 + + + + + + + + + + + Layer 1 + + + + + + + + + + + + + Layer 1 + + + + + + + + + + + Layer 1 + + + + + + + + + + + + + Layer 1 + + + + + + + + + + + Layer 1 + + + + + + + + + + + + + Layer 1 + + + + + + + + + + + Layer 1 + + + + + + + + + + + + + Layer 1 + + + + + + + + + + + Layer 1 + + + + + + + + + + + + + Layer 1 + + + + + + + + + + + Layer 1 + + + + + + + + + + + + + Layer 1 + + + + + + + + + + + Layer 1 + + + + + + + + + + + + + Layer 1 + + + + + + + + + + + Layer 1 + + + + + + + + + + + + + Layer 1 + + + + + + + + + + + Layer 1 + + + + + + + + + + + diff --git a/plugins/breadcrumbs/public/images/blocks/content_breadcrumbs_block/icon.png b/plugins/breadcrumbs/public/images/blocks/content_breadcrumbs_block/icon.png new file mode 100644 index 0000000..18acb31 Binary files /dev/null and b/plugins/breadcrumbs/public/images/blocks/content_breadcrumbs_block/icon.png differ diff --git a/plugins/breadcrumbs/public/images/blocks/content_breadcrumbs_block/previews/edit_block.png b/plugins/breadcrumbs/public/images/blocks/content_breadcrumbs_block/previews/edit_block.png new file mode 100644 index 0000000..d4da101 Binary files /dev/null and b/plugins/breadcrumbs/public/images/blocks/content_breadcrumbs_block/previews/edit_block.png differ diff --git a/plugins/breadcrumbs/public/images/blocks/content_breadcrumbs_block/previews/view_block.png b/plugins/breadcrumbs/public/images/blocks/content_breadcrumbs_block/previews/view_block.png new file mode 100644 index 0000000..8cd00d1 Binary files /dev/null and b/plugins/breadcrumbs/public/images/blocks/content_breadcrumbs_block/previews/view_block.png differ diff --git a/plugins/community_track/lib/community_track_plugin/track_card_list_block.rb b/plugins/community_track/lib/community_track_plugin/track_card_list_block.rb index 21384e8..fe6362e 100644 --- a/plugins/community_track/lib/community_track_plugin/track_card_list_block.rb +++ b/plugins/community_track/lib/community_track_plugin/track_card_list_block.rb @@ -8,6 +8,10 @@ class CommunityTrackPlugin::TrackCardListBlock < CommunityTrackPlugin::TrackList _('This block displays a list of most relevant tracks as cards.') end + def self.pretty_name + _('Track Card List') + end + def track_partial 'track_card' end diff --git a/plugins/community_track/lib/community_track_plugin/track_list_block.rb b/plugins/community_track/lib/community_track_plugin/track_list_block.rb index 8cce31b..95bd73e 100644 --- a/plugins/community_track/lib/community_track_plugin/track_list_block.rb +++ b/plugins/community_track/lib/community_track_plugin/track_list_block.rb @@ -14,6 +14,10 @@ class CommunityTrackPlugin::TrackListBlock < Block _('This block displays a list of most relevant tracks.') end + def self.pretty_name + _('Track List') + end + def track_partial 'track' end diff --git a/plugins/container_block/public/style.css b/plugins/container_block/public/style.css index 5a03584..1a059d9 100644 --- a/plugins/container_block/public/style.css +++ b/plugins/container_block/public/style.css @@ -11,10 +11,6 @@ margin-right: -2px; } -.container-block-plugin_container-block .block-target { - clear: both; -} - #content .boxes .container-block-plugin_container-block .block .icon-down, #content .boxes .container-block-plugin_container-block .block .icon-down-disabled { background-image: url(/designs/icons/default/Tango/16x16/actions/go-next.png); } @@ -57,3 +53,9 @@ .container-block-plugin_container-block .block-target { background: #afd; } +#box-organizer.shadow .container-block-plugin_container-block { + opacity: 1; +} +#content #box-organizer .container-block-plugin_container-block { + padding-top: 20px; +} diff --git a/plugins/container_block/views/blocks/container.html.erb b/plugins/container_block/views/blocks/container.html.erb index 84fa847..3fe6846 100644 --- a/plugins/container_block/views/blocks/container.html.erb +++ b/plugins/container_block/views/blocks/container.html.erb @@ -5,12 +5,10 @@
<%= display_box_content(block.container_box, nil) %> -
-
@@ -28,8 +26,8 @@
- <%= link_to_remote '', :url => { :controller => controller.boxes_holder.kind_of?(Environment) ? 'container_block_plugin_admin' : 'container_block_plugin_myprofile', :action => 'saveWidths', :id => block.id }, - :with => "containerChildrenWidth(#{block.id}, #{block.container_box.id})", + <%= link_to_remote '', :url => { :controller => controller.boxes_holder.kind_of?(Environment) ? 'container_block_plugin_admin' : 'container_block_plugin_myprofile', :action => 'saveWidths', :id => block.id }, + :with => "containerChildrenWidth(#{block.id}, #{block.container_box.id})", :html => {:class => "button icon-save container_block_save", :id => "container_block_save_#{block.id}", :title => c_('Save') }, :loading => "open_loading(DEFAULT_LOADING_MESSAGE);", :loaded => "close_loading();", diff --git a/public/articles/0000/1155/eventos.tar.gz b/public/articles/0000/1155/eventos.tar.gz new file mode 100644 index 0000000..f810216 Binary files /dev/null and b/public/articles/0000/1155/eventos.tar.gz differ diff --git a/public/articles/0000/1156/rankings.tar.gz b/public/articles/0000/1156/rankings.tar.gz new file mode 100644 index 0000000..cd957fb Binary files /dev/null and b/public/articles/0000/1156/rankings.tar.gz differ diff --git a/public/articles/0000/1157/propostas.csv b/public/articles/0000/1157/propostas.csv new file mode 100644 index 0000000..923e781 --- /dev/null +++ b/public/articles/0000/1157/propostas.csv @@ -0,0 +1,95 @@ +Origem,Status,Criada em,Moderado por,Data de Moderado,Validado por,Data de Validado,Autor,Proposta,Categorias +,Aprovada,30/06/15 10:21,"","",adminuser,29/06/15 21:00,ze,teste1,"" +,Rejeitada,30/06/15 10:21,"","",adminuser,29/06/15 21:00,ze,teste2,"" +,Aprovada,30/06/15 10:21,"","",adminuser,29/06/15 21:00,ze,teste3,"" +,Rejeitada,30/06/15 10:19,"","",adminuser,29/06/15 21:00,ze,test2,"" +,Aprovada,30/06/15 10:20,"","",adminuser,29/06/15 21:00,ze,test2,"" +,Rejeitada,30/06/15 10:21,"","",adminuser,29/06/15 21:00,ze,teste0,"" +,Rejeitada,30/06/15 10:21,"","",adminuser,29/06/15 21:00,ze,teste4,"" +,Aprovada,30/06/15 10:21,"","",adminuser,29/06/15 21:00,ze,teste5,"" +,Rejeitada,30/06/15 10:21,"","",adminuser,29/06/15 21:00,ze,teste6,"" +,Pendente de Moderacao,06/07/15 14:42,"","","","",ze,teste adadd,"" +,Aprovada,30/06/15 10:21,"","",adminuser,29/06/15 21:00,ze,teste7,"" +,Rejeitada,30/06/15 10:21,"","",adminuser,29/06/15 21:00,ze,teste8,"" +,Rejeitada,30/06/15 10:21,"","",adminuser,29/06/15 21:00,ze,teste9,"" +,Pendente de Moderacao,30/06/15 10:37,"","","","",ze,teste adadd,"" +,Pendente de Moderacao,06/07/15 14:42,"","","","",ze,teste adadd,"" +,Pendente de Moderacao,06/07/15 14:42,"","","","",ze,teste adadd,"" +,Pendente de Moderacao,06/07/15 14:42,"","","","",ze,teste adadd,"" +,Aprovada,06/07/15 14:42,"","",adminuser,05/07/15 21:00,ze,teste adadd,"" +,Aprovada,06/07/15 14:42,"","",adminuser,05/07/15 21:00,ze,teste adadd,"" +,Aprovada,06/07/15 14:42,"","",adminuser,05/07/15 21:00,ze,teste adadd,"" +,Aprovada,06/07/15 14:42,"","",adminuser,05/07/15 21:00,ze,teste adadd,"" +,Aprovada,06/07/15 14:42,"","",adminuser,05/07/15 21:00,ze,teste adadd,"" +Discussão,Aprovada,06/07/15 14:42,"","",adminuser,05/07/15 21:00,ze,teste adadd,"" +,Aprovada,06/07/15 14:42,"","",adminuser,05/07/15 21:00,ze,teste adadd,"" +Tópico 1,Aprovada,06/07/15 14:42,"","",adminuser,05/07/15 21:00,ze,teste adadd,"" +Tópico 1,Aprovada,06/07/15 14:42,"","",adminuser,05/07/15 21:00,ze,teste adadd,"" +Tópico 1,Aprovada,06/07/15 14:42,"","",adminuser,05/07/15 21:00,ze,teste adadd,"" +Tópico 1,Aprovada,06/07/15 14:42,"","",adminuser,05/07/15 21:00,ze,teste adadd,"" +,Aprovada,06/07/15 14:42,"","",adminuser,05/07/15 21:00,ze,teste adadd,"" +Tópico 1,Aprovada,06/07/15 14:42,"","",adminuser,05/07/15 21:00,ze,teste adadd,"" +,Rejeitada,06/07/15 14:42,adminuser,07/07/15 11:22,adminuser,06/07/15 21:00,ze,teste adadd,"" +,Rejeitada,06/07/15 14:42,adminuser,07/07/15 10:56,adminuser,06/07/15 21:00,ze,teste adadd,"" +,Rejeitada,06/07/15 14:42,adminuser,13/07/15 19:18,adminuser,30/07/15 15:25,ze,teste adadd,category +,Pendente de Moderacao,30/07/15 15:21,"","","","",ze,teste nova proposta,"" +,Pendente de Moderacao,30/07/15 15:21,"","","","",ze,teste nova proposta,"" +,Rejeitada,30/07/15 15:21,ze,30/07/15 15:24,adminuser,30/07/15 15:25,ze,teste nova proposta,category +,Pendente de Moderacao,30/07/15 15:21,"","","","",ze,teste nova proposta,"" +,Pendente de Moderacao,30/07/15 15:21,"","","","",ze,teste nova proposta,"" +,Pendente de Moderacao,30/07/15 15:21,"","","","",ze,teste nova proposta,"" +,Pendente de Moderacao,30/07/15 15:22,"","","","",ze,teste nova proposta,"" +,Pendente de Moderacao,30/07/15 15:22,"","","","",ze,teste nova proposta,"" +,Pendente de Moderacao,30/07/15 15:22,"","","","",ze,teste nova proposta,"" +,Rejeitada,30/07/15 15:21,ze,30/07/15 15:24,adminuser,30/07/15 15:24,ze,teste nova proposta,category +,Rejeitada,30/07/15 15:22,ze,30/07/15 15:24,adminuser,30/07/15 15:24,ze,teste nova proposta,category +,Rejeitada,30/07/15 15:21,ze,30/07/15 15:24,adminuser,30/07/15 15:24,ze,teste nova proposta,category +,Rejeitada,06/07/15 14:42,adminuser,13/07/15 19:18,adminuser,30/07/15 15:24,ze,teste adadd,category +,Rejeitada,30/07/15 15:21,adminuser,30/07/15 15:22,adminuser,30/07/15 15:25,ze,teste nova proposta,category +,Rejeitada,30/07/15 15:22,ze,30/07/15 15:24,adminuser,30/07/15 15:24,ze,teste nova proposta,category +,Rejeitada,30/07/15 15:22,adminuser,30/07/15 15:22,adminuser,30/07/15 15:25,ze,teste nova proposta,category +,Pre Rejeitada,30/07/15 15:22,ze,30/07/15 15:25,"","",ze,teste nova proposta,category +,Pre Rejeitada,30/07/15 15:21,ze,30/07/15 15:25,"","",ze,teste nova proposta,category +Discussão,Pendente de Moderacao,30/07/15 17:41,"","","","",ze,teste nova proposta,"" +,Pre Rejeitada,30/07/15 15:22,ze,30/07/15 15:25,"","",ze,teste nova proposta,category +Discussão,Pendente de Moderacao,30/07/15 17:41,"","","","",ze,teste nova proposta,"" +,Pre Rejeitada,30/07/15 15:21,ze,30/07/15 15:25,"","",ze,teste nova proposta,category +Discussão,Pendente de Moderacao,30/07/15 17:41,"","","","",ze,teste nova proposta,"" +,Pre Rejeitada,30/07/15 15:22,ze,30/07/15 15:25,"","",ze,teste nova proposta,category +Discussão,Pendente de Moderacao,30/07/15 17:41,"","","","",ze,teste nova proposta,"" +Discussão,Pendente de Moderacao,30/07/15 17:41,"","","","",ze,teste nova proposta,"" +Discussão,Pendente de Moderacao,30/07/15 17:41,"","","","",ze,teste nova proposta,"" +Discussão,Pendente de Moderacao,30/07/15 17:41,"","","","",ze,teste nova proposta,"" +Discussão,Pendente de Moderacao,30/07/15 17:41,"","","","",ze,teste nova proposta,"" +Discussão,Pendente de Moderacao,30/07/15 17:41,"","","","",ze,teste nova proposta,"" +Discussão,Pendente de Moderacao,30/07/15 17:41,"","","","",ze,teste nova proposta,"" +Discussão,Pendente de Moderacao,30/07/15 17:41,"","","","",ze,teste nova proposta,"" +Discussão,Pendente de Moderacao,30/07/15 17:41,"","","","",ze,teste nova proposta,"" +Discussão,Pendente de Moderacao,30/07/15 17:41,"","","","",ze,teste nova proposta,"" +Discussão,Pendente de Moderacao,30/07/15 17:41,"","","","",ze,teste nova proposta,"" +Discussão,Pendente de Moderacao,30/07/15 17:41,"","","","",ze,teste nova proposta,"" +Discussão,Pendente de Moderacao,30/07/15 17:41,"","","","",ze,teste nova proposta,"" +Discussão,Pendente de Moderacao,30/07/15 17:41,"","","","",ze,teste nova proposta,"" +Discussão,Pendente de Moderacao,30/07/15 17:41,"","","","",ze,teste nova proposta,"" +Discussão,Pendente de Moderacao,30/07/15 17:41,"","","","",ze,teste nova proposta,"" +Tópico 1,Pendente de Moderacao,30/07/15 17:44,"","","","",ze,teste nova proposta,"" +Tópico 1,Pendente de Moderacao,30/07/15 17:44,"","","","",ze,teste nova proposta,"" +Tópico 1,Pendente de Moderacao,30/07/15 17:44,"","","","",ze,teste nova proposta,"" +Tópico 1,Pendente de Moderacao,30/07/15 17:44,"","","","",ze,teste nova proposta,"" +Tópico 1,Pendente de Moderacao,30/07/15 17:44,"","","","",ze,teste nova proposta,"" +Tópico 1,Pendente de Moderacao,30/07/15 17:44,"","","","",ze,teste nova proposta,"" +Tópico 1,Pendente de Moderacao,30/07/15 17:44,"","","","",ze,teste nova proposta,"" +Tópico 1,Pendente de Moderacao,30/07/15 17:44,"","","","",ze,teste nova proposta,"" +Tópico 1,Pendente de Moderacao,30/07/15 17:44,"","","","",ze,teste nova proposta,"" +Tópico 1,Pendente de Moderacao,30/07/15 17:44,"","","","",ze,teste nova proposta,"" +Tópico 1,Pendente de Moderacao,30/07/15 17:44,"","","","",ze,teste nova proposta,"" +Tópico 1,Pendente de Moderacao,30/07/15 17:44,"","","","",ze,teste nova proposta,"" +Tópico 1,Pendente de Moderacao,30/07/15 17:44,"","","","",ze,teste nova proposta,"" +Tópico 1,Pendente de Moderacao,30/07/15 17:44,"","","","",ze,teste nova proposta,"" +Tópico 1,Pendente de Moderacao,30/07/15 17:44,"","","","",ze,teste nova proposta,"" +Tópico 1,Pendente de Moderacao,30/07/15 17:44,"","","","",ze,teste nova proposta,"" +Tópico 1,Pendente de Moderacao,30/07/15 17:44,"","","","",ze,teste nova proposta,"" +Tópico 1,Pendente de Moderacao,30/07/15 17:44,"","","","",ze,teste nova proposta,"" +Tópico 1,Pendente de Moderacao,30/07/15 17:44,"","","","",ze,teste nova proposta,"" +Discussão,Pre Aprovada,30/07/15 17:41,adminuser,30/07/15 17:44,"","",ze,teste nova proposta,category +Tópico 1,Pre Aprovada,30/07/15 17:44,adminuser,30/07/15 17:44,"","",ze,teste nova proposta,category diff --git a/public/articles/0000/1158/propostas.csv b/public/articles/0000/1158/propostas.csv new file mode 100644 index 0000000..923e781 --- /dev/null +++ b/public/articles/0000/1158/propostas.csv @@ -0,0 +1,95 @@ +Origem,Status,Criada em,Moderado por,Data de Moderado,Validado por,Data de Validado,Autor,Proposta,Categorias +,Aprovada,30/06/15 10:21,"","",adminuser,29/06/15 21:00,ze,teste1,"" +,Rejeitada,30/06/15 10:21,"","",adminuser,29/06/15 21:00,ze,teste2,"" +,Aprovada,30/06/15 10:21,"","",adminuser,29/06/15 21:00,ze,teste3,"" +,Rejeitada,30/06/15 10:19,"","",adminuser,29/06/15 21:00,ze,test2,"" +,Aprovada,30/06/15 10:20,"","",adminuser,29/06/15 21:00,ze,test2,"" +,Rejeitada,30/06/15 10:21,"","",adminuser,29/06/15 21:00,ze,teste0,"" +,Rejeitada,30/06/15 10:21,"","",adminuser,29/06/15 21:00,ze,teste4,"" +,Aprovada,30/06/15 10:21,"","",adminuser,29/06/15 21:00,ze,teste5,"" +,Rejeitada,30/06/15 10:21,"","",adminuser,29/06/15 21:00,ze,teste6,"" +,Pendente de Moderacao,06/07/15 14:42,"","","","",ze,teste adadd,"" +,Aprovada,30/06/15 10:21,"","",adminuser,29/06/15 21:00,ze,teste7,"" +,Rejeitada,30/06/15 10:21,"","",adminuser,29/06/15 21:00,ze,teste8,"" +,Rejeitada,30/06/15 10:21,"","",adminuser,29/06/15 21:00,ze,teste9,"" +,Pendente de Moderacao,30/06/15 10:37,"","","","",ze,teste adadd,"" +,Pendente de Moderacao,06/07/15 14:42,"","","","",ze,teste adadd,"" +,Pendente de Moderacao,06/07/15 14:42,"","","","",ze,teste adadd,"" +,Pendente de Moderacao,06/07/15 14:42,"","","","",ze,teste adadd,"" +,Aprovada,06/07/15 14:42,"","",adminuser,05/07/15 21:00,ze,teste adadd,"" +,Aprovada,06/07/15 14:42,"","",adminuser,05/07/15 21:00,ze,teste adadd,"" +,Aprovada,06/07/15 14:42,"","",adminuser,05/07/15 21:00,ze,teste adadd,"" +,Aprovada,06/07/15 14:42,"","",adminuser,05/07/15 21:00,ze,teste adadd,"" +,Aprovada,06/07/15 14:42,"","",adminuser,05/07/15 21:00,ze,teste adadd,"" +Discussão,Aprovada,06/07/15 14:42,"","",adminuser,05/07/15 21:00,ze,teste adadd,"" +,Aprovada,06/07/15 14:42,"","",adminuser,05/07/15 21:00,ze,teste adadd,"" +Tópico 1,Aprovada,06/07/15 14:42,"","",adminuser,05/07/15 21:00,ze,teste adadd,"" +Tópico 1,Aprovada,06/07/15 14:42,"","",adminuser,05/07/15 21:00,ze,teste adadd,"" +Tópico 1,Aprovada,06/07/15 14:42,"","",adminuser,05/07/15 21:00,ze,teste adadd,"" +Tópico 1,Aprovada,06/07/15 14:42,"","",adminuser,05/07/15 21:00,ze,teste adadd,"" +,Aprovada,06/07/15 14:42,"","",adminuser,05/07/15 21:00,ze,teste adadd,"" +Tópico 1,Aprovada,06/07/15 14:42,"","",adminuser,05/07/15 21:00,ze,teste adadd,"" +,Rejeitada,06/07/15 14:42,adminuser,07/07/15 11:22,adminuser,06/07/15 21:00,ze,teste adadd,"" +,Rejeitada,06/07/15 14:42,adminuser,07/07/15 10:56,adminuser,06/07/15 21:00,ze,teste adadd,"" +,Rejeitada,06/07/15 14:42,adminuser,13/07/15 19:18,adminuser,30/07/15 15:25,ze,teste adadd,category +,Pendente de Moderacao,30/07/15 15:21,"","","","",ze,teste nova proposta,"" +,Pendente de Moderacao,30/07/15 15:21,"","","","",ze,teste nova proposta,"" +,Rejeitada,30/07/15 15:21,ze,30/07/15 15:24,adminuser,30/07/15 15:25,ze,teste nova proposta,category +,Pendente de Moderacao,30/07/15 15:21,"","","","",ze,teste nova proposta,"" +,Pendente de Moderacao,30/07/15 15:21,"","","","",ze,teste nova proposta,"" +,Pendente de Moderacao,30/07/15 15:21,"","","","",ze,teste nova proposta,"" +,Pendente de Moderacao,30/07/15 15:22,"","","","",ze,teste nova proposta,"" +,Pendente de Moderacao,30/07/15 15:22,"","","","",ze,teste nova proposta,"" +,Pendente de Moderacao,30/07/15 15:22,"","","","",ze,teste nova proposta,"" +,Rejeitada,30/07/15 15:21,ze,30/07/15 15:24,adminuser,30/07/15 15:24,ze,teste nova proposta,category +,Rejeitada,30/07/15 15:22,ze,30/07/15 15:24,adminuser,30/07/15 15:24,ze,teste nova proposta,category +,Rejeitada,30/07/15 15:21,ze,30/07/15 15:24,adminuser,30/07/15 15:24,ze,teste nova proposta,category +,Rejeitada,06/07/15 14:42,adminuser,13/07/15 19:18,adminuser,30/07/15 15:24,ze,teste adadd,category +,Rejeitada,30/07/15 15:21,adminuser,30/07/15 15:22,adminuser,30/07/15 15:25,ze,teste nova proposta,category +,Rejeitada,30/07/15 15:22,ze,30/07/15 15:24,adminuser,30/07/15 15:24,ze,teste nova proposta,category +,Rejeitada,30/07/15 15:22,adminuser,30/07/15 15:22,adminuser,30/07/15 15:25,ze,teste nova proposta,category +,Pre Rejeitada,30/07/15 15:22,ze,30/07/15 15:25,"","",ze,teste nova proposta,category +,Pre Rejeitada,30/07/15 15:21,ze,30/07/15 15:25,"","",ze,teste nova proposta,category +Discussão,Pendente de Moderacao,30/07/15 17:41,"","","","",ze,teste nova proposta,"" +,Pre Rejeitada,30/07/15 15:22,ze,30/07/15 15:25,"","",ze,teste nova proposta,category +Discussão,Pendente de Moderacao,30/07/15 17:41,"","","","",ze,teste nova proposta,"" +,Pre Rejeitada,30/07/15 15:21,ze,30/07/15 15:25,"","",ze,teste nova proposta,category +Discussão,Pendente de Moderacao,30/07/15 17:41,"","","","",ze,teste nova proposta,"" +,Pre Rejeitada,30/07/15 15:22,ze,30/07/15 15:25,"","",ze,teste nova proposta,category +Discussão,Pendente de Moderacao,30/07/15 17:41,"","","","",ze,teste nova proposta,"" +Discussão,Pendente de Moderacao,30/07/15 17:41,"","","","",ze,teste nova proposta,"" +Discussão,Pendente de Moderacao,30/07/15 17:41,"","","","",ze,teste nova proposta,"" +Discussão,Pendente de Moderacao,30/07/15 17:41,"","","","",ze,teste nova proposta,"" +Discussão,Pendente de Moderacao,30/07/15 17:41,"","","","",ze,teste nova proposta,"" +Discussão,Pendente de Moderacao,30/07/15 17:41,"","","","",ze,teste nova proposta,"" +Discussão,Pendente de Moderacao,30/07/15 17:41,"","","","",ze,teste nova proposta,"" +Discussão,Pendente de Moderacao,30/07/15 17:41,"","","","",ze,teste nova proposta,"" +Discussão,Pendente de Moderacao,30/07/15 17:41,"","","","",ze,teste nova proposta,"" +Discussão,Pendente de Moderacao,30/07/15 17:41,"","","","",ze,teste nova proposta,"" +Discussão,Pendente de Moderacao,30/07/15 17:41,"","","","",ze,teste nova proposta,"" +Discussão,Pendente de Moderacao,30/07/15 17:41,"","","","",ze,teste nova proposta,"" +Discussão,Pendente de Moderacao,30/07/15 17:41,"","","","",ze,teste nova proposta,"" +Discussão,Pendente de Moderacao,30/07/15 17:41,"","","","",ze,teste nova proposta,"" +Discussão,Pendente de Moderacao,30/07/15 17:41,"","","","",ze,teste nova proposta,"" +Discussão,Pendente de Moderacao,30/07/15 17:41,"","","","",ze,teste nova proposta,"" +Tópico 1,Pendente de Moderacao,30/07/15 17:44,"","","","",ze,teste nova proposta,"" +Tópico 1,Pendente de Moderacao,30/07/15 17:44,"","","","",ze,teste nova proposta,"" +Tópico 1,Pendente de Moderacao,30/07/15 17:44,"","","","",ze,teste nova proposta,"" +Tópico 1,Pendente de Moderacao,30/07/15 17:44,"","","","",ze,teste nova proposta,"" +Tópico 1,Pendente de Moderacao,30/07/15 17:44,"","","","",ze,teste nova proposta,"" +Tópico 1,Pendente de Moderacao,30/07/15 17:44,"","","","",ze,teste nova proposta,"" +Tópico 1,Pendente de Moderacao,30/07/15 17:44,"","","","",ze,teste nova proposta,"" +Tópico 1,Pendente de Moderacao,30/07/15 17:44,"","","","",ze,teste nova proposta,"" +Tópico 1,Pendente de Moderacao,30/07/15 17:44,"","","","",ze,teste nova proposta,"" +Tópico 1,Pendente de Moderacao,30/07/15 17:44,"","","","",ze,teste nova proposta,"" +Tópico 1,Pendente de Moderacao,30/07/15 17:44,"","","","",ze,teste nova proposta,"" +Tópico 1,Pendente de Moderacao,30/07/15 17:44,"","","","",ze,teste nova proposta,"" +Tópico 1,Pendente de Moderacao,30/07/15 17:44,"","","","",ze,teste nova proposta,"" +Tópico 1,Pendente de Moderacao,30/07/15 17:44,"","","","",ze,teste nova proposta,"" +Tópico 1,Pendente de Moderacao,30/07/15 17:44,"","","","",ze,teste nova proposta,"" +Tópico 1,Pendente de Moderacao,30/07/15 17:44,"","","","",ze,teste nova proposta,"" +Tópico 1,Pendente de Moderacao,30/07/15 17:44,"","","","",ze,teste nova proposta,"" +Tópico 1,Pendente de Moderacao,30/07/15 17:44,"","","","",ze,teste nova proposta,"" +Tópico 1,Pendente de Moderacao,30/07/15 17:44,"","","","",ze,teste nova proposta,"" +Discussão,Pre Aprovada,30/07/15 17:41,adminuser,30/07/15 17:44,"","",ze,teste nova proposta,category +Tópico 1,Pre Aprovada,30/07/15 17:44,adminuser,30/07/15 17:44,"","",ze,teste nova proposta,category diff --git a/public/articles/0000/1159/rankings.tar.gz b/public/articles/0000/1159/rankings.tar.gz new file mode 100644 index 0000000..b2b6f53 Binary files /dev/null and b/public/articles/0000/1159/rankings.tar.gz differ diff --git a/public/articles/0000/1160/eventos.tar.gz b/public/articles/0000/1160/eventos.tar.gz new file mode 100644 index 0000000..74f9393 Binary files /dev/null and b/public/articles/0000/1160/eventos.tar.gz differ diff --git a/public/articles/0000/1162/propostas.csv b/public/articles/0000/1162/propostas.csv new file mode 100644 index 0000000..923e781 --- /dev/null +++ b/public/articles/0000/1162/propostas.csv @@ -0,0 +1,95 @@ +Origem,Status,Criada em,Moderado por,Data de Moderado,Validado por,Data de Validado,Autor,Proposta,Categorias +,Aprovada,30/06/15 10:21,"","",adminuser,29/06/15 21:00,ze,teste1,"" +,Rejeitada,30/06/15 10:21,"","",adminuser,29/06/15 21:00,ze,teste2,"" +,Aprovada,30/06/15 10:21,"","",adminuser,29/06/15 21:00,ze,teste3,"" +,Rejeitada,30/06/15 10:19,"","",adminuser,29/06/15 21:00,ze,test2,"" +,Aprovada,30/06/15 10:20,"","",adminuser,29/06/15 21:00,ze,test2,"" +,Rejeitada,30/06/15 10:21,"","",adminuser,29/06/15 21:00,ze,teste0,"" +,Rejeitada,30/06/15 10:21,"","",adminuser,29/06/15 21:00,ze,teste4,"" +,Aprovada,30/06/15 10:21,"","",adminuser,29/06/15 21:00,ze,teste5,"" +,Rejeitada,30/06/15 10:21,"","",adminuser,29/06/15 21:00,ze,teste6,"" +,Pendente de Moderacao,06/07/15 14:42,"","","","",ze,teste adadd,"" +,Aprovada,30/06/15 10:21,"","",adminuser,29/06/15 21:00,ze,teste7,"" +,Rejeitada,30/06/15 10:21,"","",adminuser,29/06/15 21:00,ze,teste8,"" +,Rejeitada,30/06/15 10:21,"","",adminuser,29/06/15 21:00,ze,teste9,"" +,Pendente de Moderacao,30/06/15 10:37,"","","","",ze,teste adadd,"" +,Pendente de Moderacao,06/07/15 14:42,"","","","",ze,teste adadd,"" +,Pendente de Moderacao,06/07/15 14:42,"","","","",ze,teste adadd,"" +,Pendente de Moderacao,06/07/15 14:42,"","","","",ze,teste adadd,"" +,Aprovada,06/07/15 14:42,"","",adminuser,05/07/15 21:00,ze,teste adadd,"" +,Aprovada,06/07/15 14:42,"","",adminuser,05/07/15 21:00,ze,teste adadd,"" +,Aprovada,06/07/15 14:42,"","",adminuser,05/07/15 21:00,ze,teste adadd,"" +,Aprovada,06/07/15 14:42,"","",adminuser,05/07/15 21:00,ze,teste adadd,"" +,Aprovada,06/07/15 14:42,"","",adminuser,05/07/15 21:00,ze,teste adadd,"" +Discussão,Aprovada,06/07/15 14:42,"","",adminuser,05/07/15 21:00,ze,teste adadd,"" +,Aprovada,06/07/15 14:42,"","",adminuser,05/07/15 21:00,ze,teste adadd,"" +Tópico 1,Aprovada,06/07/15 14:42,"","",adminuser,05/07/15 21:00,ze,teste adadd,"" +Tópico 1,Aprovada,06/07/15 14:42,"","",adminuser,05/07/15 21:00,ze,teste adadd,"" +Tópico 1,Aprovada,06/07/15 14:42,"","",adminuser,05/07/15 21:00,ze,teste adadd,"" +Tópico 1,Aprovada,06/07/15 14:42,"","",adminuser,05/07/15 21:00,ze,teste adadd,"" +,Aprovada,06/07/15 14:42,"","",adminuser,05/07/15 21:00,ze,teste adadd,"" +Tópico 1,Aprovada,06/07/15 14:42,"","",adminuser,05/07/15 21:00,ze,teste adadd,"" +,Rejeitada,06/07/15 14:42,adminuser,07/07/15 11:22,adminuser,06/07/15 21:00,ze,teste adadd,"" +,Rejeitada,06/07/15 14:42,adminuser,07/07/15 10:56,adminuser,06/07/15 21:00,ze,teste adadd,"" +,Rejeitada,06/07/15 14:42,adminuser,13/07/15 19:18,adminuser,30/07/15 15:25,ze,teste adadd,category +,Pendente de Moderacao,30/07/15 15:21,"","","","",ze,teste nova proposta,"" +,Pendente de Moderacao,30/07/15 15:21,"","","","",ze,teste nova proposta,"" +,Rejeitada,30/07/15 15:21,ze,30/07/15 15:24,adminuser,30/07/15 15:25,ze,teste nova proposta,category +,Pendente de Moderacao,30/07/15 15:21,"","","","",ze,teste nova proposta,"" +,Pendente de Moderacao,30/07/15 15:21,"","","","",ze,teste nova proposta,"" +,Pendente de Moderacao,30/07/15 15:21,"","","","",ze,teste nova proposta,"" +,Pendente de Moderacao,30/07/15 15:22,"","","","",ze,teste nova proposta,"" +,Pendente de Moderacao,30/07/15 15:22,"","","","",ze,teste nova proposta,"" +,Pendente de Moderacao,30/07/15 15:22,"","","","",ze,teste nova proposta,"" +,Rejeitada,30/07/15 15:21,ze,30/07/15 15:24,adminuser,30/07/15 15:24,ze,teste nova proposta,category +,Rejeitada,30/07/15 15:22,ze,30/07/15 15:24,adminuser,30/07/15 15:24,ze,teste nova proposta,category +,Rejeitada,30/07/15 15:21,ze,30/07/15 15:24,adminuser,30/07/15 15:24,ze,teste nova proposta,category +,Rejeitada,06/07/15 14:42,adminuser,13/07/15 19:18,adminuser,30/07/15 15:24,ze,teste adadd,category +,Rejeitada,30/07/15 15:21,adminuser,30/07/15 15:22,adminuser,30/07/15 15:25,ze,teste nova proposta,category +,Rejeitada,30/07/15 15:22,ze,30/07/15 15:24,adminuser,30/07/15 15:24,ze,teste nova proposta,category +,Rejeitada,30/07/15 15:22,adminuser,30/07/15 15:22,adminuser,30/07/15 15:25,ze,teste nova proposta,category +,Pre Rejeitada,30/07/15 15:22,ze,30/07/15 15:25,"","",ze,teste nova proposta,category +,Pre Rejeitada,30/07/15 15:21,ze,30/07/15 15:25,"","",ze,teste nova proposta,category +Discussão,Pendente de Moderacao,30/07/15 17:41,"","","","",ze,teste nova proposta,"" +,Pre Rejeitada,30/07/15 15:22,ze,30/07/15 15:25,"","",ze,teste nova proposta,category +Discussão,Pendente de Moderacao,30/07/15 17:41,"","","","",ze,teste nova proposta,"" +,Pre Rejeitada,30/07/15 15:21,ze,30/07/15 15:25,"","",ze,teste nova proposta,category +Discussão,Pendente de Moderacao,30/07/15 17:41,"","","","",ze,teste nova proposta,"" +,Pre Rejeitada,30/07/15 15:22,ze,30/07/15 15:25,"","",ze,teste nova proposta,category +Discussão,Pendente de Moderacao,30/07/15 17:41,"","","","",ze,teste nova proposta,"" +Discussão,Pendente de Moderacao,30/07/15 17:41,"","","","",ze,teste nova proposta,"" +Discussão,Pendente de Moderacao,30/07/15 17:41,"","","","",ze,teste nova proposta,"" +Discussão,Pendente de Moderacao,30/07/15 17:41,"","","","",ze,teste nova proposta,"" +Discussão,Pendente de Moderacao,30/07/15 17:41,"","","","",ze,teste nova proposta,"" +Discussão,Pendente de Moderacao,30/07/15 17:41,"","","","",ze,teste nova proposta,"" +Discussão,Pendente de Moderacao,30/07/15 17:41,"","","","",ze,teste nova proposta,"" +Discussão,Pendente de Moderacao,30/07/15 17:41,"","","","",ze,teste nova proposta,"" +Discussão,Pendente de Moderacao,30/07/15 17:41,"","","","",ze,teste nova proposta,"" +Discussão,Pendente de Moderacao,30/07/15 17:41,"","","","",ze,teste nova proposta,"" +Discussão,Pendente de Moderacao,30/07/15 17:41,"","","","",ze,teste nova proposta,"" +Discussão,Pendente de Moderacao,30/07/15 17:41,"","","","",ze,teste nova proposta,"" +Discussão,Pendente de Moderacao,30/07/15 17:41,"","","","",ze,teste nova proposta,"" +Discussão,Pendente de Moderacao,30/07/15 17:41,"","","","",ze,teste nova proposta,"" +Discussão,Pendente de Moderacao,30/07/15 17:41,"","","","",ze,teste nova proposta,"" +Discussão,Pendente de Moderacao,30/07/15 17:41,"","","","",ze,teste nova proposta,"" +Tópico 1,Pendente de Moderacao,30/07/15 17:44,"","","","",ze,teste nova proposta,"" +Tópico 1,Pendente de Moderacao,30/07/15 17:44,"","","","",ze,teste nova proposta,"" +Tópico 1,Pendente de Moderacao,30/07/15 17:44,"","","","",ze,teste nova proposta,"" +Tópico 1,Pendente de Moderacao,30/07/15 17:44,"","","","",ze,teste nova proposta,"" +Tópico 1,Pendente de Moderacao,30/07/15 17:44,"","","","",ze,teste nova proposta,"" +Tópico 1,Pendente de Moderacao,30/07/15 17:44,"","","","",ze,teste nova proposta,"" +Tópico 1,Pendente de Moderacao,30/07/15 17:44,"","","","",ze,teste nova proposta,"" +Tópico 1,Pendente de Moderacao,30/07/15 17:44,"","","","",ze,teste nova proposta,"" +Tópico 1,Pendente de Moderacao,30/07/15 17:44,"","","","",ze,teste nova proposta,"" +Tópico 1,Pendente de Moderacao,30/07/15 17:44,"","","","",ze,teste nova proposta,"" +Tópico 1,Pendente de Moderacao,30/07/15 17:44,"","","","",ze,teste nova proposta,"" +Tópico 1,Pendente de Moderacao,30/07/15 17:44,"","","","",ze,teste nova proposta,"" +Tópico 1,Pendente de Moderacao,30/07/15 17:44,"","","","",ze,teste nova proposta,"" +Tópico 1,Pendente de Moderacao,30/07/15 17:44,"","","","",ze,teste nova proposta,"" +Tópico 1,Pendente de Moderacao,30/07/15 17:44,"","","","",ze,teste nova proposta,"" +Tópico 1,Pendente de Moderacao,30/07/15 17:44,"","","","",ze,teste nova proposta,"" +Tópico 1,Pendente de Moderacao,30/07/15 17:44,"","","","",ze,teste nova proposta,"" +Tópico 1,Pendente de Moderacao,30/07/15 17:44,"","","","",ze,teste nova proposta,"" +Tópico 1,Pendente de Moderacao,30/07/15 17:44,"","","","",ze,teste nova proposta,"" +Discussão,Pre Aprovada,30/07/15 17:41,adminuser,30/07/15 17:44,"","",ze,teste nova proposta,category +Tópico 1,Pre Aprovada,30/07/15 17:44,adminuser,30/07/15 17:44,"","",ze,teste nova proposta,category diff --git a/public/articles/0000/1163/rankings.tar.gz b/public/articles/0000/1163/rankings.tar.gz new file mode 100644 index 0000000..13ca522 Binary files /dev/null and b/public/articles/0000/1163/rankings.tar.gz differ diff --git a/public/articles/0000/1164/eventos.tar.gz b/public/articles/0000/1164/eventos.tar.gz new file mode 100644 index 0000000..67c35c8 Binary files /dev/null and b/public/articles/0000/1164/eventos.tar.gz differ diff --git a/public/fonts/slick.eot b/public/fonts/slick.eot new file mode 100644 index 0000000..2cbab9c Binary files /dev/null and b/public/fonts/slick.eot differ diff --git a/public/fonts/slick.svg b/public/fonts/slick.svg new file mode 100644 index 0000000..b36a66a --- /dev/null +++ b/public/fonts/slick.svg @@ -0,0 +1,14 @@ + + + +Generated by Fontastic.me + + + + + + + + + + diff --git a/public/fonts/slick.ttf b/public/fonts/slick.ttf new file mode 100644 index 0000000..9d03461 Binary files /dev/null and b/public/fonts/slick.ttf differ diff --git a/public/fonts/slick.woff b/public/fonts/slick.woff new file mode 100644 index 0000000..8ee9972 Binary files /dev/null and b/public/fonts/slick.woff differ diff --git a/public/images/block_preview.png b/public/images/block_preview.png new file mode 100644 index 0000000..f8ee80f Binary files /dev/null and b/public/images/block_preview.png differ diff --git a/public/images/blocks/blog_archives_block/icon.png b/public/images/blocks/blog_archives_block/icon.png new file mode 100644 index 0000000..d13cc8b Binary files /dev/null and b/public/images/blocks/blog_archives_block/icon.png differ diff --git a/public/images/blocks/blog_archives_block/icon.svg b/public/images/blocks/blog_archives_block/icon.svg new file mode 100644 index 0000000..0152a69 --- /dev/null +++ b/public/images/blocks/blog_archives_block/icon.svg @@ -0,0 +1,556 @@ + + + + + Block Icon + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + Block Icon + + + Noosfero Project + + + + + + + + 2008 •April (18) •January (25)2007 •August (8) •April (21) •January (16) + + + + + + + + + + + + 20082007 + + + + + + diff --git a/public/images/blocks/communities_block/icon.png b/public/images/blocks/communities_block/icon.png new file mode 100644 index 0000000..984c6fb Binary files /dev/null and b/public/images/blocks/communities_block/icon.png differ diff --git a/public/images/blocks/communities_block/icon.svg b/public/images/blocks/communities_block/icon.svg new file mode 100644 index 0000000..9693463 --- /dev/null +++ b/public/images/blocks/communities_block/icon.svg @@ -0,0 +1,851 @@ + + + + + Block Icon + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + Block Icon + + + Noosfero Project + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/images/blocks/communities_block/previews/edit_block.png b/public/images/blocks/communities_block/previews/edit_block.png new file mode 100644 index 0000000..c5a5dc6 Binary files /dev/null and b/public/images/blocks/communities_block/previews/edit_block.png differ diff --git a/public/images/blocks/communities_block/previews/view_block.png b/public/images/blocks/communities_block/previews/view_block.png new file mode 100644 index 0000000..2838908 Binary files /dev/null and b/public/images/blocks/communities_block/previews/view_block.png differ diff --git a/public/images/blocks/friends_block b/public/images/blocks/friends_block new file mode 120000 index 0000000..2ab4da0 --- /dev/null +++ b/public/images/blocks/friends_block @@ -0,0 +1 @@ +people_block \ No newline at end of file diff --git a/public/images/blocks/highlights_block/icon.png b/public/images/blocks/highlights_block/icon.png new file mode 100644 index 0000000..3f69472 Binary files /dev/null and b/public/images/blocks/highlights_block/icon.png differ diff --git a/public/images/blocks/highlights_block/icon.svg b/public/images/blocks/highlights_block/icon.svg new file mode 100644 index 0000000..d01328b --- /dev/null +++ b/public/images/blocks/highlights_block/icon.svg @@ -0,0 +1,519 @@ + + + + + Block Icon + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + Block Icon + + + Noosfero Project + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/images/blocks/highlights_block/previews/edit_block.png b/public/images/blocks/highlights_block/previews/edit_block.png new file mode 100644 index 0000000..d371cf0 Binary files /dev/null and b/public/images/blocks/highlights_block/previews/edit_block.png differ diff --git a/public/images/blocks/highlights_block/previews/show_block.png b/public/images/blocks/highlights_block/previews/show_block.png new file mode 100644 index 0000000..9de658d Binary files /dev/null and b/public/images/blocks/highlights_block/previews/show_block.png differ diff --git a/public/images/blocks/members_block b/public/images/blocks/members_block new file mode 120000 index 0000000..2ab4da0 --- /dev/null +++ b/public/images/blocks/members_block @@ -0,0 +1 @@ +people_block \ No newline at end of file diff --git a/public/images/blocks/people_block/icon.png b/public/images/blocks/people_block/icon.png new file mode 100644 index 0000000..b5b49bb Binary files /dev/null and b/public/images/blocks/people_block/icon.png differ diff --git a/public/images/blocks/people_block/icon.svg b/public/images/blocks/people_block/icon.svg new file mode 100644 index 0000000..7f7e553 --- /dev/null +++ b/public/images/blocks/people_block/icon.svg @@ -0,0 +1,465 @@ + + + + + Block Icon + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + Block Icon + + + Noosfero Project + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/images/blocks/profile_image_block/icon.png b/public/images/blocks/profile_image_block/icon.png new file mode 100644 index 0000000..5e7da40 Binary files /dev/null and b/public/images/blocks/profile_image_block/icon.png differ diff --git a/public/images/blocks/profile_image_block/icon.svg b/public/images/blocks/profile_image_block/icon.svg new file mode 100644 index 0000000..b28e483 --- /dev/null +++ b/public/images/blocks/profile_image_block/icon.svg @@ -0,0 +1,610 @@ + + + + + Block Icon + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + Block Icon + + + Noosfero Project + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Fulano + + diff --git a/public/images/icon_block.png b/public/images/icon_block.png new file mode 100644 index 0000000..2f0e243 Binary files /dev/null and b/public/images/icon_block.png differ diff --git a/public/javascripts/application.js b/public/javascripts/application.js index c06c77b..1b4f061 100644 --- a/public/javascripts/application.js +++ b/public/javascripts/application.js @@ -31,6 +31,8 @@ *= require catalog.js *= require autogrow.js *= require require_login.js +*= require slick.js +*= require block-store.js */ // lodash configuration diff --git a/public/javascripts/block-store.js b/public/javascripts/block-store.js new file mode 100644 index 0000000..8dcd0f6 --- /dev/null +++ b/public/javascripts/block-store.js @@ -0,0 +1,63 @@ +function filterBlocks() { + jQuery('#block-store #block-types').slick('slickFilter', function() { + var name = $(this).data('block-name'); + var filter = $('#block-store #block-store-filter').val(); + return name.toLowerCase().indexOf(filter.toLowerCase()) > -1; + }); +} + +function cloneDraggableBlock(el, blockIcon) { + el.addClass('ui-draggable-dragging'); + return blockIcon; +} + +function startDragBlock() { + $('#box-organizer').addClass('shadow'); +} + +function stopDragBlock() { + $('#box-organizer').removeClass('shadow'); + $('.ui-draggable-dragging').removeClass('ui-draggable-dragging'); +} + +function initBlockStore() { + jQuery('#block-store').show(); + var store = jQuery('#block-store #block-types').slick({ + infinite: false, + dots: true, + draggable: false, + respondTo: 'slider', + slidesToShow: 7, + slidesToScroll: 6, + responsive: [ + { + breakpoint: 2048, + settings: { + slidesToShow: 10, + slidesToScroll: 9, + } + }, + { + breakpoint: 1024, + settings: { + slidesToShow: 8, + slidesToScroll: 7, + } + } + ] + }); + jQuery('#block-store #block-store-filter').keyup(filterBlocks); +} + +function dropBlock(url, loadingMessage, ev, ui) { + var blockType = jQuery(ui.draggable).attr('data-block-type'); + var blockId = jQuery(ui.draggable).attr('id'); + open_loading(loadingMessage); + jQuery.ajax({ + data: 'type='+encodeURIComponent(blockType)+'&id=' + encodeURIComponent(blockId), + dataType: 'script', + type: 'post', + url: url, + complete: close_loading, + }) +} diff --git a/public/javascripts/slick.js b/public/javascripts/slick.js new file mode 100644 index 0000000..a89d5e9 --- /dev/null +++ b/public/javascripts/slick.js @@ -0,0 +1,2249 @@ +/* + _ _ _ _ + ___| (_) ___| | __ (_)___ +/ __| | |/ __| |/ / | / __| +\__ \ | | (__| < _ | \__ \ +|___/_|_|\___|_|\_(_)/ |___/ + |__/ + + Version: 1.5.0 + Author: Ken Wheeler + Website: http://kenwheeler.github.io + Docs: http://kenwheeler.github.io/slick + Repo: http://github.com/kenwheeler/slick + Issues: http://github.com/kenwheeler/slick/issues + + */ +/* global window, document, define, jQuery, setInterval, clearInterval */ +(function(factory) { + 'use strict'; + if (typeof define === 'function' && define.amd) { + define(['jquery'], factory); + } else if (typeof exports !== 'undefined') { + module.exports = factory(require('jquery')); + } else { + factory(jQuery); + } + +}(function($) { + 'use strict'; + var Slick = window.Slick || {}; + + Slick = (function() { + + var instanceUid = 0; + + function Slick(element, settings) { + + var _ = this, + dataSettings, responsiveSettings, breakpoint; + + _.defaults = { + accessibility: true, + adaptiveHeight: false, + appendArrows: $(element), + appendDots: $(element), + arrows: true, + asNavFor: null, + prevArrow: '', + nextArrow: '', + autoplay: false, + autoplaySpeed: 3000, + centerMode: false, + centerPadding: '50px', + cssEase: 'ease', + customPaging: function(slider, i) { + return ''; + }, + dots: false, + dotsClass: 'slick-dots', + draggable: true, + easing: 'linear', + edgeFriction: 0.35, + fade: false, + focusOnSelect: false, + infinite: true, + initialSlide: 0, + lazyLoad: 'ondemand', + mobileFirst: false, + pauseOnHover: true, + pauseOnDotsHover: false, + respondTo: 'window', + responsive: null, + rtl: false, + slide: '', + slidesToShow: 1, + slidesToScroll: 1, + speed: 500, + swipe: true, + swipeToSlide: false, + touchMove: true, + touchThreshold: 5, + useCSS: true, + variableWidth: false, + vertical: false, + waitForAnimate: true + }; + + _.initials = { + animating: false, + dragging: false, + autoPlayTimer: null, + currentDirection: 0, + currentLeft: null, + currentSlide: 0, + direction: 1, + $dots: null, + listWidth: null, + listHeight: null, + loadIndex: 0, + $nextArrow: null, + $prevArrow: null, + slideCount: null, + slideWidth: null, + $slideTrack: null, + $slides: null, + sliding: false, + slideOffset: 0, + swipeLeft: null, + $list: null, + touchObject: {}, + transformsEnabled: false, + verticalScrolling: false + }; + + $.extend(_, _.initials); + + _.activeBreakpoint = null; + _.animType = null; + _.animProp = null; + _.breakpoints = []; + _.breakpointSettings = []; + _.cssTransitions = false; + _.hidden = 'hidden'; + _.paused = false; + _.positionProp = null; + _.respondTo = null; + _.shouldClick = true; + _.$slider = $(element); + _.$slidesCache = null; + _.transformType = null; + _.transitionType = null; + _.visibilityChange = 'visibilitychange'; + _.windowWidth = 0; + _.windowTimer = null; + + dataSettings = $(element).data('slick') || {}; + + _.options = $.extend({}, _.defaults, dataSettings, settings); + + _.currentSlide = _.options.initialSlide; + + _.originalSettings = _.options; + responsiveSettings = _.options.responsive || null; + + if (responsiveSettings && responsiveSettings.length > -1) { + _.respondTo = _.options.respondTo || 'window'; + for (breakpoint in responsiveSettings) { + if (responsiveSettings.hasOwnProperty(breakpoint)) { + _.breakpoints.push(responsiveSettings[ + breakpoint].breakpoint); + _.breakpointSettings[responsiveSettings[ + breakpoint].breakpoint] = + responsiveSettings[breakpoint].settings; + } + } + _.breakpoints.sort(function(a, b) { + if (_.options.mobileFirst === true) { + return a - b; + } else { + return b - a; + } + }); + } + + if (typeof document.mozHidden !== 'undefined') { + _.hidden = 'mozHidden'; + _.visibilityChange = 'mozvisibilitychange'; + } else if (typeof document.msHidden !== 'undefined') { + _.hidden = 'msHidden'; + _.visibilityChange = 'msvisibilitychange'; + } else if (typeof document.webkitHidden !== 'undefined') { + _.hidden = 'webkitHidden'; + _.visibilityChange = 'webkitvisibilitychange'; + } + + _.autoPlay = $.proxy(_.autoPlay, _); + _.autoPlayClear = $.proxy(_.autoPlayClear, _); + _.changeSlide = $.proxy(_.changeSlide, _); + _.clickHandler = $.proxy(_.clickHandler, _); + _.selectHandler = $.proxy(_.selectHandler, _); + _.setPosition = $.proxy(_.setPosition, _); + _.swipeHandler = $.proxy(_.swipeHandler, _); + _.dragHandler = $.proxy(_.dragHandler, _); + _.keyHandler = $.proxy(_.keyHandler, _); + _.autoPlayIterator = $.proxy(_.autoPlayIterator, _); + + _.instanceUid = instanceUid++; + + // A simple way to check for HTML strings + // Strict HTML recognition (must start with <) + // Extracted from jQuery v1.11 source + _.htmlExpr = /^(?:\s*(<[\w\W]+>)[^>]*)$/; + + _.init(); + + _.checkResponsive(true); + + } + + return Slick; + + }()); + + Slick.prototype.addSlide = Slick.prototype.slickAdd = function(markup, index, addBefore) { + + var _ = this; + + if (typeof(index) === 'boolean') { + addBefore = index; + index = null; + } else if (index < 0 || (index >= _.slideCount)) { + return false; + } + + _.unload(); + + if (typeof(index) === 'number') { + if (index === 0 && _.$slides.length === 0) { + $(markup).appendTo(_.$slideTrack); + } else if (addBefore) { + $(markup).insertBefore(_.$slides.eq(index)); + } else { + $(markup).insertAfter(_.$slides.eq(index)); + } + } else { + if (addBefore === true) { + $(markup).prependTo(_.$slideTrack); + } else { + $(markup).appendTo(_.$slideTrack); + } + } + + _.$slides = _.$slideTrack.children(this.options.slide); + + _.$slideTrack.children(this.options.slide).detach(); + + _.$slideTrack.append(_.$slides); + + _.$slides.each(function(index, element) { + $(element).attr('data-slick-index', index); + }); + + _.$slidesCache = _.$slides; + + _.reinit(); + + }; + + Slick.prototype.animateHeight = function() { + var _ = this; + if (_.options.slidesToShow === 1 && _.options.adaptiveHeight === true && _.options.vertical === false) { + var targetHeight = _.$slides.eq(_.currentSlide).outerHeight(true); + _.$list.animate({ + height: targetHeight + }, _.options.speed); + } + }; + + Slick.prototype.animateSlide = function(targetLeft, callback) { + + var animProps = {}, + _ = this; + + _.animateHeight(); + + if (_.options.rtl === true && _.options.vertical === false) { + targetLeft = -targetLeft; + } + if (_.transformsEnabled === false) { + if (_.options.vertical === false) { + _.$slideTrack.animate({ + left: targetLeft + }, _.options.speed, _.options.easing, callback); + } else { + _.$slideTrack.animate({ + top: targetLeft + }, _.options.speed, _.options.easing, callback); + } + + } else { + + if (_.cssTransitions === false) { + if (_.options.rtl === true) { + _.currentLeft = -(_.currentLeft); + } + $({ + animStart: _.currentLeft + }).animate({ + animStart: targetLeft + }, { + duration: _.options.speed, + easing: _.options.easing, + step: function(now) { + now = Math.ceil(now); + if (_.options.vertical === false) { + animProps[_.animType] = 'translate(' + + now + 'px, 0px)'; + _.$slideTrack.css(animProps); + } else { + animProps[_.animType] = 'translate(0px,' + + now + 'px)'; + _.$slideTrack.css(animProps); + } + }, + complete: function() { + if (callback) { + callback.call(); + } + } + }); + + } else { + + _.applyTransition(); + targetLeft = Math.ceil(targetLeft); + + if (_.options.vertical === false) { + animProps[_.animType] = 'translate3d(' + targetLeft + 'px, 0px, 0px)'; + } else { + animProps[_.animType] = 'translate3d(0px,' + targetLeft + 'px, 0px)'; + } + _.$slideTrack.css(animProps); + + if (callback) { + setTimeout(function() { + + _.disableTransition(); + + callback.call(); + }, _.options.speed); + } + + } + + } + + }; + + Slick.prototype.asNavFor = function(index) { + var _ = this, + asNavFor = _.options.asNavFor !== null ? $(_.options.asNavFor).slick('getSlick') : null; + if (asNavFor !== null) asNavFor.slideHandler(index, true); + }; + + Slick.prototype.applyTransition = function(slide) { + + var _ = this, + transition = {}; + + if (_.options.fade === false) { + transition[_.transitionType] = _.transformType + ' ' + _.options.speed + 'ms ' + _.options.cssEase; + } else { + transition[_.transitionType] = 'opacity ' + _.options.speed + 'ms ' + _.options.cssEase; + } + + if (_.options.fade === false) { + _.$slideTrack.css(transition); + } else { + _.$slides.eq(slide).css(transition); + } + + }; + + Slick.prototype.autoPlay = function() { + + var _ = this; + + if (_.autoPlayTimer) { + clearInterval(_.autoPlayTimer); + } + + if (_.slideCount > _.options.slidesToShow && _.paused !== true) { + _.autoPlayTimer = setInterval(_.autoPlayIterator, + _.options.autoplaySpeed); + } + + }; + + Slick.prototype.autoPlayClear = function() { + + var _ = this; + if (_.autoPlayTimer) { + clearInterval(_.autoPlayTimer); + } + + }; + + Slick.prototype.autoPlayIterator = function() { + + var _ = this; + + if (_.options.infinite === false) { + + if (_.direction === 1) { + + if ((_.currentSlide + 1) === _.slideCount - + 1) { + _.direction = 0; + } + + _.slideHandler(_.currentSlide + _.options.slidesToScroll); + + } else { + + if ((_.currentSlide - 1 === 0)) { + + _.direction = 1; + + } + + _.slideHandler(_.currentSlide - _.options.slidesToScroll); + + } + + } else { + + _.slideHandler(_.currentSlide + _.options.slidesToScroll); + + } + + }; + + Slick.prototype.buildArrows = function() { + + var _ = this; + + if (_.options.arrows === true && _.slideCount > _.options.slidesToShow) { + + _.$prevArrow = $(_.options.prevArrow); + _.$nextArrow = $(_.options.nextArrow); + + if (_.htmlExpr.test(_.options.prevArrow)) { + _.$prevArrow.appendTo(_.options.appendArrows); + } + + if (_.htmlExpr.test(_.options.nextArrow)) { + _.$nextArrow.appendTo(_.options.appendArrows); + } + + if (_.options.infinite !== true) { + _.$prevArrow.addClass('slick-disabled'); + } + + } + + }; + + Slick.prototype.buildDots = function() { + + var _ = this, + i, dotString; + + if (_.options.dots === true && _.slideCount > _.options.slidesToShow) { + + dotString = ''; + + _.$dots = $(dotString).appendTo( + _.options.appendDots); + + _.$dots.find('li').first().addClass('slick-active').attr('aria-hidden', 'false'); + + } + + }; + + Slick.prototype.buildOut = function() { + + var _ = this; + + _.$slides = _.$slider.children(_.options.slide + + ':not(.slick-cloned)').addClass( + 'slick-slide'); + _.slideCount = _.$slides.length; + + _.$slides.each(function(index, element) { + $(element).attr('data-slick-index', index); + }); + + _.$slidesCache = _.$slides; + + _.$slider.addClass('slick-slider'); + + _.$slideTrack = (_.slideCount === 0) ? + $('
').appendTo(_.$slider) : + _.$slides.wrapAll('
').parent(); + + _.$list = _.$slideTrack.wrap( + '
').parent(); + _.$slideTrack.css('opacity', 0); + + if (_.options.centerMode === true || _.options.swipeToSlide === true) { + _.options.slidesToScroll = 1; + } + + $('img[data-lazy]', _.$slider).not('[src]').addClass('slick-loading'); + + _.setupInfinite(); + + _.buildArrows(); + + _.buildDots(); + + _.updateDots(); + + if (_.options.accessibility === true) { + _.$list.prop('tabIndex', 0); + } + + _.setSlideClasses(typeof this.currentSlide === 'number' ? this.currentSlide : 0); + + if (_.options.draggable === true) { + _.$list.addClass('draggable'); + } + + }; + + Slick.prototype.checkResponsive = function(initial) { + + var _ = this, + breakpoint, targetBreakpoint, respondToWidth; + var sliderWidth = _.$slider.width(); + var windowWidth = window.innerWidth || $(window).width(); + if (_.respondTo === 'window') { + respondToWidth = windowWidth; + } else if (_.respondTo === 'slider') { + respondToWidth = sliderWidth; + } else if (_.respondTo === 'min') { + respondToWidth = Math.min(windowWidth, sliderWidth); + } + + if (_.originalSettings.responsive && _.originalSettings + .responsive.length > -1 && _.originalSettings.responsive !== null) { + + targetBreakpoint = null; + + for (breakpoint in _.breakpoints) { + if (_.breakpoints.hasOwnProperty(breakpoint)) { + if (_.originalSettings.mobileFirst === false) { + if (respondToWidth < _.breakpoints[breakpoint]) { + targetBreakpoint = _.breakpoints[breakpoint]; + } + } else { + if (respondToWidth > _.breakpoints[breakpoint]) { + targetBreakpoint = _.breakpoints[breakpoint]; + } + } + } + } + + if (targetBreakpoint !== null) { + if (_.activeBreakpoint !== null) { + if (targetBreakpoint !== _.activeBreakpoint) { + _.activeBreakpoint = + targetBreakpoint; + if (_.breakpointSettings[targetBreakpoint] === 'unslick') { + _.unslick(); + } else { + _.options = $.extend({}, _.originalSettings, + _.breakpointSettings[ + targetBreakpoint]); + if (initial === true) + _.currentSlide = _.options.initialSlide; + _.refresh(); + } + } + } else { + _.activeBreakpoint = targetBreakpoint; + if (_.breakpointSettings[targetBreakpoint] === 'unslick') { + _.unslick(); + } else { + _.options = $.extend({}, _.originalSettings, + _.breakpointSettings[ + targetBreakpoint]); + if (initial === true) + _.currentSlide = _.options.initialSlide; + _.refresh(); + } + } + } else { + if (_.activeBreakpoint !== null) { + _.activeBreakpoint = null; + _.options = _.originalSettings; + if (initial === true) + _.currentSlide = _.options.initialSlide; + _.refresh(); + } + } + + } + + }; + + Slick.prototype.changeSlide = function(event, dontAnimate) { + + var _ = this, + $target = $(event.target), + indexOffset, slideOffset, unevenOffset; + + // If target is a link, prevent default action. + $target.is('a') && event.preventDefault(); + + unevenOffset = (_.slideCount % _.options.slidesToScroll !== 0); + indexOffset = unevenOffset ? 0 : (_.slideCount - _.currentSlide) % _.options.slidesToScroll; + + switch (event.data.message) { + + case 'previous': + slideOffset = indexOffset === 0 ? _.options.slidesToScroll : _.options.slidesToShow - indexOffset; + if (_.slideCount > _.options.slidesToShow) { + _.slideHandler(_.currentSlide - slideOffset, false, dontAnimate); + } + break; + + case 'next': + slideOffset = indexOffset === 0 ? _.options.slidesToScroll : indexOffset; + if (_.slideCount > _.options.slidesToShow) { + _.slideHandler(_.currentSlide + slideOffset, false, dontAnimate); + } + break; + + case 'index': + var index = event.data.index === 0 ? 0 : + event.data.index || $(event.target).parent().index() * _.options.slidesToScroll; + + _.slideHandler(_.checkNavigable(index), false, dontAnimate); + break; + + default: + return; + } + + }; + + Slick.prototype.checkNavigable = function(index) { + + var _ = this, + navigables, prevNavigable; + + navigables = _.getNavigableIndexes(); + prevNavigable = 0; + if (index > navigables[navigables.length - 1]) { + index = navigables[navigables.length - 1]; + } else { + for (var n in navigables) { + if (index < navigables[n]) { + index = prevNavigable; + break; + } + prevNavigable = navigables[n]; + } + } + + return index; + }; + + Slick.prototype.cleanUpEvents = function() { + + var _ = this; + + if (_.options.dots === true && _.slideCount > _.options.slidesToShow) { + $('li', _.$dots).off('click.slick', _.changeSlide); + } + + if (_.options.dots === true && _.options.pauseOnDotsHover === true && _.options.autoplay === true) { + $('li', _.$dots) + .off('mouseenter.slick', _.setPaused.bind(_, true)) + .off('mouseleave.slick', _.setPaused.bind(_, false)); + } + + if (_.options.arrows === true && _.slideCount > _.options.slidesToShow) { + _.$prevArrow && _.$prevArrow.off('click.slick', _.changeSlide); + _.$nextArrow && _.$nextArrow.off('click.slick', _.changeSlide); + } + + _.$list.off('touchstart.slick mousedown.slick', _.swipeHandler); + _.$list.off('touchmove.slick mousemove.slick', _.swipeHandler); + _.$list.off('touchend.slick mouseup.slick', _.swipeHandler); + _.$list.off('touchcancel.slick mouseleave.slick', _.swipeHandler); + + _.$list.off('click.slick', _.clickHandler); + + if (_.options.autoplay === true) { + $(document).off(_.visibilityChange, _.visibility); + } + + _.$list.off('mouseenter.slick', _.setPaused.bind(_, true)); + _.$list.off('mouseleave.slick', _.setPaused.bind(_, false)); + + if (_.options.accessibility === true) { + _.$list.off('keydown.slick', _.keyHandler); + } + + if (_.options.focusOnSelect === true) { + $(_.$slideTrack).children().off('click.slick', _.selectHandler); + } + + $(window).off('orientationchange.slick.slick-' + _.instanceUid, _.orientationChange); + + $(window).off('resize.slick.slick-' + _.instanceUid, _.resize); + + $('[draggable!=true]', _.$slideTrack).off('dragstart', _.preventDefault); + + $(window).off('load.slick.slick-' + _.instanceUid, _.setPosition); + $(document).off('ready.slick.slick-' + _.instanceUid, _.setPosition); + }; + + Slick.prototype.clickHandler = function(event) { + + var _ = this; + + if (_.shouldClick === false) { + event.stopImmediatePropagation(); + event.stopPropagation(); + event.preventDefault(); + } + + }; + + Slick.prototype.destroy = function() { + + var _ = this; + + _.autoPlayClear(); + + _.touchObject = {}; + + _.cleanUpEvents(); + + $('.slick-cloned', _.$slider).remove(); + + if (_.$dots) { + _.$dots.remove(); + } + if (_.$prevArrow && (typeof _.options.prevArrow !== 'object')) { + _.$prevArrow.remove(); + } + if (_.$nextArrow && (typeof _.options.nextArrow !== 'object')) { + _.$nextArrow.remove(); + } + + if (_.$slides) { + _.$slides.removeClass('slick-slide slick-active slick-center slick-visible') + .attr('aria-hidden', 'true') + .removeAttr('data-slick-index') + .css({ + position: '', + left: '', + top: '', + zIndex: '', + opacity: '', + width: '' + }); + + _.$slider.html(_.$slides); + } + + _.$slider.removeClass('slick-slider'); + _.$slider.removeClass('slick-initialized'); + + }; + + Slick.prototype.disableTransition = function(slide) { + + var _ = this, + transition = {}; + + transition[_.transitionType] = ''; + + if (_.options.fade === false) { + _.$slideTrack.css(transition); + } else { + _.$slides.eq(slide).css(transition); + } + + }; + + Slick.prototype.fadeSlide = function(slideIndex, callback) { + + var _ = this; + + if (_.cssTransitions === false) { + + _.$slides.eq(slideIndex).css({ + zIndex: 1000 + }); + + _.$slides.eq(slideIndex).animate({ + opacity: 1 + }, _.options.speed, _.options.easing, callback); + + } else { + + _.applyTransition(slideIndex); + + _.$slides.eq(slideIndex).css({ + opacity: 1, + zIndex: 1000 + }); + + if (callback) { + setTimeout(function() { + + _.disableTransition(slideIndex); + + callback.call(); + }, _.options.speed); + } + + } + + }; + + Slick.prototype.filterSlides = Slick.prototype.slickFilter = function(filter) { + + var _ = this; + + if (filter !== null) { + + _.unload(); + + _.$slideTrack.children(this.options.slide).detach(); + + _.$slidesCache.filter(filter).appendTo(_.$slideTrack); + + _.reinit(); + + } + + }; + + Slick.prototype.getCurrent = Slick.prototype.slickCurrentSlide = function() { + + var _ = this; + return _.currentSlide; + + }; + + Slick.prototype.getDotCount = function() { + + var _ = this; + + var breakPoint = 0; + var counter = 0; + var pagerQty = 0; + + if (_.options.infinite === true) { + pagerQty = Math.ceil(_.slideCount / _.options.slidesToScroll); + } else if (_.options.centerMode === true) { + pagerQty = _.slideCount; + } else { + while (breakPoint < _.slideCount) { + ++pagerQty; + breakPoint = counter + _.options.slidesToShow; + counter += _.options.slidesToScroll <= _.options.slidesToShow ? _.options.slidesToScroll : _.options.slidesToShow; + } + } + + return pagerQty - 1; + + }; + + Slick.prototype.getLeft = function(slideIndex) { + + var _ = this, + targetLeft, + verticalHeight, + verticalOffset = 0, + targetSlide; + + _.slideOffset = 0; + verticalHeight = _.$slides.first().outerHeight(); + + if (_.options.infinite === true) { + if (_.slideCount > _.options.slidesToShow) { + _.slideOffset = (_.slideWidth * _.options.slidesToShow) * -1; + verticalOffset = (verticalHeight * _.options.slidesToShow) * -1; + } + if (_.slideCount % _.options.slidesToScroll !== 0) { + if (slideIndex + _.options.slidesToScroll > _.slideCount && _.slideCount > _.options.slidesToShow) { + if (slideIndex > _.slideCount) { + _.slideOffset = ((_.options.slidesToShow - (slideIndex - _.slideCount)) * _.slideWidth) * -1; + verticalOffset = ((_.options.slidesToShow - (slideIndex - _.slideCount)) * verticalHeight) * -1; + } else { + _.slideOffset = ((_.slideCount % _.options.slidesToScroll) * _.slideWidth) * -1; + verticalOffset = ((_.slideCount % _.options.slidesToScroll) * verticalHeight) * -1; + } + } + } + } else { + if (slideIndex + _.options.slidesToShow > _.slideCount) { + _.slideOffset = ((slideIndex + _.options.slidesToShow) - _.slideCount) * _.slideWidth; + verticalOffset = ((slideIndex + _.options.slidesToShow) - _.slideCount) * verticalHeight; + } + } + + if (_.slideCount <= _.options.slidesToShow) { + _.slideOffset = 0; + verticalOffset = 0; + } + + if (_.options.centerMode === true && _.options.infinite === true) { + _.slideOffset += _.slideWidth * Math.floor(_.options.slidesToShow / 2) - _.slideWidth; + } else if (_.options.centerMode === true) { + _.slideOffset = 0; + _.slideOffset += _.slideWidth * Math.floor(_.options.slidesToShow / 2); + } + + if (_.options.vertical === false) { + targetLeft = ((slideIndex * _.slideWidth) * -1) + _.slideOffset; + } else { + targetLeft = ((slideIndex * verticalHeight) * -1) + verticalOffset; + } + + if (_.options.variableWidth === true) { + + if (_.slideCount <= _.options.slidesToShow || _.options.infinite === false) { + targetSlide = _.$slideTrack.children('.slick-slide').eq(slideIndex); + } else { + targetSlide = _.$slideTrack.children('.slick-slide').eq(slideIndex + _.options.slidesToShow); + } + + targetLeft = targetSlide[0] ? targetSlide[0].offsetLeft * -1 : 0; + + if (_.options.centerMode === true) { + if (_.options.infinite === false) { + targetSlide = _.$slideTrack.children('.slick-slide').eq(slideIndex); + } else { + targetSlide = _.$slideTrack.children('.slick-slide').eq(slideIndex + _.options.slidesToShow + 1); + } + targetLeft = targetSlide[0] ? targetSlide[0].offsetLeft * -1 : 0; + targetLeft += (_.$list.width() - targetSlide.outerWidth()) / 2; + } + } + + return targetLeft; + + }; + + Slick.prototype.getOption = Slick.prototype.slickGetOption = function(option) { + + var _ = this; + + return _.options[option]; + + }; + + Slick.prototype.getNavigableIndexes = function() { + + var _ = this, + breakPoint = 0, + counter = 0, + indexes = [], + max; + + if (_.options.infinite === false) { + max = _.slideCount - _.options.slidesToShow + 1; + if (_.options.centerMode === true) max = _.slideCount; + } else { + breakPoint = _.slideCount * -1; + counter = _.slideCount * -1; + max = _.slideCount * 2; + } + + while (breakPoint < max) { + indexes.push(breakPoint); + breakPoint = counter + _.options.slidesToScroll; + counter += _.options.slidesToScroll <= _.options.slidesToShow ? _.options.slidesToScroll : _.options.slidesToShow; + } + + return indexes; + + }; + + Slick.prototype.getSlick = function() { + + return this; + + }; + + Slick.prototype.getSlideCount = function() { + + var _ = this, + slidesTraversed, swipedSlide, centerOffset; + + centerOffset = _.options.centerMode === true ? _.slideWidth * Math.floor(_.options.slidesToShow / 2) : 0; + + if (_.options.swipeToSlide === true) { + _.$slideTrack.find('.slick-slide').each(function(index, slide) { + if (slide.offsetLeft - centerOffset + ($(slide).outerWidth() / 2) > (_.swipeLeft * -1)) { + swipedSlide = slide; + return false; + } + }); + + slidesTraversed = Math.abs($(swipedSlide).attr('data-slick-index') - _.currentSlide) || 1; + + return slidesTraversed; + + } else { + return _.options.slidesToScroll; + } + + }; + + Slick.prototype.goTo = Slick.prototype.slickGoTo = function(slide, dontAnimate) { + + var _ = this; + + _.changeSlide({ + data: { + message: 'index', + index: parseInt(slide) + } + }, dontAnimate); + + }; + + Slick.prototype.init = function() { + + var _ = this; + + if (!$(_.$slider).hasClass('slick-initialized')) { + + $(_.$slider).addClass('slick-initialized'); + _.buildOut(); + _.setProps(); + _.startLoad(); + _.loadSlider(); + _.initializeEvents(); + _.updateArrows(); + _.updateDots(); + } + + _.$slider.trigger('init', [_]); + + }; + + Slick.prototype.initArrowEvents = function() { + + var _ = this; + + if (_.options.arrows === true && _.slideCount > _.options.slidesToShow) { + _.$prevArrow.on('click.slick', { + message: 'previous' + }, _.changeSlide); + _.$nextArrow.on('click.slick', { + message: 'next' + }, _.changeSlide); + } + + }; + + Slick.prototype.initDotEvents = function() { + + var _ = this; + + if (_.options.dots === true && _.slideCount > _.options.slidesToShow) { + $('li', _.$dots).on('click.slick', { + message: 'index' + }, _.changeSlide); + } + + if (_.options.dots === true && _.options.pauseOnDotsHover === true && _.options.autoplay === true) { + $('li', _.$dots) + .on('mouseenter.slick', _.setPaused.bind(_, true)) + .on('mouseleave.slick', _.setPaused.bind(_, false)); + } + + }; + + Slick.prototype.initializeEvents = function() { + + var _ = this; + + _.initArrowEvents(); + + _.initDotEvents(); + + _.$list.on('touchstart.slick mousedown.slick', { + action: 'start' + }, _.swipeHandler); + _.$list.on('touchmove.slick mousemove.slick', { + action: 'move' + }, _.swipeHandler); + _.$list.on('touchend.slick mouseup.slick', { + action: 'end' + }, _.swipeHandler); + _.$list.on('touchcancel.slick mouseleave.slick', { + action: 'end' + }, _.swipeHandler); + + _.$list.on('click.slick', _.clickHandler); + + if (_.options.autoplay === true) { + $(document).on(_.visibilityChange, _.visibility.bind(_)); + } + + _.$list.on('mouseenter.slick', _.setPaused.bind(_, true)); + _.$list.on('mouseleave.slick', _.setPaused.bind(_, false)); + + if (_.options.accessibility === true) { + _.$list.on('keydown.slick', _.keyHandler); + } + + if (_.options.focusOnSelect === true) { + $(_.$slideTrack).children().on('click.slick', _.selectHandler); + } + + $(window).on('orientationchange.slick.slick-' + _.instanceUid, _.orientationChange.bind(_)); + + $(window).on('resize.slick.slick-' + _.instanceUid, _.resize.bind(_)); + + //$('[draggable!=true]', _.$slideTrack).on('dragstart', _.preventDefault); + + $(window).on('load.slick.slick-' + _.instanceUid, _.setPosition); + $(document).on('ready.slick.slick-' + _.instanceUid, _.setPosition); + + }; + + Slick.prototype.initUI = function() { + + var _ = this; + + if (_.options.arrows === true && _.slideCount > _.options.slidesToShow) { + + _.$prevArrow.show(); + _.$nextArrow.show(); + + } + + if (_.options.dots === true && _.slideCount > _.options.slidesToShow) { + + _.$dots.show(); + + } + + if (_.options.autoplay === true) { + + _.autoPlay(); + + } + + }; + + Slick.prototype.keyHandler = function(event) { + + var _ = this; + + if (event.keyCode === 37 && _.options.accessibility === true) { + _.changeSlide({ + data: { + message: 'previous' + } + }); + } else if (event.keyCode === 39 && _.options.accessibility === true) { + _.changeSlide({ + data: { + message: 'next' + } + }); + } + + }; + + Slick.prototype.lazyLoad = function() { + + var _ = this, + loadRange, cloneRange, rangeStart, rangeEnd; + + function loadImages(imagesScope) { + $('img[data-lazy]', imagesScope).each(function() { + var image = $(this), + imageSource = $(this).attr('data-lazy'); + + image + .load(function() { + image.animate({ + opacity: 1 + }, 200); + }) + .css({ + opacity: 0 + }) + .attr('src', imageSource) + .removeAttr('data-lazy') + .removeClass('slick-loading'); + }); + } + + if (_.options.centerMode === true) { + if (_.options.infinite === true) { + rangeStart = _.currentSlide + (_.options.slidesToShow / 2 + 1); + rangeEnd = rangeStart + _.options.slidesToShow + 2; + } else { + rangeStart = Math.max(0, _.currentSlide - (_.options.slidesToShow / 2 + 1)); + rangeEnd = 2 + (_.options.slidesToShow / 2 + 1) + _.currentSlide; + } + } else { + rangeStart = _.options.infinite ? _.options.slidesToShow + _.currentSlide : _.currentSlide; + rangeEnd = rangeStart + _.options.slidesToShow; + if (_.options.fade === true) { + if (rangeStart > 0) rangeStart--; + if (rangeEnd <= _.slideCount) rangeEnd++; + } + } + + loadRange = _.$slider.find('.slick-slide').slice(rangeStart, rangeEnd); + loadImages(loadRange); + + if (_.slideCount <= _.options.slidesToShow) { + cloneRange = _.$slider.find('.slick-slide'); + loadImages(cloneRange); + } else + if (_.currentSlide >= _.slideCount - _.options.slidesToShow) { + cloneRange = _.$slider.find('.slick-cloned').slice(0, _.options.slidesToShow); + loadImages(cloneRange); + } else if (_.currentSlide === 0) { + cloneRange = _.$slider.find('.slick-cloned').slice(_.options.slidesToShow * -1); + loadImages(cloneRange); + } + + }; + + Slick.prototype.loadSlider = function() { + + var _ = this; + + _.setPosition(); + + _.$slideTrack.css({ + opacity: 1 + }); + + _.$slider.removeClass('slick-loading'); + + _.initUI(); + + if (_.options.lazyLoad === 'progressive') { + _.progressiveLazyLoad(); + } + + }; + + Slick.prototype.next = Slick.prototype.slickNext = function() { + + var _ = this; + + _.changeSlide({ + data: { + message: 'next' + } + }); + + }; + + Slick.prototype.orientationChange = function() { + + var _ = this; + + _.checkResponsive(); + _.setPosition(); + + }; + + Slick.prototype.pause = Slick.prototype.slickPause = function() { + + var _ = this; + + _.autoPlayClear(); + _.paused = true; + + }; + + Slick.prototype.play = Slick.prototype.slickPlay = function() { + + var _ = this; + + _.paused = false; + _.autoPlay(); + + }; + + Slick.prototype.postSlide = function(index) { + + var _ = this; + + _.$slider.trigger('afterChange', [_, index]); + + _.animating = false; + + _.setPosition(); + + _.swipeLeft = null; + + if (_.options.autoplay === true && _.paused === false) { + _.autoPlay(); + } + + }; + + Slick.prototype.prev = Slick.prototype.slickPrev = function() { + + var _ = this; + + _.changeSlide({ + data: { + message: 'previous' + } + }); + + }; + + Slick.prototype.preventDefault = function(e) { + e.preventDefault(); + }; + + Slick.prototype.progressiveLazyLoad = function() { + + var _ = this, + imgCount, targetImage; + + imgCount = $('img[data-lazy]', _.$slider).length; + + if (imgCount > 0) { + targetImage = $('img[data-lazy]', _.$slider).first(); + targetImage.attr('src', targetImage.attr('data-lazy')).removeClass('slick-loading').load(function() { + targetImage.removeAttr('data-lazy'); + _.progressiveLazyLoad(); + + if (_.options.adaptiveHeight === true) { + _.setPosition(); + } + }) + .error(function() { + targetImage.removeAttr('data-lazy'); + _.progressiveLazyLoad(); + }); + } + + }; + + Slick.prototype.refresh = function() { + + var _ = this, + currentSlide = _.currentSlide; + + _.destroy(); + + $.extend(_, _.initials); + + _.init(); + + _.changeSlide({ + data: { + message: 'index', + index: currentSlide + } + }, true); + + }; + + Slick.prototype.reinit = function() { + + var _ = this; + + _.$slides = _.$slideTrack.children(_.options.slide).addClass( + 'slick-slide'); + + _.slideCount = _.$slides.length; + + if (_.currentSlide >= _.slideCount && _.currentSlide !== 0) { + _.currentSlide = _.currentSlide - _.options.slidesToScroll; + } + + if (_.slideCount <= _.options.slidesToShow) { + _.currentSlide = 0; + } + + _.setProps(); + + _.setupInfinite(); + + _.buildArrows(); + + _.updateArrows(); + + _.initArrowEvents(); + + _.buildDots(); + + _.updateDots(); + + _.initDotEvents(); + + if (_.options.focusOnSelect === true) { + $(_.$slideTrack).children().on('click.slick', _.selectHandler); + } + + _.setSlideClasses(0); + + _.setPosition(); + + _.$slider.trigger('reInit', [_]); + + }; + + Slick.prototype.resize = function() { + + var _ = this; + + if ($(window).width() !== _.windowWidth) { + clearTimeout(_.windowDelay); + _.windowDelay = window.setTimeout(function() { + _.windowWidth = $(window).width(); + _.checkResponsive(); + _.setPosition(); + }, 50); + } + }; + + Slick.prototype.removeSlide = Slick.prototype.slickRemove = function(index, removeBefore, removeAll) { + + var _ = this; + + if (typeof(index) === 'boolean') { + removeBefore = index; + index = removeBefore === true ? 0 : _.slideCount - 1; + } else { + index = removeBefore === true ? --index : index; + } + + if (_.slideCount < 1 || index < 0 || index > _.slideCount - 1) { + return false; + } + + _.unload(); + + if (removeAll === true) { + _.$slideTrack.children().remove(); + } else { + _.$slideTrack.children(this.options.slide).eq(index).remove(); + } + + _.$slides = _.$slideTrack.children(this.options.slide); + + _.$slideTrack.children(this.options.slide).detach(); + + _.$slideTrack.append(_.$slides); + + _.$slidesCache = _.$slides; + + _.reinit(); + + }; + + Slick.prototype.setCSS = function(position) { + + var _ = this, + positionProps = {}, + x, y; + + if (_.options.rtl === true) { + position = -position; + } + x = _.positionProp == 'left' ? Math.ceil(position) + 'px' : '0px'; + y = _.positionProp == 'top' ? Math.ceil(position) + 'px' : '0px'; + + positionProps[_.positionProp] = position; + + if (_.transformsEnabled === false) { + _.$slideTrack.css(positionProps); + } else { + positionProps = {}; + if (_.cssTransitions === false) { + positionProps[_.animType] = 'translate(' + x + ', ' + y + ')'; + _.$slideTrack.css(positionProps); + } else { + positionProps[_.animType] = 'translate3d(' + x + ', ' + y + ', 0px)'; + _.$slideTrack.css(positionProps); + } + } + + }; + + Slick.prototype.setDimensions = function() { + + var _ = this; + + if (_.options.vertical === false) { + if (_.options.centerMode === true) { + _.$list.css({ + padding: ('0px ' + _.options.centerPadding) + }); + } + } else { + _.$list.height(_.$slides.first().outerHeight(true) * _.options.slidesToShow); + if (_.options.centerMode === true) { + _.$list.css({ + padding: (_.options.centerPadding + ' 0px') + }); + } + } + + _.listWidth = _.$list.width(); + _.listHeight = _.$list.height(); + + + if (_.options.vertical === false && _.options.variableWidth === false) { + _.slideWidth = Math.ceil(_.listWidth / _.options.slidesToShow); + _.$slideTrack.width(Math.ceil((_.slideWidth * _.$slideTrack.children('.slick-slide').length))); + + } else if (_.options.variableWidth === true) { + _.$slideTrack.width(5000 * _.slideCount); + } else { + _.slideWidth = Math.ceil(_.listWidth); + _.$slideTrack.height(Math.ceil((_.$slides.first().outerHeight(true) * _.$slideTrack.children('.slick-slide').length))); + } + + var offset = _.$slides.first().outerWidth(true) - _.$slides.first().width(); + if (_.options.variableWidth === false) _.$slideTrack.children('.slick-slide').width(_.slideWidth - offset); + + }; + + Slick.prototype.setFade = function() { + + var _ = this, + targetLeft; + + _.$slides.each(function(index, element) { + targetLeft = (_.slideWidth * index) * -1; + if (_.options.rtl === true) { + $(element).css({ + position: 'relative', + right: targetLeft, + top: 0, + zIndex: 800, + opacity: 0 + }); + } else { + $(element).css({ + position: 'relative', + left: targetLeft, + top: 0, + zIndex: 800, + opacity: 0 + }); + } + }); + + _.$slides.eq(_.currentSlide).css({ + zIndex: 900, + opacity: 1 + }); + + }; + + Slick.prototype.setHeight = function() { + + var _ = this; + + if (_.options.slidesToShow === 1 && _.options.adaptiveHeight === true && _.options.vertical === false) { + var targetHeight = _.$slides.eq(_.currentSlide).outerHeight(true); + _.$list.css('height', targetHeight); + } + + }; + + Slick.prototype.setOption = Slick.prototype.slickSetOption = function(option, value, refresh) { + + var _ = this; + _.options[option] = value; + + if (refresh === true) { + _.unload(); + _.reinit(); + } + + }; + + Slick.prototype.setPosition = function() { + + var _ = this; + + _.setDimensions(); + + _.setHeight(); + + if (_.options.fade === false) { + _.setCSS(_.getLeft(_.currentSlide)); + } else { + _.setFade(); + } + + _.$slider.trigger('setPosition', [_]); + + }; + + Slick.prototype.setProps = function() { + + var _ = this, + bodyStyle = document.body.style; + + _.positionProp = _.options.vertical === true ? 'top' : 'left'; + + if (_.positionProp === 'top') { + _.$slider.addClass('slick-vertical'); + } else { + _.$slider.removeClass('slick-vertical'); + } + + if (bodyStyle.WebkitTransition !== undefined || + bodyStyle.MozTransition !== undefined || + bodyStyle.msTransition !== undefined) { + if (_.options.useCSS === true) { + _.cssTransitions = true; + } + } + + if (bodyStyle.OTransform !== undefined) { + _.animType = 'OTransform'; + _.transformType = '-o-transform'; + _.transitionType = 'OTransition'; + if (bodyStyle.perspectiveProperty === undefined && bodyStyle.webkitPerspective === undefined) _.animType = false; + } + if (bodyStyle.MozTransform !== undefined) { + _.animType = 'MozTransform'; + _.transformType = '-moz-transform'; + _.transitionType = 'MozTransition'; + if (bodyStyle.perspectiveProperty === undefined && bodyStyle.MozPerspective === undefined) _.animType = false; + } + if (bodyStyle.webkitTransform !== undefined) { + _.animType = 'webkitTransform'; + _.transformType = '-webkit-transform'; + _.transitionType = 'webkitTransition'; + if (bodyStyle.perspectiveProperty === undefined && bodyStyle.webkitPerspective === undefined) _.animType = false; + } + if (bodyStyle.msTransform !== undefined) { + _.animType = 'msTransform'; + _.transformType = '-ms-transform'; + _.transitionType = 'msTransition'; + if (bodyStyle.msTransform === undefined) _.animType = false; + } + if (bodyStyle.transform !== undefined && _.animType !== false) { + _.animType = 'transform'; + _.transformType = 'transform'; + _.transitionType = 'transition'; + } + _.transformsEnabled = (_.animType !== null && _.animType !== false); + + }; + + + Slick.prototype.setSlideClasses = function(index) { + + var _ = this, + centerOffset, allSlides, indexOffset, remainder; + + _.$slider.find('.slick-slide').removeClass('slick-active').attr('aria-hidden', 'true').removeClass('slick-center'); + allSlides = _.$slider.find('.slick-slide'); + + if (_.options.centerMode === true) { + + centerOffset = Math.floor(_.options.slidesToShow / 2); + + if (_.options.infinite === true) { + + if (index >= centerOffset && index <= (_.slideCount - 1) - centerOffset) { + _.$slides.slice(index - centerOffset, index + centerOffset + 1).addClass('slick-active').attr('aria-hidden', 'false'); + } else { + indexOffset = _.options.slidesToShow + index; + allSlides.slice(indexOffset - centerOffset + 1, indexOffset + centerOffset + 2).addClass('slick-active').attr('aria-hidden', 'false'); + } + + if (index === 0) { + allSlides.eq(allSlides.length - 1 - _.options.slidesToShow).addClass('slick-center'); + } else if (index === _.slideCount - 1) { + allSlides.eq(_.options.slidesToShow).addClass('slick-center'); + } + + } + + _.$slides.eq(index).addClass('slick-center'); + + } else { + + if (index >= 0 && index <= (_.slideCount - _.options.slidesToShow)) { + _.$slides.slice(index, index + _.options.slidesToShow).addClass('slick-active').attr('aria-hidden', 'false'); + } else if (allSlides.length <= _.options.slidesToShow) { + allSlides.addClass('slick-active').attr('aria-hidden', 'false'); + } else { + remainder = _.slideCount % _.options.slidesToShow; + indexOffset = _.options.infinite === true ? _.options.slidesToShow + index : index; + if (_.options.slidesToShow == _.options.slidesToScroll && (_.slideCount - index) < _.options.slidesToShow) { + allSlides.slice(indexOffset - (_.options.slidesToShow - remainder), indexOffset + remainder).addClass('slick-active').attr('aria-hidden', 'false'); + } else { + allSlides.slice(indexOffset, indexOffset + _.options.slidesToShow).addClass('slick-active').attr('aria-hidden', 'false'); + } + } + + } + + if (_.options.lazyLoad === 'ondemand') { + _.lazyLoad(); + } + + }; + + Slick.prototype.setupInfinite = function() { + + var _ = this, + i, slideIndex, infiniteCount; + + if (_.options.fade === true) { + _.options.centerMode = false; + } + + if (_.options.infinite === true && _.options.fade === false) { + + slideIndex = null; + + if (_.slideCount > _.options.slidesToShow) { + + if (_.options.centerMode === true) { + infiniteCount = _.options.slidesToShow + 1; + } else { + infiniteCount = _.options.slidesToShow; + } + + for (i = _.slideCount; i > (_.slideCount - + infiniteCount); i -= 1) { + slideIndex = i - 1; + $(_.$slides[slideIndex]).clone(true).attr('id', '') + .attr('data-slick-index', slideIndex - _.slideCount) + .prependTo(_.$slideTrack).addClass('slick-cloned'); + } + for (i = 0; i < infiniteCount; i += 1) { + slideIndex = i; + $(_.$slides[slideIndex]).clone(true).attr('id', '') + .attr('data-slick-index', slideIndex + _.slideCount) + .appendTo(_.$slideTrack).addClass('slick-cloned'); + } + _.$slideTrack.find('.slick-cloned').find('[id]').each(function() { + $(this).attr('id', ''); + }); + + } + + } + + }; + + Slick.prototype.setPaused = function(paused) { + + var _ = this; + + if (_.options.autoplay === true && _.options.pauseOnHover === true) { + _.paused = paused; + _.autoPlayClear(); + } + }; + + Slick.prototype.selectHandler = function(event) { + + var _ = this; + + var targetElement = $(event.target).is('.slick-slide') ? + $(event.target) : + $(event.target).parents('.slick-slide'); + + var index = parseInt(targetElement.attr('data-slick-index')); + + if (!index) index = 0; + + if (_.slideCount <= _.options.slidesToShow) { + _.$slider.find('.slick-slide').removeClass('slick-active').attr('aria-hidden', 'true'); + _.$slides.eq(index).addClass('slick-active').attr("aria-hidden", "false"); + if (_.options.centerMode === true) { + _.$slider.find('.slick-slide').removeClass('slick-center'); + _.$slides.eq(index).addClass('slick-center'); + } + _.asNavFor(index); + return; + } + _.slideHandler(index); + + }; + + Slick.prototype.slideHandler = function(index, sync, dontAnimate) { + + var targetSlide, animSlide, oldSlide, slideLeft, targetLeft = null, + _ = this; + + sync = sync || false; + + if (_.animating === true && _.options.waitForAnimate === true) { + return; + } + + if (_.options.fade === true && _.currentSlide === index) { + return; + } + + if (_.slideCount <= _.options.slidesToShow) { + return; + } + + if (sync === false) { + _.asNavFor(index); + } + + targetSlide = index; + targetLeft = _.getLeft(targetSlide); + slideLeft = _.getLeft(_.currentSlide); + + _.currentLeft = _.swipeLeft === null ? slideLeft : _.swipeLeft; + + if (_.options.infinite === false && _.options.centerMode === false && (index < 0 || index > _.getDotCount() * _.options.slidesToScroll)) { + if (_.options.fade === false) { + targetSlide = _.currentSlide; + if (dontAnimate !== true) { + _.animateSlide(slideLeft, function() { + _.postSlide(targetSlide); + }); + } else { + _.postSlide(targetSlide); + } + } + return; + } else if (_.options.infinite === false && _.options.centerMode === true && (index < 0 || index > (_.slideCount - _.options.slidesToScroll))) { + if (_.options.fade === false) { + targetSlide = _.currentSlide; + if (dontAnimate !== true) { + _.animateSlide(slideLeft, function() { + _.postSlide(targetSlide); + }); + } else { + _.postSlide(targetSlide); + } + } + return; + } + + if (_.options.autoplay === true) { + clearInterval(_.autoPlayTimer); + } + + if (targetSlide < 0) { + if (_.slideCount % _.options.slidesToScroll !== 0) { + animSlide = _.slideCount - (_.slideCount % _.options.slidesToScroll); + } else { + animSlide = _.slideCount + targetSlide; + } + } else if (targetSlide >= _.slideCount) { + if (_.slideCount % _.options.slidesToScroll !== 0) { + animSlide = 0; + } else { + animSlide = targetSlide - _.slideCount; + } + } else { + animSlide = targetSlide; + } + + _.animating = true; + + _.$slider.trigger("beforeChange", [_, _.currentSlide, animSlide]); + + oldSlide = _.currentSlide; + _.currentSlide = animSlide; + + _.setSlideClasses(_.currentSlide); + + _.updateDots(); + _.updateArrows(); + + if (_.options.fade === true) { + if (dontAnimate !== true) { + _.fadeSlide(animSlide, function() { + _.postSlide(animSlide); + }); + } else { + _.postSlide(animSlide); + } + _.animateHeight(); + return; + } + + if (dontAnimate !== true) { + _.animateSlide(targetLeft, function() { + _.postSlide(animSlide); + }); + } else { + _.postSlide(animSlide); + } + + }; + + Slick.prototype.startLoad = function() { + + var _ = this; + + if (_.options.arrows === true && _.slideCount > _.options.slidesToShow) { + + _.$prevArrow.hide(); + _.$nextArrow.hide(); + + } + + if (_.options.dots === true && _.slideCount > _.options.slidesToShow) { + + _.$dots.hide(); + + } + + _.$slider.addClass('slick-loading'); + + }; + + Slick.prototype.swipeDirection = function() { + + var xDist, yDist, r, swipeAngle, _ = this; + + xDist = _.touchObject.startX - _.touchObject.curX; + yDist = _.touchObject.startY - _.touchObject.curY; + r = Math.atan2(yDist, xDist); + + swipeAngle = Math.round(r * 180 / Math.PI); + if (swipeAngle < 0) { + swipeAngle = 360 - Math.abs(swipeAngle); + } + + if ((swipeAngle <= 45) && (swipeAngle >= 0)) { + return (_.options.rtl === false ? 'left' : 'right'); + } + if ((swipeAngle <= 360) && (swipeAngle >= 315)) { + return (_.options.rtl === false ? 'left' : 'right'); + } + if ((swipeAngle >= 135) && (swipeAngle <= 225)) { + return (_.options.rtl === false ? 'right' : 'left'); + } + if (_.options.verticalScrolling === true) { + if ((swipeAngle >= 35) && (swipeAngle <= 135)) { + return 'left'; + } else { + return 'right'; + } + } + + return 'vertical'; + + }; + + Slick.prototype.swipeEnd = function(event) { + + var _ = this, + slideCount; + + _.dragging = false; + + _.shouldClick = (_.touchObject.swipeLength > 10) ? false : true; + + if (_.touchObject.curX === undefined) { + return false; + } + + if (_.touchObject.edgeHit === true) { + _.$slider.trigger("edge", [_, _.swipeDirection()]); + } + + if (_.touchObject.swipeLength >= _.touchObject.minSwipe) { + + switch (_.swipeDirection()) { + case 'left': + slideCount = _.options.swipeToSlide ? _.checkNavigable(_.currentSlide + _.getSlideCount()) : _.currentSlide + _.getSlideCount(); + _.slideHandler(slideCount); + _.currentDirection = 0; + _.touchObject = {}; + _.$slider.trigger("swipe", [_, "left"]); + break; + + case 'right': + slideCount = _.options.swipeToSlide ? _.checkNavigable(_.currentSlide - _.getSlideCount()) : _.currentSlide - _.getSlideCount(); + _.slideHandler(slideCount); + _.currentDirection = 1; + _.touchObject = {}; + _.$slider.trigger("swipe", [_, "right"]); + break; + } + } else { + if (_.touchObject.startX !== _.touchObject.curX) { + _.slideHandler(_.currentSlide); + _.touchObject = {}; + } + } + + }; + + Slick.prototype.swipeHandler = function(event) { + + var _ = this; + + if ((_.options.swipe === false) || ('ontouchend' in document && _.options.swipe === false)) { + return; + } else if (_.options.draggable === false && event.type.indexOf('mouse') !== -1) { + return; + } + + _.touchObject.fingerCount = event.originalEvent && event.originalEvent.touches !== undefined ? + event.originalEvent.touches.length : 1; + + _.touchObject.minSwipe = _.listWidth / _.options + .touchThreshold; + + if (_.options.verticalScrolling === true) { + _.touchObject.minSwipe = _.listHeight / _.options + .touchThreshold; + } + + switch (event.data.action) { + + case 'start': + _.swipeStart(event); + break; + + case 'move': + _.swipeMove(event); + break; + + case 'end': + _.swipeEnd(event); + break; + + } + + }; + + Slick.prototype.swipeMove = function(event) { + + var _ = this, + edgeWasHit = false, + curLeft, swipeDirection, swipeLength, positionOffset, touches; + + touches = event.originalEvent !== undefined ? event.originalEvent.touches : null; + + if (!_.dragging || touches && touches.length !== 1) { + return false; + } + + curLeft = _.getLeft(_.currentSlide); + + _.touchObject.curX = touches !== undefined ? touches[0].pageX : event.clientX; + _.touchObject.curY = touches !== undefined ? touches[0].pageY : event.clientY; + + _.touchObject.swipeLength = Math.round(Math.sqrt( + Math.pow(_.touchObject.curX - _.touchObject.startX, 2))); + + if (_.options.verticalScrolling === true) { + _.touchObject.swipeLength = Math.round(Math.sqrt( + Math.pow(_.touchObject.curY - _.touchObject.startY, 2))); + } + + swipeDirection = _.swipeDirection(); + + if (swipeDirection === 'vertical') { + return; + } + + if (event.originalEvent !== undefined && _.touchObject.swipeLength > 4) { + event.preventDefault(); + } + + positionOffset = (_.options.rtl === false ? 1 : -1) * (_.touchObject.curX > _.touchObject.startX ? 1 : -1); + if (_.options.verticalScrolling === true) { + positionOffset = _.touchObject.curY > _.touchObject.startY ? 1 : -1; + } + + + swipeLength = _.touchObject.swipeLength; + + _.touchObject.edgeHit = false; + + if (_.options.infinite === false) { + if ((_.currentSlide === 0 && swipeDirection === "right") || (_.currentSlide >= _.getDotCount() && swipeDirection === "left")) { + swipeLength = _.touchObject.swipeLength * _.options.edgeFriction; + _.touchObject.edgeHit = true; + } + } + + if (_.options.vertical === false) { + _.swipeLeft = curLeft + swipeLength * positionOffset; + } else { + _.swipeLeft = curLeft + (swipeLength * (_.$list.height() / _.listWidth)) * positionOffset; + } + if (_.options.verticalScrolling === true) { + _.swipeLeft = curLeft + swipeLength * positionOffset; + } + + if (_.options.fade === true || _.options.touchMove === false) { + return false; + } + + if (_.animating === true) { + _.swipeLeft = null; + return false; + } + + _.setCSS(_.swipeLeft); + + }; + + Slick.prototype.swipeStart = function(event) { + + var _ = this, + touches; + + if (_.touchObject.fingerCount !== 1 || _.slideCount <= _.options.slidesToShow) { + _.touchObject = {}; + return false; + } + + if (event.originalEvent !== undefined && event.originalEvent.touches !== undefined) { + touches = event.originalEvent.touches[0]; + } + + _.touchObject.startX = _.touchObject.curX = touches !== undefined ? touches.pageX : event.clientX; + _.touchObject.startY = _.touchObject.curY = touches !== undefined ? touches.pageY : event.clientY; + + _.dragging = true; + + }; + + Slick.prototype.unfilterSlides = Slick.prototype.slickUnfilter = function() { + + var _ = this; + + if (_.$slidesCache !== null) { + + _.unload(); + + _.$slideTrack.children(this.options.slide).detach(); + + _.$slidesCache.appendTo(_.$slideTrack); + + _.reinit(); + + } + + }; + + Slick.prototype.unload = function() { + + var _ = this; + + $('.slick-cloned', _.$slider).remove(); + if (_.$dots) { + _.$dots.remove(); + } + if (_.$prevArrow && (typeof _.options.prevArrow !== 'object')) { + _.$prevArrow.remove(); + } + if (_.$nextArrow && (typeof _.options.nextArrow !== 'object')) { + _.$nextArrow.remove(); + } + _.$slides.removeClass('slick-slide slick-active slick-visible').attr("aria-hidden", "true").css('width', ''); + + }; + + Slick.prototype.unslick = function() { + + var _ = this; + _.destroy(); + + }; + + Slick.prototype.updateArrows = function() { + + var _ = this, + centerOffset; + + centerOffset = Math.floor(_.options.slidesToShow / 2); + + if (_.options.arrows === true && _.options.infinite !== + true && _.slideCount > _.options.slidesToShow) { + _.$prevArrow.removeClass('slick-disabled'); + _.$nextArrow.removeClass('slick-disabled'); + if (_.currentSlide === 0) { + _.$prevArrow.addClass('slick-disabled'); + _.$nextArrow.removeClass('slick-disabled'); + } else if (_.currentSlide >= _.slideCount - _.options.slidesToShow && _.options.centerMode === false) { + _.$nextArrow.addClass('slick-disabled'); + _.$prevArrow.removeClass('slick-disabled'); + } else if (_.currentSlide >= _.slideCount - 1 && _.options.centerMode === true) { + _.$nextArrow.addClass('slick-disabled'); + _.$prevArrow.removeClass('slick-disabled'); + } + } + + }; + + Slick.prototype.updateDots = function() { + + var _ = this; + + if (_.$dots !== null) { + + _.$dots.find('li').removeClass('slick-active').attr("aria-hidden", "true"); + _.$dots.find('li').eq(Math.floor(_.currentSlide / _.options.slidesToScroll)).addClass('slick-active').attr("aria-hidden", "false"); + + } + + }; + + Slick.prototype.visibility = function() { + + var _ = this; + + if (document[_.hidden]) { + _.paused = true; + _.autoPlayClear(); + } else { + _.paused = false; + _.autoPlay(); + } + + }; + + $.fn.slick = function() { + var _ = this, + opt = arguments[0], + args = Array.prototype.slice.call(arguments, 1), + l = _.length, + i = 0, + ret; + for (i; i < l; i++) { + if (typeof opt == 'object' || typeof opt == 'undefined') + _[i].slick = new Slick(_[i], opt); + else + ret = _[i].slick[opt].apply(_[i].slick, args); + if (typeof ret != 'undefined') return ret; + } + return _; + }; + +})); diff --git a/public/proposal-app b/public/proposal-app new file mode 160000 index 0000000..a86d8e6 --- /dev/null +++ b/public/proposal-app @@ -0,0 +1 @@ +Subproject commit a86d8e6f498ef8a93411a287c1e772928fca369b diff --git a/public/stylesheets/block-store.css b/public/stylesheets/block-store.css new file mode 100644 index 0000000..40ccbad --- /dev/null +++ b/public/stylesheets/block-store.css @@ -0,0 +1,164 @@ +/************************************************ + * the handles to where you can drag the blocks * + ************************************************/ + +.block-target { + padding: 2px; + background: #81FF9B; + margin-bottom: 5px; + opacity: 0.8; + visibility: hidden; + height: 0; + font-size: 20px; + font-weight: bold; + color: white; + text-align: center; +} +.block-target-hover { + border: 1px solid #000; + box-shadow: 0 0 15px #888 inset; + opacity: 1; +} +.shadow .block-target-hover, .shadow .block-target-active { + visibility: visible; + height: 30px; +} + +/************************************************ + * block store styles + ************************************************/ +#block-store #block-store-filter { + float: right; + margin-bottom: 8px; +} +#block-store #block-types { + clear: both; +} +#block-store { + display: none; +} +#content #block-store .block-type { + position: relative; + border: 0px solid #AAA; + margin: 4px 0; + padding: 0; + text-align: center; + height: auto; + float: none; + display: inline-block; + overflow: hidden; + width: 112px; + cursor: move; + vertical-align: top; +} +#block-store .block-type:hover { + box-shadow: 0px 0px 0px 2px #FFF, 0px 0px 0px 2px #FFF, 0px 0px 10px rgba(0,0,0,0.6); + outline: none; +} +#block-store .block-type:hover .button-bar { + display: inline; +} +#block-store .button-bar { + margin: 0; + display: none; + position: absolute; + right: 0%; + border: 0px solid #AAA; + margin: 0px; + padding: 0px; +} +#block-store .button-bar .icon-help { + font-size: 0; + width: 0; +} + +#block-store .block-type .block-type-icon { + margin-right: auto; + margin-left: auto; +} +#block-store-draggables .block-type, #block-store-draggables .block, #block-store-draggables .block-type-icon, #block-store-draggables .ui-draggable-dragging { + display: inline-block; + height: auto; + z-index: 100; +} +#block-store-draggables .block-type .button-bar { + visibility: hidden; +} +#box-organizer.shadow .block { + opacity: 0.2; +} +#box-organizer.shadow .ui-draggable-dragging { + opacity: 1; + border: 5px solid red; + box-shadow: 0px 0px 10px 2px red, inset 0px 0px 10px 2px red; +} +#box-organizer .block { + transition: opacity 0.3s ease-in-out; +} + +/************************************************ + * block info styles + ************************************************/ +#block-info-container { + width: 770px; + padding: 15px; + color: #444; +} + +#block-info-container #block-info-icon { + float: left; + padding-right: 10px; +} + +#block-info-container #block-info-header { + float: left; +} + +#block-info-container #block-info-header .block-type-icon{ + float: left; +} + +#block-info-container #block-info-header h1 { + margin: 0; + font-weight: normal; + font-family: "Arial Black", Liberation Sans, Arial, sans-serif; + margin-left: 5px; + white-space: nowrap; +} + +#block-info-container #block-info-header p{ + margin-left: 55px; +} + + +#block-info-container h2 { + margin: 0; + margin-top: 10px; + font-weight: normal; + font-family: "Arial Black", Liberation Sans, Arial, sans-serif; +} + +#block-info-container p { + margin: 0; +} + +#block-info-images { + clear: both; + overflow-x: auto; + padding-top: 15px; +} + +#block-info-images ul{ + margin: 0px; + padding: 0px; +} +#block-info-images li{ + list-style: none; + display: inline; + +} + + +#block-info-description { + margin-top: 20px; +} diff --git a/public/stylesheets/slick-theme.css b/public/stylesheets/slick-theme.css new file mode 100644 index 0000000..01623d3 --- /dev/null +++ b/public/stylesheets/slick-theme.css @@ -0,0 +1,201 @@ +@charset 'UTF-8'; +/* Slider */ +.slick-loading .slick-list +{ + background: #fff url('/images/loading.gif') center center no-repeat; +} + +/* Icons */ +@font-face +{ + font-family: 'slick'; + font-weight: normal; + font-style: normal; + + src: url('/fonts/slick.eot'); + src: url('/fonts/slick.eot?#iefix') format('embedded-opentype'), url('/fonts/slick.woff') format('woff'), url('/fonts/slick.ttf') format('truetype'), url('/fonts/slick.svg#slick') format('svg'); +} +/* Arrows */ +.slick-prev, +.slick-next +{ + font-size: 0; + line-height: 0; + + position: absolute; + top: 50%; + + display: block; + + width: 40px; + height: 40px; + margin-top: -10px; + padding: 0; + + cursor: pointer; + + color: transparent; + border: none; + outline: none; + background: transparent; +} +.slick-prev:hover, +.slick-prev:focus, +.slick-next:hover, +.slick-next:focus +{ + color: transparent; + outline: none; + background: transparent; +} +.slick-prev:hover:before, +.slick-prev:focus:before, +.slick-next:hover:before, +.slick-next:focus:before +{ + opacity: 1; +} +.slick-prev.slick-disabled:before, +.slick-next.slick-disabled:before +{ + opacity: .25; +} + +.slick-prev:before, +.slick-next:before +{ + font-family: 'slick'; + font-size: 30px; + line-height: 1; + + opacity: .75; + color: rgb(174, 174, 174); + + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +.slick-prev +{ + left: -10px; +} +[dir='rtl'] .slick-prev +{ + right: -10px; + left: auto; +} +.slick-prev:before +{ + content: '←'; +} +[dir='rtl'] .slick-prev:before +{ + content: '→'; +} + +.slick-next +{ + right: -10px; +} +[dir='rtl'] .slick-next +{ + right: auto; + left: -10px; +} +.slick-next:before +{ + content: '→'; +} +[dir='rtl'] .slick-next:before +{ + content: '←'; +} + +/* Dots */ +.slick-slider +{ + margin-bottom: 40px; +} + +.slick-dots +{ + position: absolute; + bottom: -40px; + + display: block; + + width: 100%; + padding: 0; + + list-style: none; + + text-align: center; +} +.slick-dots li +{ + position: relative; + + display: inline-block; + + width: 20px; + height: 20px; + margin: 0 5px; + padding: 0; + + cursor: pointer; +} +.slick-dots li button +{ + font-size: 0; + line-height: 0; + + display: block; + + width: 20px; + height: 20px; + padding: 5px; + + cursor: pointer; + + color: transparent; + border: 0; + outline: none; + background: transparent; +} +.slick-dots li button:hover, +.slick-dots li button:focus +{ + outline: none; +} +.slick-dots li button:hover:before, +.slick-dots li button:focus:before +{ + opacity: 1; +} +.slick-dots li button:before +{ + font-family: 'slick'; + font-size: 6px; + line-height: 20px; + + position: absolute; + top: 0; + left: 0; + + width: 20px; + height: 20px; + + content: '•'; + text-align: center; + + opacity: .25; + color: black; + + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} +.slick-dots li.slick-active button:before +{ + opacity: .75; + color: black; +} diff --git a/public/stylesheets/slick.css b/public/stylesheets/slick.css new file mode 100644 index 0000000..59119f4 --- /dev/null +++ b/public/stylesheets/slick.css @@ -0,0 +1,116 @@ +/* Slider */ +.slick-slider +{ + position: relative; + + display: block; + + -moz-box-sizing: border-box; + box-sizing: border-box; + + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + + -webkit-touch-callout: none; + -khtml-user-select: none; + -ms-touch-action: pan-y; + touch-action: pan-y; + -webkit-tap-highlight-color: transparent; +} + +.slick-list +{ + position: relative; + + display: block; + overflow: hidden; + + margin: 0; + padding: 0; +} +.slick-list:focus +{ + outline: none; +} +.slick-list.dragging +{ + cursor: pointer; + cursor: hand; +} + +.slick-slider .slick-track, +.slick-slider .slick-list +{ + -webkit-transform: translate3d(0, 0, 0); + -moz-transform: translate3d(0, 0, 0); + -ms-transform: translate3d(0, 0, 0); + -o-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); +} + +.slick-track +{ + position: relative; + top: 0; + left: 0; + + display: block; +} +.slick-track:before, +.slick-track:after +{ + display: table; + + content: ''; +} +.slick-track:after +{ + clear: both; +} +.slick-loading .slick-track +{ + visibility: hidden; +} + +.slick-slide +{ + display: none; + float: left; + + height: 100%; + min-height: 1px; +} +[dir='rtl'] .slick-slide +{ + float: right; +} +.slick-slide img +{ + display: block; +} +.slick-slide.slick-loading img +{ + display: none; +} +.slick-slide.dragging img +{ + pointer-events: none; +} +.slick-initialized .slick-slide +{ + display: block; +} +.slick-loading .slick-slide +{ + visibility: hidden; +} +.slick-vertical .slick-slide +{ + display: block; + + height: auto; + + border: 1px solid transparent; +} \ No newline at end of file diff --git a/test/functional/environment_design_controller_test.rb b/test/functional/environment_design_controller_test.rb index f4962d7..0bea99e 100644 --- a/test/functional/environment_design_controller_test.rb +++ b/test/functional/environment_design_controller_test.rb @@ -165,14 +165,6 @@ class EnvironmentDesignControllerTest < ActionController::TestCase assert_tag :tag => 'a', :attributes => {:href => '/admin'}, :child => {:tag => 'span', :content => "Back to control panel"} end - should 'render add a new block functionality' do - login_as(create_admin_user(Environment.default)) - get :add_block - - assert_response :success - assert_template 'add_block' - end - should 'a environment block plugin add new blocks for environments' do class CustomBlock1 < Block; end; @@ -212,7 +204,7 @@ class EnvironmentDesignControllerTest < ActionController::TestCase refute @controller.available_blocks.include?(CustomBlock4) end - should 'a block plugin with center position add new blocks only in this position' do + should 'a block plugin add new blocks' do class CustomBlock1 < Block; end; class CustomBlock2 < Block; end; class CustomBlock3 < Block; end; @@ -241,61 +233,10 @@ class EnvironmentDesignControllerTest < ActionController::TestCase Noosfero::Plugin::Manager.any_instance.stubs(:enabled_plugins).returns([TestBlockPlugin.new]) login_as(create_admin_user(Environment.default)) - get :add_block - - assert_response :success - assert @controller.instance_variable_get('@center_block_types').include?(CustomBlock1) - assert @controller.instance_variable_get('@center_block_types').include?(CustomBlock2) - assert @controller.instance_variable_get('@center_block_types').include?(CustomBlock3) - refute @controller.instance_variable_get('@center_block_types').include?(CustomBlock4) - refute @controller.instance_variable_get('@center_block_types').include?(CustomBlock5) - refute @controller.instance_variable_get('@center_block_types').include?(CustomBlock6) - refute @controller.instance_variable_get('@center_block_types').include?(CustomBlock7) - refute @controller.instance_variable_get('@center_block_types').include?(CustomBlock8) - refute @controller.instance_variable_get('@center_block_types').include?(CustomBlock9) - end - - should 'a block plugin with side position add new blocks only in this position' do - class CustomBlock1 < Block; end; - class CustomBlock2 < Block; end; - class CustomBlock3 < Block; end; - class CustomBlock4 < Block; end; - class CustomBlock5 < Block; end; - class CustomBlock6 < Block; end; - class CustomBlock7 < Block; end; - class CustomBlock8 < Block; end; - class CustomBlock9 < Block; end; - - class TestBlockPlugin < Noosfero::Plugin - def self.extra_blocks - { - CustomBlock1 => {:type => Environment, :position => [1]}, - CustomBlock2 => {:type => Environment, :position => 1}, - CustomBlock3 => {:type => Environment, :position => '1'}, - CustomBlock4 => {:type => Environment, :position => [2]}, - CustomBlock5 => {:type => Environment, :position => 2}, - CustomBlock6 => {:type => Environment, :position => '2'}, - CustomBlock7 => {:type => Environment, :position => [3]}, - CustomBlock8 => {:type => Environment, :position => 3}, - CustomBlock9 => {:type => Environment, :position => '3'}, - } - end - end - - Noosfero::Plugin::Manager.any_instance.stubs(:enabled_plugins).returns([TestBlockPlugin.new]) - login_as(create_admin_user(Environment.default)) - get :add_block + get :index assert_response :success - refute @controller.instance_variable_get('@side_block_types').include?(CustomBlock1) - refute @controller.instance_variable_get('@side_block_types').include?(CustomBlock2) - refute @controller.instance_variable_get('@side_block_types').include?(CustomBlock3) - assert @controller.instance_variable_get('@side_block_types').include?(CustomBlock4) - assert @controller.instance_variable_get('@side_block_types').include?(CustomBlock5) - assert @controller.instance_variable_get('@side_block_types').include?(CustomBlock6) - assert @controller.instance_variable_get('@side_block_types').include?(CustomBlock7) - assert @controller.instance_variable_get('@side_block_types').include?(CustomBlock8) - assert @controller.instance_variable_get('@side_block_types').include?(CustomBlock9) + (1..9).each {|i| assert_tag :tag => 'div', :attributes => { 'data-block-type' => "EnvironmentDesignControllerTest::CustomBlock#{i}" }} end should 'a block plugin cannot be listed for unspecified types' do @@ -325,17 +266,11 @@ class EnvironmentDesignControllerTest < ActionController::TestCase Noosfero::Plugin::Manager.any_instance.stubs(:enabled_plugins).returns([TestBlockPlugin.new]) login_as(create_admin_user(Environment.default)) - get :add_block + get :index assert_response :success - refute @controller.instance_variable_get('@center_block_types').include?(CustomBlock1) - refute @controller.instance_variable_get('@center_block_types').include?(CustomBlock2) - refute @controller.instance_variable_get('@center_block_types').include?(CustomBlock3) - assert @controller.instance_variable_get('@center_block_types').include?(CustomBlock4) - refute @controller.instance_variable_get('@side_block_types').include?(CustomBlock5) - refute @controller.instance_variable_get('@side_block_types').include?(CustomBlock6) - refute @controller.instance_variable_get('@side_block_types').include?(CustomBlock7) - assert @controller.instance_variable_get('@side_block_types').include?(CustomBlock8) + [4, 8].each {|i| assert_tag :tag => 'div', :attributes => { 'data-block-type' => "EnvironmentDesignControllerTest::CustomBlock#{i}" }} + [1, 2, 3, 5, 6, 7].each {|i| assert_no_tag :tag => 'div', :attributes => { 'data-block-type' => "EnvironmentDesignControllerTest::CustomBlock#{i}" }} end should 'clone a block' do diff --git a/test/functional/profile_design_controller_test.rb b/test/functional/profile_design_controller_test.rb index 2d90e1b..692ce46 100644 --- a/test/functional/profile_design_controller_test.rb +++ b/test/functional/profile_design_controller_test.rb @@ -169,7 +169,7 @@ class ProfileDesignControllerTest < ActionController::TestCase end end - should 'a block plugin with center position add new blocks only in this position' do + should 'a block plugin add new blocks' do class CustomBlock1 < Block; end; class CustomBlock2 < Block; end; class CustomBlock3 < Block; end; @@ -197,60 +197,10 @@ class ProfileDesignControllerTest < ActionController::TestCase end Noosfero::Plugin::Manager.any_instance.stubs(:enabled_plugins).returns([TestBlockPlugin.new]) - get :add_block, :profile => 'designtestuser' - assert_response :success - - assert @controller.instance_variable_get('@center_block_types').include?(CustomBlock1) - assert @controller.instance_variable_get('@center_block_types').include?(CustomBlock2) - assert @controller.instance_variable_get('@center_block_types').include?(CustomBlock3) - refute @controller.instance_variable_get('@center_block_types').include?(CustomBlock4) - refute @controller.instance_variable_get('@center_block_types').include?(CustomBlock5) - refute @controller.instance_variable_get('@center_block_types').include?(CustomBlock6) - refute @controller.instance_variable_get('@center_block_types').include?(CustomBlock7) - refute @controller.instance_variable_get('@center_block_types').include?(CustomBlock8) - refute @controller.instance_variable_get('@center_block_types').include?(CustomBlock9) - end - - should 'a block plugin with side position add new blocks only in this position' do - class CustomBlock1 < Block; end; - class CustomBlock2 < Block; end; - class CustomBlock3 < Block; end; - class CustomBlock4 < Block; end; - class CustomBlock5 < Block; end; - class CustomBlock6 < Block; end; - class CustomBlock7 < Block; end; - class CustomBlock8 < Block; end; - class CustomBlock9 < Block; end; - - class TestBlockPlugin < Noosfero::Plugin - def self.extra_blocks - { - CustomBlock1 => {:type => Person, :position => [1]}, - CustomBlock2 => {:type => Person, :position => 1}, - CustomBlock3 => {:type => Person, :position => '1'}, - CustomBlock4 => {:type => Person, :position => [2]}, - CustomBlock5 => {:type => Person, :position => 2}, - CustomBlock6 => {:type => Person, :position => '2'}, - CustomBlock7 => {:type => Person, :position => [3]}, - CustomBlock8 => {:type => Person, :position => 3}, - CustomBlock9 => {:type => Person, :position => '3'}, - } - end - end - - Noosfero::Plugin::Manager.any_instance.stubs(:enabled_plugins).returns([TestBlockPlugin.new]) - get :add_block, :profile => 'designtestuser' + get :index, :profile => 'designtestuser' assert_response :success - refute @controller.instance_variable_get('@side_block_types').include?(CustomBlock1) - refute @controller.instance_variable_get('@side_block_types').include?(CustomBlock2) - refute @controller.instance_variable_get('@side_block_types').include?(CustomBlock3) - assert @controller.instance_variable_get('@side_block_types').include?(CustomBlock4) - assert @controller.instance_variable_get('@side_block_types').include?(CustomBlock5) - assert @controller.instance_variable_get('@side_block_types').include?(CustomBlock6) - assert @controller.instance_variable_get('@side_block_types').include?(CustomBlock7) - assert @controller.instance_variable_get('@side_block_types').include?(CustomBlock8) - assert @controller.instance_variable_get('@side_block_types').include?(CustomBlock9) + (1..9).each {|i| assert_tag :tag => 'div', :attributes => { 'data-block-type' => "ProfileDesignControllerTest::CustomBlock#{i}" } } end should 'a block plugin cannot be listed for unspecified types' do @@ -279,17 +229,11 @@ class ProfileDesignControllerTest < ActionController::TestCase end Noosfero::Plugin::Manager.any_instance.stubs(:enabled_plugins).returns([TestBlockPlugin.new]) - get :add_block, :profile => 'designtestuser' + get :index, :profile => 'designtestuser' assert_response :success - assert @controller.instance_variable_get('@center_block_types').include?(CustomBlock1) - refute @controller.instance_variable_get('@center_block_types').include?(CustomBlock2) - refute @controller.instance_variable_get('@center_block_types').include?(CustomBlock3) - refute @controller.instance_variable_get('@center_block_types').include?(CustomBlock4) - assert @controller.instance_variable_get('@side_block_types').include?(CustomBlock5) - refute @controller.instance_variable_get('@side_block_types').include?(CustomBlock6) - refute @controller.instance_variable_get('@side_block_types').include?(CustomBlock7) - refute @controller.instance_variable_get('@side_block_types').include?(CustomBlock8) + [1, 5].each {|i| assert_tag :tag => 'div', :attributes => { 'data-block-type' => "ProfileDesignControllerTest::CustomBlock#{i}" }} + [2, 3, 4, 6, 7, 8].each {|i| assert_no_tag :tag => 'div', :attributes => { 'data-block-type' => "ProfileDesignControllerTest::CustomBlock#{i}" }} end should 'not edit main block with never option' do @@ -339,15 +283,9 @@ class ProfileDesignControllerTest < ActionController::TestCase # BEGIN - tests for ProfileDesignController features ###################################################### - should 'display popup for adding a new block' do - get :add_block, :profile => 'designtestuser' - assert_response :success - assert_no_tag :tag => 'body' # e.g. no layout - end - should 'actually add a new block' do assert_difference 'Block.count' do - post :add_block, :profile => 'designtestuser', :box_id => @box1.id, :type => RecentDocumentsBlock.name + post :move_block, :profile => 'designtestuser', :target => "end-of-box-#{@box1.id}", :type => RecentDocumentsBlock.name assert_redirected_to :action => 'index' end end @@ -355,7 +293,7 @@ class ProfileDesignControllerTest < ActionController::TestCase should 'not allow to create unknown types' do assert_no_difference 'Block.count' do assert_raise ArgumentError do - post :add_block, :profile => 'designtestuser', :box_id => @box1.id, :type => "PleaseLetMeCrackYourSite" + post :move_block, :profile => 'designtestuser', :box_id => @box1.id, :type => "PleaseLetMeCrackYourSite" end end end @@ -424,6 +362,12 @@ class ProfileDesignControllerTest < ActionController::TestCase assert_tag :tag => 'a', :content => 'Back to control panel' end + should 'display avaliable blocks in alphabetical order' do + @controller.stubs(:available_blocks).returns([TagsBlock, ArticleBlock]) + get :index, :profile => 'designtestuser' + assert_equal assigns(:available_blocks), [ArticleBlock, TagsBlock] + end + should 'not allow products block if environment do not let' do env = Environment.default env.disable('products_for_enterprises') @@ -432,9 +376,9 @@ class ProfileDesignControllerTest < ActionController::TestCase person = create_user_with_permission('test_user', 'edit_profile_design', ent) login_as(person.user.login) - get :add_block, :profile => 'test_ent' + get :index, :profile => 'test_ent' - assert_no_tag :tag => 'input', :attributes => {:type => 'radio', :value => 'ProductsBlock'} + assert_no_tag :tag => 'div', :attributes => { 'data-block-type' => 'ProductsBlock' } end should 'create back link to profile control panel' do @@ -448,18 +392,18 @@ class ProfileDesignControllerTest < ActionController::TestCase should 'offer to create blog archives block only if has blog' do holder.articles << Blog.new(:name => 'Blog test', :profile => holder) - get :add_block, :profile => 'designtestuser' - assert_tag :tag => 'input', :attributes => { :name => 'type', :value => 'BlogArchivesBlock' } + get :index, :profile => 'designtestuser' + assert_tag :tag => 'div', :attributes => { 'data-block-type' => 'BlogArchivesBlock' } end should 'not offer to create blog archives block if user dont have blog' do - get :add_block, :profile => 'designtestuser' - assert_no_tag :tag => 'input', :attributes => { :name => 'type', :value => 'BlogArchivesBlock' } + get :index, :profile => 'designtestuser' + assert_no_tag :tag => 'div', :attributes => { 'data-block-type' => 'BlogArchivesBlock' } end should 'offer to create feed reader block' do - get :add_block, :profile => 'designtestuser' - assert_tag :tag => 'input', :attributes => { :name => 'type', :value => 'FeedReaderBlock' } + get :index, :profile => 'designtestuser' + assert_tag :tag => 'div', :attributes => { 'data-block-type' => 'FeedReaderBlock' } end should 'be able to edit FeedReaderBlock' do @@ -569,17 +513,17 @@ class ProfileDesignControllerTest < ActionController::TestCase end should 'allow admins to add RawHTMLBlock' do - profile.stubs(:is_admin?).with(profile.environment).returns(true) + profile.stubs(:is_admin?).returns(true) @controller.stubs(:user).returns(profile) - get :add_block, :profile => 'designtestuser' - assert_tag :tag => 'input', :attributes => { :name => 'type', :value => 'RawHTMLBlock' } + get :index, :profile => 'designtestuser' + assert_tag :tag => 'div', :attributes => { 'data-block-type' => 'RawHTMLBlock' } end should 'not allow normal users to add RawHTMLBlock' do - profile.stubs(:is_admin?).with(profile.environment).returns(false) + profile.stubs(:is_admin?).returns(false) @controller.stubs(:user).returns(profile) - get :add_block, :profile => 'designtestuser' - assert_no_tag :tag => 'input', :attributes => { :name => 'type', :value => 'RawHTMLBlock' } + get :index, :profile => 'designtestuser' + assert_no_tag :tag => 'div', :attributes => { 'data-block-type' => 'RawHTMLBlock' } end should 'editing article block displays right selected article' do @@ -726,7 +670,7 @@ class ProfileDesignControllerTest < ActionController::TestCase end Noosfero::Plugin::Manager.any_instance.stubs(:enabled_plugins).returns([TestBlockPlugin.new]) - refute @controller.available_blocks.include?(CustomBlock1) + assert !@controller.available_blocks.include?(CustomBlock1) end should 'clone a block' do @@ -758,8 +702,8 @@ class ProfileDesignControllerTest < ActionController::TestCase should 'guarantee main block is always visible to everybody' do get :edit, :profile => 'designtestuser', :id => @b4.id %w[logged not_logged followers].each do |option| - assert_no_tag :select, :attributes => {:name => 'block[display_user]'}, - :descendant => {:tag => 'option', :attributes => {:value => option}} + assert_no_tag :select, :attributes => {:name => 'block[display_user]'}, + :descendant => {:tag => 'option', :attributes => {:value => option}} end end diff --git a/test/performance/user_test.rb b/test/performance/user_test.rb new file mode 100644 index 0000000..0f977fe --- /dev/null +++ b/test/performance/user_test.rb @@ -0,0 +1,28 @@ +require 'test_helper' +require 'rails/performance_test_help' + +class UserTest < ActionDispatch::PerformanceTest + + attr_reader :environment + + def setup + @environment = Environment.default + @environment.disable('skip_new_user_email_confirmation') + + @environment.person_templates.destroy_all + user = User.create!(:login => SecureRandom.uuid, :email => 'test@test.com', :password => 'test', :password_confirmation => 'test') + user.person.update_attribute(:is_template, true) + user.person.articles.destroy_all + user.person.boxes.destroy_all + + @environment.person_default_template = user.person + @environment.save! + end + + def test_user_creation_without_confirmation + User.benchmark("Creating user") do + user = User.create!(:login => 'changetest', :password => 'test', :password_confirmation => 'test', :email => 'changetest@example.com', :environment => environment) + end + end + +end diff --git a/test/unit/box_organizer_helper_test.rb b/test/unit/box_organizer_helper_test.rb new file mode 100644 index 0000000..d8dc65d --- /dev/null +++ b/test/unit/box_organizer_helper_test.rb @@ -0,0 +1,312 @@ +# encoding: UTF-8 +require File.dirname(__FILE__) + '/../test_helper' + +class BoxOrganizerHelperTest < ActionView::TestCase + + + def setup + @environment = Environment.default + end + + attr_reader :environment + + should 'display the default icon for block without icon' do + class SomeBlock < Block; end + block = SomeBlock + @plugins = mock + @plugins.stubs(:fetch_first_plugin).with(:has_block?, block).returns(nil) + assert_match '/images/icon_block.png', display_icon(block) + end + + should 'display the icon block' do + class SomeBlock < Block; end + block = SomeBlock + @plugins = mock + @plugins.stubs(:fetch_first_plugin).with(:has_block?, block).returns(nil) + + File.stubs(:exists?).returns(false) + File.stubs(:exists?).with(File.join(Rails.root, 'public', 'images', '/blocks/some_block/icon.png')).returns(true) + assert_match 'blocks/some_block/icon.png', display_icon(block) + end + + should 'display the plugin icon block' do + class SomeBlock < Block; end + block = SomeBlock + class SomePlugin < Noosfero::Plugin; end + SomePlugin.stubs(:name).returns('SomePlugin') + @plugins = mock + @plugins.stubs(:fetch_first_plugin).with(:has_block?, block).returns(SomePlugin) + + File.stubs(:exists?).returns(false) + File.stubs(:exists?).with(File.join(Rails.root, 'public', 'plugins/some/images/blocks/some_block/icon.png')).returns(true) + assert_match 'plugins/some/images/blocks/some_block/icon.png', display_icon(block) + end + + should 'display the theme icon block' do + class SomeBlock < Block; end + block = SomeBlock + + @plugins = mock + @plugins.stubs(:fetch_first_plugin).with(:has_block?, block).returns(nil) + + @environment = mock + @environment.stubs(:theme).returns('some_theme') + + File.stubs(:exists?).returns(false) + File.stubs(:exists?).with(File.join(Rails.root, 'public', 'designs/themes/some_theme/images/blocks/some_block/icon.png')).returns(true) + assert_match 'designs/themes/some_theme/images/blocks/some_block/icon.png', display_icon(block) + end + + should 'display the theme icon block instead of block icon' do + class SomeBlock < Block; end + block = SomeBlock + + @plugins = mock + @plugins.stubs(:fetch_first_plugin).with(:has_block?, block).returns(nil) + + @environment = mock + @environment.stubs(:theme).returns('some_theme') + + File.stubs(:exists?).returns(false) + File.stubs(:exists?).with(File.join(Rails.root, 'public', 'designs/themes/some_theme/images/blocks/some_block/icon.png')).returns(true) + File.stubs(:exists?).with(File.join(Rails.root, 'public', 'images', '/blocks/some_block/icon.png')).returns(true) + assert_match 'designs/themes/some_theme/images/blocks/some_block/icon.png', display_icon(block) + end + + should 'display the theme icon block instead of plugin block icon' do + class SomeBlock < Block; end + block = SomeBlock + + class SomePlugin < Noosfero::Plugin; end + SomePlugin.stubs(:name).returns('SomePlugin') + @plugins = mock + @plugins.stubs(:fetch_first_plugin).with(:has_block?, block).returns(SomePlugin) + + @environment = mock + @environment.stubs(:theme).returns('some_theme') + + File.stubs(:exists?).returns(false) + File.stubs(:exists?).with(File.join(Rails.root, 'public', 'designs/themes/some_theme/images/blocks/some_block/icon.png')).returns(true) + File.stubs(:exists?).with(File.join(Rails.root, 'public', 'plugins/some/images/blocks/some_block/icon.png')).returns(true) + assert_match 'designs/themes/some_theme/images/blocks/some_block/icon.png', display_icon(block) + end + + should 'display the theme icon block instead of block icon and plugin icon' do + class SomeBlock < Block; end + block = SomeBlock + + class SomePlugin < Noosfero::Plugin; end + SomePlugin.stubs(:name).returns('SomePlugin') + @plugins = mock + @plugins.stubs(:fetch_first_plugin).with(:has_block?, block).returns(SomePlugin) + + + @environment = mock + @environment.stubs(:theme).returns('some_theme') + + File.stubs(:exists?).returns(false) + File.stubs(:exists?).with(File.join(Rails.root, 'public', 'designs/themes/some_theme/images/blocks/some_block/icon.png')).returns(true) + File.stubs(:exists?).with(File.join(Rails.root, 'public', 'plugins/some/images/blocks/some_block/icon.png')).returns(true) + File.stubs(:exists?).with(File.join(Rails.root, 'public', 'images', '/blocks/some_block/icon.png')).returns(true) + assert_match 'designs/themes/some_theme/images/blocks/some_block/icon.png', display_icon(block) + end + + should 'display the plugin icon block instead of block icon' do + class SomeBlock < Block; end + block = SomeBlock + + class SomePlugin < Noosfero::Plugin; end + SomePlugin.stubs(:name).returns('SomePlugin') + @plugins = mock + @plugins.stubs(:fetch_first_plugin).with(:has_block?, block).returns(SomePlugin) + + + File.stubs(:exists?).returns(false) + File.stubs(:exists?).with(File.join(Rails.root, 'public', 'plugins/some/images/blocks/some_block/icon.png')).returns(true) + File.stubs(:exists?).with(File.join(Rails.root, 'public', 'images', '/blocks/some_block/icon.png')).returns(true) + assert_match 'plugins/some/images/blocks/some_block/icon.png', display_icon(block) + end + + should 'display the default preview for block without previews images' do + class SomeBlock < Block; end + block = SomeBlock + @plugins = mock + @plugins.stubs(:fetch_first_plugin).with(:has_block?, block).returns(nil) + + doc = HTML::Document.new display_previews(block) + assert_select doc.root, 'li' do |elements| + assert_match /img.* src="\/images\/block_preview.png.*"/, elements[0].to_s + assert_match /img.* src="\/images\/block_preview.png.*"/, elements[1].to_s + assert_match /img.* src="\/images\/block_preview.png.*"/, elements[2].to_s + end + end + + should 'display the previews of block' do + class SomeBlock < Block; end + block = SomeBlock + @plugins = mock + @plugins.stubs(:fetch_first_plugin).with(:has_block?, block).returns(nil) + + Dir.stubs(:glob).returns([]) + base_path = File.join(Rails.root, 'public', 'images', '/blocks/some_block/previews/') + Dir.stubs(:glob).with(File.join(base_path, '*')).returns([File.join(base_path, 'p1.png'), File.join(base_path, 'p2.png')]) + doc = HTML::Document.new display_previews(block) + assert_select doc.root, 'li' do |elements| + assert_match /img.* src="\/images\/blocks\/some_block\/previews\/p1.png"/, elements[0].to_s + assert_match /img.* src="\/images\/blocks\/some_block\/previews\/p2.png"/, elements[1].to_s + end + end + + should 'display the plugin preview images of block' do + class SomeBlock < Block; end + block = SomeBlock + class SomePlugin < Noosfero::Plugin; end + SomePlugin.stubs(:name).returns('SomePlugin') + @plugins = mock + @plugins.stubs(:fetch_first_plugin).with(:has_block?, block).returns(SomePlugin) + + + Dir.stubs(:glob).returns([]) + base_path = File.join(Rails.root, 'public', 'plugins/some/', 'images', '/blocks/some_block/previews/') + Dir.stubs(:glob).with(File.join(base_path, '*')).returns([File.join(base_path, 'p1.png'), File.join(base_path, 'p2.png')]) + doc = HTML::Document.new display_previews(block) + assert_select doc.root, 'li' do |elements| + assert_match /img.* src="\/plugins\/some\/images\/blocks\/some_block\/previews\/p1.png"/, elements[0].to_s + assert_match /img.* src="\/plugins\/some\/images\/blocks\/some_block\/previews\/p2.png"/, elements[1].to_s + end + + end + + should 'display the theme previews of block' do + class SomeBlock < Block; end + block = SomeBlock + + @plugins = mock + @plugins.stubs(:fetch_first_plugin).with(:has_block?, block).returns(nil) + + @environment = mock + @environment.stubs(:theme).returns('some_theme') + + + Dir.stubs(:glob).returns([]) + base_path = File.join(Rails.root, 'public', 'designs/themes/some_theme/', 'images', '/blocks/some_block/previews/') + Dir.stubs(:glob).with(File.join(base_path, '*')).returns([File.join(base_path, 'p1.png'), File.join(base_path, 'p2.png')]) + doc = HTML::Document.new display_previews(block) + assert_select doc.root, 'li' do |elements| + assert_match /img.* src="\/designs\/themes\/some_theme\/images\/blocks\/some_block\/previews\/p1.png"/, elements[0].to_s + assert_match /img.* src="\/designs\/themes\/some_theme\/images\/blocks\/some_block\/previews\/p2.png"/, elements[1].to_s + end + + end + + should 'display the theme preview images of block instead of block preview images' do + class SomeBlock < Block; end + block = SomeBlock + + @plugins = mock + @plugins.stubs(:fetch_first_plugin).with(:has_block?, block).returns(nil) + + @environment = mock + @environment.stubs(:theme).returns('some_theme') + + Dir.stubs(:glob).returns([]) + base_path = File.join(Rails.root, 'public', 'designs/themes/some_theme/', 'images', '/blocks/some_block/previews/') + Dir.stubs(:glob).with(File.join(base_path, '*')).returns([File.join(base_path, 'p1.png'), File.join(base_path, 'p2.png')]) + + base_path = File.join(Rails.root, 'public', 'images', '/blocks/some_block/previews/') + Dir.stubs(:glob).with(File.join(base_path, '*')).returns([File.join(base_path, 'p1.png'), File.join(base_path, 'p2.png')]) + + doc = HTML::Document.new display_previews(block) + assert_select doc.root, 'li' do |elements| + assert_match /img.* src="\/designs\/themes\/some_theme\/images\/blocks\/some_block\/previews\/p1.png"/, elements[0].to_s + assert_match /img.* src="\/designs\/themes\/some_theme\/images\/blocks\/some_block\/previews\/p2.png"/, elements[1].to_s + end + end + + should 'display the theme preview images of block instead of plugin preview images' do + class SomeBlock < Block; end + block = SomeBlock + + class SomePlugin < Noosfero::Plugin; end + SomePlugin.stubs(:name).returns('SomePlugin') + @plugins = mock + @plugins.stubs(:fetch_first_plugin).with(:has_block?, block).returns(SomePlugin) + + @environment = mock + @environment.stubs(:theme).returns('some_theme') + + Dir.stubs(:glob).returns([]) + base_path = File.join(Rails.root, 'public', 'designs/themes/some_theme/', 'images', '/blocks/some_block/previews/') + Dir.stubs(:glob).with(File.join(base_path, '*')).returns([File.join(base_path, 'p1.png'), File.join(base_path, 'p2.png')]) + + base_path = File.join(Rails.root, 'public', 'plugins/some/', 'images', '/blocks/some_block/previews/') + Dir.stubs(:glob).with(File.join(base_path, '*')).returns([File.join(base_path, 'p1.png'), File.join(base_path, 'p2.png')]) + + doc = HTML::Document.new display_previews(block) + assert_select doc.root, 'li' do |elements| + assert_match /img.* src="\/designs\/themes\/some_theme\/images\/blocks\/some_block\/previews\/p1.png"/, elements[0].to_s + assert_match /img.* src="\/designs\/themes\/some_theme\/images\/blocks\/some_block\/previews\/p2.png"/, elements[1].to_s + end + + end + + should 'display the theme preview images of block instead of block previews and plugin previews' do + class SomeBlock < Block; end + block = SomeBlock + + class SomePlugin < Noosfero::Plugin; end + SomePlugin.stubs(:name).returns('SomePlugin') + @plugins = mock + @plugins.stubs(:fetch_first_plugin).with(:has_block?, block).returns(SomePlugin) + + + @environment = mock + @environment.stubs(:theme).returns('some_theme') + + Dir.stubs(:glob).returns([]) + base_path = File.join(Rails.root, 'public', 'designs/themes/some_theme/', 'images', '/blocks/some_block/previews/') + Dir.stubs(:glob).with(File.join(base_path, '*')).returns([File.join(base_path, 'p1.png'), File.join(base_path, 'p2.png')]) + + base_path = File.join(Rails.root, 'public', 'plugins/some/', 'images', '/blocks/some_block/previews/') + Dir.stubs(:glob).with(File.join(base_path, '*')).returns([File.join(base_path, 'p1.png'), File.join(base_path, 'p2.png')]) + + base_path = File.join(Rails.root, 'public', 'images', '/blocks/some_block/previews/') + Dir.stubs(:glob).with(File.join(base_path, '*')).returns([File.join(base_path, 'p1.png'), File.join(base_path, 'p2.png')]) + + doc = HTML::Document.new display_previews(block) + assert_select doc.root, 'li' do |elements| + assert_match /img.* src="\/designs\/themes\/some_theme\/images\/blocks\/some_block\/previews\/p1.png"/, elements[0].to_s + assert_match /img.* src="\/designs\/themes\/some_theme\/images\/blocks\/some_block\/previews\/p2.png"/, elements[1].to_s + end + + end + + should 'display the plugin preview images of block instead of block previews' do + class SomeBlock < Block; end + block = SomeBlock + + class SomePlugin < Noosfero::Plugin; end + SomePlugin.stubs(:name).returns('SomePlugin') + @plugins = mock + @plugins.stubs(:fetch_first_plugin).with(:has_block?, block).returns(SomePlugin) + + Dir.stubs(:glob).returns([]) + base_path = File.join(Rails.root, 'public', 'designs/themes/some_theme/', 'images', '/blocks/some_block/previews/') + Dir.stubs(:glob).with(File.join(base_path, '*')).returns([File.join(base_path, 'p1.png'), File.join(base_path, 'p2.png')]) + + base_path = File.join(Rails.root, 'public', 'plugins/some/', 'images', '/blocks/some_block/previews/') + Dir.stubs(:glob).with(File.join(base_path, '*')).returns([File.join(base_path, 'p1.png'), File.join(base_path, 'p2.png')]) + + base_path = File.join(Rails.root, 'public', 'images', '/blocks/some_block/previews/') + Dir.stubs(:glob).with(File.join(base_path, '*')).returns([File.join(base_path, 'p1.png'), File.join(base_path, 'p2.png')]) + + doc = HTML::Document.new display_previews(block) + assert_select doc.root, 'li' do |elements| + assert_match /img.* src="\/plugins\/some\/images\/blocks\/some_block\/previews\/p1.png"/, elements[0].to_s + assert_match /img.* src="\/plugins\/some\/images\/blocks\/some_block\/previews\/p2.png"/, elements[1].to_s + end + + end + + +end -- libgit2 0.21.2