Skip to content

Commit adad440

Browse files
authored
[Shared] Add password Input.Text support (microsoft#6377)
* [Shared] Add `password` `Input.Text` support Fixes microsoft#6340 * PR feedback
1 parent 13b5b48 commit adad440

File tree

7 files changed

+103
-10
lines changed

7 files changed

+103
-10
lines changed

source/android/adaptivecards/src/main/cpp/objectmodel_wrap.cpp

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

source/android/adaptivecards/src/main/java/io/adaptivecards/objectmodel/TextInputStyle.java

Lines changed: 2 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

source/shared/cpp/AdaptiveCardsSharedModel/AdaptiveCardsSharedModelUnitTest/EnumTest.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ namespace AdaptiveCardsSharedModelUnitTest
5454
ENUM_TEST_WITH_REVERSE_MAP(ImageStyle, ImageStyle::Person, "person"s, );
5555
ENUM_TEST(SeparatorThickness, SeparatorThickness::Thick, "thick"s);
5656
ENUM_TEST(Spacing, Spacing::None, "none"s);
57-
ENUM_TEST(TextInputStyle, TextInputStyle::Tel, "Tel"s);
57+
ENUM_TEST(TextInputStyle, TextInputStyle::Password, "Password"s);
5858
ENUM_TEST_WITH_REVERSE_MAP(TextSize, TextSize::Large, "Large"s, {{"Normal", TextSize::Default}});
5959
ENUM_TEST_WITH_REVERSE_MAP(TextWeight, TextWeight::Bolder, "Bolder"s, {{"Normal", TextWeight::Default}});
6060
ENUM_TEST(VerticalContentAlignment, VerticalContentAlignment::Center, "Center"s);

source/shared/cpp/AdaptiveCardsSharedModel/AdaptiveCardsSharedModelUnitTest/ObjectModelTest.cpp

Lines changed: 78 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -485,7 +485,7 @@ namespace AdaptiveCardsSharedModelUnitTest
485485

486486
Assert::IsTrue(parseResult->GetWarnings().size() == 0);
487487
Assert::IsTrue(body.size() == 1);
488-
Assert::IsTrue(body.at(0)->GetElementType() == CardElementType::ChoiceSetInput);
488+
Assert::IsTrue(body.at(0)->GetElementType() == CardElementType::ChoiceSetInput);
489489
auto choiceSetElement = std::dynamic_pointer_cast<ChoiceSetInput>(body.at(0));
490490
Assert::IsTrue(choiceSetElement->GetChoices().size() == 0);
491491

@@ -660,8 +660,84 @@ namespace AdaptiveCardsSharedModelUnitTest
660660
auto i = 0;
661661
for (const auto& elem : body) {
662662
std::shared_ptr<TextBlock> textBlock = std::dynamic_pointer_cast<TextBlock>(elem);
663-
Assert::IsTrue(textBlock->GetStyle() == expectedStyles[i++]);
663+
Assert::IsTrue(textBlock->GetStyle() == expectedStyles[i++]);
664664
}
665665
}
666+
667+
TEST_METHOD(PasswordStyleParseTest)
668+
{
669+
const std::string testjson{ R"(
670+
{
671+
"$schema": "http://adaptivecards.io/schemas/adaptive-card.json",
672+
"type": "AdaptiveCard",
673+
"version": "1.5",
674+
"body": [
675+
{
676+
"type": "Input.Text",
677+
"id": "plain",
678+
"label" : "Plaintext"
679+
},
680+
{
681+
"type": "Input.Text",
682+
"id": "password",
683+
"style": "passWORD",
684+
"label" : "Password"
685+
}
686+
]
687+
}
688+
)"};
689+
690+
auto parseResult = AdaptiveCard::DeserializeFromString(testjson, "1.5");
691+
auto card = parseResult->GetAdaptiveCard();
692+
auto body = card->GetBody();
693+
Assert::AreEqual(body.size(), 2ui64);
694+
695+
auto plainInput = std::dynamic_pointer_cast<TextInput>(body.at(0));
696+
Assert::IsTrue(TextInputStyle::Text == plainInput->GetTextInputStyle());
697+
698+
auto passwordInput = std::dynamic_pointer_cast<TextInput>(body.at(1));
699+
Assert::IsTrue(TextInputStyle::Password == passwordInput->GetTextInputStyle());
700+
}
701+
702+
TEST_METHOD(PasswordWithMultilineParseTest)
703+
{
704+
const std::string testjson{ R"(
705+
{
706+
"$schema": "http://adaptivecards.io/schemas/adaptive-card.json",
707+
"type": "AdaptiveCard",
708+
"version": "1.5",
709+
"body": [
710+
{
711+
"type": "Input.Text",
712+
"id": "theId",
713+
"label" : "Password",
714+
"style": "password",
715+
"isMultiline": true
716+
}
717+
]
718+
}
719+
)"};
720+
721+
const auto parseResult = AdaptiveCard::DeserializeFromString(testjson, "1.5");
722+
723+
// verify we emitted a warning and it's correct
724+
const auto warnings = parseResult->GetWarnings();
725+
Assert::IsTrue(warnings.size() == 1ui64);
726+
const auto warning = warnings.at(0);
727+
Assert::IsTrue(WarningStatusCode::InvalidValue == warning->GetStatusCode());
728+
Assert::AreEqual("Input.Text ignores isMultiline when using password style"s, warning->GetReason());
729+
730+
// verify the generated element still reports itself as supporting multiline
731+
const auto card = parseResult->GetAdaptiveCard();
732+
const auto body = card->GetBody();
733+
Assert::AreEqual(body.size(), 1ui64);
734+
const auto theInput = std::dynamic_pointer_cast<TextInput>(body.at(0));
735+
Assert::IsTrue(TextInputStyle::Password == theInput->GetTextInputStyle());
736+
Assert::IsTrue(theInput->GetIsMultiline());
737+
738+
// verify that we still serialize isMultiline == true
739+
const auto serializedCard = card->SerializeToJsonValue();
740+
Assert::IsTrue(serializedCard["body"][0]["isMultiline"].asBool());
741+
}
666742
};
667743
}

source/shared/cpp/ObjectModel/Enums.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -345,7 +345,8 @@ namespace AdaptiveCards
345345
{TextInputStyle::Email, "Email"},
346346
{TextInputStyle::Tel, "Tel"},
347347
{TextInputStyle::Text, "Text"},
348-
{TextInputStyle::Url, "Url"}});
348+
{TextInputStyle::Url, "Url"},
349+
{TextInputStyle::Password, "Password"}});
349350

350351
DEFINE_ADAPTIVECARD_ENUM(ContainerStyle, {
351352
{ContainerStyle::Default, "Default"},

source/shared/cpp/ObjectModel/Enums.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -333,6 +333,7 @@ namespace AdaptiveCards
333333
Tel,
334334
Url,
335335
Email,
336+
Password,
336337
};
337338
DECLARE_ADAPTIVECARD_ENUM(TextInputStyle);
338339

source/shared/cpp/ObjectModel/TextInput.cpp

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -133,10 +133,24 @@ std::shared_ptr<BaseCardElement> TextInputParser::Deserialize(ParseContext& cont
133133
std::shared_ptr<TextInput> textInput = BaseInputElement::Deserialize<TextInput>(context, json);
134134
textInput->SetPlaceholder(ParseUtil::GetString(json, AdaptiveCardSchemaKey::Placeholder));
135135
textInput->SetValue(ParseUtil::GetString(json, AdaptiveCardSchemaKey::Value));
136-
textInput->SetIsMultiline(ParseUtil::GetBool(json, AdaptiveCardSchemaKey::IsMultiline, false));
137136
textInput->SetMaxLength(ParseUtil::GetUInt(json, AdaptiveCardSchemaKey::MaxLength, 0));
138-
textInput->SetTextInputStyle(
139-
ParseUtil::GetEnumValue<TextInputStyle>(json, AdaptiveCardSchemaKey::Style, TextInputStyle::Text, TextInputStyleFromString));
137+
138+
const auto isMultiline = ParseUtil::GetBool(json, AdaptiveCardSchemaKey::IsMultiline, false);
139+
textInput->SetIsMultiline(isMultiline);
140+
141+
const auto textInputStyle =
142+
ParseUtil::GetEnumValue<TextInputStyle>(json, AdaptiveCardSchemaKey::Style, TextInputStyle::Text, TextInputStyleFromString);
143+
textInput->SetTextInputStyle(textInputStyle);
144+
145+
// emit warning in the case where style is `password` but multiline is specified (this is an invalid combination.
146+
// renderers should ignore multiline in this case)
147+
if (isMultiline && textInputStyle == TextInputStyle::Password)
148+
{
149+
context.warnings.emplace_back(
150+
std::make_shared<AdaptiveCardParseWarning>(WarningStatusCode::InvalidValue,
151+
"Input.Text ignores isMultiline when using password style"));
152+
}
153+
140154
textInput->SetInlineAction(ParseUtil::GetAction(context, json, AdaptiveCardSchemaKey::InlineAction, false));
141155
textInput->SetRegex(ParseUtil::GetString(json, AdaptiveCardSchemaKey::Regex));
142156

0 commit comments

Comments
 (0)