{"version":3,"file":"903.00b25be3ea46d579541b.min.js","mappings":"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","sources":["webpack://Vollrath.Kentico.Web/./js/shared/react/components/inspiration-grid.jsx"],"sourcesContent":["import React, { Component } from \"react\";\r\nimport ReactPaginate from 'react-paginate';\r\nimport Blog from './blog-item.jsx';\r\nimport LoaderSection from './loader-section.jsx';\r\nimport { getUrlParams, generatePaginationHref } from '../../utils/';\r\nimport debounce from 'lodash/debounce';\r\nimport kebabCase from 'lodash/kebabCase';\r\nimport Filters from './filters.jsx';\r\nimport toast from '../../components/toast';\r\nimport FilteringBase from './filtering-base';\r\n\r\nclass InspirationGridContainer extends FilteringBase {\r\n    constructor(props) {\r\n        super(props);\r\n\r\n        this.state = Object.assign({}, this.baseState, {\r\n            filters: {},\r\n            pageSize: 12,\r\n            firstSearch: true\r\n        });\r\n\r\n        this.handleChange = this.handleChange.bind(this);\r\n        this.onSearchInput = this.onSearchInput.bind(this);\r\n        this.handlePageClick = this.handlePageClick.bind(this);\r\n        this.loadDebounce = debounce(this.load.bind(this), 1000);\r\n    }\r\n\r\n    setFilters() {\r\n        const tags = [...this.props.tags];\r\n        const authors = [...this.props.authors];\r\n        const categories = [...this.props.categories];\r\n        tags.forEach(t => t.Selected = false);\r\n        authors.forEach(a => a.Selected = false);\r\n        categories.forEach(c => c.Selected = false);\r\n        return new Promise((resolve) => {\r\n            console.log(tags, authors);\r\n            this.setState({\r\n                filters: {\r\n                    Categories: categories,\r\n                    Tags: tags,\r\n                    Authors: authors\r\n                }\r\n            }, () => resolve());\r\n        });\r\n    }\r\n\r\n    componentDidMount() {\r\n        this.setFilters().then(() => {\r\n            this.updateFilters();\r\n            let params = getUrlParams();\r\n            let pageNum;\r\n            if (Object.keys(params).length) {\r\n                pageNum = params.page !== '1' ? params.page : 1;\r\n                this.setState({ page: pageNum }, () => {\r\n                    this.load();\r\n                });\r\n            } else {\r\n                this.load();\r\n            } \r\n\r\n            window.addEventListener('popstate', e => {\r\n                this.updateFilters();\r\n                let params = getUrlParams();\r\n                let pageNum;\r\n                if (Object.keys(params).length) {\r\n                    pageNum = params.page !== '1' ? params.page : 1;\r\n                    this.setState({ page: pageNum }, () => {\r\n                        this.load(false);\r\n                    });\r\n                } else {\r\n                    this.setState({ page: 1 }, () => { this.load(false) });    \r\n                } \r\n            });\r\n        });\r\n    }\r\n\r\n    // load products from the api\r\n    load(pushState = true) {\r\n        if (this.ajaxPromise) this.ajaxPromise.controller.abort();\r\n\r\n        this.setState({\r\n            isLoading: true,\r\n            items: []\r\n        });\r\n\r\n        if (pushState && !this.state.firstSearch) {\r\n            history.pushState(null, document.title, this.getUrl());\r\n        }\r\n\r\n        // put together api parameters\r\n        const params = this.getAllFilters();\r\n        params.pageSize = this.state.pageSize;\r\n        // remove empty or undefined params\r\n        Object.keys(params).forEach(key => {\r\n            if (!params[key]) delete params[key];\r\n        });\r\n\r\n        this.setState({\r\n            firstSearch: false\r\n        });\r\n\r\n        if (!this.state.q) {\r\n            this.ajaxPromise = this.props.api(params);\r\n        } else {\r\n            this.ajaxPromise = this.props.search(params);\r\n        }\r\n\r\n        this.ajaxPromise.then(data => {\r\n            console.log(data);\r\n            this.setState({\r\n                items: data.records,\r\n                totalRecords: data.totalRecords,\r\n                isLoading: false\r\n            });\r\n            return data;\r\n        })\r\n            .catch(error => {\r\n                console.log(error);\r\n                if (error.name === 'AbortError') return error;\r\n                this.setState({\r\n                    isLoading: false\r\n                });\r\n                toast.error('There was an error getting results');\r\n                return error;\r\n            });\r\n\r\n        return this.ajaxPromise;\r\n    }\r\n\r\n\r\n    // set the selected state of the filters to false\r\n    resetFilterData(data) {\r\n        for (const [key, value] of Object.entries(data)) {\r\n            value.forEach(v => v.Selected = false);\r\n        }\r\n    }\r\n\r\n    // update filters on page using the url parameters\r\n    updateFilters() {\r\n        const params = getUrlParams(),\r\n            filters = Object.assign({}, this.state.filters);\r\n\r\n        // reset filters to be unselected\r\n        this.resetFilterData(filters);\r\n        // go through params and update selected filters\r\n        for (const paramKey in params) {\r\n            const values = params[paramKey].split('|');\r\n            const filterSection = Object.entries(filters).find(([key]) => kebabCase(key) === paramKey);\r\n            console.log(filterSection, values);\r\n\r\n            if (filterSection) {\r\n                values.forEach(value => {\r\n                    const filter = filterSection[1].find(f => f.Id === +value);\r\n                    if (filter) filter.Selected = true;\r\n                });\r\n            }\r\n        }\r\n\r\n        // update search query\r\n        if (params.q) this.setState({ q: params.q });\r\n\r\n        this.setState({\r\n            filters: filters,\r\n            page: params['page'] ? +params['page'] : 1\r\n        });\r\n    }\r\n\r\n    // get all the selected filters at this time\r\n    getAllFilters() {\r\n        const params = {\r\n            q: this.state.q,\r\n            page: this.state.page\r\n        };\r\n\r\n        for (const [key, value] of Object.entries(this.state.filters)) {\r\n            value.forEach(v => {\r\n                if (v.Selected) {\r\n                    const paramKey = kebabCase(key),\r\n                        encodedValue = v.Id;\r\n                    if (params[paramKey]) params[paramKey].push(encodedValue);\r\n                    else params[paramKey] = [encodedValue];\r\n                }\r\n            });\r\n        }\r\n\r\n        // pipe delimit array values\r\n        Object.keys(params).forEach(key => {\r\n            if (Array.isArray(params[key])) params[key] = params[key].join(',');\r\n        });\r\n\r\n        return params;\r\n    }\r\n\r\n    // get the url for the current window location\r\n    getUrl() {\r\n        const baseUrl = `${window.location.pathname}`,\r\n            filters = this.getAllFilters(),\r\n            params = [];\r\n        for (const key in filters) {\r\n            const val = filters[key];\r\n            if (((key === 'page' && val > 1) || key !== 'page')) {\r\n                if (val) params.push(`${key}=${encodeURIComponent(val)}`);\r\n            }\r\n        }\r\n\r\n        return `${baseUrl}${params.length ? '?' : ''}${params.join('&')}`;\r\n    }\r\n\r\n    handleChange(e) {\r\n        const target = e.target,\r\n            isChecked = target.checked,\r\n            name = target.name,\r\n            value = +target.value,\r\n            filters = Object.assign({}, this.state.filters);\r\n\r\n        Object.keys(filters).forEach(key => {\r\n            const match = filters[key].find(f => f.Id === value && key === name);\r\n            if (match) match.Selected = isChecked;\r\n        });\r\n\r\n        this.setState({\r\n            filters: filters,\r\n            page: 1\r\n        }, () => {\r\n            this.load();\r\n        });\r\n    }\r\n\r\n    onSearchInput(value) {\r\n        this.setState({\r\n            q: value\r\n        }, () => {\r\n            this.loadDebounce();\r\n        });\r\n    }\r\n\r\n    render() {\r\n        let pagination,\r\n            loader,\r\n            results;\r\n        if (this.showPagination()) {\r\n            pagination = <ReactPaginate\r\n                previousLabel={'<'}\r\n                nextLabel={'>'}\r\n                breakLabel={'...'}\r\n                breakClassName={'break-me'}\r\n                pageCount={this.pages()}\r\n                marginPagesDisplayed={2}\r\n                pageRangeDisplayed={5}\r\n                onPageChange={this.handlePageClick}\r\n                containerClassName={'pagination'}\r\n                subContainerClassName={'pages pagination'}\r\n                activeClassName={'active'}\r\n                forcePage={this.state.page - 1}\r\n                hrefBuilder={generatePaginationHref}\r\n            />;\r\n        }\r\n\r\n        if (this.state.items.length > 0) {\r\n            results = <div className=\"row\">\r\n                {this.state.items.map((blog, index) => (\r\n                    <this.props.item key={index} {...blog} />\r\n                ))}\r\n            </div>;\r\n        }\r\n        else if (!this.state.isLoading) {\r\n            results = <p>No results found</p>;\r\n        }\r\n\r\n        if (this.state.isLoading) loader = <LoaderSection show={true} />;\r\n\r\n        return (\r\n            <div className=\"row\">\r\n                <div className=\"col-lg-3\">\r\n                    <Filters q={this.state.q} handleSearchChange={this.onSearchInput}>\r\n                        {Object.entries(this.state.filters).map(([key, value]) => (\r\n                            <div key={key}>\r\n                                {value.length > 0 &&\r\n                                    <details className=\"filter-accordion\" open role=\"group\" aria-labelledby={'filter-' + kebabCase(key)}>\r\n                                        <summary className=\"filter-accordion-header\" id={'filter-' + kebabCase(key)}><span>{key}</span></summary>\r\n                                        <div className=\"filter-accordion-content\">\r\n                                            {value.map((filter, index) => (\r\n                                                <div key={index}>\r\n                                                    <input className=\"custom-checkbox square\" id={filter.Name} type=\"checkbox\" name={key} value={filter.Id} onChange={this.handleChange} checked={filter.Selected} />\r\n                                                    <label htmlFor={filter.Name}>\r\n                                                        <span>{filter.Name}</span>\r\n                                                    </label>\r\n                                                </div>\r\n                                            ))}\r\n                                        </div>\r\n                                    </details>\r\n                                }\r\n                            </div>\r\n                        ))}\r\n                    </Filters>\r\n                </div>\r\n                <div id=\"results\" className=\"col-lg-9\">\r\n                    {loader}\r\n                    {results}\r\n                    {pagination}\r\n                </div>\r\n            </div>\r\n        );\r\n    }\r\n}\r\n\r\nInspirationGridContainer.defaultProps = {\r\n    authors: [],\r\n    tags: [],\r\n    categories: [],\r\n    item: Blog\r\n};\r\n\r\nexport default InspirationGridContainer;"],"names":["InspirationGridContainer","props","state","Object","assign","baseState","filters","pageSize","firstSearch","handleChange","bind","onSearchInput","handlePageClick","loadDebounce","debounce","load","tags","this","authors","categories","forEach","t","Selected","a","c","Promise","resolve","console","log","setState","Categories","Tags","Authors","setFilters","then","updateFilters","pageNum","params","getUrlParams","keys","length","page","window","addEventListener","e","pushState","ajaxPromise","controller","abort","isLoading","items","history","document","title","getUrl","getAllFilters","key","q","search","api","data","records","totalRecords","error","name","toast","entries","v","resetFilterData","paramKey","values","split","filterSection","find","kebabCase","value","filter","f","Id","encodedValue","push","Array","isArray","join","baseUrl","location","pathname","val","encodeURIComponent","target","isChecked","checked","match","pagination","loader","results","showPagination","previousLabel","nextLabel","breakLabel","breakClassName","pageCount","pages","marginPagesDisplayed","pageRangeDisplayed","onPageChange","containerClassName","subContainerClassName","activeClassName","forcePage","hrefBuilder","generatePaginationHref","className","map","blog","index","item","show","handleSearchChange","open","role","id","Name","type","onChange","htmlFor","FilteringBase","defaultProps","Blog"],"sourceRoot":""}