c80_map_floors 0.1.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +11 -0
- data/.travis.yml +3 -0
- data/CODE_OF_CONDUCT.md +13 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +21 -0
- data/README.md +67 -0
- data/Rakefile +1 -0
- data/app/admin/c80_map_floors/floors.rb +57 -0
- data/app/admin/c80_map_floors/map_buildings.rb +49 -0
- data/app/admin/c80_map_floors/settings.rb +32 -0
- data/app/assets/javascripts/buttons/admin_buttons/button_area_link.js +91 -0
- data/app/assets/javascripts/buttons/admin_buttons/button_building_link.js +91 -0
- data/app/assets/javascripts/buttons/admin_buttons/button_cancel_create.js +21 -0
- data/app/assets/javascripts/buttons/admin_buttons/button_cancel_remove.js +23 -0
- data/app/assets/javascripts/buttons/admin_buttons/button_complete_create.js +22 -0
- data/app/assets/javascripts/buttons/admin_buttons/button_edit.js +96 -0
- data/app/assets/javascripts/buttons/admin_buttons/button_new.js +46 -0
- data/app/assets/javascripts/buttons/admin_buttons/button_remove.js +23 -0
- data/app/assets/javascripts/buttons/admin_buttons/button_save.js +111 -0
- data/app/assets/javascripts/buttons/button_back_to_map.js +84 -0
- data/app/assets/javascripts/buttons/zoom_buttons.js +78 -0
- data/app/assets/javascripts/c80_map_floors.js.coffee +23 -0
- data/app/assets/javascripts/events/app_event.js +15 -0
- data/app/assets/javascripts/map_objects/area.js +251 -0
- data/app/assets/javascripts/map_objects/building.js +294 -0
- data/app/assets/javascripts/map_objects/dot.js +14 -0
- data/app/assets/javascripts/map_objects/floor.js +10 -0
- data/app/assets/javascripts/src/main.js +1421 -0
- data/app/assets/javascripts/src/state_controller.js +322 -0
- data/app/assets/javascripts/src/utils/map_utils.js +23 -0
- data/app/assets/javascripts/src/utils/opacity_buttons_utils.js +15 -0
- data/app/assets/javascripts/src/utils/utils.js +140 -0
- data/app/assets/javascripts/svg_elements/area_label.js +25 -0
- data/app/assets/javascripts/svg_elements/building_label.js +65 -0
- data/app/assets/javascripts/svg_elements/helper.js +36 -0
- data/app/assets/javascripts/svg_elements/polygon.js +194 -0
- data/app/assets/javascripts/view/save_preloader.js +30 -0
- data/app/assets/stylesheets/c80_map_floors.scss +4 -0
- data/app/assets/stylesheets/map.scss +1464 -0
- data/app/assets/stylesheets/view/buttons/area_order_button.scss +16 -0
- data/app/assets/stylesheets/view/buttons/back_to_map_button.scss +28 -0
- data/app/assets/stylesheets/view/elems/building_info.scss +54 -0
- data/app/assets/stylesheets/view/elems/free_areas_label.scss +116 -0
- data/app/assets/stylesheets/view/elems/map_objects/map_object_image_bg.scss +10 -0
- data/app/assets/stylesheets/view/modal_window.scss +13 -0
- data/app/assets/stylesheets/view/save_preloader.scss +206 -0
- data/app/controllers/c80_map_floors/ajax_controller.rb +65 -0
- data/app/controllers/c80_map_floors/application_controller.rb +6 -0
- data/app/controllers/c80_map_floors/map_ajax_controller.rb +70 -0
- data/app/helpers/c80_map_floors/application_helper.rb +28 -0
- data/app/models/c80_map_floors/area.rb +20 -0
- data/app/models/c80_map_floors/area_representator.rb +75 -0
- data/app/models/c80_map_floors/base_map_object.rb +41 -0
- data/app/models/c80_map_floors/building_representator.rb +72 -0
- data/app/models/c80_map_floors/floor.rb +37 -0
- data/app/models/c80_map_floors/map_building.rb +45 -0
- data/app/models/c80_map_floors/map_json.rb +35 -0
- data/app/models/c80_map_floors/setting.rb +32 -0
- data/app/uploaders/c80_map_floors/building_image_uploader.rb +31 -0
- data/app/uploaders/c80_map_floors/floor_image_uploader.rb +33 -0
- data/app/uploaders/c80_map_floors/map_image_uploader.rb +31 -0
- data/app/views/c80_map_floors/_map_row_index.html.erb +40 -0
- data/app/views/c80_map_floors/ajax/fetch_unlinked_areas.js.erb +7 -0
- data/app/views/c80_map_floors/ajax/fetch_unlinked_buildings.js.erb +7 -0
- data/app/views/c80_map_floors/ajax/map_edit_buttons.js.erb +36 -0
- data/app/views/c80_map_floors/ajax/shared/_map_creating.html.erb +6 -0
- data/app/views/c80_map_floors/ajax/shared/_map_editing.html.erb +4 -0
- data/app/views/c80_map_floors/ajax/shared/_map_removing.html.erb +5 -0
- data/app/views/c80_map_floors/ajax/shared/_select_list_unlinked_areas.html.erb +6 -0
- data/app/views/c80_map_floors/ajax/shared/_select_list_unlinked_buildings.html.erb +10 -0
- data/app/views/c80_map_floors/shared/_modal_window.html.erb +28 -0
- data/app/views/c80_map_floors/shared/_save_preloader.html.erb +3 -0
- data/app/views/c80_map_floors/shared/map_row/_area_order_button.html.erb +7 -0
- data/app/views/c80_map_floors/shared/map_row/_building_info.html.erb +17 -0
- data/bin/console +14 -0
- data/bin/setup +7 -0
- data/c80_map_floors.gemspec +28 -0
- data/config/routes.rb +4 -0
- data/db/migrate/20161015190000_create_c80_map_floors_settings.rb +8 -0
- data/db/migrate/20161015190001_create_c80_map_floors_map_buildings.rb +10 -0
- data/db/migrate/20161015190002_create_c80_map_floors_areas.rb +12 -0
- data/db/migrate/20161015190003_add_building_representator_to_c80_map_floors_buildings.rb +6 -0
- data/db/migrate/20161015190004_create_c80_map_floors_floors.rb +16 -0
- data/db/migrate/20161019111010_add_title_to_c80_map_floors_buildings.rb +5 -0
- data/db/migrate/20161020184040_add_coords_img_to_c80_map_floors_buildings.rb +5 -0
- data/db/seeds/c80_map_floors_01_fill_map_settings.rb +6 -0
- data/db/seeds/c80_map_floors_02_create_test_area.rb +7 -0
- data/lib/c80_map_floors.rb +8 -0
- data/lib/c80_map_floors/engine.rb +23 -0
- data/lib/c80_map_floors/version.rb +3 -0
- metadata +218 -0
@@ -0,0 +1,35 @@
|
|
1
|
+
module C80MapFloors
|
2
|
+
|
3
|
+
class MapJson < ActiveRecord::Base
|
4
|
+
|
5
|
+
def self.update_json
|
6
|
+
|
7
|
+
# открываем файл на чтение
|
8
|
+
locations_path = Rails.root.join("public", "locations.json")
|
9
|
+
locs = File.read(locations_path)
|
10
|
+
locs_hash = JSON.parse(locs)
|
11
|
+
|
12
|
+
# поместим в него детей - здания со всеми детьми и внуками
|
13
|
+
buildings = []
|
14
|
+
C80MapFloors::MapBuilding.all.each do |building|
|
15
|
+
buildings << building.as_json
|
16
|
+
end
|
17
|
+
|
18
|
+
locs_hash["buildings"] = buildings
|
19
|
+
|
20
|
+
# запишем в файл
|
21
|
+
File.open(locations_path, 'w') do |f|
|
22
|
+
f.write(locs_hash.to_json)
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
26
|
+
|
27
|
+
def self.fetch_json
|
28
|
+
locations_path = Rails.root.join("public", "locations.json")
|
29
|
+
locs = File.read(locations_path)
|
30
|
+
JSON.parse(locs)
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
34
|
+
|
35
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
module C80MapFloors
|
2
|
+
class Setting < ActiveRecord::Base
|
3
|
+
mount_uploader :map_image, C80MapFloors::MapImageUploader
|
4
|
+
after_save :update_json
|
5
|
+
|
6
|
+
def map_img
|
7
|
+
MiniMagick::Image.open(map_image.path)
|
8
|
+
end
|
9
|
+
|
10
|
+
protected
|
11
|
+
|
12
|
+
def update_json
|
13
|
+
|
14
|
+
if self.map_image.present?
|
15
|
+
locations_path = Rails.root.join("public", "locations.json")
|
16
|
+
locs = File.read(locations_path)
|
17
|
+
puts "<update_json> #{ Rails.root.join("public", "locations.json") }"
|
18
|
+
|
19
|
+
locs_hash = JSON.parse(locs)
|
20
|
+
locs_hash["mapwidth"] = map_img["width"].to_s
|
21
|
+
locs_hash["mapheight"] = map_img["height"].to_s
|
22
|
+
locs_hash["img"] = map_image.url.to_s
|
23
|
+
|
24
|
+
File.open(locations_path, 'w') do |f|
|
25
|
+
f.write(locs_hash.to_json)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
module C80MapFloors
|
2
|
+
|
3
|
+
class BuildingImageUploader < CarrierWave::Uploader::Base
|
4
|
+
|
5
|
+
include CarrierWave::MiniMagick
|
6
|
+
|
7
|
+
storage :file
|
8
|
+
|
9
|
+
version :thumb do
|
10
|
+
process :resize_to_fit => [500,500]
|
11
|
+
end
|
12
|
+
|
13
|
+
def store_dir
|
14
|
+
"uploads/map/buildings"
|
15
|
+
end
|
16
|
+
|
17
|
+
def filename
|
18
|
+
if original_filename
|
19
|
+
"img_#{secure_token(4)}.#{file.extension}"
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
protected
|
24
|
+
def secure_token(length=16)
|
25
|
+
var = :"@#{mounted_as}_secure_token"
|
26
|
+
model.instance_variable_get(var) or model.instance_variable_set(var, SecureRandom.hex(length/2))
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
module C80MapFloors
|
2
|
+
|
3
|
+
# TODO:: FloorImageUploader класс должен использоваться только для загрузки img_bg [потому что 78aasq]
|
4
|
+
|
5
|
+
class FloorImageUploader < CarrierWave::Uploader::Base
|
6
|
+
|
7
|
+
include CarrierWave::MiniMagick
|
8
|
+
|
9
|
+
storage :file
|
10
|
+
|
11
|
+
version :thumb do
|
12
|
+
process :resize_to_fit => [500,500]
|
13
|
+
end
|
14
|
+
|
15
|
+
def store_dir
|
16
|
+
"uploads/map/floors"
|
17
|
+
end
|
18
|
+
|
19
|
+
def filename
|
20
|
+
if original_filename
|
21
|
+
"floor_#{secure_token(4)}.#{file.extension}"
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
protected
|
26
|
+
def secure_token(length=16)
|
27
|
+
var = :"@#{mounted_as}_secure_token"
|
28
|
+
model.instance_variable_get(var) or model.instance_variable_set(var, SecureRandom.hex(length/2))
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
module C80MapFloors
|
2
|
+
|
3
|
+
class MapImageUploader < CarrierWave::Uploader::Base
|
4
|
+
|
5
|
+
include CarrierWave::MiniMagick
|
6
|
+
|
7
|
+
storage :file
|
8
|
+
|
9
|
+
version :thumb do
|
10
|
+
process :resize_to_fit => [500,500]
|
11
|
+
end
|
12
|
+
|
13
|
+
def store_dir
|
14
|
+
"uploads/map/"
|
15
|
+
end
|
16
|
+
|
17
|
+
def filename
|
18
|
+
if original_filename
|
19
|
+
"map_#{secure_token(4)}.#{file.extension}"
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
protected
|
24
|
+
def secure_token(length=16)
|
25
|
+
var = :"@#{mounted_as}_secure_token"
|
26
|
+
model.instance_variable_get(var) or model.instance_variable_set(var, SecureRandom.hex(length/2))
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
<script>
|
2
|
+
var LOCS_HASH = <%= locs_hash.to_json.html_safe %>;
|
3
|
+
var MAP_WIDTH = <%= mapwidth %>;
|
4
|
+
var MAP_HEIGHT = <%= mapheight %>;
|
5
|
+
</script>
|
6
|
+
|
7
|
+
<!--<div class="container" id="container_left_side">
|
8
|
+
<div id="left_side">
|
9
|
+
<div class="clearfix"><span id="pbrown">ПЛОЩАДИ от</span></div>
|
10
|
+
<span id="pnavy"><%# @spro.header_price %></span>
|
11
|
+
<span id="pdark">руб/кв.м.</span>
|
12
|
+
</div>
|
13
|
+
<div id="right_side">
|
14
|
+
<p id="ptele"><%# @spro.address_telephone_1 %></p>
|
15
|
+
<p id="paddress"><%# @spro.address_locality %>
|
16
|
+
<%# @spro.address_street %></p>
|
17
|
+
</div>
|
18
|
+
</div>-->
|
19
|
+
|
20
|
+
<div id="map_wrapper">
|
21
|
+
<%= render "c80_map_floors/shared/save_preloader" %>
|
22
|
+
<%= render "c80_map_floors/shared/modal_window" %>
|
23
|
+
<div class="mcontainer">
|
24
|
+
<div class="mmap">
|
25
|
+
<div class="layers"></div>
|
26
|
+
<div id="masked" style="-webkit-clip-path:polygon(0 0, 0 1px)"></div>
|
27
|
+
<svg id='svg' xmlns="http://www.w3.org/2000/svg" version="1.2" viewbox='0 0 <%= mapwidth %> <%=mapheight%>' baseProfile="tiny" preserveAspectRatio="xMaxYMax"></svg>
|
28
|
+
<div class="overlay_layers"></div>
|
29
|
+
<svg id='svg_overlay' xmlns="http://www.w3.org/2000/svg" version="1.2" viewbox='0 0 <%= mapwidth %> <%=mapheight%>' baseProfile="tiny" preserveAspectRatio="xMaxYMax"></svg>
|
30
|
+
</div>
|
31
|
+
<div class="container" id="ui">
|
32
|
+
<%= render "c80_map_floors/shared/map_row/building_info" %>
|
33
|
+
<%# render "layouts/shared/map_row/area_order_button" %>
|
34
|
+
</div>
|
35
|
+
<div class="container" id="container_buttons">
|
36
|
+
<div class="mzoom_buttons"></div>
|
37
|
+
<div class="status_bar"></div>
|
38
|
+
</div>
|
39
|
+
</div>
|
40
|
+
</div>
|
@@ -0,0 +1,36 @@
|
|
1
|
+
<%# особым пользователям разрешает редактировать %>
|
2
|
+
<% if current_admin_user.present? %>
|
3
|
+
//console.log("<js.erb>");
|
4
|
+
|
5
|
+
var $btn_layer = $("<%= params[:div_css_selector] %>");
|
6
|
+
var $html = $('<a href="#" class="mapplic-edit-button"></a>');
|
7
|
+
$btn_layer.append($html);
|
8
|
+
|
9
|
+
$html = $('<a href="#" class="mapplic-remove-button mapplic-disabled" data-placement="right" data-toggle="tooltip" title="Удалить полигон"></a>');
|
10
|
+
$btn_layer.prepend($html);
|
11
|
+
|
12
|
+
$html = $('<a href="#" class="mapplic-new-button mapplic-disabled" data-placement="right" data-toggle="tooltip" title="Добавить полигон"></a>');
|
13
|
+
$btn_layer.prepend($html);
|
14
|
+
|
15
|
+
$html = $('<a href="#" class="mapplic-building-link-button" data-placement="right" data-toggle="tooltip" title="Назначить Здание"></a>');
|
16
|
+
$btn_layer.prepend($html);
|
17
|
+
|
18
|
+
$html = $('<a href="#" class="mapplic-save-button mapplic-disabled" data-placement="right" data-toggle="tooltip" title="Сохранить изменения"></a>');
|
19
|
+
$btn_layer.prepend($html);
|
20
|
+
|
21
|
+
$html = $('<a href="#" class="mapplic-area-link-button" data-placement="right" data-toggle="tooltip" title="Назначить Площадь"></a>');
|
22
|
+
$btn_layer.prepend($html);
|
23
|
+
|
24
|
+
var $status_layer = $('.status_bar');
|
25
|
+
$html = $("<%= j render 'c80_map_floors/ajax/shared/map_creating' %>");
|
26
|
+
$status_layer.append($html);
|
27
|
+
|
28
|
+
$html = $("<%= j render 'c80_map_floors/ajax/shared/map_editing' %>");
|
29
|
+
$status_layer.append($html);
|
30
|
+
|
31
|
+
$html = $("<%= j render 'c80_map_floors/ajax/shared/map_removing' %>");
|
32
|
+
$status_layer.append($html);
|
33
|
+
|
34
|
+
IS_ADMIN = true;
|
35
|
+
|
36
|
+
<% end %>
|
@@ -0,0 +1,6 @@
|
|
1
|
+
<%# статус-блок, который виден, когда находимся в режиме рисования полигона %>
|
2
|
+
<div id="map_creating" class="status_block">
|
3
|
+
<span class="message">Рисование полигона в процессе</span>
|
4
|
+
<a href="#" title="Отменить" id="cancelCreating">Отменить (Esc)</a>
|
5
|
+
<a href="#" title="Добавить вершину" id="completeCreating">Завершить (Enter)</a>
|
6
|
+
</div>
|
@@ -0,0 +1,5 @@
|
|
1
|
+
<%# статус-блок, который виден, когда находимся в режиме удаления полигонов %>
|
2
|
+
<div id="map_removing" class="status_block">
|
3
|
+
<span class="message">Кликните по полигону, который надо удалить</span>
|
4
|
+
<a href="#" title="Отменить" id="cancelRemoving">Завершить</a>
|
5
|
+
</div>
|
@@ -0,0 +1,6 @@
|
|
1
|
+
<select id="unlinked_areas" class="selectpicker" data-style="btn-default">
|
2
|
+
<% areas.each do |area|%>
|
3
|
+
<option value="<%= area.id%>"><%= area.title %></option>
|
4
|
+
<% end %>
|
5
|
+
</select>
|
6
|
+
<button type="button" id='submit_area_link' class="btn btn-primary">Сохранить</button>
|
@@ -0,0 +1,10 @@
|
|
1
|
+
<select id="unlinked_buildings" class="selectpicker" data-style="btn-default">
|
2
|
+
<% buildings.each do |building| %>
|
3
|
+
<% tt = building.title %>
|
4
|
+
<% if building.map_buildings.count > 0 %>
|
5
|
+
<% tt += ' (полигон назначен)' %>
|
6
|
+
<% end %>
|
7
|
+
<option value="<%= building.id%>"><%= tt %></option>
|
8
|
+
<% end %>
|
9
|
+
</select>
|
10
|
+
<button type="button" id='submit_building_link' class="btn btn-primary">Сохранить</button>
|
@@ -0,0 +1,28 @@
|
|
1
|
+
<%= link_to 'Показать modal window',
|
2
|
+
'#modal_window',
|
3
|
+
:data => {
|
4
|
+
:toggle => 'modal'
|
5
|
+
},
|
6
|
+
:class => 'hidden2 show_modal_window',
|
7
|
+
:title => 'Показать modal window'
|
8
|
+
%>
|
9
|
+
|
10
|
+
<div class="modal fade" id="modal_window" tabindex="-1" role="dialog" aria-labelledby="modalShowWindow" aria-hidden="true">
|
11
|
+
<div class="modal-dialog">
|
12
|
+
<div class="modal-content">
|
13
|
+
|
14
|
+
<div class="modal-header">
|
15
|
+
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
|
16
|
+
<h4 class="modal-title" id="myModalLabel">%modal-title%</h4>
|
17
|
+
</div>
|
18
|
+
|
19
|
+
<div class="modal-body">
|
20
|
+
%modal-body%
|
21
|
+
</div>
|
22
|
+
|
23
|
+
<div class="modal-footer">
|
24
|
+
<button type="button" class="btn btn-default" data-dismiss="modal">Закрыть</button>
|
25
|
+
</div>
|
26
|
+
</div>
|
27
|
+
</div>
|
28
|
+
</div>
|
@@ -0,0 +1,17 @@
|
|
1
|
+
<div class="building_info">
|
2
|
+
<h2></h2>
|
3
|
+
<ul> <%# idишники элементов списка - имена полей таблицы Rent::Building %>
|
4
|
+
<li id="square">Общая площадь: <span></span> м кв.</li>
|
5
|
+
<li id="free_square">Свободная площадь: <span></span> м кв.</li>
|
6
|
+
<li id="floor_height">Высота потолка: <span></span></li>
|
7
|
+
<li id="column_step">Шаг колонн: <span></span></li>
|
8
|
+
<li id="gate_type">Тип ворот: <span></span></li>
|
9
|
+
<li id="communications">Коммуникации: <span></span></li>
|
10
|
+
</ul>
|
11
|
+
<h5 id="price"><span></span></h5>
|
12
|
+
<%= link_to "Оставить заявку",
|
13
|
+
"#",
|
14
|
+
:class => 'ebutton c80_order_invoking_btn',
|
15
|
+
:data => { :comment_text => "этот будет заменён ajax Ответом, заполняющим инфо о площади", :subj_id => 'Это число будет подставлено ajax Ответом' },
|
16
|
+
:id => 'area_order_button' %>
|
17
|
+
</div>
|
data/bin/console
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require "bundler/setup"
|
4
|
+
require "c80_map_floors"
|
5
|
+
|
6
|
+
# You can add fixtures and/or initialization code here to make experimenting
|
7
|
+
# with your gem easier. You can also use a different console, if you like.
|
8
|
+
|
9
|
+
# (If you use this, don't forget to add pry to your Gemfile!)
|
10
|
+
# require "pry"
|
11
|
+
# Pry.start
|
12
|
+
|
13
|
+
require "irb"
|
14
|
+
IRB.start
|
data/bin/setup
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'c80_map_floors/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = "c80_map_floors"
|
8
|
+
spec.version = C80MapFloors::VERSION
|
9
|
+
spec.authors = ["C80609A"]
|
10
|
+
spec.email = ["c080609a@gmail.com"]
|
11
|
+
|
12
|
+
spec.summary = 'Map'
|
13
|
+
spec.description = 'Map + map editor'
|
14
|
+
spec.homepage = 'http://www.vorsa-park.ru'
|
15
|
+
spec.license = "MIT"
|
16
|
+
|
17
|
+
spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
|
18
|
+
spec.bindir = "exe"
|
19
|
+
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
20
|
+
spec.require_paths = ["lib"]
|
21
|
+
|
22
|
+
spec.add_development_dependency "bundler", "~> 1.9"
|
23
|
+
spec.add_development_dependency "rake", "~> 10.0"
|
24
|
+
spec.add_dependency 'activesupport', ['>= 3.0.0']
|
25
|
+
spec.add_dependency 'bootstrap-sass', '~> 3.3.4'
|
26
|
+
spec.add_dependency 'bootstrap-select-rails'
|
27
|
+
spec.add_dependency 'historyjs-rails'
|
28
|
+
end
|
data/config/routes.rb
ADDED