| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279 |
- // @require var JS_GLOBAL_FUNCTION_NAME
- // @require var INITIAL_DROPDOWN_DATA
- // @require var NAMESPACE
- // @require var SET_INSTANCE_URL
- if (!JS_GLOBAL_FUNCTION_NAME) throw "Missing JS_GLOBAL_FUNCTION_NAME!";
- if (!NAMESPACE) throw "Missing NAMESPACE!";
- if (!SET_INSTANCE_URL) throw "Missing SET_INSTANCE_URL!";
- if (!DBG) var DBG = false
- if (!INITIAL_DROPDOWN_DATA) throw "Missing INITIAL_DROPDOWN_DATA!";
- if (!INITIAL_DROPDOWN_DATA.allowed_instances) throw "Missing INITIAL_DROPDOWN_DATA.allowed_instances!";
- if (!INITIAL_DROPDOWN_DATA.items) throw "Missing INITIAL_DROPDOWN_DATA.items!";
- var instances = {}
- var getDropdown = function (pk) {
- if(DBG)console.log('>>> getDropdown('+pk+')...')
- if (!instances[pk]) instances[pk] = buildDropdown(pk)
- return instances[pk]
- }
- var dropdown = function(pk) {
- if(DBG)console.log('>>> dropdown('+pk+')...')
- return getDropdown(pk)
- }
- var buildDropdown = function(pk) {
- if (!window.p5VendorJs.React) throw 'Missing p5VendorJs.React'
- if (!window.p5VendorJs.ReactDOM) throw 'Missing p5VendorJs.ReactDOM'
- if (!window.p5VendorJs.Redux) throw 'Missing p5VendorJs.Redux'
- if (!window.p5VendorJs.ReduxThunk) throw 'Missing p5VendorJs.ReduxThunk'
- if (!window.fetch) throw 'Missing window.fetch'
- var React = window.p5VendorJs.React
- var ReactDOM = window.p5VendorJs.ReactDOM
- var h = React.createElement
- var createStore = window.p5VendorJs.Redux.createStore
- var applyMiddleware = window.p5VendorJs.Redux.applyMiddleware
- var ReduxThunk = window.p5VendorJs.ReduxThunk
- if(DBG)console.log('>>> buildDropdown('+pk+')... ', { INITIAL_DROPDOWN_DATA: INITIAL_DROPDOWN_DATA })
- var _btnNode = null
- var _dropdownNode = null
- var _reducer_instance_set_send = function (payload) {
- if(DBG)console.log('RX:_reducer_instance_set_send() payload', payload)
- return function (dispatch, getState) { // ReduxThunk
- if(DBG)console.log('RX:_reducer_instance_set_send() thunk() payload', payload)
- if(DBG)console.log('RX:_reducer_instance_set_send() thunk() getState().item.pk', getState().item.pk)
- var instanceToSet = payload
- dispatch({ type: 'instance_set_request', payload: instanceToSet })
- // return window.fetch(SET_INSTANCE_URL, {
- window.fetch(SET_INSTANCE_URL, {
- method: 'POST',
- headers: { 'Content-Type': 'application/json' },
- credentials: 'same-origin',
- body: JSON.stringify({
- namespace: NAMESPACE,
- primaryKey: getState().item.pk,
- instance: payload,
- toConnect: 'yes',
- })
- }).then(function (response) {
- return response.json()
- }).then(function (response) {
- dispatch({ type: 'instance_set_receive', payload: { instance: instanceToSet, response: response } })
- // }).catch(function (e) {
- // dispatch({ type: 'instance_set_error', payload: e })
- })
- if(DBG)console.log('RX:_reducer_instance_set_send() thunk() END payload', payload)
- }
- }
- var _reducer_instance_set_request = function (state, payload) {
- if(DBG)console.log('RX:_reducer_instance_set_request() payload', payload)
- state.waitingSet.push(payload)
- return state
- }
- var _reducer_instance_set_receive = function (state, payload) {
- if(DBG)console.log('RX:_reducer_instance_set_receive() payload', payload)
- // payload: { instance: instanceToSet, response: response }
- p5UI__notifyAjaxCallback(payload.response)
- // TODO: update whole list in state by response => render list
- state.item.instances.push(payload.instance)
- state.waitingSet = state.waitingSet.filter(function (inst) {
- return inst !== payload.instance
- })
- return state
- }
- var _reducer_instance_set_error = function (state, payload) {
- if(DBG)console.log('RX:_reducer_instance_set_error() payload', payload)
- if(DBG)console.log('DBG network error for set namespace:', payload)
- }
- var _reducer_instance_unset_send = function (payload) {
- if(DBG)console.log('RX:_reducer_instance_unset_send() payload', payload)
- return function (dispatch, getState) { // ReduxThunk
- if(DBG)console.log('RX:_reducer_instance_unset_send() thunk() payload', payload)
- if(DBG)console.log('RX:_reducer_instance_unset_send() thunk() getState().item.pk', getState().item.pk)
- var instanceToUnset = payload
- dispatch({ type: 'instance_unset_request', payload: instanceToUnset })
- window.fetch(SET_INSTANCE_URL, {
- method: 'POST',
- headers: { 'Content-Type': 'application/json' },
- credentials: 'same-origin',
- body: JSON.stringify({
- namespace: NAMESPACE,
- primaryKey: getState().item.pk,
- instance: payload,
- toConnect: 'no',
- })
- }).then(function (response) {
- return response.json()
- }).then(function (response) {
- dispatch({ type: 'instance_unset_receive', payload: { instance: instanceToUnset, response: response } })
- // }).catch(function (e) {
- // dispatch({ type: 'instance_set_error', payload: e })
- })
- if(DBG)console.log('RX:_reducer_instance_unset_send() thunk() END payload', payload)
- }
- }
- var _reducer_instance_unset_request = function (state, payload) {
- if(DBG)console.log('RX:_reducer_instance_unset_request() payload', payload)
- state.waitingUnSet.push(payload)
- return state
- }
- var _reducer_instance_unset_receive = function (state, payload) {
- if(DBG)console.log('RX:_reducer_instance_unset_receive() payload', payload)
- // payload: { instance: instanceToSet, response: response }
- p5UI__notifyAjaxCallback(payload.response)
- // TODO: update whole list in state by response => render list
- state.item.instances = state.item.instances.filter(function (inst) {
- return inst !== payload.instance
- })
- state.waitingUnSet = state.waitingUnSet.filter(function (inst) {
- return inst !== payload.instance
- })
- return state
- }
- var _reducer_instance_unset_error = function (state, payload) {
- if(DBG)console.log('RX:_reducer_instance_unset_error() payload', payload)
- if(DBG)console.log('DBG network error for set namespace:', payload)
- }
- var dropdown = function (state, action) {
- if(DBG)console.log('RX:dropdown()', {type: action.type, payload: action.payload, state: state})
- switch (action.type) {
- case 'INIT': return action.payload
- case 'instance_set_request': return _reducer_instance_set_request(state, action.payload)
- case 'instance_set_receive': return _reducer_instance_set_receive(state, action.payload)
- case 'instance_set_error': return _reducer_instance_set_error(state, action.payload)
- case 'instance_unset_request': return _reducer_instance_unset_request(state, action.payload)
- case 'instance_unset_receive': return _reducer_instance_unset_receive(state, action.payload)
- case 'instance_unset_error': return _reducer_instance_unset_error(state, action.payload)
- case 'filter': {
- var filtrInstance = action.payload
- state.query = filtrInstance
- state.filter = state.allowed_instances.filter(function (inst) {
- return (-1 !== inst.label.toLowerCase().indexOf(filtrInstance.toLowerCase()))
- })
- return state
- }
- default:
- return state
- }
- }
- var store = createStore(
- dropdown,
- applyMiddleware(ReduxThunk)
- )
- var render = function () {
- // <div class="popover fade right in" role="tooltip" style="max-width: 600px; width: 400px; display: block; top: 281.5px; left: 68px;" id="popover623735">
- // <div class="arrow" style="top: 53.5px;"></div>
- // <div style="display:block;position:relative;">
- // <div class="popover-title">Więcej funkcji dla rekordu nr 163</div>
- // <button type="button" class="close" onclick="return hidePopover();" style="position:absolute;right:8px;top:6px;">×</button>
- // </div>
- // <div class="popover-content">
- // <ul class="list-unstyled popoverRowFunctions">
- // <li><a href="index.php?_route=TableMsgs&_task=tableRow&idTable=25873&idRow=163" style="margin:0 2px;" title="Wiadomości" class="func_name-msgs"><span class="glyphicon glyphicon-envelope"></span> Wiadomości</a></li>
- // <li><a href="#HIST/163" style="margin:0 2px;" title="Historia" class="func_name-hist"><span class="glyphicon glyphicon-book"></span> Historia</a></li>
- // </ul>
- // <div class="popoverCellContent" style="white-space:normal">
- // <p class="text-muted">Pobieranie funkcji...</p><p></p>
- // </div>
- // </div>
- // </div>
- var state = store.getState()
- if(DBG)console.log('RX:render()...')
- if (!_dropdownNode) return // throw 'Missing dropdownNode'
- if (!_btnNode) return // throw 'Missing btnNode'
- ReactDOM.render(
- h('div', {}, [
- h('div', { style: { backgroundColor: '#f7f7f7', padding: '8px', borderBottom: '1px solid #ddd' } }, [
- h('input', { type: 'text',
- placeholder: 'Szukaj...',
- className: 'p5UI__dropdown-input input-sm',
- onChange: function (e) { store.dispatch({ type: 'filter', payload: e.target.value }); },
- autoFocus: true,
- value: state.query,
- })
- ]),
- h('div', { style: { backgroundColor: '#fff', padding: '0' } },
- state.filter.map(function (inst) {
- return h('div', { className: 'p5UI__dropdown-item', style: {padding: '8px'} }, [
- _renderReactBtnToggleInstance({ namespace: inst.namespace, store: store }),
- inst.label,
- ])
- })
- ),
- ]),
- _dropdownNode
- );
- setTimeout(function () {
- if (!_dropdownNode) return false
- if (!_dropdownNode.firstChild) return false
- if (!_dropdownNode.firstChild.firstChild) return false
- if (!_dropdownNode.firstChild.firstChild.firstChild) return false
- _dropdownNode.firstChild.firstChild.firstChild.focus()
- }, 100)
- }
- var _renderReactBtnToggleInstance = function (props) {
- var state = props.store.getState()
- if (-1 === state.item.instances.indexOf(props.namespace)) {
- if (-1 === state.waitingSet.indexOf(props.namespace)) {
- return h('button', { style: { margin: '0 6px 0 0' },
- className: 'btn btn-xs btn-default',
- onClick: function () { props.store.dispatch(_reducer_instance_set_send(props.namespace)); }
- }, 'ustaw')
- } else {
- return h('button', { style: { margin: '0 6px 0 0' },
- className: 'btn btn-xs btn-default disabled',
- }, 'ustaw...')
- }
- } else {
- if (-1 === state.waitingUnSet.indexOf(props.namespace)) {
- return h('button', { style: { margin: '0 6px 0 0' },
- className: 'btn btn-xs btn-default',
- onClick: function () { props.store.dispatch(_reducer_instance_unset_send(props.namespace)); }
- }, 'usuń')
- } else {
- return h('button', { style: { margin: '0 6px 0 0' },
- className: 'btn btn-xs btn-default disabled',
- }, 'usuń...')
- }
- }
- }
- store.subscribe(render)
- store.dispatch({
- type: 'INIT',
- payload: {
- allowed_instances: INITIAL_DROPDOWN_DATA.allowed_instances,
- query: '',
- filter: INITIAL_DROPDOWN_DATA.allowed_instances,
- item: INITIAL_DROPDOWN_DATA.items.filter(function (data) {
- return data['pk'] == pk
- }).pop(),
- waitingSet: [],
- waitingUnSet: [],
- }
- })
- // render(); // shows the initial state - send INIT action
- var _state = {
- allowed_instances: INITIAL_DROPDOWN_DATA.allowed_instances,
- query: '',
- filter: INITIAL_DROPDOWN_DATA.allowed_instances,
- item: INITIAL_DROPDOWN_DATA.items.filter(function (data) { return data['pk'] == pk; }).pop(),
- waitingSet: [],
- waitingUnSet: [],
- }
- return function (btnNode, dropdownNode) {
- _btnNode = btnNode
- _dropdownNode = dropdownNode
- if(DBG)console.log('### F.'+JS_GLOBAL_FUNCTION_NAME, { pk: pk, INITIAL_DROPDOWN_DATA: INITIAL_DROPDOWN_DATA, btnNode: btnNode, dropdownNode: dropdownNode, state: _state }) // TODO: rm globals
- render()
- }
- }
- global[JS_GLOBAL_FUNCTION_NAME] = dropdown
|