Browse Source

Fixed front page on mobile and improved city lookup

development
Godwin 8 years ago
parent
commit
e83c2fc464
  1. 18
      Gemfile
  2. 20
      Rakefile
  3. 46
      app/assets/javascripts/main.js
  4. 21
      app/assets/stylesheets/_application.scss
  5. 2
      app/assets/stylesheets/bumbleberry-settings.json
  6. 71
      app/models/city.rb
  7. 2
      app/views/layouts/application.html.haml
  8. 23
      config/initializers/geocoder.rb

18
Gemfile

@ -11,9 +11,9 @@ gem 'haml'
gem 'nokogiri', '~> 1.6.8.rc2' gem 'nokogiri', '~> 1.6.8.rc2'
if Dir.exists?('../lingua_franca') if Dir.exists?('../lingua_franca')
gem 'lingua_franca', path: '../lingua_franca' gem 'lingua_franca', :path => '../lingua_franca'
else else
gem 'lingua_franca', git: 'git://github.com/lingua-franca/lingua_franca.git' gem 'lingua_franca', :git => 'git://github.com/lingua-franca/lingua_franca.git'
end end
gem 'tzinfo-data' gem 'tzinfo-data'
@ -21,15 +21,15 @@ gem 'sass'
gem 'sass-rails' gem 'sass-rails'
if Dir.exists?('../bumbleberry') if Dir.exists?('../bumbleberry')
gem 'bumbleberry', path: "../bumbleberry" gem 'bumbleberry', :path => "../bumbleberry"
else else
gem 'bumbleberry', git: 'git://github.com/bumbleberry/bumbleberry.git' gem 'bumbleberry', :git => 'git://github.com/bumbleberry/bumbleberry.git'
end end
if Dir.exists?('../paypal-express') if Dir.exists?('../paypal-express')
gem 'paypal-express', path: "../paypal-express" gem 'paypal-express', :path => "../paypal-express"
else else
gem 'paypal-express', git: 'git://github.com/bikebike/paypal-express.git' gem 'paypal-express', :git => 'git://github.com/bikebike/paypal-express.git'
end end
gem 'uglifier', '>= 1.3.0' gem 'uglifier', '>= 1.3.0'
@ -48,7 +48,7 @@ gem 'redcarpet'
gem 'sidekiq' gem 'sidekiq'
gem 'letter_opener' gem 'letter_opener'
gem 'launchy' gem 'launchy'
gem 'to_spreadsheet', git: 'git://github.com/glebm/to_spreadsheet.git' gem 'to_spreadsheet', :git => 'git://github.com/glebm/to_spreadsheet.git'
group :test do group :test do
gem 'rspec' gem 'rspec'
@ -64,8 +64,8 @@ group :development do
gem 'capistrano-rails', '~> 1.1' gem 'capistrano-rails', '~> 1.1'
gem 'capistrano-faster-assets', '~> 1.0' gem 'capistrano-faster-assets', '~> 1.0'
gem 'eventmachine'#, :github => 'krzcho/eventmachine', :branch => 'master' gem 'eventmachine', :github => 'krzcho/eventmachine', :branch => 'master'
gem 'thin'#, :github => 'krzcho/thin', :branch => 'master' gem 'thin', :github => 'krzcho/thin', :branch => 'master'
end end
group :test do group :test do

20
Rakefile

@ -24,16 +24,26 @@ end
task update_cities: :environment do task update_cities: :environment do
Location.all.each do |l| Location.all.each do |l|
city = City.search(([l.city, l.territory, l.country] - [nil, '']).join(', ')) s = ([l.city, l.territory, l.country] - [nil, '']).join(', ')
unless l.city_id.present?
begin
puts "Searching for #{s}"
city = City.search(s)
l.city_id = city.id l.city_id = city.id
l.save! l.save!
rescue
puts "Error searching for #{s}"
end
end
end end
unless c.place_id.present?
City.all.each do |c| City.all.each do |c|
location = Geocoder.search(c.address, language: 'en').first location = Geocoder.search(c.address, language: 'en').first
c.place_id = location.data['place_id'] c.place_id = location.data['place_id']
c.save! c.save!
end end
end
end end
task update_cities_es: :environment do task update_cities_es: :environment do
@ -43,3 +53,11 @@ task update_cities_es: :environment do
c.save! c.save!
end end
end end
task update_cities_fr: :environment do
City.all.each do |c|
city = c.get_translation(:fr)
c.set_column_for_locale(:city, :fr, city, 0) unless city.blank? || city == c.get_column_for_locale(:city, :fr)
c.save!
end
end

46
app/assets/javascripts/main.js

@ -242,3 +242,49 @@
}); });
})(); })();
function generateScreenshot() {
var css = '';
var svgs = document.getElementsByTagName('svg');
for (var i = 0; i < document.styleSheets.length; i++) {
if (document.styleSheets[i].href && !document.styleSheets[i].href.match(/web\-fonts/)) {
var rules = document.styleSheets[i].rules || document.styleSheets[i].cssRules;
for (var j = 0; j < rules.length; j++) {
cssText = rules[j].cssText;
if (rules[j].selectorText) {
if (rules[j].selectorText.match(/(^|\s)svg[^\w]/) || cssText.match(/\s(fill|stroke(\-width)?):/)) {
css += cssText;
}
}
}
}
}
for (var i = 0; i < svgs.length; i++) {
var svg = svgs[i];
// svg.innerHTML = '<style type="text/css"><![CDATA[' + css + ']]></style>' + svg.innerHTML;
svg.innerHTML = '<style type="text/css"><![CDATA[' + css + ']]></style>' + svg.innerHTML;
svg.setAttribute('height', svg.clientHeight);
svg.setAttribute('width', svg.clientWidth);
var canvas = document.createElement('canvas');
canvg(canvas, svg.outerHTML);
console.log(svg.outerHTML);
svg.style.backgroundImage = 'url(' + encodeURI(canvas.toDataURL('image/png')) + ')';
}
html2canvas(document.body, {
logging: true,
profile: true,
useCORS: true}).then(function(canvas) {
var data = canvas.toDataURL('image/jpeg', 0.9);
var src = encodeURI(data);
window.open(src, '_blank');
// reset the svg height and width
for (var i = 0; i < svgs.length; i++) {
var svg = svgs[i];
svg.removeAttribute('height');
svg.removeAttribute('width');
svg.removeAttribute('style');
}
});
}

21
app/assets/stylesheets/_application.scss

@ -12,6 +12,7 @@ html, body {
} }
body { body {
background-color: $white;
padding-bottom: 20vw; padding-bottom: 20vw;
} }
@ -1807,6 +1808,7 @@ ul.warnings {
a { a {
color: inherit; color: inherit;
padding: 0 0.333em; padding: 0 0.333em;
display: inline-block;
&:hover { &:hover {
@include after { @include after {
@ -2946,6 +2948,9 @@ a.logo {
.conference-banner { .conference-banner {
text-align: center; text-align: center;
padding: 0;
margin: 0 -1em 2em;
width: auto;
.title { .title {
font-size: 5vw; font-size: 5vw;
@ -2964,6 +2969,10 @@ a.logo {
font-size: 0.85em; font-size: 0.85em;
line-height: 2em; line-height: 2em;
} }
img {
max-width: 100%;
}
} }
.conference-details { .conference-details {
@ -4653,15 +4662,6 @@ html[data-ontop] {
} }
} }
} }
// .nav a.register, .nav button {
// @include before-and-after {
// background-color: $colour-2;
// }
// &:focus, &:active {
// @include _(transform, none);
// }
// }
} }
#banner { #banner {
@ -4674,6 +4674,9 @@ html[data-ontop] {
} }
.conference-banner { .conference-banner {
margin: 0 auto;
width: 100%;
.title { .title {
font-size: 1.9em; font-size: 1.9em;
margin: 0 0 1em; margin: 0 0 1em;

2
app/assets/stylesheets/bumbleberry-settings.json

@ -8,7 +8,7 @@
"and_chr": ["54"], "and_chr": ["54"],
"chrome": ["54"], "chrome": ["54"],
"edge": ["13"], "edge": ["13"],
"firefox": ["44"], "firefox": ["48"],
"ie": ["11"], "ie": ["11"],
"ios_saf": ["8", "9"] "ios_saf": ["8", "9"]
} }

71
app/models/city.rb

@ -18,19 +18,30 @@ class City < ActiveRecord::Base
def get_translation(locale) def get_translation(locale)
location = Geocoder.search(address, language: locale.to_s).first location = Geocoder.search(address, language: locale.to_s).first
# if the service lets us down, return nil
return nil unless location.present?
searched_component = false
location.data['address_components'].each do | component | location.data['address_components'].each do | component |
# city is usually labelled a 'locality' but sometimes this is missing and only 'colloquial_area' is present # city is usually labeled a 'locality' but sometimes this is missing and only 'colloquial_area' is present
if component['types'].first == 'locality' || component['types'].first == 'colloquial_area' if component['types'].first == 'locality'
return component['short_name'] return component['short_name']
end end
if component['types'] == location.data['types']
searched_component = component['short_name']
end
end end
return nil # return the type we searched for but it's still possible that it will be false
searched_component
end end
# this method will get called automatically if a translation is asked for but not found
def translate_city(locale) def translate_city(locale)
translation = get_translation(locale) translation = get_translation(locale)
# if we found it, set it
if translation.present? if translation.present?
set_column_for_locale(:city, locale, translation) set_column_for_locale(:city, locale, translation)
save! save!
@ -48,16 +59,20 @@ class City < ActiveRecord::Base
# look up the city in the geocoder # look up the city in the geocoder
location = Geocoder.search(str, language: 'en').first location = Geocoder.search(str, language: 'en').first
# return nil to indicate that the service is down
return nil unless location.present?
# see if the city is already present in our database # see if the city is already present in our database
city = City.find_by_place_id(location.data['place_id']) city = City.find_by_place_id(location.data['place_id'])
# return the city if we found it in the db already # return the city if we found it in the db already
return city if city.present? if city.present?
CityCache.create(city_id: city.id, search: str)
return city
end
# otherwise build a new city # otherwise build a new city
component_alises = { component_alises = {
'locality' => :city, 'locality' => :city,
'colloquial_area' => :city,
'administrative_area_level_1' => :territory, 'administrative_area_level_1' => :territory,
'country' => :country 'country' => :country
} }
@ -67,15 +82,61 @@ class City < ActiveRecord::Base
longitude: location.data['geometry']['location']['lng'], longitude: location.data['geometry']['location']['lng'],
place_id: location.data['place_id'] place_id: location.data['place_id']
} }
# these things are definitely not cities, make sure we don't think they're one
not_a_city = [
'administrative_area_level_1',
'country',
'street_address',
'street_number',
'postal_code',
'postal_code_prefix',
'route',
'intersection',
'premise',
'subpremise',
'natural_feature',
'airport',
'park',
'point_of_interest',
'bus_station',
'train_station',
'transit_station',
'room',
'post_box',
'parking',
'establishment',
'floor'
]
searched_component = nil
location.data['address_components'].each do | component | location.data['address_components'].each do | component |
property = component_alises[component['types'].first] property = component_alises[component['types'].first]
city_data[property] = component['short_name'] if property.present? city_data[property] = component['short_name'] if property.present?
# ideally we will find the component that is labeled a locality but
# if that fails we will select what was searched for, hopefully they searched for a city
# and not an address or country
# some places are not labeled 'locality', search for 'Halifax NS' for example and you will
# get 'administrative_area_level_2' since Halifax is a municipality
if component['types'] == location.data['types'] && not_a_city.include?(component['types'].first)
searched_component = component['short_name']
end
end end
# fall back to the searched component
city_data[:city] ||= searched_component
# we need to have the city and country at least
return false unless city_data[:city].present? && city_data[:country].present?
# save the new city # save the new city
city = City.new(city_data) city = City.new(city_data)
city.save! city.save!
# save this to our cache
CityCache.create(city_id: city.id, search: str)
# and return it # and return it
return city return city
end end

2
app/views/layouts/application.html.haml

@ -20,6 +20,8 @@
%meta{property: 'og:image', content: og_image} %meta{property: 'og:image', content: og_image}
%meta{name: "theme-color", content: @theme_colour} %meta{name: "theme-color", content: @theme_colour}
= yield :head = yield :head
= javascript_include_tag 'https://rawgit.com/niklasvh/html2canvas/master/dist/html2canvas.js'
= javascript_include_tag 'https://cdnjs.cloudflare.com/ajax/libs/amcharts/3.13.0/exporting/canvg.js'
%body{ class: page_style } %body{ class: page_style }
#primary-content #primary-content

23
config/initializers/geocoder.rb

@ -1,21 +1,24 @@
# config/initializers/geocoder.rb # config/initializers/geocoder.rb
Geocoder.configure( config = {
# geocoding service (see below for supported options): # geocoding service (see below for supported options):
:lookup => :google, lookup: :google,
# IP address geocoding service (see below for supported options): # IP address geocoding service (see below for supported options):
:ip_lookup => :freegeoip, ip_lookup: :freegeoip,
# to use an API key: # to use an API key:
# :api_key => "AIzaSyDitM1lyVWkrumteDvSkje6GiIKYyHlAXM",
# geocoding service request timeout, in seconds (default 3): # geocoding service request timeout, in seconds (default 3):
:timeout => 5, timeout: 5,
# set default units to kilometers: # set default units to kilometers:
:units => :km, units: :km
}
# caching (see below for details): # use our api key on the server
#:cache => Redis.new, if Rails.env.preview? || Rails.env.production?
#:cache_prefix => "..." config[:api_key] = "AIzaSyDurfjX9f_NgYsJLyUuGqwdKuI745CE_OE"
) config[:use_https] = true
end
Geocoder.configure(config)

Loading…
Cancel
Save