transit 0.0.1 → 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- data/Gemfile +19 -11
- data/app/assets/images/transit/icon24x24.png +0 -0
- data/app/assets/images/transit/icon24x24_files.png +0 -0
- data/app/assets/images/transit/jplayer.swf +0 -0
- data/app/assets/images/transit/uploadify.swf +0 -0
- data/app/assets/images/transit/video_player.swf +0 -0
- data/app/assets/javascripts/jqtools/expose.js +224 -0
- data/app/assets/javascripts/jqtools/flashembed.js +300 -0
- data/app/assets/javascripts/jqtools/overlay.js +294 -0
- data/app/assets/javascripts/jqtools/scrollable.js +3 -0
- data/app/assets/javascripts/jqtools/scrollable/autoscroll.js +81 -0
- data/app/assets/javascripts/jqtools/scrollable/base.js +335 -0
- data/app/assets/javascripts/jqtools/scrollable/navigator.js +139 -0
- data/app/assets/javascripts/jqtools/validator.js +590 -0
- data/app/assets/javascripts/jqueryui/accordion.js +611 -0
- data/app/assets/javascripts/jqueryui/autocomplete.js +612 -0
- data/app/assets/javascripts/jqueryui/button.js +388 -0
- data/app/assets/javascripts/jqueryui/core.js +312 -0
- data/app/assets/javascripts/jqueryui/datepicker.js +1791 -0
- data/app/assets/javascripts/jqueryui/dialog.js +878 -0
- data/app/assets/javascripts/jqueryui/draggable.js +815 -0
- data/app/assets/javascripts/jqueryui/droppable.js +285 -0
- data/app/assets/javascripts/jqueryui/effects/blind.js +49 -0
- data/app/assets/javascripts/jqueryui/effects/bounce.js +78 -0
- data/app/assets/javascripts/jqueryui/effects/clip.js +54 -0
- data/app/assets/javascripts/jqueryui/effects/core.js +746 -0
- data/app/assets/javascripts/jqueryui/effects/drop.js +50 -0
- data/app/assets/javascripts/jqueryui/effects/explode.js +79 -0
- data/app/assets/javascripts/jqueryui/effects/fade.js +32 -0
- data/app/assets/javascripts/jqueryui/effects/fold.js +56 -0
- data/app/assets/javascripts/jqueryui/effects/highlight.js +50 -0
- data/app/assets/javascripts/jqueryui/effects/pulsate.js +51 -0
- data/app/assets/javascripts/jqueryui/effects/scale.js +178 -0
- data/app/assets/javascripts/jqueryui/effects/shake.js +57 -0
- data/app/assets/javascripts/jqueryui/effects/slide.js +50 -0
- data/app/assets/javascripts/jqueryui/effects/transfer.js +45 -0
- data/app/assets/javascripts/jqueryui/mouse.js +160 -0
- data/app/assets/javascripts/jqueryui/position.js +252 -0
- data/app/assets/javascripts/jqueryui/progressbar.js +109 -0
- data/app/assets/javascripts/jqueryui/resizable.js +814 -0
- data/app/assets/javascripts/jqueryui/selectable.js +266 -0
- data/app/assets/javascripts/jqueryui/slider.js +666 -0
- data/app/assets/javascripts/jqueryui/sortable.js +1077 -0
- data/app/assets/javascripts/jqueryui/tabs.js +758 -0
- data/app/assets/javascripts/jqueryui/widget.js +262 -0
- data/app/assets/javascripts/libs/backbone.js +1152 -0
- data/app/assets/javascripts/libs/cookie.js +89 -0
- data/app/assets/javascripts/libs/fileinput.js +130 -0
- data/app/assets/javascripts/libs/jplayer.js +1768 -0
- data/app/assets/javascripts/libs/proper.js +541 -0
- data/app/assets/javascripts/libs/sanitize.js +282 -0
- data/app/assets/javascripts/libs/selecttolist.js +75 -0
- data/app/assets/javascripts/libs/underscore.js +807 -0
- data/app/assets/javascripts/libs/uploadify.js +677 -0
- data/app/assets/javascripts/libs/wymeditor.js +9538 -0
- data/app/assets/javascripts/transit.js +4 -0
- data/app/assets/javascripts/transit/admin.js +22 -0
- data/app/assets/javascripts/transit/admin/contexts.js +52 -0
- data/app/assets/javascripts/transit/admin/fields.js +36 -0
- data/app/assets/javascripts/transit/admin/upload.js +109 -0
- data/app/assets/javascripts/transit/config.js.erb +101 -0
- data/app/assets/javascripts/transit/contexts/audio.js +39 -0
- data/app/assets/javascripts/transit/contexts/video.js +79 -0
- data/app/assets/javascripts/transit/core.js +171 -0
- data/app/assets/javascripts/transit/frontend.js +3 -0
- data/app/assets/javascripts/transit/lib/base64.js +120 -0
- data/app/assets/javascripts/transit/lib/editor.js +177 -0
- data/app/assets/javascripts/transit/views/audio_player.jst +22 -0
- data/app/assets/javascripts/transit/views/editor_toolbar.jst +12 -0
- data/app/assets/javascripts/transit/views/file_upload.jst +5 -0
- data/app/assets/javascripts/transit/views/video_player.jst +20 -0
- data/app/assets/javascripts/transit/views/wym_box.jst +4 -0
- data/app/assets/javascripts/transit/views/wym_iframe.jst +3 -0
- data/app/assets/stylesheets/transit.css.scss.erb +42 -0
- data/app/assets/stylesheets/transit/forms.css.scss +66 -0
- data/app/assets/stylesheets/transit/media/audio.css.scss +65 -0
- data/app/assets/stylesheets/transit/media/video.css.scss +30 -0
- data/app/assets/stylesheets/transit/panel.css.scss +100 -0
- data/app/assets/stylesheets/transit/ui.css.scss +507 -0
- data/app/controllers/pages_controller.rb +3 -0
- data/app/controllers/posts_controller.rb +3 -0
- data/app/controllers/transit/assets_controller.rb +38 -0
- data/app/controllers/transit/contexts_controller.rb +12 -9
- data/app/controllers/transit/pages_controller.rb +26 -0
- data/app/controllers/transit/posts_controller.rb +31 -0
- data/app/controllers/transit/topics_controller.rb +5 -0
- data/app/controllers/transit_controller.rb +16 -0
- data/app/helpers/transit/admin_helper.rb +43 -0
- data/app/helpers/transit/form_helper.rb +17 -0
- data/app/helpers/transit/package_helper.rb +41 -0
- data/app/helpers/transit/pagination_helper.rb +58 -0
- data/app/helpers/transit_helper.rb +42 -0
- data/app/models/comment.rb +37 -0
- data/app/models/contexts/audio.rb +12 -0
- data/app/models/{text.rb → contexts/text.rb} +0 -0
- data/app/models/contexts/video.rb +24 -0
- data/app/models/topic.rb +19 -0
- data/app/models/transit/asset.rb +68 -0
- data/{lib → app/models}/transit/context.rb +29 -0
- data/app/views/contexts/_text.html.erb +1 -1
- data/app/views/posts/index.rss.builder +18 -0
- data/app/views/transit/assets/_file.html.erb +4 -0
- data/app/views/transit/assets/_image.html.erb +13 -0
- data/app/views/transit/assets/create.js.erb +8 -0
- data/app/views/transit/assets/destroy.js.erb +3 -0
- data/app/views/transit/assets/manage.html.erb +20 -0
- data/app/views/transit/contexts/_audio.html.erb +18 -0
- data/app/views/transit/contexts/_text.html.erb +6 -0
- data/app/views/transit/contexts/_video.html.erb +13 -0
- data/app/views/transit/contexts/destroy.js.erb +1 -0
- data/app/views/transit/contexts/index.html.erb +5 -0
- data/app/views/transit/contexts/new.js.erb +7 -0
- data/app/views/transit/contexts/show.html.erb +8 -0
- data/app/views/transit/index.html.erb +26 -0
- data/app/views/transit/index.js.erb +1 -0
- data/app/views/transit/interface/post_panel.html.erb +96 -0
- data/app/views/transit/pages/_table.html.erb +7 -0
- data/app/views/transit/pages/edit.html.erb +17 -0
- data/app/views/transit/pages/index.html.erb +17 -0
- data/app/views/transit/pages/update.js.erb +1 -0
- data/app/views/transit/posts/_form.html.erb +49 -0
- data/app/views/transit/posts/edit.html.erb +14 -0
- data/app/views/transit/posts/new.html.erb +21 -0
- data/app/views/transit/table.html.erb +13 -0
- data/app/views/transit/table.js.erb +8 -0
- data/app/views/transit/topics/manage.html.erb +28 -0
- data/config/locales/en.yml +22 -0
- data/config/routes.rb +3 -3
- data/lib/transit.rb +51 -17
- data/lib/transit/admin.rb +85 -0
- data/lib/transit/builders/form_builder.rb +319 -0
- data/lib/transit/builders/jst_builder.rb +38 -0
- data/lib/transit/builders/package_builder.rb +45 -0
- data/lib/transit/config.rb +20 -0
- data/lib/transit/controller/generator.rb +42 -0
- data/lib/transit/controller/responder.rb +34 -0
- data/lib/transit/core_ext.rb +18 -0
- data/lib/transit/errors/resource_not_found.rb +6 -0
- data/lib/transit/model/assets.rb +14 -0
- data/lib/transit/model/attachments.rb +55 -0
- data/lib/transit/model/auto_increment.rb +22 -0
- data/lib/transit/model/base.rb +56 -0
- data/lib/transit/model/comments.rb +19 -0
- data/lib/transit/model/hooks.rb +38 -0
- data/lib/transit/model/owners.rb +14 -0
- data/lib/transit/model/paginator.rb +92 -0
- data/lib/transit/model/topics.rb +14 -0
- data/lib/transit/package/page.rb +20 -12
- data/lib/transit/package/post.rb +87 -33
- data/lib/transit/package/post/validations.rb +14 -0
- data/lib/transit/rails/engine.rb +29 -13
- data/lib/transit/rails/railtie.rb +31 -0
- data/lib/transit/rails/routing.rb +11 -6
- data/lib/transit/services.rb +13 -0
- data/lib/transit/services/base.rb +14 -0
- data/lib/transit/services/facebook.rb +13 -0
- data/lib/transit/services/ted.rb +10 -0
- data/lib/transit/services/twitter.rb +13 -0
- data/lib/transit/services/vimeo.rb +10 -0
- data/lib/transit/services/you_tube.rb +12 -0
- data/lib/transit/version.rb +1 -1
- metadata +178 -31
- data/app/assets/stylesheets/includes/_compat.scss +0 -24
- data/app/assets/stylesheets/includes/_defaults.scss +0 -99
- data/app/assets/stylesheets/includes/_global.scss +0 -16
- data/app/assets/stylesheets/includes/_imports.scss +0 -27
- data/app/assets/stylesheets/includes/_mixins.scss +0 -38
- data/app/assets/stylesheets/includes/_setup.scss +0 -85
- data/app/assets/stylesheets/layout.css.scss +0 -29
- data/app/assets/stylesheets/transit.css +0 -3
- data/app/controllers/application_controller.rb +0 -5
- data/app/controllers/transit/index_controller.rb +0 -7
- data/app/controllers/transit/packages_controller.rb +0 -64
- data/app/controllers/transit/transit_controller.rb +0 -4
- data/app/helpers/routing_helpers.rb +0 -7
- data/app/models/audio.rb +0 -4
- data/app/models/package_asset.rb +0 -11
- data/app/models/video.rb +0 -8
- data/app/views/contexts/_audio.html.erb +0 -1
- data/app/views/contexts/_video.html.erb +0 -1
- data/app/views/layouts/transit.html.erb +0 -31
- data/app/views/transit/index/index.html.erb +0 -0
- data/lib/transit/helpers/controller_helpers.rb +0 -40
- data/lib/transit/helpers/model_helpers.rb +0 -26
- data/lib/transit/package.rb +0 -25
- data/lib/transit/package/base.rb +0 -49
@@ -0,0 +1,38 @@
|
|
1
|
+
require 'mime/types'
|
2
|
+
class Transit::AssetsController < TransitController
|
3
|
+
|
4
|
+
before_filter :update_params, :only => [:create, :update]
|
5
|
+
respond_to :js, :json, :html
|
6
|
+
skip_before_filter :verify_authenticity_token
|
7
|
+
|
8
|
+
def create
|
9
|
+
@asset = Transit::Asset.new(params[:asset])
|
10
|
+
@parent = params[:resource_type].constantize.find(params[:resource_id])
|
11
|
+
@asset.assetable = @parent
|
12
|
+
@asset.save
|
13
|
+
flash[:success] = "Upload successful!"
|
14
|
+
respond_with(@asset)
|
15
|
+
end
|
16
|
+
|
17
|
+
def show
|
18
|
+
@asset = Transit::Asset.find(params[:id])
|
19
|
+
end
|
20
|
+
|
21
|
+
def update
|
22
|
+
|
23
|
+
end
|
24
|
+
|
25
|
+
def destroy
|
26
|
+
@asset = Transit::Asset.find(params[:id])
|
27
|
+
@asset.destroy
|
28
|
+
respond_with(@asset)
|
29
|
+
end
|
30
|
+
|
31
|
+
private
|
32
|
+
|
33
|
+
def update_params
|
34
|
+
return true unless params[:asset][:file]
|
35
|
+
params[:asset][:file].content_type = ::MIME::Types.type_for(params[:asset][:file].original_filename).first.to_s
|
36
|
+
end
|
37
|
+
|
38
|
+
end
|
@@ -1,20 +1,23 @@
|
|
1
|
-
class Transit::ContextsController <
|
2
|
-
|
3
|
-
unloadable
|
1
|
+
class Transit::ContextsController < TransitController
|
2
|
+
|
4
3
|
respond_to :js
|
4
|
+
belongs_to :post, :page, polymorphic: true
|
5
|
+
actions :new, :destroy
|
5
6
|
|
6
7
|
def new
|
7
|
-
|
8
|
-
|
8
|
+
ptype = symbols_for_association_chain.first.to_s
|
9
|
+
parent_obj = ptype.classify.constantize.find(params["#{ptype}_id"])
|
10
|
+
set_resource_ivar(parent_obj)
|
11
|
+
@context = parent_obj.contexts.build({}, params[:type].classify.constantize)
|
9
12
|
respond_with(@context)
|
10
13
|
end
|
11
14
|
|
15
|
+
|
12
16
|
def destroy
|
13
|
-
|
14
|
-
@context
|
15
|
-
@field.destroy
|
17
|
+
parent.contexts.find(params[:id])
|
18
|
+
@context.destroy
|
16
19
|
flash[:success] = "The selected field has been removed."
|
17
|
-
respond_with(@
|
20
|
+
respond_with(@context)
|
18
21
|
end
|
19
22
|
|
20
23
|
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
class Transit::PagesController < TransitController
|
2
|
+
respond_to :html, :js, :json
|
3
|
+
|
4
|
+
def index
|
5
|
+
@pages = scope_class.descending(:post_date).page((params[:page] || 1))
|
6
|
+
respond_with(@pages) do |format|
|
7
|
+
format.js{ render :partial => 'table' }
|
8
|
+
format.any
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
def edit
|
13
|
+
@page = scope_class.find(params[:id])
|
14
|
+
respond_with(@page)
|
15
|
+
end
|
16
|
+
|
17
|
+
def update
|
18
|
+
@page = scope_class.find(params[:id])
|
19
|
+
unless @page.update_attributes(params[:page])
|
20
|
+
flash.now[:error] = "Looks like you were missing a few fields!"
|
21
|
+
render :action => :edit and return
|
22
|
+
end
|
23
|
+
respond_with(@post, :location => edit_polymorphic_path(@page), :success => "The page '#{@page.name}' has been updated.")
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
class Transit::PostsController < TransitController
|
2
|
+
defaults collection_name: 'posts', instance_name: 'post'
|
3
|
+
|
4
|
+
respond_to :html, :js, :json
|
5
|
+
|
6
|
+
def collection
|
7
|
+
@posts ||= end_of_association_chain.page((params[:page] || 1), per: 20)
|
8
|
+
end
|
9
|
+
|
10
|
+
def create
|
11
|
+
@post = resource_class.new(params[:post])
|
12
|
+
set_resource_ivar(@post)
|
13
|
+
unless @post.save
|
14
|
+
render action: 'new', error: 'Oops, looks like you forgot something!' and return
|
15
|
+
end
|
16
|
+
redirect_to transit.edit_polymorphic_path(resource), success: 'Your post was created!'
|
17
|
+
end
|
18
|
+
|
19
|
+
def update
|
20
|
+
@post = Post.find(params[:id])
|
21
|
+
unless @post.update_attributes(params[:post])
|
22
|
+
render action: :edit, error: 'Looks like you forgot a couple fields' and return
|
23
|
+
end
|
24
|
+
redirect_to transit.edit_polymorphic_path(@post), success: 'Your post was updated.'
|
25
|
+
end
|
26
|
+
|
27
|
+
def destroy
|
28
|
+
destroy!(success: 'The selected post has been deleted.')
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
class TransitController < InheritedResources::Base
|
2
|
+
|
3
|
+
helper_method :edit_mode_enabled?
|
4
|
+
respond_to :html, :js
|
5
|
+
before_filter :authenticate_admin!
|
6
|
+
|
7
|
+
def edit_mode_enabled?
|
8
|
+
true
|
9
|
+
end
|
10
|
+
|
11
|
+
def render(*args)
|
12
|
+
args.first[:layout] = false if request.xhr? and args.first[:layout].nil?
|
13
|
+
super
|
14
|
+
end
|
15
|
+
|
16
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
module Transit::AdminHelper
|
2
|
+
unloadable
|
3
|
+
|
4
|
+
def context_field_item(field, form)
|
5
|
+
idfield = field.new_record? ? "" : form.hidden_field(:id)
|
6
|
+
content_tag(:li, { id:"context_#{field.id.to_s}", class: "field field_#{field.class.to_s.underscore}" }) do
|
7
|
+
form.hidden_field(:_type, value: field.class.to_s) <<
|
8
|
+
form.hidden_field(:position, rel: 'field_position') <<
|
9
|
+
idfield <<
|
10
|
+
render(partial: "transit/contexts/#{field.class.to_s.underscore}", locals: { form: form, context: field })
|
11
|
+
end.html_safe
|
12
|
+
end
|
13
|
+
|
14
|
+
def transit_toolbar(model, &block)
|
15
|
+
content_tag(:div, capture(&block), { class: 'ui-widget-header ui-state-default', id: 'transit_toolbar' })
|
16
|
+
end
|
17
|
+
|
18
|
+
def toolbar_button(text, url, attrs)
|
19
|
+
klasses = attrs[:class].to_s.split(" ").push('transit_toolbar_button')
|
20
|
+
if attrs[:icon].present?
|
21
|
+
(attrs[:data] ||= {}).merge!("ui-icon" => "ui-icon-#{attrs.delete(:icon)}")
|
22
|
+
end
|
23
|
+
link_to text.html_safe, url, attrs.merge(class: klasses.join(" "))
|
24
|
+
end
|
25
|
+
|
26
|
+
def file_icon_class(asset)
|
27
|
+
ext = File.extname(asset.file_file_name.to_s.downcase).gsub('.', '')
|
28
|
+
extnames = {
|
29
|
+
'powerpoint' => ['ppt','pptx','key'],
|
30
|
+
'audio' => ['mp3', 'wav'],
|
31
|
+
'video' => ['mp4', 'wmv', 'mov', 'mpeg'],
|
32
|
+
'flash' => ['swf', 'flv', 'fla'],
|
33
|
+
'pdf' => ['pdf'],
|
34
|
+
'word' => ['doc', 'docx', 'pages'],
|
35
|
+
'excel' => ['xls', 'csv', 'xlsx', 'numbers'],
|
36
|
+
'image' => ['tiff', 'tif', 'bmp', 'jpeg', 'jpg', 'png', 'gif'],
|
37
|
+
'vector' => ['ai', 'eps']
|
38
|
+
}
|
39
|
+
choice = 'file'
|
40
|
+
extnames.each_pair{ |key, value| choice = key if value.include?(ext) }
|
41
|
+
"file_icon_#{choice}"
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module Transit
|
2
|
+
module FormHelper
|
3
|
+
unloadable
|
4
|
+
|
5
|
+
def form_for(record_name_or_array, *args, &proc)
|
6
|
+
|
7
|
+
options = args.extract_options!
|
8
|
+
options.reverse_merge!(:builder => Transit::Builders::FormBuilder)
|
9
|
+
options[:html] ||= {}
|
10
|
+
options[:html].merge!('data-js-validatable' => true) if options.delete(:validate)
|
11
|
+
|
12
|
+
super(record_name_or_array, *(args << options), &proc)
|
13
|
+
|
14
|
+
end
|
15
|
+
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
module Transit
|
2
|
+
module PackageHelper
|
3
|
+
unloadable
|
4
|
+
|
5
|
+
def deliver_content(resource, force_edit = false, &block)
|
6
|
+
return capture(resource, &block).html_safe unless force_edit || edit_mode_enabled?
|
7
|
+
tpl = resource.delivery_template
|
8
|
+
with_output_buffer do
|
9
|
+
concat(form_for([transit, resource], as: tpl, html: { remote: true, id: "transit_edit_#{tpl.to_s}" }) do |dform|
|
10
|
+
concat(capture(Transit::Builders::PackageBuilder.new(resource, dform, nil), &block))
|
11
|
+
end)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
def deliver(obj)
|
16
|
+
if obj.respond_to?(:deliver)
|
17
|
+
return obj.deliver
|
18
|
+
end
|
19
|
+
obj.contexts.ascending(:position).map do |field|
|
20
|
+
unless field.media_context?
|
21
|
+
render(:partial => "contexts/#{field.class.to_s.underscore}", :format => :html, :locals => { :context => field }).html_safe
|
22
|
+
else
|
23
|
+
deliver_media_context(field, field.to_backbone)
|
24
|
+
end
|
25
|
+
end.join("\n").html_safe
|
26
|
+
end
|
27
|
+
|
28
|
+
def deliver_rss(post)
|
29
|
+
send(:"#{post.class.name.to_s.underscore}_path", post.slug)
|
30
|
+
end
|
31
|
+
|
32
|
+
private
|
33
|
+
|
34
|
+
def deliver_media_context(context, attrs = {})
|
35
|
+
type = context.class.name.underscore
|
36
|
+
attrs = { transit_context: type, context_attributes: attrs }
|
37
|
+
content_tag(:div, "", { id: "#{type}_context_#{context.id}", data: attrs, class: "#{type}_player" })
|
38
|
+
end
|
39
|
+
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,58 @@
|
|
1
|
+
module Transit
|
2
|
+
module PaginationHelper
|
3
|
+
unloadable
|
4
|
+
|
5
|
+
def paginate(collection, html_attrs = {})
|
6
|
+
return "" if collection.total_count <= 0
|
7
|
+
|
8
|
+
total_pages = collection.total_pages
|
9
|
+
current_page = collection.current_page
|
10
|
+
html_classes = (html_attrs.delete(:class) || "").split(" ")
|
11
|
+
window_min = [(current_page - 5), 1].max
|
12
|
+
window_max = [(current_page + 5), total_pages].min
|
13
|
+
page_links = []
|
14
|
+
|
15
|
+
html_attrs.merge!('class' => html_classes.push('pagination_link').uniq.join(" "))
|
16
|
+
|
17
|
+
(window_min..window_max).to_a.each do |page|
|
18
|
+
unless page == current_page
|
19
|
+
page_links << pagination_link(page, html_attrs)
|
20
|
+
else
|
21
|
+
page_links << content_tag(:span, page, class: 'current').to_s
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
unless current_page == 1
|
26
|
+
page_links.unshift pagination_link_previous(current_page - 1, html_attrs).html_safe
|
27
|
+
end
|
28
|
+
unless current_page == total_pages
|
29
|
+
page_links << pagination_link_next(current_page + 1, total_pages, html_attrs).html_safe
|
30
|
+
end
|
31
|
+
|
32
|
+
content_tag(:p, class: 'pagination') do
|
33
|
+
content_tag(:span, "Viewing page #{current_page} of #{total_pages}", class: 'pagination_detail') <<
|
34
|
+
content_tag(:span, page_links.join(" ").html_safe, class: 'pagination_links')
|
35
|
+
end.html_safe
|
36
|
+
|
37
|
+
end
|
38
|
+
|
39
|
+
private
|
40
|
+
|
41
|
+
def pagination_link_previous(prev_page, attrs)
|
42
|
+
pagination_link(1, attrs, "⇐") <<
|
43
|
+
pagination_link(prev_page, attrs, "«")
|
44
|
+
end
|
45
|
+
|
46
|
+
def pagination_link_next(next_page, last_page, attrs)
|
47
|
+
pagination_link(next_page, attrs, "»") <<
|
48
|
+
pagination_link(last_page, attrs, "⇒")
|
49
|
+
end
|
50
|
+
|
51
|
+
def pagination_link(page, attrs, text = nil)
|
52
|
+
text ||= page
|
53
|
+
qstring = CGI.parse(request.query_string).merge('page' => page )
|
54
|
+
link_to(text.to_s.html_safe, "?#{qstring.to_query}", attrs).html_safe.to_s
|
55
|
+
end
|
56
|
+
|
57
|
+
end
|
58
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
module TransitHelper
|
2
|
+
unloadable
|
3
|
+
|
4
|
+
include Transit::PackageHelper
|
5
|
+
include Transit::PaginationHelper
|
6
|
+
include Transit::FormHelper
|
7
|
+
|
8
|
+
def transit_assets
|
9
|
+
return '' unless controller.class.name.match(/Transit/)
|
10
|
+
stylesheet_link_tag('transit') <<
|
11
|
+
javascript_include_tag('https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.13/jquery-ui.min.js') <<
|
12
|
+
javascript_include_tag('transit/admin')
|
13
|
+
end
|
14
|
+
|
15
|
+
def video_player(source, html_attrs = {})
|
16
|
+
attrs = {
|
17
|
+
id: "video_player_#{Time.now.to_i}",
|
18
|
+
class: 'video_player'
|
19
|
+
}
|
20
|
+
wrapper = html_attrs.delete(:wrapper) || :div
|
21
|
+
data_attrs = { source: source, ext: File.extname(source).sub('.','') };
|
22
|
+
|
23
|
+
if img = html_attrs.delete(:image)
|
24
|
+
data_attrs.merge!(image: img)
|
25
|
+
end
|
26
|
+
|
27
|
+
html_attrs.reverse_merge!( attrs.merge!(data: { context_attributes: Base64.encode64s(data_attrs.to_json) } ))
|
28
|
+
content_tag(wrapper, "", html_attrs)
|
29
|
+
end
|
30
|
+
|
31
|
+
def audio_player(source, html_attrs = {})
|
32
|
+
attrs = {
|
33
|
+
id: "audio_player_#{Time.now.to_i}",
|
34
|
+
class: 'audio_player'
|
35
|
+
}
|
36
|
+
wrapper = html_attrs.delete(:wrapper) || :div
|
37
|
+
data_attrs = { source: source }
|
38
|
+
html_attrs.reverse_merge!( attrs.merge!(data: { context_attributes: Base64.encode64s(data_attrs.to_json) }) )
|
39
|
+
content_tag(wrapper, "", html_attrs)
|
40
|
+
end
|
41
|
+
|
42
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
class Comment
|
2
|
+
include Mongoid::Document
|
3
|
+
include Mongoid::Timestamps
|
4
|
+
|
5
|
+
field :body, :type => String
|
6
|
+
|
7
|
+
belongs_to :commentable, :polymorphic => true
|
8
|
+
belongs_to :user
|
9
|
+
|
10
|
+
validates :body, :presence => { :allow_blank => false, :message => 'required' }
|
11
|
+
after_create :update_comment_count
|
12
|
+
after_destroy :cleanup_comment_count
|
13
|
+
delegate :username, :to => :user
|
14
|
+
|
15
|
+
# Stringify the created_at date.
|
16
|
+
def timestamp
|
17
|
+
self.created_at.in_time_zone("Eastern Time (US & Canada)").strftime("%m/%d/%Y at %I:%M %P")
|
18
|
+
end
|
19
|
+
|
20
|
+
private
|
21
|
+
|
22
|
+
##
|
23
|
+
# When created increment a comment_count field on the parent
|
24
|
+
# to avoid parent.comments.count calls and the db overhead.
|
25
|
+
#
|
26
|
+
def update_comment_count
|
27
|
+
self.commentable.inc(:comment_count, 1)
|
28
|
+
end
|
29
|
+
|
30
|
+
##
|
31
|
+
# Inverse of update_comment_count to ensure comment counts are updated on delete/destroy
|
32
|
+
#
|
33
|
+
def cleanup_comment_count
|
34
|
+
self.commentable.update_attribute(:comment_count, (self.commentable.comment_count - 1))
|
35
|
+
end
|
36
|
+
|
37
|
+
end
|
File without changes
|
@@ -0,0 +1,24 @@
|
|
1
|
+
class Video < Transit::Context
|
2
|
+
alias_attribute :source, :body
|
3
|
+
|
4
|
+
def self.sources
|
5
|
+
['URL', 'Uploaded Video', 'YouTube', 'Vimeo', 'Ted'].collect{ |src| [src, src.underscore ] }
|
6
|
+
end
|
7
|
+
|
8
|
+
def video_type=(t)
|
9
|
+
self.meta['video_type'] = t
|
10
|
+
end
|
11
|
+
|
12
|
+
def video_type
|
13
|
+
self.meta['video_type']
|
14
|
+
end
|
15
|
+
|
16
|
+
def media_context?
|
17
|
+
true
|
18
|
+
end
|
19
|
+
|
20
|
+
def to_js( attrs = {} )
|
21
|
+
super({ source: source, type: video_type, ext: file_ext }.reverse_merge!(attrs))
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|