96 Commits

Author SHA1 Message Date
205a8c406b Merge branch 'wip-orbtk' into no-locales 2020-07-05 18:05:37 +02:00
ee9ce806e6 stylesheet
Signed-off-by: Ralf Zerres <ralf.zerres@networkx.de>
2020-07-05 17:29:42 +02:00
8530568757 Cargo.toml: set projects framework name
Signed-off-by: Ralf Zerres <ralf.zerres@networkx.de>
2020-07-05 16:42:35 +02:00
45dbfe0f42 Merge branch 'wip-orbtk' into no_locales
Signed-off-by: Ralf Zerres <ralf.zerres@networkx.de>
2020-07-05 14:08:32 +02:00
275daababf policycheck: use material_icons_font
Signed-off-by: Ralf Zerres <ralf.zerres@networkx.de>
2020-07-05 14:06:01 +02:00
576c41a765 examples: bugfix ComboList in advowidgets
Signed-off-by: Ralf Zerres <ralf.zerres@networkx.de>
2020-07-05 14:05:03 +02:00
0fe3f55ee5 examples: advowidgets
* update to use new wip-orbtk branch
  - using lates material-icons-font code
  - use bugfix to add ComboBox items

Signed-off-by: Ralf Zerres <ralf.zerres@networkx.de>
2020-07-05 12:12:25 +02:00
8c5d540a74 deactivate println!(), use logging via tracing crate
Signed-off-by: Ralf Zerres <ralf.zerres@networkx.de>
2020-07-03 03:31:46 +02:00
9c819af548 Cargo.toml: bump to 0.1.1
Signed-off-by: Ralf Zerres <ralf.zerres@networkx.de>
2020-07-03 02:44:57 +02:00
e7bda45e0b resources: stylesheet: typo correcton
Signed-off-by: Ralf Zerres <ralf.zerres@networkx.de>
2020-07-03 02:43:44 +02:00
5cf40645e2 policycheck_state: traceing update, merge error fix
Signed-off-by: Ralf Zerres <ralf.zerres@networkx.de>
2020-07-03 02:30:13 +02:00
a1e9c3236c Merge remote-tracking branch 'NWX/wip-orbtk' into no_locales
Signed-off-by: Ralf Zerres <ralf.zerres@networkx.de>
2020-07-03 02:07:21 +02:00
e079d34663 resource: stylesheet: advotracker.css
Signed-off-by: Ralf Zerres <ralf.zerres@networkx.de>
2020-07-03 01:15:37 +02:00
a89e400029 policycheck: functionality update
* show count of active hashmap members in GUI
* move import call to init function
* show results of policy_number validation in GUI
* improve tracing information
* disable stdout messages via println!()

Signed-off-by: Ralf Zerres <ralf.zerres@networkx.de>
2020-07-03 01:12:25 +02:00
1d48f294dc main: add stylesheet, comment out inactive includes
Signed-off-by: Ralf Zerres <ralf.zerres@networkx.de>
2020-07-03 01:10:28 +02:00
2ba39436bc callbacks: global_state: save data vector to ron file on disk
* new functionality
* save imported / edited data-structures persitantliy
  on disk to file in 'ron' format

Signed-off-by: Ralf Zerres <ralf.zerres@networkx.de>
2020-07-03 01:05:33 +02:00
d0a5013b71 callbacks: global_state: compiler sanitization
* use unspecific lifetimes

Signed-off-by: Ralf Zerres <ralf.zerres@networkx.de>
2020-07-03 01:04:21 +02:00
58045967cb callbacks: policy_check: update identifier for tracing
Signed-off-by: Ralf Zerres <ralf.zerres@networkx.de>
2020-07-03 01:01:24 +02:00
dbe0ef9ea1 widgets: main_view: activate structure init via default()
* possible, since structure provides access via orbtk

Signed-off-by: Ralf Zerres <ralf.zerres@networkx.de>
2020-07-03 00:59:59 +02:00
7f58ecb96c imports: allianzdirectcall: use array to verify on startup
* using test dataset

Signed-off-by: Ralf Zerres <ralf.zerres@networkx.de>
2020-07-03 00:58:35 +02:00
8ec566b78a structures: orbtk includes
* make structures accessible for orbtk
* ducumentation update

Signed-off-by: Ralf Zerres <ralf.zerres@networkx.de>
2020-07-03 00:57:34 +02:00
caec9e4d68 data: keys: cleanup DCES id's and properties
Signed-off-by: Ralf Zerres <ralf.zerres@networkx.de>
2020-07-03 00:55:41 +02:00
e949ae61eb locales: remove redundant allianzdirectcal
Signed-off-by: Ralf Zerres <ralf.zerres@networkx.de>
2020-07-03 00:54:06 +02:00
41464c9346 Cargo.toml: identifier change
* use 'nwx' as company prefix

Signed-off-by: Ralf Zerres <ralf.zerres@networkx.de>
2020-07-03 00:48:10 +02:00
b76090d846 policycheck_view: adapt width of policy number text_box
Signed-off-by: Ralf Zerres <ralf.zerres@networkx.de>
2020-07-02 08:39:15 +02:00
8d7d5176d9 examples: advowidgets: update to new api syntax
* when addressing widgets properties the new api syntax
  seems more natural. It accesses the properties via a function
  oriented notation:

  - view_name(<ctx.widget()).<entity>_mut()

  - ctx.child("<entity>").set::<type>("<field>", <new_property>)

  - <widget_class>(ctx.child(<entity)).set_<field>(<new_property>)

Signed-off-by: Ralf Zerres <ralf.zerres@networkx.de>
2020-07-02 07:23:23 +02:00
31b45ab690 Cargo.toml: rebase root of local orbtk sources
Signed-off-by: Ralf Zerres <ralf.zerres@networkx.de>
2020-07-02 07:10:24 +02:00
8f6655d96c Cargo.toml: preset the default binary
* use the GUI variant 'advotracker' as the default binary

Signed-off-by: Ralf Zerres <ralf.zerres@networkx.de>
2020-07-02 07:08:05 +02:00
e6574c9cda Cargo.toml: preset the default binary
* use the GUI variant 'advotracker' as the default binary

Signed-off-by: Ralf Zerres <ralf.zerres@networkx.de>
2020-07-01 20:31:14 +02:00
942373caf6 I18n: remove stale use statements to Locale crate
Signed-off-by: Ralf Zerres <ralf.zerres@networkx.de>
2020-07-01 20:25:58 +02:00
107cb164dd advotracker: remove i18n support
* remove localization strings
* crate locales does not work reliable on Windows!
* remove here for now.

Signed-off-by: Ralf Zerres <ralf.zerres@networkx.de>
2020-07-01 17:25:06 +02:00
03f308b4b6 state update
Signed-off-by: Ralf Zerres <ralf.zerres@networkx.de>
2020-07-01 16:14:01 +02:00
9b04a790da state update
Signed-off-by: Ralf Zerres <ralf.zerres@networkx.de>
2020-07-01 12:02:01 +02:00
6e8317e150 csv-test: remove unneeded references
Signed-off-by: Ralf Zerres <ralf.zerres@networkx.de>
2020-07-01 05:37:24 +02:00
a388f7488b services: update im/exporter and remove unused source
Signed-off-by: Ralf Zerres <ralf.zerres@networkx.de>
2020-07-01 05:36:24 +02:00
428fde15d6 parse_args: make vektor 'viperus' explicit
* when using as a globel, this is more easy to recognize

Signed-off-by: Ralf Zerres <ralf.zerres@networkx.de>
2020-07-01 05:35:58 +02:00
3dd2afa4c9 Corgo.toml: style update
Signed-off-by: Ralf Zerres <ralf.zerres@networkx.de>
2020-07-01 05:33:47 +02:00
c3055a2b23 .gitignore: typo correction and commenting user config settings
* we don't save config.toml in upstream

Signed-off-by: Ralf Zerres <ralf.zerres@networkx.de>
2020-06-30 15:08:28 +02:00
3c04881fe2 advotracker-db: update to head
Signed-off-by: Ralf Zerres <ralf.zerres@networkx.de>
2020-06-30 15:06:26 +02:00
c3b18e539d advotracker: get correct crates and modules into scope
Signed-off-by: Ralf Zerres <ralf.zerres@networkx.de>
2020-06-30 15:05:02 +02:00
06aa56a2b8 advotracker: link to resources
* call from binary-directory will search resource files
  in subdirecotries beneath this directory

Signed-off-by: Ralf Zerres <ralf.zerres@networkx.de>
2020-06-30 15:03:05 +02:00
2b07f3628a policycheck: initial standalone frontend
Signed-off-by: Ralf Zerres <ralf.zerres@networkx.de>
2020-06-30 15:02:17 +02:00
5d69bf4340 csv-test: structure path update
Signed-off-by: Ralf Zerres <ralf.zerres@networkx.de>
2020-06-30 15:00:37 +02:00
31ba4eaf70 advotracker: widget update
Signed-off-by: Ralf Zerres <ralf.zerres@networkx.de>
2020-06-30 15:00:03 +02:00
e920e03f37 advotracker: callback: update
Signed-off-by: Ralf Zerres <ralf.zerres@networkx.de>
2020-06-30 14:57:56 +02:00
7a6257f19f advotracker-db: update to new head
Signed-off-by: Ralf Zerres <ralf.zerres@networkx.de>
2020-06-30 10:32:43 +02:00
19b8389aca advotrackerd: incorporate this commit
Signed-off-by: Ralf Zerres <ralf.zerres@networkx.de>
2020-06-30 10:12:37 +02:00
587500bdd4 advotracker-db: incorporate this commit
Signed-off-by: Ralf Zerres <ralf.zerres@networkx.de>
2020-06-30 10:11:07 +02:00
0a37da4c4a Cargo.toml: add workspace advotracker-db
Signed-off-by: Ralf Zerres <ralf.zerres@networkx.de>
2020-06-30 10:10:13 +02:00
e1e53d08cd advotrackerd: new submodules
* orign: https://gitea.networkx.de:50443/rzerres/advotrackerd
* for now, we do have a Microsoft CA which isn't handled as an
  official CA.
  You need to exclude SSL verification to push/pull/clone like this:

* # git config  --file .git/modules/advotrackerd/config --list
* # git config --file .git/modules/advotrackerd/config  http.https://gitea.networkx.de:50443.sslverify false

* # git -c http.https://gitea.networkx.de:50443.sslverify=false submodule add  https://gitea.networkx.de:50443/rzerres/advotrackerd

Signed-off-by: Ralf Zerres <ralf.zerres@networkx.de>
2020-06-30 10:07:49 +02:00
d11118c7d7 database: remove stale submodule
* substitued with 'advetrackerd'

Signed-off-by: Ralf Zerres <ralf.zerres@networkx.de>
2020-06-30 07:45:54 +02:00
2206e28d80 advotracker-db: new submodules
* orign: https://gitea.networkx.de:50443/rzerres/advotracker.db
* for now, we do have a Microsoft CA which isn't handled as an
  official CA.
  You need to exclude SSL verification to push/pull/clone like this:

* # git config  --file .git/modules/advotracker-db/config --list
* # git config --file .git/modules/advotracker-db/config  http.https://gitea.networkx.de:50443.sslverify false

* # git -c http.https://gitea.networkx.de:50443.sslverify=false submodule add  https://gitea.networkx.de:50443/rzerres/advotracker-db

Signed-off-by: Ralf Zerres <ralf.zerres@networkx.de>
2020-06-30 07:21:27 +02:00
0fa3357ffc Cargo.toml: comment out orbtk/debug
Signed-off-by: Ralf Zerres <ralf.zerres@networkx.de>
2020-06-29 14:45:56 +02:00
5e79cb3bd1 restructure source tree
Signed-off-by: Ralf Zerres <ralf.zerres@networkx.de>
2020-06-29 13:47:45 +02:00
a9a0873266 services: allianzdirectcall: update process logic
* return value: usize
* import: fill HashMap from source record
* import: fill in vector PolicyData

Signed-off-by: Ralf Zerres <ralf.zerres@networkx.de>
2020-06-29 07:59:14 +02:00
c70908629b I18n: update entries
Signed-off-by: Ralf Zerres <ralf.zerres@networkx.de>
2020-06-29 07:58:40 +02:00
d27b5545ca csv-test: update the .env test environment
Signed-off-by: Ralf Zerres <ralf.zerres@networkx.de>
2020-06-29 07:57:48 +02:00
11b5eef742 csv-test: include cli flag to provide a test policy number
* TODO: viperus does not offer the input of usize/i64
  therefore we can't use big integer for now

Signed-off-by: Ralf Zerres <ralf.zerres@networkx.de>
2020-06-29 07:55:44 +02:00
10ec91f826 csv-test: update test data
Signed-off-by: Ralf Zerres <ralf.zerres@networkx.de>
2020-06-29 07:54:34 +02:00
3b945ff8be csv-test: integrate HashMap functionality
Signed-off-by: Ralf Zerres <ralf.zerres@networkx.de>
2020-06-29 05:25:29 +02:00
103e9d4202 data.rs: include copy macro for PolicyCode
Signed-off-by: Ralf Zerres <ralf.zerres@networkx.de>
2020-06-29 05:24:29 +02:00
efb859c843 csv-test: new minimal test datasets
Signed-off-by: Ralf Zerres <ralf.zerres@networkx.de>
2020-06-29 05:23:36 +02:00
66df65648b I18n: policy validation update
Signed-off-by: Ralf Zerres <ralf.zerres@networkx.de>
2020-06-29 05:22:52 +02:00
9969b30035 Cargo.toml: update umbrella project name
Signed-off-by: Ralf Zerres <ralf.zerres@networkx.de>
2020-06-29 01:19:44 +02:00
a7d6618d34 csv-test: new testfile that holds enough test records
* no need to parse 40MB
* ~15000 records are more then enough

Signed-off-by: Ralf Zerres <ralf.zerres@networkx.de>
2020-06-29 01:18:55 +02:00
fc94e5ba8b advotracker: services substructure
Signed-off-by: Ralf Zerres <ralf.zerres@networkx.de>
2020-06-29 01:15:41 +02:00
7d39c88b9e advotracker: library definition to use as crate
Signed-off-by: Ralf Zerres <ralf.zerres@networkx.de>
2020-06-29 01:14:55 +02:00
be0743011b I18N: update localization file to meet new project name
Signed-off-by: Ralf Zerres <ralf.zerres@networkx.de>
2020-06-29 01:14:04 +02:00
27c67a9e8c Rename to frontend to advotracker
Signed-off-by: Ralf Zerres <ralf.zerres@networkx.de>
2020-06-29 01:13:08 +02:00
926ba4487f frontend: policycheck_menu
* orbtk code to handle a menu structure

Signed-off-by: Ralf Zerres <ralf.zerres@networkx.de>
2020-06-28 00:02:10 +02:00
c3a20df68c frontend: examples: pdf_check example
Signed-off-by: Ralf Zerres <ralf.zerres@networkx.de>
2020-06-28 00:00:52 +02:00
9d3fa2235b frontend: resources: used in example code
* example advotracker: stylesheet orbtk test widgets
* example advotracker: MaterialIcons ttf font

Signed-off-by: Ralf Zerres <ralf.zerres@networkx.de>
2020-06-27 23:58:09 +02:00
acb9e46446 frontend: locales: i18n updates
Signed-off-by: Ralf Zerres <ralf.zerres@networkx.de>
2020-06-27 23:57:01 +02:00
63da81daa8 update 1
Signed-off-by: Ralf Zerres <ralf.zerres@networkx.de>
2020-06-27 22:30:50 +02:00
00cdb4f995 frontend: Cargo.toml: include csv for example csv-test
Signed-off-by: Ralf Zerres <ralf.zerres@networkx.de>
2020-06-27 22:27:00 +02:00
d5477bd9e6 frontend: examples: remove old orbtk examples maintained upstream
Signed-off-by: Ralf Zerres <ralf.zerres@networkx.de>
2020-06-27 22:26:09 +02:00
45efa8cbba frontend: examples: introduce csv-test
* cli to test data import and export
  - import from a csv file
  - export to a csv file

Signed-off-by: Ralf Zerres <ralf.zerres@networkx.de>
2020-06-27 22:19:48 +02:00
917df1a7d6 fontend: examples: .env for testing
Signed-off-by: Ralf Zerres <ralf.zerres@networkx.de>
2020-06-27 22:18:55 +02:00
c2b38e7772 frontend: example: csv-import helper update
Signed-off-by: Ralf Zerres <ralf.zerres@networkx.de>
2020-06-26 23:25:34 +02:00
f435f214d9 .gitignore: update new patterns
Signed-off-by: Ralf Zerres <ralf.zerres@networkx.de>
2020-06-26 23:05:36 +02:00
53e6180055 frontend: Node.toml
Signed-off-by: Ralf Zerres <ralf.zerres@networkx.de>
2020-06-26 23:05:04 +02:00
2b4af02db6 frontend: example: csv-import helper
* cli to import a given csv configured text file

Signed-off-by: Ralf Zerres <ralf.zerres@networkx.de>
2020-06-26 23:01:51 +02:00
60e9d307bb frontend: Cargo.toml: new dependencies
* commandline parsing: clap, viperus
* csv file handling
* envirenment variable: dotenv, envy
* i18n: locales
* serde json support
* tracing: tracing, tracing-subscriber

Signed-off-by: Ralf Zerres <ralf.zerres@networkx.de>
2020-06-26 22:55:12 +02:00
9e593ae609 policylist: wip: view and state handling updates
Signed-off-by: Ralf Zerres <ralf.zerres@networkx.de>
2020-06-22 18:41:08 +02:00
672f7c6eac policydata: wip: view and state handling updates
Signed-off-by: Ralf Zerres <ralf.zerres@networkx.de>
2020-06-22 18:41:08 +02:00
d6b5552122 policycheck: wip: view and state handling updates
Signed-off-by: Ralf Zerres <ralf.zerres@networkx.de>
2020-06-22 18:41:08 +02:00
0c69ca176a main_view: wip updates
Signed-off-by: Ralf Zerres <ralf.zerres@networkx.de>
2020-06-22 18:41:07 +02:00
d9cfa4dcaf main: update stylesheet reference, basic geometry
* new module 'policycheck_menu'
* reference the project stylesheet
* update a default geometry

Signed-off-by: Ralf Zerres <ralf.zerres@networkx.de>
2020-06-22 18:41:07 +02:00
2d5416ce4c keys: update Classes, DCES entities, component values
* the elements are available as public advertised string values

Signed-off-by: Ralf Zerres <ralf.zerres@networkx.de>
2020-06-22 18:41:07 +02:00
259d424f1e base: update 'PROP_POLICY_LISTS'
Signed-off-by: Ralf Zerres <ralf.zerres@networkx.de>
2020-06-22 18:41:04 +02:00
11342e92cf data: define Allianz export structure for csv files
* data need to be transfered as a csv-file attachment via email
* each row takes a semicolon separeted list of string fields
* this structure is defined as rust 'struct CSVExport'
* the struct CSVExport will reference to its child stuctures.

Signed-off-by: Ralf Zerres <ralf.zerres@networkx.de>
2020-06-22 14:15:22 +02:00
477f89eb0c Cargo.toml: reference to orbtk's local repository
Signed-off-by: Ralf Zerres <ralf.zerres@networkx.de>
2020-06-22 14:13:37 +02:00
3c8ac0ef7e frontend: resources: assets/resources used inside the frontend
* images: referenced image files
* fonts: rendering elements
* stylesheets: theme definition using CSS subsystem

Signed-off-by: Ralf Zerres <ralf.zerres@networkx.de>
2020-06-19 17:53:22 +02:00
86059ccebd frontend: base_state: global methods implemented as a trait
Signed-off-by: Ralf Zerres <ralf.zerres@networkx.de>
2020-06-19 17:51:21 +02:00
4ae06a3db0 frontend: keys: static variables used in themes
Signed-off-by: Ralf Zerres <ralf.zerres@networkx.de>
2020-06-19 17:49:31 +02:00
a4b2028cb1 delete me!
Signed-off-by: Ralf Zerres <ralf.zerres@networkx.de>
2020-06-19 17:46:19 +02:00
229 changed files with 4493 additions and 11222 deletions

11
.gitmodules vendored
View File

@@ -1,6 +1,9 @@
[submodule "advotrackerdb"]
path = crates/advotrackerdb
url = https://gitea.networkx.de:50443/rzerres/advotrackerdb
[submodule "backend"]
path = backend
url = ./backend/
[submodule "advotracker-db"]
path = advotracker-db
url = https://gitea.networkx.de:50443/rzerres/advotracker-db
[submodule "advotrackerd"]
path = crates/advotrackerd
path = advotrackerd
url = https://gitea.networkx.de:50443/rzerres/advotrackerd

View File

@@ -1,46 +1,17 @@
[package]
name = "advotracker"
name = "advotracker-framework"
version = "0.1.0"
authors = ["Ralf Zerres <ralf.zerres@networkx.de>"]
description = "Supports lawyers to capture relevant data encountered during an online legal advice\n"
repository = "https://gitea.networkx.de:50443/rzerres/advotracker"
homepage = "https://gitea.networkx.de:50443/rzerres/advotracker"
repository = "https://github.com/rzerres/advotracker"
homepage = "https://github.com/rzerres/advotracker"
documentation = "https://docs.rs/advotracker"
readme = "README.md"
license = "0BSD OR MIT"
keywords = [
"advotracker",
"lawyer",
]
edition = "2018"
publish = false
#default-run = "crates/advotracker_client"
[dependencies]
advotrackerdb = { version = "0.1.0-alpha1", path = "crates/advotrackerdb" }
advotrackerd = { version = "0.1.0-alpha1", path = "crates/advotrackerd", default-features = false }
advotracker_client = { version = "0.1.5-alpha2", path = "crates/advotracker_client", default-features = false }
[features]
default = ["sqlite"]
# enable optional db backends
sqlite = []
#sqlite = ["advotrackerdb_sqlite"]
#postgresql = ["advotrackerdb_pstgresql"]
[profile.dev]
#opt-level = 0
opt-level = 1
incremental = true
debug = true
lto = false
codegen-units = 5
panic = 'unwind'
overflow-checks = true
[profile.release]
incremental = true
panic = "abort"
lto = true
codegen-units=1
@@ -50,6 +21,15 @@ opt-level="s"
# optimize to smallest size
#opt-level = "z"
[profile.dev]
opt-level = 0
debug = true
lto = false
codegen-units = 5
panic = 'unwind'
incremental = true
overflow-checks = true
[profile.test]
opt-level = 0
debug = 2
@@ -63,7 +43,8 @@ overflow-checks = true
[workspace]
members = [
"crates/advotrackerd",
"crates/advotrackerdb",
"crates/advotracker_client",
"advotrackerd",
"advotracker-db",
"advotracker",
"advotracker_qml",
]

147
README.md
View File

@@ -1,145 +1,24 @@
<!-- AdvoTracker README.md -->
<!-- version: 0.1.3 -->
<!-- AdvoTracker.markdown -->
<!-- version: 1.1 -->
<!-- markdown-toc start - Don't edit this section. Run M-x markdown-toc-generate-toc again -->
<!-- markdown-toc end -->
## About
# AdvoTracker - Hotline tool für Advokaten #
`advotracker` supports lawyers to capture relevant data encountered during an online
legal advice.
AdvoTracker unterstützt Anwälte bei der Erfassung von Mandatsdaten zu einer Online-Beratung.
The application components are implemented using the programming language *Rust*.
The graphical user interface (GUI) uses the class-lib *OrbTk*, which is natively
encoded in *Rust* as well.
Das Tool wurde als multi-Pattform Anwendung konzipiert.
`advotracker` can be deployed on every target operating system that is officialy
supported by the `OrbTK` toolkit. Currently included are:
Als Programmiersprache wird *Rust* verwendet. Die Implementierung der
GUI Elemente erfolgt mit der Klassenbibliothek *OrbTk*.
* macOS
* Linux
* openBSD
* Redox OS
* Web-Browser
* Windows
Als Dokumentationsquellen wird auf die offiziellen Projektseiten [Rust Book][^1] und [OrbTk][^2] verwiesen.
Porting to and in activ development are:
# Internationalisierung #
* Android
* iOS
* ubuntu Touch
Reference is made to the official project pages of [Rust Book][^1] and [OrbTk][^2]
as documentation sources.
## Internationalization
Dialogs and messages generated inside the application will respect the system language
of the active user. This is adaptable via the environment variable
(default: LANG = en_US.UTF8 or LANG = C).
Within the source code you can find translated constants in the subdirectory 'locales'
(<crate-root>/src/locales/advotracker.json).
For every supported language-string, you will find a block starting with the
generic message code, followed by the target language translation. Translation lines
are identified by its ISO Code (e.g. de_DE.UTF8, es_ES.UTF8).
## Installation from source code
You can either download the `advotracker` source code as a Zip-File or using `git`
from projects repositoy URL.
The source code is subdiveded in three crates:
* advotracker
* advotrackerd
* advotrackerdb
Currently the given WEB-URL certificate is signed by a Microsoft CA.
Since this CA can't be verified from offical CA-lists you have to proceed as follows:
```sh
$ cd <your_path>
$ git -c http.https://gitea.networkx.de:50443.sslverify=false \
clone --recurse-submodules --jobs=10 \
https://gitea.networkx.de:50443/rzerres/advotracker
```
To compile the target binary code, you have to use rusts toolchain.
If this isn't already installed on your development system, please go ahead
and either use the official supported installation tool from the rust communtiy
([rustup][^3]). As an alternitiv, you can download and install the compiler package
using your systems package manager.
### native operating system binaries
A binary compatible with your target operating system will be compiled
with the following command:
```sh
$ cd <advotracker_root>
$ cargo build --release
```
The toolchain also allows to cross-compile for other operating systems. Please
consult the rust documentation for further instructions.
### web-browser application
- **Prerequisits**
To run as a browser, electron or cordova app, you have to install cargo-node:
```sh
cargo install -f cargo-node
```
cargo-node will require a working version of `npm` (>=v6.9.0).
You may download [Node.js][^4], which includes npm as well.
- **Start as browser app**
You can run `Advotracker` as a web-browser app with the following call.
Once the app is running, you can connect to it opening the given URL
in you Web-Browser.
```sh
cargo node run --target browser --bin advotracker
```
- **Start as electron app**
```sh
cargo node run --target electron advotracker
```
- **Start as android app**
```sh
cargo node run --target android --bin advotracker
```
## Build and run documentation
You can build and view the latest documentation by executing the following command:
```sh
cargo doc --no-deps --open
```
This will render the web-pages, collecting the documentation paragraphs in the
source-code. When finished, it will open a new tab in your web browser
presenting the documentation.
## Installation
To install the compiled binary you can use rust package manager `cargo` as well.
```sh
cd <advotracker_root>
$ cargo install
```
In addition, you will need to copy the resource folder into your target directory.
This will provide the access to used fonts, images und stylesheets.
In allen Dialogen und Meldungen erfolgt die Ausgabe entsprechend der Sprache, die als
aktive Sprache in der Umgebungsvariable definiert ist (default: LANG = en_US.UTF8 ) ausgewählt.
---
@@ -149,7 +28,7 @@ This work is licensed under a [Creative Common License 4.0][License-CC_BY]
![Creative Common Logo][Logo-CC_BY]
<EFBFBD> 2020-2021 Ralf Zerres, Networkx GmbH
© 2020 Ralf Zerres, Networkx GmbH
---
@@ -157,5 +36,3 @@ Foodnotes
[^1]: Rust Book: https://doc.rust-lang.org/book/
[^2]: OrbTK GUI: https://gitlab.redox-os.org/redox-os/orbtk
[^3]: Rustup: https://rustup.rs/
[^4]: Node.js: https://nodejs.org/dist/v10.16.3/

1
advotracker-db Submodule

Submodule advotracker-db added at 5534da7f29

View File

@@ -1,61 +1,42 @@
[package]
name = "advotracker_client"
version = "0.1.5-alpha2"
name = "advotracker"
version = "0.1.1"
authors = ["Ralf Zerres <ralf.zerres@networkx.de>"]
description = "Frontend component that supports lawyers to capture relevant data encountered during an online legal advice."
readme = "README.md"
license = "(0BSD OR MIT)"
edition = "2018"
default-run = "advotracker"
build = "build.rs"
[target.x86_64-pc-windows-gnu]
linker = "lld-link"
[target.'cfg(windows)'.dependencies]
winapi = { version = "0.3", features = [ "winuser" ] }
windres = { git = "https://github.com/FaultyRAM/windres-rs", branch = "master" }
winapi = { version = "0.3", features = ["winuser"] }
#diesel = { version = "1.4", features = [ "postgres", "sqlite" ] }
[dependencies]
async-stream = "~0.2"
chrono = { version = "~0.4.0", features = ["serde"] }
cfg-if = { version = "~1.0" }
clap = { version = "~2.33", features = ["suggestions", "color"] }
csv = { version = "~1.1" }
dotenv = { version = "~0.15.0" }
envy = { version = "~0.4" }
lettre ={ version = "0.10.0-beta.1" }
lazy_static = { version = "~1.4.0" }
#lazy_static = { version = "~1.4.0" }
log = { version = "~0.4.8" }
maud = { version = "~0.22.1" }
orbtk = { git = "https://github.com/redox-os/orbtk.git", branch = "develop" }
#orbtk = { path = "../../../orbtk" }
serde = { version = "~1", features = ["derive"] }
sdl2 = { version = "~0.34", features = ["bundled"] }
substring = { version = "~1" }
#orbtk = { version = "~0.3.1-alpha3" }
#orbtk = { git = "https://github.com/redox-os/orbtk.git", branch = "develop" }
orbtk = { path = "../../orbtk" }
serde = { version = "~1.0", features = ["derive"] }
#tokio = { version = "~0.2", features = ["macros", "rt-threaded", "stream", "time"] }
tracing = { version = "~0.1" }
tracing-subscriber = { version = "~0.2.0", features = ["tracing-log"] }
tracing-subscriber = { version = "0.2.0-alpha", features = ["tracing-log"] }
viperus = { git = "https://github.com/maurocordioli/viperus", features = ["cache", "fmt-clap", "fmt-env", "global", "watch"] }
[build-dependencies]
winres = { version = "0.1.11" }
#twine = { version = "0.3.8" }
twine = { path = "../../../twine", features = ["serde"] }
[features]
# no features by default
default = []
debug = ["orbtk/debug"]
light = []
testing = ["orbtk/debug"]
[package.metadata.bundle]
name = "advotracker"
identifier = "nwx.advotracker"
short_description = "Online legal advice helper."
description = "Supports lawyers to capture relevant data encountered during an online legal advice.\n"
[package.metadata.winres]
LegalCopyright = "Copyright © 2020-2021"
[[bin]]
name = "advotracker"
path = "src/main.rs"

14
advotracker/Node.toml Normal file
View File

@@ -0,0 +1,14 @@
+[[apps]]
+name = "advotracker_frontend"
+width = 800
+height = 600
[[apps.fonts]]
font_family = "Material Icons"
src = "fonts/MaterialIcons-Regular.ttf"
[[apps.fonts]]
font_family = "Roboto Regular"
src = "fonts/Roboto-Regular.ttf"
[[apps.fonts]]
font_family = "Roboto Medium"
src = "fonts/Roboto-Medium.ttf"

View File

@@ -11,7 +11,6 @@ enum Action {
ValueChanged(Entity),
IncrementCounter,
RemoveItem,
ToggleTheme(Entity),
}
#[derive(AsAny)]
@@ -32,7 +31,7 @@ impl MainViewState {
}
impl State for MainViewState {
fn update(&mut self, _: &mut Registry, ctx: &mut Context) {
fn update(&mut self, _: &mut Registry, ctx: &mut Context<'_>) {
if let Some(action) = self.action {
match action {
Action::AddItem => {
@@ -49,8 +48,7 @@ impl State for MainViewState {
if len == 4 {
button(ctx.child("add-item-button")).set_enabled(false);
button(ctx.child("add-item-button"))
.set_visibility(Visibility::Collapsed);
button(ctx.child("add-item-button")).set_visibility(Visibility::Collapsed);
}
}
}
@@ -64,9 +62,7 @@ impl State for MainViewState {
if len == 1 {
button(ctx.child("remove-item-button")).set_enabled(false);
button(ctx.child("remove-item-button"))
.set_visibility(Visibility::Collapsed);
}
button(ctx.child("remove-item-button")).set_visibility(Visibility::Collapsed); }
}
}
Action::IncrementCounter => {
@@ -90,14 +86,10 @@ impl State for MainViewState {
Action::EntryChanged(entity) => {
println!("entry changed: {}", text_box(ctx.get_widget(entity)).text());
}
Action::ValueChanged(_entity) => {
//println!("Slider value changed");
}
Action::ToggleTheme(entity) => {
let light = *ctx.get_widget(entity).get::<bool>("selected");
Action::ValueChanged(entity) => {
let val = ((slider(ctx.get_widget(entity)).val()).floor() as i32).to_string();
let theme = if light { light_theme() } else { dark_theme() };
ctx.switch_theme(theme);
text_block(ctx.child("value_text")).set_text(String16::from(val));
}
}
@@ -105,7 +97,7 @@ impl State for MainViewState {
}
}
fn update_post_layout(&mut self, _: &mut Registry, ctx: &mut Context) {
fn update_post_layout(&mut self, _: &mut Registry, ctx: &mut Context<'_>) {
let mut selection_string = "Selected:".to_string();
for index in &main_view(ctx.widget()).selected_indices().0 {
@@ -117,7 +109,11 @@ impl State for MainViewState {
}
fn create_header(ctx: &mut BuildContext, text: &str) -> Entity {
TextBlock::new().text(text).style("header").build(ctx)
TextBlock::new()
.text(text)
.element("text-block")
.class("h1")
.build(ctx)
}
type List = Vec<String>;
@@ -140,14 +136,6 @@ widget!(
impl Template for MainView {
fn template(self, id: Entity, ctx: &mut BuildContext) -> Self {
let slider = Slider::new()
.min(0.0)
.max(1.0)
.on_changed(move |states, entity| {
state(id, states).action(Action::ValueChanged(entity));
})
.build(ctx);
self.name("MainView")
.result("Button count: 0")
.counter(0)
@@ -159,16 +147,16 @@ impl Template for MainView {
])
.list_count(3)
.selection_list(vec![
"Select Item 1".to_string(),
"Select Item 2".to_string(),
"Select Item 3".to_string(),
"Select Item 4".to_string(),
"Select Item 5".to_string(),
"Select Item 6".to_string(),
"Select Item 7".to_string(),
"Select Item 8".to_string(),
"Select Item 9".to_string(),
"Select Item 10".to_string(),
"Item 1".to_string(),
"Item 2".to_string(),
"Item 3".to_string(),
"Item 4".to_string(),
"Item 5".to_string(),
"Item 6".to_string(),
"Item 7".to_string(),
"Item 8".to_string(),
"Item 9".to_string(),
"Item 10".to_string(),
])
.combo_box_list(vec![
"CB 1".to_string(),
@@ -186,20 +174,24 @@ impl Template for MainView {
.combo_box_list_count(10)
.child(
Grid::new()
.margin(8)
.columns(Columns::new().add(132).add(16).add(132).add(16).add(132))
.rows(Rows::new().add("*").add(32))
.margin(8.)
.columns(
Columns::new()
.add(132.)
.add(16.)
.add(132.)
.add(16.)
.add(132.),
)
.child(
// Row 0
Stack::new()
.attach(Grid::column(0))
.attach(Grid::row(0))
// Column 0
.child(create_header(ctx, "Buttons"))
.child(
Button::new()
.text("Button")
.margin((0, 8, 0, 0))
.margin((0., 8., 0., 0.))
.icon(material_icons_font::MD_CHECK)
.attach(Grid::column(0))
.attach(Grid::row(1))
@@ -212,8 +204,9 @@ impl Template for MainView {
.child(
Button::new()
.text("Primary")
.style("button_primary")
.margin((0, 8, 0, 0))
.element("button")
.class("primary")
.margin((0., 8., 0., 0.))
.icon(material_icons_font::MD_360)
.attach(Grid::column(0))
.attach(Grid::row(2))
@@ -221,9 +214,9 @@ impl Template for MainView {
)
.child(
ToggleButton::new()
.style("button_single_content")
.class("single_content")
.text("ToggleButton")
.margin((0, 8, 2, 0))
.margin((0., 8., 2., 0.))
.icon(material_icons_font::MD_ALARM_ON)
.attach(Grid::column(0))
.attach(Grid::row(3))
@@ -232,38 +225,45 @@ impl Template for MainView {
.child(
CheckBox::new()
.text("CheckBox")
.margin((0, 8, 0, 0))
.margin((0., 8., 0., 0.))
.attach(Grid::column(0))
.attach(Grid::row(4))
.build(ctx),
)
.child(
Switch::new()
.margin((0, 8, 0, 0))
.margin((0., 8., 0., 0.))
.attach(Grid::column(0))
.attach(Grid::row(5))
.build(ctx),
)
.child(slider)
.child(
ProgressBar::new()
.val(slider)
.margin((0, 8, 0, 0))
TextBlock::new()
.margin((0., 8., 0., 0.))
.element("h1")
.id("value_text")
.text("0")
.h_align("center")
.build(ctx),
)
.child(
Slider::new()
.on_changed(move |states, entity| {
state(id, states).action(Action::ValueChanged(entity));
})
.build(ctx),
)
.build(ctx),
)
.child(
Stack::new()
// Column 2
.attach(Grid::column(2))
.attach(Grid::row(0))
.child(create_header(ctx, "Text"))
.child(
TextBlock::new()
.style("body")
.class("body")
.text(("result", id))
.margin((0, 8, 0, 0))
.margin((0., 8., 0., 0.))
.attach(Grid::column(2))
.attach(Grid::row(1))
.build(ctx),
@@ -272,7 +272,7 @@ impl Template for MainView {
TextBox::new()
.water_mark("TextBox...")
.text(("text_one", id))
.margin((0, 8, 0, 0))
.margin((0., 8., 0., 0.))
.attach(Grid::column(2))
.attach(Grid::row(2))
.on_activate(move |states, entity| {
@@ -287,7 +287,7 @@ impl Template for MainView {
TextBox::new()
.water_mark("TextBox...")
.text(("text_two", id))
.margin((0, 8, 0, 0))
.margin((0., 8., 0., 0.))
.attach(Grid::column(2))
.attach(Grid::row(2))
.on_activate(move |states, entity| {
@@ -300,10 +300,11 @@ impl Template for MainView {
)
.child(
Button::new()
.margin((0, 8, 0, 0))
.style("button_single_content")
.text("clear text")
.margin((0., 8., 0., 0.))
.class("single_content")
.margin((0., 8., 8., 0.))
.icon(material_icons_font::MD_CLEAR)
.text("clear text")
.on_click(move |states, _| {
state(id, states).action(Action::ClearText);
true
@@ -312,8 +313,8 @@ impl Template for MainView {
)
.child(
NumericBox::new()
.margin((0, 8, 0, 0))
.max(123)
.margin((-0., 8., 0., 0.))
.max(123.)
.step(0.123)
.val(0.123)
.build(ctx),
@@ -321,25 +322,24 @@ impl Template for MainView {
.build(ctx),
)
.child(
// Column 4
Grid::new()
.rows(
Rows::new()
.add("auto")
.add(32)
.add(16)
.add(204)
.add(32.)
.add(16.)
.add(204.)
.add("auto")
.add(192)
.add(192.)
.add("auto"),
)
.columns(Columns::new().add("*").add(4).add("*"))
.columns(Columns::new().add("*").add(4.).add("*"))
.attach(Grid::column(4))
.attach(Grid::row(0))
.child(
TextBlock::new()
.text("Items")
.style("header")
.element("text-block")
.class("h1")
.attach(Grid::column(0))
.attach(Grid::column_span(3))
.attach(Grid::row(0))
@@ -353,8 +353,7 @@ impl Template for MainView {
.get::<Vec<String>>("combo_box_list")[index]
.clone();
TextBlock::new()
.style("small_text")
.margin((0, 0, 0, 2))
.margin((0., 0., 0., 2.))
.v_align("center")
.text(text)
.build(bc)
@@ -363,53 +362,58 @@ impl Template for MainView {
.attach(Grid::column(0))
.attach(Grid::column_span(3))
.attach(Grid::row(1))
.margin((0, 8, 0, 0))
.margin((0., 8., 0., 0.))
.count(("combo_box_list_count", id))
.build(ctx),
)
.child(
ItemsWidget::new()
.element("items-widget")
.id("items")
.padding((4, 4, 4, 2))
.padding((4., 4., 4., 2.))
.attach(Grid::column(0))
.attach(Grid::column_span(3))
.attach(Grid::row(3))
.margin((0, 0, 0, 8))
// bc = build-context
.margin((0., 0., 0., 8.))
.items_builder(move |bc, index| {
let text = bc.get_widget(id).get::<Vec<String>>("list")
[index]
.clone();
Button::new().margin((0, 0, 0, 2)).text(text).build(bc)
Button::new()
.margin((0., 0., 0., 2.))
.text(text)
.build(bc)
})
.count(("list_count", id))
.build(ctx),
)
.child(
Button::new()
.style("button_single_content")
.element("button")
.class("single_content")
.id("remove-item-button")
.icon(material_icons_font::MD_REMOVE_CIRCLE)
.on_click(move |states, _| {
state(id, states).action(Action::RemoveItem);
true
})
.min_width(0)
.min_width(0.)
.attach(Grid::column(0))
.attach(Grid::row(4))
.build(ctx),
)
.child(
Button::new()
.style("button_single_content")
.element("button")
.class("single_content")
.id("add-item-button")
.icon(material_icons_font::MD_ADD_CIRCLE)
.on_click(move |states, _| {
state(id, states).action(Action::AddItem);
true
})
.min_width(0)
.min_width(0.)
.attach(Grid::column(2))
.attach(Grid::row(4))
.build(ctx),
@@ -420,28 +424,27 @@ impl Template for MainView {
.attach(Grid::column_span(3))
.attach(Grid::row(5))
.selected_indices(id)
.margin((0, 16, 0, 8))
.margin((0., 16., 0., 8.))
.items_builder(move |bc, index| {
let text = bc
.get_widget(id)
.get::<Vec<String>>("selection_list")[index]
.clone();
TextBlock::new()
.margin((0, 0, 0, 2))
.margin((0., 0., 0., 2.))
.v_align("center")
.text(text)
.build(bc)
})
.on_selection_changed(|_, _, _| println!("Selection changed"))
.count(("selection_list_count", id))
.build(ctx),
)
.child(
// todo: wrong text width????
TextBlock::new()
.style("body")
.element("text-block")
.id("selection")
.max_width(120)
.max_width(120.)
.attach(Grid::column(0))
.attach(Grid::column_span(3))
.attach(Grid::row(6))
@@ -450,30 +453,6 @@ impl Template for MainView {
)
.build(ctx),
)
.child(
// Row 1
Stack::new()
.orientation("horizontal")
.attach(Grid::row(1))
.attach(Grid::column(0))
.child(
TextBlock::new()
.style("body")
.text("Toggle theme: ")
.v_align("center")
.margin((0, 0, 4, 0))
.build(ctx),
)
.child(
Switch::new()
.on_changed(move |states, entity| {
state(id, states).action(Action::ToggleTheme(entity));
})
.v_align("center")
.build(ctx),
)
.build(ctx),
)
.build(ctx),
)
}
@@ -481,14 +460,14 @@ impl Template for MainView {
fn main() {
// use this only if you want to run it as web application.
orbtk::initialize();
//orbtk::initialize();
Application::new()
.window(|ctx| {
Window::new()
.title("OrbTk - widgets example")
.position((100, 100))
.size(468, 730)
.position((100., 100.))
.size(468., 730.)
.resizeable(true)
.child(MainView::new().build(ctx))
.build(ctx)

View File

@@ -1,5 +1,5 @@
//extern crate pdf_extract;
//extern crate lopdf;
extern crate pdf_extract;
extern crate lopdf;
use std::env;
use std::path::PathBuf;
@@ -27,10 +27,10 @@ fn main() {
print_metadata(&doc);
let mut output: Box<dyn OutputDev> = match output_kind.as_ref() {
"txt" => Box::new(PlainTextOutput::new(&mut output_file as &mut dyn std::io::Write)),
"html" => Box::new(HTMLOutput::new(&mut output_file)),
"svg" => Box::new(SVGOutput::new(&mut output_file)),
_ => panic!(),
"txt" => Box::new(PlainTextOutput::new(&mut output_file as &mut dyn std::io::Write)),
"html" => Box::new(HTMLOutput::new(&mut output_file)),
"svg" => Box::new(SVGOutput::new(&mut output_file)),
_ => panic!(),
};
output_doc(&doc, output.as_mut());

View File

@@ -0,0 +1,235 @@
use orbtk::prelude::*;
use orbtk::theme::DEFAULT_THEME_CSS;
//use orbtk::theme::LIGHT_THEME_EXTENSION_CSS;
//#[cfg(feature = "light-theme")]
static WIDGET_EXT: &'static str = include_str!("../resources/stylesheets/policyholder_check.css");
fn get_theme() -> ThemeValue {
//ThemeValue::create_from_css(LIGHT_THEME_EXTENSION_CSS)
ThemeValue::create_from_css(DEFAULT_THEME_CSS)
.extension_css(WIDGET_EXT)
.build()
}
#[derive(Debug, Copy, Clone)]
enum Action {
ClearText,
EntryActivated(Entity),
EntryChanged(Entity),
//ValueChanged(Entity),
ValueOk,
ValueNone,
}
#[derive(AsAny)]
pub struct MainViewState {
action: Option<Action>,
}
impl Default for MainViewState {
fn default() -> Self {
MainViewState { action: None }
}
}
impl MainViewState {
fn action(&mut self, action: impl Into<Option<Action>>) {
self.action = action.into();
}
}
impl State for MainViewState {
fn update(&mut self, _: &mut Registry, ctx: &mut Context<'_>) {
if let Some(action) = self.action {
match action {
Action::ClearText => {
ctx.widget().set("policynumber", String16::from(""));
}
Action::ValueOk => {
//let mut text_box = TextBox::get(ctx.get_widget(entity));
//let text = text_box.text_mut();
//ctx.widget().set("policynumber", background("#4d4c4c"));
}
Action::ValueNone => {
//let mut text_box = TextBox::get(ctx.get_widget(entity));
//let text = text_box.text_mut();
//ctx.widget().set("policynumber", background("#5b0f22"));
}
Action::EntryActivated(entity) => {
let mut text_box = TextBox::get(ctx.get_widget(entity));
let text = text_box.text_mut();
//let mut widget = ctx.get_widget(entity);
//let text = widget.get_mut::<String16>("text");
println!("got value policynumber: {}", text);
//text.clear();
}
Action::EntryChanged(entity) => {
let widget = ctx.get_widget(entity);
let text = widget.get::<String16>("text");
println!("entry changed: {}", text);
}
// Action::ValueChanged(entity) => {
// let val =
// ((*ctx.get_widget(entity).get::<f64>("val")).floor() as i32).to_string();
// ctx.child("value_text").set("text", String16::from(val));
//}
}
self.action = None;
}
}
}
fn create_header(ctx: &mut BuildContext, text: &str) -> Entity {
TextBlock::new()
.text(text)
.element("text-block")
.class("h1")
.build(ctx)
}
widget!(
MainView<MainViewState> {
sum_policynumbers: usize,
policynumber: String16,
result: String16
}
);
impl Template for MainView {
fn template(self, id: Entity, ctx: &mut BuildContext) -> Self {
self.name("MainView").child(
//.result("Anzahl Versicherungsnummern: 0")
//.result("Policyholders count: 0").sum_policynumbers(0)
//.sum_policynumbers(0)
Grid::new()
.background("#fafafa")
//.width(200.0)
//.height(360.0)
.columns(
Columns::new()
.add(150.0)
.add("*")
//.add(120.0)
//.add("auto")
.add(150.0)
.build(),
)
.rows(
Rows::new()
.add("*")
.add("*")
.build(),
)
.child(
Grid::new()
.element("policyholder_check")
.margin((4.0, 24.0, 24.0, 4.0))
.min_width(180.0)
.min_height(80.0)
.attach(Grid::column(1))
.attach(Grid::row(0))
.child(
Stack::new()
.spacing(8.0)
.orientation("vertical")
.h_align("center")
//.child(create_header(ctx, "Validation number policyholder"))
.child(create_header(ctx, "Validierung Versicherungsnummer"))
.child(
TextBox::new()
//.class("text_box")
// overwriting the class defaults
/* .background("transparent")
.foreground("#9dafbf")
.background("#fafafa")
/* .foreground(colors::LINK_WATER_COLOR) */
.border_brush("#5b0f22")
.border_width(5)
.border_radius(15) */
//.name("policynumber")
.focused(true)
.water_mark("Versicherungs-Nr...")
//.text("Number policyholder", id)
.text(("policynumber", id))
.font_size(24.0)
.h_align("stretch")
.on_activate(move |states, entity| {
state(id, states).action(Action::EntryActivated(entity));
})
.on_changed(move |states, entity| {
state(id, states).action(Action::EntryChanged(entity));
})
.build(ctx),
)
.child(
TextBlock::new()
.element("text-block")
.id("result")
.min_width(80.0)
.max_width(180.0)
//.text("Result:")
.text("Ergebnis:")
.build(ctx),
)
.build(ctx),
)
.build(ctx)
)
.child(
Grid::new()
.element("logo_customer")
.margin((9.0, 16.0, 16.0, 9.0))
.attach(Grid::column(0))
.attach(Grid::row(1))
.v_align("end")
.child(
ImageWidget::new()
.image("./resources/images/hiedemann_logo.png")
.build(ctx),
)
.build(ctx),
)
.child(
Grid::new()
.element("logo_vendor")
.margin((9.0, 16.0, 16.0, 9.0))
.attach(Grid::column(2))
.attach(Grid::row(1))
.v_align("end")
.child(
ImageWidget::new()
.image("./resources/images/networkx_logo.png")
.build(ctx),
)
.build(ctx),
)
.build(ctx),
) // MainView
}
}
fn main() {
Application::new()
.window(|ctx| {
Window::new()
//.title("OrbTk - Policyholder checker example")
.name("MainWindow")
.title("AdvoTracker - Versicherungsnummern")
.position((-500.0, -100.0))
.size(480.0, 260.0)
.min_width(460.0)
.min_height(180.0)
.resizeable(true)
.theme(get_theme())
.child(MainView::new().build(ctx))
.build(ctx)
})
.run();
}
// helper to request MainViewState
fn state<'a>(id: Entity, states: &'a mut StatesContext) -> &'a mut MainViewState {
states.get_mut(id)
}

View File

@@ -0,0 +1,32 @@
.header {
background: #444e55;
}
.content {
background: #3b434a;
}
text_box {
background: transparent;
border-width: 0;
color: #9dafbf;
font-size: 16;
}
#input {
font-size: 16;
}
text-block {
font-size: 42;
color: #dfebf5;
}
#input {
background: transparent;
}
button {
border-radius: 1;
font-size: 20;
}

View File

@@ -0,0 +1,15 @@
.header {
background: #ffffff;
}
.content {
background: #fafafa;
}
text_box {
color: #4d4c4c;
}
text-block {
color: #4d4c4c;
}

View File

@@ -0,0 +1,581 @@
<!DOCTYPE html>
<html lang="de-DE">
<head data-suburl="">
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta http-equiv="x-ua-compatible" content="ie=edge">
<title>flovanco/doit: Task app based on OrbTk https://gitlab.redox-os.org/redox-os/orbtk. - static/fonts/MaterialIcons-Regular.ttf at master - doit - Codeberg.org</title>
<link rel="manifest" href="/manifest.json" crossorigin="use-credentials">
<script>
if ('serviceWorker' in navigator) {
navigator.serviceWorker.register('/serviceworker.js').then(function(registration) {
console.info('ServiceWorker registration successful with scope: ', registration.scope);
}, function(err) {
console.info('ServiceWorker registration failed: ', err);
});
}
</script>
<meta name="theme-color" content="#6cc644">
<meta name="author" content="flovanco" />
<meta name="description" content="doit - Task app based on OrbTk https://gitlab.redox-os.org/redox-os/orbtk." />
<meta name="keywords" content="git,non-profit,foss,oss,free,software,open,source,code,hosting">
<meta name="referrer" content="no-referrer" />
<meta name="_csrf" content="PG49nQsNVNDzL7j830GxV6baicY6MTU5MjMzNDMwNzQ5ODk4MzkwMw" />
<meta name="_suburl" content="" />
<script>
/*
@licstart The following is the entire license notice for the
JavaScript code in this page.
Copyright (c) 2016 The Gitea Authors
Copyright (c) 2015 The Gogs Authors
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
---
Licensing information for additional javascript libraries can be found at:
{{StaticUrlPrefix}}/vendor/librejs.html
@licend The above is the entire license notice
for the JavaScript code in this page.
*/
</script>
<script>
window.config = {
StaticUrlPrefix: ''
}
</script>
<link rel="shortcut icon" href="/img/favicon.png" />
<link rel="mask-icon" href="/img/gitea-safari.svg" color="#609926">
<link rel="preload" href="/vendor/assets/font-awesome/css/font-awesome.min.css" as="style" onload="this.rel='stylesheet'">
<noscript><link rel="stylesheet" href="/vendor/assets/font-awesome/css/font-awesome.min.css"></noscript>
<link rel="stylesheet" href="/vendor/assets/octicons/octicons.min.css">
<link rel="stylesheet" href="/vendor/plugins/fomantic/semantic.min.css?v=6b0a0a50c7fb0aaef957cb0ab4f596e7">
<link rel="stylesheet" href="/css/index.css?v=6b0a0a50c7fb0aaef957cb0ab4f596e7">
<noscript>
<style>
.dropdown:hover > .menu { display: block; }
.ui.secondary.menu .dropdown.item > .menu { margin-top: 0; }
</style>
</noscript>
<link rel="stylesheet" href="/vendor/plugins/highlight/github.css">
<style class="list-search-style"></style>
<script src="/vendor/plugins/promise-polyfill/polyfill.min.js"></script>
<script src="/vendor/plugins/cssrelpreload/loadCSS.min.js"></script>
<script src="/vendor/plugins/cssrelpreload/cssrelpreload.min.js"></script>
<meta property="og:title" content="doit" />
<meta property="og:url" content="https://codeberg.org/flovanco/doit" />
<meta property="og:description" content="Task app based on OrbTk https://gitlab.redox-os.org/redox-os/orbtk." />
<meta property="og:type" content="object" />
<meta property="og:image" content="https://codeberg.org/user/avatar/flovanco/-1" />
<meta property="og:site_name" content="Codeberg.org" />
<link rel="stylesheet" href="/codeberg.css">
</head>
<body>
<div class="full height">
<noscript>Diese Webseite funktioniert besser mit JavaScript.</noscript>
<div class="ui top secondary stackable main menu following bar light">
<div class="ui container" id="navbar">
<div class="item brand" style="justify-content: space-between;">
<a href="/">
<img class="ui mini image" src="/img/gitea-sm.png">
</a>
<div class="ui basic icon button mobile-only" id="navbar-expand-toggle">
<i class="sidebar icon"></i>
</div>
</div>
<a class="item " href="/">Startseite</a>
<a class="item " href="/explore/repos">Erkunden</a>
<a class="item" href="/Codeberg/Community/issues">Codeberg Issues</a>
<a class="item" href="https://blog.codeberg.org">Blog</a>
<a class="item" href="https://join.codeberg.org/">Join Codeberg e.V.</a>
<a class="item" href="https://liberapay.com/codeberg/donate">Donate</a>
<a class="item" target="_blank" rel="noopener noreferrer" href="https://docs.gitea.io">Hilfe</a>
<div class="right stackable menu">
<a class="item" href="/user/sing_up">
<i class="octicon octicon-person"></i> Registrieren
</a>
<a class="item" rel="nofollow" href="/user/login?redirect_to=%2fflovanco%2fdoit%2fsrc%2fbranch%2fmaster%2fstatic%2ffonts%2fMaterialIcons-Regular.ttf">
<i class="octicon octicon-sign-in"></i> Anmelden
</a>
</div>
</div>
</div>
<div class="repository file list">
<div class="header-wrapper">
<div class="ui container">
<div class="repo-header">
<div class="ui huge breadcrumb repo-title">
<i class="mega-octicon octicon-repo"></i>
<a href="/flovanco">flovanco</a>
<div class="divider"> / </div>
<a href="/flovanco/doit">doit</a>
</div>
<div class="repo-buttons">
<form method="post" action="/flovanco/doit/action/watch?redirect_to=%2fflovanco%2fdoit%2fsrc%2fbranch%2fmaster%2fstatic%2ffonts%2fMaterialIcons-Regular.ttf">
<input type="hidden" name="_csrf" value="PG49nQsNVNDzL7j830GxV6baicY6MTU5MjMzNDMwNzQ5ODk4MzkwMw">
<div class="ui labeled button" tabindex="0">
<button type="submit" class="ui compact basic button">
<i class="icon fa-eye-slash"></i>Beobachten
</button>
<a class="ui basic label" href="/flovanco/doit/watchers">
1
</a>
</div>
</form>
<form method="post" action="/flovanco/doit/action/star?redirect_to=%2fflovanco%2fdoit%2fsrc%2fbranch%2fmaster%2fstatic%2ffonts%2fMaterialIcons-Regular.ttf">
<input type="hidden" name="_csrf" value="PG49nQsNVNDzL7j830GxV6baicY6MTU5MjMzNDMwNzQ5ODk4MzkwMw">
<div class="ui labeled button" tabindex="0">
<button type="submit" class="ui compact basic button">
<i class="icon star outline"></i>Favorisieren
</button>
<a class="ui basic label" href="/flovanco/doit/stars">
1
</a>
</div>
</form>
<div class="ui labeled button " tabindex="0">
<a class="ui compact basic button poping up" data-content="Bitte melde dich an, um dieses Repository zu forken." rel="nofollow" href="/user/login?redirect_to=/repo/fork/3183" data-position="top center" data-variation="tiny">
<i class="octicon octicon-repo-forked"></i>Fork
</a>
<a class="ui basic label" href="/flovanco/doit/forks">
0
</a>
</div>
</div>
</div>
</div>
<div class="ui tabs container">
<div class="ui tabular stackable menu navbar">
<a class="active item" href="/flovanco/doit">
<i class="octicon octicon-code"></i> Code
</a>
<a class=" item" href="/flovanco/doit/issues">
<i class="octicon octicon-issue-opened"></i> Issues <span class="ui blue small label">4</span>
</a>
<a class=" item" href="/flovanco/doit/pulls">
<i class="octicon octicon-git-pull-request"></i> Pull-Requests <span class="ui gray small label">0</span>
</a>
<a class=" item" href="/flovanco/doit/releases">
<i class="octicon octicon-tag"></i> Releases <span class="ui gray small label">0</span>
</a>
<a class=" item" href="/flovanco/doit/wiki" >
<i class="octicon octicon-book"></i> Wiki
</a>
<a class=" item" href="/flovanco/doit/activity">
<i class="octicon octicon-pulse"></i> Aktivität
</a>
</div>
</div>
<div class="ui tabs divider"></div>
</div>
<div class="ui container">
<div class="ui repo-description">
<div id="repo-desc">
<span class="description has-emoji">Task app based on OrbTk <a href="https://gitlab.redox-os.org/redox-os/orbtk" rel="nofollow">https://gitlab.redox-os.org/redox-os/orbtk</a>.</span>
<a class="link" href=""></a>
</div>
</div>
<div class="ui" id="repo-topics">
</div>
<div class="hide" id="validate_prompt">
<span id="count_prompt">Du kannst nicht mehr als 25 Themen auswählen</span>
<span id="format_prompt">Themen müssen entweder mit einem Buchstaben oder einer Ziffer beginnen. Sie können Bindestriche („-“) enthalten und bis zu 35 Zeichen lang sein.</span>
</div>
<div class="ui segment sub-menu">
<div class="ui two horizontal center link list">
<div class="item">
<a class="ui" href="/flovanco/doit/commits/branch/master"><i class="octicon octicon-history"></i> <b>57</b> Commits</a>
</div>
<div class="item">
<a class="ui" href="/flovanco/doit/branches/"><i class="octicon octicon-git-branch"></i> <b>2</b> Branches</a>
</div>
<div class="item">
<a class="ui" href="#"><i class="octicon octicon-database"></i> <b>922KB</b></a>
</div>
</div>
</div>
<div class="ui stackable secondary menu mobile--margin-between-items mobile--no-negative-margins">
<div class="fitted item choose reference">
<div class="ui floating filter dropdown custom" data-can-create-branch="false" data-no-results="Keine Ergebnisse verfügbar.">
<div class="ui basic small compact button" @click="menuVisible = !menuVisible" @keyup.enter="menuVisible = !menuVisible">
<span class="text">
<i class="octicon octicon-git-branch"></i>
Branch:
<strong>master</strong>
</span>
<i class="dropdown icon"></i>
</div>
<div class="data" style="display: none" data-mode="branches">
<div class="item branch selected" data-url="/flovanco/doit/src/branch/master/static/fonts/MaterialIcons-Regular.ttf">master</div>
<div class="item branch " data-url="/flovanco/doit/src/branch/overview/static/fonts/MaterialIcons-Regular.ttf">overview</div>
</div>
<div class="menu transition" :class="{visible: menuVisible}" v-if="menuVisible" v-cloak>
<div class="ui icon search input">
<i class="filter icon"></i>
<input name="search" ref="searchField" v-model="searchTerm" @keydown="keydown($event)" placeholder="Branch oder Tag filtern...">
</div>
<div class="header branch-tag-choice">
<div class="ui grid">
<div class="two column row">
<a class="reference column" href="#" @click="mode = 'branches'; focusSearchField()">
<span class="text" :class="{black: mode == 'branches'}">
<i class="octicon octicon-git-branch"></i> Branches
</span>
</a>
<a class="reference column" href="#" @click="mode = 'tags'; focusSearchField()">
<span class="text" :class="{black: mode == 'tags'}">
<i class="reference tags icon"></i> Tags
</span>
</a>
</div>
</div>
</div>
<div class="scrolling menu" ref="scrollContainer">
<div v-for="(item, index) in filteredItems" :key="item.name" class="item" :class="{selected: item.selected, active: active == index}" @click="selectItem(item)" :ref="'listItem' + index">${ item.name }</div>
<div class="item" v-if="showCreateNewBranch" :class="{active: active == filteredItems.length}" :ref="'listItem' + filteredItems.length">
<a href="#" @click="createNewBranch()">
<div>
<i class="octicon octicon-git-branch"></i>
Erstelle Branch <strong>${ searchTerm }</strong>
</div>
<div class="text small">
von „master“
</div>
</a>
<form ref="newBranchForm" action="/flovanco/doit/branches/_new/branch/master" method="post">
<input type="hidden" name="_csrf" value="PG49nQsNVNDzL7j830GxV6baicY6MTU5MjMzNDMwNzQ5ODk4MzkwMw">
<input type="hidden" name="new_branch_name" v-model="searchTerm">
</form>
</div>
</div>
<div class="message" v-if="showNoResults">${ noResults }</div>
</div>
</div>
</div>
<div class="fitted item"><span class="ui breadcrumb repo-path"><a class="section" href="/flovanco/doit/src/branch/master" title="doit">doit</a><span class="divider">/</span><span class="section"><a href="/flovanco/doit/src/branch/master/static" title="static">static</a></span><span class="divider">/</span><span class="section"><a href="/flovanco/doit/src/branch/master/static/fonts" title="fonts">fonts</a></span><span class="divider">/</span><span class="active section" title="MaterialIcons-Regular.ttf">MaterialIcons-Regular.ttf</span></span></div>
<div class="right fitted item" id="file-buttons">
<div class="ui tiny blue buttons">
</div>
</div>
<div class="fitted item">
</div>
<div class="fitted item">
</div>
</div>
<div class="tab-size-8 non-diff-file-content">
<h4 class="file-header ui top attached header">
<div class="file-header-left">
<div class="file-info text grey normal mono">
<div class="file-info-entry">
125KB
</div>
</div>
</div>
<div class="file-header-right">
<div class="ui right file-actions">
<div class="ui buttons">
<a class="ui button" href="/flovanco/doit/raw/branch/master/static/fonts/MaterialIcons-Regular.ttf">Originalformat</a>
<a class="ui button" href="/flovanco/doit/src/commit/417acaf7ac867ed47ab73e7e66f07f15f1f124cc/static/fonts/MaterialIcons-Regular.ttf">Permalink</a>
<a class="ui button" href="/flovanco/doit/commits/branch/master/static/fonts/MaterialIcons-Regular.ttf">Verlauf</a>
</div>
<i class="octicon octicon-pencil btn-octicon poping up disabled" data-content="Binärdateien können nicht im Webinterface bearbeitet werden." data-position="bottom center" data-variation="tiny inverted"></i>
<i class="octicon octicon-trashcan btn-octicon poping up disabled" data-content="Du benötigst Schreibzugriff, um Änderungen an dieser Datei vorzuschlagen oder vorzunehmen." data-position="bottom center" data-variation="tiny inverted"></i>
</div>
</div>
</h4>
<div class="ui attached table unstackable segment">
<div class="file-view has-emoji">
<div class="view-raw ui center">
<a href="/flovanco/doit/raw/branch/master/static/fonts/MaterialIcons-Regular.ttf" rel="nofollow" class="btn btn-gray btn-radius">Originalformat anzeigen</a>
</div>
</div>
</div>
</div>
<script>
function submitDeleteForm() {
var message = prompt("delete_confirm_message\n\ndelete_commit_summary", "Delete ''");
if (message != null) {
$("#delete-message").val(message);
$("#delete-file-form").submit()
}
}
</script>
</div>
</div>
</div>
<footer>
<div class="ui container">
<div class="ui left">
</div>
<div class="ui right links">
<div class="ui language bottom floating slide up dropdown link item">
<i class="world icon"></i>
<div class="text">Deutsch</div>
<div class="menu">
<a lang="de-DE" class="item active selected" href="#">Deutsch</a>
<a lang="en-US" class="item " href="/flovanco/doit/src/branch/master/static/fonts/MaterialIcons-Regular.ttf?lang=en-US">English</a>
<a lang="zh-CN" class="item " href="/flovanco/doit/src/branch/master/static/fonts/MaterialIcons-Regular.ttf?lang=zh-CN">简体中文</a>
<a lang="zh-HK" class="item " href="/flovanco/doit/src/branch/master/static/fonts/MaterialIcons-Regular.ttf?lang=zh-HK">繁體中文(香港)</a>
<a lang="zh-TW" class="item " href="/flovanco/doit/src/branch/master/static/fonts/MaterialIcons-Regular.ttf?lang=zh-TW">繁體中文(台灣)</a>
<a lang="fr-FR" class="item " href="/flovanco/doit/src/branch/master/static/fonts/MaterialIcons-Regular.ttf?lang=fr-FR">français</a>
<a lang="nl-NL" class="item " href="/flovanco/doit/src/branch/master/static/fonts/MaterialIcons-Regular.ttf?lang=nl-NL">Nederlands</a>
<a lang="lv-LV" class="item " href="/flovanco/doit/src/branch/master/static/fonts/MaterialIcons-Regular.ttf?lang=lv-LV">latviešu</a>
<a lang="ru-RU" class="item " href="/flovanco/doit/src/branch/master/static/fonts/MaterialIcons-Regular.ttf?lang=ru-RU">русский</a>
<a lang="uk-UA" class="item " href="/flovanco/doit/src/branch/master/static/fonts/MaterialIcons-Regular.ttf?lang=uk-UA">Українська</a>
<a lang="ja-JP" class="item " href="/flovanco/doit/src/branch/master/static/fonts/MaterialIcons-Regular.ttf?lang=ja-JP">日本語</a>
<a lang="es-ES" class="item " href="/flovanco/doit/src/branch/master/static/fonts/MaterialIcons-Regular.ttf?lang=es-ES">español</a>
<a lang="pt-BR" class="item " href="/flovanco/doit/src/branch/master/static/fonts/MaterialIcons-Regular.ttf?lang=pt-BR">português do Brasil</a>
<a lang="pl-PL" class="item " href="/flovanco/doit/src/branch/master/static/fonts/MaterialIcons-Regular.ttf?lang=pl-PL">polski</a>
<a lang="bg-BG" class="item " href="/flovanco/doit/src/branch/master/static/fonts/MaterialIcons-Regular.ttf?lang=bg-BG">български</a>
<a lang="it-IT" class="item " href="/flovanco/doit/src/branch/master/static/fonts/MaterialIcons-Regular.ttf?lang=it-IT">italiano</a>
<a lang="fi-FI" class="item " href="/flovanco/doit/src/branch/master/static/fonts/MaterialIcons-Regular.ttf?lang=fi-FI">suomi</a>
<a lang="tr-TR" class="item " href="/flovanco/doit/src/branch/master/static/fonts/MaterialIcons-Regular.ttf?lang=tr-TR">Türkçe</a>
<a lang="cs-CZ" class="item " href="/flovanco/doit/src/branch/master/static/fonts/MaterialIcons-Regular.ttf?lang=cs-CZ">čeština</a>
<a lang="sr-SP" class="item " href="/flovanco/doit/src/branch/master/static/fonts/MaterialIcons-Regular.ttf?lang=sr-SP">српски</a>
<a lang="sv-SE" class="item " href="/flovanco/doit/src/branch/master/static/fonts/MaterialIcons-Regular.ttf?lang=sv-SE">svenska</a>
<a lang="ko-KR" class="item " href="/flovanco/doit/src/branch/master/static/fonts/MaterialIcons-Regular.ttf?lang=ko-KR">한국어</a>
</div>
</div>
<a href="/vendor/librejs.html" data-jslicense="1">JavaScript licenses</a>
<a target="_blank" rel="noopener" href="/codeberg/org/src/branch/master/PrivacyPolicy.md">Privacy Policy</a>
<a target="_blank" rel="noopener" href="/codeberg/org/src/branch/master/Satzung.md">Bylaws/Satzung</a>
<a target="_blank" rel="noopener" href="/codeberg/org/src/branch/master/Imprint.md">Imprint/Impressum</a>
<a target="_blank" rel="noopener" href="/codeberg/org/src/branch/master/TermsOfUse.md">Terms of Use</a>
</div>
</div>
</footer>
<script src="/vendor/plugins/jquery/jquery.min.js?v=3.4.1"></script>
<script src="/vendor/plugins/jquery-migrate/jquery-migrate.min.js?v=3.0.1"></script>
<script src="/vendor/plugins/jquery.areyousure/jquery.are-you-sure.js"></script>
<script src="/vendor/plugins/highlight/highlight.pack.js"></script>
<script src="/vendor/plugins/emojify/emojify.custom.js"></script>
<script src="/vendor/plugins/clipboard/clipboard.min.js"></script>
<script src="/vendor/plugins/vue/vue.min.js"></script>
<script src="/vendor/plugins/fomantic/semantic.min.js?v=6b0a0a50c7fb0aaef957cb0ab4f596e7"></script>
<script src="/js/index.js?v=6b0a0a50c7fb0aaef957cb0ab4f596e7"></script>
</body>
</html>

View File

@@ -0,0 +1,581 @@
<!DOCTYPE html>
<html lang="de-DE">
<head data-suburl="">
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta http-equiv="x-ua-compatible" content="ie=edge">
<title>flovanco/doit: Task app based on OrbTk https://gitlab.redox-os.org/redox-os/orbtk. - static/fonts/Roboto-Medium.ttf at master - doit - Codeberg.org</title>
<link rel="manifest" href="/manifest.json" crossorigin="use-credentials">
<script>
if ('serviceWorker' in navigator) {
navigator.serviceWorker.register('/serviceworker.js').then(function(registration) {
console.info('ServiceWorker registration successful with scope: ', registration.scope);
}, function(err) {
console.info('ServiceWorker registration failed: ', err);
});
}
</script>
<meta name="theme-color" content="#6cc644">
<meta name="author" content="flovanco" />
<meta name="description" content="doit - Task app based on OrbTk https://gitlab.redox-os.org/redox-os/orbtk." />
<meta name="keywords" content="git,non-profit,foss,oss,free,software,open,source,code,hosting">
<meta name="referrer" content="no-referrer" />
<meta name="_csrf" content="PG49nQsNVNDzL7j830GxV6baicY6MTU5MjMzNDMwNzQ5ODk4MzkwMw" />
<meta name="_suburl" content="" />
<script>
/*
@licstart The following is the entire license notice for the
JavaScript code in this page.
Copyright (c) 2016 The Gitea Authors
Copyright (c) 2015 The Gogs Authors
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
---
Licensing information for additional javascript libraries can be found at:
{{StaticUrlPrefix}}/vendor/librejs.html
@licend The above is the entire license notice
for the JavaScript code in this page.
*/
</script>
<script>
window.config = {
StaticUrlPrefix: ''
}
</script>
<link rel="shortcut icon" href="/img/favicon.png" />
<link rel="mask-icon" href="/img/gitea-safari.svg" color="#609926">
<link rel="preload" href="/vendor/assets/font-awesome/css/font-awesome.min.css" as="style" onload="this.rel='stylesheet'">
<noscript><link rel="stylesheet" href="/vendor/assets/font-awesome/css/font-awesome.min.css"></noscript>
<link rel="stylesheet" href="/vendor/assets/octicons/octicons.min.css">
<link rel="stylesheet" href="/vendor/plugins/fomantic/semantic.min.css?v=6b0a0a50c7fb0aaef957cb0ab4f596e7">
<link rel="stylesheet" href="/css/index.css?v=6b0a0a50c7fb0aaef957cb0ab4f596e7">
<noscript>
<style>
.dropdown:hover > .menu { display: block; }
.ui.secondary.menu .dropdown.item > .menu { margin-top: 0; }
</style>
</noscript>
<link rel="stylesheet" href="/vendor/plugins/highlight/github.css">
<style class="list-search-style"></style>
<script src="/vendor/plugins/promise-polyfill/polyfill.min.js"></script>
<script src="/vendor/plugins/cssrelpreload/loadCSS.min.js"></script>
<script src="/vendor/plugins/cssrelpreload/cssrelpreload.min.js"></script>
<meta property="og:title" content="doit" />
<meta property="og:url" content="https://codeberg.org/flovanco/doit" />
<meta property="og:description" content="Task app based on OrbTk https://gitlab.redox-os.org/redox-os/orbtk." />
<meta property="og:type" content="object" />
<meta property="og:image" content="https://codeberg.org/user/avatar/flovanco/-1" />
<meta property="og:site_name" content="Codeberg.org" />
<link rel="stylesheet" href="/codeberg.css">
</head>
<body>
<div class="full height">
<noscript>Diese Webseite funktioniert besser mit JavaScript.</noscript>
<div class="ui top secondary stackable main menu following bar light">
<div class="ui container" id="navbar">
<div class="item brand" style="justify-content: space-between;">
<a href="/">
<img class="ui mini image" src="/img/gitea-sm.png">
</a>
<div class="ui basic icon button mobile-only" id="navbar-expand-toggle">
<i class="sidebar icon"></i>
</div>
</div>
<a class="item " href="/">Startseite</a>
<a class="item " href="/explore/repos">Erkunden</a>
<a class="item" href="/Codeberg/Community/issues">Codeberg Issues</a>
<a class="item" href="https://blog.codeberg.org">Blog</a>
<a class="item" href="https://join.codeberg.org/">Join Codeberg e.V.</a>
<a class="item" href="https://liberapay.com/codeberg/donate">Donate</a>
<a class="item" target="_blank" rel="noopener noreferrer" href="https://docs.gitea.io">Hilfe</a>
<div class="right stackable menu">
<a class="item" href="/user/sing_up">
<i class="octicon octicon-person"></i> Registrieren
</a>
<a class="item" rel="nofollow" href="/user/login?redirect_to=%2fflovanco%2fdoit%2fsrc%2fbranch%2fmaster%2fstatic%2ffonts%2fRoboto-Medium.ttf">
<i class="octicon octicon-sign-in"></i> Anmelden
</a>
</div>
</div>
</div>
<div class="repository file list">
<div class="header-wrapper">
<div class="ui container">
<div class="repo-header">
<div class="ui huge breadcrumb repo-title">
<i class="mega-octicon octicon-repo"></i>
<a href="/flovanco">flovanco</a>
<div class="divider"> / </div>
<a href="/flovanco/doit">doit</a>
</div>
<div class="repo-buttons">
<form method="post" action="/flovanco/doit/action/watch?redirect_to=%2fflovanco%2fdoit%2fsrc%2fbranch%2fmaster%2fstatic%2ffonts%2fRoboto-Medium.ttf">
<input type="hidden" name="_csrf" value="PG49nQsNVNDzL7j830GxV6baicY6MTU5MjMzNDMwNzQ5ODk4MzkwMw">
<div class="ui labeled button" tabindex="0">
<button type="submit" class="ui compact basic button">
<i class="icon fa-eye-slash"></i>Beobachten
</button>
<a class="ui basic label" href="/flovanco/doit/watchers">
1
</a>
</div>
</form>
<form method="post" action="/flovanco/doit/action/star?redirect_to=%2fflovanco%2fdoit%2fsrc%2fbranch%2fmaster%2fstatic%2ffonts%2fRoboto-Medium.ttf">
<input type="hidden" name="_csrf" value="PG49nQsNVNDzL7j830GxV6baicY6MTU5MjMzNDMwNzQ5ODk4MzkwMw">
<div class="ui labeled button" tabindex="0">
<button type="submit" class="ui compact basic button">
<i class="icon star outline"></i>Favorisieren
</button>
<a class="ui basic label" href="/flovanco/doit/stars">
1
</a>
</div>
</form>
<div class="ui labeled button " tabindex="0">
<a class="ui compact basic button poping up" data-content="Bitte melde dich an, um dieses Repository zu forken." rel="nofollow" href="/user/login?redirect_to=/repo/fork/3183" data-position="top center" data-variation="tiny">
<i class="octicon octicon-repo-forked"></i>Fork
</a>
<a class="ui basic label" href="/flovanco/doit/forks">
0
</a>
</div>
</div>
</div>
</div>
<div class="ui tabs container">
<div class="ui tabular stackable menu navbar">
<a class="active item" href="/flovanco/doit">
<i class="octicon octicon-code"></i> Code
</a>
<a class=" item" href="/flovanco/doit/issues">
<i class="octicon octicon-issue-opened"></i> Issues <span class="ui blue small label">4</span>
</a>
<a class=" item" href="/flovanco/doit/pulls">
<i class="octicon octicon-git-pull-request"></i> Pull-Requests <span class="ui gray small label">0</span>
</a>
<a class=" item" href="/flovanco/doit/releases">
<i class="octicon octicon-tag"></i> Releases <span class="ui gray small label">0</span>
</a>
<a class=" item" href="/flovanco/doit/wiki" >
<i class="octicon octicon-book"></i> Wiki
</a>
<a class=" item" href="/flovanco/doit/activity">
<i class="octicon octicon-pulse"></i> Aktivität
</a>
</div>
</div>
<div class="ui tabs divider"></div>
</div>
<div class="ui container">
<div class="ui repo-description">
<div id="repo-desc">
<span class="description has-emoji">Task app based on OrbTk <a href="https://gitlab.redox-os.org/redox-os/orbtk" rel="nofollow">https://gitlab.redox-os.org/redox-os/orbtk</a>.</span>
<a class="link" href=""></a>
</div>
</div>
<div class="ui" id="repo-topics">
</div>
<div class="hide" id="validate_prompt">
<span id="count_prompt">Du kannst nicht mehr als 25 Themen auswählen</span>
<span id="format_prompt">Themen müssen entweder mit einem Buchstaben oder einer Ziffer beginnen. Sie können Bindestriche („-“) enthalten und bis zu 35 Zeichen lang sein.</span>
</div>
<div class="ui segment sub-menu">
<div class="ui two horizontal center link list">
<div class="item">
<a class="ui" href="/flovanco/doit/commits/branch/master"><i class="octicon octicon-history"></i> <b>57</b> Commits</a>
</div>
<div class="item">
<a class="ui" href="/flovanco/doit/branches/"><i class="octicon octicon-git-branch"></i> <b>2</b> Branches</a>
</div>
<div class="item">
<a class="ui" href="#"><i class="octicon octicon-database"></i> <b>922KB</b></a>
</div>
</div>
</div>
<div class="ui stackable secondary menu mobile--margin-between-items mobile--no-negative-margins">
<div class="fitted item choose reference">
<div class="ui floating filter dropdown custom" data-can-create-branch="false" data-no-results="Keine Ergebnisse verfügbar.">
<div class="ui basic small compact button" @click="menuVisible = !menuVisible" @keyup.enter="menuVisible = !menuVisible">
<span class="text">
<i class="octicon octicon-git-branch"></i>
Branch:
<strong>master</strong>
</span>
<i class="dropdown icon"></i>
</div>
<div class="data" style="display: none" data-mode="branches">
<div class="item branch selected" data-url="/flovanco/doit/src/branch/master/static/fonts/Roboto-Medium.ttf">master</div>
<div class="item branch " data-url="/flovanco/doit/src/branch/overview/static/fonts/Roboto-Medium.ttf">overview</div>
</div>
<div class="menu transition" :class="{visible: menuVisible}" v-if="menuVisible" v-cloak>
<div class="ui icon search input">
<i class="filter icon"></i>
<input name="search" ref="searchField" v-model="searchTerm" @keydown="keydown($event)" placeholder="Branch oder Tag filtern...">
</div>
<div class="header branch-tag-choice">
<div class="ui grid">
<div class="two column row">
<a class="reference column" href="#" @click="mode = 'branches'; focusSearchField()">
<span class="text" :class="{black: mode == 'branches'}">
<i class="octicon octicon-git-branch"></i> Branches
</span>
</a>
<a class="reference column" href="#" @click="mode = 'tags'; focusSearchField()">
<span class="text" :class="{black: mode == 'tags'}">
<i class="reference tags icon"></i> Tags
</span>
</a>
</div>
</div>
</div>
<div class="scrolling menu" ref="scrollContainer">
<div v-for="(item, index) in filteredItems" :key="item.name" class="item" :class="{selected: item.selected, active: active == index}" @click="selectItem(item)" :ref="'listItem' + index">${ item.name }</div>
<div class="item" v-if="showCreateNewBranch" :class="{active: active == filteredItems.length}" :ref="'listItem' + filteredItems.length">
<a href="#" @click="createNewBranch()">
<div>
<i class="octicon octicon-git-branch"></i>
Erstelle Branch <strong>${ searchTerm }</strong>
</div>
<div class="text small">
von „master“
</div>
</a>
<form ref="newBranchForm" action="/flovanco/doit/branches/_new/branch/master" method="post">
<input type="hidden" name="_csrf" value="PG49nQsNVNDzL7j830GxV6baicY6MTU5MjMzNDMwNzQ5ODk4MzkwMw">
<input type="hidden" name="new_branch_name" v-model="searchTerm">
</form>
</div>
</div>
<div class="message" v-if="showNoResults">${ noResults }</div>
</div>
</div>
</div>
<div class="fitted item"><span class="ui breadcrumb repo-path"><a class="section" href="/flovanco/doit/src/branch/master" title="doit">doit</a><span class="divider">/</span><span class="section"><a href="/flovanco/doit/src/branch/master/static" title="static">static</a></span><span class="divider">/</span><span class="section"><a href="/flovanco/doit/src/branch/master/static/fonts" title="fonts">fonts</a></span><span class="divider">/</span><span class="active section" title="Roboto-Medium.ttf">Roboto-Medium.ttf</span></span></div>
<div class="right fitted item" id="file-buttons">
<div class="ui tiny blue buttons">
</div>
</div>
<div class="fitted item">
</div>
<div class="fitted item">
</div>
</div>
<div class="tab-size-8 non-diff-file-content">
<h4 class="file-header ui top attached header">
<div class="file-header-left">
<div class="file-info text grey normal mono">
<div class="file-info-entry">
134KB
</div>
</div>
</div>
<div class="file-header-right">
<div class="ui right file-actions">
<div class="ui buttons">
<a class="ui button" href="/flovanco/doit/raw/branch/master/static/fonts/Roboto-Medium.ttf">Originalformat</a>
<a class="ui button" href="/flovanco/doit/src/commit/417acaf7ac867ed47ab73e7e66f07f15f1f124cc/static/fonts/Roboto-Medium.ttf">Permalink</a>
<a class="ui button" href="/flovanco/doit/commits/branch/master/static/fonts/Roboto-Medium.ttf">Verlauf</a>
</div>
<i class="octicon octicon-pencil btn-octicon poping up disabled" data-content="Binärdateien können nicht im Webinterface bearbeitet werden." data-position="bottom center" data-variation="tiny inverted"></i>
<i class="octicon octicon-trashcan btn-octicon poping up disabled" data-content="Du benötigst Schreibzugriff, um Änderungen an dieser Datei vorzuschlagen oder vorzunehmen." data-position="bottom center" data-variation="tiny inverted"></i>
</div>
</div>
</h4>
<div class="ui attached table unstackable segment">
<div class="file-view has-emoji">
<div class="view-raw ui center">
<a href="/flovanco/doit/raw/branch/master/static/fonts/Roboto-Medium.ttf" rel="nofollow" class="btn btn-gray btn-radius">Originalformat anzeigen</a>
</div>
</div>
</div>
</div>
<script>
function submitDeleteForm() {
var message = prompt("delete_confirm_message\n\ndelete_commit_summary", "Delete ''");
if (message != null) {
$("#delete-message").val(message);
$("#delete-file-form").submit()
}
}
</script>
</div>
</div>
</div>
<footer>
<div class="ui container">
<div class="ui left">
</div>
<div class="ui right links">
<div class="ui language bottom floating slide up dropdown link item">
<i class="world icon"></i>
<div class="text">Deutsch</div>
<div class="menu">
<a lang="de-DE" class="item active selected" href="#">Deutsch</a>
<a lang="en-US" class="item " href="/flovanco/doit/src/branch/master/static/fonts/Roboto-Medium.ttf?lang=en-US">English</a>
<a lang="zh-CN" class="item " href="/flovanco/doit/src/branch/master/static/fonts/Roboto-Medium.ttf?lang=zh-CN">简体中文</a>
<a lang="zh-HK" class="item " href="/flovanco/doit/src/branch/master/static/fonts/Roboto-Medium.ttf?lang=zh-HK">繁體中文(香港)</a>
<a lang="zh-TW" class="item " href="/flovanco/doit/src/branch/master/static/fonts/Roboto-Medium.ttf?lang=zh-TW">繁體中文(台灣)</a>
<a lang="fr-FR" class="item " href="/flovanco/doit/src/branch/master/static/fonts/Roboto-Medium.ttf?lang=fr-FR">français</a>
<a lang="nl-NL" class="item " href="/flovanco/doit/src/branch/master/static/fonts/Roboto-Medium.ttf?lang=nl-NL">Nederlands</a>
<a lang="lv-LV" class="item " href="/flovanco/doit/src/branch/master/static/fonts/Roboto-Medium.ttf?lang=lv-LV">latviešu</a>
<a lang="ru-RU" class="item " href="/flovanco/doit/src/branch/master/static/fonts/Roboto-Medium.ttf?lang=ru-RU">русский</a>
<a lang="uk-UA" class="item " href="/flovanco/doit/src/branch/master/static/fonts/Roboto-Medium.ttf?lang=uk-UA">Українська</a>
<a lang="ja-JP" class="item " href="/flovanco/doit/src/branch/master/static/fonts/Roboto-Medium.ttf?lang=ja-JP">日本語</a>
<a lang="es-ES" class="item " href="/flovanco/doit/src/branch/master/static/fonts/Roboto-Medium.ttf?lang=es-ES">español</a>
<a lang="pt-BR" class="item " href="/flovanco/doit/src/branch/master/static/fonts/Roboto-Medium.ttf?lang=pt-BR">português do Brasil</a>
<a lang="pl-PL" class="item " href="/flovanco/doit/src/branch/master/static/fonts/Roboto-Medium.ttf?lang=pl-PL">polski</a>
<a lang="bg-BG" class="item " href="/flovanco/doit/src/branch/master/static/fonts/Roboto-Medium.ttf?lang=bg-BG">български</a>
<a lang="it-IT" class="item " href="/flovanco/doit/src/branch/master/static/fonts/Roboto-Medium.ttf?lang=it-IT">italiano</a>
<a lang="fi-FI" class="item " href="/flovanco/doit/src/branch/master/static/fonts/Roboto-Medium.ttf?lang=fi-FI">suomi</a>
<a lang="tr-TR" class="item " href="/flovanco/doit/src/branch/master/static/fonts/Roboto-Medium.ttf?lang=tr-TR">Türkçe</a>
<a lang="cs-CZ" class="item " href="/flovanco/doit/src/branch/master/static/fonts/Roboto-Medium.ttf?lang=cs-CZ">čeština</a>
<a lang="sr-SP" class="item " href="/flovanco/doit/src/branch/master/static/fonts/Roboto-Medium.ttf?lang=sr-SP">српски</a>
<a lang="sv-SE" class="item " href="/flovanco/doit/src/branch/master/static/fonts/Roboto-Medium.ttf?lang=sv-SE">svenska</a>
<a lang="ko-KR" class="item " href="/flovanco/doit/src/branch/master/static/fonts/Roboto-Medium.ttf?lang=ko-KR">한국어</a>
</div>
</div>
<a href="/vendor/librejs.html" data-jslicense="1">JavaScript licenses</a>
<a target="_blank" rel="noopener" href="/codeberg/org/src/branch/master/PrivacyPolicy.md">Privacy Policy</a>
<a target="_blank" rel="noopener" href="/codeberg/org/src/branch/master/Satzung.md">Bylaws/Satzung</a>
<a target="_blank" rel="noopener" href="/codeberg/org/src/branch/master/Imprint.md">Imprint/Impressum</a>
<a target="_blank" rel="noopener" href="/codeberg/org/src/branch/master/TermsOfUse.md">Terms of Use</a>
</div>
</div>
</footer>
<script src="/vendor/plugins/jquery/jquery.min.js?v=3.4.1"></script>
<script src="/vendor/plugins/jquery-migrate/jquery-migrate.min.js?v=3.0.1"></script>
<script src="/vendor/plugins/jquery.areyousure/jquery.are-you-sure.js"></script>
<script src="/vendor/plugins/highlight/highlight.pack.js"></script>
<script src="/vendor/plugins/emojify/emojify.custom.js"></script>
<script src="/vendor/plugins/clipboard/clipboard.min.js"></script>
<script src="/vendor/plugins/vue/vue.min.js"></script>
<script src="/vendor/plugins/fomantic/semantic.min.js?v=6b0a0a50c7fb0aaef957cb0ab4f596e7"></script>
<script src="/js/index.js?v=6b0a0a50c7fb0aaef957cb0ab4f596e7"></script>
</body>
</html>

View File

@@ -0,0 +1,581 @@
<!DOCTYPE html>
<html lang="de-DE">
<head data-suburl="">
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta http-equiv="x-ua-compatible" content="ie=edge">
<title>flovanco/doit: Task app based on OrbTk https://gitlab.redox-os.org/redox-os/orbtk. - static/fonts/Roboto-Regular.ttf at master - doit - Codeberg.org</title>
<link rel="manifest" href="/manifest.json" crossorigin="use-credentials">
<script>
if ('serviceWorker' in navigator) {
navigator.serviceWorker.register('/serviceworker.js').then(function(registration) {
console.info('ServiceWorker registration successful with scope: ', registration.scope);
}, function(err) {
console.info('ServiceWorker registration failed: ', err);
});
}
</script>
<meta name="theme-color" content="#6cc644">
<meta name="author" content="flovanco" />
<meta name="description" content="doit - Task app based on OrbTk https://gitlab.redox-os.org/redox-os/orbtk." />
<meta name="keywords" content="git,non-profit,foss,oss,free,software,open,source,code,hosting">
<meta name="referrer" content="no-referrer" />
<meta name="_csrf" content="PG49nQsNVNDzL7j830GxV6baicY6MTU5MjMzNDMwNzQ5ODk4MzkwMw" />
<meta name="_suburl" content="" />
<script>
/*
@licstart The following is the entire license notice for the
JavaScript code in this page.
Copyright (c) 2016 The Gitea Authors
Copyright (c) 2015 The Gogs Authors
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
---
Licensing information for additional javascript libraries can be found at:
{{StaticUrlPrefix}}/vendor/librejs.html
@licend The above is the entire license notice
for the JavaScript code in this page.
*/
</script>
<script>
window.config = {
StaticUrlPrefix: ''
}
</script>
<link rel="shortcut icon" href="/img/favicon.png" />
<link rel="mask-icon" href="/img/gitea-safari.svg" color="#609926">
<link rel="preload" href="/vendor/assets/font-awesome/css/font-awesome.min.css" as="style" onload="this.rel='stylesheet'">
<noscript><link rel="stylesheet" href="/vendor/assets/font-awesome/css/font-awesome.min.css"></noscript>
<link rel="stylesheet" href="/vendor/assets/octicons/octicons.min.css">
<link rel="stylesheet" href="/vendor/plugins/fomantic/semantic.min.css?v=6b0a0a50c7fb0aaef957cb0ab4f596e7">
<link rel="stylesheet" href="/css/index.css?v=6b0a0a50c7fb0aaef957cb0ab4f596e7">
<noscript>
<style>
.dropdown:hover > .menu { display: block; }
.ui.secondary.menu .dropdown.item > .menu { margin-top: 0; }
</style>
</noscript>
<link rel="stylesheet" href="/vendor/plugins/highlight/github.css">
<style class="list-search-style"></style>
<script src="/vendor/plugins/promise-polyfill/polyfill.min.js"></script>
<script src="/vendor/plugins/cssrelpreload/loadCSS.min.js"></script>
<script src="/vendor/plugins/cssrelpreload/cssrelpreload.min.js"></script>
<meta property="og:title" content="doit" />
<meta property="og:url" content="https://codeberg.org/flovanco/doit" />
<meta property="og:description" content="Task app based on OrbTk https://gitlab.redox-os.org/redox-os/orbtk." />
<meta property="og:type" content="object" />
<meta property="og:image" content="https://codeberg.org/user/avatar/flovanco/-1" />
<meta property="og:site_name" content="Codeberg.org" />
<link rel="stylesheet" href="/codeberg.css">
</head>
<body>
<div class="full height">
<noscript>Diese Webseite funktioniert besser mit JavaScript.</noscript>
<div class="ui top secondary stackable main menu following bar light">
<div class="ui container" id="navbar">
<div class="item brand" style="justify-content: space-between;">
<a href="/">
<img class="ui mini image" src="/img/gitea-sm.png">
</a>
<div class="ui basic icon button mobile-only" id="navbar-expand-toggle">
<i class="sidebar icon"></i>
</div>
</div>
<a class="item " href="/">Startseite</a>
<a class="item " href="/explore/repos">Erkunden</a>
<a class="item" href="/Codeberg/Community/issues">Codeberg Issues</a>
<a class="item" href="https://blog.codeberg.org">Blog</a>
<a class="item" href="https://join.codeberg.org/">Join Codeberg e.V.</a>
<a class="item" href="https://liberapay.com/codeberg/donate">Donate</a>
<a class="item" target="_blank" rel="noopener noreferrer" href="https://docs.gitea.io">Hilfe</a>
<div class="right stackable menu">
<a class="item" href="/user/sing_up">
<i class="octicon octicon-person"></i> Registrieren
</a>
<a class="item" rel="nofollow" href="/user/login?redirect_to=%2fflovanco%2fdoit%2fsrc%2fbranch%2fmaster%2fstatic%2ffonts%2fRoboto-Regular.ttf">
<i class="octicon octicon-sign-in"></i> Anmelden
</a>
</div>
</div>
</div>
<div class="repository file list">
<div class="header-wrapper">
<div class="ui container">
<div class="repo-header">
<div class="ui huge breadcrumb repo-title">
<i class="mega-octicon octicon-repo"></i>
<a href="/flovanco">flovanco</a>
<div class="divider"> / </div>
<a href="/flovanco/doit">doit</a>
</div>
<div class="repo-buttons">
<form method="post" action="/flovanco/doit/action/watch?redirect_to=%2fflovanco%2fdoit%2fsrc%2fbranch%2fmaster%2fstatic%2ffonts%2fRoboto-Regular.ttf">
<input type="hidden" name="_csrf" value="PG49nQsNVNDzL7j830GxV6baicY6MTU5MjMzNDMwNzQ5ODk4MzkwMw">
<div class="ui labeled button" tabindex="0">
<button type="submit" class="ui compact basic button">
<i class="icon fa-eye-slash"></i>Beobachten
</button>
<a class="ui basic label" href="/flovanco/doit/watchers">
1
</a>
</div>
</form>
<form method="post" action="/flovanco/doit/action/star?redirect_to=%2fflovanco%2fdoit%2fsrc%2fbranch%2fmaster%2fstatic%2ffonts%2fRoboto-Regular.ttf">
<input type="hidden" name="_csrf" value="PG49nQsNVNDzL7j830GxV6baicY6MTU5MjMzNDMwNzQ5ODk4MzkwMw">
<div class="ui labeled button" tabindex="0">
<button type="submit" class="ui compact basic button">
<i class="icon star outline"></i>Favorisieren
</button>
<a class="ui basic label" href="/flovanco/doit/stars">
1
</a>
</div>
</form>
<div class="ui labeled button " tabindex="0">
<a class="ui compact basic button poping up" data-content="Bitte melde dich an, um dieses Repository zu forken." rel="nofollow" href="/user/login?redirect_to=/repo/fork/3183" data-position="top center" data-variation="tiny">
<i class="octicon octicon-repo-forked"></i>Fork
</a>
<a class="ui basic label" href="/flovanco/doit/forks">
0
</a>
</div>
</div>
</div>
</div>
<div class="ui tabs container">
<div class="ui tabular stackable menu navbar">
<a class="active item" href="/flovanco/doit">
<i class="octicon octicon-code"></i> Code
</a>
<a class=" item" href="/flovanco/doit/issues">
<i class="octicon octicon-issue-opened"></i> Issues <span class="ui blue small label">4</span>
</a>
<a class=" item" href="/flovanco/doit/pulls">
<i class="octicon octicon-git-pull-request"></i> Pull-Requests <span class="ui gray small label">0</span>
</a>
<a class=" item" href="/flovanco/doit/releases">
<i class="octicon octicon-tag"></i> Releases <span class="ui gray small label">0</span>
</a>
<a class=" item" href="/flovanco/doit/wiki" >
<i class="octicon octicon-book"></i> Wiki
</a>
<a class=" item" href="/flovanco/doit/activity">
<i class="octicon octicon-pulse"></i> Aktivität
</a>
</div>
</div>
<div class="ui tabs divider"></div>
</div>
<div class="ui container">
<div class="ui repo-description">
<div id="repo-desc">
<span class="description has-emoji">Task app based on OrbTk <a href="https://gitlab.redox-os.org/redox-os/orbtk" rel="nofollow">https://gitlab.redox-os.org/redox-os/orbtk</a>.</span>
<a class="link" href=""></a>
</div>
</div>
<div class="ui" id="repo-topics">
</div>
<div class="hide" id="validate_prompt">
<span id="count_prompt">Du kannst nicht mehr als 25 Themen auswählen</span>
<span id="format_prompt">Themen müssen entweder mit einem Buchstaben oder einer Ziffer beginnen. Sie können Bindestriche („-“) enthalten und bis zu 35 Zeichen lang sein.</span>
</div>
<div class="ui segment sub-menu">
<div class="ui two horizontal center link list">
<div class="item">
<a class="ui" href="/flovanco/doit/commits/branch/master"><i class="octicon octicon-history"></i> <b>57</b> Commits</a>
</div>
<div class="item">
<a class="ui" href="/flovanco/doit/branches/"><i class="octicon octicon-git-branch"></i> <b>2</b> Branches</a>
</div>
<div class="item">
<a class="ui" href="#"><i class="octicon octicon-database"></i> <b>922KB</b></a>
</div>
</div>
</div>
<div class="ui stackable secondary menu mobile--margin-between-items mobile--no-negative-margins">
<div class="fitted item choose reference">
<div class="ui floating filter dropdown custom" data-can-create-branch="false" data-no-results="Keine Ergebnisse verfügbar.">
<div class="ui basic small compact button" @click="menuVisible = !menuVisible" @keyup.enter="menuVisible = !menuVisible">
<span class="text">
<i class="octicon octicon-git-branch"></i>
Branch:
<strong>master</strong>
</span>
<i class="dropdown icon"></i>
</div>
<div class="data" style="display: none" data-mode="branches">
<div class="item branch selected" data-url="/flovanco/doit/src/branch/master/static/fonts/Roboto-Regular.ttf">master</div>
<div class="item branch " data-url="/flovanco/doit/src/branch/overview/static/fonts/Roboto-Regular.ttf">overview</div>
</div>
<div class="menu transition" :class="{visible: menuVisible}" v-if="menuVisible" v-cloak>
<div class="ui icon search input">
<i class="filter icon"></i>
<input name="search" ref="searchField" v-model="searchTerm" @keydown="keydown($event)" placeholder="Branch oder Tag filtern...">
</div>
<div class="header branch-tag-choice">
<div class="ui grid">
<div class="two column row">
<a class="reference column" href="#" @click="mode = 'branches'; focusSearchField()">
<span class="text" :class="{black: mode == 'branches'}">
<i class="octicon octicon-git-branch"></i> Branches
</span>
</a>
<a class="reference column" href="#" @click="mode = 'tags'; focusSearchField()">
<span class="text" :class="{black: mode == 'tags'}">
<i class="reference tags icon"></i> Tags
</span>
</a>
</div>
</div>
</div>
<div class="scrolling menu" ref="scrollContainer">
<div v-for="(item, index) in filteredItems" :key="item.name" class="item" :class="{selected: item.selected, active: active == index}" @click="selectItem(item)" :ref="'listItem' + index">${ item.name }</div>
<div class="item" v-if="showCreateNewBranch" :class="{active: active == filteredItems.length}" :ref="'listItem' + filteredItems.length">
<a href="#" @click="createNewBranch()">
<div>
<i class="octicon octicon-git-branch"></i>
Erstelle Branch <strong>${ searchTerm }</strong>
</div>
<div class="text small">
von „master“
</div>
</a>
<form ref="newBranchForm" action="/flovanco/doit/branches/_new/branch/master" method="post">
<input type="hidden" name="_csrf" value="PG49nQsNVNDzL7j830GxV6baicY6MTU5MjMzNDMwNzQ5ODk4MzkwMw">
<input type="hidden" name="new_branch_name" v-model="searchTerm">
</form>
</div>
</div>
<div class="message" v-if="showNoResults">${ noResults }</div>
</div>
</div>
</div>
<div class="fitted item"><span class="ui breadcrumb repo-path"><a class="section" href="/flovanco/doit/src/branch/master" title="doit">doit</a><span class="divider">/</span><span class="section"><a href="/flovanco/doit/src/branch/master/static" title="static">static</a></span><span class="divider">/</span><span class="section"><a href="/flovanco/doit/src/branch/master/static/fonts" title="fonts">fonts</a></span><span class="divider">/</span><span class="active section" title="Roboto-Regular.ttf">Roboto-Regular.ttf</span></span></div>
<div class="right fitted item" id="file-buttons">
<div class="ui tiny blue buttons">
</div>
</div>
<div class="fitted item">
</div>
<div class="fitted item">
</div>
</div>
<div class="tab-size-8 non-diff-file-content">
<h4 class="file-header ui top attached header">
<div class="file-header-left">
<div class="file-info text grey normal mono">
<div class="file-info-entry">
142KB
</div>
</div>
</div>
<div class="file-header-right">
<div class="ui right file-actions">
<div class="ui buttons">
<a class="ui button" href="/flovanco/doit/raw/branch/master/static/fonts/Roboto-Regular.ttf">Originalformat</a>
<a class="ui button" href="/flovanco/doit/src/commit/417acaf7ac867ed47ab73e7e66f07f15f1f124cc/static/fonts/Roboto-Regular.ttf">Permalink</a>
<a class="ui button" href="/flovanco/doit/commits/branch/master/static/fonts/Roboto-Regular.ttf">Verlauf</a>
</div>
<i class="octicon octicon-pencil btn-octicon poping up disabled" data-content="Binärdateien können nicht im Webinterface bearbeitet werden." data-position="bottom center" data-variation="tiny inverted"></i>
<i class="octicon octicon-trashcan btn-octicon poping up disabled" data-content="Du benötigst Schreibzugriff, um Änderungen an dieser Datei vorzuschlagen oder vorzunehmen." data-position="bottom center" data-variation="tiny inverted"></i>
</div>
</div>
</h4>
<div class="ui attached table unstackable segment">
<div class="file-view has-emoji">
<div class="view-raw ui center">
<a href="/flovanco/doit/raw/branch/master/static/fonts/Roboto-Regular.ttf" rel="nofollow" class="btn btn-gray btn-radius">Originalformat anzeigen</a>
</div>
</div>
</div>
</div>
<script>
function submitDeleteForm() {
var message = prompt("delete_confirm_message\n\ndelete_commit_summary", "Delete ''");
if (message != null) {
$("#delete-message").val(message);
$("#delete-file-form").submit()
}
}
</script>
</div>
</div>
</div>
<footer>
<div class="ui container">
<div class="ui left">
</div>
<div class="ui right links">
<div class="ui language bottom floating slide up dropdown link item">
<i class="world icon"></i>
<div class="text">Deutsch</div>
<div class="menu">
<a lang="de-DE" class="item active selected" href="#">Deutsch</a>
<a lang="en-US" class="item " href="/flovanco/doit/src/branch/master/static/fonts/Roboto-Regular.ttf?lang=en-US">English</a>
<a lang="zh-CN" class="item " href="/flovanco/doit/src/branch/master/static/fonts/Roboto-Regular.ttf?lang=zh-CN">简体中文</a>
<a lang="zh-HK" class="item " href="/flovanco/doit/src/branch/master/static/fonts/Roboto-Regular.ttf?lang=zh-HK">繁體中文(香港)</a>
<a lang="zh-TW" class="item " href="/flovanco/doit/src/branch/master/static/fonts/Roboto-Regular.ttf?lang=zh-TW">繁體中文(台灣)</a>
<a lang="fr-FR" class="item " href="/flovanco/doit/src/branch/master/static/fonts/Roboto-Regular.ttf?lang=fr-FR">français</a>
<a lang="nl-NL" class="item " href="/flovanco/doit/src/branch/master/static/fonts/Roboto-Regular.ttf?lang=nl-NL">Nederlands</a>
<a lang="lv-LV" class="item " href="/flovanco/doit/src/branch/master/static/fonts/Roboto-Regular.ttf?lang=lv-LV">latviešu</a>
<a lang="ru-RU" class="item " href="/flovanco/doit/src/branch/master/static/fonts/Roboto-Regular.ttf?lang=ru-RU">русский</a>
<a lang="uk-UA" class="item " href="/flovanco/doit/src/branch/master/static/fonts/Roboto-Regular.ttf?lang=uk-UA">Українська</a>
<a lang="ja-JP" class="item " href="/flovanco/doit/src/branch/master/static/fonts/Roboto-Regular.ttf?lang=ja-JP">日本語</a>
<a lang="es-ES" class="item " href="/flovanco/doit/src/branch/master/static/fonts/Roboto-Regular.ttf?lang=es-ES">español</a>
<a lang="pt-BR" class="item " href="/flovanco/doit/src/branch/master/static/fonts/Roboto-Regular.ttf?lang=pt-BR">português do Brasil</a>
<a lang="pl-PL" class="item " href="/flovanco/doit/src/branch/master/static/fonts/Roboto-Regular.ttf?lang=pl-PL">polski</a>
<a lang="bg-BG" class="item " href="/flovanco/doit/src/branch/master/static/fonts/Roboto-Regular.ttf?lang=bg-BG">български</a>
<a lang="it-IT" class="item " href="/flovanco/doit/src/branch/master/static/fonts/Roboto-Regular.ttf?lang=it-IT">italiano</a>
<a lang="fi-FI" class="item " href="/flovanco/doit/src/branch/master/static/fonts/Roboto-Regular.ttf?lang=fi-FI">suomi</a>
<a lang="tr-TR" class="item " href="/flovanco/doit/src/branch/master/static/fonts/Roboto-Regular.ttf?lang=tr-TR">Türkçe</a>
<a lang="cs-CZ" class="item " href="/flovanco/doit/src/branch/master/static/fonts/Roboto-Regular.ttf?lang=cs-CZ">čeština</a>
<a lang="sr-SP" class="item " href="/flovanco/doit/src/branch/master/static/fonts/Roboto-Regular.ttf?lang=sr-SP">српски</a>
<a lang="sv-SE" class="item " href="/flovanco/doit/src/branch/master/static/fonts/Roboto-Regular.ttf?lang=sv-SE">svenska</a>
<a lang="ko-KR" class="item " href="/flovanco/doit/src/branch/master/static/fonts/Roboto-Regular.ttf?lang=ko-KR">한국어</a>
</div>
</div>
<a href="/vendor/librejs.html" data-jslicense="1">JavaScript licenses</a>
<a target="_blank" rel="noopener" href="/codeberg/org/src/branch/master/PrivacyPolicy.md">Privacy Policy</a>
<a target="_blank" rel="noopener" href="/codeberg/org/src/branch/master/Satzung.md">Bylaws/Satzung</a>
<a target="_blank" rel="noopener" href="/codeberg/org/src/branch/master/Imprint.md">Imprint/Impressum</a>
<a target="_blank" rel="noopener" href="/codeberg/org/src/branch/master/TermsOfUse.md">Terms of Use</a>
</div>
</div>
</footer>
<script src="/vendor/plugins/jquery/jquery.min.js?v=3.4.1"></script>
<script src="/vendor/plugins/jquery-migrate/jquery-migrate.min.js?v=3.0.1"></script>
<script src="/vendor/plugins/jquery.areyousure/jquery.are-you-sure.js"></script>
<script src="/vendor/plugins/highlight/highlight.pack.js"></script>
<script src="/vendor/plugins/emojify/emojify.custom.js"></script>
<script src="/vendor/plugins/clipboard/clipboard.min.js"></script>
<script src="/vendor/plugins/vue/vue.min.js"></script>
<script src="/vendor/plugins/fomantic/semantic.min.js?v=6b0a0a50c7fb0aaef957cb0ab4f596e7"></script>
<script src="/js/index.js?v=6b0a0a50c7fb0aaef957cb0ab4f596e7"></script>
</body>
</html>

Binary file not shown.

View File

@@ -0,0 +1,25 @@
* {
font-size: 24;
}
lynch {
background: #647b91;
}
bluebayoux {
background: #516475;
}
linkwater {
background: #dfebf5;
color: #3b434a;
}
light-text {
color: #dfebf5;
}
goldendream {
background: #efd035;
color: #3b434a;
}

View File

Before

Width:  |  Height:  |  Size: 220 B

After

Width:  |  Height:  |  Size: 220 B

View File

Before

Width:  |  Height:  |  Size: 123 B

After

Width:  |  Height:  |  Size: 123 B

View File

Before

Width:  |  Height:  |  Size: 123 B

After

Width:  |  Height:  |  Size: 123 B

View File

Before

Width:  |  Height:  |  Size: 289 B

After

Width:  |  Height:  |  Size: 289 B

View File

Before

Width:  |  Height:  |  Size: 126 B

After

Width:  |  Height:  |  Size: 126 B

View File

Before

Width:  |  Height:  |  Size: 158 B

After

Width:  |  Height:  |  Size: 158 B

View File

Before

Width:  |  Height:  |  Size: 351 B

After

Width:  |  Height:  |  Size: 351 B

View File

Before

Width:  |  Height:  |  Size: 130 B

After

Width:  |  Height:  |  Size: 130 B

View File

Before

Width:  |  Height:  |  Size: 193 B

After

Width:  |  Height:  |  Size: 193 B

View File

Before

Width:  |  Height:  |  Size: 452 B

After

Width:  |  Height:  |  Size: 452 B

View File

Before

Width:  |  Height:  |  Size: 131 B

After

Width:  |  Height:  |  Size: 131 B

View File

Before

Width:  |  Height:  |  Size: 223 B

After

Width:  |  Height:  |  Size: 223 B

View File

Before

Width:  |  Height:  |  Size: 53 KiB

After

Width:  |  Height:  |  Size: 53 KiB

View File

Before

Width:  |  Height:  |  Size: 3.0 KiB

After

Width:  |  Height:  |  Size: 3.0 KiB

View File

Before

Width:  |  Height:  |  Size: 3.2 KiB

After

Width:  |  Height:  |  Size: 3.2 KiB

View File

Before

Width:  |  Height:  |  Size: 3.3 KiB

After

Width:  |  Height:  |  Size: 3.3 KiB

View File

Before

Width:  |  Height:  |  Size: 3.5 KiB

After

Width:  |  Height:  |  Size: 3.5 KiB

View File

Before

Width:  |  Height:  |  Size: 768 B

After

Width:  |  Height:  |  Size: 768 B

View File

Before

Width:  |  Height:  |  Size: 1.3 KiB

After

Width:  |  Height:  |  Size: 1.3 KiB

View File

Before

Width:  |  Height:  |  Size: 1.8 KiB

After

Width:  |  Height:  |  Size: 1.8 KiB

View File

Before

Width:  |  Height:  |  Size: 2.7 KiB

After

Width:  |  Height:  |  Size: 2.7 KiB

View File

Before

Width:  |  Height:  |  Size: 455 KiB

After

Width:  |  Height:  |  Size: 455 KiB

View File

Before

Width:  |  Height:  |  Size: 53 KiB

After

Width:  |  Height:  |  Size: 53 KiB

View File

Before

Width:  |  Height:  |  Size: 53 KiB

After

Width:  |  Height:  |  Size: 53 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.0 KiB

View File

Before

Width:  |  Height:  |  Size: 71 KiB

After

Width:  |  Height:  |  Size: 71 KiB

View File

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 12 KiB

View File

Before

Width:  |  Height:  |  Size: 1.3 KiB

After

Width:  |  Height:  |  Size: 1.3 KiB

View File

Before

Width:  |  Height:  |  Size: 237 KiB

After

Width:  |  Height:  |  Size: 237 KiB

View File

Before

Width:  |  Height:  |  Size: 17 KiB

After

Width:  |  Height:  |  Size: 17 KiB

View File

Before

Width:  |  Height:  |  Size: 5.5 KiB

After

Width:  |  Height:  |  Size: 5.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 237 KiB

View File

@@ -0,0 +1,25 @@
* {
font-size: 24;
}
lynch {
background: #647b91;
}
bluebayoux {
background: #516475;
}
linkwater {
background: #dfebf5;
color: #3b434a;
}
light-text {
color: #dfebf5;
}
goldendream {
background: #efd035;
color: #3b434a;
}

View File

@@ -0,0 +1,32 @@
.header {
background: #444e55;
}
.content {
background: #3b434a;
}
text-box {
background: transparent;
border-width: 0;
color: #9dafbf;
font-size: 16;
}
#input {
font-size: 16;
}
text-block {
font-size: 42;
color: #dfebf5;
}
#input {
background: transparent;
}
button {
border-radius: 1;
font-size: 20;
}

View File

@@ -0,0 +1,23 @@
* {
font-size: 16;
}
.header {
background: #ffffff;
}
.content {
background: #fafafa;
}
text-box {
color: #4d4c4c;
}
text-block {
color: #4d4c4c;
}
light-text {
color: #dfebf5;
}

View File

@@ -0,0 +1,217 @@
.my_header {
font-size: 24;
}
/* defaults: dark.css
* {
background: #ffffff;
font-size: 16;
font-family: "Roboto Medium";
icon-size: 16;
icon-family: "Material Icons";
}
window {
background: #ffffff;
}
.h1 {
font-size: 36;
}
*/
/*
.top_bar {
padding-left: 4;
padding-right: 4;
min-height: 150;
background: #ffffff;
border-color: #5b0f22;
}
.bottom_bar {
height: 40;
background: #ffffff;
}
*/
/*
font-family: "Roboto Medium";
background: transparent;
border-width: 2;
border-color: #5b0f22;
border-radius: 2;
padding: 6;
}
.text_form {
background: #ffffff;
}
.text_block {
background: #ffffff;
border-color: #5b0f22;
border-width: 0;
color: #5b0f22;
}
text_box:empty {
color: #9E9E9E
}
text_box:focus {
border-color: #f8de4c;
}
/*
text_box.inplace {
color: #dfebf5;
background: transparent;
border-color: transparent;
border-width: 1;
border-radius: 2;
padding: 6;
font-size: 48;
}
text_box.inplace:focus {
background: #ffffff;
border-color: #5b0f22;
}
text_box.inplace:empty {
color: #9E9E9E
}
.icon_only {
icon-color: transparent;
background: transparent;
}
.icon_only:active {
icon-color: #5b0f22;
background: #5b0f22;
}
.icon_only:disabled {
icon-color: transparent;
background: transparent;
}
items-widget {
padding: 0;
border-color: transparent;
font-size: 48;
}
list-view-item {
padding-left: 0;
padding-right: 0;
height: 62;
}
list-view-item:active {
background: #ffffff;
}
policy_check.text_box {
font-size: 48;
}
policy_list.text_box {
font-size: 48;
}
policy_list.text_box {
font-size: 48;
}
.transparent {
icon-color: transparent;
background: transparent;
}
.transparent:active {
icon-color: transparent;
background: transparent;
}
.item_button {
background: transparent;
border-radius: 0;
font-size: 48;
}
.separator {
background: #f8de4c;
color: #f8de4c;
border-width: 2;
border-color: #5b0f22;
}
*/
/*
const LINK_WATER_COLOR
color: #dfebf5;
const LYNCH_COLOR
color: #647b91;
const BOMBAY_COLOR
color: #adb3B8;
const SLATE_GRAY_COLOR
color: #6c7a90;
const BRIGHT_GRAY_COLOR
color: #3b434a;
const MATERIAL_RED_COLOR
color: #5b0f22;
.header {
background: #ffffff;
}
.content {
background: #fafafa;
}
text-box {
color: #5b0f22;
}
text-block {
color: #5b0f22;
}
top-bar {
color: #5b0f22;
background: #fafafa;
}
*/
/*
light-text {
color: #dfebf5;
}
*/
/* // Hiedemann blue */
/* color: #a5b3bf; */
/* // Hiedemann red */
/* color: #5b0f22; */
/* // Hiedemann darkgrey */
/* color: #879488; */
/* // Hiedemann grey */
/* color: ##b6c3b7; */
/* // Qt Green */
/* color: #41cd52; */
/* // lightgrey */
/* color: #f0f0f0; */
/* Accent=#5b0f22 */
/* Foreground=#000000 */
/* Background=#f0f0f0 */

View File

@@ -0,0 +1,75 @@
.top_bar {
padding-left: 4;
padding-right: 4;
min-height: 52;
background: #475b6e;
}
.bottom_bar {
height: 40;
background: #475b6e;
}
.header {
font-size: 24;
font-family: "Roboto Medium";
}
text_box.inplace {
color: #dfebf5;
background: transparent;
border-color: transparent;
border-width: 1;
border-radius: 2;
padding: 6;
}
text_box.inplace:focus {
background: #3b434a;
border-color: #5b0f22;
}
text_box.inplace:empty {
color: #9E9E9E;
border-color: #5b0f22;
}
.icon_only {
background: #5b0f22;
icon-color: #ffffff;
spacing: 0;
}
.icon_only:active {
background: #5b0f22;
icon-color: #ffffff;
}
.icon_only:disabled {
icon-color: #ffffff;
background: #ffffff;
}
items-widget {
padding: 0;
border-color: transparent;
}
.transparent {
icon-color: transparent;
background: transparent;
}
.transparent:active {
icon-color: transparent;
background: transparent;
}
.item_button {
background: transparent;
border-radius: 0;
}
.separator {
background: #212121;
}

View File

@@ -0,0 +1,55 @@
* {
font-size: 16;
}
lynch {
background: #647b91;
}
bluebayoux {
background: #516475;
}
linkwater {
background: #dfebf5;
color: #3b434a;
}
light-text {
color: #dfebf5;
}
goldendream {
background: #efd035;
color: #3b434a;
}
lightgrey {
#f0f0f0;
}
darkgrey {
#879488;
}
grey {
#b6c3b7;
}
Indigo-bases {
#5c6bc0;
}
hiedemann-blue {
#a5b3bf;
}
hiedemann-red {
color: #5b0f22;
}
hiedemann {
background: #5b0f22;
color: #879488;
//color: #3b434a;
}

View File

@@ -0,0 +1,53 @@
* {
font-size: 24;
}
.header {
background: #ffffff;
}
.background {
background: #fafafa;
}
.content {
background: #fafafa;
}
text-box {
color: #5b0f22;
}
text-block {
color: #5b0f22;
}
light-text {
color: #dfebf5;
}
/* // Hiedemann blue */
/* color: #a5b3bf; */
/* color: #4d4c4c; */
/* // Hiedemann red */
/* color: #5b0f22; */
/* // Hiedemann darkgrey */
/* color: #879488; */
/* // Hiedemann grey */
/* color: ##b6c3b7; */
/* // Qt Green */
/* color: #41cd52; */
/* // lightgrey */
/* color: #f0f0f0; */
/* Accent=#5b0f22 */
/* Foreground=#000000 */
/* Background=#f0f0f0 */

View File

@@ -0,0 +1,48 @@
.header {
background: #ffffff;
}
.content {
background: #fafafa;
}
.content {
background: #fafafa;
}
text-box {
color: #5b0f22;
}
text-block {
color: #5b0f22;
}
/*
light-text {
color: #dfebf5;
}
*/
/* // Hiedemann blue */
/* color: #a5b3bf; */
/* // Hiedemann red */
/* color: #5b0f22; */
/* // Hiedemann darkgrey */
/* color: #879488; */
/* // Hiedemann grey */
/* color: ##b6c3b7; */
/* // Qt Green */
/* color: #41cd52; */
/* // lightgrey */
/* color: #f0f0f0; */
/* Accent=#5b0f22 */
/* Foreground=#000000 */
/* Background=#f0f0f0 */

View File

@@ -0,0 +1,91 @@
.top_bar {
padding-left: 4;
padding-right: 4;
min-height: 52;
background: #475b6e;
}
.bottom_bar {
height: 40;
background: #475b6e;
}
.header {
font-size: 64;
font-family: "Roboto Medium";
}
text_box.inplace {
color: #dfebf5;
background: transparent;
border-color: transparent;
border-width: 1;
border-radius: 2;
padding: 6;
font-size: 48;
}
text_box.inplace:focus {
background: #3b434a;
border-color: #f8de4c;;
}
text_box.inplace:empty {
color: #9E9E9E
}
.icon_only {
icon-color: #dfebf5;
background: transparent;
spacing: 0;
}
.icon_only:active {
background: #516475;
icon-color: #dfebf5;
}
.icon_only:disabled {
icon-color: #949ca5;
background: transparent;
}
items-widget {
padding: 0;
border-color: transparent;
font-size: 48;
}
list-view-item {
padding-left: 0;
padding-right: 0;
height: 62;
}
list-view-item:active {
background: #516475;
}
overview_view.text_box {
font-size: 48;
}
.transparent {
icon-color: transparent;
background: transparent;
}
.transparent:active {
icon-color: transparent;
background: transparent;
}
.item_button {
background: transparent;
border-radius: 0;
font-size: 48;
}
.separator {
background: #212121;
}

View File

@@ -6,15 +6,11 @@
*/
use chrono::{Local, DateTime};
use locales::t;
//use serde::{Deserialize, Serialize};
use serde::Deserialize;
use std::{
collections::HashMap,
env,
{error::Error, process},
//path::{Path, PathBuf},
};
use std::env;
use std::{error::Error, process};
use std::collections::HashMap;
use tracing::{debug, trace, Level};
use advotracker::data::structures::{PolicyCode, PolicyList, PolicyDataList, PolicyData};
@@ -34,24 +30,30 @@ struct Environment {
/// export as csv format
/// https://docs.rs/csv/1.1.3/csv/cookbook/index.html
/// https://blog.burntsushi.net/csv/
fn export(p: &mut String, lang: &String) -> Result<u64, Box<dyn Error>> {
fn export(p: &mut String, lang: &String) -> Result<usize, Box<dyn Error>> {
use std::fs::File;
use std::path::Path;
//use std::ffi::OsStr;
use std::io::prelude::*;
let mut res = t!("csv.export.started", lang);
let mut state = t!("state.started", lang);
let dt_start: DateTime<Local> = Local::now();
trace!(target: "csv-test",
process = ?res,
state = ?state,
process = "main",
state = "started",
date_start = ?dt_start.to_string());
// Note: slash syntax also works on Windows!
let path = Path::new(p);
// only create files with a '.txt' extensions
//let extension = path.extension();
// match extension {
// //Some(String) => println!("file extension ok!"),
// //_ => extension = OsStr::new("txt")
// _ => println!("got file extension {:?}", extension)
// };
// open the file descriptor
let mut file = File::create(path)?;
trace!(target: "csv-export", extension = ?path.extension(), file = ?file);
@@ -64,12 +66,10 @@ fn export(p: &mut String, lang: &String) -> Result<u64, Box<dyn Error>> {
let dt_end: DateTime<Local> = Local::now();
let duration = dt_end.signed_duration_since(dt_start);
println!("Duration: {:#?}", duration);
//println!("Duration: {:#?}", duration);
trace!(target: "csv-test", record_count = ?count, duration = ?duration);
state = t!("state.finished", lang);
res = t!("csv.import.finished", lang);
trace!(target: "csv-test", process = ?res, state = ?state);
trace!(target: "csv-test", process = "csv-import", state = "finished");
Ok(count)
}
@@ -78,19 +78,17 @@ fn export(p: &mut String, lang: &String) -> Result<u64, Box<dyn Error>> {
/// https://docs.rs/csv/1.1.3/csv/cookbook/index.html
/// https://blog.burntsushi.net/csv/
fn import(p: &mut String, data_list: &mut PolicyDataList,
policy_numbers: &mut HashMap<u64, PolicyCode>, lang: &String)
-> Result<u64, Box<dyn Error>> {
policy_numbers: &mut HashMap<usize, PolicyCode>, lang: &String)
-> Result<usize, Box<dyn Error>> {
use std::fs::File;
use std::path::Path;
use std::ffi::OsStr;
let mut res = t!("csv.import.started", lang);
let mut state = t!("state.started", lang);
let dt_start: DateTime<Local> = Local::now();
trace!(target: "csv-test",
process = ?res,
state = ?state,
process = "csv-import",
state = "started",
date_start = ?dt_start.to_string());
// Note: slash syntax also workd on Windows!
@@ -98,6 +96,10 @@ fn import(p: &mut String, data_list: &mut PolicyDataList,
// must be a readable file
trace!(target: "csv-test", path = ?path);
let valid = path.is_file();
//println!("is_file: {}", valid);
//if let Some(res) = valid
assert_eq!(path.is_file(), true);
// only accept files with '.txt' extensions
@@ -145,16 +147,33 @@ fn import(p: &mut String, data_list: &mut PolicyDataList,
count +=1;
}
// Tests
// Takes a reference and returns Option<&V>
let test_policy_number : usize = 1511111111;
match policy_numbers.get(&test_policy_number) {
Some(policy_code) => {
println!("Policy-Number {:?} {:?}",
test_policy_number, policy_code);
},
_ => println!("1. No number found!"),
}
let test_policy_number_2 : usize = 9999999991;
match policy_numbers.get(&test_policy_number_2) {
Some(policy_code) => { println!("Policy-Number: {:?} {:?}",
test_policy_number, policy_code);
},
_ => println!("2. No number found!"),
}
let dt_end: DateTime<Local> = Local::now();
let duration = dt_end.signed_duration_since(dt_start);
trace!(target: "csv-test", record_count = ?count, duration = ?duration);
state = t!("state.finished", lang);
res = t!("csv.import.finished", lang);
trace!(target: "csv-test",
process = ?res,
state = ?state,
process = "csv-import",
state = "finished",
date_stop = ?dt_end.to_string());
Ok(count)
@@ -163,17 +182,15 @@ fn import(p: &mut String, data_list: &mut PolicyDataList,
#[allow(dead_code)]
/// validate a given policy number
/// result will return true or false
fn is_valid(policy_number: &u64, policy_list: &PolicyDataList,
policy_numbers: &mut HashMap<u64, PolicyCode>, lang: &String)
fn is_valid(policy_number: &usize, policy_list: &PolicyDataList,
policy_numbers: &mut HashMap<usize, PolicyCode>, lang: &String)
-> Result<bool, Box<dyn std::error::Error>> {
let mut res = t!("policy.validation.started", lang);
let mut state = t!("state.started", lang);
let dt_start: DateTime<Local> = Local::now();
trace!(target: "csv-test",
process = ?res,
state = ?state,
process = "policy-validation",
state = "started",
policy_number = ?policy_number,
policy_list = ?policy_list.name,
elements = ?policy_list.policy_data.len(),
@@ -229,22 +246,19 @@ fn is_valid(policy_number: &u64, policy_list: &PolicyDataList,
let mut result = false;
match policy_numbers.get(&policy_number) {
Some(&policy_code) => {
let res = t!("policy.validation.success", lang);
println!("policy_number: {} ({:?})",
policy_number, policy_code);
result = true;
trace!(target: "csv-test",
policy_number = ?policy_number,
validation = ?res,
validation = "success",
policy_code = ?policy_code);
},
_ => {
let res = t!("policy.validation.failed", lang);
//println!("Noop! Number isn't valid!");
println!("{:?}", res);
println!("Noop! Number isn't valid!");
trace!(target: "csv-test",
policy_number = ?policy_number,
validation = ?res);
validation = "failed");
},
}
@@ -252,11 +266,9 @@ fn is_valid(policy_number: &u64, policy_list: &PolicyDataList,
let dt_end: DateTime<Local> = Local::now();
let duration = dt_end.signed_duration_since(dt_start);
res = t!("policy.validation.finished", lang);
state = t!("state.finished", lang);
trace!(target: "csv-test",
process = ?res,
state = ?state,
process = "policy-validation",
state = "finished",
date_stop = ?dt_end.to_string(),
duration = ?duration);
@@ -286,9 +298,7 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
tracing::subscriber::with_default(subscriber, || {
// get system environment
let mut lang = env::var("LANG").unwrap_or("en".to_string());
let mut res = t!("parse.environment", lang);
let mut state = t!("state.started", lang);
trace!(target: "csv-test", message = ?res, state = ?state);
trace!(target: "csv-test", message = "parse-environment", state = "started");
//debug!(message = ?res, state = ?state);
trace!(target: "csv-test", environment = "system", lang = ?lang);
@@ -301,37 +311,30 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
Err(e) => { debug!(target: "csv-test", "{}", e); }
}
// how to handle unumplemented lang resources??
res = t!("parse.environment", lang);
trace!(target: "csv-test", environment = "envy", lang = ?lang);
state = t!("state.finished", lang);
trace!(target: "csv-test", message = ?res, state = ?state);
trace!(target: "csv-test", message = "parse-enviroment", state = "finished");
// initialize viperus structure
let mut v = Viperus::new();
// parse commandline arguments
res = t!("parse.arguments", lang);
state = t!("state.started", lang);
trace!(target: "csv-test", process = ?res, state = ?state);
trace!(target: "csv-test", process = "parse-arguments", state = "started");
let _ = parse_args(&mut v);
state = t!("state.finished", lang);
trace!(target: "csv-test", process = ?res, state = ?state);
trace!(target: "csv-test", process = "parse-arguments", state = "finished");
//trace!(target: "Viperus", "Config results: {:?}", v);
// main tasks
res = t!("main.started", lang);
state = t!("state.started", lang);
trace!(target: "csv-test", process = ?res, state = ?state);
trace!(target: "csv-test", process = "main", state = "started");
// create policy structures
let policy_list = PolicyList::new("Allianz Versicherungsnummen-Liste");
// importing policy code elements from csv-file
let policy_list = PolicyList::new("Allianz Versicherungsnummen-List");
println!("Policy List {:?} ", policy_list.name);
let mut policy_data = PolicyDataList::new("Allianz-Import 20200628");
println!("Policy Data List {:?} ", policy_data.name);
let mut policy_numbers : HashMap<u64, PolicyCode> = HashMap::new();
let mut policy_numbers : HashMap<usize, PolicyCode> = HashMap::new();
let mut csv_import_path = v.get::<String>("import_file").unwrap();
match import(&mut csv_import_path, &mut policy_data,
@@ -346,22 +349,20 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
}
// test if policy_number is_valid
// type conversion (viperus String -> u64)
let test_policy_number = v.get::<String>("test_policy_number").unwrap().parse::<u64>().unwrap();
let test_policy_number = v.get::<i32>("test_policy_number").unwrap() as usize;
trace!(target: "csv-test", test_policy_number = ?test_policy_number);
//let policy_number : usize = 1999999999;
//match is_valid(&policy_number, &policy_data, &mut policy_numbers, &lang) {
// Ok(true) => {
// use Hashmap method 'get' to check if we have the given key
match policy_numbers.get(&test_policy_number) {
match &policy_numbers.get(&test_policy_number) {
Some(&policy_code) => {
let res = t!("policy.validation.success", lang);
println!("{:?}", res);
println!("policy-validation success");
println!("policy_number: {} ({:?})",
test_policy_number, policy_code);
}
_ => {
let res = t!("policy.validation.failed", lang);
println!("{:?}", res);
println!("Policy-validation failed");
//println!("Nuup! Number isn't valid!");
},
}
@@ -378,32 +379,10 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
}
}
state = t!("state.finished", lang);
res = t!("main.finished", lang);
trace!(target: "csv-test", process = ?res, state = ?state);
trace!(target: "csv-test",
process = "main",
state = "finished");
});
Ok(())
}
#[test]
fn test_policy_number() {
// Takes a reference and returns Option<&V>
let my_policy_numbers : [u64; 2] = [1511111111, 9999999993];
assert_eq!(my_policy_numbers, [1511111111, 9999999993]);
//let mut csv_import_path = v.get::<String>("import_file").unwrap();
let mut csv_import_path = String::from("data/POLLFNR_TEST.txt");
let mut policy_data = PolicyDataList::new("PolicyDataList");
let mut policy_numbers : HashMap<u64, PolicyCode> = HashMap::new();
let lang = "en".to_string();
println!("import with Path: {:?} PolicyData: {:?} PolicyNumbers: {:?}, Lang: {:?}",
csv_import_path, policy_data, policy_numbers, lang);
let count = import(&mut csv_import_path, &mut policy_data,
&mut policy_numbers, &lang);
assert_eq!(count.unwrap(), 15498);
}

View File

@@ -25,7 +25,7 @@ pub fn parse_args(v: &mut Viperus) -> Result<(), Box<dyn std::error::Error>> {
v.add_default("config_file", String::from("csv_import.ron"));
v.add_default("import_file", String::from("POLLFNR_WOECHENTLICH.txt"));
v.add_default("export_file", String::from(""));
v.add_default("test_policy_number", String::from("9999999992"));
v.add_default("test_policy_number", 123456789);
v.add_default("to_email_address_file", String::from("Allianz RA-Hotline <smr-rahotline@allianz.de>"));
v.add_default("from_email_address_file", String::from("Allianz-Hotline RA-Hiedemann <azhotline@hiedemann.de>"));
//v.add_default("username", String::from("nctalkbot"));
@@ -188,7 +188,7 @@ SMR Unerledigt: 089 92529 60222")
);
println!(
"test_policy_number: {:?}",
v.get::<String>("test_policy_number").unwrap_or_default()
v.get::<i32>("test_policy_number").unwrap_or_default()
);
// println!(
// "username: {:?}",

View File

@@ -1,16 +1,25 @@
use orbtk::prelude::*;
use orbtk::theme::DEFAULT_THEME_CSS;
//use orbtk::theme::LIGHT_THEME_EXTENSION_CSS;
// fn get_theme() -> ThemeValue {
// //ThemeValue::create_from_css(LIGHT_THEME_EXTENSION_CSS)
// ThemeValue::create_from_css(DEFAULT_THEME_CSS)
// .extension_css(WIDGET_EXT)
// .build()
// }
//#[cfg(feature = "light-theme")]
static WIDGET_EXT: &'static str = include_str!("../../resources/stylesheets/policyholder_check.css");
fn get_theme() -> ThemeValue {
//ThemeValue::create_from_css(LIGHT_THEME_EXTENSION_CSS)
ThemeValue::create_from_css(DEFAULT_THEME_CSS)
.extension_css(WIDGET_EXT)
.build()
}
#[derive(Debug, Copy, Clone)]
enum Action {
//ClearText,
EntryActivated(Entity),
EntryChanged(Entity)
EntryChanged(Entity),
//ValueChanged(Entity),
//ValueOk,
//ValueNone,
}
#[derive(AsAny)]
@@ -48,16 +57,23 @@ impl State for MainViewState {
// //ctx.widget().set("policynumber", background("#5b0f22"));
//}
Action::EntryActivated(entity) => {
//let text = ctx.get_widget(entity).clone::<String>("text");
let widget = ctx.get_widget(entity);
let text = widget.get::<String>("text");
let mut text_box = TextBox::get(ctx.get_widget(entity));
let text = text_box.text_mut();
//let mut widget = ctx.get_widget(entity);
//let text = widget.get_mut::<String16>("text");
println!("got value policynumber: {}", text);
//text.clear();
}
Action::EntryChanged(entity) => {
let widget = ctx.get_widget(entity);
let text = widget.get::<String>("text");
let text = widget.get::<String16>("text");
println!("entry changed: {}", text);
}
// Action::ValueChanged(entity) => {
// let val =
// ((*ctx.get_widget(entity).get::<f64>("val")).floor() as i32).to_string();
// ctx.child("value_text").set("text", String16::from(val));
//}
}
self.action = None;
@@ -68,7 +84,8 @@ impl State for MainViewState {
fn create_header(ctx: &mut BuildContext, text: &str) -> Entity {
TextBlock::new()
.text(text)
.style("header")
.element("text-block")
.class("h1")
.build(ctx)
}
@@ -83,24 +100,31 @@ widget!(
impl Template for MainView {
fn template(self, id: Entity, ctx: &mut BuildContext) -> Self {
self.name("MainView").child(
//.result("Anzahl Versicherungsnummern: 0")
//.result("Policyholders count: 0").sum_policynumbers(0)
//.sum_policynumbers(0)
Grid::new()
.background("#fafafa")
//.width(200.0)
//.height(360.0)
.columns(
Columns::create()
.push(150.0)
.push("*")
.push(150.0)
Columns::new()
.add(150.0)
.add("*")
//.add(120.0)
//.add("auto")
.add(150.0)
.build(),
)
.rows(
Rows::create()
.push("*")
.push("*")
Rows::new()
.add("*")
.add("*")
.build(),
)
.child(
Grid::new()
//.element("policyholder_check")
.element("policyholder_check")
.margin((4.0, 24.0, 24.0, 4.0))
.min_width(180.0)
.min_height(80.0)
@@ -115,28 +139,33 @@ impl Template for MainView {
.child(create_header(ctx, "Validierung Versicherungsnummer"))
.child(
TextBox::new()
//.class("text_box")
// overwriting the class defaults
/* .background("transparent")
.foreground("#9dafbf")
.background("#fafafa")
/* .foreground(colors::LINK_WATER_COLOR) */
.border_brush("#5b0f22")
.border_width(5)
.border_radius(15)
.border_radius(15) */
//.name("policynumber")
.focused(true)
.water_mark("Versicherungs-Nr...")
//.text("Number policyholder", id)
.text(("policynumber", id))
.font_size(24.0)
.h_align("stretch")
.on_activate(move |ctx, entity| {
state(id, ctx).action(Action::EntryActivated(entity));
.on_activate(move |states, entity| {
state(id, states).action(Action::EntryActivated(entity));
})
.on_changed("text", move |ctx, entity| {
state(id, ctx).action(Action::EntryChanged(entity));
.on_changed(move |states, entity| {
state(id, states).action(Action::EntryChanged(entity));
})
.build(ctx),
)
.child(
TextBlock::new()
//.element("text-block")
.element("text-block")
.id("result")
.min_width(80.0)
.max_width(180.0)
@@ -150,28 +179,28 @@ impl Template for MainView {
)
.child(
Grid::new()
//.class("logo_customer")
.element("logo_customer")
.margin((9.0, 16.0, 16.0, 9.0))
.attach(Grid::column(0))
.attach(Grid::row(1))
.v_align("end")
.child(
ImageWidget::new()
.image("assets/images/customer_logo.png")
.image("./resources/images/hiedemann_logo.png")
.build(ctx),
)
.build(ctx),
)
.child(
Grid::new()
//.class("logo_vendor")
.element("logo_vendor")
.margin((9.0, 16.0, 16.0, 9.0))
.attach(Grid::column(2))
.attach(Grid::row(1))
.v_align("end")
.child(
ImageWidget::new()
.image("assets/images/networkx_logo.png")
.image("./resources/images/networkx_logo.png")
.build(ctx),
)
.build(ctx),
@@ -193,7 +222,7 @@ fn main() {
.min_width(460.0)
.min_height(180.0)
.resizeable(true)
//.theme(get_theme())
.theme(get_theme())
.child(MainView::new().build(ctx))
.build(ctx)
})

View File

@@ -0,0 +1,59 @@
/*
* advotracker - Hotline tackingtool for Advocats
*
* Copyright 2020 Ralf Zerres <ralf.zerres@networkx.de>
* SPDX-License-Identifier: (0BSD or MIT)
*/
use orbtk::prelude::*;
//use crate::data::keys;
use crate::{
data::structures::PolicyList,
data::keys::*
};
/// Provides generic methods to handle states of datatypes (e.g. used in `PolicyList`).
pub trait GlobalState {
/// Navigates to the given entity.
fn navigate(&self, to: Entity, ctx: &mut Context<'_>) {
if let Some(old_focused_element) = ctx.window().get::<Global>("global").focused_widget {
let mut old_focused_element = ctx.get_widget(old_focused_element);
old_focused_element.set("focused", false);
old_focused_element.update_theme_by_state(false);
}
ctx.window().get_mut::<Global>("global").focused_widget = None;
ctx.widget().set("visibility", Visibility::Collapsed);
ctx.get_widget(to).set("visibility", Visibility::Visible);
}
/// Get the text of a widget.
fn get_text(&self, ctx: &mut Context<'_>, entity: Entity) -> Option<String> {
let mut widget = ctx.get_widget(entity);
let entry = widget.get_mut::<String>("text");
if entry.is_empty() {
return None;
}
let copy = entry.to_string();
entry.clear();
Some(copy)
}
/// Save the our data structure and convert it to `ron` file format.
/// The cargo package identifier (here: 'nwx.advotracker') is taken to create the app directory.
/// in users 'settings directory'. The directory location is OS dependant
/// (Windows: AppData, Unix: XDG_CONFIG_HOME, MacOS: $HOME/Library/Preferences).
/// The data is stored in filename PROP_ADVOTRACKER (here: `advotracker.ron`)
fn save(&self, registry: &mut Registry, ctx: &mut Context<'_>) {
registry
.get::<Settings>("settings")
.save(
PROP_ADVOTRACKER,
ctx.widget().get::<PolicyList>(PROP_ADVOTRACKER),
)
.unwrap();
}
}

View File

@@ -0,0 +1,21 @@
/*
* advotracker - Hotline tackingtool for Advocats
*
* Copyright 2020 Ralf Zerres <ralf.zerres@networkx.de>
* SPDX-License-Identifier: (0BSD or MIT)
*/
/// global helper functions
pub mod global_state;
/// policycheck helper functions
pub mod policycheck_state;
// /// policylist helper functions
// pub mod policylist_state;
// /// policydata helper functions
// pub mod policydata_state;
/// policy verification methods
pub mod policy_check;

View File

@@ -0,0 +1,64 @@
/*
* advotracker - Hotline tackingtool for Advocats
*
* Copyright 2020 Ralf Zerres <ralf.zerres@networkx.de>
* SPDX-License-Identifier: (0BSD or MIT)
*/
use chrono::{Local, DateTime};
//use serde::Deserialize;
//use std::env;
//use std::{error::Error, process};
use std::collections::HashMap;
use tracing::{info, trace};
use crate::data::structures::{PolicyCode, PolicyDataList};
/// validate a given policy number
/// result will return true or false
pub fn is_valid(policy_number: &usize, policy_list: &PolicyDataList,
policy_numbers: &mut HashMap<usize, PolicyCode>, lang: &String)
-> Result<bool, Box<dyn std::error::Error>> {
let dt_start: DateTime<Local> = Local::now();
trace!(target: "advotracker",
process = ?"validation",
state = ?"started",
policy_number = ?policy_number,
policy_list = ?policy_list.name,
elements = ?policy_list.policy_data.len(),
date_start = ?dt_start.to_string());
let mut result = false;
match policy_numbers.get(&policy_number) {
Some(&policy_code) => {
println!("policy_number: {} ({:?})",
policy_number, policy_code);
info!("policy-check => {} ({:?})", policy_number, policy_code);
result = true;
trace!(target: "advotracker",
policy_number = ?policy_number,
validation = "success",
policy_code = ?policy_code);
},
_ => {
println!("Noop! Number isn't valid!");
info!("policy-check => {}", policy_number);
trace!(target: "csv-test",
policy_number = ?policy_number,
validation = "failed");
},
}
let dt_end: DateTime<Local> = Local::now();
let duration = dt_end.signed_duration_since(dt_start);
trace!(target: "advotracker",
process = "validation",
state = "finished",
date_stop = ?dt_end.to_string(),
duration = ?duration);
Ok(result)
}

View File

@@ -0,0 +1,355 @@
/*
* advotracker - Hotline tackingtool for Advocats
*
* Copyright 2020 Ralf Zerres <ralf.zerres@networkx.de>
* SPDX-License-Identifier: (0BSD or MIT)
*/
use dotenv::dotenv;
use orbtk::prelude::*;
use serde::Deserialize;
use std::{env, process};
use std::collections::HashMap;
use tracing::{debug, error, info, trace};
use crate::services::imports::allianzdirectcall::import;
//use crate::callbacks::policy_check::is_valid;
use crate::{
callbacks::global_state::GlobalState,
data::structures::{PolicyCheck, PolicyCode, PolicyDataList, PolicyList},
data::keys::*,
};
/// Actions that can execute on the task view.
#[derive(Debug, Clone, Copy)]
pub enum Action {
ClearEntry(Entity),
InputTextChanged(Entity),
OpenMenu(Entity),
ParseEntry(Entity),
RemoveFocus(Entity),
SetEntry(Entity),
SetVisibility(Entity),
TextChanged(Entity, usize),
}
#[derive(Debug, Deserialize)]
struct Environment {
test_lang: String,
log: String,
}
/// Handles the requests of the `PolicyCheckView`.
#[derive(Default, AsAny)]
pub struct PolicyCheckState {
action: Option<Action>,
label_result_text_block: Entity,
last_focused: Option<Entity>,
menu_button: Entity,
//policy_check_clean_button: Entity,
policy_check: PolicyCheck,
policy_data_count: usize,
//policy_number_text_box: Entity,
policy_numbers: HashMap<usize, PolicyCode>
}
impl GlobalState for PolicyCheckState {}
/// method definitions, that react on any given state change inside the view
impl PolicyCheckState {
/// Sets a new action.
pub fn action(&mut self, action: Action) {
self.action = action.into();
}
pub fn create_hashmap(&mut self) -> Result<(), Box<dyn std::error::Error>> {
// WIP: redundant lang selection (already in main!)
let mut lang = env::var("LANG").unwrap_or("en".to_string());
// testing environment: read from .env file
dotenv().ok();
match envy::from_env::<Environment>() {
Ok(environment) => {
if environment.test_lang != lang { lang = environment.test_lang; }
},
Err(e) => { debug!(target: "advotracker", "{}", e); }
}
// importing policy code elements from csv-file
let policy_list = PolicyList::new("Allianz Versicherungsnummen-List");
//println!("Policy List {:?} ", policy_list.name);
let mut policy_data = PolicyDataList::new("Allianz-Import latest");
//println!("Policy Data List {:?} ", policy_data.name);
let mut policy_numbers : HashMap<usize, PolicyCode> = HashMap::new();
// Wip: use cli parameter stored in viperus ...
//let mut csv_import_path = v.get::<String>("import_file").unwrap();
let mut csv_import_path = String::from("POLLFNR_WOECHENTLICH.txt");
//println!("Importing from: {:?}", csv_import_path);
match import(&mut csv_import_path, &mut policy_data,
&mut policy_numbers, &lang) {
Ok(count) => {
self.policy_data_count = count;
//println!("Imported {:?} records", self.policy_data_count);
}
Err(err) => {
//println!("error running CSV-Import: {}", err);
process::exit(1);
}
};
self.policy_numbers = policy_numbers;
Ok(())
}
/// Clear text in text box.
pub fn clear_entry(&mut self, text_box: Entity, ctx: &mut Context<'_>) {
let mut text_box = TextBox::get(ctx.get_widget(text_box));
let text = text_box.text_mut();
//println!("reset {}", text);
}
/// Open menu.
pub fn open_menu(&mut self, text_block: Entity, ctx: &mut Context<'_>) {
let mut text_block = TextBlock::get(ctx.get_widget(text_block));
let text = text_block.text_mut();
//println!("Menu text: {}", text);
}
fn parse_entry(&mut self, policy_check_policy_number: Entity,
ctx: &mut Context<'_>) {
let policy_string = ctx.get_widget(policy_check_policy_number).get::<String16>("text").as_string();
let policy_number_length = policy_string.len();
trace!(target: "advotracker", state = "parsing", policy_number = ?policy_string);
// Parse policy code: "AS-123456789"
// DION VERS POLLFNR
// 1 AS 1515735810
if policy_number_length == 10 {
let mut label_wrapper : TextBlockCtx<'_> = text_block(ctx.child("policy_check_label_result"));
let string_label = "Prüfungsergebnis:".to_string();
// needs to be an integer
match policy_string.parse::<usize>() {
Ok(p) => {
//println!(" ... verify policy Number {:?}", p);
label_wrapper.set_text(string_label);
label_wrapper.set_visibility(Visibility::Visible);
label_wrapper.set_enabled(true);
let mut result_wrapper: TextBlockCtx<'_> = text_block(ctx.child("policy_check_result"));
result_wrapper.set_text("Prüfung läuft ...");
match self.policy_numbers.get(&p) {
// check hashmap value field
Some(policy_code) => {
trace!(target: "advotracker", state = "success",
policy_number = ?p, policy_code = ?policy_code);
result_wrapper.set_enabled(true);
let string_result = format!("gütig! => vollständig: 1-{:?}-{}",
policy_code, p);
result_wrapper.set_text(string_result);
}
_ => {
trace!(target: "advotracker", state = "failed",
policy_number = ?p);
result_wrapper.set_enabled(true);
result_wrapper.set_text("noop, ungültig!");
}
}
},
Err(e) => {
trace!(target: "advotracker", state = "error", error_type = "invalid type");
// Feedback
let mut result_wrapper: TextBlockCtx<'_> = text_block(ctx.child("policy_check_result"));
result_wrapper.set_enabled(true);
result_wrapper.set_text("bitte nur Nummern erfassen!");
}
}
}
if policy_number_length < 10 {
//println!("Policy number is to short!");
let mut text_block_wrapper: TextBlockCtx<'_> = text_block(ctx.child("policy_check_result"));
text_block_wrapper.set_enabled(true);
text_block_wrapper.set_text("zu kurz!");
//ctx.get_widget(policy_check_policy_number).set("policy_check_result", true);
//ctx.child(ID_POLICY_CHECK_POLICY_NUMBER).set("text", String::from(""));
}
if policy_number_length > 10 {
//println!("Policy number is to big!");
let mut text_block_wrapper: TextBlockCtx<'_> = text_block(ctx.child("policy_check_result"));
text_block_wrapper.set_enabled(true);
text_block_wrapper.set_text("zu lang!");
}
}
/// If TextBox 'policy_check_policy_number' is empty, disable button "clear"
/// otherwise enabled it.
// fn set_policy_check_clear_button(&self, policy_check_policy_number: Entity, ctx: &mut Context<' >) {
// if ctx.get_widget(clear_button).get::<String>("policy_check_policy_number").is_empty() {
// ctx.get_widget(self.policy_check_clear_button).set("enabled", false);
// } else {
// ctx.get_widget(self.policy_check_clear_button).set("enabled", true);
// }
// ctx.get_widget(self.policy_check_policy_number).update_theme_by_state(true);
// }
/// Change status of given text box to edit mode.
fn set_entry(&self, policy_check_policy_number: Entity, ctx: &mut Context<'_>) {
if *ctx.get_widget(policy_check_policy_number).get::<bool>("focused") {
//let mut my_ctx: WidgetContainer<'_> = ctx.widget();
//let mut child: WidgetContainer<'_> = ctx.get_widget(policy_check_policy_number);
//ctx.get_widget(policy_check_policy_number).set("enabled", true);
let mut text_box_wrapper: TextBoxCtx<'_> = text_box(ctx.child("policy_check_policy_number"));
//ctx.push_event_by_window(FocusEvent::RemoveFocus(policy_check_policy_number));
text_box_wrapper.set_visibility( Visibility::Visible);
text_box_wrapper.set_enabled(true);
text_box_wrapper.set_text("");
text_box_wrapper.set_water_mark("Neue Eingabe ...");
return;
}
if let Some(old_focused_element) = ctx.window().get::<Global>("global").focused_widget {
ctx.push_event_by_window(FocusEvent::RemoveFocus(old_focused_element));
}
}
/// Change visibility of the result label
fn set_visibility(&self, entity: Entity, ctx: &mut Context<'_>) {
if ctx.get_widget(entity).get::<String16>("text").is_empty() {
text_block(ctx.child(ID_POLICY_CHECK_LABEL_RESULT)).set_visibility(Visibility::Visible);
} else {
text_block(ctx.child(ID_POLICY_CHECK_LABEL_RESULT)).set_visibility(Visibility::Collapsed);
//ctx.get_widget(self.policy_check_label_policy_number).set("enabled", false);
}
ctx.get_widget(self.label_result_text_block).update_theme_by_state(true);
}
// Update count of elements in the policy data list.
fn update_data_count(&self, ctx: &mut Context<'_>) {
// old api syntax
let data_list_count = ctx.widget().get::<PolicyDataList>(PROP_POLICY_DATA_LIST).len();
ctx.widget().set(PROP_POLICY_DATA_COUNT, data_list_count);
}
}
/// upported states for our view
impl State for PolicyCheckState {
fn init(&mut self, _: &mut Registry, ctx: &mut Context<'_>) {
self.menu_button = ctx
.entity_of_child(ID_POLICY_CHECK_MENU_BUTTON)
.expect("PolicyCheckState.init: Can't find entity id defined as resource 'ID_POLICY_CHECK_POLICY_MENU_BUTTON'.");
// self.policy_number_text_box = ctx
// .entity_of_child(ID_POLICY_CHECK_POLICY_NUMBER)
// .expect("PolicyCheckState.init: Can't find entity id defined as resource 'ID_POLICY_CHECK_POLICY_NUMBER'.");
// import data
// WIP: for now, only import once per session
if self.policy_data_count == 0 {
match self.create_hashmap() {
Ok(()) => {
//let res = t!("policy.hashmap.success", lang);
//println!("{:?}", res);
info!("hashmap has: {:?} entries", self.policy_data_count);
trace!(target: "advotracker",
hashmap_status = "new import",
hashmap_entries = ?self.policy_data_count);
}
_ => {
// let res = t!("policy.hashmap.failed", lang);
// println
// !("{:?}", res);
error!("Creation of a hashmap failed!");
trace!(target: "advotracker", hashmap_status = "failed");
}
}
} else {
//println!("Already imported {} records.", self.policy_data_count);
trace!(target: "advotracker",
hashmap_status = "consume",
hashmap_entries = ?self.policy_data_count);
}
// // Load the saved data from a file in 'ron' format into our data structure.
// // The cargo package identifier (default: 'nwx.advotracker') is used as the
// // app directory name. The directory location is OS dependant
// // (Windows: AppData, Unix: XDG_CONFIG_HOME, MacOS: $HOME/Library/Preferences).
// // The filename is taken from the propertey PROP_ADVOTRACKER (default: 'advotracker'.ron).
// if let Ok(policy_data) = registry
// .get::<Settings>("settings")
// .load::<PolicyDataList>(PROP_ADVOTRACKER)
// {
// ctx.widget().set(PROP_ADVOTRACKER, policy_data);
// }
// number of elements in the restored policy data
//policy_data_count = policy_data.len().clone;
//self.update_data_count(ctx);
}
fn update(&mut self, _registry: &mut Registry, ctx: &mut Context<'_>) {
// clear focus on focus moved
if self.last_focused != ctx.window().get::<Global>("global").focused_widget {
if let Some(last_focused) = self.last_focused {
ctx.get_widget(last_focused).set("focused", false);
// widget is unvisible, but takes space to be considered
ctx.get_widget(last_focused)
.set("visibility", Visibility::Collapsed);
}
}
if let Some(action) = self.action {
match action {
Action::ClearEntry(policy_check_policy_number) => {
ctx.get_widget(policy_check_policy_number).set("enabled", false);
}
Action::InputTextChanged(entity) => {
//println!("entry changed: {}", text_box(ctx.get_widget(entity)).text());
//self.set_check_button(policy_check_label_policy_number, ctx);
self.set_visibility(entity, ctx);
}
Action::OpenMenu(text_block) => {
self.open_menu(text_block, ctx);
}
Action::ParseEntry(text_box) => {
self.parse_entry(text_box, ctx);
ctx.get_widget(text_box).get::<String16>("text").as_string();
//self.parse_entry(text_box, &mut policy_numbers,
// &lang, ctx);
}
Action::RemoveFocus(policy_check_policy_number) => {
ctx.get_widget(policy_check_policy_number).set("enabled", false);
ctx.push_event_by_window(FocusEvent::RemoveFocus(policy_check_policy_number));
}
Action::SetEntry(policy_check_policy_number) => {
//self.last_focused = Some();
self.set_entry(policy_check_policy_number, ctx);
}
Action::SetVisibility(entity) => {
//text_block(ctx.child(entity).set_visibility(Visibility::Visible));
text_block(ctx.child(ID_POLICY_CHECK_LABEL_RESULT)).set_visibility(Visibility::Collapsed);
}
Action::TextChanged(entity, _index) => {
self.set_entry(entity, ctx);
}
}
}
self.action = None;
}
fn update_post_layout(&mut self, _: &mut Registry, ctx: &mut Context<'_>) {
let string_result = "Prüfungsergebnis:".to_string();
//string_result = format!("{} {:?}", string_result, self.??;
text_block(ctx.child(ID_POLICY_CHECK_LABEL_RESULT)).set_text(string_result);
text_block(ctx.child(ID_POLICY_CHECK_LABEL_RESULT)).set_visibility(Visibility::Collapsed);
let mut string_data_count = "Prüflisten-Elemente:".to_string();
string_data_count = format!("{} {:?}", string_data_count, self.policy_numbers.len());
text_block(ctx.child(ID_POLICY_DATA_COUNT_BLOCK)).set_text(string_data_count);
}
}

View File

@@ -1,16 +1,9 @@
/*
* advotracker - Hotline tackingtool for Advocats
*
* Copyright 2020 Ralf Zerres <ralf.zerres@networkx.de>
* SPDX-License-Identifier: (0BSD or MIT)
*/
use orbtk::prelude::*;
use crate::{
callbacks::global_state::GlobalState,
data::constants::*,
data::{PolicyCode, PolicyData, PolicyList, Status},
data::keys::*,
};
use chrono::{Utc, NaiveDateTime};

View File

@@ -0,0 +1,54 @@
// CSS => transform to RON based theme system
// https://github.com/ron-rs/ronRon
// Classes
pub static CLASS_BOTTOM_BAR: &str = "bottom_bar";
pub static CLASS_HEADER: &str = ".my_header";
pub static CLASS_ICON_ONLY: &str = "icon_only";
pub static CLASS_ITEM_BUTTON: &str = "item_button";
pub static CLASS_MENU: &str = "menu";
pub static CLASS_POLICY_CHECK_FORM: &str = "check_form";
pub static CLASS_TEXT_BOX: &str = "text_box";
pub static CLASS_TEXT_BLOCK: &str = "text_block";
pub static CLASS_TOP_BAR: &str = "top_bar";
pub static CLASS_TRANSPARENT: &str = "transparent";
pub static CLASS_SEPERATOR: &str = "seperator";
// Widget IDs (DCES: Entity[id] => [Component1, .. , Component<n>] -> data or state)
pub static ID_POLICY_CHECK_FORM: &str = "policy_check_form";
pub static ID_POLICY_CHECK_HEADER: &str = "policy_check_header";
pub static ID_POLICY_CHECK_ITEMS_WIDGET: &str = "policy_check_items_widget";
pub static ID_POLICY_CHECK_CLEAR_BUTTON: &str = "policy_check_clear_button";
pub static ID_POLICY_CHECK_MENU_BUTTON: &str = "policy_check_menu_button";
pub static ID_POLICY_CHECK_LABEL_POLICY_NUMBER: &str = "policy_check_label_policy_number";
pub static ID_POLICY_CHECK_LABEL_RESULT: &str = "policy_check_label_result";
pub static ID_POLICY_CHECK_MENU_TEXT_BLOCK: &str = "policy_check_menu_text_block";
pub static ID_POLICY_CHECK_POLICY_NUMBER: &str = "policy_check_policy_number";
pub static ID_POLICY_CHECK_RESULT: &str = "policy_check_result";
pub static ID_POLICY_CHECK_WIDGET: &str = "policy_check_widget";
pub static ID_POLICY_DATA_ADD_BUTTON: &str = "policy_data_add_button";
pub static ID_POLICY_DATA_COUNT_BLOCK: &str = "policy_data_count_block";
pub static ID_POLICY_DATA_ITEMS_WIDGET: &str = "policy_data_items_widget";
//pub static ID_POLICY_DATA_TEXT_BOX: &str = "policy_data_text_box";
pub static ID_POLICY_DATA_DATE_INSERTED: &str = "policy_data_date_inserted";
pub static ID_POLICY_DATA_DION: &str = "policy_data_dion";
pub static ID_POLICY_DATA_POLICY_CODE: &str = "policy_data_policy_code";
pub static ID_POLICY_DATA_POLICY_NUMBER: &str = "policy_data_policy_number";
pub static ID_POLICY_DATA_STATUS: &str = "policy_data_status";
pub static ID_POLICY_DATA_LIST_NAME: &str = "policy_data_list_name";
pub static ID_POLICY_LIST_ADD_BUTTON: &str = "policy_list_add_button";
pub static ID_POLICY_LIST_ITEMS_WIDGET: &str = "policy_list_items_widget";
//pub static ID_POLICY_LIST_TEXT_BOX: &str = "policy_list_text_box";
//pub static ID_POLICY_LIST_TEXT_BLOCK: &str = "policy_list_text_block";
// Component Values (Properties)
pub static PROP_ADVOTRACKER: &str = "advotracker";
pub static PROP_POLICY_CHECK: &str = "policy_check";
pub static PROP_POLICY_DATA_LIST: &str = "policy_data_list";
pub static PROP_POLICY_DATA_COUNT: &str = "policy_data_count";
pub static PROP_POLICY_LIST: &str = "policy_list";
pub static PROP_POLICY_LIST_COUNT: &str = "policy_list_count";

View File

@@ -5,9 +5,8 @@
* SPDX-License-Identifier: (0BSD or MIT)
*/
/// provides orbtk widgets constants
pub mod constants;
/// structures with implementations
pub mod structures;
/// provides orbtk widgets constants
pub mod keys;

View File

@@ -11,7 +11,7 @@ use serde::{Deserialize, Serialize};
/// An enumeration of valid policy codes.
/// right now, only "AS" is used.
#[derive(Debug, Clone, Copy, Deserialize, PartialEq, Serialize)]
#[derive(Debug, Clone, Copy, Deserialize, Serialize)]
pub enum PolicyCode {
/// Allianz Sachversicherung
AS
@@ -66,7 +66,7 @@ impl Default for CommunicationType {
}
/// Status of a given policy data element.
#[derive(Debug, Clone, Deserialize, PartialEq, Serialize)]
#[derive(Debug, Clone, Deserialize, Serialize)]
pub enum Status {
/// Active -> the policy is active an supported
Active,
@@ -95,7 +95,7 @@ pub struct CsvExportRecord {
/// Versicherungsschein Code
pub policy_code: String,
/// Versicherungsscheinnummer (10-stellig, numerisch)
pub policy_number: u64,
pub policy_number: u32,
/// Anrufer: "Vorname, Nachname"
pub policy_holder: String,
/// Sachverhalt: "Kurzschilderung"
@@ -110,39 +110,6 @@ pub struct CsvExportRecord {
pub ivr_comment: String,
}
/// Handel fields of an Email (header, body)
#[derive(Default, Debug, Clone, Deserialize, Serialize)]
pub struct Email {
/// Recipient address
pub mail_to: String,
/// Carbon Copy recipient address
pub mail_cc: String,
/// Blind Carbon Copy recipient address
pub mail_bcc: String,
/// Sender address
pub mail_from: String,
/// Replay to given address
pub mail_reply: String,
/// Mail subject
pub subject: String,
/// Body policy code
pub policy_code: String,
/// Body type policy holder
pub policy_holder: String,
/// Body type deductible
pub deductible: String,
/// Body callback number
pub callback_number: String,
/// Body type callback date
pub callback_date: String,
/// Body type harm type
pub harm_type: String,
/// Body type ivr comment
pub ivr_comment: String
}
impl Email {}
/// Harm data are list/collections of harm types. You may toggle them to an unselected state.
#[derive(Default, Debug, Clone, Deserialize, Serialize)]
pub struct HarmData {
@@ -174,7 +141,7 @@ pub struct HarmType {
}
/// Structure used to verify a policy data element.
#[derive(Default, Debug, Clone, Deserialize, PartialEq, Serialize)]
#[derive(Default, Debug, Clone, Deserialize, Serialize)]
pub struct PolicyCheck {
/// Versicherungsschein-Prüfnummer
pub policy_check_number: String,
@@ -183,12 +150,27 @@ pub struct PolicyCheck {
/// Referenz zum Versicherungsschein-Typ
pub policy_code: PolicyCode,
/// Referenz zur Versicherungsschein-Nummer
pub policy_number: u64,
pub policy_number: usize,
/// Validitätsergebnis
pub policy_number_status: Status
}
impl PolicyCheck {}
impl PolicyCheck {
}
// #[derive(Default, Clone, Debug, Serialize, Deserialize)]
// pub struct PolicyCheckList {
// pub title: String,
// pub list: Vec<PolicyCheck>
// }
// impl PolicyCheckList {
// pub fn new(title: impl Into<String>) -> Self {
// PolicyCheckList {
// title: title.into(),
// ..Default::default()
// }
// }
/// Structure collecting policy data elements
#[derive(Default, Clone, Debug, Serialize, Deserialize)]
@@ -260,7 +242,7 @@ pub struct PolicyDataList {
/// implements the helper methods, to manage policy data collections.
impl PolicyDataList {
/// Prüfung auf Versicherungselemente
/// Prüfung ob Versicherungselemente .
pub fn is_empty(&self) -> bool {
self.policy_data.is_empty()
}
@@ -332,7 +314,7 @@ pub struct PolicyData {
pub policy_code: PolicyCode,
/// Versicherungsscheinnummer (10stellig, numerisch)
#[serde(rename = "POLLFNR")]
pub policy_number: u64,
pub policy_number: usize,
/// Status des Versicherungsscheins
pub status: Option<Status>
}

View File

@@ -5,9 +5,6 @@
* SPDX-License-Identifier: 0BSD, MIT
*/
#![crate_name = "advotracker_client"]
#![crate_type = "lib"]
//#![warn(missing_docs, rust_2018_idioms, rust_2018_compatibility)]
#![warn(rust_2018_idioms, rust_2018_compatibility)]
@@ -26,16 +23,16 @@
//! WIP: provide a workflow image
//!
// i18n: get the macro (t!) accessing translated strings
include!(concat!(env!("OUT_DIR"), "/i18n.rs"));
// /// The client specific services
// pub mod clients;
/// provides helper functions to manage orbtk callbacks
pub mod callbacks;
/// provides data definitions
pub mod data;
/// provides orbtk widgets (handling views and states)
/// provides orbtk widget structures
pub mod widgets;
/// provides services

149
advotracker/src/main.rs Normal file
View File

@@ -0,0 +1,149 @@
/*
* advotracker - Hotline tackingtool for Advocats
*
* Copyright 2020 Ralf Zerres <ralf.zerres@networkx.de>
* SPDX-License-Identifier: (0BSD or MIT)
*/
//#[macro_use]
//extern crate lazy_static;
//use chrono::{Local, DateTime};
//use serde::{Deserialize, Serialize};
use serde::Deserialize;
use std::env;
//use std::process;
//use std::{error::Error, process};
//use std::collections::HashMap;
use tracing::{debug, trace, Level};
use orbtk::prelude::*;
use orbtk::theme::DEFAULT_THEME_CSS;
//use orbtk::theme::LIGHT_THEME_EXTENSION_CSS;
// The Main view
use advotracker::widgets::main_view;
mod parse_args;
/// respect environment variables set in .env files
/// located in the current call directory
/// this is primarily used in testing scenarios (eg. debugging)
#[derive(Debug, Deserialize)]
struct Environment {
test_lang: String,
log: String,
}
//#[cfg(feature = "light-theme")]
static STYLESHEET: &'static str = include_str!("../resources/stylesheets/advotracker.css");
//static STYLESHEET: &'static str = include_str!("../resources/stylesheets/policyholder-check.css");
fn get_theme() -> ThemeValue {
//ThemeValue::create_from_css(LIGHT_THEME_EXTENSION_CSS)
ThemeValue::create_from_css(DEFAULT_THEME_CSS)
.extension_css(STYLESHEET)
.build()
}
fn main() -> Result<(), Box<dyn std::error::Error>> {
use dotenv::dotenv;
use parse_args::parse_args;
//use std::process;
//use std::sync::Arc;
use tracing_subscriber::fmt;
use viperus::Viperus;
//use advotracker::callbacks::policy_check::is_valid;
//use advotracker::data::structures::{PolicyCode, PolicyDataList, PolicyList};
// WIP: can't push pointer by value to widget, call import in widget callback for now
//use advotracker::services::imports::allianzdirectcall::*;
//static DEFAULT_FILTER: &str = concat!(module_path!(), "=", "trace");
// initialize the tracing subsystem
// a drop in replacement for classical logging
// reference: https://tokio.rs/blog/2019-08-tracing/
let span = tracing::span!(Level::TRACE, "advotracker");
let _enter = span.enter();
let subscriber = fmt::Subscriber::builder()
//.with_env_filter("trace")
.with_max_level(tracing::Level::INFO)
.finish();
tracing::subscriber::with_default(subscriber, || {
// get system environment
let mut lang = env::var("LANG").unwrap_or("en".to_string());
trace!(target: "csv-test", message = "main", state = "started");
trace!(target: "csv-test", environment = "system", lang = ?lang);
// testing environment: read from .env file
dotenv().ok();
match envy::from_env::<Environment>() {
Ok(environment) => {
if environment.test_lang != lang { lang = environment.test_lang; }
},
Err(e) => { debug!(target: "advotracker", "{}", e); }
}
// how to handle unumplemented lang resources??
trace!(target: "csv-test", environment = "envy");
// initialize viperus structure
let mut viperus = Viperus::new();
// lazy_static! {
// static ref VIPERUS: Viperus + 'static = { let mut viperus = Viperus::new(); };
// static ref VIPERUS_COUNT: usize = VIPERUS.len();
// }
// lazy_static! {
// static ref HASHMAP: HashMap<usize, PolicyCode> = {
// let mut policy_numbers = HashMap::new();
// policy_numbers
// }
// static ref COUNT: usize = HASHMAP.len();
// println!("The map has {} entries.", *COUNT);
// }
// parse commandline arguments
trace!(target: "csv-test", process = "parse.arguments", state = "started");
let _ = parse_args(&mut viperus);
trace!(target: "csv-test", process = "parse_argument", state = "finished");
//trace!(target: "Viperus", "Count of Config parameters: {:?}", VIPERUS_COUNT);
// main tasks
trace!(target: "csv-test", process = "main", state = "started");
// moved to callback: checkview_state.rs
Application::from_name("rzerres.advotracker")
.window(move |ctx| {
Window::new()
//.title("OrbTk - Policyholder checker")
.title("AdvoTracker - Versicherungsnummern")
.position((500.0, 100.0))
.size(580.0, 320.0)
.min_width(460.0)
.min_height(180.0)
.resizeable(true)
.theme(get_theme())
.child(main_view::MainView::new().build(ctx))
.build(ctx)
})
.run();
trace!(target: "csv-test", process = "main", state = "finished");
});
Ok(())
}
#[cfg(test)]
mod tests {
#[test]
fn it_works() {
assert_eq!(2 + 2, 4);
}
}

View File

@@ -18,19 +18,19 @@ use viperus::Viperus;
pub fn parse_args(viperus: &mut Viperus) -> Result<(), Box<dyn std::error::Error>> {
if cfg!(feature = "global") {
trace!(target: "Viperus", "Viperus feature 'global' enabled.");
println!("Lasy static: 'VIPERUS' is accessible globaly");
//println!("Lasy static: 'VIPERUS' is accessible globaly");
}
if cfg!(feature = "fmt-clap") {
trace!(target: "Viperus", "Viperus feature 'fmt-clap' enabled.");
println!("Using feature fmt-clap");
//println!("Using feature fmt-clap");
}
// preset default key/value pairs (lowest priority)
viperus.add_default("config_file", String::from("csv_import.ron"));
viperus.add_default("import_file", String::from("POLLFNR_WOECHENTLICH.txt"));
viperus.add_default("export_file", String::from(""));
viperus.add_default("test_policy_number", String::from("9999999992"));
viperus.add_default("test_policy_number", 123456789);
viperus.add_default("to_email_address_file", String::from("Allianz RA-Hotline <smr-rahotline@allianz.de>"));
viperus.add_default("from_email_address_file", String::from("Allianz-Hotline RA-Hiedemann <azhotline@hiedemann.de>"));
//viperus.add_default("username", String::from("nctalkbot"));
@@ -139,9 +139,16 @@ SMR Unerledigt: 089 92529 60222")
// preset the prefix for relevant environment variables ("ADVOTRACKER_")
let mut env_prefix: String = crate_name!().to_uppercase();
env_prefix.push('_');
env_prefix.push_str("_");
viperus.set_env_prefix(&env_prefix);
// respect dotenv environment (e.g for testing)
// -> overwrites the preset default values
//println!(
// "RUST_LOG={}",
// dotenv::var("RUST_LOG").unwrap_or_else(|_| String::from("None"))
//);
// enable caching and automatic update of environment values
viperus.cache(true);
viperus.automatic_env(true);

View File

@@ -7,21 +7,21 @@
//use chrono::{Local, DateTime};
use std::error::Error;
//use std::collections::HashMap;
use tracing::trace;
use crate::Lang;
//use crate::db::redis;
//use crate::data::structures::{PolicyCode, PolicyDataList, PolicyData};
/// export as csv format
/// https://docs.rs/csv/1.1.3/csv/cookbook/index.html
/// https://blog.burntsushi.net/csv/
pub fn export(p: &mut String, lang: &Lang) -> Result<(), Box<dyn Error>> {
pub fn export(p: &mut String, lang: &String) -> Result<(), Box<dyn Error>> {
use std::fs::File;
use std::path::Path;
//use std::ffi::OsStr;
let mut res = t!(csv_export_started => lang);
let mut state = t!(state_started => lang);
trace!(target: "csv-export", process = ?res, state = ?state);
trace!(target: "advotrackerd", process = "csv-export", state = "started");
// Note: slash syntax also works on Windows!
let path = Path::new(p);
@@ -30,9 +30,7 @@ pub fn export(p: &mut String, lang: &Lang) -> Result<(), Box<dyn Error>> {
let file = File::open(path)?;
trace!(target: "csv.export", extension = ?path.extension(), file = ?file);
state = t!(state_finished => lang);
res = t!(csv_export_finished => lang);
trace!(target: "csv-export", process = ?res, state = ?state);
trace!(target: "advotrackerd", process = "csv-export", state = "finished");
Ok(())
}

View File

@@ -5,8 +5,5 @@
* SPDX-License-Identifier: (0BSD or MIT)
*/
/// Send ticketdata via email
pub mod send_ticketdata;
/// Exporting Allianz DirecCall data
pub mod allianzdirectcall;

View File

@@ -0,0 +1,107 @@
/*
* advotracker - Hotline tackingtool for Advocats
*
* Copyright 2020 Ralf Zerres <ralf.zerres@networkx.de>
* SPDX-License-Identifier: (0BSD or MIT)
*/
use chrono::{Local, DateTime};
use std::error::Error;
use std::collections::HashMap;
use tracing::trace;
//use crate::db::redis;
use crate::data::structures::{PolicyCode, PolicyDataList, PolicyData};
//use crate::data::structures::PolicyDataList;
/// import AllianzDirectCall data from a csv delimeted file
/// save records to redis backend
/// https://docs.rs/csv/1.1.3/csv/cookbook/index.html
/// https://blog.burntsushi.net/csv/
pub fn import(p: &mut String, data_list: &mut PolicyDataList,
policy_numbers: &mut HashMap<usize, PolicyCode>, lang: &String)
-> Result<usize, Box<dyn Error>> {
use std::fs::File;
use std::path::Path;
use std::ffi::OsStr;
let dt_start: DateTime<Local> = Local::now();
trace!(target: "advotrackerd", process = "import", state = "started", date_start = ?dt_start.to_string());
// Note: slash syntax also workd on Windows!
let path = Path::new(p);
// must be a readable file
trace!(target: "advotrackerd", path = ?path);
assert_eq!(path.is_file(), true);
// only accept files with '.txt' extensions
let extension = path.extension();
assert_eq!(extension, Some(OsStr::new("txt")));
// open the file
let file = File::open(path)?;
trace!(target: "advotrackerd", extension = ?extension, file = ?file);
// Build the CSV reader
let mut csv_reader = csv::ReaderBuilder::new()
.has_headers(true)
.delimiter(b' ')
//.comment(Some(b'#'))
//.flexible(true)
.from_reader(file);
{
// We nest this call in its own scope because of lifetimes.
let headers = csv_reader.headers()?;
trace!(target: "advotrackerd", header = ?headers);
}
// Iterate over each record, deserialize und write to our structures
let mut count = 0;
for result in csv_reader.deserialize() {
// The iterator yields Result<StringRecord, Error>, so we check the
// error here.
let record: PolicyData = result?;
//if verbose > 3 {
// println!("{:?}", record);
//}
// WIP: write to redis backend
// append the policy_number to the HashMap
policy_numbers.insert(record.policy_number, record.policy_code);
// push record as new vector elements
data_list.push(record);
count +=1;
};
let dt_end: DateTime<Local> = Local::now();
let duration = dt_end.signed_duration_since(dt_start);
trace!(target: "advotrackerd", record_count = ?count, duration = ?duration);
// Tests
// Takes a reference and returns Option<&V>
let my_policy_numbers : [usize; 2] = [1511111111, 9999999993];
assert_eq!(my_policy_numbers, [1511111111, 9999999993]);
for p in &my_policy_numbers {
match policy_numbers.get(&p) {
Some(policy_code) => {
//println!("Test: Policy-Number {:?} => Policy-Type {:?}, as expected!",
// p, policy_code);
trace!(target: "advotrackerd",
record_test = ?p, status = "success", policy_typ = ?policy_code);
},
_ => {
//println!("Test: Policy-Number {:?} => not valid, can't dereference the Policy-Type as expected", p),
trace!(target: "advotrackerd", record_fail_test = ?p, status = "failed");
}
}
}
trace!(target: "advotrackerd", process = "import", state = "finished", date_stop = ?dt_end.to_string());
Ok(count)
}

View File

@@ -1,15 +1,8 @@
/*
* advotracker - Hotline tackingtool for Advocats
*
* Copyright 2020 Ralf Zerres <ralf.zerres@networkx.de>
* SPDX-License-Identifier: (0BSD or MIT)
*/
use std::error::Error;
use std::io;
use std::process;
/// Testing: import from csv format (Standard in)
/// import from csv format (Standard in)
fn import() -> Result<(), Box<dyn Error>> {
// Build the CSV reader and iterate over each record.
let mut csv_reader = csv::Reader::from_reader(io::stdin());
@@ -24,7 +17,7 @@ fn import() -> Result<(), Box<dyn Error>> {
fn main() {
if let Err(err) = import() {
println!("import error: {}", err);
println!("error running example: {}", err);
process::exit(1);
}
}

View File

@@ -8,5 +8,5 @@
/// advotracker import modules
pub mod imports;
/// advotracker export modules
/// advotracker import modules
pub mod exports;

View File

@@ -7,36 +7,21 @@
use orbtk::prelude::*;
use crate::{
data::{
constants::*,
structures::PolicyCheck,
},
widgets::configuration::configuration_view::ConfigurationView,
widgets::policycheck::policycheck_view::PolicycheckView,
widgets::localization::localization_view::LocalizationView,
//widgets::menu::menu_view::MenuView,
widgets::ticketdata::ticketdata_view::TicketdataView,
};
// [START] views
use crate::data::structures::PolicyCheck;
use crate::widgets::policycheck_view::PolicyCheckView;
widget!(MainView {
// policy_list: PolicyList,
// policy_data_list: PolicyDataList,
// policylist_view: u32,
// policydata_view: u32,
//policycheck_view: u32
policycheck_view: PolicyCheck
//ticketdata_view: TicketData
});
impl Template for MainView {
fn template(self, _id: Entity, ctx: &mut BuildContext<'_>) -> Self {
let ticketdata_view = TicketdataView::new()
.build(ctx);
let policycheck_view = PolicycheckView::new()
.target(ticketdata_view.0)
fn template(self, id: Entity, ctx: &mut BuildContext<'_>) -> Self {
let policycheck_view = PolicyCheckView::new()
//.policy_number_count(0)
//.policylist_view(id)
.build(ctx);
@@ -55,22 +40,13 @@ impl Template for MainView {
// .build(ctx);
self.name("MainView")
//.policycheck_view(PolicyCheck::default())
.policycheck_view(PolicyCheck::default())
// //.policycheck_view(0)
// .policydata_view(policydata_view.0)
// //.policylist_view(PolicyList::default())
// .policylist_view(policylist_view.0)
// .child(policydata_view)
// .child(policylist_view)
.child(
TabWidget::new()
.tab(ID_POLICY_CHECK_VIEW, policycheck_view)
.tab(ID_TICKET_DATA_VIEW, ticketdata_view)
.tab(ID_LOCALIZATION_VIEW, LocalizationView::new().build(ctx))
.tab(ID_CONFIGURATION_VIEW, ConfigurationView::new().build(ctx))
//.tab(ID_MENU_VIEW, MenuView::new().build(ctx))
.build(ctx),
)
//.child(policycheck_view)
.child(policycheck_view)
}
}

View File

@@ -5,8 +5,11 @@
* SPDX-License-Identifier: (0BSD or MIT)
*/
/// The policy check state
pub mod policycheck_state;
/// The starting point (Main View)
pub mod main_view;
/// The policy check view
/// The policy check wigdet
pub mod policycheck_view;
// /// The policy lists widget
// pub mod policylist_view;

View File

@@ -0,0 +1,72 @@
use orbtk::prelude::*;
//use orbtk::theme::vector_graphics::material_icons_font;
use crate::data::keys::*;
//pub struct PolicyMenu {
// pub isvalid: bool
//}
widget!(
PolicyCheckMenu {
isvalid: String
}
);
impl Template for PolicyCheckMenu {
fn template(self, _id: Entity, ctx: &mut BuildContext) -> Self {
self.name("PolicyCheckMenu").child(
Stack::new()
.orientation("vertical")
.spacing(8.0)
.h_align("center")
.child(
Stack::new()
.orientation("horizontal")
.spacing(4.0)
.h_align("start")
.child(
Button::new()
.element("button-user")
.icon("")
.min_width(32.0)
.max_width(32.0)
.build(ctx),
)
.child(
TextBlock::new()
.element("menu-user")
.min_width(80.0)
.max_width(180.0)
.text("angemeldeter Benutzer")
.build(ctx),
)
.build(ctx),
)
.child(
Stack::new()
.orientation("horizontal")
.spacing(4.0)
.h_align("start")
.child(
Button::new()
.element("button-user")
.icon("")
.min_width(32.0)
.max_width(32.0)
.build(ctx),
)
.child(
TextBlock::new()
.element("menu-quit")
.min_width(80.0)
.max_width(180.0)
.text("Quit")
.build(ctx),
)
.build(ctx),
)
.build(ctx)
)
}
}

View File

@@ -0,0 +1,380 @@
/*
* advotracker - Hotline tackingtool for Advocats
*
* Copyright 2020 Ralf Zerres <ralf.zerres@networkx.de>
* SPDX-License-Identifier: (0BSD or MIT)
*/
use orbtk::prelude::*;
use crate::{
data::structures::PolicyCheck,
data::keys::*,
callbacks::policycheck_state::*,
//policycheck_state::{Action, PolicyCheckState},
};
// Macro that initializes the widget structures/variables for our view (essential!)
widget!(
/// Dialog to enter a policy identifier/number.
/// This identifier is checked agains a map of valid policy codes.
PolicyCheckView<PolicyCheckState> {
policy_check: PolicyCheck,
policy_check_title: String16,
policy_data_count: u32
}
);
// The template implementation for our View
impl Template for PolicyCheckView {
fn template(self, id: Entity, ctx: &mut BuildContext<'_>) -> Self {
let policy_check_menu_text_block = TextBlock::new()
.foreground("#3b434a")
.text("Help Menu")
.v_align("center")
.h_align("center")
.build(ctx);
let policy_check_menu_button = Button::new()
.id(ID_POLICY_CHECK_MENU_BUTTON)
.margin((0.0, 0.0, 12.0, 12.0))
.icon(material_icons_font::MD_MENU)
.class(CLASS_ICON_ONLY)
//.attach(Grid::row(0))
.attach(Grid::column(2))
.margin((8.0, 0.0, 2.0, 0.0))
//.text("Menu Button")
//.min_size(8.0, 8.0)
.min_size(16.0, 16.0)
.h_align("end")
//.v_align("center")
//.enabled(true)
.on_mouse_down(|_, _| true)
//.child(policycheck_menu_container)
.on_click(move |ctx, _| {
ctx.get_mut::<PolicyCheckState>(id)
.action(Action::OpenMenu(policy_check_menu_text_block));
true
})
.build(ctx);
let policy_data_count_block = TextBlock::new()
.id(ID_POLICY_DATA_COUNT_BLOCK)
//.class(CLASS_TEXT_BLOCK)
.attach(Grid::row(2))
.attach(Grid::column(0))
.attach(Grid::column_span(3))
.margin((0., 0., 0., 16.))
.h_align("end")
.v_align("end")
.enabled(true)
.min_width(250.0)
.min_height(45.0)
.text("Anzahl Prüfsätze:")
.build(ctx);
// let policy_check_menu_container = Container::new()
// .id(ID_POLICY_CHECK_MENU_CONTAINER)
// .class(CLASS_MENU)
// .attach(Grid::row(3))
// .attach(Grid::column(8))
// .margin((0.0, 0.0, 4.0, 0.0))
// .enabled(false)
// .min_size(120.0, 180.0)
// .v_align("center")
// .on_click(move |ctx, _| {
// ctx.get_mut::<PolicyCheckState>(id)
// .action(Action::NewEntry(quit));
// true
// })
// .build(ctx);
// let policycheck_menu_container = Container::new()
// .id(ID_POLICY_CHECK_MENU_CONTAINER)
// .background("#dfebf5")
// .width(200.0)
// .height(200.0)
// .child(
// The menu implemented as an overlay
//ctx.append_child_to_overlay(policy_check_menu_button).unwrap();
// Starter page: check for valid policy number
self.name("PolicyCheckView")
// initialize struct consuming the derived default macro
.policy_check(PolicyCheck::default())
.child(
Grid::new()
.id(ID_POLICY_CHECK_WIDGET)
.background("#fafafa")
.columns(
Columns::new()
.add(84.0)
.add("*")
.add(50.0)
.build(),
)
.rows(
Rows::new()
// Top Bar
.add("auto")
.add(1.0)
// Content
.add("*")
.add(1.0)
// Bottom Bar
.add(52.0)
/* .add("auto") */
.build(),
)
// Header Bar
.child(
//.border_color("transparent")
Container::new()
//.class(CLASS_TOP_BAR)
.attach(Grid::row(0))
.attach(Grid::column(0))
.attach(Grid::column_span(3))
.child(
Grid::new()
.child(
TextBlock::new()
//.class(CLASS_HEADER)
.class("h1")
//.class(".myheader")
.id(ID_POLICY_CHECK_HEADER)
//.font_size(24)
//.font("Roboto Medium")
.v_align("center")
.h_align("center")
.margin((32.0, 32.0, 32.0, 32.0))
.text("Validierung Versicherungsnummer")
.build(ctx),
)
.build(ctx),
)
.child(policy_check_menu_button)
.build(ctx),
)
.child(
Container::new()
.class("separator")
.attach(Grid::row(1))
.attach(Grid::column_span(3))
.build(ctx),
)
// Policy Check Form
.child(
Container::new()
//.class(CLASS_POLICY_CHECK_FORM)
.attach(Grid::row(2))
.attach(Grid::column(0))
.attach(Grid::column_span(3))
.margin((16.0, 26.0, 26.0, 16.0))
.child(
Grid::new()
.id(ID_POLICY_CHECK_FORM)
.columns(
Columns::new()
// Labels
.add("220.0")
// Seperator
.add("16.0")
// Values
.add("100.0")
.build(),
)
.rows(
Rows::new()
.add("64.0")
.add("64.0")
.build(),
)
.child(
// Labels
Stack::new()
.attach(Grid::column(0))
.attach(Grid::row(0))
.orientation("vertical")
//.v_align("center")
.child(
TextBlock::new()
.id(ID_POLICY_CHECK_LABEL_POLICY_NUMBER)
//.class(CLASS_TEXT_BLOCK)
.margin((0.0, 0.0, 16.0, 16.0))
.h_align("end")
.v_align("center")
.min_width(250.0)
.min_height(45.0)
//.size(250.0, 45.0)
.text("Versicherungsnummer:")
.build(ctx),
)
.child(
TextBlock::new()
.id(ID_POLICY_CHECK_LABEL_RESULT)
.class(CLASS_TEXT_BLOCK)
.attach(Grid::column(0))
.attach(Grid::row(1))
.margin((0.0, 0.0, 16.0, 0.0))
.h_align("end")
.v_align("center")
.min_width(250.0)
.text("Result:")
.build(ctx),
)
.build(ctx)
)
.child(
// Values
Stack::new()
.attach(Grid::column(1))
.attach(Grid::row(0))
//.attach(Grid::column_span(3))
.orientation("vertical")
//.margin((16.0, 16.0, 16.0, 16.0))
//.child(policy_check_text_box)
.child(
TextBox::new()
.id(ID_POLICY_CHECK_POLICY_NUMBER)
.h_align("start")
.width(280.0)
.min_width(200.0)
.margin((0.0, 0.0, 0.0, 16.0))
.lost_focus_on_activation(false)
.water_mark("Nummer 10-stellig")
.text("")
.on_activate(move |ctx, entity| {
// Entity is entered/activated via Mouse/Keyboard
ctx.get_mut::<PolicyCheckState>(id)
.action(Action::ParseEntry(entity));
})
.on_changed(move |ctx, entity| {
// Element value has changed
ctx.get_mut::<PolicyCheckState>(id)
.action(Action::InputTextChanged(entity));
ctx.get_mut::<PolicyCheckState>(id)
.action(Action::SetVisibility(entity));
//ctx.get_widget(policy_check_label_policy_number).set("visible");
// ctx.get_mut::<PolicyCheckState>(id)
// .action(Action::SetVisility(entity));
})
// .on_mouse_down | .on_mouse_move | .on_mouse_up (move |ctx, entity| {
// state(id, states).action(Action::AddItem);
// })
// .on_click(move |states, _| {
// state(id, states).action(Action::AddItem);
// true
// })
.build(ctx),
)
//.icon(material_icons_font::MD_ADD_CIRCLE)
// .child()
// NumericBox::new()
// .id(ID_POLICY_CHECK_POLICY_NUMBER)
// .h_align("start")
// .width(250.0)
// .min(1000000000)
// .max(9999999999)
// .val(0)
// .min_width(200.0)
// .margin((0.0, 0.0, 0.0, 16.0))
// //.lost_focus_on_activation(false)
// //.water_mark("10-stellige Nummer (ohne 'AS')")
// //.text("")
// //.on_activate(move |ctx, entity| {
// // ctx.get_mut::<PolicyCheckState>(id)
// // .action(Action::ParseEntry(entity));
// //})
// // .on_changed(move |ctx, entity| {
// // ctx.get_mut::<PolicyCheckState>(id)
// // .action(Action::InputTextChanged(entity));
// // })
// // .on_update(move |ctx, entity| {
// // ctx.get_mut::<PolicyCheckState>(id)
// // .action(Action::InputTextChanged(entity));
// // })
// .build(ctx),
//)
.child(
TextBlock::new()
.id(ID_POLICY_CHECK_RESULT)
//.id("policy_check_result")
.h_align("start")
.attach(Grid::column(1))
.attach(Grid::row(1))
.text("")
.width(250.)
//.margin((4.0, 0.0, 0.0, 0.0))
//.lost_focus_on_activation(false)
// .on_activate(move |ctx, entity| {
// ctx.get_mut::<PolicyCheckState>(id)
// .action(Action::ParseEntry(entity));
// })
// .on_changed(move |ctx, entity| {
// ctx.get_mut::<PolicyCheckState>(id)
// .action(Action::InputTextChanged(entity));
// })
.build(ctx),
)
.build(ctx)
)
.build(ctx)
)
.build(ctx)
)
.child(
Container::new()
.class("")
.attach(Grid::row(3))
.attach(Grid::column_span(3))
.build(ctx),
)
.child(policy_data_count_block)
// Bottom bar
.child(
Container::new()
.class(CLASS_BOTTOM_BAR)
.attach(Grid::row(4))
.attach(Grid::column(0))
.attach(Grid::column_span(3))
.v_align("end")
.child(
Grid::new()
.element("logo_customer")
.margin((9.0, 16.0, 16.0, 9.0))
.attach(Grid::column(0))
.attach(Grid::row(1))
.h_align("start")
.v_align("center")
.child(
ImageWidget::new()
.image("resources/images/hiedemann_logo.png")
.build(ctx),
)
.build(ctx),
)
.child(
Grid::new()
.element("logo_vendor")
.margin((9.0, 16.0, 16.0, 9.0))
.attach(Grid::column(0))
.attach(Grid::row(5))
.h_align("end")
.v_align("center")
.child(
ImageWidget::new()
.image("resources/images/networkx_logo.png")
.build(ctx),
)
.build(ctx),
//ctx.append_child_to_overlay(policycheck_menu_text_block).unwrap()
)
.build(ctx),
)
.build(ctx),
)
}
}

View File

@@ -1,15 +1,8 @@
/*
* advotracker - Hotline tackingtool for Advocats
*
* Copyright 2020 Ralf Zerres <ralf.zerres@networkx.de>
* SPDX-License-Identifier: (0BSD or MIT)
*/
use orbtk::prelude::*;
use crate::{
constants::*,
data::{PolicyList, Status},
keys::*,
policydata_state::{Action, PolicyDataState},
};
use chrono::NaiveDateTime;

View File

@@ -0,0 +1,196 @@
use orbtk::prelude::*;
use crate::{
base_state::BaseState,
data::{PolicyDataList, PolicyList},
keys::*,
};
/// Actions that can execute on the task view.
#[derive(Debug, Clone, Copy)]
pub enum Action {
InputTextChanged(Entity),
NewEntry(Entity),
RemoveFocus(Entity),
RemoveEntry(usize),
OpenPolicyList(usize),
SetEntry(Entity),
TextChanged(Entity, usize),
}
/// Handles the requests of the `PolicyListView`.
#[derive(Default, AsAny)]
pub struct PolicyListState {
action:Option<Action>,
add_button: Entity,
items_widget: Entity,
policydata_view: Entity,
last_focused: Option<Entity>,
text_box: Entity,
}
impl BaseState for PolicyListState {}
impl PolicyListState {
/// Sets a new action.
pub fn action(&mut self, action: Action) {
self.action = action.into();
}
/// If policy data element 'name' is empty, disable the add button
/// otherwise otherwise enabled it.
fn adjust_add_button_enabled(&self, text_box: Entity, ctx: &mut Context) {
/* Old syntax
if ctx.get_widget(text_box).get::<String>("name").is_empty() {
ctx.get_widget(self.add_button).set("enabled", false);
} else {
ctx.get_widget(self.add_button).set("enabled", true);
}
ctx.get_widget(self.add_button).update_theme_by_state(true);
*/
if TextBox::get(ctx.get_widget(text_box)).text().is_empty() {
Button::get(ctx.child("add_button")).set_enabled(false);
} else {
Button::get(ctx.child("add_button")).set_enabled(true);
}
// new syntax not implemented yet
ctx.get_widget(self.add_button).update_theme_by_state(true);
}
/// update number of available policy list entries.
fn adjust_count(&self, ctx: &mut Context) {
let policy_list_count = ctx.widget().get::<PolicyList>(PROP_POLICY_LIST).len();
ctx.widget().set(PROP_POLICY_LIST_COUNT, policy_list_count);
}
// Creates a new policy data list.
fn new_entry(&self, name: String, registry: &mut Registry, ctx: &mut Context) {
ctx.widget()
.get_mut::<PolicyList>(PROP_POLICY_LIST)
.push(PolicyList::new(name));
self.adjust_count(ctx);
self.save(registry, ctx);
}
// opens a given policy list name.
fn open_policy_list(&self, index: usize, ctx: &mut Context) {
ctx.get_widget(self.text_box)
.set("text", String16::from(""));
ctx.get_widget(self.policydata_view)
.set("list_index", Some(index));
self.navigate(self.policydata_view, ctx);
}
// removes a policy list.
fn remove_entry(&self, index: usize, registry: &mut Registry, ctx: &mut Context) {
ctx.widget()
.get_mut::<PolicyList>(PROP_POLICY_LIST)
.remove(index);
self.adjust_count(ctx);
self.save(registry, ctx);
}
/// Change status of given text box to edit mode.
fn set_entry(&self, text_box: Entity, ctx: &mut Context) {
if *ctx.get_widget(text_box).get::<bool>("focused") {
ctx.get_widget(text_box).set("enabled", false);
ctx.push_event_by_window(FocusEvent::RemoveFocus(text_box));
return;
}
if let Some(old_focused_element) = ctx.window().get::<Global>("global").focused_widget {
ctx.push_event_by_window(FocusEvent::RemoveFocus(old_focused_element));
}
ctx.get_widget(text_box).set("enabled", true);
// select all
ctx.get_widget(text_box)
.get_mut::<TextSelection>("text_selection")
.start_index = 0;
ctx.get_widget(text_box)
.get_mut::<TextSelection>("text_selection")
.length = ctx.get_widget(text_box).get::<String16>("name").len();
ctx.push_event_by_window(FocusEvent::RequestFocus(text_box));
}
}
impl State for PolicyListState {
fn init(&mut self, registry: &mut Registry, ctx: &mut Context) {
self.text_box = ctx
.entity_of_child(ID_POLICY_LIST_TEXT_BOX)
.expect("PolicyListState.init: Child 'Text box' not found.");
self.add_button = ctx
.entity_of_child(ID_POLICY_LIST_ADD_BUTTON)
.expect("PolicyListState.init: Child 'Add button' not found.");
self.items_widget = ctx
.entity_of_child(ID_POLICY_LIST_ITEMS_WIDGET)
.expect("PolicyListState.init: Child 'Items widget' not found.");
self.policydata_view = (*ctx.widget()
.get::<u32>("policy_list_view")).into();
if let Ok(policy_list_name) = registry
.get::<Settings>("settings")
.load::<PolicyList>(PROP_POLICY_LIST)
{
ctx.widget().set(PROP_POLICY_LIST, policy_list_name);
}
self.adjust_count(ctx);
}
fn update(&mut self, registry: &mut Registry, ctx: &mut Context) {
// clear focus on focus moved
if self.last_focused != ctx.window().get::<Global>("global").focused_widget {
if let Some(last_focused) = self.last_focused {
ctx.get_widget(last_focused).set("focused", false);
ctx.get_widget(last_focused)
.set("visibility", Visibility::Collapsed);
}
}
if let Some(action) = self.action {
match action {
Action::InputTextChanged(text_box) => {
self.adjust_add_button_enabled(text_box, ctx);
}
Action::NewEntry(entity) => {
if let Some(name) = self.fetch_text(ctx, entity) {
self.new_entry(name, registry, ctx);
}
}
Action::RemoveEntry(index) => {
self.remove_entry(index, registry, ctx);
}
Action::TextChanged(entity, index) => {
let text: String16 = ctx.get_widget(entity).clone("text");
if let Some(header) = ctx
.widget()
.get_mut::<PolicyList>("policy_list")
.get_mut(index)
{
header.name = text.to_string();
}
self.save(registry, ctx);
}
Action::SetEntry(text_box) => {
self.last_focused = Some(text_box);
self.set_entry(text_box, ctx);
}
Action::RemoveFocus(text_box) => {
self.last_focused = None;
ctx.push_event_by_window(FocusEvent::RemoveFocus(text_box));
}
Action::OpenPolicyList(index) => {
self.open_policy_list(index, ctx);
}
}
}
self.action = None;
}
}

View File

@@ -1,15 +1,8 @@
/*
* advotracker - Hotline tackingtool for Advocats
*
* Copyright 2020 Ralf Zerres <ralf.zerres@networkx.de>
* SPDX-License-Identifier: (0BSD or MIT)
*/
use orbtk::prelude::*;
use crate::{
constants::*,
data::PolicyList,
keys::*,
//policylist_state::{Action, PolicyListState},
policylist_state::*,
};

1
advotrackerd Submodule

Submodule advotrackerd added at 3331aa284d

View File

@@ -1,17 +0,0 @@
###
# .env
# will overwrite standard environment viariables
###
# set the language variable used in test-runs
#test LANG=de-DE
#test LANG=es-ES
#test LANG=C
# set the language variable (overwriting standard Enviroment)
#TEST_LANG=de_DE
#TEST_LANG=C
#RUST_LOG=advotracker=trace
#LANG=de_DE
RUST_LOG=trace
#RUST_LOG=none
USERNAME=hiedemann
DB_DRIVER=sqlite

View File

@@ -1,16 +0,0 @@
###
# .env
# will overwrite standard environment viariables
###
# set the language variable used in test-runs
#test LANG=es-ES
#test LANG=it-IT
#test LANG=C
# set the language variable (overwriting standard Enviroment)
#TEST_LANG=de_DE
#TEST_LANG=C
#RUST_LOG=advotracker=trace
RUST_LOG=trace
#RUST_LOG=none
USERNAME=hiedemann
DB_DRIVER=sqlite

Some files were not shown because too many files have changed in this diff Show More