Skip to content

Commit fe9b0dd

Browse files
Ticket #474 : Can edit identity provider mapping rules
1 parent 7604472 commit fe9b0dd

13 files changed

+610
-5
lines changed

src/IdServer/SimpleIdServer.IdServer.Website/Pages/IdentityProvisioning.razor

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,9 @@ else
3232
<RadzenTabsItem Text="Properties">
3333
<IdentityProvisioningProperties IdProvisioning="@identityProvisioningState.Value.IdentityProvisioning"></IdentityProvisioningProperties>
3434
</RadzenTabsItem>
35+
<RadzenTabsItem Text="Mapping rules">
36+
<IdentityProvisioningMappingRules IdProvisioning="@identityProvisioningState.Value.IdentityProvisioning"></IdentityProvisioningMappingRules>
37+
</RadzenTabsItem>
3538
<RadzenTabsItem Text="Histories" >
3639
<IdentityProvisioningHistories IdentityProvisioning="@identityProvisioningState.Value.IdentityProvisioning"></IdentityProvisioningHistories>
3740
</RadzenTabsItem>
@@ -44,7 +47,8 @@ else
4447
{
4548
{ "details", 0 },
4649
{ "properties", 1 },
47-
{ "histories", 2 }
50+
{ "mappingrules", 2 },
51+
{ "histories", 3 }
4852
};
4953
[Parameter]
5054
public string id { get; set; } = null!;
@@ -79,6 +83,11 @@ else
7983
notificationService.Notify(new NotificationMessage { Severity = NotificationSeverity.Success, Summary = Global.IdProvisioningPropertiesUpdated });
8084
StateHasChanged();
8185
});
86+
SubscribeToAction<RemoveSelectedIdentityProvisioningMappingRulesSuccessAction>((act) =>
87+
{
88+
notificationService.Notify(new NotificationMessage { Severity = NotificationSeverity.Success, Summary = Global.SelectedIdentityProvisioningMappingRulesRemoved });
89+
StateHasChanged();
90+
});
8291
SubscribeToAction<SelectRealmSuccessAction>((act) =>
8392
{
8493
navigationManager.NavigateTo("/identityprovisioning");

src/IdServer/SimpleIdServer.IdServer.Website/Pages/IdentityProvisioningLst.razor

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,14 @@
108108
}
109109
</Template>
110110
</RadzenDataGridColumn>
111+
<RadzenDataGridColumn TItem="ImportSummary" Title="Error" Filterable="false" Sortable="false" Width="80px">
112+
<Template Context="data">
113+
@if(!string.IsNullOrWhiteSpace(data.ErrorMessage))
114+
{
115+
<RadzenButton Icon="search" Click="@(args => ShowAudit(data))" />
116+
}
117+
</Template>
118+
</RadzenDataGridColumn>
111119
</Columns>
112120
</RadzenDataGrid>
113121

@@ -199,4 +207,18 @@
199207
var act = new LaunchImportAction();
200208
dispatcher.Dispatch(act);
201209
}
210+
211+
async void ShowAudit(ImportSummary importSummary)
212+
{
213+
await dialogService.OpenAsync<RequestDialog>("Error", new Dictionary<string, object>
214+
{
215+
{ "Content", importSummary.ErrorMessage }
216+
}, new DialogOptions
217+
{
218+
Width = "700px",
219+
Height = "512px",
220+
Resizable = true,
221+
Draggable = true
222+
});
223+
}
202224
}
Lines changed: 107 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,107 @@
1+
@using SimpleIdServer.IdServer.Website.Stores.IdentityProvisioningStore;
2+
@inherits Fluxor.Blazor.Web.Components.FluxorComponent
3+
@inject IState<SearchIdentityProvisioningMappingRuleState> searchIdentityProvisioningMappingRulesState
4+
@inject ContextMenuService contextMenuService
5+
@inject IDispatcher dispatcher
6+
@inject DialogService dialogService
7+
8+
9+
<RadzenButton class="mb-1" Click="@(args => AddMappingRule())" Icon="add" Text="Add mapping rule" ButtonStyle="ButtonStyle.Primary" Size="ButtonSize.Medium"></RadzenButton>
10+
11+
<RadzenDataGrid AllowFiltering="true"
12+
AllowColumnResize="true"
13+
AllowAlternatingRows="false"
14+
FilterMode="FilterMode.Simple"
15+
FilterCaseSensitivity="FilterCaseSensitivity.CaseInsensitive"
16+
AllowSorting="true"
17+
AllowPaging="false"
18+
PagerHorizontalAlign="HorizontalAlign.Left"
19+
ShowPagingSummary="true"
20+
IsLoading="@searchIdentityProvisioningMappingRulesState.Value.IsLoading"
21+
Count="@searchIdentityProvisioningMappingRulesState.Value.Count"
22+
Data="@searchIdentityProvisioningMappingRulesState.Value.MappingRules"
23+
RowRender="@RowRender"
24+
TItem="SelectableIdentityProvisioningMappingRule"
25+
ColumnWidth="300px">
26+
<Columns>
27+
<RadzenDataGridColumn TItem="SelectableIdentityProvisioningMappingRule" Filterable="false" Sortable="false" Width="80px" TextAlign="TextAlign.Center">
28+
<HeaderTemplate>
29+
<RadzenCheckBox @bind-Value=@selectAll Change="@(args => ToggleAll(args))" TValue="bool" />
30+
</HeaderTemplate>
31+
<Template Context="data">
32+
<RadzenCheckBox @bind-Value=@data.IsSelected Change="@(args => ToggleChanged(args, data))" TValue="bool" />
33+
</Template>
34+
</RadzenDataGridColumn>
35+
<RadzenDataGridColumn TItem="SelectableIdentityProvisioningMappingRule" Property="Value.From" Filterable="false" Sortable="false" Title="From" Width="80px" />
36+
<RadzenDataGridColumn TItem="SelectableIdentityProvisioningMappingRule" Filterable="false" Sortable="false" Title="Type" Width="80px">
37+
<Template Context="data">
38+
<RadzenBadge IsPill=true Text="@Enum.GetName(typeof(MappingRuleTypes), data.Value.MapperType)" BadgeStyle="BadgeStyle.Primary"></RadzenBadge>
39+
</Template>
40+
</RadzenDataGridColumn>
41+
<RadzenDataGridColumn TItem="SelectableIdentityProvisioningMappingRule" Property="Value.TargetUserAttribute" Filterable="false" Sortable="false" Title="Attribute" Width="80px" />
42+
<RadzenDataGridColumn TItem="SelectableIdentityProvisioningMappingRule" Property="Value.TargetUserProperty" Filterable="false" Sortable="false" Title="Property" Width="80px" />
43+
<RadzenDataGridColumn TItem="SelectableIdentityProvisioningMappingRule" Filterable="false" Sortable="false" Width="80px" TextAlign="TextAlign.Center">
44+
<Template Context="data">
45+
<RadzenButton Icon="more_vert" Click="@(args => ShowMoreContextMenu(data, args))" />
46+
</Template>
47+
</RadzenDataGridColumn>
48+
</Columns>
49+
</RadzenDataGrid>
50+
51+
@code {
52+
[Parameter]
53+
public Domains.IdentityProvisioning IdProvisioning { get; set; }
54+
bool selectAll = false;
55+
56+
void ToggleAll(bool isSelected)
57+
{
58+
var act = new SelectAllIdentityProvisioningMappingRulesAction { IsSelected = isSelected };
59+
dispatcher.Dispatch(act);
60+
}
61+
62+
void ToggleChanged(bool isSelected, SelectableIdentityProvisioningMappingRule mappingRule)
63+
{
64+
var act = new SelectIdentityProvisioningMappingRuleAction { IsSelected = isSelected, Id = mappingRule.Value.Id };
65+
dispatcher.Dispatch(act);
66+
}
67+
68+
void RowRender(RowRenderEventArgs<SelectableIdentityProvisioningMappingRule> row)
69+
{
70+
const string className = "class";
71+
if (row.Data.IsNew)
72+
row.Attributes.Add(className, "new");
73+
else if (row.Data.IsSelected)
74+
row.Attributes.Add(className, "active");
75+
else if (row.Attributes.ContainsKey(className))
76+
row.Attributes.Remove(className);
77+
}
78+
79+
void ShowMoreContextMenu(SelectableIdentityProvisioningMappingRule idProvisioning, MouseEventArgs args)
80+
{
81+
contextMenuService.Open(args, new List<ContextMenuItem>
82+
{
83+
new ContextMenuItem { Text = "Delete", Value = 1 }
84+
}, (a) =>
85+
{
86+
if(a.Value.Equals(1))
87+
{
88+
var mappingRuleIds = searchIdentityProvisioningMappingRulesState.Value.MappingRules?.Where(c => c.IsSelected).Select(c => c.Value.Id)?.ToList();
89+
if (!mappingRuleIds.Contains(idProvisioning.Value.Id)) mappingRuleIds.Add(idProvisioning.Value.Id);
90+
var act = new RemoveSelectedIdentityProvisioningMappingRulesAction { MappingRuleIds = mappingRuleIds, Id = IdProvisioning.Id };
91+
dispatcher.Dispatch(act);
92+
contextMenuService.Close();
93+
}
94+
});
95+
}
96+
97+
async void AddMappingRule()
98+
{
99+
await dialogService.OpenAsync<AddIdProvisioningMapperDialog>("Add mapping rule", new Dictionary<string, object> { { "IdProvisioningId", IdProvisioning.Id } }, new DialogOptions
100+
{
101+
Width = "700px",
102+
Height = "512px",
103+
Resizable = true,
104+
Draggable = true
105+
});
106+
}
107+
}
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
.page {
2+
position: relative;
3+
display: flex;
4+
flex-direction: column;
5+
}
6+
7+
main {
8+
flex: 1;
9+
}
10+
11+
.sidebar {
12+
background-image: linear-gradient(180deg, rgb(5, 39, 103) 0%, #3a0647 70%);
13+
}
14+
15+
.top-row {
16+
background-color: #f7f7f7;
17+
border-bottom: 1px solid #d6d5d5;
18+
justify-content: flex-end;
19+
height: 3.5rem;
20+
display: flex;
21+
align-items: center;
22+
}
23+
24+
.top-row ::deep a, .top-row .btn-link {
25+
white-space: nowrap;
26+
margin-left: 1.5rem;
27+
}
28+
29+
.top-row a:first-child {
30+
overflow: hidden;
31+
text-overflow: ellipsis;
32+
}
33+
34+
@media (max-width: 640.98px) {
35+
.top-row:not(.auth) {
36+
display: none;
37+
}
38+
39+
.top-row.auth {
40+
justify-content: space-between;
41+
}
42+
43+
.top-row a, .top-row .btn-link {
44+
margin-left: 0;
45+
}
46+
}
47+
48+
@media (min-width: 641px) {
49+
.page {
50+
flex-direction: row;
51+
}
52+
53+
.sidebar {
54+
width: 250px;
55+
height: 100vh;
56+
position: sticky;
57+
top: 0;
58+
}
59+
60+
.top-row {
61+
position: sticky;
62+
top: 0;
63+
z-index: 1;
64+
}
65+
66+
.top-row, article {
67+
padding-left: 2rem !important;
68+
padding-right: 1.5rem !important;
69+
}
70+
}

src/IdServer/SimpleIdServer.IdServer.Website/Resources/Global.Designer.cs

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

src/IdServer/SimpleIdServer.IdServer.Website/Resources/Global.resx

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -180,6 +180,9 @@
180180
<data name="IdProvisioningDetailsUpdated" xml:space="preserve">
181181
<value>Details have been updated</value>
182182
</data>
183+
<data name="IdProvisioningMappingRuleAdded" xml:space="preserve">
184+
<value>Mapping rule has been added</value>
185+
</data>
183186
<data name="IdProvisioningPropertiesUpdated" xml:space="preserve">
184187
<value>Properties have been updated</value>
185188
</data>
@@ -252,6 +255,9 @@
252255
<data name="SelectedGrantsRemoved" xml:space="preserve">
253256
<value>Selected grants have been rejected</value>
254257
</data>
258+
<data name="SelectedIdentityProvisioningMappingRulesRemoved" xml:space="preserve">
259+
<value>Mapping rules have been removed</value>
260+
</data>
255261
<data name="SelectedIdentityProvisioningRemoved" xml:space="preserve">
256262
<value>Selected Identity Provisioning has been removed</value>
257263
</data>

0 commit comments

Comments
 (0)