PPM2: select

This commit is contained in:
darthsandmann
2016-12-12 22:20:21 +01:00
parent f0db62320a
commit 1b35f02647
141 changed files with 3986 additions and 1313 deletions

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,164 @@
//------------------------------------------------------------------------------
// PPM - Hauptfunktion
//------------------------------------------------------------------------------
class PPM
{
constructor ()
{
this.BodyDataAction();
this.TemplateManager_o = new TemplateManager_cl();
this.TemplateManager_o;
console.log("PPM LOADED");
}
BodyDataAction ()
{
$('body').on('click', '[data-action]', function() {
var action = $(this).data('action');
PPM_o.Menu(action);
return false;
});
}
BodyTableSelect ()
{
$('#idList tr').click(function(){
$(".selected").removeClass('selected');
$(this).addClass('selected');
this.selectedId = $(this).attr('id');
console.log("SELECT ID: ", this.selectedId);
return false;
});
}
Menu (message)
{
var selectedId = $(".selected").attr('id');
switch (message)
{
case 'index':
this.LoadContent('/category/', 'index.tpl');
break;
case 'categoryStudenten':
this.LoadContent('/category/?cat=Studenten', 'list.tpl');
break
case 'categoryLehrender':
this.LoadContent('/category/?cat=Lehrender', 'list.tpl');
break
case 'categoryFirmen':
this.LoadContent('/category/?cat=Firmen', 'list.tpl');
break
case 'choice':
this.LoadContent('/choice', 'listChoice.tpl');
break
case 'evalStudenten':
this.LoadContent('/eval/?cat=Studenten', 'listEval.tpl');
break
case 'evalLehrender':
this.LoadContent('/eval/?cat=Lehrender', 'listEval.tpl');
break
case 'evalFirmen':
this.LoadContent('/eval/?cat=Firmen', 'listEval.tpl');
break
case 'NewStudenten':
console.log("NewStudenten");
break
case 'NewLehrender':
console.log("NewLehrender");
break
case 'NewFirmen':
console.log("NewFirmen");
break
case 'ModifyStudenten':
console.log("ModifyStudenten: ", selectedId);
break
case 'ModifyLehrenden':
console.log("ModifyLehrenden", selectedId);
break
case 'ModifyFirmen':
console.log("ModifyFirmen", selectedId);
break
case 'DeleteStudenten':
console.log("DeleteStudenten", selectedId);
break
case 'DeleteLehrenden':
console.log("DeleteLehrenden", selectedId);
break
case 'DeleteFirmen':
console.log("DeleteFirmen", selectedId);
break
default:
alert ('[PPM] Unbekannte Anfrage: ' + message);
}
}
LoadContent ( path, template )
{
$.ajax({
dataType: "json",
url: path,
type: 'GET',
context: this
})
.done(function (json) {
//console.log("JSON: ", json);
var result = this.TemplateManager_o.execute_px( template, json );
//console.log("RESULT: ", result);
//$( ".clContent" ).replaceWith(result);
$( ".clContent" ).empty();
$( ".clContent" ).append(result);
this.BodyTableSelect();
console.log("TM DONE");
})
.fail(function(jqXHR_opl, textStatus_spl) {
alert( "[PPM] Fehler bei Anforderung: " + textStatus_spl );
});
}
}
$(function() {
console.log("ONLOAD");
PPM_o = new PPM();
PPM_o.Menu("index");
});

View File

@ -0,0 +1,266 @@
//------------------------------------------------------------------------------
// Template-Engine
//------------------------------------------------------------------------------
'use strict'
class Generator_cl {
constructor () {
this.reset_px();
}
reset_px () {
this.code_a = ['var result_a = [];\n'];
}
write_px (text_spl) {
// Escape-Zeichen bei Strings ergänzen
var text_s = text_spl.replace(/"/g, '\\"');
text_s = text_s.replace(/'/g, "\\'");
this.code_a.push('result_a.push("' + text_s + '");\n');
}
code_px (code_spl) {
if (code_spl.startsWith('if')) {
this.code_a.push('if (' + code_spl.substr(2) + ') {\n');
} else if (code_spl.startsWith('else')) {
this.code_a.push('} else {\n');
} else if (code_spl.startsWith('endif')) {
this.code_a.push('}\n');
} else if (code_spl.startsWith('for')) {
this.code_a.push('for (' + code_spl.substr(3) + ') {\n');
} else if (code_spl.startsWith('endfor')) {
this.code_a.push('}\n');
} else {
this.code_a.push(code_spl + '\n');
}
}
substitute_px (subst_spl) {
let value_s = subst_spl == null ? '' : String(subst_spl);
this.code_a.push('result_a.push(' + value_s + ');\n');
}
generate_px () {
var result_s = this.code_a.join('') + ' return result_a.join("");';
var f_o = new Function ('context', result_s);
return f_o;
}
}
class TemplateCompiler_cl {
constructor () {
this.gen_o = new Generator_cl();
this.reset_px();
}
reset_px () {
this.gen_o.reset_px();
this.preservePreWS_b = false;
this.preservePostWS_b = false;
}
setPreWS_px (on_bpl) {
if ((on_bpl == undefined) || (on_bpl == false)) {
this.preservePreWS_b = false;
} else {
this.preservePreWS_b = true;
}
}
setPostWS_px (on_bpl) {
if ((on_bpl == undefined) || (on_bpl == false)) {
this.preservePostWS_b = false;
} else {
this.preservePostWS_b = true;
}
}
compile_px (source_spl) {
var state_i = 0;
var pos_i = 0;
var len_i = source_spl.length;
var text_s = '';
var code_s = '';
var subst_s = '';
this.gen_o.reset_px();
var doubletest_f = function (char_spl) {
var status_b = false;
if ((pos_i + 1) < len_i) {
if ((source_spl[pos_i] == char_spl) && (source_spl[pos_i+1] == char_spl)) {
status_b = true;
}
}
return status_b;
}
while (pos_i < len_i) {
switch (state_i) {
case 0:
// outside
if (source_spl[pos_i] == '@') { // ECMA 5!
if (doubletest_f('@') == false) {
state_i = 2;
code_s = '';
} else {
// als normales Zeichen verarbeiten, ein Zeichen überlesen
state_i = 1;
text_s = '@';
pos_i++;
}
} else if (source_spl[pos_i] == '#') {
if (doubletest_f('#') == false) {
state_i = 3;
subst_s = '';
} else {
// als normales Zeichen verarbeiten, ein Zeichen überlesen
state_i = 1;
text_s = '#';
pos_i++;
}
} else if ((source_spl[pos_i] == ' ') || (source_spl[pos_i] == '\t')) {
state_i = 4;
text_s = '';
pos_i--; // Zeichen erneut verarbeiten
} else {
state_i = 1;
text_s = '';
pos_i--; // Zeichen erneut verarbeiten
}
break;
case 1:
// inText
if (source_spl[pos_i] == '@') {
if (doubletest_f('@') == false) {
// Textende, neuer Code
state_i = 0;
this.gen_o.write_px(text_s);
pos_i--; // Zeichen erneut verarbeiten
} else {
// als normales Zeichen verarbeiten, ein Zeichen überlesen
text_s += '@';
pos_i++;
}
} else if (source_spl[pos_i] == '#') {
if (doubletest_f('#') == false) {
// Textende, neue Substitution
state_i = 0;
this.gen_o.write_px(text_s);
pos_i--; // Zeichen erneut verarbeiten
// Textende, neuer Code
} else {
// als normales Zeichen verarbeiten, ein Zeichen überlesen
text_s += '#';
pos_i++;
}
} else if ((source_spl[pos_i] == ' ') || (source_spl[pos_i] == '\t')) {
// Textende
state_i = 0;
this.gen_o.write_px(text_s);
pos_i--; // Zeichen erneut verarbeiten
} else {
// sammeln
if ((source_spl[pos_i] != '\n') && (source_spl[pos_i] != '\r')) {
text_s += source_spl[pos_i];
} else if (source_spl[pos_i] == '\n') {
text_s += '\\n';
} else {
text_s += '\\r';
}
}
break;
case 2:
// inCode
if (source_spl[pos_i] == '@') {
if (doubletest_f('@') == false) {
// zu Ende, erzeugen
this.gen_o.code_px(code_s);
state_i = 5; //0
} else {
// als normales Zeichen verarbeiten, ein Zeichen überlesen
code_s += '@';
pos_i++;
}
} else {
// sammeln
code_s += source_spl[pos_i];
}
break;
case 3:
// inSubst
// Verdopplung # hier nicht zulässig!
if (source_spl[pos_i] == '#') {
// zu Ende, erzeugen
this.gen_o.substitute_px(subst_s);
state_i = 0;
} else {
// sammeln
subst_s += source_spl[pos_i];
}
break;
case 4:
// pre-code-whitespace
switch (source_spl[pos_i]) {
case ' ':
case '\t':
// sammeln
text_s += source_spl[pos_i];
break;
default:
state_i = 0;
if (source_spl[pos_i] != '@') {
this.gen_o.write_px(text_s);
} else {
if (doubletest_f('@') == false) {
// Whitespace vor Code-Beginn erkannt
if (this.preservePreWS_b == true) {
// trotzdem ausgeben
this.gen_o.write_px(text_s);
}
} // ansonsten wie normales Zeichen behandeln
}
pos_i--; // Zeichen erneut verarbeiten
}
break;
case 5:
// post-code-whitespace
switch (source_spl[pos_i]) {
case '\n':
text_s += '\\n';
state_i = 0;
break;
case '\r':
text_s += '\\r';
state_i = 0;
break;
case ' ':
case '\t':
// ggf. sammeln
text_s += source_spl[pos_i];
break;
default:
// Whitespace nach Code erkannt
if (this.preservePostWS_b == true) {
// trotzdem ausgeben
this.gen_o.write_px(text_s);
}
state_i = 0;
pos_i--; // Zeichen erneut verarbeiten
}
break;
}
pos_i++;
}
// welcher Zustand liegt abschließend vor?
if (state_i == 1) {
this.gen_o.write_px(text_s);
} else if (state_i == 2) {
this.gen_o.code_px(code_s);
} else if (state_i == 3) {
this.gen_o.substitute_px(subst_s);
} else if (state_i == 4) {
if (this.preservePreWS_b == true) {
this.gen_o.write_px(text_s);
}
} else if (state_i == 5) {
if (this.preservePostWS_b == true) {
this.gen_o.write_px(text_s);
}
}
return this.gen_o.generate_px();
}
}
// EOF

View File

@ -0,0 +1,61 @@
//------------------------------------------------------------------------------
// Template-Manager
// - Laden und Bereitstellen von Template-Quellen
//------------------------------------------------------------------------------
// depends-on:
// jquery
// te
//------------------------------------------------------------------------------
'use strict'
class TemplateManager_cl {
constructor () {
this.templates_o = {};
this.compiled_o = {};
this.teCompiler_o = new TemplateCompiler_cl();
// Templates als Ressource anfordern und speichern
var path_s = "/templates/";
$.ajax({
dataType: "json",
url: path_s,
type: 'GET',
context: this
})
.done(function (data_opl) {
this.templates_o = data_opl['templates'];
})
.fail(function(jqXHR_opl, textStatus_spl) {
alert( "[tm] Fehler bei Anforderung: " + textStatus_spl );
});
}
get_px (name_spl) {
alert (name_spl);
alert (this.templates_o);
if (name_spl in this.templates_o) {
return this.templates_o[name_spl];
} else {
return null;
}
}
execute_px (name_spl, data_opl) {
var compiled_o = null;
if (name_spl in this.compiled_o) {
compiled_o = this.compiled_o[name_spl];
} else {
// Übersetzen und ausführen
if (name_spl in this.templates_o) {
this.teCompiler_o.reset_px();
compiled_o = this.teCompiler_o.compile_px(this.templates_o[name_spl]);
this.compiled_o[name_spl] = compiled_o;
}
}
if (compiled_o != null) {
return compiled_o(data_opl);
} else {
return null;
}
}
}
// EOF