module Fields::AddressFieldHelper def populate_country_options ([Addresses::Country.find_by(name: "United States"), Addresses::Country.find_by(name: "Canada")] + Addresses::Country.all).map { |country| [country.name, country.id] }.uniq end def populate_region_options(address_form) return [] if address_form.object.country_id.nil? Addresses::Region.where(country_id: address_form.object.country_id).map { |region| [region.name, region.id] } end def admin_division_label_for(address_form) # using country_id because it's fastest, even if this case statement is hard to read admin_divisions_key = case address_form.object.country_id when 31, 142, 239, 101 :states when 39 :provinces_territories when 109 :prefectures when 107, 45, 116, 182, 207, 219, 230, 156, 204 :provinces when 14, 233 :states_territories when 59 :regions when 82, 15 :federal_states when 75 :departments when 105 :counties when 214 :cantons else :default end path = [:addresses, :fields, :admin_divisions, admin_divisions_key] t(path.compact.join(".")) end def postal_code_label_for(address_form) key = if address_form.object.country_id == 233 :zip_code else :postal_code end path = [:addresses, :fields, key, :label] t(path.compact.join(".")) end def address_formatted(address, one_line: false) return "" if address.all_blank? formatted = [ address.address_one, address.address_two, address_city_line_formatted(address), address.country&.name&.upcase ].reject(&:blank?) if one_line formatted.join(", ") # simplistic else simple_format(formatted.join("\n")) end end def address_city_line_formatted(address) country_iso2 = address.country&.iso2 # can be nil or empty city = address.city region = address.region&.name postal_code = address.postal_code # adapted from https://github.com/cainlevy/snail/blob/master/lib/snail.rb # using iso2 property here because it's a port of what's used in snail gem # will be cleaned up below if parts missing formatted = case country_iso2 when "CN", "IN" "#{city}, #{region} #{postal_code}" when "BR" "#{postal_code} #{city}#{"-" unless city.nil? || city.empty? || region.nil? || region.empty?}#{region}" when "MX", "SK" "#{postal_code} #{city}, #{region}" when "IT" "#{postal_code} #{city} #{region}" when "BY" "#{postal_code} #{city}#{"-" unless city.nil? || city.empty? || region.nil? || region.empty?}#{region}" when "US", "CA", "AU", nil, "" "#{city} #{region} #{postal_code}" when "IL", "DK", "FI", "FR", "DE", "GR", "NO", "ES", "SE", "TR", "CY", "PT", "MK", "BA" "#{postal_code} #{city}" when "KW", "SY", "OM", "EE", "LU", "BE", "IS", "CH", "AT", "MD", "ME", "RS", "BG", "GE", "PL", "AM", "HR", "RO", "AZ" "#{postal_code} #{city}" when "NL" "#{postal_code} #{city}" when "IE" "#{city}, #{region}\n#{postal_code}" when "GB", "RU", "UA", "JO", "LB", "IR", "SA", "NZ" "#{city} #{postal_code}" # Locally these may be on separate lines. The USPS prefers the city line above the country line, though. when "EC" "#{postal_code} #{city}" when "HK", "IQ", "YE", "QA", "AL" city.to_s when "AE" "#{postal_code}\n#{city}" when "JP" "#{city}, #{region}\n#{postal_code}" when "EG", "ZA", "IM", "KZ", "HU" "#{city}\n#{postal_code}" when "LV" "#{city}, LV-#{postal_code}".gsub(/LV-\s*$/, "") # undo if no postal code when "LT" "LT-#{postal_code} #{city}".gsub(/^LT-\s*/, "") # undo if no postal code when "SI" "SI-#{postal_code} #{city}".gsub(/^SI-\s*/, "") # undo if no postal code when "CZ" "#{postal_code} #{region}\n#{city}" else "#{city} #{region} #{postal_code}" end # clean up separators when missing pieces formatted.strip # remove extra spaces and newlines before and after .gsub(/^,\s*/, "") # remove extra comma from start .gsub(/\s*,$/, "") # remove extra comma from end end end