{"version":3,"file":"3127.7f5c5dd63198b738c0ba.js","mappings":"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","sources":["webpack://gyldendal-uddannelse/./src/Foundation/Frontend/ReactComponents/Shared/ReduxFormInputs/product-selector-field.js","webpack://gyldendal-uddannelse/./src/Foundation/Frontend/ReactComponents/DynamicContactForm/dynamic-contact-form-content.tsx","webpack://gyldendal-uddannelse/./src/Foundation/Frontend/ReactComponents/DynamicContactForm/dynamic-contact-form.js","webpack://gyldendal-uddannelse/./src/Foundation/Frontend/ReactComponents/Shared/AnimationComponents/slide-vertical-animation.js","webpack://gyldendal-uddannelse/./src/Foundation/Frontend/ReactComponents/Shared/ReduxFormInputs/text-field.js","webpack://gyldendal-uddannelse/./src/Foundation/Frontend/ReactComponents/Shared/ReduxFormInputs/textarea-field.js","webpack://gyldendal-uddannelse/./src/Foundation/Frontend/ReactReducers/ContactForm/contact-form-composer.js"],"sourcesContent":["import * as React from \"react\";\r\nimport classNames from \"classnames\";\r\n\r\nexport const ProductSelectorField = field => {\r\n    const { error, touched } = field.meta;\r\n    const fieldId = field.input.name;\r\n\r\n    const inputClasses = classNames({\r\n        \"text-input__input\": true,\r\n        dirty: field.input.value,\r\n        invalid: error && touched\r\n    });\r\n\r\n    return (\r\n        <div className=\"text-input\">\r\n            <label htmlFor={fieldId} style={{ position: \"static\" }}>\r\n                {field.label} {field.required && <span className=\"required-star\">*</span>}\r\n            </label>\r\n            <br />\r\n            <select\r\n                {...field.input}\r\n                id={fieldId}\r\n                className={inputClasses}\r\n                size={18}\r\n                multiple={true}\r\n                required={field.required}\r\n                onFocus={field.onFocus}\r\n                onBlur={field.onBlur}\r\n                value={field.input.value || []}\r\n                style={{ width: \"100%\", height: \"auto\", border: \"solid 1px\", marginTop: \"0\" }}\r\n            >\r\n                {field.children}\r\n            </select>\r\n            {touched && error && <span>{error}</span>}\r\n        </div>\r\n    );\r\n};\r\n","import React, { Suspense, useEffect, useState } from \"react\";\r\nimport { DynamicFieldsList } from \"ReactComponents/TwoColumnGrid/two-column-grid\";\r\nimport { createField } from \"./dynamic-contact-form\";\r\nimport SliderVerticalAnimation from \"ReactComponents/Shared/AnimationComponents/slide-vertical-animation\";\r\n\r\nconst ReCAPTCHA = React.lazy(() => import(\"react-google-recaptcha\"));\r\n\r\nexport const DynamicContactFormContent = ({\r\n    DynamicFieldsList,\r\n    CaptchaSiteKey,\r\n    BtnLabel,\r\n    onChangeRecaptcha,\r\n    submitting,\r\n    captchaToken,\r\n    collapsible\r\n}: {\r\n    DynamicFieldsList: DynamicFieldsList;\r\n    CaptchaSiteKey: string;\r\n    BtnLabel: string;\r\n    onChangeRecaptcha: (response: string | null) => void;\r\n    submitting: boolean;\r\n    captchaToken: string | null;\r\n    collapsible: boolean;\r\n}) => {\r\n    const [didMount, setDidMount] = useState(false);\r\n    const [isCollapsed, setIsCollapsed] = useState(true);\r\n\r\n    useEffect(() => {\r\n        setDidMount(true);\r\n    }, []);\r\n\r\n    const onInputTouched = () => {\r\n        if (!isCollapsed) return;\r\n\r\n        setIsCollapsed(false);\r\n    };\r\n\r\n    const firstInput = DynamicFieldsList[0];\r\n    const collapsedDynamicFields = DynamicFieldsList.slice(1);\r\n\r\n    return (\r\n        <div>\r\n            {collapsible ? (\r\n                <>\r\n                    {createField(firstInput, 0, onInputTouched)}\r\n\r\n                    <SliderVerticalAnimation visible={!isCollapsed}>\r\n                        {collapsedDynamicFields?.map(field => createField(field))}\r\n\r\n                        <br />\r\n\r\n                        {didMount && CaptchaSiteKey ? (\r\n                            <Suspense fallback={<span>Loading...</span>}>\r\n                                <div>\r\n                                    <ReCAPTCHA\r\n                                        sitekey={CaptchaSiteKey}\r\n                                        hl=\"da\"\r\n                                        onChange={onChangeRecaptcha}\r\n                                    />\r\n                                    <br />\r\n                                </div>\r\n                            </Suspense>\r\n                        ) : null}\r\n\r\n                        <br />\r\n\r\n                        <p>\r\n                            <button\r\n                                className=\"footer-widget__button\"\r\n                                type=\"submit\"\r\n                                disabled={submitting || (!captchaToken && !!CaptchaSiteKey)}\r\n                            >\r\n                                {submitting ? (\r\n                                    <span className=\"loader button-is-loading\">\r\n                                        <span></span>\r\n                                    </span>\r\n                                ) : (\r\n                                    <span>{BtnLabel}</span>\r\n                                )}\r\n                            </button>\r\n                        </p>\r\n                    </SliderVerticalAnimation>\r\n                </>\r\n            ) : (\r\n                <>\r\n                    {DynamicFieldsList ? DynamicFieldsList.map(field => createField(field)) : null}\r\n\r\n                    <br />\r\n                    {didMount && CaptchaSiteKey ? (\r\n                        <Suspense fallback={<span>Loading...</span>}>\r\n                            <div>\r\n                                <ReCAPTCHA sitekey={CaptchaSiteKey} hl=\"da\" onChange={onChangeRecaptcha} />\r\n                                <br />\r\n                            </div>\r\n                        </Suspense>\r\n                    ) : null}\r\n                    <br />\r\n                    <p>\r\n                        <button\r\n                            className=\"footer-widget__button\"\r\n                            type=\"submit\"\r\n                            disabled={submitting || (!captchaToken && !!CaptchaSiteKey)}\r\n                        >\r\n                            {submitting ? (\r\n                                <span className=\"loader button-is-loading\">\r\n                                    <span></span>\r\n                                </span>\r\n                            ) : (\r\n                                <span>{BtnLabel}</span>\r\n                            )}\r\n                        </button>\r\n                    </p>\r\n                </>\r\n            )}\r\n        </div>\r\n    );\r\n};\r\n","// @ts-check\r\nimport React, { Component } from \"react\";\r\nimport { connect } from \"react-redux\";\r\nimport { Field, reduxForm } from \"redux-form\";\r\nimport { contactFormComposer } from \"ReactReducers/ContactForm/contact-form-composer\";\r\nimport { SubmissionError } from \"redux-form\";\r\nimport SliderVerticalAnimation from \"ReactComponents/Shared/AnimationComponents/slide-vertical-animation\";\r\nimport { TextField } from \"../Shared/ReduxFormInputs/text-field\";\r\nimport { TextareaField } from \"../Shared/ReduxFormInputs/textarea-field\";\r\nimport { ProductSelectorField } from \"../Shared/ReduxFormInputs/product-selector-field\";\r\nimport { DynamicContactFormContent } from \"./dynamic-contact-form-content\";\r\nimport classNames from \"classnames\";\r\n\r\nexport const createField = (field, i, customOnChange) => {\r\n    const { Type, Name, Label, IsRequired, Sections } = field;\r\n\r\n    let component;\r\n\r\n    switch (Type) {\r\n        case \"Text Field\":\r\n            component = TextField;\r\n            break;\r\n        case \"Text Area\":\r\n            component = TextareaField;\r\n            break;\r\n        case \"Product Selector\":\r\n            component = ProductSelectorField;\r\n            break;\r\n        default:\r\n            component = \"input\";\r\n            break;\r\n    }\r\n\r\n    if (Type === \"Product Selector\") {\r\n        if (!Sections || !Sections.length) return null;\r\n\r\n        return (\r\n            <section key={`${Name}-${i}-Products`} style={{ width: \"100%\", marginTop: \"1rem\" }}>\r\n                <Field\r\n                    name={Name}\r\n                    label={Label}\r\n                    required={IsRequired}\r\n                    component={component}\r\n                    onChange={customOnChange}\r\n                    size={18}\r\n                    multiple={true}\r\n                >\r\n                    {Sections.map((section, index) => {\r\n                        const optGroupKey = `${section.SectionName.split(\" \").join(\"-\")}-${index}`;\r\n                        return (\r\n                            <optgroup key={optGroupKey} label={section.SectionName}>\r\n                                {section.Products &&\r\n                                    section.Products.length > 0 &&\r\n                                    section.Products.map((product, i) => {\r\n                                        const optKey = `${product.ISBN}-${i}`;\r\n                                        return (\r\n                                            <option key={optKey} value={product.ISBN}>\r\n                                                {product.Title}\r\n                                            </option>\r\n                                        );\r\n                                    })}\r\n                            </optgroup>\r\n                        );\r\n                    })}\r\n                </Field>\r\n            </section>\r\n        );\r\n    }\r\n\r\n    return (\r\n        <section key={`${Name}-${i}`}>\r\n            <Field\r\n                name={Name}\r\n                label={Label}\r\n                required={IsRequired}\r\n                component={component}\r\n                onChange={customOnChange}\r\n                size={18}\r\n                multiple={true}\r\n            />\r\n        </section>\r\n    );\r\n};\r\n\r\nclass DynamicContactForm extends Component {\r\n    /**\r\n     * @param {any} props\r\n     */\r\n    constructor(props) {\r\n        super(props);\r\n        // console.log(\"DynamicContactForm props: \", props);\r\n\r\n        this.onSubmit = this.onSubmit.bind(this);\r\n        this.verifyReCaptchaCallback = this.verifyReCaptchaCallback.bind(this);\r\n\r\n        this.state = {\r\n            captchaToken: null,\r\n            didMount: false\r\n        };\r\n    }\r\n\r\n    componentDidMount() {\r\n        this.setState({ didMount: true });\r\n    }\r\n\r\n    /**\r\n     * @param {any} data\r\n     */\r\n    onSubmit(data) {\r\n        const { WebApiUrl: webApiUrl, contactFormSubmit } = this.props;\r\n        /**\r\n         * @type {string | undefined}\r\n         */\r\n        let captchaToken = undefined;\r\n        if (this.state.captchaToken) {\r\n            captchaToken = this.state.captchaToken;\r\n        }\r\n        const { FormTitle, FormHeading, Id } = this.props;\r\n\r\n        return new Promise((resolve, reject) => {\r\n            const clonedData = JSON.parse(JSON.stringify(data));\r\n            let products = \"\";\r\n\r\n            if (clonedData.ProductSelector) {\r\n                products = clonedData.ProductSelector.join(\", \");\r\n                delete clonedData.ProductSelector;\r\n            }\r\n            contactFormSubmit(\r\n                webApiUrl,\r\n                {\r\n                    ...clonedData,\r\n                    Products: products,\r\n                    form: \"dynamic\",\r\n                    formHeading: FormHeading,\r\n                    formTitle: FormTitle,\r\n                    formId: Id,\r\n                    captchaResponse: captchaToken\r\n                },\r\n                resolve,\r\n                reject\r\n            );\r\n        }).then(response => {\r\n            if (!response.Success) {\r\n                const errors = {};\r\n                if (!response.Payload.fields) {\r\n                    throw new SubmissionError({});\r\n                }\r\n                response.Payload.fields.forEach(error => {\r\n                    errors[error.name] = error.value;\r\n                });\r\n                throw new SubmissionError(errors);\r\n            }\r\n        });\r\n    }\r\n\r\n    /**\r\n     * @param {String | null} captchaToken\r\n     */\r\n    verifyReCaptchaCallback(captchaToken) {\r\n        if (captchaToken) {\r\n            this.setState({\r\n                captchaToken\r\n            });\r\n        }\r\n    }\r\n\r\n    render() {\r\n        const {\r\n            FormTitle,\r\n            FormHeading,\r\n            DynamicFieldsList,\r\n            BtnLabel,\r\n            SubmitSuccessText,\r\n            CaptchaSiteKey,\r\n            Collapsible,\r\n            handleSubmit,\r\n            submitting,\r\n            submitSucceeded,\r\n            TextColor,\r\n            noPadding\r\n        } = this.props;\r\n\r\n        const { captchaToken } = this.state;\r\n\r\n        const formContentProps = {\r\n            DynamicFieldsList,\r\n            CaptchaSiteKey,\r\n            BtnLabel,\r\n            onChangeRecaptcha: (/** @type {string | null} */ response) =>\r\n                this.verifyReCaptchaCallback(response),\r\n            submitting,\r\n            captchaToken\r\n        };\r\n\r\n        const headingClasses = classNames(\r\n            \"content-header\",\r\n            TextColor ? `${TextColor}--text` : \"color-black--text\"\r\n        );\r\n\r\n        const contentRowClasses = classNames(`content-row content-row--50`, {\r\n            \"content-row--no-padding\": noPadding\r\n        });\r\n\r\n        return (\r\n            <div className=\"content-module\">\r\n                <div className={contentRowClasses}>\r\n                    <h2 className={headingClasses} dangerouslySetInnerHTML={{ __html: FormHeading }} />\r\n                    <div className=\"content-inner content-block content--dark\">\r\n                        <SliderVerticalAnimation visible={!submitSucceeded}>\r\n                            <form onSubmit={handleSubmit(this.onSubmit)}>\r\n                                <h3>{FormTitle}</h3>\r\n                                <Field name=\"ItemId\" component=\"input\" type=\"hidden\" />\r\n                                <Field\r\n                                    name=\"formId\"\r\n                                    component=\"input\"\r\n                                    type=\"hidden\"\r\n                                    value=\"dynamicContactForm\"\r\n                                />\r\n                                <Field\r\n                                    name=\"formHeading\"\r\n                                    component=\"input\"\r\n                                    type=\"hidden\"\r\n                                    value={FormHeading}\r\n                                />\r\n                                <Field name=\"formTitle\" component=\"input\" type=\"hidden\" value={FormTitle} />\r\n\r\n                                <DynamicContactFormContent {...formContentProps} collapsible={Collapsible} />\r\n                            </form>\r\n                        </SliderVerticalAnimation>\r\n                        <SliderVerticalAnimation visible={submitSucceeded}>\r\n                            <div>\r\n                                <div dangerouslySetInnerHTML={{ __html: SubmitSuccessText }}></div>\r\n                            </div>\r\n                        </SliderVerticalAnimation>\r\n                    </div>\r\n                </div>\r\n            </div>\r\n        );\r\n    }\r\n}\r\n\r\nconst mapStateToProps = (_, props) => {\r\n    const initialValues = props.DynamicFieldsList.reduce((initialValues, item) => {\r\n        initialValues[item.Name] = item.Value;\r\n        return initialValues;\r\n    }, {});\r\n\r\n    return {\r\n        initialValues\r\n    };\r\n};\r\n\r\nexport default connect(mapStateToProps)(\r\n    reduxForm({\r\n        form: \"dynamicContactForm\"\r\n    })(contactFormComposer(DynamicContactForm))\r\n);\r\n","// @ts-check\r\nimport AnimateHeight from \"react-animate-height\";\r\nimport React from \"react\";\r\n\r\n/**\r\n * @component\r\n * @param {object} props\r\n * @param {boolean} props.visible visible or not\r\n * @param {number} [props.delayIn] seconds to delay animating in\r\n * @param {number} [props.delayOut] seconds to delay animating in\r\n * @param {number} [props.delay] seconds to delay animating in\r\n * @param {boolean} [props.fade] should the content fade while animating height\r\n * @param {React.ReactNode} props.children React children\r\n *\r\n */\r\nfunction SlideVerticalAnimation(props) {\r\n    const height = props.visible ? \"auto\" : 0;\r\n    const delay =\r\n        props.visible && props.delayIn\r\n            ? props.delayIn\r\n            : !props.visible && props.delayOut\r\n            ? props.delayOut\r\n            : props.delay || 0;\r\n\r\n    return (\r\n        <AnimateHeight duration={250} height={height} delay={delay} animateOpacity={props.fade}>\r\n            {props.children}\r\n        </AnimateHeight>\r\n    );\r\n}\r\n\r\nexport default SlideVerticalAnimation;\r\n","import * as React from \"react\";\r\nimport classNames from \"classnames\";\r\n\r\nexport const TextField = field => {\r\n    const { error, touched } = field.meta;\r\n\r\n    const inputClasses = classNames({\r\n        \"text-input__input\": true,\r\n        dirty: field.input.value,\r\n        invalid: error && touched\r\n    });\r\n\r\n    return (\r\n        <div className=\"text-input\">\r\n            <input\r\n                {...field.input}\r\n                className={inputClasses}\r\n                id={field.input.name}\r\n                type={field.type || \"text\"}\r\n                onFocus={field.onFocus}\r\n                onBlur={field.onBlur}\r\n                maxLength={field.maxLength}\r\n                required={field.required}\r\n            />\r\n            <label htmlFor={field.input.name} className=\"text-input__label\">\r\n                {field.label} {field.required && <span className=\"required-star\">*</span>}\r\n            </label>\r\n            {error && touched && <span className=\"text-input__error-msg\">{error}</span>}\r\n        </div>\r\n    );\r\n};\r\n","import * as React from \"react\";\r\nimport classNames from \"classnames\";\r\n\r\nexport const TextareaField = field => {\r\n    const { error, touched } = field.meta;\r\n    const inputClasses = classNames({\r\n        dirty: field.input.value,\r\n        invalid: error && touched\r\n    });\r\n\r\n    return (\r\n        <div className=\"textarea-field\">\r\n            <textarea\r\n                {...field.input}\r\n                id={field.input.name}\r\n                className={inputClasses}\r\n                onFocus={field.onFocus}\r\n                onBlur={field.onBlur}\r\n                required={field.required}\r\n            ></textarea>\r\n            <label htmlFor={field.input.name} className=\"text-input__label\">\r\n                {field.label} {field.required && <span className=\"required-star\">*</span>}\r\n            </label>\r\n            {error && touched && <span className=\"field-error\">{error}</span>}\r\n        </div>\r\n    );\r\n};\r\n","import { connect } from \"react-redux\";\r\nimport { contactFormSelector, contactFormActions } from \"./contact-form-reducer\";\r\n\r\nexport function contactFormComposer(Component) {\r\n    const mapStateToProps = function (state) {\r\n        return {\r\n            contactFormSubmitPending: contactFormSelector.contactFormSubmitPending(state),\r\n            contactFormSubmitSuccess: contactFormSelector.contactFormSubmitSuccess(state)\r\n        };\r\n    };\r\n\r\n    const mapDispatchToProps = function (dispatch) {\r\n        return {\r\n            contactFormSubmit: (webApiUrl, formInfo, resolve, reject) =>\r\n                dispatch(contactFormActions.contactFormSubmit(webApiUrl, formInfo, resolve, reject))\r\n        };\r\n    };\r\n\r\n    return connect(mapStateToProps, mapDispatchToProps)(Component);\r\n}\r\n"],"names":["ProductSelectorField","field","meta","error","touched","fieldId","input","name","inputClasses","classNames","dirty","value","invalid","div","className","label","htmlFor","style","position","required","span","br","select","id","size","multiple","onFocus","onBlur","width","height","border","marginTop","children","ReCAPTCHA","React","DynamicContactFormContent","DynamicFieldsList","CaptchaSiteKey","BtnLabel","onChangeRecaptcha","submitting","captchaToken","collapsible","useState","didMount","setDidMount","isCollapsed","setIsCollapsed","useEffect","firstInput","collapsedDynamicFields","slice","createField","SliderVerticalAnimation","visible","map","Suspense","fallback","sitekey","hl","onChange","p","button","type","disabled","i","customOnChange","component","Type","Name","Label","IsRequired","Sections","TextField","TextareaField","length","section","key","Field","index","optGroupKey","SectionName","split","join","optgroup","Products","product","optKey","ISBN","option","Title","DynamicContactForm","props","onSubmit","bind","verifyReCaptchaCallback","state","componentDidMount","this","setState","Promise","JSON","parse","clonedData","ProductSelector","products","contactFormSubmit","FormTitle","formId","captchaResponse","resolve","reject","response","Payload","errors","headingClasses","contentRowClasses","dangerouslySetInnerHTML","Collapsible","submitSucceeded","SubmitSuccessText","initialValues","contactFormComposer","connect","form","SlideVerticalAnimation","maxLength","textarea","Component","contactFormSubmitPending","contactFormSelector","contactFormSubmitSuccess","dispatch","webApiUrl","formInfo","contactFormActions"],"sourceRoot":""}