Skip to content

Commit a480ae9

Browse files
committed
Renamed theme tab to customisation tab. Added basic theme crud
1 parent 2c9a87b commit a480ae9

File tree

10 files changed

+407
-163
lines changed

10 files changed

+407
-163
lines changed

Moonlight.ApiServer/Http/Controllers/Admin/Sys/ThemeController.cs renamed to Moonlight.ApiServer/Http/Controllers/Admin/Sys/Customisation/ThemesController.cs

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -10,21 +10,21 @@
1010
using Moonlight.Shared.Http.Requests.Admin.Sys.Theme;
1111
using Moonlight.Shared.Http.Responses.Admin;
1212

13-
namespace Moonlight.ApiServer.Http.Controllers.Admin.Sys;
13+
namespace Moonlight.ApiServer.Http.Controllers.Admin.Sys.Customisation;
1414

1515
[ApiController]
16-
[Route("api/admin/system/theme")]
17-
public class ThemeController : Controller
16+
[Route("api/admin/system/customisation/themes")]
17+
public class ThemesController : Controller
1818
{
1919
private readonly DatabaseRepository<Theme> ThemeRepository;
2020

21-
public ThemeController(DatabaseRepository<Theme> themeRepository)
21+
public ThemesController(DatabaseRepository<Theme> themeRepository)
2222
{
2323
ThemeRepository = themeRepository;
2424
}
2525

2626
[HttpGet]
27-
[Authorize(Policy = "permissions:admin.system.theme.read")]
27+
[Authorize(Policy = "permissions:admin.system.customisation.themes.read")]
2828
public async Task<PagedData<ThemeResponse>> Get(
2929
[FromQuery] [Range(0, int.MaxValue)] int page,
3030
[FromQuery] [Range(1, 100)] int pageSize
@@ -53,7 +53,7 @@ [FromQuery] [Range(1, 100)] int pageSize
5353
}
5454

5555
[HttpGet("{id:int}")]
56-
[Authorize(Policy = "permissions:admin.system.theme.read")]
56+
[Authorize(Policy = "permissions:admin.system.customisation.themes.read")]
5757
public async Task<ThemeResponse> GetSingle([FromRoute] int id)
5858
{
5959
var theme = await ThemeRepository
@@ -67,7 +67,7 @@ public async Task<ThemeResponse> GetSingle([FromRoute] int id)
6767
}
6868

6969
[HttpPost]
70-
[Authorize(Policy = "permissions:admin.system.theme.write")]
70+
[Authorize(Policy = "permissions:admin.system.customisation.themes.write")]
7171
public async Task<ThemeResponse> Create([FromBody] CreateThemeRequest request)
7272
{
7373
var theme = ThemeMapper.ToTheme(request);
@@ -78,7 +78,7 @@ public async Task<ThemeResponse> Create([FromBody] CreateThemeRequest request)
7878
}
7979

8080
[HttpPatch("{id:int}")]
81-
[Authorize(Policy = "permissions:admin.system.theme.write")]
81+
[Authorize(Policy = "permissions:admin.system.customisation.themes.write")]
8282
public async Task<ThemeResponse> Update([FromRoute] int id, [FromBody] UpdateThemeRequest request)
8383
{
8484
var theme = await ThemeRepository
@@ -112,8 +112,8 @@ await ThemeRepository.RunTransaction(set =>
112112
return ThemeMapper.ToResponse(theme);
113113
}
114114

115-
[HttpPost("{id:int}")]
116-
[Authorize(Policy = "permissions:admin.system.theme.write")]
115+
[HttpDelete("{id:int}")]
116+
[Authorize(Policy = "permissions:admin.system.customisation.themes.write")]
117117
public async Task Delete([FromRoute] int id)
118118
{
119119
var theme = await ThemeRepository
Lines changed: 43 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,56 @@
11
using MoonCore.Attributes;
2+
using MoonCore.Helpers;
3+
using MoonCore.Models;
4+
using Moonlight.Shared.Http.Requests.Admin.Sys.Theme;
5+
using Moonlight.Shared.Http.Responses.Admin;
26
using Moonlight.Shared.Misc;
37

48
namespace Moonlight.Client.Services;
59

6-
[Singleton]
10+
[Scoped]
711
public class ThemeService
812
{
9-
public event Func<Task> OnRefresh;
10-
11-
public Dictionary<string, string> Variables { get; private set; } = new();
12-
13-
public ThemeService(FrontendConfiguration configuration)
13+
private readonly HttpApiClient ApiClient;
14+
15+
public ThemeService(HttpApiClient apiClient)
16+
{
17+
ApiClient = apiClient;
18+
}
19+
20+
public async Task<PagedData<ThemeResponse>> Get(int page, int pageSize)
21+
{
22+
return await ApiClient.GetJson<PagedData<ThemeResponse>>(
23+
$"api/admin/system/customisation/themes?page={page}&pageSize={pageSize}"
24+
);
25+
}
26+
27+
public async Task<ThemeResponse> Get(int id)
28+
{
29+
return await ApiClient.GetJson<ThemeResponse>(
30+
$"api/admin/system/customisation/themes/{id}"
31+
);
32+
}
33+
34+
public async Task<ThemeResponse> Create(CreateThemeRequest request)
35+
{
36+
return await ApiClient.PostJson<ThemeResponse>(
37+
"api/admin/system/customisation/themes",
38+
request
39+
);
40+
}
41+
42+
public async Task<ThemeResponse> Update(int id, UpdateThemeRequest request)
1443
{
15-
// Load theme variables into the cache
16-
foreach (var themeVariable in configuration.Theme.Variables)
17-
Variables[themeVariable.Key] = themeVariable.Value;
44+
return await ApiClient.PatchJson<ThemeResponse>(
45+
$"api/admin/system/customisation/themes/{id}",
46+
request
47+
);
1848
}
1949

20-
public async Task Refresh()
50+
public async Task Delete(int id)
2151
{
22-
if (OnRefresh != null)
23-
await OnRefresh.Invoke();
52+
await ApiClient.Delete(
53+
$"api/admin/system/customisation/themes/{id}"
54+
);
2455
}
2556
}
Lines changed: 24 additions & 89 deletions
Original file line numberDiff line numberDiff line change
@@ -1,197 +1,132 @@
1-
@page "/admin/system/theme"
2-
3-
@using Microsoft.AspNetCore.Authorization
4-
@using Moonlight.Client.UI.Components
51
@using Moonlight.Shared.Misc
62

7-
@attribute [Authorize(Policy = "permissions:admin.system.theme")]
8-
9-
<NavTabs Index="1" Names="UiConstants.AdminNavNames" Links="UiConstants.AdminNavLinks"/>
10-
11-
<div class="mt-5 grid grid-cols-3 gap-3">
3+
<div class="grid grid-cols-3 gap-3">
124
<div class="col-span-1 flex flex-col gap-3">
135
<div class="card card-body flex-row grow-0 items-center p-1.5 text-base-content">
14-
<ColorSelector @bind-Value="ThemeData.ColorBackground"/>
6+
<ColorSelector @bind-Value="Theme.ColorBackground"/>
157
<span class="ms-1">Background</span>
168
</div>
179

1810
<div class="card card-body flex-row grow-0 items-center p-1.5 text-base-content">
19-
<ColorSelector @bind-Value="ThemeData.ColorBaseContent"/>
11+
<ColorSelector @bind-Value="Theme.ColorBaseContent"/>
2012
<span class="ms-1">Base Content</span>
2113
</div>
2214

2315
<div class="card card-body flex-row grow-0 items-center p-1.5 text-base-content">
24-
<ColorSelector @bind-Value="ThemeData.ColorBase100"/>
16+
<ColorSelector @bind-Value="Theme.ColorBase100"/>
2517
<span class="ms-1">Base 100</span>
2618
</div>
2719

2820
<div class="card card-body flex-row grow-0 items-center p-1.5 text-base-content">
29-
<ColorSelector @bind-Value="ThemeData.ColorBase150"/>
21+
<ColorSelector @bind-Value="Theme.ColorBase150"/>
3022
<span class="ms-1">Base 150</span>
3123
</div>
3224

3325
<div class="card card-body flex-row grow-0 items-center p-1.5 text-base-content">
34-
<ColorSelector @bind-Value="ThemeData.ColorBase200"/>
26+
<ColorSelector @bind-Value="Theme.ColorBase200"/>
3527
<span class="ms-1">Base 200</span>
3628
</div>
3729

3830
<div class="card card-body flex-row grow-0 items-center p-1.5 text-base-content">
39-
<ColorSelector @bind-Value="ThemeData.ColorBase250"/>
31+
<ColorSelector @bind-Value="Theme.ColorBase250"/>
4032
<span class="ms-1">Base 250</span>
4133
</div>
4234

4335
<div class="card card-body flex-row grow-0 items-center p-1.5 text-base-content">
44-
<ColorSelector @bind-Value="ThemeData.ColorBase300"/>
36+
<ColorSelector @bind-Value="Theme.ColorBase300"/>
4537
<span class="ms-1">Base 300</span>
4638
</div>
4739
</div>
4840

4941
<div class="col-span-2 grid grid-cols-2 gap-3">
5042
<div class="col-span-1 flex flex-col gap-y-3">
5143
<div class="card card-body flex-row grow-0 items-center p-1.5 text-base-content">
52-
<ColorSelector @bind-Value="ThemeData.ColorPrimary"/>
44+
<ColorSelector @bind-Value="Theme.ColorPrimary"/>
5345
<span class="ms-1">Primary</span>
5446
</div>
5547

5648
<div class="card card-body flex-row grow-0 items-center p-1.5 text-base-content">
57-
<ColorSelector Icon="icon-type" @bind-Value="ThemeData.ColorPrimaryContent"/>
49+
<ColorSelector Icon="icon-type" @bind-Value="Theme.ColorPrimaryContent"/>
5850
<span class="ms-1">Primary Content</span>
5951
</div>
6052
</div>
6153

6254
<div class="col-span-1 flex flex-col gap-y-3">
6355
<div class="card card-body flex-row grow-0 items-center p-1.5 text-base-content">
64-
<ColorSelector @bind-Value="ThemeData.ColorSecondary"/>
56+
<ColorSelector @bind-Value="Theme.ColorSecondary"/>
6557
<span class="ms-1">Secondary</span>
6658
</div>
6759

6860
<div class="card card-body flex-row grow-0 items-center p-1.5 text-base-content">
69-
<ColorSelector Icon="icon-type" @bind-Value="ThemeData.ColorSecondaryContent"/>
61+
<ColorSelector Icon="icon-type" @bind-Value="Theme.ColorSecondaryContent"/>
7062
<span class="ms-1">Secondary Content</span>
7163
</div>
7264
</div>
7365

7466
<div class="col-span-1 flex flex-col gap-y-3">
7567
<div class="card card-body flex-row grow-0 items-center p-1.5 text-base-content">
76-
<ColorSelector @bind-Value="ThemeData.ColorAccent"/>
68+
<ColorSelector @bind-Value="Theme.ColorAccent"/>
7769
<span class="ms-1">Accent</span>
7870
</div>
7971

8072
<div class="card card-body flex-row grow-0 items-center p-1.5 text-base-content">
81-
<ColorSelector Icon="icon-type" @bind-Value="ThemeData.ColorAccentContent"/>
73+
<ColorSelector Icon="icon-type" @bind-Value="Theme.ColorAccentContent"/>
8274
<span class="ms-1">Accent Content</span>
8375
</div>
8476
</div>
8577

8678
<div class="col-span-1 flex flex-col gap-y-3">
8779
<div class="card card-body flex-row grow-0 items-center p-1.5 text-base-content">
88-
<ColorSelector @bind-Value="ThemeData.ColorInfo"/>
80+
<ColorSelector @bind-Value="Theme.ColorInfo"/>
8981
<span class="ms-1">Info</span>
9082
</div>
9183

9284
<div class="card card-body flex-row grow-0 items-center p-1.5 text-base-content">
93-
<ColorSelector Icon="icon-type" @bind-Value="ThemeData.ColorInfoContent"/>
85+
<ColorSelector Icon="icon-type" @bind-Value="Theme.ColorInfoContent"/>
9486
<span class="ms-1">Info Content</span>
9587
</div>
9688
</div>
9789

9890
<div class="col-span-1 flex flex-col gap-y-3">
9991
<div class="card card-body flex-row grow-0 items-center p-1.5 text-base-content">
100-
<ColorSelector @bind-Value="ThemeData.ColorSuccess"/>
92+
<ColorSelector @bind-Value="Theme.ColorSuccess"/>
10193
<span class="ms-1">Success</span>
10294
</div>
10395

10496
<div class="card card-body flex-row grow-0 items-center p-1.5 text-base-content">
105-
<ColorSelector Icon="icon-type" @bind-Value="ThemeData.ColorSuccessContent"/>
97+
<ColorSelector Icon="icon-type" @bind-Value="Theme.ColorSuccessContent"/>
10698
<span class="ms-1">Success Content</span>
10799
</div>
108100
</div>
109101

110102
<div class="col-span-1 flex flex-col gap-y-3">
111103
<div class="card card-body flex-row grow-0 items-center p-1.5 text-base-content">
112-
<ColorSelector @bind-Value="ThemeData.ColorWarning"/>
104+
<ColorSelector @bind-Value="Theme.ColorWarning"/>
113105
<span class="ms-1">Warning</span>
114106
</div>
115107

116108
<div class="card card-body flex-row grow-0 items-center p-1.5 text-base-content">
117-
<ColorSelector Icon="icon-type" @bind-Value="ThemeData.ColorWarningContent"/>
109+
<ColorSelector Icon="icon-type" @bind-Value="Theme.ColorWarningContent"/>
118110
<span class="ms-1">Warning Content</span>
119111
</div>
120112
</div>
121113

122114
<div class="col-span-1 flex flex-col gap-y-3">
123115
<div class="card card-body flex-row grow-0 items-center p-1.5 text-base-content">
124-
<ColorSelector @bind-Value="ThemeData.ColorError"/>
116+
<ColorSelector @bind-Value="Theme.ColorError"/>
125117
<span class="ms-1">Error</span>
126118
</div>
127119

128120
<div class="card card-body flex-row grow-0 items-center p-1.5 text-base-content">
129-
<ColorSelector Icon="icon-type" @bind-Value="ThemeData.ColorErrorContent"/>
121+
<ColorSelector Icon="icon-type" @bind-Value="Theme.ColorErrorContent"/>
130122
<span class="ms-1">Error Content</span>
131123
</div>
132124
</div>
133125
</div>
134126
</div>
135127

136128

137-
138129
@code
139130
{
140-
private ApplicationTheme ThemeData;
141-
142-
protected override void OnInitialized()
143-
{
144-
ThemeData = CreateDefault();
145-
}
146-
147-
private ApplicationTheme CreateDefault()
148-
{
149-
return new ApplicationTheme()
150-
{
151-
ColorBackground = "#0c0f18",
152-
153-
ColorBase100 = "#1e2b47",
154-
ColorBase150 = "#1a2640",
155-
ColorBase200 = "#101a2e",
156-
ColorBase250 = "#0f1729",
157-
ColorBase300 = "#0c1221",
158-
159-
ColorBaseContent = "#dde5f5",
160-
161-
ColorPrimary = "#4f39f6",
162-
ColorPrimaryContent = "#dde5f5",
163-
164-
ColorSecondary = "#354052",
165-
ColorSecondaryContent = "#dde5f5",
166-
167-
ColorAccent = "#ad46ff",
168-
ColorAccentContent = "#dde5f5",
169-
170-
ColorNeutral = "#dde5f5",
171-
ColorNeutralContent = "#09090b",
172-
173-
ColorInfo = "#155dfc",
174-
ColorInfoContent = "#dde5f5",
175-
176-
ColorSuccess = "#00a63e",
177-
ColorSuccessContent = "#dde5f5",
178-
179-
ColorWarning = "#ffba00",
180-
ColorWarningContent = "#dde5f5",
181-
182-
ColorError = "#ec003f",
183-
ColorErrorContent = "#dde5f5",
184-
185-
RadiusSelector = 0.25f,
186-
RadiusField = 0.5f,
187-
RadiusBox = 0.5f,
188-
189-
SizeSelector = 0.25f,
190-
SizeField = 0.25f,
191-
192-
Border = 1f,
193-
Depth = 0f,
194-
Noise = 0f
195-
};
196-
}
197-
}
131+
[Parameter] public ApplicationTheme Theme { get; set; }
132+
}

0 commit comments

Comments
 (0)