Skip to content

Commit 9ef1cf1

Browse files
elibosleypujitm
andauthored
feat: docker overview (#1855)
<!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit ## Release Notes v4.29.2 * **New Features** * Added iframe mode support with UI adjustments for embedded deployments * Introduced modal portal system with dark mode integration * **Bug Fixes** * Fixed log line deduplication sync issue in Docker log viewer to prevent orphaned entries * **Improvements** * Enhanced table header rendering for consistent behavior and resizing * Improved notification subscription handling for better stability * Optimized log viewer initialization behavior * Simplified organizer API parameter handling <sub>✏️ Tip: You can customize this high-level summary in your review settings.</sub> <!-- end of auto-generated comment: release notes by coderabbit.ai --> --------- Co-authored-by: Pujit Mehrotra <pujit@lime-technology.com>
1 parent a0745e1 commit 9ef1cf1

File tree

14 files changed

+42
-45
lines changed

14 files changed

+42
-45
lines changed

api/dev/configs/api.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
{
2-
"version": "4.28.2",
2+
"version": "4.29.2",
33
"extraOrigins": [],
44
"sandbox": true,
55
"ssoSubIds": [],

api/src/unraid-api/graph/resolvers/docker/docker-autostart.service.spec.ts

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,7 @@ import { Test, TestingModule } from '@nestjs/testing';
22

33
import { beforeEach, describe, expect, it, vi } from 'vitest';
44

5-
import {
6-
AutoStartEntry,
7-
DockerAutostartService,
8-
} from '@app/unraid-api/graph/resolvers/docker/docker-autostart.service.js';
5+
import { DockerAutostartService } from '@app/unraid-api/graph/resolvers/docker/docker-autostart.service.js';
96
import { DockerContainer } from '@app/unraid-api/graph/resolvers/docker/docker.model.js';
107

118
// Mock store getters

api/src/unraid-api/graph/resolvers/docker/docker-log.service.spec.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ import { beforeEach, describe, expect, it, vi } from 'vitest';
44

55
import { AppError } from '@app/core/errors/app-error.js';
66
import { DockerLogService } from '@app/unraid-api/graph/resolvers/docker/docker-log.service.js';
7-
import { DockerContainerLogs } from '@app/unraid-api/graph/resolvers/docker/docker.model.js';
87

98
// Mock dependencies
109
const mockExeca = vi.fn();

api/src/unraid-api/graph/resolvers/docker/docker-tailscale.service.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,6 @@ export class DockerTailscaleService {
9191
);
9292

9393
const dnsName = rawStatus.Self.DNSName;
94-
const actualHostname = dnsName ? dnsName.split('.')[0] : undefined;
9594

9695
let relayName: string | undefined;
9796
if (rawStatus.Self.Relay && derpMap) {

api/src/unraid-api/graph/resolvers/docker/docker.model.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ import {
22
Field,
33
Float,
44
GraphQLISODateTime,
5-
ID,
65
InputType,
76
Int,
87
ObjectType,

api/src/unraid-api/graph/resolvers/docker/docker.service.spec.ts

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,7 @@ import { DockerLogService } from '@app/unraid-api/graph/resolvers/docker/docker-
1313
import { DockerManifestService } from '@app/unraid-api/graph/resolvers/docker/docker-manifest.service.js';
1414
import { DockerNetworkService } from '@app/unraid-api/graph/resolvers/docker/docker-network.service.js';
1515
import { DockerPortService } from '@app/unraid-api/graph/resolvers/docker/docker-port.service.js';
16-
import {
17-
ContainerPortType,
18-
ContainerState,
19-
DockerContainer,
20-
} from '@app/unraid-api/graph/resolvers/docker/docker.model.js';
16+
import { ContainerState, DockerContainer } from '@app/unraid-api/graph/resolvers/docker/docker.model.js';
2117
import { DockerService } from '@app/unraid-api/graph/resolvers/docker/docker.service.js';
2218
import { NotificationsService } from '@app/unraid-api/graph/resolvers/notifications/notifications.service.js';
2319

api/src/unraid-api/graph/resolvers/docker/docker.service.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -321,7 +321,7 @@ export class DockerService {
321321
await this.cacheManager.del(DockerService.CONTAINER_CACHE_KEY);
322322
this.logger.debug(`Invalidated container cache after pausing ${id}`);
323323

324-
let containers = await this.getContainers({ skipCache: true });
324+
let containers: DockerContainer[];
325325
let updatedContainer: DockerContainer | undefined;
326326
for (let i = 0; i < 5; i++) {
327327
await sleep(500);
@@ -349,7 +349,7 @@ export class DockerService {
349349
await this.cacheManager.del(DockerService.CONTAINER_CACHE_KEY);
350350
this.logger.debug(`Invalidated container cache after unpausing ${id}`);
351351

352-
let containers = await this.getContainers({ skipCache: true });
352+
let containers: DockerContainer[];
353353
let updatedContainer: DockerContainer | undefined;
354354
for (let i = 0; i < 5; i++) {
355355
await sleep(500);

api/src/unraid-api/organizer/organizer.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -683,7 +683,7 @@ export interface MoveItemsToPositionParams {
683683
* Combines moveEntriesToFolder with position-based insertion.
684684
*/
685685
export function moveItemsToPosition(params: MoveItemsToPositionParams): OrganizerView {
686-
const { view, sourceEntryIds, destinationFolderId, position, resources } = params;
686+
const { view, sourceEntryIds, destinationFolderId, position } = params;
687687

688688
const movedView = moveEntriesToFolder({ view, sourceEntryIds, destinationFolderId });
689689

@@ -743,7 +743,7 @@ export interface CreateFolderWithItemsParams {
743743
* Combines createFolder + moveItems + positioning in a single atomic operation.
744744
*/
745745
export function createFolderWithItems(params: CreateFolderWithItemsParams): OrganizerView {
746-
const { view, folderId, folderName, parentId, sourceEntryIds = [], position, resources } = params;
746+
const { view, folderId, folderName, parentId, sourceEntryIds = [], position } = params;
747747

748748
let newView = createFolderInView({
749749
view,

web/src/components/Common/BaseTreeTable.vue

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -299,9 +299,7 @@ function createCellWrapper(
299299
});
300300
}
301301
302-
function wrapColumnHeaderRenderer(
303-
header: ColumnHeaderRenderer | undefined
304-
): ColumnHeaderRenderer | undefined {
302+
function wrapColumnHeaderRenderer(header: ColumnHeaderRenderer | undefined): ColumnHeaderRenderer {
305303
if (typeof header === 'function') {
306304
return function wrappedHeaderRenderer(this: unknown, ...args: unknown[]) {
307305
const result = (header as (...args: unknown[]) => unknown).apply(this, args);
@@ -481,7 +479,7 @@ const processedColumns = computed<TableColumn<TreeRow<T>>[]>(() => {
481479
createSelectColumn(),
482480
...props.columns.map((col, colIndex) => {
483481
const originalHeader = col.header as ColumnHeaderRenderer | undefined;
484-
const header = wrapColumnHeaderRenderer(originalHeader) ?? originalHeader;
482+
const header = wrapColumnHeaderRenderer(originalHeader);
485483
const cell = (col as { cell?: unknown }).cell
486484
? ({ row }: { row: TableInstanceRow<T> }) => {
487485
const cellFn = (col as { cell: (args: unknown) => VNode | string | number }).cell;

web/src/components/Docker/SingleDockerLogViewer.vue

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,10 @@ function appendLogLines(newLines: Array<{ timestamp: string; message: string }>)
6868
6969
state.lines = [...state.lines, ...added];
7070
if (state.lines.length > MAX_LOG_LINES) {
71+
const removed = state.lines.slice(0, state.lines.length - MAX_LOG_LINES);
72+
for (const line of removed) {
73+
state.lineKeys.delete(`${line.timestamp}|${line.message}`);
74+
}
7175
state.lines = state.lines.slice(state.lines.length - MAX_LOG_LINES);
7276
}
7377
}

0 commit comments

Comments
 (0)