UNPKG

c1-cms

Version:

Contains React components distributed with C1 CMS.

120 lines (114 loc) 4.3 kB
import { loadPageDef } from 'console/state/actions/pageDefs.js'; import { loadValues } from 'console/state/actions/values.js'; import { openPage, setPage } from 'console/state/reducers/layout.js'; import { getLogDates, getLogPage } from 'console/state/actions/logs.js'; import { getProviderPage } from 'console/state/actions/fetchFromProvider.js'; import { subscribe } from 'console/state/observers.js'; import WAMPClient from 'console/access/wampClient.js'; const actionList = { getLogDates, getLogPage }; const pageLoaders = { document: (pageName, getState, dispatch) => { let pageDef = getState().getIn(['pageDefs', pageName]); let loading = [ dispatch(loadValues(pageName)) ]; // Run through toolbars, load options pageDef.get('toolbars').forEach(toolbarName => { let toolbarDef = getState().getIn(['toolbarDefs', toolbarName]); toolbarDef.get('items').forEach(itemName => { let itemDef = getState().getIn(['itemDefs', itemName]); if (itemDef.get('type') === 'select' && itemDef.get('optionLoader')) { loading.push(dispatch(actionList[itemDef.get('optionLoader')](itemName))); } }); }); let tabs = pageDef && pageDef.get('tabs') ? pageDef.get('tabs').toArray() : []; tabs.forEach(tabName => loading.push(dispatch(loadTabValues(tabName))) ); return Promise.all(loading); }, dialogPageShim: (pageName, getState, dispatch) => { let context; if (location.search && /(\?|&)containerClasses/.test(location.search)) { context = location.search.replace(/^\?(?:.*&)?containerClasses=(.+?)?(?:&.*)?$/, '$1'); } else { context = ''; } let dialogName = getState().getIn(['pageDefs', pageName, 'dialog']); let dialogDef = getState().getIn(['dialogDefs', dialogName]); let paneIndex = getState().getIn(['dialogData', dialogName, 'showPane']) || 0; let paneName = dialogDef.getIn(['panes', paneIndex]); let paneDef = getState().getIn(['dialogPaneDefs', paneName]); if (paneDef.get('type') === 'palette') { let provider = getState().getIn(['providerDefs', paneDef.get('provider')]).toJS(); // XXX: Context extraction is hard coded and ugly AF. // Needs to be in page structure data where it belongs, return dispatch(getProviderPage(provider, dialogName, /**/context/*/paneDef.get('context')/**/)) .then(() => { // Subscribe to component update let topic = getState().getIn(['providerDefs', paneDef.get('updateTopic'), 'uri']); if (topic) { WAMPClient.subscribe(topic, () => { // Fetch new list if event dispatch(getProviderPage(provider, dialogName, /**/context/*/paneDef.get('context')/**/)); }); } }); } else { return Promise.resolve(); } } }; export function loadAndOpenPage(pageName) { return (dispatch, getState) => { let loadDef = getState().getIn(['pageDefs', pageName]) ? Promise.resolve(null) : dispatch(loadPageDef(pageName)); return Promise.all([ loadDef.then(() => { let pageDef = getState().getIn(['pageDefs', pageName]); // Load any options specified let tabs = pageDef && pageDef.get('tabs') ? pageDef.get('tabs').toArray() : []; let loading = []; dispatch(openPage(pageName, tabs)); dispatch(setPage(pageName)); let loader = pageLoaders[pageDef.get('type')]; if (loader) { loading.push(loader(pageName, getState, dispatch)); } return Promise.all(loading); }) ]); }; } const tabLoaders = { log: (tabName, getState, dispatch) => { let dateSelectorName = getState().getIn(['tabDefs', tabName, 'logPageName']); let loadLogs = () => { let date = getState().getIn(['options', 'values', dateSelectorName]) || getState().getIn(['options', 'lists', dateSelectorName, 0, 'value']); if (!getState().getIn(['logs', tabName, date])) { dispatch(actionList.getLogPage(tabName, date)); } }; subscribe(['options', 'values', dateSelectorName], loadLogs); return loadLogs(); } }; export function loadTabValues(tabName) { return (dispatch, getState) => { let tabDef = getState().getIn(['tabDefs', tabName]); let loader = tabLoaders[tabDef.get('type')]; if (loader) { return loader(tabName, getState, dispatch); } }; }