parent
16514b7d1a
commit
88f17eab02
37 changed files with 567 additions and 117 deletions
@ -1,2 +1,6 @@ |
|||||||
[build] |
[build] |
||||||
rustflags = ["-L", "/home/ortem/src/rust/unki/static/lib"] |
rustflags = [ |
||||||
|
"-L", "/home/ortem/src/rust/unki/static/lib", |
||||||
|
"--remap-path-prefix=/home/ortem/src/rust/unki=src", |
||||||
|
"--remap-path-prefix=/home/ortem/.cargo=cargo" |
||||||
|
] |
||||||
|
@ -1,10 +0,0 @@ |
|||||||
[package] |
|
||||||
name = "be" |
|
||||||
version = "0.1.0" |
|
||||||
edition = "2018" |
|
||||||
|
|
||||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html |
|
||||||
|
|
||||||
[dependencies] |
|
||||||
actix-web = "3.3.2" |
|
||||||
u_lib = { version = "*", path = "../../../lib/u_lib" } |
|
@ -1,23 +0,0 @@ |
|||||||
/* |
|
||||||
Tabs: Agents, Tasks, Summary |
|
||||||
every tab has list page and item page with more info/actions |
|
||||||
|
|
||||||
Agents: |
|
||||||
|
|
||||||
| id | alias | ..see struct | tasks done |
|
||||||
| stripped | alias | ... | clickable number of assigned jobs |
|
||||||
|
|
||||||
almost all fields are editable, rows are deletable |
|
||||||
|
|
||||||
|
|
||||||
*/ |
|
||||||
|
|
||||||
use actix_web::{web, App, HttpResponse, HttpServer}; |
|
||||||
|
|
||||||
#[actix_web::main] |
|
||||||
pub async fn serve() -> std::io::Result<()> { |
|
||||||
let addr = "127.0.0.1:8080"; |
|
||||||
let app = || App::new().route("/", web::get().to(|| HttpResponse::Ok().body("ok"))); |
|
||||||
println!("Serving at http://{}", addr); |
|
||||||
HttpServer::new(app).bind(addr)?.run().await |
|
||||||
} |
|
@ -1,12 +0,0 @@ |
|||||||
[package] |
|
||||||
name = "fe" |
|
||||||
version = "0.1.0" |
|
||||||
edition = "2018" |
|
||||||
|
|
||||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html |
|
||||||
|
|
||||||
[dependencies] |
|
||||||
u_lib = { version = "*", path = "../../../lib/u_lib" } |
|
||||||
wasm-bindgen = "0.2.78" |
|
||||||
yew = "0.18.0" |
|
||||||
yew-router = "0.15.0" |
|
@ -1,9 +0,0 @@ |
|||||||
<!DOCTYPE html> |
|
||||||
<html> |
|
||||||
|
|
||||||
<head> |
|
||||||
<meta charset="utf-8" /> |
|
||||||
<title>Yew App</title> |
|
||||||
</head> |
|
||||||
|
|
||||||
</html> |
|
@ -1,51 +0,0 @@ |
|||||||
use wasm_bindgen::prelude::*; |
|
||||||
use yew::prelude::*; |
|
||||||
enum Msg { |
|
||||||
AddOne, |
|
||||||
} |
|
||||||
struct Model { |
|
||||||
// `ComponentLink` is like a reference to a component.
|
|
||||||
// It can be used to send messages to the component
|
|
||||||
link: ComponentLink<Self>, |
|
||||||
value: i64, |
|
||||||
} |
|
||||||
|
|
||||||
impl Component for Model { |
|
||||||
type Message = Msg; |
|
||||||
type Properties = (); |
|
||||||
|
|
||||||
fn create(_props: Self::Properties, link: ComponentLink<Self>) -> Self { |
|
||||||
Self { link, value: 0 } |
|
||||||
} |
|
||||||
|
|
||||||
fn update(&mut self, msg: Self::Message) -> ShouldRender { |
|
||||||
match msg { |
|
||||||
Msg::AddOne => { |
|
||||||
self.value += 1; |
|
||||||
// the value has changed so we need to
|
|
||||||
// re-render for it to appear on the page
|
|
||||||
true |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
fn change(&mut self, _props: Self::Properties) -> ShouldRender { |
|
||||||
// Should only return "true" if new properties are different to
|
|
||||||
// previously received properties.
|
|
||||||
// This component has no properties so we will always return "false".
|
|
||||||
false |
|
||||||
} |
|
||||||
|
|
||||||
fn view(&self) -> Html { |
|
||||||
html! { |
|
||||||
<div> |
|
||||||
<button onclick=self.link.callback(|_| Msg::AddOne)>{ "+1" }</button> |
|
||||||
<p>{ self.value }</p> |
|
||||||
</div> |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
pub fn main() { |
|
||||||
yew::start_app::<Model>(); |
|
||||||
} |
|
@ -0,0 +1,27 @@ |
|||||||
|
# Fe |
||||||
|
|
||||||
|
This project was generated with [Angular CLI](https://github.com/angular/angular-cli) version 13.1.2. |
||||||
|
|
||||||
|
## Development server |
||||||
|
|
||||||
|
Run `ng serve` for a dev server. Navigate to `http://localhost:4200/`. The app will automatically reload if you change any of the source files. |
||||||
|
|
||||||
|
## Code scaffolding |
||||||
|
|
||||||
|
Run `ng generate component component-name` to generate a new component. You can also use `ng generate directive|pipe|service|class|guard|interface|enum|module`. |
||||||
|
|
||||||
|
## Build |
||||||
|
|
||||||
|
Run `ng build` to build the project. The build artifacts will be stored in the `dist/` directory. |
||||||
|
|
||||||
|
## Running unit tests |
||||||
|
|
||||||
|
Run `ng test` to execute the unit tests via [Karma](https://karma-runner.github.io). |
||||||
|
|
||||||
|
## Running end-to-end tests |
||||||
|
|
||||||
|
Run `ng e2e` to execute the end-to-end tests via a platform of your choice. To use this command, you need to first add a package that implements end-to-end testing capabilities. |
||||||
|
|
||||||
|
## Further help |
||||||
|
|
||||||
|
To get more help on the Angular CLI use `ng help` or go check out the [Angular CLI Overview and Command Reference](https://angular.io/cli) page. |
@ -0,0 +1,111 @@ |
|||||||
|
{ |
||||||
|
"$schema": "./node_modules/@angular/cli/lib/config/schema.json", |
||||||
|
"version": 1, |
||||||
|
"newProjectRoot": "projects", |
||||||
|
"projects": { |
||||||
|
"fe": { |
||||||
|
"projectType": "application", |
||||||
|
"schematics": { |
||||||
|
"@schematics/angular:component": { |
||||||
|
"style": "less" |
||||||
|
}, |
||||||
|
"@schematics/angular:application": { |
||||||
|
"strict": true |
||||||
|
} |
||||||
|
}, |
||||||
|
"root": "", |
||||||
|
"sourceRoot": "src", |
||||||
|
"prefix": "app", |
||||||
|
"architect": { |
||||||
|
"build": { |
||||||
|
"builder": "@angular-devkit/build-angular:browser", |
||||||
|
"options": { |
||||||
|
"outputPath": "dist/fe", |
||||||
|
"index": "src/index.html", |
||||||
|
"main": "src/main.ts", |
||||||
|
"polyfills": "src/polyfills.ts", |
||||||
|
"tsConfig": "tsconfig.app.json", |
||||||
|
"inlineStyleLanguage": "less", |
||||||
|
"assets": [ |
||||||
|
"src/favicon.ico", |
||||||
|
"src/assets" |
||||||
|
], |
||||||
|
"styles": [ |
||||||
|
"src/styles.less" |
||||||
|
], |
||||||
|
"scripts": [] |
||||||
|
}, |
||||||
|
"configurations": { |
||||||
|
"production": { |
||||||
|
"budgets": [ |
||||||
|
{ |
||||||
|
"type": "initial", |
||||||
|
"maximumWarning": "500kb", |
||||||
|
"maximumError": "1mb" |
||||||
|
}, |
||||||
|
{ |
||||||
|
"type": "anyComponentStyle", |
||||||
|
"maximumWarning": "2kb", |
||||||
|
"maximumError": "4kb" |
||||||
|
} |
||||||
|
], |
||||||
|
"fileReplacements": [ |
||||||
|
{ |
||||||
|
"replace": "src/environments/environment.ts", |
||||||
|
"with": "src/environments/environment.prod.ts" |
||||||
|
} |
||||||
|
], |
||||||
|
"outputHashing": "all" |
||||||
|
}, |
||||||
|
"development": { |
||||||
|
"buildOptimizer": false, |
||||||
|
"optimization": false, |
||||||
|
"vendorChunk": true, |
||||||
|
"extractLicenses": false, |
||||||
|
"sourceMap": true, |
||||||
|
"namedChunks": true |
||||||
|
} |
||||||
|
}, |
||||||
|
"defaultConfiguration": "production" |
||||||
|
}, |
||||||
|
"serve": { |
||||||
|
"builder": "@angular-devkit/build-angular:dev-server", |
||||||
|
"configurations": { |
||||||
|
"production": { |
||||||
|
"browserTarget": "fe:build:production" |
||||||
|
}, |
||||||
|
"development": { |
||||||
|
"browserTarget": "fe:build:development" |
||||||
|
} |
||||||
|
}, |
||||||
|
"defaultConfiguration": "development" |
||||||
|
}, |
||||||
|
"extract-i18n": { |
||||||
|
"builder": "@angular-devkit/build-angular:extract-i18n", |
||||||
|
"options": { |
||||||
|
"browserTarget": "fe:build" |
||||||
|
} |
||||||
|
}, |
||||||
|
"test": { |
||||||
|
"builder": "@angular-devkit/build-angular:karma", |
||||||
|
"options": { |
||||||
|
"main": "src/test.ts", |
||||||
|
"polyfills": "src/polyfills.ts", |
||||||
|
"tsConfig": "tsconfig.spec.json", |
||||||
|
"karmaConfig": "karma.conf.js", |
||||||
|
"inlineStyleLanguage": "less", |
||||||
|
"assets": [ |
||||||
|
"src/favicon.ico", |
||||||
|
"src/assets" |
||||||
|
], |
||||||
|
"styles": [ |
||||||
|
"src/styles.less" |
||||||
|
], |
||||||
|
"scripts": [] |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
}, |
||||||
|
"defaultProject": "fe" |
||||||
|
} |
@ -0,0 +1,44 @@ |
|||||||
|
// Karma configuration file, see link for more information
|
||||||
|
// https://karma-runner.github.io/1.0/config/configuration-file.html
|
||||||
|
|
||||||
|
module.exports = function (config) { |
||||||
|
config.set({ |
||||||
|
basePath: '', |
||||||
|
frameworks: ['jasmine', '@angular-devkit/build-angular'], |
||||||
|
plugins: [ |
||||||
|
require('karma-jasmine'), |
||||||
|
require('karma-chrome-launcher'), |
||||||
|
require('karma-jasmine-html-reporter'), |
||||||
|
require('karma-coverage'), |
||||||
|
require('@angular-devkit/build-angular/plugins/karma') |
||||||
|
], |
||||||
|
client: { |
||||||
|
jasmine: { |
||||||
|
// you can add configuration options for Jasmine here
|
||||||
|
// the possible options are listed at https://jasmine.github.io/api/edge/Configuration.html
|
||||||
|
// for example, you can disable the random execution with `random: false`
|
||||||
|
// or set a specific seed with `seed: 4321`
|
||||||
|
}, |
||||||
|
clearContext: false // leave Jasmine Spec Runner output visible in browser
|
||||||
|
}, |
||||||
|
jasmineHtmlReporter: { |
||||||
|
suppressAll: true // removes the duplicated traces
|
||||||
|
}, |
||||||
|
coverageReporter: { |
||||||
|
dir: require('path').join(__dirname, './coverage/fe'), |
||||||
|
subdir: '.', |
||||||
|
reporters: [ |
||||||
|
{ type: 'html' }, |
||||||
|
{ type: 'text-summary' } |
||||||
|
] |
||||||
|
}, |
||||||
|
reporters: ['progress', 'kjhtml'], |
||||||
|
port: 9876, |
||||||
|
colors: true, |
||||||
|
logLevel: config.LOG_INFO, |
||||||
|
autoWatch: true, |
||||||
|
browsers: ['Chrome'], |
||||||
|
singleRun: false, |
||||||
|
restartOnFileChange: true |
||||||
|
}); |
||||||
|
}; |
@ -0,0 +1,39 @@ |
|||||||
|
{ |
||||||
|
"name": "fe", |
||||||
|
"version": "0.0.0", |
||||||
|
"scripts": { |
||||||
|
"ng": "ng", |
||||||
|
"start": "ng serve", |
||||||
|
"build": "ng build", |
||||||
|
"watch": "ng build --watch --configuration development", |
||||||
|
"test": "ng test" |
||||||
|
}, |
||||||
|
"private": true, |
||||||
|
"dependencies": { |
||||||
|
"@angular/animations": "~13.1.0", |
||||||
|
"@angular/common": "~13.1.0", |
||||||
|
"@angular/compiler": "~13.1.0", |
||||||
|
"@angular/core": "~13.1.0", |
||||||
|
"@angular/forms": "~13.1.0", |
||||||
|
"@angular/platform-browser": "~13.1.0", |
||||||
|
"@angular/platform-browser-dynamic": "~13.1.0", |
||||||
|
"@angular/router": "~13.1.0", |
||||||
|
"rxjs": "~7.4.0", |
||||||
|
"tslib": "^2.3.0", |
||||||
|
"zone.js": "~0.11.4" |
||||||
|
}, |
||||||
|
"devDependencies": { |
||||||
|
"@angular-devkit/build-angular": "~13.1.2", |
||||||
|
"@angular/cli": "~13.1.2", |
||||||
|
"@angular/compiler-cli": "~13.1.0", |
||||||
|
"@types/jasmine": "~3.10.0", |
||||||
|
"@types/node": "^12.11.1", |
||||||
|
"jasmine-core": "~3.10.0", |
||||||
|
"karma": "~6.3.0", |
||||||
|
"karma-chrome-launcher": "~3.1.0", |
||||||
|
"karma-coverage": "~2.1.0", |
||||||
|
"karma-jasmine": "~4.0.0", |
||||||
|
"karma-jasmine-html-reporter": "~1.7.0", |
||||||
|
"typescript": "~4.5.2" |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,10 @@ |
|||||||
|
import { NgModule } from '@angular/core'; |
||||||
|
import { RouterModule, Routes } from '@angular/router'; |
||||||
|
|
||||||
|
const routes: Routes = []; |
||||||
|
|
||||||
|
@NgModule({ |
||||||
|
imports: [RouterModule.forRoot(routes)], |
||||||
|
exports: [RouterModule] |
||||||
|
}) |
||||||
|
export class AppRoutingModule { } |
@ -0,0 +1 @@ |
|||||||
|
<span>{{ title }}</span> |
@ -0,0 +1,35 @@ |
|||||||
|
import { TestBed } from '@angular/core/testing'; |
||||||
|
import { RouterTestingModule } from '@angular/router/testing'; |
||||||
|
import { AppComponent } from './app.component'; |
||||||
|
|
||||||
|
describe('AppComponent', () => { |
||||||
|
beforeEach(async () => { |
||||||
|
await TestBed.configureTestingModule({ |
||||||
|
imports: [ |
||||||
|
RouterTestingModule |
||||||
|
], |
||||||
|
declarations: [ |
||||||
|
AppComponent |
||||||
|
], |
||||||
|
}).compileComponents(); |
||||||
|
}); |
||||||
|
|
||||||
|
it('should create the app', () => { |
||||||
|
const fixture = TestBed.createComponent(AppComponent); |
||||||
|
const app = fixture.componentInstance; |
||||||
|
expect(app).toBeTruthy(); |
||||||
|
}); |
||||||
|
|
||||||
|
it(`should have as title 'fe'`, () => { |
||||||
|
const fixture = TestBed.createComponent(AppComponent); |
||||||
|
const app = fixture.componentInstance; |
||||||
|
expect(app.title).toEqual('fe'); |
||||||
|
}); |
||||||
|
|
||||||
|
it('should render title', () => { |
||||||
|
const fixture = TestBed.createComponent(AppComponent); |
||||||
|
fixture.detectChanges(); |
||||||
|
const compiled = fixture.nativeElement as HTMLElement; |
||||||
|
expect(compiled.querySelector('.content span')?.textContent).toContain('fe app is running!'); |
||||||
|
}); |
||||||
|
}); |
@ -0,0 +1,10 @@ |
|||||||
|
import { Component } from '@angular/core'; |
||||||
|
|
||||||
|
@Component({ |
||||||
|
selector: 'app-root', |
||||||
|
templateUrl: './app.component.html', |
||||||
|
styleUrls: ['./app.component.less'] |
||||||
|
}) |
||||||
|
export class AppComponent { |
||||||
|
title = 'ты лох'; |
||||||
|
} |
@ -0,0 +1,18 @@ |
|||||||
|
import { NgModule } from '@angular/core'; |
||||||
|
import { BrowserModule } from '@angular/platform-browser'; |
||||||
|
|
||||||
|
import { AppRoutingModule } from './app-routing.module'; |
||||||
|
import { AppComponent } from './app.component'; |
||||||
|
|
||||||
|
@NgModule({ |
||||||
|
declarations: [ |
||||||
|
AppComponent |
||||||
|
], |
||||||
|
imports: [ |
||||||
|
BrowserModule, |
||||||
|
AppRoutingModule |
||||||
|
], |
||||||
|
providers: [], |
||||||
|
bootstrap: [AppComponent] |
||||||
|
}) |
||||||
|
export class AppModule { } |
@ -0,0 +1,3 @@ |
|||||||
|
export const environment = { |
||||||
|
production: true |
||||||
|
}; |
@ -0,0 +1,16 @@ |
|||||||
|
// This file can be replaced during build by using the `fileReplacements` array.
|
||||||
|
// `ng build` replaces `environment.ts` with `environment.prod.ts`.
|
||||||
|
// The list of file replacements can be found in `angular.json`.
|
||||||
|
|
||||||
|
export const environment = { |
||||||
|
production: false |
||||||
|
}; |
||||||
|
|
||||||
|
/* |
||||||
|
* For easier debugging in development mode, you can import the following file |
||||||
|
* to ignore zone related error stack frames such as `zone.run`, `zoneDelegate.invokeTask`. |
||||||
|
* |
||||||
|
* This import should be commented out in production mode because it will have a negative impact |
||||||
|
* on performance if an error is thrown. |
||||||
|
*/ |
||||||
|
// import 'zone.js/plugins/zone-error'; // Included with Angular CLI.
|
After Width: | Height: | Size: 948 B |
@ -0,0 +1,13 @@ |
|||||||
|
<!doctype html> |
||||||
|
<html lang="en"> |
||||||
|
<head> |
||||||
|
<meta charset="utf-8"> |
||||||
|
<title>Fe</title> |
||||||
|
<base href="/"> |
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1"> |
||||||
|
<link rel="icon" type="image/x-icon" href="favicon.ico"> |
||||||
|
</head> |
||||||
|
<body> |
||||||
|
<app-root></app-root> |
||||||
|
</body> |
||||||
|
</html> |
@ -0,0 +1,12 @@ |
|||||||
|
import { enableProdMode } from '@angular/core'; |
||||||
|
import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; |
||||||
|
|
||||||
|
import { AppModule } from './app/app.module'; |
||||||
|
import { environment } from './environments/environment'; |
||||||
|
|
||||||
|
if (environment.production) { |
||||||
|
enableProdMode(); |
||||||
|
} |
||||||
|
|
||||||
|
platformBrowserDynamic().bootstrapModule(AppModule) |
||||||
|
.catch(err => console.error(err)); |
@ -0,0 +1,53 @@ |
|||||||
|
/** |
||||||
|
* This file includes polyfills needed by Angular and is loaded before the app. |
||||||
|
* You can add your own extra polyfills to this file. |
||||||
|
* |
||||||
|
* This file is divided into 2 sections: |
||||||
|
* 1. Browser polyfills. These are applied before loading ZoneJS and are sorted by browsers. |
||||||
|
* 2. Application imports. Files imported after ZoneJS that should be loaded before your main |
||||||
|
* file. |
||||||
|
* |
||||||
|
* The current setup is for so-called "evergreen" browsers; the last versions of browsers that |
||||||
|
* automatically update themselves. This includes recent versions of Safari, Chrome (including |
||||||
|
* Opera), Edge on the desktop, and iOS and Chrome on mobile. |
||||||
|
* |
||||||
|
* Learn more in https://angular.io/guide/browser-support
|
||||||
|
*/ |
||||||
|
|
||||||
|
/*************************************************************************************************** |
||||||
|
* BROWSER POLYFILLS |
||||||
|
*/ |
||||||
|
|
||||||
|
/** |
||||||
|
* By default, zone.js will patch all possible macroTask and DomEvents |
||||||
|
* user can disable parts of macroTask/DomEvents patch by setting following flags |
||||||
|
* because those flags need to be set before `zone.js` being loaded, and webpack |
||||||
|
* will put import in the top of bundle, so user need to create a separate file |
||||||
|
* in this directory (for example: zone-flags.ts), and put the following flags |
||||||
|
* into that file, and then add the following code before importing zone.js. |
||||||
|
* import './zone-flags'; |
||||||
|
* |
||||||
|
* The flags allowed in zone-flags.ts are listed here. |
||||||
|
* |
||||||
|
* The following flags will work for all browsers. |
||||||
|
* |
||||||
|
* (window as any).__Zone_disable_requestAnimationFrame = true; // disable patch requestAnimationFrame
|
||||||
|
* (window as any).__Zone_disable_on_property = true; // disable patch onProperty such as onclick
|
||||||
|
* (window as any).__zone_symbol__UNPATCHED_EVENTS = ['scroll', 'mousemove']; // disable patch specified eventNames
|
||||||
|
* |
||||||
|
* in IE/Edge developer tools, the addEventListener will also be wrapped by zone.js |
||||||
|
* with the following flag, it will bypass `zone.js` patch for IE/Edge |
||||||
|
* |
||||||
|
* (window as any).__Zone_enable_cross_context_check = true; |
||||||
|
* |
||||||
|
*/ |
||||||
|
|
||||||
|
/*************************************************************************************************** |
||||||
|
* Zone JS is required by default for Angular itself. |
||||||
|
*/ |
||||||
|
import 'zone.js'; // Included with Angular CLI.
|
||||||
|
|
||||||
|
|
||||||
|
/*************************************************************************************************** |
||||||
|
* APPLICATION IMPORTS |
||||||
|
*/ |
@ -0,0 +1 @@ |
|||||||
|
/* You can add global styles to this file, and also import other style files */ |
@ -0,0 +1,26 @@ |
|||||||
|
// This file is required by karma.conf.js and loads recursively all the .spec and framework files
|
||||||
|
|
||||||
|
import 'zone.js/testing'; |
||||||
|
import { getTestBed } from '@angular/core/testing'; |
||||||
|
import { |
||||||
|
BrowserDynamicTestingModule, |
||||||
|
platformBrowserDynamicTesting |
||||||
|
} from '@angular/platform-browser-dynamic/testing'; |
||||||
|
|
||||||
|
declare const require: { |
||||||
|
context(path: string, deep?: boolean, filter?: RegExp): { |
||||||
|
<T>(id: string): T; |
||||||
|
keys(): string[]; |
||||||
|
}; |
||||||
|
}; |
||||||
|
|
||||||
|
// First, initialize the Angular testing environment.
|
||||||
|
getTestBed().initTestEnvironment( |
||||||
|
BrowserDynamicTestingModule, |
||||||
|
platformBrowserDynamicTesting(), |
||||||
|
); |
||||||
|
|
||||||
|
// Then we find all the tests.
|
||||||
|
const context = require.context('./', true, /\.spec\.ts$/); |
||||||
|
// And load the modules.
|
||||||
|
context.keys().map(context); |
@ -0,0 +1,15 @@ |
|||||||
|
/* To learn more about this file see: https://angular.io/config/tsconfig. */ |
||||||
|
{ |
||||||
|
"extends": "./tsconfig.json", |
||||||
|
"compilerOptions": { |
||||||
|
"outDir": "./out-tsc/app", |
||||||
|
"types": [] |
||||||
|
}, |
||||||
|
"files": [ |
||||||
|
"src/main.ts", |
||||||
|
"src/polyfills.ts" |
||||||
|
], |
||||||
|
"include": [ |
||||||
|
"src/**/*.d.ts" |
||||||
|
] |
||||||
|
} |
@ -0,0 +1,32 @@ |
|||||||
|
/* To learn more about this file see: https://angular.io/config/tsconfig. */ |
||||||
|
{ |
||||||
|
"compileOnSave": false, |
||||||
|
"compilerOptions": { |
||||||
|
"baseUrl": "./", |
||||||
|
"outDir": "./dist/out-tsc", |
||||||
|
"forceConsistentCasingInFileNames": true, |
||||||
|
"strict": true, |
||||||
|
"noImplicitOverride": true, |
||||||
|
"noPropertyAccessFromIndexSignature": true, |
||||||
|
"noImplicitReturns": true, |
||||||
|
"noFallthroughCasesInSwitch": true, |
||||||
|
"sourceMap": true, |
||||||
|
"declaration": false, |
||||||
|
"downlevelIteration": true, |
||||||
|
"experimentalDecorators": true, |
||||||
|
"moduleResolution": "node", |
||||||
|
"importHelpers": true, |
||||||
|
"target": "es2017", |
||||||
|
"module": "es2020", |
||||||
|
"lib": [ |
||||||
|
"es2020", |
||||||
|
"dom" |
||||||
|
] |
||||||
|
}, |
||||||
|
"angularCompilerOptions": { |
||||||
|
"enableI18nLegacyMessageIdFormat": false, |
||||||
|
"strictInjectionParameters": true, |
||||||
|
"strictInputAccessModifiers": true, |
||||||
|
"strictTemplates": true |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,18 @@ |
|||||||
|
/* To learn more about this file see: https://angular.io/config/tsconfig. */ |
||||||
|
{ |
||||||
|
"extends": "./tsconfig.json", |
||||||
|
"compilerOptions": { |
||||||
|
"outDir": "./out-tsc/spec", |
||||||
|
"types": [ |
||||||
|
"jasmine" |
||||||
|
] |
||||||
|
}, |
||||||
|
"files": [ |
||||||
|
"src/test.ts", |
||||||
|
"src/polyfills.ts" |
||||||
|
], |
||||||
|
"include": [ |
||||||
|
"src/**/*.spec.ts", |
||||||
|
"src/**/*.d.ts" |
||||||
|
] |
||||||
|
} |
@ -0,0 +1,56 @@ |
|||||||
|
/* |
||||||
|
Tabs: Agents, Tasks, Summary |
||||||
|
every tab has list page and item page with more info/actions |
||||||
|
|
||||||
|
Agents: |
||||||
|
|
||||||
|
| id | alias | ..see struct | tasks done |
||||||
|
| stripped | alias | ... | clickable number of assigned jobs |
||||||
|
|
||||||
|
almost all fields are editable, rows are deletable |
||||||
|
|
||||||
|
*/ |
||||||
|
|
||||||
|
use actix_web::{get, web, App, HttpResponse, HttpServer, Responder}; |
||||||
|
use rust_embed::RustEmbed; |
||||||
|
use std::borrow::Cow; |
||||||
|
use u_lib::unwrap_enum; |
||||||
|
|
||||||
|
#[derive(RustEmbed)] |
||||||
|
#[folder = "./src/server/fe/dist/fe/"] |
||||||
|
struct Files; |
||||||
|
|
||||||
|
impl Files { |
||||||
|
pub fn get_static(path: impl AsRef<str>) -> Option<&'static [u8]> { |
||||||
|
let file = Self::get(path.as_ref())?.data; |
||||||
|
Some(unwrap_enum!(file, Cow::Borrowed)) |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
#[get("/")] |
||||||
|
async fn main_page() -> impl Responder { |
||||||
|
let index = Files::get_static("index.html").unwrap(); |
||||||
|
HttpResponse::Ok().body(index) |
||||||
|
} |
||||||
|
|
||||||
|
#[get("/{file}")] |
||||||
|
async fn static_files_adapter(file: web::Path<(String,)>) -> impl Responder { |
||||||
|
let file = file.into_inner().0; |
||||||
|
let mimetype = mime_guess::from_path(&file).first_or_octet_stream(); |
||||||
|
match Files::get_static(file) { |
||||||
|
Some(data) => HttpResponse::Ok() |
||||||
|
.content_type(mimetype.to_string()) |
||||||
|
.body(data), |
||||||
|
None => HttpResponse::NotFound().finish(), |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
#[actix_web::main] |
||||||
|
pub async fn serve() -> std::io::Result<()> { |
||||||
|
let addr = "127.0.0.1:8080"; |
||||||
|
println!("Serving at http://{}", addr); |
||||||
|
HttpServer::new(|| App::new().service(main_page).service(static_files_adapter)) |
||||||
|
.bind(addr)? |
||||||
|
.run() |
||||||
|
.await |
||||||
|
} |
Loading…
Reference in new issue