(function (global, p5VendorJs) { if (!p5VendorJs.React) throw "Missing React" if (!p5VendorJs.ReactDOM) throw "Missing ReactDOM" if (!p5VendorJs.createReactClass) throw "Missing createReactClass" var React = p5VendorJs.React var ReactDOM = p5VendorJs.ReactDOM var createReactClass = p5VendorJs.createReactClass var h = React.createElement var DBG = 0 // global.p5VendorJs['P5UI__MyWidget'] = createReactClass({ // componentWillMount: function () { console.log('MyWidget::componentWillMount...'); }, // render: function () { // console.log('MyWidget::render... state, props', this.state, this.props); // var defaultProps = {} // return h('div', Object.assign(defaultProps, { // ref: function (node) { this.rootNode = node; }.bind(this), // // onSubmit: this.submit.bind(this) // }), this.props.children) // }, // componentDidMount: function () { console.log('MyWidget::componentDidMount...'); }, // componentWillReceiveProps: function (nextProps) { console.log('MyWidget::componentWillReceiveProps(nextProps)...', nextProps); }, // shouldComponentUpdate: function (nextProps, nextState) { console.log('MyWidget::shouldComponentUpdate(nextProps, nextState)...', nextProps, nextState); }, // componentWillUpdate: function (nextProps, nextState) { console.log('MyWidget::componentWillUpdate(nextProps, nextState)...', nextProps, nextState); }, // componentDidUpdate: function (prevProps, prevState) { console.log('MyWidget::componentDidUpdate(prevProps, prevState)...', prevProps, prevState); }, // componentWillUnmount: function () { console.log('MyWidget::componentWillUnmount...'); }, // }) var P5UI__RawHtml = createReactClass({ componentDidMount: function () { if (this.props.rawHtml) { this.rootNode.innerHTML = this.props.rawHtml } }, render: function () { return h('div', { ref: function (node) { this.rootNode = node; }.bind(this), }) } }) global.p5VendorJs['P5UI__RawHtml'] = P5UI__RawHtml var P5UI__FeatureEditForm = createReactClass({ componentDidMount: function () { if(DBG)console.warn('P5UI__FeatureEditForm::componentDidMount this.rootNode', this.rootNode) jQuery(this.rootNode).find('textarea').autosize(); jQuery(this.rootNode).find('.frm-help').popover({trigger:'hover'}); jQuery(this.rootNode).find('.show-last-value input').on('input', function(e) { var input, btn, btnIco; input = jQuery(e.target); btn = input.next('.button-appendBack'); btnIco = btn.find('.glyphicon'); if (btn.attr('title') != input.val()) { btnIco.show(); } else { btnIco.hide(); } }); jQuery(this.rootNode).find('.show-last-value').find('.button-appendBack').on('click', function(e) { var input, btn, btnIco; btn = jQuery(this); btnIco = btn.find('.glyphicon'); input = btn.prev(); if (input.is('input')) { if (btn.attr('title') != input.val()) { input.val(btn.attr('title')); btnIco.hide(); } } }); }, submit: function (e) { if(DBG)console.warn('P5UI__FeatureEditForm::submit this.rootNode', this.rootNode) e.preventDefault() var formData = {}; jQuery(this.rootNode).serializeArray().map(function(i) { formData[i.name] = i.value; });// TODO: edit Widget - send only updated fields // TODO: change Edit btn to return to edit record with fields -> show form var taskCont = jQuery(this.rootNode).parents('.AjaxTableTaskCnt').parent(); // jQuery('#{$this->_htmlID}_task').parent(); //taskCont.empty(); taskCont.children().fadeOut('slow'); var alertCntWrap = jQuery('
').prependTo(taskCont) , alertCnt = jQuery('
').prependTo(alertCntWrap); jQuery('
zapisywanie ...
').appendTo(alertCnt); function notifyAjaxCallback(data) { var notify = {}, outMsg = ''; notify.type = (data && data.type)? data.type : ''; notify.msg = (data && data.msg)? data.msg : ''; switch (notify.type) { case 'success': if (!notify.msg) notify.msg = 'Dane poprawnie zaktualizowane'; break; case 'info': if (!notify.msg) notify.msg = 'Nie wprowadzono żadnych zmian'; break; case 'error': if (!notify.msg) notify.msg = 'Wystąpiły błędy'; break; case 'warning': notify.type = 'warn'; if (!notify.msg) notify.msg = 'Wystąpiły błędy'; break; default: notify.msg = 'Nieznany błąd'; if (data && data.errorCode) notify.msg += ' ' + data.errorCode; notify.type = ''; } jQuery.notify(notify.msg, notify.type); var alertType = ('error' == data.type) ? 'danger' : data.type; outMsg = '
' + notify.msg + '
'; return outMsg; } var idRecord = this.props.idRecord var tableLabelHtml = this.props.tableLabelHtml superagent .post(this.props.ajaxSaveUrl) .type('json') // header ĺapplication/x-www-form-urlencoded' requires type('form'); .send({ namespace: this.props.namespace, primaryKey: this.props.idRecord, form: formData }) .set('Accept', 'application/json') .end(function(err, res) { var payload; if (err || !res.ok || 'application/json' !== res.type) { payload = {type: 'warning', msg: res.body.msg || 'Wystąpiły błędy', body: res.body}; } else { payload = {type: 'success', msg: res.body.msg || '', body: res.body}; } var data = res.body; alertCntWrap.removeClass('AjaxTable-loading'); alertCnt.empty(); if (false === ['success', 'info'].indexOf(payload.type)) { jQuery(errorTxt).appendTo(alertCnt); var errLinks = jQuery('').appendTo(alertCnt); jQuery(' Wróć do tabeli '+tableLabelHtml+'').appendTo(errLinks); var backToEditBtn = jQuery(' Popraw dane '+idRecord+'').appendTo(errLinks); backToEditBtn.on('click', function(){ alertCnt.remove(); taskCont.children().fadeIn('slow'); return false; }); } else { var outMsg = notifyAjaxCallback(payload); var out = ''; out += outMsg; out += ''; jQuery(out).appendTo(alertCnt); // add rowFunctions from response if (data && data.rowFunctions && data.primaryKey) { var rowFunWrapNode = $('
').insertAfter(alertCnt); var rowFunListNode = $('').appendTo(rowFunWrapNode); var keys = Object.keys(data.rowFunctions), total = keys.length, moreFuncBtnNode, moreFunctions = [], idx ; moreFunctions = keys.splice(3); keys.forEach(function(key) { var cellNode = $('
  • '); var funObj = data.rowFunctions[key], funcNode = p5UI_TableAjax_generateFunctionNode(funObj, data.primaryKey, {ico: true, label: true}) ; funcNode.appendTo(cellNode); cellNode.appendTo(rowFunListNode); }); } } }) }, render: function () { if(DBG)console.warn('P5UI__FeatureEditForm::render this.props', this.props) var formProps = Object.assign({}, this.props) delete formProps.children return h('form', Object.assign(formProps, { ref: function (node) { this.rootNode = node; }.bind(this), onSubmit: this.submit.bind(this) }), this.props.children) } }) global.p5VendorJs['P5UI__FeatureEditForm'] = P5UI__FeatureEditForm var P5UI__FeatureCreateForm = createReactClass({ componentDidMount: function () { if(DBG)console.warn('P5UI__FeatureCreateForm::componentDidMount this.rootNode', this.rootNode) jQuery(this.rootNode).find('textarea').autosize(); jQuery(this.rootNode).find('.frm-help').popover({trigger:'hover'}); jQuery(this.rootNode).find('.show-last-value input').on('input', function(e) { var input, btn, btnIco; input = jQuery(e.target); btn = input.next('.button-appendBack'); btnIco = btn.find('.glyphicon'); if (btn.attr('title') != input.val()) { btnIco.show(); } else { btnIco.hide(); } }); jQuery(this.rootNode).find('.show-last-value').find('.button-appendBack').on('click', function(e) { var input, btn, btnIco; btn = jQuery(this); btnIco = btn.find('.glyphicon'); input = btn.prev(); if (input.is('input')) { if (btn.attr('title') != input.val()) { input.val(btn.attr('title')); btnIco.hide(); } } }); }, submit: function (e) { if(DBG)console.warn('P5UI__FeatureCreateForm::submit this.rootNode', this.rootNode) e.preventDefault() var formData = {}; jQuery(this.rootNode).serializeArray().map(function(i) { formData[i.name] = i.value; });// TODO: edit Widget - send only updated fields if(DBG)console.log('P5UI__FeatureCreateForm::submit formData', formData); var taskContLast = jQuery('#' + this.props._htmlID + '_task'), taskCont = taskContLast.parent(); taskContLast.fadeOut('slow'); var taskCnt = jQuery('
    ').appendTo(taskCont); jQuery('
    save ...
    ').appendTo(taskCnt); function notifyAjaxCallback(data) { var notify = {}, outMsg = ''; notify.type = (data && data.type)? data.type : ''; notify.msg = (data && data.msg)? data.msg : ''; switch (notify.type) { case 'success': if (!notify.msg) notify.msg = 'OK'; break; case 'info': if (!notify.msg) notify.msg = ''; break; case 'error': if (!notify.msg) notify.msg = 'Wystąpiły błędy'; break; case 'warning': notify.type = 'warn'; if (!notify.msg) notify.msg = 'Wystąpiły błędy'; break; default: notify.msg = 'Nieznany błąd'; if (data && data.errorCode) notify.msg += ' ' + data.errorCode; notify.type = ''; } jQuery.notify(notify.msg, notify.type); var alertType = ('error' == data.type) ? 'danger' : data.type; outMsg = '
    ' + notify.msg + '
    '; return outMsg; } var tableLabelHtml = this.props.tableLabelHtml; global.fetch(this.props.ajaxSaveLegacyUrl, { headers: { 'Content-Type': 'application/json' }, method: 'POST', credentials: 'same-origin', body: JSON.stringify(formData), }).then(function (response) { return response.json() }).then(function (data) { taskCnt.removeClass('AjaxTable-loading'); taskCnt.empty(); if(DBG)console.log('P5UI__FeatureCreateForm:: data: ', data) if ('success' === data.type) { var msg = 'OK'; if (data.id && data.id > 0) msg = 'Utworzono pomyślnie rekord: ID = ' + data.id; else if (data.msg) msg = data.msg; var out = '
    '; out += '
    ' + msg + '
    '; out += ''; out += '
    '; jQuery(out).appendTo(taskCnt); } else { var msg = (data.msg) ? data.msg : "Nieznany błąd!"; var out = '
    ' + '
    ' + '

    Wystąpiły błędy!

    ' + msg + '
    '; out += '' + '
    '; jQuery(out).appendTo(taskCnt); var taskContLastNode = taskContLast , taskCntNode = taskCnt; taskCnt.find('.create-fix').click(function(){ taskCntNode.remove(); taskContLastNode.fadeIn('slow'); return false; }); } }).catch(function (e) { taskCnt.removeClass('AjaxTable-loading'); taskCnt.empty(); var out = '
    ' + '
    ' + '

    Wystąpiły błędy!

    ' + e + '
    '; out += '' + '
    '; jQuery(out).appendTo(taskCnt); var taskContLastNode = taskContLast , taskCntNode = taskCnt; taskCnt.find('.create-fix').click(function(){ taskCntNode.remove(); taskContLastNode.fadeIn('slow'); return false; }); if(DBG)console.log('P5UI__FeatureCreateForm:: e: ', e) }); }, render: function () { if(DBG)console.warn('P5UI__FeatureCreateForm::render this.props', this.props) var formProps = Object.assign({}, this.props) delete formProps.children return h('form', Object.assign(formProps, { ref: function (node) { this.rootNode = node; }.bind(this), onSubmit: this.submit.bind(this) }), this.props.children) } }) global.p5VendorJs['P5UI__FeatureCreateForm'] = P5UI__FeatureCreateForm var P5UI__Typespecial = createReactClass({ componentDidMount: function () { if(DBG)console.log('TS::componentDidMount (['+this.props.idField+'] '+this.props.fieldNamespace+') ...') // console.log('TS::componentDidMount (['+this.props.idField+'] '+this.props.fieldNamespace+') this.rootNode', this.rootNode) // OK var fldNode = jQuery(document.getElementById(this.props.fieldName)) // jQuery('#{$fName}') var tsNode = jQuery(this.rootNode) // jQuery('#ts-{$fName}') var ajaxDataUrlBase = this.props.ajaxDataUrlBase if (!fldNode && !tsNode) { console.log("BUG Missing fldNode or tsNode in P5UI__Typespecial") return; } if (!ajaxDataUrlBase) { console.log("BUG Missing ajaxDataUrlBase in P5UI__Typespecial") return; } fldNode.attr('name', ''); fldNode.hide(); if (fldNode.parent().hasClass('show-last-value')) { fldNode.parent().hide(); } tsNode.attr('name', this.props.frmFldName) tsNode.attr('tabindex', fldNode.attr('tabindex')) var getFetchCallback = ('TypespecialVariable' === this.props.type) ? function (query, callback) { return function(res) { for (var i in res) { if (!res[i].name || res[i].id != res[i].name) { res[i].name = res[i].id + ': ' + res[i].name; } } callback(res); } } : function (query, callback) { return function(res) { var i, prefix, prefixLen; for (i in res) { prefix = '' + res[i].id; prefixLen = prefix.length; if (prefixLen > 0 && prefix !== res[i].name.substr(0, prefixLen)) { res[i].name = res[i].id + ': ' + res[i].name; } res[i]['\$order'] = 1 + (parseInt(i) || 0); // set order from request } callback(res); } } ; var scoreCallback = ('TypespecialVariable' === this.props.type) ? function(search) { var score = this.getScoreFunction(search); return function(item) { // console.log('score:item:', item, ', score:', score(item)); if (search && search == item.id) { return 1; } else { return score(item);// score(item) * (1 + Math.min(item.watchers / 100, 1)); } }; } : function(query) { // console.log('Typespecial({$fName})::score: q(', query, ')'); var score = this.getScoreFunction(query); return function(item) { var retScore = 0, lName = ('' + item.name).toLowerCase(), lQuery = query.toLowerCase(); if (query.search(' ') > -1) { retScore = score(item); } else { if (lQuery + ':' == lName.substr(0, lQuery.length + 1)) { retScore = 100; } else if (lName.search(lQuery) > -1) { retScore = 90 - lName.search(lQuery); } else { retScore = 0; } } // console.log('Typespecial({$fName})::score: q(', lQuery, ') , retScore(', retScore, '), score(', score(item), '), item.name(', item.name, ') item.id:', item.id); return retScore; }; } ; tsNode.selectize({ theme: 'typespecial', valueField: 'id', labelField: 'id', searchField: 'name', sortField: ('TypespecialVariable' === this.props.type) ? 'name' : '$order', // TODO: skip in Typespecial - default sort field is '$order' create: this.props.create, delimiter: ';', dataAttr: 'typespecial', preload: this.props.preload || false, options: this.props.options, render: { item: function(item, escape) { return '
    ' + '' + escape(item.name || item.id) + '' + '
    '; }, option: function(item, escape) { return '
    ' + '' + escape(item.name || item.id) + '' + '
    '; } }, onItemAdd: function(value, item) {// Invoked when an item is selected. var curSel = this.options[value] || null, fieldExport; if (curSel && curSel.exports) { for (var i in curSel.exports) { fieldExport = jQuery('#ts-f' + i); if (fieldExport.length) { //console.log('--- onItemAdd fieldExport.selectize(',fieldExport.selectize,')', fieldExport); if (fieldExport.get(0).selectize) { fieldExport.get(0).selectize.addOption({id:curSel.exports[i], name:curSel.exports[i]}); fieldExport.get(0).selectize.setValue(curSel.exports[i]); } else { //jQuery('#f' + i).val(curSel.exports[i]); } } else { fieldExport = jQuery('#f' + i); if (fieldExport.is('input')) { jQuery('#f' + i).val(curSel.exports[i]); } else if (fieldExport.is('select')) { //TODO: add option and select //jQuery('#f' + i).val(curSel.exports[i]); } } } } }, score: scoreCallback, load: function(query, callback) { // if (!query.length) return callback(); // empty query at preload action $.ajax({ url: ajaxDataUrlBase, data: 'q=' + encodeURIComponent(query), type: 'POST', error: function() { callback(); }, success: getFetchCallback(query, callback), }); } }); }, render: function () { if(DBG)console.log('TS::render (['+this.props.idField+'] '+this.props.fieldNamespace+') props', this.props) return h('div', { 'className': "typespecial", 'style': { 'max-width': '366px' } }, [ h('select', { 'ref': function (node) { this.rootNode = node; }.bind(this), }, this.props.children) ]) } }) global.p5VendorJs['P5UI__Typespecial'] = P5UI__Typespecial var P5UI__FeatureRowFunctions = createReactClass({ componentDidMount: function () { if(DBG)console.warn('P5UI__FeatureRowFunctions::componentDidMount this.rootNode', this.rootNode) if (this.props.rawHtml) { if(DBG)console.warn('P5UI__FeatureRowFunctions::componentDidMount this.props.rawHtml', this.props.rawHtml) this.rootNode.innerHTML = this.props.rawHtml } }, render: function () { var showLabels = this.props.showLabels || false var functions = this.props.functions || {} if (!this.props.id) return h('div', { 'className': 'alert alert-danger' }, "Missing ID") if(DBG)console.warn('P5UI__FeatureRowFunctions::render this.props', this.props) return h('div', { ref: function (node) { this.rootNode = node; }.bind(this), }, [ ('hist' in functions) ? h('a', { className: "btn btn-xs btn-link", href: functions.hist.href.replace("{0}", this.props.id), title: functions.hist.title }, [ h('span', { className: functions.hist.ico }), h('span', { style: {'padding': '0 6px'} }, functions.hist.title) ]) : null , ('files' in functions) ? h('a', { className: "btn btn-xs btn-link", href: functions.files.href.replace("{0}", this.props.id), title: functions.files.title }, [ h('span', { className: functions.files.ico }), h('span', { style: {'padding': '0 6px'} }, functions.files.title) ]) : null , ('msgs' in functions) ? h('a', { className: "btn btn-xs btn-link", href: functions.msgs.href.replace("{0}", this.props.id), title: functions.msgs.title }, [ h('span', { className: functions.msgs.ico }), h('span', { style: {'padding': '0 6px'} }, functions.msgs.title) ]) : null , (this.props.viewMoreDropdown) ? h(P5UI__MoreFunctionsDropdownAjax, this.props.viewMoreDropdown) : null , ]) } }) global.p5VendorJs['P5UI__FeatureRowFunctions'] = P5UI__FeatureRowFunctions var P5UI__MoreFunctionsDropdownAjax = createReactClass({ componentDidMount: function () { jQuery(this.rootNode).popover({ container: 'body', placement: 'bottom', trigger: 'click', // title: e.data.col + '', title: 'Więcej funkcji dla rekordu nr ' + this.props.primaryKey, // '
    ' + (this.props.friendly || colName) + ' ' + '
    ', html: true, content: 'TODO: list...', // this.renderListToString.bind(this), template: '' + '' }) this.setState({ 'isOpen': false }) }, componentWillUnmount: function () { if(DBG)console.warn("P5UI__MoreFunctionsDropdownAjax::componentWillUnmount") jQuery(this.rootNode).popover('destroy') }, componentWillMount: function() { this._closeDropdownIfClickedOutside = function (event) { if (!this.state.isOpen) return; var idHtmlPopover = jQuery(this.rootNode).attr('aria-describedby') if(DBG)console.warn("P5UI__MoreFunctionsDropdownAjax::_closeDropdownIfClickedOutside idHtmlPopover:", idHtmlPopover) if (!idHtmlPopover) return; var popoverNode = document.getElementById(idHtmlPopover) var isClickedOutside = p5UI__clickedOutsideElement(popoverNode, event) if(DBG)console.warn("P5UI__MoreFunctionsDropdownAjax::_closeDropdownIfClickedOutside isClickedOutside:", isClickedOutside, 'this.rootNode', this.rootNode) if (isClickedOutside) { if (jQuery(this.rootNode).data("bs.popover")) { jQuery(this.rootNode).popover('hide') } else { popoverNode.parentNode.removeChild(popoverNode) // DOM removed before 'hide' } this.setState({ isOpen: false }, this._unbindCloseDropdownIfClickedOutside.bind(this)); } }.bind(this); this._bindCloseDropdownIfClickedOutside = function () { if(DBG)console.warn("P5UI__MoreFunctionsDropdownAjax::_bindCloseDropdownIfClickedOutside", this._closeDropdownIfClickedOutside) if (!document.addEventListener && document.attachEvent) { document.attachEvent('onclick', this._closeDropdownIfClickedOutside); } else { document.addEventListener('click', this._closeDropdownIfClickedOutside); } }.bind(this); this._unbindCloseDropdownIfClickedOutside = function () { if(DBG)console.warn("P5UI__MoreFunctionsDropdownAjax::_unbindCloseDropdownIfClickedOutside", this._closeDropdownIfClickedOutside) if (!document.removeEventListener && document.detachEvent) { document.detachEvent('onclick', this._closeDropdownIfClickedOutside); } else { document.removeEventListener('click', this._closeDropdownIfClickedOutside); } }.bind(this); }, shouldComponentUpdate: function (nextProps, nextState) { if (!nextState) return false if (!this.state) return false if (this.state.rowFunctions !== nextState.rowFunctions) { var idHtmlPopover = jQuery(this.rootNode).attr('aria-describedby') if(DBG)console.warn("P5UI__MoreFunctionsDropdownAjax::shouldComponentUpdate idHtmlPopover:", idHtmlPopover, 'nextState.rowFunctions', nextState.rowFunctions) if (idHtmlPopover && nextState.rowFunctions && nextState.rowFunctions.length) { jQuery(document.getElementById(idHtmlPopover)).find('.popover-content').html(this.renderListToString(nextState.rowFunctions)) } else { jQuery(document.getElementById(idHtmlPopover)).find('.popover-content').html('

    Brak dodatkowych funkcji

    ') } } return false }, renderListToString: function (list) { if(DBG)console.warn('P5UI__MoreFunctionsDropdownAjax::renderListToString - this.state:', this.state) var primaryKey = this.props.id var out = '' if(DBG)console.warn('P5UI__MoreFunctionsDropdownAjax::renderListToString - out:', out) return out }, onAjaxFetch: function (data) { this.setState({ rowFunctions: data.rowFunctions }) }, handleClick: function (e) { e.preventDefault() if (!this.props.uri) throw "Missing uri in P5UI__MoreFunctionsDropdownAjax" if (this.state.isOpen) { jQuery(this.rootNode).popover('hide') } else { jQuery(this.rootNode).popover('show') var idHtmlPopover = jQuery(this.rootNode).attr('aria-describedby') if (idHtmlPopover) { jQuery(document.getElementById(idHtmlPopover)).find('.popover-content').html('

    Loading...

    ') } // global.fetch() // setTimeout(this.onAjaxFetch.bind(this, { msg: "Funkcje", type: "success", rowFunctions: [ // { id: "msgs", ico: "glyphicon glyphicon-envelope", href: "index.php?_route=TableMsgs&_task=tableRow&idTable=13051&idRow=83", label: 'Wiadomości 0', title: "Wiadomości (0)" }, // { ico: "glyphicon glyphicon-file", href: "https://biuro.biall-net.pl/dev-pl/se-master/index.php?_route=UrlAction_Ant&typeName=default_db:TEST_PERMS&primaryKey=83", label: 'Druki', title: "Druki" }, // ] }), 1000) _popoverCellAjaxXhr = jQuery.ajax({ type: 'GET', url: this.props.uri, dataType: 'json', contentType: "application/json; charset=utf-8", }) .done(function(data, textStatus, jqXHR){ if (data && 'success' === data.type) { var rowFunctions = (data.rowFunctions && data.rowFunctions.length > 0) ? data.rowFunctions : []; this.setState({ rowFunctions: data.rowFunctions }) } }.bind(this)) if (this.state.isOpen) this.setState({ 'isOpen': false }) else this.setState({ 'isOpen': true }, this._bindCloseDropdownIfClickedOutside) } }, render: function () { if(DBG)console.warn('P5UI__MoreFunctionsDropdownAjax::render this.props', this.props) return h('button', { className: 'btn btn-xs btn-link', ref: function (node) { this.rootNode = node; }.bind(this), onClick: this.handleClick.bind(this) }, [ h('span', {'className':"glyphicon glyphicon-menu-hamburger"}), " Więcej " ]); } }) global.p5VendorJs['P5UI__MoreFunctionsDropdownAjax'] = P5UI__MoreFunctionsDropdownAjax function buildDom(dom, target) { ReactDOM.render(buildReactNodeRec(dom), target) } function buildReactNodeRec(dom) { if (null === dom) return null if ('string' === typeof dom) return dom var nodeReactType = dom[0] if ('P5UI__' === nodeReactType.substr(0, 'P5UI__'.length)) { if (nodeReactType in global.p5VendorJs) nodeReactType = global.p5VendorJs[nodeReactType] } return h(nodeReactType, convertAttrsToReact(dom[0], dom[1]), (dom[2] && 'function' === typeof dom[2].map) ? dom[2].map(buildReactNodeRec) : dom[2] ) } function convertAttrsToReact(tagName, attrs) { if (!attrs) return null if(DBG)console.log('todo convertAttrsToReact typeof attrs ('+ typeof attrs +') toString('+ attrs.toString() +')'); if (!attrs.toString()) return null if ('class' in attrs) { attrs['className'] = attrs['class'] delete attrs['class'] } if ('input' === tagName && 'value' in attrs) { // fix input to uncontrolled attrs['defaultValue'] = attrs['value'] delete attrs['value'] } if ('input' === tagName && 'maxlength' in attrs) { // fix input to uncontrolled attrs['maxLength'] = attrs['maxlength'] delete attrs['maxlength'] } return attrs } global.p5UI__buildDom = buildDom })(window, window.p5VendorJs);