Skip to content

Commit be0c452

Browse files
renemadsenclaude
andcommitted
Wire ThemeVariant through API and frontend state
Threads the new EformUser.ThemeVariant field through host API models (UserSettingsModel, UserInfoViewModel) and services (AccountService, AdminService), and adds matching fields/actions/selectors to the Angular auth state. No UI yet — SCSS tokens and picker come next. Also bumps Microting.eFormApi.BasePn to 10.0.18 and Microting.EformAngularFrontendBase to 10.0.22 to pick up the new property and DB migration. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1 parent 6e6bc69 commit be0c452

10 files changed

Lines changed: 33 additions & 2 deletions

File tree

eFormAPI/eFormAPI.Web/Infrastructure/Models/Settings/User/UserSettingsModel.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ public class UserSettingsModel
2828
public string Locale { get; set; }
2929
public int LanguageId { get; set; }
3030
public bool DarkTheme { get; set; }
31+
public string ThemeVariant { get; set; }
3132
public string Formats { get; set; }
3233
public string TimeZone { get; set; }
3334
public string LoginRedirectUrl { get; set; }

eFormAPI/eFormAPI.Web/Infrastructure/Models/Users/UserInfoViewModel.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ public class UserInfoViewModel
4040
public string Formats { get; set; }
4141
public string TimeZone { get; set; }
4242
public bool DarkTheme { get; set; }
43+
public string ThemeVariant { get; set; }
4344
public bool IsDeviceUser { get; set; }
4445
public string ArchiveSoftwareVersion { get; set; }
4546
public string ArchiveModel { get; set; }

eFormAPI/eFormAPI.Web/Services/AccountService.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,7 @@ public async Task<OperationDataResult<UserSettingsModel>> GetUserSettings()
101101
var timeZone = string.IsNullOrEmpty(user.TimeZone) ? "Europe/Copenhagen" : user.TimeZone;
102102
var formats = string.IsNullOrEmpty(user.Formats) ? "de-DE" : user.Formats;
103103
var darkTheme = user.DarkTheme;
104+
var themeVariant = string.IsNullOrEmpty(user.ThemeVariant) ? "eform" : user.ThemeVariant;
104105
var locale = string.IsNullOrEmpty(user.Locale) ? "da" : user.Locale;
105106
var core = await coreHelper.GetCore();
106107
var dbContextHelper = core.DbContextHelper;
@@ -121,6 +122,7 @@ public async Task<OperationDataResult<UserSettingsModel>> GetUserSettings()
121122
Locale = locale,
122123
LanguageId = languageId,
123124
DarkTheme = darkTheme,
125+
ThemeVariant = themeVariant,
124126
Formats = formats,
125127
TimeZone = timeZone,
126128
LoginRedirectUrl = securityGroupRedirectLink,
@@ -158,6 +160,10 @@ public async Task<OperationResult> UpdateUserSettings(UserSettingsModel model)
158160
user.TimeZone = model.TimeZone;
159161
user.Formats = model.Formats;
160162
user.DarkTheme = model.DarkTheme;
163+
if (!string.IsNullOrEmpty(model.ThemeVariant))
164+
{
165+
user.ThemeVariant = model.ThemeVariant;
166+
}
161167
var updateResult = await userManager.UpdateAsync(user);
162168
if (!updateResult.Succeeded)
163169
{

eFormAPI/eFormAPI.Web/Services/AdminService.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,7 @@ public async Task<OperationDataResult<Paged<UserInfoViewModel>>> Index(UserInfoR
8383
x.user.TimeZone,
8484
x.user.Formats,
8585
x.user.DarkTheme,
86+
x.user.ThemeVariant,
8687
x.user.ArchiveModel,
8788
x.user.ArchiveManufacturer,
8889
x.user.ArchiveOsVersion,
@@ -116,6 +117,7 @@ public async Task<OperationDataResult<Paged<UserInfoViewModel>>> Index(UserInfoR
116117
UserName = x.UserName,
117118
Email = x.Email,
118119
DarkTheme = x.DarkTheme,
120+
ThemeVariant = x.ThemeVariant,
119121
Language = x.Locale,
120122
TimeZone = x.TimeZone,
121123
Formats = x.Formats,

eFormAPI/eFormAPI.Web/eFormAPI.Web.csproj

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,8 +56,8 @@
5656
<PackageReference Include="Microsoft.EntityFrameworkCore.InMemory" Version="10.0.5" />
5757
<PackageReference Include="Microsoft.Extensions.PlatformAbstractions" Version="1.1.0" />
5858
<PackageReference Include="Microting.eForm" Version="10.0.17" />
59-
<PackageReference Include="Microting.EformAngularFrontendBase" Version="10.0.21" />
60-
<PackageReference Include="Microting.eFormApi.BasePn" Version="10.0.17" />
59+
<PackageReference Include="Microting.EformAngularFrontendBase" Version="10.0.22" />
60+
<PackageReference Include="Microting.eFormApi.BasePn" Version="10.0.18" />
6161
<PackageReference Include="PureOtp" Version="1.0.0.1" />
6262
<PackageReference Include="Sentry" Version="6.3.1" />
6363
<PackageReference Include="Swashbuckle.AspNetCore" Version="10.1.7" />

eform-client/src/app/common/models/settings/user-settings.model.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ export class UserSettingsModel {
33
formats: string;
44
timeZone: string;
55
darkTheme: boolean;
6+
themeVariant: string;
67
loginRedirectUrl: string;
78
languageId: number;
89
profilePicture: string;

eform-client/src/app/common/models/user/user-info-model.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ export class UserInfoModel {
88
fullName: string;
99
role: string;
1010
darkTheme: boolean;
11+
themeVariant?: string;
1112
isDeviceUser: boolean;
1213
language: string;
1314
timeZone: string;
@@ -36,6 +37,7 @@ export class UserInfoModel {
3637
this.fullName = data.fullName;
3738
this.role = data.role;
3839
this.darkTheme = data.darkTheme;
40+
this.themeVariant = data.themeVariant;
3941
this.isDeviceUser = data.isDeviceUser;
4042
this.language = data.language;
4143
this.timeZone = data.timeZone;

eform-client/src/app/state/auth/auth.actions.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,11 @@ export const updateDarkTheme = createAction(
3131
(payload: boolean) => ({payload})
3232
);
3333

34+
export const updateThemeVariant = createAction(
35+
'[Auth] Update Theme Variant',
36+
(payload: string) => ({payload})
37+
);
38+
3439
export const updateUserInfo = createAction(
3540
'[Auth] Update User Info',
3641
(payload: { userSettings: OperationDataResult<UserSettingsModel>, userClaims: UserClaimsModel }) => ({payload})

eform-client/src/app/state/auth/auth.recuder.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import {
77
loadAuthSuccess, logout,
88
refreshToken,
99
updateCurrentUserLocaleAndDarkTheme, updateDarkTheme, updateSideMenuOpened,
10+
updateThemeVariant,
1011
updateUserInfo, updateUserLocale
1112
} from './';
1213
import {StoreStatusEnum} from 'src/app/common/const';
@@ -21,6 +22,7 @@ export interface AuthCurrentUser {
2122
locale?: string;
2223
languageId?: number;
2324
darkTheme?: boolean;
25+
themeVariant?: string;
2426
loginRedirectUrl?: string;
2527
claims?: UserClaimsModel;
2628
isFirstUser: boolean,
@@ -61,6 +63,7 @@ export const authInitialState: AuthState = {
6163
locale: 'da', // TODO add env for test run
6264
languageId: 0,
6365
darkTheme: false,
66+
themeVariant: 'eform',
6467
loginRedirectUrl: '',
6568
isFirstUser: false,
6669
avatarUrl: '',
@@ -158,6 +161,7 @@ const _authReducer = createReducer(
158161
currentUser: {
159162
...state.currentUser,
160163
darkTheme: payload.userSettings.model.darkTheme,
164+
themeVariant: payload.userSettings.model.themeVariant || 'eform',
161165
locale: payload.userSettings.model.locale,
162166
loginRedirectUrl: payload.userSettings.model.loginRedirectUrl || '',
163167
claims: payload.userClaims,
@@ -209,6 +213,13 @@ const _authReducer = createReducer(
209213
darkTheme: payload
210214
}
211215
})),
216+
on(updateThemeVariant, (state, {payload}) => ({
217+
...state,
218+
currentUser: {
219+
...state.currentUser,
220+
themeVariant: payload
221+
}
222+
})),
212223
);
213224

214225
export function authReducer(state: AuthState | undefined, action: any) {

eform-client/src/app/state/auth/auth.selector.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,8 @@ export const selectSideMenuOpened
3232
= createSelector(selectAuth, (state: AuthState) => state.sideMenuOpened);
3333
export const selectIsDarkMode
3434
= createSelector(selectAuthUser, (state) => state.darkTheme);
35+
export const selectThemeVariant
36+
= createSelector(selectAuthUser, (state) => state.themeVariant || 'eform');
3537
export const selectCurrentUserLocale
3638
= createSelector(selectAuthUser, (state) => state.locale);
3739
export const selectCurrentUserLanguageId

0 commit comments

Comments
 (0)