From ad3516d657adefb95f22cfc8166265b88f6871cf Mon Sep 17 00:00:00 2001 From: David Claux Date: Tue, 28 Nov 2017 16:08:40 -0800 Subject: [PATCH] Add other handles to RenderOptions and rename to IRenderOptions (#996) --- .../nodejs/adaptivecards/src/card-elements.ts | 49 ++++++++++-------- source/nodejs/adaptivecards/src/rendercard.ts | 51 ++++++++++--------- 2 files changed, 55 insertions(+), 45 deletions(-) diff --git a/source/nodejs/adaptivecards/src/card-elements.ts b/source/nodejs/adaptivecards/src/card-elements.ts index 6d8ba8c278..e5df7fec5c 100644 --- a/source/nodejs/adaptivecards/src/card-elements.ts +++ b/source/nodejs/adaptivecards/src/card-elements.ts @@ -510,7 +510,7 @@ export class TextBlock extends CardElement { anchor.classList.add("ac-anchor"); anchor.target = "_blank"; anchor.onclick = (e) => { - if (raiseAnchorClickedEvent(anchor)) { + if (raiseAnchorClickedEvent(this, anchor)) { e.preventDefault(); } } @@ -3187,42 +3187,50 @@ export class Version { } } -function raiseAnchorClickedEvent(anchor: HTMLAnchorElement): boolean { - return AdaptiveCard.onAnchorClicked != null ? AdaptiveCard.onAnchorClicked(anchor) : false; +function raiseAnchorClickedEvent(element: CardElement, anchor: HTMLAnchorElement): boolean { + let card = element.getRootElement() as AdaptiveCard; + let onAnchorClickedHandler = (card && card.onAnchorClicked) ? card.onAnchorClicked : AdaptiveCard.onAnchorClicked; + + return onAnchorClickedHandler != null ? onAnchorClickedHandler(anchor) : false; } function raiseExecuteActionEvent(action: Action) { - // TODO: is this the best way to get access to the parent card? - var card = action.parent.getRootElement() as AdaptiveCard; - if (card && card.onExecuteAction) { - action.prepare(action.parent.getRootElement().getAllInputs()); - card.onExecuteAction(action); - } + let card = action.parent.getRootElement() as AdaptiveCard; + let onExecuteActionHandler = (card && card.onExecuteAction) ? card.onExecuteAction : AdaptiveCard.onExecuteAction; - if (AdaptiveCard.onExecuteAction != null) { + if (onExecuteActionHandler) { action.prepare(action.parent.getRootElement().getAllInputs()); - AdaptiveCard.onExecuteAction(action); + onExecuteActionHandler(action); } } function raiseInlineCardExpandedEvent(action: ShowCardAction, isExpanded: boolean) { - if (AdaptiveCard.onInlineCardExpanded != null) { - AdaptiveCard.onInlineCardExpanded(action, isExpanded); + let card = action.parent.getRootElement() as AdaptiveCard; + let onInlineCardExpandedHandler = (card && card.onInlineCardExpanded) ? card.onInlineCardExpanded : AdaptiveCard.onInlineCardExpanded; + + if (onInlineCardExpandedHandler) { + onInlineCardExpandedHandler(action, isExpanded); } } function raiseElementVisibilityChangedEvent(element: CardElement) { element.getRootElement().updateLayout(); - if (AdaptiveCard.onElementVisibilityChanged != null) { - AdaptiveCard.onElementVisibilityChanged(element); + let card = element.getRootElement() as AdaptiveCard; + let onElementVisibilityChangedHandler = (card && card.onElementVisibilityChanged) ? card.onElementVisibilityChanged : AdaptiveCard.onElementVisibilityChanged; + + if (onElementVisibilityChangedHandler != null) { + onElementVisibilityChangedHandler(element); } } function raiseParseElementEvent(element: CardElement, json: any) { - if (AdaptiveCard.onParseElement != null) { - AdaptiveCard.onParseElement(element, json); + let card = element.getRootElement() as AdaptiveCard; + let onParseElementHandler = (card && card.onParseElement) ? card.onParseElement : AdaptiveCard.onParseElement; + + if (onParseElementHandler != null) { + onParseElementHandler(element, json); } } @@ -3504,8 +3512,11 @@ export class AdaptiveCard extends ContainerWithActions { return true; } - // TODO: Added this as an experiment, if it works we should remove the static handler? + onAnchorClicked: (anchor: HTMLAnchorElement) => boolean = null; onExecuteAction: (action: Action) => void = null; + onElementVisibilityChanged: (element: CardElement) => void = null; + onInlineCardExpanded: (action: ShowCardAction, isExpanded: boolean) => void = null; + onParseElement: (element: CardElement, json: any) => void = null; version?: Version = new Version(1, 0); fallbackText: string; @@ -3621,8 +3632,6 @@ class InlineAdaptiveCard extends AdaptiveCard { } } -// const defaultHostConfig: HostConfig.HostConfig = new HostConfig.HostConfig(); - const defaultHostConfig: HostConfig.HostConfig = new HostConfig.HostConfig( { supportsInteractivity: true, diff --git a/source/nodejs/adaptivecards/src/rendercard.ts b/source/nodejs/adaptivecards/src/rendercard.ts index 1d2da9104a..41dbf63eb6 100644 --- a/source/nodejs/adaptivecards/src/rendercard.ts +++ b/source/nodejs/adaptivecards/src/rendercard.ts @@ -1,48 +1,49 @@ -import { Action, AdaptiveCard, HostConfig } from "./adaptivecards"; +import { Action, ShowCardAction, CardElement, AdaptiveCard, HostConfig } from "./adaptivecards"; import { IAdaptiveCard } from "./schema"; -export interface RenderOptions { +export interface IRenderOptions { hostConfig?: HostConfig | string | object; + onAnchorClicked?: (anchor: HTMLAnchorElement) => boolean; onExecuteAction?: (action: Action) => void; - onValidationError?: (error: string) => void; + onElementVisibilityChanged?: (element: CardElement) => void; + onInlineCardExpanded?: (action: ShowCardAction, isExpanded: boolean) => void; + onParseElement?: (element: CardElement, json: any) => void; processMarkdown?: (text: string) => string; } -export function renderCard(card: IAdaptiveCard | string, options?: RenderOptions): HTMLElement { - +export function renderCard(card: IAdaptiveCard | string, options?: IRenderOptions): HTMLElement { if (typeof card === "string") { card = JSON.parse(card); } options = options || {}; - // Parse the host config - let hostConfig: HostConfig; - if (isHostConfig(options.hostConfig)) { - hostConfig = options.hostConfig; + // Setup a card + let adaptiveCard = new AdaptiveCard(); + + if (typeof options.hostConfig === "string") { + adaptiveCard.hostConfig = new HostConfig(JSON.parse(options.hostConfig)); + } + else if (typeof options.hostConfig === "object" && !(options.hostConfig instanceof HostConfig)) { + adaptiveCard.hostConfig = new HostConfig(options.hostConfig); } - else if (options.hostConfig instanceof String) { - hostConfig = new HostConfig(JSON.parse(options.hostConfig)); - } else { - hostConfig = new HostConfig(options.hostConfig); + else { + adaptiveCard.hostConfig = options.hostConfig; } - // Parse the card - let adaptiveCard = new AdaptiveCard(); - adaptiveCard.parse(card); - adaptiveCard.hostConfig = hostConfig; + adaptiveCard.onAnchorClicked = options.onAnchorClicked; adaptiveCard.onExecuteAction = options.onExecuteAction; - - // Process markdown + adaptiveCard.onElementVisibilityChanged = options.onElementVisibilityChanged; + adaptiveCard.onInlineCardExpanded = options.onInlineCardExpanded; + adaptiveCard.onParseElement = options.onParseElement; + if (options.processMarkdown) { AdaptiveCard.processMarkdown = options.processMarkdown; } + // Parse the card + adaptiveCard.parse(card); + // Render the card return adaptiveCard.render(); -} - -function isHostConfig(hostConfig: HostConfig | string | any): hostConfig is HostConfig { - // TODO: make this check better - return hostConfig && hostConfig.getContainerStyleDefinition; -} +} \ No newline at end of file