mocha/dotnet/Webapps/Mocha.Web/Scripts/InstanceBrowser.js
2023-10-31 11:47:27 -04:00

271 lines
8.9 KiB
JavaScript
Executable File

function McxInstanceBrowser(parentElement)
{
this.ParentElement = parentElement;
this.TextBoxElement = this.ParentElement.children[0];
this.PopupElement = this.ParentElement.children[3];
this.SelectedListElement = this.ParentElement.children[1];
this.MenuElement = this.PopupElement.children[1].children[0];
this.TextBoxElement.NativeObject.AddItem = function(textbox, item)
{
textbox.SelectedItems = new Array();
textbox.SelectedItems.push(item);
console.log(item);
textbox.SetText(item.title);
return true;
};
this.TextBoxElement.NativeObject.EventHandlers.DropDownClosed.Add(function(sender, e)
{
System.ClassList.Add(sender.ParentElement, "uwt-color-success");
});
this.TextBoxElement._McxNativeObject = this;
this.TextBoxElement.addEventListener("blur", function(e)
{
System.ClassList.Remove(this._McxNativeObject.ParentElement, "mcx-active");
System.ClassList.Remove(this._McxNativeObject.PopupElement, "uwt-visible");
});
this.TextBoxElement.addEventListener("focus", function(e)
{
System.ClassList.Add(this._McxNativeObject.ParentElement, "mcx-active");
System.ClassList.Add(this._McxNativeObject.PopupElement, "uwt-visible");
});
this.TextBoxElement.NativeObject.SuggestionURL = System.ExpandRelativePath("~/api/search?q=%1&valid_class_ids=" + this.ParentElement.getAttribute("data-valid-class-ids"));
this.TextBoxElement.NativeObject.SetLoading = function(value)
{
if (value)
{
System.ClassList.Add(this.TextBoxElement._McxNativeObject.ParentElement, "uwt-loading");
}
else
{
System.ClassList.Remove(this.TextBoxElement._McxNativeObject.ParentElement, "uwt-loading");
}
};
this.AddMenuItem = function()
{
};
this.ListElement = this.ParentElement.children[2];
for (var i = 0; i < this.ListElement.children.length; i++)
{
var apb = this.ListElement.children[i].children[0];
if (apb.className == "mcx-count-link")
{
apb.NativeObject_InstanceBrowser = this;
apb.addEventListener("click", function()
{
var rcid = this.NativeObject_InstanceBrowser.ParentElement.parentElement.getAttribute("data-rcid");
var xhr = new XMLHttpRequest();
xhr.rcid = rcid;
xhr.riid = this.NativeObject_InstanceBrowser.ParentElement.parentElement.parentElement.getAttribute("data-instance-id");
xhr.open("GET", "/" + System.GetCurrentTenantName() + "/api/drilldown/" + rcid);
xhr.onreadystatechange = function()
{
if (xhr.readyState === XMLHttpRequest.DONE)
{
if (xhr.status == 200)
{
alert("Stil not implemented: get all instances for (report column iid: " + this.rcid + ", row iid: " + this.riid + ")");
}
else
{
Alert.Show("AJAX request failed(MADI internal call: McxCountLink)", "Error", "uwt-color-danger");
}
}
};
xhr.send(null);
});
continue;
}
apb.children[1].NativeObject_InstanceBrowser = this;
apb.children[1].Index = i;
apb.children[1].addEventListener("click", function(e)
{
var instIds = this.NativeObject_InstanceBrowser.ParentElement.getAttribute("data-instance-ids").split(",");
var xhr = new XMLHttpRequest();
xhr.instId = instIds[this.Index];
xhr.open("GET", "/" + System.GetCurrentTenantName() + "/api/preview/" + instIds[this.Index]);
xhr.NativeObject_InstanceBrowser = this.NativeObject_InstanceBrowser;
// IMPORTANT: WE NEED TO go through all these hoops because JavaScript thinks that apb is the last in the list
xhr.NativeObject = xhr.NativeObject_InstanceBrowser.ListElement.children[this.Index].children[0].NativeObject;
xhr.onreadystatechange = function()
{
if(xhr.readyState === XMLHttpRequest.DONE)
{
var status = xhr.status;
if (status === 0 || (status >= 200 && status < 400))
{
// The request has been completed successfully
var json = JSON.parse(xhr.responseText);
if (json.result == "failure")
{
Alert.Show(json.message, "Error", "uwt-color-danger");
return;
}
xhr.NativeObject.ClearPreviewMenuItems();
if (typeof(json.preview) !== 'undefined')
{
if (typeof(json.preview.actions) !== 'undefined')
{
for (var i = 0; i < json.preview.actions.length; i++)
{
for (var j = 0; j < json.preview.actions[i].actions.length; j++)
{
if (typeof(json.preview.actions[i].actions[j].url) === 'undefined' &&
(typeof(json.preview.actions[i].actions[j].instanceId !== 'undefined')))
{
json.preview.actions[i].actions[j].url = System.ExpandRelativePath("~/d/inst/" + this.instId + "/rel-task/" + json.preview.actions[i].actions[j].instanceId + ".htmld");
}
}
xhr.NativeObject.AddPreviewMenuItem(json.preview.actions[i].title, json.preview.actions[i].actions, json.preview.actions[i].newWindow);
}
}
var zqElemContainer = document.createElement("div");
zqElemContainer.className = "uwt-content";
if (typeof(json.preview.components) !== 'undefined')
{
for (var i = 0; i < json.preview.components.length; i++)
{
var zqElem = PageBuilder.CreatePageComponentFromJSON(json.preview.components[i]);
zqElemContainer.appendChild(zqElem);
}
}
var elem = document.createElement("div");
var elemTitle = document.createElement("div");
elemTitle.className = "apb-title";
var elemClassTitle = document.createElement("h1");
elemClassTitle.innerText = json.preview.classTitle;
elemTitle.appendChild(elemClassTitle);
var elemInstanceTitle = document.createElement("h2");
var elemInstanceLink = document.createElement("a");
elemInstanceLink.href = System.ExpandRelativePath("~/d/inst/" + this.instId + ".htmld");
elemInstanceLink.innerText = json.preview.instanceTitle;
elemInstanceTitle.appendChild(elemInstanceLink);
elemTitle.appendChild(elemInstanceTitle);
elem.appendChild(elemTitle);
elem.appendChild(zqElemContainer);
xhr.NativeObject.SetPreviewContentElement(elem);
}
xhr.NativeObject.SetLoading(false);
}
else
{
// Oh no! There has been an error with the request!
Alert.Show("AJAX request failed", "Error", "uwt-color-danger");
}
}
};
xhr.send(null);
e.preventDefault();
e.stopPropagation();
});
}
}
McxInstanceBrowser.Create = function(instanceIds)
{
var div = document.createElement("div");
div.className = "mcx-instancebrowser";
div.setAttribute("data-valid-class-ids", "");
var inputText = document.createElement("input");
inputText.type = "text";
inputText.setAttribute("autocomplete", "off");
div.appendChild(inputText);
var inputHidden = document.createElement("input");
inputHidden.type = "hidden";
div.appendChild(inputHidden);
var ul = document.createElement("ul");
if (typeof(instanceIds) !== 'undefined')
{
if (instanceIds != null)
{
if (!Array.isArray(instanceIds))
{
// assume single instance ID passed in as parameter
instanceIds = [instanceIds];
}
div.setAttribute("data-instance-ids", instanceIds.join(","));
for (var i = 0; i < instanceIds.length; i++)
{
var li = document.createElement("li");
var apb = AdditionalDetailWidget.Create("", System.ExpandRelativePath("~/d/inst/" + instanceIds[i] + ".htmld"), System.ExpandRelativePath("~/api/preview/" + instanceIds[i]), { "data-instance-id": instanceIds[i] });
li.appendChild(apb);
ul.appendChild(li);
Instance.GetByInstanceID(instanceIds[i], function(instanceId, json, userParm)
{
userParm.NativeObject.SetTitle(json.items[0].title);
}, apb);
}
}
else
{
div.setAttribute("data-instance-ids", "");
System.ClassList.Add(div, "mcx-empty");
}
}
div.appendChild(ul);
var divPopup = document.createElement("div");
divPopup.className = "uwt-popup uwt-loading";
var divSpinner = document.createElement("div");
divSpinner.className = "uwt-spinner";
divPopup.appendChild(divSpinner);
var divPopupContent = document.createElement("div");
divPopupContent.className = "uwt-dropdown-content";
divPopup.appendChild(divPopupContent);
div.appendChild(divPopup);
window.debugDiv = div;
// NOTE: must be called AFTER all controls have been added, but BEFORE NativeObject is set on the McxInstanceBrowser
inputText.NativeObject = new TextBox(inputText);
div.NativeObject = new McxInstanceBrowser(div);
return div;
};
window.addEventListener("load", function()
{
/*
$('.mcx-instancebrowser').select2({
ajax: {
url: Mocha.GetCurrentTenantURL() + '/api/search.aspx',
dataType: 'json'
// Additional AJAX parameters go here; see the end of this chapter for the full code of this example
}
});
*/
var items = document.getElementsByClassName("mcx-instancebrowser");
for (var i = 0; i < items.length; i++)
{
items[i].NativeObject = new McxInstanceBrowser(items[i]);
}
});