Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
66 commits
Select commit Hold shift + click to select a range
d07aa42
table > select & status badge
pujitm Sep 17, 2025
a32dd21
enhance: add ssh retry logic and SSH options in deploy script
Ajit-Mehrotra Nov 21, 2025
29312d7
refactor: replace LoadingSpinner and LoadingError with nuxtUI components
Ajit-Mehrotra Nov 21, 2025
a8459c7
fix: address notification pane infinite network request and improve e…
Ajit-Mehrotra Nov 24, 2025
7679d71
refactor: update notification components to use UIcon and UButton for…
Ajit-Mehrotra Nov 25, 2025
e80ea79
refactor: enhance app configuration and notification components for i…
Ajit-Mehrotra Dec 2, 2025
88766ad
refactor(ui): replace vue-sonner toasts with nuxtui toasts
Ajit-Mehrotra Dec 2, 2025
4798c89
fix(notifications api): implement async generator for improve filteri…
Ajit-Mehrotra Dec 3, 2025
80bbf2d
fix(notification): address filenames greater than 255 bytes
Ajit-Mehrotra Dec 5, 2025
9f27eb7
refactor(notifications): sync toast position with legacy settings
Ajit-Mehrotra Dec 5, 2025
1000976
fix(app.config): update toast max duration comment for compatibility …
Ajit-Mehrotra Dec 5, 2025
c21ecc7
fix(notifications): override notification bell hover to maintain cons…
Ajit-Mehrotra Dec 9, 2025
67ac307
fix(notifications): add break-word styling for long words in subject …
Ajit-Mehrotra Dec 9, 2025
be1e2f5
fix(notifications): add elipses to long single-word toast titles
Ajit-Mehrotra Dec 9, 2025
fe74e53
fix(notifications): show full title on notification pane and truncate…
Ajit-Mehrotra Dec 9, 2025
f690c23
fix(notifications): add support for bottom-center'd nuxtui toasts
Ajit-Mehrotra Dec 9, 2025
f7fe959
chore(gitignore): add .dev-scripts to gitignore for local dev scripts
Ajit-Mehrotra Dec 9, 2025
875aa09
fix(notifications): fix color of notification button's active state
Ajit-Mehrotra Dec 9, 2025
6a04a06
fix(notification): add min width to allow flex title to shrink and wr…
Ajit-Mehrotra Dec 9, 2025
e3bf571
fix(notifications): resolve ID mismatches, counter bugs, and paginati…
Ajit-Mehrotra Dec 11, 2025
2122e6d
feat(notifications): add notify script for backup and restore on plug…
Ajit-Mehrotra Dec 12, 2025
ddd6b0b
Revert "fix(notifications): add support for bottom-center'd nuxtui to…
Ajit-Mehrotra Dec 12, 2025
4a19d4d
fix(notifications): enable user overrides for the header text color
Ajit-Mehrotra Dec 12, 2025
4c42b4b
fix(notifications): update notify script's filename sanitization to i…
Ajit-Mehrotra Dec 13, 2025
53ee465
fix: resolve no-undef lint errors for auto-imported composables in Vu…
Ajit-Mehrotra Dec 15, 2025
6458457
feat(components): add DockerContainerStatCell and USlideover componen…
Ajit-Mehrotra Dec 15, 2025
d10e054
feat(notifications): replace docker toast usage with nuxtui toast com…
Ajit-Mehrotra Dec 15, 2025
fd1a046
feat(notifications): integrate nuxtui toast composable for success me…
Ajit-Mehrotra Dec 15, 2025
7969e44
refactor(navigation): replace window.location with navigate helper fo…
Ajit-Mehrotra Dec 15, 2025
e61657c
refactor(notification): use "size" for square css widths and height
Ajit-Mehrotra Dec 15, 2025
c18de73
refactor(notifications): center notification error button text
Ajit-Mehrotra Dec 15, 2025
ad78a02
feat(errors): add dbgApolloError function for enhanced GraphQL error …
Ajit-Mehrotra Dec 15, 2025
c2d2fbe
feat(notifications): introduce constants for notification icons and c…
Ajit-Mehrotra Dec 15, 2025
e817d6a
fix(notifications): add onResult handler to update online status base…
Ajit-Mehrotra Dec 15, 2025
4abc79a
fix(notifications): sync badges on api recovery
Ajit-Mehrotra Dec 15, 2025
17f0176
fix(notifications): set 'top-right' as default toast location
Ajit-Mehrotra Dec 15, 2025
4c49baf
chore(dependencies): update @nuxt/ui to version 4.2.1 from 4.0.0 alpha
Ajit-Mehrotra Dec 16, 2025
1e5decc
Revert "Revert "fix(notifications): add support for bottom-center'd n…
Ajit-Mehrotra Dec 16, 2025
88e76d7
feat(notifications): update nuxtui to 4.2.1 and add new toast features
Ajit-Mehrotra Dec 16, 2025
a8578bf
refactor(notifications): move ToastPosition type to a separate file a…
Ajit-Mehrotra Dec 16, 2025
3c9c04d
wip(css-modification): add DefaultBaseCssModification class for CSS s…
Ajit-Mehrotra Dec 18, 2025
5628bf9
fix(color): fix bell icon color in header to work on all themes
Ajit-Mehrotra Dec 23, 2025
2f88228
fix(theme): adjust logo overlap on azure/gray themes on unraid versio…
Ajit-Mehrotra Dec 23, 2025
902307a
feat(notifications): add file-modification scripts for nuxtui notific…
Ajit-Mehrotra Dec 24, 2025
b456678
fix: update file-modification location for default-base.css
Ajit-Mehrotra Dec 29, 2025
716789f
fix: add generated files + patch + snapshot files
Ajit-Mehrotra Dec 29, 2025
8ef00ce
chore: lint
Ajit-Mehrotra Dec 29, 2025
9ed71e5
chore: rebase cleanup
Ajit-Mehrotra Dec 30, 2025
ad2a5cc
test(notifications): Update various api and web component tests
Ajit-Mehrotra Dec 30, 2025
443335e
fix: update header background file modification
Ajit-Mehrotra Dec 30, 2025
00f015f
test(notifications): update patch files
Ajit-Mehrotra Dec 30, 2025
1c4f33e
Revert "fix: update header background file modification"
Ajit-Mehrotra Dec 30, 2025
b0ff85b
Revert "test(notifications): update patch files"
Ajit-Mehrotra Dec 30, 2025
9504b4a
fix(css): file-modifications for backwards compatability with 7.0
Ajit-Mehrotra Dec 30, 2025
18f3227
fix: default-gray theme's header background color via a file-modifier.
Ajit-Mehrotra Dec 31, 2025
bff05e0
fix(web): remove incorrect toaster mapping causing empty notification
Ajit-Mehrotra Jan 2, 2026
86ec429
fix(css): add @layer in default-base file modifier to ensure css spec…
Ajit-Mehrotra Jan 2, 2026
4ee5506
test: update snapshots and patch files for default-base.css file-modi…
Ajit-Mehrotra Jan 2, 2026
f23e5bc
fix: clean up rebase
Ajit-Mehrotra Jan 2, 2026
41aa09f
build(scripts): enhance local docker plugin development workflow
Ajit-Mehrotra Jan 2, 2026
736c24c
chore: prevent automatic formatting of .page files (interpretted as .…
Ajit-Mehrotra Jan 2, 2026
e140863
feat(toast): finish migration to nuxtui toasts (finished migrating ne…
Ajit-Mehrotra Jan 2, 2026
aa2c6eb
chore: remove legacy Toaster.vue and related components from monorepo
Ajit-Mehrotra Jan 2, 2026
eae2651
test: update file modification tests
Ajit-Mehrotra Jan 3, 2026
d8f3e92
fix: remove unused import
Ajit-Mehrotra Jan 3, 2026
de860cb
fix: add file-modification for font-awesome.css
Ajit-Mehrotra Jan 4, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -122,7 +122,10 @@ api/dev/Unraid.net/myservers.cfg

# local Mise settings
.mise.toml
mise.toml

# Compiled test pages (generated from Nunjucks templates)
web/public/test-pages/*.html

# local scripts for testing and development
.dev-scripts/
6 changes: 6 additions & 0 deletions .vscode/settings.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
{
"files.associations": {
"*.page": "php"
},
"intelephense.format.enable": false,
}
Comment on lines +1 to +6
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🔴 Critical

Remove trailing comma in JSON object.

The JSON file has a syntax error: a trailing comma after "intelephense.format.enable": false, before the closing brace. JSON does not permit trailing commas, and this will cause VS Code to fail parsing the settings file.

🔎 Proposed fix
{
    "files.associations": {
        "*.page": "php"
    },
-   "intelephense.format.enable": false,
+   "intelephense.format.enable": false
}
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
{
"files.associations": {
"*.page": "php"
},
"intelephense.format.enable": false,
}
{
"files.associations": {
"*.page": "php"
},
"intelephense.format.enable": false
}
🧰 Tools
🪛 Biome (2.1.2)

[error] 5-6: Expected a property but instead found '}'.

Expected a property here.

(parse)

🤖 Prompt for AI Agents
In .vscode/settings.json around lines 1 to 6 there is a trailing comma after the
"intelephense.format.enable": false entry which makes the JSON invalid; remove
the trailing comma so the last property in the object does not end with a comma
and ensure the file is valid JSON (no other trailing commas or syntax errors).

2 changes: 1 addition & 1 deletion @tailwind-shared/base-utilities.css
Original file line number Diff line number Diff line change
Expand Up @@ -86,4 +86,4 @@ unraid-sso-button.unapi {
--text-7xl: 4.5rem;
--text-8xl: 6rem;
--text-9xl: 8rem;
}
}
2 changes: 1 addition & 1 deletion @tailwind-shared/index.css
Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,4 @@
@import './css-variables.css';
@import './unraid-theme.css';
@import './theme-variants.css';
@import './base-utilities.css';
@import './base-utilities.css';
2 changes: 1 addition & 1 deletion @tailwind-shared/theme-variants.css
Original file line number Diff line number Diff line change
Expand Up @@ -65,4 +65,4 @@
/* Dark Mode Overrides */
.dark {
--color-border: #383735;
}
}
6 changes: 2 additions & 4 deletions api/dev/configs/api.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,5 @@
"extraOrigins": [],
"sandbox": true,
"ssoSubIds": [],
"plugins": [
"unraid-api-plugin-connect"
]
}
"plugins": ["unraid-api-plugin-connect"]
}
8 changes: 8 additions & 0 deletions api/generated-schema.graphql
Original file line number Diff line number Diff line change
Expand Up @@ -1395,6 +1395,13 @@ type NotificationCounts {
total: Int!
}

type NotificationSettings {
position: String!
expand: Boolean!
duration: Int!
max: Int!
}

type NotificationOverview {
unread: NotificationCounts!
archive: NotificationCounts!
Expand Down Expand Up @@ -1438,6 +1445,7 @@ type Notifications implements Node {
Deduplicated list of unread warning and alert notifications, sorted latest first.
"""
warningsAndAlerts: [Notification!]!
settings: NotificationSettings!
}

input NotificationFilter {
Expand Down
2 changes: 2 additions & 0 deletions api/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -39,13 +39,15 @@
"// Testing": "",
"test": "NODE_ENV=test vitest run",
"test:watch": "NODE_ENV=test vitest --ui",
"test:modifications:update": "rm -rf src/unraid-api/unraid-file-modifier/modifications/__test__/__fixtures__/downloaded && NODE_ENV=test vitest run src/unraid-api/unraid-file-modifier/modifications/__test__/generic-modification.spec.ts -u",
"coverage": "NODE_ENV=test vitest run --coverage",
"// Docker": "",
"container:build": "./scripts/dc.sh build dev",
"container:start": "pnpm run container:stop && ./scripts/dc.sh run --rm --service-ports dev",
"container:stop": "./scripts/dc.sh stop dev",
"container:test": "./scripts/dc.sh run --rm builder pnpm run test",
"container:enter": "./scripts/dc.sh exec dev /bin/bash",
"docker:build-and-run": "pnpm --filter @unraid/connect-plugin docker:build-and-run",
"// Migration Scripts": "",
"migration:codefirst": "tsx ./src/unraid-api/graph/migration-script.ts"
},
Expand Down
3 changes: 3 additions & 0 deletions api/src/core/types/ini.ts
Original file line number Diff line number Diff line change
Expand Up @@ -93,6 +93,9 @@ interface Notify {
system: string;
version: string;
docker_update: string;
expand?: string | boolean;
duration?: string | number;
max?: string | number;
}

interface Ssmtp {
Expand Down
38 changes: 38 additions & 0 deletions api/src/unraid-api/cli/generated/graphql.ts
Original file line number Diff line number Diff line change
Expand Up @@ -560,6 +560,17 @@ export type CpuLoad = {
percentUser: Scalars['Float']['output'];
};

export type CpuPackages = Node & {
__typename?: 'CpuPackages';
id: Scalars['PrefixedID']['output'];
/** Power draw per package (W) */
power: Array<Scalars['Float']['output']>;
/** Temperature per package (°C) */
temp: Array<Scalars['Float']['output']>;
/** Total CPU package power draw (W) */
totalPower: Scalars['Float']['output'];
};

export type CpuUtilization = Node & {
__typename?: 'CpuUtilization';
/** CPU load for each core */
Expand Down Expand Up @@ -591,6 +602,19 @@ export type Customization = {
theme: Theme;
};

/** Customization related mutations */
export type CustomizationMutations = {
__typename?: 'CustomizationMutations';
/** Update the UI theme (writes dynamix.cfg) */
setTheme: Theme;
};


/** Customization related mutations */
export type CustomizationMutationsSetThemeArgs = {
theme: ThemeName;
};

export type DeleteApiKeyInput = {
ids: Array<Scalars['PrefixedID']['input']>;
};
Expand Down Expand Up @@ -1065,6 +1089,7 @@ export type InfoCpu = Node & {
manufacturer?: Maybe<Scalars['String']['output']>;
/** CPU model */
model?: Maybe<Scalars['String']['output']>;
packages: CpuPackages;
/** Number of physical processors */
processors?: Maybe<Scalars['Int']['output']>;
/** CPU revision */
Expand All @@ -1081,6 +1106,8 @@ export type InfoCpu = Node & {
stepping?: Maybe<Scalars['Int']['output']>;
/** Number of CPU threads */
threads?: Maybe<Scalars['Int']['output']>;
/** Per-package array of core/thread pairs, e.g. [[[0,1],[2,3]], [[4,5],[6,7]]] */
topology: Array<Array<Array<Scalars['Int']['output']>>>;
/** CPU vendor */
vendor?: Maybe<Scalars['String']['output']>;
/** CPU voltage */
Expand Down Expand Up @@ -1422,6 +1449,7 @@ export type Mutation = {
createDockerFolderWithItems: ResolvedOrganizerV1;
/** Creates a new notification record */
createNotification: Notification;
customization: CustomizationMutations;
/** Deletes all archived notifications on server. */
deleteArchivedNotifications: NotificationOverview;
deleteDockerEntries: ResolvedOrganizerV1;
Expand Down Expand Up @@ -1659,6 +1687,14 @@ export type NotificationOverview = {
unread: NotificationCounts;
};

export type NotificationSettings = {
__typename?: 'NotificationSettings';
duration: Scalars['Int']['output'];
expand: Scalars['Boolean']['output'];
max: Scalars['Int']['output'];
position: Scalars['String']['output'];
};

export enum NotificationType {
ARCHIVE = 'ARCHIVE',
UNREAD = 'UNREAD'
Expand All @@ -1670,6 +1706,7 @@ export type Notifications = Node & {
list: Array<Notification>;
/** A cached overview of the notifications in the system & their severity. */
overview: NotificationOverview;
settings: NotificationSettings;
/** Deduplicated list of unread warning and alert notifications, sorted latest first. */
warningsAndAlerts: Array<Notification>;
};
Expand Down Expand Up @@ -2269,6 +2306,7 @@ export type Subscription = {
parityHistorySubscription: ParityCheck;
serversSubscription: Server;
systemMetricsCpu: CpuUtilization;
systemMetricsCpuTelemetry: CpuPackages;
systemMetricsMemory: MemoryUtilization;
upsUpdates: UpsDevice;
};
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export const DOCKER_SERVICE_TOKEN = Symbol('DOCKER_SERVICE');
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { Field, InputType, Int, ObjectType, registerEnumType } from '@nestjs/graphql';

import { Node } from '@unraid/shared/graphql.model.js';
import { IsEnum, IsInt, IsNotEmpty, IsOptional, IsString, Min } from 'class-validator';
import { IsBoolean, IsEnum, IsInt, IsNotEmpty, IsOptional, IsString, Min } from 'class-validator';

export enum NotificationType {
UNREAD = 'UNREAD',
Expand Down Expand Up @@ -99,6 +99,31 @@ export class NotificationCounts {
total!: number;
}

@ObjectType('NotificationSettings')
export class NotificationSettings {
@Field()
@IsString()
@IsNotEmpty()
position!: string;

@Field(() => Boolean)
@IsBoolean()
@IsNotEmpty()
expand!: boolean;

@Field(() => Int)
@IsInt()
@Min(1)
@IsNotEmpty()
duration!: number;

@Field(() => Int)
@IsInt()
@Min(1)
@IsNotEmpty()
max!: number;
}

@ObjectType('NotificationOverview')
export class NotificationOverview {
@Field(() => NotificationCounts)
Expand Down Expand Up @@ -170,4 +195,8 @@ export class Notifications extends Node {
})
@IsNotEmpty()
warningsAndAlerts!: Notification[];

@Field(() => NotificationSettings)
@IsNotEmpty()
settings!: NotificationSettings;
}
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ import {
NotificationImportance,
NotificationOverview,
Notifications,
NotificationSettings,
NotificationType,
} from '@app/unraid-api/graph/resolvers/notifications/notifications.model.js';
import { NotificationsService } from '@app/unraid-api/graph/resolvers/notifications/notifications.service.js';
Expand Down Expand Up @@ -41,6 +42,11 @@ export class NotificationsResolver {
return this.notificationsService.getOverview();
}

@ResolveField(() => NotificationSettings)
public settings(): NotificationSettings {
return this.notificationsService.getSettings();
}

@ResolveField(() => [Notification])
public async list(
@Args('filter', { type: () => NotificationFilter })
Expand Down
Loading
Loading