Commit 34385d59 authored by Mario Stäubli's avatar Mario Stäubli

Merge branch 'develop' into 'master'

Merge feature OSMOpeningHours URL into 'master'

See merge request !149
parents 1a4ca1f5 233ff33e
Pipeline #76503974 passed with stages
in 9 minutes and 13 seconds
......@@ -25,6 +25,8 @@ services:
build:
context: frontend/
dockerfile: Dockerfile
ports:
- "8080:8080"
environment:
OSM_URL: 'https://master.apis.dev.openstreetmap.org'
OSM_API_URL: 'https://master.apis.dev.openstreetmap.org'
......
{
"presets": [
"es2015",
["env", {
"modules": false,
"targets": {
......
......@@ -25,6 +25,15 @@ var proxyTable = config.dev.proxyTable
var app = express()
var compiler = webpack(webpackConfig)
const watching = compiler.watch({
// Example watchOptions
aggregateTimeout: 300,
poll: 1000
}, (err, stats) => { // Stats Object
// Print watch/build result here...
//console.log(stats);
console.log('> watching!');
});
var devMiddleware = require('webpack-dev-middleware')(compiler, {
publicPath: webpackConfig.output.publicPath,
quiet: true
......
......@@ -3,13 +3,13 @@ var utils = require('./utils')
var config = require('../config')
var vueLoaderConfig = require('./vue-loader.conf')
function resolve (dir) {
function resolve(dir) {
return path.join(__dirname, '..', dir)
}
module.exports = {
entry: {
app: './src/main.js'
app: './src/main.js',
},
output: {
path: config.build.assetsRoot,
......
......@@ -10,7 +10,6 @@ var FriendlyErrorsPlugin = require('friendly-errors-webpack-plugin')
Object.keys(baseWebpackConfig.entry).forEach(function (name) {
baseWebpackConfig.entry[name] = ['./build/dev-client'].concat(baseWebpackConfig.entry[name])
})
module.exports = merge(baseWebpackConfig, {
module: {
rules: utils.styleLoaders({ sourceMap: config.dev.cssSourceMap })
......@@ -31,5 +30,6 @@ module.exports = merge(baseWebpackConfig, {
inject: true
}),
new FriendlyErrorsPlugin()
]
],
watch: true
})
......@@ -100,7 +100,6 @@
"version": "5.2.3",
"resolved": "https://registry.npmjs.org/ajv/-/ajv-5.2.3.tgz",
"integrity": "sha1-wG9Zh3jETGsWGrr+NGa4GtGBTtI=",
"dev": true,
"requires": {
"co": "^4.6.0",
"fast-deep-equal": "^1.0.0",
......@@ -1391,9 +1390,9 @@
}
},
"babel-preset-env": {
"version": "1.6.1",
"resolved": "https://registry.npmjs.org/babel-preset-env/-/babel-preset-env-1.6.1.tgz",
"integrity": "sha512-W6VIyA6Ch9ePMI7VptNn2wBM6dbG0eSz25HEiL40nQXCsXGTGZSTZu1Iap+cj3Q0S5a7T9+529l/5Bkvd+afNA==",
"version": "1.7.0",
"resolved": "https://registry.npmjs.org/babel-preset-env/-/babel-preset-env-1.7.0.tgz",
"integrity": "sha512-9OR2afuKDneX2/q2EurSftUYM0xGu4O2D9adAhVfADDhrYDaxXV0rBbevVYoY9n6nyX1PmQW/0jtpJvUNr9CHg==",
"dev": true,
"requires": {
"babel-plugin-check-es2015-constants": "^6.22.0",
......@@ -1423,11 +1422,43 @@
"babel-plugin-transform-es2015-unicode-regex": "^6.22.0",
"babel-plugin-transform-exponentiation-operator": "^6.22.0",
"babel-plugin-transform-regenerator": "^6.22.0",
"browserslist": "^2.1.2",
"browserslist": "^3.2.6",
"invariant": "^2.2.2",
"semver": "^5.3.0"
}
},
"babel-preset-es2015": {
"version": "6.24.1",
"resolved": "https://registry.npmjs.org/babel-preset-es2015/-/babel-preset-es2015-6.24.1.tgz",
"integrity": "sha1-1EBQ1rwsn+6nAqrzjXJ6AhBTiTk=",
"dev": true,
"requires": {
"babel-plugin-check-es2015-constants": "^6.22.0",
"babel-plugin-transform-es2015-arrow-functions": "^6.22.0",
"babel-plugin-transform-es2015-block-scoped-functions": "^6.22.0",
"babel-plugin-transform-es2015-block-scoping": "^6.24.1",
"babel-plugin-transform-es2015-classes": "^6.24.1",
"babel-plugin-transform-es2015-computed-properties": "^6.24.1",
"babel-plugin-transform-es2015-destructuring": "^6.22.0",
"babel-plugin-transform-es2015-duplicate-keys": "^6.24.1",
"babel-plugin-transform-es2015-for-of": "^6.22.0",
"babel-plugin-transform-es2015-function-name": "^6.24.1",
"babel-plugin-transform-es2015-literals": "^6.22.0",
"babel-plugin-transform-es2015-modules-amd": "^6.24.1",
"babel-plugin-transform-es2015-modules-commonjs": "^6.24.1",
"babel-plugin-transform-es2015-modules-systemjs": "^6.24.1",
"babel-plugin-transform-es2015-modules-umd": "^6.24.1",
"babel-plugin-transform-es2015-object-super": "^6.24.1",
"babel-plugin-transform-es2015-parameters": "^6.24.1",
"babel-plugin-transform-es2015-shorthand-properties": "^6.24.1",
"babel-plugin-transform-es2015-spread": "^6.22.0",
"babel-plugin-transform-es2015-sticky-regex": "^6.24.1",
"babel-plugin-transform-es2015-template-literals": "^6.22.0",
"babel-plugin-transform-es2015-typeof-symbol": "^6.22.0",
"babel-plugin-transform-es2015-unicode-regex": "^6.24.1",
"babel-plugin-transform-regenerator": "^6.24.1"
}
},
"babel-preset-stage-2": {
"version": "6.24.1",
"resolved": "https://registry.npmjs.org/babel-preset-stage-2/-/babel-preset-stage-2-6.24.1.tgz",
......@@ -1662,8 +1693,7 @@
"big.js": {
"version": "3.2.0",
"resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz",
"integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==",
"dev": true
"integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q=="
},
"binary-extensions": {
"version": "1.10.0",
......@@ -1820,19 +1850,25 @@
}
},
"browserslist": {
"version": "2.11.3",
"resolved": "https://registry.npmjs.org/browserslist/-/browserslist-2.11.3.tgz",
"integrity": "sha512-yWu5cXT7Av6mVwzWc8lMsJMHWn4xyjSuGYi4IozbVTLUOEYPSagUB8kiMDUHA1fS3zjr8nkxkn9jdvug4BBRmA==",
"version": "3.2.8",
"resolved": "https://registry.npmjs.org/browserslist/-/browserslist-3.2.8.tgz",
"integrity": "sha512-WHVocJYavUwVgVViC0ORikPHQquXwVh939TaelZ4WDqpWgTX/FsGhl/+P4qBUAGcRvtOgDgC+xftNWWp2RUTAQ==",
"dev": true,
"requires": {
"caniuse-lite": "^1.0.30000792",
"electron-to-chromium": "^1.3.30"
"caniuse-lite": "^1.0.30000844",
"electron-to-chromium": "^1.3.47"
},
"dependencies": {
"caniuse-lite": {
"version": "1.0.30000976",
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000976.tgz",
"integrity": "sha512-tleNB1IwPRqZiod6nUNum63xQCMN96BUO2JTeiwuRM7p9d616EHsMBjBWJMudX39qCaPuWY8KEWzMZq7A9XQMQ==",
"dev": true
},
"electron-to-chromium": {
"version": "1.3.42",
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.42.tgz",
"integrity": "sha1-lcM78B0MxAVVauyJn+Yf1NduoPk=",
"version": "1.3.172",
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.172.tgz",
"integrity": "sha512-bHgFvYeHBiQNNuY/WvoX37zLosPgMbR8nKU1r4mylHptLvuMMny/KG/L28DTIlcoOCJjMAhEimy3DHDgDayPbg==",
"dev": true
}
}
......@@ -2468,8 +2504,7 @@
"co": {
"version": "4.6.0",
"resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz",
"integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=",
"dev": true
"integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ="
},
"coa": {
"version": "1.0.4",
......@@ -3649,8 +3684,7 @@
"emojis-list": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz",
"integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=",
"dev": true
"integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k="
},
"encodeurl": {
"version": "1.0.2",
......@@ -4551,8 +4585,7 @@
"fast-deep-equal": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.0.0.tgz",
"integrity": "sha1-liVqO8l1WV6zbYLpkp0GDYk0Of8=",
"dev": true
"integrity": "sha1-liVqO8l1WV6zbYLpkp0GDYk0Of8="
},
"fast-json-stable-stringify": {
"version": "2.0.0",
......@@ -6683,14 +6716,12 @@
"json-schema-traverse": {
"version": "0.3.1",
"resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz",
"integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=",
"dev": true
"integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A="
},
"json-stable-stringify": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz",
"integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=",
"dev": true,
"requires": {
"jsonify": "~0.0.0"
}
......@@ -6710,8 +6741,7 @@
"json5": {
"version": "0.5.1",
"resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz",
"integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=",
"dev": true
"integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE="
},
"jsonfile": {
"version": "2.4.0",
......@@ -6725,8 +6755,7 @@
"jsonify": {
"version": "0.0.0",
"resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz",
"integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=",
"dev": true
"integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM="
},
"jsprim": {
"version": "1.4.1",
......@@ -7014,7 +7043,6 @@
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz",
"integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=",
"dev": true,
"requires": {
"big.js": "^3.1.3",
"emojis-list": "^2.0.0",
......@@ -7508,6 +7536,18 @@
"pumpify": "^1.3.3",
"stream-each": "^1.1.0",
"through2": "^2.0.0"
},
"dependencies": {
"pump": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz",
"integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==",
"dev": true,
"requires": {
"end-of-stream": "^1.1.0",
"once": "^1.3.1"
}
}
}
},
"mixin-deep": {
......@@ -10692,9 +10732,9 @@
}
},
"pump": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz",
"integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==",
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/pump/-/pump-2.0.0.tgz",
"integrity": "sha512-6MYypjOvtiXhBSTOD0Zs5eNjCGfnqi5mPsCsW+dgKTxrZzQMZQNpBo3XRkLx7id753f3EeyHLBqzqqUymIolgw==",
"dev": true,
"requires": {
"end-of-stream": "^1.1.0",
......@@ -11584,7 +11624,6 @@
"version": "0.3.0",
"resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.3.0.tgz",
"integrity": "sha1-9YdyIs4+kx7a4DnxfrNxbnE3+M8=",
"dev": true,
"requires": {
"ajv": "^5.0.0"
}
......@@ -11797,6 +11836,11 @@
"integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=",
"dev": true
},
"simple-web-worker": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/simple-web-worker/-/simple-web-worker-1.2.0.tgz",
"integrity": "sha1-Le/9CZiXa4JLFBonzlBNMdDZkQg="
},
"sinon": {
"version": "2.4.1",
"resolved": "https://registry.npmjs.org/sinon/-/sinon-2.4.1.tgz",
......@@ -13485,6 +13529,14 @@
"integrity": "sha512-x3LV3wdmmERhVCYy3quqA57NJW7F3i6faas++pJQWtknWT+n7k30F4TVdHvCLn48peTJFRvCpxs3UuFPqgeELg==",
"dev": true
},
"vue-worker": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/vue-worker/-/vue-worker-1.2.1.tgz",
"integrity": "sha1-3q4UuYqdidqrsg5/xhkGQoSbbZM=",
"requires": {
"simple-web-worker": "1.2.0"
}
},
"vue2-leaflet": {
"version": "1.2.3",
"resolved": "https://registry.npmjs.org/vue2-leaflet/-/vue2-leaflet-1.2.3.tgz",
......@@ -14188,6 +14240,15 @@
"integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=",
"dev": true
},
"worker-loader": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/worker-loader/-/worker-loader-1.1.0.tgz",
"integrity": "sha512-W91q8Wi1JxbzFQZuLJlFK4x8UuWjKgeOX9IMMyng007K0UkP6I8lOejckoCWY61QmnJq2x9qZ/Viru+uF8g6nA==",
"requires": {
"loader-utils": "^1.0.0",
"schema-utils": "^0.3.0"
}
},
"wrap-ansi": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz",
......
......@@ -14,6 +14,7 @@
},
"dependencies": {
"axios": "^0.18.0",
"deep-equal": "^1.0.1",
"jquery": "^3.3.1",
"jquery-xml2json": "^0.0.8",
"leaflet": "^1.3.4",
......@@ -23,16 +24,17 @@
"vee-validate": "^2.0.6",
"vue": "^2.5.16",
"vue-awesome": "^3.2.0",
"vue-cookies": "^1.5.7",
"vue-i18n": "^8.2.1",
"vue-router": "^3.0.1",
"vue-search-select": "^2.6.1",
"vue-worker": "^1.2.1",
"vue2-leaflet": "^1.2.3",
"vuex": "^3.0.1",
"vuex-router": "^1.1.5",
"vuex-router-sync": "^5.0.0",
"xml-js": "^1.6.2",
"vue-cookies": "^1.5.7",
"deep-equal": "^1.0.1",
"vue-i18n": "^8.2.1"
"worker-loader": "^1.1.0",
"xml-js": "^1.6.2"
},
"devDependencies": {
"autoprefixer": "^8.3.0",
......@@ -42,7 +44,8 @@
"babel-plugin-istanbul": "^4.1.6",
"babel-plugin-transform-runtime": "^6.23.0",
"babel-polyfill": "^6.26.0",
"babel-preset-env": "^1.6.1",
"babel-preset-env": "^1.7.0",
"babel-preset-es2015": "^6.24.1",
"babel-preset-stage-2": "^6.24.1",
"babel-register": "^6.26.0",
"chai": "^3.5.0",
......
......@@ -36,10 +36,35 @@
</div>
<input type="text"
id="openingHoursTime"
v-model="details.opening_hours"
:placeholder="$t('detail.placeholders.opening_hours')">
</div>
<div class="field">
<div class="field-label">
<label>{{ $t('detail.labels.opening_hours_url') }}</label>
<img class="info"
@mouseenter="showPopup($t('infoTexts.opening_hours_url'))"
@mouseleave="hidePopup()"
src="../../assets/info_black.png">
</div>
<input v-validate="'url'"
:class="{'is-error': errors.has('website_opening_hours')}"
type="text"
name="website_opening_hours"
v-on:blur="blurOpeningHours()"
id="openingHoursURL"
v-model="details.opening_url"
:placeholder="$t('detail.placeholders.opening_hours_url')">
<span v-show="errors.has('website_opening_hours')"
class="help is-danger">
{{$t('detail.validate.website')}}
</span>
</div>
<div class="field">
<div class="field-label">
<label>{{ $t('detail.labels.phone') }}</label>
......@@ -153,13 +178,17 @@
</template>
<script>
import { mapGetters, mapMutations } from 'vuex';
import Vue from 'vue';
import VeeValidate from 'vee-validate';
import isURL from '../../store/converter';
Vue.use(VeeValidate);
// document.getElementById('openingHoursURL').addEventListener('blur', printTest, false);
export default {
mounted() {
this.setApplyOffset(true);
......@@ -180,6 +209,15 @@
'showPopup',
'hidePopup',
]),
blurOpeningHours() {
const url = document.getElementById('openingHoursURL').value;
// getting the value works, now make the handling async.
// const result = isURL(input); https://www.casaferlin.ch/en
if (document.getElementById('openingHoursTime').value === ''
&& url !== '') {
isURL(url);
}
},
},
};
</script>
......@@ -228,7 +266,7 @@
width: 49%;
display: flex;
flex-direction: column;
align-items:stretch;
align-items: stretch;
justify-content: space-around;
}
......
......@@ -66,6 +66,7 @@
"country": "Land",
"name": "Name",
"opening_hours": "Öffnungszeiten",
"opening_hours_url": "Öffnungszeiten URL",
"phone": "Telefonnummer",
"email": "E-Mailadresse",
"website": "Webseite",
......@@ -87,6 +88,7 @@
"city": "Winterthur",
"country": "Schweiz",
"opening_hours": "Tu-Su 08:00-17:00",
"opening_hours_url": "https://www.example.com/",
"phone": "+41 11 111 11 11",
"email": "example@example.com",
"website": "http://www.example.com",
......@@ -116,6 +118,7 @@
"address": "Die Adresse wird automatisch von dem Punkt geladen, den Sie ausgewählt haben. Nehmen Sie erforderliche Änderungen vor. Das Feld \"Platz\" darf nur dann ausgefüllt werden, wenn für das Unternehmen sonst keine Adresse existiert.",
"name": "Schreiben Sie den Namen Ihres Unternehmens in dieses Feld. z.B. Microsoft",
"opening_hours": "In dieses Feld kommen die Öffnungszeiten Ihres Unternehmens. z.B. Tu-Su 07:00-12:00, 13:00-17:00",
"opening_hours_url": "In dieses Feld kommt die URL wo man die Öffnungszeiten findet. z.B. http://www.example.com",
"phone": "In dieses Feld kommt die Telefonnummer unter der man Sie bzw. Ihr Unternehmen erreichen kann.",
"email": "In dieses Feld kommt die E-Mailadresse unter der man Sie bzw. Ihr Unternehmen erreichen kann.",
"website": "In dieses Feld kommt die Webseite unter der man Sie bzw. Ihr Unternehmen erreichen kann.",
......
......@@ -66,6 +66,7 @@
"country": "Country",
"name": "Name",
"opening_hours": "Opening hours",
"opening_hours_url": "Opening hours URL",
"phone": "Phone number",
"email": "E-Mail address",
"website": "Website",
......@@ -87,6 +88,7 @@
"city": "Winterthur",
"country": "Switzerland",
"opening_hours": "Tu-Su 08:00-17:00",
"opening_hours_url": "https://www.example.com/",
"phone": "+41 11 111 11 11",
"email": "example@example.com",
"website": "http://www.example.com",
......@@ -116,6 +118,7 @@
"address": "The address is loaded automatically from the point you have chosen. Take possible changes if necessary. The field \"Place\" is only allowed if the business has no other address.",
"name": "Write the name of your business in this field. e.g. Migros",
"opening_hours": "In this field are the opening hours of your business. e.g. Mo-Fr 07:00 - 12:00 13:00 - 17:00",
"opening_hours_url": "In this field is the URL for the opening hours to your business. e.g. htttp://www.example/hours.com",
"phone": "Here comes the phone number under which you, respectively your business, are reachable.",
"email": "Here comes the email address under which you, respectively your business, are reachable.",
"website": "In this field is the website of your business.",
......
This diff is collapsed.
......@@ -29,6 +29,7 @@ const initialState = {
},
name: '',
opening_hours: '',
opening_url: '',
phone: '',
email: '',
website: '',
......@@ -88,6 +89,9 @@ function constructSuccessMessage(response, isNote) {
}
function parseTagToString(tag, value, initialValue, additionalText) {
if (tag === 'opening_url') {
tag = 'opening_hours:url';
}
if (deepEqual(value, initialValue)) {
if (value) {
return `${additionalText}${tag} = ${value}\n`;
......@@ -193,6 +197,7 @@ export function clearDetails() {
},
name: '',
opening_hours: '',
opening_url: '',
phone: '',
email: '',
website: '',
......
......@@ -49,7 +49,6 @@ const actions = {
resolve(subscribedBusinessPOI);
}
});
promise.then(() => {
if (isNoteWithoutOsmElement(subscribedBusinessPOI.id)) {
subscribedBusinessPOI.tags = {};
......
......@@ -7,6 +7,7 @@ function parseDetails(businessPOITags) {
const tags = [
'name',
'opening_hours',
'opening_hours:url',
'phone',
'email',
'website',
......@@ -128,6 +129,9 @@ function createDetailTags(businessPOI) {
if (businessPOI.details.opening_hours.length !== 0) {
text += `<tag k="opening_hours" v="${businessPOI.details.opening_hours}"/>`;
}
if (businessPOI.opening_url.length !== 0) {
text += `<tag k="opening_hours:url" v="${businessPOI.details.opening_url}"/>`;
}
if (businessPOI.details.phone.length !== 0) {
text += `<tag k="phone" v="${businessPOI.details.phone}"/>`;
}
......@@ -235,7 +239,6 @@ function extractId(businessPOIDiff) {
return getAttributes(diffJson).new_id;
}
export default {
parseUser,
constructUpload,
......
......@@ -65,6 +65,7 @@ function createNoteFromBusinessPOI(businessPOI) {
category: getBizCategory(businessPOI),
name: extractTag(businessPOI, 'name'),
opening_hours: extractTag(businessPOI, 'opening_hours'),
opening_url: extractTag(businessPOI, 'opening_hours:url'),
phone: extractTag(businessPOI, 'phone'),
email: extractTag(businessPOI, 'email'),
website: extractTag(businessPOI, 'website'),
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment