{"version":3,"file":"js/pages/wanted-item.js","mappings":"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","sources":["webpack://ReLondon.Web/./src/js/search/locationSuggestions.js","webpack://ReLondon.Web/./src/js/wantedItem/wantedItem.js"],"sourcesContent":["import autoComplete from \"@tarekraafat/autocomplete.js\";\n\nexport async function locationSuggestions(el, placeholder) {\n if (!el) {\n console.warn(\"No element found to attach geosearch\");\n return;\n }\n\n const autoCompleteJS = new autoComplete({\n selector: \"#\" + el.id,\n placeHolder: placeholder ? placeholder : \"All locations\",\n //searchEngine: (q, r) => r,//Disable search engine\n searchEngine: \"loose\",\n threshold: 2,\n submit: true,\n data: {\n src: async (query) => {\n try {\n const source = await fetch(`${el.dataset.source}?query=${query}`);\n const data = await source.json();\n\n return data;\n } catch (error) {\n return error;\n }\n },\n keys: [\"name\"],\n },\n resultsList: {\n element: (list, data) => {\n const info = document.createElement(\"h6\");\n info.classList.add(\"text-primary\", \"text-center\", \"mb-0\", \"p-2\");\n if (data.results.length > 0) {\n info.innerHTML = `Displaying ${data.results.length} result(s)`;\n }\n list.prepend(info);\n },\n noResults: false,\n maxResults: 100,\n tabSelect: true\n },\n resultItem: {\n element: (item, data) => {\n // Modify Results Item Style\n item.style = \"display: flex; justify-content: space-between;\";\n // Modify Results Item Content\n item.innerHTML =\n `\n ${data.match}\n ${data.value.countryIso}\n `;\n },\n highlight: true\n },\n });\n\n\n autoCompleteJS.input.addEventListener(\"selection\", function (event) {\n const feedback = event.detail;\n autoCompleteJS.input.blur();\n // Prepare User's Selected Value\n const selection = feedback.selection.value[feedback.selection.key];\n // Replace Input value with the selected value\n autoCompleteJS.input.value = selection;\n });\n\n}\n\nexport default locationSuggestions;","import JustValidate from 'just-validate'\nimport { DateRangePicker } from 'vanillajs-datepicker';\nimport Choices from \"choices.js\";\nimport { locationSuggestions } from \"../search/locationSuggestions\";\nimport { justValidateGlobalDefaults } from \"../utils/justValidateDefaults\";\nimport {loadingPopup, ajaxErrorPopUp, successToast} from \"../utils/alerts\";\nimport {authenticatedFetch} from \"../utils/request\";\n\n\n\nfunction initRangePicker(id) {\n const rangepicker = new DateRangePicker(document.getElementById(id), {\n format: 'dd/mm/yyyy'\n });\n return rangepicker;\n}\n\nasync function initCategories(id) {\n const el = document.getElementById(id);\n const request = await fetch(el.dataset.getCategories);\n const data = await request.json();\n const categories = new Choices(el, {\n removeItemButton: true,\n addItems: true\n });\n categories.setChoices(data, \"text\", \"text\", true);\n\n return categories;\n}\n\nfunction handleChoicesValidation(choicesInstance, validator) {\n let innerEl = choicesInstance.containerInner.element;\n validator.revalidateField('#Dto_Categories').then(isValid => {\n if (isValid) {\n innerEl.classList.remove(\"is-invalid\");\n innerEl.classList.add(\"is-valid\");\n }\n else {\n innerEl.classList.remove(\"is-valid\");\n innerEl.classList.add(\"is-invalid\");\n };\n });\n}\n\nfunction formEvents(form, validator, categoriesChoices) {\n document.getElementById(\"Dto_Categories\").addEventListener(\"change\", function (e) {\n handleChoicesValidation(categoriesChoices, validator);\n });\n}\n\nexport async function reCaptchaCallback() {\n if (document.querySelector('#wantedItemForm button[type=\"submit\"]')){\n const {form, validator} = await formValidation(document.getElementById(\"wantedItemForm\"));\n }\n else {\n await initCategories(\"Dto_Categories\")\n }\n}\n\nasync function formValidation(form) {\n\n //Initialise the date range picker\n const dateRangePicker = initRangePicker(\"input-daterange\");\n\n //Initialise the categories\n const categoriesChoices = await initCategories(\"Dto_Categories\");\n\n const validator = new JustValidate(form, justValidateGlobalDefaults);\n\n validator\n .addField(document.querySelector('#Dto_ProductName'), [\n {\n rule: 'required',\n errorMessage: 'Please enter a title'\n }\n ])\n .addField(document.getElementById(\"Dto_Description\"), [\n {\n rule: 'required',\n errorMessage: 'Please enter a description'\n }\n ])\n .addField(\n '#Dto_Categories',\n [\n {\n rule: 'required',\n errorMessage: 'Please select at least one category'\n }\n ],\n {\n errorsContainer: '#CategoriesErrorsContainer',\n }\n )\n .addField(document.querySelector('#Dto_FirstName'), [\n {\n rule: 'required',\n errorMessage: 'Please enter your name'\n }\n ])\n .addField(document.querySelector('#Dto_LastName'), [\n {\n rule: 'required',\n errorMessage: 'Please enter your last name'\n }\n ])\n .addField('#Dto_Email', [\n {\n rule: 'email',\n errorMessage: 'Please enter a valid email'\n },\n {\n rule: 'required',\n errorMessage: 'Please enter your email'\n }\n ])\n .addField(document.querySelector('#Dto_Price'), [\n {\n rule: 'number',\n errorMessage: 'Please enter a valid price'\n },\n {\n rule: 'minNumber',\n value: 0,\n errorMessage: 'Please enter a valid price'\n }\n ])\n .addField('#g-recaptcha-response', [\n {\n rule: 'required',\n errorMessage: 'Please solve the captcha challenge'\n }\n ], { errorsContainer: '#reCaptchaErrorsContainer'})\n .onSuccess(e => {\n handleChoicesValidation(categoriesChoices, validator);\n loadingPopup();\n form.submit();\n })\n .onFail(fields => handleChoicesValidation(categoriesChoices, validator));\n\n formEvents(form, validator, categoriesChoices);\n\n return { form, validator };\n}\n\nasync function markFulfilled(el){\n const btn = el;\n btn.addEventListener(\"click\", async function(e){\n e.preventDefault();\n const url = btn.dataset.url;\n let resp;\n if(btn.dataset.url.includes(\"admin\")){\n resp = await authenticatedFetch(url, {\n method: \"PATCH\"\n });\n }\n else {\n resp = await fetch(url, {\n method: \"PATCH\"\n });\n }\n if(!resp.ok){\n ajaxErrorPopUp(\"Error marking wanted item as fulfilled\");\n return false;\n }\n location.reload();\n });\n}\n\ndocument.addEventListener(\"DOMContentLoaded\", async function (e) {\n window.reCaptchaCallback = reCaptchaCallback;\n const locationEl = document.getElementById(\"Dto_LocationName\");\n await locationSuggestions(locationEl, locationEl.placeholder);\n \n const markFulfilledBtn = document.querySelector(\"#markFulfilled\");\n const markRemovedBtn = document.querySelector(\"#markRemoved\");\n if(markFulfilledBtn) {\n await markFulfilled(markFulfilledBtn);\n }\n\n if(markRemovedBtn)\n {\n await markFulfilled(markRemovedBtn);\n }\n \n //Form validation initialised by reCaptchaCallback\n\n});"],"names":["locationSuggestions","el","placeholder","console","warn","autoCompleteJS","autoComplete","selector","id","placeHolder","searchEngine","threshold","submit","data","src","query","fetch","dataset","source","json","keys","resultsList","element","list","info","document","createElement","classList","add","results","length","innerHTML","prepend","noResults","maxResults","tabSelect","resultItem","item","style","match","value","countryIso","highlight","input","addEventListener","event","feedback","detail","blur","selection","key","i","initRangePicker","DateRangePicker","getElementById","format","initCategories","getCategories","request","categories","Choices","removeItemButton","addItems","setChoices","handleChoicesValidation","choicesInstance","validator","innerEl","containerInner","revalidateField","then","isValid","remove","formEvents","form","categoriesChoices","e","reCaptchaCallback","querySelector","formValidation","JustValidate","justValidateGlobalDefaults","addField","rule","errorMessage","errorsContainer","onSuccess","loadingPopup","onFail","fields","markFulfilled","btn","preventDefault","url","includes","authenticatedFetch","method","resp","ok","ajaxErrorPopUp","location","reload","window","locationEl","markFulfilledBtn","markRemovedBtn"],"sourceRoot":""}