diff --git a/datamodel.combodo-webhook-integration.xml b/datamodel.combodo-webhook-integration.xml
index b5e4113..98d0559 100644
--- a/datamodel.combodo-webhook-integration.xml
+++ b/datamodel.combodo-webhook-integration.xml
@@ -2263,6 +2263,15 @@ protected function ApplyParamsToJson(array $aContextArgs, string $sInputAsJson)
true
list
+
+
+ message_card
+ adaptive_card
+
+ json_format
+ message_card
+ false
+
yes
@@ -2309,6 +2318,31 @@ protected function ApplyParamsToJson(array $aContextArgs, string $sInputAsJson)
* @inheritDoc
*/]]>
Get('json_format');
+ return match ($sJsonFormat) {
+ 'message_card' => $this->PreparePayloadMessageCard($aContextArgs),
+ 'adaptive_card' => $this->PreparePayloadAdaptiveCard($aContextArgs),
+ default => throw new Exception('Unknown json_format ($sJsonFormat)'),
+ };
+ }
+]]>
+
+
+
+ false
+ protected
+ Custom
+
+ 'MessageCard',
@@ -2367,6 +2401,152 @@ protected function ApplyParamsToJson(array $aContextArgs, string $sInputAsJson)
$aData['potentialAction'] = $aActions;
}
+ return json_encode($aData);
+ }
+]]>
+
+
+
+ false
+ protected
+ Custom
+
+ 'message',
+ ];
+
+ // Prepare theme
+ // - Color
+ // TODO: Not possible with adaptive card, you only could use accents
+ // "default", "emphasis", "good", "attention", "warning","accent"
+ $sContainerStyle = null;
+ $sThemeColor = MetaModel::ApplyParams($this->Get('theme_color'), $aContextArgs);
+ if (in_array($sThemeColor, ["default", "emphasis", "good", "attention", "warning","accent"])) {
+ $sContainerStyle = $sThemeColor;
+ }
+
+ // - Image
+ $aImageBlock = null;
+ $sImageUrl = MetaModel::ApplyParams($this->Get('image_url'), $aContextArgs);
+ if (strlen($sImageUrl) > 0) {
+ $aImageBlock = [
+ "type" => "Image",
+ "style" => "person",
+ "url" => $sImageUrl,
+ "size" => "small"
+ ];
+ }
+
+ // Prepare title
+ $aTitleBlock = null;
+ $sTitle = MetaModel::ApplyParams($this->Get('title'), $aContextArgs);
+ if (strlen($sTitle) > 0) {
+ // For summary
+ $aData['summary'] = $sTitle;
+ $aTitleBlock = [
+ "type" => "TextBlock",
+ "size" => "Medium",
+ "weight" => "Bolder",
+ "text" => $sTitle
+ ];
+ }
+
+ // Prepare message
+ $aMessageBlock = null;
+ $sMessage = MetaModel::ApplyParams($this->Get('message'), $aContextArgs);
+ if (strlen($sMessage) > 0) {
+ $aMessageBlock = [
+ "type" => "TextBlock",
+ "text" => static::TransformHTMLToMSTeamsMarkup($sMessage),
+ "wrap" => true
+ ];
+ }
+
+ // Prepare extra attributes
+ $aFactsBlock = null;
+ $aFacts = $this->PrepareExtraAttributesForMSTeamsAPI($aContextArgs, 'adaptive_card');
+ if(!empty($aFacts))
+ {
+ $aFactsBlock = [
+ "type" => "FactSet",
+ "facts" => $aFacts
+ ];
+ }
+
+ // Prepare items
+ $aItems = [];
+
+ // Add Header to items
+ if($aImageBlock)
+ {
+ $aItems[] = [
+ "type" => "ColumnSet",
+ "columns" => [
+ [
+ "type" => "Column",
+ "items" => [
+ $aImageBlock
+ ]
+ ],
+ [
+ "type" => "Column",
+ "items" => [
+ $aTitleBlock
+ ]
+ ]
+ ]
+ ];
+ }
+ else
+ {
+ $aItems[] = $aTitleBlock;
+ }
+
+ // Add Message to items
+ if($aMessageBlock)
+ {
+ $aItems[] = $aMessageBlock;
+ }
+ // Add Facts to items
+ if($aFactsBlock)
+ {
+ $aItems[] = $aFactsBlock;
+ }
+
+ // Prepare action buttons
+ $aActions = $this->PrepareActionsForMSTeamsAPI($aContextArgs, 'adaptive_card');
+
+ // Add attachments to data
+ $aData['attachments'] = [
+ [
+ 'contentType' => 'application/vnd.microsoft.card.adaptive',
+ 'content' => [
+ 'type' => 'AdaptiveCard',
+ '$schema'=> 'https://adaptivecards.io/schemas/adaptive-card.json',
+ 'version' => '1.6',
+ 'body' => [
+ [
+ 'type' => 'Container',
+ 'items' => $aItems,
+ 'style' => $sContainerStyle ?? 'default'
+ ]
+ ],
+ 'actions' => $aActions
+ ]
+ ]
+ ];
+
return json_encode($aData);
}
]]>
@@ -2377,13 +2557,14 @@ protected function ApplyParamsToJson(array $aContextArgs, string $sInputAsJson)
protected
Overload-DBObject
- object()'];
@@ -2401,13 +2582,20 @@ protected function ApplyParamsToJson(array $aContextArgs, string $sInputAsJson)
// Prepare facts structure
$aFacts = array();
+ // Check format in oder to build the appropriate structure
+ $sLabelKey = match ($sJsonFormat) {
+ 'message_card' => 'name',
+ 'adaptive_card' => 'title',
+ default => throw new Exception('Extra Attributes only supported for format "message_card" or "adaptive_card"'),
+ };
+
foreach($aListItems as $sAttCode)
{
$oAttDef = MetaModel::GetAttributeDef($sObjClass, $sAttCode);
// We have to decode HTML entities as they are added on the value by \AttributeDefinition::GetAsHtml()
$sValueAsHtml = utils::HtmlEntityDecode($oObject->GetAsHtml($sAttCode));
$aFacts[] = array(
- 'name' => $oAttDef->GetLabel(),
+ $sLabelKey => $oAttDef->GetLabel(),
'value' => static::TransformHTMLToMSTeamsMarkup($sValueAsHtml),
);
}
@@ -2425,10 +2613,11 @@ protected function ApplyParamsToJson(array $aContextArgs, string $sInputAsJson)
* Return an array of actions formatted for Microsoft Teams "potential actions" system
*
* @param array $aContextArgs
+ * @param string $sJsonFormat
*
* @return array
*/]]>
- Get('include_modify_button') === 'yes')
{
- $aActionElements[] = array(
- '@type' => 'OpenUri',
- 'name' => Dict::S('UI:Menu:Modify'),
- 'targets' => array(
- array(
- 'os' => 'default',
- 'uri' => sprintf('%spages/UI.php?operation=modify&class=%s&id=%d', $sBaseURL, $sObjClass, $iObjID),
- ),
- ),
+ $aActionElements[] = $this->PrepareActionElementForMSTeamsAPI(
+ Dict::S('UI:Menu:Modify'),
+ sprintf('%spages/UI.php?operation=modify&class=%s&id=%d', $sBaseURL, $sObjClass, $iObjID),
+ $sJsonFormat
);
}
@@ -2475,15 +2659,10 @@ protected function ApplyParamsToJson(array $aContextArgs, string $sInputAsJson)
{
if (isset($aTransitions[$sStimulusCode]) && is_a($aStimuli[$sStimulusCode], StimulusUserAction::class))
{
- $aActionElements[] = array(
- '@type' => 'OpenUri',
- 'name' => $aStimuli[$sStimulusCode]->GetLabel(),
- 'targets' => array(
- array(
- 'os' => 'default',
- 'uri' => sprintf('%spages/UI.php?operation=stimulus&stimulus=%s&class=%s&id=%d', $sBaseURL, $sStimulusCode, $sObjClass, $iObjID),
- ),
- ),
+ $aActionElements[] = $this->PrepareActionElementForMSTeamsAPI(
+ $aStimuli[$sStimulusCode]->GetLabel(),
+ sprintf('%spages/UI.php?operation=stimulus&stimulus=%s&class=%s&id=%d', $sBaseURL, $sStimulusCode, $sObjClass, $iObjID),
+ $sJsonFormat
);
}
}
@@ -2492,20 +2671,53 @@ protected function ApplyParamsToJson(array $aContextArgs, string $sInputAsJson)
// Delete button
if($this->Get('include_delete_button') === 'yes')
{
- $aActionElements[] = array(
- '@type' => 'OpenUri',
- 'name' => Dict::S('UI:Menu:Delete'),
- 'targets' => array(
- array(
- 'os' => 'default',
- 'uri' => sprintf('%spages/UI.php?operation=delete&class=%s&id=%d', $sBaseURL, $sObjClass, $iObjID),
- ),
- ),
+ $aActionElements[] = $this->PrepareActionElementForMSTeamsAPI(
+ Dict::S('UI:Menu:Delete'),
+ sprintf('%spages/UI.php?operation=delete&class=%s&id=%d', $sBaseURL, $sObjClass, $iObjID),
+ $sJsonFormat
);
}
return $aActionElements;
}
+]]>
+
+
+
+ false
+ protected
+ Custom
+
+ [
+ '@type' => 'OpenUri',
+ 'name' => $sLabel,
+ 'targets' => [
+ [
+ 'os' => 'default',
+ 'uri' => $sUrl,
+ ],
+ ],
+ ],
+ 'adaptive_card' => [
+ "type" => "Action.OpenUrl",
+ "title" => $sLabel,
+ "url" => $sUrl
+ ],
+ default => throw new Exception('Action Elements only supported for format "message_card" or "adaptive_card"'),
+ };
+ }
]]>
@@ -2604,6 +2816,9 @@ protected function ApplyParamsToJson(array $aContextArgs, string $sInputAsJson)
-
20
+ -
+ 30
+
diff --git a/dictionnaries/de.dict.combodo-webhook-integration.php b/dictionnaries/de.dict.combodo-webhook-integration.php
index 93dce11..58ec7a7 100755
--- a/dictionnaries/de.dict.combodo-webhook-integration.php
+++ b/dictionnaries/de.dict.combodo-webhook-integration.php
@@ -4,7 +4,7 @@
*
* @copyright Copyright (C) 2010-2024 Combodo SAS
* @license https://opensource.org/licenses/AGPL-3.0
- *
+ *
*/
/**
*
@@ -56,6 +56,10 @@
'Class:ActionMicrosoftTeamsNotification/Attribute:include_other_actions_button/Value:no' => 'Nein',
'Class:ActionMicrosoftTeamsNotification/Attribute:include_other_actions_button/Value:specify' => 'Spezifisch',
'Class:ActionMicrosoftTeamsNotification/Attribute:include_other_actions_button/Value:yes' => 'Ja',
+ 'Class:ActionMicrosoftTeamsNotification/Attribute:json_format' => 'JSON-Format',
+ 'Class:ActionMicrosoftTeamsNotification/Attribute:json_format+' => 'Festlegung welches Format zur Übertragung verwendet werden soll.',
+ 'Class:ActionMicrosoftTeamsNotification/Attribute:json_format/Value:message_card' => 'Message Card',
+ 'Class:ActionMicrosoftTeamsNotification/Attribute:json_format/Value:adaptive_card' => 'Adaptive Card',
'Class:ActionMicrosoftTeamsNotification/Attribute:message' => 'Nachricht',
'Class:ActionMicrosoftTeamsNotification/Attribute:prepare_payload_callback+' => 'PHP-Methode zur Vorbereitung des Payloads, der während des Webhook-Aufrufs gesendet werden sollen. Wählen Sie diese Option, wenn die Standardoptionen nicht flexibel genug sind oder wenn Ihre Nutzlaststruktur dynamisch aufgebaut werden muss.
diff --git a/dictionnaries/en.dict.combodo-webhook-integration.php b/dictionnaries/en.dict.combodo-webhook-integration.php
index a7a79d2..55e2038 100644
--- a/dictionnaries/en.dict.combodo-webhook-integration.php
+++ b/dictionnaries/en.dict.combodo-webhook-integration.php
@@ -260,6 +260,10 @@
IMPORTANT: If set, the \'title\', \'message\' and all \'additional elements\' will be ignored.',
// - Fieldsets
'ActionMicrosoftTeamsNotification:message' => 'Basis message',
+ 'Class:ActionMicrosoftTeamsNotification/Attribute:json_format' => 'JSON format',
+ 'Class:ActionMicrosoftTeamsNotification/Attribute:json_format+' => 'Determines which format should be used for transmission.',
+ 'Class:ActionMicrosoftTeamsNotification/Attribute:json_format/Value:message_card' => 'Message Card',
+ 'Class:ActionMicrosoftTeamsNotification/Attribute:json_format/Value:adaptive_card' => 'Adaptive Card',
'ActionMicrosoftTeamsNotification:additionalelements' => 'Additional elements to include',
'ActionMicrosoftTeamsNotification:theme' => 'Theme',
));