Files
MSE-PI-E2EEDA-Plein-de-eeee…/ui/angular.json
khalil-bot a465cba225 feat(ui): dynamic room polling, secure credentials and CO2 levels
- Poll only rooms returned by /api/v1/rooms so calls are never wasted on
  sensor-less rooms; new rooms are picked up automatically after deploy
- Replace timer(0, interval) with concat() for synchronous initial emission
- Remove mock fallback from getLatestReadingForRoom / getHistoryForRoom so
  the UI reflects real API state instead of hiding errors with fake data
- Add Basic-Auth interceptor and dev proxy (proxy.conf.json) for local dev
- Replace hardcoded API credentials with __API_USERNAME__ / __API_PASSWORD__
  placeholders for CI-time injection from GitHub Secrets
- Add "Very Poor" CO2 level (1500-2000 ppm) to the 6-level scale
- Update "No sensor installed" copy to "No data available currently"
- Handle empty history state in room-details-panel

Closes #30
2026-05-27 22:00:11 +02:00

140 lines
3.8 KiB
JSON

{
"$schema": "./node_modules/@angular/cli/lib/config/schema.json",
"version": 1,
"cli": {
"packageManager": "npm",
"analytics": false,
"schematicCollections": [
"@angular-eslint/schematics"
]
},
"newProjectRoot": "projects",
"projects": {
"dashboard": {
"projectType": "application",
"schematics": {
"@schematics/angular:component": {
"style": "scss",
"standalone": true,
"changeDetection": "OnPush"
},
"@schematics/angular:directive": {
"standalone": true
},
"@schematics/angular:pipe": {
"standalone": true
}
},
"root": "",
"sourceRoot": "src",
"prefix": "app",
"architect": {
"build": {
"builder": "@angular-devkit/build-angular:application",
"options": {
"outputPath": "dist/dashboard",
"index": "src/index.html",
"browser": "src/main.ts",
"polyfills": [
"zone.js"
],
"tsConfig": "tsconfig.app.json",
"inlineStyleLanguage": "scss",
"assets": [
{
"glob": "**/*",
"input": "public"
}
],
"styles": [
"@angular/material/prebuilt-themes/cyan-orange.css",
"src/styles.scss"
],
"scripts": []
},
"configurations": {
"production": {
"budgets": [
{
"type": "initial",
"maximumWarning": "500kB",
"maximumError": "1MB"
},
{
"type": "anyComponentStyle",
"maximumWarning": "10kB",
"maximumError": "20kB"
}
],
"outputHashing": "all",
"fileReplacements": [
{
"replace": "src/environments/environment.ts",
"with": "src/environments/environment.prod.ts"
}
]
},
"development": {
"optimization": false,
"extractLicenses": false,
"sourceMap": true
}
},
"defaultConfiguration": "production"
},
"serve": {
"builder": "@angular-devkit/build-angular:dev-server",
"options": {
"port": 4200,
"open": true,
"proxyConfig": "proxy.conf.json"
},
"configurations": {
"production": {
"buildTarget": "dashboard:build:production"
},
"development": {
"buildTarget": "dashboard:build:development"
}
},
"defaultConfiguration": "development"
},
"extract-i18n": {
"builder": "@angular-devkit/build-angular:extract-i18n"
},
"test": {
"builder": "@angular-devkit/build-angular:karma",
"options": {
"polyfills": [
"zone.js",
"zone.js/testing"
],
"tsConfig": "tsconfig.spec.json",
"inlineStyleLanguage": "scss",
"assets": [
{
"glob": "**/*",
"input": "public"
}
],
"styles": [
"@angular/material/prebuilt-themes/cyan-orange.css",
"src/styles.scss"
],
"scripts": []
}
},
"lint": {
"builder": "@angular-eslint/builder:lint",
"options": {
"lintFilePatterns": [
"src/**/*.ts",
"src/**/*.html"
]
}
}
}
}
}
}