Constants & Variables
var mLang_es={};
var mLang_en={};
var mLang_eu={};
var mLangs=["ES","EN","EU"];
foreach (var sLang in mLangs)
{
//"Page.Path: "..mWdtPage.Path.." ";
var sLangRsc=Wiki.Page(mWdtPage.Path,"Lang : "..sLang);
var nIniPos=String.IndexOf(sLangRsc,"{");
var nEndPos=String.LastIndexOf(sLangRsc,"}");
let sLangRsc=String.SubStr(sLangRsc,nIniPos,nEndPos-nIniPos+1);
//" Lang: "..sLang.." Rsc: "..sLangRsc;
var mLangRsc=String.Deserialize(sLangRsc);
//" AddMsg: "..mLangRsc.add_msg;
if (sLang=="ES")
let mLang_es=mLangRsc;
else if (sLang=="EN")
let mLang_en=mLangRsc;
else if (sLang=="EU")
let mLang_eu=mLangRsc;
}//fe
var mLang = { 'es': mLang_es, 'es-es': mLang_en, 'en': mLang_en, 'en-us': mLang_en, 'eu': mLang_eu, 'es-eu': mLang_eu }; //#mod @himikel
if (!mLang[sLang])
let sLang='en-us';
var sDateFormatJS="yyyy/MM/dd"; //JavaScript date
var sDateFormatDP="yy/mm/dd"; //JQuery DataPicker
var lUsers=mPars.lUsers;
//Web.Html("<h6>Log : Users: "..Web.Pre(JSon.Format(mlUsers)).."</h6>");
var mlUsers=null;
var slAllowed=[ String.ToLower(u) foreach var u in mPars.slAllowed ];
if (lUsers) {
// convert list of names to list of user objects
let mlUsers = [
(u is Map) ? u : Wiki.GetUser(u)
foreach var u in lUsers
];
if (!slAllowed)
let slAllowed = [ String.ToLower(u.name) foreach var u in mlUsers ];
}//if
else if (Site.UserCount <= 500) {
// get list of users from site
let mlUsers = Site.Users;
}//ei
// input form
var sDisabled=null;
if ((!User.Anonymous)||(!List.Contains(slAllowed, "anonymous"))) //@himikel #add To enable Anonymous testing
let sDisabled = (
// anonymous users can't edit
User.Anonymous ||
// user cannot update page
(Wiki.PagePermissions().Update is nil) ||
// user is not listed in custom user list
(slAllowed && !List.Contains(slAllowed, String.ToLower(User.Name))
) ? "disabled" : nil);
//Show only if User is allowed by Visible
var bVisible=true;
var sVisible=String.ToLower(mPars.sVisible);
if ((sVisible=="allowed")&&(!List.Contains(slAllowed, String.ToLower(User.Name))))
let bVisible=false;
Content : EditForm
if (!bVisible) {
var hsMsg="<span style='color:#b22222;'>";
let hsMsg..="User @"..User.Name.." not allowed to see these tasks!";
let hsMsg..="</span><br/>";
Web.Html(hsMsg);
return;
}//if
var hsEditForm=Xml.Format(Wiki.Page(mWdtPage.Path,"View : EditForm")["//div"]);
//let hsEditForm=String.Replace(String.Replace(hsEditForm,"\"","'"),"\n"," "); //avoid event problems
//Web.Html("<h6>Log : EditForm: "..Web.Pre(JSon.Format(hsEditForm)).."</h6>");
//let hsEditForm=String.Replace(hsEditForm,'#[Task]',mLang[sLang].task);
var hsUserEdit="";
if (mlUsers)
{
//Web.Html("<h6>Log : #Users: "..#mlUsers.."</h6>");
var xUserListBox=Wiki.Page(mWdtPage.Path,"View : UserListBox");
var hsUserListBox=Xml.Format(xUserListBox["//select"]);
var hsULBOpt=Xml.Format(xUserListBox["//option"]);
//Web.Html("<h6>Log : UserListBox: "..Web.Pre(JSon.Format(hsUserListBox)).."</h6>");
var hsULBAll="";
foreach (var mUser in mlUsers where !mUser.Anonymous)
{
var sSelected=((mUser.Id == User.Id) ? 'selected' : '');
var hsULB=hsULBOpt;
let hsULB=String.Replace(hsULB,"[u.name]",mUser.Name);
if (sSelected!="")
let hsULB=String.Replace(hsULB,"[selected]",sSelected);
else
let hsULB=String.Replace(hsULB,"selected=\"[selected]\"","");
let hsULBAll..=hsULB;
}//fe
let hsUserEdit=String.Replace(hsUserListBox,hsULBOpt,hsULBAll);
}//if
else
{
var hsUserTextBox=Xml.Format(Wiki.Page(mWdtPage.Path,"View : UserTextBox")["//input"]);
let hsUserTextBox=String.Replace(hsUserTextBox,"[user]","");
//Web.Html("<h6>Log : UserTextBox: "..Web.Pre(JSon.Format(hsUserTextBox)).."</h6>");
let hsUserEdit=hsUserTextBox;
}//el
let hsEditForm=String.Replace(hsEditForm,"[user-edit]",hsUserEdit);
if (sDisabled!=null)
let hsEditForm=String.Replace(hsEditForm,"[disabled]",sDisabled);
else
let hsEditForm=String.Replace(hsEditForm,"disabled=\"[disabled]\"","");
let hsEditForm=String.Replace(hsEditForm,"[when-date]",Date.Format(Date.Now,sDateFormatJS)); //'MM/dd/yyyy'
Web.Html(hsEditForm);
Content : Table
if (!bVisible) return;
var xTable=Wiki.Page(mWdtPage.Path,"View : Table");
var hsTable=Xml.Format(xTable["//div"]);
var hsDetailRow=Xml.Format(xTable["//tr[2]"]);
//Web.Html("<h6>Log : DetailRow: "..Web.Pre(JSon.Format(hsDetailRow)).."</h6>");
// add index to each todo item
var mlTodo = JSon.Parse(mPage.Properties["todo"..(sWdtId!=""?"_"..sWdtId:"")].Text ?? "") ?? [ ]; //@himikel #add Multiple Widgets
let mlTodo = [ mItem .. { index: __index } foreach var mItem in mlTodo ];
let mlInvaliddates = [ mItem foreach var mItem in mlTodo where !Date.IsValid(mItem.when) ];
let mlTodo = [ mItem foreach var mItem in mlTodo where Date.IsValid(mItem.when) ];
let mlTodo = List.Sort(mlTodo, _, _, "Date.Compare($left.when, $right.when)") .. mLInvaliddates;
//Web.Html("<h6>Log : ToDo: "..Web.Pre(JSon.Format(mlTodo)).."</h6>");
//Web.Html("<h6>Log : #ToDo: "..#mlTodo.."</h6>");
var hsDRAll="";
foreach (var mEntry in mlTodo) {
if (mEntry.who==null)
continue;
//Web.Html("<h6>Log : ToDo: #"..__index.."</h6>");
var sClass = "";
var dNow = Date.Now;
if (mEntry.done)
let sClass..= "completed ";
else if (Date.IsValid(mEntry.when)) {
if (Date.IsSameDay(dNow, mEntry.when))
let sClass ..= "due-today ";
else if (Date.IsAfter(dNow, mEntry.when))
let sClass ..= "due-past ";
}//ei
var sTitle = "Created by " .. mEntry.author;
var hsDR=hsDetailRow;
let hsDR=String.Replace(hsDR,"[class]",sClass);
let hsDR=String.Replace(hsDR,"[title]",sTitle);
let hsDR=String.Replace(hsDR,"[entry.index]",mEntry.index);
var sDone=(mEntry.done ? 'checked' : '');
if (sDone!="")
let hsDR=String.Replace(hsDR,"[entry_done]",sDone);
else
let hsDR=String.Replace(hsDR,"checked=\"[entry_done]\"","");
let hsDR=String.Replace(hsDR,"[entry.when]",mEntry.when);
let hsDR=String.Replace(hsDR,"[entry.what]",mEntry.what);
let hsDR=String.Replace(hsDR,"[entry.who]",mEntry.who);
var sEdit="";
if (sDisabled!=null)
let sEdit=String.nbsp;
else
let sEdit="<a href=\"#\" rel="..mEntry.index..">"..mLang[sLang].edit.."</a>";
let hsDR=String.Replace(hsDR,"[edit]",sEdit);
//Web.Html("<h6>Log : DataRow: "..Web.Pre(JSon.Format(hsDR)).."</h6>");
let hsDRAll..=hsDR;
}//fe
let hsTable=String.Replace(hsTable,hsDetailRow,hsDRAll);
if (sDisabled!=null)
let hsTable=String.Replace(hsTable,"[disabled]",sDisabled);
else
let hsTable=String.Replace(hsTable,"disabled=\"[disabled]\"","");
Web.Html(hsTable);
Views - Events
<script type="text/jem">"
Deki.Env.PageApi=Deki.BaseHref+'/@api/deki/pages/'+Deki.PageId;
//var pageapi=Deki.BaseHref+'/@api/deki/pages/'+Deki.PageId;
var dateformat='"..sDateFormatDP.."';
when(@todoreset) {
if (!_docready) return;
#todoid.val('');
#todowhat.val('');
#todoadd.val('Add');
#tododelete.hide().removeAttr('disabled');
#todoadd.blur();
}//wn
when(@todoedit) {
if (!_docready) return;
MindTouch.Deki.ReadPageProperty(null, 'urn:custom.mindtouch.com#todo', function(result) {
var data = YAHOO.lang.JSON.parse(result.value || '[]');
//Log('data: '+Dump(data));
#todoid.val(@todoedit.index);
//Log('@todoedit.index: '+@todoedit.index);
#todowhat.val(data[@todoedit.index].what);
#todowhen.val(data[@todoedit.index].when);
#todowho.val(data[@todoedit.index].who);
#todoadd.val('Update');
#tododelete.show();
}, function(result) {
alert('An error occurred trying to read the TODO list (status: ' + result.status + ' - ' + result.text + ')');
});
}//wn
when(@todoupdate) {
if (!_docready) return;
//Log('PageApi: '+Deki.Env.PageApi);
//Log('PageApi: '+pageapi);
MindTouch.Deki.ReadPageProperty(null, 'urn:custom.mindtouch.com#todo', function(result) {
var op;
var data = eval('(' + (result.value || '[]') + ')');
//Log('data: '+Dump(data));
if (@todoupdate.index !== '') {
//Log('update.index: '+@todoupdate.index);
if (@todoupdate.entry === null) {
op = 'remove';
data.splice(@todoupdate.index, 1);
}//if
else {
//Log('update.entry: '+Dump(@todoupdate.entry));
op = 'update';
//Log('update.data: '+Dump(data[@todoupdate.index]));
$.extend(data[@todoupdate.index], @todoupdate.entry);
//Log('update.data-ext: '+Dump(data[@todoupdate.index]));
}//el
}//if
else {
op = 'add';
@todoupdate.index = data.length;
data.push(@todoupdate.entry);
}//el
var completed = function() {
var msg = {{ mLang[sLang].err_miss_ext }};
msg.op = op;
msg.index = @todoupdate.index;
msg.entry = @todoupdate.entry;
msg.list = data;
Deki.publish({{ sPublish }}, msg);
MindTouch.Deki.Reload(Deki.$('#todolist'), { pars: { action : 'Run' }}, function() {
//ToDoWireControls(); //Rebinding not required with .live() in new JQuery (Olympic)
});
//MindTouch.Deki.Reload('#todolist', null, function() {
};//fn
if (result.etag) {
//Log('href: '+result.href);
MindTouch.Deki.UpdatePageProperty(result.href, YAHOO.lang.JSON.stringify(data), result.etag, completed, function(result) {
alert('An error occurred trying to update the TODO list (status: ' + result.status + ' - ' + result.text + ')');
});
}//if
else {
MindTouch.Deki.CreatePageProperty(null, 'urn:custom.mindtouch.com#todo', YAHOO.lang.JSON.stringify(data), completed, function(result) {
alert('An error occurred trying to create the TODO list (status: ' + result.status + ' - ' + result.text + ')');
});
}//el
},
function(result) {
alert('An error occurred trying to read the TODO list (status: ' + result.status + ' - ' + result.text + ')');
});//fn
}//wn
"</script>
View : Document
Event : document.ready
<script type="text/jem">"
Log('ready finished!');
"</script>
View : EditForm
Event : add.click
<script type="text/jem">"
@todoupdate({
index: #todoid.val(),
entry: {
what: #todowhat.val(),
who: #todowho.val(),
when: #todowhen.val(),
author: {{user.name}},
done: false
}
});
@todoreset();
return false;
"</script>
Event : delete.click
<script type="text/jem">"
@todoupdate({ index: #todoid.val(), entry: null });
@todoreset();
"</script>
View : Table
Event : edit.click
<script type="text/jem">"
@todoedit({ index: $(event).attr('rel') }); //this >> $(event)
#todowhat.select();
return false;
"</script>
Event : change.click
<script type="text/jem">"
var $this = $(event); //this >> $(event)
//Log('change.val: '+$this.val());
//Log('change.checked: '+$this.is(':checked'));
@todoupdate({ index: $this.val(), entry: { done: ( ($this.is(':checked')) ? true : false) } }); //this.checked >> $this.is(':checked')
"</script>