rdcms_tour 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.gitignore +20 -0
- data/Gemfile +2 -0
- data/LICENSE.txt +22 -0
- data/README.md +35 -0
- data/Rakefile +21 -0
- data/admin/tours.rb +58 -0
- data/app/assets/javascripts/tours.js.coffee +264 -0
- data/app/assets/stylesheets/tours.css.scss +212 -0
- data/app/controllers/tours_controller.rb +18 -0
- data/app/models/tour.rb +42 -0
- data/app/views/admin/tours/_form.html.erb +35 -0
- data/app/views/admin/tours/_show.html.erb +41 -0
- data/app/views/tours/index.html.erb +25 -0
- data/app/views/tours/show.html.erb +44 -0
- data/db/migrate/20130603134344_create_tours.rb +35 -0
- data/lib/rdcms_tour.rb +4 -0
- data/lib/rdcms_tour/engine.rb +9 -0
- data/lib/rdcms_tour/version.rb +3 -0
- data/rdcms_tour.gemspec +26 -0
- data/script/rails +8 -0
- metadata +107 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: f36c06633d8ff5d33d5e034e64ee002a488a089b
|
4
|
+
data.tar.gz: ca858a9d2dbb4d175047388144c109de8ca91de9
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 25d52bcc0af5af448b5ed0ff5fd97576739c9d9a1f6c6a502c92ce9b144bda4062fce384f12f76645197f2bf087bce344e7ba2ac66c85893c45fd5dc134aacdb
|
7
|
+
data.tar.gz: 3a5c3a862f24ad3351fac1fff29742c757ccb8888190b9f852d1d9a522d7c3cf4cf51d5c525377dd13663ad0ad3a655fca63cdf73fdc42e7968bc317539cab8f
|
data/.gitignore
ADDED
data/Gemfile
ADDED
data/LICENSE.txt
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2013 Gullit Miranda
|
2
|
+
|
3
|
+
MIT License
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
a copy of this software and associated documentation files (the
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
the following conditions:
|
12
|
+
|
13
|
+
The above copyright notice and this permission notice shall be
|
14
|
+
included in all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,35 @@
|
|
1
|
+
# Rdcms Tours
|
2
|
+
|
3
|
+
O Rdcms Tour é o módulo para paranoramas, onde é possivel ter uma visão panorâmica (até 360 graus) de ambientes fazendo a marcação de itens de destaque.
|
4
|
+
|
5
|
+
## Instalação
|
6
|
+
|
7
|
+
Adicione esta linha ao Gemfile da sua aplicação e efetue a instalação:
|
8
|
+
|
9
|
+
# Gemfile
|
10
|
+
gem "rdcms_tour"
|
11
|
+
|
12
|
+
# $
|
13
|
+
bundle install
|
14
|
+
|
15
|
+
ou instale-a diretamente execultando:
|
16
|
+
|
17
|
+
# $
|
18
|
+
gem install rdcms_tour
|
19
|
+
|
20
|
+
|
21
|
+
instale as migrações:
|
22
|
+
|
23
|
+
# $
|
24
|
+
bundle exec rake rdcms_tour:install
|
25
|
+
bundle exec rake db:migrate
|
26
|
+
|
27
|
+
## Como utilizar
|
28
|
+
|
29
|
+
Adicione a linha ao load_paths do active_admin:
|
30
|
+
|
31
|
+
# config/initializers/active_admin.rb
|
32
|
+
config.load_paths << "#{RdcmsTour::Engine.root}/admin/"
|
33
|
+
|
34
|
+
## Author
|
35
|
+
Gullit Miranda - [https://github.com/gullitmiranda](https://github.com/gullitmiranda)
|
data/Rakefile
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
#!/usr/bin/env rake
|
2
|
+
begin
|
3
|
+
require "bundler/gem_tasks"
|
4
|
+
rescue LoadError
|
5
|
+
puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
|
6
|
+
end
|
7
|
+
begin
|
8
|
+
require 'rdoc/task'
|
9
|
+
rescue LoadError
|
10
|
+
require 'rdoc/rdoc'
|
11
|
+
require 'rake/rdoctask'
|
12
|
+
RDoc::Task = Rake::RDocTask
|
13
|
+
end
|
14
|
+
|
15
|
+
RDoc::Task.new(:rdoc) do |rdoc|
|
16
|
+
rdoc.rdoc_dir = 'rdoc'
|
17
|
+
rdoc.title = "Rdcms Tours #{RdcmsTour::VERSION}"
|
18
|
+
rdoc.options << '--line-numbers'
|
19
|
+
rdoc.rdoc_files.include('README.md')
|
20
|
+
rdoc.rdoc_files.include('lib/**/*.rb')
|
21
|
+
end
|
data/admin/tours.rb
ADDED
@@ -0,0 +1,58 @@
|
|
1
|
+
ActiveAdmin.register Tour do
|
2
|
+
menu priority: 6,
|
3
|
+
parent: I18n.t('activerecord.models.content_management'),
|
4
|
+
if: proc{can?(:update, Tour)}
|
5
|
+
# menu false
|
6
|
+
|
7
|
+
index do
|
8
|
+
selectable_column
|
9
|
+
|
10
|
+
column :id
|
11
|
+
column :name, :sortable => :name do |p|
|
12
|
+
title = p.name if p.name.to_s.length < 40
|
13
|
+
link_to(truncate(p.name, :length => 40), [:admin, p], title: "#{title || ""}" )
|
14
|
+
end
|
15
|
+
column :body, :sortable => :body do |p|
|
16
|
+
text = strip_tags(p.body).to_s.strip
|
17
|
+
content_tag(:span, truncate(text, :length => 40), title: text )
|
18
|
+
end
|
19
|
+
column :tag_list, :sortable => :tag_list do |p|
|
20
|
+
best_in_place p, :tag_list, type: :input, path: [:admin, p]
|
21
|
+
end
|
22
|
+
|
23
|
+
# Options
|
24
|
+
column :speed, :sortable => :speed do |p|
|
25
|
+
best_in_place p, :speed, type: :input, :nil => "0", path: [:admin, p]
|
26
|
+
end
|
27
|
+
column :direction, :sortable => :direction do |p|
|
28
|
+
best_in_place p, :direction, type: :select, path: [:admin, p],
|
29
|
+
:collection => [["right" , I18n.t(".right" ) ], ["left" , I18n.t(".left" ) ]]
|
30
|
+
# ["top" , I18n.t(".top" ) ], ["bottom" , I18n.t(".bottom") ],
|
31
|
+
end
|
32
|
+
column :control_display, :sortable => :control_display do |p|
|
33
|
+
best_in_place p, :control_display, type: :checkbox, path: [:admin, p]
|
34
|
+
end
|
35
|
+
column :start_position, :sortable => :start_position do |p|
|
36
|
+
best_in_place p, :start_position, type: :input, path: [:admin, p]
|
37
|
+
end
|
38
|
+
column :auto_start, :sortable => :auto_start do |p|
|
39
|
+
best_in_place p, :auto_start, type: :checkbox, path: [:admin, p]
|
40
|
+
end
|
41
|
+
column :loop, :sortable => :loop do |p|
|
42
|
+
best_in_place p, :loop, type: :checkbox, path: [:admin, p]
|
43
|
+
end
|
44
|
+
|
45
|
+
column :published, :sortable => :published do |p|
|
46
|
+
best_in_place p, :published, type: :checkbox, path: [:admin, p]
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
show do
|
51
|
+
render :partial => "show", locals: { :s => tour }
|
52
|
+
end
|
53
|
+
|
54
|
+
form :partial => "form"
|
55
|
+
|
56
|
+
batch_action :destroy, false
|
57
|
+
config.clear_sidebar_sections!
|
58
|
+
end
|
@@ -0,0 +1,264 @@
|
|
1
|
+
jQuery ->
|
2
|
+
Tour_labels = window.Tour_labels ? ""
|
3
|
+
|
4
|
+
$.fn.tour = (options) ->
|
5
|
+
_id = 0
|
6
|
+
_element = $()
|
7
|
+
_viewPort = $()
|
8
|
+
_panorama = $()
|
9
|
+
_navBar = $()
|
10
|
+
# Traduções
|
11
|
+
labels = $.extend
|
12
|
+
index: "Índice"
|
13
|
+
rotate_left: "Rotacionar para esquerda"
|
14
|
+
rotate_right: "Rotacionar para direita"
|
15
|
+
play_stop: "Reproduzir/Parar"
|
16
|
+
zoom: "Ampliar/Reduzir"
|
17
|
+
, Tour_labels
|
18
|
+
|
19
|
+
# Configurações
|
20
|
+
_settings = $.extend
|
21
|
+
viewport_width: 'auto'
|
22
|
+
speed: 20000
|
23
|
+
direction: "left"
|
24
|
+
control_display: "auto"
|
25
|
+
start_position: 0
|
26
|
+
auto_start: false
|
27
|
+
mode_360: true
|
28
|
+
|
29
|
+
# Container dos botões da navegação
|
30
|
+
navBarContainer: ".navbar:first > .navbar-inner > .container"
|
31
|
+
|
32
|
+
# Placemment dos tooltips
|
33
|
+
data_placement: "bottom"
|
34
|
+
, options
|
35
|
+
|
36
|
+
tour_animate = ->
|
37
|
+
unless _panorama.length
|
38
|
+
console.error "Não tem como animar um panorama que não existe :( !"
|
39
|
+
return false
|
40
|
+
|
41
|
+
currentPosition = 0 - parseInt(_panorama.css("margin-left"))
|
42
|
+
|
43
|
+
if _settings.direction is "right"
|
44
|
+
_panorama.animate marginLeft: 0 , ((_settings.speed / _settings.imageSizes.clientWidth) * (currentPosition)), "linear", ->
|
45
|
+
if _settings.mode_360
|
46
|
+
_panorama.css "marginLeft", "-#{parseInt(_settings.imageSizes.clientWidth)}px"
|
47
|
+
tour_animate()
|
48
|
+
else
|
49
|
+
rightlimit = if _settings.mode_360 then _settings.imageSizes.clientWidth else (_settings.imageSizes.clientWidth - _settings.viewport_width)
|
50
|
+
|
51
|
+
_panorama.animate
|
52
|
+
marginLeft: -rightlimit
|
53
|
+
, ((_settings.speed / rightlimit) * (rightlimit - currentPosition)), "linear", ->
|
54
|
+
if _settings.mode_360
|
55
|
+
_panorama.css "margin-left", 0
|
56
|
+
tour_animate()
|
57
|
+
|
58
|
+
tour_toggle_stop = (element, action) ->
|
59
|
+
$el = $(element).stop()
|
60
|
+
$btn = $el.parent().find('.rtPlayBtn, .rtPauseBtn')
|
61
|
+
|
62
|
+
if action is 'start'
|
63
|
+
$btn.removeClass('rtPlayBtn').addClass('rtPauseBtn')
|
64
|
+
tour_animate()
|
65
|
+
$el.data('started', true)
|
66
|
+
else
|
67
|
+
$btn.removeClass('rtPauseBtn').addClass('rtPlayBtn')
|
68
|
+
$el.data('started', false)
|
69
|
+
|
70
|
+
_createNavBar= () ->
|
71
|
+
|
72
|
+
_navBar = $(".BtnNavContainer", _settings.navBarContainer)
|
73
|
+
_navBar = $("""<div class="BtnNavContainer"></div>""").appendTo(_settings.navBarContainer) unless _navBar.length
|
74
|
+
|
75
|
+
navControllers = """
|
76
|
+
<div class="dropdown fade dpIndex">
|
77
|
+
<a class="BigButton btnIndex dropdown-toggle" data-toggle="dropdown" href="#" rel="tooltip" title="#{labels.index}" data-placement="#{_settings.data_placement}" ><span class="icon-list-4" aria-hidden="true"></span></a>
|
78
|
+
</div>
|
79
|
+
|
80
|
+
<div class="BigButton fade btnZoom" rel="tooltip" title="#{labels.zoom}" data-placement="#{_settings.data_placement}" ><span class="icon-zoom-in" aria-hidden="true"></span></div>
|
81
|
+
|
82
|
+
<div class="barControls fade zoomedControllers">
|
83
|
+
<div class="BigButton btnNext " rel="tooltip" title="#{labels.rotate_left }" data-placement="#{_settings.data_placement}" ><span class="icon-fast-backward " aria-hidden="true"></span></div>
|
84
|
+
<div class="BigButton btnMove " rel="tooltip" title="#{labels.play_stop }" data-placement="#{_settings.data_placement}" ><span class="icon-play" aria-hidden="true"></span></div>
|
85
|
+
<div class="BigButton btnPrevious " rel="tooltip" title="#{labels.rotate_right }" data-placement="#{_settings.data_placement}" ><span class="icon-fast-forward" aria-hidden="true"></span></div>
|
86
|
+
</div>
|
87
|
+
"""
|
88
|
+
|
89
|
+
navBigButtons = _navBar.append(navControllers).find(".BigButton")
|
90
|
+
|
91
|
+
# Recarrega as core functions do twitter bootstrap
|
92
|
+
$.loadBootstrap()
|
93
|
+
|
94
|
+
if _settings.zoom
|
95
|
+
btZoom = $(".btnZoom", _navBar)
|
96
|
+
.addClass("in")
|
97
|
+
.click ->
|
98
|
+
if _t.zoom("value") is 1
|
99
|
+
_t.zoom("zoomIn")
|
100
|
+
else
|
101
|
+
_t.zoom("zoomOut")
|
102
|
+
|
103
|
+
btControls = $(".barControls", _navBar)
|
104
|
+
.addClass("in")
|
105
|
+
# Botão de play ou pausa
|
106
|
+
.find(".btnMove")
|
107
|
+
.click (e) ->
|
108
|
+
e.preventDefault()
|
109
|
+
span = $('span', this)
|
110
|
+
if span.hasClass("icon-play")
|
111
|
+
span.removeClass("icon-play").addClass("icon-pause")
|
112
|
+
move("start")
|
113
|
+
else
|
114
|
+
span.removeClass("icon-pause").addClass("icon-play")
|
115
|
+
move("stop")
|
116
|
+
.end()
|
117
|
+
# Botão para rotacioar para a esquerda
|
118
|
+
.find(".btnPrevious")
|
119
|
+
.mousedown (e) ->
|
120
|
+
e.preventDefault()
|
121
|
+
move("start", "left")
|
122
|
+
.mouseup (e) ->
|
123
|
+
e.preventDefault()
|
124
|
+
move("stop")
|
125
|
+
.end()
|
126
|
+
# Botão para rotacionar para a direita
|
127
|
+
.find(".btnNext")
|
128
|
+
.mousedown (e) ->
|
129
|
+
e.preventDefault()
|
130
|
+
move("start", "right")
|
131
|
+
.mouseup (e) ->
|
132
|
+
e.preventDefault()
|
133
|
+
move("stop")
|
134
|
+
.end()
|
135
|
+
|
136
|
+
# Faz a chamada na ação de avançar ou parar conforme a direção informada ou definida na configuração
|
137
|
+
move = (action="start", direction) ->
|
138
|
+
unless _panorama.length
|
139
|
+
console.error "Não tem como mover um panorama que não existe :( !"
|
140
|
+
return false
|
141
|
+
|
142
|
+
_settings.direction = direction if direction
|
143
|
+
|
144
|
+
# para o panorama caso ele ja esteja rotacionando e/ou caso a ação indique isso e altera o icone de pausa para play
|
145
|
+
# Caso a ação indique para iniciar rotação, o panorama é iniciado e a variável data-started é definida como true
|
146
|
+
btnMove = $(".btnMove span", _navBar)
|
147
|
+
|
148
|
+
# Caso já iniciado para a animação
|
149
|
+
if _panorama.data('started')
|
150
|
+
stop()
|
151
|
+
|
152
|
+
# Caso a ação seja iniciar, começa a animação
|
153
|
+
if action is 'start'
|
154
|
+
tour_animate()
|
155
|
+
_panorama.data('started', true)
|
156
|
+
btnMove.removeClass("icon-play").addClass("icon-pause")
|
157
|
+
|
158
|
+
stop = () ->
|
159
|
+
btnMoveSpan = $(".btnMove span", _navBar)
|
160
|
+
_panorama.stop()
|
161
|
+
_panorama.data('started', false)
|
162
|
+
btnMoveSpan.removeClass("icon-pause").addClass("icon-play")
|
163
|
+
|
164
|
+
rtRender = (element, panoramaViewport) ->
|
165
|
+
_t = element
|
166
|
+
|
167
|
+
element
|
168
|
+
.addClass("rtObject")
|
169
|
+
.attr("unselectable", "on")
|
170
|
+
.css
|
171
|
+
position: "relative"
|
172
|
+
"-moz-user-select": "none"
|
173
|
+
"-webkit-user-select": "none"
|
174
|
+
margin: "0"
|
175
|
+
padding: "0"
|
176
|
+
border: "none"
|
177
|
+
height: "#{panoramaViewport.innerHeight()}px"
|
178
|
+
.wrap "<div class='rtContainer' style='width: #{element[0].naturalWidth}px;'></div>"
|
179
|
+
|
180
|
+
_settings.imageSizes = {}
|
181
|
+
$.each "clientHeight clientWidth naturalHeight naturalWidth".split(' '), (ix, val) ->
|
182
|
+
_settings.imageSizes[val] = element[0][val]
|
183
|
+
|
184
|
+
element.clone().insertAfter element if _settings.mode_360
|
185
|
+
|
186
|
+
_panorama = element.parent()
|
187
|
+
.css
|
188
|
+
width: ((_settings.imageSizes.clientWidth * 2) + (_settings.imageSizes.clientWidth * 0.02))
|
189
|
+
overflow: "hidden"
|
190
|
+
.append("<div class=\"overlay-block\"></div>")
|
191
|
+
.appendTo(panoramaViewport)
|
192
|
+
|
193
|
+
|
194
|
+
# Movimentação por click
|
195
|
+
bMouseMove = false
|
196
|
+
mouseMoveStart = 0
|
197
|
+
|
198
|
+
panoramaViewport
|
199
|
+
.mousedown (e) ->
|
200
|
+
unless bMouseMove
|
201
|
+
bMouseMove = true
|
202
|
+
mouseMoveStart = e.clientX
|
203
|
+
false
|
204
|
+
.mouseup ->
|
205
|
+
bMouseMove = false
|
206
|
+
mouseMoveStart = 0
|
207
|
+
false
|
208
|
+
.mousemove (e) ->
|
209
|
+
if bMouseMove
|
210
|
+
delta = parseInt((mouseMoveStart - e.clientX) / 30)
|
211
|
+
if (delta > 10) or (delta < 10)
|
212
|
+
newMarginLeft = parseInt(_panorama.css("marginLeft")) - (delta)
|
213
|
+
if _settings.mode_360
|
214
|
+
newMarginLeft = -_settings.imageSizes.clientWidth if newMarginLeft > 0
|
215
|
+
newMarginLeft = 0 if newMarginLeft < -_settings.imageSizes.clientWidth
|
216
|
+
else
|
217
|
+
newMarginLeft = 0 if newMarginLeft > 0
|
218
|
+
newMarginLeft = -_settings.imageSizes.clientWidth if newMarginLeft < -_settings.imageSizes.clientWidth
|
219
|
+
_panorama.css "marginLeft", newMarginLeft + "px"
|
220
|
+
|
221
|
+
_panorama.css "margin-left": "-#{_settings.start_position}px"
|
222
|
+
|
223
|
+
panoramaViewport.find('.rtOverlayContainer').hide ->
|
224
|
+
$(this).remove()
|
225
|
+
_createNavBar()
|
226
|
+
|
227
|
+
move("start") if _settings.auto_start
|
228
|
+
|
229
|
+
@each ->
|
230
|
+
_element = _t = $(this)
|
231
|
+
|
232
|
+
$parent = _t.parent().css('overflow', 'hidden')
|
233
|
+
|
234
|
+
_settings.viewSize =
|
235
|
+
height : parseInt($parent.innerHeight() )
|
236
|
+
width : parseInt($parent.innerWidth() )
|
237
|
+
|
238
|
+
_settings.viewport_width = if _settings.viewport_width is 'auto' then _settings.viewSize.width else _settings.viewport_width
|
239
|
+
|
240
|
+
_viewPort = panoramaViewport = $("<div />")
|
241
|
+
.attr('id', "pan_#{_id++}")
|
242
|
+
.addClass("requestTour rtViewport rtHor")
|
243
|
+
.css
|
244
|
+
width : "#{_settings.viewport_width}px"
|
245
|
+
height : "#{_settings.viewSize.height}px"
|
246
|
+
overflow : "hidden"
|
247
|
+
.appendTo($parent)
|
248
|
+
|
249
|
+
# Loading
|
250
|
+
loadingHtml = """
|
251
|
+
<div class="rtOverlayContainer fade">
|
252
|
+
<div class="rtOverlay"></div>
|
253
|
+
<div class="rtLoading"></div>
|
254
|
+
</div>
|
255
|
+
"""
|
256
|
+
rtLoading = $(loadingHtml)
|
257
|
+
.addClass('in')
|
258
|
+
.appendTo(panoramaViewport)
|
259
|
+
|
260
|
+
int = window.setInterval( ->
|
261
|
+
if _t[0].complete
|
262
|
+
clearInterval(int)
|
263
|
+
rtRender(_t, panoramaViewport)
|
264
|
+
, 100)
|
@@ -0,0 +1,212 @@
|
|
1
|
+
.requestTour {
|
2
|
+
overflow: hidden;
|
3
|
+
margin: 0;
|
4
|
+
padding: 0;
|
5
|
+
text-align: left;
|
6
|
+
|
7
|
+
.rtOverlayContainer {
|
8
|
+
z-index: 1010;
|
9
|
+
|
10
|
+
&,
|
11
|
+
.rtOverlay,
|
12
|
+
.rtLoading {
|
13
|
+
position: absolute;
|
14
|
+
}
|
15
|
+
|
16
|
+
&, .rtOverlay {
|
17
|
+
top: 0;
|
18
|
+
bottom: 0;
|
19
|
+
left: 0;
|
20
|
+
right: 0;
|
21
|
+
}
|
22
|
+
.rtOverlay {
|
23
|
+
background: #000;
|
24
|
+
opacity: .9;
|
25
|
+
}
|
26
|
+
.rtLoading {
|
27
|
+
$bs: 0 1px 3px rgba(255, 255, 255, 0.5);
|
28
|
+
$br: 10px;
|
29
|
+
$size: 138px;
|
30
|
+
|
31
|
+
background: url('loading.gif') no-repeat 50% 50% scroll #000;
|
32
|
+
width: $size;
|
33
|
+
height: $size;
|
34
|
+
top: 50%;
|
35
|
+
left: 50%;
|
36
|
+
margin-top: -($size + $br)/2;
|
37
|
+
margin-left: -($size + $br)/2;
|
38
|
+
padding: $br 0 0 $br;
|
39
|
+
|
40
|
+
-webkit-border-radius: $br;
|
41
|
+
-moz-border-radius: $br;
|
42
|
+
border-radius: $br;
|
43
|
+
-webkit-box-shadow: $bs;
|
44
|
+
-moz-box-shadow: $bs;
|
45
|
+
box-shadow: $bs;
|
46
|
+
}
|
47
|
+
}
|
48
|
+
|
49
|
+
.rtContainer {
|
50
|
+
position: relative;
|
51
|
+
// width: 100%;
|
52
|
+
width: 100000px;
|
53
|
+
margin: 0;
|
54
|
+
padding: 0;
|
55
|
+
|
56
|
+
.rtObject {
|
57
|
+
position: relative;
|
58
|
+
margin: 0;
|
59
|
+
padding: 0;
|
60
|
+
border: none;
|
61
|
+
top: 0;
|
62
|
+
bottom: 0;
|
63
|
+
}
|
64
|
+
.rtArea {
|
65
|
+
border: 2px solid white;
|
66
|
+
filter: alpha(opacity=20);
|
67
|
+
opacity: .2;
|
68
|
+
background: black;
|
69
|
+
font-size: 100%;
|
70
|
+
cursor: pointer;
|
71
|
+
text-decoration: none;
|
72
|
+
color: white;
|
73
|
+
text-align: right;
|
74
|
+
|
75
|
+
&:hover {
|
76
|
+
background: #0080e2;
|
77
|
+
cursor: pointer;
|
78
|
+
}
|
79
|
+
}
|
80
|
+
}
|
81
|
+
|
82
|
+
/* Button Sprite */
|
83
|
+
.rtArrowIcn,
|
84
|
+
.rtBigButtonIcn {
|
85
|
+
position: absolute;
|
86
|
+
cursor: pointer;
|
87
|
+
background: url('rdcms/sliders/sprite.png');
|
88
|
+
background-color: rgba(0,0,0,0.75);
|
89
|
+
*background-color: #111;
|
90
|
+
|
91
|
+
&:hover { background-color: rgba(0,0,0,0.9); }
|
92
|
+
}
|
93
|
+
/* Arrow */
|
94
|
+
.rtArrow {
|
95
|
+
height: 100%;
|
96
|
+
width: 44px;
|
97
|
+
position: absolute;
|
98
|
+
display: block;
|
99
|
+
cursor: pointer;
|
100
|
+
z-index: 21;
|
101
|
+
|
102
|
+
opacity: 1;
|
103
|
+
-webkit-transition:opacity 0.3s linear;
|
104
|
+
-moz-transition:opacity 0.3s linear;
|
105
|
+
-o-transition:opacity 0.3s linear;
|
106
|
+
transition:opacity 0.3s linear;
|
107
|
+
.rtArrowIcn {
|
108
|
+
width: 32px;
|
109
|
+
height: 32px;
|
110
|
+
top: 50%;
|
111
|
+
left: 50%;
|
112
|
+
margin-top:-16px;
|
113
|
+
margin-left: -16px;
|
114
|
+
|
115
|
+
|
116
|
+
border-radius: 2px;
|
117
|
+
}
|
118
|
+
}
|
119
|
+
|
120
|
+
/* Arrow > Horizontal [Default] */
|
121
|
+
&.rtHor {
|
122
|
+
.rtArrowLeft { top: 0; left: 0; }
|
123
|
+
.rtArrowRight { top:0; right: 0; }
|
124
|
+
.rtArrowLeft .rtArrowIcn { background-position: -64px -32px; }
|
125
|
+
.rtArrowRight .rtArrowIcn { background-position: -64px -64px; }
|
126
|
+
}
|
127
|
+
|
128
|
+
/* Arrow > Vertical */
|
129
|
+
&.rtVer {
|
130
|
+
.rtArrow { width: 100%; height: 44px; }
|
131
|
+
.rtArrowLeft { top: 0; left: 0; }
|
132
|
+
.rtArrowRight { bottom: 0; left: 0; }
|
133
|
+
.rtArrowLeft .rtArrowIcn { background-position: -96px -32px; }
|
134
|
+
.rtArrowRight .rtArrowIcn { background-position: -96px -64px; }
|
135
|
+
}
|
136
|
+
|
137
|
+
/* Botões de Navegação */
|
138
|
+
.rtBtnNavContainer {
|
139
|
+
position: absolute;
|
140
|
+
right: 10px;
|
141
|
+
top: 10px;
|
142
|
+
height: 50px;
|
143
|
+
z-index: 2000;
|
144
|
+
|
145
|
+
.rtBigButton {
|
146
|
+
$bigButtonSize: 40px;
|
147
|
+
width: $bigButtonSize;
|
148
|
+
height: $bigButtonSize;
|
149
|
+
z-index: 22;
|
150
|
+
display: inline-block;
|
151
|
+
position: relative;
|
152
|
+
cursor: pointer;
|
153
|
+
|
154
|
+
.rtBigButtonIcn {
|
155
|
+
width: $bigButtonSize;
|
156
|
+
height: $bigButtonSize;
|
157
|
+
top: 50%;
|
158
|
+
left: 50%;
|
159
|
+
margin-top: -22px;
|
160
|
+
margin-left: -22px;
|
161
|
+
border-radius: 4px;
|
162
|
+
}
|
163
|
+
}
|
164
|
+
|
165
|
+
.rtFullscreen .rtBigButtonIcn { background-position: 4px 5px; }
|
166
|
+
.rtDefaultscreen .rtBigButtonIcn { background-position: -28px 5px; }
|
167
|
+
.rtPlayBtn .rtBigButtonIcn { background-position: -13px -44px; }
|
168
|
+
.rtPauseBtn .rtBigButtonIcn { background-position: -57px -99px; }
|
169
|
+
}
|
170
|
+
|
171
|
+
/* Desabilitado */
|
172
|
+
.rtArrowDisabled .rtArrowIcn { background-color: rgba(0,0,0,0.4); opacity: .4; *display: none; }
|
173
|
+
|
174
|
+
/* Ocultar */
|
175
|
+
.rtHidden {
|
176
|
+
opacity: 0;
|
177
|
+
visibility: hidden;
|
178
|
+
-webkit-transition:visibility 0s linear 0.3s,opacity 0.3s linear;
|
179
|
+
-moz-transition:visibility 0s linear 0.3s,opacity 0.3s linear;
|
180
|
+
-o-transition:visibility 0s linear 0.3s,opacity 0.3s linear;
|
181
|
+
transition:visibility 0s linear 0.3s,opacity 0.3s linear;
|
182
|
+
}
|
183
|
+
/* Fullscreen options, very important ^^ */
|
184
|
+
&.rtFullscreen {
|
185
|
+
position: fixed !important;
|
186
|
+
height: auto !important;
|
187
|
+
width: auto !important;
|
188
|
+
margin: 0 !important;
|
189
|
+
padding: 0 !important;
|
190
|
+
z-index: 2147483647 !important;
|
191
|
+
top: 0 !important;
|
192
|
+
left: 0 !important;
|
193
|
+
bottom: 0 !important;
|
194
|
+
right: 0 !important;
|
195
|
+
}
|
196
|
+
}
|
197
|
+
.rtWebkit3d {
|
198
|
+
.rtViewport,
|
199
|
+
.rtContainer,
|
200
|
+
.rtPreloader,
|
201
|
+
img,
|
202
|
+
.rtArrow,
|
203
|
+
.rtControllerToobar {
|
204
|
+
-webkit-backface-visibility: hidden;
|
205
|
+
-webkit-transform: translateZ(0);
|
206
|
+
}
|
207
|
+
.rtFade .rtSlide,
|
208
|
+
.rtFade img,
|
209
|
+
.rtFade .rtContainer {
|
210
|
+
-webkit-transform: none;
|
211
|
+
}
|
212
|
+
}
|
@@ -0,0 +1,18 @@
|
|
1
|
+
class ToursController < ApplicationController
|
2
|
+
load_and_authorize_resource
|
3
|
+
|
4
|
+
respond_to :html, :json
|
5
|
+
def index
|
6
|
+
@tours = Tour.ordained.all
|
7
|
+
respond_with @tours
|
8
|
+
end
|
9
|
+
|
10
|
+
def show
|
11
|
+
@tour = Tour.find(params[:id])
|
12
|
+
@tour.visit! :by => request.try(:remote_ip)
|
13
|
+
|
14
|
+
respond_with @tour do |format|
|
15
|
+
format.html { render layout: 'full_screen' }
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
data/app/models/tour.rb
ADDED
@@ -0,0 +1,42 @@
|
|
1
|
+
class Tour < ActiveRecord::Base
|
2
|
+
attr_accessible :body, :name, :position, :published, :speed, :direction, :control_display, :start_position, :loop, :auto_start,
|
3
|
+
# Slug, I18n e tags
|
4
|
+
:slug, :locale, :translations_attributes, :tag_list,
|
5
|
+
# Paperclip
|
6
|
+
:tour, :tour_content_type, :tour_file_name, :tour_file_size
|
7
|
+
# Taggings
|
8
|
+
acts_as_taggable
|
9
|
+
|
10
|
+
has_attached_file :tour,
|
11
|
+
:styles => {
|
12
|
+
:thumb => "560x180#"
|
13
|
+
},
|
14
|
+
:convert_options => { :all => '-auto-orient -quality 70 -interlace Plane' }
|
15
|
+
# :processors => [:thumbnail, :compression]
|
16
|
+
|
17
|
+
# URL amigáveis através do :name
|
18
|
+
extend FriendlyId
|
19
|
+
friendly_id :name, use: [:slugged, :history]
|
20
|
+
|
21
|
+
# Escopos
|
22
|
+
scope :visible, where("published = ?", true)
|
23
|
+
scope :recents, lambda{ |limit = 10| visible.order("datetime desc").limit(limit)}
|
24
|
+
scope :ordained, lambda{ |limit = 10| visible.order("position asc").limit(limit)}
|
25
|
+
|
26
|
+
# Contador de visitas
|
27
|
+
is_visitable accept_ip: true
|
28
|
+
|
29
|
+
# Translate
|
30
|
+
translates :name, :body
|
31
|
+
accepts_nested_attributes_for :translations
|
32
|
+
|
33
|
+
class Translation
|
34
|
+
attr_accessible :locale, :name, :body
|
35
|
+
end
|
36
|
+
def translations_attributes=(attributes)
|
37
|
+
new_translations = attributes.values.reduce({}) do |new_values, translation|
|
38
|
+
new_values.merge! translation.delete("locale") => translation
|
39
|
+
end
|
40
|
+
set_translations new_translations
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
<%= semantic_form_for [:admin, @tour], :html => { :multipart => true, class: 'form-horizontal' } do |f| %>
|
2
|
+
<%= errors_for @tour %>
|
3
|
+
|
4
|
+
<%= f.globalize_inputs :translations do |lf| %>
|
5
|
+
<div class="control-group">
|
6
|
+
<%= lf.label :name, t(".name"), :class => 'control-label' %>
|
7
|
+
<div class="controls">
|
8
|
+
<%= lf.text_field :name, :class => 'text_field' %>
|
9
|
+
</div>
|
10
|
+
</div>
|
11
|
+
<div class="control-group">
|
12
|
+
<%= lf.label :body, t(".body"), :class => 'control-label' %>
|
13
|
+
<div class="controls">
|
14
|
+
<%= lf.cktext_area :body, :class => 'text_area' %>
|
15
|
+
</div>
|
16
|
+
</div>
|
17
|
+
<%= lf.input :locale, :as => :hidden %>
|
18
|
+
<% end %>
|
19
|
+
|
20
|
+
<hr />
|
21
|
+
|
22
|
+
<div class="control-group">
|
23
|
+
<%= f.label :tour, t(".background"), :class => 'control-label' %>
|
24
|
+
<div class="controls">
|
25
|
+
<%= f.file_field :tour, :accept => "image/*" %>
|
26
|
+
</div>
|
27
|
+
</div>
|
28
|
+
|
29
|
+
<hr />
|
30
|
+
|
31
|
+
<div class="form-actions">
|
32
|
+
<%= f.submit :class => 'btn btn-primary' %>
|
33
|
+
<%= link_to t(".cancel"), admin_tours_path, :class => 'btn btn-link cancel' %>
|
34
|
+
</div>
|
35
|
+
<% end %>
|
@@ -0,0 +1,41 @@
|
|
1
|
+
<div class="panel">
|
2
|
+
<h3><%= t "permalink" %>: <%= link_to tour_path(s), tour_path(s), target: "_blank" %></h3>
|
3
|
+
<div class="panel_contents" id="details">
|
4
|
+
<div class="attributes_table">
|
5
|
+
<table class="table table-bordered">
|
6
|
+
<tbody>
|
7
|
+
<tr><th><%= t(".name" ) %></th><td><%= s.name %></td></tr>
|
8
|
+
<tr><th><%= t(".tag_list" ) %></th><td><%= best_in_place s, :tag_list, type: :input, path: [:admin, s] %></td></tr>
|
9
|
+
<tr><th><%= t(".created_at" ) %></th><td><%= l s.created_at %></td></tr>
|
10
|
+
<tr><th><%= t(".updated_at" ) %></th><td><%= l s.updated_at %></td></tr>
|
11
|
+
<tr><th><%= t(".published" ) %></th><td><%= best_in_place s, :published, type: :checkbox , path: [:admin, s] %></td></tr>
|
12
|
+
</tbody>
|
13
|
+
</table>
|
14
|
+
</div>
|
15
|
+
</div>
|
16
|
+
<h3><%= t "options" %></h3>
|
17
|
+
<div class="panel_contents" id="details">
|
18
|
+
<div class="attributes_table">
|
19
|
+
<table class="table table-bordered">
|
20
|
+
<tbody>
|
21
|
+
<tr><th><%= t(".speed" ) %></th><td><%= best_in_place s, :speed , type: :input , path: [:admin, s], :nil => "0" %></td></tr>
|
22
|
+
<tr><th><%= t(".direction" ) %></th><td><%= best_in_place s, :direction , type: :select, path: [:admin, s],
|
23
|
+
:collection => [["right" , I18n.t(".right" ) ],
|
24
|
+
["left" , I18n.t(".left" ) ]]
|
25
|
+
%></td></tr>
|
26
|
+
<tr><th><%= t(".control_display") %></th><td><%= best_in_place s, :control_display, type: :checkbox , path: [:admin, s] %></td></tr>
|
27
|
+
<tr><th><%= t(".auto_start" ) %></th><td><%= best_in_place s, :auto_start , type: :checkbox , path: [:admin, s] %></td></tr>
|
28
|
+
<tr><th><%= t(".start_position" ) %></th><td><%= best_in_place s, :start_position , type: :input , path: [:admin, s] %></td></tr>
|
29
|
+
<tr><th><%= t(".loop" ) %></th><td><%= best_in_place s, :loop , type: :checkbox , path: [:admin, s] %></td></tr>
|
30
|
+
</tbody>
|
31
|
+
</table>
|
32
|
+
</div>
|
33
|
+
</div>
|
34
|
+
<h3><%= t "description" %></h3>
|
35
|
+
<div class="panel_contents" id="description">
|
36
|
+
<div class="attributes_table well">
|
37
|
+
<%= image_tag s.tour(:thumb), class: "thumbnail pull-right" %>
|
38
|
+
<%= s.body.html_safe if s.body %>
|
39
|
+
</div>
|
40
|
+
</div>
|
41
|
+
</div>
|
@@ -0,0 +1,25 @@
|
|
1
|
+
<div class="row">
|
2
|
+
<div id="tour-list-container" class="<%= defined?(list_class) ? list_class : "span12" %>">
|
3
|
+
<% unless defined?(disable_social) and disable_social %>
|
4
|
+
<div class="social-container" data-url="<%= tours_url %>"></div>
|
5
|
+
<script type="text/javascript" charset="utf-8">
|
6
|
+
$('.social-container').social(<%= raw social_buttons_json %>);
|
7
|
+
</script>
|
8
|
+
<% end -%>
|
9
|
+
<ul class="thumbnails">
|
10
|
+
<% @tours.each do |tour| %>
|
11
|
+
<li class="<%= defined?(list_class) ? list_class : "span6" %>">
|
12
|
+
<div class="thumbnail tour-list clearfix">
|
13
|
+
<h3><%= link_to tour.name, tour_path(tour) %></h3>
|
14
|
+
<%= link_to(tour_path(tour), { title: tour.name, class: "thumb" }) do %>
|
15
|
+
<%= image_tag tour.tour(:thumb), class: "img-rounded" %>
|
16
|
+
<% end %>
|
17
|
+
<div class="details clearfix">
|
18
|
+
<%= tour.body.html_safe %>
|
19
|
+
</div>
|
20
|
+
</div>
|
21
|
+
</li>
|
22
|
+
<% end %>
|
23
|
+
</ul>
|
24
|
+
</div>
|
25
|
+
</div>
|
@@ -0,0 +1,44 @@
|
|
1
|
+
<%- content_for :title, "#{@tour.name} - #{Tour.model_name.human} - #{Setting.for_key("rdcms.site.name")}" -%>
|
2
|
+
|
3
|
+
<%- content_for :navegation_link do %>
|
4
|
+
<%= link_to "<span class=\"icon-back\" aria-hidden=\"true\"></span>".html_safe, tours_path, class: "BigButton fade in btnBack", rel: "tooltip", title: I18n.t("back") %>
|
5
|
+
<% end -%>
|
6
|
+
|
7
|
+
<%= image_tag @tour.tour, class: "panorama" %>
|
8
|
+
|
9
|
+
<script type="text/javascript" charset="utf-8">
|
10
|
+
var Tour_labels = {
|
11
|
+
index : '<%= I18n.t "attributes_all.index" %>',
|
12
|
+
rotate_left : '<%= I18n.t "attributes_all.rotate_left" %>',
|
13
|
+
rotate_right : '<%= I18n.t "attributes_all.rotate_right" %>',
|
14
|
+
play_stop : '<%= I18n.t "attributes_all.play_stop" %>',
|
15
|
+
zoom : '<%= I18n.t "attributes_all.zoom" %>',
|
16
|
+
};
|
17
|
+
</script>
|
18
|
+
|
19
|
+
<%= stylesheet_link_tag "tours" %>
|
20
|
+
<%= javascript_include_tag "tours" %>
|
21
|
+
|
22
|
+
<script type="text/javascript" charset="utf-8">
|
23
|
+
$(function () {
|
24
|
+
// Initialize the jQuery File Upload widget:
|
25
|
+
tour = $(".panorama").tour({
|
26
|
+
navBarContainer: "footer .navbar:first > .navbar-inner > .container",
|
27
|
+
data_placement: "top",
|
28
|
+
<%= "speed : #{@tour.speed},".html_safe if defined?(@tour.speed ) %>
|
29
|
+
<%= "direction : '#{@tour.direction}',".html_safe if defined?(@tour.direction ) %>
|
30
|
+
<%= "control_display : #{@tour.control_display},".html_safe if defined?(@tour.control_display ) %>
|
31
|
+
<%= "start_position : #{@tour.start_position},".html_safe if defined?(@tour.start_position ) %>
|
32
|
+
<%= "auto_start : #{@tour.auto_start},".html_safe if defined?(@tour.auto_start ) %>
|
33
|
+
<%= "mode_360 : #{@tour.loop},".html_safe if defined?(@tour.loop ) %>
|
34
|
+
});
|
35
|
+
});
|
36
|
+
</script>
|
37
|
+
|
38
|
+
<!-- Botões Sociais -->
|
39
|
+
<% content_for :social_buttons do -%>
|
40
|
+
<div class="social-container" data-url="<%= tour_url(@tour) %>"></div>
|
41
|
+
<script type="text/javascript" charset="utf-8">
|
42
|
+
$('.social-container').social(<%= raw social_buttons_json %>);
|
43
|
+
</script>
|
44
|
+
<% end unless defined?(disable_social) and disable_social -%>
|
@@ -0,0 +1,35 @@
|
|
1
|
+
class CreateTours < ActiveRecord::Migration
|
2
|
+
def change
|
3
|
+
create_table :tours do |t|
|
4
|
+
t.string :slug
|
5
|
+
t.string :name
|
6
|
+
t.text :body
|
7
|
+
t.integer :position
|
8
|
+
t.boolean :published, :default => false
|
9
|
+
|
10
|
+
# Options
|
11
|
+
t.integer :speed , :default => 20000
|
12
|
+
t.string :direction , :default => 'left'
|
13
|
+
t.boolean :control_display, :default => true
|
14
|
+
t.integer :start_position , :default => 0
|
15
|
+
t.boolean :loop , :default => true
|
16
|
+
t.boolean :auto_start , :default => false
|
17
|
+
|
18
|
+
t.string :tour_file_name
|
19
|
+
t.string :tour_content_type
|
20
|
+
t.integer :tour_file_size
|
21
|
+
|
22
|
+
t.timestamps
|
23
|
+
end
|
24
|
+
|
25
|
+
add_index :tours, :name
|
26
|
+
add_index :tours, :slug, :unique => true
|
27
|
+
|
28
|
+
Tour.create_translation_table! :name => :string, :body => :text
|
29
|
+
end
|
30
|
+
|
31
|
+
def down
|
32
|
+
drop_table :tours
|
33
|
+
Tour.drop_translation_table!
|
34
|
+
end
|
35
|
+
end
|
data/lib/rdcms_tour.rb
ADDED
data/rdcms_tour.gemspec
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'rdcms_tour/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |s|
|
7
|
+
s.name = "rdcms_tour"
|
8
|
+
s.version = RdcmsTour::VERSION
|
9
|
+
s.authors = ["Gullit Miranda"]
|
10
|
+
s.email = ["gullitmiranda@requestdev.com.br"]
|
11
|
+
s.homepage = "http://www.requestdev.com.br/rdcms/tours"
|
12
|
+
s.summary = %q{Módulo de Panorâmas para o RDCMS}
|
13
|
+
s.description = %q{O Rdcms Tour é o módulo para paranoramas, onde é possivel ter uma visão panorâmica (até 360 graus) de ambientes fazendo a marcação de itens de destaque.}
|
14
|
+
s.license = "MIT"
|
15
|
+
|
16
|
+
s.files = `git ls-files`.split($/)
|
17
|
+
s.executables = s.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
18
|
+
s.test_files = s.files.grep(%r{^(test|spec|features)/})
|
19
|
+
s.require_paths = ["lib"]
|
20
|
+
|
21
|
+
s.add_development_dependency "bundler", "~> 1.3"
|
22
|
+
s.add_development_dependency "rake"
|
23
|
+
|
24
|
+
# Dependências
|
25
|
+
s.add_dependency "rdcms", "~> 1.0.21"
|
26
|
+
end
|
data/script/rails
ADDED
@@ -0,0 +1,8 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# This command will automatically be run when you run "rails" with Rails 3 gems installed from the root of your application.
|
3
|
+
|
4
|
+
ENGINE_ROOT = File.expand_path('../..', __FILE__)
|
5
|
+
ENGINE_PATH = File.expand_path('../../lib/rdcms_tour/engine', __FILE__)
|
6
|
+
|
7
|
+
require 'rails/all'
|
8
|
+
require 'rails/engine/commands'
|
metadata
ADDED
@@ -0,0 +1,107 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: rdcms_tour
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Gullit Miranda
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2013-06-03 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: bundler
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ~>
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '1.3'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ~>
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '1.3'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rake
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - '>='
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - '>='
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: rdcms
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ~>
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: 1.0.21
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ~>
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: 1.0.21
|
55
|
+
description: O Rdcms Tour é o módulo para paranoramas, onde é possivel ter uma visão
|
56
|
+
panorâmica (até 360 graus) de ambientes fazendo a marcação de itens de destaque.
|
57
|
+
email:
|
58
|
+
- gullitmiranda@requestdev.com.br
|
59
|
+
executables: []
|
60
|
+
extensions: []
|
61
|
+
extra_rdoc_files: []
|
62
|
+
files:
|
63
|
+
- .gitignore
|
64
|
+
- Gemfile
|
65
|
+
- LICENSE.txt
|
66
|
+
- README.md
|
67
|
+
- Rakefile
|
68
|
+
- admin/tours.rb
|
69
|
+
- app/assets/javascripts/tours.js.coffee
|
70
|
+
- app/assets/stylesheets/tours.css.scss
|
71
|
+
- app/controllers/tours_controller.rb
|
72
|
+
- app/models/tour.rb
|
73
|
+
- app/views/admin/tours/_form.html.erb
|
74
|
+
- app/views/admin/tours/_show.html.erb
|
75
|
+
- app/views/tours/index.html.erb
|
76
|
+
- app/views/tours/show.html.erb
|
77
|
+
- db/migrate/20130603134344_create_tours.rb
|
78
|
+
- lib/rdcms_tour.rb
|
79
|
+
- lib/rdcms_tour/engine.rb
|
80
|
+
- lib/rdcms_tour/version.rb
|
81
|
+
- rdcms_tour.gemspec
|
82
|
+
- script/rails
|
83
|
+
homepage: http://www.requestdev.com.br/rdcms/tours
|
84
|
+
licenses:
|
85
|
+
- MIT
|
86
|
+
metadata: {}
|
87
|
+
post_install_message:
|
88
|
+
rdoc_options: []
|
89
|
+
require_paths:
|
90
|
+
- lib
|
91
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
92
|
+
requirements:
|
93
|
+
- - '>='
|
94
|
+
- !ruby/object:Gem::Version
|
95
|
+
version: '0'
|
96
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
97
|
+
requirements:
|
98
|
+
- - '>='
|
99
|
+
- !ruby/object:Gem::Version
|
100
|
+
version: '0'
|
101
|
+
requirements: []
|
102
|
+
rubyforge_project:
|
103
|
+
rubygems_version: 2.0.2
|
104
|
+
signing_key:
|
105
|
+
specification_version: 4
|
106
|
+
summary: Módulo de Panorâmas para o RDCMS
|
107
|
+
test_files: []
|