UNPKG

periodicjs.ext.reactapp

Version:
597 lines (589 loc) 19.1 kB
'use strict'; const periodic = require('periodicjs'); const flatten = require('flat'); const controllerhelper = require('./controllerhelper'); const helpers = require('./manifest/helpers'); const data_tables = require('./manifest/table/data_tables'); const oauth2ServerUtils = periodic.locals.extensions.get('periodicjs.ext.oauth2server'); const logger = periodic.logger; let initialReactAppConfig = {}; let intialReactAppClient; let reactAppConfig = {}; const styles = require('./styles'); const configurationHelperText = { component: 'code', props: { style:styles.codeSample.code, }, children: [ { component: 'em', props: { style:styles.codeSample.codeEm, }, children:'//creating configurations', }, { component:'br', }, { component: 'div', children:'$ periodicjs cco [type] [name] [environment] [path/to/output/config/json]', }, { component: 'div', children:'$ periodicjs createConfig [type] [name] [environment] [path/to/output/config/json]', }, { component:'br', }, { component: 'em', props: { style:styles.codeSample.codeEm, }, children:'//types: app|application|ext|extension|ext-local|extension-local|con|container|con-local|container-local', }, { component:'br', }, { component: 'em', props: { style:styles.codeSample.codeEm, }, children:'//example creating configuration', }, { component:'br', }, { component: 'div', children:'$ periodicjs createConfig ext periodicjs.ext.dbseed development ~/Desktop/dev.dbseed-config.json', }, { component:'br', }, { component: 'em', props: { style:styles.codeSample.codeEm, }, children:'//add configuration', }, { component:'br', }, { component: 'div', children:'$ periodicjs aco [path/to/configuration/json]', }, { component: 'div', children:'$ periodicjs addConfig [path/to/configuration/json]', }, { component: 'div', children:'$ node index.js --cli --crud=ext --crud_op=create --crud_arg=[path/to/configuration/json]', }, { component:'br', }, { component: 'em', props: { style:styles.codeSample.codeEm, }, children:'//example manually adding configuration', }, { component:'br', }, { component: 'div', children:'$ periodicjs addConfig /home/myuser/documents/projects/appconfig-dev.json', }, { component:'br', }, { component: 'em', props: { style:styles.codeSample.codeEm, }, children:'//remove configuration', }, { component:'br', }, { component: 'div', children:'$ periodicjs rco [id-of-configuration-doc]', }, { component: 'div', children:'$ periodicjs removeConfig [id-of-configuration-doc]', }, { component: 'div', children:'$ node index.js --cli --crud=ext --crud_op=remove --crud_arg=[id-of-configuration-doc]', }, { component:'br', }, { component: 'em', props: { style:styles.codeSample.codeEm, }, children:'//example manually removing bdb7aa6485aebe8ac81992def07c6f96', }, { component:'br', }, { component: 'div', children:'$ periodicjs removeConfig bdb7aa6485aebe8ac81992def07c6f96', }, ], }; const extensionHelperText = { component: 'code', props: { style:styles.codeSample.code, }, children: [ { component: 'em', props: { style:styles.codeSample.codeEm, }, children:'//add extension', }, { component:'br', }, { component: 'div', children:'$ periodicjs aex [name-of-extension]', }, { component: 'div', children:'$ periodicjs addExtension [name-of-extension]', }, { component: 'div', children:'$ node index.js --cli --crud=ext --crud_op=create --crud_arg=[name-of-extension]', }, { component:'br', }, { component: 'em', props: { style:styles.codeSample.codeEm, }, children:'//example manually adding periodicjs.ext.passport', }, { component:'br', }, { component: 'div', children:'$ npm i periodicjs.ext.passport', }, { component: 'div', children:'$ periodicjs addExtension periodicjs.ext.passport', }, { component:'br', }, { component: 'em', props: { style:styles.codeSample.codeEm, }, children:'//remove extension', }, { component:'br', }, { component: 'div', children:'$ periodicjs rex [name-of-extension]', }, { component: 'div', children:'$ periodicjs removeExtension [name-of-extension]', }, { component: 'div', children:'$ node index.js --cli --crud=ext --crud_op=remove --crud_arg=[name-of-extension]', }, { component:'br', }, { component: 'em', props: { style:styles.codeSample.codeEm, }, children:'//example manually removing periodicjs.ext.passport', }, { component:'br', }, { component: 'div', children:'$ periodicjs removeExtension periodicjs.ext.passport', }, { component: 'div', children:'$ npm rm periodicjs.ext.passport', }, ], }; function getDefaultIndexTableFields() { const reactAppConfig = periodic.settings.extensions['periodicjs.ext.reactapp']; const adminRoute = helpers.getManifestPathPrefix(reactAppConfig.adminPath); function getUserTableHeader(schemaName) { return [ data_tables.tableField({ field: 'email', link: true, headerStyle: { maxWidth: 200, overflow: 'hidden', textOverflow: 'ellipsis', }, columnStyle: { maxWidth: 200, overflow: 'hidden', textOverflow: 'ellipsis', }, })({ adminRoute, schemaName, }), data_tables.tableCreatedDate(), data_tables.tableField({ title: 'First Name', field: 'firstname', })({ adminRoute, schemaName, }), data_tables.tableField({ title: 'Last Name', field: 'lastname', })({ adminRoute, schemaName, }), data_tables.tableField({ // title: 'Last Name', field: 'activated', })({ adminRoute, schemaName, }), data_tables.tableField({ title: 'User Roles', field: 'userroles', })({ adminRoute, schemaName, }), data_tables.tableField({ title: 'Account Type', field: 'accounttype', })({ adminRoute, schemaName, }), data_tables.tableOptions({ adminRoute, schemaName, }), ]; } return { standard_user: getUserTableHeader('standard_user'), standard_account: getUserTableHeader('standard_account'), standard_userrole: [ data_tables.tableField({ field: 'name', link: true, headerStyle: { maxWidth: 150, // overflow: 'hidden', // textOverflow: 'ellipsis', }, columnStyle: { maxWidth: 150, // overflow: 'hidden', // textOverflow: 'ellipsis', }, })({ adminRoute, schemaName: 'standard_userrole', }), data_tables.tableField({ title: 'Role ID', field: 'userroleid', })({ adminRoute, schemaName: 'standard_userrole', }), data_tables.tableField({ title: 'Privileges', field: 'privileges', })({ adminRoute, schemaName: 'standard_userrole', }), data_tables.tableField({ title: 'Description', field: 'description', })({ adminRoute, schemaName: 'standard_userrole', }), data_tables.tableOptions({ adminRoute, schemaName: 'standard_userrole', }), ], standard_userprivilege: [ data_tables.tableField({ field: 'name', link: true, headerStyle: { maxWidth: 150, // overflow: 'hidden', // textOverflow: 'ellipsis', }, columnStyle: { maxWidth: 150, // overflow: 'hidden', // textOverflow: 'ellipsis', }, })({ adminRoute, schemaName: 'standard_userprivilege', }), data_tables.tableField({ title: 'Privilege ID', field: 'userprivilegeid', })({ adminRoute, schemaName: 'standard_userprivilege', }), data_tables.tableField({ title: 'Label', field: 'label', })({ adminRoute, schemaName: 'standard_userprivilege', }), data_tables.tableField({ title: 'Description', field: 'description', })({ adminRoute, schemaName: 'standard_userprivilege', }), data_tables.tableOptions({ adminRoute, schemaName: 'standard_userprivilege', }), ], standard_asset: [ data_tables.tableField({ field: 'name', link: true, headerStyle: { maxWidth: 150, // overflow: 'hidden', // textOverflow: 'ellipsis', }, columnStyle: { maxWidth: 150, // overflow: 'hidden', // textOverflow: 'ellipsis', }, })({ adminRoute, schemaName: 'standard_asset', }), data_tables.tableCreatedDate({}), data_tables.tableField({ title: 'Size', field: 'transform.size', })({ adminRoute, schemaName: 'standard_asset', }), data_tables.tableField({ title: 'Attributes', icon: true, field: 'transform.attributes', })({ adminRoute, schemaName: 'standard_asset', }), // data_tables.tableField({ // title: 'Encrypted', // icon: true, // field: 'transform.encrypted', // }), // data_tables.tableField({ // title: 'Exif', // icon: true, // field: 'transform.exif', // }), data_tables.tableField({ title: 'Preview', image: true, field: 'transform.preview', })({ adminRoute, schemaName: 'standard_asset', }), data_tables.tableOptions({ adminRoute, schemaName: 'standard_asset', }), ], configuration: [ data_tables.tableField({ field: 'filepath', link: true, headerStyle: { maxWidth: 350, overflow: 'hidden', textOverflow: 'ellipsis', }, columnStyle: { maxWidth: 350, overflow: 'hidden', textOverflow: 'ellipsis', }, })({ adminRoute, schemaName: 'configuration', }), data_tables.tableField({ // title: 'Size', field: 'environment', })({ adminRoute, schemaName: 'configuration', }), data_tables.tableField({ field: 'container', })({ adminRoute, schemaName: 'configuration', }), data_tables.tableCreatedDate({}), data_tables.tableOptions({ adminRoute, schemaName: 'configuration', }), ], extension: [ data_tables.tableField({ field: 'name', link: true, headerStyle: { maxWidth: 250, // overflow: 'hidden', // textOverflow: 'ellipsis', }, columnStyle: { maxWidth: 250, // overflow: 'hidden', // textOverflow: 'ellipsis', }, })({ adminRoute, schemaName: 'extension', }), data_tables.tableField({ field: 'source', })({ adminRoute, schemaName: 'extension', }), data_tables.tableField({ field: 'version', })({ adminRoute, schemaName: 'extension', }), data_tables.tableField({ title: 'Type', field: 'periodic_type', })({ adminRoute, schemaName: 'extension', }), data_tables.tableField({ title: 'Priority', field: 'periodic_priority', })({ adminRoute, schemaName: 'extension', }), data_tables.tableField({ title: 'Compatibility', field: 'periodic_compatibility', })({ adminRoute, schemaName: 'extension', }), data_tables.tableCreatedDate({}), data_tables.tableOptions({ adminRoute, schemaName: 'extension', }), ], }; } function getAdditionalJSFiles() { const extensions = Array.from(periodic.extensions.values()); const additional_files = extensions.reduce((result, ext) => { if (ext.periodic_config && ext.periodic_config.additional_footer_js && Array.isArray(ext.periodic_config.additional_footer_js)) { result.footer.push(...ext.periodic_config.additional_footer_js); } if (ext.periodic_config && ext.periodic_config.additional_header_js && Array.isArray(ext.periodic_config.additional_header_js)) { result.header.push(...ext.periodic_config.additional_header_js); } return result; }, { header: [], footer: [], }); return additional_files; } function setInitialIndexTable() { const reactAppConfig = periodic.settings.extensions['periodicjs.ext.reactapp']; periodic.settings.extensions[ 'periodicjs.ext.reactapp' ].data_tables = Object.assign({}, getDefaultIndexTableFields(), periodic.settings.extensions[ 'periodicjs.ext.reactapp' ].data_tables); periodic.settings.extensions[ 'periodicjs.ext.reactapp' ].extension_overrides.customIndexPageComponents = Object.assign({}, periodic.settings.extensions[ 'periodicjs.ext.reactapp' ].extension_overrides.customIndexPageComponents, { configuration: configurationHelperText, extension: extensionHelperText, }); periodic.settings.extensions[ 'periodicjs.ext.reactapp' ].extension_overrides.customDetailPageComponents = Object.assign({}, periodic.settings.extensions[ 'periodicjs.ext.reactapp' ].extension_overrides.customDetailPageComponents, { configuration: configurationHelperText, extension: extensionHelperText, }); // settings.auth.enforce_mfa // console.log("periodic.settings.extensions[ 'periodicjs.ext.reactapp' ].auth", periodic.settings.extensions[ 'periodicjs.ext.reactapp' ].auth); // console.log('getDefaultIndexTableFields()', getDefaultIndexTableFields()) periodic.settings.extensions[ 'periodicjs.ext.reactapp' ].additional_js_files = Object.assign({}, periodic.settings.extensions[ 'periodicjs.ext.reactapp' ].additional_js_files, getAdditionalJSFiles()); if (reactAppConfig && reactAppConfig.includeCoreData && reactAppConfig.includeCoreData.manifest) { let task = setImmediate(() => { controllerhelper.setCoreDataConfigurations(); clearImmediate(task); }); } } function init() { const configurationDB = periodic.datas.get('configuration'); const appEnvironment = periodic.settings.application.environment; const reactAppConfigFilepath = `content/config/extensions/periodicjs.ext.reactapp/${appEnvironment}.json`; Promise.all([ configurationDB.load({ query: { filepath: reactAppConfigFilepath, }, }), periodic.datas.get('standard_client').load({ query: { name: 'reactapp', }, }), ]) .then(results => { const [dbReactAppConfig, dbReactAppClient,] = results; // console.log({ dbReactAppConfig, dbReactAppClient }) initialReactAppConfig = dbReactAppConfig; intialReactAppClient = dbReactAppClient; if (!dbReactAppClient) { return oauth2ServerUtils.client.create({ name: 'reactapp', }); } else { return true; } }) .then(createdClient => { if (!intialReactAppClient) { intialReactAppClient = (typeof createdClient.toJSON === 'function') ? createdClient.toJSON() : createdClient; } if (initialReactAppConfig && initialReactAppConfig.config && initialReactAppConfig.config.settings && initialReactAppConfig.config.settings.login && initialReactAppConfig.config.settings.login.url && initialReactAppConfig.config.settings && initialReactAppConfig.config.settings.login && initialReactAppConfig.config.settings.login.options && initialReactAppConfig.config.settings.login.options.headers && initialReactAppConfig.config.settings.login.options.headers.clientid) { logger.silly('Already configured ReactApp'); return true; } else { if (initialReactAppConfig && initialReactAppConfig.config && initialReactAppConfig.config.settings && initialReactAppConfig.config.settings.login && initialReactAppConfig.config.settings.login.url) { reactAppConfig.login = { url: initialReactAppConfig.config.settings.login.url, }; } else { reactAppConfig.login = { url: periodic.settings.application.protocol + periodic.settings.application.url + '/api/jwt/token', options: { headers: { clientid: intialReactAppClient.client_id, }, }, }; reactAppConfig.userprofile = Object.assign({}, reactAppConfig.login); reactAppConfig.userprofile.url = periodic.settings.application.protocol + periodic.settings.application.url + '/api/jwt/profile'; } reactAppConfig.basename = periodic.settings.application.protocol + periodic.settings.application.url; reactAppConfig.name = periodic.settings.name; reactAppConfig.title = periodic.settings.name; reactAppConfig.application = { environment: periodic.settings.application.environment, }; configurationDB.create({ newdoc: { filepath: reactAppConfigFilepath, environment: appEnvironment, config: { settings: reactAppConfig, }, container: periodic.settings.container.name, }, }).then(createdReactAppConfig => { logger.silly('created initial react app config'); periodic.settings.extensions[ 'periodicjs.ext.reactapp' ] = flatten.unflatten( Object.assign({}, flatten(periodic.settings.extensions[ 'periodicjs.ext.reactapp' ] || {}), flatten(reactAppConfig || {}) ) ); return true; }) .catch(logger.error); } }) .then(configStatus => { setInitialIndexTable(); logger.silly({ configStatus, }); }) .catch(logger.error); } module.exports = { configurationHelperText, extensionHelperText, getDefaultIndexTableFields, setInitialIndexTable, getAdditionalJSFiles, init, };