Created
October 10, 2011 22:09
-
-
Save edorcutt/1276723 to your computer and use it in GitHub Desktop.
Kynetx CRUD with Persistant Variables
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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">© 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