{"version":3,"file":"main-e54991b290227d836ff4-bundle.js","mappings":"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","sources":["webpack:///./assets/back.svg","webpack:///./assets/close.svg","webpack:///./assets/error.svg","webpack:///./assets/exclamation.svg","webpack:///./assets/forward.svg","webpack:///./assets/icons/outline/calculator.svg","webpack:///./assets/icons/outline/currency-pound.svg","webpack:///./assets/icons/outline/home.svg","webpack:///./assets/icons/outline/mail.svg","webpack:///./assets/icons/outline/receipt-refund.svg","webpack:///./assets/icons/outline/shopping-cart.svg","webpack:///./assets/icons/outline/thumb-up.svg","webpack:///./assets/icons/solid/menu-alt-1.svg","webpack:///./assets/icons/solid/x.svg","webpack:///./assets/info.svg","webpack:///./assets/loading.svg","webpack:///./assets/menu.svg","webpack:///./assets/messages.svg","webpack:///./assets/search.svg","webpack:///./assets/tick.svg","webpack:///./assets/view-off.svg","webpack:///./assets/view.svg","webpack:///./view/components/BottomNav/index.js","webpack:///./view/components/Button/index.js","webpack:///./view/components/Card/index.js","webpack:///./view/components/Checkbox/index.js","webpack:///./view/components/Dialog/index.js","webpack:///./view/components/Dialog2/index.js","webpack:///./view/components/Heading/index.js","webpack:///./view/components/CurrencyInput/index.js","webpack:///./view/components/Input/index.js","webpack:///./view/components/InputSpin/index.js","webpack:///./view/components/Avatar/index.js","webpack:///./view/components/Layout/components/LogoutDialog/index.js","webpack:///./api/user.js","webpack:///./store/auth.js","webpack:///./api/request.js","webpack:///./api/profile.js","webpack:///./store/profile.js","webpack:///./view/components/Layout/components/Navbar/NavbarUser.js","webpack:///./utils/notifications.js","webpack:///./store/supplier.js","webpack:///./api/system.js","webpack:///./assets/images/performancefinance-header.png","webpack:///./view/components/Layout/index.js","webpack:///./assets/images/performancefinance-badge.png","webpack:///./view/components/Link/index.js","webpack:///./view/components/Loading/FullScreen/index.js","webpack:///./view/components/PageHeaderSupplier/index.js","webpack:///./view/components/Password/index.js","webpack:///./view/components/Portal/index.js","webpack:///./view/components/Radio/index.js","webpack:///./view/components/RadioGroup/index.js","webpack:///./view/components/Select/index.js","webpack:///./view/components/Svg/index.js","webpack:///./view/components/TextArea/index.js","webpack:///./view/components/EditForm/index.js","webpack:///./view/components/EditFormSection/index.js","webpack:///./validators/login.js","webpack:///./validators/utils.js","webpack:///./api/supplier.js","webpack:///./view/pages/Login/index.js","webpack:///./api/auth.js","webpack:///./view/pages/RegisterConfirm/index.js","webpack:///./validators/forgottenPassword.js","webpack:///./view/pages/RegisterRequest/index.js","webpack:///./view/pages/ResetPassword/index.js","webpack:///./view/pages/ForgottenPassword/index.js","webpack:///./view/pages/Home/index.js","webpack:///./store/dashboard.js","webpack:///./view/pages/SelectSupplier/index.js","webpack:///./view/pages/SelectRateGroup/index.js","webpack:///./utils/index.js","webpack:///./view/pages/QuoteFinance/EmailDialog.js","webpack:///./view/pages/QuoteFinance/ROIDialog.js","webpack:///./view/pages/QuoteFinance/ViewQuote.js","webpack:///./api/quote.js","webpack:///./api/rateGroup.js","webpack:///./view/pages/QuoteFinance/index.js","webpack:///./view/pages/ProductQuote/Steps/1SelectCategory.js","webpack:///./api/product.js","webpack:///./view/pages/ProductQuote/Steps/2SelectProducts.js","webpack:///./utils/debounce.js","webpack:///./view/pages/ProductQuote/Steps/3ViewQuote.js","webpack:///./view/pages/ProductQuote/index.js","webpack:///./view/pages/ApplicationForm/index.js","webpack:///./api/application.js","webpack:///./view/pages/Profile/index.js","webpack:///./view/pages/QuoteROI/ViewQuoteROI.js","webpack:///./api/rate.js","webpack:///./view/pages/QuoteROI/index.js","webpack:///./view/pages/SuperDeduction/index.js","webpack:///./view/routes.js","webpack:///./view/pages/Logout/index.js","webpack:///./utils/analytics.js","webpack:///./index.js","webpack:///./translations/en-gb.js","webpack:///./translations/index.js","webpack:///./utils/log.js"],"sourcesContent":["module.exports = \"\"","module.exports = \"\"","module.exports = \"\"","module.exports = \"\"","module.exports = \"\"","module.exports = \"\"","module.exports = \"\"","module.exports = \"\"","module.exports = \"\"","module.exports = \"\"","module.exports = \"\"","module.exports = \"\"","module.exports = \"\"","module.exports = \"\"","module.exports = \"\"","module.exports = \"\"","module.exports = \"\"","module.exports = \"\"","module.exports = \"\"","module.exports = \"\"","module.exports = \"\"","module.exports = \"\"","import { Svg } from 'components'\r\n\r\nexport const BottomNav = () => {\r\n return {\r\n view ({ children }) {\r\n return m('.bg-gray-500.flex.w-screen', [\r\n children.map(i => m(BottomNavItem, i))\r\n ])\r\n }\r\n }\r\n}\r\n\r\nconst BottomNavItem = () => {\r\n return {\r\n view ({ attrs: { href, icon, title, isActive = () => { }, onclick = () => { } } }) {\r\n const tag = href ? m.route.Link : 'button'\r\n const colorClass = isActive() ? 'text-gray-700' : 'text-gray-100'\r\n return m(tag, {\r\n tabindex: 0,\r\n class: 'text-center p-1 pt-2 flex flex-col flex-1 justify-center items-center',\r\n href: href,\r\n onclick\r\n }, [\r\n m(Svg, {\r\n classes: [colorClass, 'w-5', 'm-auto']\r\n }, icon),\r\n m('p.mt-1.text-xs.leading-tight', {\r\n class: colorClass\r\n }, title)\r\n ])\r\n }\r\n }\r\n}\r\n","import { Svg } from 'components'\r\nimport loadingIcon from 'assets/loading.svg'\r\n\r\nconst styles = {\r\n initial: ['rounded', 'relative'],\r\n size: {\r\n md: ['py-2', 'px-4'],\r\n sm: ['py-1', 'px-4', 'text-sm'],\r\n 'sm-square': ['py-1', 'px-1', 'text-sm'],\r\n 'md-square': ['py-2', 'px-2', 'text-md']\r\n },\r\n variant: {\r\n plain: ['bg-gray-500', 'hover:bg-gray-600', 'text-white', 'font-bold'],\r\n positive: ['bg-green-600', 'hover:bg-green-500', 'text-white', 'border-green-700', 'hover:border-green-500'],\r\n info: ['bg-blue-500', 'hover:bg-blue-400', 'text-white', 'border-blue-700', 'hover:border-blue-500'],\r\n warning: ['bg-orange-500', 'hover:bg-orange-400', 'text-white', 'border-orange-700', 'hover:border-orange-500'],\r\n danger: ['bg-red-800', 'hover:bg-red-800', 'text-white', 'hover:text-gray-800', 'border-red-800', 'hover:border-red-800', 'border-2'],\r\n circle: ['rounded-full', 'h-12', 'w-12', 'shadow-lg', 'bg-blue-500', 'text-white', 'flex', 'justify-center', 'items-center'],\r\n spin: ['bg-transparent', 'hover:bg-gray-900', 'text-gray-800']\r\n }\r\n}\r\n\r\nconst loadingSpinner = () => {\r\n return m(Svg, {\r\n classes: ['w-6', 'text-white', 'rotate', 'm-auto']\r\n }, loadingIcon)\r\n}\r\n\r\nexport const Button = () => {\r\n return {\r\n view ({\r\n children,\r\n attrs: {\r\n href,\r\n size = 'md',\r\n variant = 'info',\r\n block = false,\r\n onclick = () => {},\r\n classes = [],\r\n loading,\r\n icon,\r\n type = 'submit'\r\n }\r\n }) {\r\n const tag = href ? m.route.Link : 'button'\r\n return m(tag, {\r\n href,\r\n onclick,\r\n type,\r\n class: [\r\n block ? 'w-full' : '',\r\n loading ? 'pointer-events-none' : '',\r\n ...styles.initial,\r\n ...styles.size[size],\r\n ...styles.variant[variant],\r\n ...classes\r\n ].join(' ')\r\n }, [\r\n m('span.flex.gap-2.items-center.justify-center', {\r\n class: loading ? 'opacity-0' : ''\r\n }, [\r\n icon && m(Svg, { classes: [size === 'xs' ? 'h-4' : size === 'sm' ? 'h-5' : 'h-6'] }, icon),\r\n children\r\n ]),\r\n loading &&\r\n m('.absolute-center', loadingSpinner())\r\n ])\r\n }\r\n }\r\n}\r\n","export const Card = () => {\r\n return {\r\n view ({ children, attrs: { heading, buttons, tabindex, classes = [], clickable, onclick = () => { }, buttonJustify } }) {\r\n const isButtons = buttons && buttons.length\r\n return m('div.shadow.sm:rounded-md.divide-y.divide-gray-200', {\r\n class: [\r\n clickable ? 'cursor-pointer hover:shadow-lg' : null,\r\n ...classes\r\n ].join(' '),\r\n onclick,\r\n tabindex,\r\n onkeyup (e) {\r\n if (e.keyCode === 13) {\r\n onclick(e)\r\n }\r\n }\r\n }, [\r\n heading && m('div.bg-white.px-4.py-5.border-b.border-gray-200.sm:px-6',\r\n m('div.-ml-4.-mt-2.flex.items-center.justify-between.flex-wrap.sm:flex-nowrap',\r\n [\r\n m('div.ml-4.mt-2',\r\n m('h3.text-lg.leading-6.font-medium.text-gray-900',\r\n heading.title\r\n )\r\n ),\r\n m('div.ml-4.mt-2.flex-shrink-0',\r\n heading.buttons && heading.buttons.length && heading.buttons.map(b => {\r\n return b\r\n })\r\n )\r\n ]\r\n )\r\n ),\r\n m('.px-4.py-5.bg-white.space-y-2.sm:p-6', [\r\n children\r\n ]),\r\n isButtons ? m('.px-4.py-3.bg-gray-50.text-right.sm:px-6.flex.gap-2', {\r\n class: buttonJustify || 'justify-end'\r\n }, buttons.map(b => {\r\n return b\r\n })) : null\r\n ])\r\n }\r\n }\r\n}\r\n","export const Checkbox = () => {\r\n return {\r\n view ({ attrs: { label, classes = [], value, checked, onchange } }) {\r\n return m('.checkbox.py-2.cursor-pointer', {\r\n class: classes.join(' '),\r\n onclick (e) {\r\n onchange(value)\r\n }\r\n }, [\r\n m('input.absolute', {\r\n type: 'checkbox',\r\n value,\r\n checked,\r\n onclick (e) {\r\n e.stopPropagation()\r\n onchange(value || !checked)\r\n }\r\n }),\r\n m('label.cursor-pointer', {\r\n onclick (e) {\r\n e.stopPropagation()\r\n onchange(value || !checked)\r\n }\r\n }, label)\r\n ])\r\n }\r\n }\r\n}\r\n","import { Portal } from 'components'\r\n\r\nexport const Dialog = ({ attrs: { open } }) => {\r\n let loaded = false\r\n const closeDialog = () => {\r\n open(false)\r\n m.redraw()\r\n }\r\n\r\n open.map(val => {\r\n if (val === false) {\r\n loaded = false\r\n document.removeEventListener('backbutton', closeDialog)\r\n }\r\n })\r\n return {\r\n oncreate ({ dom, attrs: { open } }) {\r\n document.addEventListener('keyup', e => {\r\n if (e.keyCode === 27) {\r\n open(false)\r\n }\r\n })\r\n document.addEventListener('backbutton', closeDialog)\r\n setTimeout(() => {\r\n loaded = true\r\n m.redraw()\r\n }, 300)\r\n },\r\n view ({ attrs: { open, classes = [] }, children }) {\r\n return m(Portal, {\r\n onbeforeremove (dom) {\r\n dom.classList.add('dialogFadeOut', 'overflow-hidden')\r\n dom.children[0].classList.add('slideOutDown')\r\n m.redraw()\r\n return new Promise(resolve => {\r\n dom.addEventListener('animationend', resolve)\r\n })\r\n }\r\n }, [\r\n m('.py-8.inset-0.fixed.w-screen.h-screen.z-40.dialogFadeIn.flex.justify-center.items-center', {\r\n class: [\r\n loaded ? 'overflow-auto' : 'overflow-hidden'\r\n ].join(' '),\r\n onclick () {\r\n open(!open())\r\n }\r\n }, [\r\n m('.my-auto.dialog.flex.justify-center.items-center.slideInUp.w-11/12', {\r\n onclick (e) { e.stopPropagation() },\r\n style: 'max-width:600px',\r\n class: classes.join(' ')\r\n }, children)\r\n ])\r\n ])\r\n }\r\n }\r\n}\r\n","import { Portal, Svg, Button } from 'components'\r\nimport xIcon from 'assets/icons/solid/x.svg'\r\n\r\nexport const Dialog2 = ({ attrs: { open } }) => {\r\n const closeDialog = () => {\r\n open(false)\r\n m.redraw()\r\n }\r\n let removeConfirm = false\r\n\r\n open.map(val => {\r\n if (val === false) {\r\n document.removeEventListener('backbutton', closeDialog)\r\n }\r\n })\r\n return {\r\n oncreate ({ dom, attrs: { open } }) {\r\n document.addEventListener('keyup', e => {\r\n if (e.keyCode === 27) {\r\n closeDialog()\r\n }\r\n })\r\n document.addEventListener('backbutton', closeDialog)\r\n setTimeout(() => {\r\n m.redraw()\r\n }, 300)\r\n },\r\n view ({ attrs: { open, classes = [], save, heading, saving, remove, removeText, removeHide, saveLabel, cancelLabel }, children }) {\r\n return m(Portal, {\r\n onbeforeremove (dom) {\r\n dom.classList.add('dialogFadeOut', 'overflow-hidden')\r\n dom.children[0].classList.add('slideOutDown')\r\n m.redraw()\r\n return new Promise(resolve => {\r\n dom.addEventListener('animationend', resolve)\r\n })\r\n }\r\n }, [\r\n m('.fixed.z-40.inset-0.overflow-y-auto.border-black.border-2', {\r\n // onclick () {\r\n // open(!open())\r\n // }\r\n }, [\r\n m('.flex.items-end.justify-center.min-h-screen.pt-4.px-4.pb-20.text-center.sm:block.sm:p-0', [\r\n m(\".fixed.inset-0.bg-gray-500.bg-opacity-75.transition-opacity[aria-hidden='true']\"),\r\n m(\"span.hidden.sm:inline-block.sm:align-middle.sm:h-screen[aria-hidden='true']\",\r\n m.trust('')\r\n ),\r\n m('form.inline-block.border-gray-500.border-2.align-bottom.bg-white.rounded-sm.text-left.overflow-visible.shadow-xl.transform.transition-all.sm:my-8.sm:align-middle.sm:max-w-lg.sm:w-full',\r\n {\r\n // onclick (e) { e.stopPropagation() },\r\n onsubmit (e) {\r\n e.preventDefault()\r\n save && save()\r\n },\r\n class: classes.join(' ')\r\n }, [\r\n m('div.hidden.sm:block.absolute.top-0.right-0.pt-4.pr-4',\r\n m('button.bg-white.rounded-md.text-gray-400.hover:text-gray-500.focus:outline-none.focus:ring-2.focus:ring-offset-2.focus:ring-indigo-500', {\r\n type: 'button',\r\n onclick () {\r\n closeDialog()\r\n }\r\n },\r\n [\r\n m('span.sr-only',\r\n 'Close'\r\n ),\r\n m(Svg, { classes: ['h-6', 'w-6'] }, xIcon)\r\n ])\r\n ),\r\n m('.bg-white.px-4.pt-3.pb-4.sm:p-6.sm:pb-4', [\r\n m('.grid.gap-3', [\r\n m('.text-xl.leading-6.font-medium.text-gray-900', heading),\r\n children\r\n ])\r\n ]),\r\n m('.bg-gray-50.px-4.py-3.sm:px-6.flex.flex-col.flex-row.flex-row-reverse.justify-between.items-end.gap-6', [\r\n m('.flex.flex-row-reverse.gap-3', [\r\n save && m(Button, {\r\n classes: ['w-auto'],\r\n submit: true,\r\n variant: 'danger',\r\n loading: saving\r\n },\r\n saveLabel || t('app', 'save')\r\n ),\r\n m(Button, {\r\n classes: ['w-auto'],\r\n variant: 'plain',\r\n type: 'button',\r\n onclick () {\r\n closeDialog()\r\n }\r\n },\r\n cancelLabel || 'Cancel'\r\n )\r\n ]),\r\n remove && !removeHide && m(Button, {\r\n variant: 'delete',\r\n size: 'xs',\r\n classes: ['h-8'],\r\n onclick () {\r\n if (removeConfirm) { remove() } else {\r\n removeConfirm = true\r\n setTimeout(() => {\r\n removeConfirm = false\r\n m.redraw()\r\n }, 3000)\r\n }\r\n }\r\n },\r\n removeConfirm ? 'Click again to confirm remove' : removeText || t('app', 'remove')\r\n )\r\n ])\r\n ])\r\n ])\r\n ])\r\n ])\r\n }\r\n }\r\n}\r\n","const styles = {\r\n 1: ['text-2xl', 'font-semibold', 'text-gray-900'],\r\n 2: ['text-xl', 'font-semibold', 'text-gray-900'],\r\n 3: ['text-lg', 'font-semibold', 'text-gray-900'],\r\n 4: ['text-base', 'font-semibold', 'text-gray-900'],\r\n 5: ['text-sm', 'font-semibold', 'text-gray-900']\r\n}\r\n\r\nexport const Heading = () => {\r\n return {\r\n view ({ children, attrs: { level = 1, classes = [], style } }) {\r\n const tag = `h${level}`\r\n return m(tag, {\r\n style,\r\n class: [\r\n ...styles[level],\r\n ...classes\r\n ].join(' ')\r\n }, children)\r\n }\r\n }\r\n}\r\n","export const CurrencyInput = ({ attrs: { autofocus, classes = [], notFullWidth, labelSize, labelClasses = [] } }) => {\r\n let isInputActive = false\r\n return {\r\n oncreate ({ dom }) {\r\n if (autofocus) {\r\n dom.querySelector('input').focus()\r\n }\r\n },\r\n view ({ attrs }) {\r\n return m('div', [\r\n m('label.block', { class: [...labelClasses, labelSize ? labelSize : 'text-sm'].join(' ') }, attrs.label),\r\n m('div.mt-1.relative.rounded-md.shadow-sm', [\r\n attrs.type === 'readonly'\r\n ? m('.block.w-full.pr-10.leading-loose', Intl.NumberFormat('en-GB', {\r\n style: 'currency',\r\n currency: 'GBP'\r\n }).format(attrs.value))\r\n : m('input.h-12.bg-gray-100.border.border-gray-900.p-2', {\r\n value: isInputActive ? attrs.value && attrs.value !== 0 ? '£' + attrs.value : null : attrs.value ? Intl.NumberFormat('en-GB', {\r\n style: 'currency',\r\n currency: 'GBP'\r\n }).format(attrs.value) : null,\r\n class: [\r\n ...classes, notFullWidth ? '' : 'w-full'\r\n ].join(' '),\r\n type: 'text',\r\n inputmode: 'decimal',\r\n required: attrs.required ? 'required' : null,\r\n max: attrs.max,\r\n min: attrs.min,\r\n placeholder: attrs.placeholder,\r\n oninput: e => {\r\n var number = e.target.value.replace('£', '').replace(',', '')\r\n if (isNaN(number)) {\r\n number = 0\r\n e.target.value = null\r\n }\r\n attrs.oninput(number)\r\n },\r\n onfocus: () => {\r\n isInputActive = true\r\n },\r\n onblur: () => {\r\n isInputActive = false\r\n }\r\n }),\r\n m('.text-red-600.text-sm', attrs.errorMessage)\r\n ])\r\n ])\r\n }\r\n }\r\n}\r\n","export const Input = ({ attrs: { autofocus, classes = [], notFullWidth, labelSize, labelClasses = [] } }) => {\r\n return {\r\n oncreate ({ dom }) {\r\n if (autofocus) {\r\n dom.querySelector('input').focus()\r\n }\r\n },\r\n view ({ attrs }) {\r\n return m('div', [\r\n m('label.block', { class: [...labelClasses, labelSize ? labelSize : 'text-sm'].join(' ') }, attrs.label),\r\n m('div.mt-1.relative.rounded-md.shadow-sm', [\r\n attrs.type === 'readonly'\r\n ? m('.block.w-full.pr-10.leading-loose', attrs.value)\r\n : m('input.h-12.bg-gray-100.border.border-gray-900.p-2', {\r\n value: attrs.value,\r\n class: [\r\n ...classes, notFullWidth ? '' : 'w-full'\r\n ].join(' '),\r\n type: attrs.type,\r\n inputmode: attrs.type && attrs.type === 'number' ? 'numeric' : null,\r\n required: attrs.required ? 'required' : null,\r\n max: attrs.max,\r\n min: attrs.min,\r\n step: attrs.step,\r\n placeholder: attrs.placeholder,\r\n oninput (e) {\r\n attrs.oninput(e.target.value)\r\n }\r\n }),\r\n m('.text-red-600.text-sm', attrs.errorMessage)\r\n ])\r\n ])\r\n }\r\n }\r\n}\r\n\r\n// import flatpickr from 'flatpickr'\r\n\r\n// export const Input = ({ attrs: { autofocus } }) => {\r\n// let fp\r\n// return {\r\n// oncreate ({ dom }) {\r\n// if (autofocus) {\r\n// dom.querySelector('input').focus()\r\n// }\r\n// },\r\n// view ({ attrs }) {\r\n// attrs.name = attrs.name || attrs.label.replaceAll(' ', '_').toLowerCase()\r\n// return m('div',\r\n// [\r\n// m('div.flex.justify-between',\r\n// [\r\n// m(`label.block.text-sm.font-medium.text-gray-700[for='${attrs.name}']`, attrs.label),\r\n// (attrs.required || attrs.requiredWarning) && m('span.text-xs.text-gray-500.uppercase',\r\n// 'Required'\r\n// )\r\n// ]),\r\n// m('div.mt-1.relative.rounded-md.shadow-sm', [\r\n// attrs.type === 'readonly'\r\n// ? m('.block.w-full.pr-10.leading-loose', attrs.value)\r\n// : m('input.block.w-full.pr-10.focus:outline-none.sm:text-sm.rounded-md', {\r\n// class: attrs.errorMessage ? 'border-red-300 text-red-900 placeholder-red-300 focus:ring-red-500 focus:border-red-500' : 'focus:ring-blue-500 focus:border-blue-500 border-gray-300',\r\n// value: attrs.value,\r\n// name: attrs.name,\r\n// id: attrs.name,\r\n// type: attrs.type || 'text',\r\n// min: attrs.min,\r\n// max: attrs.max,\r\n// step: attrs.step,\r\n// required: attrs.required ? 'required' : null,\r\n// 'aria-invalid': attrs.errorMessage ? 'true' : 'false',\r\n// 'aria-describedby': attrs.name + '-error',\r\n// placeholder: attrs.placeholder,\r\n// autocomplete: 'off',\r\n// oncreate ({ dom }) {\r\n// if (attrs.type === 'date') {\r\n// fp = flatpickr(dom, {\r\n// altInput: true,\r\n// altFormat: 'F j, Y',\r\n// dateFormat: 'Y-m-d',\r\n// allowInput: true\r\n// })\r\n// if (attrs.dateInstance) { attrs.dateInstance(fp) }\r\n// }\r\n// },\r\n// oninput (e) {\r\n// attrs.oninput(e.target.value)\r\n// }\r\n\r\n// }),\r\n// attrs.errorMessage && m('div.absolute.inset-y-0.right-0.pr-3.flex.items-center.pointer-events-none',\r\n// m(\"svg.h-5.w-5.text-red-500[xmlns='http://www.w3.org/2000/svg'][viewBox='0 0 20 20'][fill='currentColor'][aria-hidden='true']\",\r\n// m(\"path[fill-rule='evenodd'][d='M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-7 4a1 1 0 11-2 0 1 1 0 012 0zm-1-9a1 1 0 00-1 1v4a1 1 0 102 0V6a1 1 0 00-1-1z'][clip-rule='evenodd']\")\r\n// )\r\n// )\r\n// ]),\r\n// attrs.errorMessage && m('p.mt-2.text-sm.text-red-600', {\r\n// id: attrs.name + '-error'\r\n// },\r\n// attrs.errorMessage\r\n// )\r\n// ])\r\n// }\r\n// }\r\n// }\r\n","import { Button, Svg } from 'components'\r\nimport forward from 'assets/forward.svg'\r\nimport backIcon from 'assets/back.svg'\r\n\r\nexport const InputSpin = ({ attrs: { autofocus } }) => {\r\n let elInput\r\n return {\r\n oncreate ({ dom }) {\r\n elInput = dom.querySelector('input')\r\n if (autofocus) {\r\n elInput.focus()\r\n }\r\n },\r\n view ({ attrs }) {\r\n return m('.py-3.flex', [\r\n // m('label.block.text-sm', attrs.label),\r\n m(Button, {\r\n type: 'spin',\r\n raised: false,\r\n size: 'sm',\r\n loading: false,\r\n classes: ['h-12', 'mt-2'],\r\n onclick () {\r\n if (isNaN(elInput.value)) {\r\n elInput.value = 0\r\n } else {\r\n if (elInput.value > 0) {\r\n elInput.value--\r\n }\r\n }\r\n attrs.oninput(elInput.value)\r\n }\r\n }, m(Svg, {\r\n classes: ['h-5', 'w-5', 'text-gray-900']\r\n }, backIcon)),\r\n attrs.type === 'readonly'\r\n ? m('.h-12.mt-2.rounded.p-2.w-full.leading-loose', attrs.value)\r\n : m('input.h-12.mt-2.bg-gray-400.border.border-gray-900.p-2.w-full', {\r\n value: attrs.value,\r\n type: attrs.type,\r\n max: attrs.max,\r\n min: attrs.min,\r\n placeholder: attrs.placeholder,\r\n oninput (e) {\r\n attrs.oninput(e.target.value)\r\n }\r\n }\r\n ),\r\n m(Button, {\r\n type: 'spin',\r\n raised: false,\r\n size: 'sm',\r\n loading: false,\r\n classes: ['h-12', 'mt-2'],\r\n onclick () {\r\n if (isNaN(elInput.value)) {\r\n elInput.value = 1\r\n } else {\r\n elInput.value++\r\n }\r\n attrs.oninput(elInput.value)\r\n }\r\n }, m(Svg, {\r\n classes: ['h-5', 'w-5', 'text-gray-900']\r\n }, forward)),\r\n m('.text-red-600.text-sm', attrs.errorMessage)\r\n ])\r\n }\r\n }\r\n}\r\n","\r\n// const stringToHslColor = (str, s, l) => {\r\n// let hash = 0\r\n// for (var i = 0; i < str.length; i++) {\r\n// hash = str.charCodeAt(i) + ((hash << 5) - hash)\r\n// }\r\n\r\n// const h = hash % 360\r\n// return `hsl(${h}, ${s}%, ${l}%)`\r\n// }\r\n\r\nexport const UserAvatar = ({ attrs: { user } }) => {\r\n // const userColour = stringToHslColor(user.email, 50, 70)\r\n const initials = user.firstName && user.lastName ? user.firstName.charAt(0) + user.lastName.charAt(0) : user.email.charAt(0)\r\n return {\r\n view ({ attrs: { classes = [] } }) {\r\n return m('.rounded-full.h-8.w-8.bg-gray-500.text-white.flex.justify-center.items-center.flex-shrink-0', {\r\n // style: {\r\n // background: userColour\r\n // },\r\n class: classes\r\n }, [\r\n m('span.text-sm.font-bold.tracking-wide.leading-none', initials.toUpperCase())\r\n ])\r\n }\r\n }\r\n}\r\n\r\nexport const Avatar = ({ attrs: { name } }) => {\r\n // const colour = stringToHslColor(name, 50, 70)\r\n const initial = name.charAt(0)\r\n return {\r\n view ({ attrs: { classes = [] } }) {\r\n return m('.rounded-full.h-12.w-12.bg-gray-500.text-white.flex.justify-center.items-center.flex-shrink-0', {\r\n // style: {\r\n // background: colour\r\n // },\r\n class: classes\r\n }, [\r\n m('span.text-sm.font-bold.tracking-wide.leading-none', initial.toUpperCase())\r\n ])\r\n }\r\n }\r\n}\r\n","import { Heading } from 'components/Heading'\r\nimport { Dialog } from 'components/Dialog'\r\nimport { Card } from 'components/Card'\r\nimport { Button } from 'components/Button'\r\n\r\nexport const LogoutDialog = () => {\r\n return {\r\n view ({ attrs: { open } }) {\r\n return open() && m(Dialog, {\r\n open\r\n }, [\r\n m(Card, {\r\n classes: ['p-1', 'bg-gray-500']\r\n }, [\r\n m(Heading, { level: 2 }, 'Are you sure you want to log out?'),\r\n m('.flex.justify-around.mt-6', [\r\n m(Button, {\r\n variant: 'plain',\r\n onclick () {\r\n open(false)\r\n }\r\n }, 'Cancel'),\r\n m(Button, {\r\n variant: 'danger',\r\n href: '/logout'\r\n }, 'Log out')\r\n ])\r\n ])\r\n ])\r\n }\r\n }\r\n}\r\n","import { request } from './request'\r\n\r\nexport const getUsers = () => {\r\n return request({\r\n url: 'Account/users',\r\n method: 'GET'\r\n })\r\n}\r\n\r\nexport const getUser = (id) => {\r\n return request({\r\n url: `account/users/${id}`,\r\n method: 'GET'\r\n })\r\n}\r\n\r\nexport const getUserSuppliers = (id) => {\r\n return request({\r\n url: `account/users/${id}/supplier`,\r\n method: 'GET'\r\n })\r\n}\r\n\r\nexport const createUser = (data) => {\r\n return request({\r\n url: 'account/public/users ',\r\n method: 'POST',\r\n body: data\r\n })\r\n}\r\n\r\nexport const updateUser = (id, data) => {\r\n return request({\r\n url: `account/users/${id}`,\r\n method: 'PUT',\r\n body: data\r\n })\r\n}\r\n\r\nexport const updateUserLoggedOn = () => {\r\n return request({\r\n url: `account/users/me/loggedon?appVersion=${process.env.APP_VERSION}`,\r\n method: 'PUT',\r\n body: null\r\n })\r\n}\r\n\r\nexport const updateUserAppVersion = () => {\r\n return request({\r\n url: `account/users/me/appversion?appVersion=${process.env.APP_VERSION}`,\r\n method: 'PUT',\r\n body: null\r\n })\r\n}","import ClientOAuth2 from 'client-oauth2'\r\nimport { updateUserLoggedOn } from 'api/user'\r\n\r\nvar bsbsAuth = new ClientOAuth2({\r\n clientId: 'pfclient',\r\n clientSecret: 'first-party',\r\n accessTokenUri: `${process.env.API_URL}connect/token`,\r\n scopes: ['openid', 'email', 'phone', 'profile', 'offline_access', 'roles', 'PF_Api']\r\n})\r\n\r\nconst auth = {\r\n pending: flyd.stream(false)\r\n} // jlo\r\n\r\nexport function getToken (email, password) {\r\n auth.pending(true)\r\n return bsbsAuth.owner.getToken(email, password)\r\n .then((val) => {\r\n setToken(val)\r\n auth.pending(false)\r\n })\r\n .catch(err => {\r\n auth.pending(false)\r\n throw Error(err)\r\n })\r\n}\r\n\r\nfunction setToken (token) {\r\n localStorage.setItem('token', JSON.stringify({\r\n token: token.data,\r\n expiresAt: token.expires\r\n }))\r\n updateUserLoggedOn()\r\n}\r\n\r\nexport async function refreshAuthToken () {\r\n return token().refresh().then(token => {\r\n setToken(token)\r\n })\r\n}\r\n\r\nconst retry = (fn, ms = 500, maxRetries = 6, retries = 0) => new Promise((resolve, reject) => {\r\n return fn()\r\n .then(resolve)\r\n .catch(err => {\r\n if (err.message.includes('aborted')) {\r\n setTimeout(() => {\r\n log(`retrying failed promise... ${retries + 1}`)\r\n ++retries\r\n if (retries === maxRetries) {\r\n return reject(Error('maximum retries exceeded, aborted'))\r\n }\r\n retry(fn, ms * 1.25, maxRetries, retries).then(resolve)\r\n }, ms)\r\n } else {\r\n return reject(Error(err))\r\n }\r\n })\r\n})\r\n\r\nexport async function refreshAuthTokenOrWait (url) {\r\n return new Promise((resolve, reject) => {\r\n if (!hasStoredToken()) {\r\n m.route.set('/logout')\r\n reject(Error('No token exists'))\r\n } else if (hasValidToken()) {\r\n resolve(token())\r\n } else {\r\n retry(refreshAuthToken)\r\n .then(() => {\r\n resolve(token())\r\n })\r\n .catch((err) => {\r\n // Do nothing if request was aborted\r\n\r\n if (!err.message.includes('aborted')) {\r\n m.route.set('/logout')\r\n reject(Error('Was unable to refresh token'))\r\n }\r\n })\r\n }\r\n })\r\n}\r\n\r\nexport function token () {\r\n if (localStorage.getItem('token') !== null) {\r\n const localStorageToken = JSON.parse(localStorage.getItem('token'))\r\n if (localStorageToken) {\r\n const authToken = bsbsAuth.createToken(localStorageToken.token)\r\n authToken.expiresIn(new Date(localStorageToken.expiresAt))\r\n return authToken\r\n }\r\n } else {\r\n return null\r\n }\r\n}\r\n\r\nexport function authIsPending () {\r\n return auth.pending()\r\n}\r\n\r\nexport function hasStoredToken () {\r\n return !!token()\r\n}\r\n\r\nexport function hasValidToken () {\r\n return hasStoredToken() && !tokenIsExpired()\r\n}\r\n\r\nexport function tokenIsExpired () {\r\n if (token().expired()) return true\r\n else return false\r\n}\r\n\r\nexport function clearAuth () {\r\n log('removing token')\r\n localStorage.removeItem('token')\r\n auth.pending(false)\r\n}\r\n","import { refreshAuthTokenOrWait } from 'store/auth'\r\n\r\nexport const request = (options) => {\r\n const apiOptions = {\r\n ...options,\r\n url: process.env.API_URL + options.url\r\n }\r\n if (!apiOptions.headers) apiOptions.headers = {}\r\n apiOptions.headers['Client-Version'] = process.env.APP_VERSION\r\n if (options['content-type']) {\r\n apiOptions.headers['Content-Type'] = options['content-type']\r\n }\r\n if (options.method === 'PATCH') {\r\n apiOptions.headers['Content-Type'] = 'application/json-patch+json'\r\n }\r\n let requestOptions = apiOptions\r\n return refreshAuthTokenOrWait(apiOptions.url)\r\n .then((token) => {\r\n if (token) {\r\n requestOptions = token.sign(apiOptions)\r\n return m.request(requestOptions)\r\n }\r\n })\r\n}\r\n\r\nexport const requestUnAuth = (options) => {\r\n const apiOptions = {\r\n ...options,\r\n url: process.env.API_URL + options.url\r\n }\r\n if (!apiOptions.headers) apiOptions.headers = {}\r\n apiOptions.headers['Client-Version'] = process.env.APP_VERSION\r\n if (options['content-type']) {\r\n apiOptions.headers['Content-Type'] = options['content-type']\r\n }\r\n if (options.method === 'PATCH') {\r\n apiOptions.headers['Content-Type'] = 'application/json-patch+json'\r\n }\r\n const requestOptions = apiOptions\r\n return m.request(requestOptions)\r\n}\r\n","import { request } from './request'\r\n\r\nexport const getProfile = () => {\r\n return request({\r\n url: 'account/users/me',\r\n method: 'GET'\r\n })\r\n}\r\n\r\nexport const saveProfile = data => {\r\n return request({\r\n url: 'account/users/me',\r\n method: 'PATCH',\r\n body: Object.keys(data).map(k => {\r\n return { op: 'replace', path: `/${k}`, value: data[k] }\r\n })\r\n })\r\n}\r\n\r\nexport const sendConfirmEmail = () => {\r\n return request({\r\n method: 'POST',\r\n url: 'account/users/me/sendconfirmemail'\r\n })\r\n}\r\n","\r\nimport {getProfile as getProfileRequest, saveProfile} from 'api/profile'\r\nimport { updateUserAppVersion } from 'api/user'\r\n\r\nconst data = {\r\n pending: flyd.stream(false),\r\n profile: initialiseProfile()\r\n} // test\r\n\r\nfunction initialiseProfile () {\r\n try {\r\n const localStorageProfile = JSON.parse(localStorage.getItem('profile'))\r\n return localStorageProfile || null\r\n } catch (e) {\r\n clearProfile()\r\n return null\r\n }\r\n}\r\n\r\nexport function getProfile () {\r\n data.pending(true)\r\n return getProfileRequest()\r\n .then(setProfile)\r\n .then(() => {\r\n data.pending(false)\r\n })\r\n}\r\n\r\nexport function updateProfile (prof) {\r\n return saveProfile(prof)\r\n .then(setProfile)\r\n}\r\n\r\nfunction setProfile (prof) {\r\n data.profile = prof\r\n localStorage.setItem('profile', JSON.stringify(prof))\r\n}\r\n\r\nexport function profile () {\r\n return data.profile\r\n}\r\n\r\nexport function profileIsPending () {\r\n return data.pending()\r\n}\r\n\r\nexport function can (permission, resource, id, delegated) {\r\n if (isAdmin()) return true\r\n if (delegated) {\r\n return profile().userPermissions[resource][id] && profile().userPermissions[resource][id].delegatedPermissions[delegated] && profile().userPermissions[resource][id].delegatedPermissions[delegated][permission]\r\n } else {\r\n return profile().userPermissions[resource][id] && profile().userPermissions[resource][id].permissions[permission]\r\n }\r\n}\r\n\r\nexport const isAdmin = () => {\r\n return profile().roles.includes('administrator')\r\n}\r\n\r\nexport function clearProfile () {\r\n localStorage.removeItem('profile')\r\n data.profile = null\r\n data.pending(false)\r\n}\r\n\r\nexport const checkAppVersion = () => {\r\n if (profile().appVersion === null || profile().appVersion !== process.env.APP_VERSION) {\r\n updateUserAppVersion()\r\n getProfile()\r\n }\r\n}","import { UserAvatar } from 'components/Avatar'\r\nimport { LogoutDialog } from '../LogoutDialog'\r\n\r\nimport { profile } from 'store/profile'\r\n\r\nexport const NavbarUser = () => {\r\n const open = flyd.stream(false)\r\n const showLogoutDialog = flyd.stream(false)\r\n const bodyClickFunction = (e) => {\r\n open(false)\r\n m.redraw()\r\n }\r\n const toggleBodyClick = () => {\r\n if (open()) {\r\n document.body.addEventListener('click', bodyClickFunction)\r\n } else {\r\n document.body.removeEventListener('click', bodyClickFunction)\r\n }\r\n }\r\n return {\r\n view () {\r\n return m('div', [\r\n profile()\r\n ? m('.mr-4', [\r\n m('button.max-w-xs.flex.items-center.text-sm.rounded-full.text-white.focus:outline-none.focus:shadow-solid', {\r\n onclick (e) {\r\n e.stopPropagation()\r\n open(true)\r\n m.redraw()\r\n toggleBodyClick()\r\n }\r\n }, [\r\n m(UserAvatar, { user: profile() })\r\n ]),\r\n open() && m('.origin-top-right.absolute.right-0.mt-2.mr-2.w-48.rounded.shadow-lg.z-40', [\r\n m('.py-1.rounded.bg-white.shadow-xs', [\r\n m(m.route.Link, {\r\n href: '/profile',\r\n class: ['block', 'px-4', 'py-2', 'text-sm', 'text-gray-700', 'hover:bg-gray-100'].join(' ')\r\n }, 'Your Profile'),\r\n m('button', {\r\n onclick () {\r\n showLogoutDialog(true)\r\n },\r\n class: ['block', 'text-left', 'w-full', 'px-4', 'py-2', 'text-sm', 'text-gray-700', 'hover:bg-gray-100'].join(' ')\r\n }, t('navbar', 'logOut'))\r\n ])\r\n ])\r\n\r\n ])\r\n : m('button', {\r\n onclick () {\r\n m.route.set('/logout')\r\n },\r\n class: ['text-sm', 'bg-gray-500', 'text-gray-100', 'hover:bg-gray-700', 'px-4', 'py-2', 'rounded-lg'].join(' ')\r\n }, t('navbar', 'logOut')),\r\n m(LogoutDialog, {\r\n open: showLogoutDialog\r\n })])\r\n }\r\n }\r\n}\r\n\r\n// const Navbar = () => {\r\n// return {\r\n// view ({ attrs: { links } }) {\r\n// return m('nav', {\r\n// class: 'flex items-center justify-between flex-wrap bg-orange-500 h-16'\r\n// }, [\r\n// m('.w-64', { class: 'flex items-center justify-center flex-shrink-0 text-white mr-6 h-full bg-orange-600 p-2 shadow' },\r\n// [\r\n// m('img.w-32.select-none', {\r\n// src: logo\r\n// })\r\n// ]\r\n// ),\r\n// m('div', { class: 'block lg:hidden' },\r\n// m('button', { class: 'flex items-center px-3 py-2 border rounded text-teal-200 border-teal-400 hover:text-white hover:border-white' },\r\n// m('svg', {\r\n// class: 'fill-current h-3 w-3',\r\n// viewBox: '0 0 20 20',\r\n// xmlns: 'http://www.w3.org/2000/svg'\r\n// },\r\n// [\r\n// m('title',\r\n// 'Menu'\r\n// ),\r\n// m('path', { d: 'M0 3h20v2H0V3zm0 6h20v2H0V9zm0 6h20v2H0v-2z' })\r\n// ]\r\n// )\r\n// )\r\n// ),\r\n// m('div', {\r\n// class: 'w-full block flex-grow lg:flex lg:items-center lg:w-auto'\r\n// }, [\r\n// m('div', { class: 'text-sm lg:flex-grow' }, [\r\n// links.map(l => {\r\n// return (!l.group || l.group === 'left') && m(NavbarLink, l)\r\n// })\r\n// ]),\r\n// m('div', { class: 'text-sm' }, [\r\n// m(NavbarUser)\r\n// ])\r\n// ])\r\n// ])\r\n// }\r\n// }\r\n// }\r\n","import { Portal, Svg } from 'components'\r\nimport closeIcon from 'assets/close.svg'\r\nimport tickIcon from 'assets/tick.svg'\r\nimport exclamationIcon from 'assets/exclamation.svg'\r\nimport infoIcon from 'assets/info.svg'\r\nimport messages from 'assets/messages.svg'\r\n\r\nconst notifications = []\r\n\r\nconst addNotification = (config) => {\r\n notifications.unshift({\r\n key: Math.random(),\r\n ...config\r\n })\r\n m.redraw()\r\n}\r\n\r\nexport const notification = {\r\n success (config) {\r\n addNotification({\r\n ...config,\r\n iconColor: 'green-500',\r\n icon: tickIcon\r\n })\r\n },\r\n error (config) {\r\n addNotification({\r\n ...config,\r\n iconColor: 'red-500',\r\n icon: exclamationIcon\r\n })\r\n },\r\n info (config) {\r\n addNotification({\r\n ...config,\r\n iconColor: 'blue-500',\r\n icon: infoIcon\r\n })\r\n },\r\n warning (config) {\r\n addNotification({\r\n ...config,\r\n iconColor: 'orange-500',\r\n icon: exclamationIcon\r\n })\r\n },\r\n message (config) {\r\n addNotification({\r\n ...config,\r\n iconColor: 'blue-500',\r\n icon: messages,\r\n bgColor: 'blue-100'\r\n })\r\n }\r\n}\r\n\r\nconst NotificationCloseButton = () => {\r\n return {\r\n view ({ attrs: { onclick } }) {\r\n return m('button.w-4.flex-shrink-0.ml-2.mt-1', {\r\n raised: false,\r\n onclick\r\n }, m(Svg, {\r\n classes: ['w-auto', 'text-gray-700']\r\n }, closeIcon))\r\n }\r\n }\r\n}\r\n\r\nconst Notification = () => {\r\n const timeout = 4500\r\n let height = 0\r\n let notificationDom\r\n return {\r\n onbeforeremove ({ dom }) {\r\n dom.classList.add('shrinkHeight')\r\n notificationDom.classList.add('slideOutRight')\r\n m.redraw()\r\n return new Promise(resolve => {\r\n notificationDom.addEventListener('animationend', resolve)\r\n })\r\n },\r\n view ({ attrs: { notification, index } }) {\r\n return m('.relative.w-full.mb-2', {\r\n onclick () {\r\n if (notification.onclick) {\r\n notification.onclick()\r\n }\r\n },\r\n style: {\r\n transition: '.1s',\r\n height: height + 'px'\r\n }\r\n }, [\r\n m('.absolute.slideInLeft.text-gray-900.shadow-lg.p-2.rounded.w-full.overflow-hidden', {\r\n class: [notification.bgColor ? `bg-${notification.bgColor}` : 'bg-white'],\r\n oncreate ({ dom }) {\r\n notificationDom = dom\r\n height = dom.clientHeight\r\n m.redraw()\r\n if (!notification.persistant) {\r\n setTimeout(() => {\r\n notifications.pop()\r\n m.redraw()\r\n }, timeout)\r\n }\r\n }\r\n }, [\r\n m('.flex.justify-between.items-start', [\r\n m('.font-bold.text-gray-800.flex', [\r\n notification.icon &&\r\n m('.h-6.w-6.flex-shrink-0.mr-2', [\r\n m(Svg, {\r\n classes: [`text-${notification.iconColor}`, 'h-6', 'w-6']\r\n }, notification.icon)\r\n ]),\r\n notification.title\r\n ]),\r\n m(NotificationCloseButton, {\r\n onclick (e) {\r\n e.stopPropagation()\r\n notifications.splice(index, 1)\r\n if (notification.ondismiss) {\r\n notification.ondismiss()\r\n }\r\n }\r\n })\r\n ]),\r\n notification.description &&\r\n m('.text-sm.mt-2.text-gray-700', notification.description)\r\n ])\r\n ])\r\n }\r\n }\r\n}\r\n\r\nexport const DisplayNotifications = () => {\r\n return {\r\n view () {\r\n return m(Portal, [\r\n m('.absolute.flex.flex-col.top-0.right-0.w-4/5.mt-2.mr-2.z-50.max-w-md', [\r\n notifications.map((n, i) => {\r\n return m(Notification, {\r\n key: n.key,\r\n index: i,\r\n notification: n\r\n })\r\n })\r\n ])\r\n ])\r\n }\r\n }\r\n}\r\n","\r\nexport function setSupplier (supplier) {\r\n localStorage.setItem('supplier', JSON.stringify(supplier))\r\n}\r\n\r\nexport function getSupplier () {\r\n try {\r\n const localSupplier = JSON.parse(localStorage.getItem('supplier'))\r\n return localSupplier || null\r\n } catch (e) {\r\n clearSupplier()\r\n return null\r\n }\r\n}\r\n\r\nexport function clearSupplier () {\r\n localStorage.removeItem('supplier')\r\n}\r\n","import { requestUnAuth } from './request'\r\n\r\nexport const getVersion = () => {\r\n return requestUnAuth({\r\n url:'version',\r\n method: 'GET'\r\n })\r\n}\r\n\r\n","export default \"/images/performancefinance-header.png\";","// import { BottomNav, Svg, BottomSheet } from 'components'\r\nimport { NavbarUser } from './components/Navbar/NavbarUser'\r\nimport { Svg, BottomNav } from 'components'\r\nimport { DisplayNotifications } from 'utils/notifications'\r\nimport { hasStoredToken } from 'store/auth'\r\nimport { profile } from 'store/profile'\r\nimport { getSupplier } from 'store/supplier'\r\nimport { getVersion } from 'api/system'\r\nimport logo from 'assets/images/performancefinance-header.png'\r\nimport logoBadge from 'assets/images/performancefinance-badge.png'\r\nimport homeIcon from 'assets/icons/outline/home.svg'\r\nimport quoteIcon from 'assets/icons/outline/calculator.svg'\r\nimport quoteRoiIcon from 'assets/icons/outline/currency-pound.svg'\r\nimport quoteRebateIcon from 'assets/icons/outline/receipt-refund.svg'\r\n// import superDeductionIcon from 'assets/icons/outline/receipt-tax.svg'\r\n// import applyIcon from 'assets/icons/outline/clipboard-list.svg'\r\nimport suppliersIcon from 'assets/icons/outline/shopping-cart.svg'\r\nimport xIcon from 'assets/icons/solid/x.svg'\r\nimport menuIcon from 'assets/icons/solid/menu-alt-1.svg'\r\n\r\nconst NavLinks = ({ attrs: { version, closeNav } }) => {\r\n return {\r\n view () {\r\n return [m('div.flex-shrink-0.flex.items-center.bg-white',\r\n m('img.w-auto.h-20.p-2.pt-3.pb-3', {\r\n src: logo,\r\n alt: 'logo'\r\n })\r\n ),\r\n m(\"nav.mt-5.flex-shrink-0.divide-y.divide-gray-600.overflow-y-auto[aria-label='Sidebar']\",\r\n [\r\n m('div.px-2.space-y-1',\r\n [\r\n m(NavLink, { href: '/', label: 'Home', icon: homeIcon, closeNav: closeNav }),\r\n getSupplier() && getSupplier().hasFinanceCalculator && m(NavLink, { href: '/quotefinance', label: 'Finance Calculator', icon: quoteIcon, closeNav: closeNav }),\r\n getSupplier() && getSupplier().hasROICalculator && m(NavLink, { href: '/quoteroi', label: 'ROI Calculator', icon: quoteRoiIcon, closeNav: closeNav }),\r\n getSupplier() && getSupplier().hasRebateCalculator && m(NavLink, { href: '/quoterebate', label: 'Rebate Calculator', icon: quoteRebateIcon, closeNav: closeNav }) \r\n ]\r\n ),\r\n profile() && profile().hasMultipleSuppliers && m('div.mt-6.pt-6',\r\n m('div.px-2.space-y-1',\r\n [\r\n m(NavLink, { href: '/suppliers', label: 'Select Supplier', icon: suppliersIcon, closeNav: closeNav })\r\n ]\r\n )\r\n ),\r\n m('div.mt-6.pt-6',\r\n m('div.px-2.space-y-1', [\r\n m('p.text-xs.text-gray-400', `App: v${process.env.APP_VERSION}`),\r\n m('p.text-xs.text-gray-400', `Api: v${version}`)\r\n\r\n ]\r\n )\r\n )\r\n ]\r\n )]\r\n }\r\n }\r\n}\r\nconst NavLink = () => {\r\n return {\r\n view ({ attrs: { closeNav, label, href, icon } }) {\r\n return m(m.route.Link, {\r\n class: `group flex items-center px-2 py-2 text-sm leading-6 font-medium rounded-md ${(href === m.route.get() || (href.length > 1 && m.route.get().indexOf(href) === 0)) ? 'text-white bg-gray-600' : 'text-gray-100 hover:text-white hover:bg-gray-600'}`,\r\n href,\r\n onclick: () => {\r\n if (closeNav) { closeNav() }\r\n }\r\n }, [\r\n icon && m(Svg, { classes: ['w-6', 'h-6', 'mr-4', 'text-gray-100'] }, icon),\r\n label])\r\n }\r\n }\r\n}\r\n\r\nexport const Layout = ({attrs: { hideNav } }) => {\r\n let isSideNavOpen = false\r\n let isOnline = navigator.onLine\r\n let supplier\r\n let version\r\n \r\n if (!hideNav)\r\n {\r\n getVersion().then(s => {\r\n version = s\r\n }) \r\n }\r\n\r\n const GetSavedSupplier = () => {\r\n supplier = getSupplier()\r\n return supplier !== null\r\n }\r\n const CloseNav = () => {\r\n isSideNavOpen = false\r\n }\r\n\r\n window.ononline = () => {\r\n isOnline = true\r\n m.redraw()\r\n }\r\n\r\n window.onoffline = () => {\r\n isOnline = false\r\n m.redraw()\r\n }\r\n\r\n return {\r\n view ({ children, attrs: { hideNav } }) {\r\n return m('div.h-full.flex.overflow-hidden.bg-gray-100', [\r\n !hideNav && m('div.lg:hidden', {\r\n class: isSideNavOpen ? '' : 'hidden'\r\n },\r\n m('div.fixed.inset-0.flex.z-40',\r\n [\r\n m('div.fixed.inset-0',\r\n m(\".absolute.inset-0.bg-gray-600.opacity-75[aria-hidden='true']\")\r\n ),\r\n m('div.relative.flex-1.flex.flex-col.max-w-xs.w-full.pt-5.pb-4.bg-gray-500',\r\n [\r\n m('div.absolute.top-0.right-0.-mr-12.pt-2',\r\n m('button.ml-1.flex.items-center.justify-center.h-10.w-10.rounded-full.focus:outline-none.focus:ring-2.focus:ring-inset.focus:ring-white',\r\n {\r\n type: 'button',\r\n onclick: () => {\r\n isSideNavOpen = false\r\n }\r\n },\r\n [\r\n m('span.sr-only',\r\n 'Close sidebar'\r\n ),\r\n m(Svg, { classes: ['w-6', 'h-6'] }, xIcon)\r\n ]\r\n )\r\n ),\r\n profile() && version && m(NavLinks, { version: version, closeNav: CloseNav })\r\n ]\r\n ),\r\n m(\".flex-shrink-0.w-14[aria-hidden='true']\")\r\n ]\r\n )\r\n ),\r\n !hideNav && m('div.hidden.lg:flex.lg:flex-shrink-0',\r\n m('div.flex.flex-col.w-56.xl:w-64',\r\n m('div.flex.flex-col.flex-1.bg-gray-500.pb-4.overflow-y-auto',\r\n [\r\n profile() && version && m(NavLinks, { version: version })\r\n ]\r\n )\r\n )\r\n ),\r\n\r\n m(DisplayNotifications),\r\n m('.flex.flex-col.justify-between.w-full.h-full.w-full.focus:outline-none[tabindex=\"0\"]', [\r\n !hideNav &&\r\n m('header.relative.z-10.flex.flex-shrink-0.h-20.bg-red-800.border-gray-200', [\r\n m('button.px-4.border-r.border-gray-300.text-gray-500.focus:outline-none.focus:ring-2.focus:ring-inset.focus:ring-gray-300.lg:hidden',\r\n {\r\n type: 'button',\r\n onclick: () => {\r\n isSideNavOpen = true\r\n }\r\n },\r\n [\r\n m('span.sr-only',\r\n 'Open sidebar'\r\n ),\r\n m(Svg, { classes: ['w-6', 'h-6'] }, menuIcon)\r\n ]\r\n ),\r\n m('.flex-1.p-4.flex.justify-between.lg:mx-auto',\r\n [\r\n m('div.flex-1.flex.items-center',\r\n GetSavedSupplier() && m('.text-2xl.text-gray-100.line-clamp-2.tracking-tight.leading-tight', supplier.name)\r\n ),\r\n m('div.flex.items-center',\r\n [\r\n hasStoredToken() && m('div.ml-3.relative',\r\n [\r\n m(NavbarUser)\r\n ]\r\n )\r\n ]\r\n )\r\n ]\r\n ),\r\n m('div.hidden.xs:block.lg:hidden.flex-shrink-0.flex.items-center.bg-white',\r\n m('img.p-2.pt-3', {\r\n src: logoBadge,\r\n alt: 'logo'\r\n })\r\n )\r\n ]\r\n ),\r\n m('main.flex.mb-auto.mx-auto.h-full.w-full.relative.z-0.overflow-y-auto', {\r\n // style: {\r\n // height: hideNav ? '' : 'calc(100vh)'\r\n // }\r\n }, [\r\n children\r\n ]),\r\n !hideNav && hasStoredToken() &&\r\n m('footer.flex.flex-shrink-0.lg:hidden', [\r\n m(BottomNav, bottomNavItems())\r\n ])\r\n ]),\r\n !isOnline &&\r\n m('.absolute.top-0.w-full.z-50', [\r\n m('.bg-red-500.top-0.w-auto.text-center.rounded-b.text-white.text-sm.shadow.p-2', [\r\n t('app', 'offline')\r\n ])\r\n ])\r\n ])\r\n }\r\n }\r\n}\r\n\r\n// const BottomNavSheet = () => {\r\n// return {\r\n// view ({ children, attrs: { open, onclose } }) {\r\n// return m(BottomSheet, {\r\n// open, onclose\r\n// }, [\r\n// children.map(i => {\r\n// return m(m.route.Link, {\r\n// href: i.href,\r\n// onclick () {\r\n// open(!open())\r\n// },\r\n// class: 'flex px-6 py-4 items-center'\r\n// }, [\r\n// m(Svg, {\r\n// classes: ['w-6', 'mr-4']\r\n// }, i.icon),\r\n// m('p', i.title)\r\n// ])\r\n// })\r\n// ])\r\n// }\r\n// }\r\n// }\r\n\r\n// const Sidebar = () => {\r\n// return {\r\n// view ({ attrs: { items } }) {\r\n// return m('.w-64.h-screen.top-0.left-0.bg-red-700.pt-4.shadow-lg.z-20.relative', [\r\n// m('.p-2', [\r\n// items.map(i => {\r\n// if (i.title.toLowerCase().includes('settings') ||\r\n// i.title.toLowerCase().includes('debugger')) return null\r\n// const hide = i.hide ? i.hide : () => { }\r\n// return !i.onclick && !hide() && m(m.route.Link, {\r\n// class: [\r\n// 'block text-red-100 flex mb-1 p-2 select-none rounded hover:bg-red-900 focus:bg-red-700',\r\n// i.isActive() ? 'text-black' : 'text-gray-100'\r\n// ].join(' '),\r\n// href: i.href\r\n// }, [\r\n// m(Svg, {\r\n// classes: ['w-5', 'h-5', 'mr-4']\r\n// }, i.icon),\r\n// m('p.text-sm.tracking-wide', i.title)\r\n// ])\r\n// })\r\n// ]),\r\n// m('.absolute.bottom-0.bg-red-700.w-full.p-2.text-gray-100.flex.justify-between.items-center', [\r\n// m('', [\r\n// m('p.text-sm.truncate.w-40', profile().firstName + ' ' + profile().lastName),\r\n// m('p.text-xs', profile().company)\r\n// ]),\r\n// m(m.route.Link, {\r\n// class: [\r\n// 'block rounded p-3 flex justify-center hover:bg-red-900 focus:bg-red-700',\r\n// m.route.get().includes('/settings') ? 'text-blue-400' : 'text-gray-100'\r\n// ].join(' '),\r\n// href: '/settings'\r\n// }, [\r\n// m(Svg, {\r\n// classes: ['w-6', 'h-6']\r\n// }, settings)\r\n// ])\r\n// ])\r\n// ])\r\n// }\r\n// }\r\n// }\r\n\r\n// export const Layout = ({ attrs: { requireAuth = true } }) => {\r\n// const showMore = flyd.stream(false)\r\n// let isOnline = navigator.onLine\r\n\r\n// window.ononline = () => {\r\n// isOnline = true\r\n// m.redraw()\r\n// }\r\n\r\n// window.onoffline = () => {\r\n// isOnline = false\r\n// m.redraw()\r\n// }\r\n\r\nconst bottomNavItems = () => {\r\n // Hide menu options for supplier depending on flags\r\n const navItems = [\r\n {\r\n title: t('nav', 'home'),\r\n href: '/',\r\n icon: homeIcon,\r\n isActive () {\r\n return m.route.get() === '/' || m.route.get() === ''\r\n }\r\n }]\r\n\r\n if (getSupplier() && getSupplier().hasFinanceCalculator)\r\n {\r\n navItems.push(\r\n {\r\n title: t('nav', 'finance'),\r\n href: '/quotefinance',\r\n icon: quoteIcon,\r\n isActive () {\r\n return m.route.get() === '/quotefinance'\r\n }\r\n }\r\n )\r\n }\r\n\r\n if (getSupplier() && getSupplier().hasROICalculator)\r\n {\r\n navItems.push(\r\n {\r\n title: 'ROI',\r\n href: '/quoteroi',\r\n icon: quoteRoiIcon,\r\n isActive () {\r\n return m.route.get() === '/quoteroi'\r\n }\r\n }\r\n )\r\n } \r\n\r\n if (getSupplier() && getSupplier().hasRebateCalculator) \r\n {\r\n navItems.push( \r\n {\r\n title: 'Rebate',\r\n href: '/quoterebate',\r\n icon: quoteRebateIcon,\r\n isActive () {\r\n return m.route.get() === '/quoterebate'\r\n }\r\n }\r\n )\r\n }\r\n\r\n // {\r\n // title: 'Super Deduction',\r\n // href: '/superdeduction',\r\n // icon: superDeductionIcon,\r\n // isActive () {\r\n // return m.route.get() === '/superdeduction'\r\n // }\r\n // }\r\n\r\n // {\r\n // title: t('nav', 'more'),\r\n // icon: moreIcon,\r\n // onclick: showMore,\r\n // isActive () {\r\n // return showMore()\r\n // }\r\n // }\r\n\r\n return navItems\r\n}\r\n\r\n// const secondaryItems = () => {\r\n// const navItems = []\r\n\r\n// return navItems\r\n// }\r\n\r\n// return {\r\n// view ({ attrs: { hideNav, content } }) {\r\n// return m('', [\r\n// !isOnline &&\r\n// m('.fixed.bg-red-500.rounded.z-50.py-1.px-2.text-sm.text-white', {\r\n// style: {\r\n// top: '9px',\r\n// left: '50%',\r\n// transform: 'translateX(-50%)'\r\n// }\r\n// }, t('app', 'offline')),\r\n// !isMobile() && !hideNav && hasStoredToken() &&\r\n// m(Sidebar, {\r\n// items: [\r\n// ...items(),\r\n// ...secondaryItems()\r\n// ]\r\n// }),\r\n// m(DisplayNotifications),\r\n\r\n// m('.layout.absolute.inset-0.grid.h-full.overflow-y-hidden.bg-white', {\r\n// style: {\r\n// width: isMobile() || hideNav ? '' : 'calc(100vw - 256px)',\r\n// 'margin-left': isMobile() || hideNav ? '' : '256px',\r\n// 'grid-template-rows': hideNav || !isMobile()\r\n// ? 'repeat(6, minmax(10px, 1fr)) 0'\r\n// : 'repeat(6, minmax(10px, 1fr)) 50px'\r\n// },\r\n// class: isMobile() ? 'flex-col' : ''\r\n// }, [\r\n// m('.row-span-6', [\r\n// content()\r\n// ]),\r\n// // isMobile() &&\r\n// hasStoredToken() &&\r\n// m('.row-span-1', [\r\n// m(BottomNav, items()),\r\n// m(BottomNavSheet, {\r\n// open: showMore,\r\n// onclose () {\r\n// showMore(false)\r\n// }\r\n// }, secondaryItems())\r\n// ])\r\n// ])\r\n// ])\r\n// }\r\n// }\r\n// }\r\n","export default \"/images/performancefinance-badge.png\";","export const Link = () => {\r\n return {\r\n view ({ children, attrs: { href, disabled, classes = [], options = {}, onclick } }) {\r\n return m(m.route.Link, {\r\n href,\r\n disabled: false,\r\n options,\r\n onclick,\r\n class: ['text-blue-800', 'underline', ...classes].join(' ')\r\n }, children)\r\n }\r\n }\r\n}\r\n","import { Svg } from 'components'\r\nimport loadingIcon from 'assets/loading.svg'\r\n\r\nexport const LoadingFullScreen = () => {\r\n return {\r\n view ({ attrs: { style, message, classes = [] } }) {\r\n return m('.inset-0.flex.flex-col.flex-grow.justify-center.items-center.h-full.w-full', {\r\n class: classes.join(' '),\r\n key: 'loading',\r\n style\r\n }, [\r\n m('.flex', [\r\n m(Svg, {\r\n classes: ['w-12', 'text-gray-400', 'rotate', 'm-auto']\r\n }, loadingIcon)\r\n\r\n ]),\r\n message &&\r\n m('p.text-sm.text-gray-700.mt-4', message)\r\n ])\r\n }\r\n }\r\n}\r\n","import { Heading, Svg } from 'components'\r\nimport backIcon from 'assets/back.svg'\r\nimport pflogo from 'assets/images/performancefinance-header.png'\r\n// import WHlogo from 'assets/images/W&H-header.jpg'\r\n\r\nexport const PageHeaderSupplier = () => {\r\n return {\r\n view ({ children, attrs: { title, back, backfunction, supplierlogo } }) {\r\n return m('.bg-white.shadow.z-20.flex.justify-between.items-center.flex-shrink-0', [\r\n m('.flex.w-full', [\r\n back &&\r\n m('.flex-shrink-0.flex.items-center', [\r\n back\r\n ? typeof back === 'boolean'\r\n ? m('button.p-2.pr-4.border-r.border-gray-900', {\r\n type: 'button',\r\n size: 'sm',\r\n onclick () {\r\n if (backfunction) {\r\n backfunction()\r\n } else {\r\n window.history.back()\r\n }\r\n }\r\n }, m(Svg, {\r\n classes: ['h-5', 'w-10', 'text-gray-900']\r\n }, backIcon))\r\n : back\r\n : null\r\n ]),\r\n m('img.h-20.w-60.px-4.py-2', {\r\n src: pflogo,\r\n alt: 'Performance Finance'\r\n }),\r\n m('.flex.flex-col.flex-grow.justify-center.bg-red-pf', [\r\n\r\n m(Heading, {\r\n level: 3,\r\n classes: ['truncate', 'text-centre', 'text-white', 'text-xl', 'px-6']\r\n }, [title && title])\r\n ])\r\n // supplierlogo &&\r\n // // m('img.h-20.w-40.p-2', {\r\n // // src: './images/' + supplierlogo,\r\n // // alt: 'Supplier Logo'\r\n // // }),\r\n // m('img.h-20.w-40.p-2', {\r\n // src: WHlogo,\r\n // alt: 'Supplier Logo'\r\n // })\r\n\r\n ])\r\n ])\r\n }\r\n }\r\n}\r\n","import { Input, Svg } from 'components'\r\nimport view from 'assets/view.svg'\r\nimport viewOff from 'assets/view-off.svg'\r\n\r\nexport const Password = () => {\r\n let inputType = 'password'\r\n\r\n const toggleInputType = () => {\r\n inputType = inputType === 'password' ? 'text' : 'password'\r\n }\r\n return {\r\n view ({ attrs: { label, value, errorMessage, oninput } }) {\r\n return m('.relative', [\r\n m(Input, {\r\n label: label,\r\n value: value,\r\n type: inputType,\r\n errorMessage: errorMessage,\r\n oninput\r\n }),\r\n m('button.w-8.absolute', {\r\n type: 'button',\r\n style: {\r\n top: '34px',\r\n right: '10px'\r\n },\r\n onclick: toggleInputType\r\n }, [\r\n m(Svg, {\r\n classes: ['text-gray-600']\r\n }, inputType === 'password' ? view : viewOff)\r\n ])\r\n ])\r\n }\r\n }\r\n}\r\n","export const Portal = ({ attrs: { onbeforeremove } }) => {\r\n return {\r\n oncreate ({ attrs, children }) {\r\n const rootElement = document.createElement('div')\r\n const container = attrs.container || document.body\r\n container.appendChild(rootElement)\r\n this.rootElement = rootElement\r\n\r\n this.content = { view: () => children }\r\n m.mount(this.rootElement, this.content)\r\n\r\n if (typeof attrs.onContentMount === 'function') {\r\n attrs.onContentMount(rootElement)\r\n }\r\n },\r\n\r\n onbeforeupdate ({ children }) {\r\n if (!this.content) return false\r\n this.content.view = () => children\r\n },\r\n onremove ({ attrs }) {\r\n const container = attrs.container || document.body;\r\n (onbeforeremove\r\n ? onbeforeremove(this.rootElement.children[0])\r\n : Promise.resolve()\r\n )\r\n .then(() => {\r\n m.mount(this.rootElement, null)\r\n container.removeChild(this.rootElement)\r\n })\r\n },\r\n\r\n view () {\r\n return m.fragment({}, '')\r\n }\r\n }\r\n}\r\n","export const Radio = () => {\r\n return {\r\n view ({ attrs: { label, description, value, checked, onchange } }) {\r\n return m('.radio.py-2.cursor-pointer', [\r\n m('input', {\r\n type: 'radio',\r\n value,\r\n checked,\r\n onclick (e) {\r\n onchange(value)\r\n }\r\n }),\r\n m('label.radio-label.leading-relaxed', {\r\n onclick (e) {\r\n onchange(value)\r\n }\r\n }, [\r\n label,\r\n description &&\r\n m('.text-sm.ml-10', description)\r\n ])\r\n ])\r\n }\r\n }\r\n}\r\n","import { Radio } from 'components'\r\n\r\nexport const RadioGroup = () => {\r\n return {\r\n view ({ attrs: { block, label, value, options, errorMessage, onchange } }) {\r\n return m('.mt-1', [\r\n m('label.block.text-sm', label),\r\n m('', {\r\n class: block ? '' : 'flex justify-between'\r\n }, [\r\n options.map(o => {\r\n return m(Radio, {\r\n label: o.label,\r\n value: o.value,\r\n description: o.description,\r\n checked: o.value === value,\r\n onchange\r\n })\r\n })\r\n ]),\r\n m('.text-red-600.text-sm', errorMessage)\r\n ])\r\n }\r\n }\r\n}\r\n","import Choices from 'choices.js'\r\n\r\nexport const Select = () => {\r\n let choicesEl = {}\r\n return {\r\n view ({ attrs: { subtype, name, search, strValue, shouldSort, choices, choicesFetch, onchange, label, errorMessage, value, required, removeItemButton, instance } }) {\r\n name = name || label.replaceAll(' ', '_').toLowerCase()\r\n return m('.flex-grow', [\r\n m(`label.block.text-sm.font-medium.text-gray-700[for='${name}']`,\r\n label\r\n ),\r\n m('select', {\r\n multiple: subtype === 'multiple',\r\n name: name,\r\n required: required,\r\n oncreate: el => {\r\n choicesEl = new Choices(el.dom, {\r\n allowHTML: true,\r\n searchEnabled: search !== false,\r\n shouldSort: shouldSort || false,\r\n removeItemButton: removeItemButton !== false,\r\n choices: [{ value: null, label: null }],\r\n itemSelectText: 'Select',\r\n classNames: {\r\n containerOuter: 'choices mt-0 mb-0',\r\n containerInner: 'h-12 sm:text-sm pl-2 py-2 pb-0 rounded-md bg-gray-100 border border-gray-900 mt-1 relative shadow-sm w-full overflow-y-auto',\r\n item: 'choices__item text-base'\r\n }\r\n })\r\n\r\n if (instance) { instance(choicesEl) }\r\n if (choices) {\r\n choicesEl.setChoices(choices.map(c => {\r\n return {\r\n label: c.label,\r\n value: c.value,\r\n selected: subtype === 'multiple' ? value.includes(c.value) : c.value === (strValue ? value : parseInt(value)),\r\n disabled: c.disabled || false\r\n }\r\n }), 'value', 'label', false)\r\n }\r\n },\r\n onchange: evt => {\r\n if (subtype === 'multiple') {\r\n const values = choicesEl.getValue()\r\n onchange(values.map(choice => { return choice.value }), values.map(choice => { return choice.label }))\r\n } else {\r\n onchange(evt.target.value, evt.target.textContent)\r\n }\r\n }\r\n }),\r\n m('.text-red-600.text-sm', errorMessage)\r\n ])\r\n }\r\n }\r\n}\r\n","export const Svg = () => {\r\n let el\r\n return {\r\n oncreate ({ dom, attrs: { classes = [] } }) {\r\n el = dom\r\n el.classList.remove(...el.classList)\r\n el.classList.add(...classes)\r\n\r\n const titles = el.querySelectorAll('title')\r\n titles.forEach(t => {\r\n t.parentNode.removeChild(t)\r\n })\r\n },\r\n onupdate ({ dom, attrs: { classes = [] } }) {\r\n el = dom\r\n if (el) {\r\n el.classList.remove(...el.classList)\r\n el.classList.add(...classes, 'pointer-events-none')\r\n }\r\n },\r\n view ({ children }) {\r\n return m.trust(children[0])\r\n }\r\n }\r\n}\r\n","export const TextArea = ({ attrs: { autofocus } }) => {\r\n return {\r\n oncreate ({ dom }) {\r\n if (autofocus) {\r\n dom.querySelector('input').focus()\r\n }\r\n },\r\n view ({ attrs }) {\r\n return m('.py-3.flex.flex-col', {\r\n class: attrs.classes ? attrs.classes.join(' ') : null\r\n }, [\r\n m('label.block.text-sm', attrs.label),\r\n m('textarea.mt-2.bg-gray-100.border.border-gray-900.rounded.p-2.w-full.shadow-inner.h-full', {\r\n value: attrs.value,\r\n max: attrs.max,\r\n rows: attrs.rows,\r\n placeholder: attrs.placeholder,\r\n oninput (e) {\r\n attrs.oninput(e.target.value)\r\n }\r\n }),\r\n m('.text-red-600.text-sm', attrs.errorMessage)\r\n ])\r\n }\r\n }\r\n}\r\n","\r\nexport const EditForm = () => {\r\n return {\r\n view ({ children, attrs: { onsubmit } }) {\r\n return m('.p-4',\r\n m('form', {\r\n onsubmit: onsubmit\r\n }, [\r\n m('.md:grid.md:grid-cols-2.md:gap-6.lg:grid-cols-4.',\r\n [\r\n children\r\n ]\r\n )\r\n ])\r\n )\r\n }\r\n }\r\n}\r\n","import { Card } from 'components/Card'\r\nimport { Button } from 'components/Button'\r\n\r\nexport const EditFormSection = () => {\r\n return {\r\n view ({ children, attrs: { heading, description, extra, buttons, loading } }) {\r\n return [m('.md:col-span-2.lg:col-span-1',\r\n m('div.px-4.sm:px-0',\r\n [\r\n m('h3.text-lg.font-medium.leading-6.text-gray-900',\r\n heading\r\n ),\r\n description && m('p.mt-1.text-sm.text-gray-600',\r\n description\r\n ),\r\n extra && m('p.mt-1.text-xs.text-gray-500',\r\n extra\r\n )\r\n ]\r\n )\r\n ),\r\n m('.mt-5.md:mt-0.md:col-span-2.lg:col-span-3', [\r\n m(Card, {\r\n buttons: buttons || [m(Button, {\r\n classes: ['w-24'],\r\n type: 'button',\r\n variant: 'plain',\r\n onclick () {\r\n history.back()\r\n }\r\n }, t('app', 'cancel')), m(Button, {\r\n classes: ['w-24'],\r\n type: 'submit',\r\n variant: 'danger',\r\n loading\r\n }, t('app', 'save'))],\r\n buttonJustify: 'justify-between'\r\n }, m('.space-y-6.divide-y.divide-gray-200', [\r\n children\r\n ]))\r\n ])\r\n ]\r\n }\r\n }\r\n}\r\n","import Joi from 'joi'\r\n\r\nexport const schema = Joi.object().keys({\r\n email: Joi.string()\r\n .email({ tlds: { allow: false } })\r\n .required()\r\n .messages({\r\n 'string.email': 'Must be a valid email address',\r\n 'string.empty': 'Email address is required',\r\n 'any.required': 'Email address is required'\r\n }),\r\n password: Joi.string()\r\n .required()\r\n .messages({\r\n 'string.empty': 'Password is required',\r\n 'any.required': 'Password is required'\r\n })\r\n})\r\n","// import { Svg } from 'components'\r\n// import errorIcon from 'assets/icons/outline/exclamation.svg'\r\n\r\nexport const getError = (errors, path) => {\r\n let field\r\n if (Array.isArray(path)) {\r\n field = errors.find(err => err.key.every((val, k) => path[k] === val))\r\n } else {\r\n field = errors.find(err => err.key[0] === path)\r\n }\r\n if (field) return field.message\r\n}\r\n\r\nexport const validate = (schema, data) => {\r\n const validation = schema.validate(data, { abortEarly: false })\r\n if (!validation.error) return\r\n return validation.error.details.map(detail => {\r\n return {\r\n key: detail.path,\r\n message: detail.message\r\n }\r\n })\r\n}\r\n\r\nexport const displayErrors = errs => {\r\n // If the errors are just an array the show on mutiple lines\r\n if (Array.isArray(errs)) {\r\n return errs.map(err => {\r\n return m('p.text-red-800.m-1', err)\r\n })\r\n // If the errors are am object then they should be modelstate errors\r\n // We aren't handling them at field level yet so just iterate through all the values and show them all in one place\r\n } else if (typeof errs === 'object' && errs !== null) {\r\n return Object.keys(errs).map(k => {\r\n return m('p.text-red-800.m-1', errs[k])\r\n })\r\n // Deal with just a string error\r\n } else {\r\n return m('p.text-red-800.m-1', errs)\r\n }\r\n}\r\n","import { request } from './request'\r\n\r\nexport const getSuppliers = () => {\r\n return request({\r\n url: 'Suppliers',\r\n method: 'GET'\r\n })\r\n}\r\n\r\nexport const getMySuppliers = () => {\r\n return request({\r\n url: 'Suppliers/me',\r\n method: 'GET'\r\n })\r\n}\r\n\r\nexport const getSupplierUsers = (id) => {\r\n return request({\r\n url: `suppliers/${id}/users`,\r\n method: 'GET'\r\n })\r\n}\r\n\r\nexport const getSupplierRateGroups = (id) => {\r\n return request({\r\n url: `suppliers/${id}/rategroups`,\r\n method: 'GET'\r\n })\r\n}\r\n\r\nexport const getSupplierRateGroupsActive = (id, isFinanceCalculator, isROICalculator, isRebateCalculator) => {\r\n return request({\r\n url: `suppliers/${id}/rategroups?activeOnly=true&isFinanceCalculator=${isFinanceCalculator}&isROICalculator=${isROICalculator}&isRebateCalculator=${isRebateCalculator}`,\r\n method: 'GET'\r\n })\r\n}\r\n\r\nexport const getSupplier = (id) => {\r\n return request({\r\n url: `suppliers/${id}`,\r\n method: 'GET'\r\n })\r\n}\r\n\r\nexport const createSupplier = (data) => {\r\n return request({\r\n url: 'suppliers',\r\n method: 'POST',\r\n body: data\r\n })\r\n}\r\n\r\nexport const updateSupplier = (id, data) => {\r\n return request({\r\n url: `suppliers/${id}`,\r\n method: 'PUT',\r\n body: data\r\n })\r\n}\r\n\r\nexport const addRateGroupToSupplier = (id, data) => {\r\n return request({\r\n url: `suppliers/${id}/rategroups`,\r\n method: 'POST',\r\n body: data\r\n })\r\n}\r\n\r\nexport const removeRateGroupFromSupplier = (id, rateGroupId) => {\r\n return request({\r\n url: `suppliers/${id}/rategroups/${rateGroupId}`,\r\n method: 'DELETE'\r\n })\r\n}\r\n\r\nexport const addUserToSupplier = (id, data) => {\r\n return request({\r\n url: `suppliers/${id}/users`,\r\n method: 'POST',\r\n body: data\r\n })\r\n}\r\n\r\nexport const removeUserFromSupplier = (id, userId) => {\r\n return request({\r\n url: `suppliers/${id}/users/${userId}`,\r\n method: 'DELETE'\r\n })\r\n}\r\n","import { Card, Heading, Input, Button, Link, Password } from 'components'\r\nimport { getToken, authIsPending } from 'store/auth'\r\nimport { getProfile, profileIsPending, profile } from 'store/profile'\r\nimport { schema } from 'validators/login'\r\nimport { validate, getError, displayErrors } from 'validators/utils'\r\nimport { notification } from 'utils/notifications'\r\nimport { getSupplier } from 'api/supplier'\r\nimport { getLoginError } from 'api/auth'\r\nimport { setSupplier } from 'store/supplier'\r\nimport { updateUserAppVersion } from 'api/user'\r\n\r\nimport pflogo from 'assets/images/performancefinance-header.png'\r\n\r\nexport const Login = () => {\r\n const formData = {\r\n\r\n }\r\n let errors = []\r\n let serverErrors = []\r\n const loginUser = (data) => {\r\n const validation = validate(schema, data)\r\n if (validation) {\r\n errors = validation\r\n } else {\r\n errors = []\r\n serverErrors = []\r\n getToken(data.email, data.password)\r\n .then(getProfile)\r\n .then(() => {\r\n if (profile() && profile().defaultSupplierId) {\r\n getSupplier(profile().defaultSupplierId).then((supplier) => {\r\n setSupplier(supplier)\r\n if (!supplier.hasROICalculator && !supplier.hasRebateCalculator) {\r\n m.route.set('/quotefinance')\r\n } else {\r\n m.route.set('/')\r\n }\r\n // Force a reload of the latest version when logged in\r\n window.location.reload()\r\n })\r\n .catch(() => {\r\n serverErrors.push('Login Failed')\r\n m.redraw()\r\n })\r\n } else {\r\n m.route.set('/')\r\n // Force a reload of the latest version when logged in\r\n window.location.reload()\r\n\r\n }\r\n })\r\n .catch(() => {\r\n getLoginError(data.email)\r\n .then((message) => {\r\n serverErrors.push(`Login Failed: ${message}`)\r\n m.redraw()\r\n })\r\n .catch(() => {\r\n serverErrors.push('Login Failed')\r\n m.redraw()\r\n })\r\n })\r\n }\r\n }\r\n\r\n const loading = () => {\r\n return authIsPending() || profileIsPending()\r\n }\r\n return {\r\n view () {\r\n return m('.h-full.flex.justify-center.items-center.h-screen.mx-auto', [\r\n m(Card, {\r\n classes: ['max-w-md']\r\n }, [\r\n m('.p-6', [\r\n m('img.mb-6', {\r\n src: pflogo,\r\n alt: 'Performance Finance'\r\n }),\r\n m(Heading, { classes: ['mb-2'] }, 'Login'),\r\n m('form', {\r\n onsubmit (e) {\r\n e.preventDefault()\r\n loginUser(formData)\r\n }\r\n }, [\r\n m('div.grid.gap-2', [\r\n m(Input, {\r\n label: t('logIn', 'email'),\r\n value: formData.email,\r\n type: 'text',\r\n required: true,\r\n errorMessage: getError(errors, 'email'),\r\n oninput (val) {\r\n formData.email = val\r\n }\r\n }),\r\n m(Password, {\r\n label: t('logIn', 'password'),\r\n value: formData.password,\r\n type: 'password',\r\n errorMessage: getError(errors, 'password'),\r\n oninput (val) {\r\n formData.password = val\r\n }\r\n })]),\r\n displayErrors(serverErrors),\r\n m('.flex.justify-between.items-center.pt-2', [\r\n // m(Link, {\r\n // href: '/register',\r\n // options: { replace: true }\r\n // }, t('logIn', 'signUpLink')),\r\n m(''),\r\n m(Button, {\r\n variant: 'danger',\r\n loading: loading()\r\n }, t('logIn', 'action'))\r\n ])\r\n ])\r\n ]),\r\n m('.p-2', [\r\n m(Link, {\r\n classes: ['text-xs', 'block', 'text-center'],\r\n href: '/forgotten-password'\r\n }, t('logIn', 'forgotten'))\r\n ])\r\n ])\r\n ])\r\n }\r\n }\r\n}\r\n","export const registerRequest = (data) => {\r\n return m.request({\r\n url: process.env.API_URL + 'account/public/register',\r\n method: 'POST',\r\n body: {\r\n email: data.email\r\n }\r\n })\r\n}\r\n\r\nexport const registerConfirm = (body) => {\r\n return m.request({\r\n url: process.env.API_URL + 'account/public/registerconfirm',\r\n method: 'POST',\r\n body\r\n })\r\n}\r\n\r\nexport const recoverPassword = (data) => {\r\n return m.request({\r\n method: 'POST',\r\n url: process.env.API_URL + 'account/public/recoverpassword',\r\n body: {\r\n email: data.email\r\n }\r\n })\r\n}\r\nexport const resetPassword = (body) => {\r\n return m.request({\r\n method: 'POST',\r\n url: process.env.API_URL + 'account/public/resetpassword',\r\n body\r\n })\r\n}\r\n\r\nexport const getLoginError = (email) => {\r\n return m.request({\r\n method: 'POST',\r\n url: process.env.API_URL + 'account/public/loginerror',\r\n body: {\r\n email: email\r\n }\r\n })\r\n}\r\n","import { Card, Link, Heading, Input, Button, Password } from 'components'\r\nimport { registerConfirm } from 'api/auth'\r\nimport { getError, displayErrors } from 'validators/utils'\r\n// import { schema } from 'validators/resetPassword'\r\nimport logo from 'assets/images/performancefinance-header.png'\r\n// import { notification } from 'utils/notifications'\r\n\r\nexport const RegisterConfirm = ({ attrs: { code, email } }) => {\r\n let errors = []\r\n let serverErrors\r\n let loading\r\n let success = false\r\n\r\n const formData = {\r\n resetCode: code,\r\n email: email,\r\n password: ''\r\n }\r\n const triggerRegisterConfirm = () => {\r\n errors = []\r\n serverErrors = null\r\n loading = true\r\n registerConfirm(formData)\r\n .then(res => {\r\n loading = false\r\n success = true\r\n })\r\n .catch(err => {\r\n loading = false\r\n serverErrors = err.response\r\n })\r\n }\r\n return {\r\n view () {\r\n return m('.h-full.flex.flex-col.justify-center.items-center.bg-gray-100.h-screen.mx-auto',\r\n [\r\n m(Card, {\r\n classes: ['max-w-md']\r\n }, [\r\n m('.p-6', [\r\n m('img.mb-6', {\r\n src: logo,\r\n alt: 'Performance Finance'\r\n }),\r\n m(Heading, { classes: ['mb-2'] }, 'Activate Your Account'),\r\n success\r\n ? m('div', [\r\n m('p.mt-4.mb-4', 'Account registration completed. Please login to access your new account'),\r\n m(Button, {\r\n type: 'button',\r\n variant: 'danger',\r\n onclick () {\r\n m.route.set('/login')\r\n }\r\n }, 'Login')\r\n ])\r\n : m('form.grid.gap-2', {\r\n onsubmit (e) {\r\n e.preventDefault()\r\n triggerRegisterConfirm()\r\n }\r\n }, [\r\n m(Input, {\r\n value: formData.email,\r\n type: 'readonly'\r\n }),\r\n m(Password, {\r\n label: 'Set Password',\r\n value: formData.password,\r\n type: 'password',\r\n required: true,\r\n errorMessage: getError(errors, 'password'),\r\n oninput (val) {\r\n formData.password = val\r\n }\r\n }),\r\n serverErrors\r\n ? m('div', displayErrors(serverErrors))\r\n : m('div', [\r\n m('p.m-1', 'Passwords must be at least 8 characters'),\r\n m('p.m-1', \"Passwords must have at least one digit ('0'-'9')\"),\r\n m('p.m-1', \"Passwords must have at least one lowercase ('a'-'z')\"),\r\n m('p.m-1', \"Passwords must have at least one uppercase ('A'-'Z')\")\r\n ]),\r\n m('.flex.justify-between.items-center', [\r\n m(Link, {\r\n classes: ['text-red-800', 'underline'],\r\n href: '/register-request',\r\n options: { replace: true }\r\n }, 'Request New Link'),\r\n m(Button, {\r\n variant: 'danger',\r\n loading\r\n }, 'Activate')\r\n ])\r\n ])\r\n ])\r\n ])\r\n ])\r\n }\r\n }\r\n}\r\n","import Joi from 'joi'\r\n\r\nexport const schema = Joi.object().keys({\r\n email: Joi.string()\r\n .email({ tlds: { allow: false } })\r\n .required()\r\n .messages({\r\n 'string.email': 'Must be a valid email address',\r\n 'string.empty': 'Email address is required',\r\n 'any.required': 'Email address is required'\r\n })\r\n})\r\n","import { Card, Heading, Input, Button, Link } from 'components'\r\nimport { registerRequest } from 'api/auth'\r\nimport { schema } from 'validators/forgottenPassword'\r\nimport { validate, getError, displayErrors } from 'validators/utils'\r\nimport logo from 'assets/images/performancefinance-header.png'\r\n\r\nexport const RegisterRequest = () => {\r\n const formData = { }\r\n let errors = []\r\n let serverErrors\r\n let loading\r\n let success = false\r\n const triggerRegisterRequest = (data) => {\r\n const validation = validate(schema, data)\r\n if (validation) {\r\n errors = validation\r\n serverErrors = null\r\n } else {\r\n errors = []\r\n loading = true\r\n registerRequest(data)\r\n .then(res => {\r\n loading = false\r\n success = true\r\n })\r\n .catch(err => {\r\n loading = false\r\n if (Array.isArray(err.response)) {\r\n serverErrors = err.response\r\n } else if (typeof err.response === 'object' && err.response !== null) {\r\n serverErrors = [JSON.stringify(err.response)]\r\n } else {\r\n serverErrors = [err.response]\r\n }\r\n })\r\n }\r\n }\r\n return {\r\n view () {\r\n return m('.h-full.flex.flex-col.justify-center.items-center.bg-gray-100.h-screen.mx-auto', [\r\n m(Card, {\r\n classes: ['max-w-md']\r\n }, [\r\n m('.p-6', [\r\n m('img.mb-6', {\r\n src: logo,\r\n alt: 'Performance Finance'\r\n }),\r\n m(Heading, { classes: ['mb-2'] }, 'Activation Request'),\r\n success\r\n ? m('p.mt-4.mb-4', 'Request received, please check your email for a link to activate your account.')\r\n : m('form.grid.gap-2', {\r\n onsubmit (e) {\r\n e.preventDefault()\r\n triggerRegisterRequest(formData)\r\n }\r\n }, [\r\n m(Input, {\r\n label: 'Email Address',\r\n value: formData.email,\r\n type: 'email',\r\n errorMessage: getError(errors, 'email'),\r\n oninput (val) {\r\n formData.email = val\r\n }\r\n }),\r\n displayErrors(serverErrors),\r\n m('.flex.justify-between.items-center', [\r\n m(Link, {\r\n classes: ['text-red-800', 'underline'],\r\n href: '/login'\r\n }, 'Log in'),\r\n m(Button, {\r\n variant: 'danger',\r\n loading\r\n }, 'Send Request')\r\n ])\r\n ])\r\n ])\r\n ])\r\n ])\r\n }\r\n }\r\n}\r\n","import { Card, Password } from 'components'\r\nimport { Heading } from 'components/Heading'\r\nimport { Input } from 'components/Input'\r\nimport { Button } from 'components/Button'\r\nimport { Link } from 'components/Link'\r\nimport { resetPassword } from 'api/auth'\r\nimport { displayErrors } from 'validators/utils'\r\n// import { schema } from 'validators/resetPassword'\r\nimport logo from 'assets/images/performancefinance-header.png'\r\nexport const ResetPassword = ({ attrs: { code, email } }) => {\r\n let serverErrors\r\n let loading\r\n let success = false\r\n const formData = {\r\n resetCode: code,\r\n email: email,\r\n password: ''\r\n }\r\n const triggerPasswordReset = () => {\r\n serverErrors = null\r\n loading = true\r\n resetPassword(formData)\r\n .then(res => {\r\n loading = false\r\n success = true\r\n })\r\n .catch(err => {\r\n loading = false\r\n serverErrors = err.response\r\n })\r\n }\r\n return {\r\n view () {\r\n return m('.h-full.flex.flex-col.justify-center.items-center.bg-gray-100.h-screen.mx-auto',\r\n [\r\n m(Card, {\r\n classes: ['max-w-md']\r\n }, [\r\n m('.p-6', [\r\n m('img.mb-6', {\r\n src: logo,\r\n alt: 'Performance Finance'\r\n }),\r\n m(Heading, { classes: ['mb-2'] }, 'Reset Password'),\r\n success\r\n ? m('div', [\r\n m('p.mt-4.mb-4', 'Password Reset. Please login.'),\r\n m(Button, {\r\n type: 'button',\r\n variant: 'danger',\r\n onclick () {\r\n m.route.set('/login')\r\n }\r\n }, 'Login')\r\n ])\r\n : m('form.grid.gap-2', {\r\n onsubmit (e) {\r\n e.preventDefault()\r\n triggerPasswordReset()\r\n }\r\n }, [\r\n m(Input, {\r\n value: formData.email,\r\n type: 'readonly'\r\n }),\r\n m(Password, {\r\n label: 'New Password',\r\n value: formData.password,\r\n type: 'password',\r\n required: true,\r\n oninput (val) {\r\n formData.password = val\r\n }\r\n }),\r\n serverErrors\r\n ? m('div', displayErrors(serverErrors))\r\n : m('div', [\r\n m('p.m-1', 'Passwords must be at least 8 characters'),\r\n m('p.m-1', \"Passwords must have at least one digit ('0'-'9')\"),\r\n m('p.m-1', \"Passwords must have at least one lowercase ('a'-'z')\"),\r\n m('p.m-1', \"Passwords must have at least one uppercase ('A'-'Z')\")\r\n ]),\r\n m('.flex.justify-between.items-center', [\r\n m(Link, {\r\n classes: ['text-red-800', 'underline'],\r\n href: '/login'\r\n }, 'Login'),\r\n m(Button, {\r\n variant: 'danger',\r\n loading\r\n }, 'Reset Password')\r\n ])\r\n ])\r\n ])\r\n ])\r\n ])\r\n }\r\n }\r\n}\r\n","import { Card, Heading, Input, Button, Link } from 'components'\r\nimport { recoverPassword } from 'api/auth'\r\nimport { schema } from 'validators/forgottenPassword'\r\nimport { validate, getError, displayErrors } from 'validators/utils'\r\n// import { notification } from 'utils/notifications'\r\nimport logo from 'assets/images/performancefinance-header.png'\r\n\r\nexport const ForgottenPassword = () => {\r\n const formData = { }\r\n let errors = []\r\n let serverErrors\r\n let loading\r\n let success = false\r\n const triggerPasswordReset = (data) => {\r\n const validation = validate(schema, data)\r\n if (validation) {\r\n errors = validation\r\n serverErrors = null\r\n } else {\r\n errors = []\r\n loading = true\r\n recoverPassword(data)\r\n .then(res => {\r\n loading = false\r\n success = true\r\n })\r\n .catch(err => {\r\n loading = false\r\n if (Array.isArray(err.response)) {\r\n serverErrors = err.response\r\n } else if (typeof err.response === 'object' && err.response !== null) {\r\n serverErrors = [JSON.stringify(err.response)]\r\n } else {\r\n serverErrors = [err.response]\r\n }\r\n })\r\n }\r\n }\r\n return {\r\n view () {\r\n return m('.h-full.flex.flex-col.justify-center.items-center.bg-gray-100.h-screen.mx-auto', [\r\n m(Card, {\r\n classes: ['max-w-md']\r\n }, [\r\n m('.p-6', [\r\n m('img.mb-6', {\r\n src: logo,\r\n alt: 'Performance Finance'\r\n }),\r\n m(Heading, { classes: ['mb-2'] }, 'Recover Password'),\r\n success\r\n ? m('div', [\r\n m('p.mt-4.mb-4', 'Request received, please check your email for a link to change your password.'),\r\n m('.flex.justify-between.items-center', [\r\n m(Link, {\r\n classes: ['text-red-800', 'underline'],\r\n href: '/login'\r\n }, 'Login')\r\n ])\r\n ])\r\n : m('form.grid.gap-2', {\r\n onsubmit (e) {\r\n e.preventDefault()\r\n triggerPasswordReset(formData)\r\n }\r\n }, [\r\n m(Input, {\r\n label: 'Email',\r\n value: formData.email,\r\n type: 'email',\r\n errorMessage: getError(errors, 'email'),\r\n oninput (val) {\r\n formData.email = val\r\n }\r\n }),\r\n displayErrors(serverErrors),\r\n m('.flex.justify-between.items-center.gap-6', [\r\n m(Link, {\r\n classes: ['text-red-800', 'underline'],\r\n href: '/login'\r\n }, 'Login'),\r\n m(Button, {\r\n variant: 'danger',\r\n loading\r\n }, 'Send Request')\r\n ])\r\n ])\r\n ])\r\n ])\r\n ])\r\n }\r\n }\r\n}\r\n","import { Card, Svg } from 'components'\r\nimport { getSupplier } from 'store/supplier'\r\nimport quoteIcon from 'assets/icons/outline/calculator.svg'\r\nimport quoteRoiIcon from 'assets/icons/outline/currency-pound.svg'\r\nimport quoteRebateIcon from 'assets/icons/outline/receipt-refund.svg'\r\nimport { checkAppVersion } from 'store/profile'\r\n\r\n// import superDeductionIcon from 'assets/icons/outline/receipt-tax.svg'\r\n\r\n// import pflogo from 'assets/images/performancefinance-home.png'\r\n// import WHlogo from 'assets/images/W&H-home.jpg'\r\n// import forward from 'assets/forward.svg'\r\n\r\nexport const Home = () => {\r\n const supplier = getSupplier()\r\n\r\n // Redirect to fetch a supplier\r\n if (!supplier) {\r\n m.route.set('/suppliers')\r\n }\r\n else {\r\n checkAppVersion()\r\n }\r\n\r\n const HomeCard = () => {\r\n return {\r\n view ({ attrs: { route, heading, details, icon } }) {\r\n return m(Card, {\r\n classes: ['m-2', 'sm:m-6'],\r\n onclick: () => {\r\n m.route.set(route)\r\n },\r\n clickable: true\r\n }, [\r\n m('.flex.items-center.b-10', [\r\n icon && m(Svg, { classes: ['w-12', 'sm:w-16', 'flex-shrink-0', 'mr-4', 'text-gray-500'] }, icon),\r\n m('div', [\r\n m('p', heading),\r\n m('p.text-sm.text-gray-500', details)\r\n ])\r\n\r\n ])\r\n ])\r\n }\r\n }\r\n }\r\n\r\n return {\r\n view () {\r\n return m('.h-full.flex.flex-col.max-w-4xl.mx-auto.pt-2.pb-6', [\r\n supplier && supplier.hasFinanceCalculator && m(HomeCard, { route: '/quotefinance', heading: 'Finance Calculator', details: 'Calculate monthly payments', icon: quoteIcon }),\r\n supplier && supplier.hasROICalculator && m(HomeCard, { route: '/quoteroi', heading: 'Return On Investment Calculator', details: 'Calculate monthly revenue', icon: quoteRoiIcon }),\r\n supplier && supplier.hasRebateCalculator && m(HomeCard, { route: '/quoterebate', heading: 'Rebate Calculator', details: 'Calculate monthly payments with rebate', icon: quoteRebateIcon })\r\n ])\r\n }\r\n }\r\n}\r\n","import { getDashboard as getDashboardRequest } from 'api/dashboard'\r\n\r\nconst data = {\r\n dashboard: null,\r\n pending: false\r\n}\r\n\r\nconst dashboardLoading = id => {\r\n data.pending = true\r\n}\r\n\r\nconst dashboardFinishedLoading = id => {\r\n data.pending = false\r\n}\r\n\r\nfunction setDashboard (dash) {\r\n data.dashboard = {\r\n ...data.dashboard,\r\n data: dash\r\n }\r\n dashboardFinishedLoading()\r\n m.redraw()\r\n}\r\n\r\nexport function getDashboard () {\r\n dashboardLoading()\r\n\r\n return getDashboardRequest()\r\n .then(setDashboard)\r\n}\r\n\r\nexport const dashboard = () => {\r\n return data.dashboard\r\n}\r\n\r\nexport const clearDashboard = () => {\r\n data.dashboard = null\r\n}\r\n","import { Svg, Card, LoadingFullScreen } from 'components'\r\nimport { getMySuppliers, getSupplier } from 'api/supplier'\r\nimport { setSupplier } from 'store/supplier'\r\n\r\n// import { LoadingFullScreen } from 'components'\r\n// import { getDashboard, dashboard } from 'store/dashboard'\r\nimport suppliersIcon from 'assets/icons/outline/shopping-cart.svg'\r\n\r\nexport const SelectSupplier = () => {\r\n let supplierList\r\n\r\n const SaveSupplier = (supplier) => {\r\n getSupplier(supplier.id).then((data) => {\r\n setSupplier(data)\r\n m.route.set('/')\r\n })\r\n }\r\n\r\n getMySuppliers().then((data) => {\r\n supplierList = data\r\n })\r\n\r\n const SupplierItem = () => {\r\n return {\r\n view ({ attrs: { supplier } }) {\r\n return m(Card, {\r\n classes: ['m-2', 'xs:m-4', 'sm:m-6'],\r\n onclick: () => {\r\n SaveSupplier(supplier)\r\n },\r\n clickable: true\r\n }, [\r\n m('.flex.items-center.b-10', [\r\n suppliersIcon && m(Svg, { classes: ['w-10', 'xs:w-12', 'sm:w-16', 'flex-shrink-0', 'mr-4', 'text-gray-500'] }, suppliersIcon),\r\n m('div', [\r\n m('p.text-2xl.xs:text-3xl', supplier.name)\r\n ])\r\n ])\r\n ])\r\n }\r\n }\r\n }\r\n\r\n return {\r\n view () {\r\n return m('.h-full.flex.flex-col.pb-6.mx-auto', [\r\n\r\n supplierList\r\n ? m('p-4.m-3', [\r\n m('.text-2xl.text-center.border-b-2.border-gray-900', 'Select a Supplier'),\r\n\r\n m('.max-w-4xl.min-w-4xl.mx-auto', [\r\n supplierList.map((supplier, ix) => {\r\n return m(SupplierItem, { supplier: supplier })\r\n }\r\n )\r\n ])\r\n ])\r\n : m(LoadingFullScreen, { message: 'Loading Suppliers' })\r\n\r\n ])\r\n }\r\n }\r\n}\r\n","import { Card, Svg, LoadingFullScreen } from 'components'\r\nimport { getSupplierRateGroupsActive } from 'api/supplier'\r\nimport rateIcon from 'assets/images/performancefinance-badge.png'\r\n\r\nexport const SelectRateGroup = ({ attrs: { NextStep, SetRateGroup, supplier, isFinanceCalculator, isROICalculator, isRebateCalculator } }) => {\r\n let supplierRateGroups\r\n\r\n getSupplierRateGroupsActive(supplier.id, isFinanceCalculator, isROICalculator, isRebateCalculator).then((data) => {\r\n supplierRateGroups = data\r\n })\r\n\r\n const RateGroupItem = () => {\r\n return {\r\n view ({ attrs: { rateGroup } }) {\r\n return m(Card, {\r\n classes: ['m-2', 'xs:m-4', 'sm:m-6'],\r\n onclick: () => {\r\n SetRateGroup(rateGroup)\r\n NextStep()\r\n },\r\n clickable: true\r\n }, [\r\n // m('.flex.items-center.b-10', [\r\n // quoteIcon && m(Svg, { classes: ['w-10', 'xs:w-12', 'sm:w-16', 'flex-shrink-0', 'mr-4', 'text-gray-500'] }, quoteIcon),\r\n // m('div', [\r\n // m('p', item.name),\r\n // m('p.text-sm.text-gray-600', item.description)\r\n // ])\r\n\r\n // ])\r\n m('.flex.items-center.b-10', [\r\n rateIcon && \r\n m('img.w-10.xs:w-12.sm:w-16.flex-shrink-0.mr-4.text-gray-500', {\r\n src: rateIcon\r\n }),\r\n m('div', [\r\n m('p', rateGroup.name),\r\n m('p.text-sm.text-gray-600', rateGroup.description)\r\n ])\r\n\r\n ])\r\n ])\r\n }\r\n }\r\n }\r\n\r\n return {\r\n view () {\r\n return m('.h-full.flex.flex-col.pb-6', [\r\n\r\n supplierRateGroups\r\n ? m('p-4.m-3', [\r\n m('.text-2xl.text-center.border-b-2.border-gray-900', 'Choose from the offers below'),\r\n\r\n m('.max-w-4xl.min-w-4xl.mx-auto', [\r\n supplierRateGroups.map((item, ix) => {\r\n return m(RateGroupItem, { rateGroup: item })\r\n }\r\n )\r\n ])\r\n ])\r\n : m(LoadingFullScreen, { message: 'Loading Offers' })\r\n\r\n ])\r\n }\r\n }\r\n}\r\n","export const isMobile = () => {\r\n return window.cordova || window.innerWidth < 768\r\n}\r\n\r\nexport const formatMoney = (value) => {\r\n return new Intl.NumberFormat('en-GB', { style: 'currency', currency: 'GBP' }).format(value)\r\n}\r\n\r\nexport const formatMoneyDp = (value, decimalPlaces) => {\r\n return new Intl.NumberFormat('en-GB', { style: 'currency', currency: 'GBP', minimumFractionDigits: decimalPlaces || 2, maximumFractionDigits: decimalPlaces || 2 }).format(value)\r\n}\r\n","\r\nimport { Input, Dialog2 } from 'components'\r\n\r\nexport const EmailDialog = ({ attrs: { loading, quoteItem } }) => {\r\n loading = false\r\n\r\n const formData = {\r\n customerName: '',\r\n customerEmailToAddress: '',\r\n sendToCustomer: true,\r\n sendToSupplier: true\r\n }\r\n\r\n return {\r\n view ({ attrs: { loading, open, onsubmit } }) {\r\n return m(Dialog2, {\r\n open,\r\n save () {\r\n loading = true\r\n onsubmit(formData, quoteItem)\r\n },\r\n classes: ['w-full', 'lg:max-w-lg'],\r\n heading: 'Send Email',\r\n saving: loading,\r\n saveLabel: 'Send'\r\n }, [\r\n\r\n m('.flex.flex-col.gap-3', [\r\n formData && [\r\n // m(Checkbox, {\r\n // label: 'Send to Customer',\r\n // checked: formData.sendToCustomer,\r\n // onchange () {\r\n // formData.sendToCustomer = !formData.sendToCustomer\r\n // }\r\n // }),\r\n m(Input, {\r\n label: 'Customer name',\r\n value: formData.customerName,\r\n required: true,\r\n oninput (value) {\r\n formData.customerName = value\r\n }\r\n }),\r\n m(Input, {\r\n label: 'Customer email address',\r\n value: formData.customerEmailToAddress,\r\n type: 'email',\r\n required: true,\r\n oninput (value) {\r\n formData.customerEmailToAddress = value\r\n }\r\n })\r\n // m(Checkbox, {\r\n // label: 'Send to Supplier',\r\n // checked: formData.sendToSupplier,\r\n // onchange () {\r\n // formData.sendToSupplier = !formData.sendToSupplier\r\n // }\r\n // })\r\n ]\r\n ])\r\n ])\r\n }\r\n }\r\n}\r\n","\r\nimport { CurrencyInput, Input, RadioGroup, Dialog2, Checkbox } from 'components'\r\n\r\nexport const ROIDialog = ({ attrs: { loading, quoteItem, chargePerUse, usesPerPeriodMode, usesPerPeriod, daysPerWeek } }) => {\r\n loading = false\r\n\r\n const usesModes = [{ label: 'Days', value: 0, desc: 'Uses per day' }, { label: 'Weeks', value: 1, desc: 'Uses per week' }, { label: 'Months', value: 2, desc: 'Uses per month' }]\r\n\r\n const formData = {\r\n \r\n chargePerUse: chargePerUse === 0 ? null : chargePerUse,\r\n usesPerPeriodMode: usesPerPeriodMode,\r\n usesPerPeriod: usesPerPeriod === 0 ? null : usesPerPeriod,\r\n daysPerWeek: daysPerWeek === 0 ? null : daysPerWeek,\r\n includeROI: true\r\n }\r\n\r\n return {\r\n view ({ attrs: { loading, open, onsubmit } }) {\r\n return m(Dialog2, {\r\n open,\r\n save () {\r\n loading = true\r\n onsubmit(formData, quoteItem)\r\n },\r\n classes: ['w-full', 'lg:max-w-lg'],\r\n heading: 'Return On Investment',\r\n saving: loading,\r\n saveLabel: 'Go'\r\n }, [\r\n\r\n m('.flex.flex-col.gap-3', [\r\n formData && m(Checkbox, {\r\n classes: ['py-5', 'text-left'],\r\n label: 'Include Return On Investment',\r\n checked: formData.includeROI,\r\n required: true,\r\n type: 'number',\r\n onchange() {\r\n formData.includeROI = !formData.includeROI\r\n }\r\n }),\r\n formData && formData.includeROI && [\r\n\r\n m('div.grid.grid-cols-1.gap-3.text-left', [\r\n\r\n\r\n m('div.col-span-1', [\r\n m(CurrencyInput, {\r\n notFullWidth: true,\r\n label: 'Charge per use',\r\n value: formData.chargePerUse,\r\n required: true,\r\n decimalPlaces: 2,\r\n type: 'number',\r\n placeholder: '£',\r\n oninput(val) {\r\n formData.chargePerUse = val\r\n }\r\n })\r\n ]),\r\n m('div.pr-2.col-span-1', [\r\n m(RadioGroup, {\r\n label: 'Uses in',\r\n value: formData.usesPerPeriodMode,\r\n required: true,\r\n options: usesModes,\r\n name: 'radUsesMode',\r\n onchange(value) {\r\n formData.usesPerPeriodMode = value\r\n }\r\n })\r\n ]),\r\n m('div.col-span-1', [\r\n m(Input, {\r\n notFullWidth: true,\r\n label: formData.usesPerPeriodMode === 0 ? 'Uses per day' : formData.usesPerPeriodMode === 1 ? 'Uses per week' : 'Uses per month',\r\n value: formData.usesPerPeriod,\r\n required: true,\r\n type: 'number',\r\n oninput(val) {\r\n formData.usesPerPeriod = val\r\n }\r\n })\r\n ]),\r\n formData.usesPerPeriodMode === 0\r\n ? m('div.col-span-1', [\r\n m(Input, {\r\n notFullWidth: true,\r\n label: 'Days per week',\r\n value: formData.daysPerWeek,\r\n required: true,\r\n type: 'number',\r\n oninput(val) {\r\n formData.daysPerWeek = val\r\n }\r\n })\r\n ]): null,\r\n ])\r\n ]\r\n ])\r\n ])\r\n}\r\n}\r\n}\r\n","import { Card, CurrencyInput, Input, Button, Checkbox, RadioGroup, } from 'components'\r\nimport { notification } from 'utils/notifications'\r\nimport { getQuote, getROI, sendQuoteEmail } from 'api/quote'\r\nimport { LoadingFullScreen } from '../../components/Loading/FullScreen'\r\n// import { debounce } from 'utils/debounce'\r\nimport { formatMoney } from 'utils'\r\n// import { getRateGroup } from 'api/rateGroup'\r\n// import { getRateValues } from 'api/rate'\r\nimport { EmailDialog } from './EmailDialog'\r\nimport { ROIDialog } from './ROIDialog'\r\nimport roiIcon from 'assets/icons/outline/currency-pound.svg'\r\nimport mailIcon from 'assets/icons/outline/mail.svg'\r\n\r\nexport const ViewQuote = ({ attrs: { NextStep, supplier, rateGroup, isRebate } }) => {\r\n let quote\r\n let savingEmail\r\n let amountFinanced\r\n let rebatePoints\r\n let roiChargePerUse\r\n let roiUsesPerPeriod\r\n let roiDaysPerWeek\r\n let roiUsesPerPeriodMode\r\n let selectedQuoteItem\r\n\r\n let quoteIconLocal\r\n\r\n quoteIconLocal = roiIcon\r\n\r\n const getQuoteDetails = (amountFinanced, rebatePoints) => {\r\n getQuote(rateGroup.id, supplier.id, amountFinanced, isRebate, isRebate && rateGroup.rebateUsePoints ? rebatePoints : 0).then((data) => {\r\n quote = data\r\n })\r\n\r\n }\r\n\r\n const getROIDetails = (roiData, quoteItem) => {\r\n\r\n if (roiData.includeROI) {\r\n\r\n // Save a local copy of the roi inputs so we can use it for any other ROI (and not be reliant on the quote having it as we might fetch a new quote)\r\n roiUsesPerPeriodMode = roiData.usesPerPeriodMode\r\n roiUsesPerPeriod = roiData.usesPerPeriod\r\n // Days per week isn't always entered. Make sure it is number if not entered otherwise it breaks the Quote model\r\n roiDaysPerWeek = roiData.daysPerWeek\r\n roiChargePerUse = roiData.chargePerUse\r\n\r\n quoteItem.includeROI = true\r\n\r\n getROI(quote, roiChargePerUse, roiUsesPerPeriodMode, roiUsesPerPeriod, roiDaysPerWeek ? roiDaysPerWeek : 0 ).then((data) => {\r\n debugger\r\n quote = data\r\n roiOpen(false)\r\n })\r\n }\r\n else {\r\n quoteItem.includeROI = false\r\n roiOpen(false)\r\n }\r\n }\r\n\r\n // Set defaul ROI settings for supplier\r\n roiDaysPerWeek = 5\r\n if (supplier.usesPerPeriodMode) {\r\n roiUsesPerPeriodMode = supplier.usesPerPeriodMode\r\n } else {\r\n roiUsesPerPeriodMode = 0\r\n }\r\n\r\n const emailOpen = flyd.stream(false)\r\n const roiOpen = flyd.stream(false)\r\n\r\n const sendEmail = (email, quoteItem) => {\r\n savingEmail = true\r\n sendQuoteEmail(quote, email.customerName, email.customerEmailToAddress, quoteItem ? quoteItem.term : null).then(data => {\r\n emailOpen(false)\r\n savingEmail = false\r\n notification.success({ title: 'Email Sent' })\r\n })\r\n .catch(err => {\r\n console.log(err)\r\n notification.error({ title: 'unable to send email' })\r\n savingEmail = false\r\n })\r\n }\r\n\r\n const RebateItem = () => {\r\n return {\r\n view({ attrs: { quote, item } }) {\r\n return m('.p-1', [\r\n\r\n m('.bg-gray-200.p-2.text-xl', [\r\n m('p.text-2xl.font-bold', `${item.term} months at ${formatMoney(item.monthlyAmount)}`),\r\n m('p', `Rate: ${(item.rate * 100).toFixed(2)}%`),\r\n m('p', `Cost per day: ${formatMoney(item.costPerDay)}`),\r\n m('.table.flex.flex-col.w-full', [\r\n m('.table-header-group.font-bold',\r\n m('.table-cell', ''),\r\n m('.table-cell.px-4.w-32', 'Rebate'),\r\n m('.table-cell.px-4.w-48', 'Additional Spend'),\r\n m('.table-cell', '')\r\n ),\r\n m('.table-row-group.flex.flex-col',\r\n m('.table-row.flex', {\r\n // class: ix % 2 === 0 ? 'bg-gray-200' : ''\r\n }, [\r\n m('.table-cell', ''),\r\n m('.table-cell.px-4.w-32', '100%'),\r\n m('.table-cell.px-4.w-48', formatMoney(item.rebate100)),\r\n m('.table-cell', '')\r\n ]),\r\n m('.table-row.flex', {\r\n // class: ix % 2 === 0 ? 'bg-gray-200' : ''\r\n }, [\r\n m('.table-cell', ''),\r\n m('.table-cell.px-4.w-32', '75%'),\r\n m('.table-cell.px-4.w-48', formatMoney(item.rebate75)),\r\n m('.table-cell', ''),\r\n ]),\r\n m('.table-row.flex', {\r\n // class: ix % 2 === 0 ? 'bg-gray-200' : ''\r\n }, [\r\n m('.table-cell', ''),\r\n m('.table-cell.px-4.w-32', '50%'),\r\n m('.table-cell.px-4.w-48', formatMoney(item.rebate50)),\r\n m('.table-cell', ''),\r\n ])\r\n )\r\n ]),\r\n item.includeROI && item.roiItem ?\r\n m('div', [\r\n m('.text-center.font-bold.text-2xl', 'Return On Investment'),\r\n m('p', `Charge per use: ${formatMoney(quote.chargePerUse)}`),\r\n m('p', `Uses per ${quote.usesPerPeriodMode === 0 ? 'day' : quote.usesPerPeriodMode === 1 ? 'week' : 'month'}: ${quote.usesPerPeriod}`),\r\n quote.usesPerPeriodMode === 0 ?\r\n m('p', `Days per week: ${quote.daysPerWeek}`)\r\n : '',\r\n quote.isLowStart ?\r\n m('p', `First ${quote.monthsFree} months' profit: ${formatMoney(item.roiItem.monthlyIncome * quote.monthsFree)}`)\r\n : '',\r\n m('p', `Monthly profit${quote.isLowStart ? ' thereafter' : ''}: ${formatMoney(item.roiItem.monthlyProfit)}`),\r\n m('p', `Annual profit${quote.isLowStart ? ' thereafter' : ''}: ${formatMoney(item.roiItem.annualProfit)}`),\r\n m('p', `Uses per ${quote.usesPerPeriodMode === 0 ? 'day' : quote.usesPerPeriodMode === 1 ? 'week' : 'month'} to break even: ${item.roiItem.usesPerPeriodBreakEven}`),\r\n ])\r\n : null,\r\n m('.text-right.space-x-2.py-1', [\r\n\r\n m(Button, {\r\n variant: 'danger',\r\n type: 'button',\r\n raised: false,\r\n size: 'sm',\r\n loading: false,\r\n icon: roiIcon,\r\n onclick() {\r\n selectedQuoteItem = item\r\n roiOpen(true)\r\n }\r\n }, ''),\r\n m(Button, {\r\n type: 'button',\r\n variant: 'danger',\r\n raised: false,\r\n size: 'sm',\r\n loading: false,\r\n icon: mailIcon,\r\n onclick() {\r\n selectedQuoteItem = item\r\n emailOpen(true)\r\n }\r\n }, ''),\r\n ]),\r\n ])\r\n ])\r\n }\r\n }\r\n }\r\n\r\n return {\r\n view() {\r\n return m('.h-full.flex.flex-col.pb-6', [\r\n\r\n m('.mx-auto', [\r\n m('', [\r\n m(Card, { classes: ['mt-3'] }, [\r\n m('.text-center', [\r\n m('', [\r\n m('.font-bold.text-2xl', isRebate ? 'Rebate Calculator' : 'Finance Calculator'),\r\n m('p.text-sm.text-gray-500', rateGroup.name),\r\n ])\r\n ])\r\n ]),\r\n m('form.mb-4', {\r\n onsubmit: e => {\r\n e.preventDefault()\r\n getQuoteDetails(amountFinanced, rebatePoints)\r\n }\r\n }, [\r\n m(Card, { classes: ['mt-3', 'text-center'] }, [\r\n m('div.sm:px-10', [\r\n m(CurrencyInput, {\r\n classes: ['text-3xl', 'text-center'],\r\n labelSize: 'text-3xl',\r\n labelClasses: ['text-center'],\r\n label: 'Your Investment',\r\n // autofocus: true,\r\n value: amountFinanced,\r\n // decimalPlaces: 0,\r\n placeholder: '£',\r\n required: true,\r\n oninput(val) {\r\n amountFinanced = val\r\n }\r\n }),\r\n isRebate && rateGroup.rebateUsePoints\r\n ?\r\n m(Input, {\r\n classes: ['text-2xl', 'text-center'],\r\n labelSize: 'text-xl',\r\n labelClasses: ['text-center'],\r\n label: 'Points Commitment',\r\n value: rebatePoints,\r\n required: true,\r\n type: 'number',\r\n oninput(val) {\r\n rebatePoints = val\r\n }\r\n })\r\n : null,\r\n ]),\r\n m('div', [\r\n m(Button, {\r\n variant: 'danger',\r\n raised: false,\r\n size: 'md',\r\n loading: false,\r\n classes: ['p-4', 'w-32']\r\n }, 'Go')\r\n ]),\r\n\r\n quote\r\n ?\r\n m('div', [\r\n quote.isLowStart\r\n ? m('div.text-2xl.font-bold', `${quote.monthsFree} months at £0.00 followed by: `)\r\n : null,\r\n quote.items && quote.items.length > 0\r\n ?\r\n m('.flex.flex-col', [\r\n isRebate\r\n ?\r\n m('div',\r\n quote.items.map((item, ix) => {\r\n return m(RebateItem, { quote: quote, item: item })\r\n }\r\n ))\r\n :\r\n m('.table.flex.flex-col.w-full.py-2', [\r\n m('.table-header-group',\r\n m('.table-row.bg-gray-500.text-white', [\r\n m('.table-cell.px-4.py-2', 'Months'),\r\n m('.table-cell.px-4.py-2', 'Monthly Payment'),\r\n m('.table-cell.px-4.py-2', 'Rate'),\r\n m('.table-cell.px-4.py-2.hidden.md:block', 'Cost Per Day')\r\n ])\r\n ),\r\n m('.table-row-group.flex.flex-col.text-2xl',\r\n quote.items.map((item, ix) => {\r\n return m('.table-row.flex', {\r\n // class: ix % 2 === 0 ? 'bg-gray-200' : ''\r\n }, [\r\n m('.table-cell.px-4.py-2', {\r\n // onclick () {\r\n // NextStep()\r\n // }\r\n }, item.term),\r\n m('.table-cell.px-4.py-2', formatMoney(item.monthlyAmount)),\r\n m('.table-cell.px-4.py-2', (item.rate * 100).toFixed(2) + '%'),\r\n m('.table-cell.px-4.py-2.hidden.md:block', formatMoney(item.costPerDay))\r\n // m('.table-cell',\r\n // m(m.route.Link, {\r\n // class: '.table-cell.inline-block',\r\n // href: `/quoteroi?amountfinanced=${quote.amountFinanced}&term=${item.term}`\r\n // }, m(Svg, { classes: ['w-4'] }, quoteRoiIcon))),\r\n // m('.table-cell.px-4.py-2.flex.items-center', [\r\n // m(Button, {\r\n // icon: quoteRoiIcon,\r\n // variant: 'plain',\r\n // classes: ['rounded-full'],\r\n // onclick () {\r\n // emailOpen(true)\r\n // }\r\n // })\r\n // m(Svg, { classes: ['w-10', 'text-gray-500', 'cursor-pointer', 'hover:shadow-lg'] }, quoteRoiIcon)\r\n // ])\r\n ])\r\n }\r\n )\r\n )\r\n ]),\r\n m('div.p-4', [\r\n m(Button, {\r\n type: 'button',\r\n variant: 'danger',\r\n raised: false,\r\n size: 'md',\r\n loading: false,\r\n icon: mailIcon,\r\n onclick() {\r\n selectedQuoteItem = null\r\n emailOpen(true)\r\n }\r\n }, isRebate ? 'Email All' : 'Email')])\r\n ])\r\n : m('', 'Offer has no Rates')\r\n ])\r\n\r\n : null\r\n ])\r\n ])\r\n ])\r\n ]),\r\n\r\n emailOpen() &&\r\n m(EmailDialog, {\r\n open: emailOpen,\r\n onsubmit: sendEmail,\r\n loading: savingEmail,\r\n quoteItem: selectedQuoteItem,\r\n }),\r\n roiOpen() &&\r\n m(ROIDialog, {\r\n open: roiOpen,\r\n onsubmit: getROIDetails,\r\n loading: savingEmail,\r\n quoteItem: selectedQuoteItem,\r\n usesPerPeriodMode: roiUsesPerPeriodMode,\r\n usesPerPeriod: roiUsesPerPeriod,\r\n daysPerWeek: roiDaysPerWeek,\r\n chargePerUse: roiChargePerUse\r\n })\r\n ])\r\n }\r\n }\r\n}\r\n","import { request } from './request'\r\n\r\nexport const getQuote = (rateGroupId, supplierId, amountFinanced, isRebate, rebatePoints) => {\r\n return request({\r\n url: 'quotes/getquote',\r\n params: { rateGroupId: rateGroupId, supplierId: supplierId, amountFinanced: amountFinanced, isRebate: isRebate, rebatePoints: rebatePoints },\r\n method: 'GET'\r\n })\r\n}\r\n\r\nexport const getROI = (quote, chargePerUse, usesPerPeriodMode, usesPerPeriod, daysPerWeek) => {\r\n return request({\r\n url: 'quotes/getroi',\r\n params: { chargePerUse, usesPerPeriodMode, usesPerPeriod, daysPerWeek},\r\n method: 'POST',\r\n body: quote\r\n })\r\n}\r\n\r\nexport const getQuoteROI = (rateGroupId, supplierId, amountFinanced, term, chargePerUse, usesPerPeriodMode, usesPerPeriod, daysPerWeek) => {\r\n return request({\r\n url: 'quotes/getquoteroi',\r\n params: { rateGroupId: rateGroupId, supplierId: supplierId, amountFinanced: amountFinanced, term: term, chargePerUse: chargePerUse, usesPerPeriodMode: usesPerPeriodMode, usesPerPeriod: usesPerPeriod, daysPerWeek: daysPerWeek },\r\n method: 'GET'\r\n })\r\n}\r\n\r\nexport const sendQuoteEmail = (data, recipientName, emailAddress, term) => {\r\n return request({\r\n url: 'quotes/sendemail',\r\n params: { recipientName: recipientName, emailAddress: emailAddress , term: term},\r\n method: 'POST',\r\n body: data\r\n })\r\n}\r\n\r\nexport const sendQuoteEmailRoi = (data, recipientName, emailAddress) => {\r\n return request({\r\n url: 'quotes/sendemailroi',\r\n params: { recipientName: recipientName, emailAddress: emailAddress },\r\n method: 'POST',\r\n body: data\r\n })\r\n}\r\n\r\nexport const getProductQuote = (supplierId, productList) => {\r\n return request({\r\n url: 'quotes/getproductquote',\r\n params: { supplierId: supplierId },\r\n method: 'POST',\r\n body: productList\r\n })\r\n}\r\n\r\nexport const sendProductQuoteEmail = (data, emailAddress) => {\r\n return request({\r\n url: 'quotes/sendproductemail',\r\n params: { emailAddress: emailAddress },\r\n method: 'POST',\r\n body: data\r\n })\r\n}\r\n","import { request } from './request'\r\n\r\nexport const getRateGroups = () => {\r\n return request({\r\n url: 'rategroups',\r\n method: 'GET'\r\n })\r\n}\r\n\r\nexport const getRateGroup = (id) => {\r\n return request({\r\n url: `rategroups/${id}`,\r\n method: 'GET'\r\n })\r\n}\r\n\r\nexport const getRateGroupSuppliers = (id) => {\r\n return request({\r\n url: `rategroups/${id}/supplier`,\r\n method: 'GET'\r\n })\r\n}\r\n\r\nexport const createRateGroup = (data) => {\r\n return request({\r\n url: 'rategroups',\r\n method: 'POST',\r\n body: data\r\n })\r\n}\r\n\r\nexport const updateRateGroup = (id, data) => {\r\n return request({\r\n url: `rategroups/${id}`,\r\n method: 'PUT',\r\n body: data\r\n })\r\n}\r\n","import { SelectRateGroup } from '../SelectRateGroup'\r\nimport { ViewQuote } from './ViewQuote'\r\nimport { getSupplier } from 'store/supplier'\r\nimport { getRateGroup } from 'api/rateGroup'\r\nimport { checkAppVersion, profile } from 'store/profile'\r\n// import { route } from 'mithril'\r\n// import { getProductCategories } from 'api/product'\r\n// import { getDashboard, dashboard } from 'store/dashboard'\r\n// import forward from 'assets/forward.svg'\r\n\r\nexport const QuoteFinance = ({ attrs: { isRebate } }) => {\r\n let currentStep\r\n let rateGroup\r\n\r\n const NextStep = () => {\r\n if (!currentStep) {\r\n currentStep = 1\r\n } else {\r\n currentStep++\r\n }\r\n }\r\n\r\n // const PreviousStep = () => {\r\n // if (!currentStep) {\r\n // currentStep = 1\r\n // } else {\r\n // currentStep--\r\n // }\r\n\r\n // // If stepping back from the first step then go home\r\n // if (currentStep === 0) {\r\n // route.set('/')\r\n // }\r\n // }\r\n\r\n // const SelectRateGroupId = (groupId) => {\r\n // rateGroupId = groupId\r\n // }\r\n\r\n const SetRateGroup = (group) => {\r\n rateGroup = group\r\n }\r\n const supplier = getSupplier()\r\n\r\n if (!profile()) {\r\n m.route.set('/login')\r\n } else {\r\n checkAppVersion()\r\n }\r\n \r\n if (!supplier) {\r\n m.route.set('/')\r\n } else {\r\n\r\n // First time in check if supplier only has one offer, if so use t otherwise default to step 1 (select rate)\r\n if (!currentStep) {\r\n\r\n if (supplier.rateGroupId) {\r\n \r\n getRateGroup(supplier.rateGroupId).then((data) => {\r\n SetRateGroup(data)\r\n currentStep = 2\r\n })\r\n\r\n }\r\n else {\r\n currentStep = 1\r\n }\r\n }\r\n }\r\n\r\n return {\r\n view () {\r\n return m('.h-full.flex.flex-col.mx-auto', [\r\n\r\n currentStep === 1\r\n ? m(SelectRateGroup, { NextStep: NextStep, SetRateGroup: SetRateGroup, supplier: supplier, isFinanceCalculator: isRebate ? null : true, isRebateCalculator: isRebate ? true : null })\r\n : null,\r\n currentStep === 2\r\n ? m(ViewQuote, { NextStep: NextStep, supplier: supplier, rateGroup: rateGroup, isRebate: isRebate})\r\n : null\r\n // currentStep === 3\r\n // ? m(ViewQuoteROI, { supplier: supplier, rateGroupId: rateGroupId })\r\n // : null\r\n ])\r\n }\r\n }\r\n}\r\n","import { Svg, LoadingFullScreen } from 'components'\r\n// import { getSupplier } from 'store/supplier'\r\nimport { getProductCategories } from 'api/product'\r\n// import { LoadingFullScreen } from 'components'\r\n// import { getDashboard, dashboard } from 'store/dashboard'\r\nimport forward from 'assets/forward.svg'\r\n\r\nexport const SelectCategory = ({ attrs: { NextStep, SelectCategoryId, supplier } }) => {\r\n let productCategories\r\n\r\n getProductCategories(supplier.id).then((data) => {\r\n productCategories = data\r\n })\r\n\r\n return {\r\n view () {\r\n return m('.h-full.flex.flex-col.overflow-auto', [\r\n productCategories\r\n ? m('p-4.m-3', [\r\n m('.text-2xl.text-center.h-12.border-b-2.border-gray-900', 'Choose from the categories below'),\r\n\r\n productCategories.map((category, ix) => {\r\n return m('.text-xl.text-center.bg-gray-400.w-full.my-4.text-4xl.border-b-0', [\r\n m('.flex.px-4.py-2.justify-between.items-center.hover:bg-gray-500', {\r\n onclick () {\r\n SelectCategoryId(category.id)\r\n NextStep()\r\n }\r\n }, [\r\n m('.flex-grow', category.description),\r\n m(Svg, {\r\n classes: ['h-5', 'w-5', 'text-gray-900']\r\n }, forward)\r\n\r\n ])\r\n ])\r\n }\r\n )\r\n ])\r\n : m(LoadingFullScreen, { message: 'Loading Categories' })\r\n ])\r\n }\r\n }\r\n}\r\n","import { request } from './request'\r\n\r\nexport const getProductCategory = (id) => {\r\n return request({\r\n url: `productcategories/${id}`,\r\n method: 'GET'\r\n })\r\n}\r\n\r\nexport const getProductCategories = (supplierId) => {\r\n return request({\r\n url: 'productcategories',\r\n params: { supplierId: supplierId },\r\n method: 'GET'\r\n })\r\n}\r\n\r\nexport const getProducts = (producCategoryId) => {\r\n return request({\r\n url: 'products/bycategory',\r\n params: { productCategoryId: producCategoryId },\r\n method: 'GET'\r\n })\r\n}\r\n","import { InputSpin, Button, Card, LoadingFullScreen } from 'components'\r\nimport { notification } from 'utils/notifications'\r\nimport { getProductCategory, getProducts } from 'api/product'\r\n\r\n// import forward from 'assets/forward.svg'\r\n// import backIcon from 'assets/back.svg'\r\n\r\nexport const SelectProducts = ({ attrs: { NextStep, SelectProducts, supplier, productCategoryId, selectedProducts } }) => {\r\n let productCategory\r\n let productList\r\n\r\n const GetQuote = () => {\r\n var selectedProducts = productList.filter(function (p) {\r\n return p.quantity > 0\r\n })\r\n\r\n if (!selectedProducts || selectedProducts.length === 0) {\r\n notification.error({ title: 'At least one product must be selected' })\r\n return\r\n }\r\n\r\n SelectProducts(selectedProducts)\r\n NextStep()\r\n }\r\n\r\n getProductCategory(productCategoryId).then((data) => {\r\n productCategory = data\r\n })\r\n\r\n getProducts(productCategoryId).then((data) => {\r\n productList = data\r\n\r\n if (selectedProducts && productList) {\r\n // Update any quantities from our selected product list\r\n var i\r\n for (i = 0; i < selectedProducts.length; i++) {\r\n var product = productList.find(p => p.id === selectedProducts[i].id)\r\n if (product) {\r\n product.quantity = selectedProducts[i].quantity\r\n }\r\n }\r\n }\r\n })\r\n\r\n return {\r\n view () {\r\n return m('.h-full.flex.flex-col.overflow-auto', [\r\n\r\n productCategory\r\n ? m('', [\r\n m(Card, {\r\n classes: ['p-4', 'm-3', 'text-4xl', 'text-center', 'bg-gray-400']\r\n }, productCategory.description)\r\n ])\r\n : m(LoadingFullScreen, { message: 'Loading Category' }),\r\n\r\n productList\r\n ? m('', [\r\n m('.px-4',\r\n m(Button, {\r\n type: 'pf',\r\n raised: false,\r\n size: 'sm',\r\n loading: false,\r\n classes: ['px-8', 'py-4'],\r\n onclick () {\r\n GetQuote()\r\n }\r\n }, 'Get Quote')),\r\n m(Card, {\r\n classes: ['bg-gray-400', 'p-4', 'm-3', 'flex', 'flex-col', 'overflow-auto']\r\n }, [\r\n m('.table.w-full.px-4.py-2', [\r\n\r\n m('.table-header-group',\r\n m('.table-row.bg-gray-400.text-xl.font-bold', [\r\n m('.table-cell.px-4.py-2', 'Product'),\r\n m('.table-cell.px-4.py-2', 'Quantity')\r\n ])\r\n ),\r\n m('.table-row-group.text-xl.',\r\n productList.map((product, ix) => {\r\n return m('.table-row.bg-gray-400', [\r\n m('.table-cell.px-4.py-2', product.description),\r\n m('.w-48',\r\n m(InputSpin, {\r\n type: 'number',\r\n value: product.quantity,\r\n oninput (val) {\r\n product.quantity = val\r\n }\r\n }))\r\n ])\r\n })\r\n )\r\n ])\r\n ])\r\n ])\r\n : m(LoadingFullScreen, { message: 'Loading Products' })\r\n ])\r\n }\r\n }\r\n}\r\n","export const debounce = (func, wait, immediate) => {\r\n var timeout\r\n return function () {\r\n var context = this\r\n var args = arguments\r\n var later = function () {\r\n timeout = null\r\n if (!immediate) func.apply(context, args)\r\n }\r\n var callNow = immediate && !timeout\r\n clearTimeout(timeout)\r\n timeout = setTimeout(later, wait)\r\n if (callNow) func.apply(context, args)\r\n }\r\n}\r\n","import { Card, Input, InputSpin, Button, LoadingFullScreen } from 'components'\r\nimport { notification } from 'utils/notifications'\r\nimport { getProductQuote, sendProductQuoteEmail } from 'api/quote'\r\nimport { debounce } from 'utils/debounce'\r\n\r\nexport const ViewQuote = ({ attrs: { supplier, selectedProducts } }) => {\r\n let quote\r\n let emailAddress = ''\r\n\r\n const debounceGetQuoteDetails = debounce(() => {\r\n getQuoteDetails()\r\n }, 500)\r\n\r\n const getQuoteDetails = () => {\r\n getProductQuote(supplier.id, selectedProducts).then((data) => {\r\n quote = data\r\n })\r\n }\r\n\r\n const sendEmail = () => {\r\n sendProductQuoteEmail(quote, emailAddress).then(\r\n notification.success({ title: 'Email Sent' })\r\n )\r\n }\r\n\r\n getQuoteDetails()\r\n\r\n return {\r\n view () {\r\n return m('.h-full.flex.flex-col.overflow-auto', [\r\n\r\n selectedProducts\r\n ? m(Card, { classes: ['p-4', 'm-3', 'bg-gray-400'] }, [\r\n m('.table.w-full.px-4.py-2', [\r\n\r\n m('.table-header-group',\r\n m('.table-row.bg-gray-400.text-xl.font-bold', [\r\n m('.table-cell.px-4.py-2', 'Product'),\r\n m('.table-cell.px-4.py-2', 'Quantity')\r\n ])\r\n ),\r\n\r\n m('.table-row-group.text-xl',\r\n selectedProducts.map((product, ix) => {\r\n return m('.table-row.bg-gray-400', [\r\n m('.table-cell.px-4.py-2', product.description),\r\n m('.w-48',\r\n m(InputSpin, {\r\n value: product.quantity,\r\n type: 'number',\r\n class: 'text-black',\r\n oninput (val) {\r\n product.quantity = val || 0\r\n debounceGetQuoteDetails()\r\n }\r\n })\r\n )\r\n ])\r\n })\r\n )\r\n ])\r\n ])\r\n : null,\r\n quote\r\n ? m(Card, { classes: ['p-4', 'm-3', 'bg-gray-400', 'text-center'] }, [\r\n m('.text-2xl.pt-4', 'Total Cost Per Month'),\r\n\r\n m('.flex.flex-col.overflow-auto', [\r\n quote.items\r\n ? m('.table.flex.flex-col.overflow-auto.text-left.w-full.px-4.py-2', [\r\n m('.table-header-group',\r\n m('.table-row.bg-gray-400.text-2xl.font-bold', [\r\n m('.table-cell.px-4.py-2', ''),\r\n quote.termHeadings.map((termHeading, ix) => {\r\n return m('.table-cell.px-4.py-2', termHeading)\r\n })\r\n ])\r\n ),\r\n m('.table-row-group.flex.flex-col.overflow-auto.text-2xl',\r\n quote.items.map((item, ix) => {\r\n return m('.table-row.flex', {\r\n // class: ix % 2 === 0 ? 'bg-gray-200' : ''\r\n }, [\r\n m('.table-cell.px-4.py-2', item.description),\r\n item.termAmounts.map((termAmount, ix) => {\r\n return m('.table-cell.px-4.py-2', '£' + termAmount.toFixed(2))\r\n })\r\n ])\r\n }\r\n )\r\n )\r\n ])\r\n : null\r\n ]),\r\n m('.pt-4.italic', '*Prices exclude VAT'),\r\n m(Input, {\r\n label: '',\r\n placeholder: 'Email Adress',\r\n type: 'email',\r\n value: emailAddress,\r\n oninput (val) {\r\n emailAddress = val\r\n }\r\n }),\r\n m(Button, {\r\n type: 'pf',\r\n raised: false,\r\n size: 'md',\r\n loading: false,\r\n onclick () {\r\n sendEmail()\r\n }\r\n }, 'Email Quote')\r\n ])\r\n : m(LoadingFullScreen, { message: 'Loading Quote' })\r\n ])\r\n }\r\n }\r\n}\r\n","import { PageHeaderSupplier } from 'components'\r\nimport { SelectCategory } from './Steps/1SelectCategory'\r\nimport { SelectProducts } from './Steps/2SelectProducts'\r\nimport { ViewQuote } from './Steps/3ViewQuote'\r\nimport { getSupplier } from 'store/supplier'\r\nimport { route } from 'mithril'\r\n// import { getProductCategories } from 'api/product'\r\n// import { LoadingFullScreen } from 'components'\r\n// import { getDashboard, dashboard } from 'store/dashboard'\r\n// import forward from 'assets/forward.svg'\r\n\r\nexport const ProductQuote = () => {\r\n let currentStep\r\n let productCategoryId\r\n let selectedProducts\r\n\r\n const NextStep = () => {\r\n if (!currentStep) {\r\n currentStep = 1\r\n } else {\r\n currentStep++\r\n }\r\n }\r\n\r\n const PreviousStep = () => {\r\n if (!currentStep) {\r\n currentStep = 1\r\n } else {\r\n currentStep--\r\n }\r\n\r\n // If stepping back from the first step then go home\r\n if (currentStep === 0) {\r\n route.set('/')\r\n }\r\n }\r\n\r\n const SelectCategoryId = (categoryId) => {\r\n productCategoryId = categoryId\r\n selectedProducts = null\r\n }\r\n\r\n const SelectQuoteProducts = (products) => {\r\n selectedProducts = products\r\n }\r\n\r\n const supplier = getSupplier()\r\n\r\n if (!supplier) {\r\n m.route.set('/')\r\n }\r\n\r\n // First time in default to step 1\r\n if (!currentStep) {\r\n currentStep = 1\r\n selectedProducts = null\r\n }\r\n\r\n return {\r\n view () {\r\n return m('.h-full.flex.flex-col', [\r\n\r\n m(PageHeaderSupplier, {\r\n back: true,\r\n backfunction: PreviousStep,\r\n title: 'Product Quote',\r\n classes: ['text-center'],\r\n supplierlogo: supplier ? supplier.headerImage : null\r\n }),\r\n\r\n // m('.flex.flex-col', [\r\n // m(Card, {\r\n // classes: ['p-4', 'm-3', 'text-4xl', 'text-center']\r\n // }, supplier.name)\r\n // ]),\r\n currentStep === 1\r\n ? m(SelectCategory, { NextStep: NextStep, SelectCategoryId: SelectCategoryId, supplier: supplier })\r\n : null,\r\n currentStep === 2\r\n ? m(SelectProducts, { NextStep: NextStep, PreviousStep: PreviousStep, SelectProducts: SelectQuoteProducts, supplier: supplier, productCategoryId: productCategoryId, selectedProducts: selectedProducts })\r\n : null,\r\n currentStep === 3\r\n ? m(ViewQuote, { supplier: supplier, selectedProducts: selectedProducts })\r\n : null\r\n ])\r\n }\r\n }\r\n}\r\n","import { Card, EditForm, EditFormSection, Input, TextArea, Svg, CurrencyInput } from 'components'\r\n// import { Button } from '../../components/Button'\r\nimport { notification } from 'utils/notifications'\r\nimport { createApplication } from 'api/application'\r\n// import { hasStoredToken } from 'store/auth'\r\nimport { getSupplier } from 'store/supplier'\r\nimport doneIcon from 'assets/icons/outline/thumb-up.svg'\r\n// import pflogo from 'assets/images/performancefinance-home.png'\r\n// import WHlogo from 'assets/images/W&H-home.jpg'\r\n// import forward from 'assets/forward.svg'\r\n\r\nexport const ApplicationForm = ({ attrs: { quoteReference, quoteType, contactEmail, supplierName } }) => {\r\n let application\r\n let submitted\r\n\r\n const errors = {\r\n contactName: null,\r\n contactEmail: null,\r\n contactPhone: null\r\n }\r\n\r\n const supplier = getSupplier()\r\n\r\n if (!application) {\r\n application = {\r\n quoteReference: quoteReference,\r\n quoteType: quoteType || 0,\r\n contactEmail: contactEmail,\r\n supplierName: supplier ? supplier.name : ''\r\n }\r\n }\r\n\r\n const sendApplication = () => {\r\n if (validate()) {\r\n createApplication(application).then((data) => {\r\n application = data\r\n submitted = true\r\n })\r\n .catch(function (e) {\r\n if (e.message) {\r\n notification.error({ title: e.message })\r\n }\r\n })\r\n }\r\n }\r\n\r\n const validate = () => {\r\n errors.contactName = application.contactName === undefined\r\n ? 'Name is required'\r\n : null\r\n errors.contactPhone = application.contactPhone === undefined\r\n ? 'Phone is required'\r\n : null\r\n errors.contactEmail = application.contactEmail === undefined\r\n ? 'Email is required'\r\n : null\r\n return !errors.contactName && !errors.contactEmail && !errors.contactPhone\r\n }\r\n\r\n // Redirect to fetch a supplier\r\n // if (!supplier) {\r\n // m.route.set('/suppliers')\r\n // }\r\n\r\n return {\r\n view () {\r\n return m('.h-full.flex.flex-col', [\r\n\r\n submitted\r\n ? m(Card, {\r\n classes: ['m-6']\r\n }, [\r\n m('.flex.items-center.b-10', [\r\n doneIcon && m(Svg, { classes: ['w-32', 'mr-4', 'text-gray-500'] }, doneIcon),\r\n m('div', [\r\n m('p', 'Thanks for your application, a member of our team with expertise in your area will get back to you shortly.')\r\n ])\r\n\r\n ])\r\n ])\r\n : m(EditForm, {\r\n onsubmit:\r\n e => {\r\n e.preventDefault()\r\n sendApplication()\r\n },\r\n classes: ['m-6']\r\n }, [\r\n m(EditFormSection, {\r\n heading: 'Apply Now',\r\n description: 'Apply for finance now by completing this form. A member of the team with expertise in your area will get back to you shortly... '\r\n\r\n }, [\r\n m('div.grid.grid-cols-6.gap-2', [\r\n m('div.col-span-6.md:col-span-4',\r\n [\r\n m(Input, {\r\n label: 'Name: *',\r\n type: 'text',\r\n value: application.contactName,\r\n errorMessage: errors ? errors.contactName : '',\r\n oninput (val) {\r\n application.contactName = val\r\n }\r\n })\r\n ]),\r\n m('div.col-span-6.md:col-span-2',\r\n [\r\n m(Input, {\r\n label: 'Phone: *',\r\n value: application.contactPhone,\r\n errorMessage: errors ? errors.contactPhone : '',\r\n oninput (val) {\r\n application.contactPhone = val\r\n }\r\n })\r\n ]),\r\n m('div.col-span-6.md:col-span-4',\r\n [\r\n m(Input, {\r\n label: 'Email: *',\r\n value: application.contactEmail,\r\n errorMessage: errors ? errors.contactEmail : '',\r\n oninput (val) {\r\n application.contactEmail = val\r\n }\r\n })\r\n ]),\r\n m('div.col-span-6.md:col-span-2'),\r\n m('div.col-span-6.md:col-span-4', [\r\n m(Input, {\r\n label: 'Supplier:',\r\n value: application.supplierName,\r\n oninput (val) {\r\n application.supplierName = val\r\n }\r\n })\r\n ]),\r\n m('div.col-span-6.md:col-span-2'),\r\n m('div.col-span-6.md:col-span-3', [\r\n m(CurrencyInput, {\r\n label: 'Amount to Finance:',\r\n decimalPlaces: 0,\r\n value: application.financeAmount,\r\n oninput (val) {\r\n application.financeAmount = val\r\n }\r\n })\r\n ]),\r\n m('div.col-span-6.md:col-span-3'),\r\n m('div.col-span-6.md:col-span-4', [\r\n m(TextArea, {\r\n label: 'Message:',\r\n value: application.notes,\r\n rows: 4,\r\n oninput (value) {\r\n application.notes = value\r\n }\r\n })\r\n ])\r\n\r\n // m(Input, {\r\n // label: 'Company Type:',\r\n // value: application.companyType,\r\n // oninput (val) {\r\n // application.companyType = val\r\n // }\r\n // }),\r\n // m(Input, {\r\n // label: 'Company Postcode:',\r\n // value: application.companyPostcode,\r\n // oninput (val) {\r\n // application.companyPostcode = val\r\n // }\r\n // }),\r\n // m(Input, {\r\n // label: 'Company Address:',\r\n // value: application.companyAddress,\r\n // oninput (val) {\r\n // application.companyAddress = val\r\n // }\r\n // }),\r\n // m(Input, {\r\n // label: 'Company Reg No:',\r\n // value: application.companyRegNo,\r\n // oninput (val) {\r\n // application.companyRegNo = val\r\n // }\r\n // }),\r\n // m(Input, {\r\n // label: 'Company Phone:',\r\n // value: application.companyPhone,\r\n // oninput (val) {\r\n // application.companyPhone = val\r\n // }\r\n // }),\r\n // m(Input, {\r\n // label: 'No of Years Established:',\r\n // value: application.yearsEstablished,\r\n // oninput (val) {\r\n // application.yearsEstablished = val\r\n // }\r\n // }),\r\n // m(Input, {\r\n // label: 'Quote Reference:',\r\n // value: application.quoteReference,\r\n // oninput (val) {\r\n // application.quoteReference = val\r\n // }\r\n // }),\r\n // m(Input, {\r\n // label: 'Quote type:',\r\n // value: application.quoteType,\r\n // oninput (val) {\r\n // application.quoteType = val\r\n // }\r\n // }),\r\n // m(Input, {\r\n // label: 'Supplier:',\r\n // value: application.supplierName,\r\n // oninput (val) {\r\n // application.supplierName = val\r\n // }\r\n // }),\r\n // m(Input, {\r\n // label: 'Repayment Term:',\r\n // value: application.repaymentTerm,\r\n // oninput (val) {\r\n // application.repaymentTerm = val\r\n // }\r\n // }),\r\n // m(Input, {\r\n // label: 'Package:',\r\n // value: application.addOn,\r\n // oninput (val) {\r\n // application.addOn = val\r\n // }\r\n // }),\r\n // m(Input, {\r\n // label: 'Monthly Net Cost:',\r\n // value: application.monthlyPaymentNet,\r\n // oninput (val) {\r\n // application.monthlyPaymentNet = val\r\n // }\r\n // }),\r\n ])\r\n ])\r\n ])\r\n\r\n ])\r\n }\r\n }\r\n}\r\n","import { requestUnAuth } from './request'\r\n\r\nexport const createApplication = (data) => {\r\n return requestUnAuth({\r\n url: 'applications',\r\n method: 'POST',\r\n body: data\r\n })\r\n}\r\n","import { Input, EditForm, EditFormSection } from 'components'\r\nimport { notification } from 'utils/notifications'\r\nimport { getProfile } from 'store/profile'\r\nimport { getProfile as getProfileRequest, saveProfile } from 'api/profile'\r\n// import { EmailConfirmation } from './email-confirmation'\r\n\r\nexport const Profile = () => {\r\n let email\r\n let formProfile\r\n\r\n // let phoneContact\r\n\r\n // phoneContact = 1\r\n\r\n // Get current profile from memory\r\n getProfileRequest()\r\n .then(p => {\r\n email = p.email\r\n formProfile = {\r\n firstName: p.firstName,\r\n lastName: p.lastName,\r\n phoneNumber: p.phoneNumber\r\n }\r\n })\r\n\r\n const save = () => {\r\n saveProfile(formProfile)\r\n .then(() => {\r\n // Save updated profile to memeory\r\n getProfile()\r\n notification.success({ title: t('settings', 'profileSaved') })\r\n history.back()\r\n })\r\n .catch(() => {\r\n notification.error({ title: 'Error updating profile' })\r\n })\r\n }\r\n return {\r\n view () {\r\n return m('form.h-full.flex.flex-col', [\r\n m(EditForm, {\r\n onsubmit:\r\n e => {\r\n e.preventDefault()\r\n save()\r\n },\r\n classes: ['m-6']\r\n }, [\r\n m(EditFormSection, {\r\n heading: 'Edit Profile',\r\n description: 'Update your profile with your personal details. To change your email address contact Performance Finance.'\r\n\r\n }, [\r\n\r\n formProfile && m('div.grid.grid-cols-6.gap-2', [\r\n m('div.col-span-6', [\r\n m(Input, {\r\n label: t('settings', 'profileEmail'),\r\n value: email,\r\n type: 'readonly'\r\n })\r\n ]),\r\n m('div.col-span-6.md:col-span-4',\r\n [\r\n m(Input, {\r\n label: t('settings', 'profileFirstName'),\r\n value: formProfile.firstName,\r\n required: true,\r\n oninput (val) {\r\n formProfile.firstName = val\r\n }\r\n })\r\n ]),\r\n m('div.col-span-6.md:col-span-2'),\r\n m('div.col-span-6.md:col-span-4',\r\n [\r\n m(Input, {\r\n label: t('settings', 'profileLastName'),\r\n required: true,\r\n value: formProfile.lastName,\r\n oninput (val) {\r\n formProfile.lastName = val\r\n }\r\n })\r\n ]),\r\n m('div.col-span-6.md:col-span-2'),\r\n m('div.col-span-6.md:col-span-3',\r\n [\r\n m(Input, {\r\n label: t('settings', 'profilePhoneNumber'),\r\n type: 'tel',\r\n value: formProfile.phoneNumber,\r\n oninput (val) {\r\n formProfile.phoneNumber = val\r\n }\r\n })\r\n ]),\r\n m('div.col-span-6.md:col-span-3')\r\n // m('div.col-span-6.md:col-span-3',\r\n // [\r\n // m(Select, {\r\n // label: 'Allow contact via Phone',\r\n // value: phoneContact,\r\n // choices: [{ label: 'Yes', value: 1 }, { label: 'No', value: 0 }],\r\n // required: false,\r\n // removeItemButton: false,\r\n // search: false,\r\n // onchange (val, label) {\r\n // phoneContact = val\r\n // },\r\n // instance (obj) {\r\n // }\r\n // })\r\n // ]),\r\n // m('div.col-span-6.md:col-span-3')\r\n ])\r\n ])\r\n ])\r\n\r\n ])\r\n }\r\n }\r\n}\r\n","import { LoadingFullScreen, Card, CurrencyInput, Input, Button, Select, RadioGroup } from 'components'\r\nimport { notification } from 'utils/notifications'\r\nimport { getQuoteROI, sendQuoteEmailRoi } from 'api/quote'\r\n// import { debounce } from 'utils/debounce'\r\nimport { formatMoney } from 'utils'\r\nimport { getRates } from 'api/rate'\r\nimport { EmailDialog } from '../QuoteFinance/EmailDialog'\r\nimport mailIcon from 'assets/icons/outline/mail.svg'\r\n\r\nexport const ViewQuoteROI = ({ attrs: { supplier, rateGroup } }) => {\r\n let quote\r\n let savingEmail\r\n let terms\r\n let inputTerm\r\n let inputAmountFinanced\r\n let inputChargePerUse\r\n let inputUsesPerPeriod\r\n let inputDaysPerWeek\r\n let inputUsesPerPeriodMode\r\n\r\n const usesModes = [{ label: 'Days', value: 0, desc: 'Uses per day' }, { label: 'Weeks', value: 1, desc: 'Uses per week' }, { label: 'Months', value: 2, desc: 'Uses per month' }]\r\n\r\n inputDaysPerWeek = 5\r\n if (supplier.usesPerPeriodMode) {\r\n inputUsesPerPeriodMode = supplier.usesPerPeriodMode\r\n } else {\r\n inputUsesPerPeriodMode = 0\r\n }\r\n\r\n // const debounceGetQuoteDetails = debounce((amountFinanced) => {\r\n // getQuoteDetails(amountFinanced)\r\n // }, 500)\r\n\r\n const getQuoteDetails = (amountFinanced, term, chargePerUse, usesPerPeriodMode, usesPerPeriod, daysPerWeek) => {\r\n getQuoteROI(rateGroup.id, supplier.id, amountFinanced, term, chargePerUse, usesPerPeriodMode, usesPerPeriod, daysPerWeek).then((data) => {\r\n quote = data\r\n // quote.amountFinanced = formatMoney(quote.amountFinanced, 0)\r\n })\r\n }\r\n\r\n getRates(rateGroup.id).then((data) => {\r\n terms = data.map(row => {\r\n // remove any months free from low start as we currently show just the payment term\r\n return { label: rateGroup.isLowStart ? row.term - rateGroup.monthsFree : row.term, value: rateGroup.isLowStart ? row.term - rateGroup.monthsFree : row.term }\r\n })\r\n\r\n // Default to term of 60 if there is one, otherwise first term\r\n inputTerm = 0\r\n if (terms.length >= 1) {\r\n var index = terms.findIndex(item => item.value === 60)\r\n if (index >= 0) {\r\n inputTerm = terms[index].value\r\n } else {\r\n inputTerm = terms[0].value\r\n }\r\n }\r\n })\r\n\r\n const emailOpen = flyd.stream(false)\r\n\r\n const sendEmail = (email) => {\r\n savingEmail = true\r\n sendQuoteEmailRoi(quote, email.customerName, email.customerEmailToAddress).then(data => {\r\n emailOpen(false)\r\n savingEmail = false\r\n notification.success({ title: 'Email Sent' })\r\n })\r\n .catch(err => {\r\n console.log(err)\r\n notification.error({ title: 'unable to send email' })\r\n savingEmail = false\r\n })\r\n }\r\n\r\n return {\r\n view() {\r\n return m('.h-full.flex.flex-col.pb-6', [\r\n m('.mx-auto', [\r\n m('', [\r\n m(Card, { classes: ['mt-3'] }, [\r\n m('.text-center', [\r\n m('', [\r\n m('.font-bold.text-2xl', 'Return On Investment'),\r\n m('p.text-sm.text-gray-500', rateGroup.name)\r\n ])\r\n ])\r\n ]),\r\n m('form.mb-4', {\r\n onsubmit: e => {\r\n e.preventDefault()\r\n getQuoteDetails(inputAmountFinanced, inputTerm, inputChargePerUse, inputUsesPerPeriodMode, inputUsesPerPeriod, inputDaysPerWeek)\r\n }\r\n }, [\r\n m(Card, { classes: ['mt-3'] }, [\r\n m('div.grid.grid-cols-6.gap-6', [\r\n m('div.col-span-6', [\r\n m(CurrencyInput, {\r\n classes: ['text-3xl', 'text-center', 'py-0'],\r\n labelSize: 'text-3xl',\r\n labelClasses: ['text-center'],\r\n label: 'Your Investment',\r\n value: inputAmountFinanced,\r\n decimalPlaces: 0,\r\n required: true,\r\n placeholder: '£',\r\n oninput(val) {\r\n inputAmountFinanced = val\r\n }\r\n // onblur (val) {\r\n // quote.amountFinanced = val\r\n // }\r\n })\r\n ]),\r\n m('div.col-span-3.xs:col-span-2.dropdown4', [\r\n terms\r\n ? m(Select, {\r\n label: 'Payments (in months)',\r\n value: inputTerm,\r\n choices: terms,\r\n required: false,\r\n removeItemButton: false,\r\n search: false,\r\n onchange(val, label) {\r\n inputTerm = val\r\n },\r\n instance(obj) {\r\n }\r\n }) : null\r\n ]),\r\n m('div.col-span-3.xs:col-span-2', [\r\n m(CurrencyInput, {\r\n label: 'Charge per use',\r\n value: inputChargePerUse,\r\n required: true,\r\n decimalPlaces: 2,\r\n type: 'number',\r\n placeholder: '£',\r\n oninput(val) {\r\n inputChargePerUse = val\r\n }\r\n // onblur (val) {\r\n // quote.chargePerUse = val\r\n // }\r\n })\r\n ]),\r\n m('div.hidden.xs:block.xs:col-span-2'),\r\n m('div.pr-2.col-span-6.xs:col-span-5.sm:col-span-4', [\r\n m(RadioGroup, {\r\n label: 'Uses in',\r\n value: inputUsesPerPeriodMode,\r\n required: true,\r\n options: usesModes,\r\n name: 'radUsesMode',\r\n onchange(value) {\r\n inputUsesPerPeriodMode = value\r\n }\r\n })\r\n ]),\r\n m('div.hidden.xs:block.xs:col-span-1.sm:col-span-2'),\r\n m('div.col-span-3.xs:col-span-2', [\r\n m(Input, {\r\n label: inputUsesPerPeriodMode === 0 ? 'Uses per day' : inputUsesPerPeriodMode === 1 ? 'Uses per week' : 'Uses per month',\r\n value: inputUsesPerPeriod,\r\n required: true,\r\n type: 'number',\r\n oninput(val) {\r\n inputUsesPerPeriod = val\r\n }\r\n })\r\n ]),\r\n inputUsesPerPeriodMode === 0\r\n ? m('div.col-span-3.xs:col-span-2', [\r\n m(Input, {\r\n label: 'Days per week',\r\n value: inputDaysPerWeek,\r\n required: true,\r\n type: 'number',\r\n oninput(val) {\r\n inputDaysPerWeek = val\r\n }\r\n })\r\n ])\r\n : null,\r\n m('div.col-span-3.xs:col-span-2.flex.items-end', [\r\n m(Button, {\r\n variant: 'danger',\r\n raised: false,\r\n size: 'md',\r\n loading: false,\r\n classes: ['p-4', 'w-32']\r\n }, 'Go')\r\n ])\r\n ])\r\n ]),\r\n quote && quote.roiItem\r\n ? m('div', [\r\n m(Card, { classes: ['mt-3'] }, [\r\n m('div.grid.grid-cols-6.gap-2', [\r\n quote.isLowStart\r\n ? m('div.col-span-4.xs:col-span-3.p-1', [\r\n m('p', [\r\n m('span.font-bold', [`${quote.monthsFree}`]),\r\n ' monthly payments of '\r\n ])\r\n ]) : null,\r\n quote.isLowStart\r\n ? m('div.col-span-2.xs:col-span-3.bg-gray-100.p-1.pl-2.font-bold', [\r\n m('p', formatMoney(0))\r\n ]) : null,\r\n m('div.col-span-4.xs:col-span-3.p-1', [\r\n m('p', [\r\n quote.isLowStart ? 'Followed by ' : '',\r\n m('span.font-bold', [`${quote.term}`]),\r\n ' monthly payments of '\r\n ])\r\n ]),\r\n m('div.col-span-2.xs:col-span-3.bg-gray-100.p-1.pl-2.font-bold', [\r\n m('p', formatMoney(quote.monthlyAmount))\r\n ]),\r\n // m('.hidden.sm:block.sm:col-span-1'),\r\n m('div.col-span-4.xs:col-span-3.p-1', [\r\n m('p', 'Fixed rate (per annum) ')\r\n ]),\r\n m('div.col-span-2.xs:col-span-3.bg-gray-100.p-1.pl-2.font-bold', [\r\n m('p', (quote.rate * 100).toFixed(2) + ' %')\r\n ])\r\n\r\n ])\r\n\r\n ]),\r\n m(Card, { classes: ['mt-3'] }, [\r\n m('.text-center.font-bold.text-2xl', 'Return On Investment'),\r\n m('div.grid.grid-cols-6.gap-2.text-xl', [\r\n quote.isLowStart\r\n ? m('div.col-span-3.p-1.text-red-800', [\r\n m('p.', ['First ',\r\n m('span.font-bold', [`${quote.monthsFree}`]),\r\n \" months' profit\"\r\n ])\r\n ]) : null,\r\n quote.isLowStart\r\n ? m('div.col-span-3.bg-gray-100.p-1.pl-2.font-bold.text-red-800', [\r\n m('p', formatMoney(quote.roiItem.monthlyIncome * quote.monthsFree))\r\n ]) : null,\r\n m('div.col-span-3.p-1', [\r\n m('p', `Monthly profit ${quote.isLowStart ? 'thereafter' : ''}`)\r\n ]),\r\n m('div.col-span-3.bg-gray-100.p-1.pl-2.font-bold', [\r\n m('p', formatMoney(quote.roiItem.monthlyProfit))\r\n ]),\r\n m('div.col-span-3.p-1', [\r\n m('p', `Annual profit ${quote.isLowStart ? 'thereafter' : ''}`)\r\n ]),\r\n m('div.col-span-3.bg-gray-100.p-1.pl-2.font-bold', [\r\n m('p', formatMoney(quote.roiItem.annualProfit))\r\n ]),\r\n m('div.col-span-3.p-1', [\r\n m('p', `Uses per ${inputUsesPerPeriodMode === 0 ? 'day' : inputUsesPerPeriodMode === 1 ? 'week' : 'month'} to break even `)\r\n ]),\r\n m('div.col-span-3.bg-gray-100.p-1.pl-2.font-bold', [\r\n m('p', quote.usesPerPeriodBreakEven)\r\n ])\r\n ]),\r\n m('div.flex.justify-center.p-2', [\r\n m(Button, {\r\n variant: 'danger',\r\n raised: false,\r\n size: 'md',\r\n loading: false,\r\n icon: mailIcon,\r\n onclick() {\r\n emailOpen(true)\r\n }\r\n }, 'Email')\r\n ])\r\n\r\n ])\r\n ])\r\n : null\r\n ])\r\n ])\r\n ]),\r\n emailOpen() &&\r\n m(EmailDialog, {\r\n open: emailOpen,\r\n onsubmit: sendEmail,\r\n loading: savingEmail\r\n })\r\n ])\r\n }\r\n }\r\n}\r\n","import { request } from './request'\r\n\r\nexport const getRates = (rateGroupId) => {\r\n return request({\r\n url: 'rates',\r\n params: { rateGroupId: rateGroupId },\r\n method: 'GET'\r\n })\r\n}\r\n\r\nexport const getRateValues = (rateGroupId, amountFinanced) => {\r\n return request({\r\n url: 'rates/values',\r\n params: { rateGroupId: rateGroupId, amountFinanced: amountFinanced },\r\n method: 'GET'\r\n })\r\n}\r\n","import { SelectRateGroup } from '../SelectRateGroup'\r\nimport { ViewQuoteROI } from './ViewQuoteROI'\r\nimport { getSupplier } from 'store/supplier'\r\nimport { getRateGroup } from 'api/rateGroup'\r\nimport { checkAppVersion } from 'store/profile'\r\n// import { route } from 'mithril'\r\n// import { getProductCategories } from 'api/product'\r\n// import { LoadingFullScreen } from 'components'\r\n// import { getDashboard, dashboard } from 'store/dashboard'\r\n// import forward from 'assets/forward.svg'\r\n\r\nexport const QuoteROI = () => {\r\n let currentStep\r\n let rateGroupId\r\n let rateGroup\r\n\r\n const NextStep = () => {\r\n if (!currentStep) {\r\n currentStep = 1\r\n } else {\r\n currentStep++\r\n }\r\n }\r\n\r\n // const PreviousStep = () => {\r\n // if (!currentStep) {\r\n // currentStep = 1\r\n // } else {\r\n // currentStep--\r\n // }\r\n\r\n // // If stepping back from the first step then go home\r\n // if (currentStep === 0) {\r\n // route.set('/')\r\n // }\r\n // }\r\n\r\n const SetRateGroup = (group) => {\r\n rateGroup = group\r\n }\r\n \r\n const supplier = getSupplier()\r\n\r\n if (!supplier) {\r\n m.route.set('/')\r\n } else {\r\n \r\n // First time in check if supplier only has one offer, if so use it otherwise default to step 1 (select rate)\r\n if (!currentStep) {\r\n\r\n checkAppVersion()\r\n\r\n if (supplier.rateGroupId) {\r\n \r\n getRateGroup(supplier.rateGroupId).then((data) => {\r\n SetRateGroup(data)\r\n currentStep = 2\r\n })\r\n\r\n }\r\n else {\r\n currentStep = 1\r\n }\r\n }\r\n }\r\n\r\n return {\r\n view () {\r\n return m('.h-full.flex.flex-col.mx-auto.pb-6', [\r\n\r\n currentStep === 1\r\n ? m(SelectRateGroup, { NextStep: NextStep, SetRateGroup: SetRateGroup, supplier: supplier, isROICalculator: true })\r\n : null,\r\n currentStep === 2\r\n ? m(ViewQuoteROI, { supplier: supplier, rateGroup: rateGroup })\r\n : null\r\n ])\r\n }\r\n }\r\n}\r\n","import { getSupplier } from 'store/supplier'\r\n// import { debounce } from 'utils/debounce'\r\nimport { Card, LoadingFullScreen, CurrencyInput, Button } from 'components'\r\nimport { formatMoney } from 'utils'\r\n\r\nexport const SuperDeduction = () => {\r\n let superDeduction\r\n\r\n const supplier = getSupplier()\r\n\r\n if (!supplier) {\r\n m.route.set('/')\r\n }\r\n\r\n // const debouncegetSuperDeductionDetails = debounce((amountFinanced) => {\r\n // getSuperDeductionDetails(amountFinanced)\r\n // }, 500)\r\n\r\n const getSuperDeductionDetails = (amountFinanced) => {\r\n superDeduction = { amountFinanced: amountFinanced, deduction: amountFinanced * 0.247, oldDeduction: amountFinanced * 0.19 }\r\n }\r\n\r\n if (!superDeduction) {\r\n getSuperDeductionDetails(0)\r\n }\r\n\r\n // const emailOpen = flyd.stream(false)\r\n\r\n // const sendEmail = (email) => {\r\n // savingEmail = true\r\n // sendQuoteEmailRoi(quote, email.customerName, email.customerEmailToAddress).then(data => {\r\n // emailOpen(false)\r\n // savingEmail = false\r\n // notification.success({ title: 'Email Sent' })\r\n // })\r\n // .catch(err => {\r\n // console.log(err)\r\n // notification.error({ title: 'unable to send email' })\r\n // savingEmail = false\r\n // })\r\n // }\r\n\r\n return {\r\n view () {\r\n return m('.h-full.flex.flex-col.mx-auto', [\r\n superDeduction\r\n ? m('.mx-auto', [\r\n m('', [\r\n m(Card, { classes: ['mt-3'] }, [\r\n m('.text-center', [\r\n m('', [\r\n m('.font-bold.text-2xl', 'Tax Relief with Super-deduction'),\r\n m('p.text-sm.text-gray-500', 'Calculate and compare the super-deduction rate simply by entering the investment value below')\r\n ])\r\n ])\r\n ]),\r\n m('form.mb-4', {\r\n onsubmit: e => {\r\n e.preventDefault()\r\n getSuperDeductionDetails(superDeduction.amountFinanced)\r\n }\r\n }, [\r\n m(Card, { classes: ['mt-3', 'text-center'] }, [\r\n m('div.sm:px-10', [\r\n m(CurrencyInput, {\r\n classes: ['text-3xl', 'text-center'],\r\n labelClasses: ['text-3xl'],\r\n label: 'Your Investment',\r\n // autofocus: true,\r\n value: superDeduction.amountFinanced,\r\n // decimalPlaces: 0,\r\n placeholder: '£',\r\n oninput (val) {\r\n superDeduction.amountFinanced = val\r\n // debouncegetSuperDeductionDetails(superDeduction.amountFinanced)\r\n }\r\n })\r\n ]),\r\n m('div', [\r\n m(Button, {\r\n variant: 'danger',\r\n raised: false,\r\n size: 'md',\r\n loading: false,\r\n classes: ['p-4', 'w-32']\r\n }, 'Go')\r\n ])\r\n ]),\r\n m(Card, { classes: ['mt-3'] }, [\r\n m('div.grid.grid-cols-4.gap-2', [\r\n m('div.col-span-2.sm:col-span-1.p-1', [\r\n m('', 'Super Deduction ')\r\n ]),\r\n m('div.col-span-2.sm:col-span-1.bg-gray-100.p-1.pl-2.font-bold', [\r\n m('', formatMoney(superDeduction.deduction))\r\n ]),\r\n m('div.col-span-4.sm:col-span-2.text-sm.p-1', [\r\n m('', 'This is how much your Corporation Tax could reduce by')\r\n ]),\r\n m('div.col-span-2.sm:col-span-1.p-1', [\r\n m('', 'Old Rules ')\r\n ]),\r\n m('div.col-span-2.sm:col-span-1.bg-gray-100.p-1.pl-2.font-bold', [\r\n m('', formatMoney(superDeduction.oldDeduction))\r\n ]),\r\n m('div.col-span-4.sm:col-span-2.text-sm.p-1', [\r\n m('', 'This is how much your Corporation Tax might have reduced by')\r\n ])\r\n ])\r\n ])\r\n ])\r\n ])\r\n ])\r\n : m(LoadingFullScreen, { message: 'Loading Super-Deduction' })\r\n // emailOpen() &&\r\n // m(EmailDialog, {\r\n // open: emailOpen,\r\n // onsubmit: sendEmail,\r\n // loading: savingEmail\r\n // })\r\n ])\r\n }\r\n }\r\n}\r\n","import { Layout } from 'components'\r\nimport { Login } from 'pages/Login'\r\nimport { RegisterConfirm } from 'pages/RegisterConfirm'\r\nimport { RegisterRequest } from 'pages/RegisterRequest'\r\nimport { ResetPassword } from 'pages/ResetPassword'\r\nimport { ForgottenPassword } from 'pages/ForgottenPassword'\r\nimport { Home } from 'pages/Home'\r\nimport { Logout } from 'pages/Logout'\r\nimport { SelectSupplier } from 'pages/SelectSupplier'\r\nimport { QuoteFinance } from 'pages/QuoteFinance'\r\nimport { ProductQuote } from 'pages/ProductQuote'\r\nimport { ApplicationForm } from 'pages/ApplicationForm'\r\nimport { Profile } from 'pages/Profile'\r\nimport { QuoteROI } from 'pages/QuoteROI'\r\nimport { SuperDeduction } from 'pages/SuperDeduction'\r\n\r\nm.route.prefix = process.env.ROUTING_MODE\r\n\r\nconst Routes = {\r\n '/login': {\r\n render (vnode) {\r\n return m(Layout, {\r\n hideNav: true,\r\n requireAuth: false\r\n }, [m(Login, vnode.attrs)\r\n ])\r\n }\r\n },\r\n '/forgotten-password': {\r\n render (vnode) {\r\n return m(Layout, {\r\n hideNav: true\r\n }, [\r\n m(ForgottenPassword, vnode.attrs)\r\n ])\r\n }\r\n },\r\n '/reset-password': {\r\n render (vnode) {\r\n return m(Layout, {\r\n hideNav: true\r\n }, [\r\n m(ResetPassword, vnode.attrs)\r\n ])\r\n }\r\n },\r\n '/register-request': {\r\n render (vnode) {\r\n return m(Layout, {\r\n hideNav: true\r\n }, [\r\n m(RegisterRequest, vnode.attrs)\r\n ])\r\n }\r\n },\r\n '/register-confirm': {\r\n render (vnode) {\r\n return m(Layout, {\r\n hideNav: true\r\n }, [\r\n m(RegisterConfirm, { ...vnode.attrs })\r\n ])\r\n }\r\n },\r\n '/applicationexternal': {\r\n render (vnode) {\r\n return m(Layout, {\r\n hideNav: true,\r\n requireAuth: false\r\n }, [m(ApplicationForm, vnode.attrs)\r\n ])\r\n }\r\n },\r\n '/application': {\r\n render (vnode) {\r\n return m(Layout, {\r\n hideNav: false,\r\n requireAuth: true\r\n }, [m(ApplicationForm, vnode.attrs)\r\n ])\r\n }\r\n },\r\n '/': {\r\n render (vnode) {\r\n return m(Layout, m(Home, {\r\n ...vnode.attrs\r\n }))\r\n }\r\n },\r\n '/profile': {\r\n render (vnode) {\r\n return m(Layout, m(Profile, {\r\n ...vnode.attrs\r\n }))\r\n }\r\n },\r\n '/suppliers': {\r\n render (vnode) {\r\n return m(Layout, m(SelectSupplier, {\r\n ...vnode.attrs\r\n }))\r\n }\r\n },\r\n '/quotefinance': {\r\n render (vnode) {\r\n return m(Layout, m(QuoteFinance, {\r\n key: 'quoteFinance',\r\n isRebate: false,\r\n ...vnode.attrs\r\n }))\r\n }\r\n },\r\n '/quoterebate': {\r\n render (vnode) {\r\n return m(Layout, m(QuoteFinance, {\r\n key: 'quoteRebate',\r\n isRebate: true,\r\n ...vnode.attrs\r\n }))\r\n }\r\n },\r\n '/quoteroi': {\r\n render (vnode) {\r\n return m(Layout, m(QuoteROI, {\r\n ...vnode.attrs\r\n }))\r\n }\r\n },\r\n '/superdeduction': {\r\n render (vnode) {\r\n return m(Layout, m(SuperDeduction, {\r\n ...vnode.attrs\r\n }))\r\n }\r\n },\r\n '/quoteproduct': {\r\n render (vnode) {\r\n return m(Layout, m(ProductQuote, {\r\n ...vnode.attrs\r\n }))\r\n }\r\n },\r\n\r\n '/logout': Logout\r\n}\r\n\r\nconst DefaultRoute = '/'\r\n\r\nexport { Routes, DefaultRoute }\r\n","import { clearAuth } from 'store/auth'\r\nimport { clearProfile } from 'store/profile'\r\nimport { clearDashboard } from 'store/dashboard'\r\nimport { clearSupplier } from 'store/supplier'\r\nexport const Logout = () => {\r\n return {\r\n view () {\r\n clearAuth()\r\n clearProfile()\r\n clearDashboard()\r\n clearSupplier()\r\n localStorage.clear()\r\n m.route.set('/login')\r\n return m('div')\r\n }\r\n }\r\n}\r\n","import 'autotrack'\r\n\r\nif (process.env.NODE_ENV !== 'development') {\r\n ga('create', 'UA-XXXXXX', 'auto')\r\n\r\n ga('require', 'cleanUrlTracker')\r\n ga('require', 'eventTracker')\r\n ga('require', 'maxScrollTracker')\r\n ga('require', 'mediaQueryTracker')\r\n ga('require', 'outboundFormTracker')\r\n ga('require', 'outboundLinkTracker')\r\n ga('require', 'pageVisibilityTracker')\r\n ga('require', 'urlChangeTracker')\r\n ga('send', 'pageview')\r\n}\r\n","import './styles/style.css'\r\nimport { Routes, DefaultRoute } from './view/routes'\r\nimport 'utils/analytics'\r\n// import { refreshAuthTokenOrWait } from 'store/auth'\r\n\r\nif (module.hot) {\r\n module.hot.accept()\r\n}\r\n\r\ndocument.body.addEventListener('keyup', function (e) {\r\n if (e.which === 9) {\r\n /* tab */ document.documentElement.classList.remove('no-focus-outline')\r\n }\r\n})\r\n\r\n// refreshAuthTokenOrWait()\r\n// .catch(() => {\r\n// log('No token')\r\n// })\r\n\r\nconst $root = document.body.querySelector('#root')\r\nm.route($root, DefaultRoute, Routes)\r\n\r\nif (process.env.NODE_ENV !== 'production') {\r\n log('Looks like we are in development mode!')\r\n}\r\n\r\nlet vh = window.innerHeight * 0.01\r\ndocument.documentElement.style.setProperty('--vh', `${vh}px`)\r\n\r\nwindow.addEventListener('resize', () => {\r\n vh = window.innerHeight * 0.01\r\n document.documentElement.style.setProperty('--vh', `${vh}px`)\r\n})\r\n\r\nvar _orientationChangeTimeout\r\nwindow.addEventListener('orientationchange', () => {\r\n clearTimeout(_orientationChangeTimeout)\r\n _orientationChangeTimeout = setTimeout(function () {\r\n vh = window.innerHeight * 0.01\r\n document.documentElement.style.setProperty('--vh', `${vh}px`)\r\n }, 500)\r\n})\r\n// window.addEventListener('orientationchange', () => {\r\n// vh = window.innerHeight * 0.01\r\n// document.documentElement.style.setProperty('--vh', `${vh}px`)\r\n// })\r\n","export const messages = {\r\n general: {\r\n logOut: 'Log out',\r\n createdBy: 'Created By',\r\n updatedBy: 'Updated By',\r\n add: 'Add',\r\n create: 'Create',\r\n update: 'Update',\r\n cancel: 'Cancel',\r\n select: 'Select',\r\n confirm: 'Confirm',\r\n saveError: 'Add error occurred'\r\n },\r\n home: {\r\n title: 'Select Offer'\r\n },\r\n app: {\r\n cancel: 'Cancel',\r\n save: 'Save',\r\n loggedIn: 'Successfully logged in!',\r\n edit: 'Edit',\r\n privacyPolicy: 'Privacy Policy',\r\n termsAndConditions: 'Terms & Conditions',\r\n offline: 'Application off-line'\r\n },\r\n logIn: {\r\n title: 'Log in',\r\n email: 'Email Address',\r\n password: 'Password',\r\n signUpLink: 'No account? Register here',\r\n action: 'Log in',\r\n forgotten: 'Forgotten your sign in details?',\r\n forgottenInstruction: 'Email the accommodation team or call 01676 522868',\r\n genericError: 'There was an error logging in.'\r\n },\r\n logOut: {\r\n title: 'Confirm Log Out',\r\n email: 'Email Address',\r\n password: 'Password',\r\n signUpLink: 'No account? Register here',\r\n action: 'Log in',\r\n forgotten: 'Forgotten your sign in details?',\r\n forgottenInstruction: 'Email the accommodation team or call 01676 522868',\r\n genericError: 'There was an error logging in.'\r\n },\r\n register: {\r\n title: 'Register',\r\n email: 'Email Address',\r\n password: 'Password',\r\n firstName: 'First Name',\r\n lastName: 'Last Name',\r\n logInLink: 'Log in',\r\n action: 'Register'\r\n },\r\n forgottenPassword: {\r\n title: 'Reset password',\r\n email: 'Email Address',\r\n logInLink: 'Log in',\r\n action: 'Request password change'\r\n },\r\n nav: {\r\n home: 'Home',\r\n settings: 'Settings',\r\n product: 'Product',\r\n finance: 'Finance',\r\n suppliers: 'Suppliers'\r\n },\r\n navbar: {\r\n dashboard: 'Dashboard',\r\n settings: 'Settings',\r\n logOut: 'Log out'\r\n },\r\n settings: {\r\n appVersion: 'Version {0}',\r\n logOut: 'Log out',\r\n title: 'Settings',\r\n emailNotConfirmed: 'Email not confirmed',\r\n emailNotConfirmedText: 'You have yet to confirm your email address. Please check your inbox for further instructions or click resend below.',\r\n resendEmailConfirmation: 'Resend',\r\n profileTitle: 'Your Profile',\r\n profileEmail: 'Email address:',\r\n profileFirstName: 'First name:',\r\n profileLastName: 'Last name:',\r\n profileCompany: 'Company:',\r\n profilePosition: 'Position:',\r\n profilePhoneNumber: 'Phone number:',\r\n profileSubmit: 'Update',\r\n appTitle: 'App settings',\r\n appLanguage: 'Language:',\r\n appSubmit: 'Update App Settings',\r\n profileSaved: 'Profile updated'\r\n },\r\n\r\n rates: {\r\n rateGroupsTitle: 'Rate Groups',\r\n rateGroupTitle: 'Rate Group',\r\n rateGroupAdd: 'Add Rate Group',\r\n rateGroupAdded: 'Rate Group Added',\r\n rateGroupUpdate: 'Update Rate Group',\r\n rateGroupUpdated: 'Rate Group Updated',\r\n rateGroupName: 'Name',\r\n rateGroupFinanceLimit: 'Finance Limit',\r\n rateGroupIsActive: 'Active'\r\n },\r\n\r\n suppliers: {\r\n suppliersTitle: 'Suppliers',\r\n supplierTitle: 'Supplier',\r\n supplierAdd: 'Add Supplier',\r\n supplierAdded: 'Supplier Added',\r\n supplierUpdate: 'Update Supplier',\r\n supplierUpdated: 'Supplier Updated',\r\n supplierName: 'Name',\r\n supplierIsActive: 'Active',\r\n addRateGroup: 'Add Rate Group',\r\n addRateGroupBlurb: 'Search for a Rate Group',\r\n rateGroupAdded: 'Rate Group Added',\r\n rateGroupRemoved: 'Rate Group Removed',\r\n addUser: 'Add User',\r\n addUserBlurb: 'Search for a User',\r\n userAdded: 'User Added',\r\n userRemoved: 'User Removed'\r\n },\r\n\r\n users: {\r\n usersTitle: 'Users',\r\n userTitle: 'User',\r\n userAdd: 'Add User',\r\n userAdded: 'User Added',\r\n userUpdate: 'Update User',\r\n userUpdated: 'User Updated',\r\n userName: 'Name',\r\n userFirstName: 'First Name',\r\n userSurname: 'Surname',\r\n userCompany: 'Company',\r\n userPosition: 'Position',\r\n userPhone: 'Phone Number',\r\n userEmail: 'Email',\r\n userIsActive: 'Active',\r\n userPassword: 'Password'\r\n }\r\n\r\n}\r\n","import translate from 'translate.js'\r\nimport { messages as enGb } from './en-gb'\r\n\r\nconst languages = {\r\n 'en-gb': enGb\r\n}\r\n\r\nconst languageString = window.navigator.language.toLowerCase()\r\n\r\nvar options = {\r\n debug: !!parseInt(process.env.OUTPUT_UNTRANSLATED_STRINGS)\r\n}\r\n\r\nexport const t = translate(languages[languageString] || languages['en-gb'], options)\r\n","export const log = (...message) => {\r\n if (parseInt(process.env.PRINT_LOGS)) {\r\n const msg = message.map(m => {\r\n if (typeof m === 'object') {\r\n return JSON.stringify(m, null, 2)\r\n }\r\n return m\r\n }).join(' ')\r\n console.log((new Date()).toLocaleTimeString(), msg)\r\n if (window.cordova && window.bgGeo) {\r\n window.bgGeo.logger.debug(`PF-APP: ${msg}`)\r\n }\r\n }\r\n}\r\n"],"names":["module","exports","BottomNav","view","m","children","map","i","BottomNavItem","attrs","tag","href","route","Link","colorClass","isActive","tabindex","class","onclick","classes","icon","title","styles","md","sm","plain","positive","info","warning","danger","circle","spin","type","block","loading","size","variant","join","isButtons","buttons","length","clickable","onkeyup","e","keyCode","heading","b","buttonJustify","onchange","value","checked","stopPropagation","label","open","loaded","closeDialog","redraw","val","document","removeEventListener","oncreate","addEventListener","setTimeout","onbeforeremove","dom","classList","add","Promise","resolve","style","Dialog2","removeConfirm","trust","onsubmit","preventDefault","save","submit","saving","saveLabel","t","cancelLabel","remove","removeHide","removeText","level","CurrencyInput","autofocus","notFullWidth","labelSize","labelClasses","isInputActive","querySelector","focus","Intl","NumberFormat","currency","format","inputmode","required","max","min","placeholder","oninput","number","target","replace","isNaN","onfocus","onblur","errorMessage","step","InputSpin","elInput","raised","UserAvatar","user","initials","firstName","lastName","charAt","email","toUpperCase","LogoutDialog","updateUserLoggedOn","url","method","body","bsbsAuth","clientId","clientSecret","accessTokenUri","scopes","auth","pending","stream","setToken","token","localStorage","setItem","JSON","stringify","data","expiresAt","expires","async","refreshAuthToken","refresh","then","retry","fn","ms","maxRetries","retries","reject","catch","err","message","includes","Error","log","refreshAuthTokenOrWait","hasStoredToken","expired","set","getItem","localStorageToken","parse","authToken","createToken","expiresIn","Date","options","apiOptions","headers","requestOptions","sign","request","requestUnAuth","getProfile","profile","clearProfile","initialiseProfile","setProfile","prof","removeItem","checkAppVersion","appVersion","NavbarUser","showLogoutDialog","bodyClickFunction","notifications","addNotification","config","unshift","key","Math","random","notification","success","iconColor","error","bgColor","NotificationCloseButton","Notification","notificationDom","height","transition","clientHeight","persistant","pop","splice","index","ondismiss","description","DisplayNotifications","n","setSupplier","supplier","getSupplier","clearSupplier","NavLinks","version","closeNav","src","alt","NavLink","hasFinanceCalculator","hasROICalculator","hasRebateCalculator","hasMultipleSuppliers","get","indexOf","Layout","hideNav","isSideNavOpen","isOnline","navigator","onLine","s","CloseNav","window","ononline","onoffline","name","bottomNavItems","navItems","push","disabled","LoadingFullScreen","PageHeaderSupplier","back","backfunction","history","Password","inputType","toggleInputType","top","right","rootElement","createElement","container","appendChild","this","content","mount","onContentMount","onbeforeupdate","onremove","removeChild","fragment","Radio","RadioGroup","o","Select","choicesEl","replaceAll","toLowerCase","multiple","subtype","el","allowHTML","searchEnabled","search","shouldSort","removeItemButton","choices","itemSelectText","classNames","containerOuter","containerInner","item","instance","setChoices","c","selected","strValue","parseInt","evt","values","getValue","choice","textContent","querySelectorAll","forEach","parentNode","onupdate","TextArea","rows","EditForm","EditFormSection","extra","schema","keys","tlds","allow","messages","password","getError","errors","path","field","Array","isArray","find","every","k","validate","validation","abortEarly","details","detail","displayErrors","errs","Object","id","Login","formData","serverErrors","loginUser","owner","getToken","defaultSupplierId","location","reload","getLoginError","RegisterConfirm","code","resetCode","triggerRegisterConfirm","res","response","RegisterRequest","triggerRegisterRequest","registerRequest","ResetPassword","triggerPasswordReset","ForgottenPassword","recoverPassword","Home","HomeCard","dashboard","SelectSupplier","supplierList","SupplierItem","SaveSupplier","ix","SelectRateGroup","NextStep","SetRateGroup","isFinanceCalculator","isROICalculator","isRebateCalculator","supplierRateGroups","getSupplierRateGroupsActive","RateGroupItem","rateGroup","formatMoney","EmailDialog","quoteItem","customerName","customerEmailToAddress","sendToCustomer","sendToSupplier","ROIDialog","chargePerUse","usesPerPeriodMode","usesPerPeriod","daysPerWeek","usesModes","desc","includeROI","decimalPlaces","ViewQuote","isRebate","quote","savingEmail","amountFinanced","rebatePoints","roiChargePerUse","roiUsesPerPeriod","roiDaysPerWeek","roiUsesPerPeriodMode","selectedQuoteItem","quoteIconLocal","getQuoteDetails","rateGroupId","supplierId","params","getQuote","rebateUsePoints","getROIDetails","roiData","getROI","roiOpen","emailOpen","sendEmail","recipientName","emailAddress","term","sendQuoteEmail","console","RebateItem","monthlyAmount","rate","toFixed","costPerDay","rebate100","rebate75","rebate50","roiItem","isLowStart","monthsFree","monthlyIncome","monthlyProfit","annualProfit","usesPerPeriodBreakEven","items","getRateGroup","QuoteFinance","currentStep","group","SelectCategory","SelectCategoryId","productCategories","category","SelectProducts","productCategoryId","selectedProducts","productCategory","productList","producCategoryId","product","p","quantity","filter","GetQuote","func","wait","immediate","timeout","context","args","arguments","callNow","clearTimeout","apply","debounceGetQuoteDetails","sendProductQuoteEmail","termHeadings","termHeading","termAmounts","termAmount","ProductQuote","PreviousStep","categoryId","SelectQuoteProducts","products","supplierlogo","headerImage","ApplicationForm","quoteReference","quoteType","contactEmail","supplierName","application","submitted","contactName","contactPhone","sendApplication","createApplication","undefined","financeAmount","notes","Profile","formProfile","phoneNumber","op","ViewQuoteROI","terms","inputTerm","inputAmountFinanced","inputChargePerUse","inputUsesPerPeriod","inputDaysPerWeek","inputUsesPerPeriodMode","getQuoteROI","row","findIndex","sendQuoteEmailRoi","obj","QuoteROI","SuperDeduction","superDeduction","getSuperDeductionDetails","deduction","oldDeduction","prefix","Routes","render","vnode","requireAuth","clear","ga","which","documentElement","$root","vh","innerHeight","_orientationChangeTimeout","setProperty","languages","general","logOut","createdBy","updatedBy","create","update","cancel","select","confirm","saveError","home","app","loggedIn","edit","privacyPolicy","termsAndConditions","offline","logIn","signUpLink","action","forgotten","forgottenInstruction","genericError","register","logInLink","forgottenPassword","nav","settings","finance","suppliers","navbar","emailNotConfirmed","emailNotConfirmedText","resendEmailConfirmation","profileTitle","profileEmail","profileFirstName","profileLastName","profileCompany","profilePosition","profilePhoneNumber","profileSubmit","appTitle","appLanguage","appSubmit","profileSaved","rates","rateGroupsTitle","rateGroupTitle","rateGroupAdd","rateGroupAdded","rateGroupUpdate","rateGroupUpdated","rateGroupName","rateGroupFinanceLimit","rateGroupIsActive","suppliersTitle","supplierTitle","supplierAdd","supplierAdded","supplierUpdate","supplierUpdated","supplierIsActive","addRateGroup","addRateGroupBlurb","rateGroupRemoved","addUser","addUserBlurb","userAdded","userRemoved","users","usersTitle","userTitle","userAdd","userUpdate","userUpdated","userName","userFirstName","userSurname","userCompany","userPosition","userPhone","userEmail","userIsActive","userPassword","languageString","language","debug","msg","toLocaleTimeString","cordova","bgGeo","logger"],"sourceRoot":""}