c80_map_floors 0.1.0.7 → 0.1.0.8
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.
- checksums.yaml +4 -4
- data/app/assets/javascripts/buttons/admin_buttons/button_area_link.js +29 -7
- data/app/assets/javascripts/buttons/admin_buttons/button_building_link.js +19 -1
- data/app/assets/javascripts/buttons/admin_buttons/button_edit.js +17 -0
- data/app/assets/javascripts/buttons/admin_buttons/button_floor_link.js +6 -5
- data/app/assets/javascripts/buttons/admin_buttons/button_save.js +1 -1
- data/app/assets/javascripts/c80_map_floors.js.coffee +8 -5
- data/app/assets/javascripts/map_objects/building.js +32 -3
- data/app/assets/javascripts/src/main.js +179 -41
- data/app/assets/javascripts/src/state_controller.js +16 -1
- data/app/assets/javascripts/svg_elements/admin_building_label.js +61 -0
- data/app/assets/javascripts/svg_elements/polygon.js +25 -8
- data/app/assets/stylesheets/c80_map_floors.scss +6 -2
- data/app/assets/stylesheets/map.scss +24 -11
- data/app/assets/stylesheets/view/modal_window.scss +5 -0
- data/app/controllers/c80_map_floors/ajax_controller.rb +59 -18
- data/app/models/c80_map_floors/area_representator.rb +13 -2
- data/app/models/c80_map_floors/building_representator.rb +13 -0
- data/app/models/c80_map_floors/floor_representator.rb +20 -10
- data/app/views/c80_map_floors/ajax/fetch_unlinked_areas.js.erb +4 -2
- data/app/views/c80_map_floors/ajax/fetch_unlinked_buildings.js.erb +2 -0
- data/app/views/c80_map_floors/ajax/fetch_unlinked_floors.js.erb +3 -1
- data/app/views/c80_map_floors/ajax/shared/_select_list_unlinked_areas.html.erb +6 -4
- data/app/views/c80_map_floors/ajax/shared/_select_list_unlinked_buildings.html.erb +9 -8
- data/app/views/c80_map_floors/ajax/shared/_select_list_unlinked_floors.html.erb +8 -3
- data/config/routes.rb +7 -0
- data/lib/c80_map_floors/version.rb +1 -1
- metadata +3 -2
@@ -78,7 +78,7 @@ function StateController() {
|
|
78
78
|
case "editing":
|
79
79
|
//<editor-fold desc="...">
|
80
80
|
|
81
|
-
console.log("<StateController.setMode> <ожидается рисование полигонов
|
81
|
+
console.log("<StateController.setMode> <ожидается рисование полигонов Зданий или их привязка>.");
|
82
82
|
|
83
83
|
// спрячем надписи "цена за метр" и адрес с телефоном
|
84
84
|
_this.left_side.css("top", -300);
|
@@ -96,6 +96,9 @@ function StateController() {
|
|
96
96
|
_this.map_editing.css('display', 'block');
|
97
97
|
_this.map_removing.css('display', 'none');
|
98
98
|
|
99
|
+
// покажем кнопку "связать здание с полигоном"
|
100
|
+
_map.building_link_button_klass.show();
|
101
|
+
|
99
102
|
// покажем кнопки, присущие этому режиму
|
100
103
|
_this.mzoom_buttons.css('opacity', '1');
|
101
104
|
|
@@ -107,6 +110,9 @@ function StateController() {
|
|
107
110
|
// скроем подсказки - сколько свободных площадей где есть
|
108
111
|
_map.hide_free_areas_hint();
|
109
112
|
|
113
|
+
//Показать все админские лейблы.
|
114
|
+
_map.admin_label_show_all();
|
115
|
+
|
110
116
|
//</editor-fold>
|
111
117
|
break;
|
112
118
|
|
@@ -132,6 +138,11 @@ function StateController() {
|
|
132
138
|
_this.map_editing.css('display', 'none');
|
133
139
|
_this.map_removing.css('display', 'none');
|
134
140
|
|
141
|
+
// скроем кнопку "связать здание с полигоном"
|
142
|
+
if (_map.building_link_button_klass != null) {
|
143
|
+
_map.building_link_button_klass.hide();
|
144
|
+
}
|
145
|
+
|
135
146
|
// покажем кнопки zoom
|
136
147
|
_this.mzoom_buttons.css('opacity', '1');
|
137
148
|
|
@@ -167,6 +178,10 @@ function StateController() {
|
|
167
178
|
|
168
179
|
// покажем подсказки - сколько свободных площадей где есть
|
169
180
|
_map.show_free_areas_hint();
|
181
|
+
|
182
|
+
//Скрыть все админские лейблы.
|
183
|
+
_map.admin_label_hide_all();
|
184
|
+
|
170
185
|
//</editor-fold>
|
171
186
|
break;
|
172
187
|
|
@@ -0,0 +1,61 @@
|
|
1
|
+
"use strict";
|
2
|
+
|
3
|
+
/**
|
4
|
+
*
|
5
|
+
* @param options - Это C80MapFloors::MapBuilding.my_as_json
|
6
|
+
* @param link_to_map - ссылка на класс карты
|
7
|
+
* @param params - вспомогательные параметры для отрисовки (например, координаты центра)
|
8
|
+
* @constructor
|
9
|
+
*/
|
10
|
+
var AdminBuildingLabel = function (options, link_to_map, params) {
|
11
|
+
|
12
|
+
var _this = this;
|
13
|
+
|
14
|
+
this._x = null;
|
15
|
+
this._y = null;
|
16
|
+
this._map = null;
|
17
|
+
this._g = null;
|
18
|
+
this._text_element_ns = null;
|
19
|
+
|
20
|
+
console.log('<AdminBuildingLabel> Пытаемся создать админский лейбл для Здания, options["data"] = ' + options["data"]);
|
21
|
+
// options["data"] - это C80MapFloors::BuildingRepresentator::InstanceMethods.my_as_json
|
22
|
+
if (options["data"] != null && typeof options["data"]["id"] != 'undefined') {
|
23
|
+
console.log('<Building.init> Для полигона id=' + options["id"] + ' создаём админский лейбл title=' + options["data"]["title"]);
|
24
|
+
|
25
|
+
//this._x = options["coords"][0];
|
26
|
+
//this._y = options["coords"][1];
|
27
|
+
|
28
|
+
this._x = params['cx'];
|
29
|
+
this._y = params['cy'];
|
30
|
+
|
31
|
+
this._map = link_to_map;
|
32
|
+
|
33
|
+
// создадим узел, который будет помещён в дерево и будет виден пользователю
|
34
|
+
this._g = document.createElementNS('http://www.w3.org/2000/svg', 'g');
|
35
|
+
this._text_element_ns = document.createElementNS('http://www.w3.org/2000/svg', 'text');
|
36
|
+
this._text_element_ns.setAttribute('x', this._x);
|
37
|
+
this._text_element_ns.setAttribute('y', this._y);
|
38
|
+
this._text_element_ns.setAttribute('fill', '#000000');
|
39
|
+
this._text_element_ns.setAttribute('style', 'font-size:12px;font-weight:bold;');
|
40
|
+
|
41
|
+
// помещаем текст: id=<id_привязанного_Здания>; title=<Заголовок_привязанного_здания>
|
42
|
+
this._text_element_ns.textContent = "id="+options["data"]["id"] + "; название='" + options["data"]["title"] + "'";
|
43
|
+
|
44
|
+
// "антагонист" метода destroy()
|
45
|
+
this._map.addNodeToSvg(this._g, false);
|
46
|
+
this._g.appendChild(this._text_element_ns);
|
47
|
+
|
48
|
+
}
|
49
|
+
|
50
|
+
// самоуничтожение
|
51
|
+
this.destroy = function () {
|
52
|
+
if (this._map != null) {
|
53
|
+
console.log('<AdminBuildingLabel.destroy> Уничтожаем админскую метку.');
|
54
|
+
_this._map.removeNodeFromSvg(_this._g, false);
|
55
|
+
_this._g.removeChild(_this._text_element_ns);
|
56
|
+
delete _this._text_element_ns;
|
57
|
+
delete _this._g;
|
58
|
+
}
|
59
|
+
};
|
60
|
+
|
61
|
+
};
|
@@ -1,13 +1,23 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
1
|
+
/** Конструктор. Создать полигон и прицепить в список отображения карты.
|
2
|
+
*
|
3
|
+
* @param x
|
4
|
+
* @param y
|
5
|
+
* @param is_overlay
|
6
|
+
* @param link_to_map - ссылка на класс карты
|
7
|
+
* @constructor
|
8
|
+
*/
|
9
|
+
var Polygon = function (x, y, is_overlay, link_to_map) {
|
10
|
+
|
11
|
+
this._map = link_to_map;
|
5
12
|
this._map.is_draw = true;
|
6
13
|
|
7
14
|
this.params = [x, y]; //array of coordinates of polygon points
|
8
15
|
|
16
|
+
// создаём полигон
|
9
17
|
this.g = document.createElementNS('http://www.w3.org/2000/svg', 'g');
|
10
18
|
this.polygon = document.createElementNS('http://www.w3.org/2000/svg', 'polyline');
|
19
|
+
|
20
|
+
// цепляем полигон в список отображения карты
|
11
21
|
this._map.addNodeToSvg(this.g, is_overlay);
|
12
22
|
this.g.appendChild(this.polygon);
|
13
23
|
|
@@ -169,12 +179,19 @@ Polygon.prototype.deselect = function () {
|
|
169
179
|
return this;
|
170
180
|
};
|
171
181
|
|
172
|
-
|
182
|
+
/** Создать полигон по параметрам (и "прицепить" его в список отображения карты).
|
183
|
+
*
|
184
|
+
* @param params
|
185
|
+
* @param is_overlay
|
186
|
+
* @param link_to_map - ссылка на класс карты
|
187
|
+
* @returns {Polygon}
|
188
|
+
*/
|
189
|
+
Polygon.createFromSaved = function (params, is_overlay, link_to_map) {
|
173
190
|
//console.log("<Polygon.createFromSaved>");
|
174
191
|
//console.log("<Polygon.createFromSaved> is_overlay = " + is_overlay);
|
175
192
|
|
176
193
|
var coords = params.coords,
|
177
|
-
area = new Polygon(coords[0], coords[1], is_overlay,
|
194
|
+
area = new Polygon(coords[0], coords[1], is_overlay, link_to_map);
|
178
195
|
|
179
196
|
for (var i = 2, c = coords.length; i < c; i += 2) {
|
180
197
|
area.addPoint(coords[i], coords[i + 1]);
|
@@ -186,8 +203,8 @@ Polygon.createFromSaved = function (params, is_overlay, self) {
|
|
186
203
|
area.setCoords(area.params).deselect();
|
187
204
|
delete(area.polyline);
|
188
205
|
|
189
|
-
|
190
|
-
|
206
|
+
link_to_map.is_draw = false;
|
207
|
+
link_to_map.drawing_poligon = null;
|
191
208
|
|
192
209
|
return area;
|
193
210
|
|
@@ -1227,7 +1227,7 @@ div#map_wrapper {
|
|
1227
1227
|
}
|
1228
1228
|
}
|
1229
1229
|
|
1230
|
-
polygon, polyline {
|
1230
|
+
polygon, polyline { /* общий внешний вид полигона */
|
1231
1231
|
fill: rgba(255, 255, 255, 0);
|
1232
1232
|
stroke: rgba(255, 255, 255, 0);
|
1233
1233
|
cursor: pointer;
|
@@ -1246,7 +1246,7 @@ div#map_wrapper {
|
|
1246
1246
|
g {
|
1247
1247
|
|
1248
1248
|
&.free {
|
1249
|
-
polygon, polyline {
|
1249
|
+
polygon, polyline { /* СВОБОДНЫЙ полигон */
|
1250
1250
|
fill: rgba(0, 255, 19, 0.30);
|
1251
1251
|
stroke: rgba(51, 51, 51, 0.36);
|
1252
1252
|
cursor: pointer;
|
@@ -1260,7 +1260,7 @@ div#map_wrapper {
|
|
1260
1260
|
}
|
1261
1261
|
|
1262
1262
|
&.busy {
|
1263
|
-
polygon, polyline {
|
1263
|
+
polygon, polyline { /* ЗАНЯТЫЙ полигон */
|
1264
1264
|
fill: rgba(255, 4, 0, 0.30);
|
1265
1265
|
stroke: rgba(255, 4, 0, 0.30);
|
1266
1266
|
cursor: pointer;
|
@@ -1275,7 +1275,7 @@ div#map_wrapper {
|
|
1275
1275
|
|
1276
1276
|
&.unassigned {
|
1277
1277
|
|
1278
|
-
polygon, polyline {
|
1278
|
+
polygon, polyline { /* НЕНАЗНАЧЕННЫЙ полигон */
|
1279
1279
|
fill: rgba(131, 131, 131, 0.30);
|
1280
1280
|
stroke: rgba(131, 131, 131, 0.40);
|
1281
1281
|
cursor: pointer;
|
@@ -1287,7 +1287,7 @@ div#map_wrapper {
|
|
1287
1287
|
}
|
1288
1288
|
|
1289
1289
|
&.viewing_area {
|
1290
|
-
polygon, polyline {
|
1290
|
+
polygon, polyline { /* НЕНАЗНАЧЕННЫЙ и просматриваемый полигон (с пунктиром) */
|
1291
1291
|
/*background: transparent url(image_path('loader_button.gif')) no-repeat 0 0;*/
|
1292
1292
|
fill: rgba(131, 131, 131, 0.50);
|
1293
1293
|
stroke: rgba(131, 131, 131, 0.60);
|
@@ -1305,7 +1305,7 @@ div#map_wrapper {
|
|
1305
1305
|
}
|
1306
1306
|
|
1307
1307
|
&.viewing_area {
|
1308
|
-
polygon, polyline {
|
1308
|
+
polygon, polyline { /* подразумевается НАЗНАЧЕННЫЙ полигон */
|
1309
1309
|
/*background: transparent url(image_path('loader_button.gif')) no-repeat 0 0;*/
|
1310
1310
|
fill: rgba(0, 255, 19, 0.10);
|
1311
1311
|
stroke: rgba(255, 246, 242, 0.59);
|
@@ -1336,7 +1336,7 @@ div#map_wrapper {
|
|
1336
1336
|
opacity: 0;
|
1337
1337
|
}
|
1338
1338
|
|
1339
|
-
polygon, polyline {
|
1339
|
+
polygon, polyline { /* невидимый полигон оверлейного слоя */
|
1340
1340
|
fill: rgba(255, 255, 255, 0);
|
1341
1341
|
stroke: rgba(255, 255, 255, 0);
|
1342
1342
|
cursor: pointer;
|
@@ -1353,7 +1353,7 @@ div#map_wrapper {
|
|
1353
1353
|
display: block;
|
1354
1354
|
}
|
1355
1355
|
|
1356
|
-
polygon, polyline {
|
1356
|
+
polygon, polyline { /* когда редактируем, полигоны светятся синим */
|
1357
1357
|
fill: rgba(103, 232, 237, 0.30);
|
1358
1358
|
stroke: rgba(0, 255, 19, 0.90);
|
1359
1359
|
&:hover {
|
@@ -1363,7 +1363,7 @@ div#map_wrapper {
|
|
1363
1363
|
}
|
1364
1364
|
|
1365
1365
|
g.free {
|
1366
|
-
polygon, polyline {
|
1366
|
+
polygon, polyline { /* когда редактируем, СВОБОДНЫЕ полигоны светятся зелёным */
|
1367
1367
|
fill: rgba(0, 255, 19, 0.20);
|
1368
1368
|
stroke: rgba(255, 255, 255, 0.90);
|
1369
1369
|
cursor: pointer;
|
@@ -1377,7 +1377,7 @@ div#map_wrapper {
|
|
1377
1377
|
}
|
1378
1378
|
|
1379
1379
|
g.busy {
|
1380
|
-
polygon, polyline {
|
1380
|
+
polygon, polyline { /* когда редактируем, ЗАНЯТЫЕ полигоны светятся красным */
|
1381
1381
|
fill: rgba(255, 4, 0, 0.30);
|
1382
1382
|
stroke: rgba(255, 255, 255, 0.90);
|
1383
1383
|
cursor: pointer;
|
@@ -1393,6 +1393,19 @@ div#map_wrapper {
|
|
1393
1393
|
}
|
1394
1394
|
}
|
1395
1395
|
|
1396
|
+
&.editing {
|
1397
|
+
#svg {
|
1398
|
+
polygon.selected { /* когда редактируем карту, ВЫБРАННЫЙ полигон [здания] светится фиолетовым */
|
1399
|
+
fill: rgba(135, 18, 237, 0.40);
|
1400
|
+
stroke: rgba(0, 255, 19, 0.90);
|
1401
|
+
&:hover {
|
1402
|
+
fill: rgba(135, 18, 237, 0.70);
|
1403
|
+
stroke: rgba(255, 0, 169, 0.99);
|
1404
|
+
}
|
1405
|
+
}
|
1406
|
+
}
|
1407
|
+
}
|
1408
|
+
|
1396
1409
|
// спрячем все полигоны, кроме редактируемого полигона
|
1397
1410
|
&.edit_area {
|
1398
1411
|
#svg {
|
@@ -1412,7 +1425,7 @@ div#map_wrapper {
|
|
1412
1425
|
display: block;
|
1413
1426
|
}
|
1414
1427
|
|
1415
|
-
polygon, polyline {
|
1428
|
+
polygon, polyline { /* когда создаём, все полигоны светятся красным */
|
1416
1429
|
fill: rgba(255, 61, 0, 0.50);
|
1417
1430
|
stroke: rgba(255, 255, 255, 0.8);
|
1418
1431
|
&:hover {
|
@@ -5,10 +5,15 @@ module C80MapFloors
|
|
5
5
|
# puts "<AjaxController.map_edit_buttons> #{params}"
|
6
6
|
end
|
7
7
|
|
8
|
+
# прислать ВСЕ Площади указанного Этажа
|
8
9
|
def fetch_unlinked_areas
|
9
|
-
|
10
|
+
Rails.logger.debug "[TRACE] <AjaxController.fetch_unlinked_areas> params = #{params}"
|
11
|
+
# <AjaxController.fetch_unlinked_areas> params = {"sfloor_id"=>"1", "controller"=>"c80_map_floors/ajax", "action"=>"fetch_unlinked_areas"}
|
10
12
|
|
11
|
-
|
13
|
+
# Sfloor - принадлежит моделям host-проекта (в частности, stroy101km)
|
14
|
+
# noinspection RubyResolve
|
15
|
+
@sfloor_areas = Sfloor.find(params[:sfloor_id].to_i).areas
|
16
|
+
Rails.logger.debug "[TRACE] <AjaxController.fetch_unlinked_areas> @sfloor_areas.count = #{@sfloor_areas.count}"
|
12
17
|
|
13
18
|
end
|
14
19
|
|
@@ -17,31 +22,40 @@ module C80MapFloors
|
|
17
22
|
Rails.logger.debug "[TRACE] <AjaxController.fetch_unlinked_floors> params = #{params}"
|
18
23
|
# [TRACE] <AjaxController.fetch_unlinked_floors> params = {"building_id"=>"1", "controller"=>"c80_map_floors/ajax", "action"=>"fetch_unlinked_floors"}
|
19
24
|
|
20
|
-
|
25
|
+
# меняем логику - делаем менее строгой, теперь присылаются ВСЕ этажи указанного Здания
|
26
|
+
# @unlinked_floors = Sfloor.unlinked_floors(params[:building_id]) # Sfloor - Этаж из host app, который еще и floor_representator
|
27
|
+
|
28
|
+
# Building - принадлежит моделям host-проекта (в частности, stroy101km)
|
29
|
+
# noinspection RubyResolve
|
30
|
+
@building_sfloors = Building.find(params[:building_id].to_i).sfloors
|
21
31
|
|
22
32
|
end
|
23
33
|
|
24
34
|
def fetch_unlinked_buildings
|
25
|
-
|
35
|
+
Rails.logger.debug "[TRACE] <AjaxController.fetch_unlinked_buildings> params = #{params}"
|
26
36
|
|
27
|
-
@unlinked_buildings =
|
37
|
+
@unlinked_buildings = Building.all.order_title
|
28
38
|
|
29
39
|
end
|
30
40
|
|
31
41
|
# связать Rent::Area и Map::Area
|
32
42
|
# в процессе произойдёт обновление json-файла с данными
|
43
|
+
# noinspection RubyResolve
|
33
44
|
def link_area
|
34
|
-
Rails.logger.debug "<AjaxController.link_area> params = #{params}"
|
45
|
+
Rails.logger.debug "[TRACE] <AjaxController.link_area> params = #{params}"
|
46
|
+
# [TRACE] <AjaxController.link_area> params = {"area_id"=>"364", "apolygon_id"=>"3", "controller"=>"c80_map_floors/ajax", "action"=>"link_area"}
|
47
|
+
|
48
|
+
# фиксируем участников
|
49
|
+
rent_area = ::Area.find(params[:area_id])
|
50
|
+
area = C80MapFloors::Area.find(params[:apolygon_id])
|
35
51
|
|
36
|
-
#
|
37
|
-
rent_area
|
38
|
-
|
39
|
-
rent_area.map_areas.delete_all
|
40
|
-
rent_area.map_areas << map_area
|
52
|
+
# rent_area has_one area(полигон)
|
53
|
+
rent_area.area.delete_all if rent_area.area.present?
|
54
|
+
rent_area.area = area
|
41
55
|
rent_area.save
|
42
56
|
|
43
57
|
result = {
|
44
|
-
updated_locations_json:
|
58
|
+
updated_locations_json: C80MapFloors::MapJson.fetch_json
|
45
59
|
}
|
46
60
|
|
47
61
|
respond_to do |format|
|
@@ -51,18 +65,45 @@ module C80MapFloors
|
|
51
65
|
end
|
52
66
|
|
53
67
|
#
|
68
|
+
# noinspection RubyResolve
|
54
69
|
def link_building
|
55
70
|
|
56
|
-
Rails.logger.debug "<AjaxController.link_building> params = #{params}"
|
71
|
+
Rails.logger.debug "[TRACE] <AjaxController.link_building> params = #{params}"
|
72
|
+
# [TRACE] <AjaxController.link_building> params = {"rent_building_id"=>"29", "map_building_id"=>"10", "controller"=>"c80_map_floors/ajax", "action"=>"link_building"}
|
73
|
+
rent_building = ::Building.find(params[:building_id])
|
57
74
|
|
58
|
-
|
59
|
-
|
60
|
-
rent_building.
|
61
|
-
rent_building.
|
75
|
+
map_building = C80MapFloors::MapBuilding.find(params[:map_building_id])
|
76
|
+
|
77
|
+
rent_building.map_building.delete_all if rent_building.map_building.present?
|
78
|
+
rent_building.map_building = map_building
|
62
79
|
rent_building.save
|
63
80
|
|
64
81
|
result = {
|
65
|
-
updated_locations_json:
|
82
|
+
updated_locations_json: C80MapFloors::MapJson.fetch_json
|
83
|
+
}
|
84
|
+
|
85
|
+
respond_to do |format|
|
86
|
+
format.json { render json: result }
|
87
|
+
end
|
88
|
+
|
89
|
+
end
|
90
|
+
|
91
|
+
# связать Этаж и Картинку Этажа (обновится JSON карты)
|
92
|
+
def link_floor
|
93
|
+
Rails.logger.debug "[TRACE] <AjaxController.link_floor> params = #{params}"
|
94
|
+
# <AjaxController.link_floor> params = {"sfloor_id"=>"3", "floor_id"=>"2", "controller"=>"c80_map_floors/ajax", "action"=>"link_floor"}
|
95
|
+
|
96
|
+
# фиксируем участников
|
97
|
+
sfloor = Sfloor.find(params[:sfloor_id])
|
98
|
+
floor = C80MapFloors::Floor.find(params[:floor_id])
|
99
|
+
|
100
|
+
# sfloor has_one floor
|
101
|
+
sfloor.floor.delete_all if sfloor.floor.present?
|
102
|
+
sfloor.floor = floor
|
103
|
+
sfloor.save
|
104
|
+
|
105
|
+
result = {
|
106
|
+
updated_locations_json: C80MapFloors::MapJson.fetch_json
|
66
107
|
}
|
67
108
|
|
68
109
|
respond_to do |format|
|
@@ -19,7 +19,9 @@ module C80MapFloors
|
|
19
19
|
def acts_as_map_area_representator
|
20
20
|
class_eval do
|
21
21
|
|
22
|
-
has_many :map_areas, :as => :area_representator, :class_name => 'C80MapFloors::Area', :dependent => :nullify
|
22
|
+
# has_many :map_areas, :as => :area_representator, :class_name => 'C80MapFloors::Area', :dependent => :nullify
|
23
|
+
has_one :area, :as => :area_representator, :class_name => 'C80MapFloors::Area', :dependent => :nullify
|
24
|
+
|
23
25
|
after_save :update_json
|
24
26
|
|
25
27
|
def self.unlinked_areas
|
@@ -32,8 +34,17 @@ module C80MapFloors
|
|
32
34
|
res
|
33
35
|
end
|
34
36
|
|
37
|
+
# выдать название привязанного к Площади полигона
|
38
|
+
def apolygon_title
|
39
|
+
res = '-'
|
40
|
+
if self.area.present?
|
41
|
+
res = "id=#{self.area.id}"
|
42
|
+
end
|
43
|
+
res
|
44
|
+
end
|
45
|
+
|
35
46
|
def update_json
|
36
|
-
|
47
|
+
MapJson.update_json # NOTE:: возможно, временно отключён
|
37
48
|
end
|
38
49
|
|
39
50
|
end
|
@@ -14,6 +14,7 @@ module C80MapFloors
|
|
14
14
|
klass.send(:include, InstanceMethods)
|
15
15
|
end
|
16
16
|
|
17
|
+
# noinspection ALL
|
17
18
|
module ClassMethods
|
18
19
|
|
19
20
|
def acts_as_map_building_representator
|
@@ -22,6 +23,8 @@ module C80MapFloors
|
|
22
23
|
has_one :map_building, :as => :building_representator, :class_name => 'C80MapFloors::MapBuilding', :dependent => :nullify
|
23
24
|
after_save :update_json
|
24
25
|
|
26
|
+
scope :order_title, -> {order(:title => :asc)}
|
27
|
+
|
25
28
|
def self.unlinked_buildings
|
26
29
|
res = []
|
27
30
|
self.all.each do |building|
|
@@ -36,10 +39,20 @@ module C80MapFloors
|
|
36
39
|
MapJson.update_json
|
37
40
|
end
|
38
41
|
|
42
|
+
# выдать название привязанного к Зданию полигона
|
43
|
+
def bpolygon_title
|
44
|
+
res = '-'
|
45
|
+
if self.map_building.present?
|
46
|
+
res = "'#{self.map_building.title}'"
|
47
|
+
end
|
48
|
+
res
|
49
|
+
end
|
50
|
+
|
39
51
|
end
|
40
52
|
end
|
41
53
|
end
|
42
54
|
|
55
|
+
# noinspection ALL
|
43
56
|
module InstanceMethods
|
44
57
|
|
45
58
|
def my_as_json
|
@@ -20,24 +20,34 @@ module C80MapFloors
|
|
20
20
|
class_eval do
|
21
21
|
|
22
22
|
has_one :floor, :as => :map_floor_representator, :class_name => 'C80MapFloors::Floor', :dependent => :nullify
|
23
|
+
|
23
24
|
# after_save :update_json # NOTE:: возможно, временно
|
24
25
|
|
25
26
|
# выдать список несвязанных с полигонами Этажей (указанного здания building_id)
|
26
|
-
def self.unlinked_floors(building_id)
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
end
|
27
|
+
# def self.unlinked_floors(building_id) # building_id - не используется, надо дописать код, чтобы использовался
|
28
|
+
# res = []
|
29
|
+
# self.all.each do |sfloor|
|
30
|
+
# unless sfloor.floor.present?
|
31
|
+
# res << sfloor
|
32
|
+
# end
|
33
|
+
# end
|
34
|
+
# Rails.logger.debug "[TRACE] <floor_representator.unlinked_floors> Кол-во несвязанных Этажей: #{res.count}."
|
35
|
+
# res
|
36
|
+
# end
|
36
37
|
|
37
38
|
def update_json
|
38
39
|
MapJson.update_json
|
39
40
|
end
|
40
41
|
|
42
|
+
# выдать название привязанного к Этажу полигона (но у Этажа вместо полигона выступает картинка)
|
43
|
+
def fpolygon_title
|
44
|
+
res = '-'
|
45
|
+
if self.floor.present?
|
46
|
+
res = "'#{self.floor.title}'"
|
47
|
+
end
|
48
|
+
res
|
49
|
+
end
|
50
|
+
|
41
51
|
end
|
42
52
|
end
|
43
53
|
end
|
@@ -1,7 +1,9 @@
|
|
1
|
+
//noinspection JSUnusedGlobalSymbols
|
1
2
|
var $m = $('#modal_window');
|
3
|
+
//noinspection JSUnusedGlobalSymbols
|
2
4
|
var $cc = $m.find('.modal-body');
|
3
|
-
var html_str = "<%= j render :partial =>
|
5
|
+
var html_str = "<%= j render :partial => 'c80_map_floors/ajax/shared/select_list_unlinked_areas',
|
4
6
|
:locals => {
|
5
|
-
areas
|
7
|
+
areas: @sfloor_areas
|
6
8
|
} %>";
|
7
9
|
$cc.html(html_str);
|
@@ -1,7 +1,9 @@
|
|
1
|
+
//noinspection JSUnusedGlobalSymbols
|
1
2
|
var $m = $('#modal_window');
|
3
|
+
//noinspection JSUnusedGlobalSymbols
|
2
4
|
var $cc = $m.find('.modal-body');
|
3
5
|
var html_str = "<%= j render :partial => 'c80_map_floors/ajax/shared/select_list_unlinked_floors',
|
4
6
|
:locals => {
|
5
|
-
|
7
|
+
sfloors: @building_sfloors
|
6
8
|
} %>";
|
7
9
|
$cc.html(html_str);
|
@@ -1,6 +1,8 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
1
|
+
<%# список Площадей указанного Этажа, который выводится в modal bootstrap окне после нажатия кнопки "назначить площадь" %>
|
2
|
+
|
3
|
+
<select id="unlinked_areas" class="selectpicker" data-style="btn-default" data-width="400px">
|
4
|
+
<% areas.each do |area| %>
|
5
|
+
<option value="<%= area.id%>"><%= "#{area.name} (назначен полигон: #{area.apolygon_title})" %></option>
|
4
6
|
<% end %>
|
5
7
|
</select>
|
6
|
-
<button type="button" id='submit_area_link' class="btn btn-
|
8
|
+
<button type="button" id='submit_area_link' class="btn btn-success">Сохранить</button>
|
@@ -1,10 +1,11 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
1
|
+
<%# список всех Зданий, который выводится в modal bootstrap окне после нажатия кнопки "назначить Здание" %>
|
2
|
+
<%# в названии файла присутствует unlinked - это рудимент, legacy from the past %>
|
3
|
+
|
4
|
+
<!--suppress HtmlFormInputWithoutLabel -->
|
5
|
+
<select id="unlinked_buildings" class="selectpicker" data-style="btn-default" data-width="400px">
|
6
|
+
<% # noinspection RubyResolve
|
7
|
+
buildings.each do |building| %>
|
8
|
+
<option value="<%= building.id%>"><%= "#{building.title} (назначен полигон: #{building.bpolygon_title})" %></option>
|
8
9
|
<% end %>
|
9
10
|
</select>
|
10
|
-
<button type="button" id='submit_building_link' class="btn btn-
|
11
|
+
<button type="button" id='submit_building_link' class="btn btn-success">Назначить</button>
|
@@ -1,6 +1,11 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
1
|
+
<%# список Этажей указанного Здания, который выводится в modal bootstrap окне после нажатия кнопки "назначить этаж" %>
|
2
|
+
<%# в названии файла присутствует unlinked - это было так, но я сделал менее строже - добавил возможность переназначить %>
|
3
|
+
|
4
|
+
<!--suppress HtmlFormInputWithoutLabel -->
|
5
|
+
<select id="unlinked_floors" class="selectpicker" data-style="btn-default" data-width="400px">
|
6
|
+
<% # noinspection RubyResolve
|
7
|
+
sfloors.each do |sfloor| %>
|
8
|
+
<option value="<%= sfloor.id%>"><%= "#{sfloor.title} (назначена картинка: #{sfloor.fpolygon_title})" %></option>
|
4
9
|
<% end %>
|
5
10
|
</select>
|
6
11
|
<button type="button" id='submit_floor_link' class="btn btn-success">Сохранить</button>
|
data/config/routes.rb
CHANGED
@@ -2,5 +2,12 @@ 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
4
|
|
5
|
+
match '/ajax/link_building', :to => 'ajax#link_building', :via => :post
|
6
|
+
match '/ajax/link_floor', :to => 'ajax#link_floor', :via => :post
|
7
|
+
match '/ajax/link_area', :to => 'ajax#link_area', :via => :post
|
8
|
+
|
9
|
+
# слово unlinked - это рудимент, legacy from the past
|
10
|
+
match '/ajax/fetch_unlinked_buildings', to: 'ajax#fetch_unlinked_buildings', via: :post
|
5
11
|
match '/ajax/fetch_unlinked_floors', to: 'ajax#fetch_unlinked_floors', via: :post
|
12
|
+
match '/ajax/fetch_unlinked_areas', to: 'ajax#fetch_unlinked_areas', via: :post
|
6
13
|
end
|