1. HTML
==================================
@using GDD.Enum
@{
ViewBag.Title = "Global Data Dictionary";
}
<div class="shortcut-area container-fluid">
<div data-bind="template: { name: 'shortcut-renderer', foreach: $data.Pages }"></div>
</div>
@section scripts {
@Scripts.Render("~/bundles/home")
<!-- Application Shortcut Item Renderer -->
<script id="shortcut-renderer" type="text/html">
<!-- ko if: !$data.AdminOnly() || $parent.IsAdmin() -->
<div class="shortcut">
<div class="shortcut-icon-wrapper">
<a class="shortcut-icon btn btn-link btn-block" data-bind="attr: { href: Url() }">
<i class="fa-3x fa" data-bind="css: Icon"></i>
</a>
</div>
<div class="shortcut-name-wrapper">
<a class="shortcut-name btn btn-link btn-block" data-bind="attr: { href: Url() }, text: Name"></a>
</div>
</div>
<!-- /ko -->
</script>
<script>
GDD.Site.OnPreinitialize(function (site) {
site.ContentModel(new GDD.Home.Managers.IndexManager(@Html.Raw(Json.Encode(ViewBag.CurrentAccessLevel <= (int)UserAccessLevel.EntityAdmin))));
});
GDD.Site.OnPostinitialize(function () {
site.ContentModel().GetRootApplications();
});
</script>
}
==================================
@using GDD.Enum
@{
ViewBag.Title = "Global Data Dictionary";
}
<div class="shortcut-area container-fluid">
<div data-bind="template: { name: 'shortcut-renderer', foreach: $data.Pages }"></div>
</div>
@section scripts {
@Scripts.Render("~/bundles/home")
<!-- Application Shortcut Item Renderer -->
<script id="shortcut-renderer" type="text/html">
<!-- ko if: !$data.AdminOnly() || $parent.IsAdmin() -->
<div class="shortcut">
<div class="shortcut-icon-wrapper">
<a class="shortcut-icon btn btn-link btn-block" data-bind="attr: { href: Url() }">
<i class="fa-3x fa" data-bind="css: Icon"></i>
</a>
</div>
<div class="shortcut-name-wrapper">
<a class="shortcut-name btn btn-link btn-block" data-bind="attr: { href: Url() }, text: Name"></a>
</div>
</div>
<!-- /ko -->
</script>
<script>
GDD.Site.OnPreinitialize(function (site) {
site.ContentModel(new GDD.Home.Managers.IndexManager(@Html.Raw(Json.Encode(ViewBag.CurrentAccessLevel <= (int)UserAccessLevel.EntityAdmin))));
});
GDD.Site.OnPostinitialize(function () {
site.ContentModel().GetRootApplications();
});
</script>
}
2. script file
=============================================
module GDD.Home.Managers {
"use strict";
export class IndexManager {
constructor(isAdmin: boolean = false) {
this.IsAdmin(isAdmin);
}
IsAdmin = ko.observable<boolean>(false);
Pages = ko.observableArray<Models.Page>([]);
// Remote call to load all root applications
GetRootApplications: () => void = () => {
this.Pages.push(new Models.Page({ Name: "Entities", Icon: "fa-line-chart", Url: "/Entities", AdminOnly: false }));
this.Pages.push(new Models.Page({ Name: "Entities (Bulk)", Icon: "fa-stack-overflow", Url: "/Bulk/Entities", AdminOnly: true }));
this.Pages.push(new Models.Page({ Name: "Pertinence Rules", Icon: "fa-flask", Url: "/Pertinence", AdminOnly: false }));
this.Pages.push(new Models.Page({ Name: "Display Groups", Icon: "fa-tv", Url: "/DisplayGroups", AdminOnly: false }));
this.Pages.push(new Models.Page({ Name: "Possible Value Groups", Icon: "fa-list-ul", Url: "/PossibleValueGroups", AdminOnly: false }));
this.Pages.push(new Models.Page({ Name: "API", Icon: "fa-cogs", Url: "/Help", AdminOnly: false }));
}
}
}
3. script file
===============================
var site: GDD.Site;
module GDD {
"use strict";
export class Site {
// dom
$content = $("#content");
$ding = $("#dingSound");
$exceptionModal = $("#exceptionModal");
$cancelConfirmModal = $("#cancel-confirm");
$cwsTimeoutModal = $("#cwsTimeoutModal");
$groupNameHelpTemplate = $("#group-name-help-template");
$loadModal = $("#loadModal");
$navMenu = <MMenu>$("#nav-menu");
$dataTypeHelpTemplate = $("#data-type-help-template");
$dataTypePossibleValGroupHelp = $("#data-type-possiblegroup-help-template");
$disabledDataTypePossibleValGroupHelp = $("#disabled-data-type-possiblegroup-help-template");
$displayGroupHelpTemplate = $("#display-group-help-template");
$displayGroupPluginHelpTemplate = $("#display-group-plugin-help-template");
$displayGroupDetailHelpTemplate = $("#display-group-detail-help-template");
$displayGroupDragHelpTemplate = $("#display-group-drag-help-template");
$displayGroupDisplayNameHelpTemplate = $("#display-group-display-name-help-template");
$possibleValueGroupHelpTemplate = $("#possible-value-group-help-template");
$possibleValueGroupTabHelpTemplate = $("#possible-value-group-tab-help-template");
$pertinenceHelpTemplate = $("#pertinence-help-template");
$searchHelpTemplate = $("#search-help-template");
$searchPrefPageSizeHelpTemplate = $("#search-pref-page-size-help-template");
$unitHelpTemplate = $("#unit-help-template");
$validationPanel = $("#validation-panel");
$possibleValueHelpTemplate = $("#possible-value-template");
$entityNameHelpTemplate = $("#entity-name-template");
$entityNamePrefixHelpTemplate = $("#entity-name-prefix-template");
$entityNameSuffixHelpTemplate = $("#entity-name-suffix-template");
$entityNameReplaceHelpTemplate = $("#entity-name-replace-template");
$entityNameReplaceWithHelpTemplate = $("#entity-name-replace-with-template");
$fileExtensionsHelpTemplate = $("#file-extensions-help-template");
$personPanel = $("#person-panel");
$possibleValueFloatHelpTemplate = $("#possible-value-float-help-template");
$possibleValueIntegerHelpTemplate = $("#possible-value-integer-help-template");
$quantityHelpTemplate = $("#quantity-help-template");
$deleteHelpTemplate = $("#delete-help-template");
$unDeleteHelpTemplate = $("#unDelete-help-template");
$showMoreInfo = $("#more-info-modal");
$precisionHelpTemplate = $("#precision-help-template");
$defaultValueSymbolicHelpTemplate = $("#default-value-symbolic-help-template");
// custom view model
ContentModel = ko.observable<any>({});
// controls
PersonSearchControl = new Controls.PersonSearch();
// tooltips
DataTypeTooltip = ko.pureComputed<any>({
read: (): any => {
var content = this.$dataTypeHelpTemplate.html();
return kendo.template(content);
}
});
DisplayGroupTooltip = ko.pureComputed<any>({
read: (): any => {
var content = this.$displayGroupHelpTemplate.html();
return kendo.template(content);
}
});
DisplayGroupPluginTooltip = ko.pureComputed<any>({
read: (): any => {
var content = this.$displayGroupPluginHelpTemplate.html();
return kendo.template(content);
}
});
DisplayGroupDetailTooltip = ko.pureComputed<any>({
read: (): any => {
var content = this.$displayGroupDetailHelpTemplate.html();
return kendo.template(content);
}
});
DisplayGroupDisplayNameTooltip = ko.pureComputed<any>({
read: (): any => {
var content = this.$displayGroupDisplayNameHelpTemplate.html();
return kendo.template(content);
}
});
DisplayGroupDragTooltip = ko.pureComputed<any>({
read: (): any => {
var content = this.$displayGroupDragHelpTemplate.html();
return kendo.template(content);
}
});
PertinenceTooltip = ko.pureComputed<any>({
read: (): any => {
var content = this.$pertinenceHelpTemplate.html();
return kendo.template(content);
}
});
PossibleValueGroupTooltip = ko.pureComputed<any>({
read: (): any => {
var content = this.$possibleValueGroupHelpTemplate.html();
return kendo.template(content);
}
});
PossibleValueGroupTabTooltip = ko.pureComputed<any>({
read: (): any => {
var content = this.$possibleValueGroupTabHelpTemplate.html();
return kendo.template(content);
}
});
GroupNameTooltip = ko.pureComputed<any>({
read: (): any => {
var content = this.$groupNameHelpTemplate.html();
return kendo.template(content);
}
});
SearchTooltip = ko.pureComputed<any>({
read: (): any => {
var content = this.$searchHelpTemplate.html();
return kendo.template(content);
}
});
SearchPrefPageSizeTooltip = ko.pureComputed<any>({
read: (): any => {
var content = this.$searchPrefPageSizeHelpTemplate.html();
return kendo.template(content);
}
});
UnitTooltip = ko.pureComputed<any>({
read: (): any => {
var content = this.$unitHelpTemplate.html();
return kendo.template(content);
}
});
PossibleValueTooltip = ko.pureComputed<any>({
read: (): any => {
var content = this.$possibleValueHelpTemplate.html();
return kendo.template(content);
}
});
EntityNameTooltip = ko.pureComputed<any>({
read: (): any => {
var content = this.$entityNameHelpTemplate.html();
return kendo.template(content);
}
});
EntityNamePrefixTooltip = ko.pureComputed<any>({
read: (): any => {
var content = this.$entityNamePrefixHelpTemplate.html();
return kendo.template(content);
}
});
EntityNameSuffixTooltip = ko.pureComputed<any>({
read: (): any => {
var content = this.$entityNameSuffixHelpTemplate.html();
return kendo.template(content);
}
});
EntityNameReplaceTooltip = ko.pureComputed<any>({
read: (): any => {
var content = this.$entityNameReplaceHelpTemplate.html();
return kendo.template(content);
}
});
EntityNameReplaceWithTooltip = ko.pureComputed<any>({
read: (): any => {
var content = this.$entityNameReplaceWithHelpTemplate.html();
return kendo.template(content);
}
});
DataTypePossibleValGrpTooltip = ko.pureComputed<any>({
read: (): any => {
var content = this.$dataTypePossibleValGroupHelp.html();
return kendo.template(content);
}
});
DisabledDataTypePossibleValGrpTooltip = ko.pureComputed<any>({
read: (): any => {
var content = this.$disabledDataTypePossibleValGroupHelp.html();
return kendo.template(content);
}
});
PossibleValueFloatTooltip = ko.pureComputed<any>({
read: (): any => {
var content = this.$possibleValueFloatHelpTemplate.html();
return kendo.template(content);
}
});
PossibleValueIntegerTooltip = ko.pureComputed<any>({
read: (): any => {
var content = this.$possibleValueIntegerHelpTemplate.html();
return kendo.template(content);
}
});
QuantityToolTip = ko.pureComputed<any>({
read: (): any => {
var content = this.$quantityHelpTemplate.html();
return kendo.template(content);
}
});
DeleteToolTip = ko.pureComputed<any>({
read: (): any => {
var content = this.$deleteHelpTemplate.html();
return kendo.template(content);
}
});
UnDeleteToolTip = ko.pureComputed<any>({
read: (): any => {
var content = this.$unDeleteHelpTemplate.html();
return kendo.template(content);
}
});
PrecisionToolTip = ko.pureComputed<any>({
read: (): any => {
var content = this.$precisionHelpTemplate.html();
return kendo.template(content);
}
});
DefaultValueSymbolicToolTip=ko.pureComputed<any>({
read: (): any => {
var content = this.$defaultValueSymbolicHelpTemplate.html();
return kendo.template(content);
}
});
FileExtensionsToolTip = ko.pureComputed<any>({
read: (): any => {
var content = this.$fileExtensionsHelpTemplate.html();
return kendo.template(content);
}
});
OpenEntity = (entity: Entity.Models.EntityViewModel, event: JQueryEventObject): void => {
if (entity !== null && event.which !== 3)
window.open(site.BaseUrl() + "Entities/" + entity.ID());
};
OpenDisplayGroup = (displayGroup: DisplayGroup.Models.DisplayGroupViewModel): void => {
if (displayGroup !== null)
window.open(site.BaseUrl() + "DisplayGroups/" + displayGroup.ID());
};
OpenPertinence = (pertinenceGroup: Pertinence.Models.PertinenceGroupViewModel): void => {
if (pertinenceGroup !== null)
window.open(site.BaseUrl() + "Pertinence/" + pertinenceGroup.ID());
};
// properties
DateTimeFormats = ko.observableArray<Models.DateTimeFormatViewModel>([
new Models.DateTimeFormatViewModel("Date Only", Models.DateTimeFormat.DateOnly),
new Models.DateTimeFormatViewModel("Date and Time", Models.DateTimeFormat.DateTime),
new Models.DateTimeFormatViewModel("Time Only", Models.DateTimeFormat.TimeOnly)
]);
CurrentPerson = ko.observable<Models.Person>(null);
BaseUrl = ko.observable<string>(null);
AccessLevels = ko.observableArray<Models.UserAccessLevel>([]);
ColorMap = ko.observable<{ [key: string]: Models.ThemeColors }>({});
CurrentTheme = ko.observable<number>(0);
Exception = ko.observable<GDD.Models.SerializableException>(new GDD.Models.SerializableException());
CancelConfirmViewModel = ko.observable<GDD.Models.CancelConfirmModalViewModel>(new GDD.Models.CancelConfirmModalViewModel());
LoaderText = ko.observable<string>(null);
LoaderStatic = ko.observable<boolean>(true);
LockHeader = ko.observable<boolean>(true);
LeftMenuOpen = ko.observable<boolean>(true);
Themes = ko.observableArray<Models.ThemeItem>([
new Models.ThemeItem("midnight-preview.png", "midnight.bootstrap-theme.css", "Midnight", "Light on dark",
"kendo.common-material.core.min.css", "kendo.common-material.min.css", "kendo.materialblack.min.css",
"kendo.materialblack.mobile.min.css"),
new Models.ThemeItem("afternoon-preview.png", "bootstrap-theme.css", "Afternoon", "Dark on light",
"kendo.common-bootstrap.core.min.css", "kendo.common-bootstrap.min.css", "kendo.bootstrap.min.css",
"kendo.bootstrap.mobile.min.css"),
new Models.ThemeItem("lumen-preview.png", "lumen.bootstrap-theme.css", "Lumen", "Light and shadow", "kendo.common.core.min.css",
"kendo.common-fiori.min.css", "kendo.fiori.min.css", "kendo.fiori.mobile.min.css"),
new Models.ThemeItem("paper-preview.png", "paper.bootstrap-theme.css", "Paper", "Material is the metaphor",
"kendo.common-material.core.min.css", "kendo.common-material.min.css", "kendo.material.min.css",
"kendo.material.mobile.min.css"),
new Models.ThemeItem("sandstone-preview.png", "sandstone.bootstrap-theme.css", "Sandstone", "A touch of warmth",
"kendo.common.core.min.css", "kendo.common.min.css", "kendo.metro.min.css", "kendo.metro.mobile.min.css"),
new Models.ThemeItem("slate-preview.png", "slate.bootstrap-theme.css", "Slate", "Shades of gunmetal gray",
"kendo.common-bootstrap.core.min.css", "kendo.common-bootstrap.min.css", "kendo.moonlight.min.css",
"kendo.moonlight.mobile.min.css")
]);
LoadedTheme = ko.computed<Models.ThemeItem>({
read: (): Models.ThemeItem => {
return this.Themes()[this.CurrentTheme()];
},
write: (value: Models.ThemeItem): void => {
this.loadTheme(this.Themes()[this.CurrentTheme()], value);
}
});
PageSizes = [
{ Name: "20", Size: 20 },
{ Name: "50", Size: 50 },
{ Name: "100", Size: 100 },
{ Name: "500", Size: 500 },
{ Name: "All", Size: 99999 }
];
TopHeaderIsVisible = ko.observable<boolean>(true);
TopOffset = ko.observable<number>(0);
UserPreferences = ko.observable<Models.IDictionary<Models.UserPreferenceViewModel>>();
BottomOffset = ko.observable<number>(0);
ValidationItems = ko.observable<Models.ModelState>(new Models.ModelState());
WindowWidth = ko.observable<number>(window.innerWidth);
WindowHeight = ko.observable<number>(window.innerHeight);
WindowXs = ko.pureComputed<boolean>({
read: (): boolean => {
return this.WindowWidth() >= 0;
}
});
WindowSm = ko.pureComputed<boolean>({
read: (): boolean => {
return this.WindowWidth() >= 768;
}
});
WindowMd = ko.pureComputed<boolean>({
read: (): boolean => {
return this.WindowWidth() >= 992;
}
});
WindowLg = ko.pureComputed<boolean>({
read: (): boolean => {
return this.WindowWidth() >= 1200;
}
});
MaxHeight = ko.pureComputed<number>({
read: (): number => {
return this.WindowWidth() > 992 ? this.WindowHeight() - (this.TopOffset() + this.BottomOffset()) : 999999;
}
});
MaxHeightCss = ko.pureComputed<string>({
read: (): string => {
// if we are above mobile/tablet breakpoint return inner content height else
return this.WindowWidth() > 992 ? this.MaxHeight() + "px" : "none";
}
}, this);
// static private
private static _preHandlers: Array<(site: Site) => any> = new Array();
private static _postHandlers: Array<() => any> = new Array();
// private
private currentRequest: JQueryXHR;
private delta: number = 5;
private lastScrollTop: number = 0;
private placeholderTheme = new Models.ThemeItem(null, "placeholder.bootstrap-theme.css", null, null,
"kendo.common.core.min.css", "kendo.common.min.css", "kendo.default.min.css", "kendo.default.mobile.min.css");
private scrollChanged: boolean = true;
private maxTileHeight: number = 0;
private notification: kendo.ui.Notification;
private openModal: JQuery;
// pre-initialization handlers
static OnPreinitialize: (func: (site: Site) => any) => void = (func: (site: Site) => void) => {
if (func) {
Site._preHandlers.push(func);
}
};
// post-initialization handlers
static OnPostinitialize: (func: () => any) => void = (func: () => void) => {
if (func) {
Site._postHandlers.push(func);
}
};
// constructor
constructor(jsObject: any) {
if (jsObject.CurrentPerson) {
this.CurrentPerson(new Models.Person(jsObject.CurrentPerson));
}
if (jsObject.UserPreferences) {
this.UserPreferences(Models.UserPreferenceViewModelJS.fromArray(jsObject.UserPreferences));
}
if (jsObject.BaseUrl) {
this.BaseUrl(jsObject.BaseUrl);
} else {
this.BaseUrl(window.location.origin ? window.location.origin + "/" : window.location.protocol + "/" + window.location.host + "/");
}
if (jsObject.AccessLevels) {
this.AccessLevels(Models.UserAccessLevel.fromArray(jsObject.AccessLevels));
}
}
// initialisation
static Init = (jsObject: any): void => {
// init site object & pre handlers
site = new Site(jsObject);
for (let i: number = 0; i < Site._preHandlers.length; i++) {
Site._preHandlers[i](site);
}
// bind site object
ko.applyBindings(site);
// setup navigation menu
site.$navMenu.mmenu({
offCanvas: {
pageSelector: "#site-container",
zposition: "next"
},
extensions: ["widescreen", "border-full", "multiline", "theme-dark"]
},
{
clone: false
});
site.$personPanel.mmenu({
offCanvas: {
position: "right",
zposition: "front"
},
extensions: ["theme-dark", "pageshadow"],
navbar: {
title: "Find a Person"
}
});
// setup person panel
site.$validationPanel.mmenu({
offCanvas: {
position: "right",
zposition: "front"
},
extensions: ["pageshadow"],
navbar: {
title: "Attention"
}
});
// default focus to search text
site.$personPanel.data("mmenu").bind("opened", () => {
site.PersonSearchControl.$searchText.focus();
});
// load theme
site.CurrentTheme(site.UserPreferences()[Models.UserPreferences.Theme].Value());
if ($("link[href*='/Content/gddcoretheme']").length === 1) {
site.loadTheme(null, site.Themes()[site.CurrentTheme()]);
} else if ($("link[href*='/Content/placeholder.bootstrap-theme.css']").length === 1) {
site.loadTheme(site.placeholderTheme, site.Themes()[site.CurrentTheme()]);
} else {
for (let i: number = 0; i < site.Themes().length; i++) {
if ($(`link[href*="/Content/${site.Themes()[i].StyleSheet()}"]`).length === 1) {
site.loadTheme(site.Themes()[i], site.Themes()[site.CurrentTheme()]);
break;
}
}
}
// process post handlers
for (let i: number = 0; i < Site._postHandlers.length; i++) {
Site._postHandlers[i]();
}
// to allow for modals & panels to play nice with one another
var rightPanels = $(".mm-menu.mm-right");
rightPanels.each((index: number, elem: Element) => {
var api: any = $(elem).data("mmenu");
api.bind("opening", () => {
if ($("body").data("modalmanager")) {
var openModals: any = $("body").data("modalmanager").getOpenModals();
var loaderOrExceptionModalIsOpen: boolean = false;
var containerZIndex: number = 0;
for (var i: number = 0; i < openModals.length; i++) {
if (openModals[i].$element.attr("id") === "loadModal" || openModals[i].$element.attr("id") === "exceptionModal") {
loaderOrExceptionModalIsOpen = true;
containerZIndex = 0;
}
if (!loaderOrExceptionModalIsOpen) {
if (+openModals[i].$container.css("z-index") > containerZIndex) {
containerZIndex = +openModals[i].$container.css("z-index");
}
}
}
if (containerZIndex > 0) {
$(elem).css("z-index", containerZIndex + 2);
$("#mm-blocker").css("z-index", containerZIndex + 1);
} else if (loaderOrExceptionModalIsOpen) {
$(elem).removeAttr("style");
$("#mm-blocker").removeAttr("style");
} else {
$("#mm-blocker").css("z-index", 1039);
}
}
});
});
site.poll();
// heartbeat
setInterval(site.poll, 300);
// scrolling
$(window).scroll((event: any) => {
site.scrollChanged = true;
});
$(window).resize(() => {
site.WindowWidth(window.innerWidth);
site.WindowHeight(window.innerHeight);
site.ResizeTiles();
});
};
Beep = (): void => {
var sound: any = this.$ding;
sound[0].pause();
sound[0].currentTime = 0;
sound[0].play();
};
private checkScroll = (): void => {
if (this.LockHeader()) {
return;
}
var st: number = $(document).scrollTop();
// scrolled more than delta?
if (Math.abs(this.lastScrollTop - st) <= this.delta) {
return;
}
if (st > this.lastScrollTop && st > this.TopOffset()) {
if (this.TopHeaderIsVisible()) {
this.TopHeaderIsVisible(false);
$("#top-header").stop(true, true).delay(200).animate({
top: -this.TopOffset()
}, 500, () => { return; });
}
} else {
if (st + $(window).height() < $(document).height()) {
if (!this.TopHeaderIsVisible()) {
this.TopHeaderIsVisible(true);
$("#top-header").stop(true, true).animate({
top: 0
}, 500);
}
} else {
if (!this.TopHeaderIsVisible()) {
this.TopHeaderIsVisible(true);
$("#top-header").stop(true, true).animate({
top: 0
}, 100);
}
}
}
this.lastScrollTop = st;
};
// check the Z-index of the modal window
private checkZIndex = ($modal: JQuery): void => {
var openRightPanels: JQuery = $(".mm-menu.mm-right.mm-opened");
var maxZIndex: number = 0;
for (var i: number = 0; i < openRightPanels.length; i++) {
var elemZIndex: number = +$(openRightPanels[i]).css("z-index");
if (elemZIndex > maxZIndex) {
maxZIndex = elemZIndex;
}
}
if (maxZIndex > 0) {
$modal.parent().css("z-index", maxZIndex + 2);
$modal.parent().next(".modal-backdrop").css("z-index", maxZIndex + 1);
}
};
private loadTheme = (oldTheme: Models.ThemeItem, newTheme: Models.ThemeItem): void => {
var newIndex = this.Themes.indexOf(newTheme);
this.CurrentTheme(newIndex);
// remove html theme class
if (oldTheme && oldTheme.Name()) {
$("html").removeClass(oldTheme.Name() + "-theme");
}
// add html theme class
if (newTheme && newTheme.Name()) {
$("html").addClass(newTheme.Name() + "-theme");
}
if ($("link[href*=\"/Content/gddcoretheme\"]").length === 1) {
var fullPath: string = $("link[href*=\"/Content/gddcoretheme\"]").attr("href");
fullPath = fullPath.substring(0, fullPath.lastIndexOf("/") + 1);
$($("link[href*=\"/Content/gddcoretheme\"]")[0]).attr("href", fullPath + newTheme.StyleSheet());
$($("link[href*=\"/Content/kendocoretheme\"]")[0]).attr("href", fullPath + newTheme.KendoCoreStyleSheet());
$($("link[href*=\"/Content/kendocommontheme\"]")[0]).attr("href", fullPath + newTheme.KendoCommonStyleSheet());
$($("link[href*=\"/Content/kendotheme\"]")[0]).attr("href", fullPath + newTheme.KendoThemeStyleSheet());
$($("link[href*=\"/Content/kendomobiletheme\"]")[0]).attr("href", fullPath + newTheme.KendoMobileThemeStyleSheet());
} else if ($(`link[href*="/Content/${oldTheme.StyleSheet()}"]`).length === 1) {
var href = $(`link[href*="/Content/${oldTheme.StyleSheet()}"]`).attr("href");
var href2 = href.replace(oldTheme.StyleSheet(), newTheme.StyleSheet());
var kendoCore = $(`link[href*="/Content/${oldTheme.KendoCoreStyleSheet()}"]`).attr("href");
var kendoCore2 = kendoCore.replace(oldTheme.KendoCoreStyleSheet(), newTheme.KendoCoreStyleSheet());
var kendoCommon = $(`link[href*="/Content/${oldTheme.KendoCommonStyleSheet()}"]`).attr("href");
var kendoCommon2 = kendoCommon.replace(oldTheme.KendoCommonStyleSheet(), newTheme.KendoCommonStyleSheet());
var kendoTheme = $(`link[href*="/Content/${oldTheme.KendoThemeStyleSheet()}"]`).attr("href");
var kendoTheme2 = kendoTheme.replace(oldTheme.KendoThemeStyleSheet(), newTheme.KendoThemeStyleSheet());
var kendoMobileTheme = $(`link[href*="/Content/${oldTheme.KendoMobileThemeStyleSheet()}"]`).attr("href");
var kendoMobileTheme2 = kendoMobileTheme.replace(oldTheme.KendoMobileThemeStyleSheet(), newTheme.KendoMobileThemeStyleSheet());
$(`link[href*="/Content/${oldTheme.StyleSheet()}"]`).attr("href", href2);
$(`link[href*="/Content/${oldTheme.KendoCommonStyleSheet()}"]`).attr("href", kendoCommon2);
$(`link[href*="/Content/${oldTheme.KendoCoreStyleSheet()}"]`).attr("href", kendoCore2);
$(`link[href*="/Content/${oldTheme.KendoThemeStyleSheet()}"]`).attr("href", kendoTheme2);
$(`link[href*="/Content/${oldTheme.KendoMobileThemeStyleSheet()}"]`).attr("href", kendoMobileTheme2);
}
setTimeout(this.mapColors, 500);
};
private mapColors = (): void => {
var e1 = $("<div class=\"btn-primary\"></div>");
var e2 = $("<div class=\"btn-info\"></div>");
var e3 = $("<div class=\"btn-success\"></div>");
var e4 = $("<div class=\"btn-danger\"></div>");
var e5 = $("<div class=\"btn-default\"></div>");
var e6 = $("<div class=\"btn-warning\"></div>");
$("body").append(e1).append(e2).append(e3).append(e4).append(e5);
this.ColorMap[Models.BootstrapColors[Models.BootstrapColors.primary]] =
new Models.ThemeColors(e1.css("backgroundColor"), e1.css("borderColor"), e1.css("color"));
this.ColorMap[Models.BootstrapColors[Models.BootstrapColors.info]] =
new Models.ThemeColors(e2.css("backgroundColor"), e2.css("borderColor"), e2.css("color"));
this.ColorMap[Models.BootstrapColors[Models.BootstrapColors.success]] =
new Models.ThemeColors(e3.css("backgroundColor"), e3.css("borderColor"), e3.css("color"));
this.ColorMap[Models.BootstrapColors[Models.BootstrapColors.danger]] =
new Models.ThemeColors(e4.css("backgroundColor"), e4.css("borderColor"), e4.css("color"));
this.ColorMap[Models.BootstrapColors[Models.BootstrapColors.default]] =
new Models.ThemeColors(e5.css("backgroundColor"), e5.css("borderColor"), e5.css("color"));
this.ColorMap[Models.BootstrapColors[Models.BootstrapColors.warning]] =
new Models.ThemeColors(e6.css("backgroundColor"), e6.css("borderColor"), e6.css("color"));
e1.remove();
e2.remove();
e3.remove();
e4.remove();
e5.remove();
e6.remove();
this.ColorMap.notifySubscribers();
};
private poll = (): void => {
if (this.TopHeaderIsVisible()) {
this.TopOffset($("#top-header").outerHeight());
}
this.BottomOffset($("#action-menu") ? $("#action-menu").outerHeight() : 0);
if ($(".action-bar").length) {
$(".action-bar").css("padding-bottom", $("#action-menu").outerHeight());
}
if ($(".shortcut>div").length) {
// get an array of all element heights
var elementHeights: HTMLElement[] = $(".shortcut>div").map(function (): number {
return $(this).outerHeight();
}).get();
}
if (site.scrollChanged) {
site.checkScroll();
site.scrollChanged = false;
}
};
ResizeTiles = (): void => {
var currentTallest = 0,
currentRowStart = 0,
rowDivs = new Array<JQuery>(),
$el: JQuery,
topPosition = 0;
$(".shortcut").each((index, element) => {
$el = $(element);
$($el).height("auto");
topPosition = $el.position().top;
if (currentRowStart < topPosition - 1 || currentRowStart > topPosition + 1) {
for (let currentDiv = 0; currentDiv < rowDivs.length; currentDiv++) {
rowDivs[currentDiv].height(currentTallest);
}
rowDivs = [];
currentRowStart = topPosition;
currentTallest = $el.height();
rowDivs.push($el);
} else {
rowDivs.push($el);
currentTallest = Math.max(currentTallest, $el.height());
}
});
for (let currentDiv = 0; currentDiv < rowDivs.length; currentDiv++) {
rowDivs[currentDiv].height(currentTallest);
}
};
// get a url
GetApiUrl = (controller: string, action: string): string => {
return this.BaseUrl() + "api/" + controller + "/" + action;
};
static GetUrl = (controller: string, action: string): string => {
return site.BaseUrl() + controller + "/" + action;
};
ShowMoreInfo = (): void => {
this.$showMoreInfo.modal("show");
};
// Request resource
RequestResource = (route: string, httpMethod: Models.HttpMethod, data: any, callback: Function,
loaderText: string = null, autoHideLoader: boolean = true, staticLoader: boolean = true,
errorCallback: Function = null, showError: boolean = true): JQueryXHR => {
if (loaderText) {
this.ShowLoader(loaderText, staticLoader);
}
//Based on the http method we need to change the data going into the request
var requestData: any;
switch (httpMethod) {
case Models.HttpMethod.PATCH:
requestData = ko.toJSON(data);
break;
case Models.HttpMethod.POST:
requestData = ko.toJSON(data);
break;
case Models.HttpMethod.PUT:
requestData = ko.toJSON(data);
break;
case Models.HttpMethod.DELETE:
requestData = ko.toJSON(data);
break;
default:
requestData = data;
break;
}
var result = $.ajax({
url: route,
type: Models.HttpMethod[httpMethod],
data: requestData,
contentType: "application/json"
});
this.currentRequest = result;
result.done((result: any, textStatus: string, jqXHR: JQueryXHR): void => {
this.HandleResult(jqXHR, result, callback);
}).fail((jqXHR: JQueryXHR, textStatus: string): void => {
if (jqXHR.status !== 0 && jqXHR.statusText !== "abort") {
if (jqXHR.status === 422) {
this.HandleValidationErrors(jqXHR.responseJSON, showError);
} else if (jqXHR.status === 401) {
this.HandleNotAuthorisedError();
}
else {
this.HandleError(GDD.Models.SerializableException.fromFailedPromise(jqXHR, textStatus), showError);
}
if (errorCallback) {
errorCallback();
}
}
}).always((): void => {
if (autoHideLoader) {
this.HideLoader();
}
this.currentRequest = null;
});
return result;
};
// remote call handler
HandleResult = (jqXHR: JQueryXHR, response: any, callback: Function, clearValidation: boolean = true): void => {
if (clearValidation) {
this.ValidationItems(new Models.ModelState());
}
if (response && response.Result && response.Result.hasOwnProperty("Url")) {
this.ShowLoader("Reloading...", true);
window.location.replace(response.Result.Url);
} else {
if (callback) {
callback(response);
}
}
};
// error handler
HandleError = (error: Models.SerializableException, showError: boolean = true): void => {
this.Exception(error);
this.HideLoader();
if (showError) {
this.openModal = $(".modal:visible:not([id='loadModal'])").length
? $(".modal:visible")
: null;
if (this.openModal !== null) this.openModal.modal("hide");
this.$exceptionModal.modal("show");
this.checkZIndex(site.$exceptionModal);
}
};
HideError = (): void => {
this.$exceptionModal.modal("hide");
if (this.openModal !== null) this.openModal.modal("show");
this.openModal = null;
};
// error handler
HandleNotAuthorisedError = (): void => {
this.HideLoader();
this.$cwsTimeoutModal.modal("show");
this.checkZIndex(site.$cwsTimeoutModal);
};
// validation handler
HandleValidationErrors = (response: Models.ModelStateJS, showError: boolean): void => {
if (response) {
this.ValidationItems(new Models.ModelState(response));
}
if (showError) {
var openRightPanels: JQuery = $(".mm-menu.mm-right.mm-opened").not("#validation-panel");
var closedPanelCount: number = -1;
if (openRightPanels.length > 0) {
openRightPanels.each((index: number, elem: Element) => {
var api: any = $(elem).data("mmenu");
api.bind("close", () => {
closedPanelCount += 1;
if (closedPanelCount === openRightPanels.length - 1) {
setTimeout(() => {
this.$validationPanel.data("mmenu").open();
}, 500);
}
});
$(elem).data("mmenu").close();
});
} else if (!$("#validation-panel").hasClass(".mm-opened")) {
this.$validationPanel.data("mmenu").open();
}
}
};
// reloads the page
ReloadPage = (): void => {
location.reload(true);
};
// ensure a string is a property name of an object
static NameOf = <T>(name: keyof T) => name;
// displays the loader
ShowLoader = (text: string, isStatic: boolean = true): void => {
site.LoaderText(text);
site.LoaderStatic(isStatic);
site.$loadModal.modal("show");
this.checkZIndex(site.$loadModal);
};
// hides the loader
HideLoader = (): void => {
site.$loadModal.modal("hide");
};
ShowCancelConfirm = (message: string, confirmButtonText: string, cancelButtonText: string, modalTitleText: string, confirmButtonCallBack: any, cancelButtonCallBack?: any): void => {
site.CancelConfirmViewModel().Message(message);
site.CancelConfirmViewModel().CancelButtonText(cancelButtonText);
site.CancelConfirmViewModel().ConfirmButtonText(confirmButtonText);
site.CancelConfirmViewModel().ModalTitle(modalTitleText);
if (cancelButtonCallBack)
site.CancelConfirmViewModel().CancelCallBack = cancelButtonCallBack;
site.CancelConfirmViewModel().ConfirmCallBack = confirmButtonCallBack;
site.$cancelConfirmModal.modal("show");
this.checkZIndex(site.$cancelConfirmModal);
};
// displays the action bar
ShowActionBar = (): void => {
if ($("#action-menu").hasClass("hidden")) {
$("#action-menu").removeClass("hidden");
$("#content>div.container-fluid").addClass("action-bar");
}
};
// hides the action bar
HideActionBar = (): void => {
if (!$("#action-menu").hasClass("hidden")) {
$("#action-menu").addClass("hidden");
$("#content>div.container-fluid").removeClass("action-bar");
}
};
GetNotification(): kendo.ui.Notification {
if (this.notification == null) {
this.notification = $("#notification").kendoNotification({
position: {
bottom: 0,
right: 0
},
stacking: "up",
autoHideAfter: 5000,
animation: {
open: {
effects: "slideIn:left"
},
close: {
effects: "slideIn:left",
reverse: true
}
},
width: 300,
templates: [{
type: "info",
template: "<div class='k-notification-wrap'><div style='word-wrap: break-word;white-space: normal;'><span class='glyphicon glyphicon-info-sign'></span> #= myMessage #</div></div>"
},
{
type: "success",
template: "<div class='k-notification-wrap'><div style='word-wrap: break-word;white-space: normal;'><span class='glyphicon glyphicon-ok-circle'></span> #= myMessage #</div></div>"
},
{
type: "warning",
template: "<div class='k-notification-wrap'><div style='word-wrap: break-word;white-space: normal;'><span class='glyphicon glyphicon-alert'></span> #= myMessage #</div></div>"
},
{
type: "error",
template: "<div class='k-notification-wrap'><div style='word-wrap: break-word;white-space: normal;'><span class='glyphicon glyphicon-exclamation-sign'></span> #= myMessage #</div></div>"
}]
}).data("kendoNotification");
}
return this.notification;
}
// notifications
InfoNotify: (data: any) => void = (data: any) => {
this.GetNotification().info(() => { return { myMessage: data }; });
};
SuccessNotify: (data: any) => void = (data: any) => {
this.GetNotification().success(() => { return { myMessage: data }; });
};
WarningNotify: (data: any) => void = (data: any) => {
this.GetNotification().warning(() => { return { myMessage: data }; });
};
ErrorNotify: (data: any) => void = (data: any) => {
this.GetNotification().error(() => { return { myMessage: data }; });
};
BuildCustomApiUri = (route: string, routeData?: any[]): string => {
if (routeData) {
for (let i = 0; i < routeData.length; i++) {
//replace the route parameters with route data
route = route.replace("{" + i + "}", routeData[i]);
}
}
return this.BaseUrl() + "api/" + route;
};
BuildCustomUri = (route: string, routeData?: any[]): string => {
if (routeData) {
for (let i = 0; i < routeData.length; i++) {
//replace the route parameters with route data
route = route.replace("{" + i + "}", routeData[i]);
}
}
return this.BaseUrl() + route;
};
HideLeftMenu = (): void => {
// add transition classes
$(".left-menu").addClass("left-menu-transition");
$(".left-menu-content").addClass("left-menu-content-transition");
// collapse the menu
$(".left-menu").addClass("left-menu-collapse");
$(".left-menu-content").addClass("left-menu-content-collapse");
// after the menu is collapsed, remove the transition classes
// prevents unwanted transitions when resizing the window
setTimeout(() => {
$(".left-menu").removeClass("left-menu-transition");
$(".left-menu-content").removeClass("left-menu-content-transition");
this.LeftMenuOpen(false);
}, 500);
};
ShowLeftMenu = (): void => {
// add transition classes
$(".left-menu").addClass("left-menu-transition");
$(".left-menu-content").addClass("left-menu-content-transition");
// show the menu
$(".left-menu-content").removeClass("left-menu-content-collapse");
$(".left-menu").removeClass("left-menu-collapse");
// after the menu is opened, remove the transition classes
// prevents unwanted transitions when resizing the window
setTimeout(() => {
$(".left-menu").removeClass("left-menu-transition");
$(".left-menu-content").removeClass("left-menu-content-transition");
}, 500);
this.LeftMenuOpen(true);
};
SwitchUserRoleTo = (accessRole: number): void => {
site.RequestResource(
site.BuildCustomUri("UserRoles/SwitchUserRole/{0}", [accessRole]),
Models.HttpMethod.PUT,
null,
this.SwitchUserCallback,
null,
true);
};
SwitchUserCallback = (result: boolean): void => {
if (result)
location.reload(true);
};
// kendo tree view multi select
TreeViewShiftStart = ko.observable<JQuery>(null);
TreeViewShiftEnd = ko.observable<JQuery>(null);
TreeViewItemSelectionClass = ko.observable<string>("selected-node");
ClearTreeViewSelection = (treeViewSelector: JQuery): void => {
this.GetSelectedTreeViewItems(treeViewSelector).removeClass(this.TreeViewItemSelectionClass());
};
GetSelectedTreeViewItems = (treeViewSelector: JQuery): JQuery => {
return treeViewSelector.find(`.${this.TreeViewItemSelectionClass()}`);
};
GetSelectedTreeViewModels = (treeViewSelector: JQuery): Array<any> => {
var selectedItems = this.GetSelectedTreeViewItems(treeViewSelector);
var selectedModels = new Array<any>();
selectedItems.each((index: number, elem: Element): void => {
selectedModels.push(ko.dataFor($(elem).closest(".k-item")[0]));
});
return selectedModels;
};
SelectTreeViewNode = (event: kendo.ui.TreeViewSelectEvent, ctrlKey: boolean = false, shiftKey: boolean = false): void => {
event.preventDefault();
const selectorClass = this.TreeViewItemSelectionClass();
var node = $(event.node).closest(".k-item");
const treeView = $(event.node).closest(".k-treeview");
// if the shift key was not pressed and a node is not being deselected or the last node is not currently stored
if (!this.TreeViewShiftStart() ||
(!shiftKey &&
(!ctrlKey || (ctrlKey && !node.hasClass(selectorClass))))) {
// store the last node that was clicked on
this.TreeViewShiftStart(node);
this.TreeViewShiftEnd(null);
}
if (ctrlKey) {
// toggle selection
if (node.is(`.${selectorClass}`)) node.removeClass(selectorClass);
else node.addClass(selectorClass);
// deselect all parents
node.parentsUntil(".k-treeview", ".k-item").removeClass(selectorClass);
// deselect all children, no point as parent is selected
node.find(".k-item").removeClass(selectorClass);
} else if (shiftKey) {
const selectedItems = this.GetSelectedTreeViewItems(treeView);
const allSiblings = $(node).siblings().addBack();
const isSibling = allSiblings.is(node) && allSiblings.is(this.TreeViewShiftStart());
if (!selectedItems.length || !isSibling) {
// single selection
this.ClearTreeViewSelection(treeView);
this.TreeViewShiftStart(node);
this.TreeViewShiftEnd(null);
node.addClass(selectorClass);
} else {
// if a previous shift operation was done
if (this.TreeViewShiftEnd()) {
// deselect previous shift selection
this.SelectTreeViewRange(false, allSiblings);
}
// select range
this.TreeViewShiftEnd(node);
this.SelectTreeViewRange(true, allSiblings);
}
} else {
this.ClearTreeViewSelection(treeView);
node.addClass(selectorClass);
}
// remove default class
setTimeout((): void => {
$(event.node).find(".k-state-focused").removeClass("k-state-focused");
});
};
SelectTreeViewRange = (select: boolean, allSiblings: JQuery) => {
const startIndex = allSiblings.index(this.TreeViewShiftStart());
const stopIndex = allSiblings.index(this.TreeViewShiftEnd());
if (startIndex >= stopIndex)
for (let i = stopIndex; i <= startIndex; i++) {
if (select) $(allSiblings[i]).addClass(this.TreeViewItemSelectionClass());
else $(allSiblings[i]).removeClass(this.TreeViewItemSelectionClass());
}
else
for (let i = startIndex; i <= stopIndex; i++) {
if (select) $(allSiblings[i]).addClass(this.TreeViewItemSelectionClass());
else $(allSiblings[i]).removeClass(this.TreeViewItemSelectionClass());
}
};
}
}
No comments:
Post a Comment