コード例 #1
0
        public IAdaptiveCardElement FromJson(JsonObject inputJson, AdaptiveElementParserRegistration elementParsers, AdaptiveActionParserRegistration actionParsers, IList <IAdaptiveWarning> warnings)
        {
            AdaptiveActionSet answer = new AdaptiveActionSet();

            var actionsArray = inputJson.GetNamedArray("actions");

            foreach (JsonObject a in actionsArray.Select(i => i.GetObject()))
            {
                string title = a.GetNamedString("title");
                answer.Actions.Add(new AdaptiveSubmitAction()
                {
                    Title = title
                });

                // AC bug: Default action parsers aren't present: https://github.com/Microsoft/AdaptiveCards/issues/2196
                //string type = a.GetNamedString("type");
                //var actionParser = actionParsers.Get("Action.OpenUrl");
                //if (actionParser != null)
                //{
                //    var action = actionParser.FromJson(a, elementParsers, actionParsers, warnings);
                //    if (action != null)
                //    {
                //        answer.Actions.Add(action);
                //    }
                //}
            }

            return(answer);
        }
コード例 #2
0
        public static AdaptiveCard Parse(string json)
        {
            AdaptiveElementParserRegistration elementRegistration = new AdaptiveElementParserRegistration();

            elementRegistration.Set("ActionSet", new ActionSetParser());

            return(AdaptiveCard.FromJsonString(json, elementRegistration, null).AdaptiveCard);
        }
コード例 #3
0
            public IAdaptiveActionElement FromJson(JsonObject inputJson, AdaptiveElementParserRegistration elementParsers, AdaptiveActionParserRegistration actionParsers, IList <AdaptiveWarning> warnings)
            {
                JsonObject jsonSubmitAction   = inputJson.GetNamedObject("internalSubmitAction");
                var        submitActionParser = actionParsers.Get("Action.Submit");

                IAdaptiveActionElement submitAction = submitActionParser.FromJson(jsonSubmitAction, elementParsers, actionParsers, warnings);

                return(new TestCustomAction(submitAction) as IAdaptiveActionElement);
            }
コード例 #4
0
            public IAdaptiveCardElement FromJson(JsonObject inputJson, AdaptiveElementParserRegistration elementParsers, AdaptiveActionParserRegistration actionParsers, IList <AdaptiveWarning> warnings)
            {
                JsonObject jsonTextBlock   = inputJson.GetNamedObject("internalTextBlock");
                var        textBlockParser = elementParsers.Get("TextBlock");

                IAdaptiveCardElement textBlockElement = textBlockParser.FromJson(jsonTextBlock, elementParsers, actionParsers, warnings);

                return(new TestCustomElement(textBlockElement) as IAdaptiveCardElement);
            }
コード例 #5
0
        public void ActionParserRegistraton_CustomActionTest()
        {
            AdaptiveActionParserRegistration  actionParserRegistration  = new AdaptiveActionParserRegistration();
            AdaptiveElementParserRegistration elementParserRegistration = new AdaptiveElementParserRegistration();
            List <AdaptiveWarning>            warnings = new List <AdaptiveWarning>();

            actionParserRegistration.Set("TestCustomAction", new TestActionParser());
            IAdaptiveActionParser testActionParserRetrieved = actionParserRegistration.Get("TestCustomAction");

            Assert.IsNotNull(testActionParserRetrieved);
            Assert.IsNotNull(testActionParserRetrieved as TestActionParser);

            String testCard =
                "{" +
                "   \"type\":\"AdaptiveCard\"," +
                "   \"version\":\"1.0\"," +
                "   \"body\":" +
                "   [" +
                "   ]," +
                "   \"actions\":" +
                "   [" +
                "       {" +
                "           \"type\":\"TestCustomAction\"," +
                "           \"internalSubmitAction\":" +
                "           {" +
                "               \"type\": \"Action.Submit\"" +
                "           }" +
                "       }" +
                "   ]" +
                "}";

            AdaptiveCard card = AdaptiveCard.FromJsonString(testCard, elementParserRegistration, actionParserRegistration).AdaptiveCard;

            Assert.IsNotNull(card);

            Assert.AreEqual(1, card.Actions.Count);

            IAdaptiveActionElement action = card.Actions[0];

            Assert.IsNotNull(action);

            Assert.AreEqual(ActionType.Custom, action.ActionType);
            Assert.AreEqual("TestCustomAction", action.ActionTypeString);

            TestCustomAction customElement = card.Actions[0] as TestCustomAction;

            Assert.IsNotNull(customElement);

            Assert.AreEqual(ActionType.Submit, customElement.InternalSubmitAction.ActionType);
        }
コード例 #6
0
        public void ElementParserRegistraton_DefaultElementsTest()
        {
            AdaptiveActionParserRegistration  actionParserRegistration  = new AdaptiveActionParserRegistration();
            AdaptiveElementParserRegistration elementParserRegistration = new AdaptiveElementParserRegistration();
            List <AdaptiveWarning>            warnings = new List <AdaptiveWarning>();

            JsonObject jsonObject;

            Assert.IsTrue(JsonObject.TryParse("{\"type\":\"ActionSet\",\"id\":\"ActionSetId\"}", out jsonObject));
            Assert.AreEqual(ElementType.ActionSet, elementParserRegistration.Get("ActionSet").FromJson(jsonObject, elementParserRegistration, actionParserRegistration, warnings).ElementType);

            Assert.IsTrue(JsonObject.TryParse("{\"type\":\"Input.ChoiceSet\",\"id\":\"ChoiceSetId\", \"choices\":[{\"type\":\"Input.Choice\",\"title\":\"title\",\"value\":\"value\"}]}", out jsonObject));
            Assert.AreEqual(ElementType.ChoiceSetInput, elementParserRegistration.Get("Input.ChoiceSet").FromJson(jsonObject, elementParserRegistration, actionParserRegistration, warnings).ElementType);

            Assert.IsTrue(JsonObject.TryParse("{\"type\":\"ColumnSet\"}", out jsonObject));
            Assert.AreEqual(ElementType.ColumnSet, elementParserRegistration.Get("ColumnSet").FromJson(jsonObject, elementParserRegistration, actionParserRegistration, warnings).ElementType);

            Assert.IsTrue(JsonObject.TryParse("{\"type\":\"Container\", \"items\":[]}", out jsonObject));
            Assert.AreEqual(ElementType.Container, elementParserRegistration.Get("Container").FromJson(jsonObject, elementParserRegistration, actionParserRegistration, warnings).ElementType);

            Assert.IsTrue(JsonObject.TryParse("{\"type\":\"Input.Date\", \"id\":\"DateId\"}", out jsonObject));
            Assert.AreEqual(ElementType.DateInput, elementParserRegistration.Get("Input.Date").FromJson(jsonObject, elementParserRegistration, actionParserRegistration, warnings).ElementType);

            Assert.IsTrue(JsonObject.TryParse("{\"type\":\"FactSet\", \"facts\":[{\"title\":\"title\",\"value\":\"value\"}]}", out jsonObject));
            Assert.AreEqual(ElementType.FactSet, elementParserRegistration.Get("FactSet").FromJson(jsonObject, elementParserRegistration, actionParserRegistration, warnings).ElementType);

            Assert.IsTrue(JsonObject.TryParse("{\"type\":\"Image\", \"url\":\"www.foo.com\"}", out jsonObject));
            Assert.AreEqual(ElementType.Image, elementParserRegistration.Get("Image").FromJson(jsonObject, elementParserRegistration, actionParserRegistration, warnings).ElementType);

            Assert.IsTrue(JsonObject.TryParse("{\"type\":\"ImageSet\", \"images\":[{\"type\":\"Image\", \"url\":\"www.foo.com\"}]}", out jsonObject));
            Assert.AreEqual(ElementType.ImageSet, elementParserRegistration.Get("ImageSet").FromJson(jsonObject, elementParserRegistration, actionParserRegistration, warnings).ElementType);

            Assert.IsTrue(JsonObject.TryParse("{\"type\":\"Media\", \"sources\":[{\"mimeType\":\"foo\",\"url\":\"www.foo.com\"}]}", out jsonObject));
            Assert.AreEqual(ElementType.Media, elementParserRegistration.Get("Media").FromJson(jsonObject, elementParserRegistration, actionParserRegistration, warnings).ElementType);

            Assert.IsTrue(JsonObject.TryParse("{\"type\":\"Input.Number\", \"id\":\"NumberId\"}", out jsonObject));
            Assert.AreEqual(ElementType.NumberInput, elementParserRegistration.Get("Input.Number").FromJson(jsonObject, elementParserRegistration, actionParserRegistration, warnings).ElementType);

            Assert.IsTrue(JsonObject.TryParse("{\"type\":\"TextBlock\",\"text\":\"Hello World\"}", out jsonObject));
            Assert.AreEqual(ElementType.TextBlock, elementParserRegistration.Get("TextBlock").FromJson(jsonObject, elementParserRegistration, actionParserRegistration, warnings).ElementType);

            Assert.IsTrue(JsonObject.TryParse("{\"type\":\"Input.Text\", \"id\":\"TextId\"}", out jsonObject));
            Assert.AreEqual(ElementType.TextInput, elementParserRegistration.Get("Input.Text").FromJson(jsonObject, elementParserRegistration, actionParserRegistration, warnings).ElementType);

            Assert.IsTrue(JsonObject.TryParse("{\"type\":\"Input.Time\", \"id\":\"TimeId\"}", out jsonObject));
            Assert.AreEqual(ElementType.TimeInput, elementParserRegistration.Get("Input.Time").FromJson(jsonObject, elementParserRegistration, actionParserRegistration, warnings).ElementType);

            Assert.IsTrue(JsonObject.TryParse("{\"type\":\"Input.Toggle\", \"id\":\"ToggleId\", \"title\":\"title\"}", out jsonObject));
            Assert.AreEqual(ElementType.ToggleInput, elementParserRegistration.Get("Input.Toggle").FromJson(jsonObject, elementParserRegistration, actionParserRegistration, warnings).ElementType);
        }
コード例 #7
0
        public void ElementParserRegistraton_CustomElementTest()
        {
            AdaptiveActionParserRegistration  actionParserRegistration  = new AdaptiveActionParserRegistration();
            AdaptiveElementParserRegistration elementParserRegistration = new AdaptiveElementParserRegistration();
            List <AdaptiveWarning>            warnings = new List <AdaptiveWarning>();

            elementParserRegistration.Set("TestCustomElement", new TestElementParser());
            IAdaptiveElementParser testElementParserRetrieved = elementParserRegistration.Get("TestCustomElement");

            Assert.IsNotNull(testElementParserRetrieved);
            Assert.IsNotNull(testElementParserRetrieved as TestElementParser);

            String testCard =
                "{" +
                "   \"type\":\"AdaptiveCard\"," +
                "   \"version\":\"1.0\"," +
                "   \"body\":" +
                "   [" +
                "       {" +
                "           \"type\":\"TestCustomElement\"," +
                "           \"internalTextBlock\":" +
                "           {" +
                "               \"type\":\"TextBlock\"," +
                "               \"text\":\"Here is some text\"" +
                "           }" +
                "       }" +
                "   ]" +
                "}";

            AdaptiveCard card = AdaptiveCard.FromJsonString(testCard, elementParserRegistration, actionParserRegistration).AdaptiveCard;

            Assert.IsNotNull(card);

            Assert.AreEqual(1, card.Body.Count);

            IAdaptiveCardElement cardElement = card.Body[0];

            Assert.IsNotNull(cardElement);

            Assert.AreEqual(ElementType.Custom, cardElement.ElementType);
            Assert.AreEqual("TestCustomElement", cardElement.ElementTypeString);

            TestCustomElement customElement = card.Body[0] as TestCustomElement;

            Assert.IsNotNull(customElement);

            Assert.AreEqual(ElementType.TextBlock, customElement.InternalTextBlock.ElementType);
        }
コード例 #8
0
        public void ActionParserRegistraton_DefaultActionsTest()
        {
            AdaptiveActionParserRegistration  actionParserRegistration  = new AdaptiveActionParserRegistration();
            AdaptiveElementParserRegistration elementParserRegistration = new AdaptiveElementParserRegistration();
            List <AdaptiveWarning>            warnings = new List <AdaptiveWarning>();

            JsonObject jsonObject;

            Assert.IsTrue(JsonObject.TryParse("{\"type\":\"Action.OpenUrl\", \"url\":\"http:\\\\www.foo.com\"}", out jsonObject));
            Assert.AreEqual(ActionType.OpenUrl, actionParserRegistration.Get("Action.OpenUrl").FromJson(jsonObject, elementParserRegistration, actionParserRegistration, warnings).ActionType);

            Assert.IsTrue(JsonObject.TryParse("{\"type\":\"Action.ShowCard\", \"card\":{\"type\":\"AdaptiveCard\", \"version\":\"1.0\"}}", out jsonObject));
            Assert.AreEqual(ActionType.ShowCard, actionParserRegistration.Get("Action.ShowCard").FromJson(jsonObject, elementParserRegistration, actionParserRegistration, warnings).ActionType);

            Assert.IsTrue(JsonObject.TryParse("{\"type\":\"Action.Submit\"}", out jsonObject));
            Assert.AreEqual(ActionType.Submit, actionParserRegistration.Get("Action.Submit").FromJson(jsonObject, elementParserRegistration, actionParserRegistration, warnings).ActionType);

            Assert.IsTrue(JsonObject.TryParse("{\"type\":\"Action.ToggleVisibility\",\"targetElements\": [{\"elementId\":\"idToggle\"}]}", out jsonObject));
            Assert.AreEqual(ActionType.ToggleVisibility, actionParserRegistration.Get("Action.ToggleVisibility").FromJson(jsonObject, elementParserRegistration, actionParserRegistration, warnings).ActionType);
        }
コード例 #9
0
 public IAdaptiveActionElement FromJson(JsonObject inputJson, AdaptiveElementParserRegistration elementParsers, AdaptiveActionParserRegistration actionParsers, IList <AdaptiveWarning> warnings)
 {
     return(new TestCustomAction() as IAdaptiveActionElement);
 }
コード例 #10
0
        internal static JsonParseToastResult ParseToast(string json, FeatureSet currFeatureSet)
        {
            JsonToastContent toastContent = null;

            JsonParseToastResult result = new JsonParseToastResult();

            int payloadSize = System.Text.Encoding.UTF8.GetByteCount(json);

            if (payloadSize > PAYLOAD_SIZE_LIMIT)
            {
                result.Errors.Add(new ParseError(ParseErrorType.ErrorButRenderAllowed, $"Your payload exceeds the 5 KB size limit (it is {payloadSize.ToString("N0")} Bytes). Please reduce your payload, or else Windows will not display it."));
            }

            var settings = new JsonSerializerSettings()
            {
                MissingMemberHandling = MissingMemberHandling.Error,
                Error = new EventHandler <ErrorEventArgs>((sender, args) =>
                {
                    HandleError(result.Errors, args);
                }),
                ContractResolver = new DefaultContractResolver()
                {
                    NamingStrategy = new JsonToastNamingStrategy()
                }
            };

            try
            {
                toastContent = JsonConvert.DeserializeObject <JsonToastContent>(json, settings);

                if (toastContent.Type != "AdaptiveCard")
                {
                    result.Errors.Add(new ParseError(ParseErrorType.ErrorButRenderAllowed, "\"type\": \"AdaptiveCard\" must be specified in your payload."));
                }
                if (toastContent.Version == null)
                {
                    result.Errors.Add(new ParseError(ParseErrorType.ErrorButRenderAllowed, "\"version\" property must be specified in your payload."));
                }

                var actionReg = new AdaptiveActionParserRegistration();
                // Can't override the Submit parser so can't know whether dev actually sent -ms-systemActivationType="dismiss" or if we translated it
                actionReg.Set("MsAction.Dismiss", new DismissActionParser(result.Errors));
                actionReg.Set("MsAction.Snooze", new SnoozeActionParser(result.Errors));


                AdaptiveElementParserRegistration elementRegistration = new AdaptiveElementParserRegistration();
                elementRegistration.Set("ActionSet", new ActionSetParser());

                var cardParseResult = AdaptiveCard.FromJsonString(json, elementRegistration, actionReg);
                toastContent.Card = cardParseResult.AdaptiveCard;

                foreach (var error in cardParseResult.Errors)
                {
                    result.Errors.Add(new ParseError(ParseErrorType.ErrorButRenderAllowed, error.Message));
                }
                foreach (var warning in cardParseResult.Warnings)
                {
                    result.Errors.Add(new ParseError(ParseErrorType.Warning, warning.Message));
                }
            }
            catch (Exception ex)
            {
                // Json parse exceptions are handled by the error handler and already reported
                if (!(ex is JsonReaderException))
                {
                    result.Errors.Add(new ParseError(ParseErrorType.Error, ex.Message));
                }
            }

            result.Content = toastContent;

            return(result);
        }
コード例 #11
0
 protected abstract IAdaptiveActionElement ParseFromJson(JsonObject inputJson, AdaptiveElementParserRegistration elementParsers, AdaptiveActionParserRegistration actionParsers);
コード例 #12
0
            public IAdaptiveActionElement FromJson(JsonObject inputJson, AdaptiveElementParserRegistration elementParsers, AdaptiveActionParserRegistration actionParsers, IList <IAdaptiveWarning> warnings)
            {
                WarnAboutUnknownProperties(inputJson);

                return(ParseFromJson(inputJson, elementParsers, actionParsers));
            }
コード例 #13
0
            protected override IAdaptiveActionElement ParseFromJson(JsonObject inputJson, AdaptiveElementParserRegistration elementParsers, AdaptiveActionParserRegistration actionParsers)
            {
                // If developer didn't provide title, use system provided title
                string title = GetString(inputJson, "title") ?? "Snooze";

                // See if developer provided a snooze input id
                string inputId = GetString(inputJson, "snoozeTimeInputId") ?? "";

                return(new AdaptiveSubmitAction()
                {
                    Title = title,
                    AdditionalProperties = new JsonObject()
                    {
                        { "-ms-systemActivationType", JsonValue.CreateStringValue("snooze") },
                        { "snoozeTimeInputId", JsonValue.CreateStringValue(inputId) }
                    }
                });
            }
コード例 #14
0
            protected override IAdaptiveActionElement ParseFromJson(JsonObject inputJson, AdaptiveElementParserRegistration elementParsers, AdaptiveActionParserRegistration actionParsers)
            {
                // If developer didn't provide title, use system provided title
                string title = GetString(inputJson, "title") ?? "Dismiss";

                return(new AdaptiveSubmitAction()
                {
                    Title = title,
                    AdditionalProperties = new JsonObject()
                    {
                        { "-ms-systemActivationType", JsonValue.CreateStringValue("dismiss") }
                    }
                });
            }