Skip to content
{"_id":"6834136028aebd11fda54377","title":"HomeRenovation","name":"homeRenovation","path":"homerenovation","type":"form","display":"form","tags":[""],"components":[{"label":"Columns","columns":[{"components":[{"label":"HTML","tag":"div","className":"","attrs":[{"attr":"","value":""}],"content":"<label class=\"col-form-label field-required\">Quantity</label><input class=\"form-control counter quantity\" name=\"Quantity\" type=\"number\" min=\"1\" value=\"1\" max=\"10\">\n","refreshOnChange":false,"customClass":"","hidden":false,"modalEdit":false,"key":"html","tags":[],"properties":{},"conditional":{"show":null,"when":null,"eq":"","json":""},"customConditional":"","logic":[],"attributes":{},"overlay":{"style":"","page":"","left":"","top":"","width":"","height":""},"type":"htmlelement","input":false,"tableView":false,"placeholder":"","prefix":"","suffix":"","multiple":false,"defaultValue":null,"protected":false,"unique":false,"persistent":false,"clearOnHide":true,"refreshOn":"","redrawOn":"","labelPosition":"top","description":"","errorLabel":"","tooltip":"","hideLabel":false,"tabindex":"","disabled":false,"autofocus":false,"dbIndex":false,"customDefaultValue":"","calculateValue":"","calculateServer":false,"widget":null,"validateOn":"change","validate":{"required":false,"custom":"","customPrivate":false,"strictDateValidation":false,"multiple":false,"unique":false},"allowCalculateOverride":false,"encrypted":false,"showCharCount":false,"showWordCount":false,"allowMultipleMasks":false,"addons":[],"serverOverride":{},"id":"eykcv0i","dataGridLabel":false},{"label":"HTML","tag":"div","className":"","attrs":[{"attr":"","value":""}],"content":"<div>\n <div class=\"counter_caption\"><span class=\"counter_value\">1</span> x <span class=\"currency_name\">USD</span> <span class=\"unit_price_value\">200</span> (unit price)</div>\n <div class=\"my-error formio-errors invalid-feedback\" ref=\"messageContainer\">\n <div class=\"form-text error\" id=\"e-eeaanz-mehrumsName\">\n Counter must be minimum 1 and max 100\n </div>\n </div>\n</div>\n","refreshOnChange":false,"customClass":"unit_price","hidden":false,"modalEdit":false,"key":"html2","tags":[],"properties":{},"conditional":{"show":null,"when":null,"eq":"","json":""},"customConditional":"","logic":[],"attributes":{},"overlay":{"style":"","page":"","left":"","top":"","width":"","height":""},"type":"htmlelement","input":false,"placeholder":"","prefix":"","suffix":"","multiple":false,"defaultValue":null,"protected":false,"unique":false,"persistent":false,"clearOnHide":true,"refreshOn":"","redrawOn":"","tableView":false,"labelPosition":"top","description":"","errorLabel":"","tooltip":"","hideLabel":false,"tabindex":"","disabled":false,"autofocus":false,"dbIndex":false,"customDefaultValue":"","calculateValue":"","calculateServer":false,"widget":null,"validateOn":"change","validate":{"required":false,"custom":"","customPrivate":false,"strictDateValidation":false,"multiple":false,"unique":false},"allowCalculateOverride":false,"encrypted":false,"showCharCount":false,"showWordCount":false,"allowMultipleMasks":false,"addons":[],"serverOverride":{},"id":"eklk06g","dataGridLabel":false}],"width":7,"offset":0,"push":0,"pull":0,"size":"md","currentWidth":7},{"components":[{"label":"HTML","tag":"div","className":"","attrs":[{"attr":"","value":""}],"content":"<p class=\"total_amount\"><span class=\"product_price\"></span> <span class=\"currency_name\"></span> </p>\n","refreshOnChange":false,"customClass":"total_currency_amount","hidden":false,"modalEdit":false,"key":"html1","tags":[],"properties":{},"conditional":{"show":null,"when":null,"eq":"","json":""},"customConditional":"","logic":[],"attributes":{},"overlay":{"style":"","page":"","left":"","top":"","width":"","height":""},"type":"htmlelement","input":false,"placeholder":"","prefix":"","suffix":"","multiple":false,"defaultValue":null,"protected":false,"unique":false,"persistent":false,"clearOnHide":true,"refreshOn":"","redrawOn":"","tableView":false,"labelPosition":"top","description":"","errorLabel":"","tooltip":"","hideLabel":false,"tabindex":"","disabled":false,"autofocus":false,"dbIndex":false,"customDefaultValue":"","calculateValue":"","calculateServer":false,"widget":null,"validateOn":"change","validate":{"required":false,"custom":"","customPrivate":false,"strictDateValidation":false,"multiple":false,"unique":false},"allowCalculateOverride":false,"encrypted":false,"showCharCount":false,"showWordCount":false,"allowMultipleMasks":false,"addons":[],"serverOverride":{},"id":"efbog6t","dataGridLabel":false}],"offset":0,"push":0,"pull":0,"size":"md","currentWidth":5,"width":5}],"autoAdjust":false,"customClass":"","hidden":false,"modalEdit":false,"key":"columns","tags":[],"properties":{},"conditional":{"show":null,"when":null,"eq":"","json":""},"customConditional":"","logic":[],"attributes":{},"overlay":{"style":"","page":"","left":"","top":"","width":"","height":""},"type":"columns","input":false,"placeholder":"","prefix":"","suffix":"","multiple":false,"defaultValue":null,"protected":false,"unique":false,"persistent":false,"clearOnHide":false,"refreshOn":"","redrawOn":"","tableView":false,"labelPosition":"top","description":"","errorLabel":"","tooltip":"","hideLabel":false,"tabindex":"","disabled":false,"autofocus":false,"dbIndex":false,"customDefaultValue":"","calculateValue":"","calculateServer":false,"widget":null,"validateOn":"change","validate":{"required":false,"custom":"","customPrivate":false,"strictDateValidation":false,"multiple":false,"unique":false},"allowCalculateOverride":false,"encrypted":false,"showCharCount":false,"showWordCount":false,"allowMultipleMasks":false,"addons":[],"serverOverride":{},"tree":false,"lazyLoad":false,"id":"egs6tt","dataGridLabel":false},{"label":"Donate","action":"submit","theme":"primary","size":"md","block":false,"leftIcon":"","rightIcon":"","shortcut":"","description":"","tooltip":"","customClass":"","tabindex":"","disableOnInvalid":false,"hidden":false,"autofocus":false,"disabled":false,"tableView":false,"modalEdit":false,"key":"submit","tags":[],"properties":{},"conditional":{"show":"","when":"","eq":"","json":""},"customConditional":"","logic":[],"attributes":{"data-source":"Record_HomeRenovation_Form"},"overlay":{"style":"","page":"","left":"","top":"","width":"","height":""},"saveOnEnter":false,"type":"button","input":true,"placeholder":"","prefix":"","suffix":"","multiple":false,"defaultValue":null,"protected":false,"unique":false,"persistent":false,"clearOnHide":true,"refreshOn":"","redrawOn":"","dataGridLabel":true,"labelPosition":"top","errorLabel":"","dbIndex":false,"customDefaultValue":"","calculateValue":"","calculateServer":false,"widget":{"type":"input"},"validateOn":"change","validate":{"required":false,"custom":"","customPrivate":false,"strictDateValidation":false,"multiple":false,"unique":false},"allowCalculateOverride":false,"encrypted":false,"showCharCount":false,"showWordCount":false,"allowMultipleMasks":false,"addons":[],"serverOverride":{},"id":"egfini9","hideLabel":false},{"label":"Currencies","labelPosition":"top","widget":"choicesjs","placeholder":"","description":"","tooltip":"","customClass":"fo-hidden-field","tabindex":"","hidden":false,"hideLabel":false,"uniqueOptions":false,"autofocus":false,"disabled":false,"tableView":true,"modalEdit":false,"multiple":false,"dataSrc":"values","defaultValue":"USD","data":{"values":[{"label":"USD","value":"USD"},{"label":"AUD","value":"AUD"},{"label":"EUR","value":"EUR"},{"label":"GBP","value":"GBP"},{"label":"CAD","value":"CAD"},{"label":"SGD","value":"SGD"}],"resource":"","json":"","url":"","custom":""},"valueProperty":"","dataType":"","idPath":"id","template":"<span>{{ item.label }}</span>","refreshOn":"","refreshOnBlur":"","clearOnRefresh":false,"searchEnabled":true,"selectThreshold":0.3,"readOnlyValue":false,"customOptions":{},"useExactSearch":false,"persistent":true,"protected":false,"dbIndex":false,"encrypted":false,"clearOnHide":true,"customDefaultValue":"","calculateValue":"","calculateServer":false,"allowCalculateOverride":false,"serverOverride":{},"validateOn":"change","validate":{"required":false,"onlyAvailableItems":false,"customMessage":"","custom":"","customPrivate":false,"json":"","strictDateValidation":false,"multiple":false,"unique":false},"unique":false,"validateWhenHidden":false,"errorLabel":"","errors":"","key":"currencies","tags":[],"properties":{},"conditional":{"show":"","when":"","eq":"","json":""},"customConditional":"","logic":[],"attributes":{},"overlay":{"style":"","page":"","left":"","top":"","width":"","height":""},"limit":100,"type":"select","input":true,"prefix":"","suffix":"","showCharCount":false,"showWordCount":false,"allowMultipleMasks":false,"addons":[],"fuseOptions":{"include":"score","threshold":0.3},"indexeddb":{"filter":{}},"id":"e9zuf3l","redrawOn":"","dataGridLabel":false,"authenticate":false,"ignoreCache":false,"lazyLoad":true,"filter":"","searchDebounce":0.3,"searchField":"","minSearch":0,"selectFields":""},{"label":"Product Id","labelPosition":"top","placeholder":"","description":"","tooltip":"","prefix":"","suffix":"","widget":{"type":"input"},"inputMask":"","displayMask":"","applyMaskOn":"change","allowMultipleMasks":false,"customClass":"fo-hidden-field","tabindex":"","autocomplete":"","hidden":false,"hideLabel":false,"showWordCount":false,"showCharCount":false,"mask":false,"autofocus":false,"spellcheck":true,"disabled":false,"tableView":true,"modalEdit":false,"multiple":false,"defaultValue":"208","persistent":true,"inputFormat":"plain","protected":false,"dbIndex":false,"case":"","truncateMultipleSpaces":false,"encrypted":false,"redrawOn":"","clearOnHide":true,"customDefaultValue":"","calculateValue":"","calculateServer":false,"allowCalculateOverride":false,"serverOverride":{},"validateOn":"change","validate":{"required":false,"pattern":"","customMessage":"","custom":"","customPrivate":false,"json":"","minLength":"","maxLength":"","strictDateValidation":false,"multiple":false,"unique":false},"unique":false,"validateWhenHidden":false,"errorLabel":"","errors":"","key":"productId","tags":[],"properties":{},"conditional":{"show":null,"when":null,"eq":"","json":""},"customConditional":"","logic":[],"attributes":{},"overlay":{"style":"","page":"","left":"","top":"","width":"","height":""},"type":"textfield","input":true,"refreshOn":"","addons":[],"inputType":"text","id":"e7nsnv","dataGridLabel":false},{"label":"Variant Id","labelPosition":"top","placeholder":"","description":"","tooltip":"","prefix":"","suffix":"","widget":{"type":"input"},"inputMask":"","displayMask":"","applyMaskOn":"change","allowMultipleMasks":false,"customClass":"fo-hidden-field","tabindex":"","autocomplete":"","hidden":false,"hideLabel":false,"showWordCount":false,"showCharCount":false,"mask":false,"autofocus":false,"spellcheck":true,"disabled":false,"tableView":true,"modalEdit":false,"multiple":false,"persistent":true,"inputFormat":"plain","protected":false,"dbIndex":false,"case":"","truncateMultipleSpaces":false,"encrypted":false,"redrawOn":"","clearOnHide":true,"customDefaultValue":"","calculateValue":"","calculateServer":false,"allowCalculateOverride":false,"serverOverride":{},"validateOn":"change","validate":{"required":false,"pattern":"","customMessage":"","custom":"","customPrivate":false,"json":"","minLength":"","maxLength":"","strictDateValidation":false,"multiple":false,"unique":false},"unique":false,"validateWhenHidden":false,"errorLabel":"","errors":"","key":"variantId","tags":[],"properties":{},"conditional":{"show":null,"when":null,"eq":"","json":""},"customConditional":"","logic":[],"attributes":{},"overlay":{"style":"","page":"","left":"","top":"","width":"","height":""},"type":"textfield","input":true,"refreshOn":"","addons":[],"inputType":"text","id":"ecdbggs","defaultValue":"","dataGridLabel":false},{"label":"HandleErrorOnCount","labelPosition":"top","placeholder":"","description":"","tooltip":"","prefix":"","suffix":"","widget":{"type":"input"},"inputMask":"","displayMask":"","applyMaskOn":"change","allowMultipleMasks":false,"customClass":"fo-hidden-field","tabindex":"","autocomplete":"","hidden":false,"hideLabel":false,"showWordCount":false,"showCharCount":false,"mask":false,"autofocus":false,"spellcheck":true,"disabled":false,"tableView":true,"modalEdit":false,"multiple":false,"defaultValue":"valid","persistent":true,"inputFormat":"plain","protected":false,"dbIndex":false,"case":"","truncateMultipleSpaces":false,"encrypted":false,"redrawOn":"","clearOnHide":true,"customDefaultValue":"","calculateValue":"","calculateServer":false,"allowCalculateOverride":false,"serverOverride":{},"validateOn":"change","validate":{"required":false,"pattern":"","customMessage":"","custom":"valid = input === \"valid\"","customPrivate":false,"json":"","minLength":"","maxLength":"","strictDateValidation":false,"multiple":false,"unique":false},"unique":false,"validateWhenHidden":false,"errorLabel":"","errors":"","key":"handleErrorOnCount","tags":[],"properties":{},"conditional":{"show":null,"when":null,"eq":"","json":""},"customConditional":"","logic":[],"attributes":{},"overlay":{"style":"","page":"","left":"","top":"","width":"","height":""},"type":"textfield","input":true,"refreshOn":"","addons":[],"inputType":"text","id":"es53mwe","dataGridLabel":false},{"label":"FormLogic","labelPosition":"top","placeholder":"","description":"","tooltip":"","prefix":"","suffix":"","widget":{"type":"input"},"inputMask":"","displayMask":"","applyMaskOn":"change","allowMultipleMasks":false,"customClass":"fo-hidden-field","tabindex":"","autocomplete":"","hidden":false,"hideLabel":false,"showWordCount":false,"showCharCount":false,"mask":false,"autofocus":false,"spellcheck":true,"disabled":false,"tableView":true,"modalEdit":false,"multiple":false,"persistent":true,"inputFormat":"plain","protected":false,"dbIndex":false,"case":"","truncateMultipleSpaces":false,"encrypted":false,"redrawOn":"","clearOnHide":true,"customDefaultValue":"","calculateValue":"((VERSION = \"18.0\") => {\r\n const logger = {\r\n log: (...args) => {\r\n if (localStorage.getItem(\"debug\") !== \"true\") return;\r\n console.debug(...args)\r\n }, error: (...args) => {\r\n if (localStorage.getItem(\"debug\") !== \"true\") return;\r\n console.error(...args)\r\n }, info: (...args) => {\r\n if (localStorage.getItem(\"debug\") !== \"true\") return;\r\n console.log(`%cℹ️ ${args.join(', ')}`, 'color: blue; font-weight: bold;');\r\n }\r\n }\r\n const runOnce = (config) => {\r\n instance.root.scriptRunOnced = instance.root.scriptRunOnced || false;\r\n if (!instance.root.scriptRunOnced) {\r\n instance.root.scriptRunOnced = true;\r\n instance.root.config = config;\r\n logger.info(`* FM :: version = ${VERSION}`);\r\n logger.info(`* FM :: Form > Id = ${form._id}, Title = ${form.title}`);\r\n logger.info(`* FM :: Product-Id = ${data.productId}`);\r\n\r\n return {counterMin: config.counterMin, counterMax: config.counterMax};\r\n }\r\n return {counterMin: instance.root.config.counterMin, counterMax: instance.root.config.counterMax};\r\n }\r\n data = data || {}\r\n logger.log(\"* FM :: data = \", JSON.stringify(data));\r\n\r\n const BASE_URL = 'https://akhyar.org/wp-json/brains/v1';\r\n const MAX_TEXT_LENGTH = 28;\r\n const prodPrice = document.querySelector('.product_price');\r\n const unitPrice = document.querySelector('.unit_price_value');\r\n const finalAmount = document.querySelector('.total_amount');\r\n const counter = document.querySelector('.counter');\r\n const counterCaption = document.querySelector('.counter_caption');\r\n const counterValueElem = document.querySelector('.counter_value');\r\n const maxTextLength = document.querySelector('.max-text-length');\r\n\r\n const handleErrorOnCount = instance.root.getComponent(\"handleErrorOnCount\");\r\n //const totalAmount = instance.root.getComponent(\"totalAmount\");\r\n const variantIdComponent = instance.root.getComponent('variantId');\r\n\r\n const {counterMin, counterMax} = runOnce({\r\n counterMin: counter ? counter.getAttribute(\"min\") || 1 : 1,\r\n counterMax: counter ? counter.getAttribute(\"max\") : 20\r\n });\r\n\r\n const container = document.querySelector('.formio-component-htmlelement');\r\n let labelText = \"Count\";\r\n let counterErrMsg;\r\n if (container) {\r\n const label = container.querySelector('.col-form-label');\r\n if (label) {\r\n labelText = label.textContent.trim();\r\n logger.log(\"Text here: \",labelText);\r\n } \r\n }\r\n counterErrMsg = `${labelText} must be min ${counterMin} and max ${counterMax}`;\r\n\r\n const currencyElem = document.querySelectorAll('.currency_name');\r\n const productid = data.productId;\r\n\r\n let currency = data.currencies || \"USD\";\r\n currency = currency.toUpperCase();\r\n\r\n const onCounterChange = function () {\r\n const product_price = Number(unitPrice.innerText || 0);\r\n const counterValue = Number(counter.value || 1);\r\n logger.log(\"* FM :: \", product_price, counterValue);\r\n counterValueElem.innerText = counterValue;\r\n prodPrice.innerText = product_price * counterValue;\r\n };\r\n\r\n const showHideError = function (e, show, message) {\r\n const myErrorElem = e.target.parentNode.parentNode.parentNode.querySelector(\".my-error\");\r\n if (!myErrorElem) {\r\n logger.log(\"* FM :: error comp not found\");\r\n return;\r\n }\r\n if (message) {\r\n myErrorElem.innerHTML = `<div class=\"form-text error\">${message}</div>`;\r\n }\r\n if (show) {\r\n myErrorElem.style.display = \"block\";\r\n e.target.classList.add(\"is-invalid\");\r\n handleErrorOnCount.setValue(\"error\");\r\n } else {\r\n myErrorElem.style.display = \"none\";\r\n e.target.classList.remove(\"is-invalid\");\r\n handleErrorOnCount.setValue(\"valid\");\r\n }\r\n }\r\n\r\n //showHideError({target: counter}, false);\r\n const onRefresh = function (e) {\r\n logger.log(\"* FM :: onRefresh \", Number(e.target.value), counterMax);\r\n\r\n if (currencyElem) currencyElem.forEach(el => el.innerText = currency);\r\n\r\n if (data.showFinalAmountWhenVariantIsSelected) {\r\n const show = variantIdComponent.getValue() !== '';\r\n if (finalAmount) finalAmount.style.display = show ? \"block\" : \"none\";\r\n if (counterCaption) counterCaption.style.display = show ? \"block\" : \"none\";\r\n }\r\n\r\n // if (!e.target.value || (e.target.value && Number(e.target.value) > Number(counterMax))) {\r\n // logger.log(\"* FM :: no counter value\");\r\n // return;\r\n // }\r\n\r\n let isValid = true;\r\n if (!e.target.value || Number(e.target.value) < Number(counterMin) || (counterMax && Number(e.target.value) > Number(counterMax))) {\r\n e.target.value = e.target.value.substring(0, counterMax.length)\r\n isValid = false;\r\n } else if (e.key === '0' && Number(e.target.value) < Number(counterMin)) {\r\n isValid = false;\r\n } else if (Number(e.target.value + e.key) > Number(counterMax)) {\r\n isValid = false;\r\n }\r\n if (!isValid) {\r\n showHideError(e, true, counterErrMsg);\r\n } else {\r\n showHideError(e, false);\r\n }\r\n\r\n if (isValid) {\r\n onCounterChange();\r\n }\r\n };\r\n\r\n const bindCounterEvents = () => {\r\n counter.onchange = onCounterChange;\r\n counter.onkeyup = function (e) {\r\n if (!e.target.value) {\r\n showHideError(e, true, counterErrMsg);\r\n }\r\n }\r\n counter.onkeydown = function (e) {\r\n if (['.', '+', '-', 'e'].includes(e.key)) return false;\r\n if (e.key === 'Backspace') {\r\n if (e.target.value.length === 1) {\r\n showHideError(e, true, counterErrMsg);\r\n }\r\n return true;\r\n }\r\n showHideError(e, false, counterErrMsg);\r\n if (e.key === '0' && Number(e.target.value) < Number(counterMin)) {\r\n showHideError(e, true, counterErrMsg);\r\n return false;\r\n }\r\n // if (Number(e.target.value + e.key) > Number(counterMax)) {\r\n // showHideError(e, true, counterErrMsg);\r\n // return false;\r\n // }\r\n }\r\n counter.oninput = function (e) {\r\n if (!e.target.value || Number(e.target.value) < Number(counterMin) || (counterMax && Number(e.target.value) > Number(counterMax))) {\r\n showHideError(e, true, counterErrMsg);\r\n e.target.value = e.target.value.substring(0, counterMax.length)\r\n } else {\r\n showHideError(e, false, counterErrMsg);\r\n }\r\n onCounterChange();\r\n };\r\n ['onpaste', 'oncopy', 'onselect'].forEach(method => {\r\n counter[method] = function (e) {\r\n e.preventDefault();\r\n };\r\n })\r\n }\r\n\r\n const setVariantId = (apidata) => {\r\n const key = Object.keys(data).filter((x) => {\r\n if (typeof (data[x]) === \"object\" && data[x].type === 'variant') return true;\r\n if (data[x] && data[x].charAt && data[x].charAt(0) === '{') return true;\r\n }).map((x) => {\r\n if (data[x] && data[x].charAt && data[x].charAt(0) === '{') {\r\n let jsonStr = data[x].replace(/'/g, '\"');\r\n const nData = JSON.parse(jsonStr);\r\n return `${nData.key}:${nData.value}`.toLowerCase();\r\n }\r\n return `${data[x].key}:${data[x].value}`.toLowerCase();\r\n }).sort().join('|');\r\n\r\n logger.log(\"* FM :: key = \", key);\r\n\r\n const variant = apidata.find(e => {\r\n return e.key === key;\r\n });\r\n\r\n if (!variant) {\r\n logger.info(\"* FM :: variant not found\");\r\n variantIdComponent.setValue('');\r\n return;\r\n }\r\n\r\n const variantId = variant.variant_id;\r\n logger.log(\"* FM :: variant = \", variant, variantId);\r\n\r\n if (unitPrice) unitPrice.innerText = variant.pricing_data[currency];\r\n\r\n if (prodPrice && counter) {\r\n const counterValue = Number(counter.value);\r\n prodPrice.innerText = counterValue * variant.pricing_data[currency];\r\n }\r\n\r\n if (variantIdComponent) {\r\n variantIdComponent.setValue(variantId, {fromSubmission: true});\r\n }\r\n if (variantId && data.showFinalAmountWhenVariantIsSelected) {\r\n finalAmount.style.display = \"block\";\r\n counterCaption.style.display = \"block\";\r\n }\r\n };\r\n\r\n const fetchVariantData = () => {\r\n logger.log(\"* FM :: fetching variant data\");\r\n const cahced_data = instance.root.variants_data;\r\n if (cahced_data) {\r\n logger.log(\"* FM :: cache detected\");\r\n return Promise.resolve(cahced_data);\r\n }\r\n logger.log(\"* FM :: cache detected\");\r\n return fetch(`${BASE_URL}/products/${productid}/variants`)\r\n .then(response => response.json()).then(apidata => {\r\n return apidata.map(d => {\r\n const vdata = d.variant_data;\r\n const v2 = Object.keys(vdata).map((key) => {\r\n return `${key}:${vdata[key]}`.toLocaleLowerCase();\r\n }).sort().join('|');\r\n logger.log(\"* FM :: keys \", v2);\r\n return {...d, key: v2};\r\n });\r\n });\r\n }\r\n\r\n fetchVariantData().then((apidata) => {\r\n logger.log(\"* FM :: \", apidata);\r\n instance.root.variants_data = apidata;\r\n\r\n setVariantId(apidata);\r\n }).catch((err) => {\r\n logger.log(\"* FM :: ERROR => in fetching variant data\")\r\n // delete instance.root.variants_data;\r\n }).then(() => {\r\n // setTimeout(() => {\r\n // const submitBtn = instance.root.getComponent('submit')\r\n // submitBtn.refs.button.disabled = false; \r\n // }, 300);\r\n });\r\n\r\n if (counter) {\r\n // setTimeout(() => {\r\n onRefresh({target: counter})\r\n // }, 0);\r\n bindCounterEvents();\r\n }\r\n\r\n if (maxTextLength) {\r\n maxTextLength.oninput = (e) => {\r\n if (e.target.value.length > MAX_TEXT_LENGTH) {\r\n e.target.value = e.target.value.substring(0, MAX_TEXT_LENGTH)\r\n }\r\n }\r\n }\r\n\r\n const logicToResetSearchField = () => {\r\n logger.log('* FM :: logicToResetSearchField');\r\n const logicToClearSearchField = (comp) => {\r\n const searchInput = comp.element?.querySelector('input');\r\n searchInput.addEventListener('blur', () => {\r\n logger.log('* FM :: Choices input blurred:', comp.key);\r\n comp.choices.input.value = '';\r\n comp.choices._handleSearch('', true);\r\n\r\n setTimeout(logicToResetSearchField, 600);\r\n comp.triggerRedraw();\r\n });\r\n }\r\n instance.root.getComponents().forEach(comp => {\r\n if ((!comp.columns && !comp.choices) || (comp.choices && !comp.choices.input)) return;\r\n\r\n if (comp.columns) {\r\n comp.getComponents().forEach((subComp) => {\r\n if (!subComp.choices || (subComp.choices && !subComp.choices.input)) return;\r\n logicToClearSearchField(subComp);\r\n })\r\n } else {\r\n logicToClearSearchField(comp);\r\n }\r\n });\r\n }\r\n logicToResetSearchField();\r\n})();\r\n","calculateServer":false,"allowCalculateOverride":false,"validateOn":"change","validate":{"required":false,"pattern":"","customMessage":"","custom":"","customPrivate":false,"json":"","minLength":"","maxLength":"","strictDateValidation":false,"multiple":false,"unique":false},"unique":false,"validateWhenHidden":false,"errorLabel":"","errors":"","key":"logicForm","tags":[],"properties":{},"conditional":{"show":null,"when":null,"eq":"","json":""},"customConditional":"","logic":[],"attributes":{},"overlay":{"style":"","page":"","left":"","top":"","width":"","height":""},"type":"textfield","serverOverride":{},"input":true,"refreshOn":"","addons":[],"inputType":"text","id":"ei31alk","defaultValue":"","dataGridLabel":false},{"label":"Show final amount when variant is selected","description":"","tooltip":"","shortcut":"","inputType":"checkbox","customClass":"fo-hidden-field","tabindex":"","hidden":false,"hideLabel":false,"autofocus":false,"disabled":false,"tableView":false,"modalEdit":false,"persistent":true,"protected":false,"dbIndex":false,"encrypted":false,"redrawOn":"","clearOnHide":true,"customDefaultValue":"","calculateValue":"","calculateServer":false,"allowCalculateOverride":false,"serverOverride":{},"validate":{"required":false,"customMessage":"","custom":"","customPrivate":false,"json":"","strictDateValidation":false,"multiple":false,"unique":false},"validateWhenHidden":false,"errorLabel":"","errors":"","key":"showFinalAmountWhenVariantIsSelected","tags":[],"properties":{},"conditional":{"show":null,"when":null,"eq":"","json":""},"customConditional":"","logic":[],"attributes":{},"overlay":{"style":"","page":"","left":"","top":"","width":"","height":""},"type":"checkbox","input":true,"placeholder":"","prefix":"","suffix":"","multiple":false,"unique":false,"refreshOn":"","labelPosition":"right","widget":null,"validateOn":"change","showCharCount":false,"showWordCount":false,"allowMultipleMasks":false,"addons":[],"id":"em7tyk","defaultValue":true,"dataGridLabel":true,"value":"","name":""}],"pdfComponents":[],"access":[{"type":"read_all","roles":["681af7ed317bacb5e067c4ca","681af7ed317bacb5e067c4dd","681af7ed317bacb5e067c4e9"]}],"submissionAccess":[],"created":"2025-05-26T07:08:16.606Z","modified":"2026-02-11T06:26:41.234Z","machineName":"homeRenovation"}
About Home Renovation
In the holy cities, many widows, orphans, and low-income families live in homes that are badly damaged or incomplete. Their roofs leak, walls are unstable, and in extreme weather, these homes offer little to no protection.
This project focuses on renovating such homes to make them safe and livable again. From repairing walls and roofs to fixing flooring or installing basic plumbing, we respond to each case based on its urgency. Your support helps turn unsafe shelters into homes.
How We Work
We assess renovation requests locally, prioritizing widows, orphan families, and those in critical housing conditions. Depending on the damage, support may include roof repairs, wall strengthening, safe flooring, or essential utilities. Work is carried out by trusted teams in the holy cities, and updates are tracked per project.
Change Starts With You
A pure intention can light up lives across continents . Through Akhyar, your kindness becomes a wave of hope that uplifts, empowers, and transforms.
To provide the best experiences, we use technologies like cookies to store and/or access device information. Consenting to these technologies will allow us to process data such as browsing behavior or unique IDs on this site. Not consenting or withdrawing consent, may adversely affect certain features and functions.
You can familiarize with our Privacy Policy
Strictly necessary cookies allow core website functionality such as user login and account management. The website cannot be used properly without strictly necessary cookies.
The technical storage or access is necessary for the legitimate purpose of storing preferences that are not requested by the subscriber or user.
The technical storage or access that is used exclusively for statistical purposes.
The technical storage or access that is used exclusively for anonymous statistical purposes. Without a subpoena, voluntary compliance on the part of your Internet Service Provider, or additional records from a third party, information stored or retrieved for this purpose alone cannot usually be used to identify you.
These cookies are used to see how visitors use the website, e.g. analytics and may be used to build a profile of visitor interests or show relevant ads on other websites.
Manage consent