c80_yax 0.1.0.8 → 0.1.0.9
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile +2 -1
- data/engines/ti/README.md +20 -0
- data/engines/ti/app/admin/ti/categories.rb +69 -0
- data/engines/ti/app/admin/ti/docs.rb +70 -0
- data/engines/ti/app/admin/ti/x_ti.rb +5 -0
- data/engines/ti/app/assets/javascripts/ti/facts_ajax.js +76 -0
- data/engines/ti/app/assets/javascripts/ti.coffee +1 -0
- data/engines/ti/app/assets/stylesheets/ti/news_block.scss +49 -0
- data/engines/ti/app/assets/stylesheets/ti/will_paginate.scss +65 -0
- data/engines/ti/app/assets/stylesheets/ti.scss +5 -0
- data/engines/ti/app/controllers/ti/application_controller.rb +14 -0
- data/engines/ti/app/helpers/ti/application_helper.rb +96 -0
- data/engines/ti/app/models/ti/category.rb +11 -0
- data/engines/ti/app/models/ti/doc.rb +72 -0
- data/engines/ti/app/models/ti/doc_validator.rb +11 -0
- data/engines/ti/app/models/ti/dphoto.rb +59 -0
- data/engines/ti/app/models/ti/prop.rb +5 -0
- data/engines/ti/app/uploaders/ti/dphoto_uploader.rb +152 -0
- data/engines/ti/app/views/layouts/c80_news/application.html.erb +14 -0
- data/engines/ti/app/views/shared/_fact.html.erb +13 -0
- data/engines/ti/app/views/shared/_fact_inverted.html.erb +20 -0
- data/engines/ti/app/views/shared/_news_block.html.erb +18 -0
- data/engines/ti/app/views/shared/_news_list.html.erb +16 -0
- data/engines/ti/app/views/ti/application/guru.js.erb +16 -0
- data/engines/ti/bin/console +14 -0
- data/engines/ti/bin/setup +7 -0
- data/engines/ti/config/locales/ru.yml +4 -0
- data/engines/ti/config/routes.rb +3 -0
- data/engines/ti/db/migrate/20170706050000_create_ti_props.rb +13 -0
- data/engines/ti/db/migrate/20170706050505_create_ti_docs.rb +11 -0
- data/engines/ti/db/migrate/20170706050507_create_ti_categories.rb +11 -0
- data/engines/ti/db/migrate/20170706050606_create_ti_dphotos.rb +11 -0
- data/engines/ti/db/migrate/20170706083939_create_ti_join_table_categories_docs.rb +12 -0
- data/engines/ti/db/seeds/ti_02_fill_test_data.rb +23 -0
- data/engines/ti/lib/ti/engine.rb +23 -0
- data/engines/ti/lib/ti/version.rb +3 -0
- data/engines/ti/lib/ti.rb +5 -0
- data/lib/c80_yax/version.rb +1 -1
- data/lib/c80_yax.rb +1 -0
- metadata +38 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2c34639f47cd3c6f011ee349011b3ae0b708eb2c
|
4
|
+
data.tar.gz: 97f56c76766c09b8fe053d05efa905efe9c2afbc
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 71979c804018ef28d6877b884a25b659aa6bb4f2c61f7da02aa792ffc890af7a0fa20cf2d8462804587127dd5c5fc3b470045ba2e3cde4d972f01bc115c00133
|
7
|
+
data.tar.gz: 63c1c4155250fccbb9eb47c18c5675c8d7561ee5c895f969e2eba657f7790aaf7c4e236b7a282b9cb0ccba500a06f505850246bd4b8270c6f128bc41a2201301
|
data/Gemfile
CHANGED
@@ -0,0 +1,20 @@
|
|
1
|
+
# техническая информация
|
2
|
+
|
3
|
+
Данный раздел предназначен для публикации материалов о тонкостях работы
|
4
|
+
с продукцией компании ORIMA, технической документации и инструкций
|
5
|
+
Функционал раздела предполагает, что из панели управления сайтом можно
|
6
|
+
создавать категории, в которые входят те или иные публикации.
|
7
|
+
|
8
|
+
* [ ] Так же для категорий могут быть созданы подкатегории. Таким образом
|
9
|
+
можно разместить большое количество инструкций.
|
10
|
+
|
11
|
+
* [X] Каждый совет или идея создается как отдельная публикация, которой
|
12
|
+
можно присвоить заголовок, текст и изображения.
|
13
|
+
|
14
|
+
* [ ] При этом каждой публикации необходимо присвоить категорию к которой она относится.
|
15
|
+
|
16
|
+
* [ ] Также можно опубликовать совет или идею как видео, задав ссылку
|
17
|
+
на соответствующее видео с youtube.com
|
18
|
+
|
19
|
+
C помощью функционала создания категорий и подкатегорий раздела
|
20
|
+
«Техническая информация» также можно размещать любые документы, например сертификаты.
|
@@ -0,0 +1,69 @@
|
|
1
|
+
ActiveAdmin.register Ti::Category, as: 'Category' do
|
2
|
+
|
3
|
+
menu :label => 'Категории',
|
4
|
+
:parent => 'x_ti',
|
5
|
+
:priority => 2
|
6
|
+
|
7
|
+
permit_params :title,
|
8
|
+
:full,
|
9
|
+
:ord,
|
10
|
+
:parent_category_id
|
11
|
+
|
12
|
+
config.sort_order = 'id_asc'
|
13
|
+
# config.clear_action_items!
|
14
|
+
config.batch_actions = false
|
15
|
+
|
16
|
+
# filter :title
|
17
|
+
# filter :strsubcats
|
18
|
+
# filter :is_excluded_from_filtering
|
19
|
+
# filter :is_normal_price
|
20
|
+
|
21
|
+
before_filter :skip_sidebar!, :only => :index
|
22
|
+
|
23
|
+
# controller do
|
24
|
+
# cache_sweeper :suit_sweeper, :only => [:update,:create,:destroy]
|
25
|
+
# end
|
26
|
+
|
27
|
+
index do
|
28
|
+
# selectable_column
|
29
|
+
id_column
|
30
|
+
|
31
|
+
column :title
|
32
|
+
column :ord
|
33
|
+
column :parent_category do |pn|
|
34
|
+
if pn.parent_category_id.present?
|
35
|
+
rpn = Ti::Category.find_by(id:pn.parent_category_id)
|
36
|
+
rpn.title unless rpn.nil?
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
actions
|
41
|
+
end
|
42
|
+
|
43
|
+
form(:html => {:multipart => true}) do |f|
|
44
|
+
|
45
|
+
f.inputs 'Свойства' do
|
46
|
+
f.input :title
|
47
|
+
f.input :ord
|
48
|
+
|
49
|
+
f.input :parent_category,
|
50
|
+
as: :select,
|
51
|
+
collection: Ti::Category.all,
|
52
|
+
input_html: {
|
53
|
+
:class => 'selectpicker',
|
54
|
+
:title => '',
|
55
|
+
:data => {
|
56
|
+
:size => 10,
|
57
|
+
:width => '400px'
|
58
|
+
},
|
59
|
+
:multiple => false
|
60
|
+
},
|
61
|
+
:include_blank => true
|
62
|
+
|
63
|
+
end
|
64
|
+
|
65
|
+
f.actions
|
66
|
+
|
67
|
+
end
|
68
|
+
|
69
|
+
end
|
@@ -0,0 +1,70 @@
|
|
1
|
+
ActiveAdmin.register Ti::Doc, :as => 'Docs' do
|
2
|
+
|
3
|
+
before_filter :skip_sidebar!, :only => :index
|
4
|
+
|
5
|
+
menu :label => 'Документы',
|
6
|
+
:parent => 'x_ti',
|
7
|
+
:priority => 1
|
8
|
+
|
9
|
+
permit_params :title,
|
10
|
+
:full,
|
11
|
+
:category_ids => [],
|
12
|
+
:dphotos_attributes => [:id,:image,:_destroy]
|
13
|
+
|
14
|
+
index do
|
15
|
+
selectable_column
|
16
|
+
id_column
|
17
|
+
column :title
|
18
|
+
column :created_at do |fact|
|
19
|
+
local_time(fact[:created_at], format: '%e.%m.%Y')
|
20
|
+
end
|
21
|
+
|
22
|
+
column '' do |fact|
|
23
|
+
if fact.dphotos.count > 0
|
24
|
+
image_tag(fact.dphotos.first.image.thumb_sm)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
column :full do |doc|
|
29
|
+
res = '-'
|
30
|
+
if doc.full.present?
|
31
|
+
res = "#{doc.full[0..30]}..."
|
32
|
+
end
|
33
|
+
res
|
34
|
+
end
|
35
|
+
|
36
|
+
actions
|
37
|
+
end
|
38
|
+
|
39
|
+
form(:html => {:multipart => true}) do |f|
|
40
|
+
f.inputs 'Свойства' do
|
41
|
+
f.input :title
|
42
|
+
|
43
|
+
f.input :categories,
|
44
|
+
:as => :select,
|
45
|
+
:input_html => {
|
46
|
+
:title => '',
|
47
|
+
:class => 'selectpicker',
|
48
|
+
:data => {
|
49
|
+
:size => 10
|
50
|
+
},
|
51
|
+
:multiple => false
|
52
|
+
},
|
53
|
+
:include_blank => true
|
54
|
+
|
55
|
+
f.inputs 'Фото' do
|
56
|
+
f.has_many :dphotos, :allow_destroy => true do |dphoto|
|
57
|
+
dphoto.input :image,
|
58
|
+
:as => :file,
|
59
|
+
:hint => image_tag(dphoto.object.image.thumb_sm)
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
f.input :full, :as => :ckeditor,
|
64
|
+
:input_html => {:style => 'height:500px', rows: 20}
|
65
|
+
|
66
|
+
end
|
67
|
+
f.actions
|
68
|
+
end
|
69
|
+
|
70
|
+
end
|
@@ -0,0 +1,76 @@
|
|
1
|
+
"use strict";
|
2
|
+
|
3
|
+
// Код, реализующий ajax функционал на странице "новости"
|
4
|
+
|
5
|
+
var fNewsBindHistoryAdapter;
|
6
|
+
var fNewsdoAjaxRequest;
|
7
|
+
var fNewsProccessPaginateLinks;
|
8
|
+
var fNewsStartWillPaginateAjax;
|
9
|
+
var fNewsProcessBlocks; // при клике по preview-картинке новости будет происходить переход на просмотр новости
|
10
|
+
|
11
|
+
$(function () {
|
12
|
+
if ($('.news_block[data-is_render_paginator="true"]').length) {
|
13
|
+
|
14
|
+
fNewsBindHistoryAdapter = function () {
|
15
|
+
History.Adapter.bind(window,'statechange',function(){ // Note: We are using statechange instead of popstate
|
16
|
+
|
17
|
+
// Log the State
|
18
|
+
var State = History.getState(); // Note: We are using History.getState() instead of event.state
|
19
|
+
var p;
|
20
|
+
|
21
|
+
//History.log('statechange:', State.data, State.title, State.url);
|
22
|
+
if (State.title == "") {
|
23
|
+
p = 1;
|
24
|
+
} else {
|
25
|
+
p = State.data.page;
|
26
|
+
}
|
27
|
+
|
28
|
+
fNewsdoAjaxRequest(p);
|
29
|
+
});
|
30
|
+
};
|
31
|
+
|
32
|
+
fNewsdoAjaxRequest = function (page/*integer*/,callback/*function*/) {
|
33
|
+
|
34
|
+
var $ajax_div = $('.ajax_div'); // к этому контейнеру изначально прикреплены кое-какие данные
|
35
|
+
|
36
|
+
$.ajax({
|
37
|
+
url: "/news_guru",
|
38
|
+
type: "POST",
|
39
|
+
data: {
|
40
|
+
page: page,
|
41
|
+
is_render_paginator: $ajax_div.data('is_render_paginator'), // эти переменные
|
42
|
+
partial_name: $ajax_div.data('partial_name'), // уходят транзитом
|
43
|
+
css_class_news_block: $ajax_div.data('css_class_news_block') // на render_news_block
|
44
|
+
},
|
45
|
+
dataType: "script"
|
46
|
+
}).done(callback);
|
47
|
+
};
|
48
|
+
|
49
|
+
fNewsProccessPaginateLinks = function () {
|
50
|
+
//console.log("fNewsProccessPaginateLinks");
|
51
|
+
$(".news_block .div_will_paginate a").click(function (e) {
|
52
|
+
e.preventDefault();
|
53
|
+
var page = $(this).attr('href').split("?page=")[1];
|
54
|
+
History.pushState({page:page},window.document.title,"?page="+page);
|
55
|
+
});
|
56
|
+
};
|
57
|
+
|
58
|
+
fNewsStartWillPaginateAjax = function () {
|
59
|
+
if ($(".news_block .div_will_paginate a").length > 0) {
|
60
|
+
fNewsProccessPaginateLinks();
|
61
|
+
fNewsBindHistoryAdapter();
|
62
|
+
}
|
63
|
+
};
|
64
|
+
|
65
|
+
fNewsProcessBlocks = function() {
|
66
|
+
$(".fact img").click(function (e) {
|
67
|
+
// NB:: parent().parent() хардкод: картинка лежит в ссылке, ссылка лежит в диве
|
68
|
+
window.location.href = $(this).parent().parent().data('url');
|
69
|
+
});
|
70
|
+
};
|
71
|
+
|
72
|
+
fNewsStartWillPaginateAjax();
|
73
|
+
fNewsProcessBlocks();
|
74
|
+
|
75
|
+
}
|
76
|
+
});
|
@@ -0,0 +1 @@
|
|
1
|
+
#= require_tree ./ti
|
@@ -0,0 +1,49 @@
|
|
1
|
+
div.news_block {
|
2
|
+
|
3
|
+
div.news_list {
|
4
|
+
position: relative; /** Needed to ensure items are laid out relative to this container **/
|
5
|
+
padding: 0;
|
6
|
+
margin: 0;
|
7
|
+
|
8
|
+
div.fact {
|
9
|
+
display: block;
|
10
|
+
float: left;
|
11
|
+
/*width: 229px;*/
|
12
|
+
/*max-height: 350px;*/
|
13
|
+
overflow: hidden;
|
14
|
+
margin-bottom: 25px;
|
15
|
+
|
16
|
+
img {
|
17
|
+
margin-bottom: 15px;
|
18
|
+
max-width: 100%;
|
19
|
+
}
|
20
|
+
|
21
|
+
&.clear_left {
|
22
|
+
clear: left;
|
23
|
+
}
|
24
|
+
|
25
|
+
}
|
26
|
+
|
27
|
+
&.per_row_3 {
|
28
|
+
.fact {
|
29
|
+
width: 33.33333%;
|
30
|
+
}
|
31
|
+
}
|
32
|
+
|
33
|
+
&.per_row_4 {
|
34
|
+
.fact {
|
35
|
+
width: 25%;
|
36
|
+
}
|
37
|
+
}
|
38
|
+
|
39
|
+
&.is_news_page {
|
40
|
+
|
41
|
+
div.fact {
|
42
|
+
|
43
|
+
}
|
44
|
+
|
45
|
+
}
|
46
|
+
|
47
|
+
}
|
48
|
+
|
49
|
+
}
|
@@ -0,0 +1,65 @@
|
|
1
|
+
div.ajax_div {
|
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
|
+
}
|
@@ -0,0 +1,96 @@
|
|
1
|
+
module Ti
|
2
|
+
module ApplicationHelper
|
3
|
+
|
4
|
+
include LocalTimeHelper
|
5
|
+
|
6
|
+
def render_news_block(is_news_page=false, page=1, options={})
|
7
|
+
|
8
|
+
# 1. на странице НОВОСТИ выводим per_page новостей, в виджете выводим per_widget новостей
|
9
|
+
# 2. на странице НОВОСТИ div.news_block имеет класс is_news_page
|
10
|
+
# 3. к div.news_block можно дописать стиль, типа style_photostudio
|
11
|
+
|
12
|
+
per_page = Prop.first.per_widget
|
13
|
+
css_class_news_block = ''
|
14
|
+
if is_news_page
|
15
|
+
css_class_news_block = 'is_news_page'
|
16
|
+
per_page = Prop.first.per_page
|
17
|
+
end
|
18
|
+
per_block_row = Prop.first.per_widget
|
19
|
+
|
20
|
+
#
|
21
|
+
if options[:css_class_news_block].present?
|
22
|
+
css_class_news_block += " #{options[:css_class_news_block]}"
|
23
|
+
end
|
24
|
+
|
25
|
+
news = Fact.paginate(:page => page, :per_page => per_page)
|
26
|
+
|
27
|
+
is_render_paginator = options[:is_render_paginator].present? \
|
28
|
+
? options[:is_render_paginator] \
|
29
|
+
: is_news_page
|
30
|
+
|
31
|
+
render :partial => "shared/news_block",
|
32
|
+
:locals => {
|
33
|
+
:news_list => news,
|
34
|
+
:is_news_page => is_news_page,
|
35
|
+
:per_block_row => per_block_row,
|
36
|
+
:partial_name => options[:partial_name],
|
37
|
+
:is_render_paginator => is_render_paginator,
|
38
|
+
:thumb_size => options[:thumb_size],
|
39
|
+
:css_class_news_block => css_class_news_block,
|
40
|
+
:h3_title => options[:h3_title]
|
41
|
+
}
|
42
|
+
end
|
43
|
+
|
44
|
+
def render_one_fact(fact, partial_name='fact', thumb_size='thumb_md', additional_css_class=nil)
|
45
|
+
|
46
|
+
|
47
|
+
unless thumb_size.present?
|
48
|
+
thumb_size = 'thumb_md'
|
49
|
+
end
|
50
|
+
|
51
|
+
# Rails.logger.debug "[TRACE] <render_one_fact> thumb_size: #{thumb_size}"
|
52
|
+
|
53
|
+
# свойства модуля
|
54
|
+
p = Prop.first
|
55
|
+
|
56
|
+
# чтобы вёрстка не прыгала - зафиксируем размер картинки
|
57
|
+
w = p.send("#{thumb_size}_width")
|
58
|
+
h = p.send("#{thumb_size}_width")
|
59
|
+
|
60
|
+
render :partial => "shared/#{partial_name}",
|
61
|
+
:locals => {
|
62
|
+
fact: fact,
|
63
|
+
css_common_width_height: "width:#{w}px;height:#{h}px",
|
64
|
+
css_common_width: "width:#{w}px;",
|
65
|
+
thumb_size:thumb_size,
|
66
|
+
additional_css_class:additional_css_class
|
67
|
+
}
|
68
|
+
end
|
69
|
+
|
70
|
+
def url_for_fact(fact)
|
71
|
+
"/news/#{fact.slug}"
|
72
|
+
end
|
73
|
+
|
74
|
+
# метод добавлен, чтобы сократить количество символов в строке, которую надо вставить в
|
75
|
+
# 256-символьное структурное поле Страницы (Page) типа after_main (в админке), чтобы отрендерить новостной виджет
|
76
|
+
def render_news_widget(css_class_news_block='style_default',
|
77
|
+
partial_name='fact_inverted',
|
78
|
+
thumb_size='thumb_preview',
|
79
|
+
h3_title=' '
|
80
|
+
)
|
81
|
+
|
82
|
+
if h3_title == ' '
|
83
|
+
h3_title = I18n.t('c80_news.news_widget.h3_title')
|
84
|
+
end
|
85
|
+
|
86
|
+
render_news_block(false, params[:page], {
|
87
|
+
:partial_name => partial_name,
|
88
|
+
:thumb_size => thumb_size,
|
89
|
+
:css_class_news_block => css_class_news_block,
|
90
|
+
:h3_title => h3_title
|
91
|
+
}
|
92
|
+
)
|
93
|
+
end
|
94
|
+
|
95
|
+
end
|
96
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
module Ti
|
2
|
+
class Category < ActiveRecord::Base
|
3
|
+
has_many :child_categories,
|
4
|
+
class_name: 'Ti::Category',
|
5
|
+
foreign_key: 'parent_category_id',
|
6
|
+
dependent: :nullify
|
7
|
+
belongs_to :parent_category, class_name: 'Ti::Category'
|
8
|
+
has_and_belongs_to_many :docs
|
9
|
+
validates :title, presence: true
|
10
|
+
end
|
11
|
+
end
|
@@ -0,0 +1,72 @@
|
|
1
|
+
require 'babosa'
|
2
|
+
include ActionView::Helpers::SanitizeHelper
|
3
|
+
|
4
|
+
module Ti
|
5
|
+
class Doc < ActiveRecord::Base
|
6
|
+
has_many :dphotos, :dependent => :destroy
|
7
|
+
accepts_nested_attributes_for :dphotos,
|
8
|
+
:reject_if => lambda { |attributes|
|
9
|
+
!attributes.present?
|
10
|
+
},
|
11
|
+
:allow_destroy => true
|
12
|
+
has_and_belongs_to_many :categories
|
13
|
+
validates_with DocValidator
|
14
|
+
default_scope {order(:created_at => :desc)}
|
15
|
+
|
16
|
+
extend FriendlyId
|
17
|
+
friendly_id :title, use: :slugged
|
18
|
+
def normalize_friendly_id(input)
|
19
|
+
input.to_s.to_slug.normalize(transliterations: :russian).to_s
|
20
|
+
end
|
21
|
+
|
22
|
+
def slug_candidates
|
23
|
+
[:title] + Array.new(6) {|index| [:title, index+2]}
|
24
|
+
end
|
25
|
+
|
26
|
+
def short_meta_description
|
27
|
+
|
28
|
+
if description.present? && description.length > 200
|
29
|
+
result = description
|
30
|
+
elsif full.present? && full.length > 0
|
31
|
+
result = strip_tags(full[0..200]+'...')
|
32
|
+
else
|
33
|
+
result = nil
|
34
|
+
end
|
35
|
+
result
|
36
|
+
|
37
|
+
end
|
38
|
+
|
39
|
+
def thumb_sm
|
40
|
+
s = ''
|
41
|
+
if dphotos.count > 0
|
42
|
+
s = dphotos.first.image.thumb_sm
|
43
|
+
end
|
44
|
+
s
|
45
|
+
end
|
46
|
+
|
47
|
+
def thumb_md
|
48
|
+
s = ''
|
49
|
+
if dphotos.count > 0
|
50
|
+
s = dphotos.first.image.thumb_md
|
51
|
+
end
|
52
|
+
s
|
53
|
+
end
|
54
|
+
|
55
|
+
def thumb_lg
|
56
|
+
s = ''
|
57
|
+
if dphotos.count > 0
|
58
|
+
s = dphotos.first.image.thumb_lg
|
59
|
+
end
|
60
|
+
s
|
61
|
+
end
|
62
|
+
|
63
|
+
def thumb_preview
|
64
|
+
s = ''
|
65
|
+
if dphotos.count > 0
|
66
|
+
s = dphotos.first.image.thumb_preview
|
67
|
+
end
|
68
|
+
s
|
69
|
+
end
|
70
|
+
|
71
|
+
end
|
72
|
+
end
|
@@ -0,0 +1,59 @@
|
|
1
|
+
module Ti
|
2
|
+
class Dphoto < ActiveRecord::Base
|
3
|
+
belongs_to :doc
|
4
|
+
mount_uploader :image, DphotoUploader
|
5
|
+
|
6
|
+
# в ~ от размеров thumb-ов и page_content_width - выдать соответствующую картинку
|
7
|
+
# • Если у картинки thumb_big шириной ≥ page_content_width - вставляем этот thumb_big.
|
8
|
+
# • Иначе: вставлем thumb_small.
|
9
|
+
def content_image(type='normal')
|
10
|
+
|
11
|
+
if type == 'normal'
|
12
|
+
img = MiniMagick::Image.open(image.thumb_big.path)
|
13
|
+
w = SiteProp.first.page_content_width
|
14
|
+
if img['width'] < w
|
15
|
+
image.thumb_small
|
16
|
+
else
|
17
|
+
image.thumb_big
|
18
|
+
end
|
19
|
+
|
20
|
+
elsif type == 'small'
|
21
|
+
image.thumb_small
|
22
|
+
|
23
|
+
elsif type == 'big'
|
24
|
+
image.thumb_big
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
28
|
+
|
29
|
+
# выдать размеры картинки, которая будет вставлена в текст страницы
|
30
|
+
def content_image_size(type='normal')
|
31
|
+
|
32
|
+
if type == 'normal'
|
33
|
+
img = MiniMagick::Image.open(image.thumb_big.path)
|
34
|
+
w = SiteProp.first.page_content_width
|
35
|
+
if img['width'] < w
|
36
|
+
img = MiniMagick::Image.open(image.thumb_small.path)
|
37
|
+
[img['width'], img['height']]
|
38
|
+
else
|
39
|
+
[img['width'], img['height']]
|
40
|
+
end
|
41
|
+
|
42
|
+
elsif type == 'small'
|
43
|
+
img = MiniMagick::Image.open(image.thumb_small.path)
|
44
|
+
[img['width'], img['height']]
|
45
|
+
|
46
|
+
elsif type == 'big'
|
47
|
+
img = MiniMagick::Image.open(image.thumb_big.path)
|
48
|
+
[img['width'], img['height']]
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
# выдать размеры картинки thumb_preview
|
53
|
+
def thumb_preview_size
|
54
|
+
img = MiniMagick::Image.open(image.thumb_preview.path)
|
55
|
+
[img['width'], img['height']]
|
56
|
+
end
|
57
|
+
|
58
|
+
end
|
59
|
+
end
|
@@ -0,0 +1,152 @@
|
|
1
|
+
module Ti
|
2
|
+
class DphotoUploader < BaseFileUploader
|
3
|
+
|
4
|
+
# ограничение оригинальной картинки
|
5
|
+
process :resize_to_limit => [1600,1600]
|
6
|
+
|
7
|
+
def store_dir
|
8
|
+
"uploads/docs/#{format('%02d', model.fact_id)}"
|
9
|
+
end
|
10
|
+
|
11
|
+
# ---[ идут в контент новости ]---[ размер зависит от SiteProps.page_content_width ]--------------------------------------------------------------------------------------------------------------------
|
12
|
+
|
13
|
+
version :thumb_big do
|
14
|
+
process :resize_to_thumb_big
|
15
|
+
end
|
16
|
+
|
17
|
+
version :thumb_small do
|
18
|
+
process :resize_to_thumb_small
|
19
|
+
end
|
20
|
+
|
21
|
+
# ------------------------------------------------------------------------------------------------------------------------
|
22
|
+
|
23
|
+
version :thumb_preview do
|
24
|
+
begin
|
25
|
+
# Proc.new {
|
26
|
+
p = C80News::Prop.first
|
27
|
+
process :resize_to_fill => [p.thumb_preview_width, p.thumb_preview_height]
|
28
|
+
# }
|
29
|
+
rescue => e
|
30
|
+
Rails.logger.debug "[TRACE] <C80News.fphoto_uploader> thumb_preview ERROR: #{e}"
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
version :thumb_lg do
|
35
|
+
process :resize_to_lg
|
36
|
+
end
|
37
|
+
|
38
|
+
version :thumb_md do
|
39
|
+
process :resize_to_md
|
40
|
+
end
|
41
|
+
|
42
|
+
version :thumb_sm do
|
43
|
+
process :resize_to_sm
|
44
|
+
end
|
45
|
+
|
46
|
+
# --[ идут в контент новости ]--------------------------------------------------------------------------------------
|
47
|
+
|
48
|
+
def resize_to_thumb_big
|
49
|
+
# byebug
|
50
|
+
|
51
|
+
w = SiteProp.first.page_content_width
|
52
|
+
h = calc_height_of_image(w)
|
53
|
+
|
54
|
+
# puts "<PageArtUploader.resize_to_limit_big>"
|
55
|
+
manipulate! do |img|
|
56
|
+
img.resize "#{w}x#{h}>"
|
57
|
+
img = yield(img) if block_given?
|
58
|
+
img
|
59
|
+
end
|
60
|
+
|
61
|
+
end
|
62
|
+
|
63
|
+
def resize_to_thumb_small
|
64
|
+
# puts "<PageArtUploader.resize_to_limit_small>"
|
65
|
+
manipulate! do |img|
|
66
|
+
|
67
|
+
w = SiteProp.first.page_content_width/2
|
68
|
+
h = calc_height_of_image(w)
|
69
|
+
|
70
|
+
img.resize "#{w}x#{h}>"
|
71
|
+
img = yield(img) if block_given?
|
72
|
+
img
|
73
|
+
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
# ------------------------------------------------------------------------------------------------------------------------
|
78
|
+
|
79
|
+
def resize_to_lg
|
80
|
+
# byebug
|
81
|
+
|
82
|
+
w = C80News::Prop.first.thumb_lg_width
|
83
|
+
h = C80News::Prop.first.thumb_lg_height
|
84
|
+
|
85
|
+
manipulate! do |img|
|
86
|
+
img.resize "#{w}x#{h}^"
|
87
|
+
img.gravity 'center'
|
88
|
+
img.extent "#{w}x#{h}"
|
89
|
+
img = yield(img) if block_given?
|
90
|
+
img
|
91
|
+
end
|
92
|
+
|
93
|
+
end
|
94
|
+
|
95
|
+
def resize_to_md
|
96
|
+
|
97
|
+
manipulate! do |img|
|
98
|
+
|
99
|
+
w = C80News::Prop.first.thumb_md_width
|
100
|
+
h = C80News::Prop.first.thumb_md_height
|
101
|
+
|
102
|
+
img.resize "#{w}x#{h}^"
|
103
|
+
img.gravity 'center'
|
104
|
+
img.extent "#{w}x#{h}"
|
105
|
+
img = yield(img) if block_given?
|
106
|
+
img
|
107
|
+
|
108
|
+
end
|
109
|
+
|
110
|
+
end
|
111
|
+
|
112
|
+
def resize_to_sm
|
113
|
+
|
114
|
+
manipulate! do |img|
|
115
|
+
|
116
|
+
w = C80News::Prop.first.thumb_sm_width
|
117
|
+
h = C80News::Prop.first.thumb_sm_height
|
118
|
+
|
119
|
+
img.resize "#{w}x#{h}^"
|
120
|
+
img.gravity 'center'
|
121
|
+
img.extent "#{w}x#{h}"
|
122
|
+
img = yield(img) if block_given?
|
123
|
+
img
|
124
|
+
|
125
|
+
end
|
126
|
+
|
127
|
+
end
|
128
|
+
|
129
|
+
# ------------------------------------------------------------------------------------------------------------------------
|
130
|
+
|
131
|
+
protected
|
132
|
+
def secure_token(length=16)
|
133
|
+
var = :"@#{mounted_as}_secure_token"
|
134
|
+
model.instance_variable_get(var) or model.instance_variable_set(var, SecureRandom.hex(length/2))
|
135
|
+
end
|
136
|
+
|
137
|
+
private
|
138
|
+
|
139
|
+
def calc_height_of_image(w)
|
140
|
+
model_image = ::MiniMagick::Image.open(current_path)
|
141
|
+
calc_height(w, model_image["width"], model_image["height"])
|
142
|
+
end
|
143
|
+
|
144
|
+
# подгоняем по ширине, рассчитываем высоту
|
145
|
+
def calc_height(width, original_w, original_h)
|
146
|
+
k = width.to_f/original_w
|
147
|
+
original_h * k
|
148
|
+
end
|
149
|
+
|
150
|
+
|
151
|
+
end
|
152
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
<!DOCTYPE html>
|
2
|
+
<html>
|
3
|
+
<head>
|
4
|
+
<title>News</title>
|
5
|
+
<%= stylesheet_link_tag "news/application", media: "all" %>
|
6
|
+
<%= javascript_include_tag "news/application" %>
|
7
|
+
<%= csrf_meta_tags %>
|
8
|
+
</head>
|
9
|
+
<body>
|
10
|
+
|
11
|
+
<%= yield %>
|
12
|
+
|
13
|
+
</body>
|
14
|
+
</html>
|
@@ -0,0 +1,13 @@
|
|
1
|
+
<div class="fact" data-url="<%= url_for_fact(fact) %>">
|
2
|
+
<p class="date">
|
3
|
+
<%= local_time(fact[:created_at], format: '%e.%m.%Y') %>
|
4
|
+
</p>
|
5
|
+
<%= link_to(url_for_fact(fact)) do %>
|
6
|
+
<h5><%= fact.title %></h5>
|
7
|
+
<% end %>
|
8
|
+
[[1]]
|
9
|
+
<p class="short">
|
10
|
+
<%= fact[:short].html_safe %>
|
11
|
+
</p>
|
12
|
+
<div class="white_shadow"></div>
|
13
|
+
</div>
|
@@ -0,0 +1,20 @@
|
|
1
|
+
<div class="fact <%=additional_css_class%>">
|
2
|
+
<%= render_image_link_lazy({
|
3
|
+
:alt_image => fact.title,
|
4
|
+
:image => fact.send(thumb_size),
|
5
|
+
:a_href => url_for_fact(fact),
|
6
|
+
:a_class => '',
|
7
|
+
:a_style => css_common_width_height,
|
8
|
+
:a_rel => 'nofollow'
|
9
|
+
}) %>
|
10
|
+
<%= link_to(url_for_fact(fact), class: 'h5') do %>
|
11
|
+
<h5 style="<%= css_common_width %>"><%= fact.title %></h5>
|
12
|
+
<% end %>
|
13
|
+
<p class="date" style="<%= css_common_width %>">
|
14
|
+
<%= local_time(fact[:created_at], format: '%e.%m.%Y') %>
|
15
|
+
</p>
|
16
|
+
<p class="short" style="<%= css_common_width %>">
|
17
|
+
<%= fact[:short].html_safe %>
|
18
|
+
</p>
|
19
|
+
<div class="white_shadow"></div>
|
20
|
+
</div>
|
@@ -0,0 +1,18 @@
|
|
1
|
+
<% if h3_title.present? %>
|
2
|
+
<h3 class="section_title h3_for_news_block"><%= h3_title %></h3>
|
3
|
+
<% end %>
|
4
|
+
<div class="ajax_div news_block <%= css_class_news_block %>"
|
5
|
+
data-partial_name="<%= partial_name %>"
|
6
|
+
data-css_class_news_block="<%= css_class_news_block %>"
|
7
|
+
data-is_render_paginator="<%= is_render_paginator %>">
|
8
|
+
<%= render :partial => "shared/news_list",
|
9
|
+
:locals => {
|
10
|
+
:news_list => news_list,
|
11
|
+
:is_news_page => is_news_page,
|
12
|
+
:per_row => per_block_row,
|
13
|
+
:partial_name => partial_name,
|
14
|
+
:is_render_paginator => is_render_paginator,
|
15
|
+
:thumb_size => thumb_size
|
16
|
+
}
|
17
|
+
%>
|
18
|
+
</div>
|
@@ -0,0 +1,16 @@
|
|
1
|
+
<div class="news_list clearfix per_row_<%=per_row%>">
|
2
|
+
<% news_list.each_with_index do |fact, index| %>
|
3
|
+
|
4
|
+
<%# чтобы не было такого https://dl.dropboxusercontent.com/u/1365807/work/sokol/tx/2016-11-05_165449_news_clear.jpg %>
|
5
|
+
<% clear_left_css_class = index % per_row == 0 ? 'clear_left':'' %>
|
6
|
+
<% clear_left_css_class += " index_#{index}" %>
|
7
|
+
|
8
|
+
<%= render_one_fact(fact, partial_name, thumb_size, clear_left_css_class.to_s).to_s %>
|
9
|
+
|
10
|
+
<% end %>
|
11
|
+
</div>
|
12
|
+
<% if is_news_page || is_render_paginator %>
|
13
|
+
<div class="div_will_paginate">
|
14
|
+
<%= will_paginate news_list %>
|
15
|
+
</div>
|
16
|
+
<% end %>
|
@@ -0,0 +1,16 @@
|
|
1
|
+
|
2
|
+
var html_str = "<%= j render_news_block(true,params[:page], {
|
3
|
+
:partial_name => params[:partial_name],
|
4
|
+
:is_render_paginator => params[:is_render_paginator],
|
5
|
+
:css_class_news_block => params[:css_class_news_block]
|
6
|
+
})
|
7
|
+
%>";
|
8
|
+
|
9
|
+
var $aa = $('.news_block[data-is_render_paginator="true"]');
|
10
|
+
$aa.replaceWith(html_str);
|
11
|
+
|
12
|
+
Holder.run($aa.find("img"));
|
13
|
+
fLazyStart();
|
14
|
+
|
15
|
+
fNewsProccessPaginateLinks();
|
16
|
+
fNewsProcessBlocks();
|
@@ -0,0 +1,14 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require "bundler/setup"
|
4
|
+
require "c80_news"
|
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
|
@@ -0,0 +1,13 @@
|
|
1
|
+
class CreateTiProps < ActiveRecord::Migration
|
2
|
+
def change
|
3
|
+
create_table :ti_props do |t|
|
4
|
+
t.integer :thumb_sm_width
|
5
|
+
t.integer :thumb_sm_height
|
6
|
+
t.integer :thumb_md_width
|
7
|
+
t.integer :thumb_md_height
|
8
|
+
t.integer :thumb_lg_width
|
9
|
+
t.integer :thumb_lg_height
|
10
|
+
t.timestamps
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
class CreateTiJoinTableCategoriesDocs < ActiveRecord::Migration[5.0]
|
2
|
+
def change
|
3
|
+
create_table :ti_categories_docs, :id => false do |t|
|
4
|
+
t.integer :category_id, :null => false
|
5
|
+
t.integer :doc_id, :null => false
|
6
|
+
end
|
7
|
+
|
8
|
+
add_index :ti_categories_docs, [:category_id, :doc_id], :unique => true, :name => 'ti_index1'
|
9
|
+
add_index :ti_categories_docs, [:doc_id, :category_id], :unique => true, :name => 'ti_index2'
|
10
|
+
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
# rake db:seed:ti_02_fill_test_data
|
2
|
+
|
3
|
+
Ti::Category.delete_all
|
4
|
+
Ti::Category.create!([
|
5
|
+
{ ord: 10, id: 1, title: 'Монтажные инструкции' }
|
6
|
+
])
|
7
|
+
|
8
|
+
Ti::Category.create!([
|
9
|
+
{ ord: 100, title: 'Водосточные системы', parent_category_id: 1},
|
10
|
+
{ ord: 110, title: 'Снегозадержатели', parent_category_id: 1},
|
11
|
+
{ ord: 120, title: 'Лестницы', parent_category_id: 1},
|
12
|
+
{ ord: 130, title: 'Кровельные мостики и ограждения', parent_category_id: 1},
|
13
|
+
{ ord: 140, title: 'Продукция из меди', parent_category_id: 1}
|
14
|
+
])
|
15
|
+
|
16
|
+
Ti::Doc.delete_all
|
17
|
+
Ti::Doc.create!([
|
18
|
+
{ title: 'Монтаж круглой водосточной системы P87', category_ids: [100] },
|
19
|
+
{ title: 'Монтаж круглого водосточного желоба P13', category_ids: [100] },
|
20
|
+
{ title: 'Монтаж прямоугольной водосточной системы K12', category_ids: [100] },
|
21
|
+
{ title: 'Установка водосточной трубы P10 и K9x9', category_ids: [100] },
|
22
|
+
{ title: 'Установка внутреннего кронштейна прямоугольной водосточной системы', category_ids: [100] }
|
23
|
+
])
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module Ti
|
2
|
+
class Engine < ::Rails::Engine
|
3
|
+
isolate_namespace Ti
|
4
|
+
|
5
|
+
initializer :ti_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/ti/**/"]
|
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_yax/version.rb
CHANGED
data/lib/c80_yax.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: c80_yax
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.0.
|
4
|
+
version: 0.1.0.9
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- C80609A
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-07-
|
11
|
+
date: 2017-07-06 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -244,6 +244,42 @@ files:
|
|
244
244
|
- engines/pack/db/migrate/20170625215151_create_c80_yax_pack_srows.rb
|
245
245
|
- engines/pack/lib/pack.rb
|
246
246
|
- engines/pack/lib/pack/engine.rb
|
247
|
+
- engines/ti/README.md
|
248
|
+
- engines/ti/app/admin/ti/categories.rb
|
249
|
+
- engines/ti/app/admin/ti/docs.rb
|
250
|
+
- engines/ti/app/admin/ti/x_ti.rb
|
251
|
+
- engines/ti/app/assets/javascripts/ti.coffee
|
252
|
+
- engines/ti/app/assets/javascripts/ti/facts_ajax.js
|
253
|
+
- engines/ti/app/assets/stylesheets/ti.scss
|
254
|
+
- engines/ti/app/assets/stylesheets/ti/news_block.scss
|
255
|
+
- engines/ti/app/assets/stylesheets/ti/will_paginate.scss
|
256
|
+
- engines/ti/app/controllers/ti/application_controller.rb
|
257
|
+
- engines/ti/app/helpers/ti/application_helper.rb
|
258
|
+
- engines/ti/app/models/ti/category.rb
|
259
|
+
- engines/ti/app/models/ti/doc.rb
|
260
|
+
- engines/ti/app/models/ti/doc_validator.rb
|
261
|
+
- engines/ti/app/models/ti/dphoto.rb
|
262
|
+
- engines/ti/app/models/ti/prop.rb
|
263
|
+
- engines/ti/app/uploaders/ti/dphoto_uploader.rb
|
264
|
+
- engines/ti/app/views/layouts/c80_news/application.html.erb
|
265
|
+
- engines/ti/app/views/shared/_fact.html.erb
|
266
|
+
- engines/ti/app/views/shared/_fact_inverted.html.erb
|
267
|
+
- engines/ti/app/views/shared/_news_block.html.erb
|
268
|
+
- engines/ti/app/views/shared/_news_list.html.erb
|
269
|
+
- engines/ti/app/views/ti/application/guru.js.erb
|
270
|
+
- engines/ti/bin/console
|
271
|
+
- engines/ti/bin/setup
|
272
|
+
- engines/ti/config/locales/ru.yml
|
273
|
+
- engines/ti/config/routes.rb
|
274
|
+
- engines/ti/db/migrate/20170706050000_create_ti_props.rb
|
275
|
+
- engines/ti/db/migrate/20170706050505_create_ti_docs.rb
|
276
|
+
- engines/ti/db/migrate/20170706050507_create_ti_categories.rb
|
277
|
+
- engines/ti/db/migrate/20170706050606_create_ti_dphotos.rb
|
278
|
+
- engines/ti/db/migrate/20170706083939_create_ti_join_table_categories_docs.rb
|
279
|
+
- engines/ti/db/seeds/ti_02_fill_test_data.rb
|
280
|
+
- engines/ti/lib/ti.rb
|
281
|
+
- engines/ti/lib/ti/engine.rb
|
282
|
+
- engines/ti/lib/ti/version.rb
|
247
283
|
- lib/c80_yax.rb
|
248
284
|
- lib/c80_yax/engine.rb
|
249
285
|
- lib/c80_yax/item_photos_sizes_cache.rb
|