UNPKG

@adaptabletools/adaptable

Version:

Powerful data-agnostic HTML5 AG Grid extension which provides advanced, cutting-edge functionality to meet all DataGrid requirements

204 lines (203 loc) 8.81 kB
import { ContextConfiguration } from '../../AdaptableState/Common/Fdc3Context'; import { Fdc3IntentConfiguration } from '../../AdaptableState/Common/Fdc3Intent'; export class Fdc3Service { constructor(adaptableApi) { this.adaptableApi = adaptableApi; this.contextHandlerSubscriptions = []; this.intentHandlerSubscriptions = []; this.loggedAgentError = false; // 1. Subscribe to FDC3 events const adaptableHandleIntentFn = this.getFdc3Options().intents?.handleIntent; const listenForIntents = this.getFdc3Options().intents?.listensFor ?? []; if (listenForIntents.length) { if (!adaptableHandleIntentFn) { this.adaptableApi.logError(`Following FDC3 Intent Listener(s) have been provided but no 'handleIntent' function has been supplied in the FDC3 Options`, listenForIntents); } listenForIntents.forEach((intent) => { this.adaptableApi.logInfo(`Listening for FDC3 Intent: ${intent}`); this.getDesktopAgent() ?.addIntentListener(intent, (context, metadata) => { this.logFdc3Event('IN', `Intent`, JSON.stringify(context)); const fnContext = { ...this.adaptableApi.internalApi.buildBaseContext(), context, intent, metadata, }; adaptableHandleIntentFn?.(fnContext); const payload = { ...this.adaptableApi.internalApi.buildBaseContext(), direction: 'received', eventType: 'IntentRaised', intent, context, metadata, }; this.adaptableApi.eventApi.emit('Fdc3Message', payload); }) .then((listener) => this.intentHandlerSubscriptions.push(listener)); }); } const adaptableHandleContextFn = this.getFdc3Options().contexts?.handleContext; const listenForContexts = this.getFdc3Options().contexts?.listensFor ?? []; if (listenForContexts.length) { if (!adaptableHandleContextFn) { this.adaptableApi.logError(`Following FDC3 Context Listener(s) have been provided but no 'handleContext' function has been supplied in the FDC3 Options`, listenForContexts); } listenForContexts.forEach((contextType) => { this.adaptableApi.logInfo(`Listening for FDC3 Context: ${contextType}`); this.getDesktopAgent() ?.addContextListener(contextType, (context, metadata) => { this.logFdc3Event('IN', `Context`, JSON.stringify(context)); const fnContext = { ...this.adaptableApi.internalApi.buildBaseContext(), context, metadata, }; adaptableHandleContextFn?.(fnContext); const payload = { ...this.adaptableApi.internalApi.buildBaseContext(), direction: 'received', eventType: 'ContextBroadcast', context, metadata, }; this.adaptableApi.eventApi.emit('Fdc3Message', payload); }) .then((listener) => this.contextHandlerSubscriptions.push(listener)); }); } // 2. Init UI Controls default configuration this.uiControlsDefaultConfiguration = this.buildUiControlsDefaultConfiguration(); } getUiControlsDefaultConfiguration() { return this.uiControlsDefaultConfiguration; } getDesktopAgent() { if (globalThis.fdc3 == null && !this.loggedAgentError) { this.loggedAgentError = true; this.adaptableApi.consoleError('FDC3 Desktop Agent not found. This should be provided by the wrapper application.'); } return globalThis.fdc3; } destroy() { this.contextHandlerSubscriptions.forEach((subscription) => subscription.unsubscribe()); this.intentHandlerSubscriptions.forEach((subscription) => subscription.unsubscribe()); } async raiseIntent(intent, context, app) { if (!this.getDesktopAgent()) { return; } try { this.logFdc3Event('OUT', `raise ${intent}`, JSON.stringify(context)); const payload = { ...this.adaptableApi.internalApi.buildBaseContext(), direction: 'sent', eventType: 'RaiseIntent', intent, context, app, }; this.adaptableApi.eventApi.emit('Fdc3Message', payload); const intentResolution = await this.getDesktopAgent().raiseIntent(intent, context, app); this.logFdc3Event('IN', `IntentResolution`, intentResolution.intent); this.getFdc3Api().internalApi.handleIntentResolution(intentResolution, context, intent, app); return intentResolution; } catch (error) { this.logFdc3Error(error); } } async raiseIntentForContext(context, app) { if (!this.getDesktopAgent()) { return; } try { this.logFdc3Event('OUT', `raise for context`, JSON.stringify(context)); const payload = { ...this.adaptableApi.internalApi.buildBaseContext(), direction: 'sent', eventType: 'RaiseIntentForContext', context, app, }; this.adaptableApi.eventApi.emit('Fdc3Message', payload); const intentResolution = await this.getDesktopAgent().raiseIntentForContext(context, app); this.logFdc3Event('IN', `IntentResolution`, intentResolution.intent); this.getFdc3Api().internalApi.handleIntentResolution(intentResolution, context, null, app); return intentResolution; } catch (error) { this.logFdc3Error(error); } } broadcast(context, channel) { if (!this.getDesktopAgent()) { return; } try { this.logFdc3Event('OUT', `broadcast`, JSON.stringify(context)); const payload = { ...this.adaptableApi.internalApi.buildBaseContext(), direction: 'sent', eventType: 'BroadcastMessage', context, }; this.adaptableApi.eventApi.emit('Fdc3Message', payload); if (channel) { return channel.broadcast(context); } else { return this.getDesktopAgent().broadcast(context); } } catch (error) { this.logFdc3Error(error); } } logFdc3Event(type, ...params) { if (!this.getFdc3Options().enableLogging) { return; } this.adaptableApi.consoleLog(`FDC3::${type} - `, params.join(' : ')); } logFdc3Error(error) { this.adaptableApi.consoleError(`FDC3 error`, error); this.adaptableApi.alertApi.showAlertError('FDC3 Error', 'See console for details'); } getFdc3Api() { return this.adaptableApi.fdc3Api; } getFdc3Options() { return this.adaptableApi.optionsApi.getFdc3Options(); } buildUiControlsDefaultConfiguration() { const adaptableDefaultContextIcons = Object.keys(ContextConfiguration).reduce((contextsMapping, contextType) => { contextsMapping[contextType] = { icon: { name: ContextConfiguration[contextType].icon, }, }; return contextsMapping; }, {}); const adaptableDefaultIntentIcons = Object.keys(Fdc3IntentConfiguration).reduce((intentsMapping, intentType) => { intentsMapping[intentType] = { icon: { name: Fdc3IntentConfiguration[intentType].icon, }, }; return intentsMapping; }, {}); // merge adaptable defaults with (optional) user provided configuration return { contexts: { ...adaptableDefaultContextIcons, ...this.getFdc3Options().uiControlsDefaultConfiguration?.contexts, }, intents: { ...adaptableDefaultIntentIcons, ...this.getFdc3Options().uiControlsDefaultConfiguration?.intents, }, }; } }