c80_map_floors 0.1.0.5 → 0.1.0.6

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 6a621c6552044c23f3aba24c38c9714175f54813
4
- data.tar.gz: da3c3965d536d3501cb4e6863abff84622635321
3
+ metadata.gz: 665f2daf916815f816c9855be418fc89254b833d
4
+ data.tar.gz: c7130c9f88fef43e6c995203e407c03db2fd1156
5
5
  SHA512:
6
- metadata.gz: 34d71d53422cb9e531945e43f9f701355d569874f36fe57af8d4b403fb33acc9bc86526825ad2f28f023662ca598ef74c0f49977c60e654cb10e1130baf5b447
7
- data.tar.gz: ce9396846ff4c5ed651e0b4a19d68270b431af3d7f34fc90229cc33dc42c79c3c9db45cbbcc3ec7db783570a1333ae6dfebb25fcd5dc8a75dad78a7f59a0ff93
6
+ metadata.gz: 2819689d023aacb12978e264e04d6404c78d043b8bd13d9230a536df7639d66eb1381a42510e2f6495e2fc87d4b0b17110e4429ea5422b3a193dbf2f82092a35
7
+ data.tar.gz: bfa6ac82494fa655b1d7e27b2d0f5e388b70d5ce0fbdd685d5495db03f8134b594ccc78acbaa97f102e2339d60080058aab38a1fbbbf9d38f98d98276bc3b472
@@ -0,0 +1,122 @@
1
+ "use strict";
2
+
3
+ // при клике на эту кнопку произойдет:
4
+ // * показ прелоадера,
5
+ // * запрос за несвязанными этажами здания,
6
+ // * после получения ответа - показ модального окна _modal_window.html.erb куда будет подставлен %modal-title% и %modal-body%
7
+
8
+ function FloorLinkButton() {
9
+
10
+ var _map = null;
11
+ var _this = this;
12
+ _this.el = null;
13
+
14
+ // служебная невидимая ссылка, js-клик по которой покажет модальное окно
15
+ var $link_show_modal_window = null;
16
+
17
+ // настроить и показать модальное окно
18
+ var show_modal_window = function () {
19
+
20
+ //var $dialog = $('#modal_window');
21
+ //$dialog.find("h4").text($t.data("wtitle"));
22
+ //$dialog.find("#form_comment").css('display','block');
23
+ //$dialog.find("input#comment_part_id").val(partid);
24
+ //$dialog.find("input#comment_author").val(author);
25
+
26
+ // фиксируем участников
27
+ var $m = $('#modal_window');
28
+ var $cc = $m.find('.modal-body');
29
+
30
+ // устанавливаем заголовок окна
31
+ $m.find('.modal-title').text('Укажите Этаж, соответствующий этой картинке.');
32
+
33
+ // инициализируем bootstrap-selectpicker
34
+ setTimeout(function () {
35
+ $("select#unlinked_floors").selectpicker({size: 50, tickIcon: 'hidden'});
36
+ }, 10);
37
+
38
+ // клик по кнопке "применить" вызовет _map.link_floor()
39
+ setTimeout(function () {
40
+ //console.log($cc.find("button"));
41
+ $cc.find("button").on('click', function () {
42
+ if ($(this).attr('id') == "submit_floor_link") {
43
+ _map.link_floor();
44
+ }
45
+ });
46
+ }, 1000);
47
+
48
+ // нажмём служебную ссылку, которая откроет модальное окно
49
+ $link_show_modal_window.click();
50
+
51
+ };
52
+
53
+ /** функция, запрашивающая с сервера Этажи без полигонов (указанного Здания).
54
+ *
55
+ * @param bid - ID Здания, которому должны принадлежать Этажи без полигонов
56
+ */
57
+ var fetch_free_floors = function (bid) {
58
+ console.log('<ButtonFloorLink.fetch_free_floors> Запросим Этажи без полигонов для bid:' + bid);
59
+
60
+ $.ajax({
61
+ url:'/ajax/fetch_unlinked_floors',
62
+ type:'POST',
63
+ data: {
64
+ building_id:bid
65
+ },
66
+ dataType:'script'
67
+ }).done(fetch_free_floors_done);
68
+ };
69
+
70
+ // при успешном ответе - скроем прелоадер, покажем модальное окно
71
+ //noinspection JSUnusedLocalSymbols
72
+ var fetch_free_floors_done = function (data, result) {
73
+ _map.save_preloader_klass.hide();
74
+ show_modal_window();
75
+ };
76
+
77
+ // при клике по кнопке "назначить Этаж" - покажем прелоадер, запросим данные с сервера
78
+ this.onClick = function (e) {
79
+ if (_this.el.hasClass('disabled')) return;
80
+ e.preventDefault();
81
+
82
+ //console.log("<FloorLinkButton.click>");
83
+
84
+ // ID Здания, которому должны принадлежать Этажи без полигонов
85
+ var bid = _map.current_building.get_bid();
86
+
87
+ if (bid == undefined || bid == null) {
88
+ alert('[ERROR] Перед тем, как назначать Этаж, необходимо назначить Здание полигону.');
89
+ } else {
90
+ _map.save_preloader_klass.show();
91
+ fetch_free_floors(bid);
92
+ }
93
+ };
94
+
95
+ // инициализация
96
+ this.init = function (button_css_selector, link_to_map) {
97
+
98
+ // фиксируем элементы, настраиваем
99
+ _map = link_to_map;
100
+ _this.el = $(button_css_selector);
101
+ _this.el.on('click', _this.onClick);
102
+
103
+ // изначально кнопка "назначить Этаж" скрыта
104
+ _this.hide();
105
+
106
+ // найдем ссылку, клик по которой покажет окно [_modal_window.html.erb]
107
+ $link_show_modal_window = $('.show_modal_window');
108
+
109
+ };
110
+
111
+ // спрятать кнопку "назначить этаж"
112
+ this.hide = function () {
113
+ _this.el.css('display','none');
114
+ };
115
+
116
+ // показать кнопку "назначить этаж"
117
+ this.show = function () {
118
+ //console.log("<FloorLinkButton.show>");
119
+ _this.el.css('display','block');
120
+ };
121
+
122
+ }
@@ -1,6 +1,6 @@
1
1
  #= require history_jquery
2
2
  #= require bootstrap/transition
3
- #= require bootstrap/modal
3
+ # require bootstrap/modal # Bootstrap Modal immediately disappearing: http://stackoverflow.com/a/13670437 # т.к. 101км это первый проект и там уже много нахуеверчено, в том числе: bootstrap.min.js лежит в папке lib/, то эту строку комментируем (только для 101km)
4
4
  #= require bootstrap/tooltip
5
5
  #= require bootstrap/alert
6
6
  #= require bootstrap/dropdown
@@ -25,12 +25,37 @@ function Area() {
25
25
  // нарисован и ждёт сохранения на сервере
26
26
  //_this.is_new = false;
27
27
 
28
- _this.init = function (options, parent_building_hash, pself) {
29
- console.log("<Area.init>");
30
- //console.log(parent_building_hash); // => see building.js init comment
28
+ _this.init = function (options, parent_floor_json, pself) {
29
+
30
+ console.log("<Area.init> options: ");
31
+ console.log(options);
32
+
33
+ // нарисовали полигон площади, находясь на этаже:
34
+ // => Object { coords: Array[8] }
35
+
36
+ // полигон площади уже был нарисован, просто вошли на этаж:
37
+ // => Object { id: 2, tag: "test_area", floor_id: 2, class_name: "C80MapFloors::Area", coords: "10,12,110,112", data: null }
38
+
39
+ console.log("<Area.init> parent_floor_json: ");
40
+ console.log(parent_floor_json);
41
+
42
+ /*
43
+ Object {
44
+ ord: 1,
45
+ id: 2,
46
+ title: "Первый этаж",
47
+ tag: "21.1",
48
+ class_name: "C80MapFloors::Floor",
49
+ map_building_id: 7,
50
+ img_bg: Object,
51
+ img_overlay: Object,
52
+ img_bg_width: 387,
53
+ img_bg_height: 225,
54
+ 3 more…
55
+ }
56
+ */
31
57
 
32
- //console.log(options);
33
- /*{
58
+ /*{ // так было в c80_map
34
59
  "id": 1,
35
60
  "object_type": "area",
36
61
  "area_hash": {
@@ -67,13 +92,11 @@ function Area() {
67
92
  _this._options.coords[i] = Number(_this._options.coords[i]);
68
93
  }
69
94
 
70
- _this._options.parent_building_hash = parent_building_hash;
71
- //console.log(_this._options.parent_building_hash);
72
-
95
+ _this._options["parent_floor_json"] = parent_floor_json;
73
96
 
74
97
  _this._polygon = Polygon.createFromSaved(options, false, _map);
75
98
  _this._polygon.area = _this;
76
- _this._polygon.parent_building_hash = parent_building_hash;
99
+ _this._polygon["parent_floor_json"] = parent_floor_json;
77
100
  _this._polygon = $(_this._polygon.polygon);
78
101
 
79
102
  // подпись над полигоном показываем только админам
@@ -102,7 +125,7 @@ function Area() {
102
125
 
103
126
  // optimisation
104
127
  var timeoutEnter = function () {
105
- _map.showAreaInfo(_this._options.area_hash, _this._options.parent_building_hash);
128
+ _map.showAreaInfo(_this._options["data"], _this._options["parent_floor_json"]);
106
129
  _map.setMode('view_area');
107
130
  };
108
131
 
@@ -245,7 +268,7 @@ function Area() {
245
268
  return {
246
269
  id: _this._options["id"],
247
270
  coords: _this._options["coords"],
248
- parent_building_id: _this._options.parent_building_hash["id"]
271
+ parent_floor_id: _this._options["parent_floor_json"]["id"]
249
272
  }
250
273
  }
251
274
  }
@@ -24,6 +24,9 @@ function Building() {
24
24
  var _$image_bg = null;
25
25
  var _image_overlay = null;
26
26
 
27
+ // если вошли в какой-то этаж - эта переменная будет хранить ссылку на объект с данными полигона Этажа из locations.json
28
+ var _json_current_floor = null;
29
+
27
30
  var _zoomToMe = function () {
28
31
 
29
32
  /* рассчитаем масштаб, при котором можно вписать прямоугольник дома в прямоугольник рабочей области */
@@ -49,7 +52,7 @@ function Building() {
49
52
  _map.moveTo(x, y, scale, 400, 'easeInOutCubic');
50
53
  };
51
54
 
52
- // the_floor - это as_json модели C80MapFloors::Floor
55
+ // map_floor_as_json - это as_json модели C80MapFloors::Floor
53
56
  /*{
54
57
  "map_building_id": 7,
55
58
  "img_bg": {
@@ -74,17 +77,27 @@ function Building() {
74
77
  "coords": "10,12,110,112",
75
78
  "area_representator_id": null,
76
79
  "class_name": "C80MapFloors::Area"
80
+ },
81
+ "data": {
82
+ "id": 1,
83
+ "title": "test building",
84
+ "square": null,
85
+ "square_free": null,
86
+ "desc": null,
87
+ "floor_height": "2.3м - 4.2м",
88
+ "price_string": "От 300 руб/м.кв.",
89
+ "communications": "Интернет, Вода, Свет"
77
90
  }
78
91
  ]
79
92
  }*/
80
- var _draw_floor = function (the_floor) {
93
+ var _draw_floor = function (map_floor_as_json) {
81
94
  //console.log('<Building._draw_floor>');
82
95
 
83
96
  // это тот самый код, который остался без изменений с версии c80_map (прошлой версии)
84
- if (the_floor["img_overlay"]["url"] != "null") {
85
- //_image_overlay = _map.draw_child_bg_image(the_floor["img_overlay"]["url"], 'building', true);
97
+ if (map_floor_as_json["img_overlay"]["url"] != "null") {
98
+ //_image_overlay = _map.draw_child_bg_image(map_floor_as_json["img_overlay"]["url"], 'building', true);
86
99
  }
87
- if (the_floor["img_bg"]["url"] != "null") {
100
+ if (map_floor_as_json["img_bg"]["url"] != "null") {
88
101
 
89
102
  // NOTE::картинку этажа рисуем не по bounding box здания, а по значениям из базы
90
103
 
@@ -96,8 +109,8 @@ function Building() {
96
109
  // и сложим их с корректирующими координатами coords этажа
97
110
  var xx2 = 0;
98
111
  var yy2 = 0;
99
- if (the_floor["coords"].length) {
100
- var tmp2 = the_floor["coords"].split(',');
112
+ if (map_floor_as_json["coords"].length) {
113
+ var tmp2 = map_floor_as_json["coords"].split(',');
101
114
  xx2 = parseInt(tmp2[0]);
102
115
  yy2 = parseInt(tmp2[1]);
103
116
  }
@@ -106,19 +119,19 @@ function Building() {
106
119
  _map.mark_all_map_object_images_for_clean();
107
120
 
108
121
  // просим карту нарисовать картинку с данными характеристиками
109
- _$image_bg = _map.draw_map_object_image_bg(the_floor["img_bg"]["url"], {
122
+ _$image_bg = _map.draw_map_object_image_bg(map_floor_as_json["img_bg"]["url"], {
110
123
  x: xx + xx2,
111
124
  y: yy + yy2,
112
- width: the_floor["img_bg_width"],
113
- height: the_floor["img_bg_height"]
125
+ width: map_floor_as_json["img_bg_width"],
126
+ height: map_floor_as_json["img_bg_height"]
114
127
  }/*, 'building'*/);
115
128
 
116
129
  } else {
117
130
  alert('[ERROR] У этажа нет картинки.');
118
131
  }
119
132
 
120
- // просим карту нарисовать площади
121
- _map.draw_childs(the_floor["areas"]/*, _options["rent_building_hash"]*/);
133
+ // просим карту нарисовать полигоны площадей
134
+ _map.draw_childs(map_floor_as_json["areas"], map_floor_as_json);
122
135
 
123
136
  };
124
137
 
@@ -156,6 +169,8 @@ function Building() {
156
169
  if (typeof _this.options["coords"] == 'string') { /* когда нажимаем ENTER в редакторе и завершаем рисование полигона - приходит массив */
157
170
  _this.options["coords"] = _this.options["coords"].split(',');
158
171
  }
172
+
173
+ //#-> [iddqd] ВАЖНО: это id полигона здания
159
174
  _this.id = options["id"];
160
175
 
161
176
  // [NOTE::56dfaw1: парсим координаты объекта на карте, поданные в виде строки]
@@ -164,6 +179,7 @@ function Building() {
164
179
  }
165
180
 
166
181
  // [4ddl5df]: в случае, если это только что отрисованное Здание - генерим временный случайный id
182
+ //#-> [iddqd] А как же тогда _this.id ? Он будет undefined? Страшно ли это?
167
183
  if (_this.options["id"] == undefined) {
168
184
  _this.options["id"] = Math.ceil((Math.random()*100000));
169
185
  }
@@ -230,11 +246,18 @@ function Building() {
230
246
  * @param floor_id
231
247
  */
232
248
  _this.enterFloor = function (floor_id) {
233
- console.log('<Building.enterFloor> floor_id: ' + floor_id);
249
+
250
+ // при входе в этаж - удаляем все кликабельные полигоны с карты
251
+ _map.svgRemoveAllNodes();
234
252
 
235
253
  var flr = _map_floors_hash[floor_id];
236
254
  if (flr != undefined) {
255
+ // рисуем картинку этажа (там же будет заказ на отрисовку полигонов площадей)
237
256
  _draw_floor(flr);
257
+ // фиксируем текущий этаж
258
+ _json_current_floor = flr;
259
+ console.log('<Building.enterFloor> Вошли на этаж floor_id: ' + floor_id + "; данные полигона этажа: ");
260
+ console.log(_json_current_floor);
238
261
  } else {
239
262
  alert('[Building.EnterFloor] error: Нет данных об этаже [карты] floor_id='+floor_id+'.');
240
263
  }
@@ -250,6 +273,15 @@ function Building() {
250
273
  _$image_bg = null;
251
274
  _image_overlay = null;
252
275
  //_zoomToMe();
276
+
277
+ // чистим переменную "текущий этаж"
278
+ _json_current_floor = null;
279
+
280
+ };
281
+
282
+ // выдать данные текущего полигона этажа
283
+ _this.json_current_floor = function () {
284
+ return _json_current_floor;
253
285
  };
254
286
 
255
287
  // выдать центр дома в логических координатах
@@ -317,8 +349,20 @@ function Building() {
317
349
 
318
350
  _this.to_json = function () {
319
351
  return {
320
- id: _this.options["id"],
352
+ id: _this.options["id"], //#-> [iddqd] А здесь не используется _this.id (т.е. в случае, когда полигон был только что нарисован, to_json вернёт актуальное, правильное значение
321
353
  coords: _this.options["coords"]
322
354
  }
323
- }
355
+ };
356
+
357
+ // выдать id привязанного к полигону Здания
358
+ this.get_bid = function () {
359
+ var result = null;
360
+ if (_options != null) {
361
+ if (_options["data"] != null && _options["data"] != undefined) {
362
+ result = _options["data"]["id"];
363
+ }
364
+ }
365
+ return result;
366
+ };
367
+
324
368
  }
@@ -81,6 +81,8 @@ var InitMap = function (params) {
81
81
  self.is_draw = false;
82
82
  self.save_button_klass = null;
83
83
  self.area_link_button_klass = null;
84
+ self.building_link_button_klass = null;
85
+ self.floor_link_button_klass = null;
84
86
  self.drawn_areas = []; // если имеются нарисованные но несохранённые Площади - они хранятся тут
85
87
  self.drawn_buildings = []; // если имеются нарисованные но несохранённые Здания - они хранятся тут
86
88
  self.save_preloader_klass = null;
@@ -261,6 +263,10 @@ var InitMap = function (params) {
261
263
  self.area_link_button_klass = new AreaLinkButton();
262
264
  self.area_link_button_klass.init('.mapplic-area-link-button', self);
263
265
 
266
+ // при клике на эту кнопку произойдет показ модального окна "связать полигон этажа с Этажом"
267
+ self.floor_link_button_klass = new FloorLinkButton();
268
+ self.floor_link_button_klass.init('.mapplic-floor-link-button', self);
269
+
264
270
  // при клике на эту кнопку произойдет показ модального окна, в котором можно будет указать здание, соответствующее полигону
265
271
  self.building_link_button_klass = new BuildingLinkButton();
266
272
  self.building_link_button_klass.init('.mapplic-building-link-button', self);
@@ -281,7 +287,7 @@ var InitMap = function (params) {
281
287
  // инициализиуем класс, занимающийся отображением данных о здании\этаже\площади
282
288
  self.building_info_klass = new BuildingInfo({
283
289
  onFloorTabChange: function (floor_id) {
284
- self.current_building.enterFloor(floor_id);
290
+ self.current_building.enterFloor(floor_id); //#-> только с помощью клика по табам можно войти на Этаж
285
291
  }
286
292
  });
287
293
 
@@ -388,7 +394,8 @@ var InitMap = function (params) {
388
394
 
389
395
  function onSvgMousedown(e) {
390
396
 
391
- if (self.mode === 'editing' || self.mode === "edit_building" || self.mode === 'edit_area') {
397
+ //#-> Убрал 'edit_building', т.к. мы не можем ничего нарисовать в этом режиме - картинки этажей добавляются через админку
398
+ if (self.mode === 'editing' || self.mode === 'edit_area' || self.mode === 'edit_floor') { // || self.mode === "edit_building"
392
399
  if (e.target.parentNode.tagName === 'g') {
393
400
  console.log("<onSvgMousedown> e = ");
394
401
  //console.log(e.pageX);
@@ -579,9 +586,9 @@ var InitMap = function (params) {
579
586
  }
580
587
  }
581
588
 
582
- /* если находимся в режиме просмотра здания - входим в площадь */
589
+ /* если находимся в режиме просмотра здания - входим в площадь (так было в c80_map) */
583
590
  /* если находится в режиме просмотра площади - переключаемся на другую площадь */
584
- else if (self.mode == 'view_building' || self.mode == 'view_area') {
591
+ else if (self.mode == 'view_floor' || self.mode == 'view_area') { // self.mode == 'view_building' (так было в c80_map)
585
592
 
586
593
  //console.log($(event.target).parent());
587
594
  // => g, который живёт в #svg_overlay, или, другими словами,
@@ -602,6 +609,8 @@ var InitMap = function (params) {
602
609
  console.log("<mouseup> Входим в площадь. self.last_clicked_g = ");
603
610
  console.log(self.last_clicked_g);
604
611
  area.enter();
612
+ } else {
613
+ console.log('<mouseup> [ERROR] у полигона нет объекта Area.js класса.');
605
614
  }
606
615
 
607
616
  }
@@ -702,7 +711,7 @@ var InitMap = function (params) {
702
711
  var style = "display:block;position:absolute;background-color:#00ff00;opacity:0.4;";
703
712
  var style_x = style + "width:1px;height:800px;top:0;left:{X}px;";
704
713
  var style_y = style + "width:3000px;height:1px;left:0;top:{Y}px;";
705
- var style_dot = style + 'width:4px;height:4px;left:{X}px;top:{Y}px;';
714
+ //var style_dot = style + 'width:4px;height:4px;left:{X}px;top:{Y}px;';
706
715
 
707
716
  var to_draw = [
708
717
  {x: self.X10},
@@ -710,11 +719,11 @@ var InitMap = function (params) {
710
719
  {y: self.Y10},
711
720
  {y: self.Y20},
712
721
  {x: self.CX},
713
- {y: self.CY},
722
+ {y: self.CY}
714
723
  ];
715
724
 
716
725
 
717
- var i, istyle, xx, yy, ip;
726
+ var i, istyle, ip;
718
727
  for (i = 0; i < to_draw.length; i++) {
719
728
  ip = to_draw[i];
720
729
 
@@ -787,7 +796,7 @@ var InitMap = function (params) {
787
796
  * можно было отобразить характеристики Здания родителя C80Rent:Building.
788
797
  */
789
798
  self.draw_childs = function (childs, parent_hash) {
790
- //console.log("<Map.draw_childs>");
799
+ console.log("<Map.draw_childs>");
791
800
 
792
801
  //var ip;
793
802
  var iobj;
@@ -941,7 +950,7 @@ var InitMap = function (params) {
941
950
  };
942
951
 
943
952
  self.onDrawStop = function (e) {
944
- console.log("<Map.onDrawStop>");
953
+ console.log("<Map.onDrawStop> Закончили рисовать.");
945
954
 
946
955
  if (e != undefined) {
947
956
  if (e.type == 'keydown' && e.keyCode == 13) {
@@ -959,22 +968,31 @@ var InitMap = function (params) {
959
968
  _n_f.setCoords(_n_f.params).deselect();
960
969
  delete(_n_f.polyline);
961
970
 
962
- // в зависимости от предыдущего состояния, создадим либо Здание, либо Площадь
963
- if (self.prev_mode == "edit_building") {
971
+ //#-> создадим либо полигон Здания, либо полигон Площади
972
+
973
+ if (self.prev_mode == "edit_floor") {
974
+ console.log("<Map.onDrawStop> Создаём Area.");
975
+
964
976
  var bo = self.current_building.options;
977
+ var fo = self.current_building.json_current_floor();
965
978
  var a = new Area();
966
- a.init({ coords:_n_f.params }, bo, self);
979
+ a.init({ coords:_n_f.params }, fo, self);
967
980
  //a.is_new = true;
968
981
  _n_f.remove(); // удаляем нарисованный полигон, т.к. его уже заменили полигоном Area
969
982
  self.registerJustDrownArea(a);
970
983
  }
971
984
  else if (self.prev_mode == 'editing') {
985
+ console.log("<Map.onDrawStop> Создаём Building.");
972
986
  var b = new Building();
973
987
  b.init({ coords:_n_f.params }, self);
974
988
  //b.is_new = true;
975
989
  _n_f.remove(); // удаляем нарисованный полигон, т.к. его уже заменили полигоном Building
976
990
  self.registerJustDrownBuilding(b);
977
991
  }
992
+ //else if (self.prev_mode == 'edit_building') {
993
+ // todo: new Floor (?)
994
+ //#-> нет, мы не можем нарисовать полигонЭтажа. Этаж - это картинка, которая просто видна при входе в Этаж, создаётся через админку
995
+ //}
978
996
 
979
997
  self.removeAllEvents();
980
998
  self.drawing_poligon = null;
@@ -1006,8 +1024,7 @@ var InitMap = function (params) {
1006
1024
  * Зная ширину контейнера и контента,
1007
1025
  * используя указанные параметры,
1008
1026
  * рассчитать нормальный X
1009
- * @param x
1010
- * @param scale
1027
+ * @param params
1011
1028
  * @returns {*}
1012
1029
  */
1013
1030
  self.normalizeX = function (params) {
@@ -1030,8 +1047,7 @@ var InitMap = function (params) {
1030
1047
  * Зная высоту контейнера и контента,
1031
1048
  * используя указанные параметры,
1032
1049
  * рассчитать нормальный Y
1033
- * @param y
1034
- * @param scale
1050
+ * @param params
1035
1051
  * @returns {*}
1036
1052
  */
1037
1053
  self.normalizeY = function (params) {
@@ -1086,7 +1102,7 @@ var InitMap = function (params) {
1086
1102
  * - по регулярке извлекать left и top
1087
1103
  * - трансформировать эти значения
1088
1104
  * - изменить атрибут viewBox обоих svg слоёв
1089
- *
1105
+ *
1090
1106
  * Изначально была задумка каждый шаг анимации вызывать эту функцию.
1091
1107
  * Но затем во время оптимизации слои с svg стали видны только тогда,
1092
1108
  * когда анимация не проходит. По-этому этот код был поставлен на setTimeout
@@ -1143,7 +1159,7 @@ var InitMap = function (params) {
1143
1159
  __afterMovingCorrectSvgLayersPositions();
1144
1160
 
1145
1161
  };
1146
-
1162
+
1147
1163
  var __moveToTimeout = function () {
1148
1164
  if (self.mode === 'edit_area'|| self.mode === 'view_area') {
1149
1165
  $("#masked").removeClass('hiddn');
@@ -1290,9 +1306,10 @@ var InitMap = function (params) {
1290
1306
  };
1291
1307
 
1292
1308
  // показать инфо о просматриваемой площади
1293
- self.showAreaInfo = function (area_hash, parent_building_hash) {
1309
+ self.showAreaInfo = function (area_json, parent_floor_json) {
1294
1310
  //console.log(area_hash);
1295
1311
 
1312
+ // так было в c80_map
1296
1313
  //"area_hash": {
1297
1314
  // "id": 2,
1298
1315
  // "title": "Площадь 2.12",
@@ -1306,6 +1323,7 @@ var InitMap = function (params) {
1306
1323
  // "price": "от 155 руб/кв.м в месяц"
1307
1324
  // }
1308
1325
 
1326
+ // так было в c80_map
1309
1327
  //"rent_building_hash": {
1310
1328
  // "id": 2,
1311
1329
  // "title": "Здание 2",
@@ -1319,20 +1337,24 @@ var InitMap = function (params) {
1319
1337
  // "price": "от 155 руб/кв.м в месяц"
1320
1338
  // }
1321
1339
 
1322
- $building_info.find("h2").html("</span>" + area_hash["title"] + "<span style='color:#D0B2B2;'> / " + parent_building_hash["title"]);
1340
+ if (area_json == null || area_json == undefined) {
1341
+ alert('[ERROR] У полигона нет привязки к Площади. Привяжите полигон площади.');
1342
+ } else {
1343
+ $building_info.find("h2").html("</span>" + area_json["title"] + "<span style='color:#D0B2B2;'> / " + parent_floor_json["title"]);
1323
1344
 
1324
- var v;
1325
- for (var p in area_hash["props"]) {
1326
- v = area_hash["props"][p];
1327
- $building_info.find("#" + p).find('span').text(v);
1328
- }
1345
+ var v;
1346
+ for (var p in area_json["props"]) {
1347
+ v = area_json["props"][p];
1348
+ $building_info.find("#" + p).find('span').text(v);
1349
+ }
1329
1350
 
1330
- $building_info.find("#square_free").css('height', '0');
1351
+ $building_info.find("#square_free").css('height', '0');
1331
1352
 
1332
- // заполняем данными ссылку 'Оставить заявку'
1333
- var $a_make_order = $building_info.find('.c80_order_invoking_btn');
1334
- $a_make_order.data('comment-text', 'Здравствуйте, оставляю заявку на площадь: ' + area_hash["title"]);
1335
- $a_make_order.data('subj-id', area_hash["id"]);
1353
+ // заполняем данными ссылку 'Оставить заявку'
1354
+ var $a_make_order = $building_info.find('.c80_order_invoking_btn');
1355
+ $a_make_order.data('comment-text', 'Здравствуйте, оставляю заявку на площадь: ' + area_json["title"]);
1356
+ $a_make_order.data('subj-id', area_json["id"]);
1357
+ }
1336
1358
 
1337
1359
  };
1338
1360
 
@@ -1382,6 +1404,11 @@ var InitMap = function (params) {
1382
1404
 
1383
1405
  };
1384
1406
 
1407
+ // взять C80MapFloors::current_floor и назначить ему sfloor.id выбранный в окне _modal_window.html.erb
1408
+ self.link_floor = function () {
1409
+ console.log('<link_floor> Связать Этаж sfloor.id=' + sfloor.id + ' с полигоном current_floor=' + current_floor + '.');
1410
+ };
1411
+
1385
1412
  // взять C80MapFloors::current_building и назначить ему Rent::building.id,
1386
1413
  // выбранный в окне _modal_window.html.erb
1387
1414
  self.link_building = function () {
@@ -1394,7 +1421,7 @@ var InitMap = function (params) {
1394
1421
 
1395
1422
  // извлекаем значения
1396
1423
  var rent_building_id = $s.val();
1397
- var map_building_id = self.current_building.id;
1424
+ var map_building_id = self.current_building.id; //#-> [iddqd]
1398
1425
  //console.log("<Map.link_area> rent_building_id = " + rent_building_id + "; map_building_id = " + map_building_id);
1399
1426
 
1400
1427
  // нажимаем кнопку "закрыть"
@@ -78,6 +78,8 @@ function StateController() {
78
78
  case "editing":
79
79
  //<editor-fold desc="...">
80
80
 
81
+ console.log("<StateController.setMode> <ожидается рисование полигонов Зданий>.");
82
+
81
83
  // спрячем надписи "цена за метр" и адрес с телефоном
82
84
  _this.left_side.css("top", -300);
83
85
  _this.right_side.css("top", -300);
@@ -345,8 +347,8 @@ function StateController() {
345
347
  // прячем masked слой - а там что (запомятовал)?
346
348
  _this.masked.addClass('hiddn');
347
349
 
348
- // скроем кнопку "связать здание с полигоном"
349
- _map.building_link_button_klass.hide();
350
+ // скроем кнопку "связать этаж с полигоном" (которая видна при выходе из режима редактирования этажа)
351
+ _map.floor_link_button_klass.hide();
350
352
 
351
353
  // прячем кнопку "отправить заявку на аренду площади"
352
354
  _this.area_order_button.css('display', 'none');
@@ -376,11 +378,13 @@ function StateController() {
376
378
  case 'edit_floor':
377
379
  //<editor-fold desc="...">
378
380
 
381
+ console.log("<StateController.setMode> <Ожидается рисование полигонов Площадей>.");
382
+
379
383
  // спрячем кнопку "обратно на карту"
380
384
  _map.back_to_map_button_klass.hide();
381
385
 
382
- // покажем кнопку "связать здание с полигоном"
383
- //_map.building_link_button_klass.show();
386
+ // покажем кнопку "связать Этаж с полигоном"
387
+ _map.floor_link_button_klass.show();
384
388
 
385
389
  // т.к. этот слой используется испключительно в помощь при рисовании обводки площадей и перехватывает клики при dnd, то тут он нам не нужен
386
390
  _this.svg_overlay.css('display', 'none');
@@ -442,7 +442,7 @@
442
442
  font-size: 14px;
443
443
  }
444
444
 
445
- &.editing, &.edit_area, &.edit_building {
445
+ &.editing, &.edit_area, &.edit_floor {
446
446
  background-color: #a10000;
447
447
  }
448
448
  }
@@ -499,7 +499,7 @@
499
499
 
500
500
  }
501
501
 
502
- &.mapplic-area-link-button, &.mapplic-building-link-button {
502
+ &.mapplic-area-link-button, &.mapplic-building-link-button, &.mapplic-floor-link-button {
503
503
  border-radius: 0 0 1px 1px;
504
504
  border-top: none;
505
505
  background-color: #a10000;
@@ -1346,7 +1346,7 @@ div#map_wrapper {
1346
1346
 
1347
1347
  &.editing,
1348
1348
  &.edit_area,
1349
- &.edit_building {
1349
+ &.edit_floor {
1350
1350
  #svg {
1351
1351
 
1352
1352
  rect.helper {
@@ -1,5 +1,10 @@
1
1
  div#modal_window {
2
2
 
3
+ h4.modal-title {
4
+ font-size: 15px;
5
+ color: #161616;
6
+ }
7
+
3
8
  .modal-body {
4
9
  font-size: 12px;
5
10
  }
@@ -12,6 +12,15 @@ module C80MapFloors
12
12
 
13
13
  end
14
14
 
15
+ # js-кнопка "связать полигон с этажом" запрашивает список несвязанных с полигонами Этажи (указанного здания)
16
+ def fetch_unlinked_floors
17
+ Rails.logger.debug "[TRACE] <AjaxController.fetch_unlinked_floors> params = #{params}"
18
+ # [TRACE] <AjaxController.fetch_unlinked_floors> params = {"building_id"=>"1", "controller"=>"c80_map_floors/ajax", "action"=>"fetch_unlinked_floors"}
19
+
20
+ @unlinked_floors = Sfloor.unlinked_floors(params[:building_id]) # Sfloor - Этаж из host app, который еще и floor_representator
21
+
22
+ end
23
+
15
24
  def fetch_unlinked_buildings
16
25
  # Rails.logger.debug "<AjaxController.fetch_unlinked_buildings> params = #{params}"
17
26
 
@@ -5,7 +5,6 @@ module C80MapFloors
5
5
  # Rails.logger.debug "<MapAjaxController.save_map_data> params = #{params}"
6
6
 
7
7
  #{ "buildings"=>{"0"=>{"coords"=>["2496.5894495412845",...]}} }
8
- #{ "areas"=>{"0"=>{"coords"=>["2496.5894495412845",...]}} }
9
8
 
10
9
  # ЗДАНИЯ
11
10
  # в случае успеха - вернём id созданного здания,
@@ -14,6 +13,18 @@ module C80MapFloors
14
13
  # завершаем всё обновленным locations.json, который Map возьмёт
15
14
  # и положит в data
16
15
 
16
+ # ПЛОЩАДИ
17
+ #
18
+ # как было:
19
+ # {"areas"=>{"0"=>{"id"=>"61319", "coords"=>[..], "parent_building_id"=>"2"}}}
20
+ # как стало:
21
+ # {"areas"=>{"0"=>{"id"=>"61319", "coords"=>[..], "parent_floor_id"=>"2"}}}
22
+ # ...
23
+ # INSERT INTO `c80_map_floors_areas` (`coords`, `floor_id`, `created_at`, `updated_at`) VALUES ('...', 2, '2016-12-11 05:48:33.629883', '2016-12-11 05:48:33.629883')
24
+ #
25
+ #
26
+
27
+
17
28
  result = {
18
29
  areas: [],
19
30
  buildings: [],
@@ -37,7 +48,7 @@ module C80MapFloors
37
48
  end
38
49
  end
39
50
 
40
- # затем создадим области
51
+ # затем создадим площади
41
52
  if params[:areas].present?
42
53
  params[:areas].each_key do |key|
43
54
  new_area_options = params[:areas][key]
@@ -45,7 +56,7 @@ module C80MapFloors
45
56
  # puts "<MapAjaxController.save_map_data> new_area_options[:coords] = #{new_area_options[:coords]}"
46
57
  a = C80MapFloors::Area.new({
47
58
  coords: new_area_options[:coords].join(','),
48
- map_building_id: new_area_options[:parent_building_id]
59
+ floor_id: new_area_options[:parent_floor_id]
49
60
  })
50
61
 
51
62
  if a.valid?
@@ -22,13 +22,15 @@ module C80MapFloors
22
22
  has_one :floor, :as => :map_floor_representator, :class_name => 'C80MapFloors::Floor', :dependent => :nullify
23
23
  # after_save :update_json # NOTE:: возможно, временно
24
24
 
25
- def self.unlinked_floors
25
+ # выдать список несвязанных с полигонами Этажей (указанного здания building_id)
26
+ def self.unlinked_floors(building_id)
26
27
  res = []
27
28
  self.all.each do |sfloor|
28
29
  unless sfloor.floor.present?
29
30
  res << sfloor
30
31
  end
31
32
  end
33
+ Rails.logger.debug "[TRACE] <floor_representator.unlinked_floors> Кол-во несвязанных Этажей: #{res.count}."
32
34
  res
33
35
  end
34
36
 
@@ -0,0 +1,7 @@
1
+ var $m = $('#modal_window');
2
+ var $cc = $m.find('.modal-body');
3
+ var html_str = "<%= j render :partial => 'c80_map_floors/ajax/shared/select_list_unlinked_floors',
4
+ :locals => {
5
+ floors:@unlinked_floors
6
+ } %>";
7
+ $cc.html(html_str);
@@ -21,6 +21,9 @@
21
21
  $html = $('<a href="#" class="mapplic-area-link-button" data-placement="right" data-toggle="tooltip" title="Назначить Площадь"></a>');
22
22
  $btn_layer.prepend($html);
23
23
 
24
+ $html = $('<a href="#" class="mapplic-floor-link-button" data-placement="right" data-toggle="tooltip" title="Назначить Этаж"></a>');
25
+ $btn_layer.prepend($html);
26
+
24
27
  var $status_layer = $('.status_bar');
25
28
  $html = $("<%= j render 'c80_map_floors/ajax/shared/map_creating' %>");
26
29
  $status_layer.append($html);
@@ -0,0 +1,6 @@
1
+ <select id="unlinked_floors" class="selectpicker" data-style="btn-default">
2
+ <% floors.each do |floor| %>
3
+ <option value="<%= floor.id%>"><%= floor.title %></option>
4
+ <% end %>
5
+ </select>
6
+ <button type="button" id='submit_floor_link' class="btn btn-success">Сохранить</button>
@@ -3,7 +3,7 @@
3
3
  :data => {
4
4
  :toggle => 'modal'
5
5
  },
6
- :class => 'hidden2 show_modal_window',
6
+ :class => 'hidden show_modal_window',
7
7
  :title => 'Показать modal window'
8
8
  %>
9
9
 
data/config/routes.rb CHANGED
@@ -1,4 +1,6 @@
1
1
  C80MapFloors::Engine.routes.draw do
2
2
  match '/save_map_data', to: 'map_ajax#save_map_data', via: :post
3
3
  match '/ajax/map_edit_buttons', :to => 'ajax#map_edit_buttons', :via => :post
4
+
5
+ match '/ajax/fetch_unlinked_floors', to: 'ajax#fetch_unlinked_floors', via: :post
4
6
  end
@@ -1,3 +1,3 @@
1
1
  module C80MapFloors
2
- VERSION = '0.1.0.5'
2
+ VERSION = '0.1.0.6'
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: c80_map_floors
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0.5
4
+ version: 0.1.0.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - C80609A
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2016-12-02 00:00:00.000000000 Z
11
+ date: 2016-12-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -117,6 +117,7 @@ files:
117
117
  - app/assets/javascripts/buttons/admin_buttons/button_cancel_remove.js
118
118
  - app/assets/javascripts/buttons/admin_buttons/button_complete_create.js
119
119
  - app/assets/javascripts/buttons/admin_buttons/button_edit.js
120
+ - app/assets/javascripts/buttons/admin_buttons/button_floor_link.js
120
121
  - app/assets/javascripts/buttons/admin_buttons/button_new.js
121
122
  - app/assets/javascripts/buttons/admin_buttons/button_remove.js
122
123
  - app/assets/javascripts/buttons/admin_buttons/button_save.js
@@ -175,12 +176,14 @@ files:
175
176
  - app/views/c80_map_floors/_map_row_index.html.erb
176
177
  - app/views/c80_map_floors/ajax/fetch_unlinked_areas.js.erb
177
178
  - app/views/c80_map_floors/ajax/fetch_unlinked_buildings.js.erb
179
+ - app/views/c80_map_floors/ajax/fetch_unlinked_floors.js.erb
178
180
  - app/views/c80_map_floors/ajax/map_edit_buttons.js.erb
179
181
  - app/views/c80_map_floors/ajax/shared/_map_creating.html.erb
180
182
  - app/views/c80_map_floors/ajax/shared/_map_editing.html.erb
181
183
  - app/views/c80_map_floors/ajax/shared/_map_removing.html.erb
182
184
  - app/views/c80_map_floors/ajax/shared/_select_list_unlinked_areas.html.erb
183
185
  - app/views/c80_map_floors/ajax/shared/_select_list_unlinked_buildings.html.erb
186
+ - app/views/c80_map_floors/ajax/shared/_select_list_unlinked_floors.html.erb
184
187
  - app/views/c80_map_floors/shared/_modal_window.html.erb
185
188
  - app/views/c80_map_floors/shared/_save_preloader.html.erb
186
189
  - app/views/c80_map_floors/shared/map_row/_area_order_button.html.erb