c80_wslider2 0.1.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +10 -0
- data/CODE_OF_CONDUCT.md +49 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +21 -0
- data/README.md +41 -0
- data/Rakefile +2 -0
- data/app/admin/c80_wslider2/frames.rb +40 -0
- data/app/assets/images/left_click_icon.png +0 -0
- data/app/assets/images/left_click_icon_white.png +0 -0
- data/app/assets/javascripts/c80_wslider2/components/wloader/left_click_icon.js +26 -0
- data/app/assets/javascripts/c80_wslider2/components/wloader/paralaxer.js +16 -0
- data/app/assets/javascripts/c80_wslider2/components/wloader/preloader.js +60 -0
- data/app/assets/javascripts/c80_wslider2/components/wloader/shower.js +126 -0
- data/app/assets/javascripts/c80_wslider2/components/wloader.js +101 -0
- data/app/assets/javascripts/c80_wslider2/wslider2.js +103 -0
- data/app/assets/javascripts/c80_wslider2.js.coffee +2 -0
- data/app/assets/stylesheets/c80_wslider2/wslider2.scss +85 -0
- data/app/assets/stylesheets/c80_wslider2.scss +2 -0
- data/app/assets/stylesheets/lib/spinner_pulse.scss +71 -0
- data/app/assets/stylesheets/lib/with_left_click_icon.scss +59 -0
- data/app/helpers/c80_wslider2/app_helper.rb +31 -0
- data/app/models/c80_wslider2/frame.rb +5 -0
- data/app/models/c80_wslider2/prop.rb +4 -0
- data/app/uploaders/c80_wslider2/frame_uploader.rb +85 -0
- data/app/views/c80_wslider2/_wslider2.html.erb +18 -0
- data/bin/console +14 -0
- data/bin/setup +8 -0
- data/c80_wslider2.gemspec +26 -0
- data/db/migrate/20160927090909_c80_wslider2_create_props.rb +10 -0
- data/db/migrate/20160927091010_c80_wslider2_create_frames.rb +9 -0
- data/db/seeds/c80_wslider2_01_fill_props.rb +8 -0
- data/lib/c80_wslider2/engine.rb +23 -0
- data/lib/c80_wslider2/version.rb +3 -0
- data/lib/c80_wslider2.rb +8 -0
- metadata +120 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 033a631a1710a529c8a9795f617a7cefc13fa155
|
4
|
+
data.tar.gz: dbaf86107ba97cc752fea6301b5d6aea6a74658f
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: f2ca56506981976d29b72285d09595bd3dd1bf8a737567f79db21f6dc86204995322eb6d876f7ef873e66f5d0b99247bbd30483524c57e9e55c89beefd241920
|
7
|
+
data.tar.gz: 89168025fef91ace7184c5a3c9f3850a3cdb5dfdcf798611ac2db52ec81f08aace097dfccdc53ee7010258a1e3914666904a658149bc3d6213e6938868a0bc7d
|
data/.gitignore
ADDED
data/CODE_OF_CONDUCT.md
ADDED
@@ -0,0 +1,49 @@
|
|
1
|
+
# Contributor Code of Conduct
|
2
|
+
|
3
|
+
As contributors and maintainers of this project, and in the interest of
|
4
|
+
fostering an open and welcoming community, we pledge to respect all people who
|
5
|
+
contribute through reporting issues, posting feature requests, updating
|
6
|
+
documentation, submitting pull requests or patches, and other activities.
|
7
|
+
|
8
|
+
We are committed to making participation in this project a harassment-free
|
9
|
+
experience for everyone, regardless of level of experience, gender, gender
|
10
|
+
identity and expression, sexual orientation, disability, personal appearance,
|
11
|
+
body size, race, ethnicity, age, religion, or nationality.
|
12
|
+
|
13
|
+
Examples of unacceptable behavior by participants include:
|
14
|
+
|
15
|
+
* The use of sexualized language or imagery
|
16
|
+
* Personal attacks
|
17
|
+
* Trolling or insulting/derogatory comments
|
18
|
+
* Public or private harassment
|
19
|
+
* Publishing other's private information, such as physical or electronic
|
20
|
+
addresses, without explicit permission
|
21
|
+
* Other unethical or unprofessional conduct
|
22
|
+
|
23
|
+
Project maintainers have the right and responsibility to remove, edit, or
|
24
|
+
reject comments, commits, code, wiki edits, issues, and other contributions
|
25
|
+
that are not aligned to this Code of Conduct, or to ban temporarily or
|
26
|
+
permanently any contributor for other behaviors that they deem inappropriate,
|
27
|
+
threatening, offensive, or harmful.
|
28
|
+
|
29
|
+
By adopting this Code of Conduct, project maintainers commit themselves to
|
30
|
+
fairly and consistently applying these principles to every aspect of managing
|
31
|
+
this project. Project maintainers who do not follow or enforce the Code of
|
32
|
+
Conduct may be permanently removed from the project team.
|
33
|
+
|
34
|
+
This code of conduct applies both within project spaces and in public spaces
|
35
|
+
when an individual is representing the project or its community.
|
36
|
+
|
37
|
+
Instances of abusive, harassing, or otherwise unacceptable behavior may be
|
38
|
+
reported by contacting a project maintainer at c080609a@gmail.com. All
|
39
|
+
complaints will be reviewed and investigated and will result in a response that
|
40
|
+
is deemed necessary and appropriate to the circumstances. Maintainers are
|
41
|
+
obligated to maintain confidentiality with regard to the reporter of an
|
42
|
+
incident.
|
43
|
+
|
44
|
+
This Code of Conduct is adapted from the [Contributor Covenant][homepage],
|
45
|
+
version 1.3.0, available at
|
46
|
+
[http://contributor-covenant.org/version/1/3/0/][version]
|
47
|
+
|
48
|
+
[homepage]: http://contributor-covenant.org
|
49
|
+
[version]: http://contributor-covenant.org/version/1/3/0/
|
data/Gemfile
ADDED
data/LICENSE.txt
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
The MIT License (MIT)
|
2
|
+
|
3
|
+
Copyright (c) 2016 C80609A
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
7
|
+
in the Software without restriction, including without limitation the rights
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
10
|
+
furnished to do so, subject to the following conditions:
|
11
|
+
|
12
|
+
The above copyright notice and this permission notice shall be included in
|
13
|
+
all copies or substantial portions of the Software.
|
14
|
+
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
21
|
+
THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,41 @@
|
|
1
|
+
# C80Wslider2
|
2
|
+
|
3
|
+
Welcome to your new gem! In this directory, you'll find the files you need to be able to package up your Ruby library into a gem. Put your Ruby code in the file `lib/c80_wslider2`. To experiment with that code, run `bin/console` for an interactive prompt.
|
4
|
+
|
5
|
+
TODO: Delete this and the text above, and describe your gem
|
6
|
+
|
7
|
+
## Installation
|
8
|
+
|
9
|
+
Add this line to your application's Gemfile:
|
10
|
+
|
11
|
+
```ruby
|
12
|
+
gem 'c80_wslider2'
|
13
|
+
```
|
14
|
+
|
15
|
+
And then execute:
|
16
|
+
|
17
|
+
$ bundle
|
18
|
+
|
19
|
+
Or install it yourself as:
|
20
|
+
|
21
|
+
$ gem install c80_wslider2
|
22
|
+
|
23
|
+
## Usage
|
24
|
+
|
25
|
+
TODO: Write usage instructions here
|
26
|
+
|
27
|
+
## Development
|
28
|
+
|
29
|
+
After checking out the repo, run `bin/setup` to install dependencies. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
|
30
|
+
|
31
|
+
To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
|
32
|
+
|
33
|
+
## Contributing
|
34
|
+
|
35
|
+
Bug reports and pull requests are welcome on GitHub at https://github.com/[USERNAME]/c80_wslider2. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](http://contributor-covenant.org) code of conduct.
|
36
|
+
|
37
|
+
|
38
|
+
## License
|
39
|
+
|
40
|
+
The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
|
41
|
+
|
data/Rakefile
ADDED
@@ -0,0 +1,40 @@
|
|
1
|
+
ActiveAdmin.register C80Wslider2::Frame, as: 'Frame' do
|
2
|
+
|
3
|
+
menu :label => 'Фреймы', # TODO_MY:: название пункта меню перенесести в параметры в базу
|
4
|
+
priority: 2,
|
5
|
+
parent: 'Слайдер'# TODO_MY:: название пункта меню перенесести в параметры в базу
|
6
|
+
|
7
|
+
permit_params :title,
|
8
|
+
:image
|
9
|
+
|
10
|
+
# batch_action :destroy, false
|
11
|
+
config.per_page = 100
|
12
|
+
config.sort_order = 'id_asc'
|
13
|
+
before_filter :skip_sidebar!, :only => :index
|
14
|
+
|
15
|
+
index do
|
16
|
+
selectable_column
|
17
|
+
column :title
|
18
|
+
column :image do |frame|
|
19
|
+
if frame.image.present?
|
20
|
+
link_to image_tag(frame.image.thumb_preview), image_path(frame.image.thumb_big), target: '_blank'
|
21
|
+
end
|
22
|
+
end
|
23
|
+
actions
|
24
|
+
end
|
25
|
+
|
26
|
+
form(:html => {:multipart => true}) do |f|
|
27
|
+
|
28
|
+
f.inputs 'Свойства' do
|
29
|
+
|
30
|
+
f.input :title
|
31
|
+
f.input :image,
|
32
|
+
:as => :file,
|
33
|
+
:hint => image_tag(f.object.image.thumb_preview)
|
34
|
+
|
35
|
+
end
|
36
|
+
|
37
|
+
f.actions
|
38
|
+
end
|
39
|
+
|
40
|
+
end
|
Binary file
|
Binary file
|
@@ -0,0 +1,26 @@
|
|
1
|
+
|
2
|
+
var LeftClickIcon = function ($wrapper, onClick) {
|
3
|
+
|
4
|
+
var _html_str = '<div class="container with_left_click_icon white_icon"><div></div></div>'; // TODO_MY:: хардкод white_icon. А что, если я хочу чёрную иконку?
|
5
|
+
var _$html_div = null;
|
6
|
+
var _$wrapper = null;
|
7
|
+
var _onClick = null;
|
8
|
+
|
9
|
+
var _fInit = function ($wrapper, onClick) {
|
10
|
+
_$wrapper = $wrapper;
|
11
|
+
_onClick = onClick;
|
12
|
+
};
|
13
|
+
|
14
|
+
var _fEnableLeftClickIcon = function () {
|
15
|
+
_$html_div = _$wrapper.prepend(_html_str);
|
16
|
+
};
|
17
|
+
|
18
|
+
var _fStartListenClicks = function () {
|
19
|
+
_$html_div.on('click', onClick);
|
20
|
+
};
|
21
|
+
|
22
|
+
_fInit($wrapper,onClick);
|
23
|
+
_fEnableLeftClickIcon();
|
24
|
+
_fStartListenClicks();
|
25
|
+
|
26
|
+
};
|
@@ -0,0 +1,16 @@
|
|
1
|
+
// добавляем фичу "изменение background-position-y при скролле"
|
2
|
+
|
3
|
+
var Paralaxer = function (_$wimages) {
|
4
|
+
|
5
|
+
var _fInit = function (_$wimages) {
|
6
|
+
|
7
|
+
$(document).on('scroll', function(){
|
8
|
+
var xx = $(this).scrollTop();
|
9
|
+
_$wimages.css('background-position-y', "-"+parseInt(xx/2)+'px');
|
10
|
+
});
|
11
|
+
|
12
|
+
};
|
13
|
+
|
14
|
+
_fInit(_$wimages);
|
15
|
+
|
16
|
+
};
|
@@ -0,0 +1,60 @@
|
|
1
|
+
"use strict";
|
2
|
+
|
3
|
+
// Анимированная индикация загрузки картинки
|
4
|
+
|
5
|
+
var Preloader = function ($slider_wrapper) {
|
6
|
+
|
7
|
+
// див, в котором живёт анимация загрузки (view)
|
8
|
+
var _$preloader;
|
9
|
+
|
10
|
+
// анимация загрузки
|
11
|
+
var _$spinner;
|
12
|
+
|
13
|
+
//slider_height РАССЧИТЫВАЕТСЯ для того, чтобы можно было сделать прелоадер высотой равной высоте слайдера
|
14
|
+
var _slider_height = null;
|
15
|
+
|
16
|
+
// инициализация
|
17
|
+
var _fInit = function ($slider_wrapper) {
|
18
|
+
|
19
|
+
// фиксируем view
|
20
|
+
_$preloader = $slider_wrapper.find('.preloader');
|
21
|
+
|
22
|
+
// рассчитываем высоту
|
23
|
+
_slider_height = $slider_wrapper.outerHeight();
|
24
|
+
|
25
|
+
// фиксируем анимацию загрузки
|
26
|
+
_$spinner = _$preloader.find('.spinner');
|
27
|
+
|
28
|
+
// корректируем высоту области прелоадера
|
29
|
+
_$preloader.css('height', _slider_height+'px');
|
30
|
+
|
31
|
+
// корректируем положение по вертикали блока spinner
|
32
|
+
var t = (_slider_height - _$spinner.outerHeight())/2;
|
33
|
+
_$spinner.css('top', t);
|
34
|
+
|
35
|
+
};
|
36
|
+
|
37
|
+
// показать анимацию загрузки
|
38
|
+
this.show = function () {
|
39
|
+
console.log('<preloader2.show>\t Покажем прелоадер.');
|
40
|
+
_$preloader.css('display','block');
|
41
|
+
_$preloader.css('opacity','1');
|
42
|
+
};
|
43
|
+
|
44
|
+
// скрыть анимацию загрузки
|
45
|
+
this.hide = function () {
|
46
|
+
console.log('<preloader2.hide>\t Спрячем прелоадер.');
|
47
|
+
|
48
|
+
_$preloader.css('opacity','0');
|
49
|
+
|
50
|
+
// NOTE:: по хардкоду подогнали время под длительность анимации, заданной в scss [qweqwe]
|
51
|
+
setTimeout(function () {
|
52
|
+
_$preloader.css('display','none');
|
53
|
+
},1000);
|
54
|
+
|
55
|
+
};
|
56
|
+
|
57
|
+
// поехали
|
58
|
+
_fInit($slider_wrapper);
|
59
|
+
|
60
|
+
};
|
@@ -0,0 +1,126 @@
|
|
1
|
+
// механику показа картинки фрейма содержит этот вспомогательный класс
|
2
|
+
// класс знает, что имеются два фрейма, один из которых видим, а другой, в это же время, скрыт
|
3
|
+
// класс показывает фреймы, жонглирует css-классом shown_right_now
|
4
|
+
|
5
|
+
// slider_height передаётся для того, чтобы можно было позиционировать текстовый блок по вертикали
|
6
|
+
var Shower = function ($wimages) {
|
7
|
+
|
8
|
+
// ссылка на дивы, в которых отрисовываются картинки
|
9
|
+
// изначально оба дива приходят "чистыми"
|
10
|
+
// В таком случае: берём первый попавшийся див , помещаем в него картинку, делаем его "показанным сейчас"
|
11
|
+
var _$wimages = null;
|
12
|
+
|
13
|
+
// после первого вызова show(), когда дивы перестают быть "чистыми", эта переменная сбросится в false
|
14
|
+
// нужна для того, чтобы при первом вызове взять первый попавшийся див и сделать его "показанным сейчас"
|
15
|
+
var _mark_first_call = true;
|
16
|
+
|
17
|
+
var _fInit = function ($wimages) {
|
18
|
+
_$wimages = $wimages;
|
19
|
+
|
20
|
+
$( window ).resize(_fOnResize);
|
21
|
+
|
22
|
+
};
|
23
|
+
|
24
|
+
var _fOnResize = function () {
|
25
|
+
_fCenterFrameTitle(_$wimages.filter('.shown_right_now'));
|
26
|
+
};
|
27
|
+
|
28
|
+
var _fCenterFrameTitle = function ($div) {
|
29
|
+
|
30
|
+
var $h1 = $div.find('h1');
|
31
|
+
var frame_height = $div.outerHeight();
|
32
|
+
var h1_height = $h1.outerHeight();
|
33
|
+
|
34
|
+
// позиционируем $div_text блок с текстом по вертикали по центру относительно высоты родителя _slider_height
|
35
|
+
var top = (frame_height - h1_height) / 2;
|
36
|
+
$h1.css('top', top + 'px');
|
37
|
+
|
38
|
+
};
|
39
|
+
|
40
|
+
// подставляем текст во фрейм
|
41
|
+
var _fPutTextInFrame = function ($div,props) {
|
42
|
+
//console.log("<_fPutTextInFrame>");
|
43
|
+
//console.log(props); // Object {title: "Оптовая торговля жидкостями для электронных сигарет"}
|
44
|
+
$div.find('h1').text(props["title"]);
|
45
|
+
|
46
|
+
_fCenterFrameTitle($div);
|
47
|
+
|
48
|
+
};
|
49
|
+
|
50
|
+
// низкоуровневый механизм показа картинки с подписями (вызывается только из this.show)
|
51
|
+
var _fShow = function ($div, url, props) {
|
52
|
+
console.log("<shower2._fShow>\t div class:" + $div.attr('class') + ", url: " + url);
|
53
|
+
|
54
|
+
// убираем плавность, возвращаем в начальное состояние
|
55
|
+
$div.removeClass('eased').css('opacity', '0');
|
56
|
+
|
57
|
+
// помещаем в него картинку
|
58
|
+
$div.css('background-image', 'url(' + url + ')');
|
59
|
+
|
60
|
+
// плавно проявляем фрейм
|
61
|
+
$div.addClass('eased').css('opacity','1');
|
62
|
+
|
63
|
+
// помечаем его как "показанный сейчас"
|
64
|
+
$div.addClass('shown_right_now');
|
65
|
+
|
66
|
+
// подставляем текст во фрейм
|
67
|
+
_fPutTextInFrame($div,props);
|
68
|
+
|
69
|
+
};
|
70
|
+
|
71
|
+
// низкоуровневый механизм плавного сокрытия картинки (вызывается только из this.hide)
|
72
|
+
var _fHide = function ($div) {
|
73
|
+
console.log("<shower2._fHide>\t div class: " + $div.attr('class'));
|
74
|
+
|
75
|
+
// плавно скрываем фрейм
|
76
|
+
$div.css('opacity', '0');
|
77
|
+
|
78
|
+
// удаляем пометку "показанный сейчас" у фрейма
|
79
|
+
$div.removeClass('shown_right_now');
|
80
|
+
|
81
|
+
};
|
82
|
+
|
83
|
+
// плавно показать картинку url
|
84
|
+
// Этот метод зафиксирован в маршруте "Показать Картинку"
|
85
|
+
// диаграммы d:\Distrs\drakon\drakon_editor1.27\work\vapehub\slider.drn
|
86
|
+
this.show = function (url, props) {
|
87
|
+
|
88
|
+
// если это первый вызов show() - сбрасываем переменную _mark_first_call, берем первый див и делаем его "показанным сейчас"
|
89
|
+
if (_mark_first_call) {
|
90
|
+
console.log("<shower2.show>\t Первый вызов.");
|
91
|
+
|
92
|
+
_mark_first_call = false;
|
93
|
+
|
94
|
+
// фиксируем видимый фрейм слайдера (он один из двух имеющихся)
|
95
|
+
//var $fi = $(_$wimages[0]);
|
96
|
+
var $fi = _$wimages.filter('.shown_right_now');
|
97
|
+
|
98
|
+
// покажем картинку с подписями
|
99
|
+
_fShow($fi, url, props);
|
100
|
+
|
101
|
+
}
|
102
|
+
|
103
|
+
// если это не первый вызов show() - значит какой-то фрейм уже показан
|
104
|
+
//
|
105
|
+
else {
|
106
|
+
console.log("<shower2.show>\t НЕ-первый вызов.");
|
107
|
+
|
108
|
+
// фиксируем показанный фрейм (shown image)
|
109
|
+
var $si = _$wimages.filter('.shown_right_now');
|
110
|
+
|
111
|
+
// фиксируем спрятанный фрейм (hidden image)
|
112
|
+
var $hi = _$wimages.not('.shown_right_now');
|
113
|
+
|
114
|
+
// прячем показанный фрейм
|
115
|
+
_fHide($si);
|
116
|
+
|
117
|
+
// показываем спрятанный фрейм
|
118
|
+
_fShow($hi, url, props);
|
119
|
+
|
120
|
+
}
|
121
|
+
|
122
|
+
};
|
123
|
+
|
124
|
+
_fInit($wimages);
|
125
|
+
|
126
|
+
};
|
@@ -0,0 +1,101 @@
|
|
1
|
+
// грузит картинки в "невидимом", фоновом режиме, показывает их
|
2
|
+
// другими словами: содержит механику загрузки и показа картинок
|
3
|
+
|
4
|
+
var Wloader = function (images, frames_props, $wimages, $slider_wrapper) {
|
5
|
+
|
6
|
+
//---[ VARS ]-------------------------------------------------------------------------------------------------------
|
7
|
+
|
8
|
+
// ссылка на враппер вокруг всего слайдера (подаётся для того, чтобы можно было прицепить прелоадер)
|
9
|
+
var _$slider_wrapper = $slider_wrapper;
|
10
|
+
|
11
|
+
// механику показа картинки фрейма содержит этот вспомогательный класс
|
12
|
+
var _shower = new Shower($wimages);
|
13
|
+
|
14
|
+
// images - ссылка на полный список урлов картинок для загрузки и отображения
|
15
|
+
var _images = images;
|
16
|
+
|
17
|
+
// ссылка на список описаний каждой картинки: h4 - крупный текст и p - мелкий
|
18
|
+
var _frames_props = frames_props;
|
19
|
+
|
20
|
+
// собственно, с помощью этого грузим
|
21
|
+
var _loader = null;
|
22
|
+
var _$loader = null;
|
23
|
+
|
24
|
+
// индикатор загрузки
|
25
|
+
var _preloader = new Preloader(_$slider_wrapper);
|
26
|
+
|
27
|
+
//---[ PUBLIC ]--------------------------------------------------------------------------------------------------
|
28
|
+
|
29
|
+
// либо покажем картинку, либо сначала загрузим, затем покажем картинку
|
30
|
+
this.checkAndShowFrame = function (frame_index) {
|
31
|
+
console.log('<wloader2.checkAndShowFrame>\t Покажем картинку с проверкой: frame_index = ' + frame_index);
|
32
|
+
|
33
|
+
// предварительно создадим то, с помощью чего будем непосредственно грузить
|
34
|
+
_loader = new Image();
|
35
|
+
_$loader = $(_loader);
|
36
|
+
|
37
|
+
// фиксируем урл текущей картинки
|
38
|
+
var u = _images[frame_index];
|
39
|
+
|
40
|
+
// фиксируем свойства картинки (подпись)
|
41
|
+
var pr = _frames_props[frame_index];
|
42
|
+
|
43
|
+
// инициация внутреннего механизма загрузки картинки (из кэша или из сети)
|
44
|
+
_$loader.attr({ src:u });
|
45
|
+
|
46
|
+
// если картинка уже есть в кэше - просто покажем её
|
47
|
+
if (_loader.complete || _loader.readyState === 4) {
|
48
|
+
__fShowFrame(u, pr);
|
49
|
+
}
|
50
|
+
|
51
|
+
// если картинки нет в кэше - запросим её с сервера
|
52
|
+
else {
|
53
|
+
__fLoadFrame(u, __fShowFrame, pr);
|
54
|
+
}
|
55
|
+
|
56
|
+
};
|
57
|
+
|
58
|
+
//---[ PRIVATE ]--------------------------------------------------------------------------------------------------
|
59
|
+
|
60
|
+
// вызывается только из _fCheckAndShowFrame
|
61
|
+
// отобразить картинку фрейма url со свойствами props
|
62
|
+
var __fShowFrame = function (url, props) {
|
63
|
+
console.log("<wloader2.__fShowFrame>\t Отображем картинку фрейма: url = " + url);
|
64
|
+
_shower.show(url, props);
|
65
|
+
};
|
66
|
+
|
67
|
+
// вызывается только из _fCheckAndShowFrame
|
68
|
+
// загрузить картинку фрейма
|
69
|
+
// будет показан прелоадер
|
70
|
+
// fCallBack - вызовется в конце успешной загрузки (скорее всего - это __fShowFrame)
|
71
|
+
// fCallBackParameter - можно передать один параметр, который дополнительно отдастся fCallBack (скорее всего это pr)
|
72
|
+
var __fLoadFrame = function (url, fCallBack, fCallBackParameter) {
|
73
|
+
console.log("<wloader2.__fLoadFrame>\t ГРУЗИМ картинку фрейма: url = " + url);
|
74
|
+
|
75
|
+
// покажем прелоадер
|
76
|
+
_preloader.show();
|
77
|
+
|
78
|
+
// загрузим
|
79
|
+
_$loader.load(function (responce, status, xhr) {
|
80
|
+
|
81
|
+
// картинку загрузить не получилось
|
82
|
+
if (status == 'error') {
|
83
|
+
|
84
|
+
}
|
85
|
+
|
86
|
+
// картинка успешно загружена
|
87
|
+
else {
|
88
|
+
|
89
|
+
// прячем прелоадер
|
90
|
+
_preloader.hide();
|
91
|
+
|
92
|
+
console.log("<wloader2.__fLoadFrame>\t Загрузили картинку, url: " + url);
|
93
|
+
|
94
|
+
fCallBack(url,fCallBackParameter);
|
95
|
+
|
96
|
+
}
|
97
|
+
});
|
98
|
+
|
99
|
+
};
|
100
|
+
|
101
|
+
};
|
@@ -0,0 +1,103 @@
|
|
1
|
+
'use strict';
|
2
|
+
|
3
|
+
var Wslider2 = function (options) {
|
4
|
+
|
5
|
+
//---[ VARS ]-------------------------------------------------------------------------------------------------------
|
6
|
+
|
7
|
+
// добавлена для того, чтобы передавать ссылку на wslider находясь внутри вложенных функций
|
8
|
+
var _this = this;
|
9
|
+
|
10
|
+
// по этим параметрам отрисован слайдер
|
11
|
+
var _options = {
|
12
|
+
parent_node: 'body',
|
13
|
+
height: 100
|
14
|
+
};
|
15
|
+
|
16
|
+
// MODEL: здесь содержится список урлов картинок, которые надо отобразить в слайдере
|
17
|
+
var _images = null;
|
18
|
+
|
19
|
+
// MODEL: здесь содержится список описаний каждой картинки: h4 - крупный текст и p - мелкий
|
20
|
+
var _frames_props = null;
|
21
|
+
|
22
|
+
// 2 дива, в которых отрисовываются картинки (они сменяют друг друга)
|
23
|
+
var _$wimages = null;
|
24
|
+
|
25
|
+
// указатель на текущий фрейм
|
26
|
+
var _current_frame = 0;
|
27
|
+
|
28
|
+
// контейнер, в который упакован слайдер
|
29
|
+
var _$wrapper = null;
|
30
|
+
|
31
|
+
// в ответе за загрузку и показ картинок фрейма (во время загрузки покажет прелодаер)
|
32
|
+
var _wloader = null;
|
33
|
+
|
34
|
+
// добавляет параллакс при скролле
|
35
|
+
var _parallaxer = null;
|
36
|
+
|
37
|
+
// если картинок более 1 - добавляем иконку мышки
|
38
|
+
var _left_click_icon = null;
|
39
|
+
|
40
|
+
//---[ FUNCTIONS ]--------------------------------------------------------------------------------------------------
|
41
|
+
|
42
|
+
// микро-контроллер: меняет переменную _current_frame, управляет Wloader
|
43
|
+
var _fNextFrame = function () {
|
44
|
+
_current_frame += 1;
|
45
|
+
if (_current_frame >= _images.length) {
|
46
|
+
_current_frame = 0;
|
47
|
+
}
|
48
|
+
//console.log("<wslider._fNextFrame> _current_frame = " + _current_frame);
|
49
|
+
_wloader.checkAndShowFrame(_current_frame);
|
50
|
+
};
|
51
|
+
var _fPrevFrame = function () {
|
52
|
+
_current_frame -= 1;
|
53
|
+
if (_current_frame < 0) {
|
54
|
+
_current_frame = _images.length-1;
|
55
|
+
}
|
56
|
+
//console.log("<wslider._fPrevFrame> _current_frame = " + _current_frame);
|
57
|
+
_wloader.checkAndShowFrame(_current_frame);
|
58
|
+
};
|
59
|
+
|
60
|
+
// инициализация
|
61
|
+
var _fInit = function (options) {
|
62
|
+
|
63
|
+
// акуализируем параметры слайдера
|
64
|
+
_options = $.extend(_options, options);
|
65
|
+
|
66
|
+
// зафиксируем VIEW: контейнер и дивы, в которых будут жить картинки
|
67
|
+
_$wrapper = $(_options.parent_node).find('.wslider2');
|
68
|
+
_$wimages = _$wrapper.find('div.frame');
|
69
|
+
|
70
|
+
// зафиксируем MODEL: список картинок для отображения
|
71
|
+
_images = _$wrapper.data('images');
|
72
|
+
|
73
|
+
// зафиксируем MODEL: массив свойств картинок (текстовые подписи фреймов), разложенные в том же порядке что и _images
|
74
|
+
_frames_props = _$wrapper.data('props');
|
75
|
+
|
76
|
+
// инициализация механизма загрузки и показа картинок
|
77
|
+
_wloader = new Wloader(
|
78
|
+
_images,
|
79
|
+
_frames_props,
|
80
|
+
_$wimages,
|
81
|
+
_$wrapper
|
82
|
+
);
|
83
|
+
|
84
|
+
// добавляем параллакс
|
85
|
+
_parallaxer = new Paralaxer(_$wimages);
|
86
|
+
|
87
|
+
// если фреймов более 1 - добавляем иконку "кликните левой мышкой для смены кадра"
|
88
|
+
if (_images.length > 1) {
|
89
|
+
_left_click_icon = new LeftClickIcon(_$wrapper, _fNextFrame);
|
90
|
+
}
|
91
|
+
|
92
|
+
};
|
93
|
+
|
94
|
+
var _fStart = function () {
|
95
|
+
_wloader.checkAndShowFrame(_current_frame);
|
96
|
+
};
|
97
|
+
|
98
|
+
//---[ RUN ]--------------------------------------------------------------------------------------------------
|
99
|
+
|
100
|
+
_fInit(options);
|
101
|
+
_fStart();
|
102
|
+
|
103
|
+
};
|
@@ -0,0 +1,85 @@
|
|
1
|
+
div.wslider2 {
|
2
|
+
position: relative;
|
3
|
+
|
4
|
+
div.frame {
|
5
|
+
display: none;
|
6
|
+
position: relative;
|
7
|
+
|
8
|
+
&.shown_right_now {
|
9
|
+
|
10
|
+
position: relative;
|
11
|
+
|
12
|
+
background-repeat: no-repeat;
|
13
|
+
background-position: center center;
|
14
|
+
|
15
|
+
background-size: 100% 100%;
|
16
|
+
background-size: cover;
|
17
|
+
|
18
|
+
height: 100%;
|
19
|
+
height: 100vh;
|
20
|
+
|
21
|
+
width: 100%;
|
22
|
+
display: -ms-flexbox;
|
23
|
+
display: flex;
|
24
|
+
z-index: 1;
|
25
|
+
overflow: hidden;
|
26
|
+
|
27
|
+
align-items: center;
|
28
|
+
justify-content: center;
|
29
|
+
text-align: center;
|
30
|
+
|
31
|
+
-ms-flex-align: center;
|
32
|
+
-ms-flex-pack: center;
|
33
|
+
}
|
34
|
+
|
35
|
+
h1 {
|
36
|
+
position: relative;
|
37
|
+
width: 100%;
|
38
|
+
/*text-shadow: 0 0 5px rgba(0, 0, 0, 0.8);*/
|
39
|
+
z-index: 7;
|
40
|
+
}
|
41
|
+
|
42
|
+
div.fadee {
|
43
|
+
position: absolute;
|
44
|
+
top:0;
|
45
|
+
left:0;
|
46
|
+
bottom:0;
|
47
|
+
right:0;
|
48
|
+
background-color: rgba(0,0,0,0.3);
|
49
|
+
z-index: 6;
|
50
|
+
}
|
51
|
+
|
52
|
+
}
|
53
|
+
|
54
|
+
div.preloader {
|
55
|
+
|
56
|
+
position: absolute;
|
57
|
+
top: 0;
|
58
|
+
left: 0;
|
59
|
+
right: 0;
|
60
|
+
bottom: 0;
|
61
|
+
text-align: center;
|
62
|
+
font-size: 20px;
|
63
|
+
background: rgba(0, 0, 0, .4);
|
64
|
+
opacity: 0;
|
65
|
+
display: none;
|
66
|
+
z-index: 2;
|
67
|
+
|
68
|
+
// NOTE:: время синхронизировано с js [preloader.js, qweqwe]
|
69
|
+
-webkit-transition: opacity 1s ease-out;
|
70
|
+
-moz-transition: opacity 1s ease-out;
|
71
|
+
-ms-transition: opacity 1s ease-out;
|
72
|
+
-o-transition: opacity 1s ease-out;
|
73
|
+
transition: opacity 1s ease-out;
|
74
|
+
|
75
|
+
// дополнения к библиотечному, каноничному стилю
|
76
|
+
.spinner {
|
77
|
+
margin: 0 auto;
|
78
|
+
/*width: 35px;
|
79
|
+
height: 35px;*/
|
80
|
+
position: relative;
|
81
|
+
}
|
82
|
+
|
83
|
+
}
|
84
|
+
|
85
|
+
}
|
@@ -0,0 +1,71 @@
|
|
1
|
+
$base-line-height: 24px;
|
2
|
+
$white: rgb(255,255,255);
|
3
|
+
$off-white: rgba($white, 0.2);
|
4
|
+
$spin-duration: 1s;
|
5
|
+
$pulse-duration: 750ms;
|
6
|
+
|
7
|
+
@keyframes spin {
|
8
|
+
0% {
|
9
|
+
transform: rotate(0deg);
|
10
|
+
}
|
11
|
+
100% {
|
12
|
+
transform: rotate(360deg);
|
13
|
+
}
|
14
|
+
}
|
15
|
+
|
16
|
+
@keyframes pulse {
|
17
|
+
50% {
|
18
|
+
background: $white;
|
19
|
+
}
|
20
|
+
}
|
21
|
+
|
22
|
+
/*html {
|
23
|
+
height: 100%;
|
24
|
+
}
|
25
|
+
body {
|
26
|
+
@extend html;
|
27
|
+
display: flex;
|
28
|
+
justify-content: space-around;
|
29
|
+
align-items: center;
|
30
|
+
background: #333333;
|
31
|
+
}*/
|
32
|
+
|
33
|
+
.loading {
|
34
|
+
border-radius: 50%;
|
35
|
+
width: $base-line-height;
|
36
|
+
height: $base-line-height;
|
37
|
+
border: .25rem solid $off-white;
|
38
|
+
border-top-color: $white;
|
39
|
+
animation: spin $spin-duration infinite linear;
|
40
|
+
&--double {
|
41
|
+
border-style: double;
|
42
|
+
border-width: .5rem;
|
43
|
+
}
|
44
|
+
}
|
45
|
+
|
46
|
+
.loading-pulse {
|
47
|
+
position: relative;
|
48
|
+
width: ($base-line-height / 4);
|
49
|
+
height: $base-line-height;
|
50
|
+
background: $off-white;
|
51
|
+
animation: pulse $pulse-duration infinite;
|
52
|
+
animation-delay: ($pulse-duration / 3);
|
53
|
+
&:before, &:after {
|
54
|
+
content: '';
|
55
|
+
position: absolute;
|
56
|
+
display: block;
|
57
|
+
height: ($base-line-height / 1.5);
|
58
|
+
width: ($base-line-height / 4);
|
59
|
+
background: $off-white;
|
60
|
+
top: 50%;
|
61
|
+
transform: translateY(-50%);
|
62
|
+
animation: pulse $pulse-duration infinite;
|
63
|
+
}
|
64
|
+
&:before {
|
65
|
+
left: -($base-line-height / 2);
|
66
|
+
}
|
67
|
+
&:after {
|
68
|
+
left: ($base-line-height / 2);
|
69
|
+
animation-delay: ($pulse-duration / 1.5);
|
70
|
+
}
|
71
|
+
}
|
@@ -0,0 +1,59 @@
|
|
1
|
+
@mixin _after {
|
2
|
+
content: "";
|
3
|
+
display: block;
|
4
|
+
position: absolute;
|
5
|
+
width: 50px;
|
6
|
+
height: 50px;
|
7
|
+
z-index: 556;
|
8
|
+
|
9
|
+
opacity: 0.0;
|
10
|
+
-webkit-transition: all 0.8s cubic-bezier(.25,.8,.25,1);
|
11
|
+
-moz-transition: all 0.8s cubic-bezier(.25,.8,.25,1);
|
12
|
+
-ms-transition: all 0.8s cubic-bezier(.25,.8,.25,1);
|
13
|
+
-o-transition: all 0.8s cubic-bezier(.25,.8,.25,1);
|
14
|
+
transition: all 0.8s cubic-bezier(.25,.8,.25,1);
|
15
|
+
|
16
|
+
}
|
17
|
+
|
18
|
+
.with_left_click_icon {
|
19
|
+
height: 0;
|
20
|
+
|
21
|
+
> div {
|
22
|
+
/*height: 100%;*/ /* NOTE:: рекомендуется устанавливать позицию в custom классах хост приложения */
|
23
|
+
/*top: 67px;*/ /* NOTE:: рекомендуется устанавливать позицию в custom классах хост приложения */
|
24
|
+
|
25
|
+
width: 80%;
|
26
|
+
z-index: 5556;
|
27
|
+
background-color: rgba(0,0,0,0);
|
28
|
+
cursor: pointer;
|
29
|
+
position: absolute;
|
30
|
+
|
31
|
+
&:after {
|
32
|
+
/*bottom: 0;*/ /* NOTE:: рекомендуется устанавливать позицию в custom классах хост приложения */
|
33
|
+
@include _after;
|
34
|
+
background: transparent url(image_path('left_click_icon.png')) no-repeat 0 0;
|
35
|
+
}
|
36
|
+
|
37
|
+
&:hover {
|
38
|
+
|
39
|
+
&:after {
|
40
|
+
opacity: 0.8;
|
41
|
+
}
|
42
|
+
|
43
|
+
}
|
44
|
+
|
45
|
+
}
|
46
|
+
|
47
|
+
&.white_icon {
|
48
|
+
|
49
|
+
> div {
|
50
|
+
|
51
|
+
&:after {
|
52
|
+
background: transparent url(image_path('left_click_icon_white.png')) no-repeat 0 0;
|
53
|
+
}
|
54
|
+
|
55
|
+
}
|
56
|
+
|
57
|
+
}
|
58
|
+
|
59
|
+
}
|
@@ -0,0 +1,31 @@
|
|
1
|
+
module C80Wslider2
|
2
|
+
module AppHelper
|
3
|
+
|
4
|
+
def render_wslider2
|
5
|
+
|
6
|
+
# извлечём фреймы
|
7
|
+
frames = C80Wslider2::Frame.all.order('rand()')
|
8
|
+
|
9
|
+
# пути до картинок соберём сюда
|
10
|
+
images = []
|
11
|
+
|
12
|
+
# свойства фреймов (подписи, текст) соберём тут
|
13
|
+
props = []
|
14
|
+
|
15
|
+
# соберём пути
|
16
|
+
frames.each do |frame|
|
17
|
+
images << image_path(frame.image.thumb_big)
|
18
|
+
props << { title: frame.title }
|
19
|
+
end
|
20
|
+
#Rails.logger.debug "[TRACE] <render_wslider2> images: #{images}"
|
21
|
+
|
22
|
+
render :partial => 'c80_wslider2/wslider2',
|
23
|
+
:locals => {
|
24
|
+
images: images,# ["/uploads/wslider2/thumb_big_photo_23bd.jpg"]
|
25
|
+
props: props
|
26
|
+
}
|
27
|
+
|
28
|
+
end
|
29
|
+
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,85 @@
|
|
1
|
+
module C80Wslider2
|
2
|
+
|
3
|
+
# грузит картинку слайдера
|
4
|
+
class FrameUploader < CarrierWave::Uploader::Base
|
5
|
+
|
6
|
+
include CarrierWave::MiniMagick
|
7
|
+
|
8
|
+
storage :file
|
9
|
+
|
10
|
+
process :resize_to_limit => [1600, 1600]
|
11
|
+
|
12
|
+
version :thumb_big do
|
13
|
+
process :resize_to_big_by_width
|
14
|
+
end
|
15
|
+
|
16
|
+
version :thumb_preview do
|
17
|
+
process :resize_to_preview
|
18
|
+
end
|
19
|
+
|
20
|
+
def store_dir
|
21
|
+
'uploads/wslider2'
|
22
|
+
end
|
23
|
+
|
24
|
+
def filename
|
25
|
+
if original_filename
|
26
|
+
"photo_#{secure_token(4)}.#{file.extension}"
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
# меням размер оригинальной картинки, подгоняя её к требуемой ширине (высота рассчитается автоматом)
|
31
|
+
def resize_to_big_by_width
|
32
|
+
|
33
|
+
manipulate! do |img|
|
34
|
+
|
35
|
+
# извлекаем ширину и подгоняем высоту
|
36
|
+
w = C80Wslider2::Prop.first.big_width
|
37
|
+
h = calc_height_of_image(w)
|
38
|
+
|
39
|
+
# меняем размер
|
40
|
+
img.resize "#{w}x#{h}<"
|
41
|
+
img = yield(img) if block_given?
|
42
|
+
img
|
43
|
+
|
44
|
+
end
|
45
|
+
|
46
|
+
end
|
47
|
+
|
48
|
+
# пока используется только для показа картинки в админке
|
49
|
+
def resize_to_preview
|
50
|
+
manipulate! do |img|
|
51
|
+
|
52
|
+
w = C80Wslider2::Prop.first.preview_width
|
53
|
+
h = C80Wslider2::Prop.first.preview_height
|
54
|
+
|
55
|
+
img.resize "#{w}x#{h}>"
|
56
|
+
img = yield(img) if block_given?
|
57
|
+
img
|
58
|
+
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
protected
|
63
|
+
|
64
|
+
def secure_token(length=16)
|
65
|
+
var = :"@#{mounted_as}_secure_token"
|
66
|
+
model.instance_variable_get(var) or model.instance_variable_set(var, SecureRandom.hex(length/2))
|
67
|
+
end
|
68
|
+
|
69
|
+
private
|
70
|
+
|
71
|
+
# рассчитаем высоту картинки, которая получится, когда подгоняем картинку по ширине w
|
72
|
+
def calc_height_of_image(w)
|
73
|
+
model_image = ::MiniMagick::Image.open(model.image.current_path)
|
74
|
+
calc_height(w, model_image["width"], model_image["height"])
|
75
|
+
end
|
76
|
+
|
77
|
+
# подгоняем по ширине, рассчитываем высоту
|
78
|
+
def calc_height(width, original_w, original_h)
|
79
|
+
k = width.to_f/original_w
|
80
|
+
original_h * k
|
81
|
+
end
|
82
|
+
|
83
|
+
end
|
84
|
+
|
85
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
<div class="wslider2" data-images='<%= images.to_json.html_safe %>' data-props='<%= props.to_json.html_safe %>'>
|
2
|
+
|
3
|
+
<div class="frame shown_right_now">
|
4
|
+
<h1></h1>
|
5
|
+
<div class="fadee"></div>
|
6
|
+
</div>
|
7
|
+
<div class="frame">
|
8
|
+
<h1></h1>
|
9
|
+
<div class="fadee"></div>
|
10
|
+
</div>
|
11
|
+
|
12
|
+
<div class="preloader">
|
13
|
+
|
14
|
+
<div class="spinner loading"></div>
|
15
|
+
|
16
|
+
</div>
|
17
|
+
|
18
|
+
</div>
|
data/bin/console
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require "bundler/setup"
|
4
|
+
require "c80_wslider2"
|
5
|
+
|
6
|
+
# You can add fixtures and/or initialization code here to make experimenting
|
7
|
+
# with your gem easier. You can also use a different console, if you like.
|
8
|
+
|
9
|
+
# (If you use this, don't forget to add pry to your Gemfile!)
|
10
|
+
# require "pry"
|
11
|
+
# Pry.start
|
12
|
+
|
13
|
+
require "irb"
|
14
|
+
IRB.start
|
data/bin/setup
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 'c80_wslider2/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = "c80_wslider2"
|
8
|
+
spec.version = C80Wslider2::VERSION
|
9
|
+
spec.authors = ["C80609A"]
|
10
|
+
spec.email = ["c080609a@gmail.com"]
|
11
|
+
|
12
|
+
spec.summary = "Wide screen slider gem, ver 2"
|
13
|
+
spec.description = "Gem adds wide screen slider to site"
|
14
|
+
spec.homepage = "https://github.com/c080609a/c80_wslider2"
|
15
|
+
spec.license = "MIT"
|
16
|
+
|
17
|
+
spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
|
18
|
+
spec.bindir = "exe"
|
19
|
+
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
20
|
+
spec.require_paths = ["lib"]
|
21
|
+
|
22
|
+
spec.add_development_dependency "bundler", "~> 1.12"
|
23
|
+
spec.add_development_dependency "rake", "~> 10.0"
|
24
|
+
spec.add_dependency 'activesupport', ['>= 3.0.0']
|
25
|
+
|
26
|
+
end
|
@@ -0,0 +1,10 @@
|
|
1
|
+
class C80Wslider2CreateProps < ActiveRecord::Migration
|
2
|
+
def change
|
3
|
+
create_table :c80_wslider2_props, :options => 'COLLATE=utf8_unicode_ci' do |t|
|
4
|
+
t.integer :big_width # под эту ширину подгоняется картинка, вставляемая в слайдер (высота рассчитаеся автоматом)
|
5
|
+
t.integer :preview_width # пока используется только для показа картинки в админке
|
6
|
+
t.integer :preview_height # пока используется только для показа картинки в админке
|
7
|
+
t.timestamps null: false
|
8
|
+
end
|
9
|
+
end
|
10
|
+
end
|
@@ -0,0 +1,8 @@
|
|
1
|
+
# rake db:seed:c80_wslider2_01_fill_props
|
2
|
+
|
3
|
+
C80Wslider2::Prop.delete_all
|
4
|
+
C80Wslider2::Prop.create!({
|
5
|
+
preview_width:250, # пока используется только для показа картинки в админке
|
6
|
+
preview_height:164, # пока используется только для показа картинки в админке
|
7
|
+
big_width:1600 # под эту ширину подгоняется картинка, вставляемая в слайдер
|
8
|
+
})
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module C80Wslider2
|
2
|
+
class Engine < ::Rails::Engine
|
3
|
+
isolate_namespace C80Wslider2
|
4
|
+
|
5
|
+
initializer :c80_wslider2_engine do
|
6
|
+
if defined?(ActiveAdmin)
|
7
|
+
ActiveAdmin.application.load_paths += Dir["#{config.root}/app/models/**/"]
|
8
|
+
#ActiveAdmin.application.load_paths += Dir["#{config.root}/app/models/concerns/**/"]
|
9
|
+
ActiveAdmin.application.load_paths += Dir["#{config.root}/app/admin/c80_wslider2/**/"]
|
10
|
+
# ActiveAdmin.application.load_paths += Dir["#{config.root}/app/jobs/**/"]
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
initializer :append_migrations do |app|
|
15
|
+
unless app.root.to_s.match root.to_s
|
16
|
+
config.paths["db/migrate"].expanded.each do |expanded_path|
|
17
|
+
app.config.paths["db/migrate"] << expanded_path
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
23
|
+
end
|
data/lib/c80_wslider2.rb
ADDED
metadata
ADDED
@@ -0,0 +1,120 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: c80_wslider2
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- C80609A
|
8
|
+
autorequire:
|
9
|
+
bindir: exe
|
10
|
+
cert_chain: []
|
11
|
+
date: 2016-10-02 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.12'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '1.12'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rake
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '10.0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '10.0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: activesupport
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: 3.0.0
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: 3.0.0
|
55
|
+
description: Gem adds wide screen slider to site
|
56
|
+
email:
|
57
|
+
- c080609a@gmail.com
|
58
|
+
executables: []
|
59
|
+
extensions: []
|
60
|
+
extra_rdoc_files: []
|
61
|
+
files:
|
62
|
+
- ".gitignore"
|
63
|
+
- CODE_OF_CONDUCT.md
|
64
|
+
- Gemfile
|
65
|
+
- LICENSE.txt
|
66
|
+
- README.md
|
67
|
+
- Rakefile
|
68
|
+
- app/admin/c80_wslider2/frames.rb
|
69
|
+
- app/assets/images/left_click_icon.png
|
70
|
+
- app/assets/images/left_click_icon_white.png
|
71
|
+
- app/assets/javascripts/c80_wslider2.js.coffee
|
72
|
+
- app/assets/javascripts/c80_wslider2/components/wloader.js
|
73
|
+
- app/assets/javascripts/c80_wslider2/components/wloader/left_click_icon.js
|
74
|
+
- app/assets/javascripts/c80_wslider2/components/wloader/paralaxer.js
|
75
|
+
- app/assets/javascripts/c80_wslider2/components/wloader/preloader.js
|
76
|
+
- app/assets/javascripts/c80_wslider2/components/wloader/shower.js
|
77
|
+
- app/assets/javascripts/c80_wslider2/wslider2.js
|
78
|
+
- app/assets/stylesheets/c80_wslider2.scss
|
79
|
+
- app/assets/stylesheets/c80_wslider2/wslider2.scss
|
80
|
+
- app/assets/stylesheets/lib/spinner_pulse.scss
|
81
|
+
- app/assets/stylesheets/lib/with_left_click_icon.scss
|
82
|
+
- app/helpers/c80_wslider2/app_helper.rb
|
83
|
+
- app/models/c80_wslider2/frame.rb
|
84
|
+
- app/models/c80_wslider2/prop.rb
|
85
|
+
- app/uploaders/c80_wslider2/frame_uploader.rb
|
86
|
+
- app/views/c80_wslider2/_wslider2.html.erb
|
87
|
+
- bin/console
|
88
|
+
- bin/setup
|
89
|
+
- c80_wslider2.gemspec
|
90
|
+
- db/migrate/20160927090909_c80_wslider2_create_props.rb
|
91
|
+
- db/migrate/20160927091010_c80_wslider2_create_frames.rb
|
92
|
+
- db/seeds/c80_wslider2_01_fill_props.rb
|
93
|
+
- lib/c80_wslider2.rb
|
94
|
+
- lib/c80_wslider2/engine.rb
|
95
|
+
- lib/c80_wslider2/version.rb
|
96
|
+
homepage: https://github.com/c080609a/c80_wslider2
|
97
|
+
licenses:
|
98
|
+
- MIT
|
99
|
+
metadata: {}
|
100
|
+
post_install_message:
|
101
|
+
rdoc_options: []
|
102
|
+
require_paths:
|
103
|
+
- lib
|
104
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
105
|
+
requirements:
|
106
|
+
- - ">="
|
107
|
+
- !ruby/object:Gem::Version
|
108
|
+
version: '0'
|
109
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
110
|
+
requirements:
|
111
|
+
- - ">="
|
112
|
+
- !ruby/object:Gem::Version
|
113
|
+
version: '0'
|
114
|
+
requirements: []
|
115
|
+
rubyforge_project:
|
116
|
+
rubygems_version: 2.5.1
|
117
|
+
signing_key:
|
118
|
+
specification_version: 4
|
119
|
+
summary: Wide screen slider gem, ver 2
|
120
|
+
test_files: []
|