From af30de946a9106a874c7208fd2a175fcb5cc8947 Mon Sep 17 00:00:00 2001 From: Konrad Date: Tue, 27 Apr 2021 22:03:04 +0200 Subject: [PATCH] Added Valo Connect Widget sample --- .../extendValoUi/CustomExtensions.tsx | 26 ++++++++++++- .../customWidget/CustomWidget.tsx | 16 ++++++++ .../customWidget/CustomWidgetConfig.tsx | 39 +++++++++++++++++++ 3 files changed, 80 insertions(+), 1 deletion(-) create mode 100644 src/extensions/extendValoUi/customWidget/CustomWidget.tsx create mode 100644 src/extensions/extendValoUi/customWidget/CustomWidgetConfig.tsx diff --git a/src/extensions/extendValoUi/CustomExtensions.tsx b/src/extensions/extendValoUi/CustomExtensions.tsx index b2df49d..752523b 100644 --- a/src/extensions/extendValoUi/CustomExtensions.tsx +++ b/src/extensions/extendValoUi/CustomExtensions.tsx @@ -1,5 +1,5 @@ import * as React from 'react'; -import { IntranetLocation, IntranetTrigger, IntranetProvider, ExtensionService, TriggerService, ProviderService, ExtensionProvider, IUserProfileProvider, DataSourceService, ExtensionPointToolboxAction, ExtensionPointToolboxPanelCreationAction, MegaMenuItem, StorageType, IClientStorageProvider, IMyToolsProvider, INavigationHierarchyProvider, MegaMenuNavigationItem, InformationMessage, ContextActionType } from '@valo/extensibility'; +import { IntranetLocation, IntranetTrigger, IntranetProvider, ExtensionService, TriggerService, ProviderService, ExtensionProvider, IUserProfileProvider, DataSourceService, ExtensionPointToolboxAction, ExtensionPointToolboxPanelCreationAction, MegaMenuItem, StorageType, IClientStorageProvider, IMyToolsProvider, INavigationHierarchyProvider, MegaMenuNavigationItem, InformationMessage, ContextActionType, ConnectWidgetService, ConnectWidgetSize } from '@valo/extensibility'; import { IMultilingualProvider } from '@valo/extensibility/lib/providerTypes/IMultilingualProvider'; import { PrimaryButton } from 'office-ui-fabric-react/lib/Button'; import Clock from './clock'; @@ -14,6 +14,8 @@ import { CustomGroupHeader } from './customGroupHeader'; import { Footer } from './footer'; import { CustomNotifications } from './customNotifications/CustomNotifications'; import ToolboxComponent from './toolboxComponent/ToolboxComponent'; +import { CustomWidget } from './customWidget/CustomWidget'; +import { CustomWidgetConfigComponent } from './customWidget/CustomWidgetConfig'; export const CustomBreadcrumb: React.SFC = (props: any) => { console.log('CustomBreadcrumb', props); @@ -31,12 +33,14 @@ export default class CustomExtensions { private triggerService: TriggerService = null; private providerService: ProviderService = null; private dataSourceService: DataSourceService = null; + private connectWidgetService: ConnectWidgetService = null; constructor() { this.extensionService = ExtensionService.getInstance(); this.triggerService = TriggerService.getInstance(); this.providerService = ProviderService.getInstance(); this.dataSourceService = DataSourceService.getInstance(); + this.connectWidgetService = ConnectWidgetService.getInstance(); } public register(ctx: ApplicationCustomizerContext) { @@ -173,6 +177,7 @@ export default class CustomExtensions { // } as ExtensionPointToolboxPanelCreationAction // ] // }); + this.registerWidget(); this.extensionService.registerExtension({ id: "ToolboxPanelCreationAction3", @@ -265,6 +270,25 @@ export default class CustomExtensions { }); } + private registerWidget(): void { + this.connectWidgetService.registerWidget({ + id: "custom-widget-sample", + size: ConnectWidgetSize.Single, + title: "Widget sample", + description: "This is a sample widget registered via extension", + widgetComponentsFactory: (config) => [ + { + id: "custom-widget-sample-1", + title: "Tab 1", + content: + } + ], + widgetConfigComponentFactory: (currentConfig: any, onConfigUpdated: (config: any) => void) => { + return ; + } + }); + } + private async fetchProviders() { const configProvider = await this.providerService.getProvider(IntranetProvider.Config); diff --git a/src/extensions/extendValoUi/customWidget/CustomWidget.tsx b/src/extensions/extendValoUi/customWidget/CustomWidget.tsx new file mode 100644 index 0000000..da2674e --- /dev/null +++ b/src/extensions/extendValoUi/customWidget/CustomWidget.tsx @@ -0,0 +1,16 @@ +import * as React from 'react'; +import { ICustomWidgetConfig } from './CustomWidgetConfig'; + +export interface ICustomWidgetProps { + widgetConfig: ICustomWidgetConfig; +} + +export class CustomWidget extends React.Component { + public render() { + return this.props.widgetConfig ?
+

{this.props.widgetConfig.title}

+

{this.props.widgetConfig.text}

+ Valo Intranet +
:
Widget is not configured
; + } +} \ No newline at end of file diff --git a/src/extensions/extendValoUi/customWidget/CustomWidgetConfig.tsx b/src/extensions/extendValoUi/customWidget/CustomWidgetConfig.tsx new file mode 100644 index 0000000..10a4177 --- /dev/null +++ b/src/extensions/extendValoUi/customWidget/CustomWidgetConfig.tsx @@ -0,0 +1,39 @@ +import * as React from 'react'; +import { ConnectWidgetConfigurationComponent, ConnectWidgetConfigurationProps } from '@valo/extensibility/lib/models/connectWidget/'; +import { TextField } from 'office-ui-fabric-react/lib/TextField'; + +export interface ICustomWidgetConfig { + title: string; + text: string; +} + +export interface ICustomWidgetState { + title: string; + text: string; +} + +export class CustomWidgetConfigComponent extends ConnectWidgetConfigurationComponent { + + constructor(props: ConnectWidgetConfigurationProps) { + super(props); + this.state = { + title: this.props.widgetConfiguration ? this.props.widgetConfiguration.title : '', + text: this.props.widgetConfiguration ? this.props.widgetConfiguration.text : '' + }; + } + + public render() { + return
+ + +
; + } + + private titleChanged = (ev: React.FormEvent, newText: string) => { + this.setState({title: newText}, () => this.props.onConfigurationUpdated(this.state)); + } + + private textChanged = (ev: React.FormEvent, newText: string) => { + this.setState({text: newText}, () => this.props.onConfigurationUpdated(this.state)); + } +} \ No newline at end of file