ci/cd + any fixes
This commit is contained in:
+32
@@ -0,0 +1,32 @@
|
|||||||
|
hetzner
|
||||||
|
user:root
|
||||||
|
password:Lio$ha84
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
domen name:
|
||||||
|
https://www.spaceship.com/application/domain-list-application/
|
||||||
|
login:liosha84
|
||||||
|
password:Lio$ha84
|
||||||
|
|
||||||
|
----smtp-----
|
||||||
|
SMTP Server
|
||||||
|
smtp-relay.brevo.com
|
||||||
|
Port
|
||||||
|
587
|
||||||
|
Login
|
||||||
|
a8cae8001@smtp-brevo.com
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Сервис,Адрес,Роль в созидании
|
||||||
|
Caddy,jambotron.com,Вратарь и защитник (SSL)
|
||||||
|
Portainer,manage.jambotron.com,Твои «руки» (управление Docker)
|
||||||
|
Grafana,jambotron.com/monitor,Твои «глаза» (метрики ресурсов)
|
||||||
|
Gitea,gitea.jambotron.com,Твоя «память» (хранилище кода)
|
||||||
|
|
||||||
|
|
||||||
|
---------
|
||||||
|
portainer
|
||||||
|
user:admin
|
||||||
|
password:Z*N3p8&iI,a70"ER45GT9}fBAu2/^Q)C
|
||||||
@@ -15,11 +15,12 @@
|
|||||||
"prefix": "app",
|
"prefix": "app",
|
||||||
"architect": {
|
"architect": {
|
||||||
"build": {
|
"build": {
|
||||||
"builder": "@angular-devkit/build-angular:browser",
|
"builder": "@angular/build:application",
|
||||||
"options": {
|
"options": {
|
||||||
"outputPath": "dist/jambotron-ui",
|
"outputPath": {
|
||||||
|
"base": "dist/jambotron-ui"
|
||||||
|
},
|
||||||
"index": "src/index.html",
|
"index": "src/index.html",
|
||||||
"main": "src/main.ts",
|
|
||||||
"polyfills": [
|
"polyfills": [
|
||||||
"zone.js"
|
"zone.js"
|
||||||
],
|
],
|
||||||
@@ -67,7 +68,8 @@
|
|||||||
"node_modules/jquery/dist/jquery.js",
|
"node_modules/jquery/dist/jquery.js",
|
||||||
"node_modules/bootstrap-markdown/js/bootstrap-markdown.js"
|
"node_modules/bootstrap-markdown/js/bootstrap-markdown.js"
|
||||||
|
|
||||||
]
|
],
|
||||||
|
"browser": "src/main.ts"
|
||||||
|
|
||||||
},
|
},
|
||||||
"configurations": {
|
"configurations": {
|
||||||
@@ -108,20 +110,20 @@
|
|||||||
"defaultConfiguration": "production"
|
"defaultConfiguration": "production"
|
||||||
},
|
},
|
||||||
"serve": {
|
"serve": {
|
||||||
"builder": "@angular-devkit/build-angular:dev-server",
|
"builder": "@angular/build:dev-server",
|
||||||
"configurations": {
|
"configurations": {
|
||||||
"production": {
|
"production": {
|
||||||
"buildTarget": "jambotron-ui:build:production"
|
"buildTarget": "jambotron-ui:build:production"
|
||||||
},
|
},
|
||||||
"development": {
|
"development": {
|
||||||
"disableHostCheck": true,
|
"allowedHosts": ["all"],
|
||||||
"buildTarget": "jambotron-ui:build:development"
|
"buildTarget": "jambotron-ui:build:development"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"defaultConfiguration": "development"
|
"defaultConfiguration": "development"
|
||||||
},
|
},
|
||||||
"extract-i18n": {
|
"extract-i18n": {
|
||||||
"builder": "@angular-devkit/build-angular:extract-i18n"
|
"builder": "@angular/build:extract-i18n"
|
||||||
},
|
},
|
||||||
"test": {
|
"test": {
|
||||||
"builder": "@angular/build:karma",
|
"builder": "@angular/build:karma",
|
||||||
|
|||||||
Generated
+3006
-7723
File diff suppressed because it is too large
Load Diff
+13
-13
@@ -13,17 +13,17 @@
|
|||||||
},
|
},
|
||||||
"private": true,
|
"private": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@angular/animations": "^20.0.4",
|
"@angular/animations": "^21.2.9",
|
||||||
"@angular/cdk": "^20.1.6",
|
"@angular/cdk": "^20.1.6",
|
||||||
"@angular/common": "^20.0.0",
|
"@angular/common": "^21.2.9",
|
||||||
"@angular/compiler": "^20.0.0",
|
"@angular/compiler": "^21.2.9",
|
||||||
"@angular/core": "^20.0.0",
|
"@angular/core": "^21.2.9",
|
||||||
"@angular/forms": "^20.0.0",
|
"@angular/forms": "^21.2.9",
|
||||||
"@angular/material": "^20.1.6",
|
"@angular/material": "^20.1.6",
|
||||||
"@angular/platform-browser": "^20.0.0",
|
"@angular/platform-browser": "^21.2.9",
|
||||||
"@angular/platform-server": "^20.0.0",
|
"@angular/platform-server": "^21.2.9",
|
||||||
"@angular/router": "^20.0.0",
|
"@angular/router": "^21.2.9",
|
||||||
"@angular/ssr": "^20.0.2",
|
"@angular/ssr": "^21.2.7",
|
||||||
"@material/material-color-utilities": "^0.3.0",
|
"@material/material-color-utilities": "^0.3.0",
|
||||||
"@ng-bootstrap/ng-bootstrap": "19.0.0",
|
"@ng-bootstrap/ng-bootstrap": "19.0.0",
|
||||||
"@popperjs/core": "2.11.8",
|
"@popperjs/core": "2.11.8",
|
||||||
@@ -40,9 +40,9 @@
|
|||||||
"zone.js": "~0.15.0"
|
"zone.js": "~0.15.0"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@angular-devkit/build-angular": "^20.0.2",
|
"@angular/build": "^21.2.7",
|
||||||
"@angular/cli": "^20.0.2",
|
"@angular/cli": "^21.2.7",
|
||||||
"@angular/compiler-cli": "^20.0.0",
|
"@angular/compiler-cli": "^21.2.9",
|
||||||
"@types/express": "^5.0.1",
|
"@types/express": "^5.0.1",
|
||||||
"@types/file-saver": "^2.0.7",
|
"@types/file-saver": "^2.0.7",
|
||||||
"@types/jasmine": "~5.1.0",
|
"@types/jasmine": "~5.1.0",
|
||||||
@@ -53,6 +53,6 @@
|
|||||||
"karma-coverage": "~2.2.0",
|
"karma-coverage": "~2.2.0",
|
||||||
"karma-jasmine": "~5.1.0",
|
"karma-jasmine": "~5.1.0",
|
||||||
"karma-jasmine-html-reporter": "~2.1.0",
|
"karma-jasmine-html-reporter": "~2.1.0",
|
||||||
"typescript": "~5.8.2"
|
"typescript": "~5.9.3"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
+18
-6
@@ -34,12 +34,14 @@
|
|||||||
Root
|
Root
|
||||||
</button>
|
</button>
|
||||||
</li>
|
</li>
|
||||||
<li *ngFor="let segment of pathSegments; let i = index" class="breadcrumb-item">
|
@for (segment of pathSegments; track segment; let i = $index) {
|
||||||
|
<li class="breadcrumb-item">
|
||||||
<mat-icon>chevron_right</mat-icon>
|
<mat-icon>chevron_right</mat-icon>
|
||||||
<button mat-button (click)="navigateToPath(i)" class="path-button">
|
<button mat-button (click)="navigateToPath(i)" class="path-button">
|
||||||
{{ segment }}
|
{{ segment }}
|
||||||
</button>
|
</button>
|
||||||
</li>
|
</li>
|
||||||
|
}
|
||||||
</ol>
|
</ol>
|
||||||
</nav>
|
</nav>
|
||||||
<div class="header-actions">
|
<div class="header-actions">
|
||||||
@@ -89,13 +91,17 @@
|
|||||||
|
|
||||||
|
|
||||||
<!-- Progress Bar -->
|
<!-- Progress Bar -->
|
||||||
<mat-progress-bar *ngIf="loading" mode="indeterminate"></mat-progress-bar>
|
@if (loading) {
|
||||||
|
<mat-progress-bar mode="indeterminate"></mat-progress-bar>
|
||||||
|
}
|
||||||
|
|
||||||
<!-- Upload Progress -->
|
<!-- Upload Progress -->
|
||||||
<div *ngIf="uploading" class="upload-progress">
|
@if (uploading) {
|
||||||
|
<div class="upload-progress">
|
||||||
<mat-progress-bar mode="determinate" [value]="uploadProgress"></mat-progress-bar>
|
<mat-progress-bar mode="determinate" [value]="uploadProgress"></mat-progress-bar>
|
||||||
<span class="progress-text">Uploading... {{uploadProgress}}%</span>
|
<span class="progress-text">Uploading... {{uploadProgress}}%</span>
|
||||||
</div>
|
</div>
|
||||||
|
}
|
||||||
|
|
||||||
<!-- File Table -->
|
<!-- File Table -->
|
||||||
<div class="table-container">
|
<div class="table-container">
|
||||||
@@ -155,21 +161,25 @@
|
|||||||
<!-- Actions Column -->
|
<!-- Actions Column -->
|
||||||
<ng-container matColumnDef="actions">
|
<ng-container matColumnDef="actions">
|
||||||
<th mat-header-cell *matHeaderCellDef>
|
<th mat-header-cell *matHeaderCellDef>
|
||||||
<button *ngIf="selection.size > 0"
|
@if (selection.size > 0) {
|
||||||
|
<button
|
||||||
mat-icon-button
|
mat-icon-button
|
||||||
color="warn"
|
color="warn"
|
||||||
(click)="deleteSelected()"
|
(click)="deleteSelected()"
|
||||||
matTooltip="Delete Selected">
|
matTooltip="Delete Selected">
|
||||||
<mat-icon>delete</mat-icon>
|
<mat-icon>delete</mat-icon>
|
||||||
</button>
|
</button>
|
||||||
|
}
|
||||||
</th>
|
</th>
|
||||||
<td mat-cell *matCellDef="let file">
|
<td mat-cell *matCellDef="let file">
|
||||||
<button *ngIf="file.type === 'file'"
|
@if (file.type === 'file') {
|
||||||
|
<button
|
||||||
mat-icon-button
|
mat-icon-button
|
||||||
(click)="downloadFile(file)"
|
(click)="downloadFile(file)"
|
||||||
matTooltip="Download">
|
matTooltip="Download">
|
||||||
<mat-icon>download</mat-icon>
|
<mat-icon>download</mat-icon>
|
||||||
</button>
|
</button>
|
||||||
|
}
|
||||||
<button mat-icon-button
|
<button mat-icon-button
|
||||||
(click)="deleteFile(file)"
|
(click)="deleteFile(file)"
|
||||||
color="warn"
|
color="warn"
|
||||||
@@ -185,11 +195,13 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- Empty State -->
|
<!-- Empty State -->
|
||||||
<div *ngIf="!loading && dataSource.data.length === 0" class="empty-state">
|
@if (!loading && dataSource.data.length === 0) {
|
||||||
|
<div class="empty-state">
|
||||||
<mat-icon>{{ searchQuery ? 'search_off' : 'folder_open' }}</mat-icon>
|
<mat-icon>{{ searchQuery ? 'search_off' : 'folder_open' }}</mat-icon>
|
||||||
<h3>{{ searchQuery ? 'No results found' : 'This folder is empty' }}</h3>
|
<h3>{{ searchQuery ? 'No results found' : 'This folder is empty' }}</h3>
|
||||||
<p>{{ searchQuery ? 'Try adjusting your search terms' : 'Upload files or create folders to get started.' }}</p>
|
<p>{{ searchQuery ? 'Try adjusting your search terms' : 'Upload files or create folders to get started.' }}</p>
|
||||||
</div>
|
</div>
|
||||||
|
}
|
||||||
</mat-card-content>
|
</mat-card-content>
|
||||||
</mat-card>
|
</mat-card>
|
||||||
</mat-sidenav-content>
|
</mat-sidenav-content>
|
||||||
|
|||||||
+2
-9
@@ -1,5 +1,5 @@
|
|||||||
import {Component, CUSTOM_ELEMENTS_SCHEMA, Input, OnInit, ViewChild} from '@angular/core';
|
import {Component, CUSTOM_ELEMENTS_SCHEMA, Input, OnInit, ViewChild} from '@angular/core';
|
||||||
import {DatePipe, NgForOf, NgIf} from '@angular/common';
|
import { DatePipe } from '@angular/common';
|
||||||
import {
|
import {
|
||||||
MatCell,
|
MatCell,
|
||||||
MatCellDef, MatColumnDef,
|
MatCellDef, MatColumnDef,
|
||||||
@@ -29,7 +29,6 @@ import {FileSystemTreeComponent} from '../file-system-tree-component/file-system
|
|||||||
@Component({
|
@Component({
|
||||||
selector: 'app-file-browser-with-tree-component',
|
selector: 'app-file-browser-with-tree-component',
|
||||||
imports: [
|
imports: [
|
||||||
NgIf,
|
|
||||||
MatIcon,
|
MatIcon,
|
||||||
MatHeaderRowDef,
|
MatHeaderRowDef,
|
||||||
MatRowDef,
|
MatRowDef,
|
||||||
@@ -45,10 +44,7 @@ import {FileSystemTreeComponent} from '../file-system-tree-component/file-system
|
|||||||
MatCheckbox,
|
MatCheckbox,
|
||||||
MatTable,
|
MatTable,
|
||||||
MatProgressBar,
|
MatProgressBar,
|
||||||
|
|
||||||
FormsModule,
|
FormsModule,
|
||||||
|
|
||||||
NgForOf,
|
|
||||||
MatButton,
|
MatButton,
|
||||||
MatCardContent,
|
MatCardContent,
|
||||||
MatSidenavContent,
|
MatSidenavContent,
|
||||||
@@ -57,11 +53,8 @@ import {FileSystemTreeComponent} from '../file-system-tree-component/file-system
|
|||||||
MatCardTitle,
|
MatCardTitle,
|
||||||
MatSidenav,
|
MatSidenav,
|
||||||
MatSidenavContainer,
|
MatSidenavContainer,
|
||||||
|
|
||||||
|
|
||||||
DatePipe,
|
DatePipe,
|
||||||
FileSystemTreeComponent,
|
FileSystemTreeComponent
|
||||||
|
|
||||||
],
|
],
|
||||||
templateUrl: './file-browser-with-tree-component.html',
|
templateUrl: './file-browser-with-tree-component.html',
|
||||||
styleUrl: './file-browser-with-tree-component.scss',
|
styleUrl: './file-browser-with-tree-component.scss',
|
||||||
|
|||||||
+1
-1
@@ -15,7 +15,7 @@ import {MatProgressBarModule} from '@angular/material/progress-bar';
|
|||||||
import {MatIconModule} from '@angular/material/icon';
|
import {MatIconModule} from '@angular/material/icon';
|
||||||
import {MatButtonModule} from '@angular/material/button';
|
import {MatButtonModule} from '@angular/material/button';
|
||||||
import {MatTreeModule} from '@angular/material/tree';
|
import {MatTreeModule} from '@angular/material/tree';
|
||||||
import {NgIf} from '@angular/common';
|
|
||||||
|
|
||||||
import {FileBrowserTreeService, FileItem} from '../../services/file-browser-tree.service';
|
import {FileBrowserTreeService, FileItem} from '../../services/file-browser-tree.service';
|
||||||
import {MatTooltip} from '@angular/material/tooltip';
|
import {MatTooltip} from '@angular/material/tooltip';
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
@import "~node_modules/cropperjs/dist/cropper.css";
|
@import "node_modules/cropperjs/dist/cropper.css";
|
||||||
|
|
||||||
.ngx-pe-overlay-container {
|
.ngx-pe-overlay-container {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
|
|||||||
@@ -11,7 +11,7 @@ import {
|
|||||||
} from '@angular/core';
|
} from '@angular/core';
|
||||||
import {Route, Router, RouterLink, RouterLinkActive} from '@angular/router';
|
import {Route, Router, RouterLink, RouterLinkActive} from '@angular/router';
|
||||||
import {MatListItem, MatListItemIcon, MatListItemTitle, MatNavList} from '@angular/material/list';
|
import {MatListItem, MatListItemIcon, MatListItemTitle, MatNavList} from '@angular/material/list';
|
||||||
import {NgForOf} from '@angular/common';
|
|
||||||
import {MatIconButton} from '@angular/material/button';
|
import {MatIconButton} from '@angular/material/button';
|
||||||
import {MatTooltip} from '@angular/material/tooltip';
|
import {MatTooltip} from '@angular/material/tooltip';
|
||||||
import {MatIcon} from '@angular/material/icon';
|
import {MatIcon} from '@angular/material/icon';
|
||||||
@@ -36,9 +36,7 @@ export interface NavItem {
|
|||||||
RouterLink,
|
RouterLink,
|
||||||
MatListItem,
|
MatListItem,
|
||||||
MatNavList,
|
MatNavList,
|
||||||
NgForOf,
|
MatIconButton
|
||||||
MatIconButton,
|
|
||||||
|
|
||||||
],
|
],
|
||||||
templateUrl: './vertical-nav.component.html',
|
templateUrl: './vertical-nav.component.html',
|
||||||
styleUrl: './vertical-nav.component.scss',
|
styleUrl: './vertical-nav.component.scss',
|
||||||
|
|||||||
+8
-11
@@ -1,6 +1,6 @@
|
|||||||
<div class="json-dump-container" *ngIf="!loading; else loadingTpl">
|
@if (!loading) {
|
||||||
|
<div class="json-dump-container">
|
||||||
<h2>JSON Dump Management</h2>
|
<h2>JSON Dump Management</h2>
|
||||||
|
|
||||||
<!-- Entity-specific Export/Import -->
|
<!-- Entity-specific Export/Import -->
|
||||||
<!-- <div class="entity-actions" *ngFor="let entity of entityTypes">
|
<!-- <div class="entity-actions" *ngFor="let entity of entityTypes">
|
||||||
<h3>{{ entity | titlecase }}</h3>
|
<h3>{{ entity | titlecase }}</h3>
|
||||||
@@ -49,17 +49,14 @@
|
|||||||
<mat-header-cell *matHeaderCellDef> File Name </mat-header-cell>
|
<mat-header-cell *matHeaderCellDef> File Name </mat-header-cell>
|
||||||
<mat-cell *matCellDef="let file">{{ file.fileName }}</mat-cell>
|
<mat-cell *matCellDef="let file">{{ file.fileName }}</mat-cell>
|
||||||
</ng-container>
|
</ng-container>
|
||||||
|
|
||||||
<ng-container matColumnDef="size">
|
<ng-container matColumnDef="size">
|
||||||
<mat-header-cell *matHeaderCellDef> Size </mat-header-cell>
|
<mat-header-cell *matHeaderCellDef> Size </mat-header-cell>
|
||||||
<mat-cell *matCellDef="let file">{{ jsonDumpService.formatFileSize(file.size) }}</mat-cell>
|
<mat-cell *matCellDef="let file">{{ jsonDumpService.formatFileSize(file.size) }}</mat-cell>
|
||||||
</ng-container>
|
</ng-container>
|
||||||
|
|
||||||
<ng-container matColumnDef="lastModified">
|
<ng-container matColumnDef="lastModified">
|
||||||
<mat-header-cell *matHeaderCellDef> Last Modified </mat-header-cell>
|
<mat-header-cell *matHeaderCellDef> Last Modified </mat-header-cell>
|
||||||
<mat-cell *matCellDef="let file">{{ jsonDumpService.formatDate(file.lastModified) }}</mat-cell>
|
<mat-cell *matCellDef="let file">{{ jsonDumpService.formatDate(file.lastModified) }}</mat-cell>
|
||||||
</ng-container>
|
</ng-container>
|
||||||
|
|
||||||
<ng-container matColumnDef="actions">
|
<ng-container matColumnDef="actions">
|
||||||
<mat-header-cell *matHeaderCellDef> Actions </mat-header-cell>
|
<mat-header-cell *matHeaderCellDef> Actions </mat-header-cell>
|
||||||
<mat-cell *matCellDef="let file">
|
<mat-cell *matCellDef="let file">
|
||||||
@@ -71,18 +68,18 @@
|
|||||||
</button>
|
</button>
|
||||||
</mat-cell>
|
</mat-cell>
|
||||||
</ng-container>
|
</ng-container>
|
||||||
|
|
||||||
<mat-header-row *matHeaderRowDef="['fileName', 'size', 'lastModified', 'actions']"></mat-header-row>
|
<mat-header-row *matHeaderRowDef="['fileName', 'size', 'lastModified', 'actions']"></mat-header-row>
|
||||||
<mat-row *matRowDef="let row; columns: ['fileName', 'size', 'lastModified', 'actions']"></mat-row>
|
<mat-row *matRowDef="let row; columns: ['fileName', 'size', 'lastModified', 'actions']"></mat-row>
|
||||||
</mat-table>
|
</mat-table>
|
||||||
|
|
||||||
<!-- Archives -->
|
<!-- Archives -->
|
||||||
<h3>Archives</h3>
|
<h3>Archives</h3>
|
||||||
<mat-list>
|
<mat-list>
|
||||||
<mat-list-item *ngFor="let archive of archives">{{ archive }}</mat-list-item>
|
@for (archive of archives; track archive) {
|
||||||
|
<mat-list-item>{{ archive }}</mat-list-item>
|
||||||
|
}
|
||||||
</mat-list>
|
</mat-list>
|
||||||
</div>
|
</div>
|
||||||
|
} @else {
|
||||||
<ng-template #loadingTpl>
|
|
||||||
<mat-spinner></mat-spinner>
|
<mat-spinner></mat-spinner>
|
||||||
</ng-template>
|
}
|
||||||
|
|
||||||
|
|||||||
+1
-3
@@ -12,7 +12,7 @@ import {
|
|||||||
MatRowDef, MatTable
|
MatRowDef, MatTable
|
||||||
} from '@angular/material/table';
|
} from '@angular/material/table';
|
||||||
import {MatIconButton} from '@angular/material/button';
|
import {MatIconButton} from '@angular/material/button';
|
||||||
import {NgForOf, NgIf, TitleCasePipe} from '@angular/common';
|
import { TitleCasePipe } from '@angular/common';
|
||||||
import {MatProgressSpinner} from '@angular/material/progress-spinner';
|
import {MatProgressSpinner} from '@angular/material/progress-spinner';
|
||||||
import {MatIcon} from '@angular/material/icon';
|
import {MatIcon} from '@angular/material/icon';
|
||||||
import {MatTooltip} from '@angular/material/tooltip';
|
import {MatTooltip} from '@angular/material/tooltip';
|
||||||
@@ -41,8 +41,6 @@ import {MatLabel} from '@angular/material/input';
|
|||||||
MatCellDef,
|
MatCellDef,
|
||||||
MatTable,
|
MatTable,
|
||||||
TitleCasePipe,
|
TitleCasePipe,
|
||||||
NgIf,
|
|
||||||
NgForOf,
|
|
||||||
MatToolbar,
|
MatToolbar,
|
||||||
MatToolbarRow,
|
MatToolbarRow,
|
||||||
MatLabel
|
MatLabel
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ import {Subscription} from 'rxjs';
|
|||||||
import {TokenStorageService} from '../../../services/token-storage.service';
|
import {TokenStorageService} from '../../../services/token-storage.service';
|
||||||
import {AuthService} from '../../../services/auth.service';
|
import {AuthService} from '../../../services/auth.service';
|
||||||
import {EventBusService} from '../../../_shared/event-bus.service';
|
import {EventBusService} from '../../../_shared/event-bus.service';
|
||||||
import {CommonModule} from '@angular/common';
|
|
||||||
import {MatIcon} from '@angular/material/icon';
|
import {MatIcon} from '@angular/material/icon';
|
||||||
import {MatMenu, MatMenuItem, MatMenuTrigger} from '@angular/material/menu';
|
import {MatMenu, MatMenuItem, MatMenuTrigger} from '@angular/material/menu';
|
||||||
import {MatTooltip} from '@angular/material/tooltip';
|
import {MatTooltip} from '@angular/material/tooltip';
|
||||||
@@ -26,7 +26,6 @@ import {GlobalConstants} from '../../../global-constants';
|
|||||||
MatButton,
|
MatButton,
|
||||||
RouterLink,
|
RouterLink,
|
||||||
RouterOutlet,
|
RouterOutlet,
|
||||||
CommonModule,
|
|
||||||
MatIcon,
|
MatIcon,
|
||||||
MatMiniFabButton,
|
MatMiniFabButton,
|
||||||
MatMenuTrigger,
|
MatMenuTrigger,
|
||||||
|
|||||||
+14
-7
@@ -6,8 +6,10 @@
|
|||||||
<h3>Running Containers</h3>
|
<h3>Running Containers</h3>
|
||||||
<button (click)="refreshContainers()" class="btn btn-secondary">Refresh</button>
|
<button (click)="refreshContainers()" class="btn btn-secondary">Refresh</button>
|
||||||
|
|
||||||
<div class="container-list" *ngIf="containers.length > 0; else noContainers">
|
@if (containers.length > 0) {
|
||||||
<div class="container-item" *ngFor="let container of containers">
|
<div class="container-list">
|
||||||
|
@for (container of containers; track container) {
|
||||||
|
<div class="container-item">
|
||||||
<div class="container-info">
|
<div class="container-info">
|
||||||
<strong>{{container.name}}</strong>
|
<strong>{{container.name}}</strong>
|
||||||
<span class="image">{{container.image}}</span>
|
<span class="image">{{container.image}}</span>
|
||||||
@@ -28,11 +30,12 @@
|
|||||||
class="btn btn-info">Logs</button>
|
class="btn btn-info">Logs</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
}
|
||||||
</div>
|
</div>
|
||||||
|
} @else {
|
||||||
<ng-template #noContainers>
|
|
||||||
<p>No containers found</p>
|
<p>No containers found</p>
|
||||||
</ng-template>
|
}
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- Run New Container -->
|
<!-- Run New Container -->
|
||||||
@@ -85,7 +88,8 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- Command Output -->
|
<!-- Command Output -->
|
||||||
<div class="output-section" *ngIf="lastCommandResult">
|
@if (lastCommandResult) {
|
||||||
|
<div class="output-section">
|
||||||
<h3>Command Output</h3>
|
<h3>Command Output</h3>
|
||||||
<div class="output-box"
|
<div class="output-box"
|
||||||
[class.success]="lastCommandResult.success"
|
[class.success]="lastCommandResult.success"
|
||||||
@@ -93,9 +97,11 @@
|
|||||||
<pre>{{getOutputText(lastCommandResult.output)}}</pre>
|
<pre>{{getOutputText(lastCommandResult.output)}}</pre>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
}
|
||||||
|
|
||||||
<!-- Container Logs Modal -->
|
<!-- Container Logs Modal -->
|
||||||
<div class="logs-modal" *ngIf="selectedContainerLogs">
|
@if (selectedContainerLogs) {
|
||||||
|
<div class="logs-modal">
|
||||||
<div class="modal-content">
|
<div class="modal-content">
|
||||||
<div class="modal-header">
|
<div class="modal-header">
|
||||||
<h3>Container Logs: {{selectedContainer}}</h3>
|
<h3>Container Logs: {{selectedContainer}}</h3>
|
||||||
@@ -106,4 +112,5 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
}
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
+2
-4
@@ -1,5 +1,5 @@
|
|||||||
import {Component, OnDestroy, OnInit} from '@angular/core';
|
import {Component, OnDestroy, OnInit} from '@angular/core';
|
||||||
import {NgForOf, NgIf} from '@angular/common';
|
|
||||||
import {Subject, takeUntil} from 'rxjs';
|
import {Subject, takeUntil} from 'rxjs';
|
||||||
import {FormBuilder, FormGroup, ReactiveFormsModule, Validators} from '@angular/forms';
|
import {FormBuilder, FormGroup, ReactiveFormsModule, Validators} from '@angular/forms';
|
||||||
import {ContainerInfo, DockerResult, DockerService} from '../docker.service';
|
import {ContainerInfo, DockerResult, DockerService} from '../docker.service';
|
||||||
@@ -7,9 +7,7 @@ import {ContainerInfo, DockerResult, DockerService} from '../docker.service';
|
|||||||
@Component({
|
@Component({
|
||||||
selector: 'app-docker-management-component',
|
selector: 'app-docker-management-component',
|
||||||
imports: [
|
imports: [
|
||||||
NgIf,
|
ReactiveFormsModule
|
||||||
ReactiveFormsModule,
|
|
||||||
NgForOf
|
|
||||||
],
|
],
|
||||||
templateUrl: './docker-management-component.html',
|
templateUrl: './docker-management-component.html',
|
||||||
styleUrl: './docker-management-component.scss'
|
styleUrl: './docker-management-component.scss'
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ export const environment = {
|
|||||||
port: 8081,
|
port: 8081,
|
||||||
production: true,
|
production: true,
|
||||||
fromWeb: true,
|
fromWeb: true,
|
||||||
host_name: 'https://jambotron.run.place',
|
//host_name: 'https://jambotron.run.place',
|
||||||
|
host_name:'http://localhost',
|
||||||
title: 'JAMBOTRON.RUN.PLACE'
|
title: 'JAMBOTRON.RUN.PLACE'
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ spring.config.import=classpath:/yml_properties/application_production.yml
|
|||||||
|
|
||||||
spring.application.name=jambotron
|
spring.application.name=jambotron
|
||||||
|
|
||||||
server.port=443
|
server.port=8081
|
||||||
#============Localhost Configurations========================
|
#============Localhost Configurations========================
|
||||||
|
|
||||||
spring.datasource.url= jdbc:postgresql://localhost:5432/jambotronDB
|
spring.datasource.url= jdbc:postgresql://localhost:5432/jambotronDB
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
#bootJar with profile prod
|
#bootJar with profile prod
|
||||||
#spring.profiles.active=prod
|
spring.profiles.active=prod
|
||||||
|
|
||||||
spring.profiles.active=dev
|
#spring.profiles.active=dev
|
||||||
|
|||||||
Reference in New Issue
Block a user