Files
portmaster/desktop/angular/src/app/app.module.ts
2025-04-17 17:06:06 +03:00

237 lines
8.9 KiB
TypeScript

import { DragDropModule } from '@angular/cdk/drag-drop';
import { OverlayModule } from '@angular/cdk/overlay';
import { PortalModule } from '@angular/cdk/portal';
import { ScrollingModule } from '@angular/cdk/scrolling';
import { CdkTableModule } from '@angular/cdk/table';
import { CommonModule, registerLocaleData } from '@angular/common';
import { APP_INITIALIZER, LOCALE_ID, NgModule } from '@angular/core';
import { FormsModule, ReactiveFormsModule } from '@angular/forms';
import { BrowserModule } from '@angular/platform-browser';
import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
import { FaIconLibrary, FontAwesomeModule } from '@fortawesome/angular-fontawesome';
import { faGithub } from '@fortawesome/free-brands-svg-icons';
import { far } from '@fortawesome/free-regular-svg-icons';
import { fas } from '@fortawesome/free-solid-svg-icons';
import { ConfigService, PortmasterAPIModule, StringSetting, getActualValue } from '@safing/portmaster-api';
import { OverlayStepperModule, SfngAccordionModule, SfngDialogModule, SfngDropDownModule, SfngPaginationModule, SfngSelectModule, SfngTipUpModule, SfngToggleSwitchModule, SfngTooltipModule, TabModule, UiModule } from '@safing/ui';
import MyYamlFile from 'js-yaml-loader!../i18n/helptexts.yaml';
import * as i18n from 'ng-zorro-antd/i18n';
import { MarkdownModule } from 'ngx-markdown';
import { firstValueFrom } from 'rxjs';
import { environment } from 'src/environments/environment';
import { AppRoutingModule } from './app-routing.module';
import { AppComponent } from './app.component';
import { IntroModule } from './intro';
import { NavigationComponent } from './layout/navigation/navigation';
import { SideDashComponent } from './layout/side-dash/side-dash';
import { AppOverviewComponent, AppViewComponent, QuickSettingInternetButtonComponent } from './pages/app-view';
import { QsHistoryComponent } from './pages/app-view/qs-history/qs-history.component';
import { QuickSettingSelectExitButtonComponent } from './pages/app-view/qs-select-exit/qs-select-exit';
import { QuickSettingUseSPNButtonComponent } from './pages/app-view/qs-use-spn/qs-use-spn';
import { DashboardPageComponent } from './pages/dashboard/dashboard.component';
import { FeatureCardComponent } from './pages/dashboard/feature-card/feature-card.component';
import { MonitorPageComponent } from './pages/monitor';
import { SettingsComponent } from './pages/settings/settings';
import { SPNModule } from './pages/spn/spn.module';
import { SupportPageComponent } from './pages/support';
import { SupportFormComponent } from './pages/support/form';
import { NotificationsService } from './services';
import { ActionIndicatorModule } from './shared/action-indicator';
import { SfngAppIconModule } from './shared/app-icon';
import { ConfigModule } from './shared/config';
import { CountIndicatorModule } from './shared/count-indicator';
import { CountryFlagModule } from './shared/country-flag';
import { EditProfileDialog } from './shared/edit-profile-dialog';
import { ExitScreenComponent } from './shared/exit-screen/exit-screen';
import { ExpertiseModule } from './shared/expertise/expertise.module';
import { ExternalLinkDirective } from './shared/external-link.directive';
import { FeatureScoutComponent } from './shared/feature-scout';
import { SfngFocusModule } from './shared/focus';
import { FuzzySearchPipe } from './shared/fuzzySearch';
import { LoadingComponent } from './shared/loading';
import { SfngMenuModule } from './shared/menu';
import { SfngMultiSwitchModule } from './shared/multi-switch';
import { NetqueryModule } from './shared/netquery';
import { NetworkScoutComponent } from './shared/network-scout';
import { NotificationListComponent } from './shared/notification-list/notification-list.component';
import { NotificationComponent } from './shared/notification/notification';
import { CommonPipesModule } from './shared/pipes';
import { ProcessDetailsDialogComponent } from './shared/process-details-dialog';
import { PromptListComponent } from './shared/prompt-list/prompt-list.component';
import { SecurityLockComponent } from './shared/security-lock';
import { SPNAccountDetailsComponent } from './shared/spn-account-details';
import { SPNLoginComponent } from './shared/spn-login';
import { SPNStatusComponent } from './shared/spn-status';
import { PlaceholderComponent } from './shared/text-placeholder';
import { DashboardWidgetComponent } from './pages/dashboard/dashboard-widget/dashboard-widget.component';
import { MergeProfileDialogComponent } from './pages/app-view/merge-profile-dialog/merge-profile-dialog.component';
import { AppInsightsComponent } from './pages/app-view/app-insights/app-insights.component';
import { INTEGRATION_SERVICE, integrationServiceFactory } from './integration';
import { SupportProgressDialogComponent } from './pages/support/progress-dialog';
function loadAndSetLocaleInitializer(configService: ConfigService) {
return async function () {
let angularLocaleID = 'en-GB';
let nzLocaleID: string = 'en_GB';
try {
const setting = await firstValueFrom(configService.get("core/locale"))
const currentValue = getActualValue(setting as StringSetting);
switch (currentValue) {
case 'en-US':
angularLocaleID = 'en-US'
nzLocaleID = 'en_US'
break;
case 'en-GB':
angularLocaleID = 'en-GB'
nzLocaleID = 'en_GB'
break;
default:
console.error(`Unsupported locale value: ${currentValue}, defaulting to en-GB`)
}
} catch (err) {
console.error(`failed to get locale setting, using default en-GB:`, err)
}
try {
// Get name of module.
let localeModuleID = angularLocaleID;
if (localeModuleID == "en-US") {
localeModuleID = "en";
}
/* webpackInclude: /(en|en-GB)\.mjs$/ */
/* webpackChunkName: "./l10n-base/[request]"*/
await import(`../../node_modules/@angular/common/locales/${localeModuleID}.mjs`)
.then(locale => {
registerLocaleData(locale.default)
localeConfig.localeId = angularLocaleID;
localeConfig.nzLocale = (i18n as any)[nzLocaleID];
})
} catch (err) {
console.error(`failed to load locale module for ${angularLocaleID}:`, err)
}
}
}
const localeConfig = {
nzLocale: i18n.en_GB,
localeId: 'en-GB'
}
@NgModule({
declarations: [
AppComponent,
NotificationComponent,
SettingsComponent,
MonitorPageComponent,
SideDashComponent,
NavigationComponent,
NotificationListComponent,
PromptListComponent,
FuzzySearchPipe,
AppViewComponent,
QuickSettingInternetButtonComponent,
QuickSettingUseSPNButtonComponent,
QuickSettingSelectExitButtonComponent,
AppOverviewComponent,
PlaceholderComponent,
LoadingComponent,
ExternalLinkDirective,
ExitScreenComponent,
SupportPageComponent,
SupportFormComponent,
SecurityLockComponent,
SPNStatusComponent,
FeatureScoutComponent,
SPNLoginComponent,
SPNAccountDetailsComponent,
NetworkScoutComponent,
EditProfileDialog,
ProcessDetailsDialogComponent,
QsHistoryComponent,
DashboardPageComponent,
DashboardWidgetComponent,
FeatureCardComponent,
MergeProfileDialogComponent,
AppInsightsComponent,
SupportProgressDialogComponent
],
imports: [
BrowserModule,
CommonModule,
BrowserAnimationsModule,
FormsModule,
ReactiveFormsModule,
AppRoutingModule,
FontAwesomeModule,
OverlayModule,
PortalModule,
CdkTableModule,
DragDropModule,
MarkdownModule.forRoot(),
ScrollingModule,
SfngAccordionModule,
TabModule,
SfngTipUpModule.forRoot(MyYamlFile, NotificationsService),
SfngTooltipModule,
ActionIndicatorModule,
SfngDialogModule,
OverlayStepperModule,
IntroModule,
SfngDropDownModule,
SfngSelectModule,
SfngMultiSwitchModule,
SfngMenuModule,
SfngFocusModule,
SfngToggleSwitchModule,
SfngPaginationModule,
SfngAppIconModule,
ExpertiseModule,
ConfigModule,
CountryFlagModule,
CountIndicatorModule,
NetqueryModule,
CommonPipesModule,
UiModule,
SPNModule,
PortmasterAPIModule.forRoot({
httpAPI: environment.httpAPI,
websocketAPI: environment.portAPI,
}),
],
bootstrap: [AppComponent],
providers: [
{
provide: APP_INITIALIZER, useFactory: loadAndSetLocaleInitializer, deps: [ConfigService], multi: true
},
{
provide: i18n.NZ_I18N, useFactory: () => {
console.log("nz-locale is set to", localeConfig.nzLocale)
return localeConfig.nzLocale
}
},
{
provide: LOCALE_ID, useFactory: () => {
console.log("locale-id is set to", localeConfig.localeId)
return localeConfig.localeId
}
},
{
provide: INTEGRATION_SERVICE,
useFactory: integrationServiceFactory
}
]
})
export class AppModule {
constructor(library: FaIconLibrary) {
library.addIconPacks(fas, far);
library.addIcons(faGithub)
}
}