diff --git a/components/MapEdit.vue b/components/MapEdit.vue
new file mode 100644
index 00000000..aa7c9d5f
--- /dev/null
+++ b/components/MapEdit.vue
@@ -0,0 +1,72 @@
+
+client-only(placeholder='Loading...' )
+ LMap(ref="mapEdit"
+ id="leaflet-map"
+ :zoom="zoom"
+ :options="{attributionControl: false}"
+ :center="center")
+ LControlAttribution(position='bottomright' prefix="")
+ LTileLayer(
+ :url="url"
+ :attribution="attribution")
+ LMarker(
+ :lat-lng="marker.coordinates")
+
+
+
+
+
diff --git a/components/WhereInput.vue b/components/WhereInput.vue
index 1baea189..554de17e 100644
--- a/components/WhereInput.vue
+++ b/components/WhereInput.vue
@@ -1,6 +1,7 @@
v-row.mb-4
v-col(cols=12 md=6)
+ //- this is the name used by people
v-combobox(ref='place'
:rules="[$validators.required('common.where')]"
:label="$t('common.where')"
@@ -18,112 +19,105 @@ v-row.mb-4
v-list-item(v-bind='attrs' v-on='on')
v-list-item-content(two-line v-if='item.create')
v-list-item-title {{$t('common.add')}} {{item.name}}
+ v-list-item-content(two-line v-else-if='item.online')
+ v-list-item-title {{$t('common.online')}}
v-list-item-content(two-line v-else)
v-list-item-title(v-text='item.name')
v-list-item-subtitle(v-text='item.address')
v-col(cols=12 md=6)
- v-text-field(v-if="!settings.allow_geolocation"
- ref='address'
+ v-row.mx-0.my-0.align-center.justify-center
+
+ v-text-field.mr-4(ref='address' v-if="value.name !== 'online'"
+ v-model='value.address'
:prepend-icon='mdiMap'
:disabled='disableAddress'
:rules="[ v => disableAddress ? true : $validators.required('common.address')(v)]"
:label="$t('common.address')"
:hint="$t('event.address_description')"
- persistent-hint
- @change="changeAddress"
- :value="value.address")
- v-combobox(ref='address' v-else
- :prepend-icon='mdiMapSearch'
- :disabled='disableAddress'
- @input.native='searchAddress'
- :label="$t('common.address')"
- :rules="[ v => disableAddress ? true : $validators.required('common.address')(v)]"
- :value='value.address'
- item-text='address'
- persistent-hint hide-no-data clearable no-filter
- :loading='loading'
- @change='selectAddress'
- @focus='searchAddress'
- :items="addressList"
- :hint="$t('event.address_description_osm')")
- template(v-slot:message="{message, key}")
- span(v-html='message' :key="key")
- template(v-slot:item="{ item, attrs, on }")
- v-list-item(v-bind='attrs' v-on='on')
- v-icon.pr-4(v-text='loadCoordinatesResultIcon(item)')
- v-list-item-content(two-line v-if='item')
- v-list-item-title(v-text='item.name')
- v-list-item-subtitle(v-text='`${item.address}`')
- //- v-col(cols=12 md=3 v-if='settings.allow_geolocation')
- //- v-text-field(ref='latitude' :value='value.latitude'
- //- :prepend-icon='mdiLatitude'
- //- :disabled='disableDetails'
- //- :label="$t('common.latitude')" )
- //- v-col(cols=12 md=3 v-if='settings.allow_geolocation')
- //- v-text-field(ref='longitude' :value='value.longitude'
- //- :prepend-icon='mdiLongitude'
- //- :disabled='disableDetails'
- //- :label="$t('common.longitude')")
+ persistent-hint)
+ template(v-slot:append v-if="showAdvancedDialogButton")
+ v-icon(v-text='mdiCog'
+ @click="whereInputAdvancedDialog = true")
+ v-combobox.mr-4(v-model="onlineLocations" v-else
+ :prepend-icon='mdiLink'
+ :hint="$t('event.online_locations_help')"
+ :label="$t('event.online_locations')"
+ clearable chips small-chips multiple deletable-chips hide-no-data hide-selected persistent-hint
+ :delimiters="[',', ';', '; ']"
+ :items="onlineLocations"
+ @change='selectLocations')
+ template(v-slot:selection="{ item, index, on, attrs, selected, parent }")
+ v-chip(v-bind="attrs" :outlined='index !== 0'
+ close :close-icon='mdiCloseCircle' @click:close='parent.selectItem(item)'
+ :input-value="selected" label small) {{ item }}
+ //- template(v-slot:append)
+ //- v-icon(v-text='mdiCog' :disabled='!value.name' @click="whereInputAdvancedDialog = true")
+
+ v-dialog(v-model='whereInputAdvancedDialog' destroy-on-close max-width='700px' :fullscreen='$vuetify.breakpoint.xsOnly' dense)
+ WhereInputAdvanced(ref='whereAdvanced' :place.sync='value' :event='event'
+ @close='whereInputAdvancedDialog = false && this.$refs.address.blur()'
+ :onlineLocations.sync="onlineLocations"
+ @update:onlineLocations="selectLocations")
+
+
diff --git a/components/WhereInputAdvanced.vue b/components/WhereInputAdvanced.vue
new file mode 100644
index 00000000..9b2e9241
--- /dev/null
+++ b/components/WhereInputAdvanced.vue
@@ -0,0 +1,145 @@
+
+v-card
+ v-card-title {{ $t('event.where_advanced_options') }}
+ v-card-subtitle {{ $t('event.where_advanced_options_description') }}
+
+ v-card-text(v-if='showGeocoded')
+ v-combobox(ref='geocodedAddress'
+ :prepend-icon='mdiMapSearch'
+ @input.native='searchAddress'
+ :label="$t('common.search_coordinates')"
+ :value='place.geocodedAddress'
+ item-text='address'
+ persistent-hint hide-no-data clearable no-filter
+ :loading='loading'
+ @change='selectAddress'
+ @focus='searchAddress'
+ :items="addressList"
+ :disabled='disableGeocoded'
+ :hint="$t('event.address_description_osm')")
+ template(v-slot:message="{message, key}")
+ span(v-html='message' :key="key")
+ template(v-slot:item="{ item, attrs, on }")
+ v-list-item(v-bind='attrs' v-on='on')
+ v-icon.pr-4(v-text='loadCoordinatesResultIcon(item)')
+ v-list-item-content(two-line v-if='item')
+ v-list-item-title(v-text='item.name')
+ v-list-item-subtitle(v-text='`${item.address}`')
+
+ v-row.mt-4
+ v-col.py-0(cols=12 sm=6)
+ v-text-field(v-model="place.latitude"
+ :prepend-icon='mdiLatitude'
+ :disabled='disableGeocoded'
+ :label="$t('common.latitude')"
+ :rules="$validators.latitude")
+ v-col.py-0(cols=12 sm=6)
+ v-text-field(v-model="place.longitude"
+ :prepend-icon='mdiLongitude'
+ :disabled='disableGeocoded'
+ :label="$t('common.longitude')"
+ :rules="$validators.longitude")
+ p.mt-4(v-if='place.isNew' v-html="$t('event.address_geocoded_disclaimer')")
+
+ MapEdit.mt-4(:place='place' v-if="(settings.allow_geolocation && place.name !== 'online' && place.latitude && place.longitude)" )
+
+ v-divider(v-if='settings.allow_online_event && showGeocoded')
+
+ v-card-text.mt-6(v-if='settings.allow_online_event')
+ v-combobox(v-model="onlineLocations_update"
+ :prepend-icon='mdiLink'
+ :hint="$t('event.online_locations_help')"
+ :label="$t('event.online_locations')"
+ clearable chips small-chips multiple deletable-chips hide-no-data hide-selected persistent-hint
+ :delimiters="[',', ';']"
+ :items="onlineLocations_update")
+ template(v-slot:selection="{ item, index, on, attrs, selected, parent }")
+ v-chip(v-bind="attrs" :outlined='index !== 0'
+ close :close-icon='mdiCloseCircle' @click:close='parent.selectItem(item)'
+ :input-value="selected" label small) {{ item }}
+
+
+ v-card-actions
+ v-spacer
+ v-btn(@click='close' outlined) Close
+
+
+
diff --git a/components/admin/Geolocation.vue b/components/admin/Geolocation.vue
index 0be71eff..f1b23061 100644
--- a/components/admin/Geolocation.vue
+++ b/components/admin/Geolocation.vue
@@ -60,7 +60,7 @@ v-card
diff --git a/components/admin/Settings.vue b/components/admin/Settings.vue
index e80ba08d..d5cc2c2b 100644
--- a/components/admin/Settings.vue
+++ b/components/admin/Settings.vue
@@ -52,6 +52,10 @@ v-container
inset
:label="$t('admin.recurrent_event_visible')")
+ v-switch.mt-1(v-model='allow_online_event'
+ inset
+ :label="$t('admin.allow_online_event')")
+
v-switch.mt-1(v-model='allow_geolocation'
inset
:label="$t('admin.allow_geolocation')")
@@ -126,6 +130,10 @@ export default {
get () { return this.settings.allow_geolocation },
set (value) { this.setSetting({ key: 'allow_geolocation', value }) }
},
+ allow_online_event: {
+ get () { return this.settings.allow_online_event },
+ set (value) { this.setSetting({ key: 'allow_online_event', value }) }
+ },
filteredTimezones () {
const current_timezone = DateTime.local().zoneName
tzNames.unshift(current_timezone)
diff --git a/locales/en.json b/locales/en.json
index 818a57eb..d1d0a0e5 100644
--- a/locales/en.json
+++ b/locales/en.json
@@ -98,7 +98,11 @@
"about": "About",
"content": "Content",
"admin_actions": "Admin actions",
- "recurring_event_actions": "Recurring event actions"
+ "recurring_event_actions": "Recurring event actions",
+ "latitude": "Latitude",
+ "longitude": "Longitude",
+ "search_coordinates": "Search coordinates",
+ "online": "On-line"
},
"login": {
"description": "By logging in you can publish new events.",
@@ -140,7 +144,7 @@
"updated": "Event updated",
"where_description": "Where's the event? If not present you can create it.",
"address_description": "What is the address?",
- "address_description_osm": "What is the address? (OpenStreetMap contributors)",
+ "address_description_osm": "Search coordinates by typing the address. (OpenStreetMap contributors)",
"confirmed": "Event confirmed",
"not_found": "Could not find event",
"remove_confirmation": "Are you sure you want to remove this event?",
@@ -178,7 +182,13 @@
"alt_text_description": "Description for people with visual impairments",
"choose_focal_point": "Choose the focal point",
"remove_media_confirmation": "Do you confirm the image removal?",
- "download_flyer": "Download flyer"
+ "download_flyer": "Download flyer",
+ "where_advanced_options": "Place - Advanced options",
+ "where_advanced_options_description": "Define here additional place properties",
+ "online_locations": "Online locations",
+ "online_locations_help": "For instance an url to a videconference room and a fallback url (max. 3)",
+ "online_locations_fallback_urls": "Fallback links",
+ "address_geocoded_disclaimer": "If you cannot find the street address or the housenumber you are looking for in the geocoding results, you can manually insert them in the 'Address' field without loose the coordinates. Consider also that the OpenStreetMap project is open to contributions. If you have Android, we recommend StreetComplete "
},
"admin": {
"place_description": "If you have gotten the place or address wrong, you can change it.
All current and past events associated with this place will change address.",
@@ -196,6 +206,8 @@
"allow_anon_event": "Allow anonymous events (has to be confirmed)?",
"allow_multidate_event": "Allow multi-day events",
"allow_recurrent_event": "Allow recurring events",
+ "allow_online_event": "Allow online events",
+ "allow_online_event_hint": "Ask for urls ",
"allow_geolocation": "Allow events geolocation",
"recurrent_event_visible": "Show recurring events by default",
"federation": "Federation / ActivityPub",
@@ -328,7 +340,9 @@
},
"validators": {
"required": "{fieldName} is required",
- "email": "Insert a valid email"
+ "email": "Insert a valid email",
+ "latitude": "Insert a valid latitude (-90 < latitude < 90)",
+ "longitude": "Insert a valid latitude (-180 < latitude < 180)"
},
"about": "\n
+
diff --git a/plugins/validators.js b/plugins/validators.js
index 8014b41c..b693ba74 100644
--- a/plugins/validators.js
+++ b/plugins/validators.js
@@ -12,6 +12,12 @@ export default ({ app }, inject) => {
],
password: [
v => !!v || $t('validators.required', { fieldName: $t('common.password') })
+ ],
+ latitude: [
+ v => (v < 90 && v > -90) || $t('validators.latitude')
+ ],
+ longitude: [
+ v => (v < 180 && v > -180) || $t('validators.longitude')
]
}
diff --git a/server/api/controller/event.js b/server/api/controller/event.js
index ebefac6b..e9330d4d 100644
--- a/server/api/controller/event.js
+++ b/server/api/controller/event.js
@@ -31,14 +31,14 @@ const eventController = {
const place_name = body.place_name && body.place_name.trim()
const place_address = body.place_address && body.place_address.trim()
- if (!place_address || !place_name) {
+ if (!place_name || !place_address && place_name !== 'online') {
throw new Error(`place_id or place_name and place_address are required`)
}
let place = await Place.findOne({ where: Sequelize.where(Sequelize.fn('LOWER', Sequelize.col('name')), Sequelize.Op.eq, place_name.toLocaleLowerCase()) })
if (!place) {
place = await Place.create({
name: place_name,
- address: place_address,
+ address: place_address || '',
latitude: Number(body.place_latitude) || null,
longitude: Number(body.place_longitude) || null
})
@@ -335,6 +335,7 @@ const eventController = {
multidate: body.multidate,
start_datetime: body.start_datetime,
end_datetime: body.end_datetime,
+ online_locations: body.online_locations,
recurrent,
// publish this event only if authenticated
is_visible: !!req.user
@@ -419,6 +420,7 @@ const eventController = {
multidate: body.multidate,
start_datetime: body.start_datetime || event.start_datetime,
end_datetime: body.end_datetime || null,
+ online_locations: body.online_locations,
recurrent
}
@@ -675,7 +677,8 @@ const eventController = {
media: e.media,
is_visible: true,
userId: e.userId,
- placeId: e.placeId
+ placeId: e.placeId,
+ ...(e.online_locations && { online_locations: e.online_locations } )
}
const recurrentDetails = e.recurrent
diff --git a/server/api/controller/settings.js b/server/api/controller/settings.js
index 9def247a..28358e59 100644
--- a/server/api/controller/settings.js
+++ b/server/api/controller/settings.js
@@ -27,6 +27,7 @@ const defaultSettings = {
allow_anon_event: true,
allow_multidate_event: true,
allow_recurrent_event: false,
+ allow_online_event: true,
recurrent_event_visible: false,
allow_geolocation: false,
geocoding_provider_type: 'Nominatim',
diff --git a/server/api/index.js b/server/api/index.js
index 1697fb6f..01095006 100644
--- a/server/api/index.js
+++ b/server/api/index.js
@@ -101,6 +101,7 @@ module.exports = () => {
* @param {string} [query] - search for this string
* @param {array} [tags] - List of tags
* @param {array} [places] - List of places id
+ * @param {array} [online_locations] - List of online locations
* @param {integer} [max] - Limit events
* @param {boolean} [show_recurrent] - Show also recurrent events (default: as choosen in admin settings)
* @param {integer} [page] - Pagination
@@ -124,6 +125,7 @@ module.exports = () => {
* @param {string} [place_address] - the address of the place
* @param {float} [place_latitude] - the latitude of the place
* @param {float} [place_longitude] - the longitude of the place
+ * @param {array} online_locations - List of online locations
* @param {integer} start_datetime - start timestamp
* @param {integer} multidate - is a multidate event?
* @param {array} tags - List of tags
diff --git a/server/api/models/event.js b/server/api/models/event.js
index f29ed815..b2e29430 100644
--- a/server/api/models/event.js
+++ b/server/api/models/event.js
@@ -31,7 +31,8 @@ module.exports = (sequelize, DataTypes) => {
is_visible: DataTypes.BOOLEAN,
recurrent: DataTypes.JSON,
likes: { type: DataTypes.JSON, defaultValue: [] },
- boost: { type: DataTypes.JSON, defaultValue: [] }
+ boost: { type: DataTypes.JSON, defaultValue: [] },
+ online_locations: { type: DataTypes.JSON, defaultValue: [] }
})
Event.prototype.toAP = function (settings, to = []) {
diff --git a/server/helpers.js b/server/helpers.js
index cd072e8e..3b2d59e5 100644
--- a/server/helpers.js
+++ b/server/helpers.js
@@ -79,6 +79,7 @@ module.exports = {
allow_anon_event: settings.allow_anon_event,
allow_recurrent_event: settings.allow_recurrent_event,
allow_multidate_event: settings.allow_multidate_event,
+ allow_online_event: settings.allow_online_event,
recurrent_event_visible: settings.recurrent_event_visible,
enable_federation: settings.enable_federation,
enable_resources: settings.enable_resources,
@@ -98,7 +99,7 @@ module.exports = {
tilelayer_provider: settings.tilelayer_provider,
tilelayer_provider_attribution: settings.tilelayer_provider_attribution,
footerLinks: settings.footerLinks,
- about: settings.about
+ about: settings.about,
}
next()
},
diff --git a/server/helpers/geolocation.js b/server/helpers/geolocation.js
deleted file mode 100644
index e1edaa88..00000000
--- a/server/helpers/geolocation.js
+++ /dev/null
@@ -1,987 +0,0 @@
-// Iso conversions
-
-var isoCountries = [
- {
- "code": "af",
- "name": "Afghanistan"
- },
- {
- "code": "ax",
- "name": "Aland Islands"
- },
- {
- "code": "al",
- "name": "Albania"
- },
- {
- "code": "dz",
- "name": "Algeria"
- },
- {
- "code": "as",
- "name": "American Samoa"
- },
- {
- "code": "ad",
- "name": "Andorra"
- },
- {
- "code": "ao",
- "name": "Angola"
- },
- {
- "code": "ai",
- "name": "Anguilla"
- },
- {
- "code": "aq",
- "name": "Antarctica"
- },
- {
- "code": "ag",
- "name": "Antigua And Barbuda"
- },
- {
- "code": "ar",
- "name": "Argentina"
- },
- {
- "code": "am",
- "name": "Armenia"
- },
- {
- "code": "aw",
- "name": "Aruba"
- },
- {
- "code": "au",
- "name": "Australia"
- },
- {
- "code": "at",
- "name": "Austria"
- },
- {
- "code": "az",
- "name": "Azerbaijan"
- },
- {
- "code": "bs",
- "name": "Bahamas"
- },
- {
- "code": "bh",
- "name": "Bahrain"
- },
- {
- "code": "bd",
- "name": "Bangladesh"
- },
- {
- "code": "bb",
- "name": "Barbados"
- },
- {
- "code": "by",
- "name": "Belarus"
- },
- {
- "code": "be",
- "name": "Belgium"
- },
- {
- "code": "bz",
- "name": "Belize"
- },
- {
- "code": "bj",
- "name": "Benin"
- },
- {
- "code": "bm",
- "name": "Bermuda"
- },
- {
- "code": "bt",
- "name": "Bhutan"
- },
- {
- "code": "bo",
- "name": "Bolivia"
- },
- {
- "code": "ba",
- "name": "Bosnia And Herzegovina"
- },
- {
- "code": "bw",
- "name": "Botswana"
- },
- {
- "code": "bv",
- "name": "Bouvet Island"
- },
- {
- "code": "br",
- "name": "Brazil"
- },
- {
- "code": "io",
- "name": "British Indian Ocean Territory"
- },
- {
- "code": "bn",
- "name": "Brunei Darussalam"
- },
- {
- "code": "bg",
- "name": "Bulgaria"
- },
- {
- "code": "bf",
- "name": "Burkina Faso"
- },
- {
- "code": "bi",
- "name": "Burundi"
- },
- {
- "code": "kh",
- "name": "Cambodia"
- },
- {
- "code": "cm",
- "name": "Cameroon"
- },
- {
- "code": "ca",
- "name": "Canada"
- },
- {
- "code": "cv",
- "name": "Cape Verde"
- },
- {
- "code": "ky",
- "name": "Cayman Islands"
- },
- {
- "code": "cf",
- "name": "Central African Republic"
- },
- {
- "code": "td",
- "name": "Chad"
- },
- {
- "code": "cl",
- "name": "Chile"
- },
- {
- "code": "cn",
- "name": "China"
- },
- {
- "code": "cx",
- "name": "Christmas Island"
- },
- {
- "code": "cc",
- "name": "Cocos (Keeling) Islands"
- },
- {
- "code": "co",
- "name": "Colombia"
- },
- {
- "code": "km",
- "name": "Comoros"
- },
- {
- "code": "cg",
- "name": "Congo"
- },
- {
- "code": "cd",
- "name": "Congo, Democratic Republic"
- },
- {
- "code": "ck",
- "name": "Cook Islands"
- },
- {
- "code": "cr",
- "name": "Costa Rica"
- },
- {
- "code": "ci",
- "name": "Cote D'Ivoire"
- },
- {
- "code": "hr",
- "name": "Croatia"
- },
- {
- "code": "cu",
- "name": "Cuba"
- },
- {
- "code": "cy",
- "name": "Cyprus"
- },
- {
- "code": "cz",
- "name": "Czech Republic"
- },
- {
- "code": "dk",
- "name": "Denmark"
- },
- {
- "code": "dj",
- "name": "Djibouti"
- },
- {
- "code": "dm",
- "name": "Dominica"
- },
- {
- "code": "do",
- "name": "Dominican Republic"
- },
- {
- "code": "ec",
- "name": "Ecuador"
- },
- {
- "code": "eg",
- "name": "Egypt"
- },
- {
- "code": "sv",
- "name": "El Salvador"
- },
- {
- "code": "gq",
- "name": "Equatorial Guinea"
- },
- {
- "code": "er",
- "name": "Eritrea"
- },
- {
- "code": "ee",
- "name": "Estonia"
- },
- {
- "code": "et",
- "name": "Ethiopia"
- },
- {
- "code": "fk",
- "name": "Falkland Islands (Malvinas)"
- },
- {
- "code": "fo",
- "name": "Faroe Islands"
- },
- {
- "code": "fj",
- "name": "Fiji"
- },
- {
- "code": "fi",
- "name": "Finland"
- },
- {
- "code": "fr",
- "name": "France"
- },
- {
- "code": "gf",
- "name": "French Guiana"
- },
- {
- "code": "pf",
- "name": "French Polynesia"
- },
- {
- "code": "tf",
- "name": "French Southern Territories"
- },
- {
- "code": "ga",
- "name": "Gabon"
- },
- {
- "code": "gm",
- "name": "Gambia"
- },
- {
- "code": "ge",
- "name": "Georgia"
- },
- {
- "code": "de",
- "name": "Germany"
- },
- {
- "code": "gh",
- "name": "Ghana"
- },
- {
- "code": "gi",
- "name": "Gibraltar"
- },
- {
- "code": "gr",
- "name": "Greece"
- },
- {
- "code": "gl",
- "name": "Greenland"
- },
- {
- "code": "gd",
- "name": "Grenada"
- },
- {
- "code": "gp",
- "name": "Guadeloupe"
- },
- {
- "code": "gu",
- "name": "Guam"
- },
- {
- "code": "gt",
- "name": "Guatemala"
- },
- {
- "code": "gg",
- "name": "Guernsey"
- },
- {
- "code": "gn",
- "name": "Guinea"
- },
- {
- "code": "gw",
- "name": "Guinea-Bissau"
- },
- {
- "code": "gy",
- "name": "Guyana"
- },
- {
- "code": "ht",
- "name": "Haiti"
- },
- {
- "code": "hm",
- "name": "Heard Island & Mcdonald Islands"
- },
- {
- "code": "va",
- "name": "Holy See (Vatican City State)"
- },
- {
- "code": "hn",
- "name": "Honduras"
- },
- {
- "code": "hk",
- "name": "Hong Kong"
- },
- {
- "code": "hu",
- "name": "Hungary"
- },
- {
- "code": "is",
- "name": "Iceland"
- },
- {
- "code": "in",
- "name": "India"
- },
- {
- "code": "id",
- "name": "Indonesia"
- },
- {
- "code": "ir",
- "name": "Iran, Islamic Republic Of"
- },
- {
- "code": "iq",
- "name": "Iraq"
- },
- {
- "code": "ie",
- "name": "Ireland"
- },
- {
- "code": "im",
- "name": "Isle Of Man"
- },
- {
- "code": "il",
- "name": "Israel"
- },
- {
- "code": "it",
- "name": "Italy"
- },
- {
- "code": "jm",
- "name": "Jamaica"
- },
- {
- "code": "jp",
- "name": "Japan"
- },
- {
- "code": "je",
- "name": "Jersey"
- },
- {
- "code": "jo",
- "name": "Jordan"
- },
- {
- "code": "kz",
- "name": "Kazakhstan"
- },
- {
- "code": "ke",
- "name": "Kenya"
- },
- {
- "code": "ki",
- "name": "Kiribati"
- },
- {
- "code": "kr",
- "name": "Korea"
- },
- {
- "code": "kw",
- "name": "Kuwait"
- },
- {
- "code": "kg",
- "name": "Kyrgyzstan"
- },
- {
- "code": "la",
- "name": "Lao People's Democratic Republic"
- },
- {
- "code": "lv",
- "name": "Latvia"
- },
- {
- "code": "lb",
- "name": "Lebanon"
- },
- {
- "code": "ls",
- "name": "Lesotho"
- },
- {
- "code": "lr",
- "name": "Liberia"
- },
- {
- "code": "ly",
- "name": "Libyan Arab Jamahiriya"
- },
- {
- "code": "li",
- "name": "Liechtenstein"
- },
- {
- "code": "lt",
- "name": "Lithuania"
- },
- {
- "code": "lu",
- "name": "Luxembourg"
- },
- {
- "code": "mo",
- "name": "Macao"
- },
- {
- "code": "mk",
- "name": "Macedonia"
- },
- {
- "code": "mg",
- "name": "Madagascar"
- },
- {
- "code": "mw",
- "name": "Malawi"
- },
- {
- "code": "my",
- "name": "Malaysia"
- },
- {
- "code": "mv",
- "name": "Maldives"
- },
- {
- "code": "ml",
- "name": "Mali"
- },
- {
- "code": "mt",
- "name": "Malta"
- },
- {
- "code": "mh",
- "name": "Marshall Islands"
- },
- {
- "code": "mq",
- "name": "Martinique"
- },
- {
- "code": "mr",
- "name": "Mauritania"
- },
- {
- "code": "mu",
- "name": "Mauritius"
- },
- {
- "code": "yt",
- "name": "Mayotte"
- },
- {
- "code": "mx",
- "name": "Mexico"
- },
- {
- "code": "fm",
- "name": "Micronesia, Federated States Of"
- },
- {
- "code": "md",
- "name": "Moldova"
- },
- {
- "code": "mc",
- "name": "Monaco"
- },
- {
- "code": "mn",
- "name": "Mongolia"
- },
- {
- "code": "me",
- "name": "Montenegro"
- },
- {
- "code": "ms",
- "name": "Montserrat"
- },
- {
- "code": "ma",
- "name": "Morocco"
- },
- {
- "code": "mz",
- "name": "Mozambique"
- },
- {
- "code": "mm",
- "name": "Myanmar"
- },
- {
- "code": "na",
- "name": "Namibia"
- },
- {
- "code": "nr",
- "name": "Nauru"
- },
- {
- "code": "np",
- "name": "Nepal"
- },
- {
- "code": "nl",
- "name": "Netherlands"
- },
- {
- "code": "an",
- "name": "Netherlands Antilles"
- },
- {
- "code": "nc",
- "name": "New Caledonia"
- },
- {
- "code": "nz",
- "name": "New Zealand"
- },
- {
- "code": "ni",
- "name": "Nicaragua"
- },
- {
- "code": "ne",
- "name": "Niger"
- },
- {
- "code": "ng",
- "name": "Nigeria"
- },
- {
- "code": "nu",
- "name": "Niue"
- },
- {
- "code": "nf",
- "name": "Norfolk Island"
- },
- {
- "code": "mp",
- "name": "Northern Mariana Islands"
- },
- {
- "code": "no",
- "name": "Norway"
- },
- {
- "code": "om",
- "name": "Oman"
- },
- {
- "code": "pk",
- "name": "Pakistan"
- },
- {
- "code": "pw",
- "name": "Palau"
- },
- {
- "code": "ps",
- "name": "Palestinian Territory, Occupied"
- },
- {
- "code": "pa",
- "name": "Panama"
- },
- {
- "code": "pg",
- "name": "Papua New Guinea"
- },
- {
- "code": "py",
- "name": "Paraguay"
- },
- {
- "code": "pe",
- "name": "Peru"
- },
- {
- "code": "ph",
- "name": "Philippines"
- },
- {
- "code": "pn",
- "name": "Pitcairn"
- },
- {
- "code": "pl",
- "name": "Poland"
- },
- {
- "code": "pt",
- "name": "Portugal"
- },
- {
- "code": "pr",
- "name": "Puerto Rico"
- },
- {
- "code": "qa",
- "name": "Qatar"
- },
- {
- "code": "re",
- "name": "Reunion"
- },
- {
- "code": "ro",
- "name": "Romania"
- },
- {
- "code": "ru",
- "name": "Russian Federation"
- },
- {
- "code": "rw",
- "name": "Rwanda"
- },
- {
- "code": "bl",
- "name": "Saint Barthelemy"
- },
- {
- "code": "sh",
- "name": "Saint Helena"
- },
- {
- "code": "kn",
- "name": "Saint Kitts And Nevis"
- },
- {
- "code": "lc",
- "name": "Saint Lucia"
- },
- {
- "code": "mf",
- "name": "Saint Martin"
- },
- {
- "code": "pm",
- "name": "Saint Pierre And Miquelon"
- },
- {
- "code": "vc",
- "name": "Saint Vincent And Grenadines"
- },
- {
- "code": "ws",
- "name": "Samoa"
- },
- {
- "code": "sm",
- "name": "San Marino"
- },
- {
- "code": "st",
- "name": "Sao Tome And Principe"
- },
- {
- "code": "sa",
- "name": "Saudi Arabia"
- },
- {
- "code": "sn",
- "name": "Senegal"
- },
- {
- "code": "rs",
- "name": "Serbia"
- },
- {
- "code": "sc",
- "name": "Seychelles"
- },
- {
- "code": "sl",
- "name": "Sierra Leone"
- },
- {
- "code": "sg",
- "name": "Singapore"
- },
- {
- "code": "sk",
- "name": "Slovakia"
- },
- {
- "code": "si",
- "name": "Slovenia"
- },
- {
- "code": "sb",
- "name": "Solomon Islands"
- },
- {
- "code": "so",
- "name": "Somalia"
- },
- {
- "code": "za",
- "name": "South Africa"
- },
- {
- "code": "gs",
- "name": "South Georgia And Sandwich Isl."
- },
- {
- "code": "es",
- "name": "Spain"
- },
- {
- "code": "lk",
- "name": "Sri Lanka"
- },
- {
- "code": "sd",
- "name": "Sudan"
- },
- {
- "code": "sr",
- "name": "Suriname"
- },
- {
- "code": "sj",
- "name": "Svalbard And Jan Mayen"
- },
- {
- "code": "sz",
- "name": "Swaziland"
- },
- {
- "code": "se",
- "name": "Sweden"
- },
- {
- "code": "ch",
- "name": "Switzerland"
- },
- {
- "code": "sy",
- "name": "Syrian Arab Republic"
- },
- {
- "code": "tw",
- "name": "Taiwan"
- },
- {
- "code": "tj",
- "name": "Tajikistan"
- },
- {
- "code": "tz",
- "name": "Tanzania"
- },
- {
- "code": "th",
- "name": "Thailand"
- },
- {
- "code": "tl",
- "name": "Timor-Leste"
- },
- {
- "code": "tg",
- "name": "Togo"
- },
- {
- "code": "tk",
- "name": "Tokelau"
- },
- {
- "code": "to",
- "name": "Tonga"
- },
- {
- "code": "tt",
- "name": "Trinidad And Tobago"
- },
- {
- "code": "tn",
- "name": "Tunisia"
- },
- {
- "code": "tr",
- "name": "Turkey"
- },
- {
- "code": "tm",
- "name": "Turkmenistan"
- },
- {
- "code": "tc",
- "name": "Turks And Caicos Islands"
- },
- {
- "code": "tv",
- "name": "Tuvalu"
- },
- {
- "code": "ug",
- "name": "Uganda"
- },
- {
- "code": "ua",
- "name": "Ukraine"
- },
- {
- "code": "ae",
- "name": "United Arab Emirates"
- },
- {
- "code": "gb",
- "name": "United Kingdom"
- },
- {
- "code": "us",
- "name": "United States"
- },
- {
- "code": "um",
- "name": "United States Outlying Islands"
- },
- {
- "code": "uy",
- "name": "Uruguay"
- },
- {
- "code": "uz",
- "name": "Uzbekistan"
- },
- {
- "code": "vu",
- "name": "Vanuatu"
- },
- {
- "code": "ve",
- "name": "Venezuela"
- },
- {
- "code": "vn",
- "name": "Viet Nam"
- },
- {
- "code": "vg",
- "name": "Virgin Islands, British"
- },
- {
- "code": "vi",
- "name": "Virgin Islands, U.S."
- },
- {
- "code": "wf",
- "name": "Wallis And Futuna"
- },
- {
- "code": "eh",
- "name": "Western Sahara"
- },
- {
- "code": "ye",
- "name": "Yemen"
- },
- {
- "code": "zm",
- "name": "Zambia"
- },
- {
- "code": "zw",
- "name": "Zimbabwe"
- }
- ]
-
-
-module.exports = { isoCountries }
diff --git a/server/helpers/geolocation/index.js b/server/helpers/geolocation/index.js
new file mode 100644
index 00000000..f8beaf3d
--- /dev/null
+++ b/server/helpers/geolocation/index.js
@@ -0,0 +1,18 @@
+const nominatim = require('../../../server/services/geocoding/nominatim')
+const photon = require('../../../server/services/geocoding/photon')
+
+const geocodingProviders = [ nominatim, photon ]
+
+const geolocation = {
+ getGeocodingProvider(providerName) {
+ let geocodingProvider
+ geocodingProviders.forEach((item) => {
+ if (item.commonName === providerName) {
+ geocodingProvider = item
+ }
+ })
+ return geocodingProvider
+ }
+}
+
+module.exports = geolocation
\ No newline at end of file
diff --git a/server/helpers/geolocation/isoCountries.js b/server/helpers/geolocation/isoCountries.js
new file mode 100644
index 00000000..0ba6e700
--- /dev/null
+++ b/server/helpers/geolocation/isoCountries.js
@@ -0,0 +1,987 @@
+// Iso conversions
+
+var isoCountries = [
+ {
+ "code": "af",
+ "name": "Afghanistan"
+ },
+ {
+ "code": "ax",
+ "name": "Aland Islands"
+ },
+ {
+ "code": "al",
+ "name": "Albania"
+ },
+ {
+ "code": "dz",
+ "name": "Algeria"
+ },
+ {
+ "code": "as",
+ "name": "American Samoa"
+ },
+ {
+ "code": "ad",
+ "name": "Andorra"
+ },
+ {
+ "code": "ao",
+ "name": "Angola"
+ },
+ {
+ "code": "ai",
+ "name": "Anguilla"
+ },
+ {
+ "code": "aq",
+ "name": "Antarctica"
+ },
+ {
+ "code": "ag",
+ "name": "Antigua And Barbuda"
+ },
+ {
+ "code": "ar",
+ "name": "Argentina"
+ },
+ {
+ "code": "am",
+ "name": "Armenia"
+ },
+ {
+ "code": "aw",
+ "name": "Aruba"
+ },
+ {
+ "code": "au",
+ "name": "Australia"
+ },
+ {
+ "code": "at",
+ "name": "Austria"
+ },
+ {
+ "code": "az",
+ "name": "Azerbaijan"
+ },
+ {
+ "code": "bs",
+ "name": "Bahamas"
+ },
+ {
+ "code": "bh",
+ "name": "Bahrain"
+ },
+ {
+ "code": "bd",
+ "name": "Bangladesh"
+ },
+ {
+ "code": "bb",
+ "name": "Barbados"
+ },
+ {
+ "code": "by",
+ "name": "Belarus"
+ },
+ {
+ "code": "be",
+ "name": "Belgium"
+ },
+ {
+ "code": "bz",
+ "name": "Belize"
+ },
+ {
+ "code": "bj",
+ "name": "Benin"
+ },
+ {
+ "code": "bm",
+ "name": "Bermuda"
+ },
+ {
+ "code": "bt",
+ "name": "Bhutan"
+ },
+ {
+ "code": "bo",
+ "name": "Bolivia"
+ },
+ {
+ "code": "ba",
+ "name": "Bosnia And Herzegovina"
+ },
+ {
+ "code": "bw",
+ "name": "Botswana"
+ },
+ {
+ "code": "bv",
+ "name": "Bouvet Island"
+ },
+ {
+ "code": "br",
+ "name": "Brazil"
+ },
+ {
+ "code": "io",
+ "name": "British Indian Ocean Territory"
+ },
+ {
+ "code": "bn",
+ "name": "Brunei Darussalam"
+ },
+ {
+ "code": "bg",
+ "name": "Bulgaria"
+ },
+ {
+ "code": "bf",
+ "name": "Burkina Faso"
+ },
+ {
+ "code": "bi",
+ "name": "Burundi"
+ },
+ {
+ "code": "kh",
+ "name": "Cambodia"
+ },
+ {
+ "code": "cm",
+ "name": "Cameroon"
+ },
+ {
+ "code": "ca",
+ "name": "Canada"
+ },
+ {
+ "code": "cv",
+ "name": "Cape Verde"
+ },
+ {
+ "code": "ky",
+ "name": "Cayman Islands"
+ },
+ {
+ "code": "cf",
+ "name": "Central African Republic"
+ },
+ {
+ "code": "td",
+ "name": "Chad"
+ },
+ {
+ "code": "cl",
+ "name": "Chile"
+ },
+ {
+ "code": "cn",
+ "name": "China"
+ },
+ {
+ "code": "cx",
+ "name": "Christmas Island"
+ },
+ {
+ "code": "cc",
+ "name": "Cocos (Keeling) Islands"
+ },
+ {
+ "code": "co",
+ "name": "Colombia"
+ },
+ {
+ "code": "km",
+ "name": "Comoros"
+ },
+ {
+ "code": "cg",
+ "name": "Congo"
+ },
+ {
+ "code": "cd",
+ "name": "Congo, Democratic Republic"
+ },
+ {
+ "code": "ck",
+ "name": "Cook Islands"
+ },
+ {
+ "code": "cr",
+ "name": "Costa Rica"
+ },
+ {
+ "code": "ci",
+ "name": "Cote D'Ivoire"
+ },
+ {
+ "code": "hr",
+ "name": "Croatia"
+ },
+ {
+ "code": "cu",
+ "name": "Cuba"
+ },
+ {
+ "code": "cy",
+ "name": "Cyprus"
+ },
+ {
+ "code": "cz",
+ "name": "Czech Republic"
+ },
+ {
+ "code": "dk",
+ "name": "Denmark"
+ },
+ {
+ "code": "dj",
+ "name": "Djibouti"
+ },
+ {
+ "code": "dm",
+ "name": "Dominica"
+ },
+ {
+ "code": "do",
+ "name": "Dominican Republic"
+ },
+ {
+ "code": "ec",
+ "name": "Ecuador"
+ },
+ {
+ "code": "eg",
+ "name": "Egypt"
+ },
+ {
+ "code": "sv",
+ "name": "El Salvador"
+ },
+ {
+ "code": "gq",
+ "name": "Equatorial Guinea"
+ },
+ {
+ "code": "er",
+ "name": "Eritrea"
+ },
+ {
+ "code": "ee",
+ "name": "Estonia"
+ },
+ {
+ "code": "et",
+ "name": "Ethiopia"
+ },
+ {
+ "code": "fk",
+ "name": "Falkland Islands (Malvinas)"
+ },
+ {
+ "code": "fo",
+ "name": "Faroe Islands"
+ },
+ {
+ "code": "fj",
+ "name": "Fiji"
+ },
+ {
+ "code": "fi",
+ "name": "Finland"
+ },
+ {
+ "code": "fr",
+ "name": "France"
+ },
+ {
+ "code": "gf",
+ "name": "French Guiana"
+ },
+ {
+ "code": "pf",
+ "name": "French Polynesia"
+ },
+ {
+ "code": "tf",
+ "name": "French Southern Territories"
+ },
+ {
+ "code": "ga",
+ "name": "Gabon"
+ },
+ {
+ "code": "gm",
+ "name": "Gambia"
+ },
+ {
+ "code": "ge",
+ "name": "Georgia"
+ },
+ {
+ "code": "de",
+ "name": "Germany"
+ },
+ {
+ "code": "gh",
+ "name": "Ghana"
+ },
+ {
+ "code": "gi",
+ "name": "Gibraltar"
+ },
+ {
+ "code": "gr",
+ "name": "Greece"
+ },
+ {
+ "code": "gl",
+ "name": "Greenland"
+ },
+ {
+ "code": "gd",
+ "name": "Grenada"
+ },
+ {
+ "code": "gp",
+ "name": "Guadeloupe"
+ },
+ {
+ "code": "gu",
+ "name": "Guam"
+ },
+ {
+ "code": "gt",
+ "name": "Guatemala"
+ },
+ {
+ "code": "gg",
+ "name": "Guernsey"
+ },
+ {
+ "code": "gn",
+ "name": "Guinea"
+ },
+ {
+ "code": "gw",
+ "name": "Guinea-Bissau"
+ },
+ {
+ "code": "gy",
+ "name": "Guyana"
+ },
+ {
+ "code": "ht",
+ "name": "Haiti"
+ },
+ {
+ "code": "hm",
+ "name": "Heard Island & Mcdonald Islands"
+ },
+ {
+ "code": "va",
+ "name": "Holy See (Vatican City State)"
+ },
+ {
+ "code": "hn",
+ "name": "Honduras"
+ },
+ {
+ "code": "hk",
+ "name": "Hong Kong"
+ },
+ {
+ "code": "hu",
+ "name": "Hungary"
+ },
+ {
+ "code": "is",
+ "name": "Iceland"
+ },
+ {
+ "code": "in",
+ "name": "India"
+ },
+ {
+ "code": "id",
+ "name": "Indonesia"
+ },
+ {
+ "code": "ir",
+ "name": "Iran, Islamic Republic Of"
+ },
+ {
+ "code": "iq",
+ "name": "Iraq"
+ },
+ {
+ "code": "ie",
+ "name": "Ireland"
+ },
+ {
+ "code": "im",
+ "name": "Isle Of Man"
+ },
+ {
+ "code": "il",
+ "name": "Israel"
+ },
+ {
+ "code": "it",
+ "name": "Italy"
+ },
+ {
+ "code": "jm",
+ "name": "Jamaica"
+ },
+ {
+ "code": "jp",
+ "name": "Japan"
+ },
+ {
+ "code": "je",
+ "name": "Jersey"
+ },
+ {
+ "code": "jo",
+ "name": "Jordan"
+ },
+ {
+ "code": "kz",
+ "name": "Kazakhstan"
+ },
+ {
+ "code": "ke",
+ "name": "Kenya"
+ },
+ {
+ "code": "ki",
+ "name": "Kiribati"
+ },
+ {
+ "code": "kr",
+ "name": "Korea"
+ },
+ {
+ "code": "kw",
+ "name": "Kuwait"
+ },
+ {
+ "code": "kg",
+ "name": "Kyrgyzstan"
+ },
+ {
+ "code": "la",
+ "name": "Lao People's Democratic Republic"
+ },
+ {
+ "code": "lv",
+ "name": "Latvia"
+ },
+ {
+ "code": "lb",
+ "name": "Lebanon"
+ },
+ {
+ "code": "ls",
+ "name": "Lesotho"
+ },
+ {
+ "code": "lr",
+ "name": "Liberia"
+ },
+ {
+ "code": "ly",
+ "name": "Libyan Arab Jamahiriya"
+ },
+ {
+ "code": "li",
+ "name": "Liechtenstein"
+ },
+ {
+ "code": "lt",
+ "name": "Lithuania"
+ },
+ {
+ "code": "lu",
+ "name": "Luxembourg"
+ },
+ {
+ "code": "mo",
+ "name": "Macao"
+ },
+ {
+ "code": "mk",
+ "name": "Macedonia"
+ },
+ {
+ "code": "mg",
+ "name": "Madagascar"
+ },
+ {
+ "code": "mw",
+ "name": "Malawi"
+ },
+ {
+ "code": "my",
+ "name": "Malaysia"
+ },
+ {
+ "code": "mv",
+ "name": "Maldives"
+ },
+ {
+ "code": "ml",
+ "name": "Mali"
+ },
+ {
+ "code": "mt",
+ "name": "Malta"
+ },
+ {
+ "code": "mh",
+ "name": "Marshall Islands"
+ },
+ {
+ "code": "mq",
+ "name": "Martinique"
+ },
+ {
+ "code": "mr",
+ "name": "Mauritania"
+ },
+ {
+ "code": "mu",
+ "name": "Mauritius"
+ },
+ {
+ "code": "yt",
+ "name": "Mayotte"
+ },
+ {
+ "code": "mx",
+ "name": "Mexico"
+ },
+ {
+ "code": "fm",
+ "name": "Micronesia, Federated States Of"
+ },
+ {
+ "code": "md",
+ "name": "Moldova"
+ },
+ {
+ "code": "mc",
+ "name": "Monaco"
+ },
+ {
+ "code": "mn",
+ "name": "Mongolia"
+ },
+ {
+ "code": "me",
+ "name": "Montenegro"
+ },
+ {
+ "code": "ms",
+ "name": "Montserrat"
+ },
+ {
+ "code": "ma",
+ "name": "Morocco"
+ },
+ {
+ "code": "mz",
+ "name": "Mozambique"
+ },
+ {
+ "code": "mm",
+ "name": "Myanmar"
+ },
+ {
+ "code": "na",
+ "name": "Namibia"
+ },
+ {
+ "code": "nr",
+ "name": "Nauru"
+ },
+ {
+ "code": "np",
+ "name": "Nepal"
+ },
+ {
+ "code": "nl",
+ "name": "Netherlands"
+ },
+ {
+ "code": "an",
+ "name": "Netherlands Antilles"
+ },
+ {
+ "code": "nc",
+ "name": "New Caledonia"
+ },
+ {
+ "code": "nz",
+ "name": "New Zealand"
+ },
+ {
+ "code": "ni",
+ "name": "Nicaragua"
+ },
+ {
+ "code": "ne",
+ "name": "Niger"
+ },
+ {
+ "code": "ng",
+ "name": "Nigeria"
+ },
+ {
+ "code": "nu",
+ "name": "Niue"
+ },
+ {
+ "code": "nf",
+ "name": "Norfolk Island"
+ },
+ {
+ "code": "mp",
+ "name": "Northern Mariana Islands"
+ },
+ {
+ "code": "no",
+ "name": "Norway"
+ },
+ {
+ "code": "om",
+ "name": "Oman"
+ },
+ {
+ "code": "pk",
+ "name": "Pakistan"
+ },
+ {
+ "code": "pw",
+ "name": "Palau"
+ },
+ {
+ "code": "ps",
+ "name": "Palestinian Territory, Occupied"
+ },
+ {
+ "code": "pa",
+ "name": "Panama"
+ },
+ {
+ "code": "pg",
+ "name": "Papua New Guinea"
+ },
+ {
+ "code": "py",
+ "name": "Paraguay"
+ },
+ {
+ "code": "pe",
+ "name": "Peru"
+ },
+ {
+ "code": "ph",
+ "name": "Philippines"
+ },
+ {
+ "code": "pn",
+ "name": "Pitcairn"
+ },
+ {
+ "code": "pl",
+ "name": "Poland"
+ },
+ {
+ "code": "pt",
+ "name": "Portugal"
+ },
+ {
+ "code": "pr",
+ "name": "Puerto Rico"
+ },
+ {
+ "code": "qa",
+ "name": "Qatar"
+ },
+ {
+ "code": "re",
+ "name": "Reunion"
+ },
+ {
+ "code": "ro",
+ "name": "Romania"
+ },
+ {
+ "code": "ru",
+ "name": "Russian Federation"
+ },
+ {
+ "code": "rw",
+ "name": "Rwanda"
+ },
+ {
+ "code": "bl",
+ "name": "Saint Barthelemy"
+ },
+ {
+ "code": "sh",
+ "name": "Saint Helena"
+ },
+ {
+ "code": "kn",
+ "name": "Saint Kitts And Nevis"
+ },
+ {
+ "code": "lc",
+ "name": "Saint Lucia"
+ },
+ {
+ "code": "mf",
+ "name": "Saint Martin"
+ },
+ {
+ "code": "pm",
+ "name": "Saint Pierre And Miquelon"
+ },
+ {
+ "code": "vc",
+ "name": "Saint Vincent And Grenadines"
+ },
+ {
+ "code": "ws",
+ "name": "Samoa"
+ },
+ {
+ "code": "sm",
+ "name": "San Marino"
+ },
+ {
+ "code": "st",
+ "name": "Sao Tome And Principe"
+ },
+ {
+ "code": "sa",
+ "name": "Saudi Arabia"
+ },
+ {
+ "code": "sn",
+ "name": "Senegal"
+ },
+ {
+ "code": "rs",
+ "name": "Serbia"
+ },
+ {
+ "code": "sc",
+ "name": "Seychelles"
+ },
+ {
+ "code": "sl",
+ "name": "Sierra Leone"
+ },
+ {
+ "code": "sg",
+ "name": "Singapore"
+ },
+ {
+ "code": "sk",
+ "name": "Slovakia"
+ },
+ {
+ "code": "si",
+ "name": "Slovenia"
+ },
+ {
+ "code": "sb",
+ "name": "Solomon Islands"
+ },
+ {
+ "code": "so",
+ "name": "Somalia"
+ },
+ {
+ "code": "za",
+ "name": "South Africa"
+ },
+ {
+ "code": "gs",
+ "name": "South Georgia And Sandwich Isl."
+ },
+ {
+ "code": "es",
+ "name": "Spain"
+ },
+ {
+ "code": "lk",
+ "name": "Sri Lanka"
+ },
+ {
+ "code": "sd",
+ "name": "Sudan"
+ },
+ {
+ "code": "sr",
+ "name": "Suriname"
+ },
+ {
+ "code": "sj",
+ "name": "Svalbard And Jan Mayen"
+ },
+ {
+ "code": "sz",
+ "name": "Swaziland"
+ },
+ {
+ "code": "se",
+ "name": "Sweden"
+ },
+ {
+ "code": "ch",
+ "name": "Switzerland"
+ },
+ {
+ "code": "sy",
+ "name": "Syrian Arab Republic"
+ },
+ {
+ "code": "tw",
+ "name": "Taiwan"
+ },
+ {
+ "code": "tj",
+ "name": "Tajikistan"
+ },
+ {
+ "code": "tz",
+ "name": "Tanzania"
+ },
+ {
+ "code": "th",
+ "name": "Thailand"
+ },
+ {
+ "code": "tl",
+ "name": "Timor-Leste"
+ },
+ {
+ "code": "tg",
+ "name": "Togo"
+ },
+ {
+ "code": "tk",
+ "name": "Tokelau"
+ },
+ {
+ "code": "to",
+ "name": "Tonga"
+ },
+ {
+ "code": "tt",
+ "name": "Trinidad And Tobago"
+ },
+ {
+ "code": "tn",
+ "name": "Tunisia"
+ },
+ {
+ "code": "tr",
+ "name": "Turkey"
+ },
+ {
+ "code": "tm",
+ "name": "Turkmenistan"
+ },
+ {
+ "code": "tc",
+ "name": "Turks And Caicos Islands"
+ },
+ {
+ "code": "tv",
+ "name": "Tuvalu"
+ },
+ {
+ "code": "ug",
+ "name": "Uganda"
+ },
+ {
+ "code": "ua",
+ "name": "Ukraine"
+ },
+ {
+ "code": "ae",
+ "name": "United Arab Emirates"
+ },
+ {
+ "code": "gb",
+ "name": "United Kingdom"
+ },
+ {
+ "code": "us",
+ "name": "United States"
+ },
+ {
+ "code": "um",
+ "name": "United States Outlying Islands"
+ },
+ {
+ "code": "uy",
+ "name": "Uruguay"
+ },
+ {
+ "code": "uz",
+ "name": "Uzbekistan"
+ },
+ {
+ "code": "vu",
+ "name": "Vanuatu"
+ },
+ {
+ "code": "ve",
+ "name": "Venezuela"
+ },
+ {
+ "code": "vn",
+ "name": "Viet Nam"
+ },
+ {
+ "code": "vg",
+ "name": "Virgin Islands, British"
+ },
+ {
+ "code": "vi",
+ "name": "Virgin Islands, U.S."
+ },
+ {
+ "code": "wf",
+ "name": "Wallis And Futuna"
+ },
+ {
+ "code": "eh",
+ "name": "Western Sahara"
+ },
+ {
+ "code": "ye",
+ "name": "Yemen"
+ },
+ {
+ "code": "zm",
+ "name": "Zambia"
+ },
+ {
+ "code": "zw",
+ "name": "Zimbabwe"
+ }
+]
+
+
+module.exports = { isoCountries }
diff --git a/server/migrations/20221215110244-online_locations.js b/server/migrations/20221215110244-online_locations.js
new file mode 100644
index 00000000..e1d1f9ff
--- /dev/null
+++ b/server/migrations/20221215110244-online_locations.js
@@ -0,0 +1,29 @@
+'use strict';
+
+module.exports = {
+ async up (queryInterface, Sequelize) {
+ /**
+ * Add altering commands here.
+ *
+ * Example:
+ * await queryInterface.createTable('users', { id: Sequelize.INTEGER });
+ */
+ return Promise.all(
+ [
+ await queryInterface.addColumn('events', 'online_locations', { type: Sequelize.JSON }),
+ ])
+ },
+
+ async down (queryInterface, Sequelize) {
+ /**
+ * Add reverting commands here.
+ *
+ * Example:
+ * await queryInterface.dropTable('users');
+ */
+ return Promise.all(
+ [
+ await queryInterface.removeColumn('events', 'online_locations'),
+ ])
+ }
+};
diff --git a/server/services/geocoding/nominatim.js b/server/services/geocoding/nominatim.js
index 9e8b09fd..ffac8693 100644
--- a/server/services/geocoding/nominatim.js
+++ b/server/services/geocoding/nominatim.js
@@ -1,5 +1,6 @@
const cache = require('memory-cache')
const providerCache = new cache.Cache()
+const get = require('lodash/get')
const nominatim = {
commonName: 'Nominatim',
@@ -23,6 +24,47 @@ const nominatim = {
}
},
+ /**
+ * Icons to nominatim `osm_type` and `class` conversion
+ */
+ searchIcons_nominatim_osm_type: {
+ way: 'mdiRoadVariant',
+ house: 'mdiHome',
+ node: 'mdiMapMarker',
+ relation: 'mdiCityVariant',
+ },
+ searchIcons_nominatim_class: ['place', 'amenity', 'shop', 'tourism', 'leisure', 'building'],
+
+ loadResultIcon (item) {
+ if (this.searchIcons_nominatim_class.includes(item.class)) {
+ return 'mdiHome'
+ }
+ return this.searchIcons_nominatim_osm_type[item.type]
+ },
+
+ /**
+ * Map results from provider
+ */
+ filterNameFromAddress: ['place', 'amenity', 'shop', 'tourism', 'leisure', 'building'],
+
+ mapQueryResults (ret, addressList = []) {
+ if (ret && ret.length) {
+ addressList = ret.map(v => {
+ const name = get(v.namedetails, 'alt_name', get(v.namedetails, 'name'))
+ const address = this.filterNameFromAddress.includes(v.class) ? v.display_name.replace(name, '').replace(/^, ?/, '') : v.display_name.replace(/^, ?/, '')
+ return {
+ class: v.class,
+ type: v.osm_type,
+ lat: v.lat,
+ lon: v.lon,
+ name,
+ address
+ }
+ })
+ }
+ return addressList
+ }
+
}
module.exports = nominatim
\ No newline at end of file
diff --git a/server/services/geocoding/photon.js b/server/services/geocoding/photon.js
index 4eced7db..dce5e9a5 100644
--- a/server/services/geocoding/photon.js
+++ b/server/services/geocoding/photon.js
@@ -16,6 +16,58 @@ const photon = {
q: details,
limit: 3,
}
+ },
+
+ /**
+ * Icons to nominatim `osm_type` and `class` conversion
+ */
+ searchIcons_nominatim_osm_type: {
+ 'W': 'mdiRoadVariant',
+ 'N': 'mdiMapMarker',
+ 'R': 'mdiCityVariant',
+ },
+ searchIcons_nominatim_class: ['amenity', 'shop', 'tourism', 'leisure', 'building'],
+
+ loadResultIcon (item) {
+ if (this.searchIcons_nominatim_class.includes(item.class)) {
+ return 'mdiHome'
+ }
+ return this.searchIcons_nominatim_osm_type[item.type]
+ },
+
+ /**
+ * Map results from provider
+ */
+ fullAddressMapping: ['housenumber', 'street', 'locality', 'district', 'city', 'county', 'state', 'postcode', 'country'],
+
+ mapQueryResults(ret, addressList = []) {
+ if (ret) {
+ addressList = ret.features.map(v => {
+ let pre_name = v.properties.name || v.properties.street || ''
+ let pre_address = ''
+
+ this.fullAddressMapping.forEach((item, i) => {
+ let last = i == (this.fullAddressMapping.length - 1)
+ if (v.properties[item] && !last) {
+ pre_address += v.properties[item]+', '
+ } else if (v.properties[item]) {
+ pre_address += v.properties[item]
+ }
+ });
+
+ let name = pre_name
+ let address = pre_address
+ return {
+ class: v.properties.osm_key,
+ type: v.properties.osm_type,
+ lat: v.geometry.coordinates[1],
+ lon: v.geometry.coordinates[0],
+ name,
+ address
+ }
+ })
+ }
+ return addressList
}
}
diff --git a/store/index.js b/store/index.js
index 25b2938d..6c4069ff 100644
--- a/store/index.js
+++ b/store/index.js
@@ -10,8 +10,9 @@ export const state = () => ({
allow_anon_event: true,
allow_multidate_event: true,
allow_recurrent_event: true,
- recurrent_event_visible: false,
+ allow_online_event: true,
allow_geolocation: false,
+ recurrent_event_visible: false,
geocoding_provider_type: '',
geocoding_provider: '',
geocoding_countrycodes: [],
diff --git a/webcomponents/src/GancioEvents.svelte b/webcomponents/src/GancioEvents.svelte
index 58a3e60c..9098a3ce 100644
--- a/webcomponents/src/GancioEvents.svelte
+++ b/webcomponents/src/GancioEvents.svelte
@@ -113,7 +113,7 @@
@{event.place.name}
- {event.place.address} {event.place.address}{/if}
{#if event.tags.length}
diff --git a/yarn.lock b/yarn.lock
index c4cd70d8..47553ceb 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -12979,10 +12979,8 @@ watchpack@^1.7.4:
resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.7.5.tgz#1267e6c55e0b9b5be44c2023aed5437a2c26c453"
integrity sha512-9P3MWk6SrKjHsGkLT2KHXdQ/9SNkyoJbabxnKOoJepsvJjJG8uYTR3yTPxPQvNDI3w4Nz1xnE0TLHK4RIVe/MQ==
dependencies:
- chokidar "^3.4.1"
graceful-fs "^4.1.2"
neo-async "^2.5.0"
- watchpack-chokidar2 "^2.0.1"
optionalDependencies:
chokidar "^3.4.1"
watchpack-chokidar2 "^2.0.1"