diff --git a/server/public/index.html b/server/public/index.html index 98426ff..ce9a8e9 100644 --- a/server/public/index.html +++ b/server/public/index.html @@ -1 +1 @@ -Geocoding App
\ No newline at end of file +Geocoding App
\ No newline at end of file diff --git a/server/public/js/app.ccb57af6.js b/server/public/js/app.ccb57af6.js new file mode 100644 index 0000000..73e9ba7 --- /dev/null +++ b/server/public/js/app.ccb57af6.js @@ -0,0 +1,2 @@ +(function(){"use strict";var e={844:function(e,t,o){var r=o(9242),s=o(3396);const l=(0,s._)("nav",null,null,-1);function a(e,t){const o=(0,s.up)("router-view");return(0,s.wg)(),(0,s.iD)(s.HY,null,[l,(0,s.Wm)(o)],64)}var n=o(89);const u={},c=(0,n.Z)(u,[["render",a]]);var i=c,d=o(678);const p={class:"h-screen relative"},v=(0,s._)("div",{id:"map",class:"h-full z-[1]"},null,-1);function f(e,t,o,r,l,a){const n=(0,s.up)("BaseModal"),u=(0,s.up)("MapFeatures");return(0,s.wg)(),(0,s.iD)("div",p,[r.geoError?((0,s.wg)(),(0,s.j4)(n,{key:0,onCloseGeoError:r.closeGeoError,geoErrorMsg:r.geoErrorMsg},null,8,["onCloseGeoError","geoErrorMsg"])):(0,s.kq)("",!0),(0,s.Wm)(u,{onGetGeolocation:r.getGeolocation,onPlotResult:r.plotResult,onToggleSearchResults:r.toggleSearchResults,onRemoveResult:r.removeResult,coords:r.coords,fetchCoords:r.fetchCoords,searchResults:r.searchResults},null,8,["onGetGeolocation","onPlotResult","onToggleSearchResults","onRemoveResult","coords","fetchCoords","searchResults"]),v])}var m=o(3153),g=o.n(m),h=o(4870),w=o(7139);const x={class:"h-screen absolute w-full z-10 flex justify-center items-start pt-[125px] bg-black/50"},y={class:"flex flex-col bg-white w-[80%] sm:w-[450px] px-6 py-4 rounded-md"},b={class:"text-lg mb-1"},R=(0,s._)("p",{class:"text-sm mb-4"}," To take advantage of this applications features, please ensure location services are enabled ",-1);function k(e,t,o,r,l,a){return(0,s.wg)(),(0,s.iD)("div",x,[(0,s._)("div",y,[(0,s._)("h1",b,"Error: "+(0,w.zw)(this.geoErrorMsg),1),R,(0,s._)("button",{onClick:t[0]||(t[0]=t=>e.$emit("closeGeoError")),class:"self-start py-2 px-4 bg-red-500 text-white rounded-md text-sm"}," Close ")])])}var _={props:["geoErrorMsg"]};const z=(0,n.Z)(_,[["render",k]]);var S=z;const G={class:"w-full md:w-auto absolute md:top-[40px] md:left-[60px] z-[2] flex gap-4 px-6 py-8 md:px-0 md:py-0 bg-transparent"},C={class:"relative flex-1 md:min-w-[350px]"},I=(0,s._)("div",{class:"absolute top-0 left-[8px] h-full flex items-center"},[(0,s._)("i",{class:"fas fa-search"})],-1),M={class:"absolute mt-[8px] w-full"},O={key:0,class:"h-[200px] overflow-scroll bg-white rounded-md"},j={key:1},D=["onClick"],E=(0,s._)("i",{class:"fas fa-map-marker-alt"},null,-1),H={class:"text-[12px]"},Y={key:1,class:"mt-[8px] px-4 py-3 bg-white rounded-md"},T={class:"text-lg"},Z={class:"text-xs mb-1"},L={class:"text-xs"};function N(e,t,o,l,a,n){const u=(0,s.up)("BaseLoader");return(0,s.wg)(),(0,s.iD)("div",G,[(0,s._)("div",C,[(0,s.wy)((0,s._)("input",{class:"pl-9 pr-4 py-3 text-[14px] focus:outline-none w-full shadow-md rounded-md",type:"text",placeholder:"Start your search...","onUpdate:modelValue":t[0]||(t[0]=e=>l.searchQuery=e),onInput:t[1]||(t[1]=(...e)=>l.search&&l.search(...e)),onFocus:t[2]||(t[2]=t=>e.$emit("toggleSearchResults"))},null,544),[[r.nr,l.searchQuery]]),I,(0,s._)("div",M,[l.searchQuery&&o.searchResults?((0,s.wg)(),(0,s.iD)("div",O,[l.searchData?((0,s.wg)(),(0,s.iD)("div",j,[((0,s.wg)(!0),(0,s.iD)(s.HY,null,(0,s.Ko)(l.searchData,((e,t)=>((0,s.wg)(),(0,s.iD)("div",{class:"px-4 py-2 flex gap-x-2 cursor-pointer hover:bg-slate-600 hover:text-white",key:t,onClick:t=>l.selectResult(e)},[E,(0,s._)("p",H,(0,w.zw)(e.place_name_en),1)],8,D)))),128))])):((0,s.wg)(),(0,s.j4)(u,{key:0}))])):(0,s.kq)("",!0),l.selectedResult?((0,s.wg)(),(0,s.iD)("div",Y,[(0,s._)("i",{onClick:t[3]||(t[3]=(...e)=>l.removeResult&&l.removeResult(...e)),class:"flex justify-end far fa-times-circle"}),(0,s._)("h1",T,(0,w.zw)(l.selectedResult.text),1),(0,s._)("p",Z,(0,w.zw)(l.selectedResult.properties.address)+", "+(0,w.zw)(l.selectedResult.city)+", "+(0,w.zw)(l.selectedResult.state),1),(0,s._)("p",L,(0,w.zw)(l.selectedResult.properties.category),1)])):(0,s.kq)("",!0)])]),(0,s._)("div",{class:(0,w.C_)(["px-4 bg-white flex items-center shadow-md rounded-md min-h-[45px]",{"bg-slate-600":o.coords}]),onClick:t[4]||(t[4]=t=>e.$emit("getGeolocation"))},[(0,s._)("i",{class:(0,w.C_)(["fas fa-location-arrow 'text-slate-600' text-[18px]",{"text-white":o.coords,"animate-pulse":o.fetchCoords}])},null,2)],2)])}var Q=o(6265),U=o.n(Q);const P={class:"h-full w-full flex items-center justify-center"},V=(0,s._)("span",{class:"block w-[60px] h-[60px] border-[5px] border-solid border-transparent border-t-black rounded-full animate-spin"},null,-1),$=[V];function B(e,t,o,r,l,a){return(0,s.wg)(),(0,s.iD)("div",P,$)}var F={name:"loadingSpinner"};const A=(0,n.Z)(F,[["render",B]]);var J=A,W={props:["fetchCoords","coords","searchResults"],components:{BaseLoader:J},setup(e,{emit:t}){const o=(0,h.iH)(null),r=(0,h.iH)(null),s=(0,h.iH)(null),l=(0,h.iH)(null),a=()=>{clearTimeout(s.value),r.value=null,s.value=setTimeout((async()=>{if(""!==o.value){const t=new URLSearchParams({fuzzyMatch:!0,language:"en",limit:10,proximity:e.coords?`${e.coords.lng},${e.coords.lat}`:"0,0"}),s=await U().get(`api/search/${o.value}?${t}`);r.value=s.data.features}}),750)},n=e=>{l.value=e,t("plotResult",e.geometry)},u=()=>{l.value=null,t("removeResult")};return{searchQuery:o,search:a,searchData:r,selectResult:n,selectedResult:l,removeResult:u}}};const q=(0,n.Z)(W,[["render",N]]);var K=q,X={name:"HomeView",components:{BaseModal:S,MapFeatures:K},setup(){let e;(0,s.bv)((()=>{e=g().map("map").setView([47.60357,-122.329449],10),g().tileLayer("https://api.mapbox.com/styles/v1/{id}/tiles/{z}/{x}/{y}?access_token=pk.eyJ1IjoiYW1hem9ubGFuZGVkIiwiYSI6ImNreTZjNGhlMzB1ZDUyd21uY3YwbGNkY2IifQ.6YLgjdyl4IAwRzwvOl9AUQ",{attribution:'Map data © OpenStreetMap contributors, Imagery © Mapbox',maxZoom:18,id:"mapbox/streets-v11",tileSize:512,zoomOffset:-1,accessToken:"pk.eyJ1IjoiYW1hem9ubGFuZGVkIiwiYSI6ImNreTZjNGhlMzB1ZDUyd21uY3YwbGNkY2IifQ.6YLgjdyl4IAwRzwvOl9AUQ"}).addTo(e),e.on("moveend",(()=>{x()})),u()}));const t=(0,h.iH)(null),r=(0,h.iH)(null),l=(0,h.iH)(null),a=(0,h.iH)(null),n=(0,h.iH)(null),u=()=>{if(!t.value){if(sessionStorage.getItem("coords"))return t.value=JSON.parse(sessionStorage.getItem("coords")),void d(t.value);r.value=!0,navigator.geolocation.getCurrentPosition(c,i)}t.value=null,sessionStorage.removeItem("coords"),e.removeLayer(l.value)},c=e=>{r.value=null;const o={lat:e.coords.latitude,lng:e.coords.longitude};sessionStorage.setItem("coords",JSON.stringify(o)),t.value=o,d(t.value)},i=e=>{r.value=null,a.value=!0,n.value=e.message},d=t=>{const r=g().icon({iconUrl:o(3266),iconSize:[35,35]});l.value=g().marker([t.lat,t.lng],{icon:r}).addTo(e),e.setView([t.lat,t.lng],10)},p=()=>{a.value=null,n.value=null},v=(0,h.iH)(null),f=t=>{v.value&&e.removeLayer(v.value);const r=g().icon({iconUrl:o(2929),iconSize:[35,35]});v.value=g().marker([t.coordinates[1],t.coordinates[0]],{icon:r}).addTo(e),e.setView([t.coordinates[1],t.coordinates[0]],14)},m=(0,h.iH)(null),w=()=>{m.value=!m.value},x=()=>{m.value=null},y=()=>{e.removeLayer(v.value)};return{coords:t,fetchCoords:r,geoMarker:l,closeGeoError:p,geoError:a,geoErrorMsg:n,getGeolocation:u,plotResult:f,searchResults:m,toggleSearchResults:w,closeSearchResults:x,removeResult:y}}};const ee=(0,n.Z)(X,[["render",f]]);var te=ee;const oe=[{path:"/",name:"home",component:te}],re=(0,d.p7)({history:(0,d.PO)("/"),routes:oe});var se=re;(0,r.ri)(i).use(se).mount("#app")},2929:function(e,t,o){e.exports=o.p+"img/map-marker-blue.48a8e449.svg"},3266:function(e,t,o){e.exports=o.p+"img/map-marker-red.d479dee5.svg"}},t={};function o(r){var s=t[r];if(void 0!==s)return s.exports;var l=t[r]={exports:{}};return e[r].call(l.exports,l,l.exports,o),l.exports}o.m=e,function(){var e=[];o.O=function(t,r,s,l){if(!r){var a=1/0;for(i=0;i=l)&&Object.keys(o.O).every((function(e){return o.O[e](r[u])}))?r.splice(u--,1):(n=!1,l0&&e[i-1][2]>l;i--)e[i]=e[i-1];e[i]=[r,s,l]}}(),function(){o.n=function(e){var t=e&&e.__esModule?function(){return e["default"]}:function(){return e};return o.d(t,{a:t}),t}}(),function(){o.d=function(e,t){for(var r in t)o.o(t,r)&&!o.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:t[r]})}}(),function(){o.g=function(){if("object"===typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"===typeof window)return window}}()}(),function(){o.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)}}(),function(){o.p="/"}(),function(){var e={143:0};o.O.j=function(t){return 0===e[t]};var t=function(t,r){var s,l,a=r[0],n=r[1],u=r[2],c=0;if(a.some((function(t){return 0!==e[t]}))){for(s in n)o.o(n,s)&&(o.m[s]=n[s]);if(u)var i=u(o)}for(t&&t(r);c\n \n \n\n","import { render } from \"./App.vue?vue&type=template&id=1f09a936\"\nconst script = {}\n\nimport exportComponent from \"C:\\\\Users\\\\User\\\\Desktop\\\\编程\\\\Vue\\\\geocoding-map\\\\client\\\\node_modules\\\\vue-loader\\\\dist\\\\exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","\n\n\n","\r\n\r\n","import { render } from \"./BaseModal.vue?vue&type=template&id=646e7e02\"\nimport script from \"./BaseModal.vue?vue&type=script&lang=js\"\nexport * from \"./BaseModal.vue?vue&type=script&lang=js\"\n\nimport exportComponent from \"C:\\\\Users\\\\User\\\\Desktop\\\\编程\\\\Vue\\\\geocoding-map\\\\client\\\\node_modules\\\\vue-loader\\\\dist\\\\exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","\r\n\r\n","\r\n\r\n","import { render } from \"./BaseLoader.vue?vue&type=template&id=bb4569e2\"\nimport script from \"./BaseLoader.vue?vue&type=script&lang=js\"\nexport * from \"./BaseLoader.vue?vue&type=script&lang=js\"\n\nimport exportComponent from \"C:\\\\Users\\\\User\\\\Desktop\\\\编程\\\\Vue\\\\geocoding-map\\\\client\\\\node_modules\\\\vue-loader\\\\dist\\\\exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","import { render } from \"./MapFeatures.vue?vue&type=template&id=66152118\"\nimport script from \"./MapFeatures.vue?vue&type=script&lang=js\"\nexport * from \"./MapFeatures.vue?vue&type=script&lang=js\"\n\nimport exportComponent from \"C:\\\\Users\\\\User\\\\Desktop\\\\编程\\\\Vue\\\\geocoding-map\\\\client\\\\node_modules\\\\vue-loader\\\\dist\\\\exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","import { render } from \"./HomeView.vue?vue&type=template&id=f8b67982\"\nimport script from \"./HomeView.vue?vue&type=script&lang=js\"\nexport * from \"./HomeView.vue?vue&type=script&lang=js\"\n\nimport exportComponent from \"C:\\\\Users\\\\User\\\\Desktop\\\\编程\\\\Vue\\\\geocoding-map\\\\client\\\\node_modules\\\\vue-loader\\\\dist\\\\exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","import { createRouter, createWebHistory } from \"vue-router\";\nimport HomeView from \"../views/HomeView.vue\";\n\nconst routes = [\n {\n path: \"/\",\n name: \"home\",\n component: HomeView,\n },\n];\n\nconst router = createRouter({\n history: createWebHistory(process.env.BASE_URL),\n routes,\n});\n\nexport default router;\n","import { createApp } from \"vue\";\r\nimport App from \"./App.vue\";\r\nimport router from \"./router\";\r\nimport \"./assets/tailwind.css\";\r\n\r\ncreateApp(App).use(router).mount(\"#app\");\r\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n","var deferred = [];\n__webpack_require__.O = function(result, chunkIds, fn, priority) {\n\tif(chunkIds) {\n\t\tpriority = priority || 0;\n\t\tfor(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];\n\t\tdeferred[i] = [chunkIds, fn, priority];\n\t\treturn;\n\t}\n\tvar notFulfilled = Infinity;\n\tfor (var i = 0; i < deferred.length; i++) {\n\t\tvar chunkIds = deferred[i][0];\n\t\tvar fn = deferred[i][1];\n\t\tvar priority = deferred[i][2];\n\t\tvar fulfilled = true;\n\t\tfor (var j = 0; j < chunkIds.length; j++) {\n\t\t\tif ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every(function(key) { return __webpack_require__.O[key](chunkIds[j]); })) {\n\t\t\t\tchunkIds.splice(j--, 1);\n\t\t\t} else {\n\t\t\t\tfulfilled = false;\n\t\t\t\tif(priority < notFulfilled) notFulfilled = priority;\n\t\t\t}\n\t\t}\n\t\tif(fulfilled) {\n\t\t\tdeferred.splice(i--, 1)\n\t\t\tvar r = fn();\n\t\t\tif (r !== undefined) result = r;\n\t\t}\n\t}\n\treturn result;\n};","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = function(module) {\n\tvar getter = module && module.__esModule ?\n\t\tfunction() { return module['default']; } :\n\t\tfunction() { return module; };\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = function(exports, definition) {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); }","__webpack_require__.p = \"/\";","// no baseURI\n\n// object to store loaded and loading chunks\n// undefined = chunk not loaded, null = chunk preloaded/prefetched\n// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded\nvar installedChunks = {\n\t143: 0\n};\n\n// no chunk on demand loading\n\n// no prefetching\n\n// no preloaded\n\n// no HMR\n\n// no HMR manifest\n\n__webpack_require__.O.j = function(chunkId) { return installedChunks[chunkId] === 0; };\n\n// install a JSONP callback for chunk loading\nvar webpackJsonpCallback = function(parentChunkLoadingFunction, data) {\n\tvar chunkIds = data[0];\n\tvar moreModules = data[1];\n\tvar runtime = data[2];\n\t// add \"moreModules\" to the modules object,\n\t// then flag all \"chunkIds\" as loaded and fire callback\n\tvar moduleId, chunkId, i = 0;\n\tif(chunkIds.some(function(id) { return installedChunks[id] !== 0; })) {\n\t\tfor(moduleId in moreModules) {\n\t\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t\t}\n\t\t}\n\t\tif(runtime) var result = runtime(__webpack_require__);\n\t}\n\tif(parentChunkLoadingFunction) parentChunkLoadingFunction(data);\n\tfor(;i < chunkIds.length; i++) {\n\t\tchunkId = chunkIds[i];\n\t\tif(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {\n\t\t\tinstalledChunks[chunkId][0]();\n\t\t}\n\t\tinstalledChunks[chunkIds[i]] = 0;\n\t}\n\treturn __webpack_require__.O(result);\n}\n\nvar chunkLoadingGlobal = self[\"webpackChunkclient\"] = self[\"webpackChunkclient\"] || [];\nchunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));\nchunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));","// startup\n// Load entry module and return exports\n// This entry module depends on other loaded chunks and execution need to be delayed\nvar __webpack_exports__ = __webpack_require__.O(undefined, [998], function() { return __webpack_require__(844); })\n__webpack_exports__ = __webpack_require__.O(__webpack_exports__);\n"],"names":["script","__exports__","render","class","id","geoError","closeGeoError","geoErrorMsg","getGeolocation","plotResult","toggleSearchResults","removeResult","coords","fetchCoords","searchResults","$emit","props","type","placeholder","searchQuery","search","searchData","result","index","key","selectResult","place_name_en","selectedResult","text","properties","address","city","state","category","name","components","BaseLoader","setup","emit","queryTimeout","clearTimeout","value","setTimeout","async","params","URLSearchParams","fuzzyMatch","language","limit","proximity","lng","lat","data","features","geometry","BaseModal","MapFeatures","map","setView","attribution","maxZoom","tileSize","zoomOffset","accessToken","addTo","on","closeSearchResults","geoMarker","sessionStorage","getItem","JSON","parse","plotGeoLocation","navigator","geolocation","getCurrentPosition","setCoords","getLocError","removeItem","removeLayer","pos","setSessionCoords","latitude","longitude","setItem","stringify","err","message","customMarker","iconUrl","iconSize","icon","resultMarker","coordinates","routes","path","component","HomeView","router","createRouter","history","createWebHistory","process","createApp","App","use","mount","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","undefined","exports","module","__webpack_modules__","call","m","deferred","O","chunkIds","fn","priority","notFulfilled","Infinity","i","length","fulfilled","j","Object","keys","every","splice","r","n","getter","__esModule","d","a","definition","o","defineProperty","enumerable","get","g","globalThis","this","Function","e","window","obj","prop","prototype","hasOwnProperty","p","installedChunks","chunkId","webpackJsonpCallback","parentChunkLoadingFunction","moreModules","runtime","some","chunkLoadingGlobal","self","forEach","bind","push","__webpack_exports__"],"sourceRoot":""} \ No newline at end of file