{"version":3,"file":"index.cjs","sources":["../src/nestedSelectsReact/createStructure.js","../src/nestedSelectsReact/functionalComponents.jsx","../src/components/select.jsx","../src/components/option.jsx","../src/utils/cycle.js","../src/utils/parseChildren.js","../src/utils/storeDataControl.js","../src/nestedSelectsReact/nestedSelectsReact.jsx","../src/components/makeVisible.jsx"],"sourcesContent":["// *****************************************************************\n// *****************************************************************\n// metodos para definir y agregar los elementos mas facilmente\n// API para agregar datos facilmente\nclass ElementsStructure{\n    constructor(){\n        this.elementsStructure = [];\n        // guardar como {llave: valor} todas las opciones existentes\n        // para poder acceder a ellas rapidamente en caso de querer darle un valor a su propiedad makeVisble\n        // recordar que un objeto option se vería asi\n        /**\n         * { <<optionValue>>: {value, text, elementType ,makeVisible} }\n         */\n        this.allOptions = {};\n    }\n\n\n\n\n    // ========================== methods to make select, option and React components ==================\n\n    // make individual select object and return it\n    _makeSelect({\n        name,\n        id = null,\n        customchange = null,\n        placeholder = 'please select an option',\n        label = null\n    }){\n        // make select object\n        let selectObject = {\n            name, // mandatory / obligatorio\n            id,\n            customchange,\n            placeholder,\n            label,\n            elementType: 'select',\n            options: []\n        }\n        // verify the object keys and values\n        let isGood = this._verifyKeysAndValues('selectObject', selectObject);\n        if(isGood){\n            return selectObject;\n        }\n        // mandatory {name: value} is not valid\n        else{\n            throw new Error('the \\'name\\' property is mandatory. You can also use the \\'id\\' property. Error with the (<Select>|selectObject)');\n        }\n    \n    }\n\n\n    // make just one option object and return it\n    _makeOption({ value, text, makeVisible = [] }){\n        const option = {\n            value,\n            text,\n            makeVisible,\n            elementType: 'option', // add elementType key\n        }\n        // save in global options\n        this.allOptions[value] = option; \n        \n        return option;\n\n    }\n\n\n    // make options\n    // return an array of options objects\n    _makeOptions(optionsArray){\n        let optArr = []\n        // make each option\n        for(let option of optionsArray){\n            optArr.push(\n                this._makeOption(option) // returns a option object\n            )\n        }\n\n        // verify mandatory { value, text } for every optionObject in optionsArray \n        let allGood = this._verifyKeysAndValues('optionsArray', optArr);\n        if(allGood){ return optArr; }\n        // mandatory { value, text } is not valid\n        else{\n            throw new Error('the \\'value\\' and \\'text\\' propertys are mandatory for every optionObject in the array. Error with the optionObject');\n        }\n\n\n    }\n\n\n    // make a object with a react component inside\n    _makeReactComponentObj({ name, component}){\n        return {\n            elementType: 'component',\n            name,\n            component\n        }\n    }\n\n\n    // ================= methods to build the principal structure ====================\n\n    // add options array to select object \n    // addSubElements(elementsToAdd, fatherElement , optionValue = '' ){\n    addOptionsToSelect(fatherSelect, childsOptions){\n        let elementType;\n        /* ver si existe un elemento padre, en caso de no existir es porque se quiere añadir\n           un makeVisible[] a una option{} en especifico. Si si existe fatherSelect es porque se \n           quiere añadir las option{} a un select{}  \n        */ \n        if(fatherSelect) elementType = fatherSelect.elementType;\n        // si es un select, agregar las options[] a ese select\n        if( /select/i.test(elementType) ){\n            fatherSelect.options = childsOptions;\n        }\n        else{\n            throw new Error(`Error adding subElements, check the parameters: \\n \n                 { \n                     fatherSelect : object,  \n                     childsOptions : object\n                 }`);\n        }\n\n    }\n\n\n    // \"enlazar\" un elemento hijo, ya sea otro <select> ó un <Component/>\n    // a su <option> 'disparadora', es decir, cuando se seleccione dicha <option>\n    // un elemento se va a renderizar.\n    linkElementWithTriggerOption(element, triggerOption){\n        \n        const link = option => {\n            // ver si es un array de objetos o un solo objeto\n            if(element instanceof Array) option.makeVisible = [...option.makeVisible, ...element];\n            else option.makeVisible = [...option.makeVisible, element ];\n        }\n\n        // si se le pasa el nombre de la trigger option\n        if(typeof triggerOption === 'string'){\n            let option = this.allOptions[triggerOption];\n            // si existe una opción con dicho value\n            if(option) link(option);\n            // no existe una opcion con ese value\n            else throw new Error(`there is no option with this value: ${triggerOption}`);\n        }\n        // si es un objeto <option>{}\n        else if(triggerOption.elementType === 'option'){\n            link(triggerOption);\n        }\n        // no pasó ni el value de la opción ni el objeto opción como tal\n        else{\n            console.error(`the triggerOption must be a string with the option value or an element option object, instead this was received:`, triggerOption);\n            throw new Error(`error in linkElementWithTriggerOption method`);\n        }\n    }\n\n\n    // *********************************************************************************\n    // *********************************************************************************\n    /**\n     * Make a element object like a select, option or a react component.\n     * @method\n     * @param {string} elementType - select | option | options | component.\n     * @param {object} object - a object with the values of component.\n     */\n    makeElement(elementType, { \n        name, // for all\n        id, // (optional) for all\n        placeholder = 'please select an option', // for <select>\n        optionsArray = [], // for <select>\n        customchange, // for <select>\n        label, // for <select>\n        value, // for <option>\n        text, // for <option>\n        component, // for <Component/>\n     }){\n\n        let elementCreated;\n        // make a select{} object\n        if(/select/i.test(elementType)){\n            elementCreated = this._makeSelect({ name, id, customchange, placeholder, label });\n        }\n        // make just one option{} object\n        else if(/option\\b/i.test(elementType)){\n            elementCreated = this._makeOption({ value, text });\n        }\n        // make multiple option{} objects\n        else if(/options/i.test(elementType)){\n            elementCreated = this._makeOptions(optionsArray);\n        }\n        // make component\n        else if(/component/i.test(elementType)){\n            elementCreated = this._makeReactComponentObj({ name, component});\n        }\n\n        return elementCreated;\n    }\n\n    // agregar a la estructura principal\n    // save and return principals elements\n    savePrincipalSelects(...principalSelectObjects){\n        this.elementsStructure = principalSelectObjects;\n        return this.elementsStructure;\n    }\n    \n\n\n    // buscar por medio de la propiedad value en todas las opciones globales\n    // y la option{} que tenga ese 'value' modificarle la propiedad 'makeVisible'\n    _searchOptionAndSetMakeVisible(optionValue, elementsToAdd){\n        if(this.allOptions[optionValue]){\n\n            // if elementsToAdd is just one object\n            if( !(elementsToAdd instanceof Array) ) elementsToAdd = [elementsToAdd];\n\n            this.allOptions[optionValue].makeVisible = elementsToAdd;\n        }\n        // no existe dicha option{} con tal 'value'\n        else{\n            throw new Error(`there is no option with this value: ${optionValue}`)\n        }\n    }\n\n    // verify mandatory keys and values for objects created\n    // so this verify for example if selectObject has a name,\n    // and every option in optionsArray has a truty { value, text }\n    _verifyKeysAndValues(objectType, objNode){\n        if(objectType === 'selectObject'){\n            // check name key \n            return objNode['name'] || objNode['id'] ? true : false;\n        }\n        else if(objectType === 'optionsArray'){\n            //  optionsArray\n            for(let optionObj of objNode){\n                let { value, text } = optionObj;\n                if( !(value && text  ) ) return false; // check truty values\n            }\n            return true; // all good\n        }\n        // sub element, like a <div> or a React Component\n        else{\n            // in development\n        }\n\n    }\n\n    \n}\n\n\n\n\n// funcion para obtener el valor de los <select> dentro de <NestedSelects/>\n// esta función se usa dentro de \n\n\nexport default ElementsStructure;\n\n// export { \n//     ElementsStructure \n\n// };","import React from 'react';\n\n\n// make a <select>\n// to can save the childs component data, makeVisible atrtibute is used with JSON.stringify \nconst MakeSelect = ({select, isSubSelect, onChange}) => {\n    const { name, placeholder, options, label, id } = select;\n    \n    return(\n        <div key={name} className=\"nsr-select-container\">\n            {/* if label exist */}\n            { \n                label \n                && \n                <label className=\"nsr-label\" style={{display: 'block'}}>{label}</label>    \n            }\n\n            <select name={name} onChange={onChange} {...{id}} className={ isSubSelect ? 'nsr-sub-select': ''}>\n                {/* default option */}\n                <option value=\"\">{placeholder || 'please select an option'}</option>\n                {/* <select/> options */}\n                {\n                    options.map( (option, index) => {\n                        let { value, text, makeVisible } = option;\n                        \n                        return <option value={value} key={index} makevisible={JSON.stringify(makeVisible)}>{text}</option>\n                    })\n                }\n            </select>\n        </div> \n    )\n}\n\n\nexport {\n    MakeSelect\n}\n\n","import React from 'react';\n\nfunction Select({name, id, customchange, children}){\n    \n    return <></>;\n}\n\nexport default Select;","import React from 'react';\n\nfunction Option({value, children}){\n    return <></>;\n}\n\nexport default Option;","/*\n    cycle.js\n    2018-05-15\n\n    Public Domain.\n\n    NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK.\n\n    Adapted from Douglas Crockford's cycle.js: only decycle is used by this\n    library, exported as a module instead of patching the global JSON object.\n*/\n\n// The file uses the WeakMap feature of ES6.\n\nexport function decycle(object, replacer) {\n    \"use strict\";\n\n// Make a deep copy of an object or array, assuring that there is at most\n// one instance of each object or array in the resulting structure. The\n// duplicate references (which might be forming cycles) are replaced with\n// an object of the form\n\n//      {\"$ref\": PATH}\n\n// where the PATH is a JSONPath string that locates the first occurance.\n\n// So,\n\n//      var a = [];\n//      a[0] = a;\n//      return JSON.stringify(decycle(a));\n\n// produces the string '[{\"$ref\":\"$\"}]'.\n\n// If a replacer function is provided, then it will be called for each value.\n// A replacer function receives a value and returns a replacement value.\n\n// JSONPath is used to locate the unique object. $ indicates the top level of\n// the object or array. [NUMBER] or [STRING] indicates a child element or\n// property.\n\n    var objects = new WeakMap();     // object to path mappings\n\n    return (function derez(value, path) {\n\n// The derez function recurses through the object, producing the deep copy.\n\n        var old_path;   // The path of an earlier occurance of value\n        var nu;         // The new object or array\n\n// If a replacer function was provided, then call it to get a replacement value.\n\n        if (replacer !== undefined) {\n            value = replacer(value);\n        }\n\n// typeof null === \"object\", so go on if this value is really an object but not\n// one of the weird builtin objects.\n\n        if (\n            typeof value === \"object\"\n            && value !== null\n            && !(value instanceof Boolean)\n            && !(value instanceof Date)\n            && !(value instanceof Number)\n            && !(value instanceof RegExp)\n            && !(value instanceof String)\n        ) {\n\n// If the value is an object or array, look to see if we have already\n// encountered it. If so, return a {\"$ref\":PATH} object. This uses an\n// ES6 WeakMap.\n\n            old_path = objects.get(value);\n            if (old_path !== undefined) {\n                return {$ref: old_path};\n            }\n\n// Otherwise, accumulate the unique value and its path.\n\n            objects.set(value, path);\n\n// If it is an array, replicate the array.\n\n            if (Array.isArray(value)) {\n                nu = [];\n                value.forEach(function (element, i) {\n                    nu[i] = derez(element, path + \"[\" + i + \"]\");\n                });\n            } else {\n\n// If it is an object, replicate the object.\n\n                nu = {};\n                Object.keys(value).forEach(function (name) {\n                    nu[name] = derez(\n                        value[name],\n                        path + \"[\" + JSON.stringify(name) + \"]\"\n                    );\n                });\n            }\n            return nu;\n        }\n        return value;\n    }(object, \"$\"));\n}\n","import Structure from '../nestedSelectsReact/createStructure';\nimport Select from '../components/select';\nimport Option from '../components/option';\nimport { decycle } from './cycle';\n\n// parse react childrens\nclass ParseChildren{\n    constructor(nestedSelectReactchildren){\n        this.nestedSelectReactchildren = nestedSelectReactchildren;\n        this.principalSelects = [];\n        // structure API\n        this.struct = new Structure();\n    }\n\n \n\n    // este metodo analiza una <Option/> ó una optionNode{} a la vez\n    // para ver si dicha opción tiene sub-elementos\n    // en caso de tenerlos se llama recursivamente en el método 'this.checkTypeOfChildrenComponents()'\n    // si no tiene sub-elementos simplemente retorna un optionNode hecho con la Structure API \n    findSubElementsInEachOption(reactOptionChildren, optionNode = null){\n        // si no es un nodo option hecho anteriormente con la api\n        if(!optionNode){\n            let { value, children } = reactOptionChildren.props;\n            let text, makeVisibleChildren ;\n            // the option have 2 or more children\n            if( Array.isArray(children) ){\n                text = children[0];\n                makeVisibleChildren = children[1].props.children;\n            }\n            else text = children; // is a string \n            \n            // make option\n            let option = this.struct.makeElement('option', { value, text });\n            // the option have 2 children, text and <MakeVisible>\n            if( Array.isArray(children) ){\n                // have multiple children inside <MakeVisible>\n                if( Array.isArray(makeVisibleChildren) ){\n                    for(let element of makeVisibleChildren){\n                        // decycle json\n                        element = decycle(element);\n                        this.checkTypeOfChildrenComponents(element, option);\n                    }\n                }\n                // have just one child inside <MakeVisible>\n                else {\n                    // decycle json\n                    makeVisibleChildren = decycle(makeVisibleChildren);\n                    this.checkTypeOfChildrenComponents(makeVisibleChildren, option);\n                }\n\n            }\n    \n            return option;\n        }\n        // si es un optionNode pasado por parametro\n        else{\n            this.checkTypeOfChildrenComponents(reactOptionChildren, optionNode);\n        }\n\n    }\n\n\n\n    // analizar el elemento y ver que tipo es, por ejemplo \n    // <Select/>, <Option/>, <MakeVisible/>, ó un <componente react />\n    // si es un <Select/> se analiza cada una de sus <Option/> para ver si tiene <MakeVisible/> dentro\n    // si NO es un <Select/> solo se agrega el <componente react> a la propiedad makevisible\n    // de la opción. option.makeVisible.push( <componente react> )\n    checkTypeOfChildrenComponents(reactElement, optionNode){\n        let elementNode, // select, option or component node, made with the structure API\n        reactSelectOptions, // <Option>'s from <Select/>\n        opts = [], // option node made with structure API\n        optChildren, // each posible children of an <Option/>\n        makeVisibleComponentChildren; // all the children inside a <MakeVisible/> component\n        \n\n        // create the element node with the structure API\n        elementNode = this.createElementNode(reactElement);\n        \n        \n        // check the type of the created node \n        if(elementNode.elementType === 'select'){\n            // agregar sub select a la lista de makeVisible\n            optionNode.makeVisible.push( elementNode );\n            // convertir cada <Option/> en un objeto option, con ayuda de la API\n            reactSelectOptions = reactElement.props.children;\n\n            // have 2 or more options\n            if( Array.isArray(reactSelectOptions) ){\n                for(let opt of reactSelectOptions){\n                    opts.push( this.createElementNode(opt) )\n                }\n            }\n            // just 1 option\n            else {\n                opts.push( this.createElementNode(reactSelectOptions))\n            }\n\n            // asociar opciones al sub-select\n            elementNode.options = opts;\n            \n            // ir por cada una de las opciones viendo si tienen subElementos '<MakeVisible/>'\n            for(let i = 0; i < elementNode.options.length; i++){\n                // si una de las opciones tiene más de un hijo\n                // es porque tiene un <MakeVisible/>\n                \n                const optionChildren = Array.isArray(reactSelectOptions) ? reactSelectOptions[i] : reactSelectOptions; \n                if(optionChildren.props.children instanceof Array){\n                    optChildren = reactSelectOptions[i].props.children; \n                    makeVisibleComponentChildren = optChildren[1].props.children;\n                    // iterar por cada uno de los componentes hijos de <MakeVisible/>\n                    \n                    // en caso de que el <MakeVisible> tenga un (1) solo hijo\n                    if(makeVisibleComponentChildren instanceof Array === false){\n                        this.checkTypeOfChildrenComponents(\n                            makeVisibleComponentChildren, \n                            elementNode.options[i] // opcion actual <<i>> \n                        );\n                    }\n                    // en caso de que tenga mas de un (1) hijo el <MakeVisible>\n                    else{\n                        for(let j = 0; j < makeVisibleComponentChildren.length ; j++){\n                            // recursive call for 'findSubElementsInEachOption()'\n                            // in case the current node is of type 'select' since a select has\n                            // several options and these in turn can have several sub elements\n                            this.findSubElementsInEachOption(\n                                makeVisibleComponentChildren[j],\n                                elementNode.options[i]\n                            );\n                        }\n                    }\n\n                }\n            }\n        }\n        else if(elementNode.elementType === 'component'){\n            optionNode.makeVisible.push( elementNode );\n        }\n    }\n\n\n\n    // create the element depends element type\n    // returns { elementNode: Object }\n    createElementNode(reactElement){\n        let elementNode;\n        const name = reactElement.type.name;\n        // is a <Select> made with the built in components\n        // NOTE: compared by reference, component names don't survive consumers' minifiers\n        if(reactElement.type === Select){\n            elementNode = this.struct.makeElement('select', {...reactElement.props}  )\n        }\n        // is an <Option> made with the built in components\n        else if(reactElement.type === Option){\n            elementNode = this.struct.makeElement('option', {...reactElement.props}  )\n            // <Option> text\n            if(typeof reactElement.props.children === \"string\"){\n                elementNode.text = reactElement.props.children;\n            }\n            else{\n                elementNode.text = reactElement.props.children[0];\n            }\n        }\n        // is a custom react component like '<MyComponent />'\n        else if(name){\n            elementNode = this.struct.makeElement('component', {\n                // name: reactElement.type.name + '-' + Math.random(), // random name,\n                name: reactElement.type.name,\n                component: reactElement\n            });\n        }\n        // is a default react component like <h1>, <p>, <a>, <div>, etc\n        else{\n            elementNode = this.struct.makeElement('component', {\n                name: reactElement.type + '-' + Math.random(), // random name,\n                component: reactElement\n            })\n        }\n\n        return elementNode;\n    }\n\n\n    // ============= parse components to object with the structure API =============\n    getParsedData(){\n        \n        let nestedSelectReactchildren;\n\n        if(this.nestedSelectReactchildren instanceof Array)\n            nestedSelectReactchildren = this.nestedSelectReactchildren; \n        else\n            nestedSelectReactchildren = [this.nestedSelectReactchildren];\n        \n\n        // principal selects\n        for(let reactPrincipalSelect of nestedSelectReactchildren){\n            \n            const { \n                name, \n                id, \n                customchange, \n                label, \n                placeholder,\n                'children': reactOptionsChildren \n            } = reactPrincipalSelect.props;\n            \n            \n            // make select with the API\n            const select = this.struct.makeElement('select', {\n                name,\n                id,\n                customchange,\n                label,\n                placeholder, \n            });\n     \n            // loop each <Option/> and its sub-elements\n            let options = [];\n\n            if( Array.isArray(reactOptionsChildren) ){\n                \n                for(let reactOptionChild of reactOptionsChildren){\n                    options.push( this.findSubElementsInEachOption(reactOptionChild) );\n                };\n            } \n            else{\n                options.push(this.findSubElementsInEachOption(reactOptionsChildren));\n            }\n            \n            // add options to current principalSelect\n            this.struct.addOptionsToSelect(select, options);\n            \n\n            // save the select to principal selects\n            this.principalSelects.push(select);\n\n        }\n\n        \n        \n        \n        // JSON.decycle './cycle.js' to get a plain javascript object\n        // let decycleObjectsArr = this.principalSelects.map( obj => JSON.decycle(obj) );\n\n           \n        // parsed components\n        // return decycleObjectsArr;\n        return this.principalSelects;\n    }\n\n\n}\n\nexport default ParseChildren;","\n// mapear todos los subelementos de cada elemento que viene en la estructura original,\n// es decir, la estructura hecha a mano o con la API, para relacionar el elemento con sus datos\n// y guardar éstos últimos (datos) en el selectStoreData.\n// Ésto se hace porque cuando el usuario selecciona un <select> anterior aún se sigue\n// guardando el valor de sus hijos los cuales ya no estarían en pantalla, y eso no debe ser asi.\n// ya que solamente se debe guardar el valor de los <select> en pantalla y los <Component/> en pantalla.\nfunction mapOriginalElementsToStoreData(originalSelectsArray){\n    \n    let dataOfEachNode = {};\n\n    const findRecursively = node => {\n        const { id, name, options} = node;\n        const key = String(id || name);\n        // guardar la referencia\n        dataOfEachNode[key] = {\n            nodeData: {},\n            childrenNames: []\n        } \n        // revisar las <option>\n        for(let option of options || []){\n            const { makeVisible } = option;\n            // revisar makeVisible de las <option>\n            if(makeVisible){\n                for(let toMakeVisibleElement of makeVisible){\n                    const { name, id } = toMakeVisibleElement;\n                    // agregar nombre a la lista de nombres de los hijos de su padre, Suena raro verdad? xD\n                    dataOfEachNode[key].childrenNames.push(id || name);\n                    \n                    // iterar recursivamente hacia los elementos más internos\n                    findRecursively(toMakeVisibleElement);\n                    \n                }\n            }\n        }\n    }\n\n    // iterar por los principales <select>\n    for(let node of originalSelectsArray){\n        findRecursively(node);\n    }\n\n    return dataOfEachNode;\n} \n\n\n// mapear el <Component/> al selectStoreData{} para asi poder\n// guardar sus datos cuando esté en pantalla y también para poder borrar dichos datos\n// en caso de ya no estar en pantalla\n// nombre larguisimo pero al menos se entiende lo que hace la función xd\nfunction mapComponentInsertedWithCustomOnChangeToStoreData(selectName, componentName, selectStoreData){\n    const selectsData = {...selectStoreData};\n    const { childrenNames } = selectsData[selectName];\n    // incluir el nuevo componente en el storage\n    childrenNames.push(componentName);\n    \n    selectsData[componentName] = {\n        nodeData: {},\n        childrenNames: []\n    }\n\n    // ahora se debe encontrar todos los elementos por encima del <Component />\n    // para que al momento de seleccionar un anterior <select> ya no se guarden más\n    // los datos selectsData{}, en resumen, si no esta en pantalla, no se guardan sus datos\n    const updateChildrenNamesRecursively = (childrenNames) => {\n        for(let name of childrenNames){\n            // array con el nombre de los hijos\n            const names = selectsData[name].childrenNames;\n\n            if(!name.includes(componentName) && names.length > 0) names.push(componentName);\n\n            updateChildrenNamesRecursively(names);\n        }\n    }\n\n    updateChildrenNamesRecursively(childrenNames);\n    return selectsData;\n\n}\n\n\n\n// borrar datos viejos de selectStoreData\nfunction deleteOldSelectStoreData(selectName, selectStoreData){\n    const selectsData = {...selectStoreData};\n    \n    const { childrenNames } = selectsData[selectName];\n\n    const deleteRecursively = (childrenNames) => {\n        for(let name of childrenNames || []){\n            // borrar datos\n            selectsData[name].nodeData = {}\n            // nombre de los hijos\n            const names = selectsData[name].childrenNames;\n            if(names.length) deleteRecursively(names);\n        }\n    }\n\n    deleteRecursively(childrenNames);\n\n    return selectsData;\n} \n\n\n\n// parsear selectStoreData para tener los datos limpios en un json\nfunction parseSelectsStoreData(selectStoreData){\n    let cleanData = {};\n\n    for(let key in selectStoreData){\n        let { nodeData } = selectStoreData[key];\n        // is not a void value\n        if(Object.keys(nodeData).length > 0){\n\n            if(typeof nodeData === 'string'){\n                cleanData[key] = nodeData;\n            }\n            // else, have a <Component/> keyName { [MyComponentName]: {...componentValues} }\n            else{\n                const componentName = Object.keys(nodeData)[0];\n                cleanData[componentName] = nodeData[componentName];\n            }\n        }\n    }\n    return cleanData;\n}\n\n// parse the <select> data with parseSelectsStoreData method\nfunction parse(jsonToParse){\n    return parseSelectsStoreData(jsonToParse);\n}\n\n\n \n\nexport {\n    parse,\n    mapOriginalElementsToStoreData,\n    mapComponentInsertedWithCustomOnChangeToStoreData,\n    deleteOldSelectStoreData,\n}","import React, { Component, cloneElement } from 'react';\n// functional components\nimport { MakeSelect } from './functionalComponents';\n// built in components\nimport Select from '../components/select';\n// api\nimport UserAPI from './createStructure';\n// utils\nimport ParseChildren from '../utils/parseChildren';\nimport { \n    parse,\n    mapOriginalElementsToStoreData,\n    mapComponentInsertedWithCustomOnChangeToStoreData,\n    deleteOldSelectStoreData\n } from '../utils/storeDataControl';\n\n\nclass NestedSelectsReact extends Component{ \n   \n    state = {\n        originalSelects: null,\n        htmlToDraw: [],\n        loading: true\n    }\n\n    \n    elementsStructure = []; // array de objetos con subObjetos dentro. Estructura de todos los <select> en forma de arbol\n    linearHtmlArrNodes = []; // array para renderizarlos de forma lineal, separado en grupos grandes (ver método organizarElementos )\n    \n    // guarda una referencia nombre-valor para guardar los components que se quieran renderizar\n    // se hace esto debido a que JSON.stringify no guarda métodos\n    componentsReferences = {};\n    \n    // guarda una referencia { name: function } ó { id: function } para guardar las funciones onChange personalizadas \n    // \"customchange\". Esto se hace debido a que JSON.stringify no guarda métodos y/o funciones\n    customOnChangeReferences = {};\n    \n    // api que permite al usuario crear objetos de elementos\n    // aquí en este componente se usará para manejar más comodamente el evento customchange\n    userAPI = new UserAPI();\n    \n    // $$$$$ cambiar el comentario de abajo $$$$$\n\n    // guardar los datos necesarios de los componentes hijos renderizados.\n    // Básicamente es un objeto para guardar los estados de los componentes hijos\n    // esto se hace para no tener que traerse todo el estado del componente\n    // ya que no necesariamente todos los datos del estado del hijo son los que se desean guardar.\n    // Se guardaría asi: { 'component-name': { key: value, ... } }\n    STOREDATA =  {};\n    STOREDATA_PARSED = {};    \n    \n\n\n    \n    // handle onchange to create and insert new sub-select or <Component/> \n    handleOnChange = (ev) => {\n        const select  = ev.target;\n        const { 'name': selectName, value, id } = select;\n        \n        // ***** guardar datos del <select> seleccionado *****\n        // delete childs values\n        this.STOREDATA = deleteOldSelectStoreData(id || selectName, this.STOREDATA);\n        // save selected value in the storage <<selectStoreData>>\n        this.STOREDATA[id || selectName].nodeData = value;\n\n\n        // comprobar si tiene un customchange o no.\n        // en caso de tenerlo ejecutarlo y no hacer nada mas.\n        const customchange = this.customOnChangeReferences[id || selectName];\n        \n        // customchange de parte de la API es asi:\n        // (value: String, insertElement?: Function ) => void;\n        if(customchange){            \n            // borrar hijos viejos del <select> (ya sea que los tenga o no)\n            this.findAndRemoveSubElementsRecursively(this.elementsStructure, selectName);\n            this.prepareToDraw(this.elementsStructure);\n            \n            // ejecutar callback\n            customchange(\n                    value, \n                    (selectName, ...elementsArrayObjects) => {                    \n                        this.insertElementsCustomOnChange(id || selectName, ...elementsArrayObjects);\n                });\n            // return <select> and <Components> values to <NestedSelects/> parent element\n            this.props.getvalues( parse(this.STOREDATA) );\n            \n            return; // stop and exit\n        }\n        // en caso de el <select> NO tener customchange revisar las opciones del <select> actual y\n        // ver si dichas opciones tienen o no el atributo makevisible\n        // option selected\n        const option = select.querySelector(`option[value=\"${value || ''}\"]`);\n        // get the 'makevisible' attribute object from an <option/>\n        let makeElementsVisible = JSON.parse(option.getAttribute('makevisible') || '[]');\n        \n        // if the option has makeElementsVisible, insert in the structure and then render it. \n        if(makeElementsVisible.length > 0){\n            let newElementsToDraw = []; // save the sub elements to draw\n             \n            // loop sub-elements to be visibles\n            for(let element of makeElementsVisible){\n                newElementsToDraw.push(this.makeStructureNode(element, selectName));\n            }\n            \n            // clean old subElements\n            this.findAndRemoveSubElementsRecursively(this.elementsStructure, selectName);\n            // insert new subElement in structure\n            this.insertInStructure(this.elementsStructure,newElementsToDraw, selectName);\n            // return <select> and <Components> values to <NestedSelects/> parent element\n            this.props.getvalues( parse(this.STOREDATA) );\n            // prepare stucture to draw and update the state\n            this.prepareToDraw(this.elementsStructure);\n        }\n        // simple option without sub-select\n        else{\n            this.findAndRemoveSubElementsRecursively(this.elementsStructure, selectName);\n            // return <select> and <Components> values to <NestedSelects/> parent element\n            this.props.getvalues( parse(this.STOREDATA) );\n            this.prepareToDraw(this.elementsStructure);\n        }\n        \n    }\n\n\n\n\n    // recorrer la estructura de elementos (el array elementsStruture que posee todos los elementos a renderizar en forma de objetos)\n    // para poder insertar los subElements correspondientes a un <select> padre\n    // básicamente lo que hace es iterar recursivamente y modificar los objetos que se encuentran en this.elementsStructure\n    insertInStructure = (elementsStructure, elementsToInsert, fatherName) => {\n        for(let structureNode of elementsStructure){\n            \n            // si el nombre del nodo por el que va resulta ser el mismo que el padre\n            // y si no tiene sub elementos, es porque ése nodo es el padre al cual \n            // se le asignaran los sub elementos hijos. Es decir, se encontró al nodo padre.\n            if(structureNode.elementName === fatherName && structureNode.subElements.length === 0){\n                // se asigna los sub elementos al padre\n                structureNode.subElements = elementsToInsert;\n                return;\n            }\n            // si el nombre del nodo actual no es igual al del padre, es porque dicho nodo no es\n            // a quien se le asignarán los sub elementos hijos, si es asi, revisar si el nodo tiene\n            // sub elementos y seguir buscando recursivamente al nodo padre entre ellos\n            if(structureNode.elementName !== fatherName && structureNode.subElements.length){\n                this.insertInStructure(structureNode.subElements, elementsToInsert, fatherName);\n            }\n\n        }\n    }\n\n\n    // save in an array all the elements to draw, then set the state\n    prepareToDraw = elementsStructure => {\n\n        this.linearHtmlArrNodes = []; // reset arr elements\n        this.pushNodesToLinearArr(elementsStructure);\n\n        // update state\n        this.setState({\n            htmlToDraw: this.linearHtmlArrNodes,\n        })\n    }\n\n    // #############################################################\n    // #################### find sub elements ######################\n    // #############################################################\n \n    // find sub elements recursively and push to linearHtmlArrNodes\n    pushNodesToLinearArr = elementsStructure => {\n        for(let elementNode of elementsStructure){\n            this.linearHtmlArrNodes.push(elementNode);\n            // ver si tiene sub elementos, para de esa manera respetar el orden en el cual serian pintados\n            // es decir, si hay 2 principales <select> se checan primero todos los posibles sub elementos\n            // del primer <select> y luego en la segunda iteracion del ciclo 'for' si vendria el 2do principal <select>\n            // con sus respectivos sub elementos hijos\n            if(elementNode.subElements.length > 0){\n                this.pushNodesToLinearArr(elementNode.subElements);\n            }\n        }\n    }\n\n    // find and remove sub elements when the user select a previous option or user select a normal <select>\n    findAndRemoveSubElementsRecursively = (elementsStructure, elementName) => {\n        for(let elementNode of elementsStructure){\n            if(elementNode.elementName === elementName){\n                elementNode.subElements = []; // remove subElements\n                return;\n            }\n            else if(elementNode.subElements.length){\n                this.findAndRemoveSubElementsRecursively(elementNode.subElements, elementName);\n            }\n        }\n    }\n\n\n    // ***************** *************** **************** *************** **************\n    // insertar elementos con el customchange\n    // manejar la inserción de nuevos elementos en caso de hacer un customchange\n    insertElementsCustomOnChange(selectName, ...elementsArrayObjects){        \n        const objectElements = [];\n        const elementsToInsert = [];\n        let elementName;\n\n        // ***** 1er paso: estandarizar, convertir los elementos en objetos, tal\n        // cual como se haría con la API para los usuarios \n\n        // iterar por el arreglo de elementos y ver que tipo son\n        // ver si ya fueron creados con la API o son solo react components\n        for(let [index, element] of elementsArrayObjects.entries()){\n            // es creado con la API\n            if(element.elementType) objectElements.push(element);\n            // es un react component, meterlo en un objeto, como se haría normalmente en la API\n            else{\n                // si es un elemento <Select> hecho con los componentes build in, \n                // NOTA: con build in me refiero a los componentes dentro de la carpeta 'src/components'  \n                // NOTE: compared by reference, component names don't survive consumers' minifiers\n                if(element.props && element.type === Select){\n                    // si es un build in <Select> se supone que ya tiene nombre o id unicos\n                    elementName = element.props.id || element.props.name;\n                    const parser = new ParseChildren([element]);\n                    objectElements.push( parser.getParsedData()[0] );\n                    \n                }else{ // es un componente hecho por el/la programador/a \n                    // react component name, +index is for unique key;\n                    elementName = (element.type.name || element.type) + '-' + index;\n                    objectElements.push(\n                        this.userAPI.makeElement('component', {\n                            name: elementName,\n                            component: element\n                        })\n                    )\n                }\n                \n\n            }\n            // ***** 2do paso: mapear el componente al selectStoreData para asi poder\n            // guardar sus datos cuando esté en pantalla y también para poder borrar dichos datos\n            // en caso de ya no estar en pantalla\n            this.STOREDATA = mapComponentInsertedWithCustomOnChangeToStoreData(\n                selectName, \n                element.name || elementName,\n                this.STOREDATA\n            );\n\n        }\n\n        // ***** 3er paso: convertir cada objeto en un nodo e insertarlo en la estructura.\n        // NestedSelectsReact trabaja con una estructura, la cual es un Array con nodos dentro\n        // dichos nodos son un objeto un poquito diferente a los objetos creados con la API\n        // para saber más de estos nodos, revisar el método makeStructureNode\n        for(let objectElement of objectElements){\n            elementsToInsert.push(\n                this.makeStructureNode(objectElement, selectName)\n            )\n        }\n\n        // borrar hijos viejos del <select> (ya sea que los tenga o no)\n        this.findAndRemoveSubElementsRecursively(this.elementsStructure, selectName);\n        // insertar nuevos elementos hijos en la estructura\n        this.insertInStructure(this.elementsStructure, elementsToInsert, selectName);\n        // preparar para dibujar\n        this.prepareToDraw(this.elementsStructure);\n\n    }\n\n    // ##############################################################\n\n    // revisar toda la estructura en busca de componentes de React (jsx components)\n    // para luego guardarlos y asociarlos a su elemento correspondiente\n    // esto se hace debido a que JSON.stringify no guarda funciones o métodos\n    findComponentsInStructure(structure = []){\n        let objComponents = {}\n        // iterar por las opciones y por los elementos dentro de makeVisible\n        function loopOptionsAndMakevisibleArrays(arrayOptions = []){\n            for (let option of arrayOptions) {\n                // si la option quiere hacer algo visible\n                if(option.makeVisible){\n                    for(let toMakeVisibleElement of option.makeVisible){\n                        \n                        const {elementType, name, id, component, options} = toMakeVisibleElement;\n                        if( /component/i.test(elementType) ){\n                            // guardar la referencia del componente\n                            objComponents[id || name] = component;\n                        }\n                        // si no es un componente es porque es un <select> \n                        // en ese caso, iterar recursivamente para ver si hay sub componentes en la opciones de ese select\n                        else if( /select/i.test(elementType) ){\n                            loopOptionsAndMakevisibleArrays(options);\n                        } \n                    }\n                }\n            }\n        }\n\n        // iterar a travez de los principales <select> de la estructura original\n        for(let element of structure){\n            // iterar cada una de las opciones\n            loopOptionsAndMakevisibleArrays(element.options);\n        }\n\n        return objComponents;\n    }\n\n\n\n    // encontrar todos los customchange en la estructura original y guardar una referencia\n    findAllCustomChange(structure){\n\n        let objReferences = {};\n\n        const findRecursively = node => {\n            const {customchange, id, name, options} = node;\n            // es un select con un customchange\n            if(customchange) {\n                const key = id || name;\n                // guardar la referencia\n                objReferences[key] = customchange;\n            }\n            // revisar las <option>\n            for(let option of options){\n                const { makeVisible } = option;\n                // revisar makeVisible de las <option>\n                if(makeVisible){\n                    for(let toMakeVisibleElement of makeVisible){\n                        const { elementType } = toMakeVisibleElement;\n                        if(elementType === 'select'){\n                            findRecursively(toMakeVisibleElement);\n                        }\n                    }\n                }\n            }\n        }\n\n        // iterar por los principales <select>\n        for(let node of structure){\n            findRecursively(node);\n        }\n\n        return objReferences;\n    }\n    \n\n\n\n    // insert pricipal <selects> and sub-elements in a order matrix\n    // make an individual array container for each principal <select>\n    // return [ [principalSelect and childs], [principalSelect and childs], ... ]\n    // NOTA: se usa mucho la palabra 'superior' en los comentarios, ésta se refiere a\n    // los <select> superiores con los que trabaja MultiSelect-react, es decir, \n    // los principales selects ( los primeros que ve el usuario )\n    // éste método no hace más que agruparlos para que esten ordenados a la hora de mostrarlos.\n    organizarElementos = linearHtmlArrNodes => {\n        \n        let principalElements = [];\n        let groups = [];\n\n        for(let i = 0; i < linearHtmlArrNodes.length; i++){\n            let { htmlElement, father } = linearHtmlArrNodes[i];\n            // si el elemento no es de los principales, agruparlo con\n            // el principal del momento\n            if(father){\n                groups.push( htmlElement );\n                // ver si el siguiente elemento existe y es principal, para agregar los que van y limpiar el grupo.\n                if(linearHtmlArrNodes[i+1]){\n                    // si no tiene padre es que es un principal select\n                    if(!linearHtmlArrNodes[i+1].father){\n                        principalElements.push(groups); // añadir a los principales\n                        groups = []; // limpiar grupo\n\n                    }\n                }\n                // si es el ultimo elemento, sale del ciclo for\n                // y se añade al grupo\n            }\n            // es principal\n            else{\n                // añadir al grupo\n                groups.push(htmlElement);\n                // comprobar si existe el siguiente elemento\n                if(linearHtmlArrNodes[i+1]){\n                    // ver si ese elemento siguiente es pricipal\n                    // ¡¡¡ si no lo es, simplemente itera al siguiente elemento !!!\n                    if(!linearHtmlArrNodes[i+1].father){\n                        // añadir grupo a los elementos principales\n                        principalElements.push(groups);\n                        groups = []; // resetear grupo\n                    }\n                }\n            }\n        }\n        // añadir el ultimo grupo a los elementos principales\n        principalElements.push(groups);\n        return principalElements;\n\n    }\n\n\n\n    // crear nodos para la estructura. <<this.elementsStructure>>\n    makeStructureNode(element, fatherName, isSubSelect = true){\n        const { elementType, name, id } = element;\n        const key = String(id || name);\n        let node;\n        let htmlElement;\n\n        // dependiendo del tipo de elemento se debe preparar de diferente manera su\n        // htmlElement, para un select se crea un <select> y para un componente react\n        // se crea una copia del mismo\n        \n        // <select>\n        if(/select/i.test(elementType)){\n            htmlElement = <MakeSelect \n                            select={element}\n                            isSubSelect={isSubSelect}\n                            onChange={this.handleOnChange}\n                            key={key}\n                          />\n        }\n        // <Component />\n        else if(/component/i.test(elementType)){\n            // si no hay una referencia del componente es porque se está incluyendo un nuevo\n            // componente por medio de un customchange, de ser asi, guardarlo.\n            if(!this.componentsReferences[key]){\n                this.componentsReferences[key] = element.component;\n            } \n\n            // crear proxy para detectar si se hace un cambio en el this.STOREDATA dentro del componente\n            const that = this;\n            let checker = {\n                set: function(obj, prop, value) {\n                    // The default behavior to store the value\n                    obj[prop] = value;\n                    // parsear data de los <select> y sub componentes   \n                    that.props.getvalues( parse(that.STOREDATA) );\n                    return true;\n                }\n              };\n              \n            let storedata = new Proxy(this.STOREDATA[key].nodeData , checker); \n\n            htmlElement = cloneElement(\n                this.componentsReferences[key], // react <Component /> reference\n                { \n                    // storedata: this.selectStoreData[key].nodeData,\n                    storedata,\n                    key\n                }\n            );\n        }\n\n        node = {\n            father: fatherName, // parent <select/>\n            elementName: key,\n            elementType,\n            htmlElement,\n            subElements: []\n        };\n\n        return node;\n    }\n\n\n\n    // aqui se añaden los primeros elementos la estructura, que serían los principales <select>\n    // además de encontrar y guardar los react components en el objeto componentsReferences{} para luego\n    // referenciarlos en dicha estructura. \n    componentDidMount(){\n        // start from an empty array (not state) so a remount (e.g. React StrictMode)\n        // doesn't duplicate the selects\n        let htmlToDraw = [];\n        let originalSelects;\n\n        // structure made with children components\n        if(this.props.children){\n            \n            const childrenParser = new ParseChildren(this.props.children);\n            originalSelects = [...childrenParser.getParsedData()];       \n                  \n        }\n        // structure made with the API or handmade\n        else if(this.props.selects){\n            originalSelects = this.props.selects\n        }\n        // structure not provided \n        else{\n            throw new Error(\n                'Structure not provided \\n' +\n                'you have to pass the structure by selects prop <NestedSelects selects={structArr} />\\n' +\n                'or use nested-selects-react components as children of <NestedSelects>{children}</NestedSelects> \\n'\n            );        \n        }     \n        \n        if(!this.props.getvalues){\n            throw new Error(\n                'getvalues callback not provided \\n' +\n                'you have to pass the getvalues callback: <NestedSelects getvalues={myCallback} />\\n' +\n                'this is necessary so that you can get the values ​​inside NestedSelects \\n'\n            );\n        }\n        \n        // prepare the initials <select/>\n        for(let select of originalSelects){\n            // save a node with some information about the <select>.\n            htmlToDraw.push(this.makeStructureNode(select, null, false));\n        }\n        \n        // set first modification to structure\n        this.elementsStructure = htmlToDraw\n        // find and save react <Components /> reference \n        this.componentsReferences = this.findComponentsInStructure(originalSelects);\n        // find and save customchange reference \n        this.customOnChangeReferences = this.findAllCustomChange(originalSelects);\n        // map fathers with his childrens\n        this.STOREDATA = mapOriginalElementsToStoreData(originalSelects);\n\n        // first state modification\n        this.setState({\n            loading: false,\n            htmlToDraw,\n            originalSelects\n        })\n    }\n\n\n\n    // ************************** render ****************************\n    render(){\n        let { htmlToDraw, loading } = this.state;\n        let principalSelects;\n        // elementos agrupados por <selects>\n        if(!loading) principalSelects = this.organizarElementos(htmlToDraw)\n\n\n        \n        if(loading) return null;\n\n        return (\n            <div className=\"nsr-container\">\n                <div className=\"nsr\">\n                    { principalSelects.map( (element, index) => {\n                        return( \n                            <div key={index} className={`nsr-principalSelect nsr-principalSelect${index}`}>\n                                {element}\n                            </div> \n                        )\n                    }) }\n                </div>\n            </div>\n        ) \n    }\n\n\n}\n\n\n\n\nexport default NestedSelectsReact;","import React from 'react';\n\nfunction MakeVisible({children}){\n    return <></>;\n}\n\nexport default MakeVisible;"],"names":["Structure","name","id","childrenNames","Component","UserAPI","selectName","cloneElement"],"mappings":"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"}