c80_map 0.1.0
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 +7 -0
- data/.gitignore +10 -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 +51 -0
- data/Rakefile +1 -0
- data/app/admin/c80_map/settings.rb +32 -0
- data/app/assets/javascripts/buttons/admin_buttons/button_back_to_map.js +48 -0
- data/app/assets/javascripts/buttons/admin_buttons/button_cancel_create.js +21 -0
- data/app/assets/javascripts/buttons/admin_buttons/button_complete_create.js +22 -0
- data/app/assets/javascripts/buttons/admin_buttons/button_edit.js +80 -0
- data/app/assets/javascripts/buttons/admin_buttons/button_new.js +46 -0
- data/app/assets/javascripts/buttons/admin_buttons/button_save.js +83 -0
- data/app/assets/javascripts/buttons/zoom_buttons.js +61 -0
- data/app/assets/javascripts/c80_map.js.coffee +11 -0
- data/app/assets/javascripts/events/app_event.js +15 -0
- data/app/assets/javascripts/map_objects/area.js +221 -0
- data/app/assets/javascripts/map_objects/building.js +309 -0
- data/app/assets/javascripts/map_objects/dot.js +14 -0
- data/app/assets/javascripts/src/main.js +992 -0
- data/app/assets/javascripts/src/state_controller.js +220 -0
- data/app/assets/javascripts/src/utils.js +127 -0
- data/app/assets/javascripts/svg_elements/helper.js +36 -0
- data/app/assets/javascripts/svg_elements/polygon.js +192 -0
- data/app/assets/javascripts/view/save_preloader.js +30 -0
- data/app/assets/stylesheets/c80_map.scss +2 -0
- data/app/assets/stylesheets/map.scss +1435 -0
- data/app/assets/stylesheets/view/save_preloader.scss +206 -0
- data/app/controllers/c80_map/application_controller.rb +6 -0
- data/app/controllers/c80_map/map_ajax_controller.rb +54 -0
- data/app/helpers/c80_map/application_helper.rb +33 -0
- data/app/models/c80_map/area.rb +5 -0
- data/app/models/c80_map/building.rb +73 -0
- data/app/models/c80_map/setting.rb +30 -0
- data/app/uploaders/c80_map/map_image_uploader.rb +31 -0
- data/app/views/c80_map/_map_row.html.erb +15 -0
- data/app/views/c80_map/_map_row_index.html.erb +39 -0
- data/app/views/c80_map/shared/_save_preloader.html.erb +3 -0
- data/bin/console +14 -0
- data/bin/setup +7 -0
- data/c80_map.gemspec +25 -0
- data/config/routes.rb +3 -0
- data/db/migrate/20160617130000_create_c80_map_settings.rb +8 -0
- data/db/migrate/20160620040202_create_c80_map_areas.rb +9 -0
- data/db/migrate/20160620040204_create_c80_map_buildings.rb +8 -0
- data/db/seeds/801_fill_map_settings.rb +6 -0
- data/lib/c80_map/engine.rb +23 -0
- data/lib/c80_map/version.rb +3 -0
- data/lib/c80_map.rb +8 -0
- metadata +136 -0
| @@ -0,0 +1,206 @@ | |
| 1 | 
            +
            div#savePreloader {
         | 
| 2 | 
            +
              position: absolute;
         | 
| 3 | 
            +
              z-index: 100000;
         | 
| 4 | 
            +
              top: 0;
         | 
| 5 | 
            +
              left: 0;
         | 
| 6 | 
            +
              bottom: 0;
         | 
| 7 | 
            +
              right: 0;
         | 
| 8 | 
            +
              background-color: rgba(0, 0, 0, .01);
         | 
| 9 | 
            +
              display: none;
         | 
| 10 | 
            +
              opacity: 0;
         | 
| 11 | 
            +
              text-align: center;         /*!*/
         | 
| 12 | 
            +
              white-space: nowrap;        /*!*/
         | 
| 13 | 
            +
             | 
| 14 | 
            +
              transition: all 0.4s ease-in-out;
         | 
| 15 | 
            +
              -webkit-transition: all 0.4s ease-in-out;
         | 
| 16 | 
            +
              -moz-transition: all 0.4s ease-in-out;
         | 
| 17 | 
            +
              -ms-transition: all 0.4s ease-in-out;
         | 
| 18 | 
            +
              -o-transition: all 0.4s ease-in-out;
         | 
| 19 | 
            +
             | 
| 20 | 
            +
              &.shown {
         | 
| 21 | 
            +
                background-color: rgba(0, 0, 0, .4);
         | 
| 22 | 
            +
                opacity: 1;
         | 
| 23 | 
            +
              }
         | 
| 24 | 
            +
             | 
| 25 | 
            +
              span.helper {
         | 
| 26 | 
            +
                display: inline-block;      /*!*/
         | 
| 27 | 
            +
                vertical-align: middle;     /*!*/
         | 
| 28 | 
            +
                height: 100%;               /*!*/
         | 
| 29 | 
            +
              }
         | 
| 30 | 
            +
             | 
| 31 | 
            +
              .uil-ring-css {
         | 
| 32 | 
            +
                background: none;
         | 
| 33 | 
            +
                position: relative;
         | 
| 34 | 
            +
                width: 200px;
         | 
| 35 | 
            +
                height: 200px;
         | 
| 36 | 
            +
                vertical-align: middle;     /*!*/
         | 
| 37 | 
            +
                display: inline-block;
         | 
| 38 | 
            +
                transform:scale(0.5);
         | 
| 39 | 
            +
             | 
| 40 | 
            +
                > div {
         | 
| 41 | 
            +
                  position: absolute;
         | 
| 42 | 
            +
                  display: block;
         | 
| 43 | 
            +
                  width: 160px;
         | 
| 44 | 
            +
                  height: 160px;
         | 
| 45 | 
            +
                  top: 20px;
         | 
| 46 | 
            +
                  left: 20px;
         | 
| 47 | 
            +
                  border-radius: 80px;
         | 
| 48 | 
            +
                  box-shadow: 0 6px 0 0 #59ebff;
         | 
| 49 | 
            +
                  -ms-animation: uil-ring-anim 1s linear infinite;
         | 
| 50 | 
            +
                  -moz-animation: uil-ring-anim 1s linear infinite;
         | 
| 51 | 
            +
                  -webkit-animation: uil-ring-anim 1s linear infinite;
         | 
| 52 | 
            +
                  -o-animation: uil-ring-anim 1s linear infinite;
         | 
| 53 | 
            +
                  animation: uil-ring-anim 1s linear infinite;
         | 
| 54 | 
            +
                }
         | 
| 55 | 
            +
             | 
| 56 | 
            +
                &:before {
         | 
| 57 | 
            +
                  display:block;
         | 
| 58 | 
            +
                  position: absolute;
         | 
| 59 | 
            +
                  top:0;
         | 
| 60 | 
            +
                  left:0;
         | 
| 61 | 
            +
                  bottom:0;
         | 
| 62 | 
            +
                  right:0;
         | 
| 63 | 
            +
                  content: 'wait';
         | 
| 64 | 
            +
                  font-size:26px;
         | 
| 65 | 
            +
                  color: white;
         | 
| 66 | 
            +
                  margin-top: 80px;
         | 
| 67 | 
            +
                }
         | 
| 68 | 
            +
              }
         | 
| 69 | 
            +
             | 
| 70 | 
            +
            }
         | 
| 71 | 
            +
             | 
| 72 | 
            +
            @-webkit-keyframes uil-ring-anim {
         | 
| 73 | 
            +
              0% {
         | 
| 74 | 
            +
                -ms-transform: rotate(0deg);
         | 
| 75 | 
            +
                -moz-transform: rotate(0deg);
         | 
| 76 | 
            +
                -webkit-transform: rotate(0deg);
         | 
| 77 | 
            +
                -o-transform: rotate(0deg);
         | 
| 78 | 
            +
                transform: rotate(0deg);
         | 
| 79 | 
            +
              }
         | 
| 80 | 
            +
              100% {
         | 
| 81 | 
            +
                -ms-transform: rotate(360deg);
         | 
| 82 | 
            +
                -moz-transform: rotate(360deg);
         | 
| 83 | 
            +
                -webkit-transform: rotate(360deg);
         | 
| 84 | 
            +
                -o-transform: rotate(360deg);
         | 
| 85 | 
            +
                transform: rotate(360deg);
         | 
| 86 | 
            +
              }
         | 
| 87 | 
            +
            }
         | 
| 88 | 
            +
             | 
| 89 | 
            +
            @-webkit-keyframes uil-ring-anim {
         | 
| 90 | 
            +
              0% {
         | 
| 91 | 
            +
                -ms-transform: rotate(0deg);
         | 
| 92 | 
            +
                -moz-transform: rotate(0deg);
         | 
| 93 | 
            +
                -webkit-transform: rotate(0deg);
         | 
| 94 | 
            +
                -o-transform: rotate(0deg);
         | 
| 95 | 
            +
                transform: rotate(0deg);
         | 
| 96 | 
            +
              }
         | 
| 97 | 
            +
              100% {
         | 
| 98 | 
            +
                -ms-transform: rotate(360deg);
         | 
| 99 | 
            +
                -moz-transform: rotate(360deg);
         | 
| 100 | 
            +
                -webkit-transform: rotate(360deg);
         | 
| 101 | 
            +
                -o-transform: rotate(360deg);
         | 
| 102 | 
            +
                transform: rotate(360deg);
         | 
| 103 | 
            +
              }
         | 
| 104 | 
            +
            }
         | 
| 105 | 
            +
             | 
| 106 | 
            +
            @-moz-keyframes uil-ring-anim {
         | 
| 107 | 
            +
              0% {
         | 
| 108 | 
            +
                -ms-transform: rotate(0deg);
         | 
| 109 | 
            +
                -moz-transform: rotate(0deg);
         | 
| 110 | 
            +
                -webkit-transform: rotate(0deg);
         | 
| 111 | 
            +
                -o-transform: rotate(0deg);
         | 
| 112 | 
            +
                transform: rotate(0deg);
         | 
| 113 | 
            +
              }
         | 
| 114 | 
            +
              100% {
         | 
| 115 | 
            +
                -ms-transform: rotate(360deg);
         | 
| 116 | 
            +
                -moz-transform: rotate(360deg);
         | 
| 117 | 
            +
                -webkit-transform: rotate(360deg);
         | 
| 118 | 
            +
                -o-transform: rotate(360deg);
         | 
| 119 | 
            +
                transform: rotate(360deg);
         | 
| 120 | 
            +
              }
         | 
| 121 | 
            +
            }
         | 
| 122 | 
            +
             | 
| 123 | 
            +
            @-ms-keyframes uil-ring-anim {
         | 
| 124 | 
            +
              0% {
         | 
| 125 | 
            +
                -ms-transform: rotate(0deg);
         | 
| 126 | 
            +
                -moz-transform: rotate(0deg);
         | 
| 127 | 
            +
                -webkit-transform: rotate(0deg);
         | 
| 128 | 
            +
                -o-transform: rotate(0deg);
         | 
| 129 | 
            +
                transform: rotate(0deg);
         | 
| 130 | 
            +
              }
         | 
| 131 | 
            +
              100% {
         | 
| 132 | 
            +
                -ms-transform: rotate(360deg);
         | 
| 133 | 
            +
                -moz-transform: rotate(360deg);
         | 
| 134 | 
            +
                -webkit-transform: rotate(360deg);
         | 
| 135 | 
            +
                -o-transform: rotate(360deg);
         | 
| 136 | 
            +
                transform: rotate(360deg);
         | 
| 137 | 
            +
              }
         | 
| 138 | 
            +
            }
         | 
| 139 | 
            +
             | 
| 140 | 
            +
            @-moz-keyframes uil-ring-anim {
         | 
| 141 | 
            +
              0% {
         | 
| 142 | 
            +
                -ms-transform: rotate(0deg);
         | 
| 143 | 
            +
                -moz-transform: rotate(0deg);
         | 
| 144 | 
            +
                -webkit-transform: rotate(0deg);
         | 
| 145 | 
            +
                -o-transform: rotate(0deg);
         | 
| 146 | 
            +
                transform: rotate(0deg);
         | 
| 147 | 
            +
              }
         | 
| 148 | 
            +
              100% {
         | 
| 149 | 
            +
                -ms-transform: rotate(360deg);
         | 
| 150 | 
            +
                -moz-transform: rotate(360deg);
         | 
| 151 | 
            +
                -webkit-transform: rotate(360deg);
         | 
| 152 | 
            +
                -o-transform: rotate(360deg);
         | 
| 153 | 
            +
                transform: rotate(360deg);
         | 
| 154 | 
            +
              }
         | 
| 155 | 
            +
            }
         | 
| 156 | 
            +
             | 
| 157 | 
            +
            @-webkit-keyframes uil-ring-anim {
         | 
| 158 | 
            +
              0% {
         | 
| 159 | 
            +
                -ms-transform: rotate(0deg);
         | 
| 160 | 
            +
                -moz-transform: rotate(0deg);
         | 
| 161 | 
            +
                -webkit-transform: rotate(0deg);
         | 
| 162 | 
            +
                -o-transform: rotate(0deg);
         | 
| 163 | 
            +
                transform: rotate(0deg);
         | 
| 164 | 
            +
              }
         | 
| 165 | 
            +
              100% {
         | 
| 166 | 
            +
                -ms-transform: rotate(360deg);
         | 
| 167 | 
            +
                -moz-transform: rotate(360deg);
         | 
| 168 | 
            +
                -webkit-transform: rotate(360deg);
         | 
| 169 | 
            +
                -o-transform: rotate(360deg);
         | 
| 170 | 
            +
                transform: rotate(360deg);
         | 
| 171 | 
            +
              }
         | 
| 172 | 
            +
            }
         | 
| 173 | 
            +
             | 
| 174 | 
            +
            @-o-keyframes uil-ring-anim {
         | 
| 175 | 
            +
              0% {
         | 
| 176 | 
            +
                -ms-transform: rotate(0deg);
         | 
| 177 | 
            +
                -moz-transform: rotate(0deg);
         | 
| 178 | 
            +
                -webkit-transform: rotate(0deg);
         | 
| 179 | 
            +
                -o-transform: rotate(0deg);
         | 
| 180 | 
            +
                transform: rotate(0deg);
         | 
| 181 | 
            +
              }
         | 
| 182 | 
            +
              100% {
         | 
| 183 | 
            +
                -ms-transform: rotate(360deg);
         | 
| 184 | 
            +
                -moz-transform: rotate(360deg);
         | 
| 185 | 
            +
                -webkit-transform: rotate(360deg);
         | 
| 186 | 
            +
                -o-transform: rotate(360deg);
         | 
| 187 | 
            +
                transform: rotate(360deg);
         | 
| 188 | 
            +
              }
         | 
| 189 | 
            +
            }
         | 
| 190 | 
            +
             | 
| 191 | 
            +
            @keyframes uil-ring-anim {
         | 
| 192 | 
            +
              0% {
         | 
| 193 | 
            +
                -ms-transform: rotate(0deg);
         | 
| 194 | 
            +
                -moz-transform: rotate(0deg);
         | 
| 195 | 
            +
                -webkit-transform: rotate(0deg);
         | 
| 196 | 
            +
                -o-transform: rotate(0deg);
         | 
| 197 | 
            +
                transform: rotate(0deg);
         | 
| 198 | 
            +
              }
         | 
| 199 | 
            +
              100% {
         | 
| 200 | 
            +
                -ms-transform: rotate(360deg);
         | 
| 201 | 
            +
                -moz-transform: rotate(360deg);
         | 
| 202 | 
            +
                -webkit-transform: rotate(360deg);
         | 
| 203 | 
            +
                -o-transform: rotate(360deg);
         | 
| 204 | 
            +
                transform: rotate(360deg);
         | 
| 205 | 
            +
              }
         | 
| 206 | 
            +
            }
         | 
| @@ -0,0 +1,54 @@ | |
| 1 | 
            +
            module C80Map
         | 
| 2 | 
            +
              class MapAjaxController < ApplicationController
         | 
| 3 | 
            +
             | 
| 4 | 
            +
                def save_map_data
         | 
| 5 | 
            +
                  puts "<MapAjaxController.save_map_data> #{params[:buildings]}"
         | 
| 6 | 
            +
             | 
| 7 | 
            +
                  #{ "buildings"=>{"0"=>{"coords"=>["2496.5894495412845",...]}} }
         | 
| 8 | 
            +
                  #{ "areas"=>{"0"=>{"coords"=>["2496.5894495412845",...]}} }
         | 
| 9 | 
            +
             | 
| 10 | 
            +
                  result = {
         | 
| 11 | 
            +
                      areas: [],
         | 
| 12 | 
            +
                      buildings: [],
         | 
| 13 | 
            +
                      updated_locations_json: nil
         | 
| 14 | 
            +
                  }
         | 
| 15 | 
            +
             | 
| 16 | 
            +
                  if params[:buildings].present?
         | 
| 17 | 
            +
                    params[:buildings].each_key do |key|
         | 
| 18 | 
            +
                      new_building_options = params[:buildings][key]
         | 
| 19 | 
            +
                      puts "<MapAjaxController.save_map_data> new_building_options = #{new_building_options}"
         | 
| 20 | 
            +
                      puts "<MapAjaxController.save_map_data> new_building_options[:coords] = #{new_building_options[:coords]}"
         | 
| 21 | 
            +
                      b = Building.new({ coords: new_building_options[:coords].join(',') })
         | 
| 22 | 
            +
             | 
| 23 | 
            +
                      # в случае успеха - вернём id созданного здания,
         | 
| 24 | 
            +
                      # тогда js обновит id и перенесёт здание из массива "новые здания" (drawn_buildings).
         | 
| 25 | 
            +
                      # в случае неудачи - вернём описание ошибки
         | 
| 26 | 
            +
                      # завершаем всё обновленным locations.json, который Map возьмёт
         | 
| 27 | 
            +
                      # и положит в data
         | 
| 28 | 
            +
             | 
| 29 | 
            +
                      if b.valid?
         | 
| 30 | 
            +
                        b.save
         | 
| 31 | 
            +
                        result[:buildings] << { id: b.id }
         | 
| 32 | 
            +
                      else
         | 
| 33 | 
            +
                        result[:buildings] << { id: new_building_options.id, status: 'error' }
         | 
| 34 | 
            +
                      end
         | 
| 35 | 
            +
                    end
         | 
| 36 | 
            +
                  end
         | 
| 37 | 
            +
             | 
| 38 | 
            +
                  # if params[:areas].present?
         | 
| 39 | 
            +
                  #   params[:areas].each_with_key do |new_area_options,key|
         | 
| 40 | 
            +
                      #
         | 
| 41 | 
            +
                      # if b.present?
         | 
| 42 | 
            +
                      #
         | 
| 43 | 
            +
                      # end
         | 
| 44 | 
            +
                    # end
         | 
| 45 | 
            +
                  # end
         | 
| 46 | 
            +
                  puts "<MapAjaxController.save_map_data> result = #{result.to_json}"
         | 
| 47 | 
            +
             | 
| 48 | 
            +
                  respond_to do |format|
         | 
| 49 | 
            +
                    format.json { render json: params }
         | 
| 50 | 
            +
                  end
         | 
| 51 | 
            +
                end
         | 
| 52 | 
            +
             | 
| 53 | 
            +
              end
         | 
| 54 | 
            +
            end
         | 
| @@ -0,0 +1,33 @@ | |
| 1 | 
            +
            module C80Map
         | 
| 2 | 
            +
              module ApplicationHelper
         | 
| 3 | 
            +
             | 
| 4 | 
            +
                def render_map(page_tag)
         | 
| 5 | 
            +
                  if page_tag == 'index'
         | 
| 6 | 
            +
             | 
| 7 | 
            +
             | 
| 8 | 
            +
                    # map_settings = C80Map::Setting.first
         | 
| 9 | 
            +
             | 
| 10 | 
            +
             | 
| 11 | 
            +
                    # т.к. в json попадают строки вида
         | 
| 12 | 
            +
                    # /home/scout/git/bitbucket/vorsa/public/uploads/map/map.jpg
         | 
| 13 | 
            +
                    # извлечём эту строку, затем во вью обработаем её image_path
         | 
| 14 | 
            +
             | 
| 15 | 
            +
                    p = Rails.root.join("public", "locations.json")
         | 
| 16 | 
            +
                    locs = File.read(p)
         | 
| 17 | 
            +
                    locs_hash = JSON.parse(locs)
         | 
| 18 | 
            +
                    locs_hash["img"] = image_path(locs_hash["img"])
         | 
| 19 | 
            +
             | 
| 20 | 
            +
                    render :partial => 'c80_map/map_row_index',
         | 
| 21 | 
            +
                           :locals => {
         | 
| 22 | 
            +
                                locs_hash: locs_hash,
         | 
| 23 | 
            +
                                mapwidth:locs_hash["mapwidth"],
         | 
| 24 | 
            +
                                mapheight:locs_hash["mapheight"]
         | 
| 25 | 
            +
                           }
         | 
| 26 | 
            +
             | 
| 27 | 
            +
                  else
         | 
| 28 | 
            +
                    render :partial => 'c80_map/map_row'
         | 
| 29 | 
            +
                  end
         | 
| 30 | 
            +
                end
         | 
| 31 | 
            +
             | 
| 32 | 
            +
              end
         | 
| 33 | 
            +
            end
         | 
| @@ -0,0 +1,73 @@ | |
| 1 | 
            +
            module C80Map
         | 
| 2 | 
            +
              class Building < ActiveRecord::Base
         | 
| 3 | 
            +
                has_many :areas, :class_name => 'C80Map::Area', :dependent => :destroy
         | 
| 4 | 
            +
                validates :coords, uniqueness: true
         | 
| 5 | 
            +
                after_save :update_json
         | 
| 6 | 
            +
             | 
| 7 | 
            +
                private
         | 
| 8 | 
            +
             | 
| 9 | 
            +
                def update_json
         | 
| 10 | 
            +
             | 
| 11 | 
            +
                  locations_path = Rails.root.join("public", "locations.json")
         | 
| 12 | 
            +
                  locs = File.read(locations_path)
         | 
| 13 | 
            +
                  puts "<update_json> #{ Rails.root.join("public", "locations.json") }"
         | 
| 14 | 
            +
             | 
| 15 | 
            +
                  locs_hash = JSON.parse(locs)
         | 
| 16 | 
            +
             | 
| 17 | 
            +
             | 
| 18 | 
            +
                  # и заполняем объектами из собранного массива
         | 
| 19 | 
            +
             | 
| 20 | 
            +
                  # обходим все Building и составляем массив вида
         | 
| 21 | 
            +
                  # [{id, object_type=object_type, coords, building_hash, img, childs:[<areas>]},..]
         | 
| 22 | 
            +
                  buildings_to_location_json = []
         | 
| 23 | 
            +
                  Building.all.each do |b|
         | 
| 24 | 
            +
                    ob = {
         | 
| 25 | 
            +
                        id: b.id,
         | 
| 26 | 
            +
                        object_type: 'building',
         | 
| 27 | 
            +
                        coords: b.coords,
         | 
| 28 | 
            +
                        building_hash: {
         | 
| 29 | 
            +
                            id: 2,
         | 
| 30 | 
            +
                            title: "Здание 2",
         | 
| 31 | 
            +
                            props: {
         | 
| 32 | 
            +
                                square: "1234 кв.м.",
         | 
| 33 | 
            +
                                square_free: "124 кв. м",
         | 
| 34 | 
            +
                                floor_height: "6 кв. м",
         | 
| 35 | 
            +
                                column_step: "2 м",
         | 
| 36 | 
            +
                                gate_type: "рaспашные",
         | 
| 37 | 
            +
                                communications: "Интернет, электричество, водоснабжение",
         | 
| 38 | 
            +
                                price: "от 155 руб/кв.м в месяц"
         | 
| 39 | 
            +
                            }
         | 
| 40 | 
            +
                        },
         | 
| 41 | 
            +
                        img: {
         | 
| 42 | 
            +
                            bg: {
         | 
| 43 | 
            +
                                src: "/assets/sample_bg-e36f4b42acde72d4ff05376498e5834423165d43e73650dd24a342ecb20779b9.gif"
         | 
| 44 | 
            +
                            },
         | 
| 45 | 
            +
                            overlay: {
         | 
| 46 | 
            +
                                src: "/assets/sample_overlay-f99419a8904207a6ac74288bccac16c76b388b7162bf2629a2a8dd825746f49b.gif"
         | 
| 47 | 
            +
                            }
         | 
| 48 | 
            +
                        },
         | 
| 49 | 
            +
                        childs: []
         | 
| 50 | 
            +
                    }
         | 
| 51 | 
            +
                    buildings_to_location_json << ob
         | 
| 52 | 
            +
                  end
         | 
| 53 | 
            +
             | 
| 54 | 
            +
                  # после чего удаляем из locs_hash все object_type=building
         | 
| 55 | 
            +
                  # locs_hash["childs"].each do |child|
         | 
| 56 | 
            +
                  #   if child["object_type"] == 'building'
         | 
| 57 | 
            +
                  #     delete locs_hash["childs"]
         | 
| 58 | 
            +
                  #   end
         | 
| 59 | 
            +
                  # end
         | 
| 60 | 
            +
             | 
| 61 | 
            +
                  # просто заменяем всех детей
         | 
| 62 | 
            +
                  locs_hash["childs"] = buildings_to_location_json
         | 
| 63 | 
            +
             | 
| 64 | 
            +
                  puts "<Building.update_json> #{locs_hash}"
         | 
| 65 | 
            +
             | 
| 66 | 
            +
                  # File.open(locations_path, 'w') do |f|
         | 
| 67 | 
            +
                  #   f.write(locs_hash.to_json)
         | 
| 68 | 
            +
                  # end
         | 
| 69 | 
            +
             | 
| 70 | 
            +
                end
         | 
| 71 | 
            +
             | 
| 72 | 
            +
              end
         | 
| 73 | 
            +
            end
         | 
| @@ -0,0 +1,30 @@ | |
| 1 | 
            +
            module C80Map
         | 
| 2 | 
            +
              class Setting < ActiveRecord::Base
         | 
| 3 | 
            +
                mount_uploader :map_image, C80Map::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 | 
            +
                  locations_path = Rails.root.join("public", "locations.json")
         | 
| 15 | 
            +
                  locs = File.read(locations_path)
         | 
| 16 | 
            +
                  puts "<update_json> #{ Rails.root.join("public", "locations.json") }"
         | 
| 17 | 
            +
             | 
| 18 | 
            +
                  locs_hash = JSON.parse(locs)
         | 
| 19 | 
            +
                  locs_hash["mapwidth"] = map_img["width"].to_s
         | 
| 20 | 
            +
                  locs_hash["mapheight"] = map_img["height"].to_s
         | 
| 21 | 
            +
                  locs_hash["img"] = map_image.url.to_s
         | 
| 22 | 
            +
             | 
| 23 | 
            +
                  File.open(locations_path,'w') do |f|
         | 
| 24 | 
            +
                    f.write(locs_hash.to_json)
         | 
| 25 | 
            +
                  end
         | 
| 26 | 
            +
             | 
| 27 | 
            +
                end
         | 
| 28 | 
            +
             | 
| 29 | 
            +
              end
         | 
| 30 | 
            +
            end
         | 
| @@ -0,0 +1,31 @@ | |
| 1 | 
            +
            module C80Map
         | 
| 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,15 @@ | |
| 1 | 
            +
            <div class="container-fluid" id="row_under_header">
         | 
| 2 | 
            +
              <div class="container" id="under_header">
         | 
| 3 | 
            +
                <div id="left_side">
         | 
| 4 | 
            +
                  <div class="clearfix"><span id="pbrown">Площади от</span></div>
         | 
| 5 | 
            +
                  <span id="pnavy"><%= @spro.header_price %></span>
         | 
| 6 | 
            +
                  <span id="pdark">рублей/кв.м.</span>
         | 
| 7 | 
            +
                </div>
         | 
| 8 | 
            +
                <div id="right_side">
         | 
| 9 | 
            +
                  <p id="ptele"><%= @spro.address_telephone_1 %></p>
         | 
| 10 | 
            +
                  <p id="paddress"><%= @spro.address_locality %><br>
         | 
| 11 | 
            +
                    <%= @spro.address_street %></p>
         | 
| 12 | 
            +
                </div>
         | 
| 13 | 
            +
             | 
| 14 | 
            +
              </div>
         | 
| 15 | 
            +
            </div>
         | 
| @@ -0,0 +1,39 @@ | |
| 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 %><br>
         | 
| 16 | 
            +
                  <%= @spro.address_street %></p>
         | 
| 17 | 
            +
              </div>
         | 
| 18 | 
            +
            </div>
         | 
| 19 | 
            +
             | 
| 20 | 
            +
            <div id="map_wrapper">
         | 
| 21 | 
            +
              <%= render "c80_map/shared/save_preloader" %>
         | 
| 22 | 
            +
              <div class="mcontainer">
         | 
| 23 | 
            +
                <div class="mmap">
         | 
| 24 | 
            +
                  <div class="layers"></div>
         | 
| 25 | 
            +
                  <div id="masked" style="-webkit-clip-path:polygon(0 0, 0 1px)"></div>
         | 
| 26 | 
            +
                  <svg id='svg' xmlns="http://www.w3.org/2000/svg" version="1.2" viewbox='0 0 <%= mapwidth %> <%=mapheight%>' baseProfile="tiny" preserveAspectRatio="xMaxYMax"></svg>
         | 
| 27 | 
            +
                  <div class="overlay_layers"></div>
         | 
| 28 | 
            +
                  <svg id='svg_overlay' xmlns="http://www.w3.org/2000/svg" version="1.2" viewbox='0 0 <%= mapwidth %> <%=mapheight%>' baseProfile="tiny" preserveAspectRatio="xMaxYMax"></svg>
         | 
| 29 | 
            +
                </div>
         | 
| 30 | 
            +
                <div class="container" id="ui">
         | 
| 31 | 
            +
                  <%= render "layouts/shared/map_row/building_info" %>
         | 
| 32 | 
            +
                  <%= render "layouts/shared/map_row/area_order_button" %>
         | 
| 33 | 
            +
                </div>
         | 
| 34 | 
            +
                <div class="container" id="container_buttons">
         | 
| 35 | 
            +
                  <div class="mzoom_buttons"></div>
         | 
| 36 | 
            +
                  <div class="status_bar"></div>
         | 
| 37 | 
            +
                </div>
         | 
| 38 | 
            +
              </div>
         | 
| 39 | 
            +
            </div>
         | 
    
        data/bin/console
    ADDED
    
    | @@ -0,0 +1,14 @@ | |
| 1 | 
            +
            #!/usr/bin/env ruby
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            require "bundler/setup"
         | 
| 4 | 
            +
            require "c80_map"
         | 
| 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
    
    
    
        data/c80_map.gemspec
    ADDED
    
    | @@ -0,0 +1,25 @@ | |
| 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/version'
         | 
| 5 | 
            +
             | 
| 6 | 
            +
            Gem::Specification.new do |spec|
         | 
| 7 | 
            +
              spec.name          = "c80_map"
         | 
| 8 | 
            +
              spec.version       = C80Map::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 | 
            +
            end
         | 
    
        data/config/routes.rb
    ADDED
    
    
| @@ -0,0 +1,23 @@ | |
| 1 | 
            +
            module C80Map
         | 
| 2 | 
            +
              class Engine < ::Rails::Engine
         | 
| 3 | 
            +
                isolate_namespace C80Map
         | 
| 4 | 
            +
             | 
| 5 | 
            +
                initializer :c80_map do
         | 
| 6 | 
            +
                  if defined?(ActiveAdmin)
         | 
| 7 | 
            +
                    ActiveAdmin.application.load_paths += Dir["#{config.root}/app/models/**/"]
         | 
| 8 | 
            +
                    #ActiveAdmin.application.load_paths += Dir["#{config.root}/app/models/concerns/**/"]
         | 
| 9 | 
            +
                    ActiveAdmin.application.load_paths += Dir["#{config.root}/app/admin/c80_map/**/"]
         | 
| 10 | 
            +
                    # ActiveAdmin.application.load_paths += Dir["#{config.root}/app/jobs/**/"]
         | 
| 11 | 
            +
                  end
         | 
| 12 | 
            +
                end
         | 
| 13 | 
            +
             | 
| 14 | 
            +
                initializer :append_migrations do |app|
         | 
| 15 | 
            +
                  unless app.root.to_s.match root.to_s
         | 
| 16 | 
            +
                    config.paths["db/migrate"].expanded.each do |expanded_path|
         | 
| 17 | 
            +
                      app.config.paths["db/migrate"] << expanded_path
         | 
| 18 | 
            +
                    end
         | 
| 19 | 
            +
                  end
         | 
| 20 | 
            +
                end
         | 
| 21 | 
            +
             | 
| 22 | 
            +
              end
         | 
| 23 | 
            +
            end
         |