GureWork > espacios de Coworking topalekuak :)
Template:SandBox > TodoList-CoDoer-4

TodoList-CoDoer-4
TodoList-CoDoer-4Edit

    Testing

     To Run it load Test1
    Wiki.Template(":MindTouch/CoDoer/Engines/CoDoer",{
      action: "Test",
      //action: "Run",
      //action: (args.pars.action ?? "Test"),
      widget: page.path,
      engine: "#4",
      id: "testrest",
      page: page,
      language: "en",
      logging: {evt:1,par:0,wdt:0,ctr:1}
    });
    

    Parameters

    var mPars = {     
      sLang: __request.args.codo_language ?? args.language ?? ( page.language != '' ? page.language : ( site.language !='' ? site.language:'en-us') ),
      mPage: (__request.args.codo_page ? string.deserialize(__request.args.codo_page) : null ) ?? args.page ?? page,
      nPageId: __request.args.codo_pageid ?? args.pageid ??  null,
      sWdtId: __request.args.codo_id ?? args.id ??  "",
      lUsers: __request.args.codo_userlist ?? args.userlist ?? args.pars.userlist ?? null,
      sPublish: __request.args.codo_publish ?? args.publish ?? args.pars.publish ?? 'default',
      slAllowed: __request.args.codo_allowed ?? args.allowed ?? args.pars.allowed ?? null,
      sVisible: __request.args.codo_visible ?? args.visible ?? args.pars.visible ?? "all"
    };
    var mWdtPage=page;
    var mPage=mPars.mPage;
    if (mPars.nPageId!=null)
      let mPage=Wiki.GetPage(Num.Int(mPars.nPageId));
    var sLang=mPars.sLang;
    var sPublish=mPars.sPublish;
    var sWdtId=mPars.sWdtId;
    
    Web.Html("<h6>Log : PageId: "..mPars.nPageId.."</h6>");
    //Web.Html("<h6>Pars: "..Web.Pre(Json.Format(mPars)).."</h6>");

    Includes

    // check if required extensions are installed
    if (__env.dekiapi is nil) {
      <span style="color: red; font-weight: bold">"ERROR: Template:TODO requires DekiApi extension to be installed."</span>
      return;
    } else if (__env.jquery is nil) {
      <span style="color: red; font-weight: bold">"ERROR: Template:TODO requires jQuery extension to be installed."</span>
      return;
    }//ei   
    
    dekiapi();
    jquery.ui('smoothness');
    if (sLang!='en')
    {
      var datepickerregional="http://jquery-ui.googlecode.com/svn/trunk/ui/i18n/jquery.ui.datepicker-"..sLang..".js";
      <script type="text/javascript" src=(datepickerregional)></script>;
    }//if
    

    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

     #[Task]: 
     #[Who]: [user-edit]
     #[What]: 
     #[When]: 
    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 : UserTextBox

    View : UserListBox

    View : Table

      #[When] #[What] #[Who]  
    [entry.when] [entry.what] [entry.who] [edit]
    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>
    

    Style : CSS Definition

     

     

     

    Controller

    Interactions

    Source Scene Source View Html Element On Event Resp. Type Resp. Section Operations Target Scene Options
    0 Document document load Content EditForm      
    0 Document document load Content Table      
    0 Document document ready Event document   1  
    1 EditForm #todoadd click Event add      
    1 EditForm #tododelete click Event delete      
    1 Table #todolist a click Event edit      
    1 Table .todochange click Event change      
                     

    Resources

    Languages

    Lang : es
    Web.Pre(JSon.Format(
    {
    }));
    
    Lang : en
    Web.Pre(Json.Format(
    {
        what: "What",
        who: "Who",
        when: "When",
        task: "Task",
        add: "add",
        edit: "edit",
        err_miss_ext: "dekiapi or jquery extensions are missing"
    }));
    
    Lang : eu
    Web.Pre(JSon.Format(
    {
    }));
    Powered by MindTouch Core (Expired)