Browse Source

Add appearance option in settings

pull/1342/head
yksolanki9 3 years ago
parent
commit
f07e37de4a
  1. 6
      apps/api/src/app/user/update-user-setting.dto.ts
  2. 5
      apps/api/src/app/user/user.service.ts
  3. 14
      apps/client/src/app/app.component.ts
  4. 24
      apps/client/src/app/pages/account/account-page.html
  5. 3
      libs/common/src/lib/interfaces/user-settings.interface.ts
  6. 1
      libs/common/src/lib/types/appearance.type.ts
  7. 4
      libs/common/src/lib/types/index.ts
  8. 5
      prisma/migrations/20221009120121_added_appearance_column_to_settings_table/migration.sql
  9. 6
      prisma/schema.prisma

6
apps/api/src/app/user/update-user-setting.dto.ts

@ -1,4 +1,4 @@
import type { DateRange, ViewMode } from '@ghostfolio/common/types'; import type { Appearance, DateRange, ViewMode } from '@ghostfolio/common/types';
import { import {
IsBoolean, IsBoolean,
IsIn, IsIn,
@ -47,4 +47,8 @@ export class UpdateUserSettingDto {
@IsIn(<ViewMode[]>['DEFAULT', 'ZEN']) @IsIn(<ViewMode[]>['DEFAULT', 'ZEN'])
@IsOptional() @IsOptional()
viewMode?: ViewMode; viewMode?: ViewMode;
@IsIn(<Appearance[]>['AUTO', 'DARK', 'LIGHT'])
@IsOptional()
appearance?: Appearance;
} }

5
apps/api/src/app/user/user.service.ts

@ -154,6 +154,11 @@ export class UserService {
(user.Settings.settings as UserSettings).viewMode = 'DEFAULT'; (user.Settings.settings as UserSettings).viewMode = 'DEFAULT';
} }
// Set default appearance value to AUTO
if (!(user.Settings.settings as UserSettings).appearance) {
(user.Settings.settings as UserSettings).appearance = 'AUTO';
}
if (this.configurationService.get('ENABLE_FEATURE_SUBSCRIPTION')) { if (this.configurationService.get('ENABLE_FEATURE_SUBSCRIPTION')) {
user.subscription = user.subscription =
this.subscriptionService.getSubscription(Subscription); this.subscriptionService.getSubscription(Subscription);

14
apps/client/src/app/app.component.ts

@ -13,6 +13,7 @@ import {
} from '@ghostfolio/common/config'; } from '@ghostfolio/common/config';
import { InfoItem, User } from '@ghostfolio/common/interfaces'; import { InfoItem, User } from '@ghostfolio/common/interfaces';
import { hasPermission, permissions } from '@ghostfolio/common/permissions'; import { hasPermission, permissions } from '@ghostfolio/common/permissions';
import { Appearance } from '@ghostfolio/common/types';
import { MaterialCssVarsService } from 'angular-material-css-vars'; import { MaterialCssVarsService } from 'angular-material-css-vars';
import { DeviceDetectorService } from 'ngx-device-detector'; import { DeviceDetectorService } from 'ngx-device-detector';
import { Subject } from 'rxjs'; import { Subject } from 'rxjs';
@ -77,6 +78,8 @@ export class AppComponent implements OnDestroy, OnInit {
permissions.createUserAccount permissions.createUserAccount
); );
this.initializeTheme(this.user?.settings.appearance);
this.changeDetectorRef.markForCheck(); this.changeDetectorRef.markForCheck();
}); });
} }
@ -97,10 +100,13 @@ export class AppComponent implements OnDestroy, OnInit {
this.unsubscribeSubject.complete(); this.unsubscribeSubject.complete();
} }
private initializeTheme() { private initializeTheme(userPreferredAppearance: Appearance = 'AUTO') {
this.materialCssVarsService.setDarkTheme( const setDarkTheme =
window.matchMedia('(prefers-color-scheme: dark)').matches userPreferredAppearance === 'DARK' ||
); (userPreferredAppearance === 'AUTO' &&
window.matchMedia('(prefers-color-scheme: dark)').matches);
this.materialCssVarsService.setDarkTheme(setDarkTheme);
window.matchMedia('(prefers-color-scheme: dark)').addListener((event) => { window.matchMedia('(prefers-color-scheme: dark)').addListener((event) => {
this.materialCssVarsService.setDarkTheme(event.matches); this.materialCssVarsService.setDarkTheme(event.matches);

24
apps/client/src/app/pages/account/account-page.html

@ -167,7 +167,7 @@
</mat-form-field> </mat-form-field>
</div> </div>
</div> </div>
<div class="d-flex"> <div class="d-flex mb-2">
<div class="align-items-center d-flex pr-1 pt-1 w-50"> <div class="align-items-center d-flex pr-1 pt-1 w-50">
<ng-container i18n>View Mode</ng-container> <ng-container i18n>View Mode</ng-container>
</div> </div>
@ -190,6 +190,28 @@
</div> </div>
</div> </div>
</div> </div>
<div class="d-flex">
<div class="align-items-center d-flex pr-1 pt-1 w-50">
<ng-container i18n>Appearance</ng-container>
</div>
<div class="pl-1 w-50">
<mat-form-field
appearance="outline"
class="compact-with-outline w-100 without-hint"
>
<mat-select
name="appearance"
[disabled]="!hasPermissionToUpdateUserSettings"
[value]="user.settings.appearance"
(selectionChange)="onChangeUserSetting('appearance', $event.value)"
>
<mat-option value="AUTO">AUTO</mat-option>
<mat-option value="LIGHT">LIGHT</mat-option>
<mat-option value="DARK">DARK</mat-option>
</mat-select>
</mat-form-field>
</div>
</div>
</form> </form>
</div> </div>
<div class="align-items-center d-flex mt-4 py-1"> <div class="align-items-center d-flex mt-4 py-1">

3
libs/common/src/lib/interfaces/user-settings.interface.ts

@ -1,4 +1,4 @@
import { DateRange, ViewMode } from '@ghostfolio/common/types'; import { DateRange, ViewMode, Appearance } from '@ghostfolio/common/types';
export interface UserSettings { export interface UserSettings {
baseCurrency?: string; baseCurrency?: string;
@ -10,4 +10,5 @@ export interface UserSettings {
language?: string; language?: string;
locale?: string; locale?: string;
viewMode?: ViewMode; viewMode?: ViewMode;
appearance?: Appearance;
} }

1
libs/common/src/lib/types/appearance.type.ts

@ -0,0 +1 @@
export type Appearance = 'AUTO' | 'LIGHT' | 'DARK';

4
libs/common/src/lib/types/index.ts

@ -9,6 +9,7 @@ import type { OrderWithAccount } from './order-with-account.type';
import type { RequestWithUser } from './request-with-user.type'; import type { RequestWithUser } from './request-with-user.type';
import { ToggleOption } from './toggle-option.type'; import { ToggleOption } from './toggle-option.type';
import type { ViewMode } from './view-mode.type'; import type { ViewMode } from './view-mode.type';
import type { Appearance } from './appearance.type';
export type { export type {
AccessWithGranteeUser, AccessWithGranteeUser,
@ -21,5 +22,6 @@ export type {
OrderWithAccount, OrderWithAccount,
RequestWithUser, RequestWithUser,
ToggleOption, ToggleOption,
ViewMode ViewMode,
Appearance
}; };

5
prisma/migrations/20221009120121_added_appearance_column_to_settings_table/migration.sql

@ -0,0 +1,5 @@
-- CreateEnum
CREATE TYPE "Appearance" AS ENUM ('AUTO', 'LIGHT', 'DARK');
-- Update Settings table
ALTER TABLE "Settings" ADD COLUMN "appearance" "Appearance";

6
prisma/schema.prisma

@ -215,6 +215,12 @@ enum ViewMode {
ZEN ZEN
} }
enum Appearance {
AUTO
LIGHT
DARK
}
enum Provider { enum Provider {
ANONYMOUS ANONYMOUS
GOOGLE GOOGLE

Loading…
Cancel
Save