You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

262 lines
7.0 KiB

/**
* Im Grunde eine gekapselte Textarea
* Das Feld in welches roher Datentext eingefügt wird.
* Wir in der Zukunft eventuell in einen sepperaten View verschoben.
*
* @param {Modifier} modifier
* @returns {Component}
*/
function rawTextImportArea(modifier = new Modifier()) {
return builder.div()
.modifier(
new Modifier()
.fillMaxSize()
.padding(6)
)
.modifier(modifier)
.setAttribute("id", "import-area")
.chainChild()
.textarea()
.name("import-textarea")
.modifier(
new Modifier()
.clip(Shapes.RoundedCorner.all(12))
.fillMaxSize()
.padding(6)
.dimensions().height(120)
)
}
class ProcessingRule {
use;
value;
constructor(display, id, type, placeholder, desc, isFlagged) {
this.display = display;
this.id = id;
this.type = type;
this.placeholder = placeholder;
this.desc = desc;
this.isFlagged = isFlagged;
}
_getCorrespondingComponent() {
return document.getElementById(this.id)
}
_getToBeUsedState() {
return !this.isFlagged
|| this._getCorrespondingComponent()
.querySelector('input[name="is_to_be_used"]').checked === true;
}
_getInputTagValue() {
let container = this._getCorrespondingComponent()
.querySelector('.value-container');
if (this.type === "checkbox") {
return container.checked === true;
}
if (container.value === "") {
return this.placeholder;
}
return container.value;
}
updateFromUi() {
this.use = this._getToBeUsedState();
this.value = this._getInputTagValue();
}
}
/**
* Die Überschrift und unter der Bedingung rule.isFlagged auch eine checkbox die bestimmt
* ob die ProcessingRule genutzt werden soll.
*
* @param {ProcessingRule} rule
* @returns {Component}
*/
function prdUseboxAndLabel(rule) {
return builder.row()
.arrangement(Arrangement.CENTER)
.childContext([
builder.inputTags.checkbox({ "name": "is_to_be_used" })
.modifier(new Modifier().margin().right(6))
.hiddenByCondition(!rule.isFlagged)
,
builder.label()
.setAttribute("for", rule.id)
.text(rule.display)
]);
}
/**
* Componente die eine ProcessingRule definiert.
* - Ob sie verwendet werden soll
* - welche Standartwert erwartet/verwendet werden soll
*
* @param {ProcessingRule} rule
* @returns {Component}
*/
function processingRuleDefineComponent(rule, index, arr, modifier = new Modifier()) {
return builder.column()
.isHigherComponent()
.setAttribute("id", rule.id)
.title(rule.desc)
.modifier(modifier)
.arrangement(Arrangement.CENTER)
.childContext([
prdUseboxAndLabel(rule)
,
builder.span()
.modifier(new Modifier().fillMaxSize())
.arrangement(Arrangement.CENTER)
.chainChild()
.input(rule.type)
.addStyleClass("value-container")
.setAttribute("placeholder", rule.placeholder)
.modifier(
new Modifier()
.padding(4)
.setStyleRule("field-sizing", "content")
)
.apply(function (el) {
if (!rule.isFlagged) {
el.setAttribute("deactivated", "");
}
})
])
}
/**
* Bereich der ProcessingRules
*
* @param {ProcessingRule} rule
* @returns {Component}
*/
function processingRulesArea(modifier = new Modifier()) {
return builder.row()
.modifier(
new Modifier()
.fillMaxWidth()
.padding(8)
)
.modifier(modifier)
.arrangement(Arrangement.SPACE_EVENLY)
.childContext(
Object.keys(processingRules)
.map(def => processingRules[def])
.map(processingRuleDefineComponent)
)
}
let importedData = [];
/**
* Funktion keine Komponente
*/
function importEntries() {
let rawtext = document.getElementById("import-area")
.querySelector("textarea").value;
let prules = Object.keys(processingRules)
.reduce((a, c) => {
let r = processingRules[c];
let pr = new ProcessingRule(r.display, r.id, r.type, r.placeholder, r.desc, r.isFlagged);
pr.updateFromUi();
a[c] = pr;
return a;
}, processingRules);
let lines = rawtext.split(prules.line_splitter.value);
let splittedLines = lines
.filter(e => e.trim() !== "");
console.log(splittedLines);
if (prules.entry_splitter.use) {
console.log(prules.entry_splitter.value);
splittedLines = splittedLines
.map(line => line.split(prules.entry_splitter.value))
} else {
splittedLines = splittedLines
.map(e => [e]);
}
importedData = splittedLines;
console.log(splittedLines);
let upcoming = document.querySelector(".plist-upcoming");
splittedLines = splittedLines.map((e, i) => listEntryRow(e, i).generate().compext);
splittedLines
.forEach(element => {
upcoming.insertAdjacentElement(
"beforeend",
element
)
});
}
/**
* Bereich mit ausführbaren Elementen
*
* @param {ProcessingRule} rule
* @returns {Component}
*/
function commandRow(modifier = new Modifier()) {
return builder.row()
.modifier(modifier)
.childContext([
builder.button()
.text("Import")
.addStyleClass("import-trigger")
.addEventListener(
"click",
importEntries
)
])
}
/**
*
*
* @param {ProcessingRule} rule
* @returns {Component}
*/
function importArea(modifier = new Modifier()) {
return builder.column()
.addStyleClass("area")
.addStyleClass("area-import")
.modifier(
new Modifier()
.fillMaxWidth()
.padding(12)
.background(colorModifiers.import.secondary)
)
.modifier(componentModifiers.majorArea)
.modifier(modifier)
.arrangement(Arrangement.CENTER)
.childContext([
builder.header(4).text("Import")
,
builder.column()
.arrangement(Arrangement.CENTER)
.modifier(
new Modifier()
.padding().all(32).top(16)
)
.childContext([
rawTextImportArea()
,
processingRulesArea()
,
commandRow()
])
])
}