c80_yax 0.1.0.18 → 0.1.0.20

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 (48) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +2 -1
  3. data/app/assets/images/c80_yax/stripe.png +0 -0
  4. data/app/assets/javascripts/c80_yax/frontend/item_color_selector/item_color_selector.js +11 -4
  5. data/app/assets/javascripts/c80_yax/frontend/item_quantity_picker/app.js +11 -3
  6. data/app/assets/javascripts/c80_yax/frontend/item_quantity_picker/item_quantity_picker.js +27 -2
  7. data/app/decorators/c80_yax/item_decorator.rb +4 -1
  8. data/app/views/c80_yax/items/_color_selector.html.erb +2 -2
  9. data/app/views/c80_yax/items/_index.html.erb +4 -1
  10. data/config/routes.rb +1 -0
  11. data/engines/co/README.md +21 -17
  12. data/engines/co/app/admin/co/order_messages.rb +23 -0
  13. data/engines/co/app/assets/javascripts/co/_service/cookies_service.js +71 -2
  14. data/engines/co/app/assets/javascripts/co/add_to_cart/actions/add_row_to_cart.js +2 -2
  15. data/engines/co/app/assets/javascripts/co/add_to_cart/{xapp.js → app.js} +0 -0
  16. data/engines/co/app/assets/javascripts/co/add_to_cart/button_add_to_cart.js +1 -0
  17. data/engines/co/app/assets/javascripts/co/add_to_cart/service/collect_data_for_row.js +5 -1
  18. data/engines/co/app/assets/javascripts/co/add_to_cart_sm/actions/add_row_to_cart_sm.js +17 -0
  19. data/engines/co/app/assets/javascripts/co/add_to_cart_sm/app.js +17 -0
  20. data/engines/co/app/assets/javascripts/co/add_to_cart_sm/button_add_to_cart_sm.js +36 -0
  21. data/engines/co/app/assets/javascripts/co/add_to_cart_sm/service/collect_data_for_row_sm.js +37 -0
  22. data/engines/co/app/assets/javascripts/co/cart_page/app.js +2 -1
  23. data/engines/co/app/assets/javascripts/co/cart_page/cart_page.js +37 -1
  24. data/engines/co/app/assets/javascripts/co/cart_page/cart_table.js +35 -11
  25. data/engines/co/app/assets/javascripts/co/cart_page/message-order-form-ajax.js +53 -0
  26. data/engines/co/app/assets/javascripts/co/cart_page/support/row_maker.js +2 -2
  27. data/engines/co/app/assets/javascripts/co/cart_page/support/row_printer.js +43 -0
  28. data/engines/co/app/assets/javascripts/co/goto_cart/app.js +19 -0
  29. data/engines/co/app/assets/javascripts/co/goto_cart/button_goto_cart.js +40 -0
  30. data/engines/co/app/assets/stylesheets/co/cart_page/form.scss +142 -0
  31. data/engines/co/app/controllers/co/cart_controller.rb +27 -0
  32. data/engines/co/app/helpers/co/cart_page_helper.rb +24 -2
  33. data/engines/co/app/mailers/co/order_message_mailer.rb +29 -0
  34. data/engines/co/app/models/co/order_message.rb +5 -0
  35. data/engines/co/app/models/co/order_message_validator.rb +22 -0
  36. data/engines/co/app/views/co/_cart_page.html.erb +4 -6
  37. data/engines/co/app/views/co/cart/give_me_cart_order_form.js.erb +18 -0
  38. data/engines/co/app/views/co/cart/message_cart_order.js.erb +4 -0
  39. data/engines/co/app/views/co/cart/shared/_cart_order_form.html.erb +83 -0
  40. data/engines/co/app/views/co/cart/shared/_ok_message.html.erb +16 -0
  41. data/engines/co/app/views/co/order_message_mailer/mail_mess.html.erb +1 -0
  42. data/engines/co/config/routes.rb +4 -0
  43. data/engines/co/db/migrate/20170723095252_create_co_order_messages.rb +13 -0
  44. data/engines/co/lib/co/engine.rb +1 -1
  45. data/engines/of/lib/of/engine.rb +1 -1
  46. data/lib/c80_yax/version.rb +1 -1
  47. metadata +25 -4
  48. data/engines/co/app/assets/javascripts/co/add_to_cart/data_order_row.js +0 -16
@@ -1,30 +1,50 @@
1
1
  "use strict";
2
2
 
3
- var CartTable = function ($table){
3
+ var CartTable = function ($table, on_changd){
4
4
 
5
+ var _this = this;
5
6
  var _rows;
6
7
  var _$table;
7
8
  var _$tbody;
8
9
  var _support;
10
+ var __on_changed;
9
11
 
10
12
  //<editor-fold desc="// Инициализация">
11
13
  var _fInitBehaviour = function (){
12
14
  };
13
- var _fInit = function ($table){
15
+ var _fInit = function ($table, on_changed){
14
16
  _$table = $table;
15
17
  _$tbody = _$table.find('tbody');
16
18
  _support = new RowMaker();
17
19
  _rows = [];
20
+ __on_changed = on_changed;
18
21
  _fInitBehaviour();
19
22
  };
20
- _fInit($table);
23
+ _fInit($table, on_changd);
21
24
  //</editor-fold>
22
25
 
26
+ var _on_click_delete_row = function(e) {
27
+ var $t = $(e.target);
28
+ var id = $t.data('id');
29
+ var color = $t.data('color');
30
+
31
+ if (coo.cart_remove_row(id, color)) {
32
+ _this.remove_row(id, color);
33
+ __on_changed(id, color, {});
34
+ }
35
+ };
36
+
23
37
  this.add_row = function(row_hash) {
24
38
  _rows.push(row_hash);
25
39
  var $row = $(_support.make_row_htmlstr(row_hash));
26
40
  _$tbody.append($row);
27
- _activate_q_picker();
41
+ $row.find('.del_action').on('click', _on_click_delete_row);
42
+ _activate_q_picker(function(value_after_change) {
43
+ console.log('<value_after_change> ' + value_after_change);
44
+ var new_price = value_after_change * $row.data('price_per_item');
45
+ $row.find('td.price').text(new_price);
46
+ __on_changed($row.data('id'), $row.data('color'), {price: new_price, q:value_after_change });
47
+ });
28
48
  };
29
49
 
30
50
  this.clear = function() {
@@ -35,15 +55,19 @@ var CartTable = function ($table){
35
55
  _rows = [];
36
56
  };
37
57
 
38
- this.remove_row = function(id) {
39
- var i, n = _rows.length;
58
+ this.remove_row = function(id, color) {
59
+ var i, n = _rows.length - 1;
40
60
  for (i = n; i>=0; i--) {
41
- if (_rows[i]['id'] === id) {
42
- _rows.splice(i, 1);
43
- break;
44
- }
61
+ if (_rows[i]['id'] !== id) continue;
62
+ if (_rows[i]['color'] !== color) continue;
63
+ _rows.splice(i, 1);
64
+ break;
45
65
  }
46
- $('.tr_'+id).remove();
66
+ $('.tr_'+id).each(function() {
67
+ var $t = $(this);
68
+ if ($t.data('color') !== color) return;
69
+ $t.remove();
70
+ });
47
71
  };
48
72
 
49
73
  };
@@ -0,0 +1,53 @@
1
+
2
+ // =[ interface ]=====================================================================================================================
3
+
4
+ var $cart_form_container;
5
+ var markInvalidateInProgress = false;
6
+ var markWasPasted = false;
7
+ var fCartFormInvalidate;
8
+ var fCartFormOnScroll;
9
+
10
+ // =[ implementation ]=====================================================================================================================
11
+
12
+ $(function () {
13
+
14
+ $cart_form_container = $("div#cart_form_container");
15
+
16
+ if ($cart_form_container.length === 1) {
17
+
18
+ fCartFormInvalidate = function () {
19
+ if (!markInvalidateInProgress) {
20
+ markInvalidateInProgress = true;
21
+
22
+ if (!markWasPasted) {
23
+
24
+ $('<div id="loading"></div>').appendTo($cart_form_container);
25
+
26
+ $.ajax({
27
+ url: '/give_me_cart_order_form',
28
+ type: 'GET',
29
+ dataType: 'script'
30
+ }).done(function (data, result) {
31
+ if (result === "success") {
32
+ markWasPasted = true;
33
+ }
34
+ });
35
+ }
36
+ }
37
+ };
38
+
39
+ fCartFormOnScroll = function(event) {
40
+ var closeToBottom = jQuery(window).scrollTop() >= 0;
41
+ if (closeToBottom) {
42
+ fCartFormInvalidate();
43
+ }
44
+ };
45
+
46
+ // start
47
+ $(document).bind('scroll', fCartFormOnScroll);
48
+ setTimeout(function () {
49
+ fCartFormOnScroll();
50
+ },300);
51
+
52
+ }
53
+ });
@@ -2,7 +2,7 @@
2
2
 
3
3
  var RowMaker = function() {
4
4
 
5
- var _ROW = '<tr class="tr_{{ id }}">' +
5
+ var _ROW = '<tr class="tr_{{ id }}" data-price_per_item="{{ price_per_item }}" data-id="{{ id }}" data-color="{{ color }}">' +
6
6
  '<td class="image">' +
7
7
  '<a class="lazy-image-wrapper" href=" {{ item_url }}" target="_blank" title="{{ title }}">' +
8
8
  '<img data-original="{{ image_url }}" alt="{{ title }}">' +
@@ -22,7 +22,7 @@ var RowMaker = function() {
22
22
  '</div>' +
23
23
  '</td>' +
24
24
  '<td class="price">{{ price }}</td>' +
25
- '<td class="actions"><a title="Удалить" class="del_action" data-id="{{ id }}">Удалить</a></td>' +
25
+ '<td class="actions"><a title="Удалить" class="del_action" data-id="{{ id }}" data-color="{{ color }}">Удалить</a></td>' +
26
26
  '</tr>';
27
27
 
28
28
  this.make_row_htmlstr = function(obj) {
@@ -0,0 +1,43 @@
1
+ "use strict";
2
+
3
+ var RowPrinter = function() {
4
+
5
+ var _ROW = '<tr>' +
6
+ '<td style="width:290px;">' +
7
+ '<a href=" {{ item_url }}" title="{{ title }}">' +
8
+ '{{ title }}' +
9
+ '</a>' +
10
+ '</td>' +
11
+ '<td style="width:130px;">' +
12
+ 'Цвет: {{ color_title }}' +
13
+ '</td>' +
14
+ '<td style="width:150px;">' +
15
+ 'Кол-во: {{ q }}' +
16
+ '</td>' +
17
+ '<td style="width:190px;">Цена: {{ price }}</td>' +
18
+ '</tr>';
19
+
20
+ var _BOTTOM_ROW = '<tr>' +
21
+ '<td colspan="2">Итого: {{ order_price }}</td>' +
22
+ '<td colspan="2">Доставка: {{ deliver }}</td>' +
23
+ '</tr>';
24
+
25
+ var _print = function(obj, pattern) {
26
+ var res = pattern;
27
+ var al;
28
+ for ( var key in obj ){
29
+ al = "{{ " + key + " }}";
30
+ res = res.split(al).join(obj[key]);
31
+ }
32
+ return res;
33
+ };
34
+
35
+ this.print_row = function(obj) {
36
+ return _print(obj, _ROW);
37
+ };
38
+
39
+ this.print_bottom_row = function(obj) {
40
+ return _print(obj, _BOTTOM_ROW);
41
+ };
42
+
43
+ };
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+
3
+ var $ss;
4
+
5
+ var _activate_goto_card = function() {
6
+ $ss.each(function() {
7
+ var ins = new ButtonGotoCart(this);
8
+ ButtonGotoCart.instances.push(ins);
9
+ });
10
+ ButtonGotoCart.refresh_count();
11
+ };
12
+
13
+ $(document).ready(function() {
14
+ $ss = $('.b_make_order a');
15
+ if ($ss.length !== 0) {
16
+ // alert(ButtonAddToCart);
17
+ _activate_goto_card();
18
+ }
19
+ });
@@ -0,0 +1,40 @@
1
+ "use strict";
2
+
3
+ var ButtonGotoCart = function(selector) {
4
+
5
+ var _$btn;
6
+ var _$counter;
7
+
8
+ //<editor-fold desc="// инициализация">
9
+ var _fInitBehaviour = function (){
10
+ if (_$btn.length <= 0) return;
11
+ };
12
+ var _fInit = function (selector){
13
+ _$btn = $(selector);
14
+ _$counter = $('<div class="counter"></div>');
15
+ _$counter.appendTo(_$btn);
16
+ _fInitBehaviour();
17
+ };
18
+ _fInit(selector);
19
+ //</editor-fold>
20
+
21
+ this.set_count = function(new_val) {
22
+ console.log('<ButtonGotoCart#set_count>');
23
+ _$counter.text(new_val);
24
+ }
25
+
26
+ };
27
+
28
+ ButtonGotoCart.instances = [];
29
+ ButtonGotoCart.refresh_count = function() {
30
+ console.log('<ButtonGotoCart.refresh_count>');
31
+ var cart = coo.cart_get();
32
+ var new_val = 0;
33
+ for (var i = 0; i < cart.length; i++) {
34
+ new_val += Number(cart[i]['q']);
35
+ }
36
+ for (var i = 0; i < ButtonGotoCart.instances.length; i++) {
37
+ var ins = ButtonGotoCart.instances[i];
38
+ ins.set_count(new_val);
39
+ }
40
+ }
@@ -0,0 +1,142 @@
1
+ div.card_row {
2
+ @include clearfix;
3
+ margin-bottom: 30px;
4
+ > div {
5
+ float: left;
6
+ width: 50%;
7
+ &#policy {
8
+ padding-left: 20px;
9
+ }
10
+ }
11
+ }
12
+
13
+ #cart_form_container {
14
+ margin: 0;
15
+ background-color: transparent;
16
+ min-height: 300px;
17
+ position: relative;
18
+ * { &:focus { outline: none !important; } }
19
+
20
+ #loading {
21
+ position: absolute;
22
+ top: 0;
23
+ left: 0;
24
+ bottom: 0;
25
+ right: 0;
26
+ text-align: center;
27
+ font-size: 20px;
28
+ background: rgba(255, 255, 255, 1) url(data:image/gif;base64,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) 50% 50% no-repeat;
29
+ z-index: 9999;
30
+ line-height: 3;
31
+ transition: visibility 1s, opacity 0.5s linear;
32
+
33
+ &.invis {
34
+ visibility: hidden;
35
+ opacity: 0;
36
+ }
37
+
38
+ }
39
+
40
+ div#cart_order_form { /* NOTE:: получается, на странице может быть только одна такая форма */
41
+
42
+ .modal-dialog {
43
+ width: auto;
44
+ margin: 0;
45
+
46
+ .modal-content {
47
+ box-shadow: none;
48
+ border: none;
49
+ /*background-color: transparent;*/
50
+
51
+ div.modal-header {
52
+ border-bottom: none !important;
53
+ }
54
+
55
+ div.modal-body {
56
+ padding: 0;
57
+
58
+ div.form-group {
59
+ margin-bottom: 25px;
60
+
61
+ &.hiddn {
62
+ width: 0;
63
+ height: 0;
64
+ position: absolute;
65
+ overflow: hidden;
66
+ }
67
+
68
+ label {
69
+
70
+ }
71
+
72
+ .input_wrapper {
73
+
74
+ position: relative;
75
+
76
+ &:after {
77
+ content: "";
78
+ background: transparent url(image_path('stripe.png')) repeat 0 0; /*NOTE:: можно переопределить в custom классах */
79
+ opacity: 0.1;
80
+ top: 0;
81
+ left: 0;
82
+ bottom: 0;
83
+ right: 0;
84
+ position: absolute;
85
+ z-index: 0;
86
+ }
87
+
88
+ .form-control {
89
+ position: relative;
90
+ z-index: 1;
91
+
92
+ &:focus {
93
+ text-shadow: none !important;
94
+ border: #2d2d2d 1px solid;
95
+ box-shadow: none !important;
96
+ -webkit-box-shadow: none !important;
97
+ }
98
+
99
+ }
100
+
101
+ }
102
+
103
+ textarea {
104
+
105
+ }
106
+
107
+ .help-block {
108
+ padding-left: 0 !important;
109
+ position: absolute;
110
+ text-align: right;
111
+ padding-right: 0;
112
+ color: #ff0000;
113
+ }
114
+
115
+ &.has-error {
116
+
117
+ .help-block {
118
+ /*color: #ff7f7c;*/
119
+ }
120
+
121
+ }
122
+
123
+ }
124
+
125
+ div.actions {
126
+ margin-top: 15px;
127
+
128
+ input.btn {
129
+ @include color_button(#FFFFFF, $red);
130
+ }
131
+
132
+ }
133
+
134
+ }
135
+
136
+ }
137
+
138
+ }
139
+ }
140
+
141
+ }
142
+
@@ -0,0 +1,27 @@
1
+ module Co
2
+ class CartController < ::ApplicationController
3
+
4
+ def give_me_cart_order_form
5
+ end
6
+
7
+ def message_cart_order
8
+ puts '<CartController.message_cart_order>'
9
+ m = OrderMessage.new(mess_params)
10
+ respond_to do |format|
11
+ if m.save
12
+
13
+ format.js
14
+ OrderMessageMailer.send_mess(m, 'Заказ').deliver
15
+ else
16
+ puts "<CartController.message_cart_order> errors: #{m.errors}"
17
+ format.js { render json: m.errors, status: :unprocessable_entity }
18
+ end
19
+ end
20
+ end
21
+
22
+ def mess_params
23
+ params.require(:mess).permit(:name, :phone, :comment, :city)
24
+ end
25
+
26
+ end
27
+ end
@@ -1,7 +1,29 @@
1
1
  module Co
2
2
  module CartPageHelper
3
- def c80_yax_render_cart
4
- render partial: 'co/cart_page'
3
+
4
+ def c80_yax_render_cart(page_content = '')
5
+ render partial: 'co/cart_page',
6
+ locals: {
7
+ page_content: page_content
8
+ }
5
9
  end
10
+
11
+ def render_cart_order_form
12
+
13
+ render :partial => 'co/cart/shared/cart_order_form',
14
+ :locals => {
15
+ :mess => OrderMessage.new
16
+ }
17
+
18
+ end
19
+
20
+ def render_ok_message
21
+ render :partial => 'co/cart/shared/ok_message',
22
+ :locals => {
23
+ ok_text: 'Мы свяжемся с Вами в ближайшее время.',
24
+ wtitle: 'Ваше сообщение отправлено'
25
+ }
26
+ end
27
+
6
28
  end
7
29
  end
@@ -0,0 +1,29 @@
1
+ module Co
2
+ class OrderMessageMailer < ActionMailer::Base
3
+
4
+ default from: Proc.new { SiteProp.first.mail_from },
5
+ to: Proc.new { SiteProp.first.mail_to }
6
+
7
+ def send_mess(message, subject)
8
+ @message = format_message(message)
9
+
10
+ puts '<MessageOrderMailer.send_mess> Отправляем сообщение.'
11
+ mail(subject: subject) do |format|
12
+ format.html { render 'mail_mess'}
13
+ end
14
+
15
+ #puts "#{SiteProps.first.mail_to}"
16
+ end
17
+
18
+ private
19
+
20
+ def format_message(message)
21
+ result = "<br> • Имя: #{message.name}"
22
+ result += "<br> • Телефон: #{message.phone}"
23
+ result += "<br> • Адрес: #{message.city}"
24
+ result += "<br> • Детали заказа:<br><br> #{message.comment}"
25
+ result
26
+ end
27
+
28
+ end
29
+ end
@@ -0,0 +1,5 @@
1
+ module Co
2
+ class OrderMessage < ActiveRecord::Base
3
+ validates_with OrderMessageValidator
4
+ end
5
+ end
@@ -0,0 +1,22 @@
1
+ module Co
2
+ class OrderMessageValidator < ActiveModel::Validator
3
+ def validate(record)
4
+ unless record.errors.present?
5
+ puts "<OrderMessageValidator.validate> record = #{record}"
6
+
7
+ unless record.name.present?
8
+ record.errors[:name] = 'Укажите, пожалуйста, Ваше имя'
9
+ end
10
+
11
+ if record.phone.present?
12
+ if record.phone[/^((8|\+7)[\- ]?)?(\(?\d{3}\)?[\- ]?)?[\d\- ]{7,10}$/].present?
13
+ t2 = 'Пожалуйста, укажите корректный номер телефона'
14
+ record.errors[:phone] = t2
15
+ end
16
+ end
17
+
18
+ end
19
+
20
+ end
21
+ end
22
+ end
@@ -32,10 +32,8 @@
32
32
  <%= link_to 'Очистить корзину', '#', class: 'clear_btn' %>
33
33
  </div>
34
34
  </div>
35
- <%= render_image_link_lazy({
36
- :alt_image => 'Корзина демо',
37
- :image => image_url('demo_cart.jpg'),
38
- :a_href => '#',
39
- :a_rel => 'nofollow'
40
- }) %>
35
+ <div class="card_row">
36
+ <div id="cart_form_container"></div>
37
+ <div id="policy"><%= page_content %></div>
38
+ </div>
41
39
  </div>
@@ -0,0 +1,18 @@
1
+ var $cc = $("#cart_form_container");
2
+ var html_str = "<%= j render_cart_order_form %>";
3
+
4
+ setTimeout(function () {
5
+ $('#loading').addClass('invis');
6
+ setTimeout(function () {
7
+ $cc.html(html_str);
8
+
9
+ // перед показом можно переопределить надпись на кнопке
10
+ /*if ($cc.data('button-label') != undefined) {
11
+ $cc.find('[type=submit]').attr('value', $cc.data('button-label'));
12
+ }*/
13
+
14
+ aCartPage.print_table_to_comment();
15
+
16
+ },500);
17
+ },1000);
18
+
@@ -0,0 +1,4 @@
1
+ $('#cart_order_form').modal_success();
2
+ setTimeout(function(){
3
+ $('#modal_ok').modal("show");
4
+ },400);
@@ -0,0 +1,83 @@
1
+ <%= render_ok_message %>
2
+ <div id="cart_order_form" tabindex="-1" role="dialog" aria-labelledby="feedbackForm" aria-hidden="true">
3
+ <div class="modal-dialog">
4
+ <div class="modal-content">
5
+ <div class="modal-header">
6
+ <h4 class="modal-title medium" id="myModalLabel">&nbsp;</h4>
7
+ </div>
8
+ <div class="modal-body regular">
9
+
10
+ <%= form_for :mess,
11
+ :url => '/message_cart_order',
12
+ :remote => true,
13
+ html: {
14
+ multipart: true,
15
+ :role => :form,
16
+ :id => 'form_message',
17
+ :data => {
18
+ :model => 'mess'
19
+ }
20
+ } do |f| %>
21
+
22
+ <div class="form-group clearfix">
23
+ <%= f.label :name, 'Фамилия Имя Отчество', class: 'control-label must' %>
24
+ <div class="input_wrapper"><%= f.text_field :name, class: 'form-control' %></div>
25
+ <span class="help-block col-md-12"></span>
26
+ </div>
27
+
28
+ <div class="form-group clearfix">
29
+ <%= f.label :phone, 'Контактный телефон', class: 'control-label must' %>
30
+ <div class="input_wrapper"><%= f.text_field :phone, class: 'form-control' %></div>
31
+ <span class="help-block col-md-12"></span>
32
+ </div>
33
+
34
+ <div class="form-group clearfix">
35
+ <%= f.label :date, 'Желаемая дата получения товара', class: 'control-label' %>
36
+ <div class="input_wrapper"><%= f.text_field :date, class: 'form-control' %></div>
37
+ <span class="help-block col-md-12"></span>
38
+ </div>
39
+
40
+ <div class="form-group clearfix">
41
+ <%= f.label :city, 'Адрес', class: 'control-label' %>
42
+ <div class="input_wrapper"><%= f.text_field :city, class: 'form-control' %></div>
43
+ <span class="help-block col-md-12"></span>
44
+ </div>
45
+
46
+ <div class="form-group clearfix hiddn" style="margin-bottom: 0;">
47
+ <%= f.label :comment, 'Сообщение', class: 'control-label' %>
48
+ <div class="input_wrapper"><%= f.text_area :comment, class: 'form-control', :rows => '1' %></div>
49
+ <span class="help-block col-md-12"></span>
50
+ </div>
51
+
52
+ <div class="actions clearfix">
53
+ <%= f.label ' ', class: 'control-label' %>
54
+ <%= f.submit 'Отправить',
55
+ class: 'btn btn-primary',
56
+ data: {
57
+ disable_with: 'Отправляется...'
58
+ }
59
+ %>
60
+ </div>
61
+
62
+ <% end %>
63
+
64
+ </div>
65
+
66
+ </div>
67
+ </div>
68
+ </div>
69
+
70
+ <%# настраиваем форму %>
71
+ <script>
72
+ $(document).ready(function () {
73
+
74
+ var $form = $("form#form_message");
75
+
76
+ $form.bind("ajax:error", function (event, data, status, xhr) {
77
+ $form.render_form_errors($.parseJSON(data.responseText));
78
+ });
79
+
80
+ $form.modal_success();
81
+
82
+ });
83
+ </script>
@@ -0,0 +1,16 @@
1
+ <div class="modal fade" id="modal_ok" tabindex="1" role="dialog" aria-labelledby="modalOk" aria-hidden="true">
2
+ <div class="modal-dialog">
3
+ <div class="modal-content">
4
+ <div class="modal-header">
5
+ <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
6
+ <h4 class="modal-title" id="myModalLabel"><%= wtitle %></h4>
7
+ </div>
8
+ <div class="modal-body">
9
+ <p><%= ok_text %></p>
10
+ </div>
11
+ <div class="modal-footer">
12
+ <button type="button" class="btn btn-primary" data-dismiss="modal">Закрыть</button>
13
+ </div>
14
+ </div>
15
+ </div>
16
+ </div>
@@ -0,0 +1 @@
1
+ <%= @message.html_safe %>