pwb 1.1.1 → 1.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +30 -3
- data/app/assets/javascripts/pwb/{application.js → application.js.erb} +19 -2
- data/app/assets/javascripts/pwb/paloma/landing.js +10 -10
- data/app/assets/javascripts/pwb/paloma/prop.js +14 -22
- data/app/assets/javascripts/pwb/paloma/sections.js +15 -15
- data/app/assets/javascripts/pwb/shared/inmo-map.js +121 -0
- data/app/assets/javascripts/pwb/shared/select-picker.js +15 -0
- data/app/assets/javascripts/pwb/shared/slick-carousel.js +10 -0
- data/app/assets/javascripts/pwb/shared/vue-main.js +31 -0
- data/app/assets/javascripts/pwb/themes/{berlin.js → berlin.js.erb} +61 -5
- data/app/assets/stylesheets/pwb/themes/berlin.scss +3 -0
- data/app/assets/stylesheets/pwb/themes/default.scss +4 -2
- data/app/assets/stylesheets/pwb/themes/default/landing_general.scss +1 -1
- data/app/assets/stylesheets/pwb/themes/default/language_switcher.scss +20 -0
- data/app/assets/stylesheets/pwb/themes/default/prop.scss +0 -4
- data/app/assets/stylesheets/pwb/themes/default/shame.scss +0 -59
- data/app/assets/stylesheets/pwb/themes/shared/gmap.scss +38 -0
- data/app/assets/stylesheets/pwb/themes/shared/search_box.scss +62 -0
- data/app/assets/stylesheets/pwb/themes/shared/shame.scss +6 -1
- data/app/assets/stylesheets/pwb/themes/shared/social.scss +84 -0
- data/app/controllers/pwb/api_public/v1/props_controller.rb +47 -1
- data/app/controllers/pwb/props_controller.rb +32 -3
- data/app/controllers/pwb/search_controller.rb +35 -3
- data/app/controllers/pwb/sections_controller.rb +24 -7
- data/app/controllers/pwb/welcome_controller.rb +2 -0
- data/app/helpers/pwb/application_helper.rb +16 -31
- data/app/helpers/pwb/images_helper.rb +43 -0
- data/app/models/pwb/agency.rb +2 -2
- data/app/models/pwb/content.rb +3 -2
- data/app/models/pwb/content_photo.rb +1 -1
- data/app/models/pwb/feature.rb +2 -2
- data/app/models/pwb/message.rb +1 -1
- data/app/models/pwb/prop.rb +10 -1
- data/app/models/pwb/prop_photo.rb +1 -1
- data/app/models/pwb/section.rb +2 -1
- data/app/models/pwb/website.rb +1 -1
- data/app/themes/berlin/views/layouts/pwb/application.html.erb +9 -4
- data/app/themes/berlin/views/pwb/props/not_found.html.erb +37 -0
- data/app/themes/berlin/views/pwb/props/show.html.erb +44 -11
- data/app/themes/berlin/views/pwb/search/buy.html.erb +15 -8
- data/app/themes/berlin/views/pwb/search/rent.html.erb +13 -6
- data/app/themes/berlin/views/pwb/sections/about_us.html.erb +25 -34
- data/app/themes/berlin/views/pwb/sections/contact_us.html.erb +23 -24
- data/app/themes/berlin/views/pwb/sections/static.html.erb +26 -26
- data/app/themes/berlin/views/pwb/welcome/_landing_carousel.html.erb +27 -18
- data/app/themes/berlin/views/pwb/welcome/_service.html.erb +2 -2
- data/app/themes/berlin/views/pwb/welcome/index.html.erb +5 -2
- data/app/themes/default/views/layouts/pwb/application.html.erb +15 -12
- data/app/themes/default/views/pwb/props/show.html.erb +29 -8
- data/app/themes/default/views/pwb/search/buy.html.erb +44 -48
- data/app/themes/default/views/pwb/search/rent.html.erb +44 -48
- data/app/themes/default/views/pwb/sections/about_us.html.erb +1 -0
- data/app/themes/default/views/pwb/sections/contact_us.html.erb +4 -0
- data/app/themes/default/views/pwb/sections/static.html.erb +1 -0
- data/app/themes/default/views/pwb/welcome/index.html.erb +14 -4
- data/app/views/pwb/_meta_tags.html.erb +10 -0
- data/app/views/pwb/props/_meta_tags.html.erb +8 -0
- data/app/views/pwb/search/_search_form_for_rent.html.erb +19 -16
- data/app/views/pwb/search/_search_form_landing.html.erb +35 -0
- data/app/views/pwb/search/search_ajax.js.erb +3 -1
- data/config/client_setups/default.json +113 -55
- data/config/initializers/i18n.rb +1 -0
- data/config/locales/admin.en.yml +19 -10
- data/config/locales/admin.es.yml +18 -0
- data/config/locales/de.yml +9 -6
- data/config/locales/devise.tr.yml +135 -0
- data/config/locales/devise.vi.yml +137 -0
- data/config/locales/en.yml +151 -161
- data/config/locales/es.yml +37 -35
- data/config/locales/fr.yml +147 -184
- data/config/locales/pt.yml +10 -8
- data/config/locales/rails.tr.yml +211 -0
- data/config/locales/rails.vi.yml +203 -0
- data/config/locales/ru.yml +13 -12
- data/config/locales/tr.yml +160 -0
- data/config/locales/vi.yml +162 -0
- data/config/locales/zh-HK.yml +2 -0
- data/config/routes.rb +4 -3
- data/db/migrate/20170513221300_create_cms.rb +1 -1
- data/lib/pwb/seeder.rb +1 -1
- data/lib/pwb/version.rb +1 -1
- data/spec/dummy/config/routes.rb +3 -4
- data/spec/dummy/db/schema.rb +11 -10
- data/spec/dummy/log/test.log +0 -0
- data/spec/dummy/public/uploads/pwb/content_photo/image/1/carousel_windows.jpg +0 -0
- data/spec/dummy/public/uploads/pwb/content_photo/image/2/carousel_deck_chair.jpg +0 -0
- data/spec/dummy/public/uploads/pwb/content_photo/image/3/carousel_grass.jpg +0 -0
- data/spec/dummy/public/uploads/pwb/content_photo/image/4/carousel_grass.jpg +0 -0
- data/spec/dummy/public/uploads/pwb/prop_photo/image/1/flat_balcony.jpg +0 -0
- data/spec/dummy/public/uploads/pwb/prop_photo/image/1/gdaje3atcct1gx2ngv9u.jpg +0 -0
- data/spec/dummy/public/uploads/pwb/prop_photo/image/1/new_villa.jpg +0 -0
- data/spec/dummy/public/uploads/pwb/prop_photo/image/2/flat_balcony.jpg +0 -0
- data/spec/dummy/public/uploads/pwb/prop_photo/image/2/kitchen_modern.jpg +0 -0
- data/spec/dummy/public/uploads/pwb/prop_photo/image/2/rxo23syongfydjpoizrd.jpg +0 -0
- data/spec/dummy/public/uploads/pwb/prop_photo/image/3/mansion_front.jpg +0 -0
- data/spec/dummy/public/uploads/pwb/prop_photo/image/3/vzlptgtccsk2d2ewp4id.jpg +0 -0
- data/spec/dummy/public/uploads/pwb/prop_photo/image/4/mansion_bedroom.jpg +0 -0
- data/spec/dummy/public/uploads/pwb/prop_photo/image/4/xwayprwnmmmhrzrgwvch.jpg +0 -0
- data/spec/dummy/public/uploads/pwb/prop_photo/image/5/flat_window.jpg +0 -0
- data/spec/dummy/public/uploads/pwb/prop_photo/image/5/ilxn2u37bak0v60u6f8q.jpg +0 -0
- data/spec/dummy/public/uploads/pwb/prop_photo/image/6/kitchen_classic.jpg +0 -0
- data/spec/dummy/public/uploads/pwb/prop_photo/image/7/flat_balcony.jpg +0 -0
- data/spec/dummy/public/uploads/pwb/prop_photo/image/8/lounge_cosy.jpg +0 -0
- data/spec/requests/pwb/themes_spec.rb +1 -0
- data/spec/views/pwb/welcome.html.erb_spec.rb +7 -0
- metadata +63 -6
- data/app/assets/javascripts/pwb/themes/berlin/jquery.min.js +0 -5
- data/app/assets/stylesheets/pwb/themes/default/search.scss +0 -8
@@ -12,6 +12,7 @@ module Pwb
|
|
12
12
|
# .order('price_sale_current_cents ASC')
|
13
13
|
# @properties = Prop.where(nil) # creates an anonymous scope
|
14
14
|
apply_search_filter filtering_params(params)
|
15
|
+
set_map_markers
|
15
16
|
render "/pwb/search/search_ajax.js.erb", layout: false
|
16
17
|
# view rendered will use js to inject results...
|
17
18
|
end
|
@@ -23,6 +24,7 @@ module Pwb
|
|
23
24
|
@properties = Prop.visible.for_rent
|
24
25
|
|
25
26
|
apply_search_filter filtering_params(params)
|
27
|
+
set_map_markers
|
26
28
|
render "/pwb/search/search_ajax.js.erb", layout: false
|
27
29
|
# view rendered will use js to inject results...
|
28
30
|
end
|
@@ -46,8 +48,9 @@ module Pwb
|
|
46
48
|
# ..
|
47
49
|
|
48
50
|
set_common_search_inputs
|
49
|
-
|
51
|
+
set_select_picker_texts
|
50
52
|
apply_search_filter filtering_params(params)
|
53
|
+
set_map_markers
|
51
54
|
|
52
55
|
# below allows setting in form of any input values that might have been passed by param
|
53
56
|
@search_defaults = params[:search].present? ? params[:search] : {}
|
@@ -77,9 +80,9 @@ module Pwb
|
|
77
80
|
# 150 250 500 1,000 1,500 2,000 2,500 3,000 4,000 5,000 10,000)
|
78
81
|
|
79
82
|
set_common_search_inputs
|
80
|
-
|
83
|
+
set_select_picker_texts
|
81
84
|
apply_search_filter filtering_params(params)
|
82
|
-
|
85
|
+
set_map_markers
|
83
86
|
@search_defaults = params[:search].present? ? params[:search] : {}
|
84
87
|
|
85
88
|
js 'Main/Search#sort' # trigger client-side paloma script
|
@@ -88,6 +91,27 @@ module Pwb
|
|
88
91
|
|
89
92
|
private
|
90
93
|
|
94
|
+
def set_map_markers
|
95
|
+
@map_markers = []
|
96
|
+
@properties.each do |property|
|
97
|
+
if property.show_map
|
98
|
+
@map_markers.push(
|
99
|
+
{
|
100
|
+
id: property.id,
|
101
|
+
title: property.title,
|
102
|
+
show_url: property.contextual_show_path(@operation_type),
|
103
|
+
image_url: property.primary_image_url,
|
104
|
+
display_price: property.contextual_price_with_currency(@operation_type),
|
105
|
+
position: {
|
106
|
+
lat: property.latitude,
|
107
|
+
lng: property.longitude
|
108
|
+
}
|
109
|
+
}
|
110
|
+
)
|
111
|
+
end
|
112
|
+
end
|
113
|
+
end
|
114
|
+
|
91
115
|
# A list of the param names that can be used for filtering the Product list
|
92
116
|
def filtering_params(params)
|
93
117
|
unless params[:search]
|
@@ -105,6 +129,14 @@ module Pwb
|
|
105
129
|
:for_rent_price_till, :property_type, :property_state, :count_bathrooms, :count_bedrooms)
|
106
130
|
end
|
107
131
|
|
132
|
+
def set_select_picker_texts
|
133
|
+
@select_picker_texts = {
|
134
|
+
noneSelectedText: I18n.t("selectpicker.noneSelectedText"),
|
135
|
+
noneResultsText: I18n.t("selectpicker.noneResultsText"),
|
136
|
+
countSelectedText: I18n.t("selectpicker.countSelectedText")
|
137
|
+
}.to_json
|
138
|
+
end
|
139
|
+
|
108
140
|
def set_common_search_inputs
|
109
141
|
# for these 2 below, I'm checking in form if count is > 1
|
110
142
|
# assumption is that there will be at least one Zone with blank values
|
@@ -42,14 +42,31 @@ module Pwb
|
|
42
42
|
end
|
43
43
|
|
44
44
|
def contact_us
|
45
|
-
# below for google map rendering via paloma:
|
46
|
-
js current_agency_primary_address: @current_agency.primary_address
|
47
|
-
js show_contact_map: @current_agency.show_contact_map
|
45
|
+
# below was for google map rendering via paloma:
|
46
|
+
# js current_agency_primary_address: @current_agency.primary_address
|
47
|
+
# js show_contact_map: @current_agency.show_contact_map
|
48
48
|
# could explicitly set function for Paloma to use like so:
|
49
49
|
# js "Pwb/Sections#contact_us"
|
50
50
|
# @enquiry = Message.new
|
51
51
|
@page_title = I18n.t("contactUs")
|
52
52
|
|
53
|
+
@map_markers = []
|
54
|
+
if @current_agency.show_contact_map
|
55
|
+
@map_markers.push(
|
56
|
+
{
|
57
|
+
id: @current_agency.id,
|
58
|
+
title: @current_agency.display_name,
|
59
|
+
show_url: "#",
|
60
|
+
image_url: @current_website.logo_url,
|
61
|
+
# display_price: @current_agency.contextual_price_with_currency(@operation_type),
|
62
|
+
position: {
|
63
|
+
lat: @current_agency.primary_address.latitude,
|
64
|
+
lng: @current_agency.primary_address.longitude
|
65
|
+
}
|
66
|
+
}
|
67
|
+
)
|
68
|
+
end
|
69
|
+
|
53
70
|
render "/pwb/sections/contact_us"
|
54
71
|
end
|
55
72
|
|
@@ -75,9 +92,9 @@ module Pwb
|
|
75
92
|
origin_ip: request.ip,
|
76
93
|
user_agent: request.user_agent,
|
77
94
|
delivery_email: @current_agency.email_for_general_contact_form
|
78
|
-
|
79
|
-
|
80
|
-
)
|
95
|
+
# origin_email: params[:contact][:email]
|
96
|
+
}
|
97
|
+
)
|
81
98
|
unless @enquiry.save && @client.save
|
82
99
|
@error_messages += @client.errors.full_messages
|
83
100
|
@error_messages += @enquiry.errors.full_messages
|
@@ -110,7 +127,7 @@ module Pwb
|
|
110
127
|
private
|
111
128
|
|
112
129
|
def header_image
|
113
|
-
# used by berlin theme
|
130
|
+
# used by berlin theme and meta tags
|
114
131
|
hi_content = Content.where(tag: 'landing-carousel')[0]
|
115
132
|
@header_image = hi_content.present? ? hi_content.default_photo : nil
|
116
133
|
end
|
@@ -11,6 +11,8 @@ module Pwb
|
|
11
11
|
@properties_for_sale = Prop.for_sale.visible.order('highlighted DESC').limit 9
|
12
12
|
@properties_for_rent = Prop.for_rent.visible.order('highlighted DESC').limit 9
|
13
13
|
|
14
|
+
@search_defaults = params[:search].present? ? params[:search] : {}
|
15
|
+
|
14
16
|
render "pwb/welcome/index"
|
15
17
|
end
|
16
18
|
end
|
@@ -2,46 +2,26 @@ module Pwb
|
|
2
2
|
module ApplicationHelper
|
3
3
|
|
4
4
|
def properties_carousel_footer
|
5
|
-
# TODO - diplay array of thumbnails below main
|
5
|
+
# TODO - diplay array of thumbnails below main
|
6
6
|
# properties carousel is images count > ...
|
7
7
|
# <a href="#" class="theater" rel="group" hidefocus="true">
|
8
8
|
# <%= opt_image_tag((@property_details.ordered_photo 3), :quality => "auto", class: "", alt: "") %>
|
9
9
|
# </a>
|
10
10
|
end
|
11
11
|
|
12
|
-
def bg_image(photo, options = {})
|
13
|
-
unless photo && photo.image.present?
|
14
|
-
return ""
|
15
|
-
end
|
16
|
-
if Rails.application.config.use_cloudinary
|
17
|
-
image_url = cl_image_path photo.image, options
|
18
|
-
else
|
19
|
-
image_url = image_path photo.image.url
|
20
|
-
end
|
21
|
-
#style="background-image:linear-gradient( rgba(0, 0, 0, 0.8), rgba(0, 0, 0, 0.1) ),url(<%= carousel_item.default_photo %>);"
|
22
|
-
if options[:gradient]
|
23
|
-
"background-image: linear-gradient(#{options[:gradient]}), url(#{image_url});".html_safe
|
24
|
-
else
|
25
|
-
"background-image: url(#{image_url});".html_safe
|
26
|
-
end
|
27
|
-
end
|
28
|
-
|
29
|
-
def opt_image_tag(photo, options = {})
|
30
|
-
unless photo && photo.image.present?
|
31
|
-
return nil
|
32
|
-
end
|
33
|
-
if Rails.application.config.use_cloudinary
|
34
|
-
cl_image_tag photo.image, options
|
35
|
-
else
|
36
|
-
image_tag photo.image.url, options
|
37
|
-
end
|
38
|
-
end
|
39
|
-
|
40
|
-
|
41
12
|
def page_title(title_val)
|
42
13
|
content_for :page_title, title_val.to_s
|
43
14
|
end
|
44
15
|
|
16
|
+
# def meta_tags(tags_array = [])
|
17
|
+
# tags_string = ""
|
18
|
+
# tags_array.each do |tag|
|
19
|
+
# tags_string += "<meta property='#{tag[:property]}' content='#{tag[:content]}' />"
|
20
|
+
# end
|
21
|
+
# content_for :page_head, tags_string
|
22
|
+
# # <meta property="og:image" content="http://examples.opengraphprotocol.us/media/images/75.png">
|
23
|
+
# end
|
24
|
+
|
45
25
|
def area_unit(property)
|
46
26
|
area_unit = "m<sup>2</sup>"
|
47
27
|
if property.area_unit && (property.area_unit == "sqft")
|
@@ -52,7 +32,12 @@ module Pwb
|
|
52
32
|
|
53
33
|
def localized_link_to(locale_with_var = nil, options = nil, html_options = nil)
|
54
34
|
link_class = locale_with_var["variant"]
|
55
|
-
|
35
|
+
href = "/#{options["locale"]}"
|
36
|
+
begin
|
37
|
+
href = url_for(options)
|
38
|
+
rescue ActionController::UrlGenerationError
|
39
|
+
end
|
40
|
+
link = "<a class='#{link_class}' href='#{href}'></a>"
|
56
41
|
return link.html_safe
|
57
42
|
|
58
43
|
# if params["controller"] && params["controller"].include?("devise/")
|
@@ -0,0 +1,43 @@
|
|
1
|
+
module Pwb
|
2
|
+
module ImagesHelper
|
3
|
+
|
4
|
+
def bg_image(photo, options = {})
|
5
|
+
image_url = get_opt_image_url photo, options
|
6
|
+
#style="background-image:linear-gradient( rgba(0, 0, 0, 0.8), rgba(0, 0, 0, 0.1) ),url(<%= carousel_item.default_photo %>);"
|
7
|
+
if options[:gradient]
|
8
|
+
"background-image: linear-gradient(#{options[:gradient]}), url(#{image_url});".html_safe
|
9
|
+
else
|
10
|
+
"background-image: url(#{image_url});".html_safe
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
def opt_image_tag(photo, options = {})
|
15
|
+
unless photo && photo.image.present?
|
16
|
+
return nil
|
17
|
+
end
|
18
|
+
if Rails.application.config.use_cloudinary
|
19
|
+
cl_image_tag photo.image, options
|
20
|
+
else
|
21
|
+
image_tag photo.image.url, options
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def opt_image_url(photo, options = {})
|
26
|
+
get_opt_image_url photo, options
|
27
|
+
end
|
28
|
+
|
29
|
+
private
|
30
|
+
|
31
|
+
def get_opt_image_url(photo, options)
|
32
|
+
unless photo && photo.image.present?
|
33
|
+
return ""
|
34
|
+
end
|
35
|
+
if Rails.application.config.use_cloudinary
|
36
|
+
image_url = cl_image_path photo.image, options
|
37
|
+
else
|
38
|
+
image_url = image_url photo.image.url
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
end
|
43
|
+
end
|
data/app/models/pwb/agency.rb
CHANGED
@@ -6,8 +6,8 @@ module Pwb
|
|
6
6
|
|
7
7
|
# belongs_to_active_hash :theme, foreign_key: "theme_name", class_name: "Pwb::Theme", shortcuts: [:friendly_name], primary_key: "name"
|
8
8
|
|
9
|
-
belongs_to :primary_address, class_name: "Address", foreign_key: 'primary_address_id'
|
10
|
-
belongs_to :secondary_address, class_name: "Address", foreign_key: 'secondary_address_id'
|
9
|
+
belongs_to :primary_address, optional: true, class_name: "Address", foreign_key: 'primary_address_id'
|
10
|
+
belongs_to :secondary_address, optional: true, class_name: "Address", foreign_key: 'secondary_address_id'
|
11
11
|
|
12
12
|
def self.unique_instance
|
13
13
|
# there will be only one row, and its ID must be '1'
|
data/app/models/pwb/content.rb
CHANGED
@@ -1,10 +1,11 @@
|
|
1
1
|
module Pwb
|
2
2
|
class Content < ApplicationRecord
|
3
3
|
has_many :content_photos, dependent: :destroy
|
4
|
-
belongs_to :section, foreign_key: "section_key", primary_key: "link_path"
|
4
|
+
belongs_to :section, optional: true, foreign_key: "section_key", primary_key: "link_path"
|
5
5
|
|
6
6
|
translates :raw, fallbacks_for_empty_translations: true
|
7
|
-
globalize_accessors locales:
|
7
|
+
globalize_accessors locales: I18n.available_locales
|
8
|
+
# globalize_accessors locales: [:en, :ca, :es, :fr, :ar, :de, :ru, :pt]
|
8
9
|
|
9
10
|
def default_photo
|
10
11
|
content_photos.first
|
data/app/models/pwb/feature.rb
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
module Pwb
|
2
2
|
class Feature < ApplicationRecord
|
3
|
-
belongs_to :property
|
3
|
+
belongs_to :property, optional: true
|
4
4
|
|
5
|
-
belongs_to :feature_field_key, class_name: :FieldKey, foreign_key: :feature_key, inverse_of: :features
|
5
|
+
belongs_to :feature_field_key, optional: true, class_name: :FieldKey, foreign_key: :feature_key, inverse_of: :features
|
6
6
|
# above allows:
|
7
7
|
# Property.first.features.count and
|
8
8
|
# FieldKey.last.properties_count but most importantly
|
data/app/models/pwb/message.rb
CHANGED
data/app/models/pwb/prop.rb
CHANGED
@@ -1,7 +1,8 @@
|
|
1
1
|
module Pwb
|
2
2
|
class Prop < ApplicationRecord
|
3
3
|
translates :title, :description
|
4
|
-
globalize_accessors locales:
|
4
|
+
globalize_accessors locales: I18n.available_locales
|
5
|
+
# globalize_accessors locales: [:en, :ca, :es, :fr, :ar, :de, :ru, :pt]
|
5
6
|
|
6
7
|
# Use EUR as model level currency
|
7
8
|
# register_currency :eur
|
@@ -124,6 +125,14 @@ module Pwb
|
|
124
125
|
end
|
125
126
|
|
126
127
|
|
128
|
+
def primary_image_url
|
129
|
+
if prop_photos.length > 0
|
130
|
+
ordered_photo(1).image.url
|
131
|
+
else
|
132
|
+
""
|
133
|
+
end
|
134
|
+
end
|
135
|
+
|
127
136
|
# def ordered_photo_url(number)
|
128
137
|
# # allows me to pick an individual image according to an order
|
129
138
|
# unless prop_photos.length >= number
|
data/app/models/pwb/section.rb
CHANGED
@@ -2,7 +2,8 @@ module Pwb
|
|
2
2
|
class Section < ApplicationRecord
|
3
3
|
translates :page_title, fallbacks_for_empty_translations: true
|
4
4
|
translates :link_title, fallbacks_for_empty_translations: true
|
5
|
-
globalize_accessors locales:
|
5
|
+
globalize_accessors locales: I18n.available_locales
|
6
|
+
# [:en, :ca, :es, :fr, :ar, :de, :ru, :pt]
|
6
7
|
|
7
8
|
has_many :contents, foreign_key: "section_key", primary_key: "link_path"
|
8
9
|
|
data/app/models/pwb/website.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
module Pwb
|
2
2
|
class Website < ApplicationRecord
|
3
3
|
extend ActiveHash::Associations::ActiveRecordExtensions
|
4
|
-
belongs_to_active_hash :theme, foreign_key: "theme_name", class_name: "Pwb::Theme", shortcuts: [:friendly_name], primary_key: "name"
|
4
|
+
belongs_to_active_hash :theme, optional: true, foreign_key: "theme_name", class_name: "Pwb::Theme", shortcuts: [:friendly_name], primary_key: "name"
|
5
5
|
|
6
6
|
def self.unique_instance
|
7
7
|
# there will be only one row, and its ID must be '1'
|
@@ -4,6 +4,9 @@
|
|
4
4
|
<meta charset="utf-8">
|
5
5
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
6
6
|
<meta name="robots" content="index, follow">
|
7
|
+
<title><%= yield(:page_title) %></title>
|
8
|
+
<%= yield(:page_head) %>
|
9
|
+
|
7
10
|
<%# display_meta_tags site: @current_website.tenant_display_name %>
|
8
11
|
<%= stylesheet_link_tag "pwb/themes/berlin", media: "all" %>
|
9
12
|
<style>
|
@@ -17,13 +20,12 @@
|
|
17
20
|
<script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
|
18
21
|
<script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
|
19
22
|
<![endif]-->
|
20
|
-
<title><%= yield(:page_title) %></title>
|
21
23
|
</head>
|
22
24
|
<body class="tnt-body <%= @current_website.body_style %>">
|
23
25
|
<!-- Pre Loader -->
|
24
|
-
|
26
|
+
<!-- <div id="aa-preloader-area">
|
25
27
|
<div class="pulse"></div>
|
26
|
-
</div>
|
28
|
+
</div> -->
|
27
29
|
<!-- SCROLL TOP BUTTON -->
|
28
30
|
<a class="scrollToTop" href="#"><i class="fa fa-angle-double-up"></i></a>
|
29
31
|
<!-- END SCROLL TOP BUTTON -->
|
@@ -41,7 +43,9 @@
|
|
41
43
|
</div>
|
42
44
|
</section>
|
43
45
|
<% else %>
|
44
|
-
|
46
|
+
<div id="main-vue">
|
47
|
+
<%= yield %>
|
48
|
+
</div>
|
45
49
|
<% end %>
|
46
50
|
<%= render :partial => '/pwb/footer', :locals => {} %>
|
47
51
|
<%= render :partial => '/pwb/analytics', :locals => {} %>
|
@@ -80,5 +84,6 @@
|
|
80
84
|
if (raf) raf(function() { window.setTimeout(loadDeferredStyles, 0); });
|
81
85
|
else window.addEventListener('load', loadDeferredStyles);
|
82
86
|
</script>
|
87
|
+
<%= yield(:page_script) %>
|
83
88
|
</body>
|
84
89
|
</html>
|
@@ -0,0 +1,37 @@
|
|
1
|
+
<% page_title @page_title %>
|
2
|
+
<!-- Start Property header -->
|
3
|
+
<section id="aa-property-header" style="<%= bg_image @header_image, height: 800, crop: "scale", quality: "auto" %>">
|
4
|
+
<div class="container">
|
5
|
+
<div class="row">
|
6
|
+
<div class="col-md-12">
|
7
|
+
<div class="aa-property-header-inner">
|
8
|
+
<h2>
|
9
|
+
<%= I18n.t("property.details") %>
|
10
|
+
</h2>
|
11
|
+
<ol class="breadcrumb">
|
12
|
+
<li>
|
13
|
+
<%= link_to pwb.root_path(locale: locale), class: "" do %>
|
14
|
+
<%= I18n.t("webContentSections.home") %>
|
15
|
+
<% end %>
|
16
|
+
</li>
|
17
|
+
<li class="active"><%= t "propertyNotFound" %>
|
18
|
+
</li>
|
19
|
+
</ol>
|
20
|
+
</div>
|
21
|
+
</div>
|
22
|
+
</div>
|
23
|
+
</div>
|
24
|
+
</section>
|
25
|
+
<!-- End Property header -->
|
26
|
+
<!-- Start Properties -->
|
27
|
+
<section id="aa-properties">
|
28
|
+
<div class="container">
|
29
|
+
<div class="row">
|
30
|
+
<div class="col-md-9" style="min-height:300px;">
|
31
|
+
<h2>
|
32
|
+
<%= t "propertyNotFound" %>
|
33
|
+
</h2>
|
34
|
+
</div>
|
35
|
+
</div>
|
36
|
+
</div>
|
37
|
+
</section>
|