advotracker-framework: Rename 'frontend' to advotracker
Signed-off-by: Ralf Zerres <ralf.zerres@networkx.de>
@@ -1,42 +0,0 @@
|
||||
[package]
|
||||
name = "advotracker_frontend"
|
||||
version = "0.1.0"
|
||||
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"
|
||||
|
||||
[target.'cfg(windows)'.dependencies]
|
||||
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"] }
|
||||
clap = { version = "~2.33", features = ["suggestions", "color"] }
|
||||
csv = { version = "~1.1" }
|
||||
dotenv = "~0.15.0"
|
||||
#env_logger = "~0.7.1"
|
||||
envy = { version = "~0.4" }
|
||||
log = "~0.4.8"
|
||||
locales = { version = "0.1" }
|
||||
#orbtk = "~0.3.1-alpha3"
|
||||
#orbtk = { git = "https://github.com/redox-os/orbtk.git", branch = "develop" }
|
||||
orbtk = { path = "../../redox-os/orbtk" }
|
||||
serde = { version = "~1.0", features = ["derive"] }
|
||||
#serde_json = "~1.0"
|
||||
#tokio = { version = "~0.2", features = ["macros", "rt-threaded", "stream", "time"] }
|
||||
tracing = { version = "~0.1" }
|
||||
tracing-subscriber = { version = "0.2.0-alpha", features = ["tracing-log"] }
|
||||
viperus = { git = "https://github.com/maurocordioli/viperus", features = ["cache", "watch", "fmt-clap", "fmt-env"] }
|
||||
|
||||
[features]
|
||||
# no features by default
|
||||
default = ["orbtk/debug"]
|
||||
|
||||
[package.metadata.bundle]
|
||||
name = "AdvoTracker"
|
||||
identifier = "rzerres.advotracker"
|
||||
short_description = "Task app based on OrbTk."
|
||||
description = "Supports lawyers to capture relevant data encountered during an online legal advice.\n"
|
||||
@@ -1,14 +0,0 @@
|
||||
+[[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"
|
||||
@@ -1,5 +0,0 @@
|
||||
[advotracker.conf]
|
||||
|
||||
mode = interative
|
||||
|
||||
|
||||
@@ -1,7 +0,0 @@
|
||||
# set the language variable used in test-runs
|
||||
#test lang=it
|
||||
TEST_LANG=en
|
||||
#RUST_LOG=csv-import=trace
|
||||
LOG=debug
|
||||
USERNAME=ralf
|
||||
DB_DRIVER=sqlite
|
||||
@@ -1,478 +0,0 @@
|
||||
use std::collections::HashSet;
|
||||
|
||||
use orbtk::prelude::*;
|
||||
|
||||
#[derive(Debug, Copy, Clone)]
|
||||
enum Action {
|
||||
AddItem,
|
||||
ClearText,
|
||||
EntryActivated(Entity),
|
||||
EntryChanged(Entity),
|
||||
ValueChanged(Entity),
|
||||
IncrementCounter,
|
||||
RemoveItem,
|
||||
}
|
||||
|
||||
#[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::AddItem => {
|
||||
let len = ctx.widget().get::<List>("list").len();
|
||||
if len < 5 {
|
||||
ctx.widget()
|
||||
.get_mut::<List>("list")
|
||||
.push(format!("Item {}", len + 1));
|
||||
ctx.child("items").set("count", len + 1);
|
||||
ctx.child("remove-item-button").set("enabled", true);
|
||||
|
||||
if len == 4 {
|
||||
ctx.child("add-item-button").set("enabled", false);
|
||||
}
|
||||
}
|
||||
}
|
||||
Action::RemoveItem => {
|
||||
let len = ctx.widget().get::<List>("list").len();
|
||||
if len > 0 {
|
||||
ctx.widget().get_mut::<List>("list").remove(len - 1);
|
||||
ctx.child("items").set("count", len - 1);
|
||||
ctx.child("add-item-button").set("enabled", true);
|
||||
|
||||
if len == 1 {
|
||||
ctx.child("remove-item-button").set("enabled", false);
|
||||
}
|
||||
}
|
||||
}
|
||||
Action::IncrementCounter => {
|
||||
*ctx.widget().get_mut::<usize>("counter") += 1;
|
||||
|
||||
let counter = *ctx.widget().get::<usize>("counter");
|
||||
|
||||
ctx.widget().set(
|
||||
"result",
|
||||
String16::from(format!("Button count: {}", counter)),
|
||||
);
|
||||
}
|
||||
Action::ClearText => {
|
||||
ctx.widget().set("text_one", String16::from(""));
|
||||
ctx.widget().set("text_two", String16::from(""));
|
||||
}
|
||||
Action::EntryActivated(entity) => {
|
||||
let mut widget = ctx.get_widget(entity);
|
||||
let text = widget.get_mut::<String16>("text");
|
||||
println!("submitting {}", 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 update_post_layout(&mut self, _: &mut Registry, ctx: &mut Context<'_>) {
|
||||
let mut selection_string = "Selected:".to_string();
|
||||
|
||||
for index in &ctx.widget().get::<SelectedIndices>("selected_indices").0 {
|
||||
selection_string = format!("{} {}", selection_string, index);
|
||||
}
|
||||
|
||||
ctx.child("selection")
|
||||
.set("text", String16::from(selection_string));
|
||||
}
|
||||
}
|
||||
|
||||
fn create_header(ctx: &mut BuildContext, text: &str) -> Entity {
|
||||
TextBlock::new()
|
||||
.text(text)
|
||||
.element("text-block")
|
||||
.class("h1")
|
||||
.build(ctx)
|
||||
}
|
||||
|
||||
type List = Vec<String>;
|
||||
|
||||
widget!(
|
||||
MainView<MainViewState> {
|
||||
selected_indices: SelectedIndices,
|
||||
counter: usize,
|
||||
list_count: usize,
|
||||
combo_box_list_count: usize,
|
||||
list: List,
|
||||
selection_list: List,
|
||||
combo_box_list: List,
|
||||
selection_list_count: usize,
|
||||
text_one: String16,
|
||||
text_two: String16,
|
||||
result: String16
|
||||
}
|
||||
);
|
||||
|
||||
impl Template for MainView {
|
||||
fn template(self, id: Entity, ctx: &mut BuildContext) -> Self {
|
||||
self.name("MainView")
|
||||
.result("Button count: 0")
|
||||
.counter(0)
|
||||
.selected_indices(HashSet::new())
|
||||
.list(vec![
|
||||
"Item 1".to_string(),
|
||||
"Item 2".to_string(),
|
||||
"Item 3".to_string(),
|
||||
])
|
||||
.list_count(3)
|
||||
.selection_list(vec![
|
||||
"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(),
|
||||
"CB 2".to_string(),
|
||||
"CB 3".to_string(),
|
||||
"CB 4".to_string(),
|
||||
"CB 5".to_string(),
|
||||
"CB 6".to_string(),
|
||||
"CB 7".to_string(),
|
||||
"CB 8".to_string(),
|
||||
"CB 9".to_string(),
|
||||
"CB 10".to_string(),
|
||||
])
|
||||
.selection_list_count(10)
|
||||
.combo_box_list_count(10)
|
||||
.child(
|
||||
Grid::new()
|
||||
.margin(8.0)
|
||||
.columns(
|
||||
Columns::new()
|
||||
.add(132.0)
|
||||
.add(16.0)
|
||||
.add(132.0)
|
||||
.add(16.0)
|
||||
.add(132.0),
|
||||
)
|
||||
.child(
|
||||
Stack::new()
|
||||
.attach(Grid::column(0))
|
||||
// Column 0
|
||||
.child(create_header(ctx, "Buttons"))
|
||||
.child(
|
||||
Button::new()
|
||||
.text("Button")
|
||||
.margin((0.0, 8.0, 0.0, 0.0))
|
||||
.icon(material_font_icons::CHECK_FONT_ICON)
|
||||
.attach(Grid::column(0))
|
||||
.attach(Grid::row(1))
|
||||
.on_click(move |states, _| {
|
||||
state(id, states).action(Action::IncrementCounter);
|
||||
true
|
||||
})
|
||||
.build(ctx),
|
||||
)
|
||||
.child(
|
||||
Button::new()
|
||||
.text("Primary")
|
||||
.element("button")
|
||||
.class("primary")
|
||||
.margin((0.0, 8.0, 0.0, 0.0))
|
||||
.icon(material_font_icons::CHECK_FONT_ICON)
|
||||
.attach(Grid::column(0))
|
||||
.attach(Grid::row(2))
|
||||
.build(ctx),
|
||||
)
|
||||
.child(
|
||||
ToggleButton::new()
|
||||
.class("single_content")
|
||||
.text("ToggleButton")
|
||||
.margin((0.0, 8.0, 0.0, 0.0))
|
||||
.attach(Grid::column(0))
|
||||
.attach(Grid::row(3))
|
||||
.build(ctx),
|
||||
)
|
||||
.child(
|
||||
CheckBox::new()
|
||||
.text("CheckBox")
|
||||
.margin((0.0, 8.0, 0.0, 0.0))
|
||||
.attach(Grid::column(0))
|
||||
.attach(Grid::row(4))
|
||||
.build(ctx),
|
||||
)
|
||||
.child(
|
||||
Switch::new()
|
||||
.margin((0.0, 8.0, 0.0, 0.0))
|
||||
.attach(Grid::column(0))
|
||||
.attach(Grid::row(5))
|
||||
.build(ctx),
|
||||
)
|
||||
.child(
|
||||
TextBlock::new()
|
||||
.margin((0.0, 8.0, 0.0, 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()
|
||||
.attach(Grid::column(2))
|
||||
.child(create_header(ctx, "Text"))
|
||||
.child(
|
||||
TextBlock::new()
|
||||
.class("body")
|
||||
.text(("result", id))
|
||||
.margin((0.0, 8.0, 0.0, 0.0))
|
||||
.attach(Grid::column(2))
|
||||
.attach(Grid::row(1))
|
||||
.build(ctx),
|
||||
)
|
||||
.child(
|
||||
TextBox::new()
|
||||
.water_mark("TextBox...")
|
||||
.text(("text_one", id))
|
||||
.margin((0.0, 8.0, 0.0, 0.0))
|
||||
.attach(Grid::column(2))
|
||||
.attach(Grid::row(2))
|
||||
.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(
|
||||
TextBox::new()
|
||||
.water_mark("TextBox...")
|
||||
.text(("text_two", id))
|
||||
.margin((0.0, 8.0, 0.0, 0.0))
|
||||
.attach(Grid::column(2))
|
||||
.attach(Grid::row(2))
|
||||
.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(
|
||||
Button::new()
|
||||
.margin((0.0, 8.0, 0.0, 0.0))
|
||||
.class("single_content")
|
||||
.text("clear text")
|
||||
.on_click(move |states, _| {
|
||||
state(id, states).action(Action::ClearText);
|
||||
true
|
||||
})
|
||||
.build(ctx),
|
||||
)
|
||||
.child(
|
||||
NumericBox::new()
|
||||
.margin((0.0, 8.0, 0.0, 0.0))
|
||||
.max(123.0)
|
||||
.step(0.123)
|
||||
.val(0.123)
|
||||
.build(ctx),
|
||||
)
|
||||
.build(ctx),
|
||||
)
|
||||
.child(
|
||||
Grid::new()
|
||||
.rows(
|
||||
Rows::new()
|
||||
.add("auto")
|
||||
.add(32.0)
|
||||
.add(16.0)
|
||||
.add(204.0)
|
||||
.add("auto")
|
||||
.add(192.0)
|
||||
.add("auto"),
|
||||
)
|
||||
.columns(Columns::new().add("*").add(4.0).add("*"))
|
||||
.attach(Grid::column(4))
|
||||
.child(
|
||||
TextBlock::new()
|
||||
.text("Items")
|
||||
.element("text-block")
|
||||
.class("h1")
|
||||
.attach(Grid::column(0))
|
||||
.attach(Grid::column_span(3))
|
||||
.attach(Grid::row(0))
|
||||
.build(ctx),
|
||||
)
|
||||
.child(
|
||||
ComboBox::new()
|
||||
.items_builder(move |bc, index| {
|
||||
let text = bc
|
||||
.get_widget(id)
|
||||
.get::<Vec<String>>("combo_box_list")[index]
|
||||
.clone();
|
||||
TextBlock::new()
|
||||
.margin((0.0, 0.0, 0.0, 2.0))
|
||||
.v_align("center")
|
||||
.text(text)
|
||||
.build(bc)
|
||||
})
|
||||
.selected_index(0)
|
||||
.attach(Grid::column(0))
|
||||
.attach(Grid::column_span(3))
|
||||
.attach(Grid::row(1))
|
||||
.margin((0.0, 8.0, 0.0, 0.0))
|
||||
.count(("combo_box_list_count", id))
|
||||
.build(ctx),
|
||||
)
|
||||
.child(
|
||||
ItemsWidget::new()
|
||||
.element("items-widget")
|
||||
.id("items")
|
||||
.padding((4.0, 4.0, 4.0, 2.0))
|
||||
.attach(Grid::column(0))
|
||||
.attach(Grid::column_span(3))
|
||||
.attach(Grid::row(3))
|
||||
.margin((0.0, 0.0, 0.0, 8.0))
|
||||
.items_builder(move |bc, index| {
|
||||
let text = bc.get_widget(id).get::<Vec<String>>("list")
|
||||
[index]
|
||||
.clone();
|
||||
|
||||
Button::new()
|
||||
.margin((0.0, 0.0, 0.0, 2.0))
|
||||
.text(text)
|
||||
.build(bc)
|
||||
})
|
||||
.count(("list_count", id))
|
||||
.build(ctx),
|
||||
)
|
||||
.child(
|
||||
Button::new()
|
||||
.element("button")
|
||||
.class("single_content")
|
||||
.id("remove-item-button")
|
||||
.icon(material_font_icons::MINUS_FONT_ICON)
|
||||
.on_click(move |states, _| {
|
||||
state(id, states).action(Action::RemoveItem);
|
||||
true
|
||||
})
|
||||
.min_width(0.0)
|
||||
.attach(Grid::column(0))
|
||||
.attach(Grid::row(4))
|
||||
.build(ctx),
|
||||
)
|
||||
.child(
|
||||
Button::new()
|
||||
.element("button")
|
||||
.class("single_content")
|
||||
.id("add-item-button")
|
||||
.icon(material_font_icons::ADD_FONT_ICON)
|
||||
.on_click(move |states, _| {
|
||||
state(id, states).action(Action::AddItem);
|
||||
true
|
||||
})
|
||||
.min_width(0.0)
|
||||
.attach(Grid::column(2))
|
||||
.attach(Grid::row(4))
|
||||
.build(ctx),
|
||||
)
|
||||
.child(
|
||||
ListView::new()
|
||||
.attach(Grid::column(0))
|
||||
.attach(Grid::column_span(3))
|
||||
.attach(Grid::row(5))
|
||||
.selected_indices(id)
|
||||
.margin((0.0, 16.0, 0.0, 8.0))
|
||||
.items_builder(move |bc, index| {
|
||||
let text = bc
|
||||
.get_widget(id)
|
||||
.get::<Vec<String>>("selection_list")[index]
|
||||
.clone();
|
||||
TextBlock::new()
|
||||
.margin((0.0, 0.0, 0.0, 2.0))
|
||||
.v_align("center")
|
||||
.text(text)
|
||||
.build(bc)
|
||||
})
|
||||
.count(("selection_list_count", id))
|
||||
.build(ctx),
|
||||
)
|
||||
.child(
|
||||
// todo: wrong text width????
|
||||
TextBlock::new()
|
||||
.element("text-block")
|
||||
.id("selection")
|
||||
.max_width(120.0)
|
||||
.attach(Grid::column(0))
|
||||
.attach(Grid::column_span(3))
|
||||
.attach(Grid::row(6))
|
||||
.text("Selected:")
|
||||
.build(ctx),
|
||||
)
|
||||
.build(ctx),
|
||||
)
|
||||
.build(ctx),
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
fn main() {
|
||||
// use this only if you want to run it as web application.
|
||||
//orbtk::initialize();
|
||||
|
||||
Application::new()
|
||||
.window(|ctx| {
|
||||
Window::new()
|
||||
.title("OrbTk - widgets example")
|
||||
.position((100.0, 100.0))
|
||||
.size(468.0, 730.0)
|
||||
.resizeable(true)
|
||||
.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)
|
||||
}
|
||||
@@ -1 +0,0 @@
|
||||
../../../backend/data/POLLFNR_WOECHENTLICH.txt
|
||||
@@ -1,98 +0,0 @@
|
||||
{
|
||||
"err.lang.not_found": {
|
||||
"de_DE.UTF-8": "Konnte die Umgebungsvarialbe LANG nicht auslesen",
|
||||
"de": "Konnte die Umgebungsvarialbe LANG nicht auslesen",
|
||||
"en": "Couldn't read LANG"
|
||||
},
|
||||
"err.user.not_found": {
|
||||
"fr": "Utilisateur introuvable: $email, $id",
|
||||
"de-DE.UTF-8": "Anwender nicht gefunden: $email, $id",
|
||||
"de": "Anwender nicht gefunden: $email, $id",
|
||||
"en": "User not found: $email, $id"
|
||||
},
|
||||
"main.started": {
|
||||
"de_DE.UTF-8": "Programmlogik starten",
|
||||
"de": "Programmlogik starten",
|
||||
"en": "Program logic started"
|
||||
},
|
||||
"main.finished": {
|
||||
"de_DE.UTF-8": "Programmlogik beendet",
|
||||
"de": "Programmlogik beendet",
|
||||
"en": "Program logic finished"
|
||||
},
|
||||
"parse.arguments": {
|
||||
"de_DE.UTF-8": "Programmargumente prüfen",
|
||||
"de": "Programmargumente prüfen",
|
||||
"en": "Parsing arguments"
|
||||
},
|
||||
"parse.environment": {
|
||||
"de_DE.UTF-8": "Umgebungsvariablen prüfen",
|
||||
"de": "Umgebungsvariablen prüfen",
|
||||
"en": "Parsing environment"
|
||||
},
|
||||
"parse.results": {
|
||||
"de_DE.UTF-8": "Ergebnisse der Konfigurations-Parameterprüfung",
|
||||
"de": "Ergebnisse der Konfigurationsparameterprüfung",
|
||||
"en": "Config parsing results"
|
||||
},
|
||||
"config.name": {
|
||||
"de_DE.UTF-8": "Konfigurationswert für",
|
||||
"de": "Konfigurationswert für",
|
||||
"en": "Config Value for"
|
||||
},
|
||||
"config.name.lang": {
|
||||
"de_DE.UTF-8": "Sprach-Code",
|
||||
"de": "Sprach-Code",
|
||||
"en": "Language code"
|
||||
},
|
||||
"config.name.verbositylevel": {
|
||||
"de_DE.UTF-8": "Ausgabe-Ebene",
|
||||
"de": "Ausgabe-Ebene",
|
||||
"en": "verbosity level"
|
||||
},
|
||||
"config.name.environment": {
|
||||
"de_DE.UTF-8": "Umgebungsvariablen",
|
||||
"de": "Umgebungsvariablen",
|
||||
"en": "environment"
|
||||
},
|
||||
"config.name.configfile": {
|
||||
"de_DE.UTF-8": "Konfigurations-Datei",
|
||||
"de": "Konfigurations-Datei",
|
||||
"en": "config file"
|
||||
},
|
||||
"config.name.dbdriver": {
|
||||
"de_DE.UTF-8": "Datenbank-Treiber",
|
||||
"de": "Datenbank-Treiber",
|
||||
"en": "database driver"
|
||||
},
|
||||
"csv_import.started": {
|
||||
"de_DE.UTF-8": "importieren von einer csv-datei gestartet",
|
||||
"de": "importieren von einer csv-datei gestartet",
|
||||
"en": "import from a csv-file started"
|
||||
},
|
||||
"csv_import.finished": {
|
||||
"de_DE.UTF-8": "importieren von einer csv-datei beendet",
|
||||
"de": "importieren von einer csv-datei beendet",
|
||||
"en": "import from a csv-file finished"
|
||||
},
|
||||
"csv_export.started": {
|
||||
"de_DE.UTF-8": "exportieren in eine csv-datei gestartet",
|
||||
"de": "exportieren in eine csv-datei gestartet",
|
||||
"en": "export to csv-file started"
|
||||
},
|
||||
"csv_export.finished": {
|
||||
"de_DE.UTF-8": "exportieren in eine csv-datei beendet",
|
||||
"de": "exportieren in eine csv-datei beendet",
|
||||
"en": "export to csv-file finished"
|
||||
},
|
||||
"state.started": {
|
||||
"de_DE.UTF-8": "gestartet",
|
||||
"de": "gestartet",
|
||||
"en": "started"
|
||||
},
|
||||
"state.finished": {
|
||||
"de_DE.UTF-8": "beendet",
|
||||
"de": "beended",
|
||||
"en": "finished"
|
||||
}
|
||||
}
|
||||
@@ -1,242 +0,0 @@
|
||||
/*
|
||||
* advotracker - Hotline tackingtool for Advocats
|
||||
*
|
||||
* Copyright 2020 Ralf Zerres <ralf.zerres@networkx.de>
|
||||
* SPDX-License-Identifier: (0BSD or MIT)
|
||||
*/
|
||||
|
||||
use chrono::{Local, DateTime};
|
||||
use locales::t;
|
||||
use serde::Deserialize;
|
||||
use std::env;
|
||||
use std::{error::Error, process};
|
||||
use tracing::{debug, trace, Level};
|
||||
|
||||
//use crate::db::data::CsvImportRecord;
|
||||
|
||||
// include modules
|
||||
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,
|
||||
}
|
||||
|
||||
#[derive(Debug, Deserialize)]
|
||||
pub struct CsvImportRecord {
|
||||
// dion => Allianz Dion: 1-9
|
||||
// policy_code => Policy Typ: "AS"
|
||||
// policy_number => Versicherungsscheinnummer: "1515735810"
|
||||
pub dion: String,
|
||||
pub policy_code: String,
|
||||
pub policy_number: String,
|
||||
}
|
||||
|
||||
#[derive(Default, Debug, Deserialize)]
|
||||
pub struct RecordList {
|
||||
records: Vec<CsvImportRecord>
|
||||
}
|
||||
|
||||
/// 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<(), 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);
|
||||
trace!(target: "csv-test", process = ?res, state = ?state);
|
||||
|
||||
// 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
|
||||
let file = File::open(path)?;
|
||||
|
||||
trace!(target: "csv-export", extension = ?path.extension(), file = ?file);
|
||||
state = t!("state.finished", lang);
|
||||
res = t!("csv_import.finished", lang);
|
||||
trace!(target: "csv-test", process = ?res, state = ?state);
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
/// import from csv format
|
||||
/// https://docs.rs/csv/1.1.3/csv/cookbook/index.html
|
||||
/// https://blog.burntsushi.net/csv/
|
||||
fn import(p: &mut String, lang: &String) -> Result<u32, 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, 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: "csv-test", 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: "csv-test", extension = ?extension, file = ?file);
|
||||
|
||||
// Build the CSV reader and iterate over each record.
|
||||
let mut csv_reader = csv::ReaderBuilder::new()
|
||||
.has_headers(false)
|
||||
.delimiter(b' ')
|
||||
.comment(Some(b'#'))
|
||||
//.has_headers(true)
|
||||
//.from_reader(io::stdin());
|
||||
//.from_path(path);
|
||||
.from_reader(file);
|
||||
{
|
||||
// We nest this call in its own scope because of lifetimes.
|
||||
let headers = csv_reader.headers()?;
|
||||
trace!(target: "csv-test", header = ?headers);
|
||||
}
|
||||
//for result in csv_reader.records() {
|
||||
let mut count = 0;
|
||||
for result in csv_reader.deserialize() {
|
||||
// The iterator yields Result<StringRecord, Error>, so we check the
|
||||
// error here.
|
||||
//let record = result?;
|
||||
let _record: CsvImportRecord = result?;
|
||||
//println!("{:?}", record);
|
||||
count +=1;
|
||||
}
|
||||
|
||||
let dt_end: DateTime<Local> = Local::now();
|
||||
let duration = dt_end.signed_duration_since(dt_start);
|
||||
println!("Duration: {:#?}", duration);
|
||||
//let seconds = duration.secs;
|
||||
//println!("Seconds: {:#?}", seconds);
|
||||
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, date_stop = ?dt_end.to_string());
|
||||
|
||||
//Ok(count, duration.seconds())
|
||||
Ok(count)
|
||||
}
|
||||
|
||||
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;
|
||||
|
||||
//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, "csv-test");
|
||||
let _enter = span.enter();
|
||||
let subscriber = fmt::Subscriber::builder()
|
||||
.with_env_filter("trace")
|
||||
//.with_max_level(tracing::Level::DEBUG)
|
||||
.finish();
|
||||
|
||||
// initialize logger
|
||||
//env_logger::init();
|
||||
//info!("Commencing the import Test-Run!");
|
||||
|
||||
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);
|
||||
//debug!(message = ?res, state = ?state);
|
||||
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: "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);
|
||||
|
||||
// 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);
|
||||
|
||||
let _ = parse_args(&mut v);
|
||||
state = t!("state.finished", lang);
|
||||
trace!(target: "csv-test", process = ?res, state = ?state);
|
||||
//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);
|
||||
|
||||
// importing policy code elements from csv-file
|
||||
let mut csv_import_path = v.get::<String>("import_file").unwrap();
|
||||
match import(&mut csv_import_path, &lang) {
|
||||
Ok(count) => {
|
||||
println!("Imported {:?} records", count);
|
||||
}
|
||||
Err(err) => {
|
||||
println!("error running Csv-Test: {}", err);
|
||||
process::exit(1);
|
||||
}
|
||||
}
|
||||
|
||||
// export policy code elements to csv-file
|
||||
let mut csv_export_path = v.get::<String>("export_file").unwrap();
|
||||
match export(&mut csv_export_path, &lang) {
|
||||
Ok(count) => {
|
||||
println!("Exported {:?} records", count);
|
||||
}
|
||||
Err(err) => {
|
||||
println!("error running CSV-Export: {}", err);
|
||||
process::exit(1);
|
||||
}
|
||||
}
|
||||
|
||||
state = t!("state.finished", lang);
|
||||
res = t!("main.finished", lang);
|
||||
trace!(target: "csv-test", process = ?res, state = ?state);
|
||||
});
|
||||
|
||||
Ok(())
|
||||
}
|
||||
@@ -1,201 +0,0 @@
|
||||
/// The given Viperus structure will be muted according to the
|
||||
/// processed default, environment and commandline arguments
|
||||
|
||||
// parse CLI commandline arguments with clap
|
||||
use clap::{crate_authors, crate_description, crate_name, crate_version, App, Arg};
|
||||
|
||||
//use log::{debug, info, trace, warn};
|
||||
use std::env;
|
||||
use tracing::trace;
|
||||
use viperus::Viperus;
|
||||
|
||||
// Parse the commandline arguments and preset default values
|
||||
// Precedence: defaults -> config-file -> environment -> commandline
|
||||
pub fn parse_args(v: &mut Viperus) -> Result<(), Box<dyn std::error::Error>> {
|
||||
if cfg!(feature = "fmt-clap") {
|
||||
trace!(target: "Viperus", "Viperus feature 'fmt-clap' enabled.");
|
||||
println!("Using feature fmt-clap");
|
||||
}
|
||||
|
||||
// preset default key/value pairs (lowest priority)
|
||||
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("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"));
|
||||
//v.add_default("password", String::from("botpassword"));
|
||||
v.add_default("verbose", 0);
|
||||
|
||||
|
||||
// CLI arguments are defined inline
|
||||
let matches = App::new("csv-test")
|
||||
.name(crate_name!())
|
||||
.version(crate_version!())
|
||||
.author(crate_authors!())
|
||||
.about(crate_description!())
|
||||
.after_help("
|
||||
Testprogramm: Allianz Online-Beratung Im/Export CSV-Daten
|
||||
Direct-Call via IVR-System (Interactive Voice Response)
|
||||
SMR Deckungssummen-Prüfung: 089 92529 60211
|
||||
SMR Unerledigt: 089 92529 60222")
|
||||
.template(
|
||||
"\
|
||||
{bin} v{version}
|
||||
{about}
|
||||
|
||||
{all-args}
|
||||
|
||||
(C) 2020 {author}
|
||||
{after-help}",
|
||||
)
|
||||
.arg(
|
||||
Arg::with_name("configFile")
|
||||
.short("c")
|
||||
.long("configFile")
|
||||
.value_name("FILE")
|
||||
.help("Select a config file")
|
||||
.default_value("csv_import.ron")
|
||||
.takes_value(true),
|
||||
)
|
||||
.arg(
|
||||
Arg::with_name("importFile")
|
||||
.short("i")
|
||||
.long("importFile")
|
||||
.help("Select source file for the csv-import")
|
||||
.default_value("POLLFNR_WOECHENTLICH.txt")
|
||||
.takes_value(true),
|
||||
)
|
||||
.arg(
|
||||
Arg::with_name("exportFile")
|
||||
.short("e")
|
||||
.long("exportFile")
|
||||
.help("Select target file for the csv-export")
|
||||
.default_value("RA-Hiedemann_DirectCall.txt")
|
||||
.takes_value(true),
|
||||
)
|
||||
.arg(
|
||||
Arg::with_name("toEmailAddress")
|
||||
.short("t")
|
||||
.long("toEmailAddress")
|
||||
.help("Select the target email-address (To:)")
|
||||
.default_value("Allianz RA-Hotline <smr-rahotline@allianz.de>")
|
||||
.takes_value(true),
|
||||
)
|
||||
.arg(
|
||||
Arg::with_name("fromEmailAddress")
|
||||
.short("f")
|
||||
.long("fromEmailAddress")
|
||||
.help("Select the sender email-address (From:)")
|
||||
.default_value("Allianz-Hotline RA-Hiedemann <azhotline@hiedemann.de>")
|
||||
.takes_value(true),
|
||||
)
|
||||
// .arg(
|
||||
// Arg::with_name("username")
|
||||
// .short("u")
|
||||
// .long("username")
|
||||
// .help("Sets username")
|
||||
// .takes_value(true),
|
||||
// )
|
||||
// .arg(
|
||||
// Arg::with_name("password")
|
||||
// .short("P")
|
||||
// .long("password")
|
||||
// .help("Sets password")
|
||||
// .takes_value(true),
|
||||
// )
|
||||
.arg(
|
||||
Arg::with_name("verbose")
|
||||
.short("v")
|
||||
.long("verbose")
|
||||
.help("Sets verbosity level")
|
||||
.multiple(true),
|
||||
)
|
||||
.get_matches();
|
||||
|
||||
if matches.occurrences_of("verbose") > 0 {
|
||||
// clap is using i64, viperus i32
|
||||
let n = matches.occurrences_of("verbose") as i32;
|
||||
v.add("verbose", n);
|
||||
}
|
||||
|
||||
// preset the prefix for relevant environment variables ("ADVOTRACKER_")
|
||||
let mut env_prefix: String = crate_name!().to_uppercase();
|
||||
env_prefix.push_str("_");
|
||||
v.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
|
||||
if cfg!(feature = "fmt-cache") {
|
||||
v.cache(true);
|
||||
}
|
||||
if cfg!(feature = "fmt-env") {
|
||||
v.automatic_env(true);
|
||||
}
|
||||
|
||||
// load user selected call arguments
|
||||
// -> overwrites values given via environment variables
|
||||
v.load_clap(matches)?;
|
||||
|
||||
// bond the clap names to camel_case rust variable names
|
||||
v.bond_clap("configFile", "config_file");
|
||||
v.bond_clap("importFile", "import_file");
|
||||
v.bond_clap("exportFile", "export_file");
|
||||
v.bond_clap("toEmailAddress", "to_email_address");
|
||||
v.bond_clap("fromEmailAddress", "from_email_address");
|
||||
//v.bond_clap("username", "username");
|
||||
//v.bond_clap("password", "password");
|
||||
v.bond_clap("verbose", "verbose");
|
||||
|
||||
trace!("verbose {:?}", v.get::<i32>("verbose").unwrap());
|
||||
if v.get::<i32>("verbose").unwrap() > 0 {
|
||||
println!(
|
||||
"config_file: {:?}",
|
||||
v.get::<String>("config_file").unwrap_or_default()
|
||||
);
|
||||
println!(
|
||||
"import_file: {:?}",
|
||||
v.get::<String>("import_file").unwrap_or_default()
|
||||
);
|
||||
println!(
|
||||
"export_file: {:?}",
|
||||
v.get::<String>("export_file").unwrap_or_default()
|
||||
);
|
||||
println!(
|
||||
"to_email_address: {:?}",
|
||||
v.get::<String>("to_email_address").unwrap_or_default()
|
||||
);
|
||||
println!(
|
||||
"from_email_address: {:?}",
|
||||
v.get::<String>("from_email_address").unwrap_or_default()
|
||||
);
|
||||
// println!(
|
||||
// "username: {:?}",
|
||||
// v.get::<String>("username").unwrap_or_default()
|
||||
// );
|
||||
// println!(
|
||||
// "password: {:?}",
|
||||
// v.get::<String>("password").unwrap_or_default()
|
||||
// ); // only for testing now
|
||||
|
||||
println!(
|
||||
"verbosity level: {:?}",
|
||||
v.get::<i32>("verbose").unwrap_or_default()
|
||||
);
|
||||
}
|
||||
|
||||
if v.get::<i32>("verbose").unwrap() > 1 {
|
||||
println!("\nEnvironment:");
|
||||
for (key, value) in env::vars() {
|
||||
println!("{}={}", key, value);
|
||||
}
|
||||
}
|
||||
|
||||
Ok(())
|
||||
}
|
||||
@@ -1,37 +0,0 @@
|
||||
extern crate pdf_extract;
|
||||
extern crate lopdf;
|
||||
|
||||
use std::env;
|
||||
use std::path::PathBuf;
|
||||
use std::path;
|
||||
use std::io::BufWriter;
|
||||
use std::fs::File;
|
||||
use pdf_extract::*;
|
||||
use lopdf::*;
|
||||
|
||||
fn main() {
|
||||
//let output_kind = "html";
|
||||
//let output_kind = "txt";
|
||||
//let output_kind = "svg";
|
||||
let file = env::args().nth(1).unwrap();
|
||||
let output_kind = env::args().nth(2).unwrap_or_else(|| "txt".to_owned());
|
||||
println!("{}", file);
|
||||
let path = path::Path::new(&file);
|
||||
let filename = path.file_name().expect("expected a filename");
|
||||
let mut output_file = PathBuf::new();
|
||||
output_file.push(filename);
|
||||
output_file.set_extension(&output_kind);
|
||||
let mut output_file = BufWriter::new(File::create(output_file).expect("could not create output"));
|
||||
let doc = Document::load(path).unwrap();
|
||||
|
||||
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!(),
|
||||
};
|
||||
|
||||
output_doc(&doc, output.as_mut());
|
||||
}
|
||||
@@ -1,235 +0,0 @@
|
||||
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)
|
||||
}
|
||||
@@ -1,32 +0,0 @@
|
||||
.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;
|
||||
}
|
||||
@@ -1,15 +0,0 @@
|
||||
.header {
|
||||
background: #ffffff;
|
||||
}
|
||||
|
||||
.content {
|
||||
background: #fafafa;
|
||||
}
|
||||
|
||||
text_box {
|
||||
color: #4d4c4c;
|
||||
}
|
||||
|
||||
text-block {
|
||||
color: #4d4c4c;
|
||||
}
|
||||
@@ -1,581 +0,0 @@
|
||||
<!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>
|
||||
|
||||
@@ -1,581 +0,0 @@
|
||||
<!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>
|
||||
|
||||
@@ -1,581 +0,0 @@
|
||||
<!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>
|
||||
|
||||
@@ -1,25 +0,0 @@
|
||||
* {
|
||||
font-size: 24;
|
||||
}
|
||||
|
||||
lynch {
|
||||
background: #647b91;
|
||||
}
|
||||
|
||||
bluebayoux {
|
||||
background: #516475;
|
||||
}
|
||||
|
||||
linkwater {
|
||||
background: #dfebf5;
|
||||
color: #3b434a;
|
||||
}
|
||||
|
||||
light-text {
|
||||
color: #dfebf5;
|
||||
}
|
||||
|
||||
goldendream {
|
||||
background: #efd035;
|
||||
color: #3b434a;
|
||||
}
|
||||
|
Before Width: | Height: | Size: 220 B |
|
Before Width: | Height: | Size: 123 B |
|
Before Width: | Height: | Size: 123 B |
|
Before Width: | Height: | Size: 289 B |
|
Before Width: | Height: | Size: 126 B |
|
Before Width: | Height: | Size: 158 B |
|
Before Width: | Height: | Size: 351 B |
|
Before Width: | Height: | Size: 130 B |
|
Before Width: | Height: | Size: 193 B |
|
Before Width: | Height: | Size: 452 B |
|
Before Width: | Height: | Size: 131 B |
|
Before Width: | Height: | Size: 223 B |
@@ -1,24 +0,0 @@
|
||||
[Icon Theme]
|
||||
Name=AdvoTracker
|
||||
Comment=AdvoTracker Icon Theme
|
||||
|
||||
Directories=20x20,20x20@2,20x20@3,20x20@4
|
||||
|
||||
[20x20]
|
||||
Size=20
|
||||
Type=Fixed
|
||||
|
||||
[20x20@2]
|
||||
Size=20
|
||||
Scale=2
|
||||
Type=Fixed
|
||||
|
||||
[20x20@3]
|
||||
Size=20
|
||||
Scale=3
|
||||
Type=Fixed
|
||||
|
||||
[20x20@4]
|
||||
Size=20
|
||||
Scale=4
|
||||
Type=Fixed
|
||||
|
Before Width: | Height: | Size: 53 KiB |
|
Before Width: | Height: | Size: 3.0 KiB |
|
Before Width: | Height: | Size: 3.2 KiB |
|
Before Width: | Height: | Size: 3.3 KiB |
|
Before Width: | Height: | Size: 3.5 KiB |
|
Before Width: | Height: | Size: 768 B |
|
Before Width: | Height: | Size: 1.3 KiB |
|
Before Width: | Height: | Size: 1.8 KiB |
|
Before Width: | Height: | Size: 2.7 KiB |
|
Before Width: | Height: | Size: 455 KiB |
|
Before Width: | Height: | Size: 53 KiB |
|
Before Width: | Height: | Size: 53 KiB |
@@ -1 +0,0 @@
|
||||
hiedemann_logo.png
|
||||
|
Before Width: | Height: | Size: 7.0 KiB |
|
Before Width: | Height: | Size: 71 KiB |
|
Before Width: | Height: | Size: 12 KiB |
|
Before Width: | Height: | Size: 1.3 KiB |
|
Before Width: | Height: | Size: 237 KiB |
|
Before Width: | Height: | Size: 17 KiB |
|
Before Width: | Height: | Size: 5.5 KiB |
|
Before Width: | Height: | Size: 237 KiB |
@@ -1,25 +0,0 @@
|
||||
* {
|
||||
font-size: 24;
|
||||
}
|
||||
|
||||
lynch {
|
||||
background: #647b91;
|
||||
}
|
||||
|
||||
bluebayoux {
|
||||
background: #516475;
|
||||
}
|
||||
|
||||
linkwater {
|
||||
background: #dfebf5;
|
||||
color: #3b434a;
|
||||
}
|
||||
|
||||
light-text {
|
||||
color: #dfebf5;
|
||||
}
|
||||
|
||||
goldendream {
|
||||
background: #efd035;
|
||||
color: #3b434a;
|
||||
}
|
||||
@@ -1,32 +0,0 @@
|
||||
.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;
|
||||
}
|
||||
@@ -1,23 +0,0 @@
|
||||
* {
|
||||
font-size: 16;
|
||||
}
|
||||
|
||||
.header {
|
||||
background: #ffffff;
|
||||
}
|
||||
|
||||
.content {
|
||||
background: #fafafa;
|
||||
}
|
||||
|
||||
text-box {
|
||||
color: #4d4c4c;
|
||||
}
|
||||
|
||||
text-block {
|
||||
color: #4d4c4c;
|
||||
}
|
||||
|
||||
light-text {
|
||||
color: #dfebf5;
|
||||
}
|
||||
@@ -1,217 +0,0 @@
|
||||
.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 */
|
||||
@@ -1,217 +0,0 @@
|
||||
.myheader {
|
||||
font-size: 36;
|
||||
}
|
||||
|
||||
/* 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 */
|
||||
@@ -1,55 +0,0 @@
|
||||
* {
|
||||
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;
|
||||
}
|
||||
@@ -1,53 +0,0 @@
|
||||
* {
|
||||
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 */
|
||||
@@ -1,48 +0,0 @@
|
||||
.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 */
|
||||
@@ -1,91 +0,0 @@
|
||||
.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;
|
||||
}
|
||||
@@ -1,43 +0,0 @@
|
||||
use orbtk::prelude::*;
|
||||
|
||||
use crate::{data::PolicyList, keys::*};
|
||||
|
||||
/// Provides generic methods to handle states of datatypes (e.g. used in `PolicyList`).
|
||||
pub trait BaseState {
|
||||
/// 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 data.
|
||||
fn save(&self, registry: &mut Registry, ctx: &mut Context) {
|
||||
registry
|
||||
.get::<Settings>("settings")
|
||||
.save(
|
||||
PROP_POLICY_LIST,
|
||||
ctx.widget().get::<PolicyList>(PROP_POLICY_LIST),
|
||||
)
|
||||
.unwrap();
|
||||
}
|
||||
}
|
||||
@@ -1,233 +0,0 @@
|
||||
use orbtk::prelude::*;
|
||||
|
||||
use chrono::NaiveDateTime;
|
||||
use serde::{Deserialize, Serialize};
|
||||
|
||||
/// An enumeration of valid policy codes
|
||||
/// right now, only "AS" is used
|
||||
#[derive(Debug, Clone, Deserialize, Serialize)]
|
||||
pub enum PolicyCode {
|
||||
AS
|
||||
}
|
||||
|
||||
impl Default for PolicyCode {
|
||||
fn default() -> Self { PolicyCode::AS }
|
||||
}
|
||||
|
||||
/// Status of a given policy data element (eg: active / inactive)
|
||||
#[derive(Debug, Clone, Deserialize, Serialize)]
|
||||
pub enum Status {
|
||||
Active,
|
||||
Inactive
|
||||
}
|
||||
|
||||
impl Default for Status {
|
||||
fn default() -> Self { Status::Active }
|
||||
}
|
||||
|
||||
/// A communication type describes possible classifications of customer calls.
|
||||
/// If not selected, the default will be 'unclassified'.
|
||||
#[derive(Default, Debug, Clone, Deserialize, Serialize)]
|
||||
pub struct CommunicationType {
|
||||
// Unfall, Bußgeldbescheid, Anhörung, Unfallflucht, Kaufvertrag,
|
||||
// Vodafone, Kündigung, Lohn, Zeugnis, Nachbar, Vermieter, Rente, GdB, Verwaltungsrecht, Unterhalt, Geburt, Hochzeit
|
||||
pub communication_id: String,
|
||||
pub communication_name: String,
|
||||
}
|
||||
|
||||
/// CSV Export
|
||||
/// The structure elements are required for an export to a comma seperated text list.
|
||||
#[derive(Default, Debug, Clone, Deserialize, Serialize)]
|
||||
pub struct CsvExportRecord {
|
||||
// policy_code => Versicherungsscheinnummer: "AS1234567890"
|
||||
// policy_holder => Anrufer: "Vorname, Nachname"
|
||||
// facts => Sachverhalt: "Kurzschilderung"
|
||||
// harm_type => Schadensart: "harm_name (harm_id)"
|
||||
// communication_type => Kommunikationszeichen: "(communication_name)"
|
||||
// ra_hotline => RA_Hotline: Kanzlei Laqua, Kanzlei Buschbell, Kanzlei DAH, Kanzlei Hiedemann
|
||||
// ivr_comment => Haftungs-/Deckungskommentar; #IVR (ggf. ergänzt um das Beratungsergebnis)
|
||||
pub policy_code: String,
|
||||
pub policy_number: u32,
|
||||
pub policy_holder: String,
|
||||
pub facts: String,
|
||||
pub harm_type: String,
|
||||
pub communication_name: String,
|
||||
pub ra_hotline: String, // const "Kanzlei Hiedemann",
|
||||
pub ivr_comment: String,
|
||||
}
|
||||
|
||||
/// CSV Import
|
||||
/// The structure elements provided as a comma seperated text list.
|
||||
/// Referenz: ERG.txt -> 'DION VERS POLLFNR'
|
||||
/// '1 AS 1515735810'
|
||||
#[derive(Default, Debug, Clone, Deserialize, Serialize)]
|
||||
pub struct CsvImportRecord {
|
||||
// dion => Allianz Dion: 1
|
||||
// policy_code => Policy Typ: "AS"
|
||||
// policy_number => Versicherungsscheinnummer: "1515735810"
|
||||
pub dion: String,
|
||||
pub policy_code: String,
|
||||
pub policy_number: u32,
|
||||
}
|
||||
|
||||
/// 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 {
|
||||
pub harm_data: Vec<HarmType>,
|
||||
//pub name: String,
|
||||
pub selected: bool
|
||||
}
|
||||
|
||||
/// Harm types are destincted by a type code.
|
||||
/// The type code represents the unique harm identifier, bound with a literal name.
|
||||
#[derive(Default, Debug, Clone, Deserialize, Serialize)]
|
||||
pub struct HarmType {
|
||||
// Schadenersatz-RS im Verkehrsbereich (RS112)
|
||||
// Ordnungswidrigkeits-RS im Verkehrsbereich (RS122)
|
||||
// Straf-RS im Verkehrsbereich (RS121)
|
||||
// Vertrags-RS im Verkehrsbereich (RS118)
|
||||
// Vertrags-RS im Privatbereich (RS218)
|
||||
// Arbeits-RS im Berufsbereich (RS315)
|
||||
// WuG-RS im Privatbereich (RS220)
|
||||
// Sozialgerichts-RS im Privatbereich (RS216)
|
||||
// Rechtsschutz im Familien- und Erbrecht (RS217)
|
||||
// Wagnis nicht versicherbar / versichert (RS999)
|
||||
pub harm_type: String,
|
||||
pub harm_name: String,
|
||||
}
|
||||
|
||||
/// Structure used to verify a policy data element.
|
||||
#[derive(Default, Debug, Clone, Deserialize, Serialize)]
|
||||
pub struct PolicyCheck {
|
||||
pub policy_check_number: String,
|
||||
pub policy_number: String,
|
||||
pub policy_number_valid: bool
|
||||
}
|
||||
|
||||
// #[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)]
|
||||
pub struct PolicyList {
|
||||
pub name: String,
|
||||
pub policy_list: Vec<PolicyDataList>,
|
||||
}
|
||||
|
||||
/// implements helper methods, that manage lists of policy data collections
|
||||
impl PolicyList {
|
||||
pub fn get(&self, index: usize) -> Option<&PolicyDataList> {
|
||||
self.policy_list.get(index)
|
||||
}
|
||||
|
||||
pub fn get_mut(&mut self, index: usize) -> Option<&mut PolicyDataList> {
|
||||
self.policy_list.get_mut(index)
|
||||
}
|
||||
|
||||
pub fn insert_front(&mut self, policy_list: PolicyDataList) {
|
||||
self.policy_list.insert(0, policy_list);
|
||||
}
|
||||
|
||||
pub fn is_empty(&self) -> bool {
|
||||
self.policy_list.is_empty()
|
||||
}
|
||||
|
||||
pub fn len(&self) -> usize {
|
||||
self.policy_list.len()
|
||||
}
|
||||
|
||||
pub fn new(name: impl Into<String>) -> Self {
|
||||
PolicyList {
|
||||
name: name.into(),
|
||||
..Default::default()
|
||||
}
|
||||
}
|
||||
pub fn push(&mut self, policy_list: PolicyDataList) {
|
||||
self.policy_list.push(policy_list);
|
||||
}
|
||||
|
||||
pub fn remove(&mut self, index: usize) -> PolicyDataList {
|
||||
self.policy_list.remove(index)
|
||||
}
|
||||
}
|
||||
|
||||
/// Structure representing a policy data element
|
||||
#[derive(Default, Debug, Clone, Deserialize, Serialize)]
|
||||
pub struct PolicyData {
|
||||
// DION VERS POLLFNR
|
||||
// 1 AS 1515735810
|
||||
// DION: Allianz id => len = 1??
|
||||
// VERS: policy_code => enum(AS; ??)
|
||||
// POLLFNR: policy_number => len = 10
|
||||
pub date_inserted: Option<NaiveDateTime>,
|
||||
pub dion: u8,
|
||||
// is String16 a better default-type?
|
||||
pub policy_code: PolicyCode,
|
||||
pub policy_number: u32,
|
||||
pub status: Status
|
||||
}
|
||||
|
||||
/// Structure collects policy data elements.
|
||||
#[derive(Default, Debug, Clone, Deserialize, Serialize)]
|
||||
pub struct PolicyDataList {
|
||||
pub date_valid_until: Option<NaiveDateTime>,
|
||||
pub policy_data: Vec<PolicyData>,
|
||||
pub name: String,
|
||||
pub selected: bool
|
||||
}
|
||||
|
||||
/// implements the helper methods, to manage policy data collections.
|
||||
impl PolicyDataList {
|
||||
pub fn new(name: impl Into<String>) -> Self {
|
||||
// the new inserted element will be active by default
|
||||
PolicyDataList {
|
||||
date_valid_until: None,
|
||||
name: name.into(),
|
||||
selected: true,
|
||||
..Default::default()
|
||||
}
|
||||
}
|
||||
|
||||
pub fn push(&mut self, policy_data: PolicyData) {
|
||||
self.policy_data.push(policy_data);
|
||||
}
|
||||
|
||||
pub fn insert_front(&mut self, policy_data: PolicyData) {
|
||||
self.policy_data.insert(0, policy_data);
|
||||
}
|
||||
|
||||
pub fn remove(&mut self, index: usize) -> PolicyData {
|
||||
self.policy_data.remove(index)
|
||||
}
|
||||
|
||||
pub fn get(&self, index: usize) -> Option<&PolicyData> {
|
||||
self.policy_data.get(index)
|
||||
}
|
||||
|
||||
pub fn get_mut(&mut self, index: usize) -> Option<&mut PolicyData> {
|
||||
self.policy_data.get_mut(index)
|
||||
}
|
||||
|
||||
pub fn len(&self) -> usize {
|
||||
self.policy_data.len()
|
||||
}
|
||||
|
||||
pub fn is_empty(&self) -> bool {
|
||||
self.policy_data.is_empty()
|
||||
}
|
||||
}
|
||||
|
||||
into_property_source!(PolicyCheck);
|
||||
into_property_source!(PolicyData);
|
||||
into_property_source!(PolicyList);
|
||||
@@ -1,51 +0,0 @@
|
||||
// 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_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_BUTTON: &str = "policy_check_menu_button";
|
||||
pub static ID_POLICY_CHECK_MENU_TEXT_BLOCK: &str = "policy_check_menu_text_block";
|
||||
pub static ID_POLICY_CHECK_RESULT: &str = "policy_check_result";
|
||||
pub static ID_POLICY_CHECK_POLICY_NUMBER: &str = "policy_check_policy_number";
|
||||
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_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";
|
||||
|
||||
// Component Values (Properties)
|
||||
pub static PROP_POLICY_CHECK: &str = "policy_check";
|
||||
pub static PROP_POLICY_CHECK_LIST: &str = "policy_check_list";
|
||||
|
||||
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";
|
||||
@@ -1,60 +0,0 @@
|
||||
use orbtk::prelude::*;
|
||||
use orbtk::theme::DEFAULT_THEME_CSS;
|
||||
//use orbtk::theme::LIGHT_THEME_EXTENSION_CSS;
|
||||
|
||||
// helper modules
|
||||
pub mod base_state;
|
||||
pub mod data;
|
||||
pub mod keys;
|
||||
|
||||
// the frontend
|
||||
pub mod main_view;
|
||||
|
||||
// validation check of a policy data element given by its poliy code
|
||||
pub mod policycheck_view;
|
||||
pub mod policycheck_state;
|
||||
pub mod policycheck_menu;
|
||||
|
||||
// manage list of policy data structures
|
||||
pub mod policylist_view;
|
||||
pub mod policylist_state;
|
||||
|
||||
// manage policy data elements
|
||||
pub mod policydata_view;
|
||||
pub mod policydata_state;
|
||||
|
||||
//#[cfg(feature = "light-theme")]
|
||||
static STYLESHEET: &'static str = include_str!("../resources/stylesheets/advotracker.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() {
|
||||
Application::from_name("rzerres.advotracker")
|
||||
.window(move |ctx| {
|
||||
Window::new()
|
||||
//.title("OrbTk - Policyholder checker example")
|
||||
.title("AdvoTracker - Versicherungsnummern")
|
||||
.position((500.0, 100.0))
|
||||
.size(640.0, 480.0)
|
||||
.min_width(460.0)
|
||||
.min_height(180.0)
|
||||
.resizeable(true)
|
||||
.theme(get_theme())
|
||||
.child(main_view::MainView::new().build(ctx))
|
||||
.build(ctx)
|
||||
})
|
||||
.run();
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
#[test]
|
||||
fn it_works() {
|
||||
assert_eq!(2 + 2, 4);
|
||||
}
|
||||
}
|
||||
@@ -1,59 +0,0 @@
|
||||
use orbtk::prelude::*;
|
||||
|
||||
use crate::{
|
||||
data::{PolicyCheck, PolicyList, PolicyDataList},
|
||||
policycheck_view::PolicyCheckView,
|
||||
policylist_view::PolicyListView,
|
||||
policydata_view::PolicyDataView
|
||||
};
|
||||
|
||||
// use crate::{
|
||||
// data::{PolicyList, PolicyData},
|
||||
// //policycheck_view::*,
|
||||
// //PolicyCheckView,
|
||||
// //policylist_view::*,
|
||||
// //PolicyListView,
|
||||
// //policydata_view::*,
|
||||
// //PolicyDataList
|
||||
// };
|
||||
|
||||
widget!(MainView {
|
||||
policy_list_count: usize,
|
||||
policy_list: PolicyList,
|
||||
policy_data_list: PolicyDataList,
|
||||
policycheck_view: u32,
|
||||
policylist_view: u32,
|
||||
policydata_view: u32
|
||||
});
|
||||
|
||||
impl Template for MainView {
|
||||
fn template(self, id: Entity, ctx: &mut BuildContext) -> Self {
|
||||
let policycheck_view = PolicyCheckView::new()
|
||||
.policylist_view(id)
|
||||
.build(ctx);
|
||||
|
||||
let policylist_view = PolicyListView::new()
|
||||
.back_entity(policycheck_view.0)
|
||||
.policydata_view(id)
|
||||
.policylist_view(id)
|
||||
.policy_list_count(id)
|
||||
.build(ctx);
|
||||
|
||||
let policydata_view = PolicyDataView::new()
|
||||
.back_entity(policylist_view.0)
|
||||
.policylist_view(id)
|
||||
.visibility("collapsed")
|
||||
.build(ctx);
|
||||
|
||||
self.name("MainView")
|
||||
.policy_list_count(0)
|
||||
.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(policycheck_view)
|
||||
}
|
||||
}
|
||||
@@ -1,72 +0,0 @@
|
||||
use orbtk::prelude::*;
|
||||
//use orbtk::theme::vector_graphics::material_icons_font;
|
||||
|
||||
//use crate::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)
|
||||
)
|
||||
}
|
||||
}
|
||||
@@ -1,178 +0,0 @@
|
||||
use orbtk::prelude::*;
|
||||
|
||||
use crate::{
|
||||
base_state::BaseState,
|
||||
data::{PolicyData, PolicyDataList},
|
||||
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),
|
||||
TextChanged(Entity, usize),
|
||||
}
|
||||
|
||||
/// Handles the requests of the `PolicyCheckView`.
|
||||
#[derive(Default, AsAny)]
|
||||
pub struct PolicyCheckState {
|
||||
action:Option<Action>,
|
||||
last_focused: Option<Entity>,
|
||||
pub text_box: Entity,
|
||||
menu_button: Entity,
|
||||
policy_number_valid: bool,
|
||||
}
|
||||
|
||||
impl BaseState for PolicyCheckState {}
|
||||
|
||||
impl PolicyCheckState {
|
||||
/// Sets a new action.
|
||||
pub fn action(&mut self, action: Action) {
|
||||
self.action = action.into();
|
||||
}
|
||||
|
||||
/// 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(&self, text_box: Entity, ctx: &mut Context) {
|
||||
// Old style
|
||||
//let length = ctx.get_widget(text_box).get::<String>("policy_number").len();
|
||||
// New style
|
||||
let mut text_box = TextBox::get(ctx.get_widget(text_box));
|
||||
let policy_number = text_box.text_mut();
|
||||
|
||||
println!("parsing policy Number: {}", policy_number);
|
||||
|
||||
// Parse policy code: "AS-123456789"
|
||||
// DION VERS POLLFNR
|
||||
// 1 AS 1515735810
|
||||
let policy_number_length = policy_number.len();
|
||||
if policy_number_length == 10 {
|
||||
println!("Verify {} ...", policy_number);
|
||||
// check against hash-table
|
||||
//ctx.get_widget(text_box).set("policy_number_valid", true);
|
||||
//TextBox::get(ctx.child("text_box")).set_foreground(colors::LINK_WATER_COLOR);
|
||||
}
|
||||
if policy_number_length < 10 {
|
||||
println!("Policy number is to short!");
|
||||
//TextBox::get(ctx.child("text_box")).set_foreground("#ffffff");
|
||||
//TextBox::get(ctx.child("text_box")).set_background("#5b0f22");
|
||||
}
|
||||
if policy_number_length > 10 {
|
||||
println!("Policy number is to big!");
|
||||
//TextBox::get(ctx.child("text_box")).set_foreground("#ffffff");
|
||||
//TextBox::get(ctx.child("text_box")).set_background("#5b0f22");
|
||||
}
|
||||
|
||||
// if let policy_number = text_box.text() {
|
||||
// match policy_number {
|
||||
// _ => {
|
||||
// println!("policynumber: {} is valid!", policy_number);
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
}
|
||||
|
||||
/// If TextBox 'policy_number' is empty, disable button "check"
|
||||
/// otherwise enabled it.
|
||||
fn set_check_button(&self, text_box: Entity, ctx: &mut Context) {
|
||||
if ctx.get_widget(text_box).get::<String>("policy_number_check").is_empty() {
|
||||
ctx.get_widget(self.text_box).set("enabled", false);
|
||||
} else {
|
||||
ctx.get_widget(self.text_box).set("enabled", true);
|
||||
}
|
||||
|
||||
ctx.get_widget(self.text_box).update_theme_by_state(true);
|
||||
}
|
||||
|
||||
/// 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::<String>("policy_number").len();
|
||||
ctx.push_event_by_window(FocusEvent::RequestFocus(text_box));
|
||||
}
|
||||
}
|
||||
|
||||
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 child 'Menu button'.");
|
||||
self.text_box = ctx
|
||||
.entity_of_child(ID_POLICY_CHECK_POLICY_NUMBER)
|
||||
.expect("PolicyCheckState.init: Can't find child 'Text Box'.");
|
||||
}
|
||||
|
||||
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::ClearEntry(text_box) => {
|
||||
self.clear_entry(text_box, ctx);
|
||||
}
|
||||
Action::InputTextChanged(text_box) => {
|
||||
self.set_check_button(text_box, ctx);
|
||||
}
|
||||
Action::OpenMenu(text_block) => {
|
||||
self.open_menu(text_block, ctx);
|
||||
}
|
||||
Action::ParseEntry(text_box) => {
|
||||
self.parse_entry(text_box, ctx);
|
||||
}
|
||||
Action::RemoveFocus(text_box) => {
|
||||
ctx.get_widget(text_box).set("enabled", false);
|
||||
ctx.push_event_by_window(FocusEvent::RemoveFocus(text_box));
|
||||
}
|
||||
Action::SetEntry(text_box) => {
|
||||
self.last_focused = Some(text_box);
|
||||
self.set_entry(text_box, ctx);
|
||||
}
|
||||
Action::TextChanged(entity, _index) => {
|
||||
self.set_entry(entity, ctx);
|
||||
}
|
||||
}
|
||||
}
|
||||
self.action = None;
|
||||
}
|
||||
}
|
||||
@@ -1,347 +0,0 @@
|
||||
use orbtk::prelude::*;
|
||||
//use orbtk::theme::vector_graphics::material_icons_font_ttf;
|
||||
|
||||
use crate::{
|
||||
data::PolicyCheck,
|
||||
keys::*,
|
||||
policycheck_state::*,
|
||||
//policycheck_state::{Action, PolicyCheckState},
|
||||
};
|
||||
|
||||
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_list: PolicyCheckList,
|
||||
policy_check_title: String,
|
||||
policy_check_number: String,
|
||||
policy_check_number_valid: bool,
|
||||
policy_check_text_box: String,
|
||||
policy_data_count: u32,
|
||||
policylist_view: u32,
|
||||
title: String
|
||||
}
|
||||
);
|
||||
|
||||
impl Template for PolicyCheckView {
|
||||
fn template(self, id: Entity, ctx: &mut BuildContext)-> Self {
|
||||
// collect the DCES elements of our 'policy check' view
|
||||
// let items_widget = ItemsWidget::new()
|
||||
// .id(ID_POLICY_CHECK_ITEMS_WIDGET)
|
||||
// .v_align("start")
|
||||
// .items_builder(move |ctx, index| {
|
||||
// let mut title = "".to_string();
|
||||
|
||||
// if let Some(policy_check) = ctx
|
||||
// .get_widget(id)
|
||||
// .get::<PolicyCheckList>(PROP_POLICY_CHECK_LIST)
|
||||
// .get(index)
|
||||
// {
|
||||
// title = policy_check.title.clone();
|
||||
// }
|
||||
// })
|
||||
// .count((PROP_POLICY_DATA_COUNT, id))
|
||||
// .build(ctx);
|
||||
|
||||
|
||||
let policycheck_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()
|
||||
.margin((0.0, 0.0, 12.0, 12.0))
|
||||
.icon(material_icons_font_ttf::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_check_text_box = TextBox::new()
|
||||
// .id(ID_POLICY_CHECK_TEXT_BOX)
|
||||
// .attach(Grid::row(4))
|
||||
// .attach(Grid::row(0))
|
||||
// .attach(Grid::column(0))
|
||||
// .v_align("top")
|
||||
// .margin((4.0, 0.0, 0.0, 0.0))
|
||||
// .lost_focus_on_activation(false)
|
||||
// //.text(("policy_number", id))
|
||||
// // .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);
|
||||
|
||||
// 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")
|
||||
.policy_check(PolicyCheck::default())
|
||||
.child(
|
||||
Grid::new()
|
||||
.id(ID_POLICY_CHECK_WIDGET)
|
||||
//.v_align("start")
|
||||
//.h_align("center")
|
||||
.background("#fafafa")
|
||||
.columns(
|
||||
Columns::new()
|
||||
.add(64.0)
|
||||
.add("*")
|
||||
.add(50.0)
|
||||
.build(),
|
||||
)
|
||||
.rows(
|
||||
Rows::new()
|
||||
.add("auto")
|
||||
.add(1.0)
|
||||
.add("*")
|
||||
.add(1.0)
|
||||
.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))
|
||||
.child(
|
||||
Grid::new()
|
||||
.id(ID_POLICY_CHECK_FORM)
|
||||
.columns(
|
||||
Columns::new()
|
||||
.add("5.0")
|
||||
.add("220.0")
|
||||
.add("5.0")
|
||||
.add("100.0")
|
||||
.build(),
|
||||
)
|
||||
.rows(
|
||||
Rows::new()
|
||||
.add("45.0")
|
||||
.add("45.0")
|
||||
.build(),
|
||||
)
|
||||
.child(
|
||||
Stack::new()
|
||||
.attach(Grid::column(1))
|
||||
.attach(Grid::row(0))
|
||||
.margin((16.0, 16.0, 16.0, 16.0))
|
||||
.orientation("vertical")
|
||||
//.v_align("center")
|
||||
.child(
|
||||
TextBlock::new()
|
||||
.id(ID_POLICY_CHECK_LABEL_POLICY_NUMBER)
|
||||
//.class(CLASS_TEXT_BLOCK)
|
||||
.h_align("end")
|
||||
//.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(1))
|
||||
.attach(Grid::row(1))
|
||||
.h_align("end")
|
||||
//.min_width(250.0)
|
||||
//.min_size(120.0, 180.0)
|
||||
.text("Ergebnis:")
|
||||
.text("Result:")
|
||||
.build(ctx),
|
||||
)
|
||||
.build(ctx)
|
||||
)
|
||||
.child(
|
||||
Stack::new()
|
||||
.attach(Grid::column(2))
|
||||
.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")
|
||||
.margin((4.0, 0.0, 0.0, 0.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));
|
||||
// })
|
||||
.build(ctx),
|
||||
)
|
||||
.child(
|
||||
TextBlock::new()
|
||||
.id(ID_POLICY_CHECK_RESULT)
|
||||
.h_align("start")
|
||||
.attach(Grid::column(3))
|
||||
.attach(Grid::row(1))
|
||||
//.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("separator")
|
||||
.attach(Grid::row(3))
|
||||
.attach(Grid::column_span(3))
|
||||
.build(ctx),
|
||||
)
|
||||
// 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(4))
|
||||
.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),
|
||||
|
||||
)
|
||||
|
||||
}
|
||||
}
|
||||
@@ -1,283 +0,0 @@
|
||||
use orbtk::prelude::*;
|
||||
|
||||
use crate::{
|
||||
base_state::BaseState,
|
||||
data::{PolicyCode, PolicyData, PolicyList, Status},
|
||||
keys::*,
|
||||
};
|
||||
use chrono::{Utc, NaiveDateTime};
|
||||
|
||||
/// Actions that can execute on the task view.
|
||||
#[derive(Debug, Clone, Copy)]
|
||||
pub enum Action {
|
||||
InputTextChanged(Entity),
|
||||
NavigateBack(),
|
||||
NewEntry(Entity),
|
||||
RemoveFocus(Entity),
|
||||
RemoveEntry(usize),
|
||||
SetDateInserted(Entity),
|
||||
SetDion(Entity),
|
||||
SetPolicyCode(Entity),
|
||||
SetPolicyNumber(Entity),
|
||||
StatusChanged(Entity, usize),
|
||||
TextChanged(Entity, usize),
|
||||
}
|
||||
|
||||
/// Handles the requests of the `PolicyDataListView`.
|
||||
#[derive(Debug, Default, AsAny)]
|
||||
pub struct PolicyDataState {
|
||||
action:Option<Action>,
|
||||
back_entity: Entity,
|
||||
last_focused: Option<Entity>,
|
||||
policy_data_add_button: Entity,
|
||||
pub policy_data_date_inserted: Entity,
|
||||
pub policy_data_dion: Entity,
|
||||
pub policy_data_policy_code: Entity,
|
||||
pub policy_data_policy_number: Entity,
|
||||
open: bool,
|
||||
}
|
||||
|
||||
/// implement of the BaseState trait for our PolicyDataState type
|
||||
impl BaseState for PolicyDataState {}
|
||||
|
||||
/// implement the PolicyDateState type itself
|
||||
impl PolicyDataState {
|
||||
/// Sets a new action.
|
||||
pub fn action(&mut self, action: Action) {
|
||||
self.action = action.into();
|
||||
}
|
||||
|
||||
/// update number of available policy data entries.
|
||||
fn adjust_count(&self, ctx: &mut Context) {
|
||||
if let Some(index) = ctx.widget().clone::<Option<usize>>("list_index") {
|
||||
if let Some(policy_list) = ctx
|
||||
.widget()
|
||||
.clone::<PolicyList>("policy_list")
|
||||
.get(index)
|
||||
{
|
||||
ctx.widget().set("policy_data_count", policy_list.len());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// 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) {
|
||||
if ctx.get_widget(text_box).get::<String16>("name").is_empty() {
|
||||
ctx.get_widget(self.policy_data_add_button).set("enabled", false);
|
||||
} else {
|
||||
ctx.get_widget(self.policy_data_add_button).set("enabled", true);
|
||||
}
|
||||
|
||||
ctx.get_widget(self.policy_data_add_button).update_theme_by_state(true);
|
||||
}
|
||||
|
||||
/// Change status of given text box to edit mode.
|
||||
fn edit_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));
|
||||
}
|
||||
|
||||
/// navigate to previous policy data entry.
|
||||
fn navigate_back(&mut self, ctx: &mut Context) {
|
||||
ctx.get_widget(self.text_box)
|
||||
.set("name", String16::from(""));
|
||||
self.open = false;
|
||||
ctx.widget().set::<Option<usize>>("list_index", None);
|
||||
ctx.widget().set("policy_data_count", 0 as usize);
|
||||
self.navigate(self.back_entity, ctx);
|
||||
}
|
||||
|
||||
/// create a new policy data member
|
||||
fn new_entry(&self, policy_number: u32, registry: &mut Registry, ctx: &mut Context) {
|
||||
let index = ctx.widget().clone::<Option<usize>>("list_index");
|
||||
|
||||
if let Some(index) = index {
|
||||
if let Some(policy_data) = ctx
|
||||
.widget()
|
||||
.get_mut::<PolicyList>("policy_list")
|
||||
.get_mut(index)
|
||||
{
|
||||
policy_data.push(PolicyData {
|
||||
date_inserted: Some(Utc::now().naive_utc()),
|
||||
dion: 1,
|
||||
policy_code: PolicyCode::AS,
|
||||
policy_number,
|
||||
status: Status::Active,
|
||||
});
|
||||
}
|
||||
|
||||
self.adjust_count(ctx);
|
||||
}
|
||||
|
||||
self.save(registry, ctx);
|
||||
}
|
||||
|
||||
pub fn open(&mut self, ctx: &mut Context) {
|
||||
if let Some(index) = ctx.widget().clone::<Option<usize>>("list_index") {
|
||||
let mut name: String16 = "".into();
|
||||
let mut policy_data_count = 0;
|
||||
if let Some(policy_list) = ctx.widget().get::<PolicyList>("policy_list").get(index) {
|
||||
name = String16::from(policy_list.name.as_str());
|
||||
policy_data_count = policy_list.len();
|
||||
}
|
||||
ctx.widget().set("name", name);
|
||||
ctx.widget().set("policy_data_count", policy_data_count);
|
||||
self.open = true;
|
||||
}
|
||||
}
|
||||
|
||||
fn remove_entry(&self, index: usize, registry: &mut Registry, ctx: &mut Context) {
|
||||
if let Some(idx) = ctx.widget().clone::<Option<usize>>("list_index") {
|
||||
if let Some(policy_list) = ctx
|
||||
.widget()
|
||||
.get_mut::<PolicyList>("policy_list")
|
||||
.get_mut(idx)
|
||||
{
|
||||
policy_list.remove(index);
|
||||
}
|
||||
}
|
||||
self.adjust_count(ctx);
|
||||
self.save(registry, ctx);
|
||||
}
|
||||
|
||||
/// Toggle the selection state of the given policy number element
|
||||
fn toggle_status(
|
||||
&self,
|
||||
entry: Entity,
|
||||
index: usize,
|
||||
registry: &mut Registry,
|
||||
ctx: &mut Context,
|
||||
) {
|
||||
let invalid: bool = *ctx.get_widget(entry).get("status");
|
||||
|
||||
if let Some(idx) = ctx.widget().clone::<Option<usize>>("list_index") {
|
||||
if let Some(policy_data) = ctx
|
||||
.widget()
|
||||
.get_mut::<PolicyList>("policy_list")
|
||||
.get_mut(idx)
|
||||
{
|
||||
if let Some(policy_data) = policy_data.get_mut(index) {
|
||||
policy_data.status = Status::Active;
|
||||
}
|
||||
}
|
||||
}
|
||||
self.save(registry, ctx);
|
||||
}
|
||||
|
||||
fn update_entry(
|
||||
&self,
|
||||
policy_data_date_inserted: Entity,
|
||||
policy_data_dion: Entity,
|
||||
policy_data_policy_code: Entity,
|
||||
policy_data_policy_number: Entity,
|
||||
index: usize,
|
||||
registry: &mut Registry,
|
||||
ctx: &mut Context,
|
||||
) {
|
||||
let date_inserted: Option<NaiveDateTime> = ctx.get_widget(policy_data_date_inserted).clone("date_inserted");
|
||||
let dion: u8 = ctx.get_widget(policy_data_dion).clone("dion");
|
||||
let policy_code: PolicyCode = ctx.get_widget(policy_data_policy_code).clone("policy_code");
|
||||
let policy_number: u32 = ctx.get_widget(policy_data_policy_number).clone("policy_number");
|
||||
|
||||
// get the index from the active widgets 'list_index' member
|
||||
if let Some(idx) = ctx.widget().clone::<Option<usize>>("list_index") {
|
||||
// get view record from the active widgets 'policy_list' member
|
||||
if let Some(policy_list) = ctx
|
||||
.widget()
|
||||
.get_mut::<PolicyList>("policy_list")
|
||||
.get_mut(idx)
|
||||
{
|
||||
// update the record data using the view values of the active policy_list member
|
||||
if let Some(policy_data) = policy_list.get_mut(index) {
|
||||
policy_data.date_inserted = date_inserted;
|
||||
policy_data.dion = dion;
|
||||
policy_data.policy_code = policy_code;
|
||||
policy_data.policy_number = policy_number;
|
||||
}
|
||||
}
|
||||
}
|
||||
self.save(registry, ctx);
|
||||
}
|
||||
}
|
||||
|
||||
impl State for PolicyDataState {
|
||||
fn init(&mut self, _: &mut Registry, ctx: &mut Context) {
|
||||
self.back_entity = (*ctx.widget().get::<u32>("back_entity")).into();
|
||||
self.policy_data_add_button = ctx
|
||||
.entity_of_child(ID_POLICY_DATA_ADD_BUTTON)
|
||||
.expect("PolicyState.init: Can't find child 'Add button'.");
|
||||
self.policy_data_policy_number = ctx
|
||||
.entity_of_child(ID_POLICY_DATA_POLICY_NUMBER)
|
||||
.expect("PolicyState.init: Can't find child 'Policy Number'.");
|
||||
}
|
||||
|
||||
fn update(&mut self, registry: &mut Registry, ctx: &mut Context) {
|
||||
if !self.open {
|
||||
self.open(ctx);
|
||||
}
|
||||
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(text) = self.fetch_text(ctx, entity) {
|
||||
self.new_entry(text, registry, ctx);
|
||||
}
|
||||
}
|
||||
Action::RemoveEntry(index) => {
|
||||
self.remove_entry(index, registry, ctx);
|
||||
}
|
||||
Action::SelectionChanged(entity, index) => {
|
||||
self.toggle_selection(entity, index, registry, ctx);
|
||||
}
|
||||
Action::TextChanged(entity, index) => {
|
||||
self.update_entry(entity, index, registry, ctx);
|
||||
}
|
||||
Action::SetDateInserted(policy_data_date_inserted) => {
|
||||
self.last_focused = Some(policy_data_date_inserted);
|
||||
self.edit_entry(policy_data_date_inserted, ctx);
|
||||
}
|
||||
Action::SetDion(policy_data_dion) => {
|
||||
self.last_focused = Some(policy_data_dion);
|
||||
self.edit_entry(policy_data_policy_dion);
|
||||
}
|
||||
Action::SetPolicyCode(policy_data_policy_code) => {
|
||||
self.last_focused = Some(policy_data_policy_code);
|
||||
self.edit_entry(policy_data_policy_code, ctx);
|
||||
}
|
||||
Action::SetPolicyNumber(policy_data_policy_number) => {
|
||||
self.last_focused = Some(policy_data_policy_number);
|
||||
self.edit_entry(policy_data_policy_number, ctx);
|
||||
}
|
||||
Action::RemoveFocus(text_box) => {
|
||||
ctx.get_widget(text_box).set("enabled", false);
|
||||
ctx.push_event_by_window(FocusEvent::RemoveFocus(text_box));
|
||||
}
|
||||
Action::NavigateBack() => {
|
||||
self.navigate_back(ctx);
|
||||
}
|
||||
}
|
||||
}
|
||||
self.action = None;
|
||||
}
|
||||
}
|
||||
@@ -1,387 +0,0 @@
|
||||
use orbtk::prelude::*;
|
||||
|
||||
use crate::{
|
||||
data::{PolicyList, Status},
|
||||
keys::*,
|
||||
policydata_state::{Action, PolicyDataState},
|
||||
};
|
||||
use chrono::NaiveDateTime;
|
||||
|
||||
type ListIndex = Option<usize>;
|
||||
|
||||
// Dialog to manage policy identifiers.
|
||||
// The elements may be toggled to be deactivated. The optional value 'data_valid_until'
|
||||
// will render this value unvalid after the given date.
|
||||
widget!(
|
||||
PolicyDataView<PolicyDataState> {
|
||||
back_entity: u32,
|
||||
policy_list_count: usize,
|
||||
policylist_view: u32,
|
||||
list_index: ListIndex,
|
||||
date_valid_until: NaiveDateTime,
|
||||
policy_list: PolicyList
|
||||
});
|
||||
|
||||
impl Template for PolicyDataView {
|
||||
fn template(self, id: Entity, ctx: &mut BuildContext) -> Self {
|
||||
// listing the policy elements
|
||||
let items_widget = ItemsWidget::new()
|
||||
.id(ID_POLICY_DATA_ITEMS_WIDGET)
|
||||
.v_align("start")
|
||||
.items_builder(move |ctx, index| {
|
||||
let mut date_inserted = None;
|
||||
let mut dion = 1;
|
||||
let mut policy_code = "".to_string();
|
||||
let mut policy_number = None;
|
||||
let mut status = false; // Status::<Active, Inactive>;
|
||||
|
||||
if let Some(list_index) = ctx.get_widget(id).clone::<ListIndex>("list_index") {
|
||||
if let Some(policy_data) = ctx
|
||||
.get_widget(id)
|
||||
.get::<PolicyList>(PROP_POLICY_LIST)
|
||||
.get(list_index)
|
||||
{
|
||||
if let Some(policy_data) = policy_data.get(index) {
|
||||
date_inserted = policy_data.date_inserted.clone();
|
||||
dion = policy_data.dion.clone();
|
||||
policy_code = policy_data.policy_code.clone();
|
||||
policy_number = policy_data.policy_number.clone();
|
||||
status = policy_data.status;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
let policy_data_status = CheckBox::new()
|
||||
.attach(Grid::column(1))
|
||||
.v_align("center")
|
||||
// status: true -> State::Active false -> State::Inactive
|
||||
.enabled(status)
|
||||
.on_changed(move |ctx, entity| {
|
||||
ctx.get_mut::<PolicyDataState>(id)
|
||||
.action(Action::StatusChanged(entity, index));
|
||||
})
|
||||
.build(ctx);
|
||||
|
||||
let policy_data_dion = TextBox::new()
|
||||
.id(ID_POLICY_DATA_DION)
|
||||
.attach(Grid::row(3))
|
||||
.v_align("center")
|
||||
.margin((4.0, 0.0, 0.0, 0.0))
|
||||
.text(dion)
|
||||
.lost_focus_on_activation(false)
|
||||
.on_activate(move |ctx, entity| {
|
||||
ctx.get_mut::<PolicyDataState>(id)
|
||||
.action(Action::CreateEntry(entity));
|
||||
})
|
||||
.on_changed(move |ctx, entity| {
|
||||
ctx.get_mut::<PolicyDataState>(id)
|
||||
.action(Action::InputTextChanged(entity));
|
||||
})
|
||||
.build(ctx);
|
||||
|
||||
let policy_data_dion = TextBox::new()
|
||||
.id(ID_POLICY_DATA_DION)
|
||||
.attach(Grid::row(5))
|
||||
.v_align("center")
|
||||
.margin((4.0, 0.0, 0.0, 0.0))
|
||||
.text(policy_code)
|
||||
.lost_focus_on_activation(false)
|
||||
.on_activate(move |ctx, entity| {
|
||||
ctx.get_mut::<PolicyDataState>(id)
|
||||
.action(Action::TextChanged(entity));
|
||||
})
|
||||
.on_changed(move |ctx, entity| {
|
||||
ctx.get_mut::<PolicyDataState>(id)
|
||||
.action(Action::RemoveFocus(entity));
|
||||
})
|
||||
.build(ctx);
|
||||
|
||||
let policy_data_policy_code = TextBox::new()
|
||||
.id(ID_POLICY_DATA_POLICY_CODE)
|
||||
.attach(Grid::row(7))
|
||||
.v_align("center")
|
||||
.margin((4.0, 0.0, 0.0, 0.0))
|
||||
.text(policy_code)
|
||||
.lost_focus_on_activation(false)
|
||||
.on_activate(move |ctx, entity| {
|
||||
ctx.get_mut::<PolicyDataState>(id)
|
||||
.action(Action::TextChanged(entity));
|
||||
})
|
||||
.on_changed(move |ctx, entity| {
|
||||
ctx.get_mut::<PolicyDataState>(id)
|
||||
.action(Action::RemoveFocus(entity));
|
||||
})
|
||||
.build(ctx);
|
||||
|
||||
|
||||
let policy_data_policy_number = TextBox::new()
|
||||
.id(ID_POLICY_DATA_POLICY_NUMBER)
|
||||
.attach(Grid::column(9))
|
||||
.text(policy_number)
|
||||
.enabled(false)
|
||||
.v_align("center")
|
||||
.water_mark("Insert the new policy number ...")
|
||||
.class("inplace")
|
||||
.on_activate(move |ctx, entity| {
|
||||
ctx.get_mut::<PolicyDataState>(id)
|
||||
.action(Action::TextChanged(entity));
|
||||
})
|
||||
.on_changed(move |ctx, entity| {
|
||||
ctx.get_mut::<PolicyDataState>(id)
|
||||
.action(Action::RemoveFocus(entity));
|
||||
})
|
||||
.build(ctx);
|
||||
|
||||
let policy_data_date_inserted = TextBlock::new()
|
||||
.id(ID_POLICY_DATA_DATE_INSERTED)
|
||||
.attach(Grid::column(9))
|
||||
.text(date_inserted)
|
||||
.v_align("start")
|
||||
.on_activate(move |ctx, entity| {
|
||||
ctx.get_mut::<PolicyDataState>(id)
|
||||
.action(Action::TextChanged(entity));
|
||||
})
|
||||
.on_changed(move |ctx, entity| {
|
||||
ctx.get_mut::<PolicyDataState>(id)
|
||||
.action(Action::RemoveFocus(entity));
|
||||
})
|
||||
.build(ctx);
|
||||
|
||||
Grid::new()
|
||||
.height(48.0)
|
||||
.columns(
|
||||
Columns::new()
|
||||
.add(10.0)
|
||||
.add(24.0)
|
||||
.add(8.0)
|
||||
.add(24.0)
|
||||
.add(8.0)
|
||||
.add(24.0)
|
||||
.add(8.0)
|
||||
.add("auto")
|
||||
.add(8.0)
|
||||
.add("auto")
|
||||
.add(8.0)
|
||||
.add(32.0)
|
||||
.add(4.0)
|
||||
.add(32.0)
|
||||
.add(8.0)
|
||||
.build(),
|
||||
)
|
||||
.child(policy_data_status)
|
||||
.child(policy_data_dion)
|
||||
.child(policy_data_policy_code)
|
||||
.child(policy_data_policy_number)
|
||||
.child(policy_data_date_inserted)
|
||||
.child(
|
||||
// edit active policy data element
|
||||
Button::new()
|
||||
.class(CLASS_ICON_ONLY)
|
||||
.attach(Grid::column(11))
|
||||
.min_size(32.0, 32.0)
|
||||
.v_align("center")
|
||||
.icon(material_icons_font_ttf::MD_EDIT)
|
||||
//.icon("")
|
||||
.on_mouse_down(|_, _| true)
|
||||
.on_click(move |ctx, _| {
|
||||
ctx.get_mut::<PolicyDataState>(id)
|
||||
.action(Action::EditEntry(text_box));
|
||||
true
|
||||
})
|
||||
.build(ctx),
|
||||
)
|
||||
.child(
|
||||
// delete active policy data element
|
||||
Button::new()
|
||||
.class("icon_only")
|
||||
.attach(Grid::column(13))
|
||||
.min_size(32.0, 32.0)
|
||||
.v_align("center")
|
||||
.icon(material_icons_font_ttf::MD_DELETE)
|
||||
//.icon("")
|
||||
.on_mouse_down(|_, _| true)
|
||||
.on_click(move |ctx, _| {
|
||||
ctx.get_mut::<PolicyDataState>(id)
|
||||
.action(Action::RemoveEntry(index));
|
||||
true
|
||||
})
|
||||
.build(ctx),
|
||||
)
|
||||
.build(ctx)
|
||||
})
|
||||
.policy_data_count(PROP_POLICY_DATA_COUNT, id)
|
||||
.build(ctx);
|
||||
|
||||
let scroll_viewer = ScrollViewer::new()
|
||||
.scroll_viewer_mode(("disabled", "auto"))
|
||||
.child(items_widget)
|
||||
.build(ctx);
|
||||
|
||||
let policy_data_list_name = TextBox::new()
|
||||
.id(ID_POLICY_DATA_LIST_NAME)
|
||||
.attach(Grid::row(4))
|
||||
.v_align("center")
|
||||
.margin((4.0, 0.0, 0.0, 0.0))
|
||||
.lost_focus_on_activation(false)
|
||||
.on_activate(move |ctx, entity| {
|
||||
ctx.get_mut::<PolicyDataState>(id)
|
||||
.action(Action::CreateEntry(entity));
|
||||
})
|
||||
.on_changed(move |ctx, entity| {
|
||||
ctx.get_mut::<PolicyDataState>(id)
|
||||
.action(Action::InputTextChanged(entity));
|
||||
})
|
||||
.build(ctx);
|
||||
|
||||
// Child page: list available policy data elements
|
||||
self.name("PolicyDataListView").child(
|
||||
Grid::new()
|
||||
.rows(
|
||||
Rows::new()
|
||||
.add(52.0)
|
||||
.add(1.0)
|
||||
.add("*")
|
||||
.add(1.0)
|
||||
.add("auto")
|
||||
.build(),
|
||||
)
|
||||
.columns(
|
||||
Columns::new()
|
||||
.add("*")
|
||||
.add(4.0)
|
||||
.add(36.0)
|
||||
.build(),
|
||||
)
|
||||
// Top Bar
|
||||
.child(
|
||||
Container::new()
|
||||
.class(CLASS_TOP_BAR)
|
||||
.attach(Grid::row(0))
|
||||
.attach(Grid::column(0))
|
||||
.attach(Grid::column_span(3))
|
||||
.child(
|
||||
Grid::new()
|
||||
.columns(
|
||||
Columns::new()
|
||||
.add(32.0)
|
||||
.add(4.0)
|
||||
.add("*")
|
||||
.add(4.0)
|
||||
.add(32.0)
|
||||
.build(),
|
||||
)
|
||||
.child(
|
||||
Button::new()
|
||||
.height(32.0)
|
||||
.icon(material_icons_font_ttf::MD_ARROW_LEFT)
|
||||
//.icon("")
|
||||
.class(CLASS_ICON_ONLY)
|
||||
.v_align("center")
|
||||
.on_click(move |ctx, _| {
|
||||
ctx.get_mut::<PolicyDataState>(id)
|
||||
.action(Action::NavigateBack());
|
||||
true
|
||||
})
|
||||
.build(ctx),
|
||||
)
|
||||
.child(
|
||||
TextBlock::new()
|
||||
.class(CLASS_HEADER)
|
||||
.attach(Grid::column(2))
|
||||
.v_align("center")
|
||||
.h_align("center")
|
||||
.text(("name", id))
|
||||
.build(ctx),
|
||||
)
|
||||
.child(
|
||||
Stack::new()
|
||||
.class(CLASS_HEADER)
|
||||
.attach(Grid::column(3))
|
||||
.h_align("start")
|
||||
.orientation("horizontal")
|
||||
.child(
|
||||
TextBox::new()
|
||||
.class(CLASS_HEADER)
|
||||
//.v_align("center")
|
||||
.h_align("start")
|
||||
.text(("Anzahl:", id))
|
||||
.build(ctx),
|
||||
)
|
||||
.child(
|
||||
TextBlock::new()
|
||||
.class(CLASS_HEADER)
|
||||
.id(PROP_POLICY_DATA_COUNT)
|
||||
.attach(Grid::column(3))
|
||||
//.v_align("center")
|
||||
.h_align("end")
|
||||
.text("policy_data_count")
|
||||
.build(ctx),
|
||||
)
|
||||
.build,
|
||||
)
|
||||
.build(ctx),
|
||||
)
|
||||
.build(ctx),
|
||||
)
|
||||
.child(
|
||||
Container::new()
|
||||
.class("separator")
|
||||
.attach(Grid::row(1))
|
||||
.attach(Grid::column_span(3))
|
||||
.build(ctx),
|
||||
)
|
||||
// Content
|
||||
.child(
|
||||
Container::new()
|
||||
.attach(Grid::row(2))
|
||||
.attach(Grid::column(0))
|
||||
.attach(Grid::column_span(3))
|
||||
.child(scroll_viewer)
|
||||
.child(
|
||||
ScrollIndicator::new()
|
||||
.padding((0.0, 4.0, 0.0, 0.0))
|
||||
.content_id(items_widget.0)
|
||||
.scroll_offset(scroll_viewer)
|
||||
.build(ctx),
|
||||
)
|
||||
.build(ctx),
|
||||
)
|
||||
.child(
|
||||
Container::new()
|
||||
.class("separator")
|
||||
.attach(Grid::row(3))
|
||||
.attach(Grid::column_span(3))
|
||||
.build(ctx),
|
||||
)
|
||||
// Bottom bar
|
||||
.child(
|
||||
Container::new()
|
||||
.class(CLASS_BOTTOM_BAR)
|
||||
.attach(Grid::row(4))
|
||||
.attach(Grid::column(0))
|
||||
.attach(Grid::column_span(3))
|
||||
.build(ctx),
|
||||
)
|
||||
.child(policy_data_list_name)
|
||||
.child(
|
||||
Button::new()
|
||||
.id(ID_POLICY_DATA_ADD_BUTTON)
|
||||
.class(CLASS_ICON_ONLY)
|
||||
.attach(Grid::row(4))
|
||||
.attach(Grid::column(2))
|
||||
.margin((0.0, 0.0, 4.0, 0.0))
|
||||
.enabled(false)
|
||||
.min_size(32.0, 32.0)
|
||||
.v_align("center")
|
||||
.icon(material_icons_font_ttf::MD_ADD_CIRCLE)
|
||||
.on_click(move |ctx, _| {
|
||||
ctx.get_mut::<PolicyDataState>(id)
|
||||
.action(Action::CreateEntry(policy_data_list_name));
|
||||
true
|
||||
})
|
||||
.build(ctx),
|
||||
)
|
||||
.build(ctx),
|
||||
)
|
||||
}
|
||||
}
|
||||
@@ -1,196 +0,0 @@
|
||||
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;
|
||||
}
|
||||
}
|
||||
@@ -1,282 +0,0 @@
|
||||
use orbtk::prelude::*;
|
||||
|
||||
use crate::{
|
||||
data::PolicyList,
|
||||
keys::*,
|
||||
//policylist_state::{Action, PolicyListState},
|
||||
policylist_state::*,
|
||||
};
|
||||
|
||||
//type ListIndex = Option<usize>;
|
||||
|
||||
widget!(
|
||||
/// Dialog selecting a list of policy identifiers.
|
||||
/// The lists groups a collection of policy codes.
|
||||
PolicyListView<PolicyListState> {
|
||||
back_entity: u32,
|
||||
policy_list: PolicyList,
|
||||
policy_list_count: usize,
|
||||
policydata_view: u32
|
||||
}
|
||||
);
|
||||
|
||||
impl Template for PolicyListView {
|
||||
fn template(self, id: Entity, ctx: &mut BuildContext) -> Self {
|
||||
// collect the DCES elements of our 'policy lists' view
|
||||
let items_widget = ItemsWidget::new()
|
||||
.id(ID_POLICY_LIST_ITEMS_WIDGET)
|
||||
.v_align("start")
|
||||
.items_builder(move |ctx, index| {
|
||||
let mut name = "".to_string();
|
||||
|
||||
if let Some(policy_list) = ctx
|
||||
.get_widget(id)
|
||||
.get::<PolicyList>(PROP_POLICY_LIST)
|
||||
.get(index)
|
||||
{
|
||||
name = policy_list.name.clone();
|
||||
}
|
||||
|
||||
// plus button: open new policy
|
||||
let new_list_button = Button::new()
|
||||
.min_height(48.0)
|
||||
.class(CLASS_ITEM_BUTTON)
|
||||
.attach(Grid::column(0))
|
||||
.attach(Grid::row(0))
|
||||
.attach(Grid::column_span(1))
|
||||
.on_click(move |ctx, _| {
|
||||
ctx.get_mut::<PolicyListState>(id)
|
||||
.action(Action::OpenPolicyList(index));
|
||||
true
|
||||
})
|
||||
.build(ctx);
|
||||
|
||||
let text_block = TextBlock::new()
|
||||
.foreground(new_list_button)
|
||||
.margin((14.0, 0.0, 0.0, 0.0))
|
||||
.v_align("center")
|
||||
.attach(Grid::column(0))
|
||||
.text(name)
|
||||
.element("text-box")
|
||||
.build(ctx);
|
||||
|
||||
let text_box = TextBox::new()
|
||||
.margin((8.0, 0.0, 0.0, 0.0))
|
||||
.visibility("collapsed")
|
||||
.v_align("center")
|
||||
.water_mark("Insert name of a new policy collection ...")
|
||||
.attach(Grid::column(0))
|
||||
.text(text_block)
|
||||
.on_changed(move |ctx, entity| {
|
||||
ctx.get_mut::<PolicyListState>(id)
|
||||
.action(Action::TextChanged(entity, index));
|
||||
})
|
||||
.on_activate(move |ctx, entity| {
|
||||
ctx.get_mut::<PolicyListState>(id)
|
||||
.action(Action::RemoveFocus(entity));
|
||||
})
|
||||
.build(ctx);
|
||||
|
||||
Grid::new()
|
||||
.height(48.0)
|
||||
.columns(
|
||||
Columns::new()
|
||||
.add("*")
|
||||
.add(8.0)
|
||||
.add(32.0)
|
||||
.add(4.0)
|
||||
.add(32.0)
|
||||
.add(8.0)
|
||||
.build(),
|
||||
)
|
||||
.child(new_list_button)
|
||||
.child(text_box)
|
||||
.child(text_block)
|
||||
.child(
|
||||
// toggle if text_box is focused
|
||||
ToggleButton::new()
|
||||
.selected(("focused", text_box))
|
||||
.class(CLASS_ICON_ONLY)
|
||||
.attach(Grid::column(2))
|
||||
.min_size(32.0, 32.0)
|
||||
.v_align("center")
|
||||
.build(ctx),
|
||||
)
|
||||
.child(
|
||||
Button::new()
|
||||
// .selected(("focused", text_box))
|
||||
.class(CLASS_ICON_ONLY)
|
||||
.attach(Grid::column(2))
|
||||
.min_size(32.0, 32.0)
|
||||
.v_align("center")
|
||||
.icon(material_icons_font_ttf::MD_ADD)
|
||||
//.icon(material_icons_font_ttf::MD_EDIT)
|
||||
//.icon("")
|
||||
.on_mouse_down(|_, _| true)
|
||||
.on_click(move |ctx, _| {
|
||||
ctx.get_mut::<PolicyListState>(id)
|
||||
.action(Action::SetEntry(text_box));
|
||||
true
|
||||
})
|
||||
.build(ctx),
|
||||
)
|
||||
.child(
|
||||
Button::new()
|
||||
.class("icon_only")
|
||||
.attach(Grid::column(4))
|
||||
.min_size(32.0, 32.0)
|
||||
.v_align("center")
|
||||
.icon(material_icons_font_ttf::MD_DELETE)
|
||||
//.icon("")
|
||||
.on_mouse_down(|_, _| true)
|
||||
.on_click(move |ctx, _| {
|
||||
ctx.get_mut::<PolicyListState>(id)
|
||||
.action(Action::RemoveEntry(index));
|
||||
true
|
||||
})
|
||||
.build(ctx),
|
||||
)
|
||||
.build(ctx)
|
||||
})
|
||||
.count((PROP_POLICY_LIST_COUNT, id))
|
||||
.build(ctx);
|
||||
|
||||
// create new policy list element
|
||||
let policy_list_text_box = TextBox::new()
|
||||
.id(ID_POLICY_LIST_TEXT_BOX)
|
||||
.attach(Grid::row(4))
|
||||
.v_align("center")
|
||||
.margin((4.0, 0.0, 0.0, 2.0))
|
||||
.lost_focus_on_activation(false)
|
||||
.on_activate(move |ctx, entity| {
|
||||
ctx.get_mut::<PolicyListState>(id)
|
||||
.action(Action::NewEntry(entity));
|
||||
})
|
||||
.on_changed(move |ctx, entity| {
|
||||
ctx.get_mut::<PolicyListState>(id)
|
||||
.action(Action::InputTextChanged(entity));
|
||||
})
|
||||
.build(ctx);
|
||||
|
||||
let scroll_viewer = ScrollViewer::new()
|
||||
.scroll_viewer_mode(("disabled", "auto"))
|
||||
.child(items_widget)
|
||||
.build(ctx);
|
||||
|
||||
// Child page: list available policy lists
|
||||
self.name("PolicyListView")
|
||||
.policy_list(PolicyList::default())
|
||||
.policy_list_count(0)
|
||||
.child(
|
||||
Grid::new()
|
||||
.rows(
|
||||
Rows::new()
|
||||
.add(52.0)
|
||||
.add(1.0)
|
||||
.add("*")
|
||||
.add(1.0)
|
||||
.add(40.0)
|
||||
.build(),
|
||||
)
|
||||
.columns(
|
||||
Columns::new()
|
||||
.add("*")
|
||||
.add(4.0)
|
||||
.add(36.0)
|
||||
.build(),
|
||||
)
|
||||
// Content
|
||||
.child(
|
||||
Container::new()
|
||||
.attach(Grid::row(2))
|
||||
.attach(Grid::column(0))
|
||||
.attach(Grid::column_span(3))
|
||||
.child(scroll_viewer)
|
||||
.child(
|
||||
ScrollIndicator::new()
|
||||
.padding((0.0, 4.0, 0.0, 0.0))
|
||||
.content_id(items_widget.0)
|
||||
.scroll_offset(scroll_viewer)
|
||||
.build(ctx),
|
||||
)
|
||||
.build(ctx),
|
||||
)
|
||||
// Top Bar
|
||||
.child(
|
||||
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)
|
||||
.v_align("center")
|
||||
.h_align("center")
|
||||
.text("Lists of policy data collections")
|
||||
.build(ctx),
|
||||
)
|
||||
.build(ctx),
|
||||
)
|
||||
.build(ctx),
|
||||
)
|
||||
.child(
|
||||
Container::new()
|
||||
.class("separator")
|
||||
.attach(Grid::row(1))
|
||||
.attach(Grid::column_span(3))
|
||||
.build(ctx),
|
||||
)
|
||||
.child(
|
||||
Container::new()
|
||||
.class("separator")
|
||||
.attach(Grid::row(3))
|
||||
.attach(Grid::column_span(3))
|
||||
.build(ctx),
|
||||
)
|
||||
// Bottom bar
|
||||
.child(
|
||||
Container::new()
|
||||
.class(CLASS_BOTTOM_BAR)
|
||||
.attach(Grid::row(4))
|
||||
.attach(Grid::column(0))
|
||||
.attach(Grid::column_span(3))
|
||||
.build(ctx),
|
||||
)
|
||||
.child(
|
||||
// workaround, todo fix scroll viewer mouse behavior in OrbTk
|
||||
Button::new()
|
||||
.attach(Grid::row(4))
|
||||
.attach(Grid::column(0))
|
||||
.attach(Grid::column_span(3))
|
||||
.on_mouse_down(|_, _| true)
|
||||
.on_mouse_up(|_, _| true)
|
||||
.on_click(|_, _| true)
|
||||
.class(CLASS_TRANSPARENT)
|
||||
.build(ctx),
|
||||
)
|
||||
.child(policy_list_text_box)
|
||||
.child(
|
||||
Button::new()
|
||||
.id(ID_POLICY_LIST_ADD_BUTTON)
|
||||
.class(CLASS_ICON_ONLY)
|
||||
.attach(Grid::row(4))
|
||||
.attach(Grid::column(2))
|
||||
.margin((0.0, 0.0, 4.0, 0.0))
|
||||
.enabled(false)
|
||||
.min_size(32.0, 32.0)
|
||||
.v_align("center")
|
||||
.icon(material_icons_font_ttf::MD_ADD)
|
||||
.on_click(move |ctx, _| {
|
||||
ctx.get_mut::<PolicyListState>(id)
|
||||
.action(Action::NewEntry(policy_list_text_box));
|
||||
true
|
||||
})
|
||||
.build(ctx),
|
||||
)
|
||||
.build(ctx),
|
||||
)
|
||||
}
|
||||
}
|
||||