FlexitimeTracker/DataCenter_Windows/WindowsDataCenter/WindowsDataCenter/www/admin.js
2020-02-26 08:31:39 +00:00

222 lines
9.0 KiB
JavaScript

function AdminVM() {
var self = this;
self.groupsList = ko.observable(null);
self.groupEditItem = ko.observable(null);
self.unassignedCardList = ko.observable(null);
self.helpers = new Helpers();
self.policyMarkdown = "";
self.policyData = new policy();
self.renderer = new marked.Renderer();
self.renderer.blockquote = function(quote) {
return "<blockquote class=\"blockquote\">" + quote + "</blockquote>";
};
self.renderer.heading = function (text, level) {
var parserHandler = new Tautologistics.NodeHtmlParser.DefaultHandler(function (error) {
if (error)
throw new Error("Cannot parse \"" + text + "\" in markdown file.");
});
var parser = new Tautologistics.NodeHtmlParser.Parser(parserHandler);
parser.parseComplete(text);
var escaped = "unknown";
if (parserHandler.dom.length > 0) {
escaped = parserHandler.dom[0].raw.toLowerCase().trim().replace(/ /g, "-").replace(/#+/g,"");
}
return "<h" + level + " id=\"" + escaped + "\">"
// NOTE: We're setting display none INLINE, so you have
// to override with !important if you want it to show.
+ " <a class=\"heading-anchor\" style=\"display:none;\" href=\"#" + escaped + '">'
+ " <i class=\"oi oi-link-intact\"></i>"
+ " </a>"
+ text
+ "</h" + level + ">";
};
self.renderer.table = function(header, body) {
return "<table class=\"table\">" +
"<thead class=\"thead-default\">" +
header +
"</thead>" +
"<tbody>" +
body +
"</tbody>" +
"</table>";
};
/*
* Adds highlight.js classes to `code` blocks
*/
self.renderer.code = function(code, language) {
var valid = !!(language && hljs.getLanguage(language));
var highlighted = valid ? hljs.highlight(language, code).value : code
return "<pre><code class=\"hljs lang-" + language + "\">" + highlighted + "</code></pre>";
};
self.editor = new EasyMDE({
element: document.getElementById("policyEditor"),
showIcons: ["bold", "italic", "strikethrough", "heading", "heading-smaller", "heading-bigger", "heading-1", "heading-2", "heading-3", "code", "quote", "unordered-list", "ordered-list", "clean-block", "link", "table", "horizontal-rule", "guide", "table"],
hideIcons: ["preview", "side-by-side", "fullscreen"],
renderingConfig: {
markedOptions: {
renderer: self.renderer
}
}
});
self.editor.codemirror.on("changes",
function () {
self.policyData.Html(self.editor.options.previewRender(self.editor.value()));
});
self.uiPages = {
overview: "overview",
group: "groups",
home: function () { return this.overview; }
};
self.apiEndpoints = {
deleteGroups:"/api/groups/delete",
getGroups: "/api/groups",
editGroup: "/api/groups/edit",
getUnassignedCards: "/api/cards/unassigned",
clearUnassignedCards: "/api/cards/unassigned",
getPolicy:"/api/app/policy",
savePolicy:"/api/app/policy"
};
self.clearGroupForm = function () {
self.helpers.goToMenuOption(self.uiPages.group);
self.groupEditItem(null);
};
self.hideGroupForm = function () {
self.groupEditItem(null);
};
self.newGroupForm = function () {
self.groupEditItem({ Id: -1, Name: "" });
self.helpers.goToMenuOption(self.uiPages.group);
};
self.groupFormHidden = ko.computed(function () {
return self.groupEditItem() == null;
}, self);
self.editGroupClick = function (data) {
self.helpers.goToMenuOption(self.uiPages.group);
self.groupEditItem(data);
};
self.getGroups = function () {
var url = self.helpers.createRequestUrl(self.apiEndpoints.getGroups, null, false);
$.getJSON(url, function (res) {
self.groupsList(res);
}).fail(function (resp, status, error) {
console.log("error - getGroups");
var errorObj = self.helpers.processRequestFailure(resp, status, error);
});
};
self.deleteGroup = function (groupId) {
var url = self.helpers.createRequestUrl(self.apiEndpoints.deleteGroups,
[{ key: "groupId", value: groupId }],
false,
false);
$.ajax({
url: url,
type: "DELETE",
success: function () {
console.log("deleted " + groupId);
self.hideGroupForm();
self.helpers.goToMenuOption(self.uiPages.home());
}
});
console.log("delete: " + groupId);
};
self.submitGroupEdit = function(group) {
var url = self.helpers.createRequestUrl(self.apiEndpoints.editGroup, null, false);
$.post(url, group, function () {
}, "json")
.done(function () {
self.groupEditItem(null);
self.helpers.goToMenuOption(self.uiPages.home());
})
.fail(function (resp, status, error) {
self.helpers.goToMenuOption(self.uiPages.home());
var errorObj = self.helpers.processRequestFailure(resp, status, error);
});
};
self.getUnassignedCardData = function() {
var url = self.helpers.createRequestUrl(self.apiEndpoints.getUnassignedCards, null, false);
$.getJSON(url,
function(res) {
self.unassignedCardList(res);
}).fail(function(resp, status, error) {
console.log("error - getUnassignedCards");
var errorObj = self.helpers.processRequestFailure(resp, status, error);
});
};
self.clearUnassignedCards = function() {
var url = self.helpers.createRequestUrl(self.apiEndpoints.clearUnassignedCards, null, false);
$.ajax({
type: "DELETE",
url: url,
data: "",
success: function() {
self.getUnassignedCardData(); //update
},
error: function(jqxhr, status, error) {
console.log("error - clearUnassignedCards");
var errorObj = self.helpers.processRequestFailure(resp, status, error);
}
});
};
self.padNumber = function (number) {
return (number < 10 ? "0" : "") + number;
};
self.policySave = function () {
var url = self.helpers.createRequestUrl(self.apiEndpoints.savePolicy, null, false);
self.policyData.Markdown(self.editor.value()); //make sure we update it, as it doesnt push the value back into the variable
//console.log(self.policyData();)rea#
var data = ko.toJS(self.policyData);
$.post(url, data, function() {
}, "json") //todo: check this serialisation as the object is now complex.
.done(function() {
self.policyReload();
}).fail(function(resp, status, error) {
var errorObj = self.helpers.processRequestFailure(resp, status, error);
console.log(errorObj);
});
};
self.policyReload = function() {
var url = self.helpers.createRequestUrl(self.apiEndpoints.getPolicy,
[], false, false);
$.getJSON(url, function (res) {
//console.log(res);
self.editor.value(res.Markdown);
res.Version = (parseInt(res.Version) + 1).toString();
self.policyData.update(res);
$('#saveDialog').modal('hide');
}).fail(function (resp, status, error) {
console.log("error - policyReload");
var errObj = self.helpers.processRequestFailure(resp, status, error);
self.assignErrorObject(errObj.errorCode, errObj.errorMessage, "policyReload");
});
};
self.convertToDisplayDateTime = function (dateValue) {
var date = new Date(dateValue); // dd MM YY HH:mm:ss e.g.: 01 Mar 17 17:34:02
return date.getDate() + " "
+ date.toLocaleString("en-us", { month: "long" }) + " "
+ (date.getYear()-100) + " "
+ self.padNumber(date.getHours()) + ":"
+ self.padNumber(date.getMinutes()) + ":"
+ self.padNumber(date.getSeconds());
};
Sammy(function () {
this.disable_push_state = true;
this.get("#overview", function () {
self.getGroups();
self.getUnassignedCardData();
self.policyReload();
});
this.post("#editgroup", function () {
self.submitGroupEdit(self.groupEditItem());
return false;
});
//default route (home page)
this.get("", function () { this.app.runRoute("get", "#" + self.uiPages.home()) });
}).run();
};
ko.applyBindings(new AdminVM());