c80_wslider2 0.1.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (36) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +10 -0
  3. data/CODE_OF_CONDUCT.md +49 -0
  4. data/Gemfile +4 -0
  5. data/LICENSE.txt +21 -0
  6. data/README.md +41 -0
  7. data/Rakefile +2 -0
  8. data/app/admin/c80_wslider2/frames.rb +40 -0
  9. data/app/assets/images/left_click_icon.png +0 -0
  10. data/app/assets/images/left_click_icon_white.png +0 -0
  11. data/app/assets/javascripts/c80_wslider2/components/wloader/left_click_icon.js +26 -0
  12. data/app/assets/javascripts/c80_wslider2/components/wloader/paralaxer.js +16 -0
  13. data/app/assets/javascripts/c80_wslider2/components/wloader/preloader.js +60 -0
  14. data/app/assets/javascripts/c80_wslider2/components/wloader/shower.js +126 -0
  15. data/app/assets/javascripts/c80_wslider2/components/wloader.js +101 -0
  16. data/app/assets/javascripts/c80_wslider2/wslider2.js +103 -0
  17. data/app/assets/javascripts/c80_wslider2.js.coffee +2 -0
  18. data/app/assets/stylesheets/c80_wslider2/wslider2.scss +85 -0
  19. data/app/assets/stylesheets/c80_wslider2.scss +2 -0
  20. data/app/assets/stylesheets/lib/spinner_pulse.scss +71 -0
  21. data/app/assets/stylesheets/lib/with_left_click_icon.scss +59 -0
  22. data/app/helpers/c80_wslider2/app_helper.rb +31 -0
  23. data/app/models/c80_wslider2/frame.rb +5 -0
  24. data/app/models/c80_wslider2/prop.rb +4 -0
  25. data/app/uploaders/c80_wslider2/frame_uploader.rb +85 -0
  26. data/app/views/c80_wslider2/_wslider2.html.erb +18 -0
  27. data/bin/console +14 -0
  28. data/bin/setup +8 -0
  29. data/c80_wslider2.gemspec +26 -0
  30. data/db/migrate/20160927090909_c80_wslider2_create_props.rb +10 -0
  31. data/db/migrate/20160927091010_c80_wslider2_create_frames.rb +9 -0
  32. data/db/seeds/c80_wslider2_01_fill_props.rb +8 -0
  33. data/lib/c80_wslider2/engine.rb +23 -0
  34. data/lib/c80_wslider2/version.rb +3 -0
  35. data/lib/c80_wslider2.rb +8 -0
  36. 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
@@ -0,0 +1,10 @@
1
+ /.idea/
2
+ /.bundle/
3
+ /.yardoc
4
+ /Gemfile.lock
5
+ /_yardoc/
6
+ /coverage/
7
+ /doc/
8
+ /pkg/
9
+ /spec/reports/
10
+ /tmp/
@@ -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
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in c80_wslider2.gemspec
4
+ gemspec
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,2 @@
1
+ require "bundler/gem_tasks"
2
+ task :default => :spec
@@ -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
@@ -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,2 @@
1
+ #= require_tree ./c80_wslider2/components
2
+ #= require c80_wslider2/wslider2
@@ -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,2 @@
1
+ @import "lib/**/*";
2
+ @import "c80_wslider2/**/*";
@@ -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,5 @@
1
+ module C80Wslider2
2
+ class Frame < ActiveRecord::Base
3
+ mount_uploader :image, FrameUploader
4
+ end
5
+ end
@@ -0,0 +1,4 @@
1
+ module C80Wslider2
2
+ class Prop < ActiveRecord::Base
3
+ end
4
+ 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,8 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+ set -vx
5
+
6
+ bundle install
7
+
8
+ # Do any other automated setup that you need to do here
@@ -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,9 @@
1
+ class C80Wslider2CreateFrames < ActiveRecord::Migration
2
+ def change
3
+ create_table :c80_wslider2_frames, :options => 'COLLATE=utf8_unicode_ci' do |t|
4
+ t.string :image
5
+ t.string :title
6
+ t.timestamps null: false
7
+ end
8
+ end
9
+ 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
@@ -0,0 +1,3 @@
1
+ module C80Wslider2
2
+ VERSION = "0.1.0.1"
3
+ end
@@ -0,0 +1,8 @@
1
+ require "c80_wslider2/version"
2
+ require "c80_wslider2/engine"
3
+
4
+ module C80Wslider2
5
+ def self.table_name_prefix
6
+ 'c80_wslider2_'
7
+ end
8
+ end
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: []