source: OKFNAnnotator (for Zope)/annotator_files/lib/plugin/permissions.js @ 3:6356e78ccf5c

Last change on this file since 3:6356e78ccf5c was 3:6356e78ccf5c, checked in by casties, 12 years ago

new version contains Annotator JS files to be used with FilesystemSite?.

File size: 5.9 KB
Line 
1var __bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; },
2  __hasProp = Object.prototype.hasOwnProperty,
3  __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor; child.__super__ = parent.prototype; return child; };
4
5Annotator.Plugin.Permissions = (function(_super) {
6
7  __extends(Permissions, _super);
8
9  Permissions.prototype.events = {
10    'beforeAnnotationCreated': 'addFieldsToAnnotation'
11  };
12
13  Permissions.prototype.options = {
14    showViewPermissionsCheckbox: true,
15    showEditPermissionsCheckbox: true,
16    userId: function(user) {
17      return user;
18    },
19    userString: function(user) {
20      return user;
21    },
22    userAuthorize: function(action, annotation, user) {
23      var token, tokens, _i, _len;
24      if (annotation.permissions) {
25        tokens = annotation.permissions[action] || [];
26        if (tokens.length === 0) return true;
27        for (_i = 0, _len = tokens.length; _i < _len; _i++) {
28          token = tokens[_i];
29          if (this.userId(user) === token) return true;
30        }
31        return false;
32      } else if (annotation.user) {
33        return user && this.userId(user) === this.userId(annotation.user);
34      }
35      return true;
36    },
37    user: '',
38    permissions: {
39      'read': [],
40      'update': [],
41      'delete': [],
42      'admin': []
43    }
44  };
45
46  function Permissions(element, options) {
47    this._setAuthFromToken = __bind(this._setAuthFromToken, this);
48    this.updateViewer = __bind(this.updateViewer, this);
49    this.updateAnnotationPermissions = __bind(this.updateAnnotationPermissions, this);
50    this.updatePermissionsField = __bind(this.updatePermissionsField, this);
51    this.addFieldsToAnnotation = __bind(this.addFieldsToAnnotation, this);    Permissions.__super__.constructor.apply(this, arguments);
52    if (this.options.user) {
53      this.setUser(this.options.user);
54      delete this.options.user;
55    }
56  }
57
58  Permissions.prototype.pluginInit = function() {
59    var createCallback, self,
60      _this = this;
61    if (!Annotator.supported()) return;
62    self = this;
63    createCallback = function(method, type) {
64      return function(field, annotation) {
65        return self[method].call(self, type, field, annotation);
66      };
67    };
68    if (!this.user && this.annotator.plugins.Auth) {
69      this.annotator.plugins.Auth.withToken(this._setAuthFromToken);
70    }
71    if (this.options.showViewPermissionsCheckbox === true) {
72      this.annotator.editor.addField({
73        type: 'checkbox',
74        label: Annotator._t('Allow anyone to <strong>view</strong> this annotation'),
75        load: createCallback('updatePermissionsField', 'read'),
76        submit: createCallback('updateAnnotationPermissions', 'read')
77      });
78    }
79    if (this.options.showEditPermissionsCheckbox === true) {
80      this.annotator.editor.addField({
81        type: 'checkbox',
82        label: Annotator._t('Allow anyone to <strong>edit</strong> this annotation'),
83        load: createCallback('updatePermissionsField', 'update'),
84        submit: createCallback('updateAnnotationPermissions', 'update')
85      });
86    }
87    this.annotator.viewer.addField({
88      load: this.updateViewer
89    });
90    if (this.annotator.plugins.Filter) {
91      return this.annotator.plugins.Filter.addFilter({
92        label: Annotator._t('User'),
93        property: 'user',
94        isFiltered: function(input, user) {
95          var keyword, _i, _len, _ref;
96          user = _this.options.userString(user);
97          if (!(input && user)) return false;
98          _ref = input.split(/\s*/);
99          for (_i = 0, _len = _ref.length; _i < _len; _i++) {
100            keyword = _ref[_i];
101            if (user.indexOf(keyword) === -1) return false;
102          }
103          return true;
104        }
105      });
106    }
107  };
108
109  Permissions.prototype.setUser = function(user) {
110    return this.user = user;
111  };
112
113  Permissions.prototype.addFieldsToAnnotation = function(annotation) {
114    if (annotation) {
115      annotation.permissions = this.options.permissions;
116      if (this.user) return annotation.user = this.user;
117    }
118  };
119
120  Permissions.prototype.authorize = function(action, annotation, user) {
121    if (user === void 0) user = this.user;
122    if (this.options.userAuthorize) {
123      return this.options.userAuthorize.call(this.options, action, annotation, user);
124    } else {
125      return true;
126    }
127  };
128
129  Permissions.prototype.updatePermissionsField = function(action, field, annotation) {
130    var input;
131    field = $(field).show();
132    input = field.find('input').removeAttr('disabled');
133    if (!this.authorize('admin', annotation)) field.hide();
134    if (this.authorize(action, annotation || {}, null)) {
135      return input.attr('checked', 'checked');
136    } else {
137      return input.removeAttr('checked');
138    }
139  };
140
141  Permissions.prototype.updateAnnotationPermissions = function(type, field, annotation) {
142    var dataKey;
143    if (!annotation.permissions) annotation.permissions = this.options.permissions;
144    dataKey = type + '-permissions';
145    if ($(field).find('input').is(':checked')) {
146      return annotation.permissions[type] = [];
147    } else {
148      return annotation.permissions[type] = [this.user];
149    }
150  };
151
152  Permissions.prototype.updateViewer = function(field, annotation, controls) {
153    var user, username;
154    field = $(field);
155    username = this.options.userString(annotation.user);
156    if (annotation.user && username && typeof username === 'string') {
157      user = Annotator.$.escape(this.options.userString(annotation.user));
158      field.html(user).addClass('annotator-user');
159    } else {
160      field.remove();
161    }
162    if (!this.authorize('update', annotation)) controls.hideEdit();
163    if (!this.authorize('delete', annotation)) return controls.hideDelete();
164  };
165
166  Permissions.prototype._setAuthFromToken = function(token) {
167    return this.setUser(token.userId);
168  };
169
170  return Permissions;
171
172})(Annotator.Plugin);
Note: See TracBrowser for help on using the repository browser.