c80_catoffers 0.1.0.3 → 0.1.0.4

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.
Files changed (39) hide show
  1. checksums.yaml +4 -4
  2. data/app/admin/c80_catoffers/csamples.rb +69 -0
  3. data/app/admin/c80_catoffers/csprops.rb +41 -0
  4. data/app/assets/javascripts/c80_catoffers/offer_full_desc.js +52 -47
  5. data/app/assets/javascripts/c80_catoffers/offers_ajax.js +89 -0
  6. data/app/assets/stylesheets/c80_catoffers/offer_full_desc.scss +3 -2
  7. data/app/assets/stylesheets/c80_catoffers/offer_list_grouped.scss +23 -0
  8. data/app/assets/stylesheets/c80_catoffers/offer_list_widget.scss +19 -15
  9. data/app/assets/stylesheets/c80_catoffers/will_paginate.scss +65 -0
  10. data/app/controllers/c80_catoffers/application_controller.rb +25 -0
  11. data/app/helpers/c80_catoffers/app_helper.rb +47 -4
  12. data/app/helpers/c80_catoffers/csamples_helper.rb +52 -0
  13. data/app/helpers/c80_catoffers/inner/modal_helper.rb +16 -0
  14. data/app/helpers/c80_catoffers/price_helper.rb +17 -0
  15. data/app/helpers/c80_catoffers/urls_helper.rb +7 -3
  16. data/app/models/c80_catoffers/crow.rb +22 -0
  17. data/app/models/c80_catoffers/csample.rb +40 -0
  18. data/app/models/c80_catoffers/csprop.rb +5 -0
  19. data/app/models/c80_catoffers/offer.rb +7 -0
  20. data/app/uploaders/c80_catoffers/csphoto_uploader.rb +49 -0
  21. data/app/views/c80_catoffers/_bs_modal.html.erb +18 -0
  22. data/app/views/c80_catoffers/_csamples_widget.html.erb +43 -0
  23. data/app/views/c80_catoffers/_offers_list_grouped.html.erb +5 -2
  24. data/app/views/c80_catoffers/_offers_list_widget.html.erb +54 -48
  25. data/app/views/c80_catoffers/_offers_page.html.erb +23 -0
  26. data/app/views/c80_catoffers/_popup_price.html.erb +2 -0
  27. data/app/views/c80_catoffers/application/fake_main.html.erb +0 -0
  28. data/app/views/c80_catoffers/application/offers_guru.js.erb +10 -0
  29. data/app/views/c80_catoffers/application/price_me.js.erb +19 -0
  30. data/config/locales/ru.yml +6 -0
  31. data/config/routes.rb +3 -9
  32. data/db/migrate/20161105123939_c80_catoffers_add_per_page_to_props.rb +5 -0
  33. data/db/migrate/20161106154221_create_c80_catoffers_csamples.rb +13 -0
  34. data/db/migrate/20161106191544_create_c80_catoffers_crows.rb +13 -0
  35. data/db/migrate/20161107115555_c80_catoffers_create_csprops.rb +7 -0
  36. data/db/migrate/20161107123333_c80_catoffers_create_join_table_csprops_csamples.rb +11 -0
  37. data/db/seeds/c80_catoffers_01_fill_props.rb +2 -1
  38. data/lib/c80_catoffers/version.rb +1 -1
  39. metadata +27 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: a6dbd0074caa473be1baafb8f7e7d66e2229db2d
4
- data.tar.gz: df3c45d4db793127c49799c4f69b99c7f5066947
3
+ metadata.gz: 48db66d169bf13945de278b3a3dea333caad80ea
4
+ data.tar.gz: cf5e62ca220ed3f47c35a37589cd52c4e6df861c
5
5
  SHA512:
6
- metadata.gz: 4764a36f6d498badab978f4c2c40a98b01da95919b36ca9245e26504728ca56115afd2c7deb4445883db3057fb737bab651002943fa60eb7461cc0ae30f14a96
7
- data.tar.gz: 47e9f2b06009f2b75d64f17841dcc2f29f143663b54a42d08f677a2a9a3440d7c5d9e7e0e29554d700a7ee9efde3d4160732c724832db6aef54f19b1cac2ca73
6
+ metadata.gz: b9b13025570c9eab19e345d387668364430e3385b24fec4fd7394e8579940c3bd4ca2fc858447ed68a11924c9c2c654befd4448a9c3becf348d8d60647cc1099
7
+ data.tar.gz: 51e597afa2bb90da566cbb06a27d6c937c16e4e557d44c4e529be99a3c4f13961c15b9c0641eff06d2c8602d479b61cd738e4dff0733a37761b54f4d2a3436eb
@@ -0,0 +1,69 @@
1
+ ActiveAdmin.register C80Catoffers::Csample, as: 'Csample' do
2
+
3
+ config.per_page = 100
4
+
5
+ menu :label => 'Рассчёт стоимости', # TODO_MY:: название пункта меню перенесести в параметры в базу
6
+ priority: 4,
7
+ parent: 'Услуги' # TODO_MY:: название пункта меню перенесести в параметры в базу
8
+
9
+ permit_params :title,
10
+ :sub_title,
11
+ :csphoto,
12
+ :ord,
13
+ :crows_attributes => [:id, :_destroy, :offer_id, :ord]
14
+
15
+ batch_action :destroy, false
16
+
17
+ config.sort_order = 'ord_asc'
18
+
19
+ # before_filter :skip_sidebar!, :only => :index
20
+
21
+ index do
22
+ selectable_column
23
+ column :ord
24
+ column :title
25
+ column :sub_title
26
+ column :csphoto do |csample|
27
+ if csample.csphoto.present?
28
+ link_to image_tag(csample.csphoto.thumb_md, style: 'width:150px;'), csample.csphoto.url, target: '_blank'
29
+ end
30
+ end
31
+ column :crows do |csample|
32
+ s = csample.crows.def_order
33
+ .map{ |crow| "<li>#{crow.offer.title} (#{crow.offer.price})</li>"}
34
+ .join('')
35
+ s += "<li>Итого: #{ csample.summ_price }</li>"
36
+ "<ul>#{s}</ul>".html_safe
37
+ end
38
+ actions
39
+ end
40
+
41
+ form(:html => {:multipart => true}) do |f|
42
+
43
+ f.inputs 'Свойства' do
44
+
45
+ f.input :title
46
+ f.input :sub_title
47
+ f.input :ord
48
+
49
+ f.input :csphoto,
50
+ :as => :file,
51
+ :hint => image_tag(f.object.csphoto.thumb_md)
52
+
53
+ f.inputs 'Услуги' do
54
+ f.has_many :crows, allow_destroy: true do |crow|
55
+ crow.input :ord
56
+ crow.input :offer,
57
+ :as => :select,
58
+ :input_html => {:multiple => false},
59
+ :collection => C80Catoffers::Offer.all.map { |o| ["#{o.title} (#{o.price})", o.id]}
60
+
61
+ end
62
+ end
63
+
64
+ end
65
+
66
+ f.actions
67
+ end
68
+
69
+ end
@@ -0,0 +1,41 @@
1
+ ActiveAdmin.register C80Catoffers::Csprop, as: 'Csprop' do
2
+
3
+ config.per_page = 100
4
+
5
+ menu :label => 'Настройки рассчёта стоимости', # TODO_MY:: название пункта меню перенесести в параметры в базу
6
+ priority: 5,
7
+ parent: 'Услуги' # TODO_MY:: название пункта меню перенесести в параметры в базу
8
+
9
+ permit_params :csample_ids => []
10
+
11
+ batch_action :destroy, false
12
+
13
+ config.sort_order = 'id_asc'
14
+
15
+ before_filter :skip_sidebar!, :only => :index
16
+
17
+ index do
18
+ # selectable_column
19
+ column 'Список который выводится в виджете' do |csprop|
20
+ res = ''
21
+ csprop.csamples.map do |csample|
22
+ res += "<li>#{csample.title}</li>"
23
+ end
24
+ "<ul>#{res}</ul>".html_safe
25
+ end
26
+ actions
27
+ end
28
+
29
+ form(:html => {:multipart => true}) do |f|
30
+
31
+ f.inputs 'Список который выводится в виджете' do
32
+
33
+ f.input :csamples,
34
+ :as => :check_boxes
35
+
36
+ end
37
+
38
+ f.actions
39
+ end
40
+
41
+ end
@@ -1,53 +1,58 @@
1
1
  $(document).ready(function() {
2
2
 
3
3
  var $c = $('.offer_full_desc');
4
- var $w = $c.find("div.big_gallery_wrapper");
5
- var $nav = $c.find('div.nav_gallery_wrapper');
6
-
7
- $w.magnificPopup({
8
- delegate: 'a',
9
- fixedContentPos: false,
10
- removalDelay: 300,
11
- mainClass: 'mfp-fade',
12
- type: 'image',
13
- gallery: {enabled:true}
14
- });
15
-
16
- $w.slick({
17
- slidesToShow: 1,
18
- slidesToScroll: 1,
19
- autoplay: false,
20
- fade:true,
21
- arrows:true,
22
- speed: 200,
23
- dots:false,
24
- infinite: true,
25
- asNavFor: '#offer_gallery'// TODO:: это негибкий хардкод, а что если на странице будет несколько галерей такого типа?
26
- });
27
-
28
- $nav.slick({
29
- slidesToShow: 3,
30
- slidesToScroll: 1,
31
- asNavFor: '#offer_gallery', // TODO:: это негибкий хардкод, а что если на странице будет несколько галерей такого типа?
32
- dots: false,
33
- speed: 200,
34
- //centerMode: true,
35
- arrows:false,
36
- focusOnSelect: true
37
- });
38
-
39
- /*setTimeout(function() {
40
- var $b = $("#gallery3_nav").find(".img-holder");
41
- //console.log($b);
42
- $b.bind({
43
- mouseenter: function() {
44
- $(this).addClass("plusOpacity");
45
- },
46
- mouseleave: function() {
47
- $(this).removeClass("plusOpacity");
48
- }
49
- })
50
- },100);*/
51
4
 
5
+ if ($c.length) {
6
+ var $w = $c.find("div.big_gallery_wrapper");
7
+ var $nav = $c.find('div.nav_gallery_wrapper');
8
+
9
+ //noinspection JSUnresolvedFunction
10
+ $w.magnificPopup({
11
+ delegate: 'a',
12
+ fixedContentPos: false,
13
+ removalDelay: 300,
14
+ mainClass: 'mfp-fade',
15
+ type: 'image',
16
+ gallery: {enabled:true}
17
+ });
18
+
19
+ $w.slick({
20
+ slidesToShow: 1,
21
+ slidesToScroll: 1,
22
+ autoplay: false,
23
+ fade:true,
24
+ arrows:true,
25
+ speed: 200,
26
+ dots:false,
27
+ infinite: true,
28
+ asNavFor: '#offer_gallery'// TODO:: это негибкий хардкод, а что если на странице будет несколько галерей такого типа?
29
+ });
30
+
31
+ $nav.slick({
32
+ slidesToShow: 3,
33
+ slidesToScroll: 1,
34
+ asNavFor: '#offer_gallery', // TODO:: это негибкий хардкод, а что если на странице будет несколько галерей такого типа?
35
+ dots: false,
36
+ speed: 200,
37
+ //centerMode: true,
38
+ arrows:false,
39
+ focusOnSelect: true
40
+ });
41
+
42
+ /*setTimeout(function() {
43
+ var $b = $("#gallery3_nav").find(".img-holder");
44
+ //console.log($b);
45
+ $b.bind({
46
+ mouseenter: function() {
47
+ $(this).addClass("plusOpacity");
48
+ },
49
+ mouseleave: function() {
50
+ $(this).removeClass("plusOpacity");
51
+ }
52
+ })
53
+ },100);*/
54
+
55
+
56
+ }
52
57
 
53
58
  });
@@ -0,0 +1,89 @@
1
+ "use strict";
2
+
3
+ // Код, реализующий ajax функционал на странице "Наши Услуги"
4
+
5
+ var fOffersBindHistoryAdapter;
6
+ var fOffersdoAjaxRequest;
7
+ var fOffersProccessPaginateLinks;
8
+ var fOffersStartWillPaginateAjax;
9
+
10
+ var fOffersGetBlock;
11
+ var fOffersGetWillPaginateLinks;
12
+
13
+ $(function () {
14
+
15
+ //console.log('<offers_ajax>');
16
+
17
+ // соберём в одном месте обращения к узлам DOM, с которыми будем работать
18
+ fOffersGetBlock = function () {
19
+ return $('.ajax_div_offers');
20
+ };
21
+
22
+ fOffersGetWillPaginateLinks = function () {
23
+ return fOffersGetBlock().find(".div_will_paginate a");
24
+ };
25
+
26
+ // надо ли вообще что либо делать?
27
+ if (fOffersGetBlock().length) {
28
+
29
+ fOffersBindHistoryAdapter = function () {
30
+ //noinspection JSUnresolvedVariable
31
+ History.Adapter.bind(window,'statechange',function(){ // Note: We are using statechange instead of popstate
32
+
33
+ // Log the State
34
+ //noinspection JSUnresolvedFunction
35
+ var State = History.getState(); // Note: We are using History.getState() instead of event.state
36
+ var p;
37
+
38
+ //History.log('statechange:', State.data, State.title, State.url);
39
+ if (State.title == "") {
40
+ p = 1;
41
+ } else {
42
+ p = State.data.page;
43
+ }
44
+
45
+ fOffersdoAjaxRequest(p);
46
+ });
47
+ };
48
+
49
+ fOffersdoAjaxRequest = function (page/*integer*/,callback/*function*/) {
50
+
51
+ var $ajax_div = fOffersGetBlock(); // к этому контейнеру изначально прикреплены кое-какие данные
52
+
53
+ $.ajax({
54
+ url: "/offers_guru",
55
+ type: "POST",
56
+ data: {
57
+ page: page,
58
+ css_class_offers_block: $ajax_div.data('css_class_offers_block') // уйдёт на render_offers_page
59
+ },
60
+ dataType: "script"
61
+ }).done(callback);
62
+ };
63
+
64
+ fOffersProccessPaginateLinks = function () {
65
+ //console.log("fOffersProccessPaginateLinks");
66
+ fOffersGetWillPaginateLinks().click(function (e) {
67
+ e.preventDefault();
68
+ var page = $(this).attr('href').split("?page=")[1];
69
+ //noinspection JSUnresolvedFunction
70
+ History.pushState({page:page},window.document.title,"?page="+page);
71
+ });
72
+ };
73
+
74
+ fOffersStartWillPaginateAjax = function () {
75
+ if (fOffersGetWillPaginateLinks().length > 0) {
76
+ fOffersProccessPaginateLinks();
77
+ fOffersBindHistoryAdapter();
78
+ }
79
+ };
80
+
81
+ var _fInit = function () {
82
+ fOffersStartWillPaginateAjax();
83
+ };
84
+
85
+ _fInit();
86
+
87
+ }
88
+
89
+ });
@@ -4,7 +4,7 @@
4
4
 
5
5
  div.left {
6
6
  float: left;
7
- /* ширина и высота задаётся с помощью custom css в хост приложении */
7
+ width: 621px;
8
8
 
9
9
  /* скроем навигационную галерею, если в ней один элемент */
10
10
  div.bottom {
@@ -18,7 +18,8 @@
18
18
 
19
19
  div.right {
20
20
  float: left;
21
- /* ширина и высота задаётся с помощью custom css в хост приложении */
21
+ width: calc(100% - 621px);
22
+ padding-left: 40px;
22
23
  }
23
24
 
24
25
  }
@@ -1,3 +1,26 @@
1
1
  div.offer_list_grouped {
2
2
 
3
+ ul {
4
+ padding: 0;
5
+ margin: 0;
6
+ list-style: none;
7
+
8
+ li {
9
+ padding-right: 20px;
10
+ padding-top: 3px;
11
+ padding-bottom: 3px;
12
+
13
+ &.odd {}
14
+ &.even { background-color: rgba(0,0,0,0.03); }
15
+
16
+ &:hover { background-color: rgba(0,0,0,0.08); }
17
+
18
+ }
19
+ }
20
+
21
+ div.offer_price {
22
+ float: right;
23
+ display: inline-block;
24
+ }
25
+
3
26
  }
@@ -1,28 +1,32 @@
1
- div.offer_list_widget {
1
+ .offer_list_widget_wrapper {
2
+ clear: both;
2
3
 
3
- ul {
4
+ div.offer_list_widget {
4
5
 
5
- margin:0;
6
- padding:0;
7
- list-style: none;
6
+ ul {
8
7
 
9
- > li {
8
+ margin: 0;
9
+ padding: 0;
10
+ list-style: none;
10
11
 
11
- float:left;
12
- display: inline-block;
13
- margin-right: 15px;
12
+ > li {
14
13
 
15
- > * {
16
14
  float: left;
17
- clear: both;
18
- }
15
+ display: inline-block;
16
+ margin-right: 15px;
17
+
18
+ > * {
19
+ float: left;
20
+ clear: both;
21
+ }
22
+
23
+ a.lazy-image-wrapper {
24
+ background-color: #F8F8F8 !important;
25
+ }
19
26
 
20
- a.lazy-image-wrapper {
21
- background-color: #F8F8F8 !important;
22
27
  }
23
28
 
24
29
  }
25
30
 
26
31
  }
27
-
28
32
  }
@@ -0,0 +1,65 @@
1
+ div.ajax_div_offers {
2
+
3
+ div.div_will_paginate {
4
+ width: 100%;
5
+ clear: both;
6
+ float: left;
7
+ padding: 0 46px;
8
+
9
+ .pagination {
10
+ margin: 0;
11
+
12
+ span {
13
+ &.previous_page {
14
+ display: none;
15
+ }
16
+ &.next_page {
17
+ display: none;
18
+ }
19
+ }
20
+
21
+ em {
22
+
23
+ display: inline-block;
24
+ line-height: 29px;
25
+ width: 30px;
26
+ height: 30px;
27
+
28
+ text-align: center;
29
+ font-weight: bold !important;
30
+ font-style: normal !important;
31
+
32
+ border: 1px solid #B6B6B6;
33
+ background-color: #E9353B;
34
+ color:#ffffff;
35
+
36
+ }
37
+
38
+ a {
39
+ display: inline-block;
40
+ line-height: 29px;
41
+ width: 30px;
42
+ height: 30px;
43
+
44
+ border: 1px solid #B6B6B6;
45
+ background-color: #ffffff;
46
+ color:#777777;
47
+ text-align: center;
48
+ font-weight: bold !important;
49
+
50
+ text-decoration: none;
51
+ &:hover, &:active, &:focus { text-decoration: none !important; color: black; }
52
+
53
+ &.previous_page {
54
+ display: none;
55
+ }
56
+ &.next_page {
57
+ display: none;
58
+ }
59
+
60
+ }
61
+ }
62
+
63
+ }
64
+
65
+ }