[ Index ]

PHP Cross Reference of moodle-2.8

title

Body

[close]

/comment/ -> comment.js (source)

   1  // This file is part of Moodle - http://moodle.org/
   2  //
   3  // Moodle is free software: you can redistribute it and/or modify
   4  // it under the terms of the GNU General Public License as published by
   5  // the Free Software Foundation, either version 3 of the License, or
   6  // (at your option) any later version.
   7  //
   8  // Moodle is distributed in the hope that it will be useful,
   9  // but WITHOUT ANY WARRANTY; without even the implied warranty of
  10  // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  11  // GNU General Public License for more details.
  12  //
  13  // You should have received a copy of the GNU General Public License
  14  // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
  15  
  16  /**
  17   * Comment Helper
  18   * @author Dongsheng Cai <[email protected]>
  19   */
  20  M.core_comment = {
  21      /**
  22       * Initialize commenting system
  23       */
  24      init: function(Y, options) {
  25          var CommentHelper = function(args) {
  26              CommentHelper.superclass.constructor.apply(this, arguments);
  27          };
  28          CommentHelper.NAME = "COMMENT";
  29          CommentHelper.ATTRS = {
  30              options: {},
  31              lang: {}
  32          };
  33          Y.extend(CommentHelper, Y.Base, {
  34              api: M.cfg.wwwroot+'/comment/comment_ajax.php',
  35              initializer: function(args) {
  36                  var scope = this;
  37                  this.client_id = args.client_id;
  38                  this.itemid = args.itemid;
  39                  this.commentarea = args.commentarea;
  40                  this.component = args.component;
  41                  this.courseid = args.courseid;
  42                  this.contextid = args.contextid;
  43                  this.autostart = (args.autostart);
  44                  // expand comments?
  45                  if (this.autostart) {
  46                      this.view(args.page);
  47                  }
  48                  // load comments
  49                  var handle = Y.one('#comment-link-'+this.client_id);
  50                  // hide toggle link
  51                  if (handle) {
  52                      if (args.notoggle) {
  53                          handle.setStyle('display', 'none');
  54                      }
  55                      handle.on('click', function(e) {
  56                          e.preventDefault();
  57                          this.view(0);
  58                          return false;
  59                      }, this);
  60                  }
  61                  scope.toggle_textarea(false);
  62              },
  63              post: function() {
  64                  var ta = Y.one('#dlg-content-'+this.client_id);
  65                  var scope = this;
  66                  var value = ta.get('value');
  67                  if (value && value != M.str.moodle.addcomment) {
  68                      var params = {'content': value};
  69                      this.request({
  70                          action: 'add',
  71                          scope: scope,
  72                          params: params,
  73                          callback: function(id, obj, args) {
  74                              var scope = args.scope;
  75                              var cid = scope.client_id;
  76                              var ta = Y.one('#dlg-content-'+cid);
  77                              ta.set('value', '');
  78                              scope.toggle_textarea(false);
  79                              var container = Y.one('#comment-list-'+cid);
  80                              var result = scope.render([obj], true);
  81                              var newcomment = Y.Node.create(result.html);
  82                              container.appendChild(newcomment);
  83                              var ids = result.ids;
  84                              var linktext = Y.one('#comment-link-text-'+cid);
  85                              if (linktext) {
  86                                  linktext.set('innerHTML', M.str.moodle.comments + ' ('+obj.count+')');
  87                              }
  88                              for(var i in ids) {
  89                                  var attributes = {
  90                                      color: { to: '#06e' },
  91                                      backgroundColor: { to: '#FFE390' }
  92                                  };
  93                                  var anim = new Y.YUI2.util.ColorAnim(ids[i], attributes);
  94                                  anim.animate();
  95                              }
  96                              scope.register_pagination();
  97                              scope.register_delete_buttons();
  98                          }
  99                      }, true);
 100                  } else {
 101                      var attributes = {
 102                          backgroundColor: { from: '#FFE390', to:'#FFFFFF' }
 103                      };
 104                      var anim = new Y.YUI2.util.ColorAnim('dlg-content-'+cid, attributes);
 105                      anim.animate();
 106                  }
 107              },
 108              request: function(args, noloading) {
 109                  var params = {};
 110                  var scope = this;
 111                  if (args['scope']) {
 112                      scope = args['scope'];
 113                  }
 114                  //params['page'] = args.page?args.page:'';
 115                  // the form element only accept certain file types
 116                  params['sesskey']   = M.cfg.sesskey;
 117                  params['action']    = args.action?args.action:'';
 118                  params['client_id'] = this.client_id;
 119                  params['itemid']    = this.itemid;
 120                  params['area']      = this.commentarea;
 121                  params['courseid']  = this.courseid;
 122                  params['contextid'] = this.contextid;
 123                  params['component'] = this.component;
 124                  if (args['params']) {
 125                      for (i in args['params']) {
 126                          params[i] = args['params'][i];
 127                      }
 128                  }
 129                  var cfg = {
 130                      method: 'POST',
 131                      on: {
 132                          complete: function(id,o,p) {
 133                              if (!o) {
 134                                  alert('IO FATAL');
 135                                  return false;
 136                              }
 137                              var data = Y.JSON.parse(o.responseText);
 138                              if (data.error) {
 139                                  if (data.error == 'require_login') {
 140                                      args.callback(id,data,p);
 141                                      return true;
 142                                  }
 143                                  alert(data.error);
 144                                  return false;
 145                              } else {
 146                                  args.callback(id,data,p);
 147                                  return true;
 148                              }
 149                          }
 150                      },
 151                      arguments: {
 152                          scope: scope
 153                      },
 154                      headers: {
 155                          'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'
 156                      },
 157                      data: build_querystring(params)
 158                  };
 159                  if (args.form) {
 160                      cfg.form = args.form;
 161                  }
 162                  Y.io(this.api, cfg);
 163                  if (!noloading) {
 164                      this.wait();
 165                  }
 166              },
 167              render: function(list, newcmt) {
 168                  var ret = {};
 169                  ret.ids = [];
 170                  var template = Y.one('#cmt-tmpl');
 171                  var html = '';
 172                  for(var i in list) {
 173                      var htmlid = 'comment-'+list[i].id+'-'+this.client_id;
 174                      var val = template.get('innerHTML');
 175                      if (list[i].profileurl) {
 176                          val = val.replace('___name___', '<a href="'+list[i].profileurl+'">'+list[i].fullname+'</a>');
 177                      } else {
 178                          val = val.replace('___name___', list[i].fullname);
 179                      }
 180                      if (list[i]['delete']||newcmt) {
 181                          list[i].content = '<div class="comment-delete"><a href="#" id ="comment-delete-'+this.client_id+'-'+list[i].id+'" title="'+M.str.moodle.deletecomment+'"><img alt="" src="'+M.util.image_url('t/delete', 'core')+'" /></a></div>' + list[i].content;
 182                      }
 183                      val = val.replace('___time___', list[i].time);
 184                      val = val.replace('___picture___', list[i].avatar);
 185                      val = val.replace('___content___', list[i].content);
 186                      val = '<li id="'+htmlid+'">'+val+'</li>';
 187                      ret.ids.push(htmlid);
 188                      html = (val+html);
 189                  }
 190                  ret.html = html;
 191                  return ret;
 192              },
 193              load: function(page) {
 194                  var scope = this;
 195                  var container = Y.one('#comment-ctrl-'+this.client_id);
 196                  var params = {
 197                      'action': 'get',
 198                      'page': page
 199                  };
 200                  this.request({
 201                      scope: scope,
 202                      params: params,
 203                      callback: function(id, ret, args) {
 204                          var linktext = Y.one('#comment-link-text-'+scope.client_id);
 205                          if (ret.count && linktext) {
 206                              linktext.set('innerHTML', M.str.moodle.comments + ' ('+ret.count+')');
 207                          }
 208                          var container = Y.one('#comment-list-'+scope.client_id);
 209                          var pagination = Y.one('#comment-pagination-'+scope.client_id);
 210                          if (ret.pagination) {
 211                              pagination.set('innerHTML', ret.pagination);
 212                          } else {
 213                              //empty paging bar
 214                              pagination.set('innerHTML', '');
 215                          }
 216                          if (ret.error == 'require_login') {
 217                              var result = {};
 218                              result.html = M.str.moodle.commentsrequirelogin;
 219                          } else {
 220                              var result = scope.render(ret.list);
 221                          }
 222                          container.set('innerHTML', result.html);
 223                          var img = Y.one('#comment-img-'+scope.client_id);
 224                          if (img) {
 225                              img.set('src', M.util.image_url('t/expanded', 'core'));
 226                          }
 227                          args.scope.register_pagination();
 228                          args.scope.register_delete_buttons();
 229                      }
 230                  });
 231              },
 232  
 233              dodelete: function(id) { // note: delete is a reserved word in javascript, chrome and safary do not like it at all here!
 234                  var scope = this;
 235                  var params = {'commentid': id};
 236                  function remove_dom(type, anim, cmt) {
 237                      cmt.remove();
 238                  }
 239                  this.request({
 240                      action: 'delete',
 241                      scope: scope,
 242                      params: params,
 243                      callback: function(id, resp, args) {
 244                          var htmlid= 'comment-'+resp.commentid+'-'+resp.client_id;
 245                          var attributes = {
 246                              width:{to:0},
 247                              height:{to:0}
 248                          };
 249                          var cmt = Y.one('#'+htmlid);
 250                          cmt.setStyle('overflow', 'hidden');
 251                          var anim = new Y.YUI2.util.Anim(htmlid, attributes, 1, Y.YUI2.util.Easing.easeOut);
 252                          anim.onComplete.subscribe(remove_dom, cmt, this);
 253                          anim.animate();
 254                      }
 255                  }, true);
 256              },
 257              register_actions: function() {
 258                  // add new comment
 259                  var action_btn = Y.one('#comment-action-post-'+this.client_id);
 260                  if (action_btn) {
 261                      action_btn.on('click', function(e) {
 262                          e.preventDefault();
 263                          this.post();
 264                          return false;
 265                      }, this);
 266                  }
 267                  // cancel comment box
 268                  var cancel = Y.one('#comment-action-cancel-'+this.client_id);
 269                  if (cancel) {
 270                      cancel.on('click', function(e) {
 271                          e.preventDefault();
 272                          this.view(0);
 273                          return false;
 274                      }, this);
 275                  }
 276              },
 277              register_delete_buttons: function() {
 278                  var scope = this;
 279                  // page buttons
 280                  Y.all('div.comment-delete a').each(
 281                      function(node, id) {
 282                          var theid = node.get('id');
 283                          var parseid = new RegExp("comment-delete-"+scope.client_id+"-(\\d+)", "i");
 284                          var commentid = theid.match(parseid);
 285                          if (!commentid) {
 286                              return;
 287                          }
 288                          if (commentid[1]) {
 289                              Y.Event.purgeElement('#'+theid, false, 'click');
 290                          }
 291                          node.on('click', function(e) {
 292                              e.preventDefault();
 293                              if (commentid[1]) {
 294                                  scope.dodelete(commentid[1]);
 295                              }
 296                          });
 297                          // Also handle space/enter key.
 298                          node.on('key', function(e) {
 299                              e.preventDefault();
 300                              if (commentid[1]) {
 301                                  scope.dodelete(commentid[1]);
 302                              }
 303                          }, '13,32');
 304                          // 13 and 32 are the keycodes for space and enter.
 305                      }
 306                  );
 307              },
 308              register_pagination: function() {
 309                  var scope = this;
 310                  // page buttons
 311                  Y.all('#comment-pagination-'+this.client_id+' a').each(
 312                      function(node, id) {
 313                          node.on('click', function(e, node) {
 314                              e.preventDefault();
 315                              var id = node.get('id');
 316                              var re = new RegExp("comment-page-"+this.client_id+"-(\\d+)", "i");
 317                              var result = id.match(re);
 318                              this.load(result[1]);
 319                          }, scope, node);
 320                      }
 321                  );
 322              },
 323              view: function(page) {
 324                  var container = Y.one('#comment-ctrl-'+this.client_id);
 325                  var ta = Y.one('#dlg-content-'+this.client_id);
 326                  var img = Y.one('#comment-img-'+this.client_id);
 327                  var d = container.getStyle('display');
 328                  if (d=='none'||d=='') {
 329                      // show
 330                      if (!this.autostart) {
 331                          this.load(page);
 332                      } else {
 333                          this.register_delete_buttons();
 334                          this.register_pagination();
 335                      }
 336                      container.setStyle('display', 'block');
 337                      if (img) {
 338                          img.set('src', M.util.image_url('t/expanded', 'core'));
 339                      }
 340                  } else {
 341                      // hide
 342                      container.setStyle('display', 'none');
 343                      var collapsedimage = 't/collapsed'; // ltr mode
 344                      if ( Y.one(document.body).hasClass('dir-rtl') ) {
 345                          collapsedimage = 't/collapsed_rtl';
 346                      } else {
 347                          collapsedimage = 't/collapsed';
 348                      }
 349                      img.set('src', M.util.image_url(collapsedimage, 'core'));
 350                      if (ta) {
 351                          ta.set('value','');
 352                      }
 353                  }
 354                  if (ta) {
 355                      //toggle_textarea.apply(ta, [false]);
 356                      //// reset textarea size
 357                      ta.on('focus', function() {
 358                          this.toggle_textarea(true);
 359                      }, this);
 360                      //ta.onkeypress = function() {
 361                          //if (this.scrollHeight > this.clientHeight && !window.opera)
 362                              //this.rows += 1;
 363                      //}
 364                      ta.on('blur', function() {
 365                          this.toggle_textarea(false);
 366                      }, this);
 367                  }
 368                  this.register_actions();
 369                  return false;
 370              },
 371              toggle_textarea: function(focus) {
 372                  var t = Y.one('#dlg-content-'+this.client_id);
 373                  if (!t) {
 374                      return false;
 375                  }
 376                  if (focus) {
 377                      if (t.get('value') == M.str.moodle.addcomment) {
 378                          t.set('value', '');
 379                          t.setStyle('color', 'black');
 380                      }
 381                  }else{
 382                      if (t.get('value') == '') {
 383                          t.set('value', M.str.moodle.addcomment);
 384                          t.setStyle('color','grey');
 385                          t.set('rows', 2);
 386                      }
 387                  }
 388              },
 389              wait: function() {
 390                  var container = Y.one('#comment-list-'+this.client_id);
 391                  container.set('innerHTML', '<div class="mdl-align"><img src="'+M.util.image_url('i/loading_small', 'core')+'" /></div>');
 392              }
 393          });
 394  
 395          new CommentHelper(options);
 396      },
 397      init_admin: function(Y) {
 398          var select_all = Y.one('#comment_select_all');
 399          select_all.on('click', function(e) {
 400              var comments = document.getElementsByName('comments');
 401              var checked = false;
 402              for (var i in comments) {
 403                  if (comments[i].checked) {
 404                      checked=true;
 405                  }
 406              }
 407              for (i in comments) {
 408                  comments[i].checked = !checked;
 409              }
 410              this.set('checked', !checked);
 411          });
 412  
 413          var comments_delete = Y.one('#comments_delete');
 414          if (comments_delete) {
 415              comments_delete.on('click', function(e) {
 416                  e.preventDefault();
 417                  var list = '';
 418                  var comments = document.getElementsByName('comments');
 419                  for (var i in comments) {
 420                      if (typeof comments[i] == 'object' && comments[i].checked) {
 421                          list += (comments[i].value + '-');
 422                      }
 423                  }
 424                  if (!list) {
 425                      return;
 426                  }
 427                  var args = {};
 428                  args.message = M.str.admin.confirmdeletecomments;
 429                  args.callback = function() {
 430                      var url = M.cfg.wwwroot + '/comment/index.php';
 431  
 432                      var data = {
 433                          'commentids': list,
 434                          'sesskey': M.cfg.sesskey,
 435                          'action': 'delete'
 436                      };
 437                      var cfg = {
 438                          method: 'POST',
 439                          on: {
 440                              complete: function(id,o,p) {
 441                                  if (!o) {
 442                                      alert('IO FATAL');
 443                                      return;
 444                                  }
 445                                  if (o.responseText == 'yes') {
 446                                      location.reload();
 447                                  }
 448                              }
 449                          },
 450                          arguments: {
 451                              scope: this
 452                          },
 453                          headers: {
 454                              'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'
 455                          },
 456                          data: build_querystring(data)
 457                      };
 458                      Y.io(url, cfg);
 459                  };
 460                  M.util.show_confirm_dialog(e, args);
 461              });
 462          }
 463      }
 464  };


Generated: Fri Nov 28 20:29:05 2014 Cross-referenced by PHPXref 0.7.1