c80_estate 0.1.0.9 → 0.1.0.10

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 (30) hide show
  1. checksums.yaml +4 -4
  2. data/app/admin/c80_estate/admin_user.rb +4 -1
  3. data/app/admin/c80_estate/areas.rb +30 -20
  4. data/app/admin/c80_estate/astatuses.rb +1 -0
  5. data/app/admin/c80_estate/comments.rb +3 -1
  6. data/app/admin/c80_estate/dashboard.rb +14 -4
  7. data/app/admin/c80_estate/properties.rb +1 -1
  8. data/app/admin/c80_estate/pstats.rb +1 -0
  9. data/app/assets/javascript/c80_estate/backend/admin/areas.js +180 -19
  10. data/app/assets/javascript/c80_estate/backend/admin/pstats.js +155 -147
  11. data/app/assets/javascript/c80_estate/lib/bootstrap-slider.js +1641 -0
  12. data/app/assets/stylesheets/c80_estate/backend/admin_areas.scss +7 -3
  13. data/app/assets/stylesheets/c80_estate/backend/admin_pstats.scss +19 -11
  14. data/app/assets/stylesheets/c80_estate/backend/common.scss +5 -0
  15. data/app/controllers/c80_estate/ajax_areas_controller.rb +38 -0
  16. data/app/helpers/c80_estate/app_helper.rb +45 -36
  17. data/app/models/c80_estate/area.rb +94 -0
  18. data/app/models/c80_estate/item_prop.rb +4 -2
  19. data/app/models/c80_estate/owner.rb +8 -2
  20. data/app/models/c80_estate/pstat.rb +53 -35
  21. data/app/views/admin/dashboard/_prop_in_list.html.erb +1 -2
  22. data/app/views/c80_estate/ajax_areas/exel_import.html.erb +1 -0
  23. data/app/views/c80_estate/ajax_areas/exel_import.js.erb +6 -0
  24. data/app/views/c80_estate/shared/_form_upload_areas_excel.erb +37 -0
  25. data/app/views/c80_estate/shared/_table_properties_coef_busy.html.erb +12 -8
  26. data/app/views/c80_estate/shared/_table_properties_coef_busy_sq.html.erb +12 -8
  27. data/config/routes.rb +2 -0
  28. data/lib/c80_estate/version.rb +1 -1
  29. metadata +7 -3
  30. data/app/assets/javascript/c80_estate/lib/bootstrap-slider.min.js +0 -29
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 557d89464d2f0e0c81468e06bb4ecd5de9e18cf4
4
- data.tar.gz: e3b7a1cee868213682dd2733f93e3dbff12c0274
3
+ metadata.gz: 92db0eea3e78217e967bdfecb4b213e0cf85c354
4
+ data.tar.gz: 5a5abb3d09dce79ea8bd7ee064e71b70c14cd30e
5
5
  SHA512:
6
- metadata.gz: 4a97a9f531a70748a06eb1f2c22eb6b7c5f0d0a296d0e44a8c4f077d25405a38971f8da7781d74b082c294da3369e68f0310de5ca37879fc80217bec3c568a7f
7
- data.tar.gz: bf0e24cd2c983f4970fa72d61d4db99c379cc2a0c76fa1a8d1fc3626d31ac1eeb22593811e23107c714592dd08218490f8600ed09e46f23cc51526064c68eec1
6
+ metadata.gz: 510854ede032d5d38f084423f800060275eaa1de4c018304380e11e86016e4385904a8ab70c24a783019720f5dfb41320be22702f7ed9100f08f9394b72b7c0b
7
+ data.tar.gz: b9de54cec83c69cfc02b90e7245cce71f774987405ced9d734e2fe4ab06366b0a3b8043308a4d2aa0aa2dc5cc33ebe457a44c9c09838e25007672b7217dbae5a
@@ -20,7 +20,10 @@ ActiveAdmin.register AdminUser do
20
20
  end
21
21
 
22
22
  # menu :if => proc {current_admin_user.email == "tz007@mail.ru"}
23
- menu label: 'Пользователи', :if => proc { current_admin_user.can_view_users? }
23
+ menu label: 'Пользователи',
24
+ :if => proc { current_admin_user.can_view_users? },
25
+ :priority => 9
26
+
24
27
  index do
25
28
  selectable_column
26
29
  id_column
@@ -2,7 +2,7 @@ ActiveAdmin.register C80Estate::Area, as: 'Area' do
2
2
 
3
3
  # scope_to :current_admin_user, association_method: :sites_list
4
4
 
5
- menu :label => "Площади"
5
+ menu :label => 'Площади', priority: 3
6
6
 
7
7
  permit_params :title,
8
8
  :desc,
@@ -88,28 +88,30 @@ ActiveAdmin.register C80Estate::Area, as: 'Area' do
88
88
  :as => :string,
89
89
  :label => 'Площадь (м.кв.)',
90
90
  :input_html => {data: {
91
- provide: 'slider',
91
+ # provide: 'slider',
92
92
  slider_ticks: C80Estate::ItemProp.all_uniq_values(9).to_json, #'[0, 1, 2, 3]',
93
93
  slider_labels: C80Estate::ItemProp.all_uniq_values(9).to_json, #'["none", short", "medium","long"]',
94
- slider_min: C80Estate::ItemProp.all_uniq_values(9).last,
95
- slider_max: C80Estate::ItemProp.all_uniq_values(9).first,
94
+ slider_min: C80Estate::ItemProp.all_uniq_values(9).sort.first,
95
+ slider_max: C80Estate::ItemProp.all_uniq_values(9).sort.last,
96
96
  slider_step: 1,
97
97
  slider_value: 0,
98
- slider_range: true
98
+ slider_range: true,
99
+ slider_tooltip: 'hide'
99
100
  }}
100
101
 
101
102
  filter :item_prop_price_val_in,
102
103
  :as => :string,
103
104
  :label => 'Цена (руб/м.кв в месяц)',
104
105
  :input_html => {data: {
105
- provide: 'slider',
106
+ #provide: 'slider',
106
107
  slider_ticks: C80Estate::ItemProp.all_uniq_values(1).to_json, #'[0, 1, 2, 3]',
107
108
  slider_labels: C80Estate::ItemProp.all_uniq_values(1).to_json, #'["none", short", "medium","long"]',
108
- slider_min: C80Estate::ItemProp.all_uniq_values(1).last,
109
- slider_max: C80Estate::ItemProp.all_uniq_values(1).first,
109
+ slider_min: C80Estate::ItemProp.all_uniq_values(1).sort.first,
110
+ slider_max: C80Estate::ItemProp.all_uniq_values(1).sort.last,
110
111
  slider_step: 1,
111
112
  slider_value: 0,
112
- slider_range: true
113
+ slider_range: true,
114
+ slider_tooltip: 'hide'
113
115
  }}
114
116
 
115
117
  filter :item_prop_oenter_in,
@@ -139,26 +141,34 @@ ActiveAdmin.register C80Estate::Area, as: 'Area' do
139
141
 
140
142
  index do
141
143
  selectable_column
142
- column :title
144
+ column :title do |area|
145
+ link_to area.title, "/admin/areas/#{area.id}", title: I18n.t("active_admin.view")
146
+ end
143
147
  column :atype do |area|
144
148
  area.atype_title
145
149
  end
150
+ column 'Цена' do |area|
151
+ "#{area.price_value} руб"
152
+ end
153
+ column 'Метраж' do |area|
154
+ "#{area.square_value} м<sup>2</sup>".html_safe
155
+ end
146
156
  column :property do |area|
147
157
  "<div class='image_vertical properties_index_logo'>
148
- <span></span><img src='#{image_path(area.property.logo_path)}'>
149
- </div><span class='properties_index_logo_title'>#{area.property_title}</span>".html_safe
158
+ <span></span><a href='/admin/areas?utf8=✓&q%5Bproperty_id_eq%5D=#{area.property.id}&commit=Фильтровать&order=id_asc'><img src='#{image_path(area.property.logo_path)}'>
159
+ </div><span class='properties_index_logo_title'>#{area.property_title}</span></a>".html_safe
150
160
 
151
161
  end
152
162
  column :astatuses do |area|
153
163
  "<span class='status_#{area.astatus_tag}'>#{area.astatus_title}</span>".html_safe
154
164
  end
155
165
  column :assigned_person do |area|
156
- area.assigned_person_title
166
+ area.property.assigned_person_title
157
167
  end
158
168
  # actions
159
- column '' do |area|
160
- link_to I18n.t("active_admin.view"), "/admin/areas/#{area.id}", class: 'member_link'
161
- end
169
+ # column '' do |area|
170
+ # link_to I18n.t("active_admin.view"), "/admin/areas/#{area.id}", class: 'member_link'
171
+ # end
162
172
  column '' do |area|
163
173
  if current_admin_user.can_edit_area?(area)
164
174
  link_to I18n.t("active_admin.edit"), "/admin/areas/#{area.id}/edit", class: 'member_link'
@@ -172,10 +182,10 @@ ActiveAdmin.register C80Estate::Area, as: 'Area' do
172
182
  f.input :title
173
183
  f.input :atype, :input_html => {:class => 'selectpicker', 'data-size' => "10", 'data-width' => '400px'}
174
184
  f.input :property, :input_html => {:class => 'selectpicker', 'data-size' => "10", 'data-width' => '400px'}
175
- f.input :assigned_person,
176
- :input_html => {:class => 'selectpicker', 'data-size' => "10", 'data-width' => '400px'},
177
- :collection => AdminUser.all.map { |u| ["#{u.email}", u.id] }
178
- f.input :assigned_person_type, :input_html => {:value => "AdminUser"}, as: :hidden
185
+ # f.input :assigned_person,
186
+ # :input_html => {:class => 'selectpicker', 'data-size' => "10", 'data-width' => '400px'},
187
+ # :collection => AdminUser.all.map { |u| ["#{u.email}", u.id] }
188
+ # f.input :assigned_person_type, :input_html => {:value => "AdminUser"}, as: :hidden
179
189
  f.input :astatuses,
180
190
  :input_html => {:class => 'selectpicker', 'data-size' => "10", 'data-width' => '400px', :multiple => false}
181
191
  f.input :desc, :as => :ckeditor
@@ -1,6 +1,7 @@
1
1
  # ПОДкатегории строительных материалов
2
2
  ActiveAdmin.register C80Estate::Astatus, :as => 'Astatus' do
3
3
 
4
+ menu :label => "Настройки", :priority => 3#, :if => :foo
4
5
  menu :label => "Статусы", :parent => "Настройки", :if => proc { current_admin_user.can_view_settings? }
5
6
 
6
7
  permit_params :title
@@ -1,6 +1,8 @@
1
1
  ActiveAdmin.register ActiveAdmin::Comment, :as => 'Comment' do
2
2
 
3
- menu label: 'Комментарии', :if => proc { current_admin_user.can_view_comments? }
3
+ menu label: 'Комментарии',
4
+ :if => proc { current_admin_user.can_view_comments? },
5
+ :priority => 12
4
6
 
5
7
  batch_action :destroy, false
6
8
 
@@ -8,14 +8,14 @@ ActiveAdmin.register_page "Dashboard" do
8
8
 
9
9
  column do
10
10
 
11
- panel 'Объекты недвижимости', class:'clearfix' do
11
+ panel 'Объекты недвижимости', class: 'clearfix' do
12
12
  # para "Объекты недвижимости", class: 'title'
13
13
  C80Estate::Property.all.each do |prop|
14
14
  render partial: 'prop_in_list', locals: {prop: prop}
15
15
  end
16
16
  end
17
17
 
18
- panel 'Типы площадей', class:'clearfix' do
18
+ panel 'Типы площадей', class: 'clearfix' do
19
19
  # para 'Типы площадей', class: 'title'
20
20
  C80Estate::Atype.all.each do |atype|
21
21
  render partial: 'atype_in_list', locals: {atype: atype}
@@ -25,16 +25,26 @@ ActiveAdmin.register_page "Dashboard" do
25
25
  end
26
26
 
27
27
  column do
28
- panel 'Рейтинг занятости', class:'clearfix' do
28
+ panel 'Рейтинг занятости', class: 'clearfix' do
29
29
  render_table_prop_busy_coef
30
30
  end
31
- panel 'Рейтинг занятости в м.кв.', class:'clearfix' do
31
+ panel 'Рейтинг занятости в м.кв.', class: 'clearfix' do
32
32
  render_table_prop_busy_coef_sq
33
33
  end
34
34
  end
35
35
 
36
36
  end
37
37
 
38
+ section '', if: -> { current_admin_user.email == 'tz007@mail.ru' } do
39
+ columns do
40
+ column do
41
+ panel 'Admin Features', class: 'clearfix' do
42
+ render_upload_areas_excel_form
43
+ end
44
+ end
45
+ end
46
+ end
47
+
38
48
  # div class: "blank_slate_container", id: "dashboard_default_message" do
39
49
  # span class: "blank_slate" do
40
50
  # span I18n.t("active_admin.dashboard_welcome.welcome")
@@ -2,7 +2,7 @@ ActiveAdmin.register C80Estate::Property, as: 'Property' do
2
2
 
3
3
  # scope_to :current_admin_user, association_method: :sites_list
4
4
 
5
- menu :label => "Объекты недвижимости"
5
+ menu :label => "Объекты недвижимости", priority: 2
6
6
 
7
7
  permit_params :title,
8
8
  :desc,
@@ -2,6 +2,7 @@ ActiveAdmin.register C80Estate::Pstat, as: 'Pstat' do
2
2
 
3
3
  # scope_to :current_admin_user, association_method: :sites_list
4
4
 
5
+ menu label: 'Статистика', priority: 6
5
6
  menu :label => "Объекты", :parent => 'Статистика', if: proc{ current_admin_user.can_view_statistics? }
6
7
 
7
8
  config.sort_order = 'id_asc'
@@ -417,32 +417,193 @@ var fEdit = function () {
417
417
  fLoadingShow();
418
418
  };
419
419
 
420
+ //var $slider_square;
421
+ //var $slider_price;
422
+
420
423
  var fAreasIndex = function () {
421
424
 
422
- //var $input_square_min = $('<input type="text" class="min_text_input"/>')
423
- // .appendTo($("#q_item_prop_square_val_in").parent());
424
- //
425
- //var $input_square_max = $('<input type="text" class="max_text_input"/>')
426
- // .appendTo($("#q_item_prop_square_val_in").parent());
425
+ var csss_input_square = '#q_item_prop_square_val_in';
426
+ var csss_input_price = '#q_item_prop_price_val_in';
427
+
428
+ var $original_input_square;
429
+ var $original_input_price;
430
+
431
+ var square_min;
432
+ var square_max;
433
+ var price_min;
434
+ var price_max;
435
+
436
+ var $slider_square;
437
+ var $slider_price;
438
+
439
+ var _fInit = function () {
440
+
441
+ $original_input_square = $(csss_input_square);
442
+ $original_input_price = $(csss_input_price);
443
+
444
+ _fTranslateScopes();
445
+ _fInitSliders();
446
+
447
+ // считываем get параметры
448
+ var rex_square = /item_prop_square_val_in\]=(\d{1,5}),(\d{1,5})/;
449
+ var rex_price = /item_prop_square_val_in\]=(\d{1,5}),(\d{1,5})/;
450
+ var url = unescape(window.location.href);
451
+
452
+ var match_square = url.match(rex_square);
453
+ var match_price = url.match(rex_price);
454
+
455
+ var min, max, p;
456
+
457
+ if (match_square != null) {
458
+ min = Number(match_square[1]);
459
+ max = Number(match_square[2]);
460
+ if (min > max) {
461
+ p = min;
462
+ min = max;
463
+ max = p;
464
+ }
465
+ $slider_square.setValue([min, max]);
466
+ }
467
+
468
+ if (match_price != null) {
469
+ min = Number(match_price[1]);
470
+ max = Number(match_price[2]);
471
+ if (min > max) {
472
+ p = min;
473
+ min = max;
474
+ max = p;
475
+ }
476
+ $slider_price.setValue([min, max]);
477
+ }
478
+
479
+ //console.log("<_fMakeMinMaxInputs> square = " + param_item_prop_square_val_in + "; price = " + param_item_prop_price_val_in);
480
+
481
+ // подставляем начальные значения
482
+ };
483
+
484
+ var _fTranslateScopes = function () {
485
+ // переведём scope надписи
486
+
487
+ var $li, $a, $a_span;
488
+
489
+ $li = $('li.scope.all');
490
+ $a = $li.find(".table_tools_button");
491
+ $a_span = $a.find('span');
492
+ $a.html('Все <span class="count">' + $a_span.text() + '</span>');
493
+
494
+ $li = $('li.scope.free');
495
+ $a = $li.find(".table_tools_button");
496
+ $a_span = $a.find('span');
497
+ $a.html('Свободные <span class="count">' + $a_span.text() + '</span>');
498
+
499
+ $li = $('li.scope.busy');
500
+ $a = $li.find(".table_tools_button");
501
+ $a_span = $a.find('span');
502
+ $a.html('Занятые <span class="count">' + $a_span.text() + '</span>');
503
+ };
504
+
505
+ var _fInitSliders = function () {
506
+
507
+ //$slider_square = $original_input_square.bootstrapSlider();
508
+ //$slider_price = $original_input_price.bootstrapSlider();
509
+ $slider_square = new Slider(csss_input_square);
510
+ $slider_price = new Slider(csss_input_price);
511
+
512
+ //console.log($original_input_square);
513
+ //console.log($original_input_price);
514
+ square_min = $original_input_square.data('slider-min');
515
+ square_max = $original_input_square.data('slider-max');
516
+ price_min = $original_input_price.data('slider-min');
517
+ price_max = $original_input_price.data('slider-max');
427
518
 
428
- // переведём scope надписи
519
+ _fMakeMinMaxInputs($original_input_square, $slider_square, [square_min,square_max] );
520
+ _fMakeMinMaxInputs($original_input_price, $slider_price, [price_min, price_max]);
429
521
 
430
- var $li, $a, $a_span;
522
+ };
431
523
 
432
- $li = $('li.scope.all');
433
- $a = $li.find(".table_tools_button");
434
- $a_span = $a.find('span');
435
- $a.html('Все <span class="count">' + $a_span.text() + '</span>');
524
+ var _fMakeMinMaxInputs = function ($input, $slider, minmax) {
525
+ //console.log("<func_normalize_val> minmax = " + minmax);
526
+
527
+ // перед этим элементом вставим наши инпуты
528
+ var $trg = $input.parent().find('div.slider');
529
+
530
+ // пофиксим отступ для красоты
531
+ $input.parent().find('.label').css('margin-bottom','-5px');
532
+
533
+ // вставляемые инпуты
534
+ var $input_min = $('<input type="number" class="min_text_input" placeholder="от"/>');
535
+ var $input_max = $('<input type="number" class="max_text_input" placeholder="до"/>');
536
+ $trg.before($input_min);
537
+ $trg.before($input_max);
538
+
539
+ /*взаимодействуя со слайдером - будут меняться значения в текстовых полях*/
540
+
541
+ var func_on_change_slider = function () {
542
+ //console.log("<func_on_change_slider> " + this.value); // #=> 12,333
543
+ var va = this.value.split(',');
544
+ var min = va[0];
545
+ var max = va[1];
546
+ $input_min.val(min);
547
+ $input_max.val(max);
548
+ //$input_min.data('normalized-value',min);
549
+ //$input_max.data('normalized-value',max);
550
+ };
551
+ $input.on('change', func_on_change_slider);
552
+ $input.change();
553
+
554
+ /*взаимодействуя с текстовыми полями - будет меняться слайдер*/
555
+
556
+ var func_normalize_val = function (val) {
557
+ //console.log("<func_normalize_val> val = " + val);
558
+ //console.log("<func_normalize_val> minmax[0] = " + minmax[0]);
559
+ //console.log("<func_normalize_val> minmax[1] = " + minmax[1]);
560
+
561
+ var v = val;
562
+ if (v < $input.data('slider-min')) {
563
+ v = $input.data('slider-min');
564
+ }
565
+ if (v > $input.data('slider-max')) {
566
+ v = $input.data('slider-max');
567
+ }
568
+ return Number(v);
569
+ };
570
+
571
+ var func_invalidate_slider = function () {
572
+
573
+ //$trg.bootstrapSlider('setValue',[
574
+ // $input_min.data('normalized-value'),
575
+ // $input_max.data('normalized-value')
576
+ //]);
577
+
578
+ var arr = [
579
+ func_normalize_val($input_min.val()),
580
+ func_normalize_val($input_max.val())
581
+ ];
582
+ //console.log("<func_invalidate_slider> " + arr);
583
+ $slider.setValue(arr);
584
+
585
+ };
586
+
587
+ var func_onblur_min = function () {
588
+ //console.log(this.value);
589
+ var v = func_normalize_val(this.value);
590
+ //$input_min.data('normalized-value',v);
591
+ func_invalidate_slider();
592
+ };
593
+
594
+ var func_onblur_max = function () {
595
+ //console.log(this.value);
596
+ var v = func_normalize_val(this.value);
597
+ //$input_max.data('normalized-value',v);
598
+ func_invalidate_slider();
599
+ };
600
+
601
+ $input_min.on('blur', func_onblur_min);
602
+ $input_max.on('blur', func_onblur_max);
436
603
 
437
- $li = $('li.scope.free');
438
- $a = $li.find(".table_tools_button");
439
- $a_span = $a.find('span');
440
- $a.html('Свободные <span class="count">' + $a_span.text() + '</span>');
604
+ };
441
605
 
442
- $li = $('li.scope.busy');
443
- $a = $li.find(".table_tools_button");
444
- $a_span = $a.find('span');
445
- $a.html('Занятые <span class="count">' + $a_span.text() + '</span>');
606
+ _fInit();
446
607
 
447
608
  };
448
609
 
@@ -30,14 +30,14 @@ var fPstatsIndex = function () {
30
30
 
31
31
  var $div_area_text_stats_sq,
32
32
  $ul_props_sq; // здесь выводим текстовые свойства занятости в метрах
33
-
34
-
35
- var $div_graph; // в этом div живет график занятости
36
- var $div_graph2, // в этом div живет график занятости
37
- $div_graph2canvas;
38
-
39
- var $div_graph3, // в этом div живет график занятости в метрах
40
- $div_graph3canvas;
33
+
34
+ // тут живут круговые графики
35
+ var $div_graph_radial;
36
+ var $div_graph_radial_sq;
37
+
38
+ // тут живут динамические графики
39
+ var $div_graph_dynamic,
40
+ $div_graph_dynamic_sq;
41
41
 
42
42
  var $ajax_div, $ajax_div2;
43
43
 
@@ -66,19 +66,22 @@ var fPstatsIndex = function () {
66
66
  $ul_props = $("<ul><li id='title'></li><li id='born_date'></li><li id='atype_filter'></li><li id='all_areas_count'></li><li id='free_areas_count'></li><li id='busy_areas_count'></li></ul>");
67
67
  $div_area_text_stats.append($ul_props);
68
68
 
69
+ $div_graph_radial = $("<div id='graph_radial'></div>").appendTo($div_index_adds);
70
+
69
71
  $div_busy_coef_sq = $("<div id='coef_sq'></div>").appendTo($div_index_adds);
70
- $p_busy_coef_sq = $("<p class='val'></p>").appendTo($div_busy_coef_sq);
71
- $p_busy_coef_mess_sq = $("<p class='title'><abbr class='abbr_busy_coef_sq' title='TITLE'>Занятость (в м.кв.)</abbr></p>").appendTo($div_busy_coef_sq);
72
- $p_busy_coef_comment_sq = $("<p class='comment'></p>").appendTo($div_busy_coef_sq);
72
+ $p_busy_coef_sq = $("<p class='val'></p>").appendTo($div_busy_coef_sq);
73
+ $p_busy_coef_mess_sq = $("<p class='title'><abbr class='abbr_busy_coef_sq' title='TITLE'>Занятость (в м.кв.)</abbr></p>").appendTo($div_busy_coef_sq);
74
+ $p_busy_coef_comment_sq = $("<p class='comment'></p>").appendTo($div_busy_coef_sq);
73
75
 
74
76
  $div_area_text_stats_sq = $("<div id='text_stats_sq'></div>").appendTo($div_index_adds);
75
- $ul_props_sq = $("<ul><li id='all_areas_count_sq'></li><li id='free_areas_count_sq'></li><li id='busy_areas_count_sq'></li></ul>");
76
- $div_area_text_stats_sq.append($ul_props_sq);
77
+ $ul_props_sq = $("<ul><li id='all_areas_count_sq'></li><li id='free_areas_count_sq'></li><li id='busy_areas_count_sq'></li></ul>");
78
+ $div_area_text_stats_sq.append($ul_props_sq);
77
79
 
78
- //$div_graph = $("<div id='graph'></div>").appendTo($div_index_adds);
79
- $div_graph2 = $("<div id='graph2'></div>").appendTo($div_index_adds);
80
+ $div_graph_radial_sq = $("<div id='graph_radial_sq'></div>").appendTo($div_index_adds);
80
81
 
81
- $div_graph3 = $("<div id='graph3'></div>").appendTo($div_index_adds);
82
+ $div_graph_dynamic = $("<div id='graph2'></div>").appendTo($div_index_adds);
83
+
84
+ $div_graph_dynamic_sq = $("<div id='graph3'></div>").appendTo($div_index_adds);
82
85
 
83
86
  $main_content.prepend($ajax_div2);
84
87
  $main_content.prepend($ajax_div);
@@ -88,6 +91,7 @@ var fPstatsIndex = function () {
88
91
  $main_content.css('opacity', '1.0');
89
92
  };
90
93
 
94
+ // запросим коэф-ты и данные для построения графиков
91
95
  var fRequestCoefs = function () {
92
96
 
93
97
  var atype_id = $select_atype.val();
@@ -144,12 +148,20 @@ var fPstatsIndex = function () {
144
148
 
145
149
  }
146
150
 
147
- if (data["graph"] != undefined || data["graph_dynamic"] != undefined) {
148
- fDrawChart(data["graph"], data["graph_dynamic"]);
151
+ if (data["graph_radial"] != undefined) {
152
+ fDrawChartRadial(data["graph_radial"]);
153
+ }
154
+
155
+ if (data["graph_dynamic"] != undefined) {
156
+ fDrawChartRadialSq(data["graph_dynamic"]);
149
157
  }
150
158
 
151
159
  if (data["graph_dynamic_sq"] != undefined) {
152
- fDrawChartSq(data["graph_dynamic_sq"]);
160
+ fDrawChartDynamicSq(data["graph_dynamic_sq"]);
161
+ }
162
+
163
+ if (data["graph_radial_sq"] != undefined) {
164
+ fDrawChartRadialSq(data["graph_radial_sq"]);
153
165
  }
154
166
 
155
167
  $h2_page_title.text(data["title"]);
@@ -165,6 +177,8 @@ var fPstatsIndex = function () {
165
177
  //fPreloaderShow();
166
178
  };
167
179
 
180
+ // запросим таблицы объектов
181
+ // результат придёт в виде js и таблицы вставятся сами
168
182
  var fRequestCharts = function () {
169
183
 
170
184
  var atype_id = $select_atype.val();
@@ -195,141 +209,67 @@ var fPstatsIndex = function () {
195
209
  fRequestCharts();
196
210
  };
197
211
 
198
- var fDrawChart = function (data_array_rows_radial, data_array_rows_dynamic) {
199
-
200
- google.charts.load('current', {'packages': ['corechart']});
201
- google.charts.setOnLoadCallback(drawChart);
202
-
203
- function drawChart() {
204
-
205
- var data, options, chart;
206
-
207
- if (data_array_rows_radial != undefined) {
208
- //data = google.visualization.arrayToDataTable(data_array_rows_radial);
209
- //
210
- //options = {
211
- // title: ''
212
- //};
212
+ // рисуем динамический график занятости
213
+ var fDrawChartDynamic = function (data_array_rows_dynamic) {
213
214
 
214
- //chart = new google.visualization.PieChart(document.getElementById('graph'));
215
- //
216
- //chart.draw(data, options);
217
- }
218
-
219
- if (data_array_rows_dynamic != undefined && false) {
220
- //data_array = [
221
- // ['Director (Year)', 'Rotten Tomatoes', 'IMDB'],
222
- // ['Alfred Hitchcock (1935)', 8.4, 7.9],
223
- // ['Ralph Thomas (1959)', 6.9, 6.5],
224
- // ['Don Sharp (1978)', 6.5, 6.4],
225
- // ['James Hawes (2008)', 4.4, 6.2]
226
- //]
227
-
228
- //var data = google.visualization.arrayToDataTable(data_array_rows_dynamic);
229
-
230
- data = new google.visualization.DataTable();
231
- data.addColumn('date', ''); // Implicit domain column.
232
- data.addColumn('number', ''); // Implicit data column.
233
- //data.addColumn({type:'number', role:'interval'});
234
- //data.addColumn({type:'number', role:'interval'});
235
- //data.addColumn('number', 'Expenses');
236
-
237
- var i, iob, yearValue, monthValue, dayValue;
238
- for (i = 0; i < data_array_rows_dynamic.length; i++) {
239
- iob = data_array_rows_dynamic[i];
240
- yearValue = iob[0].substr(0, 4);
241
- monthValue = iob[0].substr(5, 2) - 1;
242
- dayValue = iob[0].substr(8, 2);
243
- console.log(iob + " => " + yearValue + "/" + monthValue + "/" + dayValue); // + ": " + data_array_rows_dynamic[i][0]
244
- data_array_rows_dynamic[i][0] = new Date(parseInt(yearValue), parseInt(monthValue), parseInt(dayValue));
245
- }
246
-
247
- data.addRows(data_array_rows_dynamic);
248
-
249
- options = {
250
- title: 'Занятость',
251
- vAxis: {title: '', ticks: [0, 1]},
252
- ignoreBounds: true,
253
- isStacked: false
254
- };
255
-
256
- chart = new google.visualization.SteppedAreaChart(document.getElementById('graph2'));
257
-
258
- chart.draw(data, options);
259
- }
260
-
261
- if (data_array_rows_dynamic) {
262
-
263
-
264
- var dataPoints = [];
265
- //[
266
- // {x: new Date(2012,0), y: 8.3} ,
267
- // {x: new Date(2012,1), y: 8.3} ,
268
- // {x: new Date(2012,2), y: 8.2} ,
269
- // {x: new Date(2012,3), y: 8.1} ,
270
- // {x: new Date(2012,4), y: 8.2} ,
271
- // {x: new Date(2012,5), y: 8.2} ,
272
- // {x: new Date(2012,6), y: 8.2} ,
273
- // {x: new Date(2012,7), y: 8.1} ,
274
- // {x: new Date(2012,8), y: 7.8} ,
275
- // {x: new Date(2012,9), y: 7.9} ,
276
- // {x: new Date(2012,10), y:7.8} ,
277
- // {x: new Date(2012,11), y:7.8} ,
278
- // {x: new Date(2013,0), y:7.9} ,
279
- // {x: new Date(2013,1), y:7.7} ,
280
- // {x: new Date(2013,2), y:7.6} ,
281
- // {x: new Date(2013,3), y:7.5}
282
- //]
283
-
284
- var i, iob;
285
- for (i = 0; i < data_array_rows_dynamic.length; i ++) {
286
- iob = data_array_rows_dynamic[i];
287
- dataPoints.push({
288
- x: new Date(iob["year"], iob["month"], iob["day"]),
289
- y: iob["val"]
290
- })
291
- }
292
-
293
- var chart = new CanvasJS.Chart("graph2",
294
- {
295
- title:{
296
- text: "Занятость"
297
- },
298
- animationEnabled: true,
299
- axisY:{
300
- includeZero: false,
301
- interval: 10,
302
- valueFormatString: ""
303
- },
304
- data: [
305
- {
306
- type: "stepArea",
307
- toolTipContent: "{x}: {y}%",
308
- markerSize: 5,
309
- dataPoints: dataPoints
310
- }
311
-
312
- ]
313
- });
314
-
315
- $('#graph2').css('opacity','1.0').css('display','block');
316
- chart.render();
317
- }
215
+ var dataPoints = [];
216
+ //[
217
+ // {x: new Date(2012,0), y: 8.3} ,
218
+ // {x: new Date(2012,1), y: 8.3} ,
219
+ // {x: new Date(2012,2), y: 8.2} ,
220
+ // {x: new Date(2012,3), y: 8.1} ,
221
+ // {x: new Date(2012,4), y: 8.2} ,
222
+ // {x: new Date(2012,5), y: 8.2} ,
223
+ // {x: new Date(2012,6), y: 8.2} ,
224
+ // {x: new Date(2012,7), y: 8.1} ,
225
+ // {x: new Date(2012,8), y: 7.8} ,
226
+ // {x: new Date(2012,9), y: 7.9} ,
227
+ // {x: new Date(2012,10), y:7.8} ,
228
+ // {x: new Date(2012,11), y:7.8} ,
229
+ // {x: new Date(2013,0), y:7.9} ,
230
+ // {x: new Date(2013,1), y:7.7} ,
231
+ // {x: new Date(2013,2), y:7.6} ,
232
+ // {x: new Date(2013,3), y:7.5}
233
+ //]
318
234
 
235
+ var i, iob;
236
+ for (i = 0; i < data_array_rows_dynamic.length; i ++) {
237
+ iob = data_array_rows_dynamic[i];
238
+ dataPoints.push({
239
+ x: new Date(iob["year"], iob["month"], iob["day"]),
240
+ y: iob["val"]
241
+ })
319
242
  }
320
243
 
321
- if (data_array_rows_radial != undefined) {
322
- $('#graph').css('opacity', '1.0').css('display', 'block');
323
- }
244
+ var chart = new CanvasJS.Chart("graph2",
245
+ {
246
+ title:{
247
+ text: "Занятость"
248
+ },
249
+ animationEnabled: true,
250
+ axisY:{
251
+ includeZero: false,
252
+ interval: 10,
253
+ valueFormatString: ""
254
+ },
255
+ data: [
256
+ {
257
+ type: "stepArea",
258
+ toolTipContent: "{x}: {y}%",
259
+ markerSize: 5,
260
+ dataPoints: dataPoints
261
+ }
324
262
 
325
- if (data_array_rows_dynamic != undefined) {
326
- $('#graph2').css('opacity', '1.0').css('display', 'block');
327
- }
263
+ ]
264
+ });
328
265
 
266
+ $div_graph_dynamic.css('opacity','1.0').css('display','block');
267
+ chart.render();
268
+
329
269
  };
330
270
 
331
- var fDrawChartSq = function (data) {
332
-
271
+ // рисуем динамический график занятости в м.кв.
272
+ var fDrawChartDynamicSq = function (data) {
333
273
 
334
274
  var dataPoints = [];
335
275
  //[
@@ -382,11 +322,79 @@ var fPstatsIndex = function () {
382
322
  ]
383
323
  });
384
324
 
385
- $('#graph3').css('opacity','1.0').css('display','block');
325
+ $div_graph_dynamic_sq.css('opacity','1.0').css('display','block');
386
326
  chart.render();
387
327
 
388
328
  };
389
329
 
330
+ var fDrawChartRadial = function (data) {
331
+
332
+ // data:
333
+ // [
334
+ // { y: 6, legendText:"Свободно", label: "Площадей свободно" },
335
+ // { y: 4, legendText:"Занято", label: "Площадей занято" }
336
+ // ]
337
+
338
+ var chart = new CanvasJS.Chart("graph_radial",
339
+ {
340
+ animationEnabled: true,
341
+ legend:{
342
+ verticalAlign: "center",
343
+ horizontalAlign: "",
344
+ fontSize: 0,
345
+ fontFamily: "Open Sans"
346
+ },
347
+ theme: "theme",
348
+ data: [
349
+ {
350
+ type: "pie",
351
+ indexLabelFontFamily: "Open Sans",
352
+ indexLabelFontSize: 14,
353
+ indexLabel: "{label}: {y}",
354
+ startAngle:-10,
355
+ showInLegend: true,
356
+ toolTipContent:"{legendText} {y}",
357
+ dataPoints: data
358
+ }
359
+ ]
360
+ });
361
+ chart.render();
362
+ };
363
+
364
+ var fDrawChartRadialSq = function (data) {
365
+
366
+ // data:
367
+ // [
368
+ // { y: 6, legendText:"", label: "Метров свободно" },
369
+ // { y: 4, legendText:"", label: "Метров занято" }
370
+ // ]
371
+
372
+ var chart = new CanvasJS.Chart("graph_radial_sq",
373
+ {
374
+ animationEnabled: true,
375
+ legend:{
376
+ verticalAlign: "center",
377
+ horizontalAlign: "",
378
+ fontSize: 0,
379
+ fontFamily: "Open Sans"
380
+ },
381
+ theme: "theme",
382
+ data: [
383
+ {
384
+ type: "pie",
385
+ indexLabelFontFamily: "Open Sans",
386
+ indexLabelFontSize: 14,
387
+ indexLabel: "{label}: {y}",
388
+ startAngle:-10,
389
+ showInLegend: true,
390
+ toolTipContent:"{legendText} {y}",
391
+ dataPoints: data
392
+ }
393
+ ]
394
+ });
395
+ chart.render();
396
+ };
397
+
390
398
  fInit();
391
399
 
392
400
  };