fixes and improvements to tenant; implement Tenant Management Server
This commit is contained in:
parent
fb25146ff1
commit
6d743abcd1
@ -1,19 +0,0 @@
|
||||
<?php
|
||||
use Phast\IncludeFile;
|
||||
use Phast\System;
|
||||
System::$IncludeFiles[] = new IncludeFile("/lib/mocha/system.inc.php", true);
|
||||
System::$EnableTenantedHosting = false;
|
||||
System::$Configuration["Application.Title"] = "Mocha SUV";
|
||||
System::$Configuration["Application.DefaultTenant"] = "super";
|
||||
System::$Configuration["Application.ThemeName"] = "avondale";
|
||||
System::$Configuration["Database.ServerName"] = "localhost";
|
||||
System::$Configuration["Database.PortNumber"] = 3306;
|
||||
System::$Configuration["Database.DatabaseName"] = "mocha_suv";
|
||||
System::$Configuration["Database.UserName"] = "mocha_suv";
|
||||
System::$Configuration["Database.Password"] = "mocha_suv";
|
||||
System::$Configuration["LoginPageRedirectURL"] = "~/madi/authgwy/$(CurrentTenantName)/login.htmld";
|
||||
System::$Configuration["Runtime.DisableAutomaticExtensionParsing"] = 1;
|
||||
System::$Configuration["Paths.MasterPages"] = [ "/ui/masterPages" ];
|
||||
System::$Configuration["Paths.Pages"] = [ "/ui/pages" ];
|
||||
require_once ("BeforeLaunchEvent.inc.php");
|
||||
?>
|
||||
@ -15,6 +15,7 @@
|
||||
use Mocha\Oop\MethodImplementation;
|
||||
use Mocha\Oop\Methods\BuildAttributeMethod;
|
||||
use Phast\System;
|
||||
use Phast\Utilities\Stopwatch;
|
||||
use Phast\UUID;
|
||||
|
||||
abstract class Oms
|
||||
@ -149,7 +150,16 @@
|
||||
return null;
|
||||
}
|
||||
|
||||
return $this->getRelatedInstancesInternal($sourceInstance, $relationshipInstance, $effectiveDate);
|
||||
// trigger_error("MADI debug: entering " . get_class($this) . "::getRelatedInstancesInternal");
|
||||
// $stopwatch = new Stopwatch();
|
||||
// $stopwatch->start();
|
||||
|
||||
$insts = $this->getRelatedInstancesInternal($sourceInstance, $relationshipInstance, $effectiveDate);
|
||||
|
||||
// $stopwatch->stop();
|
||||
// trigger_error("MADI debug: exiting " . get_class($this) . "::getRelatedInstancesInternal (took " . $stopwatch->getElapsedTime() . "s)");
|
||||
|
||||
return $insts;
|
||||
}
|
||||
protected abstract function getRelatedInstancesInternal(InstanceReference $sourceInstance, InstanceReference $relationshipInstance, \DateTime $effectiveDate = null) : ?array;
|
||||
|
||||
|
||||
@ -4,6 +4,7 @@
|
||||
use Mocha\Core\InstanceReference;
|
||||
use Mocha\Core\OmsContext;
|
||||
use Mocha\Oms\Oms;
|
||||
use Phast\Utilities\Stopwatch;
|
||||
|
||||
abstract class MethodImplementation
|
||||
{
|
||||
@ -13,7 +14,16 @@
|
||||
public function execute(Oms $oms, OmsContext $context, InstanceReference $method, ?array $parms) : mixed
|
||||
{
|
||||
array_push($context->CallStack, $method);
|
||||
|
||||
trigger_error("MADI debug: entering " . get_class($this) . "::executeInternal");
|
||||
$stopwatch = new Stopwatch();
|
||||
$stopwatch->start();
|
||||
|
||||
$retval = $this->executeInternal($oms, $context, $method, $parms);
|
||||
$stopwatch->stop();
|
||||
|
||||
trigger_error("MADI debug: exiting " . get_class($this) . "::executeInternal (took " . $stopwatch->getElapsedTime() . "s)");
|
||||
|
||||
array_pop($context->CallStack);
|
||||
return $retval;
|
||||
}
|
||||
|
||||
@ -22,7 +22,16 @@
|
||||
protected function OnInitializing(CancelEventArgs $e)
|
||||
{
|
||||
$oms = mocha_get_oms();
|
||||
$oms->setTenant($oms->getTenantByName(System::GetTenantName()));
|
||||
|
||||
$tenantName = System::GetTenantName();
|
||||
$tenant = $oms->getTenantByName($tenantName);
|
||||
if ($tenant == null)
|
||||
{
|
||||
System::Redirect("~/" . $tenantName, true);
|
||||
exit();
|
||||
}
|
||||
$oms->setTenant($tenant);
|
||||
|
||||
$oms->initializeInstanceCache();
|
||||
|
||||
// echo (" login token: " . $_SESSION["user_token_" . $oms->getTenant()->ID]);
|
||||
@ -90,7 +99,9 @@
|
||||
{
|
||||
$tenantName = $path[0];
|
||||
}
|
||||
$oms->setTenant($oms->getTenantByName($tenantName));
|
||||
|
||||
$tenant = $oms->getTenantByName($tenantName);
|
||||
$oms->setTenant($tenant);
|
||||
|
||||
$pageElement = $oms->getInstanceByGlobalIdentifier(KnownInstanceGuids::Element__LoginPage);
|
||||
if ($pageElement === null)
|
||||
|
||||
@ -13,12 +13,54 @@
|
||||
use Phast\WebPage;
|
||||
use Phast\WebScript;
|
||||
|
||||
global $pdo;
|
||||
global $basepath;
|
||||
|
||||
$pdo = null;
|
||||
$pdoex = null;
|
||||
|
||||
try
|
||||
{
|
||||
$pdo = new \PDO("mysql:host=" . System::$Configuration["Database.ServerName"] . ";port=" . System::$Configuration["Database.PortNumber"] . ";dbname=" . System::$Configuration["Database.DatabaseName"], System::$Configuration["Database.UserName"], System::$Configuration["Database.Password"]);
|
||||
}
|
||||
catch (\Exception $ex)
|
||||
{
|
||||
$pdoex = $ex;
|
||||
echo($pdoex); die();
|
||||
}
|
||||
$basepath = $_SERVER["SERVER_NAME"];
|
||||
|
||||
class SUVPage extends WebPage
|
||||
{
|
||||
protected function OnPreRender(CancelEventArgs $e)
|
||||
{
|
||||
global $pdo;
|
||||
global $basepath;
|
||||
|
||||
$e->Cancel = true;
|
||||
|
||||
if ($_POST["reset"] == "1")
|
||||
{
|
||||
$stmt = $pdo->prepare("DELETE FROM mocha_attributes WHERE tenant_id > 2");
|
||||
$stmt->execute();
|
||||
|
||||
$stmt = $pdo->prepare("DELETE FROM mocha_relationships WHERE tenant_id > 2");
|
||||
$stmt->execute();
|
||||
|
||||
$stmt = $pdo->prepare("DELETE FROM mocha_instances WHERE tenant_id > 2");
|
||||
$stmt->execute();
|
||||
|
||||
$stmt = $pdo->prepare("DELETE FROM mocha_tenant_references WHERE source_tenant_id > 2");
|
||||
$stmt->execute();
|
||||
|
||||
$stmt = $pdo->prepare("DELETE FROM mocha_tenants WHERE id > 2");
|
||||
$stmt->execute();
|
||||
|
||||
header("HTTP/1.1 302 Found");
|
||||
header("Location: /suv/suvinfo.html");
|
||||
exit();
|
||||
}
|
||||
|
||||
$path = System::GetVirtualPath();
|
||||
if ($path[1] == "phpinfo.html")
|
||||
{
|
||||
@ -94,6 +136,22 @@
|
||||
return false;
|
||||
});
|
||||
|
||||
var btnResetTenants = document.getElementById("btnResetTenants");
|
||||
btnResetTenants.addEventListener("click", function(e)
|
||||
{
|
||||
var hidResetTenantsConfirm = document.getElementById("hidResetTenantsConfirm");
|
||||
if (!confirm("Reset tenants: Are you sure?"))
|
||||
{
|
||||
e.preventDefault();
|
||||
e.stopPropagation();
|
||||
return false;
|
||||
}
|
||||
else
|
||||
{
|
||||
hidResetTenantsConfirm.value = "1";
|
||||
}
|
||||
});
|
||||
|
||||
var wndCreateTenant_btnSaveChanges = document.getElementById("wndCreateTenant_btnSaveChanges");
|
||||
wndCreateTenant_btnSaveChanges.ni = wndCreateTenant;
|
||||
wndCreateTenant_btnSaveChanges.addEventListener("click", function(e)
|
||||
@ -209,7 +267,10 @@ EOF
|
||||
?>
|
||||
<div style="margin-bottom: 16px;">
|
||||
<a id="btnAddTenant" class="uwt-button uwt-color-primary" href="#">Add Tenant</a>
|
||||
<button class="uwt-button">Reset Tenants</button>
|
||||
<form method="POST">
|
||||
<input type="hidden" id="hidResetTenantsConfirm" name="reset" value="0" />
|
||||
<button class="uwt-button" id="btnResetTenants">Reset Tenants</button>
|
||||
</form>
|
||||
</div>
|
||||
<table class="uwt-listview">
|
||||
<thead>
|
||||
@ -228,10 +289,22 @@ EOF
|
||||
</thead>
|
||||
<tbody>
|
||||
<?php
|
||||
|
||||
global $pdo;
|
||||
global $basepath;
|
||||
|
||||
$query = "SELECT * FROM mocha_tenants";
|
||||
$stmt = $pdo->prepare($query);
|
||||
$result = $stmt->execute();
|
||||
$rows = $stmt->fetchAll();
|
||||
foreach ($rows as $values)
|
||||
{
|
||||
if ($values["is_library"] != 0)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
?>
|
||||
<tr>
|
||||
<td>super</td>
|
||||
<td><a class="uwt-external-link" target="_blank" href="<?php echo("https://" . $basepath . "/" . $values["tenant_name"]); ?>"><?php echo ($values["tenant_name"]); ?></a></td>
|
||||
<td>Active</td>
|
||||
<td>Development</td>
|
||||
<td>Local</td>
|
||||
@ -242,6 +315,9 @@ EOF
|
||||
<td></td>
|
||||
<td>Default Tenant</td>
|
||||
</tr>
|
||||
<?php
|
||||
}
|
||||
?>
|
||||
</tbody>
|
||||
</table>
|
||||
<?php
|
||||
|
||||
68
mocha-php/src/mocha-tms/api.php
Normal file
68
mocha-php/src/mocha-tms/api.php
Normal file
@ -0,0 +1,68 @@
|
||||
<?php
|
||||
require_once ("include/Configuration.inc.php");
|
||||
|
||||
$pdo = null;
|
||||
$pdoex = null;
|
||||
|
||||
try
|
||||
{
|
||||
$pdo = new \PDO("mysql:host=" . System::$Configuration["Database.ServerName"] . ";port=" . System::$Configuration["Database.PortNumber"] . ";dbname=" . System::$Configuration["Database.DatabaseName"], System::$Configuration["Database.UserName"], System::$Configuration["Database.Password"]);
|
||||
}
|
||||
catch (Exception $ex)
|
||||
{
|
||||
$pdoex = $ex;
|
||||
echo($pdoex); die();
|
||||
}
|
||||
|
||||
$data = file_get_contents("php://input");
|
||||
$json = json_decode($data, true);
|
||||
|
||||
$action = $json["action"];
|
||||
if ($action == "createTenant")
|
||||
{
|
||||
$tenantName = $json["tenantName"];
|
||||
$tenantType = $json["tenantType"];
|
||||
$tenantCount = $json["tenantCount"];
|
||||
|
||||
$stmt = $pdo->prepare("INSERT INTO mocha_tenants (tenant_name, global_identifier, effective_date, is_library) VALUES (:tenant_name, mocha_uuid_v4(), NOW(), 0)");
|
||||
$stmt2 = $pdo->prepare("INSERT INTO mocha_tenant_references (source_tenant_id, target_tenant_id) VALUES (:source_tenant_id, 1)");
|
||||
|
||||
if ($tenantCount == 1)
|
||||
{
|
||||
$result = $stmt->execute(array
|
||||
(
|
||||
"tenant_name" => $tenantName
|
||||
));
|
||||
|
||||
$lastInsertId = $pdo->lastInsertId();
|
||||
$result = $stmt2->execute(array
|
||||
(
|
||||
":source_tenant_id" => $lastInsertId
|
||||
));
|
||||
|
||||
echo ($result);
|
||||
}
|
||||
else if ($tenantCount > 1)
|
||||
{
|
||||
for ($i = 0; $i < $tenantCount; $i++)
|
||||
{
|
||||
$result = $stmt->execute(array
|
||||
(
|
||||
"tenant_name" => $tenantName . ($i + 1)
|
||||
));
|
||||
|
||||
$lastInsertId = $pdo->lastInsertId();
|
||||
$result = $stmt2->execute(array
|
||||
(
|
||||
":source_tenant_id" => $lastInsertId
|
||||
));
|
||||
|
||||
echo ($result);
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
echo("undefined action: '" . $action . "'");
|
||||
}
|
||||
?>
|
||||
144
mocha-php/src/mocha-tms/app.js
Normal file
144
mocha-php/src/mocha-tms/app.js
Normal file
@ -0,0 +1,144 @@
|
||||
function post(url, payload, callback)
|
||||
{
|
||||
var xhr = new XMLHttpRequest();
|
||||
xhr.callback = callback;
|
||||
xhr.onreadystatechange = function()
|
||||
{
|
||||
if (this.readyState == 4)
|
||||
{
|
||||
if (typeof(this.callback) == 'function')
|
||||
{
|
||||
this.callback();
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
var payloadText = null;
|
||||
if (typeof(payload) === 'string' || typeof(payload) == 'boolean' || typeof(payload) == 'number')
|
||||
{
|
||||
payloadText = payload.toString();
|
||||
}
|
||||
else if (typeof(payload) === 'object')
|
||||
{
|
||||
payloadText = JSON.stringify(payload);
|
||||
}
|
||||
|
||||
xhr.open("POST", url);
|
||||
xhr.send(JSON.stringify(payload));
|
||||
}
|
||||
|
||||
function alert(message)
|
||||
{
|
||||
if (typeof(message) == 'string')
|
||||
{
|
||||
Dialog.ShowDialog("", message, [ { "dialogResult": DialogResult.OK, "title": "OK", "className": "uwt-color-primary" }]);
|
||||
}
|
||||
else if (typeof(message) == 'object')
|
||||
{
|
||||
Dialog.ShowDialog("", message.content, [ { "dialogResult": DialogResult.OK, "title": "OK", "className": "uwt-color-primary", "callback": function(dlg, btn)
|
||||
{
|
||||
message.callback();
|
||||
}
|
||||
}]);
|
||||
}
|
||||
}
|
||||
|
||||
window.addEventListener("load", function()
|
||||
{
|
||||
var tsbProvision = document.getElementById("tsbProvision");
|
||||
tsbProvision.addEventListener("click", function()
|
||||
{
|
||||
// usage: Dialog.ShowDialog(title, prompt, buttons, fields, callback)
|
||||
Dialog.ShowDialog
|
||||
(
|
||||
"Provision New Tenant(s)",
|
||||
"",
|
||||
[
|
||||
{
|
||||
"dialogResult": DialogResult.OK,
|
||||
"title": "OK",
|
||||
"className": "uwt-color-primary",
|
||||
"callback": function(dlg, btn)
|
||||
{
|
||||
post("/api.php", {
|
||||
"action": "createTenant",
|
||||
"tenantName": dlg.getField("tenant_name").getValue(),
|
||||
"tenantType": dlg.getField("tenant_type").getValue(),
|
||||
"tenantCount": dlg.getField("tenant_count").getValue()
|
||||
}, function()
|
||||
{
|
||||
window.location.reload();
|
||||
});
|
||||
return true;
|
||||
}
|
||||
},
|
||||
{
|
||||
"dialogResult": DialogResult.CANCEL,
|
||||
"title": "Cancel"
|
||||
}
|
||||
],
|
||||
[
|
||||
{
|
||||
"type": "literal",
|
||||
"value": "<p>Please specify the name of your new tenant and select a tenant type. For more information about the various tenant types please consult the <a href=\"#\">Mocha documentation</a>.</p>"
|
||||
},
|
||||
{
|
||||
"id": "tenant_name",
|
||||
"type": "text",
|
||||
"title": "Tenant name"
|
||||
},
|
||||
{
|
||||
"id": "tenant_type",
|
||||
"type": "choice",
|
||||
"title": "Tenant type",
|
||||
"choices":
|
||||
[
|
||||
{
|
||||
"title": "Production",
|
||||
"value": "{5535F488-6C8E-42BC-86A3-664D70411A2A}",
|
||||
"color": "#85C744"
|
||||
},
|
||||
{
|
||||
"title": "Sandbox",
|
||||
"value": "{6A3767FD-6606-426F-B8D9-507B9FFE595C}",
|
||||
"color": "#F1C40F"
|
||||
},
|
||||
{
|
||||
"title": "Implementation",
|
||||
"value": "{E860A64C-C156-49E7-80E5-E3BA3CE4D15D}",
|
||||
"color": "#2BBCE0"
|
||||
},
|
||||
{
|
||||
"title": "Development",
|
||||
"value": "{B4F900F1-2C22-41FD-AAB9-7C956663256F}",
|
||||
"color": "#E73C3C"
|
||||
},
|
||||
{
|
||||
"title": "Internal Development",
|
||||
"value": "{716D4C16-040F-4EBB-A920-DDF88765A017}",
|
||||
"color": "#E73C3C"
|
||||
},
|
||||
{
|
||||
"title": "Sandbox Preview Preview",
|
||||
"value": "{b225d85b-d1a2-4ce7-90bc-410f2d5c0a53}",
|
||||
"color": "#F1C40F"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "literal",
|
||||
"value": "<p>You may specify the number of tenants to create. If this is more than 1, tenants are named 'tenant<i>N</i>', where 'tenant' is the specified tenant name and 'N' is a value from 1 to the number of tenants requested.</p>"
|
||||
},
|
||||
{
|
||||
"id": "tenant_count",
|
||||
"type": "numeric",
|
||||
"title": "Number of tenants",
|
||||
"value": 1,
|
||||
"minimumValue": 1,
|
||||
"maximumValue": 9
|
||||
}
|
||||
]
|
||||
);
|
||||
});
|
||||
|
||||
});
|
||||
220
mocha-php/src/mocha-tms/dialog.js
Normal file
220
mocha-php/src/mocha-tms/dialog.js
Normal file
@ -0,0 +1,220 @@
|
||||
function DialogResult(value)
|
||||
{
|
||||
this.value = value;
|
||||
}
|
||||
DialogResult.OK = new DialogResult(1);
|
||||
DialogResult.CANCEL = new DialogResult(2);
|
||||
|
||||
// ewwww
|
||||
// Only implement if no native implementation is available
|
||||
if (typeof(Array.isArray) === 'undefined')
|
||||
{
|
||||
Array.isArray = function(obj)
|
||||
{
|
||||
return Object.prototype.toString.call(obj) === '[object Array]';
|
||||
};
|
||||
}
|
||||
|
||||
function Dialog()
|
||||
{
|
||||
|
||||
}
|
||||
Dialog.__handleButton = function(dialog, button, callback)
|
||||
{
|
||||
if (typeof(button.btn.callback) == 'function')
|
||||
{
|
||||
var ret = button.btn.callback(dialog, button);
|
||||
if (typeof(ret) == 'boolean')
|
||||
{
|
||||
if (!ret)
|
||||
{
|
||||
// callback returned false; do not continue processing
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (typeof(callback) == 'function')
|
||||
{
|
||||
var ret = callback(dialog, button);
|
||||
if (typeof(ret) == 'boolean')
|
||||
{
|
||||
if (!ret)
|
||||
{
|
||||
// callback returned false; do not continue processing
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (typeof(button.dialogResult) !== 'undefined')
|
||||
{
|
||||
dialog.window.Hide();
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
|
||||
Dialog.ShowDialog = function(title, prompt, buttons, fields, callback)
|
||||
{
|
||||
var dlg = new Dialog();
|
||||
dlg.getField = function(id)
|
||||
{
|
||||
for (var i = 0; i < this.fields.length; i++)
|
||||
{
|
||||
if (this.fields[i].id == id) return this.fields[i];
|
||||
}
|
||||
return null;
|
||||
};
|
||||
dlg.fields = fields;
|
||||
|
||||
var wnd = new Window();
|
||||
wnd.dlg = dlg;
|
||||
dlg.window = wnd;
|
||||
|
||||
wnd.SetTitle(title);
|
||||
wnd.ParentElement.addEventListener("keydown", function(e)
|
||||
{
|
||||
if (e.keyCode == 13)
|
||||
{
|
||||
Dialog.__handleButton(this.NativeObject.dlg, this.NativeObject.dlg.__okButton, null);
|
||||
}
|
||||
});
|
||||
|
||||
var cel = wnd.GetContentElement();
|
||||
var p = document.createElement("p");
|
||||
p.innerHTML = prompt;
|
||||
cel.appendChild(p);
|
||||
|
||||
if (Array.isArray(fields))
|
||||
{
|
||||
var formview = document.createElement("table");
|
||||
formview.className = "uwt-formview";
|
||||
|
||||
for (var i = 0; i < fields.length; i++)
|
||||
{
|
||||
fields[i].element = null;
|
||||
fields[i].getValue = function()
|
||||
{
|
||||
return null;
|
||||
};
|
||||
|
||||
var tr = document.createElement("tr");
|
||||
tr.className = "uwt-formview-item";
|
||||
|
||||
var td = document.createElement("td");
|
||||
td.className = "uwt-formview-item-title";
|
||||
|
||||
if (fields[i].type != "literal")
|
||||
{
|
||||
var label = document.createElement("label");
|
||||
label.innerHTML = fields[i].title;
|
||||
td.appendChild(label);
|
||||
|
||||
tr.appendChild(td);
|
||||
}
|
||||
|
||||
td = document.createElement("td");
|
||||
td.className = "uwt-formview-item-content";
|
||||
|
||||
if (fields[i].type == "literal")
|
||||
{
|
||||
td.innerHTML = fields[i].value;
|
||||
td.colSpan = 2;
|
||||
}
|
||||
else if (fields[i].type == "text" || fields[i].type == "numeric")
|
||||
{
|
||||
var input = document.createElement("input");
|
||||
if (fields[i].type == "numeric")
|
||||
{
|
||||
input.type = "number";
|
||||
}
|
||||
else
|
||||
{
|
||||
input.type = "text";
|
||||
}
|
||||
td.appendChild(input);
|
||||
|
||||
if (typeof(fields[i].value) == 'number')
|
||||
{
|
||||
input.value = fields[i].value;
|
||||
}
|
||||
|
||||
fields[i].element = input;
|
||||
fields[i].getValue = function()
|
||||
{
|
||||
return this.element.value;
|
||||
};
|
||||
}
|
||||
else if (fields[i].type == "choice")
|
||||
{
|
||||
var select = document.createElement("select");
|
||||
for (var j = 0; j < fields[i].choices.length; j++)
|
||||
{
|
||||
var option = document.createElement("option");
|
||||
option.innerHTML = fields[i].choices[j].title;
|
||||
if (typeof(fields[i].choices[j].value) !== 'undefined')
|
||||
{
|
||||
option.value = fields[i].choices[j].value;
|
||||
}
|
||||
if (typeof(fields[i].choices[j].color) !== 'undefined')
|
||||
{
|
||||
option.setAttribute("data-color", fields[i].choices[j].color);
|
||||
}
|
||||
select.appendChild(option);
|
||||
}
|
||||
td.appendChild(select);
|
||||
|
||||
select.NativeObject = new DropDownWrapper(select);
|
||||
fields[i].element = select;
|
||||
fields[i].getValue = function()
|
||||
{
|
||||
return this.element.value;
|
||||
};
|
||||
}
|
||||
tr.appendChild(td);
|
||||
|
||||
formview.appendChild(tr);
|
||||
}
|
||||
|
||||
cel.appendChild(formview);
|
||||
}
|
||||
|
||||
var ftt = wnd.GetFooterElement();
|
||||
ftt.style.display = "";
|
||||
if (Array.isArray(buttons))
|
||||
{
|
||||
for (var i = 0; i < buttons.length; i++)
|
||||
{
|
||||
var btn = document.createElement("a");
|
||||
btn.className = "uwt-button";
|
||||
if (buttons[i].className)
|
||||
{
|
||||
System.ClassList.Add(btn, buttons[i].className);
|
||||
}
|
||||
if (buttons[i].title)
|
||||
{
|
||||
btn.innerHTML = buttons[i].title;
|
||||
}
|
||||
|
||||
if (typeof(buttons[i].dialogResult) !== 'undefined')
|
||||
{
|
||||
btn.dialogResult = buttons[i].dialogResult;
|
||||
if (btn.dialogResult == DialogResult.OK)
|
||||
{
|
||||
dlg.__okButton = btn;
|
||||
}
|
||||
}
|
||||
btn.btn = buttons[i];
|
||||
btn.dlg = dlg;
|
||||
|
||||
btn.addEventListener("click", function()
|
||||
{
|
||||
Dialog.__handleButton(this.dlg, this, callback);
|
||||
});
|
||||
ftt.appendChild(btn);
|
||||
}
|
||||
}
|
||||
|
||||
wnd.ShowDialog();
|
||||
};
|
||||
18
mocha-php/src/mocha-tms/include/Configuration.inc.php
Normal file
18
mocha-php/src/mocha-tms/include/Configuration.inc.php
Normal file
@ -0,0 +1,18 @@
|
||||
<?php
|
||||
class System
|
||||
{
|
||||
public static $Configuration;
|
||||
}
|
||||
System::$Configuration = array();
|
||||
|
||||
System::$Configuration["Application.Title"] = "Mocha SUV";
|
||||
System::$Configuration["Application.DefaultTenant"] = "super";
|
||||
System::$Configuration["Application.ThemeName"] = "avondale";
|
||||
|
||||
System::$Configuration["Database.ServerName"] = "localhost";
|
||||
System::$Configuration["Database.PortNumber"] = 3306;
|
||||
System::$Configuration["Database.DatabaseName"] = "mocha_suv";
|
||||
System::$Configuration["Database.UserName"] = "mocha_suv";
|
||||
System::$Configuration["Database.Password"] = "TjMG2k8eAR5xAHE613qJsNAagTBPGfaj";
|
||||
|
||||
?>
|
||||
205
mocha-php/src/mocha-tms/index.php
Normal file
205
mocha-php/src/mocha-tms/index.php
Normal file
@ -0,0 +1,205 @@
|
||||
<?php
|
||||
require_once ("include/Configuration.inc.php");
|
||||
|
||||
$pdo = null;
|
||||
$pdoex = null;
|
||||
|
||||
try
|
||||
{
|
||||
$pdo = new \PDO("mysql:host=" . System::$Configuration["Database.ServerName"] . ";port=" . System::$Configuration["Database.PortNumber"] . ";dbname=" . System::$Configuration["Database.DatabaseName"], System::$Configuration["Database.UserName"], System::$Configuration["Database.Password"]);
|
||||
}
|
||||
catch (Exception $ex)
|
||||
{
|
||||
$pdoex = $ex;
|
||||
echo($pdoex); die();
|
||||
}
|
||||
|
||||
$basepath = $_SERVER["SERVER_NAME"];
|
||||
|
||||
?>
|
||||
<html>
|
||||
<head>
|
||||
<title>Tenant Management System</title>
|
||||
<link rel="stylesheet" type="text/css" href="style/avondale/avondale.min.css" />
|
||||
<style type="text/css">
|
||||
a.uwt-external-link::after
|
||||
{
|
||||
content: "\f08e";
|
||||
font-family: "Font Awesome 6 Pro";
|
||||
padding-left: 8px;
|
||||
font-weight: 300;
|
||||
}
|
||||
div.uwt-page-header > div.uwt-toolbar
|
||||
{
|
||||
background-color: #eee;
|
||||
padding: 16px;
|
||||
margin-bottom: -16px;
|
||||
margin-left: -16px;
|
||||
margin-right: -16px;
|
||||
border-top: 1px solid #aaa;
|
||||
margin-top: ;
|
||||
padding-bottom: 8px;
|
||||
}
|
||||
div.uwt-page-header > div.uwt-toolbar > a
|
||||
{
|
||||
color: #000;
|
||||
text-decoration: none;
|
||||
padding: 8px;
|
||||
}
|
||||
div.uwt-page-header > div.uwt-toolbar > a:hover
|
||||
{
|
||||
background-color: #ccc;
|
||||
}
|
||||
div.uwt-page-header > div.uwt-toolbar > a:active
|
||||
{
|
||||
background-color: #aaa;
|
||||
}
|
||||
div.uwt-toolbar > span.uwt-separator
|
||||
{
|
||||
border-left: 1px solid #ccc;
|
||||
border-right: 1px solid #fff;
|
||||
}
|
||||
div.uwt-window
|
||||
{
|
||||
max-width: 800px;
|
||||
}
|
||||
div.uwt-window > div.uwt-content > p:empty
|
||||
{
|
||||
display: none;
|
||||
}
|
||||
p
|
||||
{
|
||||
margin: 16px 0px;
|
||||
}
|
||||
|
||||
ul.uwt-menu > li > a > span.uwt-icon.uwt-color-tile
|
||||
{
|
||||
background-color: #fff;
|
||||
border: 1px solid var(--uwt-color-dark);
|
||||
padding: 8px;
|
||||
margin: 8px;
|
||||
display: inline-block;
|
||||
position: absolute;
|
||||
left: 0px;
|
||||
top: 0px;
|
||||
}
|
||||
ul.uwt-menu > li > a > span.uwt-title, ul.uwt-menu > li > a > span.uwt-description
|
||||
{
|
||||
padding-left: 16px;
|
||||
}
|
||||
</style>
|
||||
<script type="text/javascript" src="scripts/phast/System.js.php"></script>
|
||||
<script type="text/javascript" src="dialog.js"></script>
|
||||
<script type="text/javascript" src="app.js"></script>
|
||||
</head>
|
||||
<body class="uwt-header-visible">
|
||||
<form method="POST">
|
||||
<div class="uwt-page-header">
|
||||
<h1>Tenant Management</h1>
|
||||
<p>Welcome, <strong>superuser</strong></p>
|
||||
<div class="uwt-toolbar">
|
||||
<a id="tsbProvision" href="#">Provision New Tenant</a>
|
||||
<span class="uwt-separator"> </span>
|
||||
<a id="tsbPackageImport" href="#">Import Package</a>
|
||||
<a id="tsbPackageExport" href="#">Export Package</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="uwt-page-content">
|
||||
<?php
|
||||
if ($pdoex === null)
|
||||
{
|
||||
?>
|
||||
|
||||
<h2>Customer Tenants</h2>
|
||||
<table class="uwt-listview">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Tenant Name</th>
|
||||
<th>Status</th>
|
||||
<th>Tenant Type</th>
|
||||
<th>Data Center</th>
|
||||
<th>Charge / No Charge</th>
|
||||
<th>Initial Term</th>
|
||||
<th>Renewal Term</th>
|
||||
<th>Tenant Start Date</th>
|
||||
<th>Tenant End Date</th>
|
||||
<th>Purpose</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<?php
|
||||
$query = "SELECT * FROM mocha_tenants";
|
||||
$stmt = $pdo->prepare($query);
|
||||
$result = $stmt->execute();
|
||||
$rows = $stmt->fetchAll();
|
||||
foreach ($rows as $values)
|
||||
{
|
||||
if ($values["is_library"] != 0)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
?>
|
||||
<tr>
|
||||
<td><a class="uwt-external-link" target="_blank" href="<?php echo("https://" . $basepath . "/" . $values["tenant_name"]); ?>"><?php echo ($values["tenant_name"]); ?></a></td>
|
||||
<td>Active</td>
|
||||
<td>MADI Internal Development</td>
|
||||
<td>Local</td>
|
||||
<td>No Charge</td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<?php
|
||||
}
|
||||
?>
|
||||
</tbody>
|
||||
</table>
|
||||
<?php
|
||||
}
|
||||
else
|
||||
{
|
||||
?>
|
||||
<div class="uwt-window uwt-visible" style="margin-left: auto; margin-right: auto; margin-top: 240px; width: 800px; display: block; position: static;">
|
||||
<div class="uwt-header">
|
||||
<span class="uwt-title">Database Intialization Error</span>
|
||||
</div>
|
||||
<div class="uwt-content">
|
||||
<p><?php print_r($pdoex->getCode() . " : " . $pdoex->getMessage()); ?></p>
|
||||
<table class="uwt-listview">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>#</th>
|
||||
<th>File Name</th>
|
||||
<th>Line Number</th>
|
||||
<th>Function</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<?php
|
||||
$trace = $pdoex->getTrace();
|
||||
for ($i = 0; $i < count($trace); $i++)
|
||||
{
|
||||
?>
|
||||
<tr>
|
||||
<td><?php echo($i); ?></td>
|
||||
<td><?php echo($trace[$i]["file"]); ?></td>
|
||||
<td><?php echo($trace[$i]["line"]); ?></td>
|
||||
<td><?php echo($trace[$i]["class"] . "::" . $trace[$i]["function"]); ?></td>
|
||||
</tr>
|
||||
<?php
|
||||
}
|
||||
?>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
<?php
|
||||
}
|
||||
?>
|
||||
</div>
|
||||
</form>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
5
mocha-php/src/mocha-tms/scripts/KnownInstanceKeys.js
Normal file
5
mocha-php/src/mocha-tms/scripts/KnownInstanceKeys.js
Normal file
@ -0,0 +1,5 @@
|
||||
function KnownInstanceKeys()
|
||||
{
|
||||
}
|
||||
|
||||
KnownInstanceKeys.DisplayOption__NotEnterable = "924$2";
|
||||
208
mocha-php/src/mocha-tms/scripts/mcx-element-listview.js
Normal file
208
mocha-php/src/mocha-tms/scripts/mcx-element-listview.js
Normal file
@ -0,0 +1,208 @@
|
||||
function McxElementListView(parentElement)
|
||||
{
|
||||
this.ParentElement = parentElement;
|
||||
this.CaptionElement = this.ParentElement.children[0];
|
||||
this.HeaderElement = this.ParentElement.children[1];
|
||||
this.HeaderRowElement = this.HeaderElement.children[0];
|
||||
|
||||
this.CountInput = this.ParentElement.parentElement.parentElement.children[0];
|
||||
|
||||
this.HeaderAddRowButton = this.HeaderRowElement.children[0].children[0];
|
||||
this.HeaderAddRowButton.NativeObject = this;
|
||||
this.HeaderAddRowButton.addEventListener("click", function(e)
|
||||
{
|
||||
var lv = this.NativeObject;
|
||||
lv.addRowBefore(0);
|
||||
|
||||
e.preventDefault();
|
||||
e.stopPropagation();
|
||||
return false;
|
||||
});
|
||||
|
||||
this.BodyElement = this.ParentElement.children[2];
|
||||
this.setEmpty = function(value)
|
||||
{
|
||||
if (value)
|
||||
{
|
||||
System.ClassList.Add(this.ParentElement.parentElement, "mcx-empty");
|
||||
}
|
||||
else
|
||||
{
|
||||
System.ClassList.Remove(this.ParentElement.parentElement, "mcx-empty");
|
||||
}
|
||||
};
|
||||
|
||||
this.buildRow = function(callback, callback_parms)
|
||||
{
|
||||
var lvInstId = this.ParentElement.getAttribute("data-fqecid");
|
||||
|
||||
var xhr = new XMLHttpRequest();
|
||||
var url = System.ExpandRelativePath("~/" + System.TenantName + "/flowController.htmld");
|
||||
xhr.open("POST", url);
|
||||
|
||||
var h = {
|
||||
"_flowExecutionKey": "e0s1",
|
||||
"ecid": lvInstId,
|
||||
"sessionSecureToken": "7733ad40-edf6-4dc9-aa90-85bcf93cc8f0",
|
||||
"clientRequestID" : "9af7ce5bc51348a6981539a98b267072"
|
||||
};
|
||||
xhr.__callback = callback;
|
||||
xhr.__this = this;
|
||||
xhr.onreadystatechange = function(e)
|
||||
{
|
||||
if (this.readyState === 4)
|
||||
{
|
||||
responseJSON = JSON.parse(this.responseText);
|
||||
if (responseJSON.result == "success")
|
||||
{
|
||||
if (responseJSON.item.widget == "row")
|
||||
{
|
||||
// !!! `this` is now XHR, not McxElementListView !!!
|
||||
var tr = document.createElement("tr");
|
||||
tr.appendChild(this.__this.createAddRemoveColumn());
|
||||
|
||||
var newRowIndex = this.__this.BodyElement.children.length;
|
||||
this.__this.CountInput.value = this.__this.BodyElement.children.length + 1;
|
||||
|
||||
for (var i = 1; i < this.__this.HeaderRowElement.children.length; i++)
|
||||
{
|
||||
// ! BEGIN HACK !
|
||||
var columnOffset = 0;
|
||||
if (this.__this.HeaderRowElement.children.length != responseJSON.item.contents.length)
|
||||
{
|
||||
columnOffset = 1;
|
||||
}
|
||||
|
||||
var td = document.createElement("td");
|
||||
var rowDefinition = responseJSON.item.contents[i - columnOffset];
|
||||
if (typeof(rowDefinition) !== "undefined")
|
||||
{
|
||||
// var colInstId = this.__this.HeaderRowElement.children[i].getAttribute("data-ecid");
|
||||
var colInstId = rowDefinition.ecid;
|
||||
var colWidget = rowDefinition.widget;
|
||||
|
||||
var fqecid = lvInstId + ":" + newRowIndex + ":" + colInstId;
|
||||
|
||||
if (colWidget === "text")
|
||||
{
|
||||
var input = document.createElement("input");
|
||||
input.id = "ec_" + fqecid;
|
||||
input.name = "ec_" + fqecid;
|
||||
input.setAttribute("data-ecid", "ec_" + fqecid);
|
||||
input.type = "text";
|
||||
td.appendChild(input);
|
||||
}
|
||||
else if (colWidget === "checkbox")
|
||||
{
|
||||
var input = document.createElement("input");
|
||||
input.id = "ec_" + fqecid;
|
||||
input.name = "ec_" + fqecid;
|
||||
input.setAttribute("data-ecid", "ec_" + fqecid);
|
||||
input.type = "checkbox";
|
||||
td.appendChild(input);
|
||||
|
||||
//! must be called after appendChild since it needs to finagle the DOM
|
||||
new CheckBox(input);
|
||||
}
|
||||
else if (colWidget === "monikerListInput")
|
||||
{
|
||||
var multiselect = false;
|
||||
if (rowDefinition.multiselect === true)
|
||||
{
|
||||
multiselect = true;
|
||||
}
|
||||
var moniker = McxInstanceBrowser.create({ "multiselect": multiselect, "fullyQualifiedECID": fqecid, "ecid": rowDefinition.ecid, "validClassIds": [ rowDefinition.ecdt ], "autocompleteUrl": "~/prompt/c0/" + rowDefinition.ecdt });
|
||||
if (moniker)
|
||||
{
|
||||
td.appendChild(moniker);
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
td.innerHTML = "undefined row def at index " + i;
|
||||
}
|
||||
tr.appendChild(td);
|
||||
}
|
||||
this.__callback(tr, callback_parms);
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
xhr.send(JSON.stringify(h));
|
||||
};
|
||||
this.addRowBefore = function(beforeIndex)
|
||||
{
|
||||
this.buildRow(function(tr, parms)
|
||||
{
|
||||
parms[0].BodyElement.insertBefore(tr, parms[0].BodyElement.children[parms[1]]);
|
||||
}, [ this, beforeIndex ]);
|
||||
this.setEmpty(false);
|
||||
};
|
||||
this.addRowAfter = function(afterElement)
|
||||
{
|
||||
this.buildRow(function(tr, parms)
|
||||
{
|
||||
parms[0].BodyElement.insertAfter(tr, parms[1]);
|
||||
}, [ this, afterElement ]);
|
||||
this.setEmpty(false);
|
||||
};
|
||||
this.removeRow = function(row)
|
||||
{
|
||||
row.remove();
|
||||
this.setEmpty(this.BodyElement.children.length == 0);
|
||||
};
|
||||
this.removeRowAt = function(index)
|
||||
{
|
||||
this.BodyElement.children[index].remove();
|
||||
this.setEmpty(this.BodyElement.children.length == 0);
|
||||
};
|
||||
|
||||
this.createAddRemoveColumn = function()
|
||||
{
|
||||
var td = document.createElement("td");
|
||||
td.className = "uwt-listview-row-buttons";
|
||||
|
||||
var aAdd = document.createElement("a");
|
||||
aAdd.className = "uwt-listview-row-add";
|
||||
aAdd.href = "#";
|
||||
aAdd.NativeObject = this;
|
||||
aAdd.addEventListener("click", function(e)
|
||||
{
|
||||
this.NativeObject.addRowAfter(this.parentElement);
|
||||
|
||||
e.preventDefault();
|
||||
e.stopPropagation();
|
||||
return false;
|
||||
});
|
||||
td.appendChild(aAdd);
|
||||
|
||||
var aRemove = document.createElement("a");
|
||||
aRemove.className = "uwt-listview-row-remove";
|
||||
aRemove.href = "#";
|
||||
aRemove.NativeObject = this;
|
||||
aRemove.addEventListener("click", function(e)
|
||||
{
|
||||
this.NativeObject.removeRow(this.parentElement.parentElement);
|
||||
|
||||
e.preventDefault();
|
||||
e.stopPropagation();
|
||||
return false;
|
||||
});
|
||||
td.appendChild(aRemove);
|
||||
|
||||
return td;
|
||||
};
|
||||
}
|
||||
|
||||
window.addEventListener("load", function()
|
||||
{
|
||||
var items = document.getElementsByClassName("mcx-element");
|
||||
for (var i = 0; i < items.length; i++)
|
||||
{
|
||||
if (items[i].tagName === "TABLE" && System.ClassList.Contains(items[i], "uwt-listview"))
|
||||
{
|
||||
items[i].McxElementListView = new McxElementListView(items[i]);
|
||||
}
|
||||
}
|
||||
});
|
||||
224
mocha-php/src/mocha-tms/scripts/mcx-elementcontent.js
Normal file
224
mocha-php/src/mocha-tms/scripts/mcx-elementcontent.js
Normal file
@ -0,0 +1,224 @@
|
||||
function McxElementContent(parentElement)
|
||||
{
|
||||
this.ParentElement = parentElement;
|
||||
this.LabelTd = this.ParentElement.children[0];
|
||||
if (this.LabelTd)
|
||||
{
|
||||
if (this.LabelTd.tagName === "td")
|
||||
{
|
||||
this.LabelElement = this.LabelTd.children[0];
|
||||
}
|
||||
else
|
||||
{
|
||||
this.LabelElement = this.LabelTd;
|
||||
}
|
||||
}
|
||||
|
||||
this.updateElementContentsWithFlowController = function(value, changes)
|
||||
{
|
||||
alert("update elements");
|
||||
for (var i = 0; i < changes.length; i++)
|
||||
{
|
||||
var ecid = changes[i].ecid;
|
||||
var ec = document.getElementById("ec_" + ecid);
|
||||
if (ec)
|
||||
{
|
||||
if (changes[i].addsDisplayOptions)
|
||||
{
|
||||
for (var j = 0; j < changes[i].addsDisplayOptions.length; j++)
|
||||
{
|
||||
if (changes[i].addsDisplayOptions[j].iid == "924$2")
|
||||
{
|
||||
if (value)
|
||||
{
|
||||
ec.setAttribute("disabled", "disabled");
|
||||
}
|
||||
else
|
||||
{
|
||||
ec.removeAttribute("disabled");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (changes[i].removesDisplayOptions)
|
||||
{
|
||||
for (var j = 0; j < changes[i].removesDisplayOptions.length; j++)
|
||||
{
|
||||
if (changes[i].removesDisplayOptions[j].iid == KnownInstanceKeys.DisplayOption__NotEnterable)
|
||||
{
|
||||
if (value)
|
||||
{
|
||||
ec.removeAttribute("disabled");
|
||||
}
|
||||
else
|
||||
{
|
||||
ec.setAttribute("disabled", "disabled");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
this.ValueContainer = this.ParentElement.children[1];
|
||||
if (this.ValueContainer.children.length > 0)
|
||||
{
|
||||
if (this.ValueContainer.children[0].tagName === "INPUT")
|
||||
{
|
||||
this.ValueContainer.children[0].addEventListener("blur", function()
|
||||
{
|
||||
console.log(" DO validation Here!");
|
||||
});
|
||||
}
|
||||
else if (this.ValueContainer.children[0].tagName === "DIV" && System.ClassList.Contains(this.ValueContainer.children[0], "mcx-instancebrowser"))
|
||||
{
|
||||
this.ValueContainer.children[0].children[2].addEventListener("blur", function(e)
|
||||
{
|
||||
var ib = this.parentElement.NativeObject;
|
||||
console.log("IB selected items: " + ib.getSelectedItems().length);
|
||||
});
|
||||
}
|
||||
else if (this.ValueContainer.children[0].tagName === "DIV" && System.ClassList.Contains(this.ValueContainer.children[0], "uwt-checkbox"))
|
||||
{
|
||||
var inputElement = this.ValueContainer.children[1];
|
||||
inputElement.McxNativeObject = this;
|
||||
inputElement.addEventListener("change", function()
|
||||
{
|
||||
var value = this.NativeObject.GetChecked();
|
||||
var ecid = this.McxNativeObject.ParentElement.getAttribute("data-fqecid");
|
||||
|
||||
var xhr = new XMLHttpRequest();
|
||||
var url = System.ExpandRelativePath("~/" + System.TenantName + "/flowController.htmld");
|
||||
xhr.NativeObject = this.McxNativeObject;
|
||||
xhr.NativeObject.ValueElement = this.NativeObject.ParentElement;
|
||||
xhr.inputElement = this;
|
||||
xhr.onreadystatechange = function()
|
||||
{
|
||||
if (this.readyState === 4)
|
||||
{
|
||||
console.log(xhr);
|
||||
if (this.status === 200)
|
||||
{
|
||||
json = JSON.parse(xhr.responseText);
|
||||
this.NativeObject.updateElementContentsWithFlowController(json.value, json.changes);
|
||||
}
|
||||
else
|
||||
{
|
||||
this.NativeObject.ValueElement.NativeObject.__inhibit_update = true;
|
||||
this.NativeObject.ValueElement.NativeObject.ToggleChecked();
|
||||
this.NativeObject.ValueElement.NativeObject.__inhibit_update = false;
|
||||
if (this.status === 403 || this.status === 401)
|
||||
{
|
||||
Alert.show("Please log in to continue", "Not Logged In", "uwt-color-danger", 5000, "NotLoggedIn");
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
xhr.open("POST", url);
|
||||
|
||||
var h = {
|
||||
"_flowExecutionKey": "e0s1",
|
||||
"ecid": ecid,
|
||||
"sessionSecureToken": "7733ad40-edf6-4dc9-aa90-85bcf93cc8f0",
|
||||
"clientRequestID" : "9af7ce5bc51348a6981539a98b267072",
|
||||
"value": value
|
||||
};
|
||||
xhr.send(JSON.stringify(h));
|
||||
|
||||
return true;
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
this.InstanceID = this.ParentElement.getAttribute("data-instance-id");
|
||||
this.ECID = this.ParentElement.getAttribute("data-ecid");
|
||||
|
||||
if (this.LabelElement)
|
||||
{
|
||||
this.LabelElement.NativeObject = this;
|
||||
this.LabelElement.addEventListener("contextmenu", function(e)
|
||||
{
|
||||
var cm = new ContextMenu();
|
||||
var ecid = this.NativeObject.ECID;
|
||||
var iid = this.NativeObject.InstanceID;
|
||||
cm.Items = [
|
||||
|
||||
{
|
||||
"JJJJ": this.NativeObject,
|
||||
"ClassName": "MenuItemCommand",
|
||||
"Title": "Show Field Properties",
|
||||
"Visible": true,
|
||||
"Execute": function()
|
||||
{
|
||||
var popup = Popup.create(this.JJJJ.LabelTd);
|
||||
|
||||
var listview = ListView.create(popup.ParentElement, {
|
||||
"columns": [
|
||||
{
|
||||
"id": "ecid",
|
||||
"title": "ECID"
|
||||
},
|
||||
{
|
||||
"id": "iid",
|
||||
"title": "Instance ID"
|
||||
}
|
||||
],
|
||||
"items": [
|
||||
{
|
||||
"columns": [
|
||||
{
|
||||
"id": "ecid",
|
||||
"value": ecid
|
||||
},
|
||||
{
|
||||
"id": "iid",
|
||||
"value": iid
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
});
|
||||
popup.ParentElement.appendChild(listview.ParentElement);
|
||||
|
||||
popup.Show();
|
||||
}
|
||||
},
|
||||
{
|
||||
"ClassName": "MenuItemCommand",
|
||||
"Title": "Show Field EC",
|
||||
"Visible": true,
|
||||
"Execute": function()
|
||||
{
|
||||
window.open(System.ExpandRelativePath("~/" + System.TenantName + "/d/inst/1$56/" + ecid + ".htmld"));
|
||||
}
|
||||
}
|
||||
|
||||
];
|
||||
cm.Show(e.clientX, e.clientY, this);
|
||||
|
||||
|
||||
e.preventDefault();
|
||||
e.stopPropagation();
|
||||
return false;
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
window.addEventListener("load", function()
|
||||
{
|
||||
var items = document.getElementsByClassName("mcx-elementcontent");
|
||||
for (var i = 0; i < items.length; i++)
|
||||
{
|
||||
// console.log("found mcx-elementcontent");
|
||||
// console.log(items[i]);
|
||||
items[i].McxNativeObject = new McxElementContent(items[i]);
|
||||
}
|
||||
/*
|
||||
var items = document.getElementsByClassName("mcx-element");
|
||||
for (var i = 0; i < items.length; i++)
|
||||
{
|
||||
items[i].McxNativeObject = new McxElementContent(items[i]);
|
||||
}
|
||||
*/
|
||||
});
|
||||
495
mocha-php/src/mocha-tms/scripts/mcx-instancebrowser.js
Normal file
495
mocha-php/src/mocha-tms/scripts/mcx-instancebrowser.js
Normal file
@ -0,0 +1,495 @@
|
||||
function McxInstanceBrowser(parentElement)
|
||||
{
|
||||
this.ParentElement = parentElement;
|
||||
this.HiddenElement = this.ParentElement.children[1];
|
||||
this.TextBoxElement = this.ParentElement.children[2];
|
||||
this.ListElement = this.ParentElement.children[3];
|
||||
this.SearchResultsElement = this.ParentElement.children[4];
|
||||
this.SearchResultsMenuElement = this.SearchResultsElement.children[0];
|
||||
this.SearchResultsSpinnerElement = this.SearchResultsElement.children[1];
|
||||
this.SearchResultsPlaceholderElement = this.SearchResultsElement.children[2];
|
||||
|
||||
this.__timeout = null;
|
||||
this.TextBoxElement.NativeObject = this;
|
||||
this.TextBoxElement.addEventListener("focus", function(e)
|
||||
{
|
||||
this.NativeObject.search(this.NativeObject.TextBoxElement.value);
|
||||
this.NativeObject.setEditing(true);
|
||||
});
|
||||
this.ParentElement.addEventListener("blur", function(e)
|
||||
{
|
||||
console.log(e.relatedTarget);
|
||||
this.NativeObject.setEditing(false);
|
||||
});
|
||||
|
||||
this.setEditing = function(value)
|
||||
{
|
||||
if (value)
|
||||
{
|
||||
System.ClassList.Add(this.ParentElement, "mcx-editing");
|
||||
}
|
||||
else
|
||||
{
|
||||
System.ClassList.Remove(this.ParentElement, "mcx-editing");
|
||||
}
|
||||
};
|
||||
|
||||
this.SearchResultsElement.NativeObject = this;
|
||||
this.SearchResultsElement.addEventListener("mousemove", function(e)
|
||||
{
|
||||
var searchResultsElements = this.NativeObject.SearchResultsMenuElement.children;
|
||||
for (var i = 0; i < searchResultsElements.length; i++)
|
||||
{
|
||||
System.ClassList.Remove(searchResultsElements[i], "uwt-highlight");
|
||||
}
|
||||
System.ClassList.Add(e.target, "uwt-highlight");
|
||||
});
|
||||
this.SearchResultsElement.addEventListener("keydown", function(e)
|
||||
{
|
||||
if (e.keyCode == KeyboardKeys.Tab)
|
||||
{
|
||||
// we are tabbing out of the search results, forward
|
||||
this.NativeObject.setEditing(false);
|
||||
}
|
||||
});
|
||||
|
||||
this.buildSearchResult = function(searchResult)
|
||||
{
|
||||
var li = document.createElement("li");
|
||||
/*
|
||||
var a = document.createElement("a");
|
||||
a.href = System.ExpandRelativePath("~/" + System.TenantName + "/d/inst/" + searchResult.iid + ".htmld");
|
||||
a.setAttribute("data-instance-id", searchResult.iid);
|
||||
a.innerText = searchResult.title;
|
||||
li.appendChild(a);
|
||||
*/
|
||||
var a = McxMoniker.create(searchResult.instanceId, searchResult.text, searchResult.viewTask);
|
||||
li.appendChild(a);
|
||||
|
||||
a = document.createElement("a");
|
||||
a.className = "uwt-delete-button";
|
||||
a.NativeObject = this;
|
||||
a.Index = this.ListElement.children.length;
|
||||
a.addEventListener("click", function()
|
||||
{
|
||||
this.NativeObject.removeAt(this.Index);
|
||||
});
|
||||
li.appendChild(a);
|
||||
|
||||
return li;
|
||||
};
|
||||
|
||||
this.getSelectedInstanceKeysString = function()
|
||||
{
|
||||
var str = "";
|
||||
for (var i = 0; i < this.ListElement.children.length; i++)
|
||||
{
|
||||
var iid = this.ListElement.children[i].children[0].getAttribute("data-instance-id");
|
||||
str += iid;
|
||||
if (i < this.ListElement.children.length - 1)
|
||||
{
|
||||
str += ",";
|
||||
}
|
||||
}
|
||||
return str;
|
||||
};
|
||||
|
||||
this.setPlaceholderText = function(value)
|
||||
{
|
||||
this.SearchResultsPlaceholderElement.innerText = value;
|
||||
};
|
||||
|
||||
this.clearSearchResults = function()
|
||||
{
|
||||
while(this.SearchResultsMenuElement.children.length > 0)
|
||||
{
|
||||
this.SearchResultsMenuElement.children[0].remove();
|
||||
}
|
||||
};
|
||||
this.clearSelectedItems = function()
|
||||
{
|
||||
while (this.ListElement.children.length > 0)
|
||||
{
|
||||
this.ListElement.children[0].remove();
|
||||
}
|
||||
};
|
||||
this.getSelectedItems = function()
|
||||
{
|
||||
var items = [];
|
||||
var strbps = this.HiddenElement.value;
|
||||
if (strbps === "")
|
||||
return items;
|
||||
|
||||
var strbpa = strbps.split(",");
|
||||
for (var i = 0; i < strbpa.length; i++)
|
||||
{
|
||||
items.push(InstanceKey.parse(strbpa[i]));
|
||||
}
|
||||
return items;
|
||||
};
|
||||
this.activateSearchResult = function(searchResult)
|
||||
{
|
||||
// `this` refers to the McxInstanceBrowser
|
||||
if (!System.ClassList.Contains(this.ParentElement, "mcx-multiselect"))
|
||||
{
|
||||
this.clearSelectedItems();
|
||||
}
|
||||
|
||||
this.ListElement.appendChild(this.buildSearchResult(searchResult));
|
||||
this.TextBoxElement.value = "";
|
||||
this.HiddenElement.value = this.getSelectedInstanceKeysString();
|
||||
this.ParentElement.setAttribute("data-instance-ids", this.getSelectedInstanceKeysString());
|
||||
return true;
|
||||
};
|
||||
this.search = function(query)
|
||||
{
|
||||
if (typeof(query) === 'undefined')
|
||||
{
|
||||
query = this.TextBoxElement.value;
|
||||
}
|
||||
|
||||
System.ClassList.Add(this.SearchResultsElement, "uwt-loading");
|
||||
this.clearSearchResults();
|
||||
this.setPlaceholderText("type to search the list");
|
||||
if (query === "")
|
||||
{
|
||||
System.ClassList.Add(this.SearchResultsElement, "mcx-placeholder-visible");
|
||||
}
|
||||
else
|
||||
{
|
||||
System.ClassList.Remove(this.SearchResultsElement, "mcx-placeholder-visible");
|
||||
}
|
||||
|
||||
var xhr = new XMLHttpRequest();
|
||||
xhr.NativeObject = this;
|
||||
var url = System.ExpandRelativePath("~/" + System.TenantName + "/prompt/c0/" + this.ParentElement.getAttribute("data-ecid") + ".htmld");
|
||||
xhr.open("POST", url);
|
||||
var h = {
|
||||
"_flowExecutionKey": "e0s1",
|
||||
"_eventId_prompt": this.ParentElement.getAttribute("data-ecid"),
|
||||
"sessionSecureToken": "7733ad40-edf6-4dc9-aa90-85bcf93cc8f0",
|
||||
"clientRequestID" : "9af7ce5bc51348a6981539a98b267072",
|
||||
"q" : query
|
||||
};
|
||||
xhr.onreadystatechange = function()
|
||||
{
|
||||
if (this.readyState === 4)
|
||||
{
|
||||
if (this.status == 200)
|
||||
{
|
||||
var json = JSON.parse(this.responseText);
|
||||
|
||||
this.NativeObject.clearSearchResults();
|
||||
System.ClassList.Remove(this.NativeObject.SearchResultsElement, "mcx-placeholder-visible");
|
||||
|
||||
for (var i = 0; i < json.items.length; i++)
|
||||
{
|
||||
var li = document.createElement("li");
|
||||
li.className = "uwt-menu-item uwt-menu-item-command uwt-visible";
|
||||
li.searchResult = json.items[i];
|
||||
li.NativeObject = this.NativeObject;
|
||||
li.addEventListener("click", function()
|
||||
{
|
||||
if (this.NativeObject.activateSearchResult(this.searchResult))
|
||||
{
|
||||
this.NativeObject.setEditing(false);
|
||||
}
|
||||
});
|
||||
|
||||
var moniker = McxMoniker.create(json.items[i].instanceId, json.items[i].text);
|
||||
/*
|
||||
var span = document.createElement("span");
|
||||
span.className = "uwt-title uwt-description-empty";
|
||||
span.innerText = json.items[i].title;
|
||||
li.appendChild(span);
|
||||
*/
|
||||
li.appendChild(moniker);
|
||||
|
||||
this.NativeObject.SearchResultsMenuElement.appendChild(li);
|
||||
}
|
||||
|
||||
System.ClassList.Remove(this.NativeObject.SearchResultsElement, "uwt-loading");
|
||||
}
|
||||
else
|
||||
{
|
||||
if (json.responseCode === 403)
|
||||
{
|
||||
Alert.show("Please log in to continue", "Not Authorized", "uwt-color-danger");
|
||||
}
|
||||
else
|
||||
{
|
||||
System.ClassList.Add(this.NativeObject.SearchResultsElement, "mcx-placeholder-visible");
|
||||
this.NativeObject.setPlaceholderText("Too many results. Please refine your search.");
|
||||
}
|
||||
System.ClassList.Remove(this.NativeObject.SearchResultsElement, "uwt-loading");
|
||||
}
|
||||
}
|
||||
};
|
||||
xhr.send(JSON.stringify(h));
|
||||
};
|
||||
|
||||
this.TextBoxElement.addEventListener("keydown", function(e)
|
||||
{
|
||||
if (e.keyCode == 13)
|
||||
{
|
||||
if (this.NativeObject.SearchResultsMenuElement.children.length === 1)
|
||||
{
|
||||
if (this.NativeObject.activateSearchResult(this.NativeObject.SearchResultsMenuElement.children[0].searchResult))
|
||||
{
|
||||
this.NativeObject.setEditing(false);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (this.NativeObject.__timeout !== null)
|
||||
{
|
||||
window.clearTimeout(this.NativeObject.__timeout);
|
||||
}
|
||||
this.NativeObject.search();
|
||||
|
||||
window.setTimeout(function(thiss)
|
||||
{
|
||||
if (thiss.NativeObject.SearchResultsMenuElement.children.length === 1)
|
||||
{
|
||||
if (thiss.NativeObject.activateSearchResult(thiss.NativeObject.SearchResultsMenuElement.children[0].searchResult))
|
||||
{
|
||||
thiss.NativeObject.setEditing(false);
|
||||
}
|
||||
}
|
||||
}, 100, this);
|
||||
}
|
||||
e.preventDefault();
|
||||
e.stopPropagation();
|
||||
return false;
|
||||
}
|
||||
if (e.keyCode == 37)
|
||||
{
|
||||
return;
|
||||
}
|
||||
else if (e.keyCode == 38)
|
||||
{
|
||||
return;
|
||||
}
|
||||
else if (e.keyCode == 39)
|
||||
{
|
||||
return;
|
||||
}
|
||||
else if (e.keyCode == 40)
|
||||
{
|
||||
return;
|
||||
}
|
||||
else if (e.keyCode == 16 || e.keyCode == 17 || e.keyCode == 18)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
console.log(e.keyCode);
|
||||
|
||||
System.ClassList.Add(this.NativeObject.SearchResultsElement, "uwt-loading");
|
||||
if (this.NativeObject.__timeout !== null)
|
||||
{
|
||||
window.clearTimeout(this.NativeObject.__timeout);
|
||||
}
|
||||
this.NativeObject.__timeout = window.setTimeout(function(thiss)
|
||||
{
|
||||
thiss.search(thiss.TextBoxElement.value);
|
||||
}, 1000, this.NativeObject);
|
||||
|
||||
if (e.keyCode == KeyboardKeys.Tab && e.shiftKey)
|
||||
{
|
||||
// we are tabbing out of the input element, backward
|
||||
this.NativeObject.setEditing(false);
|
||||
return true;
|
||||
}
|
||||
if (e.keyCode == KeyboardKeys.Enter)
|
||||
{
|
||||
e.preventDefault();
|
||||
e.stopPropagation();
|
||||
return false;
|
||||
}
|
||||
else if (e.keyCode == KeyboardKeys.Escape)
|
||||
{
|
||||
System.ClassList.Remove(this.NativeObject.ParentElement, "mcx-editing");
|
||||
}
|
||||
else if (e.keyCode == KeyboardKeys.ArrowUp)
|
||||
{
|
||||
var searchResultsElements = this.NativeObject.SearchResultsMenuElement.children;
|
||||
if (searchResultsElements.length > 0)
|
||||
{
|
||||
var i = searchResultsElements.length - 1;
|
||||
var currentIndex = -1;
|
||||
while (i >= 0)
|
||||
{
|
||||
if (System.ClassList.Contains(searchResultsElements[i], "uwt-highlight"))
|
||||
{
|
||||
currentIndex = i;
|
||||
}
|
||||
System.ClassList.Remove(searchResultsElements[i], "uwt-highlight");
|
||||
i--;
|
||||
}
|
||||
if (currentIndex > 0)
|
||||
{
|
||||
System.ClassList.Add(searchResultsElements[currentIndex - 1], "uwt-highlight");
|
||||
}
|
||||
else
|
||||
{
|
||||
System.ClassList.Add(searchResultsElements[searchResultsElements.length - 1], "uwt-highlight");
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (e.keyCode == KeyboardKeys.ArrowDown)
|
||||
{
|
||||
var searchResultsElements = this.NativeObject.SearchResultsMenuElement.children;
|
||||
if (searchResultsElements.length > 0)
|
||||
{
|
||||
var i = 0;
|
||||
var currentIndex = -1;
|
||||
while (i < searchResultsElements.length)
|
||||
{
|
||||
if (System.ClassList.Contains(searchResultsElements[i], "uwt-highlight"))
|
||||
{
|
||||
currentIndex = i;
|
||||
}
|
||||
System.ClassList.Remove(searchResultsElements[i], "uwt-highlight");
|
||||
i++;
|
||||
}
|
||||
if (currentIndex < searchResultsElements.length - 1)
|
||||
{
|
||||
System.ClassList.Add(searchResultsElements[currentIndex + 1], "uwt-highlight");
|
||||
}
|
||||
else
|
||||
{
|
||||
System.ClassList.Add(searchResultsElements[0], "uwt-highlight");
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
this.removeAt = function(index)
|
||||
{
|
||||
console.log(this.HiddenElement);
|
||||
|
||||
var strbps = this.HiddenElement.value;
|
||||
var strbpa = strbps.split(",");
|
||||
var strbpn = [ ];
|
||||
for (var i = 0; i < strbpa.length; i++)
|
||||
{
|
||||
if (i !== index)
|
||||
{
|
||||
strbpn.push(strbpa[i]);
|
||||
}
|
||||
}
|
||||
|
||||
this.ListElement.children[index].remove();
|
||||
|
||||
this.HiddenElement.value = strbpn.join(",");
|
||||
};
|
||||
|
||||
for (var i = 0; i < this.ListElement.children.length; i++)
|
||||
{
|
||||
var delete_btn = this.ListElement.children[i].children[1];
|
||||
delete_btn.NativeObject = this;
|
||||
delete_btn.addEventListener("click", function()
|
||||
{
|
||||
var index = Array.prototype.indexOf.call(this.NativeObject.ListElement.children, this.parentElement);
|
||||
this.NativeObject.removeAt(index);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
McxInstanceBrowser.create = function(parms)
|
||||
{
|
||||
var div = document.createElement("DIV");
|
||||
div.className = "mcx-instancebrowser mcx-editable";
|
||||
|
||||
if (parms.multiselect === true)
|
||||
{
|
||||
System.ClassList.Add(div, "mcx-multiselect");
|
||||
}
|
||||
|
||||
var value = null;
|
||||
if (parms.ecid)
|
||||
{
|
||||
div.setAttribute("data-ecid", parms.ecid);
|
||||
}
|
||||
if (typeof(parms.selectedInstanceIds) === "object")
|
||||
{
|
||||
value = parms.selectedInstanceIds.join(";");
|
||||
div.setAttribute("data-instance-ids", value);
|
||||
}
|
||||
if (typeof(parms.validClassIds) === "object")
|
||||
{
|
||||
div.setAttribute("data-valid-class-ids", parms.validClassIds.join(";"));
|
||||
}
|
||||
if (parms.autocompleteUrl)
|
||||
{
|
||||
div.setAttribute("data-autocomplete-url", parms.autocompleteUrl);
|
||||
}
|
||||
|
||||
var divTitle = document.createElement("DIV");
|
||||
if (parms.title)
|
||||
{
|
||||
divTitle.innerHTML = title;
|
||||
}
|
||||
div.appendChild(divTitle);
|
||||
|
||||
var inputHidden = document.createElement("INPUT");
|
||||
inputHidden.type = "hidden";
|
||||
inputHidden.name = "ec_" + parms.fullyQualifiedECID;
|
||||
if (value !== null)
|
||||
{
|
||||
inputHidden.value = value;
|
||||
}
|
||||
div.appendChild(inputHidden);
|
||||
|
||||
var input = document.createElement("INPUT");
|
||||
input.type = "text";
|
||||
div.appendChild(input);
|
||||
|
||||
var ul = document.createElement("UL");
|
||||
ul.className = "mcx-selected-items";
|
||||
div.appendChild(ul);
|
||||
|
||||
var divSearchResults = document.createElement("DIV");
|
||||
divSearchResults.className = "uwt-popup mcx-search-results";
|
||||
|
||||
var ulSearchResults = document.createElement("UL");
|
||||
ulSearchResults.className = "uwt-menu uwt-multiselect uwt-highlight";
|
||||
divSearchResults.appendChild(ulSearchResults);
|
||||
|
||||
var divSpinner = document.createElement("DIV");
|
||||
divSpinner.className = "uwt-spinner";
|
||||
divSearchResults.appendChild(divSpinner);
|
||||
|
||||
var divPlaceholder = document.createElement("DIV");
|
||||
divPlaceholder.className = "uwt-placeholder";
|
||||
divPlaceholder.innerText = "type to search the list";
|
||||
divSearchResults.appendChild(divPlaceholder);
|
||||
|
||||
div.appendChild(divSearchResults);
|
||||
|
||||
new McxInstanceBrowser(div);
|
||||
|
||||
return div;
|
||||
};
|
||||
|
||||
window.addEventListener("load", function()
|
||||
{
|
||||
var items = document.getElementsByClassName("mcx-instancebrowser");
|
||||
for (var i = 0; i < items.length; i++)
|
||||
{
|
||||
items[i].NativeObject = new McxInstanceBrowser(items[i]);
|
||||
}
|
||||
});
|
||||
|
||||
window.addEventListener("click", function(e)
|
||||
{
|
||||
var ibs = document.getElementsByClassName("mcx-instancebrowser");
|
||||
for (var i = 0; i < ibs.length; i++)
|
||||
{
|
||||
if (!System.CheckIfSenderIsInside(e.target, ibs[i]))
|
||||
{
|
||||
ibs[i].NativeObject.setEditing(false);
|
||||
}
|
||||
}
|
||||
});
|
||||
22
mocha-php/src/mocha-tms/scripts/mcx-instancekey.js
Normal file
22
mocha-php/src/mocha-tms/scripts/mcx-instancekey.js
Normal file
@ -0,0 +1,22 @@
|
||||
function InstanceKey()
|
||||
{
|
||||
this.ClassIndex = 0;
|
||||
this.InstanceIndex = 0;
|
||||
|
||||
this.toString = function()
|
||||
{
|
||||
return this.ClassIndex + "$" + this.InstanceIndex;
|
||||
};
|
||||
}
|
||||
|
||||
InstanceKey.parse = function(value)
|
||||
{
|
||||
var split = value.split("$");
|
||||
var classIndex = parseInt(split[0]);
|
||||
var instanceIndex = parseInt(split[1]);
|
||||
|
||||
var ik = new InstanceKey();
|
||||
ik.ClassIndex = classIndex;
|
||||
ik.InstanceIndex = instanceIndex;
|
||||
return ik;
|
||||
};
|
||||
15
mocha-php/src/mocha-tms/scripts/mcx-messages.js
Normal file
15
mocha-php/src/mocha-tms/scripts/mcx-messages.js
Normal file
@ -0,0 +1,15 @@
|
||||
var mochaMessages = {
|
||||
"MXRES.CONTEXTMENUITEM.ViewPrintableVersion": "View Printable Version",
|
||||
"MXRES.CONTEXTMENUITEM.ExportToSpreadsheet": "Export to Spreadsheet",
|
||||
"MXRES.MONIKER.CONTEXTMENUITEM.CopyInstanceID": "Copy Instance ID ({0})",
|
||||
"MXRES.MONIKER.CONTEXTMENUITEM.CopyText": "Copy Text",
|
||||
"MXRES.MONIKER.CONTEXTMENUITEM.CopyTextAndInstanceID": "Copy Text and Instance ID",
|
||||
"MXRES.MONIKER.CONTEXTMENUITEM.CopyURL": "Copy URL",
|
||||
"MXRES.MONIKER.CONTEXTMENUITEM.EditInNewWindow": "Edit in New Window",
|
||||
"MXRES.MONIKER.CONTEXTMENUITEM.EditInstance": "Edit Instance",
|
||||
"MXRES.MONIKER.CONTEXTMENUITEM.SearchInstanceID": "Search Instance ID ({0})",
|
||||
"MXRES.MONIKER.CONTEXTMENUITEM.SearchInstanceIDInMaster": "Search Instance ID ({0}) in Master",
|
||||
"MXRES.MONIKER.CONTEXTMENUITEM.SearchInstanceIDInNewWindow": "Search Instance ID ({0}) in New Window",
|
||||
"MXRES.MONIKER.CONTEXTMENUITEM.SeeInNewWindow": "See in New Tab",
|
||||
"MXRES.MONIKER.CONTEXTMENUITEM.SeeRelatedInstances": "See Related Instances"
|
||||
};
|
||||
412
mocha-php/src/mocha-tms/scripts/mcx-moniker.js
Normal file
412
mocha-php/src/mocha-tms/scripts/mcx-moniker.js
Normal file
@ -0,0 +1,412 @@
|
||||
function McxMoniker(parentElement)
|
||||
{
|
||||
this.ParentElement = parentElement;
|
||||
if (this.ParentElement.children[0].tagName == "IMG")
|
||||
{
|
||||
this.IconElement = this.ParentElement.children[0];
|
||||
this.LabelElement = this.ParentElement.children[1];
|
||||
this.ButtonElement = this.ParentElement.children[2];
|
||||
this.PopupElement = this.ParentElement.children[3];
|
||||
}
|
||||
else
|
||||
{
|
||||
this.IconElement = null;
|
||||
this.LabelElement = this.ParentElement.children[0];
|
||||
this.ButtonElement = this.ParentElement.children[1];
|
||||
this.PopupElement = this.ParentElement.children[2];
|
||||
}
|
||||
|
||||
this.ParentElement.addEventListener("contextmenu", function(e)
|
||||
{
|
||||
var cm = new ContextMenu();
|
||||
cm.Data = this.McxNativeObject;
|
||||
var ecid = this.NativeObject.ECID;
|
||||
var iid = this.McxNativeObject.ParentElement.getAttribute("data-instance-id");
|
||||
cm.Items = [
|
||||
{
|
||||
"ClassName": "MenuItemCommand",
|
||||
"Title": mochaMessages["MXRES.MONIKER.CONTEXTMENUITEM.SeeInNewWindow"],
|
||||
"Visible": function()
|
||||
{
|
||||
return this.Menu.Data.LabelElement.tagName == "A";
|
||||
},
|
||||
"Execute": function()
|
||||
{
|
||||
var ik = InstanceKey.parse(iid);
|
||||
var castClassId = "1$" + ik.ClassIndex;
|
||||
var relativeUrl = System.ExpandRelativePath("~/" + System.TenantName + "/d/inst/" + castClassId + "/" + iid + ".htmld");
|
||||
var url = new URL(relativeUrl, document.baseURI).href;
|
||||
window.open(relativeUrl);
|
||||
}
|
||||
},
|
||||
{
|
||||
"ClassName": "MenuItemSeparator",
|
||||
"Visible": function()
|
||||
{
|
||||
return this.Menu.Data.LabelElement.tagName == "A";
|
||||
}
|
||||
},
|
||||
{
|
||||
"ClassName": "MenuItemCommand",
|
||||
"Title": mochaMessages["MXRES.MONIKER.CONTEXTMENUITEM.CopyURL"],
|
||||
"Visible": true,
|
||||
"Execute": function()
|
||||
{
|
||||
var ik = InstanceKey.parse(iid);
|
||||
var castClassId = "1$" + ik.ClassIndex;
|
||||
var relativeUrl = System.ExpandRelativePath("~/" + System.TenantName + "/d/inst/" + castClassId + "/" + iid + ".htmld");
|
||||
var url = new URL(relativeUrl, document.baseURI).href;
|
||||
Clipboard.setText(url);
|
||||
}
|
||||
},
|
||||
{
|
||||
"ClassName": "MenuItemCommand",
|
||||
"Title": mochaMessages["MXRES.MONIKER.CONTEXTMENUITEM.CopyText"],
|
||||
"Visible": true,
|
||||
"Execute": function()
|
||||
{
|
||||
Clipboard.setText(this.Menu.Data.LabelElement.innerText);
|
||||
}
|
||||
},
|
||||
{
|
||||
"ClassName": "MenuItemSeparator",
|
||||
"Visible": true
|
||||
},
|
||||
{
|
||||
"ClassName": "MenuItemCommand",
|
||||
"Title": String.format(mochaMessages["MXRES.MONIKER.CONTEXTMENUITEM.CopyInstanceID"], iid),
|
||||
"Visible": true,
|
||||
"Execute": function()
|
||||
{
|
||||
Clipboard.setText(iid);
|
||||
}
|
||||
},
|
||||
{
|
||||
"ClassName": "MenuItemCommand",
|
||||
"Title": mochaMessages["MXRES.MONIKER.CONTEXTMENUITEM.CopyTextAndInstanceID"],
|
||||
"Visible": true,
|
||||
"Execute": function()
|
||||
{
|
||||
Clipboard.setText(this.Menu.Data.LabelElement.innerText);
|
||||
}
|
||||
},
|
||||
{
|
||||
"ClassName": "MenuItemSeparator",
|
||||
"Visible": true
|
||||
},
|
||||
{
|
||||
"ClassName": "MenuItemCommand",
|
||||
"Title": mochaMessages["MXRES.MONIKER.CONTEXTMENUITEM.EditInstance"],
|
||||
"Visible": true,
|
||||
"TargetURL": function()
|
||||
{
|
||||
var ik = InstanceKey.parse(iid);
|
||||
var castClassId = "1$" + ik.ClassIndex;
|
||||
var relativeUrl = System.ExpandRelativePath("~/" + System.TenantName + "/d/inst/" + castClassId + "/" + iid + ".htmld");
|
||||
var url = new URL(relativeUrl, document.baseURI).href;
|
||||
return url;
|
||||
}
|
||||
},
|
||||
{
|
||||
"ClassName": "MenuItemCommand",
|
||||
"Title": String.format(mochaMessages["MXRES.MONIKER.CONTEXTMENUITEM.SearchInstanceID"], iid),
|
||||
"Visible": true,
|
||||
"TargetURL": function()
|
||||
{
|
||||
return System.ExpandRelativePath("~/" + System.TenantName + "/d/search.htmld?q=" + iid + "&branch=true");
|
||||
}
|
||||
},
|
||||
{
|
||||
"ClassName": "MenuItemSeparator",
|
||||
"Visible": true
|
||||
},
|
||||
{
|
||||
"ClassName": "MenuItemCommand",
|
||||
"Title": mochaMessages["MXRES.CONTEXTMENUITEM.ViewPrintableVersion"],
|
||||
"Visible": true,
|
||||
"Execute": function()
|
||||
{
|
||||
Window.ShowDialog("The method or operation is not implemented", "Not Implemented");
|
||||
}
|
||||
},
|
||||
{
|
||||
"ClassName": "MenuItemCommand",
|
||||
"Title": mochaMessages["MXRES.CONTEXTMENUITEM.ExportToSpreadsheet"],
|
||||
"Visible": true,
|
||||
"Execute": function()
|
||||
{
|
||||
Window.ShowDialog("The method or operation is not implemented", "Not Implemented");
|
||||
}
|
||||
}
|
||||
];
|
||||
cm.Show(e.clientX, e.clientY, document.body);
|
||||
|
||||
|
||||
e.preventDefault();
|
||||
e.stopPropagation();
|
||||
return false;
|
||||
});
|
||||
|
||||
this.ActionsMenuElement = this.PopupElement.children[0].children[1];
|
||||
this.ClassTitleElement = this.PopupElement.children[1].children[0].children[0].children[0];
|
||||
this.InstanceTitleElement = this.PopupElement.children[1].children[0].children[0].children[1];
|
||||
this.PreviewContentElement = this.PopupElement.children[1].children[1];
|
||||
|
||||
this.InstanceID = this.ParentElement.getAttribute("data-instance-id");
|
||||
|
||||
this.setInstanceTitle = function(value)
|
||||
{
|
||||
this.InstanceTitleElement.innerText = value;
|
||||
};
|
||||
this.setClassTitle = function(value)
|
||||
{
|
||||
this.ClassTitleElement.innerText = value;
|
||||
};
|
||||
|
||||
this.BuildMenuItem = function(title, url)
|
||||
{
|
||||
|
||||
};
|
||||
|
||||
this.ButtonElement.McxNativeObject = this;
|
||||
this.OnOpening = function()
|
||||
{
|
||||
System.ClassList.Add(this.PopupElement, "uwt-loading");
|
||||
|
||||
var url = System.ExpandRelativePath("~/" + System.TenantName + "/inst/" + this.InstanceID + "/rel-tasks.htmld");
|
||||
var xhr = new XMLHttpRequest();
|
||||
xhr.timeout = 5000;
|
||||
xhr.open("GET", url);
|
||||
xhr.thiss = this;
|
||||
xhr.onreadystatechange = function(e)
|
||||
{
|
||||
var xhr = e.target;
|
||||
if (xhr.readyState == 4)
|
||||
{
|
||||
if (xhr.status == 200)
|
||||
{
|
||||
var json = JSON.parse(xhr.responseText);
|
||||
console.log(json);
|
||||
|
||||
if (json.result == "failure" && json.responseCode == 403)
|
||||
{
|
||||
Alert.show(json.message, json.title, "uwt-color-danger");
|
||||
return;
|
||||
}
|
||||
|
||||
if (json.instance)
|
||||
{
|
||||
if (json.instance.label)
|
||||
{
|
||||
// xhr.thiss.setClassTitle("Return Attribute Method Binding");
|
||||
xhr.thiss.setClassTitle(json.instance.label);
|
||||
}
|
||||
if (json.instance.title)
|
||||
{
|
||||
// xhr.thiss.setInstanceTitle("Common Text@get Concatenated Date and Time Format (BA)*P*S(public)[ramb]");
|
||||
xhr.thiss.setInstanceTitle(json.instance.title);
|
||||
}
|
||||
}
|
||||
if (json.taskGroups)
|
||||
{
|
||||
System.ClassList.Remove(xhr.thiss.ActionsMenuElement.parentElement, "uwt-empty");
|
||||
|
||||
xhr.thiss.ActionsMenuElement.innerHTML = "";
|
||||
for (var i = 0; i < json.taskGroups.length; i++)
|
||||
{
|
||||
var tgprimary = json.taskGroups[i].taskGroups[0];
|
||||
if (tgprimary.taskGroups.length === 0)
|
||||
continue;
|
||||
|
||||
var label = tgprimary.label;
|
||||
|
||||
var li = document.createElement("li");
|
||||
li.className = "uwt-menu-item-command uwt-menu-item-popup uwt-visible";
|
||||
|
||||
var a = document.createElement("a");
|
||||
a.href = "#";
|
||||
|
||||
var span = document.createElement("span");
|
||||
span.className = "uwt-title";
|
||||
span.innerText = label;
|
||||
a.appendChild(span);
|
||||
|
||||
li.appendChild(a);
|
||||
|
||||
var ulMenuChild = document.createElement("ul");
|
||||
ulMenuChild.className = "uwt-menu uwt-popup";
|
||||
|
||||
for (var j = 0; j < tgprimary.taskGroups.length; j++)
|
||||
{
|
||||
var tgsecondary = tgprimary.taskGroups[j].tasks[0];
|
||||
var li2 = document.createElement("li");
|
||||
li2.className = "uwt-menu-item-command uwt-visible";
|
||||
|
||||
var a2 = document.createElement("a");
|
||||
a2.href = tgsecondary.uri;
|
||||
|
||||
var span2 = document.createElement("span");
|
||||
span2.className = "uwt-title";
|
||||
span2.innerText = tgsecondary.label;
|
||||
a2.appendChild(span2);
|
||||
|
||||
li2.appendChild(a2);
|
||||
ulMenuChild.appendChild(li2);
|
||||
}
|
||||
|
||||
li.appendChild(ulMenuChild);
|
||||
|
||||
xhr.thiss.ActionsMenuElement.appendChild(li);
|
||||
}
|
||||
}
|
||||
|
||||
if (json.messages)
|
||||
{
|
||||
for (var i = 0; i < json.messages.length; i++)
|
||||
{
|
||||
Alert.show(json.messages[i].content, json.messages[i].title, "uwt-color-danger");
|
||||
}
|
||||
}
|
||||
|
||||
if (json.preview)
|
||||
{
|
||||
xhr.thiss.PreviewContentElement.innerHTML = json.preview;
|
||||
}
|
||||
|
||||
System.ClassList.Remove(xhr.thiss.PopupElement, "uwt-loading");
|
||||
xhr.thiss.ParentElement.NativeObject.UpdatePopupLocation();
|
||||
}
|
||||
else if (xhr.status == 403)
|
||||
{
|
||||
|
||||
}
|
||||
else if (xhr.status == 0)
|
||||
{
|
||||
Alert.show("Please check your connection and try again", "Connection lost", "uwt-color-danger", 5000);
|
||||
}
|
||||
}
|
||||
};
|
||||
xhr.send(null);
|
||||
};
|
||||
}
|
||||
|
||||
McxMoniker.create = function(instanceKey, title, viewTask)
|
||||
{
|
||||
var div = document.createElement("div");
|
||||
div.setAttribute("data-instance-id", instanceKey);
|
||||
div.className = "mcx-moniker uwt-actionpreviewbutton apb-show-text apb-style-ellipsis";
|
||||
|
||||
var img = document.createElement("img");
|
||||
img.className = "apb-icon";
|
||||
img.addEventListener("error", function()
|
||||
{
|
||||
this.style.display="none";
|
||||
});
|
||||
img.src = "/madi/asset/uic-assets/1.1.5/zq/icons/1$" + instanceKey.split("$")[0];
|
||||
img.setAttribute("alt", "");
|
||||
div.appendChild(img);
|
||||
|
||||
var a = document.createElement("a");
|
||||
if (viewTask != null)
|
||||
{
|
||||
a.className = "apb-text";
|
||||
a.href = System.ExpandRelativePath("~/" + System.TenantName + "/d/inst/" + instanceKey + ".htmld");
|
||||
}
|
||||
else
|
||||
{
|
||||
a.className = "apb-text apb-empty";
|
||||
}
|
||||
if (title == "")
|
||||
{
|
||||
a.innerHTML = " ";
|
||||
}
|
||||
else
|
||||
{
|
||||
a.innerText = title;
|
||||
}
|
||||
div.appendChild(a);
|
||||
|
||||
a = document.createElement("a");
|
||||
a.className = "apb-button";
|
||||
a.href = System.ExpandRelativePath("~/" + System.TenantName + "/d/inst/" + instanceKey + "/rel-tasks.htmld");
|
||||
a.innerHTML = " ";
|
||||
div.appendChild(a);
|
||||
|
||||
var apbPreview = document.createElement("div");
|
||||
apbPreview.className = "apb-preview uwt-popup";
|
||||
|
||||
var apbActions = document.createElement("div");
|
||||
apbActions.className = "apb-actions uwt-empty";
|
||||
|
||||
var h2 = document.createElement("h2");
|
||||
h2.innerText = "Available Actions";
|
||||
apbActions.appendChild(h2);
|
||||
|
||||
var ul = document.createElement("ul");
|
||||
ul.className = "uwt-menu";
|
||||
|
||||
apbActions.appendChild(ul);
|
||||
|
||||
apbPreview.appendChild(apbActions);
|
||||
|
||||
|
||||
|
||||
var apbPreviewContent = document.createElement("div");
|
||||
apbPreviewContent.className = "apb-preview-content";
|
||||
|
||||
var apbHeader = document.createElement("div");
|
||||
apbHeader.className = "apb-header";
|
||||
|
||||
var h2 = document.createElement("h2");
|
||||
var spanClassTitle = document.createElement("span");
|
||||
spanClassTitle.className = "apb-class-title";
|
||||
spanClassTitle.innerText = "Relationship";
|
||||
h2.appendChild(spanClassTitle);
|
||||
|
||||
var img = document.createElement("img");
|
||||
img.className = "apb-icon";
|
||||
img.src = "/madi/asset/uic-assets/1.1.5/zq/icons/1$" + instanceKey.split("$")[0];
|
||||
img.setAttribute("alt", "");
|
||||
h2.appendChild(img);
|
||||
|
||||
var text = document.createElement("a");
|
||||
text.className = "apb-text apb-empty";
|
||||
text.href= "";
|
||||
text.innerText = title;
|
||||
h2.appendChild(text);
|
||||
|
||||
apbHeader.appendChild(h2);
|
||||
|
||||
apbPreviewContent.appendChild(apbHeader);
|
||||
apbPreview.appendChild(apbPreviewContent);
|
||||
|
||||
var apbSpinner = document.createElement("div");
|
||||
apbSpinner.className = "uwt-spinner";
|
||||
apbPreview.appendChild(apbSpinner);
|
||||
|
||||
|
||||
div.appendChild(apbPreview);
|
||||
//</div><div class="apb-preview-content"><div class="apb-header"><h2><span class="apb-class-title">Work Set</span><img class="apb-icon" src="/madi/asset/uic-assets/1.1.5/zq/icons/1$15.png"><a class="apb-text" href="/super/d/inst/1$15/15$12.htmld">Conditional Select Attribute Case [Nonsingular]</a></h2></div><div class="apb-content"></div></div><div class="uwt-spinner"> </div></div></div>"
|
||||
|
||||
|
||||
div.NativeObject = new AdditionalDetailWidget(div);
|
||||
div.McxNativeObject = new McxMoniker(div);
|
||||
div.NativeObject.OnOpening = function()
|
||||
{
|
||||
this.Parent.McxNativeObject.OnOpening();
|
||||
};
|
||||
return div;
|
||||
};
|
||||
|
||||
window.addEventListener("load", function()
|
||||
{
|
||||
var items = document.getElementsByClassName("mcx-moniker");
|
||||
for (var i = 0; i < items.length; i++)
|
||||
{
|
||||
items[i].McxNativeObject = new McxMoniker(items[i]);
|
||||
items[i].NativeObject.OnOpening = function()
|
||||
{
|
||||
this.Parent.McxNativeObject.OnOpening();
|
||||
};
|
||||
}
|
||||
});
|
||||
110
mocha-php/src/mocha-tms/scripts/mcx-typeaheadsearch.js
Normal file
110
mocha-php/src/mocha-tms/scripts/mcx-typeaheadsearch.js
Normal file
@ -0,0 +1,110 @@
|
||||
function McxTypeaheadSearch(parentElement)
|
||||
{
|
||||
this.ParentElement = parentElement;
|
||||
this.FormElement = this.ParentElement.children[0];
|
||||
this.TextBoxElement = this.FormElement.children[0];
|
||||
this.PopupElement = this.ParentElement.children[1];
|
||||
this.MenuElement = this.PopupElement.children[0];
|
||||
|
||||
this.clearSearchResults = function()
|
||||
{
|
||||
while (this.MenuElement.children.length > 0)
|
||||
{
|
||||
this.MenuElement.children[0].remove();
|
||||
}
|
||||
};
|
||||
this.activateSearchResult = function(searchResult)
|
||||
{
|
||||
window.location.href = searchResult.uri;
|
||||
};
|
||||
|
||||
this.search = function(query)
|
||||
{
|
||||
System.ClassList.Add(this.PopupElement, "uwt-visible");
|
||||
System.ClassList.Add(this.PopupElement, "uwt-loading");
|
||||
|
||||
var xhr = new XMLHttpRequest();
|
||||
var searchUrl = System.ExpandRelativePath("~/" + System.TenantName + "/search.htmld?q=" + encodeURIComponent(query));
|
||||
// var searchUrl = System.ExpandRelativePath("~/madi/pex/fs/" + System.TenantName + "typeahead?q=" + encodeURIComponent(query) + "&contextualsearch=true&autocomplete=true&clientRequestId=");
|
||||
|
||||
/*
|
||||
if (this.ParentElement.hasAttribute("data-valid-class-ids"))
|
||||
{
|
||||
searchUrl += "&validClassIds=" + this.ParentElement.getAttribute("data-valid-class-ids");
|
||||
}
|
||||
*/
|
||||
xhr.open("GET", searchUrl, true);
|
||||
xhr.NativeObject = this;
|
||||
xhr.onreadystatechange = function()
|
||||
{
|
||||
if (this.readyState === 4)
|
||||
{
|
||||
var resultsText = this.responseText;
|
||||
var json = JSON.parse(resultsText);
|
||||
System.ClassList.Remove(this.NativeObject.PopupElement, "uwt-loading");
|
||||
if (json.result === "success")
|
||||
{
|
||||
this.NativeObject.clearSearchResults();
|
||||
|
||||
for (var i = 0; i < json.items.length; i++)
|
||||
{
|
||||
var li = document.createElement("li");
|
||||
li.className = "uwt-menu-item uwt-menu-item-command uwt-visible";
|
||||
li.searchResult = json.items[i];
|
||||
li.NativeObject = this.NativeObject;
|
||||
li.addEventListener("click", function()
|
||||
{
|
||||
if (this.NativeObject.activateSearchResult(this.searchResult))
|
||||
{
|
||||
this.NativeObject.setEditing(false);
|
||||
}
|
||||
});
|
||||
|
||||
var span = document.createElement("span");
|
||||
span.className = "uwt-title";
|
||||
span.innerText = json.items[i].label;
|
||||
li.appendChild(span);
|
||||
|
||||
span = document.createElement("span");
|
||||
span.className = "uwt-description";
|
||||
span.innerText = json.items[i].summaryDescription;
|
||||
li.appendChild(span);
|
||||
|
||||
this.NativeObject.MenuElement.appendChild(li);
|
||||
}
|
||||
|
||||
System.ClassList.Remove(this.NativeObject.PopupElement, "uwt-loading");
|
||||
}
|
||||
else
|
||||
{
|
||||
if (json.responseCode === 403)
|
||||
{
|
||||
Alert.show("Please log in to continue", "Not Authorized", "uwt-color-danger");
|
||||
}
|
||||
System.ClassList.Remove(this.NativeObject.PopupElement, "uwt-loading");
|
||||
}
|
||||
}
|
||||
};
|
||||
xhr.send(null);
|
||||
};
|
||||
|
||||
this.__timeout = null;
|
||||
this.TextBoxElement.NativeObject = this;
|
||||
this.TextBoxElement.addEventListener("keyup", function(e)
|
||||
{
|
||||
if (this.NativeObject.__timeout !== null)
|
||||
{
|
||||
window.clearTimeout(this.NativeObject.__timeout);
|
||||
}
|
||||
this.NativeObject.__timeout = window.setTimeout(function(thiss)
|
||||
{
|
||||
thiss.search(thiss.TextBoxElement.value);
|
||||
}, 500, this.NativeObject);
|
||||
});
|
||||
}
|
||||
|
||||
window.addEventListener("load", function()
|
||||
{
|
||||
var primarySearch = document.getElementsByClassName("uwt-searchbar");
|
||||
primarySearch[0].NativeObject = new McxTypeaheadSearch(primarySearch[0]);
|
||||
});
|
||||
55
mocha-php/src/mocha-tms/scripts/mocha.js.php
Normal file
55
mocha-php/src/mocha-tms/scripts/mocha.js.php
Normal file
@ -0,0 +1,55 @@
|
||||
<?php
|
||||
if (file_exists(dirname(__FILE__) . "/phast/JSMin.inc.php"))
|
||||
{
|
||||
include_once(dirname(__FILE__) . "/phast/JSMin.inc.php");
|
||||
}
|
||||
|
||||
$last_modified_time = filemtime(__FILE__);
|
||||
$etag = md5_file(__FILE__);
|
||||
// always send headers
|
||||
header("Last-Modified: ".gmdate("D, d M Y H:i:s", $last_modified_time)." GMT");
|
||||
header("Etag: $etag");
|
||||
|
||||
// exit if not modified
|
||||
if (@strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE']) == $last_modified_time ||
|
||||
@trim($_SERVER['HTTP_IF_NONE_MATCH']) == $etag)
|
||||
{
|
||||
header("HTTP/1.1 304 Not Modified");
|
||||
exit;
|
||||
}
|
||||
|
||||
header ("Content-Type: text/javascript");
|
||||
|
||||
$bundles = array();
|
||||
$files = glob("*.js");
|
||||
foreach ($files as $file)
|
||||
{
|
||||
$bundles[] = $file;
|
||||
}
|
||||
|
||||
$input = "";
|
||||
foreach ($bundles as $bundle)
|
||||
{
|
||||
$input .= "/* BEGIN '" . $bundle . "' */\r\n";
|
||||
$input .= file_get_contents($bundle) . "\r\n";
|
||||
$input .= "/* END '" . $bundle . "' */\r\n\r\n";
|
||||
}
|
||||
|
||||
if (isset($_GET["minify"]) && $_GET["minify"] == "false")
|
||||
{
|
||||
echo($input);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (class_exists("\\JSMin\\JSMin"))
|
||||
{
|
||||
$output = \JSMin\JSMin::minify($input);
|
||||
}
|
||||
else
|
||||
{
|
||||
$output = "/* could not find class '\\JSMin\\JSMin'; minify is unavailable */\r\n";
|
||||
$output .= $input;
|
||||
}
|
||||
echo($output);
|
||||
}
|
||||
?>
|
||||
1
mocha-php/src/mocha-tms/scripts/phast
Symbolic link
1
mocha-php/src/mocha-tms/scripts/phast
Symbolic link
@ -0,0 +1 @@
|
||||
../../../../phast/lib/phast/client/scripts
|
||||
26
mocha-php/src/mocha-tms/scripts/setup.js
Normal file
26
mocha-php/src/mocha-tms/scripts/setup.js
Normal file
@ -0,0 +1,26 @@
|
||||
function dataDirMsgHelper_OnClick(e)
|
||||
{
|
||||
Window.ShowDialog(
|
||||
"<ol>" +
|
||||
"<li>Clone the <a target=\"_blank\" href=\"https://gitea.azcona-becker.net/mochapowered/mocha-common\">mochapowered/mocha-common</a> repository.</li>" +
|
||||
"<li>Copy mocha-common/data to the folder in which setup.php from mocha-php is located.</li>" +
|
||||
"<li>Refresh this page to see if the folder is recognized.</li>" +
|
||||
"</ol>",
|
||||
"Installing the data folder"
|
||||
);
|
||||
|
||||
e.preventDefault();
|
||||
e.stopPropagation();
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
window.addEventListener("load", function () {
|
||||
|
||||
var dataDirMsgHelper = document.getElementById("dataDirMsgHelper");
|
||||
if (dataDirMsgHelper)
|
||||
{
|
||||
dataDirMsgHelper.addEventListener("click", dataDirMsgHelper_OnClick);
|
||||
}
|
||||
|
||||
});
|
||||
0
mocha-php/src/mocha-tms/scripts/spot_timer.js
Normal file
0
mocha-php/src/mocha-tms/scripts/spot_timer.js
Normal file
2
mocha-php/src/mocha-tms/style/avondale/avondale.min.css
vendored
Normal file
2
mocha-php/src/mocha-tms/style/avondale/avondale.min.css
vendored
Normal file
File diff suppressed because one or more lines are too long
12
mocha-php/src/mocha-tms/style/common/fonts/awesome/css/all.min.css
vendored
Normal file
12
mocha-php/src/mocha-tms/style/common/fonts/awesome/css/all.min.css
vendored
Normal file
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Loading…
x
Reference in New Issue
Block a user