seo_unpakt 1.0.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/MIT-LICENSE +20 -0
- data/README.rdoc +3 -0
- data/Rakefile +42 -0
- data/app/assets/fonts/FontAwesome.otf +0 -0
- data/app/assets/fonts/fontawesome-webfont.eot +0 -0
- data/app/assets/fonts/fontawesome-webfont.svg +414 -0
- data/app/assets/fonts/fontawesome-webfont.ttf +0 -0
- data/app/assets/fonts/fontawesome-webfont.woff +0 -0
- data/app/assets/fonts/glyphicons-halflings-regular.eot +0 -0
- data/app/assets/fonts/glyphicons-halflings-regular.svg +229 -0
- data/app/assets/fonts/glyphicons-halflings-regular.ttf +0 -0
- data/app/assets/fonts/glyphicons-halflings-regular.woff +0 -0
- data/app/assets/fonts/proximanova-bold-webfont.eot +0 -0
- data/app/assets/fonts/proximanova-bold-webfont.svg +235 -0
- data/app/assets/fonts/proximanova-bold-webfont.ttf +0 -0
- data/app/assets/fonts/proximanova-bold-webfont.woff +0 -0
- data/app/assets/fonts/proximanova-light-webfont.eot +0 -0
- data/app/assets/fonts/proximanova-light-webfont.svg +235 -0
- data/app/assets/fonts/proximanova-light-webfont.ttf +0 -0
- data/app/assets/fonts/proximanova-light-webfont.woff +0 -0
- data/app/assets/fonts/proximanova-regular-webfont.eot +0 -0
- data/app/assets/fonts/proximanova-regular-webfont.svg +235 -0
- data/app/assets/fonts/proximanova-regular-webfont.ttf +0 -0
- data/app/assets/fonts/proximanova-regular-webfont.woff +0 -0
- data/app/assets/fonts/proximanova-semibold-webfont.eot +0 -0
- data/app/assets/fonts/proximanova-semibold-webfont.svg +235 -0
- data/app/assets/fonts/proximanova-semibold-webfont.ttf +0 -0
- data/app/assets/fonts/proximanova-semibold-webfont.woff +0 -0
- data/app/assets/images/seo_unpakt/AjaxLoader.gif +0 -0
- data/app/assets/images/seo_unpakt/border-left-shadow.png +0 -0
- data/app/assets/images/seo_unpakt/border-right-shadow.png +0 -0
- data/app/assets/images/seo_unpakt/carousel-left.png +0 -0
- data/app/assets/images/seo_unpakt/carousel-right.png +0 -0
- data/app/assets/images/seo_unpakt/glyphicons-halflings-white.png +0 -0
- data/app/assets/images/seo_unpakt/glyphicons-halflings.png +0 -0
- data/app/assets/images/seo_unpakt/grabbing.png +0 -0
- data/app/assets/images/seo_unpakt/map-bg.jpg +0 -0
- data/app/assets/images/seo_unpakt/post-image.jpg +0 -0
- data/app/assets/images/seo_unpakt/puma-logo.png +0 -0
- data/app/assets/images/seo_unpakt/read-more-arrow.png +0 -0
- data/app/assets/images/seo_unpakt/sfl-logo.png +0 -0
- data/app/assets/images/seo_unpakt/sun-1.png +0 -0
- data/app/assets/images/seo_unpakt/sun-2.png +0 -0
- data/app/assets/images/seo_unpakt/sun-3.png +0 -0
- data/app/assets/images/seo_unpakt/unpakt-logo.png +0 -0
- data/app/assets/images/seo_unpakt/unpakt-logo1.png +0 -0
- data/app/assets/images/seo_unpakt/weather-widget.png +0 -0
- data/app/assets/javascripts/seo_unpakt/application.js +123 -0
- data/app/assets/javascripts/seo_unpakt/bootstrap.min.js +6 -0
- data/app/assets/javascripts/seo_unpakt/jquery.zweatherfeed.min.js +8 -0
- data/app/assets/javascripts/seo_unpakt/map.js.erb +50 -0
- data/app/assets/javascripts/seo_unpakt/overlapping_marker.js +23 -0
- data/app/assets/javascripts/seo_unpakt/owl.carousel.min.js +1 -0
- data/app/assets/stylesheets/seo_unpakt/application.css +17 -0
- data/app/assets/stylesheets/seo_unpakt/bootstrap.min.css +9 -0
- data/app/assets/stylesheets/seo_unpakt/custom.css +403 -0
- data/app/assets/stylesheets/seo_unpakt/font-awesome.min.css +4 -0
- data/app/assets/stylesheets/seo_unpakt/masada.css +12347 -0
- data/app/assets/stylesheets/seo_unpakt/owl.carousel.css +71 -0
- data/app/assets/stylesheets/seo_unpakt/server.css +6075 -0
- data/app/assets/stylesheets/seo_unpakt/zweatherfeed.css +50 -0
- data/app/controllers/seo_unpakt/admin/living_in_infos_controller.rb +58 -0
- data/app/controllers/seo_unpakt/admin/seo_configs_controller.rb +28 -0
- data/app/controllers/seo_unpakt/admin/seo_keywords_controller.rb +25 -0
- data/app/controllers/seo_unpakt/application_controller.rb +18 -0
- data/app/helpers/seo_unpakt/admin/seo_configs_helper.rb +4 -0
- data/app/helpers/seo_unpakt/application_helper.rb +44 -0
- data/app/helpers/seo_unpakt/seo_helper.rb +26 -0
- data/app/helpers/seo_unpakt/will_paginate_helper.rb +21 -0
- data/app/models/seo_unpakt/living_in_info.rb +18 -0
- data/app/models/seo_unpakt/seo_keyword.rb +11 -0
- data/app/views/layouts/seo_unpakt/_estimation_information_form.html.slim +1 -0
- data/app/views/layouts/seo_unpakt/_google_analytics.html.slim +14 -0
- data/app/views/layouts/seo_unpakt/_map_widgets.html.slim +18 -0
- data/app/views/layouts/seo_unpakt/application.html.slim +54 -0
- data/app/views/seo_unpakt/admin/_menu.html.slim +7 -0
- data/app/views/seo_unpakt/admin/living_in_infos/_city_list.html.slim +21 -0
- data/app/views/seo_unpakt/admin/living_in_infos/_tinymce_js.html.slim +14 -0
- data/app/views/seo_unpakt/admin/living_in_infos/edit.html.slim +15 -0
- data/app/views/seo_unpakt/admin/living_in_infos/edit_state_info.html.slim +16 -0
- data/app/views/seo_unpakt/admin/living_in_infos/index.html.slim +15 -0
- data/app/views/seo_unpakt/admin/living_in_infos/index.js.erb +1 -0
- data/app/views/seo_unpakt/admin/living_in_infos/state_index.html.slim +28 -0
- data/app/views/seo_unpakt/admin/seo_configs/_city_list.html.slim +21 -0
- data/app/views/seo_unpakt/admin/seo_configs/mover_cities.html.slim +16 -0
- data/app/views/seo_unpakt/admin/seo_configs/mover_cities.js.erb +1 -0
- data/app/views/seo_unpakt/admin/seo_configs/toggle_seo_city.js.erb +5 -0
- data/app/views/seo_unpakt/admin/seo_keywords/_keywords_list.html.slim +3 -0
- data/app/views/seo_unpakt/admin/seo_keywords/create.js.erb +2 -0
- data/app/views/seo_unpakt/admin/seo_keywords/index.html.slim +13 -0
- data/app/views/seo_unpakt/seo/_living_infos_by_city.html.slim +24 -0
- data/app/views/seo_unpakt/seo/_mover_locations.html.slim +1 -0
- data/app/views/seo_unpakt/seo/_movers_by_cities.html.slim +7 -0
- data/app/views/seo_unpakt/seo/_movers_carousel.html.slim +25 -0
- data/app/views/seo_unpakt/seo/_news.html.slim +9 -0
- data/app/views/seo_unpakt/seo/_page_infos.html.slim +17 -0
- data/app/views/seo_unpakt/seo/_weather_infos_by_city.html.slim +7 -0
- data/app/views/seo_unpakt/seo/city_movers.html.slim +4 -0
- data/app/views/seo_unpakt/seo/get_movers.js.erb +2 -0
- data/app/views/seo_unpakt/seo/index.html.slim +9 -0
- data/app/views/seo_unpakt/seo/moving_from_city.html.slim +4 -0
- data/app/views/seo_unpakt/seo/moving_from_to_city.html.slim +8 -0
- data/app/views/seo_unpakt/seo/moving_to_city.html.slim +4 -0
- data/app/views/seo_unpakt/seo/state_movers.html.slim +53 -0
- data/config/routes.rb +25 -0
- data/config/tinymce.yml +14 -0
- data/db/migrate/20140408070411_add_column_generate_seo_urls_to_mover_cities.rb +5 -0
- data/db/migrate/20140422102809_update_seo_urls_mover_cities.rb +11 -0
- data/db/migrate/20140429070426_create_seo_unpakt_seo_keywords.rb +8 -0
- data/db/migrate/20140430141506_seed_seo_keywords.rb +12 -0
- data/db/migrate/20140506075238_update_seo_urls_false.rb +7 -0
- data/db/migrate/20140515080832_create_seo_unpakt_living_in_infos.rb +11 -0
- data/db/seeders/UnpaktLocations.csv +61 -0
- data/lib/seo_unpakt/engine.rb +19 -0
- data/lib/seo_unpakt/version.rb +3 -0
- data/lib/seo_unpakt.rb +4 -0
- data/lib/tasks/seo_unpakt_tasks.rake +4 -0
- data/test/controllers/seo_unpakt/admin/seo_configs_controller_test.rb +9 -0
- data/test/controllers/seo_unpakt/seo_controller_test.rb +9 -0
- data/test/dummy/README.rdoc +261 -0
- data/test/dummy/Rakefile +7 -0
- data/test/dummy/app/assets/javascripts/application.js +15 -0
- data/test/dummy/app/assets/stylesheets/application.css +13 -0
- data/test/dummy/app/controllers/application_controller.rb +3 -0
- data/test/dummy/app/helpers/application_helper.rb +2 -0
- data/test/dummy/app/views/layouts/application.html.erb +14 -0
- data/test/dummy/config/application.rb +59 -0
- data/test/dummy/config/boot.rb +10 -0
- data/test/dummy/config/database.yml +25 -0
- data/test/dummy/config/environment.rb +5 -0
- data/test/dummy/config/environments/development.rb +37 -0
- data/test/dummy/config/environments/production.rb +67 -0
- data/test/dummy/config/environments/test.rb +37 -0
- data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
- data/test/dummy/config/initializers/inflections.rb +15 -0
- data/test/dummy/config/initializers/mime_types.rb +5 -0
- data/test/dummy/config/initializers/secret_token.rb +7 -0
- data/test/dummy/config/initializers/session_store.rb +8 -0
- data/test/dummy/config/initializers/wrap_parameters.rb +14 -0
- data/test/dummy/config/locales/en.yml +5 -0
- data/test/dummy/config/routes.rb +4 -0
- data/test/dummy/config.ru +4 -0
- data/test/dummy/public/404.html +26 -0
- data/test/dummy/public/422.html +26 -0
- data/test/dummy/public/500.html +25 -0
- data/test/dummy/public/favicon.ico +0 -0
- data/test/dummy/script/rails +6 -0
- data/test/helpers/seo_unpakt/admin/seo_configs_helper_test.rb +6 -0
- data/test/helpers/seo_unpakt/seo_helper_test.rb +6 -0
- data/test/integration/navigation_test.rb +10 -0
- data/test/seo_unpakt_test.rb +7 -0
- data/test/test_helper.rb +15 -0
- metadata +286 -0
@@ -0,0 +1,50 @@
|
|
1
|
+
@charset "UTF-8";
|
2
|
+
/**
|
3
|
+
* Stylesheet: example.css
|
4
|
+
*
|
5
|
+
* (c) 2011-2012 Zazar Ltd
|
6
|
+
*
|
7
|
+
* Description: Stylesheet for examples
|
8
|
+
*
|
9
|
+
**/
|
10
|
+
|
11
|
+
|
12
|
+
form { margin-bottom: 1em; }
|
13
|
+
|
14
|
+
.weatherFeed {
|
15
|
+
font-family: Arial, Helvetica, sans-serif;
|
16
|
+
font-size: 90%;
|
17
|
+
width: 280px;
|
18
|
+
}
|
19
|
+
.weatherFeed a { color: #888; }
|
20
|
+
.weatherFeed a:hover {
|
21
|
+
color: #000;
|
22
|
+
text-decoration: none;
|
23
|
+
}
|
24
|
+
.weatherItem {
|
25
|
+
/*padding: 0.8em;*/
|
26
|
+
text-align: right;
|
27
|
+
}
|
28
|
+
.weatherCity { text-transform: uppercase; }
|
29
|
+
.weatherTemp {
|
30
|
+
font-size: 2.8em;
|
31
|
+
font-weight: bold;
|
32
|
+
}
|
33
|
+
.weatherDesc, .weatherCity, .weatherForecastDay { font-weight: bold; }
|
34
|
+
.weatherDesc { margin-bottom: 0.4em; }
|
35
|
+
.weatherRange, .weatherWind, .weatherLink, .weatherForecastItem { font-size: 0.8em; }
|
36
|
+
.weatherLink, .weatherForecastItem {
|
37
|
+
margin-top: 0.5em;
|
38
|
+
text-align: left;
|
39
|
+
}
|
40
|
+
.weatherForecastItem {
|
41
|
+
padding: 0.5em 0.5em 0.5em 80px;
|
42
|
+
background-color: #fff;
|
43
|
+
background-position: left center;
|
44
|
+
}
|
45
|
+
.weatherForecastDay { font-size: 1.1em; }
|
46
|
+
|
47
|
+
.weatherForecast {margin-top: 15px;}
|
48
|
+
|
49
|
+
/*.odd { background-color: #e8e8fc; }*/
|
50
|
+
/*.even { background-color: #d4d4e8; }*/
|
@@ -0,0 +1,58 @@
|
|
1
|
+
require_dependency "seo_unpakt/application_controller"
|
2
|
+
|
3
|
+
module SeoUnpakt
|
4
|
+
module Admin
|
5
|
+
class LivingInInfosController < ApplicationController
|
6
|
+
def index
|
7
|
+
@mover_cities = MoverCity.order("city")
|
8
|
+
@mover_states = @mover_cities.map(&:state).uniq.collect{|s| [MoversByState.states_hash[s], s]}.sort
|
9
|
+
@mover_cities = @mover_cities.where("state = ?", params[:state]) unless params[:state].blank?
|
10
|
+
@mover_cities = @mover_cities.paginate(page: params[:page] || 1)
|
11
|
+
|
12
|
+
|
13
|
+
@living_in_infos = LivingInInfo.where("city IS NOT ?", nil)
|
14
|
+
@living_in_infos_hash = {}
|
15
|
+
@living_in_infos.collect{|l| @living_in_infos_hash.merge!(l.city.underscore => {state: l.state, body: l.body})}
|
16
|
+
end
|
17
|
+
|
18
|
+
def state_index
|
19
|
+
@states = MoversByState.states_hash
|
20
|
+
@living_in_infos = LivingInInfo.where("city IS ?", nil)
|
21
|
+
@living_in_infos_hash = {}
|
22
|
+
@living_in_infos.collect{|l| @living_in_infos_hash.merge!(l.state.underscore => {state: l.state, body: l.body, info_type: l.info_type})}
|
23
|
+
end
|
24
|
+
|
25
|
+
def edit
|
26
|
+
param_split = params[:id].split("-")
|
27
|
+
state = param_split.pop.upcase
|
28
|
+
city = param_split.join(" ").titleize
|
29
|
+
@living_in_info = LivingInInfo.where(state: state, city: city).first_or_create(body: LivingInInfo.default_body([city, state].join(', ')), info_type: 'city')
|
30
|
+
end
|
31
|
+
|
32
|
+
def edit_state_info
|
33
|
+
state = params[:state]
|
34
|
+
city = params[:city]
|
35
|
+
state_fullname = MoversByState.states_hash["#{state}"]
|
36
|
+
@living_in_info = LivingInInfo.where(state: state, city: city).first_or_create(body: LivingInInfo.default_body(state_fullname), info_type: 'state')
|
37
|
+
end
|
38
|
+
|
39
|
+
def update
|
40
|
+
@living_in_info = LivingInInfo.find params[:id]
|
41
|
+
if @living_in_info.update_attributes(params[:living_in_info])
|
42
|
+
redirect_to admin_living_in_infos_url
|
43
|
+
else
|
44
|
+
render :edit
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
def update_state_info
|
49
|
+
@living_in_info = LivingInInfo.find params[:living_in_info_id]
|
50
|
+
if @living_in_info.update_attributes(params[:living_in_info])
|
51
|
+
redirect_to state_index_admin_living_in_infos_url
|
52
|
+
else
|
53
|
+
render :edit_state_info
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
require_dependency "seo_unpakt/application_controller"
|
2
|
+
|
3
|
+
module SeoUnpakt
|
4
|
+
module Admin
|
5
|
+
class SeoConfigsController < ApplicationController
|
6
|
+
before_filter :check_admin
|
7
|
+
|
8
|
+
def mover_cities
|
9
|
+
breadcrumbs.add 'Admin', "#"
|
10
|
+
@mover_cities = MoverCity.order("city")
|
11
|
+
@mover_states = state_list_for_select
|
12
|
+
@mover_cities = @mover_cities.where("state = ?", params[:state]) unless params[:state].blank?
|
13
|
+
@mover_cities = @mover_cities.paginate(page: params[:page] || 1, per_page: params[:per_page])
|
14
|
+
end
|
15
|
+
|
16
|
+
def toggle_seo_city
|
17
|
+
@mover_city = MoverCity.find params[:mover_city_id]
|
18
|
+
@mover_city.update_attribute(:generate_seo_urls, params[:generate_seo_urls])
|
19
|
+
end
|
20
|
+
|
21
|
+
private
|
22
|
+
|
23
|
+
def state_list_for_select
|
24
|
+
return @mover_cities.map(&:state).uniq.collect{|s| [MoversByState.states_hash[s], s]}.sort
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require_dependency "seo_unpakt/application_controller"
|
2
|
+
|
3
|
+
module SeoUnpakt
|
4
|
+
module Admin
|
5
|
+
class SeoKeywordsController < ApplicationController
|
6
|
+
before_filter :check_admin
|
7
|
+
def index
|
8
|
+
@seo_keywords = SeoKeyword.order("word")
|
9
|
+
end
|
10
|
+
|
11
|
+
def create
|
12
|
+
seo_keyword = SeoKeyword.new params[:seo_keyword]
|
13
|
+
seo_keyword.save
|
14
|
+
@seo_keywords = SeoKeyword.order("word")
|
15
|
+
end
|
16
|
+
|
17
|
+
def destroy
|
18
|
+
seo_keyword = SeoKeyword.find params[:id]
|
19
|
+
seo_keyword.destroy
|
20
|
+
@seo_keywords = SeoKeyword.order("word")
|
21
|
+
render action: :create
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
require "breadcrumbs"
|
2
|
+
module SeoUnpakt
|
3
|
+
class SeoUnpakt::ApplicationController < ApplicationController
|
4
|
+
before_filter :add_initial_breadcrumbs
|
5
|
+
|
6
|
+
private
|
7
|
+
|
8
|
+
def add_initial_breadcrumbs
|
9
|
+
breadcrumbs.add 'Unpakt', "/"
|
10
|
+
@breadcrumbs = breadcrumbs
|
11
|
+
end
|
12
|
+
|
13
|
+
def check_admin
|
14
|
+
redirect_to "/users/login" if !(current_user && current_user.is_admin?)
|
15
|
+
end
|
16
|
+
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
module SeoUnpakt
|
2
|
+
module ApplicationHelper
|
3
|
+
def ajax_will_paginate(collection, options = {})
|
4
|
+
will_paginate(collection, options.merge(:renderer => WillPaginateHelper::WillPaginateAjaxLinkRenderer))
|
5
|
+
end
|
6
|
+
|
7
|
+
def living_in_info city, state
|
8
|
+
state_code = get_state_code_by_name(state)
|
9
|
+
lif = LivingInInfo.where(state: state_code)
|
10
|
+
if city.blank?
|
11
|
+
lif = lif.where(info_type: "state")
|
12
|
+
location = state
|
13
|
+
else
|
14
|
+
lif = lif.where(city: city)
|
15
|
+
location = [city, state_code].join(", ")
|
16
|
+
end
|
17
|
+
# raise lif.inspect
|
18
|
+
(lif.blank? or lif.first.body.blank?) ? LivingInInfo.default_body(location) : lif.first.body.html_safe
|
19
|
+
end
|
20
|
+
|
21
|
+
def get_state_code_by_name state_name
|
22
|
+
MoversByState.states_hash.to_a.select{|s| s[1] == "#{state_name}"}.first[0]
|
23
|
+
end
|
24
|
+
|
25
|
+
def set_selected_admin_link url_suffix
|
26
|
+
request.url.ends_with?(url_suffix) ? "selected" : ""
|
27
|
+
end
|
28
|
+
|
29
|
+
def news_heading city, state
|
30
|
+
(!city.blank? && !state.blank?) ? "#{city}, #{get_state_code_by_name(state)} News" : "#{state} News"
|
31
|
+
end
|
32
|
+
|
33
|
+
def widget_page_title city, state
|
34
|
+
if city.blank? and state.blank?
|
35
|
+
"<span>Movers by City Project</span>".html_safe
|
36
|
+
elsif !city.blank?
|
37
|
+
"#{city}, #{state} <span>Moving companies</span>".html_safe
|
38
|
+
else
|
39
|
+
"#{state} <span>Moving companies</span>".html_safe
|
40
|
+
end
|
41
|
+
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
module SeoUnpakt
|
2
|
+
module SeoHelper
|
3
|
+
def breadcrumbs
|
4
|
+
|
5
|
+
end
|
6
|
+
|
7
|
+
def get_img_url_and_body_text(blog)
|
8
|
+
doc = Nokogiri::HTML(blog.try(:body))
|
9
|
+
img_url = doc.xpath('//p/a/img').first.attributes["src"].value.blank? ? "#" : doc.xpath('//p/a/img').first.attributes["src"].value rescue ''
|
10
|
+
content = doc.xpath('//p').text
|
11
|
+
[img_url, content]
|
12
|
+
end
|
13
|
+
|
14
|
+
def next_preve_image_display(movers_count, limit)
|
15
|
+
movers_count > limit ? "show" : "hide"
|
16
|
+
end
|
17
|
+
|
18
|
+
def get_grade_class(mover_grade)
|
19
|
+
mover_grade == "TOO LEGIT" ? 'grade-legit' : 'grade-value'
|
20
|
+
end
|
21
|
+
def blog_search_link tag
|
22
|
+
search_string = tag.gsub(" ","+")
|
23
|
+
"https://www.unpakt.com/blog/?s=#{search_string}"
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module SeoUnpakt
|
2
|
+
module WillPaginateHelper
|
3
|
+
class WillPaginateAjaxLinkRenderer < WillPaginate::ActionView::LinkRenderer
|
4
|
+
def prepare(collection, options, template)
|
5
|
+
options[:params] ||= {}
|
6
|
+
options[:params]["_"] = nil
|
7
|
+
super(collection, options, template)
|
8
|
+
end
|
9
|
+
|
10
|
+
protected
|
11
|
+
def link(text, target, attributes = {})
|
12
|
+
if target.is_a? Fixnum
|
13
|
+
attributes[:rel] = rel_value(target)
|
14
|
+
target = url(target)
|
15
|
+
end
|
16
|
+
ajax_call = "$.ajax({url: '#{target}', dataType: 'script'});"
|
17
|
+
@template.link_to_function(text.to_s.html_safe, ajax_call, attributes)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module SeoUnpakt
|
2
|
+
class LivingInInfo < ActiveRecord::Base
|
3
|
+
@@info_types = ["city", "state"]
|
4
|
+
|
5
|
+
validates :state, presence: true
|
6
|
+
validates :city, presence: true, :if => :info_type_is_city?
|
7
|
+
|
8
|
+
validates :info_type, inclusion: { in: @@info_types}
|
9
|
+
# attr_accessible :title, :body
|
10
|
+
def info_type_is_city?
|
11
|
+
self.info_type == "city"
|
12
|
+
end
|
13
|
+
|
14
|
+
def self.default_body city=""
|
15
|
+
"At Unpakt, we know movers, and we can connect you with great moving companies in #{city}. Take a moment to browse a few of our featured #{city} movers so that you can begin comparing reviews and quotes instantly!"
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
#unpakt-move-form(data-url="#{Rails.configuration.affiliate_url}" data-uuid="#{Rails.configuration.affiliate_uuid}")
|
@@ -0,0 +1,14 @@
|
|
1
|
+
- if Rails.env.productiony?
|
2
|
+
#analytics
|
3
|
+
- if content_for? :analytics
|
4
|
+
= content_for :analytics
|
5
|
+
|
6
|
+
- if Rails.env.production?
|
7
|
+
javascript:
|
8
|
+
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
|
9
|
+
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
|
10
|
+
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
|
11
|
+
})(window,document,'script','//www.google-analytics.com/analytics.js','ga');
|
12
|
+
|
13
|
+
ga('create', 'UA-29104481-1', 'unpakt.com');
|
14
|
+
ga('send', 'pageview');
|
@@ -0,0 +1,18 @@
|
|
1
|
+
.container
|
2
|
+
.row
|
3
|
+
.span12
|
4
|
+
.mapped-city-page
|
5
|
+
.row
|
6
|
+
.span6
|
7
|
+
.row
|
8
|
+
.span6
|
9
|
+
.white-box-a
|
10
|
+
h2 Plan. Compare. Book.
|
11
|
+
p
|
12
|
+
strong Real prices, right now.
|
13
|
+
| Unpakt lets you find great movers, get exact prices and book online. Just tell us what you're moving and we'll figure out how much it'll cost. <strong>Instantly.</strong>
|
14
|
+
|
15
|
+
.span6
|
16
|
+
.white-box-b.pull-right
|
17
|
+
.moving-form-info
|
18
|
+
= render "/layouts/seo_unpakt/estimation_information_form"
|
@@ -0,0 +1,54 @@
|
|
1
|
+
doctype html
|
2
|
+
html lang="en"
|
3
|
+
head
|
4
|
+
meta charset="utf-8"
|
5
|
+
meta content="IE=edge" http-equiv="X-UA-Compatible"
|
6
|
+
meta content="" name="author"
|
7
|
+
meta name="description" content="#{@description_attribute || meta_description_builder}"
|
8
|
+
title=@title_attribute || title_builder
|
9
|
+
= stylesheet_link_tag "seo_unpakt/application"
|
10
|
+
= stylesheet_link_tag "new_flow", media: 'screen, projection'
|
11
|
+
= csrf_meta_tag
|
12
|
+
|
13
|
+
body
|
14
|
+
= render partial: "shared/new_flow_header"
|
15
|
+
|
16
|
+
.layout-content
|
17
|
+
|
18
|
+
- unless request.url.include?("admin")
|
19
|
+
section.breadcrumb-bar.unpakt
|
20
|
+
.container
|
21
|
+
.row
|
22
|
+
.span12
|
23
|
+
.ruby-crumb #{@breadcrumbs.render(:format => :inline)}
|
24
|
+
|
25
|
+
section.map-box.unpakt
|
26
|
+
#map-canvas
|
27
|
+
|
28
|
+
|
29
|
+
.light-back.unpakt.new-flow-container
|
30
|
+
.container
|
31
|
+
.row
|
32
|
+
.span12
|
33
|
+
.white-box-c
|
34
|
+
h1 = widget_page_title(@city, @state)
|
35
|
+
= yield
|
36
|
+
|
37
|
+
= render partial: "shared/new_flow_footer"
|
38
|
+
|
39
|
+
/! Placed at the end of the document so the pages load faster
|
40
|
+
script src='/tinymce/tinymce.min.js'
|
41
|
+
script type="text/javascript" src="https://maps.googleapis.com/maps/api/js?v=3.exp&sensor=false"
|
42
|
+
= javascript_include_tag "seo_unpakt/application"
|
43
|
+
#js_calls
|
44
|
+
= yield :js_calls
|
45
|
+
|
46
|
+
#scripts
|
47
|
+
|
48
|
+
= yield :scripts
|
49
|
+
|
50
|
+
- if Rails.configuration.document_domain
|
51
|
+
javascript:
|
52
|
+
$(document).ready(function() {
|
53
|
+
document.domain = "#{Rails.configuration.document_domain}";
|
54
|
+
});
|
@@ -0,0 +1,21 @@
|
|
1
|
+
table width="100%"
|
2
|
+
thead
|
3
|
+
tr
|
4
|
+
th City
|
5
|
+
th State
|
6
|
+
th Living Info Text
|
7
|
+
th
|
8
|
+
tbody
|
9
|
+
- @mover_cities.each do |city|
|
10
|
+
tr
|
11
|
+
td
|
12
|
+
= city.city
|
13
|
+
td
|
14
|
+
= city.state
|
15
|
+
td
|
16
|
+
= @living_in_infos_hash[city.city.underscore].try(:[], :body).try(:html_safe)
|
17
|
+
th
|
18
|
+
= link_to "Edit", edit_admin_living_in_info_url("#{city.city}-#{city.state}".parameterize)
|
19
|
+
|
20
|
+
|
21
|
+
= ajax_will_paginate @mover_cities
|
@@ -0,0 +1,14 @@
|
|
1
|
+
= content_for :js_calls do
|
2
|
+
javascript:
|
3
|
+
(function() {
|
4
|
+
if (typeof tinyMCE != 'undefined') {
|
5
|
+
tinyMCE.init({
|
6
|
+
selector: "textarea.tinymce",
|
7
|
+
menubar: false,
|
8
|
+
plugins: "link image media code",
|
9
|
+
toolbar: "undo redo | styleselect | bold italic underline | alignleft aligncenter alignright justify | bullist numlist outdent indent | link image | media | code"
|
10
|
+
});
|
11
|
+
} else {
|
12
|
+
setTimeout(arguments.callee, 50);
|
13
|
+
}
|
14
|
+
})();
|
@@ -0,0 +1,15 @@
|
|
1
|
+
section
|
2
|
+
.row
|
3
|
+
.box-full
|
4
|
+
.span12
|
5
|
+
= render "seo_unpakt/admin/menu"
|
6
|
+
.span12
|
7
|
+
b
|
8
|
+
label = "Update 'Living in info' for #{@living_in_info.city}, #{@living_in_info.state}"
|
9
|
+
br
|
10
|
+
= form_for @living_in_info, url: admin_living_in_info_path(@living_in_info) do |f|
|
11
|
+
= f.text_area :body, :class => "tinymce", :rows => 5
|
12
|
+
br
|
13
|
+
= f.submit class: "btn"
|
14
|
+
|
15
|
+
= render('tinymce_js')
|
@@ -0,0 +1,16 @@
|
|
1
|
+
section
|
2
|
+
.row
|
3
|
+
.box-full
|
4
|
+
.span12
|
5
|
+
= render "seo_unpakt/admin/menu"
|
6
|
+
.span12
|
7
|
+
b
|
8
|
+
label = "Update 'Living in info' for #{@living_in_info.state}"
|
9
|
+
br
|
10
|
+
= form_for @living_in_info, url: admin_living_in_info_update_state_info_url(@living_in_info) do |f|
|
11
|
+
= f.text_area :body, :class => "tinymce", :rows => 5
|
12
|
+
br
|
13
|
+
= f.submit class: "btn"
|
14
|
+
|
15
|
+
|
16
|
+
= render('tinymce_js')
|
@@ -0,0 +1,15 @@
|
|
1
|
+
section
|
2
|
+
.row
|
3
|
+
.box-full
|
4
|
+
.span12
|
5
|
+
= render "seo_unpakt/admin/menu"
|
6
|
+
|
7
|
+
.span12
|
8
|
+
.span1
|
9
|
+
label.filter State
|
10
|
+
.span2
|
11
|
+
= select_tag :states, options_for_select(@mover_states), prompt: "--- ALL ---", id: "living_in_state_filter"
|
12
|
+
|
13
|
+
.span12
|
14
|
+
#city_list
|
15
|
+
= render "city_list"
|
@@ -0,0 +1 @@
|
|
1
|
+
$("#city_list").html("<%= j render('city_list') %>")
|
@@ -0,0 +1,28 @@
|
|
1
|
+
section
|
2
|
+
.row
|
3
|
+
.box-full
|
4
|
+
.span12
|
5
|
+
= render "seo_unpakt/admin/menu"
|
6
|
+
br
|
7
|
+
br
|
8
|
+
table width="100%"
|
9
|
+
thead
|
10
|
+
tr
|
11
|
+
th State
|
12
|
+
th State Id
|
13
|
+
th Living Info Text
|
14
|
+
th Info Type
|
15
|
+
th
|
16
|
+
tbody
|
17
|
+
- @states.each do |state|
|
18
|
+
tr
|
19
|
+
td
|
20
|
+
= state[1]
|
21
|
+
td
|
22
|
+
= state[0]
|
23
|
+
td
|
24
|
+
= @living_in_infos_hash[state[0].underscore].try(:[], :body).try(:html_safe)
|
25
|
+
td
|
26
|
+
= @living_in_infos_hash[state[0].underscore].try(:[], :info_type).try(:html_safe)
|
27
|
+
th
|
28
|
+
= link_to "Edit", edit_state_info_admin_living_in_infos_url(state: state[0])
|
@@ -0,0 +1,21 @@
|
|
1
|
+
table width="100%"
|
2
|
+
thead
|
3
|
+
tr
|
4
|
+
th City
|
5
|
+
th State
|
6
|
+
th Zip
|
7
|
+
th align="center" width="200px" SEO Enabled
|
8
|
+
tbody
|
9
|
+
- @mover_cities.each do |mover_city|
|
10
|
+
tr
|
11
|
+
td
|
12
|
+
= mover_city.city
|
13
|
+
|
14
|
+
td= mover_city.state
|
15
|
+
|
16
|
+
td= mover_city.default_zip_for_city.try(:zip)
|
17
|
+
|
18
|
+
td align="center"
|
19
|
+
= check_box_tag "generate_seo_urls_#{mover_city.id}", mover_city.id, mover_city.generate_seo_urls, :class => "enable_seo"
|
20
|
+
|
21
|
+
= ajax_will_paginate @mover_cities
|
@@ -0,0 +1,16 @@
|
|
1
|
+
section
|
2
|
+
.row
|
3
|
+
.box-full
|
4
|
+
.span12
|
5
|
+
#msg
|
6
|
+
|
7
|
+
= render "seo_unpakt/admin/menu"
|
8
|
+
.span12
|
9
|
+
.span1
|
10
|
+
label.filter State
|
11
|
+
.span2
|
12
|
+
= select_tag :states, options_for_select(@mover_states), prompt: "--- ALL ---", id: "state_filter"
|
13
|
+
|
14
|
+
.clear
|
15
|
+
#city_list
|
16
|
+
= render "city_list"
|
@@ -0,0 +1 @@
|
|
1
|
+
$("#city_list").html("<%= j render('city_list') %>")
|
@@ -0,0 +1,5 @@
|
|
1
|
+
<% if @mover_city.generate_seo_urls %>
|
2
|
+
$("#msg").html("<div class='alert alert-success'><a href='#' class='close' data-dismiss='alert'>×</a><%= @mover_city.city %> enabled for seo.</div>")
|
3
|
+
<% else %>
|
4
|
+
$("#msg").html("<div class='alert alert-success'><a href='#' class='close' data-dismiss='alert'>×</a><%= @mover_city.city %> disabled for seo.</div>")
|
5
|
+
<% end %>
|
@@ -0,0 +1,3 @@
|
|
1
|
+
- @seo_keywords.each do |seo_keyword|
|
2
|
+
span.label
|
3
|
+
= "#{seo_keyword.word} <span class='delete_keyword'>#{link_to 'x', admin_seo_keyword_url(seo_keyword), remote: true , method: 'delete', title: "Delete keyword", 'data-confirm' => "Are you sure to delete keyword?" }</span>".html_safe
|
@@ -0,0 +1,13 @@
|
|
1
|
+
section
|
2
|
+
.row
|
3
|
+
.span12
|
4
|
+
.box-full
|
5
|
+
= render "seo_unpakt/admin/menu"
|
6
|
+
#keywords.span12
|
7
|
+
#keywords_list
|
8
|
+
= render "keywords_list"
|
9
|
+
.clear
|
10
|
+
#keywords_form
|
11
|
+
= form_for :seo_keyword, remote: true do |f|
|
12
|
+
= f.text_field :word, placeholder: 'Enter a keyword'
|
13
|
+
= f.submit "Add Keyword"
|
@@ -0,0 +1,24 @@
|
|
1
|
+
.living-info
|
2
|
+
h2.blue-text.header-light
|
3
|
+
| Living in #{city} #{state}
|
4
|
+
p = living_in_info(city, state)
|
5
|
+
.city-related
|
6
|
+
- blogs.each do | blog |
|
7
|
+
- contents = get_img_url_and_body_text(blog)
|
8
|
+
ul.posts-list
|
9
|
+
li.each-post
|
10
|
+
.post-pic
|
11
|
+
img alt="" src="#{contents.first}" align="center"
|
12
|
+
.post-data
|
13
|
+
ul.post-text
|
14
|
+
li.post-title
|
15
|
+
h3
|
16
|
+
a href="#{blog.link}" #{blog.title}
|
17
|
+
li.post-tags
|
18
|
+
- blog.tags.each do |tag|
|
19
|
+
span
|
20
|
+
a href="#{blog_search_link(tag)}" =tag
|
21
|
+
|
22
|
+
li.post-summary = truncate(contents.last, length: 200)
|
23
|
+
li.post-more
|
24
|
+
a href="#{blog.link}" Read More
|
@@ -0,0 +1 @@
|
|
1
|
+
input#mover-locations name="locations" type="hidden" value="#{mover_locations}"
|