solidus_slider 1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +12 -0
- data/.rspec +1 -0
- data/.rvmrc +1 -0
- data/Gemfile +26 -0
- data/LICENSE +26 -0
- data/README.md +61 -0
- data/README.textile +71 -0
- data/Rakefile +21 -0
- data/Versionfile +5 -0
- data/app/assets/javascripts/spree/backend/slide_location_picker.js +53 -0
- data/app/assets/javascripts/spree/backend/solidus_slider.js +1 -0
- data/app/controllers/spree/admin/slide_locations_controller.rb +19 -0
- data/app/controllers/spree/admin/slides_controller.rb +57 -0
- data/app/models/spree/product_decorator.rb +8 -0
- data/app/models/spree/slide.rb +49 -0
- data/app/models/spree/slide_location.rb +8 -0
- data/app/models/spree/slide_slide_location.rb +8 -0
- data/app/overrides/spree/admin/configurations/index/add_slides_to_admin_configurations_menu.html.erb.deface +11 -0
- data/app/overrides/spree/admin/shared/_configuration_menu/add_slide_locations_to_admin_configurations_sidebar_menu.html.erb.deface +3 -0
- data/app/overrides/spree/admin/shared/_configuration_menu/add_slides_to_admin_configurations_sidebar_menu.html.erb.deface +3 -0
- data/app/overrides/spree/home/index/add_slider.html.erb.deface +5 -0
- data/app/overrides/spree/shared/_header/add_slider.html.erb.deface +3 -0
- data/app/views/spree/admin/slide_locations/_form.html.erb +10 -0
- data/app/views/spree/admin/slide_locations/edit.html.erb +18 -0
- data/app/views/spree/admin/slide_locations/index.html.erb +40 -0
- data/app/views/spree/admin/slide_locations/new.html.erb +16 -0
- data/app/views/spree/admin/slide_locations/search.json.jbuilder +4 -0
- data/app/views/spree/admin/slides/_form.html.erb +70 -0
- data/app/views/spree/admin/slides/edit.html.erb +23 -0
- data/app/views/spree/admin/slides/index.html.erb +50 -0
- data/app/views/spree/admin/slides/new.html.erb +18 -0
- data/app/views/spree/admin/slides/show.html.erb +54 -0
- data/app/views/spree/shared/_slider.html.erb +19 -0
- data/bin/rails +7 -0
- data/config/locales/de.yml +27 -0
- data/config/locales/en.yml +28 -0
- data/config/locales/es-MX.yml +33 -0
- data/config/locales/es.yml +27 -0
- data/config/locales/nl-NL.yml +27 -0
- data/config/locales/nl.yml +27 -0
- data/config/locales/pl.yml +29 -0
- data/config/locales/pt-BR.yml +36 -0
- data/config/locales/ru.yml +27 -0
- data/config/routes.rb +15 -0
- data/db/migrate/20120222184238_create_slides.rb +16 -0
- data/db/migrate/20120816192758_add_position_to_slides.rb +5 -0
- data/db/migrate/20121219124126_add_product_id_to_slides.rb +5 -0
- data/db/migrate/20150611113500_create_slider_location.rb +8 -0
- data/db/migrate/20160214061128_add_show_caption_to_slides.rb +5 -0
- data/db/migrate/20180113010348_create_spree_slide_slide_locations_table.rb +10 -0
- data/lib/generators/solidus_slider/install/install_generator.rb +24 -0
- data/lib/generators/solidus_slider/install_anything_generator.rb +31 -0
- data/lib/generators/solidus_slider/install_nivo_generator.rb +34 -0
- data/lib/generators/solidus_slider/install_simple_carousel_generator.rb +30 -0
- data/lib/generators/solidus_slider/templates/anything_slider.html.erb +23 -0
- data/lib/generators/solidus_slider/templates/nivo_slider.html.erb +37 -0
- data/lib/generators/solidus_slider/templates/simple_carousel_slider.html.erb +15 -0
- data/lib/solidus_slider.rb +4 -0
- data/lib/solidus_slider/engine.rb +22 -0
- data/lib/solidus_slider/version.rb +3 -0
- data/solidus_slider.gemspec +55 -0
- data/spec/spec_helper.rb +21 -0
- metadata +550 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: a29e78813609835968e64926fdd5b8b18ff1b9da3401164ee993099102b6b388
|
4
|
+
data.tar.gz: da93d1d4cd78f32fb289deb661f06c127b08ab50c04e7a6464be1d4681c68f4a
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 3b0495003b00da2b21981ac49f8494f4d8564645b2d4fe384325abf822b5d13119182781cf267e1e82192d94375f20de97adc1069cb0d93712f71903e2ca42d2
|
7
|
+
data.tar.gz: 88c3c7bbbb747cddaaad8529ae9ed4cf53681caa12fd7c2b60edfda8fe789872546ee4e4c31c2b01d3ebd41f4fde1b52009b7e280b9db5371b7bb0f724842474
|
data/.gitignore
ADDED
data/.rspec
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
--colour
|
data/.rvmrc
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
rvm 2.2.3
|
data/Gemfile
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
source 'https://rubygems.org'
|
2
|
+
|
3
|
+
branch = ENV.fetch('SOLIDUS_BRANCH', 'master')
|
4
|
+
gem 'solidus', github: 'solidusio/solidus', branch: branch
|
5
|
+
gem 'solidus_i18n', github: 'solidusio-contrib/solidus_i18n', branch: branch
|
6
|
+
gem 'globalize', github: 'globalize/globalize', branch: branch
|
7
|
+
|
8
|
+
if branch == 'master' || branch >= 'v2.3'
|
9
|
+
gem 'rails', '~> 5.1.0'
|
10
|
+
elsif branch >= 'v2.0'
|
11
|
+
gem 'rails', '~> 5.0.0'
|
12
|
+
gem 'rails-controller-testing', group: :test
|
13
|
+
else
|
14
|
+
gem 'rails', '~> 4.2.0'
|
15
|
+
gem 'rails_test_params_backport', group: :test
|
16
|
+
end
|
17
|
+
|
18
|
+
gem 'pg'
|
19
|
+
gem 'sqlite3'
|
20
|
+
gem 'mysql2'
|
21
|
+
|
22
|
+
group :development, :test do
|
23
|
+
gem 'i18n-tasks', '~> 0.9' if branch == 'master'
|
24
|
+
end
|
25
|
+
|
26
|
+
gemspec
|
data/LICENSE
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
Copyright (c) 2012 R.S.A.
|
2
|
+
All rights reserved.
|
3
|
+
|
4
|
+
Redistribution and use in source and binary forms, with or without modification,
|
5
|
+
are permitted provided that the following conditions are met:
|
6
|
+
|
7
|
+
* Redistributions of source code must retain the above copyright notice,
|
8
|
+
this list of conditions and the following disclaimer.
|
9
|
+
* Redistributions in binary form must reproduce the above copyright notice,
|
10
|
+
this list of conditions and the following disclaimer in the documentation
|
11
|
+
and/or other materials provided with the distribution.
|
12
|
+
* Neither the name Spree nor the names of its contributors may be used to
|
13
|
+
endorse or promote products derived from this software without specific
|
14
|
+
prior written permission.
|
15
|
+
|
16
|
+
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
17
|
+
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
18
|
+
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
19
|
+
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
|
20
|
+
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
21
|
+
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
22
|
+
PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
23
|
+
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
24
|
+
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
25
|
+
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
26
|
+
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
data/README.md
ADDED
@@ -0,0 +1,61 @@
|
|
1
|
+
# SolidusSlider
|
2
|
+
|
3
|
+
Add a slider to the homepage of your Spree-Solidus site, and manage the slide show from within the Admin panel.
|
4
|
+
|
5
|
+
## Installation
|
6
|
+
|
7
|
+
To install, add solidus_slider to your @Gemfile@ and run `bundle install`:
|
8
|
+
|
9
|
+
```
|
10
|
+
gem 'solidus_slider', github: 'samanmohamadi/solidus_slider'
|
11
|
+
```
|
12
|
+
|
13
|
+
Then install and run the migrations to add the tables:
|
14
|
+
```
|
15
|
+
bundle exec rails g solidus_slider:install
|
16
|
+
|
17
|
+
```
|
18
|
+
|
19
|
+
### Using the slider
|
20
|
+
|
21
|
+
Spree 3 uses the bootstrap framework and a default slider template is available for bootstrap 3
|
22
|
+
`spree/shared/_slider.html.erb`.
|
23
|
+
|
24
|
+
Example usage:
|
25
|
+
|
26
|
+
```erb
|
27
|
+
<%= render partial: 'spree/shared/slider', locals: { slider: Spree::Slide.published, cid: 'home' } %>
|
28
|
+
```
|
29
|
+
|
30
|
+
If you desire to have a customized carousel template you can specify your own like so:
|
31
|
+
|
32
|
+
```erb
|
33
|
+
<% if Spree::Slide.published.count > 0 %>
|
34
|
+
<section id="slideshow">
|
35
|
+
<ul class="slide">
|
36
|
+
<% Spree::Slide.published.order('position ASC').each do |s| %>
|
37
|
+
<li>
|
38
|
+
<h1><%= s.slide_caption %></h1>
|
39
|
+
<%= link_to image_tag(s.slide_image.url), url_for(s.link_url) %>
|
40
|
+
</li>
|
41
|
+
<% end %>
|
42
|
+
</ul>
|
43
|
+
<a title="<%= t(:previous) %>" class="slider-prev"><%= t(:previous)%></a>
|
44
|
+
<a title="<%= t(:next) %>" class="slider-next"><%= t(:next) %></a>
|
45
|
+
</section>
|
46
|
+
<% end %>
|
47
|
+
```
|
48
|
+
|
49
|
+
## Dynamic content management
|
50
|
+
|
51
|
+
To add dynamic content, go to the spree admin section, under 'Configuration'
|
52
|
+
and find the Solidus Slider & Solidus Slider Locations menu.
|
53
|
+
|
54
|
+
You can create new slides and new locations. Then to fetch & render the slider for a particular location you can do the following:
|
55
|
+
|
56
|
+
```erb
|
57
|
+
<% slides = Spree::Slide.published.location("home") %>
|
58
|
+
<%= render partial: 'spree/shared/slider', locals: { slider: slides } %>
|
59
|
+
```
|
60
|
+
|
61
|
+
Copyright (c) 2012 [R.S.A.](http://www.rsaweb.com) released under the New BSD License
|
data/README.textile
ADDED
@@ -0,0 +1,71 @@
|
|
1
|
+
h1. SoldiusSlider
|
2
|
+
|
3
|
+
Add a slider to the homepage of your Spree site, and manage the slideshow from within the Admin panel.
|
4
|
+
|
5
|
+
h2. Installation
|
6
|
+
|
7
|
+
To install, add solidus_slider to your @Gemfile@ and run `bundle install`:
|
8
|
+
|
9
|
+
```ruby
|
10
|
+
gem 'solidus_slider', github: 'jtapia/solidus_slider'
|
11
|
+
```
|
12
|
+
|
13
|
+
Then install and run the migrations to add the tables:
|
14
|
+
```ruby
|
15
|
+
bundle exec rake railties:install:migrations
|
16
|
+
bundle exec rake db:migrate
|
17
|
+
```
|
18
|
+
|
19
|
+
This extension comes with three sliders plugins: Nivo, SimpleCarousel and Anything slider
|
20
|
+
Depending on which plugin you want to install, run the following command:
|
21
|
+
|
22
|
+
h3. Anything slider
|
23
|
+
|
24
|
+
```ruby
|
25
|
+
rails generate solidus_slider:install_anything
|
26
|
+
```
|
27
|
+
|
28
|
+
h3. SimpleCarousel slider
|
29
|
+
|
30
|
+
```ruby
|
31
|
+
rails generate solidus_slider:install_simple_carousel
|
32
|
+
```
|
33
|
+
|
34
|
+
h3. Nivo slider
|
35
|
+
|
36
|
+
```ruby
|
37
|
+
rails generate solidus_slider:install_nivo
|
38
|
+
```
|
39
|
+
|
40
|
+
The slider is almost unstyled. To customize you have to add your own css and
|
41
|
+
eventually modify the partial copied into your app folder:
|
42
|
+
app/views/spree/shared/_slider.html.erb
|
43
|
+
|
44
|
+
h3. Or Roll your own!
|
45
|
+
|
46
|
+
You may want to theme your site your own way. If you want to include your own library such Bootstrap or Foundation.
|
47
|
+
Just add your own to your asset pipeline, and update your theme templates with appropriate markup. Example:
|
48
|
+
|
49
|
+
```ruby
|
50
|
+
<% if Spree::Slide.published.count > 0 %>
|
51
|
+
<section id="slideshow">
|
52
|
+
<ul class="slide">
|
53
|
+
<% Spree::Slide.published.order('position ASC').each do |s| %>
|
54
|
+
<li>
|
55
|
+
<h1><%= s.slide_name %></h1>
|
56
|
+
<%= link_to image_tag(s.slide_image.url), url_for(s.slide_link) %>
|
57
|
+
</li>
|
58
|
+
<% end %>
|
59
|
+
</ul>
|
60
|
+
<a title="<%= Spree.t(:previous) %>" class="slider-prev"><%= Spree.t(:previous)%></a>
|
61
|
+
<a title="<%= Spree.t(:next) %>" class="slider-next"><%= Spree.t(:next) %></a>
|
62
|
+
</section>
|
63
|
+
<% end %>
|
64
|
+
```
|
65
|
+
|
66
|
+
h2. Dynamic content management
|
67
|
+
|
68
|
+
To add dynamic content, go to the spree admin section, under 'Configuration'
|
69
|
+
and find the Spree Slider menu.
|
70
|
+
|
71
|
+
Copyright (c) 2012 "R.S.A.":http://www.rsaweb.com released under the New BSD License
|
data/Rakefile
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
require 'bundler'
|
2
|
+
Bundler::GemHelper.install_tasks
|
3
|
+
|
4
|
+
require 'rspec/core/rake_task'
|
5
|
+
require 'spree/testing_support/extension_rake'
|
6
|
+
|
7
|
+
RSpec::Core::RakeTask.new
|
8
|
+
|
9
|
+
task :default do
|
10
|
+
if Dir["spec/dummy"].empty?
|
11
|
+
Rake::Task[:test_app].invoke
|
12
|
+
Dir.chdir("../../")
|
13
|
+
end
|
14
|
+
Rake::Task[:spec].invoke
|
15
|
+
end
|
16
|
+
|
17
|
+
desc 'Generates a dummy app for testing'
|
18
|
+
task :test_app do
|
19
|
+
ENV['LIB_NAME'] = 'solidus_slider'
|
20
|
+
Rake::Task['extension:test_app'].invoke
|
21
|
+
end
|
data/Versionfile
ADDED
@@ -0,0 +1,5 @@
|
|
1
|
+
"1.0.x" => { :ref => "2c31ead09bf6a62e7a0700a5d831c7933d63edd5" }
|
2
|
+
"1.1.x" => { :ref => "4f2c9e74e47e26b4f1fe67a59288d2cd45ccd13b" }
|
3
|
+
"1.2.x" => { :ref => "4f2c9e74e47e26b4f1fe67a59288d2cd45ccd13b" }
|
4
|
+
"2.0.x" => { :ref => "4d77dec367c1e8320fe0151aa0100814163c8217" }
|
5
|
+
"3.0.x" => { :branch => "master" }
|
@@ -0,0 +1,53 @@
|
|
1
|
+
Spree.routes.admin_slide_locations_search = Spree.pathFor('admin/slide_locations/search');
|
2
|
+
|
3
|
+
$.fn.slideLocationAutocomplete = function (options) {
|
4
|
+
'use strict';
|
5
|
+
|
6
|
+
// Default options
|
7
|
+
options = options || {}
|
8
|
+
var multiple = typeof(options['multiple']) !== 'undefined' ? options['multiple'] : true
|
9
|
+
|
10
|
+
function formatSlideLocation(slide_location) {
|
11
|
+
return Select2.util.escapeMarkup(slide_location.name);
|
12
|
+
}
|
13
|
+
|
14
|
+
this.select2({
|
15
|
+
minimumInputLength: 3,
|
16
|
+
multiple: multiple,
|
17
|
+
initSelection: function (element, callback) {
|
18
|
+
$.get(Spree.routes.admin_slide_locations_search, {
|
19
|
+
ids: element.val().split(','),
|
20
|
+
token: Spree.api_key
|
21
|
+
}, function (data) {
|
22
|
+
callback(multiple ? data.slide_locations : data.slide_locations[0]);
|
23
|
+
});
|
24
|
+
},
|
25
|
+
ajax: {
|
26
|
+
url: Spree.routes.admin_slide_locations_search,
|
27
|
+
datatype: 'json',
|
28
|
+
params: { "headers": { "X-Spree-Token": Spree.api_key } },
|
29
|
+
data: function (term, page) {
|
30
|
+
return {
|
31
|
+
q: {
|
32
|
+
name_cont: term
|
33
|
+
},
|
34
|
+
token: Spree.api_key,
|
35
|
+
page: page
|
36
|
+
};
|
37
|
+
},
|
38
|
+
results: function (data, page) {
|
39
|
+
var slide_locations = data.slide_locations ? data.slide_locations : [];
|
40
|
+
|
41
|
+
return {
|
42
|
+
results: slide_locations
|
43
|
+
};
|
44
|
+
}
|
45
|
+
},
|
46
|
+
formatResult: formatSlideLocation,
|
47
|
+
formatSelection: formatSlideLocation
|
48
|
+
});
|
49
|
+
};
|
50
|
+
|
51
|
+
Spree.ready(function () {
|
52
|
+
$('.slide_location_picker').slideLocationAutocomplete();
|
53
|
+
});
|
@@ -0,0 +1 @@
|
|
1
|
+
//= require_tree .
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module Spree
|
2
|
+
module Admin
|
3
|
+
class SlideLocationsController < ResourceController
|
4
|
+
respond_to :html, :json, :js
|
5
|
+
|
6
|
+
def index
|
7
|
+
@slide_locations = Spree::SlideLocation.order(:name)
|
8
|
+
end
|
9
|
+
|
10
|
+
def search
|
11
|
+
if params[:ids]
|
12
|
+
@slide_locations = Spree::SlideLocation.where(id: params[:ids])
|
13
|
+
else
|
14
|
+
@slide_locations = Spree::SlideLocation.ransack(params[:q]).result
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,57 @@
|
|
1
|
+
module Spree
|
2
|
+
module Admin
|
3
|
+
class SlidesController < ResourceController
|
4
|
+
respond_to :html
|
5
|
+
|
6
|
+
def index
|
7
|
+
@slides = Spree::Slide.order(:position).page(params[:page]).per(params[:per_page])
|
8
|
+
end
|
9
|
+
|
10
|
+
def update
|
11
|
+
invoke_callbacks(:update, :before)
|
12
|
+
if @object.update_attributes(permitted_resource_params)
|
13
|
+
invoke_callbacks(:update, :after)
|
14
|
+
handle_slide_locations(@object)
|
15
|
+
respond_with(@object) do |format|
|
16
|
+
format.html do
|
17
|
+
flash[:success] = flash_message_for(@object, :successfully_updated)
|
18
|
+
redirect_to location_after_save
|
19
|
+
end
|
20
|
+
format.js { render layout: false }
|
21
|
+
end
|
22
|
+
else
|
23
|
+
invoke_callbacks(:update, :fails)
|
24
|
+
respond_with(@object) do |format|
|
25
|
+
format.html do
|
26
|
+
flash.now[:error] = @object.errors.full_messages.join(", ")
|
27
|
+
render_after_update_error
|
28
|
+
end
|
29
|
+
format.js { render layout: false }
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
private
|
35
|
+
|
36
|
+
def location_after_save
|
37
|
+
if @slide.created_at == @slide.updated_at
|
38
|
+
edit_admin_slide_url(@slide)
|
39
|
+
else
|
40
|
+
admin_slides_url
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
def permitted_resource_params
|
45
|
+
params.require(:slide).permit(:name, :body, :link_url, :published, :image, :position, :product_id, :slide_location_ids)
|
46
|
+
end
|
47
|
+
|
48
|
+
def handle_slide_locations(object)
|
49
|
+
slide_location_ids = permitted_resource_params[:slide_location_ids].split(',')
|
50
|
+
|
51
|
+
slide_location_ids.each do |slide_location_id|
|
52
|
+
object.slide_slide_locations.find_or_create_by(slide_id: object.id, slide_location_id: slide_location_id)
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
module Spree
|
2
|
+
class Slide < ActiveRecord::Base
|
3
|
+
belongs_to :product, touch: true
|
4
|
+
|
5
|
+
self.table_name = 'spree_slides'
|
6
|
+
|
7
|
+
has_many :slide_slide_locations
|
8
|
+
has_many :slide_locations, through: :slide_slide_locations
|
9
|
+
|
10
|
+
has_attached_file :image,
|
11
|
+
url: '/spree/slides/:id/:style/:basename.:extension',
|
12
|
+
path: ':rails_root/public/spree/slides/:id/:style/:basename.:extension',
|
13
|
+
convert_options: { all: '-strip -auto-orient -colorspace sRGB' }
|
14
|
+
|
15
|
+
validates_attachment :image, content_type: { content_type: ["image/jpg", "image/jpeg", "image/png", "image/gif"] }
|
16
|
+
|
17
|
+
scope :published, -> { where(published: true).order('position ASC') }
|
18
|
+
scope :location, -> (location){ joins(:slide_locations).where('spree_slide_locations.name = ?', location) }
|
19
|
+
|
20
|
+
def initialize(attrs = nil)
|
21
|
+
attrs ||= { published: true }
|
22
|
+
super
|
23
|
+
end
|
24
|
+
|
25
|
+
def show_caption?
|
26
|
+
show_caption
|
27
|
+
end
|
28
|
+
|
29
|
+
def slide_caption
|
30
|
+
name.blank? && product.present? ? product.name : name
|
31
|
+
end
|
32
|
+
|
33
|
+
def slide_name
|
34
|
+
name.blank? && product.present? ? product.name : name
|
35
|
+
end
|
36
|
+
|
37
|
+
def slide_link
|
38
|
+
link_url.blank? && product.present? ? product : link_url
|
39
|
+
end
|
40
|
+
|
41
|
+
def slide_image
|
42
|
+
!image.file? && product.present? && product.images.any? ? product.images.first.attachment : image
|
43
|
+
end
|
44
|
+
|
45
|
+
def slide_location_ids
|
46
|
+
slide_locations.pluck(:id)
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|