[ Index ]

PHP Cross Reference of Unnamed Project

title

Body

[close]

/enrol/yui/otherusersmanager/ -> otherusersmanager.js (source)

   1  YUI.add('moodle-enrol-otherusersmanager', function(Y) {
   2  
   3      var OUMANAGERNAME = 'Other users manager',
   4          OTHERUSERNAME = 'Other user (not enroled in course)',
   5          COURSEID = 'courseId',
   6          USERID = 'userId',
   7          BASE = 'base',
   8          SEARCH = 'search',
   9          REQUIREREFRESH = 'requiresRefresh',
  10          PAGE = 'page',
  11          USERCOUNT = 'userCount',
  12          PICTURE = 'picture',
  13          FULLNAME = 'fullname',
  14          EXTRAFIELDS = 'extrafields',
  15          ASSIGNABLEROLES = 'assignableRoles',
  16          USERS = 'users',
  17          URL = 'url',
  18          AJAXURL = 'ajaxUrl';
  19  
  20      CSS = {
  21          PANEL : 'other-user-manager-panel',
  22          WRAP : 'oump-wrap',
  23          HEADER : 'oump-header',
  24          CONTENT : 'oump-content',
  25          AJAXCONTENT : 'oump-ajax-content',
  26          SEARCHRESULTS : 'oump-search-results',
  27          TOTALUSERS : 'oump-total-users',
  28          USERS : 'oump-users',
  29          USER : 'oump-user',
  30          USERDETAILS : 'oump-user-details',
  31          MORERESULTS : 'oump-more-results',
  32          LIGHTBOX : 'oump-loading-lightbox',
  33          LOADINGICON : 'loading-icon',
  34          FOOTER : 'oump-footer',
  35          COUNT : 'count',
  36          PICTURE : 'oump-user-picture',
  37          DETAILS : 'oump-user-specifics',
  38          FULLNAME : 'oump-user-fullname',
  39          EXTRAFIELDS : 'oump-user-extrafields',
  40          OPTIONS : 'oump-role-options',
  41          ROLEOPTION : 'oump-assignable-role',
  42          ODD  : 'odd',
  43          EVEN : 'even',
  44          HIDDEN : 'hidden',
  45          SEARCH : 'oump-search',
  46          CLOSE : 'oump-panel-close',
  47          ALLROLESASSIGNED : 'oump-has-all-roles'
  48      };
  49  
  50      var OUMANAGER = function(config) {
  51          OUMANAGER.superclass.constructor.apply(this, arguments);
  52      };
  53      Y.extend(OUMANAGER, Y.Base, {
  54          _loadingNode : null,
  55          _escCloseEvent : null,
  56          initializer : function(config) {
  57              this.set(BASE, Y.Node.create('<div class="'+CSS.PANEL+' '+CSS.HIDDEN+'"></div>')
  58                  .append(Y.Node.create('<div class="'+CSS.WRAP+'"></div>')
  59                      .append(Y.Node.create('<div class="'+CSS.HEADER+' header"></div>')
  60                          .append(Y.Node.create('<div class="'+CSS.CLOSE+'"></div>'))
  61                          .append(Y.Node.create('<h2>'+M.util.get_string('usersearch', 'enrol')+'</h2>')))
  62                      .append(Y.Node.create('<div class="'+CSS.CONTENT+'"></div>')
  63                          .append(Y.Node.create('<div class="'+CSS.AJAXCONTENT+'"></div>'))
  64                          .append(Y.Node.create('<div class="'+CSS.LIGHTBOX+' '+CSS.HIDDEN+'"></div>')
  65                              .append(Y.Node.create('<img alt="loading" class="'+CSS.LOADINGICON+'" />')
  66                                  .setAttribute('src', M.util.image_url('i/loading', 'moodle')))
  67                              .setStyle('opacity', 0.5)))
  68                      .append(Y.Node.create('<div class="'+CSS.FOOTER+'"></div>')
  69                          .append(Y.Node.create('<div class="'+CSS.SEARCH+'"><label>'+M.util.get_string('usersearch', 'enrol')+'</label></div>')
  70                              .append(Y.Node.create('<input type="text" id="oump-usersearch" value="" />'))
  71                          )
  72                      )
  73                  )
  74              );
  75              this.set(SEARCH, this.get(BASE).one('#oump-usersearch'));
  76              Y.all('.assignuserrole input').each(function(node){
  77                  if (node.getAttribute('type', 'submit')) {
  78                      node.on('click', this.show, this);
  79                  }
  80              }, this);
  81              this.get(BASE).one('.'+CSS.HEADER+' .'+CSS.CLOSE).on('click', this.hide, this);
  82              this._loadingNode = this.get(BASE).one('.'+CSS.CONTENT+' .'+CSS.LIGHTBOX);
  83              Y.on('key', this.getUsers, this.get(SEARCH), 'down:13', this);
  84              Y.one(document.body).append(this.get(BASE));
  85  
  86              var base = this.get(BASE);
  87              base.plug(Y.Plugin.Drag);
  88              base.dd.addHandle('.'+CSS.HEADER+' h2');
  89              base.one('.'+CSS.HEADER+' h2').setStyle('cursor', 'move');
  90  
  91              this.getAssignableRoles();
  92          },
  93          show : function(e) {
  94              e.preventDefault();
  95              e.halt();
  96  
  97              var base = this.get(BASE);
  98              base.removeClass(CSS.HIDDEN);
  99              var x = (base.get('winWidth') - 400)/2;
 100              var y = (parseInt(base.get('winHeight'))-base.get('offsetHeight'))/2 + parseInt(base.get('docScrollY'));
 101              if (y < parseInt(base.get('winHeight'))*0.1) {
 102                  y = parseInt(base.get('winHeight'))*0.1;
 103              }
 104              base.setXY([x,y]);
 105  
 106              if (this.get(USERS)===null) {
 107                  this.getUsers(e, false);
 108              }
 109  
 110              this._escCloseEvent = Y.on('key', this.hide, document.body, 'down:27', this);
 111          },
 112          hide : function() {
 113              if (this._escCloseEvent) {
 114                  this._escCloseEvent.detach();
 115                  this._escCloseEvent = null;
 116              }
 117              this.get(BASE).addClass(CSS.HIDDEN);
 118              if (this.get(REQUIREREFRESH)) {
 119                  window.location = this.get(URL);
 120              }
 121          },
 122          getUsers : function(e, append) {
 123              if (e) {
 124                  e.halt();
 125                  e.preventDefault();
 126              }
 127              var on, params;
 128              if (append) {
 129                  this.set(PAGE, this.get(PAGE)+1);
 130              } else {
 131                  this.set(USERCOUNT, 0);
 132              }
 133  
 134              params = [];
 135              params['id'] = this.get(COURSEID);
 136              params['sesskey'] = M.cfg.sesskey;
 137              params['action'] = 'searchotherusers';
 138              params['search'] = this.get(SEARCH).get('value');
 139              params['page'] = this.get(PAGE);
 140  
 141              Y.io(M.cfg.wwwroot+this.get(AJAXURL), {
 142                  method:'POST',
 143                  data:build_querystring(params),
 144                  on : {
 145                      start : this.displayLoading,
 146                      complete: this.processSearchResults,
 147                      end : this.removeLoading
 148                  },
 149                  context:this,
 150                  arguments:{
 151                      append:append,
 152                      params:params
 153                  }
 154              });
 155          },
 156          displayLoading : function() {
 157              this._loadingNode.removeClass(CSS.HIDDEN);
 158          },
 159          removeLoading : function() {
 160              this._loadingNode.addClass(CSS.HIDDEN);
 161          },
 162          processSearchResults : function(tid, outcome, args) {
 163              try {
 164                  var result = Y.JSON.parse(outcome.responseText);
 165                  if (result.error) {
 166                      return new M.core.ajaxException(result);
 167                  }
 168              } catch (e) {
 169                  new M.core.exception(e);
 170              }
 171              if (!result.success) {
 172                  this.setContent = M.util.get_string('errajaxsearch', 'enrol');
 173              }
 174              var usersnode, users = [], i=0, count=0, user;
 175              if (!args.append) {
 176                  usersnode = Y.Node.create('<div class="'+CSS.USERS+'"></div>');
 177              } else {
 178                  usersnode = this.get(BASE).one('.'+CSS.SEARCHRESULTS+' .'+CSS.USERS);
 179              }
 180              count = this.get(USERCOUNT);
 181              for (i in result.response.users) {
 182                  count++;
 183                  user = new OTHERUSER(result.response.users[i], count, this);
 184                  usersnode.append(user.toHTML());
 185                  users[user.get(USERID)] = user;
 186              }
 187              this.set(USERCOUNT, count);
 188              if (!args.append) {
 189                  var usersstr = (result.response.totalusers == '1')?M.util.get_string('ajaxoneuserfound', 'enrol'):M.util.get_string('ajaxxusersfound','enrol', result.response.totalusers);
 190                  var content = Y.Node.create('<div class="'+CSS.SEARCHRESULTS+'"></div>')
 191                      .append(Y.Node.create('<div class="'+CSS.TOTALUSERS+'">'+usersstr+'</div>'))
 192                      .append(usersnode);
 193                  if (result.response.totalusers > (this.get(PAGE)+1)*25) {
 194                      var fetchmore = Y.Node.create('<div class="'+CSS.MORERESULTS+'"><a href="#">'+M.util.get_string('ajaxnext25', 'enrol')+'</a></div>');
 195                      fetchmore.on('click', this.getUsers, this, true);
 196                      content.append(fetchmore)
 197                  }
 198                  this.setContent(content);
 199              } else {
 200                  if (result.response.totalusers <= (this.get(PAGE)+1)*25) {
 201                      this.get(BASE).one('.'+CSS.MORERESULTS).remove();
 202                  }
 203              }
 204          },
 205          setContent : function(content) {
 206              this.get(BASE).one('.'+CSS.CONTENT+' .'+CSS.AJAXCONTENT).setContent(content);
 207          },
 208          getAssignableRoles : function() {
 209              Y.io(M.cfg.wwwroot+'/enrol/ajax.php', {
 210                  method:'POST',
 211                  data:'id='+this.get(COURSEID)+'&action=getassignable&otherusers=true&sesskey='+M.cfg.sesskey,
 212                  on: {
 213                      complete: function(tid, outcome, args) {
 214                          try {
 215                              var roles = Y.JSON.parse(outcome.responseText);
 216                              if (roles.error) {
 217                                  new M.core.ajaxException(roles);
 218                              } else {
 219                                  this.set(ASSIGNABLEROLES, roles.response);
 220                              }
 221                          } catch (e) {
 222                              new M.core.exception(e);
 223                          }
 224                          this.getAssignableRoles = function() {
 225                              this.fire('assignablerolesloaded');
 226                          };
 227                          this.getAssignableRoles();
 228                      }
 229                  },
 230                  context:this
 231              });
 232          }
 233      }, {
 234          NAME : OUMANAGERNAME,
 235          ATTRS : {
 236              courseId : {
 237  
 238              },
 239              ajaxUrl : {
 240                  validator : Y.Lang.isString
 241              },
 242              url : {
 243                  validator : Y.Lang.isString
 244              },
 245              roles : {
 246                  validator :Y.Lang.isArray,
 247                  value : []
 248              },
 249              base : {
 250                  setter : function(node) {
 251                      var n = Y.one(node);
 252                      if (!n) {
 253                          Y.fail(OUMANAGERNAME+': invalid base node set');
 254                      }
 255                      return n;
 256                  }
 257              },
 258              search : {
 259                  setter : function(node) {
 260                      var n = Y.one(node);
 261                      if (!n) {
 262                          Y.fail(OUMANAGERNAME+': invalid base node set');
 263                      }
 264                      return n;
 265                  }
 266              },
 267              requiresRefresh : {
 268                  validator : Y.Lang.isBoolean,
 269                  value : false
 270              },
 271              users : {
 272                  validator : Y.Lang.isArray,
 273                  value : null
 274              },
 275              page : {
 276                  validator : Y.Lang.isNumber,
 277                  value : 0
 278              },
 279              userCount : {
 280                  validator : Y.Lang.isNumber,
 281                  value : 0
 282              },
 283              assignableRoles : {
 284                  value : []
 285              }
 286          }
 287      });
 288  
 289      var OTHERUSER = function(config, count, manager) {
 290          this._count = count;
 291          this._manager = manager;
 292          OTHERUSER.superclass.constructor.apply(this, arguments);
 293      };
 294      Y.extend(OTHERUSER, Y.Base, {
 295          _count : 0,
 296          _manager : null,
 297          _node : null,
 298          _assignmentInProgress : false,
 299          initializer : function(config) {
 300              this.publish('assignrole:success');
 301              this.publish('assignrole:failure');
 302          },
 303          toHTML : function() {
 304              this._node = Y.Node.create('<div class="'+CSS.USER+' clearfix" rel="'+this.get(USERID)+'"></div>')
 305                  .addClass((this._count%2)?CSS.ODD:CSS.EVEN)
 306                  .append(Y.Node.create('<div class="'+CSS.COUNT+'">'+this._count+'</div>'))
 307                  .append(Y.Node.create('<div class="'+CSS.USERDETAILS+'"></div>')
 308                      .append(Y.Node.create('<div class="'+CSS.PICTURE+'"></div>')
 309                          .append(Y.Node.create(this.get(PICTURE)))
 310                      )
 311                      .append(Y.Node.create('<div class="'+CSS.DETAILS+'"></div>')
 312                          .append(Y.Node.create('<div class="'+CSS.FULLNAME+'">'+this.get(FULLNAME)+'</div>'))
 313                          .append(Y.Node.create('<div class="'+CSS.EXTRAFIELDS+'">'+this.get(EXTRAFIELDS)+'</div>'))
 314                      )
 315                      .append(Y.Node.create('<div class="'+CSS.OPTIONS+'"><span class="label">'+M.util.get_string('assignrole', 'role')+': </span></div>'))
 316                  );
 317              var id = 0, roles = this._manager.get(ASSIGNABLEROLES);
 318              for (id in roles) {
 319                  var role = Y.Node.create('<a href="#" class="'+CSS.ROLEOPTION+'">'+roles[id]+'</a>');
 320                  role.on('click', this.assignRoleToUser, this, id, role);
 321                  this._node.one('.'+CSS.OPTIONS).append(role);
 322              }
 323              return this._node;
 324          },
 325          assignRoleToUser : function(e, roleid, node) {
 326              e.halt();
 327              if (this._assignmentInProgress) {
 328                  return true;
 329              }
 330              this._node.addClass('assignment-in-progress');
 331              this._assignmentInProgress = true;
 332              Y.io(M.cfg.wwwroot+'/enrol/ajax.php', {
 333                  method:'POST',
 334                  data:'id='+this._manager.get(COURSEID)+'&action=assign&sesskey='+M.cfg.sesskey+'&roleid='+roleid+'&user='+this.get(USERID),
 335                  on: {
 336                      complete: function(tid, outcome, args) {
 337                          try {
 338                              var o = Y.JSON.parse(outcome.responseText);
 339                              if (o.success) {
 340                                  var options = args.node.ancestor('.'+CSS.OPTIONS);
 341                                  if (options.all('.'+CSS.ROLEOPTION).size() == 1) {
 342                                      // This is the last node so remove the options div
 343                                      if (options.ancestor('.'+CSS.USER)) {
 344                                          options.ancestor('.'+CSS.USER).addClass(CSS.ALLROLESASSIGNED);
 345                                      }
 346                                      options.remove();
 347                                  } else {
 348                                      // There are still more assignable roles
 349                                      args.node.remove();
 350                                  }
 351                                  this._manager.set(REQUIREREFRESH, true);
 352                              }
 353                          } catch (e) {
 354                              new M.core.exception(e);
 355                          }
 356                          this._assignmentInProgress = false;
 357                          this._node.removeClass('assignment-in-progress');
 358                      }
 359                  },
 360                  context:this,
 361                  arguments:{
 362                      roleid : roleid,
 363                      node : node
 364                  }
 365              });
 366              return true;
 367          }
 368      }, {
 369          NAME : OTHERUSERNAME,
 370          ATTRS : {
 371              userId : {
 372  
 373              },
 374              fullname : {
 375                  validator : Y.Lang.isString
 376              },
 377              extrafields : {
 378                  validator : Y.Lang.isString
 379              },
 380              picture : {
 381                  validator : Y.Lang.isString
 382              }
 383          }
 384      });
 385      Y.augment(OTHERUSER, Y.EventTarget);
 386  
 387      M.enrol = M.enrol || {};
 388      M.enrol.otherusersmanager = {
 389          init : function(cfg) {
 390              new OUMANAGER(cfg);
 391          }
 392      }
 393  
 394  }, '@VERSION@', {requires:['base','node', 'overlay', 'io-base', 'test', 'json-parse', 'event-delegate', 'dd-plugin', 'event-key', 'moodle-core-notification']});


Generated: Thu Aug 11 10:00:09 2016 Cross-referenced by PHPXref 0.7.1