(self.webpackChunk_17hats_app=self.webpackChunk_17hats_app||[]).push([[260],{"./node_modules/script-loader/index.js!./src/app/app/util.js":(e,t,n)=>{n("./node_modules/script-loader/addScript.js")(n("./node_modules/script-loader/node_modules/raw-loader/index.js!./node_modules/swc-loader/src/index.js??ruleSet[1].rules[0]!./src/app/app/util.js"))},"./node_modules/script-loader/index.js!./src/app/custom_parsley_methods.js":(e,t,n)=>{n("./node_modules/script-loader/addScript.js")(n("./node_modules/script-loader/node_modules/raw-loader/index.js!./node_modules/swc-loader/src/index.js??ruleSet[1].rules[0]!./src/app/custom_parsley_methods.js"))},"./node_modules/script-loader/index.js!./src/app/utils/QuestionnaireHelper.js":(e,t,n)=>{n("./node_modules/script-loader/addScript.js")(n("./node_modules/script-loader/node_modules/raw-loader/index.js!./node_modules/swc-loader/src/index.js??ruleSet[1].rules[0]!./src/app/utils/QuestionnaireHelper.js"))},"./node_modules/script-loader/node_modules/raw-loader/index.js!./node_modules/swc-loader/src/index.js??ruleSet[1].rules[0]!./src/app/app/util.js":e=>{e.exports="window.urlParams;\nwindow.proper_round = proper_round;\nwindow.bytesToSize = bytesToSize;\nwindow.uniqueBy = uniqueBy;\nwindow.setDateToEndOfDayUTC = setDateToEndOfDayUTC;\n//Date.prototype.addHours= function(h){\n//    this.setHours(this.getHours()+h);\n//    return this;\n//};\nfunction proper_round(a, p) {\n    var w = Math.pow(10, p);\n    return Math.floor(a * w + 0.50000000000008) / w;\n}\nfunction bytesToSize(bytes) {\n    var sizes = [\n        'Bytes',\n        'KB',\n        'MB'\n    ];\n    if (bytes == 0) return '0 Byte';\n    var i = parseInt(Math.floor(Math.log(bytes) / Math.log(1024)));\n    return Math.round(bytes / Math.pow(1024, i), 2) + ' ' + sizes[i];\n}\nfunction uniqueBy(a, key) {\n    var seen = {};\n    return a.filter(function(item) {\n        var k = key(item);\n        return seen.hasOwnProperty(k) ? false : seen[k] = true;\n    });\n}\n// Deprecate in favour of dataModel.convertToUTC(date, true);\nfunction setDateToEndOfDayUTC(date) {\n    return dataModel.convertToUTC(date, true);\n}\nDate.createFromMysql = function(mysql_string) {\n    if (typeof mysql_string === 'string') {\n        var t = mysql_string.split(/[\\- :]/);\n        //when t[3], t[4] and t[5] are missing they defaults to zero\n        return new Date(t[0], t[1] - 1, t[2], t[3] || 0, t[4] || 0, t[5] || 0);\n    }\n    return null;\n};\nDate.prototype.createToMysql = function formatDate() {\n    var date1 = this;\n    return date1.getFullYear() + '-' + (date1.getMonth() < 9 ? '0' : '') + (date1.getMonth() + 1) + '-' + (date1.getDate() < 10 ? '0' : '') + date1.getDate();\n};\nDate.prototype.toDateTimeString = function() {\n    function f(n) {\n        return n < 10 ? '0' + n : n;\n    }\n    return this.getUTCFullYear() + '-' + f(this.getUTCMonth() + 1) + '-' + f(this.getUTCDate()) + ' ' + f(this.getUTCHours()) + ':' + f(this.getUTCMinutes()) + ':' + f(this.getUTCSeconds());\n};\nDate.aptDuration = function(a, b) {\n    var hash = {\n        1800: '30m',\n        3600: '1h',\n        7200: '2h',\n        14400: '4h',\n        28800: '1d'\n    };\n    var diff = (b.getTime() - a.getTime()) / 1000;\n    return hash[diff] || '';\n};\nDate.prototype.yyyymmdd = function() {\n    var yyyy = this.getFullYear().toString();\n    var mm = (this.getMonth() + 1).toString(); // getMonth() is zero-based\n    var dd = this.getDate().toString();\n    return yyyy + (mm[1] ? mm : \"0\" + mm[0]) + (dd[1] ? dd : \"0\" + dd[0]); // padding\n};\n// extends observable objects intelligently\nko.utils.extendObservable = function(target, source) {\n    var prop, srcVal, tgtProp, srcProp, isObservable = false;\n    for(prop in source){\n        if (!source.hasOwnProperty(prop)) {\n            continue;\n        }\n        if (ko.isWriteableObservable(source[prop])) {\n            isObservable = true;\n            srcVal = source[prop]();\n        } else if (typeof source[prop] !== 'function') {\n            srcVal = source[prop];\n        }\n        if (ko.isWriteableObservable(target[prop])) {\n            target[prop](srcVal);\n        } else if (target[prop] === null || target[prop] === undefined) {\n            target[prop] = isObservable ? ko.observable(srcVal) : srcVal;\n        } else if (typeof target[prop] !== 'function') {\n            target[prop] = srcVal;\n        }\n        isObservable = false;\n    }\n};\nko.utils.clone = function(obj, emptyObj) {\n    var json = ko.toJSON(obj);\n    var js = JSON.parse(json);\n    return ko.utils.extendObservable(emptyObj, js);\n};\n// Knockout dirty flag\nko.dirtyFlag = function(root, isInitiallyDirty) {\n    var result = function() {}, _initialState = ko.observable(ko.toJSON(root)), _isInitiallyDirty = ko.observable(isInitiallyDirty);\n    result.isDirty = ko.computed(function() {\n        return _isInitiallyDirty() || _initialState() !== ko.toJSON(root);\n    });\n    result.reset = function() {\n        _initialState(ko.toJSON(root));\n        _isInitiallyDirty(false);\n    };\n    return result;\n};\nko.observableArray.fn.refresh = function(item) {\n    var index = this['indexOf'](item);\n    if (index >= 0) {\n        this.splice(index, 1);\n        this.splice(index, 0, item);\n    }\n};\nko.observableArray.fn.rebuildList = function(obs) {\n    let temp = obs();\n    obs([]);\n    obs(temp);\n};\nko.observableArray.fn.visibleLength = function() {\n    return ko.computed(function() {\n        var allItems = this();\n        if (allItems === undefined || allItems.length === undefined) return 0;\n        var visibleCount = 0;\n        for(var index = 0; index < allItems.length; index++){\n            if (allItems[index]._destroy != true) {\n                visibleCount++;\n            }\n        }\n        return visibleCount;\n    }, this)();\n};\nko.observableArray.fn.moveElement = function(old_pos, new_pos) {\n    this.valueWillMutate();\n    this().splice(new_pos, 0, this().splice(old_pos, 1)[0]);\n    this.valueHasMutated();\n};\nvar ErrorHandlingBindingProvider = function() {\n    var original = new ko.bindingProvider();\n    //determine if an element has any bindings\n    this.nodeHasBindings = original.nodeHasBindings;\n    //return the bindings given a node and the bindingContext\n    this.getBindings = function(node, bindingContext) {\n        var result;\n        try {\n            result = original.getBindings(node, bindingContext);\n        } catch (e) {\n            if (console && console.error) {\n                console.error(\"Error in binding: \" + e.message, node);\n            }\n        }\n        return result;\n    };\n};\nko.bindingProvider.instance = new ErrorHandlingBindingProvider();\n// TODO: The above util functions should be enclosed here for\n// proper encapsulation\n//\nwindow.utils = function() {\n    var self = {};\n    self.pluralize = function(count, string, suffix) {\n        if (count == 1) {\n            return string;\n        } else {\n            return string + suffix;\n        }\n    };\n    self.timeoutMessage = function(el, message, ms) {\n        if (!ms) {\n            ms = 3000;\n        }\n        var id = 'timeoutMessage';\n        if ($(el).data(id)) {\n            clearTimeout($(el).data(id));\n        }\n        $(el).html(message).fadeIn(150);\n        var t = setTimeout(function() {\n            $(el).fadeOut('fast', function() {\n                $(el).empty();\n            });\n        }, ms);\n        $(el).data(id, t);\n    };\n    self.clearErrors = function() {\n        $('.field_error').html('').addClass('displayNone');\n    };\n    // Not used. There is s similar code in controller.js but\n    // much less flexible\n    self.displayErrors = function(jqxhr, prefix) {\n        if (prefix == null) prefix = 'err_';\n        var error = {};\n        try {\n            error = JSON.parse(jqxhr.responseText).error;\n        } catch (err) {}\n        if (typeof error === 'string') {\n            alert(error);\n            return;\n        }\n        for(var key in error){\n            if (error.hasOwnProperty(key)) {\n                $('#' + prefix + key).html(error[key]).removeClass('displayNone');\n            }\n        }\n    };\n    self.throttle = function(func, ms) {\n        ms = ms || 1000;\n        var throttled = _.throttle(func, ms);\n        throttled();\n    };\n    self.unformatCurrency = function(val) {\n        var amount = val && val.hasOwnProperty('value') ? val.value : val;\n        // assumes accounting.js is included\n        var number = accounting.unformat(amount, accounting.settings.currency.decimal);\n        return proper_round(number, 2);\n    };\n    self.unformatNumber = function(val) {\n        return accounting.unformat(val, accounting.settings.currency.decimal);\n    };\n    self.formatNumber = function(val, precision) {\n        var formattedNumber = accounting.formatNumber(val, precision ? precision : accounting.settings.currency.precision, accounting.settings.currency.thousand, accounting.settings.currency.decimal);\n        if (precision) {\n            formattedNumber = formattedNumber.replace(/0+$/, \"\");\n            formattedNumber = formattedNumber.replace(/[\\,\\.]+$/, \"\");\n        }\n        return formattedNumber;\n    };\n    /**\n     * Generates a custom gradient button color\n     * @param {string} baseColor\n     * @param {object} $button\n   * @return {string}\n     */ self.customButtonColor = function(baseColor, $button) {\n        baseColor = baseColor || \"#76c329\";\n        var _shadeColor = function(color, percent) {\n            var num = parseInt(color.slice(1), 16), amt = Math.round(2.55 * percent), R = (num >> 16) + amt, G = (num >> 8 & 0x00FF) + amt, B = (num & 0x0000FF) + amt;\n            return \"#\" + (0x1000000 + (R < 255 ? R < 1 ? 0 : R : 255) * 0x10000 + (G < 255 ? G < 1 ? 0 : G : 255) * 0x100 + (B < 255 ? B < 1 ? 0 : B : 255)).toString(16).slice(1);\n        };\n        var buttonColor = baseColor;\n        var buttonColorLight = _shadeColor(buttonColor, 10);\n        var buttonColorDark = _shadeColor(buttonColor, -10);\n        var css = {};\n        var lum = luminance_get(buttonColor);\n        var fontColor = \"#fff\";\n        if (lum > 180) {\n            fontColor = \"#444\";\n        }\n        if (buttonColor && $button) {\n            css = {\n                background: buttonColor,\n                \"border-color\": buttonColorDark,\n                color: fontColor\n            };\n            $button.css(css);\n        } else {\n            var cssString = `\n          color: ${fontColor};\n          background: ${buttonColor};\n          border-color: ${buttonColorDark};\n        `;\n            return cssString;\n        }\n    };\n    self.expandRRule = function(rrule_str) {\n        rrule_str = rrule_str.replace(/RRULE\\:|;$|\\-|\\.000|\\:/g, '');\n        var rrule = RRule.fromString(rrule_str);\n        var freqs = [\n            'yearly',\n            'monthly',\n            'weekly',\n            'daily',\n            'hourly',\n            'minutely',\n            'secondly'\n        ];\n        var usage = [\n            'year',\n            'month',\n            'week',\n            'day',\n            'hour',\n            'minute',\n            'second'\n        ];\n        // Frequency Summary\n        var frequencySummary = 'every ';\n        if (rrule.options.interval == 1) {\n            frequencySummary += usage[rrule.options.freq];\n        } else {\n            frequencySummary += rrule.options.interval + ' ' + usage[rrule.options.freq] + 's';\n        }\n        // Until Summary\n        var untilSummary = \"never\";\n        if (rrule.options.count) {\n            untilSummary = 'after ' + rrule.options.count + ' occurrences';\n        } else if (rrule.options.until) {\n            untilSummary = moment(rrule.options.until).format('MMMM Do, YYYY');\n        }\n        return {\n            period: freqs[rrule.options.freq],\n            period_id: rrule.options.freq,\n            interval: rrule.options.interval,\n            count: rrule.options.count,\n            until: rrule.options.until,\n            frequency_summary: frequencySummary,\n            until_summary: untilSummary\n        };\n    };\n    self.findWithAttr = function(array, attr, value) {\n        for(var i = 0; i < array.length; i += 1){\n            if (array[i][attr] === value) {\n                return i;\n            }\n        }\n    };\n    var getRGB = function(b) {\n        var a;\n        if (b && b.constructor == Array && b.length == 3) return b;\n        if (a = /rgb\\(\\s*([0-9]{1,3})\\s*,\\s*([0-9]{1,3})\\s*,\\s*([0-9]{1,3})\\s*\\)/.exec(b)) return [\n            parseInt(a[1]),\n            parseInt(a[2]),\n            parseInt(a[3])\n        ];\n        if (a = /rgb\\(\\s*([0-9]+(?:\\.[0-9]+)?)\\%\\s*,\\s*([0-9]+(?:\\.[0-9]+)?)\\%\\s*,\\s*([0-9]+(?:\\.[0-9]+)?)\\%\\s*\\)/.exec(b)) return [\n            parseFloat(a[1]) * 2.55,\n            parseFloat(a[2]) * 2.55,\n            parseFloat(a[3]) * 2.55\n        ];\n        if (a = /#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(b)) return [\n            parseInt(a[1], 16),\n            parseInt(a[2], 16),\n            parseInt(a[3], 16)\n        ];\n        if (a = /#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(b)) return [\n            parseInt(a[1] + a[1], 16),\n            parseInt(a[2] + a[2], 16),\n            parseInt(a[3] + a[3], 16)\n        ];\n        return null;\n    };\n    var luminance_get = function(color) {\n        var rgb = getRGB(color);\n        if (!rgb) return null;\n        return 0.2126 * rgb[0] + 0.7152 * rgb[1] + 0.0722 * rgb[2];\n    };\n    return self;\n}();\n"},"./node_modules/script-loader/node_modules/raw-loader/index.js!./node_modules/swc-loader/src/index.js??ruleSet[1].rules[0]!./src/app/custom_parsley_methods.js":e=>{e.exports="// TODO: Currently this file is loaded inline, new versions of parsley have\n// methods to add custom parsers after load which would remove the need for this\n//\n// custom parsley validation methods\nwindow.ParsleyConfig = {\n    validators: {\n        doesntexist: {\n            fn: function(value, existing) {\n                existing = existing.split('__*parsley*__');\n                if (existing.constructor === Array) {\n                    for(var exists in existing){\n                        // TODO: replace with method in utils/general.js when not an inline script\n                        var name = existing[exists].replace(/[-\\/\\\\^$*+?.()|[\\]{}]/g, '\\\\$&');\n                        var re = new RegExp('^' + name + '$', 'i');\n                        if (value.match(re)) {\n                            return false;\n                        }\n                    }\n                } else if (value == existing) {\n                    return false;\n                }\n                return true;\n            },\n            priority: 32\n        },\n        date: {\n            fn: function(value) {\n                var date_regex = /^(0[1-9]|1[0-2])\\/(0[1-9]|1\\d|2\\d|3[01])\\/(19|20)\\d{2}$/;\n                if (!date_regex.test(value)) {\n                    return false;\n                }\n                return true;\n            },\n            priority: 33\n        },\n        datemin: {\n            fn: function(input, min) {\n                // assumes Datejs has improved Date.parse\n                return !Date.parse(input).isBefore(Date.parse(min));\n            },\n            priority: 34\n        },\n        phonenumber: {\n            fn: function(value) {\n                var phone_regex = /^[A-Za-z]+$/; //\\+?\\d$/\n                if (phone_regex.test(value)) {\n                    return false;\n                }\n                return true;\n            },\n            priority: 35\n        },\n        doesnumberexceedinstallmentremainder: {\n            fn: function(value, config) {\n                var configArray = config.split('::'), itemVal = value, itemType = configArray[0], remainder = SuiteSetup.module('Invoice').getInstallmentRemainder();\n                if (itemType === 'percentage' && remainder.percentage <= 0 || itemType === 'absolute' && remainder.absolute <= 0) {\n                    return false;\n                }\n                return true;\n            },\n            priority: 36\n        },\n        doesnumberexceedquoteinstallmentremainder: {\n            fn: function(value, config) {\n                var configArray = config.split('::'), itemVal = value, itemType = configArray[0], remainder = SuiteSetup.module('Quote').getInstallmentRemainder();\n                if (itemType === 'percentage' && remainder.percentage <= 0 || itemType === 'absolute' && remainder.absolute <= 0 && !(dataModel.quote() && dataModel.quote().has_optional_items())) {\n                    return false;\n                }\n                return true;\n            },\n            priority: 36\n        },\n        minexceedmax: {\n            fn: function(value, min) {\n                if (min >= value) {\n                    return false;\n                }\n                return true;\n            },\n            priority: 37\n        }\n    }\n};\n"},"./node_modules/script-loader/node_modules/raw-loader/index.js!./node_modules/swc-loader/src/index.js??ruleSet[1].rules[0]!./src/app/utils/QuestionnaireHelper.js":e=>{e.exports="window.questionnaireIsEmpty = function(questions) {\n    questions = ko.toJS(questions);\n    return _.every(questions, function(q) {\n        var answered = false;\n        switch(q.type){\n            case 'contact':\n                var keys = _.keys(q.options);\n                answered = _.some(keys, function(k) {\n                    return q.options.hasOwnProperty(k + '_answer');\n                });\n                break;\n            case 'multi':\n                answered = _.some(q.options, function(o) {\n                    return o.answer;\n                });\n                break;\n            case 'input':\n            case 'date':\n            case 'text':\n            case 'checkbox':\n            case 'file':\n            case 'select':\n                answered = !!q.answer;\n                break;\n        }\n        return !answered;\n    });\n};\n"},"./src/app/app.js":(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>r});var a,o=n("./node_modules/axios/index.js"),l=n.n(o),i=n("./src/app/utils/requests.js");window.SuiteSetup={add_module:function(e,t){a[e]||(a[e]=t())},setup:function(e,t,o,l,i,r){const{setInitialLocation:s}=n("./src/app/utils/router.js");for(var c in a){var d=a[c];d.Controller(e,t),d.Model(o,l),d.View(i,r)}o.isApp=t.observable(!0),o.page=ko.observable(),dataModel.not_found=ko.observable({title:"Not Found",message:"This page does not exist."}),s()},modules:a={},module:function(e){return a[e]},gotoPage:function(e){"undefined"!=typeof sammy&&sammy&&sammy.setLocation(e)},zeroState:function(e){({invoices:function(){var e=dataModel.accountinfo();e.analytics.invoices_sent=0,dataModel.accountinfo(e)},project:function(){var e={total:0,warn:0,pending:0,ok:0},t=dataModel.project();t.analytics.total=0,t.analytics.pending_items=0,t.analytics.required_actions=0,t.analytics.tasks=e,t.analytics.email=e,t.analytics.timetracking=e,t.analytics.contracts=e,t.analytics.invoices=e,t.analytics.forms=e,t.analytics.phonelog=e,t.analytics.expenses=e,t.analytics.notes=e,dataModel.project(t)},contacts:function(){var e=dataModel.accountinfo();e.analytics.contacts=0,dataModel.accountinfo(e)},projects:function(){var e=dataModel.accountinfo();e.analytics.jobs=0,dataModel.accountinfo(e)},reminders:function(){var e=dataModel.accountinfo();e.analytics.tasklists=0,dataModel.accountinfo(e)},calendars:function(){var e=dataModel.accountinfo();e.analytics.calendars=0,dataModel.accountinfo(e)},form:function(){dataModel.survey_template({questions:[]})},quote:function(){dataModel.quote(void 0)}})[e]()},liveState:function(e){({project:function(){var e=dataModel.project();e.analytics.total=1,e.analytics.pending_items=4,e.analytics.required_actions=42,e.analytics.tasks={total:10,ok:10,pending:0,warn:0},e.analytics.email={total:20,ok:19,pending:0,warn:1},e.analytics.timetracking={total:16,ok:15,pending:0,warn:1},e.analytics.contracts={total:1,ok:0,pending:1,warn:0},e.analytics.invoices={total:1,ok:0,pending:0,warn:1},e.analytics.forms={total:20,ok:15,pending:5,warn:0},e.analytics.phonelog={total:20,ok:20,pending:0,warn:0},e.analytics.expenses={total:20,ok:20,pending:0,warn:0},e.analytics.notes={total:20,ok:20,pending:0,warn:0},dataModel.project(e)},reminders:function(){var e=dataModel.accountinfo();e.analytics.tasklists=1,dataModel.accountinfo(e)},calendars:function(){var e=dataModel.accountinfo();e.analytics.calendars=1,dataModel.accountinfo(e)},form:function(){dataModel.survey_template({questions:[{q1:"hello world"}]})},quote:function(){dataModel.quote({})}})[e]()},route_config:{perl:"/perl",ruby:"/ruby"},onPaste:function(e,t){$("form[data-parsley-validate]").parsley().validate()},openExternalUrl:function(e){window.Android?window.Android.openUrlInBrowser(e):window.reactNative?n("./src/app/utils/commBridge.js").default.postAction("openUrl",e):window.open(e,"_blank","noopener=true,noreferrer=true")},notifyLogin:function(){window.reactNative&&n("./src/app/utils/commBridge.js").default.postAction("notifyLogin",dataModel.session.id)},notifyLogout:function(){let e;window.reactNative&&(n("./src/app/utils/commBridge.js").default.postAction("notifyLogout"),window.reactNative.pushToken&&(e=window.reactNative.pushToken.token)),window.Android&&(e=window.Android.getDeviceToken()),e&&window.Flipper("deregister_notifiable_device")&&i.Em.del(`/perl/mobile/${e}/deregister`)},startMobileSession:function(e){},registerForPushNotifications:function(e){if(e)try{l()({method:"POST",data:{notifiable_device:{token:e.token,platform:e.os}},url:SuiteSetup.route_config.perl+"/mobile/register/notifiable_device"}).then((e=>{window.reactNative&&(window.reactNative.notifiable_devices=e.data)}))}catch(e){console.error("notifiable device registration error",e)}}};const r=window.SuiteSetup},"./src/app/app/breakpoints.js":(e,t,n)=>{"use strict";n.r(t);var a=n("./src/app/redux/index.js"),o=n("./src/app/redux/actions/device.js"),l=n("./src/app/utils/device.js");const i=(0,l.F)();let r=!1;$((()=>{function e(){let e;switch(!0){case window.innerWidth>=1200:e="lg";break;case window.innerWidth>=992:e="md";break;case window.innerWidth>=595:e="sm";break;default:e="xs"}if(a.A.dispatch((0,o.Up)(window.innerWidth,e)),dataModel.deviceSize(window.innerWidth),dataModel.deviceType(e),window.Intercom){let t=!(!i&&!e.match(/(sm|xs)/));r!=t&&(r=t,window.Intercom("update",{hide_default_launcher:r}))}}dataModel.deviceType||(dataModel.deviceType=ko.observable()),dataModel.deviceSize=ko.observable();let t=!1;window.addEventListener("resize",(()=>{clearTimeout(t),t=setTimeout(e,250)})),e()}))},"./src/app/app/components/util.js":(e,t,n)=>{"use strict";function a(e){return ko.isObservable(e)?e:ko.observable(e)}function o(e){return ko.isObservable(e)?e:ko.observableArray(e)}n.d(t,{A:()=>a,V:()=>o})},"./src/app/components/EDU/BookingSection.jsx":(e,t,n)=>{"use strict";n.d(t,{A:()=>p});var a=n("./node_modules/react/react.js"),o=n.n(a),l=n("./src/app/components/EDU/EDULink.jsx"),i=n("./src/app/components/EDU/EDUCheckbox.jsx"),r=n("./src/app/services/EducationService.js");const s=[{label:"Organize",labelExtra:" – Create the building blocks of your system",className:"edu-section-booking-organize",value:"booking-organize",icon:"fa fa-cog",append:o().createElement("div",{className:"edu-time-label-wrapper"},o().createElement("i",{className:"fa fa-clock-o"}),o().createElement("span",{className:"edu-time-label"},"20 minutes"))},{label:"Systemize",labelExtra:" – Let’s build your Workflow Template",className:"edu-section-booking-systemize",value:"booking-systemize",icon:"fa fa-cog",append:o().createElement("div",{className:"edu-time-label-wrapper"},o().createElement("i",{className:"fa fa-clock-o"}),o().createElement("span",{className:"edu-time-label"},"5 minutes"))},{label:"Implement",labelExtra:" – Connect Workflows and Test",className:"edu-section-booking-implement",value:"booking-implement",icon:"fa fa-cog",append:o().createElement("div",{className:"edu-time-label-wrapper"},o().createElement("i",{className:"fa fa-clock-o"}),o().createElement("span",{className:"edu-time-label"},"10 minutes"))}],c={parentModuleClassName:"edu-module-booking"},d=Object.assign({},c,{parentSectionClassName:"edu-section-booking-organize"}),u=Object.assign({},c,{parentSectionClassName:"edu-section-booking-systemize"}),m=Object.assign({},c,{parentSectionClassName:"edu-section-booking-implement"}),p={description:o().createElement("div",null,o().createElement("p",null,"After you determine if a Lead is a good fit through your Lead Management System, it is time to turn this Lead into a paying Client. By making it is easy for a Lead to book, you will compress a multi-day process into just a few minutes, and you will book more Clients! It’s the ultimate booking experience."),o().createElement("p",null,"With one Email, you will send your Quote, Contract, and Invoice. Your Leads will have everything they need to complete their booking in minutes."),o().createElement("p",null,"Click, Click, Booked. It has never been easier!")),suffix:o().createElement("p",null,o().createElement("strong",null,"Congratulations, your new Booking System is now ready to go!")),menuItems:s,sections:[{tasks:[{label:"Contract Template",todos:[{label:o().createElement("span",null,"Create your ",o().createElement("a",{onClick:()=>r.eduDeeplinkClick("/app/account/templates",d)},"Contract Template")),id:"booking_create_contract_template"}],description:o().createElement("div",null,"Creating a Contract is important as it sets expectations while outlining your policies and Terms of Service. You might have created your Contract already, if not do so now.",o().createElement("p",null,"Not sure what to write? Check out the Contracts in our ",o().createElement(l.A,{id:"view_template_marketplace"},"Template Marketplace"),"."),o().createElement("p",null,"Once written, you can set your Contract to be signed upon creation (meaning it is signed by you when they receive it), or you can set it to be Countersigned by you after they signed the Contract (which we recommend)."),o().createElement("p",null,"Also, always populate your Templates with Tokens, so information such as the Client’s Name, Project Date, and your Company Name will automatically populate. Tokens are important as they allow for added personalization and the ability automate the sending of the Document ... just one less thing you have to do."),o().createElement(i.A,{id:"booking_create_contract_template",dependsOn:"create_contract_template"},"Yes, I created my ",o().createElement("strong",null,"Contract Template"),"."))},{label:"Quote Template",todos:[{label:o().createElement("span",null,"Create your ",o().createElement("a",{onClick:()=>r.eduDeeplinkClick("/app/account/templates",d)},"Quote Template")),id:"booking_create_quote_template"}],description:o().createElement("div",null,"Sending Quotes will become immensely valuable to your business.",o().createElement("br",null)," ",o().createElement("br",null),o().createElement("ol",null,o().createElement("li",null,"By showing something on the screen, your Lead will be less likely to haggle on price."),o().createElement("li",null,"If you have Packages, you will increase the chance of upgrading to a higher Package."),o().createElement("li",null,"By including Add-ons at the bottom of your Quote you will be surprised by how many will be selected; meaning extra money in your pocket.")),o().createElement("p",null,"Add different types of Quote Items:"),o().createElement("ol",null,o().createElement("li",null,o().createElement(l.A,{id:"view_quote_template_standard"},o().createElement("span",{style:{fontWeight:600}},"Standard")),": These are as-is items, that a Client cannot change or deselect such as a consultation fee."),o().createElement("li",null,o().createElement(l.A,{id:"view_quote_template_choose_one"},o().createElement("span",{style:{fontWeight:600}},"Choose One")),": Add your different Packages within this. Your Leads will be able to select only one option."),o().createElement("li",null,o().createElement(l.A,{id:"view_quote_template_choose_any"},o().createElement("span",{style:{fontWeight:600}},"Choose Any")),": This is the perfect place to add 3 Products for potential upsell. Leads can select one, multiple, or all items.")),o().createElement("p",null,"You can use ",o().createElement(l.A,{id:"view_quote_items_example"},"all, one, or any combination")," of Quote Items. Just remember, less is more. Don’t overwhelm your client with too many options."),o().createElement(i.A,{id:"booking_create_quote_template",dependsOn:"create_quote_template"},"Yes, I created my ",o().createElement("strong",null,"Quote Template"),"."))},{label:"Quote Email Template",todos:[{label:o().createElement("span",null,"Create your ",o().createElement("a",{onClick:()=>r.eduDeeplinkClick("/app/account/templates",d)},"Email Template")),id:"booking_create_email_template"}],description:o().createElement("div",null,"Your Leads will receive the Quote, Contract and Invoice through an Email allowing you to automate the delivery by using an Email Template. Within your message provide information about your booking process such as instructions, policies, and due dates/timelines.",o().createElement("p",null,"When creating this Email, for “Type:” select “Quote email”, as a button which links to the Quote will automatically be added to the bottom of the Email when sent. Create your Email message to include a clear call to action such as “Please click the button below to review and accept your quote.” Also ",o().createElement(l.A,{id:"view_email_tokens_example"},"populate your Email with Tokens")," to personalize your Email."),o().createElement(i.A,{id:"booking_create_email_template",dependsOn:"create_quote_email_template"},"Yes, I created my ",o().createElement("strong",null,"Quote Email Template"),"."))},{label:"Payment Processor",todos:[{label:o().createElement("span",null,"Set up your ",o().createElement("a",{onClick:()=>r.eduDeeplinkClick("/app/account/payment",d)},"Payment Processor")," to get paid faster"),id:"setup_payment_processor"}],description:o().createElement("div",null,"If you are on the fence about being paid online, trust us when we say this is a game changer. You will get paid faster and even possibly make more money. Most importantly, your Clients expect to be able to pay online these days, so it improves their experience with you. We recommend using Square or Stripe for your Payment Processor.")}],description:o().createElement("div",null,"This is the ",o().createElement(l.A,{id:"view_most_loved_17hats"},"most loved 17hats system")," as it takes the hassle out of booking. Let’s get started by setting up your Templates to build your system.")},{tasks:[{label:"Connect your Contract and Invoice",todos:[{label:o().createElement("span",null,"Enable your ",o().createElement("a",{onClick:()=>r.eduDeeplinkClick("/app/account/templates",u)},"Quote")," to house your Contract and Invoice"),id:"create_quote_with_contract"}],description:o().createElement("div",null,o().createElement("p",null,"Through connecting the Document Templates, we will turn a three-step process into one. From your Email, they will be able to click a button and go directly to the Quote. Once they accept the Quote, they can e-sign the Contract and then view the generated Invoice to complete Payment. It will literally take Clients less than 5 minutes to complete."),o().createElement("p",null,"Within the ",o().createElement(l.A,{id:"view_quote_with_contract"},"Quote Template you have created, click Contract and select the Contract Template")," you created previously. Now the Contract will be automatically displayed after your Quote has been accepted."),o().createElement("p",null,"Next, check Invoice within Quote Options and turn on “Accept Online Payments”. Now an Invoice will be automatically generated from the items selected in the Quote, and they will be able to pay online!"))},{label:"Build your Booking Workflow",todos:[{label:o().createElement("span",null,"Create your ",o().createElement("a",{onClick:()=>r.eduDeeplinkClick("/app/workflows/templates",u)},"one-step Workflow")),id:"booking_build_booking_workflow"}],description:o().createElement("div",null,"Create your one-step Workflow Template. For organization purposes, start with a descriptive name ",o().createElement(l.A,{id:"view_workflow_template_with_steps"},"(such as “Revenue Stream - Booking”)")," and select your “To Do” calendar.",o().createElement("br",null),o().createElement("br",null),"Add an Action Item to send your Quote:",o().createElement("ul",null,o().createElement("li",null,o().createElement("strong",null,"Action"),": Send Quote"),o().createElement("li",null,o().createElement("strong",null,"Template"),": Select your Quote Template created"),o().createElement("li",null,o().createElement("strong",null,"Email"),": Select the Email Template created"),o().createElement("li",null,o().createElement("strong",null,"Prompt"),": Send Automatically"),o().createElement("li",null,o().createElement("strong",null,"When"),": 0 days after activating the Workflow"),o().createElement("li",null,o().createElement("strong",null,"Completed"),": When all Items have been completed")),o().createElement("p",null,"That’s it. A one-step Workflow! Easy."),o().createElement(i.A,{id:"booking_build_booking_workflow",dependsOn:"create_workflow_with_quote",completeDependencies:!0},"Workflow complete. What's next?"))}],description:"Time to put the pieces together to create your one-step Workflow. We will set it up so that you will be able to trigger it directly after you finish your Lead Management System, continuing your stellar Client Experience."},{tasks:[{label:"Trigger Workflow",todos:[{label:o().createElement("span",null,"Trigger your ",o().createElement("a",{onClick:()=>r.eduDeeplinkClick("/app/workflows/templates",m)},"Booking Workflow from your Lead Management Workflow")),id:["booking_trigger_workflow_from_workflow","booking_trigger_booking_workflow"]}],description:o().createElement("div",null,"Triggering a Workflow starts your next Workflow for you. This allows you to fully automate your systems by making sure you don't forget to start an important part of your process. Just another way to ensure things won't fall through the cracks.",o().createElement("ul",null,o().createElement("li",null,"Open your Lead Workflow"),o().createElement("li",null,"Add an Action"),o().createElement("li",null,"Choose ‘Start a Workflow’"),o().createElement("li",null,"Select your Booking Workflow"),o().createElement("li",null,"Prompt: “Start it automatically”"),o().createElement("li",null,"When: “0 days after all previous Items are completed”")),o().createElement("p",null,"Now, your Quote, Contract, and Invoice will be sent as soon as you complete your initial Phone Call. Just check off the call when done and your Quote will be delivered to them within minutes."),o().createElement("p",null,"Don’t want the Quote to be sent automatically? Just change the Prompt setting in the Booking Workflow to “Approve before sending”."),o().createElement(i.A,{alwaysShow:!0,id:"booking_trigger_booking_workflow",dependsOn:"booking_trigger_workflow_from_workflow",completeDependencies:!0},"One Workflow prompts the next. Awesome."))},{label:"Test",todos:[{label:"Open your Test Project and test your Booking System",link:"/app/projects",id:["send_quote","contract_signed","quote_accepted","invoice_paid","booking_test_booking_workflow"],existing_user_id:["send_quote","contract_signed","quote_accepted","invoice_paid","booking_test_booking_workflow"]}],description:o().createElement("div",null,"From Projects, open your Test Project and add your Lead Management Workflow. Now go through the steps to see how one Workflow will trigger the next. And, how the Quote, Contract, and Invoice will look to your Leads. We also recommend ",o().createElement(l.A,{clickable:!1,id:"invoice_paid"},"making a $1 payment")," to make sure everything is working correctly.",o().createElement("p",null,"Now is the time to make adjustments to your Templates or Workflow steps. Is there anything else to add to your Workflows? Are you using Tokens for personalization? Are you setting expectations for what’s next to come and clear call to actions for what they need to do?"),o().createElement("p",null,"Often business owners give too much information too soon, so go over your information and see if it is all needed at that time."),o().createElement(i.A,{alwaysShow:!0,id:"booking_test_booking_workflow",dependsOn:["send_quote","contract_signed","quote_accepted","invoice_paid"],completeDependencies:!0},"Hooray, it’s all working. All systems go."))}],description:""}]}},"./src/app/components/EDU/EDUCheckbox.jsx":(e,t,n)=>{"use strict";n.d(t,{A:()=>p});var a=n("./node_modules/react/react.js"),o=n.n(a),l=n("./node_modules/prop-types/index.js"),i=n.n(l),r=n("./src/app/services/EducationService.js"),s=n("./node_modules/classnames/index.js"),c=n.n(s),d=n("./node_modules/autobind-decorator/lib/esm/index.js"),u=n("./node_modules/react-redux/es/index.js");class m extends a.Component{static propTypes={dependsOn:i().oneOfType([i().string,i().arrayOf(i().string)]),id:i().string,completeDependencies:i().bool};static defaultProps={dependsOn:void 0,id:void 0,completeDependencies:!1,alsoComplete:void 0,alwaysShow:!1,hideFromNewUsers:!1};componentWillMount(){this.setState({checked:r.isItemCompleted(this.props.id)})}onChange(e){e.target.checked&&(!this.isNewUser()&&this.props.dependsOn&&this.props.completeDependencies&&[].concat(this.props.dependsOn).forEach((e=>{r.completeItem(e)})),this.props.alsoComplete&&[].concat(this.props.alsoComplete).forEach((e=>{r.completeItem(e)})),r.completeItem(this.props.id),this.setState({checked:e.target.checked}))}isNewUser(){return"1"==dataModel.education_properties().education_new_user}render(){const{checked:e}=this.state,{dependsOn:t}=this.props,n=c()(["edu-checkbox"]);if(this.props.hideFromNewUsers&&this.isNewUser())return null;if((this.isNewUser()||!this.props.alwaysShow)&&void 0!==t)if("string"==typeof t){if(1!=this.props.completedItems[t])return null}else for(let e of t)if(1!=this.props.completedItems[e])return null;return o().createElement("section",{className:"edu-checkbox-container"},o().createElement("div",null,o().createElement("input",{type:"checkbox",checked:e,onChange:this.onChange,className:n,id:this.props.id}),o().createElement("label",{htmlFor:this.props.id,className:n},this.props.children)))}}const p=(0,u.Ng)((e=>({completedItems:e.education.completedItems})))((0,d.Zw)(m))},"./src/app/components/EDU/EDULink.jsx":(e,t,n)=>{"use strict";n.d(t,{A:()=>y});var a=n("./node_modules/react/react.js"),o=n.n(a),l=n("./node_modules/prop-types/index.js"),i=n.n(l),r=n("./src/app/services/EducationService.js"),s=n("./src/app/components/EDU/EDUMedia.js"),c=n("./src/app/uimagic/dialog.js");var d=n("./node_modules/classnames/index.js"),u=n.n(d),m=n("./node_modules/react-redux/es/index.js"),p=n("./src/app/redux/actions/education.js"),h=n("./src/app/utils/router.js"),g=n("./node_modules/autobind-decorator/lib/esm/index.js");class f extends a.Component{static propTypes={clickable:i().bool,manual:i().bool};static defaultProps={clickable:!0,manual:!1};componentWillMount(){this.setState({completed:r.isItemCompleted(this.props.id)})}componentWillReceiveProps(e){this.setState({completed:r.isItemCompleted(this.props.id)})}onClick(){if(!this.props.clickable)return;const e=s.A[this.props.id][0];var t,n;e&&(e.url?(n=e.url,window.open(n,"_blank").focus()):e.uri||e.vimeo?(t=this.props.id,(0,c.YK)(s.A[t]),r.completeItem(t)):e.link&&(0,h.gotoPage)(e.link),this.setState({completed:!0}))}render(){const{completed:e}=this.state;let t;const n=s.A[this.props.id];if(n&&(t=n[0]),t&&t.disabled)return o().createElement("span",null,this.props.children);const a=u()(["edu-image-link",{"edu-image-link--not-clickable":!1===this.props.clickable},{"edu-image-link-completed":e}]),l=o().createElement("a",{className:a,onClick:this.onClick},this.props.children);return this.props.manual&&this.props.manualComplete?o().createElement("span",null,l,o().createElement("a",{className:"edu-todo-manual-complete",onClick:()=>p.HU(this.props.id)},"[C]")):l}}const y=(0,m.Ng)((e=>({manualComplete:e.education.manualComplete,completedItems:e.education.completedItems})))((0,g.Zw)(f))},"./src/app/components/EDU/EDUMedia.js":(e,t,n)=>{"use strict";n.d(t,{A:()=>a});const a={view_email_signature_examples:[{vimeo:"289734557",linkLabel:"Signature Line",link:"/app/account/emailaccounts/signatures",disabled:!1}],view_calendar_examples:[{vimeo:"292803016",linkLabel:"Connect Your Google Calendar or Create New Calendars",link:"/app/account/calendar_sync",disabled:!1}],view_email_tokens:[{vimeo:"289733636",disabled:!1}],view_email_type:[{vimeo:"289734611",linkLabel:"Create your Email Templates",link:"/app/account/templates",disabled:!1}],view_electronic_documents:[{vimeo:"289734662",linkLabel:"Create your Questionnaire, Quotes and Contract templates",link:"/app/account/templates",disabled:!1}],view_transaction_category_example:[{vimeo:"289614778",linkLabel:"Create your Transaction Categories",link:"/app/account/banks",disabled:!1}],view_products_example:[{uri:"/images/client-portal-preview.png",linkLabel:"Add Products and Services",link:"/app/account/products",disabled:!0}],time_tracking_video:[{vimeo:"289614778",linkLabel:"Enable Time Tracking",link:"/app/account/rates",disabled:!0}],view_contact_blog_post:[{url:"https://blog.17hats.com",disabled:!0}],view_project_video:[{vimeo:"289614778",linkLabel:"Add Documents, Notes and Events",link:"/app/projects",disabled:!0}],view_lcf_example:[{uri:"/images/client-portal-preview.png",linkLabel:"Create your Lead Capture Form",link:"app/leads/capture",disabled:!0}],view_questionnaire_example:[{uri:"/images/client-portal-preview.png",linkLabel:"Create a Questionnaire Template to vet your client",link:"/app/account/templates",disabled:!0}],view_questionnaire_email_example:[{uri:"/images/client-portal-preview.png",linkLabel:"Create an Email Template for your Questionnaire",link:"/app/account/templates",disabled:!0}],view_workflow_example:[{uri:"/images/client-portal-preview.png",disabled:!0}],view_edit_lcf:[{uri:"/images/client-portal-preview.png",linkLabel:"Adjust your Lead Capture Form to trigger your workflow",link:"/app/leads/capture",disabled:!0}],view_install_lcf:[{vimeo:"289614778",linkLabel:"Install your Lead Capture Form on your website",link:"/app/leads/capture",disabled:!0}],view_view_lcf_form:[{uri:"/images/client-portal-preview.png",linkLabel:"Test your new Lead Management System",disabled:!0}],view_lcf_steps:[{vimeo:"289614778",linkLabel:"Test your new Lead Management System",disabled:!0}],view_most_loved_17hats:[{uri:"/images/client-portal-preview.png",disabled:!0}],view_template_marketplace:[{linkLabel:"Create your Contract Template",link:"/app/account/templates/marketplace",disabled:!1}],view_quote_template_standard:[{uri:"/images/client-portal-preview.png",linkLabel:"Create your Quote Template",link:"/app/account/templates",disabled:!0}],view_quote_template_choose_one:[{uri:"/images/client-portal-preview.png",linkLabel:"Create your Quote Template",link:"/app/account/templates",disabled:!0}],view_quote_template_choose_any:[{uri:"/images/client-portal-preview.png",linkLabel:"Create your Quote Template",link:"/app/account/templates",disabled:!0}],view_quote_items_example:[{uri:"/images/client-portal-preview.png",linkLabel:"Create your Quote Template",link:"/app/account/templates",disabled:!0}],view_email_tokens_example:[{uri:"/images/client-portal-preview.png",linkLabel:"Create your Email Template",link:"/app/account/templates",disabled:!0}],view_quote_with_contract:[{vimeo:"289614778",linkLabel:"Enable your Quote to house your Contract and Invoice",link:"/app/account/templates",disabled:!0}],view_quote_in_action:[{uri:"/images/client-portal-preview.png",linkLabel:"Enable your Quote to house your Contract and Invoice",link:"/app/account/templates",disabled:!0}],view_workflow_template_with_steps:[{uri:"/images/client-portal-preview.png",linkLabel:"create your one step Workflow template",link:"/app/workflows/templates",disabled:!0}],view_blog_communicating_with_clients:[{url:"https://blog.17hats.com",disabled:!0}],making_a_$1_payment:[{}],click_blog_onboarding:[{url:"https://blog.17hats.com",disabled:!0}],click_blog_client_journey:[{url:"https://blog.17hats.com",disabled:!0}],view_client_and_your_needs:[{uri:"/images/client-portal-preview.png",disabled:!0}],view_client_portal:[{uri:"/images/client-portal-preview.png",linkLabel:"Customize Client Portal",link:"/app/account/client_portal",disabled:!0}],view_first_email:[{uri:"/images/client-portal-preview.png",linkLabel:"Create your Template",link:"/app/account/templates",disabled:!0}],view_make_list_and_add_dates:[{uri:"/images/client-portal-preview.png",disabled:!0}],view_workflow_examples:[{uri:"/images/client-portal-preview.png",linkLabel:"add value to your experience without lifting a finger",link:"/app/workflows/templates1",disabled:!0}],view_fulfillment_paper_list:[{uri:"/images/client-portal-preview.png",disabled:!0}],view_fulfillment_extra_help:[{vimeo:"289614778",linkLabel:"Master your List with Phases",link:"/app/workflow/templates",disabled:!0}]}},"./src/app/components/EDU/EDUSection.jsx":(e,t,n)=>{"use strict";n.d(t,{A:()=>m});var a=n("./node_modules/react/react.js"),o=n.n(a),l=n("./node_modules/prop-types/index.js"),i=n.n(l),r=n("./node_modules/autobind-decorator/lib/esm/index.js"),s=n("./src/app/components/general/Accordion.jsx");const c=(0,n("./node_modules/react-redux/es/index.js").Ng)((e=>({manualComplete:e.education.manualComplete,completedItems:e.education.completedItems})))(n("./src/app/components/EDU/EDUTasks.jsx").A);var d=n("./src/app/services/EducationService.js");class u extends a.Component{static displayName="EDUSection";static propTypes={tasks:i().array,onTodoClick:i().func,onSelectSection:i().func,onUnselectSection:i().func,disabled:i().bool,completedItems:i().object};static defaultProps={tasks:[],onTodoClick:()=>{},onSelectSection:()=>{},onUnselectSection:()=>{},disabled:!1};state={completedSections:[]};componentWillMount(){this.setState({accountinfo:dataModel.accountinfo()});const e=this.parseCompletedItems(this.props);this.props.onChangeCompletedSections&&this.props.onChangeCompletedSections(e),this.setState({completedSections:e})}componentWillReceiveProps(e){const t=this.parseCompletedItems(e);this.props.onChangeCompletedSections&&this.props.onChangeCompletedSections(t),this.setState({completedSections:t})}parseCompletedItems(e){const{completedItems:t,sections:n}=e,a=[];return n.map((e=>{const n=[];e.tasks&&e.tasks.map((e=>{const a=[];e.todos&&e.todos.map((e=>{const n=!(0,d.isEducationNewUser)()&&e.existing_user_id?e.existing_user_id:e.id;if("string"==typeof n)t[n]&&a.push(n);else{let e=!0;n.map((n=>{t[n]||(e=!1)})),e&&a.push(n)}})),n.push(a.length>=e.todos.length)})),a.push(-1===n.indexOf(!1))})),a}render(){const{completedSections:e}=this.state,{completedItems:t,onTodoClick:n,sections:a,description:l,suffix:i,menuItems:r,isPrimary:u,secondaryModulesSelectors:m,parentModuleClassName:p}=this.props,h=-1===e.indexOf(!1);(0,d.isEducationNewUser)();r.map(((t,n)=>{Object.assign(t,{completed:e[n],disabled:!1})}));let g=-1;r.forEach(((e,t)=>{e.value===window.localStorage.getItem("education-activeSection")&&(g=t)}));const f={onTodoClick:n};return o().createElement("div",{className:this.props.className},l,o().createElement(s.A,{disabled:this.props.disabled,onUnselect:this.props.onUnselectSection,onSelect:this.props.onSelectSection,collapsible:!0,selectedIndex:g,items:r,parentActive:!0},a&&a.map(((e,t)=>o().createElement(c,{key:t,...f,...e,parentModuleClassName:p,parentSectionClassName:r[t].className,isPrimary:u,secondaryModulesSelectors:m})))),h&&i)}}const m=(0,r.Zw)(u)},"./src/app/components/EDU/EDUTasks.jsx":(e,t,n)=>{"use strict";n.d(t,{A:()=>m});var a=n("./node_modules/react/react.js"),o=n.n(a),l=n("./node_modules/prop-types/index.js"),i=n.n(l),r=n("./node_modules/autobind-decorator/lib/esm/index.js"),s=n("./node_modules/classnames/index.js"),c=n.n(s),d=n("./src/app/services/EducationService.js");class u extends a.PureComponent{static displayName="EDUTasks";static propTypes={description:i().node,completedItems:i().object,tasks:i().arrayOf(i().object),onTodoClick:i().func};static defaultProps={description:null,tasks:void 0};render(){const{tasks:e,description:t,manualComplete:n,completedItems:a,isPrimary:l,secondaryModulesSelectors:i,parentModuleClassName:r,parentSectionClassName:s}=this.props,u={isPrimary:l,secondaryModulesSelectors:i,parentModuleClassName:r,parentSectionClassName:s};return o().createElement("div",{className:"edu-tasks"},t&&o().createElement("div",{className:"edu-description"},t),e&&e.map(((e,t)=>{const l=[];e.todos.map((e=>{const t=!(0,d.isEducationNewUser)()&&e.existing_user_id?e.existing_user_id:e.id;if("string"==typeof t)a[t]&&l.push(t);else{let e=!0;t.map((t=>{a[t]||(e=!1)})),e&&l.push(t)}}));const i=l.length>=e.todos.length,r=c()(["edu-task",{"edu-task-completed":i}]);return o().createElement("div",{className:r,key:t},o().createElement("div",{className:"edu-task-header"},o().createElement("i",{className:i?"fa fa-check":"fa fa-arrow-right"}),o().createElement("label",null,e.label),e.todos&&e.todos.length&&o().createElement("span",{className:"edu-todos"}," – ",e.todosPrefix&&o().createElement("span",{className:"edu-todo"},e.todosPrefix," "),e.todos&&e.todos.map(((t,l)=>{const i=!(0,d.isEducationNewUser)()&&t.existing_user_id?t.existing_user_id:t.id,r=c()(["edu-todo",{"edu-todo-completed":a[i]}]);return t.label?o().createElement("span",{key:l,onClick:()=>d.eduDeeplinkClick(t.link,u)},t.prefix&&o().createElement("span",{className:"edu-todo"},t.prefix),!t.link&&!t.video&&o().createElement("span",{className:r},t.label,n&&o().createElement("a",{className:"edu-todo-manual-complete",onClick:()=>this.props.onTodoClick(t)},"[C]")),t.link&&o().createElement("span",null,o().createElement("a",{className:r},t.label),n&&o().createElement("a",{className:"edu-todo-manual-complete",onClick:()=>this.props.onTodoClick(t)},"[C]")),t.video&&o().createElement("span",null,o().createElement("a",{onClick:()=>alert("video coming soon..."),className:r},t.label),n&&o().createElement("a",{className:"edu-todo-manual-complete",onClick:()=>this.props.onTodoClick(t)},"[C]")),t.suffix&&o().createElement("span",{className:"edu-todo"},t.suffix),!t.suffix&&l<e.todos.length-1&&o().createElement("span",null,", ")):null})),e.todosSuffix&&o().createElement("span",{className:"edu-todo"}," ",e.todosSuffix))),o().createElement("div",null,e.description))})))}}const m=(0,r.Zw)(u)},"./src/app/components/EDU/FulfillmentSection.jsx":(e,t,n)=>{"use strict";n.d(t,{A:()=>s});var a=n("./node_modules/react/react.js"),o=n.n(a),l=n("./src/app/components/EDU/EDUCheckbox.jsx"),i=n("./src/app/components/EDU/EDULink.jsx");const r=[{label:"Organize",labelExtra:" – Create the building blocks of your system",value:"fulfillment-organize",icon:"fa fa-cog",className:"edu-section-fulfillment-organize",append:o().createElement("div",{className:"edu-time-label-wrapper"},o().createElement("i",{className:"fa fa-clock-o"}),o().createElement("span",{className:"edu-time-label"},"20 minutes"))},{label:"Systemize",labelExtra:" – Let’s build your workflow template",value:"fulfillment-systemize",icon:"fa fa-cog",className:"edu-section-fulfillment-systemize",append:o().createElement("div",{className:"edu-time-label-wrapper"},o().createElement("i",{className:"fa fa-clock-o"}),o().createElement("span",{className:"edu-time-label"},"5 minutes"))},{label:"Implement",labelExtra:" – Connect and Test",value:"fulfillment-implement",icon:"fa fa-cog",className:"edu-section-fulfillment-implement",append:o().createElement("div",{className:"edu-time-label-wrapper"},o().createElement("i",{className:"fa fa-clock-o"}),o().createElement("span",{className:"edu-time-label"},"10 minutes"))}],s={description:o().createElement("div",null,o().createElement("p",null,"What is a Fulfillment System? You started your business because you have a passion for something; Now you provide that passion to others and actually get paid for it. Congrats to you!"),o().createElement("p",null,"Those tasks you complete to prepare, execute, and deliver your something, that is what we call fulfillment. Fulfilling your passion!"),o().createElement("p",null,"In this module, we will create a master checklist of everything you do to fulfill your part. The benefits: reduce stress, stay organized, and make sure you know what to do and when to do it."),o().createElement("p",null,"At the end of this final system, you will be able to wake up each morning, open 17hats and know exactly what you need to do for the day, week and month. And, let me tell you, there is no better feeling than having it all under control!")),suffix:o().createElement("p",null,o().createElement("strong",null,"Congratulations, your new Fulfillment System is now ready to go!")),menuItems:r,sections:[{tasks:[{label:"Create a List",todos:[{label:o().createElement("span",null,o().createElement(i.A,{id:"view_fulfillment_paper_list"},"Using paper and pen to create a list of all your steps")),id:"fulfillment_yes_created_list"}],description:o().createElement("div",null,"Take a few minutes with a blank sheet of paper to write out each step to prepare, complete, and deliver your service. Think of it as if you were training another ‘you’. How would you describe the steps of your process?",o().createElement("br",null),o().createElement("br",null),"Need help? Start your list by answering these questions:",o().createElement("ul",null,o().createElement("li",null,"When do you speak with your clients? Meetings, phone calls, video calls."),o().createElement("li",null,"What are your To Do items? Add your items in chronological order to your list. Social media shout outs, vendor/contractor phone calls, research, creation."),o().createElement("li",null,"What documents do you send? Add your Documents - When do you send Questionnaires, Quotes, Contracts, and Invoices?")),o().createElement("p",null,"Did you make your list?",o().createElement("br",null),o().createElement(l.A,{id:"fulfillment_yes_created_list"},"Yes, I am ready to move on.")))},{label:"Document Templates",todos:[{label:"Create your templates",link:"/app/account/templates",id:"fulfillment_create_quote_template"}],description:o().createElement("div",null,"What Document Templates are needed for this phase?",o().createElement("ul",null,o().createElement("li",null,"Quotes - a la carte items"),o().createElement("li",null,"Contract - social media agreement, care instruction for products, remind of policies previously stated, reiterate timelines"),o().createElement("li",null,"Questionnaire - order form, feedback survey")),o().createElement(l.A,{id:"fulfillment_create_quote_template",alsoComplete:["fulfillment_create_quote_template"],dependsOn:["create_quote_template","create_questionnaire_template","create_contract_template"]},"Yes, I made my Templates."))},{label:"Email Templates",todos:[{label:"Create your email templates",link:"/app/account/templates",id:"fulfillment_create_email_template"}],description:o().createElement("div",null,"Answering questions before they even ask; that should be your goal as clear communication is the key to a professional experience and happy Clients.",o().createElement("p",null,"What are the common questions do you get throughout the Fulfillment process, and how can you answer them them before your Clients ask?"),o().createElement("ul",null,o().createElement("li",null,"Create Email Templates to send your Documents. Remember to select to correct Email Type per Document."),o().createElement("li",null,"And, create Templates for regular Email communications (Type - Regular Email).")),o().createElement("p",null,"If you have a meeting scheduled, send a confirmation Email prior and a Thank You email with a summary afterwards. Really think about the process and create your Templates."),o().createElement("p",null,"Go back to your list and note which emails can be automated and which ones you need to add details to before sending."),o().createElement(l.A,{id:"fulfillment_create_email_template",dependsOn:"create_email_template"},"Yes, I made my Templates."))}],description:o().createElement("div",null,o().createElement("p",null,"What is a Fulfillment System? You started your business because of a love to do something; whether is was the love helping and you became a coach or the love of storytelling and you became a photographer. Now you provide that passion to others and actually get paid for it.",o().createElement("br",null),"Congrats to you!"),o().createElement("p",null,"Those tasks you complete to prepare, execute and deliver your something, that is what we call fulfillment. Fulfilling your passion!"),o().createElement("p",null,"We will Create a master checklist of everything you do to fulfill your part. The benefits — reduce stress, help you stay organized and make sure you know what to do and when to do it."),o().createElement("p",null,"At the end of this final system, you will be able to wake up each morning, open 17hats and know exactly what you need to do for the day, week and month. And, let me tell you there is no better feeling than having it all under control!"))},{tasks:[{label:"Plan your Phases",todos:[{label:"Master your List with Phases",link:"/app/workflow/templates",id:"create_phases"}],description:o().createElement("div",null,"Do you have Phases of fulfillment?",o().createElement("br",null),o().createElement("br",null),"Let’s look at the Phases of a wedding photographer:",o().createElement("ul",null,o().createElement("li",null,"Prep phase - Scouting the venue, charging batteries, cleaning lenses."),o().createElement("li",null,"Wedding phase - Shoot the wedding."),o().createElement("li",null,"Editing phase - Upload photos, cull photos, edit photos, create gallery, schedule reveal session, send confirmation email, reveal session."),o().createElement("li",null,"Order - Edit order, order, package, schedule pick up."),o().createElement("li",null,"Album Creation - Select image, design album, create proof, proof email, proof approved, order, package, schedule pickup"),o().createElement("li",null,"Wall art creation - Edit, proof, order, schedule pickup")),o().createElement("p",null,"Each phase has multiple To Do Items. This is helpful as you can delete a Phase not relevant to your client. For example - if they did not order a wedding album, you could just delete that Phase which keeps your Calendar and account clean and organized."),"Did you plan your phases? ",o().createElement("br",null),o().createElement(l.A,{id:"create_phases"},"Yes, I have it under control."))},{label:"Build your Workflow",todos:[{label:"One Workflow to fit your needs",link:"/app/workflows/templates",id:["create_workflow_with_phases","fulfillment_build_workflow"]}],description:o().createElement("div",null,"Build your master list of Action and To Do Items, so that each step of your process is outlined. This will allow you to know exactly what needs to be done each day. Never again will you have the feeling that everything need to be done today, right now! What a great feeling that will be.",o().createElement("br",null),o().createElement("br",null),"Start with a descriptive name (such as “Revenue Stream - Fulfillment”) and select your “To Do” Calendar.",o().createElement("ul",null,o().createElement("li",null,"Create ",o().createElement("span",{style:{textDecoration:"underline"}},"all")," the Phases of your Workflow - Edit > Add New Phase."),o().createElement("li",null,"Add Action and To Do Items to build out each Phase.")),o().createElement(l.A,{id:"fulfillment_build_workflow",dependsOn:["create_workflow_with_phases","create_phases"],completeDependencies:!0},"Finished. My Workflow is my new best friend."))}],description:o().createElement("div",null,o().createElement("p",null,"Workflows are powerful and building it with Phases will create an even more powerful system. The Fulfillment process can be very intense for some professions, so Phases will help keep your Workflows organized and relevant. If a Client falls off or doesn’t need a Phase, it is very easy to delete that section, keeping your 17hats account clean."))},{tasks:[{label:"Connect your Workflow",todos:[{label:"trigger your Fulfillment Workflow from your Onboarding Workflow",link:"/app/workflows/templates",id:["fulfillment_trigger_workflow_from_workflow","fulfillment_connect_workflow"]}],description:o().createElement("div",null,"Trigger your Fulfillment Workflow from your Onboarding Workflow eliminates the need for you to manually activate it.",o().createElement("p",null,"Open your Onboarding Workflow"),"Add an Action",o().createElement("ul",null,o().createElement("li",null,o().createElement("strong",null,"Action:")," Start a Workflow"),o().createElement("li",null,o().createElement("strong",null,"Template:")," Fulfillment workflow"),o().createElement("li",null,o().createElement("strong",null,"Prompt:")," Start it automatically"),o().createElement("li",null,o().createElement("strong",null,"When:")," On Base date")),o().createElement("p",null,"Don’t want it to trigger on your Base (Project) date? You can either adjust the number of days before or after the base date or change the Base Date from the Project Page once it is activated."),o().createElement("p",null,"Now, your Fulfillment Workflow will start as soon as you need it to kick in."),o().createElement(l.A,{alwaysShow:!0,id:"fulfillment_connect_workflow",dependsOn:"fulfillment_trigger_workflow_from_workflow",completeDependencies:!0},"Yep, my Fulfillment System checks out."))},{label:"Test your entire System",todos:[{label:"from beginning to end",id:["add_4_workflows_to_project","fulfillment_test_system"]}],description:o().createElement("div",null,"Now that all your Systems are set up, you have your process and client experience outlined and ready to go. Take the time to run through it from beginning to end.",o().createElement("p",null,"Fill out a Lead Capture Form as a new Lead. From there go through all your steps and all your systems. Your Workflows are linked, so everything should transition smoothly."),o().createElement("p",null,"While looking at the internal flow, see it from the Client’s point of view, and make adjustments as needed directly to your templates. Pay attention to the activity on the Dashboard, Project Page and the Calendar. Now is the time to perfect your Systems."),o().createElement(l.A,{alwaysShow:!0,id:"fulfillment_test_system",dependsOn:"add_4_workflows_to_project",completeDependencies:!0},"Yes, all Systems a go!"))}],description:o().createElement("div",null)}]}},"./src/app/components/EDU/LeadSection.jsx":(e,t,n)=>{"use strict";n.d(t,{A:()=>p});var a=n("./node_modules/react/react.js"),o=n.n(a),l=n("./src/app/components/EDU/EDULink.jsx"),i=n("./src/app/components/EDU/EDUCheckbox.jsx"),r=n("./src/app/services/EducationService.js");const s=[{label:"Organize",labelExtra:" – Create the building blocks of your system",value:"lead-organize",icon:"fa fa-cog",className:"edu-section-lead-organize",append:o().createElement("div",{className:"edu-time-label-wrapper"},o().createElement("i",{className:"fa fa-clock-o"}),o().createElement("span",{className:"edu-time-label"},"20 minutes"))},{label:"Systemize",labelExtra:" – Let’s build your Workflow",value:"lead-systemize",icon:"fa fa-cog",className:"edu-section-lead-systemize",append:o().createElement("div",{className:"edu-time-label-wrapper"},o().createElement("i",{className:"fa fa-clock-o"}),o().createElement("span",{className:"edu-time-label"},"5 minutes"))},{label:"Implement",labelExtra:" – Connect and Test",value:"lead-implement",icon:"fa fa-cog",className:"edu-section-lead-implement",append:o().createElement("div",{className:"edu-time-label-wrapper"},o().createElement("i",{className:"fa fa-clock-o"}),o().createElement("span",{className:"edu-time-label"},"10 minutes"))}],c={parentModuleClassName:"edu-module-lead_management"},d=Object.assign({},c,{parentSectionClassName:"edu-section-lead-organize"}),u=Object.assign({},c,{parentSectionClassName:"edu-section-lead-systemize"}),m=Object.assign({},c,{parentSectionClassName:"edu-section-lead-implement"}),p={description:o().createElement("div",null,o().createElement("p",null,"Organize, systemize, and automate your Lead Management System and never worry about missing a Lead again."),o().createElement("p",null,"It’s as easy as capture (using a Lead Capture Form), respond (with a Questionnaire and Email), and follow-up (with a phone call); and with automation 17hats will do 80% of the work for you. Now let's create your Lead Management System.")),suffix:o().createElement("p",null,o().createElement("strong",null,"Congratulations, your new Lead Management System is now ready to go!")),menuItems:s,sections:[{tasks:[{label:"Lead Capture Form (LCF)",todos:[{label:o().createElement("span",null,"Create your ",o().createElement("a",{onClick:()=>r.eduDeeplinkClick("/app/leads/capture",d)},"Lead Capture Form")),id:"create_lcf"}],description:o().createElement("div",null,"Your LCF is an easy way for potential Clients to contact you from your website. You can also add the URL from “View Form” to other places online such as Facebook Messenger auto-responder. And, when a Lead calls, just open the form and complete it yourself.",o().createElement("p",null,"This way you know you always get the information you need right from the start. And, when the form is completed, 17hats will automatically create a Contact and a Project."),o().createElement("p",null,"Your ",o().createElement(l.A,{id:"view_lcf_example"},"LCF should consist of four to six questions"),": Name, Email Address, Phone Number, Referral Source (How did you hear about me?) and, if applicable, Services Interested In and Event Date (which populates as the Project Date)."))},{label:"Questionnaire Template",todos:[{label:o().createElement("span",null,"Create a ",o().createElement("a",{onClick:()=>r.eduDeeplinkClick("/app/account/templates",d)},"Questionnaire Template")," to vet your Client"),id:"lead_create_questionnaire_template"}],description:o().createElement("div",null,"Through a Questionnaire, you can make sure a Lead is the right fit. Too often, a bad fit can take up too much time and too much energy! Think of it like an interview process. After reading the answers, you may think, “Yes, this is going to be a great client!” Or, “Nope, too many red flags!”",o().createElement("p",null,o().createElement(l.A,{id:"view_questionnaire_example"},"Four to six questions")," should be enough to help you have a better understanding of your Leads’ needs. We suggest questions that are open-ended. For example, “Please describe ...” or “What are your main concerns regarding ...”"),o().createElement(i.A,{id:"lead_create_questionnaire_template",dependsOn:"create_questionnaire_template"},"Yes, I created my ",o().createElement("strong",null,"Lead Questionnaire"),"."))},{label:"Email Template",todos:[{label:o().createElement("span",null,"Create an ",o().createElement("a",{onClick:()=>r.eduDeeplinkClick("/app/account/templates",d)},"Email Template")," for your Questionnaire"),id:["lead_create_email_template"]}],description:o().createElement("div",null,"When your Lead completes a LCF, an automatic response will be sent. This Email will contain a link to your Questionnaire (which you created above). When creating this Email, for “Type:”, select “Questionnaire Email”. This way a link to your Questionnaire will ",o().createElement(l.A,{id:"view_questionnaire_email_example"},"automatically be added to the bottom of your Email"),".",o().createElement("p",null,'Create your Email message to include a "thank you for contacting me" paragraph, info about your service/product, average sale information, and a clear call to action such as “I am excited to learn more about. Please complete the questionnaire below, and I will give you a call to further discuss details.” Don’t forget to add Tokens for personalization!'),o().createElement(i.A,{id:"lead_create_email_template",dependsOn:"create_email_template_questionnaire"},"Yes, I created my ",o().createElement("strong",null,"Lead Questionnaire Email"),"."))}],description:o().createElement("div",null,o().createElement("p",null,"The first step is to always get organized, which we will do by creating all the pieces of your system."),o().createElement("p",null,"We realize this might sound daunting, but we can guarantee by sitting down and getting this done, your life and business will become easier. No more responding to Leads in the middle of the night; better yet, no more letting a Lead slip through the cracks. Each Lead responded to within seconds ... every ... single ... time! And, you don’t even lift a finger."))},{tasks:[{label:"Create Lead Workflow",todos:[{label:"Create your Workflow Template",link:"/app/workflows/templates",id:["create_workflow","lead_create_lead_workflow"]}],description:o().createElement("div",null,"Start with a descriptive name (such as “Revenue Stream - Lead Management”) and select your “Leads” calendar. Now we will create two items. First, an Action Item to send your Questionnaire, and then a To Do Item, which will remind you to call your Lead.",o().createElement("p",null,"1) Add an Action Item for your Questionnaire with the following settings:",o().createElement("ul",null,o().createElement("li",null,o().createElement("strong",null,"Action"),": Send Questionnaire"),o().createElement("li",null,o().createElement("strong",null,"Template"),": Select your Questionnaire Template created"),o().createElement("li",null,o().createElement("strong",null,"Email"),": Select the Email Template created"),o().createElement("li",null,o().createElement("strong",null,"Prompt"),": Send Automatically"),o().createElement("li",null,o().createElement("strong",null,"When"),": 0 days after activating the Workflow"),o().createElement("li",null,o().createElement("strong",null,"Completed"),": When answered"))),o().createElement("p",null,"2) Add a To Do Item for your phone call with the following settings:",o().createElement("ul",null,o().createElement("li",null,o().createElement("strong",null,"To Do"),": “Call Lead”"),o().createElement("li",null,o().createElement("strong",null,"Due Date"),": 1 day after previous item is completed"))),o().createElement("p",null,"In your follow-up call you can discuss the talking points from the Questionnaire and book your Project Date or consultation. Getting them on the phone after they have been vetted will ensure you are using your time wisely by only talking to people truly interested and not just price shopping."),o().createElement("p",null,o().createElement("strong",null,"Having a hard time remembering the steps above?")," Open two tabs in your browser. One tab so that you can see the instructions and another to navigate through the app."),o().createElement(i.A,{id:"lead_create_lead_workflow",dependsOn:"create_workflow",completeDependencies:!0},"Yes, I have created my ",o().createElement("strong",null,"Workflow"),"."))},{label:"Trigger Workflow",todos:[{label:o().createElement("span",null,"Adjust your ",o().createElement("a",{onClick:()=>r.eduDeeplinkClick("/app/leads/capture",u)},"Lead Capture Form")," to trigger your Workflow"),id:"set_lcf_to_trigger_workflow"}],description:o().createElement("div",null,"Triggering a Workflow when an LCF is submitted allows for every Lead to receive a personalized Email within seconds. Now Leads will be taken care of when you are focusing on other tasks or when you are spending time with your family.",o().createElement("p",null,o().createElement(l.A,{id:"view_edit_lcf"},"Edit your Lead Capture Form")," you previously made. Select your Workflow name under Workflow. Once you save it, your Workflow will automatically start by sending your first Email with the Questionnaire to your Lead. How awesome is that?"))}],description:o().createElement("div",null,"Workflow – ",o().createElement(l.A,{id:"view_workflow_example"},"You might have heard of it, but what is it?"),o().createElement("p",null,"A Workflow is a checklist of To Do and Action Items that you need to complete for each Contact/Project."),"Creating a Workflow allows you to:",o().createElement("ol",null,o().createElement("li",null,"Know what stage your Lead/Client is in."),o().createElement("li",null,"Automate your steps."),o().createElement("li",null,"Know exactly what to do and the date it needs to be done.")),o().createElement("p",null,"Once a Workflow for each system is completed, you will be able to wake up, open 17hats and know exactly what to do for that day. No more pressure of everything has to be completed today, right now. Know what to do and when to do it! #takebackcontrol"))},{tasks:[{label:"Install LCF",todos:[{label:o().createElement("span",null,"Install your ",o().createElement("a",{onClick:()=>r.eduDeeplinkClick("/app/leads/capture",m)},"Lead Capture Form")," on your website"),id:["lcf_installed","lcf_installed_checkbox"]}],description:o().createElement("div",null,"Installing your LCF allows for a consistent, efficient and easy way for your Leads to contact you.",o().createElement("p",null,"Go to your LCF and click ",o().createElement(l.A,{id:"view_install_lcf"},"“Install”"),". The easiest method is to use the ",o().createElement("strong",null,"Link To The 17hats Form"),". You can place this link on your website, usually as a Contact button. But, you also use that link in your Facebook Messenger auto-responder. If you prefer, you can insert the form on your website as well."),o().createElement("p",null,"Need help? Our support staff is standing by ready to answer your questions. Just click the icon in the bottom right corner. You can email us at ",o().createElement("a",{target:"_blank",href:"mailto:support@17hats.com",onClick:()=>{window.location.href="mailto:support@17hats.com"}},"support@17hats.com"),"."),o().createElement(i.A,{id:"lcf_installed_checkbox",dependsOn:["lcf_installed"],alwaysShow:!0,completeDependencies:!0},"I have installed my Lead Capture Form."))},{label:"Test",todos:[{label:"See your Lead Management System in action",id:["lcf_submitted","lcf_workflow_triggered","questionnaire_submitted","lead_test_lead"]}],description:o().createElement("div",null,"To test, go to a place where you installed it or click “View Form” on your LCF page.",o().createElement("p",null,o().createElement(l.A,{id:"view_lcf_steps"},"Now go through each step. Submit the Lead Capture Form, view the Lead for the Lead tab, and complete the Questionnaire. Get to know your system and think about how you can improve it.")),o().createElement("p",null,"Pay attention to the Dashboard (Recent Client Activity and Pending Items), Project Page, Leads Tab and Calendar as you walk through the steps."),o().createElement(i.A,{id:"lead_test_lead",dependsOn:["lcf_submitted","lcf_workflow_triggered","questionnaire_submitted"],completeDependencies:!0},"My Lead Management System rocks."))}],description:"\nNow that your system is created, it is time to test it to make sure everything is working correctly. Because you will be able to experience it from the perspective of a business owner and lead, now is the perfect time to make adjustments.\n"}]}},"./src/app/components/EDU/OnboardingSection.jsx":(e,t,n)=>{"use strict";n.d(t,{A:()=>s});var a=n("./node_modules/react/react.js"),o=n.n(a),l=n("./src/app/components/EDU/EDULink.jsx"),i=n("./src/app/components/EDU/EDUCheckbox.jsx");const r=[{label:"Organize",labelExtra:" – Create the building blocks of your system",value:"onboarding-organize",icon:"fa fa-cog",className:"edu-section-onboarding-organize",append:o().createElement("div",{className:"edu-time-label-wrapper"},o().createElement("i",{className:"fa fa-clock-o"}),o().createElement("span",{className:"edu-time-label"},"20 minutes"))},{label:"Systemize",labelExtra:" – Let’s build your workflow template",value:"onboarding-systemize",icon:"fa fa-cog",className:"edu-section-onboarding-systemize",append:o().createElement("div",{className:"edu-time-label-wrapper"},o().createElement("i",{className:"fa fa-clock-o"}),o().createElement("span",{className:"edu-time-label"},"5 minutes"))},{label:"Implement",labelExtra:" – Connect and Test your workflow",value:"onboarding-implement",icon:"fa fa-cog",className:"edu-section-onboarding-implement",append:o().createElement("div",{className:"edu-time-label-wrapper"},o().createElement("i",{className:"fa fa-clock-o"}),o().createElement("span",{className:"edu-time-label"},"10 minutes"))}],s={description:o().createElement("div",null,o().createElement("p",null,"Your Onboarding System will establish your business as knowledgeable and professional by preparing yourself and your Clients for what is yet to come. Starting at the time of booking and running through the Project Date, the goal is to familiarize your Client with you and vice versa. This will eliminate random questions leading up the Project, and will make your Client feel confident in you and your Services."),"By creating your Client Onboarding System you will:",o().createElement("ol",null,o().createElement("li",null,"Send Emails to educate your Clients on your experience"),o().createElement("li",null,"Send Questionnaires to gather information"),o().createElement("li",null,"Introduce Client Portal to point them to a place where all important information lives")),o().createElement("p",null,"Through your system you will build their confidence in you as well as in themselves, save yourself a ton of time, and deliver an exceptional experience."),o().createElement("p",null,"Let’s take a look at your Client Onboarding System.")),suffix:o().createElement("p",null,o().createElement("strong",null,"Congratulations, your new Client Onboarding System is now ready to go!")),menuItems:r,sections:[{tasks:[{label:"Create a List",todos:[{label:o().createElement("span",null,"Think about your ",o().createElement(l.A,{id:"view_client_and_your_needs"},"Client’s and your needs")),id:"onboarding_create_list"}],description:o().createElement("div",null,"First, let's brainstorm. What you need to know from your Clients in order to successfully fulfill your Service or Product? What do they need to know in preparation or to calm their nerves? How many times do you want to contact them? Once right before the Project or multiple times leading up to the Project?",o().createElement("p",null,"Now, let's create your list. Some examples:",o().createElement("br",null),"If you are a dog walker, you could send one Questionnaire about the personality and type of dog as that will help you know if you can walk the dog with other dogs."),o().createElement("p",null,"If you are an event planner, maybe you have an educational Email each month until the Project Date. That helps your Clients better prepare. As the date gets closer, send out a few Questionnaires to better understand their needs."),o().createElement(i.A,{id:"onboarding_create_list",show:!0},"Yes, I created my list."))},{label:"Client Portal",todos:[{label:"Customize Client Portal",link:"/app/account/client_portal",id:"customize_client_portal"}],description:o().createElement("div",null,"Let’s eliminate the need to resend Documents by allowing your Clients access to their own ",o().createElement(l.A,{id:"view_client_portal"}," Client Portal"),". They can access and complete Documents as well as view Event Details and Information.",o().createElement("p",null,"From your Account Settings, customize the universal settings by creating a welcome message and adding a header image. Your Client will not have access to the Client Portal until you tell them via Email (which we will do below)."))},{label:"Questionnaire Template",todos:[{label:"",id:"create_questionnaire_template_with_related_contact"},{label:"",id:"create_questionnaire_with_required_question"},{label:"",id:"create_questionnaire_with_link"},{label:"Create custom templates",link:"/app/account/templates",id:"onboarding_create_questionnaire_template"}],description:o().createElement("div",null,"Looking back at your list, create the Questionnaire templates needed to gather information from your Clients.",o().createElement("ul",null,o().createElement("li",null,"You can add a ",o().createElement(l.A,{manual:!0,clickable:!1,id:"create_questionnaire_template_with_related_contact"},"“Related Contact”")," question to gather details for emergency contacts or other important people involved in the Project."),o().createElement("li",null,"Mark ",o().createElement(l.A,{manual:!0,clickable:!1,id:"create_questionnaire_with_required_question"},"“Required Questions“"),", so they cannot submit the Questionnaire with completing them. "),o().createElement("li",null,"Add a Link for reference by adding ",o().createElement(l.A,{manual:!0,clickable:!1,id:"create_questionnaire_with_link"},"“Static”")," and inserting the link there.")),o().createElement("p",null,"Keep Questionnaires timely and relevant as you may not need all the information at one time.  For example, if you are a wedding planner, don’t ask for all the wedding details 9 months prior to the wedding as the bride may not have many of the details yet. What are the relevant questions for today? If you haven’t already, really think about your ",o().createElement(l.A,{id:"click_blog_client_journey"},"client's journey"),", and how your experience fits into it."),o().createElement(i.A,{id:"onboarding_create_questionnaire_template",dependsOn:"create_questionnaire_template"},"Yes, I created my ",o().createElement("strong",null,"Questionnaire template"),"."))},{label:"Email Template",todos:[{label:"Create your Template",suffix:", ",link:"/app/account/templates",id:"onboarding_create_email_template"},{label:"Add token for Client Portal URL",link:"/app/account/templates",id:"create_email_with_client_portal"}],description:o().createElement("div",null,"Communicating with Clients prior to the Project date creates an exceptional (rave-worthy) experience. Write your messages as if you are walking them through each step. Keep it simple with one call to action (or thing you want them to do) per Email. Then by the time the Service is provided or the Project starts, everyone is prepared for an exceptional experience.",o().createElement("p",null,"In your ",o().createElement(l.A,{id:"view_first_email"},"first email"),", confirm your Project Details and introduce them to their Client Portal. Just add the Token, [client-portal] Client Portal URL, within the message and your Client’s unique URL will populate allowing them access to their Client Portal."),o().createElement("p",null,"Create Templates to send your Questionnaires (Type - Questionnaire email). And, create Templates for other Email communications (Type - Regular email). Make sure to use Tokens to add details about the Contact, Project and/or your own business."),o().createElement(i.A,{id:"onboarding_create_email_template",dependsOn:"create_email_template"},"Yes, I created my ",o().createElement("strong",null,"Email template"),"."))}],description:o().createElement("div",null,o().createElement("p",null,"Do you have an ",o().createElement(l.A,{id:"click_blog_onboarding"},"Onboarding Experience"),"? If not, now is the time to implement one."))},{tasks:[{label:"Plan your Workflow",todos:[{label:o().createElement("span",null,o().createElement(l.A,{id:"view_make_list_and_add_dates"},"Make a list and add dates")),image:"/images/client-portal-preview.png",id:"onboarding_make_list_and_add_dates"}],description:o().createElement("div",null,"Go back to the blank white sheet of paper and plan it out. Write down all Documents you are sending, educational Emails, introduction to tools (Client Portal) and your To Dos (making a phone call, social media shout out).",o().createElement("p",null,"Think about when you would like items completed. You can select an amount of days before, on or after a Base Date  (Project Date). Having it all planned out will make building your Workflow much easier."),o().createElement(i.A,{id:"onboarding_make_list_and_add_dates"},"Yes, I created my list."))},{label:"Build your Onboarding Workflow",todos:[{label:"Add value to your experience without lifting a finger",link:"/app/workflows/templates",id:"onboarding_build_workflow"}],description:o().createElement("div",null,"Start with a descriptive name (such as “[Revenue Stream] - Onboarding”) and select your “To Do” calendar.",o().createElement("p",null,"Everyone’s ",o().createElement(l.A,{id:"view_workflow_examples"},"Workflow will look different"),", some will start with a Questionnaire and others with an Email."),o().createElement("p",null,"Add your first Action item to your Workflow.",o().createElement("ul",null,o().createElement("li",null,o().createElement("strong",null,"Prompt:")," Send Automatically"),o().createElement("li",null,o().createElement("strong",null,"When:")," 0 days after activating the Workflow"),o().createElement("li",null,o().createElement("strong",null,"Completed:")," When all items have been completed"))),o().createElement("p",null,'Continue to add the other Emails and Questionnaires until your process is documented - step by step. You can also add to do items such as "send the client a gift", "welcome phone call", or "meeting".'),o().createElement(i.A,{id:"onboarding_build_workflow",dependsOn:"create_simple_workflow",completeDependencies:!0},"Got it. Action item added to ",o().createElement("strong",null,"Workflow"),"."))}],description:o().createElement("div",null,o().createElement("p",null,"Systemizing and automating your onboarding Emails will allow for the continuation of the Project without you ever lifting a finger. Your Clients will think you have it under control and are on top of things."),o().createElement("p",null,"They will feel like they are the most important Client, even though reality is you never lifted a finger ... heck, you might even forget they were sent out. Ssshhhhhh ... we won’t tell them if you don’t."))},{tasks:[{label:"Connect your Workflow",todos:[{label:"Trigger your Onboarding from your Booking Workflow",link:"/app/workflows/templates",id:["onboarding_trigger_workflow_from_workflow","onboarding_connect_workflow"]}],description:o().createElement("div",null,"Triggering a Workflow from a Workflow allows you to fully automate your Systems making sure nothing slips through the cracks and your clients receive information in a timely manner.",o().createElement("p",null,"Open your Booking Workflow."),"Add an Action",o().createElement("ul",{style:{paddingLeft:"30px"}},o().createElement("li",null,o().createElement("strong",null,"Type:")," Start a Workflow"),o().createElement("li",null,o().createElement("strong",null,"Template:")," Onboarding workflow"),o().createElement("li",null,o().createElement("strong",null,"Prompt:")," Approve before sending"),o().createElement("li",null,o().createElement("strong",null,"When:")," 0 days after all previous items are completed")),o().createElement("p",null,"Now, your Onboarding Workflow will start as soon as your Quote, Contract, and Invoice is completed."),o().createElement(i.A,{alwaysShow:!0,id:"onboarding_connect_workflow",dependsOn:"onboarding_trigger_workflow_from_workflow",completeDependencies:!0},"Done! Booking triggers Onboarding now."))},{label:"Test",todos:[{label:"Test your Onboarding System",link:"/app/projects",id:["questionnaire_sent_non_lcf","onboarding_test_workflow"]}],description:o().createElement("div",null,"From Projects, open your test project and add your Onboarding Workflow. Now go through the Email flow as the Client and as the business owner.",o().createElement("p",null,"This is the time to make adjustments to your Templates or steps. Check spelling and tone of your emails. Are you clearly stating what you want them to do and why you want them to do it? Is the timing relevant? Are you creating a rave-worthy client experience?"),o().createElement(i.A,{alwaysShow:!0,id:"onboarding_test_workflow",dependsOn:["questionnaire_sent_non_lcf"],completeDependencies:!0},"Heck yeah – Onboarding is ready to go."))}],description:o().createElement("div",null,o().createElement("p",null,"By this time you know the drill, it is time to connect everything and test to make sure it is all working properly."))}]}},"./src/app/components/EDU/OrganizationSection.jsx":(e,t,n)=>{"use strict";n.d(t,{A:()=>m});var a=n("./node_modules/react/react.js"),o=n.n(a),l=n("./src/app/components/EDU/EDULink.jsx"),i=n("./src/app/services/EducationService.js");const r=[{label:"Settings",value:"organization-settings",icon:"fa fa-cog",className:"edu-section-organization-settings",append:o().createElement("div",{className:"edu-time-label-wrapper"},o().createElement("i",{className:"fa fa-clock-o"}),o().createElement("span",{className:"edu-time-label"},"7 minutes"))},{label:"Account Templates",value:"organization-account_templates",icon:"fa fa-file",className:"edu-section-organization-account_templates",append:o().createElement("div",{className:"edu-time-label-wrapper"},o().createElement("i",{className:"fa fa-clock-o"}),o().createElement("span",{className:"edu-time-label"},"15 minutes"))},{label:"Money Matters",value:"organization-money_matters",icon:"fa fa-money",className:"edu-section-organization-money_matters",append:o().createElement("div",{className:"edu-time-label-wrapper"},o().createElement("i",{className:"fa fa-clock-o"}),o().createElement("span",{className:"edu-time-label"},"5 minutes"))},{label:"Create A Contact",value:"organization-create_contact",icon:"fa fa-user",className:"edu-section-organization-create_contact",append:o().createElement("div",{className:"edu-time-label-wrapper"},o().createElement("i",{className:"fa fa-clock-o"}),o().createElement("span",{className:"edu-time-label"},"2 minutes"))},{label:"Create A Project",value:"organization-create_project",icon:"fa fa-file",mandatoryTodos:["create_contact"],className:"edu-section-organization-create_project",append:o().createElement("div",{className:"edu-time-label-wrapper"},o().createElement("i",{className:"fa fa-clock-o"}),o().createElement("span",{className:"edu-time-label"},"5 minutes"))}],s={parentModuleClassName:"edu-module-organization"},c=Object.assign({},s,{parentSectionClassName:"edu-section-organization-account_templates"}),d=Object.assign({},s,{parentSectionClassName:"edu-section-organization-money_matters"}),u=Object.assign({},s,{parentSectionClassName:"edu-section-organization-create_contact"}),m={description:o().createElement("div",null,"Let’s get organized, ",window.dataModel.accountinfo().account.contact.first_name,"!",o().createElement("p",null,"Are you ready to wake up to the feeling of “I got this!” I hope so, and it’s easier than it sounds. The secret lies in Organization – the first step of taking back control over your day. Say goodbye to printing, paper jams, sticky notes, receipt boxes, and multiple apps. And say hello to life organized. Say it with me... out loud... ",o().createElement("span",{style:{fontWeight:600}},"“Goodbye Chaos! Hello Organization!”")),o().createElement("p",null,"Today is a new day in which your business will run on personalized Templates customized to your Brand, Projects digitally filed just waiting for you to access the organized information of Notes, Documents, and Contact details within. Everything will now be one click away with easy access whether you are on the road or in your office."),o().createElement("p",null,"So enough talk for now. Let’s get started. You are just a few steps away from an easier way to run your business. And, if you ever get stuck, just click the green icon in the lower right hand corner! Our friendly support staff is eager to answer all your questions within minutes! We’re not like all the other supports, we’re the cool support! ;)")),suffix:o().createElement("p",null,o().createElement("strong",null,"Congratulations on getting your account set up!")),menuItems:r,sections:[{tasks:[{label:"My Account Info",todos:[{label:"Enter Cell Phone",link:"/app/account/general/edit",id:"settings_phone"},{label:"Your Address",link:"/app/account/general/edit",id:"settings_address"},{label:"Website",link:"/app/account/general/edit",id:"settings_website"}],description:o().createElement("div",null,"Account Information will be displayed on all Documents your clients see, as well as used within 17hats to set your Location and Time Zone. However, your Cell Phone Number is not visible to clients as it is used for 17hats to send you SMS messages when you get new Leads!")},{label:"Brand Preferences",todos:[{label:"Change Background",link:"/app/account/preferences",id:"settings_background"},{label:"Upload Your Logo",link:"/app/account/preferences/logo",id:"settings_logo"},{label:"Customize Fonts & Colors",link:"/app/account/preferences/colors-and-fonts",id:"settings_customize_brand"}],description:o().createElement("div",null,"We make you look good! Customization will be seen on your Documents (Questionnaires, Quotes, Contracts, Invoices) as well as Lead Capture Forms and your Client Portal. This keeps your Brand Experience consistent from start to finish.")},{label:"Email Settings",todos:[{label:"Setup 17hats to Send and Receive Emails",link:"/app/account/emailaccounts",id:"settings_email_account"},{label:"Create an Email Signature",link:"/app/account/emailaccounts/signatures",id:"settings_email_signature"}],description:o().createElement("div",null,"Send, receive, schedule, and respond to Emails directly from 17hats. Now your Emails are tied to your Client’s Project, keeping everything in one place and easy to find. You can further customize your Emails by creating a ",o().createElement(l.A,{id:"view_email_signature_examples"},"professional Email Signature"),".")},{label:"Calendar",todos:[{label:"Connect Your Google Calendar or Create New Calendars",link:"/app/account/calendar_sync",id:"settings_create_calendar"}],description:o().createElement("div",null,"Organize your schedule by creating different Calendars. We highly recommend a ",o().createElement(l.A,{id:"view_calendar_examples"},"Leads Calendar"),", as we will reference it later. Other possible Calendars: To Do, Marketing, Family and/or one calendar for each revenue stream (Spa Service, Walking Service, etc.).")}],description:"Your Settings are the first steps to getting your business up and running on 17hats.\nYour Brand Preferences give you a cohesive Brand look while your Email and Calendar setup allows to you to send\ncommunications and organize your day."},{tasks:[{label:"Email Templates",todos:[{label:o().createElement("span",null,"Create your ",o().createElement("a",{onClick:()=>i.eduDeeplinkClick("/app/account/templates",c)},"Email Templates")),id:"create_email_template"}],description:o().createElement("div",null,"Never again will you need to rewrite the same email. Save hours a week by creating Email Templates for client communication and sending your Documents.",o().createElement("p",null,"Oh, if you are creating an Email to send a Document, please select the appropriate ",o().createElement(l.A,{id:"view_email_type"},"Email type"),"."))},{label:"Document Templates",todosPrefix:"Create your ",todosSuffix:" Templates",todos:[{label:"Questionnaire",link:"/app/account/templates",id:"create_questionnaire_template"},{label:"Quote",link:"/app/account/templates",id:"create_quote_template"},{label:"Contract",link:"/app/account/templates",id:"create_contract_template"}],description:o().createElement("div",null,"Moving from paper to ",o().createElement(l.A,{id:"view_electronic_documents"},"electronic Documents")," can be a big step, and one that is so worth taking. You will be able to easily send Documents and quickly access completed ones from anywhere. No more searching, printing, filing, or misplacing.")}],description:o().createElement("div",null,o().createElement("p",null,"This is life-changing! If you don’t use Templates yet, the time spent creating Templates will be returned ten-fold... IN THE FIRST MONTH!"),o().createElement("p",null,"Think about all the Emails and Documents you send to Clients and take the time to create a Template for each of them. With the use of ",o().createElement(l.A,{id:"view_email_tokens"},"Tokens"),", you can make these Templates feel personalized."),o().createElement("p",null,"Not sure which Templates to create? Don’t stress. Go ahead and skip this section and we will be more specific when we get to the other systems below."))},{tasks:[{label:"Bookkeeping Options",todosPrefix:"",todos:[{label:o().createElement("span",null,"Add your ",o().createElement("a",{onClick:()=>i.eduDeeplinkClick("/app/account/sales_tax",d)},"Sales Tax Rate")),id:"tax_rate"},{label:o().createElement("span",null,"Create your ",o().createElement("a",{onClick:()=>i.eduDeeplinkClick("/app/account/banks",d)},"Transaction Categories")),id:"transaction_categories"}],description:o().createElement("div",null,"A strong business requires knowing your numbers. Add your Sales Tax Rate, so it reflects on Quotes and Invoices. Create your ",o().createElement(l.A,{id:"view_transaction_category_example"},"Transaction Categories")," to know where your money is coming from, and where it is going. We recommend adding an income category for each revenue stream you offer.")},{label:"Products and Services",todos:[{label:o().createElement("span",null,"Add your ",o().createElement("a",{onClick:()=>i.eduDeeplinkClick("/app/account/products",d)},"Products and Services")),id:"products_services"}],description:o().createElement("div",null,o().createElement(l.A,{id:"view_products_example"},"Your Products and Services")," are the building blocks for your Quotes and Invoices. Add at least three, if not all of them, now. Make sure you tie them back to a Transaction Category to immediately see which Service makes you the most money.")},{label:"Time Tracking",todos:[{label:o().createElement("span",null,"Enable ",o().createElement("a",{onClick:()=>i.eduDeeplinkClick("/app/account/rates/settings",d)},"Time Tracking")),id:"time_tracking"}],description:o().createElement("div",null,"Do you bill Clients for your time? When you Enable Time Tracking, with the ",o().createElement(l.A,{id:"time_tracking_video"},"click of a button, you will be able to create and send Invoices to your Client."),o().createElement("p",null,"Don’t bill Clients based on time?  Use it to track your time on a Project to ensure you are charging your Clients enough!"))},{label:"Invoice Options",todos:[{label:o().createElement("span",null,"Confirm your Currency settings and setup a ",o().createElement("a",{onClick:()=>i.eduDeeplinkClick("/app/account/payment",d)},"Payment Processor")),id:"setup_payment_processor"}],description:o().createElement("div",null,"Turning on Online Payments means getting paid faster. You may even be able to charge higher prices as people are willing to spend more money through the use of a credit card.",o().createElement("p",null,"Don’t know which Processor to use? We recommend Square or Stripe!"))}],description:"At the end of the day money does matter when running a business. By setting your foundation, Quotes, Invoices, and Bookkeeping all become a breeze."},{tasks:[{label:"Contacts Tab",todos:[{label:o().createElement("span",null,"Add yourself as a ",o().createElement("a",{onClick:()=>i.eduDeeplinkClick("/app/contacts",u)},"Test Contact")),id:"create_contact"}],description:o().createElement("div",null,"We highly recommend adding yourself as a Test Contact. This allows you to test sending Emails and Documents, as well as, the systems below.",o().createElement("p",null,"Seeing the experience from the perspective of a Client will help you improve it. When adding yourself as a Test Contact ",o().createElement("strong",{style:{textDecoration:"underline"}},"DO NOT use the same email address as your 17hats account"),". It will get confusing quickly!"))}],description:o().createElement("div",null,"Your Contacts are the lifeline of your business. Leads turn into paying Clients and Clients to raving fans.",o().createElement(l.A,{id:"view_contact_blog_post"}," Vendors, Contractors, and Marketing Friends ")," are also important Contacts to be able to find quickly.")},{tasks:[{label:"Contacts Tab",todos:[{label:"Create A Test Project",link:"/app/contacts",id:"create_project"}],description:"From the Contacts Tab, select your Test Contact and create a Test Project.\n    Projects revolve around the date of your service, so go ahead and populate your Test Project."},{label:"Project’s Page",todos:[{label:"Document",link:"/app/projects",prefix:"Add a ",id:"add_project_document"},{label:"Note",link:"/app/projects",id:"add_project_note"},{label:"Event",link:"/app/projects",id:"add_project_event"}],description:o().createElement("div",null,"While in your Test Project, add a ",o().createElement(l.A,{id:"view_project_video"},"Document, Note, and Event")," and take the time to familiarize yourself with the Project's page.",o().createElement("p",null,"An Event can be anything with a scheduled amount of time, such as a Meeting or a Client Phone Call. When adding Events, check out your Calendar to see how they populate."))}],description:"Think of your Project as a manila folder inside of the Contact’s hanging folder.\nEach Contact can have multiple Projects (or manila folders). And, within those Projects will be all the Project\ndetails from date and time, to Documents, Notes, and Related Contacts."}]}},"./src/app/components/general/Accordion.jsx":(e,t,n)=>{"use strict";n.d(t,{A:()=>u});var a=n("./node_modules/react/react.js"),o=n.n(a),l=n("./node_modules/prop-types/index.js"),i=n.n(l),r=n("./node_modules/autobind-decorator/lib/esm/index.js"),s=n("./node_modules/classnames/index.js"),c=n.n(s);class d extends a.PureComponent{static displayName="Accordion";static propTypes={style:i().object,items:i().array,height:i().string,spacing:i().string,children:i().node,selectedIndex:i().number,onSelect:i().func,onUnselect:i().func,collapsible:i().bool};static defaultProps={color:"primary",size:"md",spacing:"0px",collapsible:!1};state={selectedIndex:0};componentWillMount(){void 0!==this.props.selectedIndex&&this.setState({selectedIndex:this.props.selectedIndex})}componentWillReceiveProps(e){e.selectedIndex!==this.props.selectedIndex&&this.setState({selectedIndex:e.selectedIndex})}onClick(e,t){if(!this.props.disabled&&!e.disabled){if(this.props.collapsible&&t===this.state.selectedIndex)return this.setState({selectedIndex:-1}),void(this.props.onUnselect&&this.props.onUnselect(e,t));this.setState({selectedIndex:t}),this.props.onSelect&&this.props.onSelect(e,t)}}render(){const{items:e,children:t,style:n}=this.props,{selectedIndex:a}=this.state,l=c()(["hats-accordion",{"hats-accordion-disabled":this.props.disabled},this.props.className||""]);return o().createElement("div",{className:l,style:n},e.map(((e,n)=>{const l=n===a,i=o().createElement("div",{className:c()(["hats-accordion-header",{"hats-accordion-header--disabled":e.disabled},e.className||"",{"hats-accordion-header--completed":e.completed}]),key:`item-${n}`,onClick:()=>this.onClick(e,n)},e.prepend&&o().createElement("span",null,e.prepend),o().createElement("i",{className:e.icon}),o().createElement("label",null,e.label,l&&(e.labelExtra||"")),o().createElement("div",{className:"flex-spacer"}),e.append&&o().createElement("span",null,e.append),o().createElement("span",{style:{display:"flex"}},!l&&o().createElement("i",{className:"caret caret-down"}),l&&o().createElement("i",{className:"caret caret-up"}))),r=t[n];return o().createElement("div",{className:c()(["hats-accordion-item",{"hats-accordion-item--disabled":e.disabled},{"hats-accordion-item--active":l},{"hats-accordion-item--parent-active":this.props.parentActive}]),key:n},i,o().createElement("div",{className:c()(["hats-accordion-content",{"hats-accordion-content--disabled":e.disabled}])},r))})))}}const u=(0,r.Zw)(d)},"./src/app/components/general/ImageViewer.jsx":(e,t,n)=>{"use strict";n.d(t,{A:()=>d});var a=n("./node_modules/react/react.js"),o=n.n(a),l=n("./node_modules/prop-types/index.js"),i=n.n(l),r=n("./node_modules/autobind-decorator/lib/esm/index.js"),s=n("./src/app/utils/router.js");class c extends a.Component{static propTypes={items:i().array,metadata:i().object,download:i().bool,deletable:i().bool};static defaultProps={items:[],metadata:{},download:!0,deletable:!0};state={pos:0};componentWillMount(){this.setState({items:this.props.items})}next(){let e=this.state.pos+1;e>this.state.items.length-1&&(e=this.state.items.length-1),this.setState({pos:e})}prev(){let e=this.state.pos-1;e<0&&(e=0),this.setState({pos:e})}async delete(){let e=this.getItem();if(confirm("Are you sure you want to delete this receipt?")){this.props.onDelete&&await this.props.onDelete(e);let t=this.state.items.concat([]);t.splice(this.state.pos,1),t.length||this.props.onClose&&this.props.onClose(!0),this.setState({items:t,itemsLength:t.length})}}getItem(){return this.state.items[this.state.pos]}gotoLink(e){(0,s.navigateTo)(e),this.props.onClose&&this.props.onClose()}render(){const{items:e,pos:t}=this.state,{download:n,deletable:a}=this.props,l=this.getItem();if(!l)return null;let i="sm";"xs"===dataModel.deviceType()&&(i="md");let r=l;"object"==typeof r&&(r=r.uri);const s=void 0!==l.vimeo;let c,d,u;if(r){if(d=r.endsWith(".pdf"),d){u=r,pdfjsLib.GlobalWorkerOptions.workerSrc=pdfjsWorker;var m=null,p=1,h=!1,g=null;function f(e){document.getElementById("next").addEventListener("click",b),document.getElementById("prev").addEventListener("click",w);var t=document.getElementById("the-canvas"),n=t.getContext("2d");h=!0,m.getPage(e).then((function(e){var a=e.getViewport({scale:1.5});t.height=a.height,t.width=a.width;var o={canvasContext:n,viewport:a};e.render(o).promise.then((function(){h=!1,null!==g&&(f(g),g=null)}))})),document.getElementById("page_num").textContent=e}function y(e){h?g=e:f(e)}function w(){p<=1||y(--p)}function b(){p>=m.numPages||y(++p)}pdfjsLib.getDocument({url:r,httpHeaders:{cookie:document.cookie},withCredentials:!0}).promise.then((function(e){m=e,document.getElementById("page_count").textContent=m.numPages,f(p)}))}else u=`https://docs.google.com/gview?embedded=true&url=${r}?inline=true`;c=r.endsWith(".mov")||r.endsWith(".mp4")}return o().createElement("div",{className:"image-viewer"},o().createElement("div",{className:"receipt-viewer-toolbar list-horizontal spaced"},n&&o().createElement("a",{className:"icon-button",href:l.uri},o().createElement("i",{className:"icomoon-download"}),o().createElement("span",null,"Download")),a&&o().createElement("a",{className:"icon-button",onClick:this.delete},o().createElement("i",{className:"icomoon-trash"}),o().createElement("span",null,"Delete"))),d&&o().createElement("div",null,o().createElement("div",{className:"d-flex justify-content-center align-items-center"},o().createElement("i",{id:"prev",className:"fas fa-chevron-left px-3"}),o().createElement("span",null,"Page: ",o().createElement("span",{id:"page_num"})," / ",o().createElement("span",{id:"page_count"})),o().createElement("i",{id:"next",className:"fas fa-chevron-right px-3"})),o().createElement("canvas",{frameBorder:"0",style:{width:"100%",height:"700px",objectFit:"contain"},id:"the-canvas"})),c&&o().createElement("div",{className:"video-viewer-box"},o().createElement("video",{autoPlay:!0,src:r})),s&&o().createElement("iframe",{src:`https://player.vimeo.com/video/${l.vimeo}`,width:"700",height:"351",frameBorder:"0",style:{marginBottom:"-4px"},allowFullScreen:!0}),!c&&!d&&!s&&o().createElement("div",{className:"image-viewer-box",style:{backgroundImage:`url(${r})`}}),l.link&&o().createElement("div",{className:"image-viewer-link-footer"},o().createElement("a",{onClick:()=>this.gotoLink(l.link)},l.linkLabel)),o().createElement("div",{className:"image-viewer-footer"},o().createElement("div",{className:"image-viewer-info"},o().createElement("dl",{className:"image-viewer-info-list"},this.props.info&&this.props.info.map(((e,t)=>{let n,a=e.value;if(e.value.startsWith("timestamp:")){n=e.value.split(":");let t=l[n[1]];a=t?`${dataModel.parseDate(t,"MMM d, yyyy @ h:mm tt")}`:"-"}return e.value.startsWith("v:")&&(n=e.value.split(":")[1],l[n]&&(a=l[n])),e.value.startsWith("filesize:")&&(n=e.value.split(":")[1],l[n]&&(a=plupload.formatSize(l[n]))),o().createElement("div",{key:t,className:"image-viewer-info-list-item"},o().createElement("label",null,e.label,":"),o().createElement("span",null,a))})))),e.length>1&&o().createElement("div",{className:"image-viewer-pagination"},e.length>1&&o().createElement("a",{className:`btn btn-primary-hover circle icon ${i} btn-prev`,onClick:this.prev},o().createElement("i",{className:"icon icon-arrow-left"})),o().createElement("span",{className:"image-viewer-pagination-text"},t+1," of ",e.length),e.length>1&&o().createElement("a",{className:`btn btn-primary-hover circle icon ${i} btn-next`,onClick:this.next},o().createElement("i",{className:"icon icon-arrow-right"})))))}}const d=(0,r.Zw)(c)},"./src/app/components/general/power-bar/PowerBar.jsx":(e,t,n)=>{"use strict";n.d(t,{A:()=>s});var a=n("./node_modules/react/react.js"),o=n.n(a);class l extends a.PureComponent{render(){const e={flexGrow:this.props.completedPercentage},t={zIndex:this.props.zIndex};return o().createElement("div",{className:"powerbar-progress",style:t},o().createElement("div",{className:"powerbar-progress-pipe powerbar-not-completed"},o().createElement("div",{className:"powerbar-completed",style:e})),o().createElement("div",{className:"powerbar-step "+(1===this.props.completedPercentage?"powerbar-completed":"powerbar-not-completed")}))}}var i=n("./node_modules/classnames/index.js"),r=n.n(i);class s extends a.PureComponent{render(){let e=this.props.completedPoints,t=r()(["powerbar",this.props.className||""]);return o().createElement("div",{className:t},o().createElement("div",{className:"powerbar-step "+(e>0?"powerbar-completed":"powerbar-not-completed")}),this.props.config.map(((t,n)=>{let a=0;e>=t?(a=1,e-=t):e>0&&e<t?(a=e/t,e=0):a=0;const i=this.props.config.length-n;return o().createElement(l,{key:n,completedPercentage:a,zIndex:i})})))}}},"./src/app/constants/AppConstants.js":e=>{e.exports={ApiPrefix:{perl:"/perl",ruby:"/ruby"},ActionTypes:{ROUTE_CHANGE:"ROUTE_CHANGE",EMIT_MESSAGE:"EMIT_MESSAGE"},DEFAULT_PAGER_PERPAGE:15,DEFAULT_PAGER_MARGIN:2,DEFAULT_PAGER_RANGE:5,Formats:{DATE_SHORT:"D/M/YY",TIME_SHORT:"h:mm A"},Colors:{"17hats-green":"#0B763E","17hats-white":"#F8F8F8","17hats-purple":"#56258B","17hats-dark-purple":"#211049","17hats-blue":"#157BE6","17hats-gray":"#424345","17hats-yellow":"#F9D054"}}},"./src/app/constants/account.js":(e,t,n)=>{"use strict";n.d(t,{Z:()=>l,f:()=>o});var a=n("./src/app/constants/AppConstants.js");const o={accent_color:"#D3D3D3",background_color:a.Colors["17hats-white"],button_color:a.Colors["17hats-green"],font_color:"#333333",font_family:"open_sansregular",email_font_family:"Arial"},l={lead_capture:{submit:"Submit"},questionnaire:{title:"Questionnaire",save_and_send:"Save and Send",save_as_draft:"Save as Draft",fill_out:"Fill Out Questionnaire",view_completed:"View Completed Questionnaire"},quote:{title:"Quote",accept:"Accept",review:"Review Quote",view_accepted:"View Accepted Quote"},contract:{title:"Contract",sign:"Sign Contract",review:"Review & Sign Contract",view_signed:"View Signed Contract"},invoice:{title:"Invoice",pay:"Pay Invoice",review:"Review & Pay Invoice",view_signed:"View Paid Invoice"}}},"./src/app/modules/QuickLook/index.js":(e,t,n)=>{"use strict";n.d(t,{A:()=>c});var a={};n.r(a),n.d(a,{fetchModules:()=>r,saveModules:()=>s});var o=n("./node_modules/redux-saga/es/effects.js");async function l(){const e=dataModel.accountinfo().properties["quicklook-modules"];return e?JSON.parse(e):null}async function i(e){SuiteSetup.module("Account").updateProperty({"quicklook-modules":JSON.stringify(e)})}function*r(){yield(0,o.jP)("_quicklook_get_modules",(function*(e){try{let e=yield(0,o.T1)(l);yield(0,o.yJ)({type:"quicklook_get_modules_SUCCESS",data:{modules:e}})}catch(e){console.error(e)}}))}function*s(){yield(0,o.p8)("_quicklook_save_modules",(function*(e){try{yield(0,o.yJ)({type:"quicklook_save_modules_SUCCESS",data:e.data});yield(0,o.T1)(i,e.data.modules)}catch(e){console.error(e)}}))}function c(){return{stateKey:"quicklook",state:{modules:[]},actions:e=>({fetchModules(){e("_quicklook_get_modules")},saveModules(t){e("_quicklook_save_modules",{modules:t})}}),sagas:a}}},"./src/app/redux/ReducerRegistry.js":(e,t,n)=>{"use strict";n.r(t),n.d(t,{ReducerRegistry:()=>a,default:()=>o});class a{constructor(){this._emitChange=null,this._reducers={}}getReducers(){return{...this._reducers}}register(e,t){this._reducers={...this._reducers,[e]:t},this._emitChange&&this._emitChange(this.getReducers())}setChangeListener(e){this._emitChange=e}}const o=new a},"./src/app/redux/actions/device.js":(e,t,n)=>{"use strict";n.d(t,{Up:()=>l,r2:()=>o,s_:()=>a});const a="SET_DEVICE_SIZE",o="SET_REACT_NATIVE";function l(e,t){return{type:a,size:e,deviceType:t}}},"./src/app/redux/actions/education.js":(e,t,n)=>{"use strict";n.d(t,{HU:()=>r,IM:()=>l,q4:()=>i,s3:()=>o});var a=n("./src/app/services/EducationService.js");const o="SET_MANUAL_COMPLETE",l="SET_COMPLETED_ITEMS";function i(e){return{type:l,completedItems:e}}function r(e){a.isItemCompleted(e)?"string"==typeof e?a.uncompleteItem(e):e.map((e=>{a.uncompleteItem(e)})):"string"==typeof e?a.completeItem(e):e.map((e=>{a.completeItem(e)}))}},"./src/app/redux/actions/router.js":(e,t,n)=>{"use strict";n.d(t,{O:()=>o,b:()=>a});const a="SET_LOCATION";function o(e){return{type:a,path:e}}},"./src/app/redux/createStore.js":(e,t,n)=>{"use strict";n.d(t,{A:()=>r});var a=n("./node_modules/redux/es/index.js"),o=n("./node_modules/redux-thunk/es/index.js"),l=n("./node_modules/redux-immutable-state-invariant/dist/index.js"),i=n("./node_modules/redux-saga/es/index.js");function r(e,t,n,r){const s=[],c=[];s.push(o.A),s.push((0,l.A)());const d=(0,i.Ay)();s.push(d);Object.assign({},t);let u;c.push((0,a.Tw)(...s)),u=a.Zz;const m=u(...c);let p;try{p=(0,a.y$)(e,n,m)}catch(e){throw console.error("could not create redux store !"),e}return r&&Object.keys(r).forEach((e=>{const t=r[e];d.run(t)})),p}},"./src/app/redux/reducers/index.js":(e,t,n)=>{"use strict";n.d(t,{A:()=>r});var a=n("./src/app/redux/actions/device.js");var o=n("./src/app/redux/actions/router.js"),l=n("./src/app/utils/router.js");var i=n("./src/app/redux/actions/education.js");const r={device:function(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{size:1200,type:"md",reactNative:!1},t=arguments.length>1?arguments[1]:void 0;switch(t.type){case a.s_:return Object.assign({},e,{size:t.size,type:t.deviceType});case a.r2:return Object.assign({},e,{reactNative:t.enabled});default:return e}},router:function(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{path:null,page:null},t=arguments.length>1?arguments[1]:void 0;const{path:n}=t;let a;return t.type===o.b?(a=(0,l.getPageFromPath)(n),$("body").removeClass("page-"+e.page),$("body").addClass("page-"+a),Object.assign({},e,{path:n,page:a})):e},education:function(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{manualComplete:!1,completedItems:{}},t=arguments.length>1?arguments[1]:void 0;switch(t.type){case i.s3:return{...e,manualComplete:t.manualComplete};case i.IM:return{...e,completedItems:Object.assign({},t.completedItems)};default:return e}}}},"./src/app/uimagic/datacontainer.js":(e,t,n)=>{"use strict";n.d(t,{ER:()=>l,HX:()=>i,iy:()=>r});var a=n("./src/app/utils/promise.js"),o=n("./src/app/utils/ResilientAxios.js");window.dataContainers={};const l=function(e){dataContainers[e.item]=new r(e)},i=function(e){return dataContainers[e].loaded};class r{constructor(e,t){let n=this.viewModel=t||window.dataModel;this.loaded=!1,this.settings=e,this.loaded_observable=ko.observable(!1),this.maxTries=3,this.pagerObservable=ko.observable(),this.__current_page=null,this.loaded_observable.subscribe((e=>{this.loaded=!!e}),this),null==n[e.item]&&(e.type&&"array"==e.type?n[e.item]=ko.observableArray():n[e.item]=ko.observable()),e.subscribe&&n[e.item].subscribe(e.subscribe),this.pending=!1}page(e,t){const{viewModel:n}=this;if(this.settings.serverPager&&!t)this.loadData({page:e,args:this.pager.args});else if(this.data){var a=Array.from(this.data).splice(this.pager.entries_per_page*e,this.pager.entries_per_page);this.pager.current_page=e,this.__current_page=e,n[this.settings.item](a)}}calculateItemNumber(){return this.settings.rows||24}stop(){this.cancelablePromise&&this.cancelablePromise.cancel(),this.loadTimeout&&(clearTimeout(this.loadTimeout),this.loadTimeout=void 0),this.ajaxRequest&&this.ajaxRequest.abort()}loadData(e){const{viewModel:t}=this;if(have_session_cookie_yn||"#/signup"==location.hash){if(this.pending)return this.cancelablePromise.promise;this.pending=!0;var n=this,l={},i=n.settings.url;if(!e||"string"!=typeof e&&"number"!=typeof e||(e={args:{pid:e}}),e&&e.args&&(l=e.args.postData||{},i=null!=e.args.pid?i.replace("$pid",encodeURIComponent(e.args.pid)):i.replace("$pid","0"),null!=e.args.sid&&(i=i.replace("$sid",encodeURIComponent(e.args.sid))),null!=e.args.tid&&(i=i.replace("$tid",encodeURIComponent(e.args.tid)))),n.settings.pager&&(l.rows=e&&e.rows?e.rows:this.calculateItemNumber(),l.page=e&&e.page?e.page:n.__current_page?n.__current_page:1),n.settings.args){const e=n.settings.args;for(let t in e)l[t]||(l[t]=e[t])}var r=e&&e.beforeLoad||n.settings.beforeLoad;return r&&r(),l.format="json",n.cancelablePromise=(0,a.v)(new Promise((function(r,s){try{var c=function(a){if(a=a||[],n.settings.notes&&(a.notes=ko.observableArray([])),n.settings.notes&&$.get(i+"/notes",(function(e){t[n.settings.item]()&&t[n.settings.item]().notes(e.collection)})),a.meta&&!a.pager&&(a.pager=a.meta,delete a.meta,a.pager.entries_per_page=a.pager.per_page,a.pager.last_page=a.pager.total_pages,a.pager.next_page=a.pager.current_page<a.pager.last_page?a.pager.current_page+1:void 0,a.pager.previous_page=a.pager.current_page>1?a.pager.current_page-1:void 0),n.settings.pager&&a.collection&&a.pager){a.pager.container=n.settings.name,e&&e.args&&(a.pager.args=e.args);var o=a.pager;n.pager=o,n.pagerObservable(o),n.__current_page=o.current_page}else n.settings.pager&&"[object Array]"===Object.prototype.toString.call(a)&&(n.data=a,n.pager={total_entries:a.length,entries_per_page:l.rows,current_page:1},n.page(0,!0));var c;n.settings.render?c=Promise.resolve(n.settings.render(a,e)):n.settings.item&&(c=Promise.resolve(t[n.settings.item](a.collection||a)));var d=e&&e.onLoad||n.settings.onLoad;return d&&(c=c.then((async function(){try{return await d(a)}catch(e){return s(e)}}))),c.then((function(){return n.loaded_observable(!0),n.pending=!1,r(1)}))};return async function(){let e=0,t=0,r=0;for(;;)try{r=100*e+400*t;let n=await $.ajax({url:i,data:l,suppressRetriables:!0,dataType:"json",processData:!0});return c(n)}catch(l){if((425==l.status||502==l.status||503==l.status||504==l.status||524==l.status||"timeout"===l.statusText)&&e<o.ve&&t<2*o.ve){await(0,a.c)(r),425==l.status?t++:e++;continue}return 403==l.status?(n.pending=!1,c([])):401==l.status?SuiteSetup.gotoPage("/app/login"):(console.warn(`${i}: failure (${l.status} ${l.statusText}) after ${e} retries`),n.pending=!1,s(l))}}()}catch(e){console.error("DC load error",e),s(e)}}))),n.promise=n.cancelablePromise.promise,n.cancelablePromise.promise}}}},"./src/app/uimagic/dialog.js":(e,t,n)=>{"use strict";n.d(t,{EP:()=>d,PE:()=>r,TM:()=>u,YK:()=>p,rK:()=>m,ri:()=>s,w4:()=>c,zU:()=>h});var a=n("./node_modules/react/react.js"),o=n.n(a),l=n("./node_modules/react-dom/index.js"),i=n.n(l);let r;window._alert_dialog=new d({title:"Notice",alignTitle:"center"}),window.isAlertOpen=!1,window.dialogs={},window.$dialog=r;let s=!1;function c(e){"object"==typeof e?window._alert_dialog.open(e):window._alert_dialog.open({message:"<center>"+e+"</center>"})}function d(e){this.open=function(t){if(!window.isAlertOpen){var n,a="",o=t&&t.message?t.message:e.message;if(e.options)for(var l=0;l<e.options.length;l++)a+='<button id="dialogButton'+l+'" type="submit" class="btnBlue"><strong>'+e.options[l].text+"</strong></button>";else a+='<button id="dialogButton1" type="button" class="btnBlue alert_close_button"><strong>OK</strong></button>';if(n=""===o.trim()?"":'<fieldset><fieldset class="new_form" style="padding-top: 10px; margin-top: 10px; text-align: center;">'+o+'<div class="clearboth">&nbsp;</div></fieldset></fieldset>',r=$('<div id="dialogSettings"><form class="dialog clearfix">'+n+'<fieldset class="buttons"><p class="centerButton">'+a+"</p></fieldset></form></div>"),r.addClass(""===n?"no-height":""),r.on("remove",(function(){$("#dialog-wrap").hide(),$("body").removeClass("has-overlay"),$("#wrap").removeClass("modal-opened"),window.isAlertOpen=!1})),r.dialog({autoOpen:!0,title:t&&t.title?t.title:e.title||void 0,width:e.width||350,modal:!0,resizable:!1,draggable:!1,appendTo:"#dialog-wrap",dialogClass:e.dialogClass||"",position:{my:"top",at:"top",of:"#dialog-wrap",within:window},close:function(){window.isAlertOpen=!1,r.remove()}}),$("body").addClass("has-overlay"),$("#wrap").addClass("modal-opened"),"xs"===dataModel.deviceType()&&$(window).scrollTop(0),$("body").add("click","#dialog-wrap",(e=>{e.stopImmediatePropagation()})),$("#dialog-wrap").css("display","block"),"center"==e.alignTitle&&$(".ui-dialog-title").css({"justify-content":"center"}),window.isAlertOpen=!0,e.options)for(let t=0;t<e.options.length;t++)$("#dialogButton"+t).click(e.options[t].handler),window.isAlertOpen=!1;else $(".alert_close_button").click((function(){return r.remove(),t.onClose&&_.isFunction(t.onClose)&&t.onClose(),window.isAlertOpen=!1,!1})),$(".ui-dialog-titlebar-close").click((function(){return t.onCancel&&_.isFunction(t.onCancel)&&t.onCancel(),!1}))}}}$.widget("ui.dialog",$.extend({},$.ui.dialog.prototype,{_title:function(e){this.options.title?e.html(this.options.title):e.html("&#160;")}})),window.dialog=function(e){this.settings=e,this.isOpen=!1,this.update=function(e){this.settings.content=e},this.open=function(e){if($("#dialogSettings:visible").length||s)return!1;s=!0;var t={};for(var n in this.settings)t[n]=this.settings[n];if(e)for(var a in e)t[a]=e[a];function o(e){t.content||(t.content=e),r=t.blankCanvas?$('<div id="dialogBlankCanvas">'+e+"</div>"):$('<div id="dialogSettings"><form class="form dialog clearfix" data-parsley-trigger="change"><fieldset>'+e+"</fieldset>"+(null==t.buttons||t.buttons?'<fieldset class="buttons"><p class="centerButton">'+(t.deleteButtonYn?'<button type="button" class="btnRed" id="dialogDelete"><strong>Delete</strong></button>':"")+(t.cancelButtonYn?'<button type="reset" class="btnGrey closeDialog" id="dialogCancel"><strong>'+t.cancelBtnText+"</strong></button>":"")+(t.submitButtonYn?'<button type="submit" class="btnBlue" data-bind="attr: {\'disabled\': $root.saving }" id="dialogSubmit"><strong>'+t.submitBtnText+"</strong></button>":"")+"</p></fieldset>":"")+"</form></div>");var n=!1;if(r.on("remove",(function(){n||(n=!0,ko.cleanNode(r.get(0)),$("#dialog-wrap").hide(),$("body").removeClass("has-overlay"),n=!1,$("#wrap, #app, #new_header").removeClass("modal-opened"))})),t.fields)for(var a in t.fields){var o=r.find("#"+a);"checkbox"==o.attr("type")?o.prop("checked",!!t.fields[a]):o.val(t.fields[a])}r.find("#dialogDelete").bind("click",(function(){t.onDelete(r,t)&&r.remove()})),r.find("#dialogSubmit").singleClick((function(e){if(t.validate_yn&&r.validator&&!r.validator.validate()){console.warn("The dialog failed validation!");for(let e of r.validator.fields)!0!==e.validationResult&&console.warn(e);return!1}if(0!=e.x&&0!=e.y){if(t.fields)for(var n in t.fields)t.fields[n]=r.find("#"+n).val();t.successCallback&&t.successCallback(),Promise.resolve(t.submit(r,t)).then((e=>{if(!e)return!1;t.overrideRemoval||(r.remove(),r.validator&&r.validator.destroy())})).finally((()=>{$("body").removeClass("has-overlay"),$("#wrap").removeClass("modal-opened")}))}return!1}));var l=t.title;t.icon&&(l='<i class="'+t.icon+'"></i>'+l),t.iconRaw&&(l=t.iconRaw+l);let i=null==t.draggable||t.draggable;"xs"!==dataModel.deviceType()&&"sm"!==dataModel.deviceType()||(i=!1),r.dialog({autoOpen:!1,title:l,width:t.width,modal:!1,resizable:!1,draggable:i,appendTo:"#dialog-wrap",dialogClass:t.dialogClass,position:{my:"top",at:"top",of:"#dialog-wrap",within:window},open:function(){r.find(".dialog").on("keypress",":input:not(textarea)",(function(e){13===e.keyCode&&e.preventDefault()})),i&&setTimeout((()=>{var e;(e=t.forceTop?20:$(window).innerHeight()/2-r.parent().height()/2)<20&&(e=20),r.parent().css({left:$(window).innerWidth()/2-r.parent().width()/2+"px",top:e+"px"}),r.parent().css("opacity",1)}),100)},beforeClose:function(){t.beforeClose&&t.beforeClose(r,t),r.remove()},close:function(e,n){r.remove(),t.onClose&&t.onClose(r,t,"dismiss")}}),i?(r.parent().draggable("option","containment",$("#dialog-wrap")),r.parent().draggable({drag:function(e,t){t.position.top<20&&(t.position.top=20)}}),r.parent().addClass("draggable"),r.parent().css("opacity",0)):r.parent().css({top:"20px"});var c=function(){ko.applyBindings(dataModel,r.get(0)),$(".closeDialog").bind("click",(function(e){t.beforeClose&&t.beforeClose(r,t),r.remove(),t.onClose&&t.onClose(r,t,"cancel"),t.validate_yn&&(r.validator=r.find(".dialog").parsley()),$("body").removeClass("has-overlay"),$("#wrap").removeClass("modal-opened")})),"center"==t.alignTitle&&$(".ui-dialog-title").css({"justify-content":"center"}),t.validate_yn&&(r.validator=r.find(".dialog").parsley()),r.dialog("open"),window.$dialog=r,$("#dialog-wrap").css("display","block"),s=!1,t.afterOpen&&t.afterOpen(r,t),$("body").addClass("has-overlay"),$("#wrap").addClass("modal-opened"),"xs"===dataModel.deviceType()&&$(window).scrollTop(0),window.setupPage&&setupPage()};if(t.beforeOpen)var d=t.beforeOpen(r,t);d&&(d instanceof Promise||d.promise)?d.then(c):c()}return t.submitBtnText||(t.submitBtnText="Save"),t.cancelBtnText||(t.cancelBtnText="Cancel"),null==t.cancelButtonYn&&(t.cancelButtonYn=!0),null==t.submitButtonYn&&(t.submitButtonYn=!0),null==t.validate_yn&&(t.validate_yn=!0),t.alignTitle||(t.alignTitle="left"),t.url&&!t.content?$.ajax({url:window.SS_VERSION()+t.url,dataType:"html",cache:!0,onerror:t.onerror,success:o}):t.content&&window.setTimeout((()=>o(t.content)),10),!1}};const u={dialog:new dialog({url:"/dialogs/account/confirm_delete.html",content:n("./src/views/dialogs/account/confirm_delete.html"),title:"Please confirm",alignTitle:"center",width:400,submitBtnText:"OK"}),open:function(e){var t=$.extend({},e,{beforeOpen:function(){var t=e.text;e.showConfirmCheck&&(t=e.text+"<br><br><label><input type='checkbox' id='confirmCheck'>&nbsp;&nbsp;"+e.showConfirmText+"</label>"),$(".form_dialog .delete_message").html(t),e.submitBtnClass?$("#dialogSubmit").removeClass("btnBlue").addClass(e.submitBtnClass):$("#dialogSubmit").removeClass("btnBlue").addClass("btnRed")},afterOpen:function(){e.showConfirmCheck&&($("#confirmCheck").on("click",(function(){$(this).prop("checked")?$("#dialogSubmit").attr("disabled",!1):$("#dialogSubmit").attr("disabled",!0)})),$("#dialogSubmit").attr("disabled",!0))},onClose:function(){return n.reject(),!1},submit:function(){return n.resolve(),!0}}),n=$.Deferred();return this.dialog.open(t),n.promise()}};function m(e){return new Promise((t=>{u.open(e).done((()=>t(!0))).fail((()=>t(!1)))}))}function p(e){const t=n("./src/app/components/general/ImageViewer.jsx").A;dialogs.imageviewer.open({afterOpen:()=>{i().render(o().createElement(t,{download:!1,deletable:!1,items:e,onClose:h}),document.getElementById("image-gallery"))},beforeUnload:()=>{const e=document.getElementById("image-gallery");e&&i().unmountComponentAtNode(e)}})}function h(){try{r.dialog("close")}catch(e){}}dialogs.imageviewer=new dialog({content:'<div id="image-gallery"></div>',title:"",dialogClass:"image-viewer-dialog",width:700,submitButtonYn:!1,cancelButtonYn:!1})},"./src/app/uimagic/fragment.js":(e,t,n)=>{"use strict";n.d(t,{FK:()=>a,Mg:()=>i,Rk:()=>s,Tz:()=>d,ZO:()=>l,aK:()=>u,cB:()=>o,eJ:()=>c,xm:()=>r}),window.fragments={current_url:void 0,current_fragment:void 0},window.css_remove={},window.css_remove["#main"]="twoColFixedLeft twoColFixedRight";class a{constructor(e){this.settings=e,this.bound=!1,this._data=void 0,e.container||(this.settings.container="#main"),this.load_counter=0}async fillSubfragments(e){var t=e.find("div[fragment]");let n=[];return t.each((function(){var e=$(this);let t=e.attr("fragment");n.push($.ajax({url:window.SS_VERSION()+t,cache:!0,async:!0}).then((t=>{e.html(t),e.removeAttr("fragment")})))})),await Promise.all(n),n.length}async reload(){return await this.load(this._data)}async load(e){this._data=e;var t=this;if(t.load_counter>0)return 1;this.load_counter++;var n=fragments.current_fragment,a=t.settings.container;if(n){if(n.settings.beforeUnload&&await n.settings.beforeUnload(),n.settings.dataContainers)for(let e of n.settings.dataContainers)await dataContainers[e].stop();(n.settings.container==a||$(a).has($(n.settings.container)).length)&&await $(n.settings.container).children().first().fadeOut(200),n.loaded=!1,n.load_counter=0}if(this.settings.parent&&!$(".left_menu").length)return await fragments[t.settings.parent].load(),t.load_counter--,await t.load(e),t.settings.tab&&d(t.settings.tab),!0;this.settings.parent&&t.settings.tab&&d(t.settings.tab);try{if(null!=(void 0!==window.tinyMCE&&null!==window.tinyMCE?window.tinyMCE.editors:void 0))for(let e in window.tinyMCE.editors)window.tinyMCE.editors[e].remove()}catch(e){}let l;t.settings.beforeLoad&&await t.settings.beforeLoad(),e&&e.beforeLoad&&await e.beforeLoad(),fragments.current_url=t.settings.url,t.counter=0,t.settings.url&&!t.settings.content?(console.log("Loading a non-inline fragment",t.settings.url),l=await $.ajax({url:window.SS_VERSION()+t.settings.url,cache:!0})):l=t.settings.content;let i=$("<div>"+l+"</div>");if(await this.fillSubfragments(i),t.settings.content=i.html(),t.parsedHtml=i,await o(t,a,e),!e||!e.skipDataLoad)try{await t.loadData(e)}catch(e){console.error("load fragment error",e)}return t.loaded=!0,!0}async loadComponent(e){await this.settings.afterLoad(e)}async loadData(e){this.datacontainers_loaded=0;var t=this.settings.dataContainers||[];e&&e.dataContainers&&(t=t.concat(e.dataContainers)),this.datacontainers_loaded=t?t.length:0;var n=[];if(t&&t.length>0)for(var a=0;a<t.length;a++){e&&e.pid&&(e[t[a]]||(e[t[a]]={}),e[t[a]].pid=e.pid,e.sid&&(e[t[a]].sid=e.sid),e.section_id&&(e[t[a]].section_id=e.section_id));var o={};o.args=e&&e[t[a]]?e[t[a]]:void 0,o.fragment=this,o.dataToLoad=e;try{n.push(dataContainers[t[a]].loadData(o))}catch(e){console.debug(e)}}var l=this;try{return await Promise.all(n),await l.checkLoadingComplete(e)}catch(e){return console.error(e),l.load_counter=0,l.settings.onerror?await l.settings.onerror(e.responseJSON):"402"==e.status?await fragments.dashboard_suspended.load():await fragments.dashboard_error.load()}}update(e){this.settings.content!==e&&(console.log("Updating fragment",this.settings.url),this.settings.content=e,window.fragments.current_fragment&&window.fragments.current_fragment.settings&&window.fragments.current_fragment.settings.url===this.settings.url?this.reload():console.log("Not reloading, though"))}async checkLoadingComplete(e){return i(this,e),await $(this.settings.container).children().first().fadeIn(400),$(this.settings.container).css("display",""),!0}}function o(e,t,n){return u(e),"#main"==t&&r(),n&&n.skipDataLoad&&i(e,n),1}function l(e){var t=$(e.settings.container).children().first().get(0);t&&ko.cleanNode(t)}function i(e,t){var n,a=fragments.current_fragment,o=e.settings.container;a&&(n=a.settings.container),a&&(n==o||$(o).has($(n)).length)&&(l(a),$(a.settings.container).html("")),$(e.settings.container).html(e.parsedHtml);try{var i=$(e.settings.container).children().first().get(0);i&&ko.applyBindings(dataModel,i)}catch(e){console.error(e)}fragments.current_fragment=e,c(e,t)}function r(){$(".subtabs").children("div").hide()}function s(e,t){r(),setTab(e+"Tab"),$("#"+e+"-"+t).show()}function c(e,t){e.load_counter--,window.scrollTo(0,0),e.settings.afterLoad&&e.settings.afterLoad(t),t&&t.afterLoad&&t.afterLoad(t),e.settings.dataContainersIfEmpty&&_.each(e.settings.dataContainersIfEmpty,(function(e){dataContainers[e].loaded||dataContainers[e].loadData(t)}))}function d(e){$(".left_menu li").removeClass("selected"),$("#"+e).addClass("selected"),$(`[data-id=${e}]`).addClass("selected")}function u(e){if(e.settings.classes)for(var t=e.settings.classes,n=0;n<t.length;n++){var a=t[n];window.css_remove[a.id]&&$(a.id).removeClass(window.css_remove[a.id]),$(a.id).addClass(a.classes)}}},"./src/app/uimagic/knockout.js":()=>{ko.bindingHandlers.fadeVisible={init:function(e,t){var n=t();$(e).toggle(ko.unwrap(n))},update:function(e,t){var n=t();ko.unwrap(n)?$(e).fadeIn():$(e).fadeOut()}},ko.bindingHandlers.singleClick={init:function(e,t,n,a,o){var l=t();$(e).singleClick((function(t){$(e).prop("disabled",!0);var n=l.call(a,o.$data,t);jQuery.when(n).always((function(){$(e).prop("disabled",!1)})),t.preventDefault()}))}},ko.bindingHandlers.leadFormStyle={update:function(){var e=dataModel.leadForm?dataModel.leadForm:dataModel.capture_form;if(e)try{var t="object"==typeof e().user_options?e().user_options:JSON.parse(e().user_options),n=t.buttonColor?t.buttonColor:dataModel.styles().button_color,a=t.fontColor?t.fontColor:"#222",o=t.bgColor?t.bgColor:"transparent";$(".captureform_preview")&&"transparent"==o&&(o="#fff"),n&&(utils.customButtonColor(n,$("#lc_form_submit")),utils.customButtonColor(n,$("#lc_close_form"))),$(".paper-content label, .paper-content p.js-font_family, .client_logo, #lead_form h2, #lead_form p, #lc_submit_msg p.msg, .paper-content h2.js-font_family").css({color:a}),$("body.fluidWidth, #lc_form #captureform_view").css({background:o}),$(".answerdate").datepicker({dateFormat:"MM dd, yy",autoclose:!0}),$(".answerdate").attr("autocomplete","off")}catch(e){console.log(e)}}},ko.bindingHandlers.embedFormStyle={update:function(){var e=dataModel.leadForm?dataModel.leadForm:dataModel.capture_form;if(e)try{var t="object"==typeof e().user_options?e().user_options:JSON.parse(e().user_options),n=t.buttonColor?t.buttonColor:dataModel.styles().button_color,a=t.fontColor?t.fontColor:"#222",o=t.bgTransparency?"transparent":"#FFF";n&&(utils.customButtonColor(n,$("#lc_form_submit")),utils.customButtonColor(n,$("#lc_close_form"))),$(".paper-form label, .paper-content label, .paper-content p.js-font_family, .client_logo, #lead_form h2, #lead_form p, #lc_submit_msg p.msg, .paper-content h2.js-font_family").css({color:a}),$("body.fluidWidth, #lc_form #captureform_view").css({background:o}),$(".answerdate").datepicker({dateFormat:"MM dd, yy"}).on("change",(function(){$(".datepicker").hide()})),$(".answerdate").attr("autocomplete","off")}catch(e){console.error(e)}}},ko.bindingHandlers.ordinalSuffix={update:function(e,t,n,a,o){var l=$(e),i=l.text();l.text(i.replace(/\d+/g,(function(e){var t=e%10,n=e%100;return 1==t&&11!=n?e+"st":2==t&&12!=n?e+"nd":3==t&&13!=n?e+"rd":e+"th"})))}},ko.localizedNumber=function(e){return ko.pureComputed({read:function(){return utils.formatNumber(utils.unformatCurrency(ko.unwrap(e)))},write:function(t){e(utils.unformatCurrency(t))},owner:this})},ko.localizedCurrency=function(e){return ko.pureComputed({read:function(){return accounting.formatMoney(utils.unformatCurrency(ko.unwrap(e)))},write:function(t){e(utils.unformatCurrency(t))},owner:this})},ko.bindingHandlers.localizedNumberValue={init:function(e,t,n,a,o){e.shadow_observable=ko.localizedNumber(t()),ko.bindingHandlers.value.init(e,(function(){return e.shadow_observable}),n,a,o)},update:function(e,t,n,a,o){ko.bindingHandlers.value.update(e,(function(){return e.shadow_observable}),n,a,o)}},ko.bindingHandlers.localizedCurrencyValue={init:function(e,t,n,a,o){e.shadow_observable=ko.localizedCurrency(t()),ko.bindingHandlers.value.init(e,(function(){return e.shadow_observable}),n,a,o)},update:function(e,t,n,a,o){ko.bindingHandlers.value.update(e,(function(){return e.shadow_observable}),n,a,o)}}},"./src/app/utils/router.js":(e,t,n)=>{"use strict";n.r(t),n.d(t,{getPageFromPath:()=>u,gotoPage:()=>i,navigateTo:()=>d,setInitialLocation:()=>c});var a=n("./src/app/app.js"),o=n("./src/app/redux/index.js"),l=n("./src/app/redux/actions/router.js");const i=a.default.gotoPage;var r,s;function c(){o.A.dispatch((0,l.O)(window.location.pathname))}function d(e){location.hash=e}function u(e){let t;switch(!0){case e.startsWith("/app/dashboard"):t="dashboard";break;case e.startsWith("/app/contact"):t="contacts";break;case e.startsWith("/app/leads/capture"):t="leads capture";break;case e.startsWith("/app/leads"):t="leads";break;case e.startsWith("/app/projects"):t="projects";break;case e.startsWith("/app/schedule"):t="schedule";break;case e.startsWith("/app/tasks"):t="tasks";break;case e.startsWith("/app/invoices"):t="invoices";break;case e.startsWith("/app/workflows"):t="workflows";break;case e.startsWith("/app/accounting"):t="accounting";break;case e.startsWith("/app/invoice"):t="invoice";break;case e.startsWith("/app/contract"):t="contract";break;case e.startsWith("/app/questionnaire"):t="questionnaire";break;case e.startsWith("/app/account/"):switch(!0){case e.startsWith("/app/account/general"):t="account/general";break;case e.startsWith("/app/account/preferences"):t="account/preferences";break;case e.startsWith("/app/account/emailaccounts"):t="account/emailaccounts";break;case e.startsWith("/app/account/calendar_sync"):t="account/calendar_sync";break;case e.startsWith("/app/account/client_portal"):t="account/client_portal";break;case e.startsWith("/app/account/users"):t="account/users";break;default:t="account"}}return window.dataModel&&dataModel.page&&dataModel.page(t),t}r=window.history,s=r.pushState,r.pushState=function(e){return"function"==typeof r.onpushstate&&r.onpushstate({state:e}),s.apply(r,arguments)},window.onpopstate=history.onpushstate=e=>{let t=null;e&&e.state&&(t=e.state.href||e.state.path),t||(t=window.location.pathname),o.A.dispatch((0,l.O)(t))}}}]);