Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Membership/fb - Add Membership functionality (live site users) to the repository #88

Open
wants to merge 69 commits into
base: finished
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 36 commits
Commits
Show all changes
69 commits
Select commit Hold shift + click to select a range
02a8f9a
GH-86 :: Create registration widget directory
kentico-matthews Nov 7, 2024
f3bdd3f
GH-86 :: begin progress implementing registration
kentico-matthews Nov 7, 2024
4a6d75c
GH-86 :: fix spelling in widget properties
kentico-matthews Nov 7, 2024
8f10415
GH-86 :: progress
kentico-matthews Nov 8, 2024
cc13708
GH-86 :: registration widget progress
kentico-matthews Nov 8, 2024
a65c2e7
GH-89 :: add membership service - menat to handle all user manager stuff
dominikag2 Nov 8, 2024
ce2b417
GH-89 :: sign in widget WIP
dominikag2 Nov 12, 2024
ac553aa
GH-86 :: updates to registration server-side form validation
kentico-matthews Nov 12, 2024
b762bf4
Merge branch 'Membership/FB' of https://github.com/Kentico/xperience-…
kentico-matthews Nov 12, 2024
3e80516
GH-86 :: move UserManager code for registration into the MambershipSe…
kentico-matthews Nov 12, 2024
8c849ea
GH-86 :: fix label in registration form
kentico-matthews Nov 12, 2024
092a426
GH-86 :: add title to registration form and fix typo in custom Member…
kentico-matthews Nov 12, 2024
a4f86b6
GH-89 :: sign in widget WIP, relocate Authentication and registration…
dominikag2 Nov 12, 2024
b70af57
GH-86 :: add link/sign out widget, move registration controller, add …
kentico-matthews Nov 12, 2024
dea7c4d
Merge branch 'Membership/FB' of https://github.com/Kentico/xperience-…
kentico-matthews Nov 12, 2024
86c1ef6
GH-89 :: extract sign in logic into the Membership service
dominikag2 Nov 12, 2024
0074b13
GH-86 :: add sign out functionality
kentico-matthews Nov 12, 2024
0519b6d
GH-86 :: add widget configuration validation
kentico-matthews Nov 12, 2024
21869a8
GH-86 :: add registration page, enable non-required strings in form, …
kentico-matthews Nov 12, 2024
b53ef0c
GH-89 :: sign in form signs you in, but errors nor the redirect after…
dominikag2 Nov 13, 2024
53548cb
GH-89 :: fix error rendering for sing-in
dominikag2 Nov 13, 2024
cc962e4
GH-89 :: fix sign in button formatting in Sign in widget; Add LinkOrS…
dominikag2 Nov 13, 2024
cfd2bd6
GH-89 :: UI improvements
dominikag2 Nov 13, 2024
e439654
GH-86 :: adjust form target and controller action name for sign out, …
kentico-matthews Nov 13, 2024
8709d61
GH-89 :: add contact mapping for membership, update custom field name…
kentico-matthews Nov 13, 2024
b173135
GH-89 :: redirecting after successful sign in.
dominikag2 Nov 13, 2024
72bd1b2
GH-89 :: redirect page after sign in - let user pick is in the widget…
dominikag2 Nov 14, 2024
f05d5a3
GH-89 :: set code to remove cookies when the member signs out, so the…
kentico-matthews Nov 14, 2024
bf20129
Merge branch 'Membership/FB' of https://github.com/Kentico/xperience-…
kentico-matthews Nov 14, 2024
512b35b
GH-89 :: Navigate to sign in page from button in the header if not si…
dominikag2 Nov 14, 2024
a2f8a86
GH-89 :: move mapper to services, add service to map members to conta…
kentico-matthews Nov 14, 2024
9bda0cd
Merge branch 'Membership/FB' of https://github.com/Kentico/xperience-…
kentico-matthews Nov 14, 2024
6c1aea9
GH-89 :: Handle login success with JS and return partial view on error
dominikag2 Nov 14, 2024
b005ed9
GH-86 :: add translations and point registration page link to sign in…
kentico-matthews Nov 14, 2024
b2e337a
Merge branch 'Membership/FB' of https://github.com/Kentico/xperience-…
kentico-matthews Nov 14, 2024
1719ca2
GH-89 :: fix the order of middlewares, wrap authentication js in VC
dominikag2 Nov 14, 2024
52d5929
GH-89 :: remove unused parameter and nuget package. make the Sign in …
dominikag2 Nov 15, 2024
e931ee1
GH-86 :: refactoring
kentico-matthews Nov 15, 2024
ff0a48a
Merge branch 'Membership/FB' of https://github.com/Kentico/xperience-…
kentico-matthews Nov 15, 2024
ddf7a96
GH-89 :: Sign up and Sign in - add some styling
dominikag2 Nov 15, 2024
0e3b55a
GH-86 :: tests for log out widget
kentico-matthews Nov 18, 2024
a3d410e
GH-91 :: Implement email confirmation after registration
dominikag2 Nov 19, 2024
2f85e44
GH-90 :: Redirect unauthenticated requests for secured pages to sign …
kentico-matthews Nov 19, 2024
c0d78b1
GH-89 :: sign in redirect - WIP
dominikag2 Nov 19, 2024
297606f
GH-89 :: remove authentication scripts - not needed anymore, we chose…
dominikag2 Nov 19, 2024
a2656f2
GH-90 :: Add functionality to return member to the secured page they …
kentico-matthews Nov 19, 2024
1846652
Merge branch 'Membership/FB' of https://github.com/Kentico/xperience-…
kentico-matthews Nov 19, 2024
339ca06
GH-90 :: add summary for new service method
kentico-matthews Nov 19, 2024
dd42d36
GH-87 :: add membership service documentation
dominikag2 Nov 19, 2024
f3660ab
Merge branch 'Membership/FB' of https://github.com/Kentico/xperience-…
kentico-matthews Nov 19, 2024
d0738fa
GH-86 :: Fix localization in registration action
kentico-matthews Nov 20, 2024
e8fe880
GH-90 :: Add language checks when redirecting 403 to sign in page
kentico-matthews Nov 20, 2024
351603b
GH-89 :: Merge contacts when signing in
kentico-matthews Nov 20, 2024
30f93fb
GH-90 :: Add functionality to hide or prompt login in listing page fo…
kentico-matthews Nov 21, 2024
ee349d6
GH-90 :: adjust widget configuration on widget samples page to includ…
kentico-matthews Nov 21, 2024
e46ea8d
GH-69 :: fix missing page urls for spanish in articles
kentico-matthews Nov 21, 2024
bb55829
GH-69 :: Fix spanish URL paths for CI copied articles
kentico-matthews Nov 21, 2024
8d36270
GH-90 :: Add secured checks to content querying, adjust url retrieval…
kentico-matthews Nov 21, 2024
a4c4e50
GH-90 :: add translations, small refactor on sign in prompt
kentico-matthews Nov 21, 2024
53e3e56
GH-92 :: initial code for reset password functionality,
kentico-matthews Nov 25, 2024
9a71075
GH-92 :: improvements to localization of reset password functionality
kentico-matthews Nov 26, 2024
31d6a0f
GH-93 :: initial progress on profile page
kentico-matthews Nov 26, 2024
1a609ce
no message
dominikag2 Nov 27, 2024
dcfbd38
GH-87 :: implement review suggestions (together with the previous com…
dominikag2 Nov 27, 2024
91f4e23
GH-91 :: implement review suggestions - fix multilingual URLs
dominikag2 Nov 27, 2024
f799c82
GH-93 :: Continue progress on profile page
kentico-matthews Nov 27, 2024
61f2fb7
GH-93 :: register UpdateProfileService with DI
kentico-matthews Nov 27, 2024
1cb5ea9
Merge branch 'Membership/FB' of https://github.com/Kentico/xperience-…
kentico-matthews Nov 27, 2024
b6859ad
GH-93 :: add localization, rearrange pages, small refactors
kentico-matthews Nov 27, 2024
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions src/Directory.Packages.props
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
<PrivateAssets>all</PrivateAssets>
</PackageVersion>
<PackageVersion Include="Enums.NET" Version="4.0.2" />
<PackageVersion Include="Htmx" Version="1.8.0" />
<PackageVersion Include="kentico.xperience.admin" Version="29.6.1" />
<PackageVersion Include="kentico.xperience.azurestorage" Version="29.6.1" />
<PackageVersion Include="kentico.xperience.imageprocessing" Version="29.6.1" />
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
using Microsoft.Extensions.Localization;
using CMS.Websites;
using Moq;
using TrainingGuides.Web.Features.Header;
using TrainingGuides.Web.Features.Shared.Services;
using Xunit;

namespace TrainingGuides.Web.Tests.Features.Membership.Widgets.SignIn;

public class HeaderViewComponentTests
{
private readonly HeaderViewComponent viewComponent;
private readonly Mock<IStringLocalizer<SharedResources>> stringLocalizerMock;
private readonly Mock<IContentItemRetrieverService> contentItemRetrieverServiceMock;

private const string TRAINING_GUIDES = "Training guides";
private const string SIGN_IN = "Sign in";
private const string SIGN_OUT = "Sign out";

public HeaderViewComponentTests()
{
stringLocalizerMock = new Mock<IStringLocalizer<SharedResources>>();
stringLocalizerMock.Setup(x => x[TRAINING_GUIDES]).Returns(new LocalizedString(TRAINING_GUIDES, TRAINING_GUIDES));
stringLocalizerMock.Setup(x => x[SIGN_IN]).Returns(new LocalizedString(SIGN_IN, SIGN_IN));
stringLocalizerMock.Setup(x => x[SIGN_OUT]).Returns(new LocalizedString(SIGN_OUT, SIGN_OUT));

contentItemRetrieverServiceMock = new Mock<IContentItemRetrieverService>();

viewComponent = new HeaderViewComponent(stringLocalizerMock.Object, contentItemRetrieverServiceMock.Object);
}

[Fact]
public void BuildViewModel_SetsUpWidgetProperties_ToShowSignInSignOutButton()
{
var testGuid = Guid.NewGuid();

var viewModel = viewComponent.BuildViewModel([new WebPageRelatedItem() { WebPageGuid = testGuid }]);
Assert.Equal(SIGN_IN, viewModel.LinkOrSignOutWidgetProperties.UnauthenticatedButtonText);
Assert.Equal(SIGN_OUT, viewModel.LinkOrSignOutWidgetProperties.AuthenticatedButtonText);
Assert.Single(viewModel.LinkOrSignOutWidgetProperties.UnauthenticatedTargetContentPage);
Assert.Equal(testGuid, viewModel.LinkOrSignOutWidgetProperties.UnauthenticatedTargetContentPage.First().WebPageGuid);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,104 @@
using Kentico.Content.Web.Mvc.Routing;
using Moq;
using TrainingGuides.Web.Features.Membership.Services;
using TrainingGuides.Web.Features.Membership.Widgets.SignIn;
using TrainingGuides.Web.Features.Shared.Services;
using Xunit;

namespace TrainingGuides.Web.Tests.Features.Membership.Widgets.SignIn;

public class SignInWidgetViewComponentTests
{
private readonly SignInWidgetViewComponent viewComponent;
private readonly Mock<IHttpRequestService> httpRequestServiceMock;
private readonly Mock<IMembershipService> membershipServiceMock;
private readonly Mock<IPreferredLanguageRetriever> preferredLanguageRetrieverMock;

private const string BASE_URL = "http://localhost:5000";
private const string PAGE_URL = "/page";
private const string ROOT_URL = "/";
private const string SIGN_IN = "Sign In";
private const string SUBMIT = "Submit";
private const string USERNAME = "Username";
private const string PASSWORD = "Password";
private const string STAY_SIGNED_IN = "Stay Signed In";

private readonly SignInWidgetProperties referenceProperties;

public SignInWidgetViewComponentTests()
{
httpRequestServiceMock = new Mock<IHttpRequestService>();
httpRequestServiceMock.Setup(x => x.GetBaseUrl()).Returns(BASE_URL);

membershipServiceMock = new Mock<IMembershipService>();
membershipServiceMock.Setup(x => x.IsMemberAuthenticated()).ReturnsAsync(true);

preferredLanguageRetrieverMock = new Mock<IPreferredLanguageRetriever>();
preferredLanguageRetrieverMock.Setup(x => x.Get()).Returns("en");

viewComponent = new SignInWidgetViewComponent(httpRequestServiceMock.Object, membershipServiceMock.Object, preferredLanguageRetrieverMock.Object);

referenceProperties = new SignInWidgetProperties()
{
FormTitle = SIGN_IN,
SubmitButtonText = SUBMIT,
UserNameLabel = USERNAME,
PasswordLabel = PASSWORD,
StaySignedInLabel = STAY_SIGNED_IN
};
}

[Fact]
public async Task BuildWidgetViewModel_ReturnsWidgetViewModel_WithBaseUrlSet()
{
var viewModel = await viewComponent.BuildWidgetViewModel(referenceProperties);
Assert.NotEmpty(viewModel.BaseUrl);
}

[Fact]
public async Task BuildWidgetViewModel_WhenUserSetsRedirectPage_SetsRedirectUrl_ToPageUrl()
{
httpRequestServiceMock.Setup(x => x.GetPageRelativeUrl(It.IsAny<Guid>(), It.IsAny<string>())).ReturnsAsync($"~{PAGE_URL}");
referenceProperties.RedirectPage = [new() { WebPageGuid = Guid.NewGuid() }];

var viewModel = await viewComponent.BuildWidgetViewModel(referenceProperties);
Assert.Equal(PAGE_URL, viewModel.RedirectUrl);
}

[Fact]
public async Task BuildWidgetViewModel_WhenUserDoesNOTSetRedirectPage_SetsRedirectUrl_ToRoot()
{
var viewModel = await viewComponent.BuildWidgetViewModel(referenceProperties);
Assert.Equal(ROOT_URL, viewModel.RedirectUrl);
}

[Fact]
public async Task BuildWidgetViewModel_WhenUserIsAuthenticated_SetsDisplayForm_ToFalse()
{
membershipServiceMock.Setup(x => x.IsMemberAuthenticated()).ReturnsAsync(true);

var viewModel = await viewComponent.BuildWidgetViewModel(referenceProperties);
Assert.False(viewModel.DisplayForm);
}

[Fact]
public async Task BuildWidgetViewModel_WhenUserIsNOTAuthenticated_SetsDisplayForm_ToTrue()
{
membershipServiceMock.Setup(x => x.IsMemberAuthenticated()).ReturnsAsync(false);

var viewModel = await viewComponent.BuildWidgetViewModel(referenceProperties);
Assert.True(viewModel.DisplayForm);
}

[Fact]
public async Task BuildWidgetViewModel_SetsFormLabels_BasedOnWidgetProperties()
{
var viewModel = await viewComponent.BuildWidgetViewModel(referenceProperties);
Assert.Equal(referenceProperties.FormTitle, viewModel.FormTitle);
Assert.Equal(referenceProperties.SubmitButtonText, viewModel.SubmitButtonText);
Assert.Equal(referenceProperties.UserNameLabel, viewModel.UserNameOrEmailLabel);
Assert.Equal(referenceProperties.PasswordLabel, viewModel.PasswordLabel);
Assert.Equal(referenceProperties.StaySignedInLabel, viewModel.StaySignedInLabel);
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
using Xunit;
using TrainingGuides.Web.Features.Membership.Widgets.SignIn;

namespace TrainingGuides.Web.Tests.Features.Membership.Widgets.SignIn;

public class SignInWidgetViewModelTests
{
private readonly SignInWidgetViewModel viewModel;

public SignInWidgetViewModelTests()
{
viewModel = new();
}

[Fact]
public void WhenModelInitialized_BaseUrl_IsEmpty() => Assert.Equal(string.Empty, viewModel.BaseUrl);

[Fact]
public void WhenModelInitialized_RedirectUrl_IsEmpty() => Assert.Equal(string.Empty, viewModel.RedirectUrl);

[Fact]
public void WhenModelInitialized_DisplayForm_IsTrue() => Assert.True(viewModel.DisplayForm);

[Fact]
public void WhenModelInitialized_FormTitle_IsEmpty() => Assert.Equal(string.Empty, viewModel.FormTitle);

[Fact]
public void WhenModelInitialized_SubmitButtonText_IsEmpty() => Assert.Equal(string.Empty, viewModel.SubmitButtonText);

[Fact]
public void WhenModelInitialized_UserNameOrEmailLabel_IsEmpty() => Assert.Equal(string.Empty, viewModel.UserNameOrEmailLabel);

[Fact]
public void WhenModelInitialized_PasswordLabel_IsEmpty() => Assert.Equal(string.Empty, viewModel.PasswordLabel);

[Fact]
public void WhenModelInitialized_StaySignedInLabel_IsEmpty() => Assert.Equal(string.Empty, viewModel.StaySignedInLabel);

[Fact]
public void WhenModelInitialized_UserNameOrEmail_IsEmpty() => Assert.Equal(string.Empty, viewModel.UserNameOrEmail);

[Fact]
public void WhenModelInitialized_Password_IsEmpty() => Assert.Equal(string.Empty, viewModel.Password);

[Fact]
public void WhenModelInitialized_StaySignedIn_IsFalse() => Assert.False(viewModel.StaySignedIn);
}
10 changes: 10 additions & 0 deletions src/TrainingGuides.Web.Tests/packages.lock.json
Original file line number Diff line number Diff line change
Expand Up @@ -988,6 +988,7 @@
"dependencies": {
"AspNetCore.Unobtrusive.Ajax": "[2.0.0, )",
"Enums.NET": "[4.0.2, )",
"Htmx": "[1.8.0, )",
"TrainingGuides.Admin": "[1.0.0, )",
"TrainingGuides.Entities": "[1.0.0, )",
"kentico.xperience.admin": "[29.6.1, )",
Expand All @@ -1011,6 +1012,15 @@
"resolved": "4.0.2",
"contentHash": "Nwa4XxZ7fsuh9SpMiLUXmFT+NntALGXEvufLaQT+A0bQUH5ToNTtG0QDCoCiChdhp+4F/rtwyxpoJSgDmObIXg=="
},
"Htmx": {
"type": "CentralTransitive",
"requested": "[1.8.0, )",
"resolved": "1.8.0",
"contentHash": "bdsdNw8RWcj8HmoD9qmVHDf9F/xbN9ac3xsHu8dMekj2jLQFzu6sQiry4cE7Od7rokgL819qW9gNOUkee1Hgfg==",
"dependencies": {
"System.Text.Json": "6.0.5"
}
},
"Kentico.Xperience.Admin": {
"type": "CentralTransitive",
"requested": "[29.6.1, )",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,46 @@
</properties>
</field>
<field column="MemberGuid" guid="926897c7-71e2-47b3-b3b7-b456596e7da3" enabled="" order="8" />
<field column="GuidesMemberGivenName" enabled="true" guid="401a3ef1-1b62-4a54-bf9a-a1e0d81eeb1e" visible="true">
<settings>
<controlname>Kentico.Administration.TextInput</controlname>
</settings>
<properties>
<explanationtextashtml>False</explanationtextashtml>
<fieldcaption>Given name</fieldcaption>
<fielddescriptionashtml>False</fielddescriptionashtml>
</properties>
</field>
<field column="GuidesMemberFamilyName" enabled="true" guid="bc18c144-3b97-452e-9c50-96a34d966793" visible="true">
<settings>
<controlname>Kentico.Administration.TextInput</controlname>
</settings>
<properties>
<explanationtextashtml>False</explanationtextashtml>
<fieldcaption>Family name</fieldcaption>
<fielddescriptionashtml>False</fielddescriptionashtml>
</properties>
</field>
<field column="GuidesMemberFamilyNameFirst" enabled="true" guid="dd3d9f58-66ca-4a78-ac7e-a4adea5f0215" visible="true">
<settings>
<controlname>Kentico.Administration.Checkbox</controlname>
</settings>
<properties>
<explanationtextashtml>False</explanationtextashtml>
<fieldcaption>Family name goes first</fieldcaption>
<fielddescriptionashtml>False</fielddescriptionashtml>
</properties>
</field>
<field column="GuidesMemberFavoriteCoffee" enabled="true" guid="fdcffe5d-932b-457e-a298-2c2229199433" visible="true">
<settings>
<controlname>Kentico.Administration.TextInput</controlname>
</settings>
<properties>
<explanationtextashtml>False</explanationtextashtml>
<fieldcaption>Favorite coffee</fieldcaption>
<fielddescriptionashtml>False</fielddescriptionashtml>
</properties>
</field>
</form>
</FormDefinition>
<FormDisplayName>Edit</FormDisplayName>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,10 @@
<field allowempty="true" column="MemberPassword" columnprecision="0" columnsize="100" columntype="text" enabled="true" guid="61911700-cd6c-4d73-943a-985a57342b4f" system="true" />
<field column="MemberIsExternal" columnprecision="0" columntype="boolean" enabled="true" guid="5cf88feb-d217-4a33-8039-63b46bf2c672" system="true" />
<field allowempty="true" column="MemberSecurityStamp" columnprecision="0" columnsize="72" columntype="text" enabled="true" guid="d127bfec-d965-4888-8836-0b22ef2e1010" system="true" />
<field allowempty="true" column="GuidesMemberGivenName" columnprecision="0" columnsize="100" columntype="text" enabled="true" guid="401a3ef1-1b62-4a54-bf9a-a1e0d81eeb1e" />
<field allowempty="true" column="GuidesMemberFamilyName" columnprecision="0" columnsize="100" columntype="text" enabled="true" guid="bc18c144-3b97-452e-9c50-96a34d966793" />
<field allowempty="true" column="GuidesMemberFamilyNameFirst" columnprecision="0" columntype="boolean" enabled="true" guid="dd3d9f58-66ca-4a78-ac7e-a4adea5f0215" />
<field allowempty="true" column="GuidesMemberFavoriteCoffee" columnprecision="0" columnsize="100" columntype="text" enabled="true" guid="fdcffe5d-932b-457e-a298-2c2229199433" />
</form>
</ClassFormDefinition>
<ClassGUID>07c5d145-7cbc-4c75-9a96-6d4948bf6c73</ClassGUID>
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
<?xml version="1.0" encoding="utf-8"?>
<cms.contentitem>
<ContentItemChannelID>
<CodeName>TrainingGuidesPages</CodeName>
<GUID>5ba9c1e8-b61e-4570-b666-87a9b92bbe3b</GUID>
<ObjectType>cms.channel</ObjectType>
</ContentItemChannelID>
<ContentItemContentTypeID>
<CodeName>TrainingGuides.EmptyPage</CodeName>
<GUID>58018c9d-5b6c-4251-b3a8-8c1a6d124780</GUID>
<ObjectType>cms.contenttype</ObjectType>
</ContentItemContentTypeID>
<ContentItemGUID>67f3dec8-3741-4570-9adb-399a61f47569</ContentItemGUID>
<ContentItemIsReusable>False</ContentItemIsReusable>
<ContentItemIsSecured>False</ContentItemIsSecured>
<ContentItemName>Register-wfb2l0pn</ContentItemName>
</cms.contentitem>
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
<?xml version="1.0" encoding="utf-8"?>
<cms.contentitem>
<ContentItemChannelID>
<CodeName>TrainingGuidesPages</CodeName>
<GUID>5ba9c1e8-b61e-4570-b666-87a9b92bbe3b</GUID>
<ObjectType>cms.channel</ObjectType>
</ContentItemChannelID>
<ContentItemContentTypeID>
<CodeName>TrainingGuides.EmptyPage</CodeName>
<GUID>58018c9d-5b6c-4251-b3a8-8c1a6d124780</GUID>
<ObjectType>cms.contenttype</ObjectType>
</ContentItemContentTypeID>
<ContentItemGUID>4f88daba-f579-43fb-acdd-d80c43d7317a</ContentItemGUID>
<ContentItemIsReusable>False</ContentItemIsReusable>
<ContentItemIsSecured>False</ContentItemIsSecured>
<ContentItemName>SignIn-x4a1nygh</ContentItemName>
</cms.contentitem>
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
<?xml version="1.0" encoding="utf-8"?>
<cms.contentitemcommondata>
<ContentItemCommonDataContentItemID>
<CodeName>Register-wfb2l0pn</CodeName>
<GUID>67f3dec8-3741-4570-9adb-399a61f47569</GUID>
<ObjectType>cms.contentitem</ObjectType>
</ContentItemCommonDataContentItemID>
<ContentItemCommonDataContentLanguageID>
<CodeName>en</CodeName>
<GUID>e81b5172-f240-4041-88b1-653089984e29</GUID>
<ObjectType>cms.contentlanguage</ObjectType>
</ContentItemCommonDataContentLanguageID>
<ContentItemCommonDataFirstPublishedWhen>2024-11-12 21:22:13Z</ContentItemCommonDataFirstPublishedWhen>
<ContentItemCommonDataGUID>720f4866-de8d-4fbb-84e2-b146431792ab</ContentItemCommonDataGUID>
<ContentItemCommonDataIsLatest>True</ContentItemCommonDataIsLatest>
<ContentItemCommonDataLastPublishedWhen>2024-11-13 13:11:23Z</ContentItemCommonDataLastPublishedWhen>
<ContentItemCommonDataPageBuilderWidgets>
<![CDATA[{"editableAreas":[{"identifier":"areaMain","sections":[{"identifier":"6bc2b397-cf8b-4f53-8832-b0c2e287043f","type":"TrainingGuides.GeneralSection","properties":{"sectionAnchor":"","colorScheme":"Light2","cornerStyle":"Round","columnLayout":"OneColumn"},"zones":[{"identifier":"f0217f62-24ba-400d-8a56-b188d862c4df","name":"zoneMain","widgets":[{"identifier":"002e6296-3a30-4dbf-88d2-cf4e11df457f","type":"TrainingGuides.RegistrationWidget","variants":[{"identifier":"9a62a680-afb5-4854-bf0c-73d6b1785535","properties":{"showName":true,"showExtraFields":true,"formTitle":"Sign up","submitButtonText":"Submit","userNameLabel":"User name","emailAddressLabel":"Email address","passwordLabel":"Password","confirmPasswordLabel":"Confirm your password","givenNameLabel":"Given name","familyNameLabel":"Family name","familyNameFirstLabel":"Family name goes first","favoriteCoffeeLabel":"Favorite coffee"},"fieldIdentifiers":{"showName":"592ff766-b84f-43d6-b680-c8ce673eb7e8","showExtraFields":"eeb08534-acb8-4fcf-98f7-601de18eea2d","formTitle":"7e523d0e-58af-4d98-9c1e-38daba9a0344","submitButtonText":"af3b5ed1-63e0-43a3-8a63-ac4acef0bffc","userNameLabel":"f9233804-53b3-4101-85fb-001a25c04445","emailAddressLabel":"2cab0a5e-d7ba-4861-81dc-420274af3c07","passwordLabel":"6841ce51-bdba-434d-8e0a-847aa2e99c09","confirmPasswordLabel":"b357aaf4-3074-4fcb-8811-9196913f23ef","givenNameLabel":"e33871bb-baf4-4642-920a-22417200f1a3","familyNameLabel":"ef40f8f1-8baf-412b-a2a8-aab4143e3862","familyNameFirstLabel":"1af6186f-4f53-4b55-8ce5-25fd8d3e6d94","favoriteCoffeeLabel":"b4065c30-db6b-4063-905f-7b31bea58084"}}]},{"identifier":"2556fa49-c332-4d91-9b08-058e3f24c1a6","type":"Kentico.Widget.RichText","variants":[{"identifier":"69fce9d9-9aae-4b4f-b891-4af71c58d266","properties":{"content":"<hr><p><br></p>"},"fieldIdentifiers":{"content":"b5c0822e-47b2-45ad-bb41-6c8aff165cd3"}}]},{"identifier":"1c125c5a-9016-4e68-bd9d-e09b2d001c3d","type":"TrainingGuides.LinkOrSignOutWidget","variants":[{"identifier":"fabf2b85-2b37-4c1e-92b3-a718b57581c6","properties":{"unauthenticatedText":"Already have an account?","unauthenticatedButtonText":"Sign in here","unauthenticatedTargetContentPage":[{"webPageGuid":"377ca7c4-eea9-49a0-9d58-282b5127c7ff"}],"authenticatedText":"You are already registered.","authenticatedButtonText":"Sign out"},"fieldIdentifiers":{"unauthenticatedText":"466b3cbc-8dee-4b03-ae78-4b11346248f0","unauthenticatedButtonText":"0b8b7c48-efb9-4288-a81e-13a805bb34d3","unauthenticatedTargetContentPage":"3ac28b30-e714-45ec-a8c7-e35778dd8469","authenticatedText":"cd9699ae-fd9f-471f-8520-9a00965002db","authenticatedButtonText":"82514014-d110-4c54-8523-9e0274984af0"}}]}]}],"fieldIdentifiers":{"sectionAnchor":"9521150d-c46a-4fa7-9313-1fdd4ed8c36c","colorScheme":"187c4225-712c-4f9f-88e0-f9986962bfea","cornerStyle":"6c91ad40-65be-4ece-89a8-b20898afd525","columnLayout":"b754983b-2cb9-4bad-a629-e768046b1114"}}]}]}]]>
</ContentItemCommonDataPageBuilderWidgets>
<ContentItemCommonDataPageTemplateConfiguration>
<![CDATA[{"identifier":"TrainingGuides.GeneralPageTemplate","properties":{"colorScheme":"TransparentDark","cornerStyle":"Round","columnLayout":"OneColumn"},"fieldIdentifiers":{"colorScheme":"324d9684-4061-45fa-8211-63d1a3b4eb75","cornerStyle":"d8c59d28-4e40-4d4c-a20e-75d0f40d5889","columnLayout":"d9ed39e8-a3ba-4a95-9ca3-c4d19199dc13"}}]]>
</ContentItemCommonDataPageTemplateConfiguration>
<ContentItemCommonDataVersionStatus>2</ContentItemCommonDataVersionStatus>
</cms.contentitemcommondata>
Loading