Skip to content

Commit 805c464

Browse files
renemadsenclaude
andcommitted
wip: in-progress eform theme work + ThemeVariant plumbing pre-consolidation
Snapshot before starting M3 token consolidation on a fresh branch. Includes: - Backend ThemeVariant plumbing (AppearanceSettings POCO, Program.cs seeding, CmsService + SettingsService read/write, AdminSettingsModel + CmsPublicConfigModel fields). - Frontend state plumbing (cms actions/effects/reducer/selectors with themeVariant, models, app.component.ts theme-class subscription). - Admin settings theme picker UI (cards at the bottom of the page). - In-progress eform parity SCSS (token additions, dropdown/nav/button pixel-match work) — superseded by the consolidation branch but kept cherry-pickable. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1 parent 3dfcd7a commit 805c464

23 files changed

Lines changed: 286 additions & 36 deletions

File tree

eFormAPI/eFormAPI.Web/Infrastructure/Models/Cms/CmsPublicConfigModel.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,4 +24,5 @@ public class CmsPublicConfigModel
2424
{
2525
public bool IsCmsEnabled { get; set; }
2626
public bool IsMenuSticky { get; set; }
27+
public string ThemeVariant { get; set; } = "eform";
2728
}

eFormAPI/eFormAPI.Web/Infrastructure/Models/Settings/Admin/AdminSettingsModel.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,4 +34,5 @@ public class AdminSettingsModel
3434
public SendGridSettingsModel SendGridSettingsModel { get; set; }
3535
public string SiteLink { get; set; }
3636
public string AssemblyVersion { get; set; }
37+
public string ThemeVariant { get; set; } = "eform";
3738
}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
namespace eFormAPI.Web.Infrastructure.Models.Settings.Admin;
2+
3+
public class AppearanceSettings
4+
{
5+
public string ThemeVariant { get; set; } = "eform";
6+
}

eFormAPI/eFormAPI.Web/Program.cs

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -272,6 +272,30 @@ public static void MigrateDb(IHost host)
272272
var logger = scope.ServiceProvider.GetRequiredService<ILogger<Program>>();
273273
logger.LogError(e, "Error while adding missing admin settings to all menu items");
274274
}
275+
276+
try
277+
{
278+
var connectionStrings =
279+
scope.ServiceProvider.GetRequiredService<IOptions<ConnectionStrings>>();
280+
if (connectionStrings.Value.DefaultConnection != "...")
281+
{
282+
const string key = "AppearanceSettings:ThemeVariant";
283+
if (!dbContext.ConfigurationValues.Any(x => x.Id == key))
284+
{
285+
dbContext.ConfigurationValues.Add(new Microting.EformAngularFrontendBase.Infrastructure.Data.Entities.EformConfigurationValue
286+
{
287+
Id = key,
288+
Value = "eform"
289+
});
290+
dbContext.SaveChanges();
291+
}
292+
}
293+
}
294+
catch (Exception e)
295+
{
296+
var logger = scope.ServiceProvider.GetRequiredService<ILogger<Program>>();
297+
logger.LogError(e, "Error while seeding AppearanceSettings:ThemeVariant");
298+
}
275299
}
276300
}
277301

eFormAPI/eFormAPI.Web/Services/CmsService.cs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,9 @@ namespace eFormAPI.Web.Services;
2525
using System.Linq;
2626
using System.Threading.Tasks;
2727
using Abstractions;
28+
using Hosting.Helpers.DbOptions;
2829
using Infrastructure.Models.Cms;
30+
using Infrastructure.Models.Settings.Admin;
2931
using Microsoft.EntityFrameworkCore;
3032
using Microsoft.Extensions.Logging;
3133
using Microting.EformAngularFrontendBase.Infrastructure.Data;
@@ -34,6 +36,7 @@ namespace eFormAPI.Web.Services;
3436

3537
public class CmsService(
3638
ILogger<CmsService> logger,
39+
IDbOptions<AppearanceSettings> appearanceSettings,
3740
BaseDbContext dbContext) : ICmsService
3841
{
3942
// ── Pages ────────────────────────────────────────────────────────────────
@@ -351,7 +354,10 @@ public async Task<OperationDataResult<CmsPublicConfigModel>> GetPublicConfig()
351354
return new OperationDataResult<CmsPublicConfigModel>(true, new CmsPublicConfigModel
352355
{
353356
IsCmsEnabled = settings?.IsCmsEnabled ?? false,
354-
IsMenuSticky = settings?.IsMenuSticky ?? false
357+
IsMenuSticky = settings?.IsMenuSticky ?? false,
358+
ThemeVariant = string.IsNullOrEmpty(appearanceSettings.Value.ThemeVariant)
359+
? "eform"
360+
: appearanceSettings.Value.ThemeVariant
355361
});
356362
}
357363
catch (Exception ex)

eFormAPI/eFormAPI.Web/Services/SettingsService.cs

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ public class SettingsService(
6060
IDbOptions<ApplicationSettings> applicationSettings,
6161
IDbOptions<LoginPageSettings> loginPageSettings,
6262
IDbOptions<HeaderSettings> headerSettings,
63+
IDbOptions<AppearanceSettings> appearanceSettings,
6364
IDbOptions<EmailSettings> emailSettings,
6465
IEFormCoreService coreHelper,
6566
ILocalizationService localizationService,
@@ -435,7 +436,10 @@ public async Task<OperationDataResult<AdminSettingsModel>> GetAdminSettings()
435436
HttpServerAddress = await core.GetSdkSetting(Settings.httpServerAddress)
436437
},
437438
SiteLink = await core.GetSdkSetting(Settings.httpServerAddress),
438-
AssemblyVersion = Assembly.GetExecutingAssembly().GetName().Version.ToString()
439+
AssemblyVersion = Assembly.GetExecutingAssembly().GetName().Version.ToString(),
440+
ThemeVariant = string.IsNullOrEmpty(appearanceSettings.Value.ThemeVariant)
441+
? "eform"
442+
: appearanceSettings.Value.ThemeVariant
439443
};
440444
return new OperationDataResult<AdminSettingsModel>(true, model);
441445
}
@@ -497,6 +501,14 @@ await loginPageSettings.UpdateDb(option =>
497501
await core.SetSdkSetting(Settings.httpServerAddress, adminSettingsModel.SiteLink);
498502
}
499503

504+
if (!string.IsNullOrEmpty(adminSettingsModel.ThemeVariant))
505+
{
506+
await appearanceSettings.UpdateDb(option =>
507+
{
508+
option.ThemeVariant = adminSettingsModel.ThemeVariant;
509+
}, dbContext);
510+
}
511+
500512
// if (adminSettingsModel.SwiftSettingsModel != null)
501513
// {
502514
// await core.SetSdkSetting(

eFormAPI/eFormAPI.Web/Startup.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -241,6 +241,8 @@ public void ConfigureServices(IServiceCollection services)
241241
services.ConfigureDbOptions<EmailSettings>(Configuration.GetSection("EmailSettings"));
242242
services.ConfigureDbOptions<LoginPageSettings>(Configuration.GetSection("LoginPageSettings"));
243243
services.ConfigureDbOptions<HeaderSettings>(Configuration.GetSection("HeaderSettings"));
244+
services.ConfigureDbOptions<eFormAPI.Web.Infrastructure.Models.Settings.Admin.AppearanceSettings>(
245+
Configuration.GetSection("AppearanceSettings"));
244246
var configurationSection = Configuration.GetSection("ConnectionStringsSdk");
245247
if (Configuration.MyConnectionString().Contains("127.0.0.1"))
246248
{

eform-client/src/app/common/models/cms/cms.models.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
export interface CmsPublicConfigModel {
22
isCmsEnabled: boolean;
33
isMenuSticky: boolean;
4+
themeVariant?: 'eform' | 'workspace';
45
}
56

67
export interface CmsMenuItemModel {

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ export class AdminSettingsModel {
1818
sdkSettingsModel: SdkSettingsModel;
1919
siteLink: string;
2020
assemblyVersion: string;
21+
themeVariant: 'eform' | 'workspace' = 'eform';
2122

2223
constructor() {
2324
this.loginPageSettingsModel = new LoginPageSettingsModel();

eform-client/src/app/components/app.component.ts

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { Component, OnDestroy, OnInit, inject } from '@angular/core';
1+
import { Component, OnDestroy, OnInit, Renderer2, inject } from '@angular/core';
22
import {Title} from '@angular/platform-browser';
33
import {AuthService, TitleService, UserSettingsService} from 'src/app/common/services';
44
import {Router} from '@angular/router';
@@ -9,6 +9,7 @@ import {
99
AuthSyncStorageService,
1010
updateUserInfo,
1111
} from 'src/app/state';
12+
import {loadCmsConfig, selectCmsThemeVariant} from 'src/app/state/cms';
1213
import {AuthStateService} from 'src/app/common/store';
1314
import {TranslateService} from '@ngx-translate/core';
1415

@@ -27,11 +28,17 @@ export class AppComponent implements OnInit, OnDestroy {
2728
private ngTitle = inject(Title);
2829
private titleService = inject(TitleService);
2930
private authSyncStorageService = inject(AuthSyncStorageService);
31+
private renderer = inject(Renderer2);
3032

3133
public selectIsAuth$ = this.authStore.select(selectAuthIsAuth);
34+
private selectCmsThemeVariant$ = this.authStore.select(selectCmsThemeVariant);
3235

3336
ngOnInit(): void {
3437
this.authSyncStorageService.init();
38+
this.authStore.dispatch(loadCmsConfig());
39+
this.selectCmsThemeVariant$.subscribe((variant) => {
40+
this.applyThemeVariant(variant ?? 'eform');
41+
});
3542
this.selectIsAuth$.pipe(debounceTime(1000), take(1)).subscribe((isAuth) => {
3643
if (isAuth) {
3744
zip(this.userSettings.getUserSettings(), this.service.obtainUserClaims())
@@ -70,6 +77,13 @@ export class AppComponent implements OnInit, OnDestroy {
7077
});
7178
}
7279

80+
private applyThemeVariant(variant: 'eform' | 'workspace') {
81+
const body = document.body;
82+
this.renderer.removeClass(body, 'theme-eform');
83+
this.renderer.removeClass(body, 'theme-workspace');
84+
this.renderer.addClass(body, `theme-${variant}`);
85+
}
86+
7387
ngOnDestroy(): void {
7488
}
7589
}

0 commit comments

Comments
 (0)