latest merge
All checks were successful
Build Docker Image / Preparing Dependecies (push) Successful in 5s

This commit is contained in:
2025-11-17 17:45:33 +07:00
parent a475265764
commit 21007f7bbc
10 changed files with 5460 additions and 1236 deletions

View File

@@ -21,7 +21,7 @@
"prefix": "app", "prefix": "app",
"architect": { "architect": {
"build": { "build": {
"builder": "@angular-devkit/build-angular:application", "builder": "@angular/build:application",
"options": { "options": {
"outputPath": "dist/ng-ttc-frontend", "outputPath": "dist/ng-ttc-frontend",
"index": "src/index.html", "index": "src/index.html",
@@ -37,22 +37,33 @@
} }
], ],
"styles": [ "styles": [
"node_modules/bootstrap/dist/css/bootstrap.min.css",
"node_modules/@fortawesome/fontawesome-free/css/all.min.css",
"src/styles.css" "src/styles.css"
], ],
"scripts": [] "scripts": [
"node_modules/bootstrap/dist/js/bootstrap.bundle.min.js"
]
}, },
"configurations": { "configurations": {
"production": { "production": {
"fileReplacements": [
{
"replace": "src/environments/environment.ts",
"with": "src/environments/environment.ts"
}
],
"optimization": true,
"budgets": [ "budgets": [
{ {
"type": "initial", "type": "initial",
"maximumWarning": "500kB", "maximumWarning": "1MB",
"maximumError": "1MB" "maximumError": "2MB"
}, },
{ {
"type": "anyComponentStyle", "type": "anyComponentStyle",
"maximumWarning": "4kB", "maximumWarning": "6kB",
"maximumError": "8kB" "maximumError": "10kB"
} }
], ],
"outputHashing": "all" "outputHashing": "all"
@@ -72,7 +83,11 @@
"defaultConfiguration": "production" "defaultConfiguration": "production"
}, },
"serve": { "serve": {
"builder": "@angular-devkit/build-angular:dev-server", "builder": "@angular/build:dev-server",
"options": {
"host": "0.0.0.0",
"allowedHosts": ["localhost"]
},
"configurations": { "configurations": {
"production": { "production": {
"buildTarget": "ng-ttc-frontend:build:production" "buildTarget": "ng-ttc-frontend:build:production"
@@ -84,10 +99,10 @@
"defaultConfiguration": "development" "defaultConfiguration": "development"
}, },
"extract-i18n": { "extract-i18n": {
"builder": "@angular-devkit/build-angular:extract-i18n" "builder": "@angular/build:extract-i18n"
}, },
"test": { "test": {
"builder": "@angular-devkit/build-angular:karma", "builder": "@angular/build:karma",
"options": { "options": {
"polyfills": [ "polyfills": [
"zone.js", "zone.js",
@@ -101,9 +116,13 @@
} }
], ],
"styles": [ "styles": [
"node_modules/bootstrap/dist/css/bootstrap.min.css",
"node_modules/@fortawesome/fontawesome-free/css/all.min.css",
"src/styles.css" "src/styles.css"
], ],
"scripts": [] "scripts": [
"node_modules/bootstrap/dist/js/bootstrap.bundle.min.js"
]
} }
} }
} }

File diff suppressed because it is too large Load Diff

View File

@@ -70,6 +70,7 @@
"zone.js": "~0.15.0" "zone.js": "~0.15.0"
}, },
"devDependencies": { "devDependencies": {
"@angular-devkit/build-angular": "^20.3.10",
"@angular/build": "^20.3.9", "@angular/build": "^20.3.9",
"@angular/cli": "^20.3.9", "@angular/cli": "^20.3.9",
"@angular/compiler-cli": "^20.3.10", "@angular/compiler-cli": "^20.3.10",

Binary file not shown.

After

Width:  |  Height:  |  Size: 105 KiB

View File

@@ -1,221 +0,0 @@
@import "tailwindcss";
/* Global base styles for the app. Keep lightweight and self-contained so
the login component can reliably fill the viewport without producing
an outer page scrollbar. */
/* Force ngx-toastr container to be fixed to the viewport and positioned correctly */
.toast-container.toast-top-right {
position: fixed !important;
top: 12px !important;
right: 12px !important;
z-index: 999999 !important;
}
/* Make sure the page and app root occupy full height so 100vh aligns */
html, body, app-root {
height: 100%;
min-height: 100%;
}
/* เริ่มต้น: สำหรับ Desktop */
.login-mobile {
width: 415px;
}
/* ถ้าเป็น Mobile (<=768px) ให้ลบ width ออก */
@media (max-width: 768px) {
.login-mobile {
width: auto !important;
}
}
@media (max-width: 768px) {
.sidebar {
position: fixed;
top: 0;
left: 0;
height: 100%;
z-index: 50;
transition: transform 0.3s ease-in-out;
}
}
/* ✅ Toast Custom Style */
.ngx-toastr {
border-radius: 8px !important;
backdrop-filter: blur(6px);
box-shadow: 0 4px 20px rgba(0, 0, 0, 0.12);
font-family: "Segoe UI", Roboto, sans-serif;
padding: 12px 16px !important;
min-width: 260px;
transition: all 0.3s ease-in-out;
}
.success-toast {
background: rgba(255, 255, 255, 0.8) !important;
color: #15803d !important;
border-left: 5px solid #16a34a;
}
.error-toast {
background: rgba(239, 68, 68, 0.8) !important;
color: #fff !important;
border-left: 5px solid #dc2626;
}
.toast-title {
font-weight: 600 !important;
margin-bottom: 2px;
}
.toast-message {
font-size: 14px;
}
/* sensible default box model */
*, *::before, *::after { box-sizing: border-box; }
body {
margin: 0;
font-family: "Kanit", sans-serif;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
/* Prevent the browser from showing a scroll bar for the page itself;
the login card will scroll internally if needed. */
}
/* Simple utilities used by nested components in this workspace */
.content-box {
border: 2px solid black;
padding: 10px;
margin: 20px;
}
.comp-box {
border: 1px solid #555;
border-radius: 8px;
padding: 10px;
margin: 10px;
/* Use flex centering so nested components (like the login widget)
are centered without forcing the document to scroll. */
display: flex;
align-items: center;
justify-content: center;
min-height: 100vh;
}
/* If the project uses Bootstrap, the Bootstrap utilities will still apply.
These local utility rules only ensure a consistent appearance if Bootstrap
isn't available. */
.kanit-thin {
font-family: "Kanit", sans-serif;
font-weight: 100;
font-style: normal;
}
.kanit-extralight {
font-family: "Kanit", sans-serif;
font-weight: 200;
font-style: normal;
}
.kanit-light {
font-family: "Kanit", sans-serif;
font-weight: 300;
font-style: normal;
}
.kanit-regular {
font-family: "Kanit", sans-serif;
font-weight: 400;
font-style: normal;
}
.kanit-medium {
font-family: "Kanit", sans-serif;
font-weight: 500;
font-style: normal;
}
.kanit-semibold {
font-family: "Kanit", sans-serif;
font-weight: 600;
font-style: normal;
}
.kanit-bold {
font-family: "Kanit", sans-serif;
font-weight: 700;
font-style: normal;
}
.kanit-extrabold {
font-family: "Kanit", sans-serif;
font-weight: 800;
font-style: normal;
}
.kanit-black {
font-family: "Kanit", sans-serif;
font-weight: 900;
font-style: normal;
}
.kanit-thin-italic {
font-family: "Kanit", sans-serif;
font-weight: 100;
font-style: italic;
}
.kanit-extralight-italic {
font-family: "Kanit", sans-serif;
font-weight: 200;
font-style: italic;
}
.kanit-light-italic {
font-family: "Kanit", sans-serif;
font-weight: 300;
font-style: italic;
}
.kanit-regular-italic {
font-family: "Kanit", sans-serif;
font-weight: 400;
font-style: italic;
}
.kanit-medium-italic {
font-family: "Kanit", sans-serif;
font-weight: 500;
font-style: italic;
}
.kanit-semibold-italic {
font-family: "Kanit", sans-serif;
font-weight: 600;
font-style: italic;
}
.kanit-bold-italic {
font-family: "Kanit", sans-serif;
font-weight: 700;
font-style: italic;
}
.kanit-extrabold-italic {
font-family: "Kanit", sans-serif;
font-weight: 800;
font-style: italic;
}
.kanit-black-italic {
font-family: "Kanit", sans-serif;
font-weight: 900;
font-style: italic;
}

View File

@@ -1,18 +1,65 @@
import { NgModule } from '@angular/core'; import { NgModule, Component } from '@angular/core';
import { CommonModule } from '@angular/common';
import { BrowserModule } from '@angular/platform-browser'; import { BrowserModule } from '@angular/platform-browser';
import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
import { ToastrModule } from 'ngx-toastr';
import { AppRoutingModule } from './app-routing.module'; import { AppRoutingModule } from './app-routing.module';
// import { RouterModule } from '@angular/router';
import { AppComponent } from './app.component'; import { AppComponent } from './app.component';
// import { LayoutComponent } from './content/content/layout/layout.component';
import { SidebarContentComponent } from './content/sidebar-content/sidebar-content.component';
import { SidebarComponent } from './component/sidebar/sidebar.component';
// import { ReactiveFormsModule } from '@angular/forms';
import { FontAwesomeModule } from '@fortawesome/angular-fontawesome';
import { HttpClientModule } from '@angular/common/http';
import { LicensePrivacyTermsComponent } from './component/license-privacy-terms/license-privacy-terms.component';
// import { MainDashboardContentComponent } from './content/main-dashboard-content/main-dashboard-content.component';
// import { MainDashboardComponent } from './component/main-dashboard/main-dashboard.component';
// import { LoginForgotComponent } from './component/login-forgot/login-forgot.component';
// import { LoginPageComponent } from './component/login-page/login-page.component';
// import { LoginContentComponent } from './content/login-content/login-content.component';
import { provideCharts, withDefaultRegisterables } from 'ng2-charts';
// import { AccDateFormatPipe } from './pipe/dtmtodatetime.pipe';
// import { DtmtodatetimePipe } from './dtmtodatetime.pipe';
@NgModule({ @NgModule({
declarations: [ declarations: [
AppComponent AppComponent,
// LayoutComponent,
SidebarContentComponent,
SidebarComponent,
LicensePrivacyTermsComponent,
// AccDateFormatPipe
// DtmtodatetimePipe,
// MainDashboardContentComponent,
// MainDashboardComponent,
// LoginForgotComponent,
// LoginPageComponent,
// LoginPageComponentComponent,
], ],
imports: [ imports: [
BrowserModule, BrowserModule,
AppRoutingModule CommonModule,
ToastrModule.forRoot({
positionClass:'toast-top-right',
preventDuplicates: true,
maxOpened: 3,
autoDismiss: true
}),
// ReactiveFormsModule,
BrowserAnimationsModule,
AppRoutingModule,
HttpClientModule,
FontAwesomeModule
], ],
providers: [], exports: [
// AccDateFormatPipe
],
providers: [provideCharts(withDefaultRegisterables())],
bootstrap: [AppComponent] bootstrap: [AppComponent]
}) })
export class AppModule { } export class AppModule { }

View File

@@ -4,9 +4,9 @@
<div class="card modal-card" role="dialog" aria-labelledby="signin-title" aria-modal="true"> <div class="card modal-card" role="dialog" aria-labelledby="signin-title" aria-modal="true">
<div class="brand"> <div class="brand">
<!-- <img src="assets/logo.png" alt="Company logo" class="logo" /> --> <!-- <img src="assets/logo.png" alt="Company logo" class="logo" /> -->
<img src="logo.png" alt="Company logo" class="logo mb-2"/> <img src="/logo.png" alt="Company logo" class="logo mb-2"/>
<h1 id="signin-title" class='kanit-bold'>เข้าสู่ระบบ</h1> <h1 id="signin-title" class='kanit-bold'>เข้าสู่ระบบ</h1>
<p class="subtitle">บัญชีโปรแกรมจัดการบัญชีของคุณ</p> <p class="subtitle">บัญชีโปรแกรมจัดการแผนงานงบประมาณของท่าน</p>
</div> </div>
<form [formGroup]="loginForm" (ngSubmit)="signIn()" class="form px-3 pb-3"> <form [formGroup]="loginForm" (ngSubmit)="signIn()" class="form px-3 pb-3">
<label class="field"> <label class="field">

View File

@@ -6,7 +6,7 @@ import { MainControlRoutingModule } from './main-control-routing.module';
import { ReactiveFormsModule } from '@angular/forms'; import { ReactiveFormsModule } from '@angular/forms';
// import { MainDashboardComponent } from '../../component/main-dashboard/main-dashboard.component'; import { MainDashboardComponent } from '../../component/main-dashboard/main-dashboard.component';
import { MainDashboardContentComponent } from '../../content/main-dashboard-content/main-dashboard-content.component'; import { MainDashboardContentComponent } from '../../content/main-dashboard-content/main-dashboard-content.component';
import { AccDateFormatPipe } from '../../pipe/dtmtodatetime.pipe'; import { AccDateFormatPipe } from '../../pipe/dtmtodatetime.pipe';
import { MainReportComponent } from '../../component/main-report/main-report.component'; import { MainReportComponent } from '../../component/main-report/main-report.component';
@@ -17,7 +17,7 @@ import { MainReportComponent } from '../../component/main-report/main-report.com
@NgModule({ @NgModule({
declarations: [ declarations: [
// MainDashboardComponent, MainDashboardComponent,
MainDashboardContentComponent, MainDashboardContentComponent,
MainReportComponent, MainReportComponent,
AccDateFormatPipe AccDateFormatPipe

View File

@@ -1,4 +1,4 @@
export const environment = { export const environment = {
production: false, production: false,
apiUrl: 'http://api.nuttakit.work' apiBaseUrl: 'http://api.nuttakit.work'
}; };

View File

@@ -1,4 +1,4 @@
export const environment = { export const environment = {
production: true, production: true,
apiUrl: 'http://localhost:8000' apiBaseUrl: 'http://localhost:8000'
}; };