Skip to content

Commit f724389

Browse files
committed
Merge remote-tracking branch 'upstream/dev' into ActionDialogSize
2 parents e6cf77e + 9db2a55 commit f724389

File tree

24 files changed

+383
-232
lines changed

24 files changed

+383
-232
lines changed

LICENSE

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
MIT License
22

3-
Copyright (c) 2018-2024 .NET Foundation
3+
Copyright (c) 2018-2025 .NET Foundation
44

55
Permission is hereby granted, free of charge, to any person obtaining a copy
66
of this software and associated documentation files (the "Software"), to deal

Oqtane.Client/Installer/Installer.razor

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -71,14 +71,14 @@
7171
<div class="row mb-1 align-items-center">
7272
<Label Class="col-sm-3" For="username" HelpText="Provide a username for the primary user account" ResourceKey="Username">Username:</Label>
7373
<div class="col-sm-9">
74-
<input id="username" type="text" class="form-control" @bind="@_hostUsername" />
74+
<input id="username" type="text" class="form-control" maxlength="256" @bind="@_hostUsername" />
7575
</div>
7676
</div>
7777
<div class="row mb-1 align-items-center">
7878
<Label Class="col-sm-3" For="password" HelpText="Provide a password for the primary user account" ResourceKey="Password">Password:</Label>
7979
<div class="col-sm-9">
8080
<div class="input-group">
81-
<input id="password" type="@_passwordType" class="form-control" @bind="@_hostPassword" autocomplete="new-password" />
81+
<input id="password" type="@_passwordType" class="form-control" maxlength="256" @bind="@_hostPassword" autocomplete="new-password" />
8282
<button type="button" class="btn btn-secondary" @onclick="@TogglePassword" tabindex="-1">@_togglePassword</button>
8383
</div>
8484
</div>
@@ -87,15 +87,21 @@
8787
<Label Class="col-sm-3" For="confirm" HelpText="Please confirm the password entered above by entering it again" ResourceKey="Confirm">Confirm:</Label>
8888
<div class="col-sm-9">
8989
<div class="input-group">
90-
<input id="confirm" type="@_confirmPasswordType" class="form-control" @bind="@_confirmPassword" autocomplete="new-password" />
90+
<input id="confirm" type="@_confirmPasswordType" class="form-control" maxlength="256" @bind="@_confirmPassword" autocomplete="new-password" />
9191
<button type="button" class="btn btn-secondary" @onclick="@ToggleConfirmPassword" tabindex="-1">@_toggleConfirmPassword</button>
9292
</div>
9393
</div>
9494
</div>
9595
<div class="row mb-1 align-items-center">
9696
<Label Class="col-sm-3" For="email" HelpText="Provide the email address for the host user account" ResourceKey="Email">Email:</Label>
9797
<div class="col-sm-9">
98-
<input type="text" class="form-control" @bind="@_hostEmail" />
98+
<input type="text" class="form-control" maxlength="256" @bind="@_hostEmail" />
99+
</div>
100+
</div>
101+
<div class="row mb-1 align-items-center">
102+
<Label Class="col-sm-3" For="name" HelpText="Provide the full name of the host user" ResourceKey="Name">Full Name:</Label>
103+
<div class="col-sm-9">
104+
<input type="text" class="form-control" maxlength="50" @bind="@_hostName" />
99105
</div>
100106
</div>
101107
<div class="row mb-1 align-items-center">
@@ -153,6 +159,7 @@
153159
private string _toggleConfirmPassword = string.Empty;
154160
private string _confirmPassword = string.Empty;
155161
private string _hostEmail = string.Empty;
162+
private string _hostName = string.Empty;
156163
private List<SiteTemplate> _templates;
157164
private string _template = Constants.DefaultSiteTemplate;
158165
private bool _register = true;
@@ -236,7 +243,7 @@
236243
}
237244
}
238245

239-
if (connectionString != "" && !string.IsNullOrEmpty(_hostUsername) && !string.IsNullOrEmpty(_hostPassword) && _hostPassword == _confirmPassword && !string.IsNullOrEmpty(_hostEmail) && _hostEmail.Contains("@"))
246+
if (connectionString != "" && !string.IsNullOrEmpty(_hostUsername) && !string.IsNullOrEmpty(_hostPassword) && _hostPassword == _confirmPassword && !string.IsNullOrEmpty(_hostEmail) && _hostEmail.Contains("@") && !string.IsNullOrEmpty(_hostName))
240247
{
241248
var result = await UserService.ValidateUserAsync(_hostUsername, _hostEmail, _hostPassword);
242249
if (result.Succeeded)
@@ -256,7 +263,7 @@
256263
HostUsername = _hostUsername,
257264
HostPassword = _hostPassword,
258265
HostEmail = _hostEmail,
259-
HostName = _hostUsername,
266+
HostName = _hostName,
260267
TenantName = TenantNames.Master,
261268
IsNewTenant = true,
262269
SiteName = Constants.DefaultSite,

Oqtane.Client/Modules/Admin/RecycleBin/Index.razor

Lines changed: 85 additions & 69 deletions
Original file line numberDiff line numberDiff line change
@@ -13,71 +13,71 @@
1313
}
1414
else
1515
{
16-
<TabStrip>
17-
<TabPanel Name="Pages" ResourceKey="Pages" Heading="Pages">
18-
@if (!_pages.Where(item => item.IsDeleted).Any())
19-
{
20-
<br />
21-
<p>@Localizer["NoPage.Deleted"]</p>
22-
}
23-
else
24-
{
25-
<Pager Items="@_pages.Where(item => item.IsDeleted).OrderByDescending(item => item.DeletedOn)" CurrentPage="@_pagePage.ToString()" OnPageChange="OnPageChangePage">
26-
<Header>
27-
<th style="width: 1px;">&nbsp;</th>
28-
<th style="width: 1px;">&nbsp;</th>
29-
<th>@SharedLocalizer["Name"]</th>
30-
<th>@Localizer["DeletedBy"]</th>
31-
<th>@Localizer["DeletedOn"]</th>
32-
</Header>
33-
<Row>
16+
<TabStrip>
17+
<TabPanel Name="Pages" ResourceKey="Pages" Heading="Pages">
18+
@if (!_pages.Where(item => item.IsDeleted).Any())
19+
{
20+
<br />
21+
<p>@Localizer["NoPage.Deleted"]</p>
22+
}
23+
else
24+
{
25+
<Pager Items="@_pages.Where(item => item.IsDeleted).OrderByDescending(item => item.DeletedOn)" CurrentPage="@_pagePage.ToString()" OnPageChange="OnPageChangePage">
26+
<Header>
27+
<th style="width: 1px;">&nbsp;</th>
28+
<th style="width: 1px;">&nbsp;</th>
29+
<th>@SharedLocalizer["Path"]</th>
30+
<th>@Localizer["DeletedBy"]</th>
31+
<th>@Localizer["DeletedOn"]</th>
32+
</Header>
33+
<Row>
3434
<td><button type="button" @onclick="@(() => RestorePage(context))" class="btn btn-success" title="Restore">@Localizer["Restore"]</button></td>
35-
<td><ActionDialog Header="Delete Page" Message="@string.Format(Localizer["Confirm.Page.Delete"], context.Name)" Action="Delete" Security="SecurityAccessLevel.Admin" Class="btn btn-danger" OnClick="@(async () => await DeletePage(context))" ResourceKey="DeletePage" /></td>
36-
<td>@context.Name</td>
37-
<td>@context.DeletedBy</td>
38-
<td>@context.DeletedOn</td>
39-
</Row>
40-
</Pager>
41-
<br />
42-
<ActionDialog Header="Remove All Deleted Pages" Message="Are You Sure You Wish To Permanently Remove All Deleted Pages?" Action="Remove All Deleted Pages" Security="SecurityAccessLevel.Admin" Class="btn btn-danger" OnClick="@(async () => await DeleteAllPages())" ResourceKey="DeleteAllPages" />
43-
}
44-
</TabPanel>
45-
<TabPanel Name="Modules" ResourceKey="Modules" Heading="Modules">
46-
@if (!_modules.Where(item => item.IsDeleted).Any())
47-
{
48-
<br />
49-
<p>@Localizer["NoModule.Deleted"]</p>
50-
}
51-
else
52-
{
53-
<Pager Items="@_modules.Where(item => item.IsDeleted).OrderByDescending(item => item.DeletedOn)" CurrentPage="@_pageModule.ToString()" OnPageChange="OnPageChangeModule">
54-
<Header>
55-
<th style="width: 1px;">&nbsp;</th>
56-
<th style="width: 1px;">&nbsp;</th>
57-
<th>@Localizer["Page"]</th>
58-
<th>@Localizer["Module"]</th>
59-
<th>@Localizer["DeletedBy"]</th>
60-
<th>@Localizer["DeletedOn"]</th>
61-
</Header>
62-
<Row>
63-
<td><button type="button" @onclick="@(() => RestoreModule(context))" class="btn btn-success" title="Restore">@Localizer["Restore"]</button></td>
64-
<td><ActionDialog Header="Delete Module" Message="@string.Format(Localizer["Confirm.Module.Delete"], context.Title)" Action="Delete" Security="SecurityAccessLevel.Admin" Class="btn btn-danger" OnClick="@(async () => await DeleteModule(context))" ResourceKey="DeleteModule" /></td>
65-
<td>@_pages.Find(item => item.PageId == context.PageId).Name</td>
66-
<td>@context.Title</td>
67-
<td>@context.DeletedBy</td>
68-
<td>@context.DeletedOn</td>
69-
</Row>
70-
</Pager>
71-
<br />
72-
<ActionDialog Header="Remove All Deleted Modules" Message="Are You Sure You Wish To Permanently Remove All Deleted Modules?" Action="Remove All Deleted Modules" Security="SecurityAccessLevel.Admin" Class="btn btn-danger" OnClick="@(async () => await DeleteAllModules())" ResourceKey="DeleteAllModules" />
73-
}
74-
</TabPanel>
75-
</TabStrip>
35+
<td><ActionDialog Header="Delete Page" Message="@string.Format(Localizer["Confirm.Page.Delete"], context.Name)" Action="Delete" Security="SecurityAccessLevel.Admin" Class="btn btn-danger" OnClick="@(async () => await DeletePage(context))" ResourceKey="DeletePage" /></td>
36+
<td>@context.Path</td>
37+
<td>@context.DeletedBy</td>
38+
<td>@context.DeletedOn</td>
39+
</Row>
40+
</Pager>
41+
<br />
42+
<ActionDialog Header="Remove All Deleted Pages" Message="Are You Sure You Wish To Permanently Remove All Deleted Pages?" Action="Remove All Deleted Pages" Security="SecurityAccessLevel.Admin" Class="btn btn-danger" OnClick="@(async () => await DeleteAllPages())" ResourceKey="DeleteAllPages" />
43+
}
44+
</TabPanel>
45+
<TabPanel Name="Modules" ResourceKey="Modules" Heading="Modules">
46+
@if (!_modules.Where(item => item.IsDeleted).Any())
47+
{
48+
<br />
49+
<p>@Localizer["NoModule.Deleted"]</p>
50+
}
51+
else
52+
{
53+
<Pager Items="@_modules.Where(item => item.IsDeleted).OrderByDescending(item => item.DeletedOn)" CurrentPage="@_pageModule.ToString()" OnPageChange="OnPageChangeModule">
54+
<Header>
55+
<th style="width: 1px;">&nbsp;</th>
56+
<th style="width: 1px;">&nbsp;</th>
57+
<th>@Localizer["Page"]</th>
58+
<th>@Localizer["Module"]</th>
59+
<th>@Localizer["DeletedBy"]</th>
60+
<th>@Localizer["DeletedOn"]</th>
61+
</Header>
62+
<Row>
63+
<td><button type="button" @onclick="@(() => RestoreModule(context))" class="btn btn-success" title="Restore">@Localizer["Restore"]</button></td>
64+
<td><ActionDialog Header="Delete Module" Message="@string.Format(Localizer["Confirm.Module.Delete"], context.Title)" Action="Delete" Security="SecurityAccessLevel.Admin" Class="btn btn-danger" OnClick="@(async () => await DeleteModule(context))" ResourceKey="DeleteModule" /></td>
65+
<td>@_pages.Find(item => item.PageId == context.PageId).Name</td>
66+
<td>@context.Title</td>
67+
<td>@context.DeletedBy</td>
68+
<td>@context.DeletedOn</td>
69+
</Row>
70+
</Pager>
71+
<br />
72+
<ActionDialog Header="Remove All Deleted Modules" Message="Are You Sure You Wish To Permanently Remove All Deleted Modules?" Action="Remove All Deleted Modules" Security="SecurityAccessLevel.Admin" Class="btn btn-danger" OnClick="@(async () => await DeleteAllModules())" ResourceKey="DeleteAllModules" />
73+
}
74+
</TabPanel>
75+
</TabStrip>
7676
}
7777

7878
@code {
79-
private List<Page> _pages;
80-
private List<Module> _modules;
79+
private List<Page> _pages;
80+
private List<Module> _modules;
8181
private int _pagePage = 1;
8282
private int _pageModule = 1;
8383
public override SecurityAccessLevel SecurityAccessLevel => SecurityAccessLevel.Admin;
@@ -105,12 +105,25 @@ else
105105
{
106106
try
107107
{
108-
page.IsDeleted = false;
109-
await PageService.UpdatePageAsync(page);
110-
await logger.LogInformation("Page Restored {Page}", page);
111-
await Load();
112-
StateHasChanged();
113-
NavigationManager.NavigateTo(NavigateUrl());
108+
var validated = true;
109+
if (page.ParentId != null)
110+
{
111+
var parent = _pages.Find(item => item.PageId == page.ParentId);
112+
validated = !parent.IsDeleted;
113+
}
114+
if (validated)
115+
{
116+
page.IsDeleted = false;
117+
await PageService.UpdatePageAsync(page);
118+
await logger.LogInformation("Page Restored {Page}", page);
119+
AddModuleMessage(Localizer["Success.Page.Restore"], MessageType.Success);
120+
await Load();
121+
StateHasChanged();
122+
}
123+
else
124+
{
125+
AddModuleMessage(Localizer["Message.Page.Restore"], MessageType.Warning);
126+
}
114127
}
115128
catch (Exception ex)
116129
{
@@ -125,9 +138,9 @@ else
125138
{
126139
await PageService.DeletePageAsync(page.PageId);
127140
await logger.LogInformation("Page Permanently Deleted {Page}", page);
141+
AddModuleMessage(Localizer["Success.Page.Delete"], MessageType.Success);
128142
await Load();
129143
StateHasChanged();
130-
NavigationManager.NavigateTo(NavigateUrl());
131144
}
132145
catch (Exception ex)
133146
{
@@ -148,10 +161,10 @@ else
148161
}
149162

150163
await logger.LogInformation("Pages Permanently Deleted");
164+
AddModuleMessage(Localizer["Success.Pages.Delete"], MessageType.Success);
151165
await Load();
152166
HideProgressIndicator();
153167
StateHasChanged();
154-
NavigationManager.NavigateTo(NavigateUrl());
155168
}
156169
catch (Exception ex)
157170
{
@@ -169,6 +182,7 @@ else
169182
pagemodule.IsDeleted = false;
170183
await PageModuleService.UpdatePageModuleAsync(pagemodule);
171184
await logger.LogInformation("Module Restored {Module}", module);
185+
AddModuleMessage(Localizer["Success.Module.Restore"], MessageType.Success);
172186
await Load();
173187
StateHasChanged();
174188
}
@@ -185,6 +199,7 @@ else
185199
{
186200
await PageModuleService.DeletePageModuleAsync(module.PageModuleId);
187201
await logger.LogInformation("Module Permanently Deleted {Module}", module);
202+
AddModuleMessage(Localizer["Success.Module.Delete"], MessageType.Success);
188203
await Load();
189204
StateHasChanged();
190205
}
@@ -205,6 +220,7 @@ else
205220
await PageModuleService.DeletePageModuleAsync(module.PageModuleId);
206221
}
207222
await logger.LogInformation("Modules Permanently Deleted");
223+
AddModuleMessage(Localizer["Success.Modules.Delete"], MessageType.Success);
208224
await Load();
209225
HideProgressIndicator();
210226
StateHasChanged();

Oqtane.Client/Modules/Admin/Roles/Users.razor

Lines changed: 16 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ else
5858
<td>@context.EffectiveDate</td>
5959
<td>@context.ExpiryDate</td>
6060
<td>
61-
<ActionDialog Header="Remove User" Message="@string.Format(Localizer["Confirm.User.DeleteRole"], context.User.DisplayName)" Action="Delete" Security="SecurityAccessLevel.Edit" Class="btn btn-danger" OnClick="@(async () => await DeleteUserRole(context.UserRoleId))" Disabled="@(context.Role.IsAutoAssigned || context.User.Username == UserNames.Host || context.User.UserId == PageState.User.UserId)" ResourceKey="DeleteUserRole" />
61+
<ActionDialog Header="Remove User" Message="@string.Format(Localizer["Confirm.User.DeleteRole"], context.User.DisplayName)" Action="Delete" Security="SecurityAccessLevel.Edit" Class="btn btn-danger" OnClick="@(async () => await DeleteUserRole(context.UserRoleId))" Disabled="@(context.User.Username == UserNames.Host || context.User.UserId == PageState.User.UserId)" ResourceKey="DeleteUserRole" />
6262
</td>
6363
</Row>
6464
</Pager>
@@ -180,27 +180,28 @@ else
180180

181181
private async Task DeleteUserRole(int UserRoleId)
182182
{
183-
validated = true;
184-
var interop = new Interop(JSRuntime);
185-
if (await interop.FormValid(form))
183+
try
186184
{
187-
try
185+
var userrole = await UserRoleService.GetUserRoleAsync(UserRoleId);
186+
if (userrole.Role.Name == RoleNames.Registered)
188187
{
189-
await UserRoleService.DeleteUserRoleAsync(UserRoleId);
190-
await logger.LogInformation("User Removed From Role {UserRoleId}", UserRoleId);
191-
AddModuleMessage(Localizer["Confirm.User.RoleRemoved"], MessageType.Success);
192-
await GetUserRoles();
193-
StateHasChanged();
188+
userrole.ExpiryDate = DateTime.UtcNow;
189+
await UserRoleService.UpdateUserRoleAsync(userrole);
190+
await logger.LogInformation("User {Username} Expired From Role {Role}", userrole.User.Username, userrole.Role.Name);
194191
}
195-
catch (Exception ex)
192+
else
196193
{
197-
await logger.LogError(ex, "Error Removing User From Role {UserRoleId} {Error}", UserRoleId, ex.Message);
198-
AddModuleMessage(Localizer["Error.User.RemoveRole"], MessageType.Error);
194+
await UserRoleService.DeleteUserRoleAsync(UserRoleId);
195+
await logger.LogInformation("User {Username} Removed From Role {Role}", userrole.User.Username, userrole.Role.Name);
199196
}
197+
AddModuleMessage(Localizer["Confirm.User.RoleRemoved"], MessageType.Success);
198+
await GetUserRoles();
199+
StateHasChanged();
200200
}
201-
else
201+
catch (Exception ex)
202202
{
203-
AddModuleMessage(SharedLocalizer["Message.InfoRequired"], MessageType.Warning);
203+
await logger.LogError(ex, "Error Removing User From Role {UserRoleId} {Error}", UserRoleId, ex.Message);
204+
AddModuleMessage(Localizer["Error.User.RemoveRole"], MessageType.Error);
204205
}
205206
}
206207
}

0 commit comments

Comments
 (0)