Skip to content

Instantly share code, notes, and snippets.

@edorcutt
Created October 10, 2011 22:09
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save edorcutt/1276723 to your computer and use it in GitHub Desktop.
Save edorcutt/1276723 to your computer and use it in GitHub Desktop.
Kynetx CRUD with Persistant Variables
ruleset a169x426 {
meta {
name "KRUD Redux"
description <<
Kynetx CRUD with Persistant Variables
Persistant Variables:
ent:KRUDaddress{}
>>
author "Ed Orcutt, LOBOSLLC"
logging on
// --------------------------------------------
// Test development version of Ruleset
// http://ktest.heroku.com/a169x426
key errorstack "REDACTED"
use module a16x104 alias es
with es_key = keys:errorstack()
use css resource "http://assets.lobosllc.com/css/benovolent.css"
}
dispatch {
// domain "exampley.com"
}
global {
// --------------------------------------------
// hide all panels, then show the one with 'panelID'
siteNavShowPanel = function(panelID) {
"$K('.panelContainer').hide('slow'); $K('#{panelID}').show('slow');"
};
// --------------------------------------------
pageContent = function() {
p = <<
<div class="container" id="BodyContainer">
<div class="span-24 last" id="HeaderContainer">
<div id="Header">
KRUD - KRL CRUD Demo
<div id="HeaderUserMenu">
Logged in as: edorcutt<br>
</div>
</div>
</div>
<div class="span-24 last" id="MenuContainer">
<div id="MainMenu">
<ul id="MainMenuList">
<li><a href="javascript:void(0);" id="siteNavAddressList">AddressBook</a></li>
<li><a href="javascript:void(0);" id="siteNavAbout">About</a></li>
</ul>
</div>
</div>
<div class="span-24 last" id="MainContentContainer">
<div id="MainContent"></div>
</div>
<div class="span-24 last" id="PageFooterContainer">
<div id="Footer">
<div class="span-12">KRUD uses KRL Persistant Variables</div>
<div class="span-12 last" id="CopyrightStatement">&copy 2011 <a href="http://www.lobosllc.com/">LOBOS, LLC.</a> All Rights Reserved.</div>
</div>
</div>
</div>
>>;
p
};
// --------------------------------------------
panelList = function(panelID, navAdd, panelTitle) {
p = <<
<div class="span-24 last panelContainer" id="#{panelID}" style="display:none;">
<div class="Section">
<div class="SectionHeading">
#{panelTitle}
<div class="SectionHeadingMenu">
<a href="javascript:void(0);" id="#{navAdd}">Add New #{panelTitle}</a>
</div>
</div>
<div class="SectionContent">
<table class="DataTable">
<tr>
<th>Name</th>
<th>Email</th>
<th>Phone</th>
<th>Action</th>
</th>
</table>
</div>
</div>
</div>
>>;
p
};
// --------------------------------------------
panelForm = function(panelID, formID, panelTitle) {
p = <<
<div class="span-24 last panelContainer" id="#{panelID}" style="display:none;">
<div class="Section">
<div class="SectionHeading">#{panelTitle}</div>
<div class="SectionContent">
<div class="ErrorMessage" style="display:none;">
A Name is required for an addressbook entry.
</div>
<div class="SuccessMessage" style="display:none;">
Your new address has been Saved.
</div>
<form onsubmit="return false" method="post" id="#{formID}">
<dl>
<dt><label>Name</label></dt>
<dd><input type="text" name="formName" value=""></dd>
<dt><label>Email</label></dt>
<dd><input type="text" name="formEmail" value=""></dd>
<dt><label>Phone</label></dt>
<dd><input type="text" name="formPhone" value=""></dd>
<dt></dt>
<dd><button>Save</button></dd>
</dl>
</form>
</div>
</div>
</div>
>>;
p
};
// --------------------------------------------
panelAbout = function() {
p = <<
<div class="span-24 last panelContainer" id="panelAbout" style="display:none;">
<div class="Section">
<div class="SectionHeading">About KRUD</div>
<div class="SectionContent">
<p>KRUD is a data store internal to KRL using Persistant Variables.</p>
</div>
</div>
</div>
>>;
p
};
thisRID = meta:rid();
}
// ------------------------------------------------------------------------
rule KRUD_init {
select when pageview ".*"
pre {
pageAdmin = pageContent();
panelAboutKRUD = panelAbout();
panelAddressList = panelList("panelAddressList", "siteNavAddressAdd", "Address");
panelAddressAdd = panelForm("panelAddressAdd", "formAddressAdd", "Add Address");
panelAddressEdit = panelForm("panelAddressEdit", "formAddressEdit", "Edit Address");
}
{
replace_html("#container", pageAdmin);
append("#MainContent", panelAboutKRUD);
append("#MainContent", panelAddressList);
append("#MainContent", panelAddressAdd);
append("#MainContent", panelAddressEdit);
watch("#siteNavAddressList", "click");
watch("#siteNavAddressAdd", "click");
watch("#siteNavAbout", "click");
watch("#formAddressAdd", "submit");
watch("#formAddressEdit", "submit");
emit <<
// --------------------------------------------
// Clicked on a DataTable row, grab the 1st DT
// the 1st DT should contain the "name" value
$K('#panelAddressList .DataTable tr').live("click", function() {
var $thisRow = $K(this);
var keyName = $thisRow.find('td:first').text();
var thisApp = KOBJ.get_application(thisRID);
thisApp.raise_event("siteNavAddressEdit", { "keyName": keyName }, thisRID);
});
// --------------------------------------------
// Clicked on the Remove action in a row
// the 1st DT should contain the "name" value
$K('#panelAddressList .KRUDaction').live("click", function() {
var $thisRow = $K(this).parent().parent();
var keyName = $thisRow.find('td:first').text();
var thisApp = KOBJ.get_application(thisRID);
$thisRow.hide();
thisApp.raise_event("siteNavAddressDelete", { "keyName": keyName }, thisRID);
return false; // stops upstream propagation
});
>>;
}
}
// ------------------------------------------------------------------------
rule KRUD_siteNavAbout {
select when click "#siteNavAbout"
pre { nuPanelCode = siteNavShowPanel("#panelAbout"); }
{ emit << eval(nuPanelCode); >>; }
}
// ========================================================================
// Section: Display List of Addresses
// ------------------------------------------------------------------------
rule KRUD_siteNavAddressList {
select when click "#siteNavAddressList"
pre { nuPanelCode = siteNavShowPanel("#panelAddressList"); }
{ emit << eval(nuPanelCode); >>; }
}
// ------------------------------------------------------------------------
rule KRUD_siteNavAddressList_clear {
select when click "#siteNavAddressList"
{
emit << $K('#panelAddressList .DataTable').find('tr:not(:first)').remove(); >>;
}
}
// ------------------------------------------------------------------------
rule KRUD_siteNavAddressList_populate {
select when click "#siteNavAddressList"
foreach ent:KRUDaddresss.keys() setting (addressKey)
pre {
email = ent:KRUDaddresss{[addressKey, "Email"]};
phone = ent:KRUDaddresss{[addressKey, "Phone"]};
oneRow = <<
<tr>
<td>#{addressKey}</td>
<td>#{email}</td>
<td>#{phone}</td>
<td><a href="javascript:void(0);" class="KRUDaction">Remove</a></td>
<tr>
>>;
addressRow = (ent:KRUDaddresss.keys().length()) => oneRow | "";
}
{
append('#panelAddressList .DataTable tbody', addressRow);
}
}
// ========================================================================
// Section: Add New Address
// ------------------------------------------------------------------------
rule KRUD_siteNavAddressAdd {
select when click "#siteNavAddressAdd"
pre { nuPanelCode = siteNavShowPanel("#panelAddressAdd"); }
{
emit << eval(nuPanelCode); >>;
emit <<
$K('.ErrorMessage').hide();
$K('.SuccessMessage').hide();
>>;
// Clear form values
emit << $K('#panelAddressAdd input[name^="form"]').val(''); >>;
}
}
// ------------------------------------------------------------------------
rule KRUD_formAddressAdd {
select when submit "#formAddressAdd"
pre {
formName = event:param("formName");
formEmail = event:param("formEmail");
formPhone = event:param("formPhone");
formHash = {
"Name" : formName,
"Email" : formEmail,
"Phone" : formPhone
};
KRUDaddresss = ent:KRUDaddresss || {};
}
if (event:param("formName")) then {
emit << $K('#panelAddressAdd .SuccessMessage').fadeIn('fast').delay(3000).fadeOut('slow'); >>;
}
fired {
set ent:KRUDaddresss{[formName]} formHash;
} else {
raise explicit event formError;
}
}
// ------------------------------------------------------------------------
rule MyKyxDB_formError {
select when explicit formError
{
emit << $K('.ErrorMessage').fadeIn('fast').delay(3000).fadeOut('slow'); >>;
}
}
// ========================================================================
// Section: Edit (Update) Address
// ------------------------------------------------------------------------
// Display Address Edit panel with current values of address
rule KRUD_siteNavAddressEdit {
select when web siteNavAddressEdit
pre {
keyName = event:param("keyName");
nuPanelCode = siteNavShowPanel("#panelAddressEdit");
email = ent:KRUDaddresss{[keyName, "Email"]};
phone = ent:KRUDaddresss{[keyName, "Phone"]};
}
{
emit <<
$K('#panelAddressEdit input[name="formName"]').val(keyName);
$K('#panelAddressEdit input[name="formEmail"]').val(email);
$K('#panelAddressEdit input[name="formPhone"]').val(phone);
>>;
emit <<
$K('.ErrorMessage').hide();
$K('.SuccessMessage').hide();
>>;
// hide all panels, then show Address Edit panel
emit << eval(nuPanelCode); >>;
}
}
// ------------------------------------------------------------------------
rule KRUD_formAddressEdit {
select when submit "#formAddressEdit"
pre {
formName = event:param("formName");
formEmail = event:param("formEmail");
formPhone = event:param("formPhone");
formHash = {
"Name" : formName,
"Email" : formEmail,
"Phone" : formPhone
};
KRUDaddresss = ent:KRUDaddresss || {};
}
if (event:param("formName")) then {
emit << $K('#panelAddressEdit .SuccessMessage').fadeIn('fast').delay(3000).fadeOut('slow'); >>;
}
fired {
set ent:KRUDaddresss{[formName]} formHash;
} else {
raise explicit event formError;
}
}
// ========================================================================
// Section: Delete Address
// ------------------------------------------------------------------------
// Delete Address
rule KRUD_siteNavAddressDelete {
select when web siteNavAddressDelete
pre {
keyName = event:param("keyName");
}
{ noop(); }
fired {
clear ent:KRUDaddresss{keyName};
}
}
// ------------------------------------------------------------------------
// StatCounter provides Analytics for your Web App
// http://statcounter.com/
rule StatCounter {
select when web statcounter
pre {
statURL = event:param("statURL");
// StatCounter tracking code
statCode = << <img src="#{statURL}" border="0"> >>;
}
append("body", statCode);
}
// ------------------------------------------------------------------------
// Error Handling in KRL
// http://www.windley.com/archives/2011/05/error_handling_in_krl.shtml
rule Catch_Errors_Throw_At_ErrorStack {
select when system error or user error
pre {
genus = event:param("genus");
species = event:param("species");
}
es:send_error("(#{genus}:#{species}) " + event:param("msg"))
with rule_name = event:param("rule_name")
and rid = event:param("rid");
}
// ------------------------------------------------------------------------
// Beyond here there be dragons :)
// ------------------------------------------------------------------------
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment