Security update for permissions_by_term
[yaffs-website] / web / modules / contrib / permissions_by_term / js / node-form.prototype.js
1 var NodeForm = function($){
2   this.jQuery = $;
3   this.selectedTids = [];
4   this.formElementCssClasses = [];
5 };
6
7 NodeForm.prototype.getSelectedTids = function() {
8   var tids = [];
9
10   for (var index = 0; index < this.formElementCssClasses.length; ++index) {
11     if (this.selectedTids[this.formElementCssClasses[index]] !== undefined && this.selectedTids[this.formElementCssClasses[index]].constructor === Array) {
12
13       this.selectedTids[this.formElementCssClasses[index]].forEach(function(tid){
14         tids.push(tid);
15       })
16     }
17   }
18
19   return tids;
20 }
21
22 NodeForm.prototype.addFormElementCssClass = function(formElementCssClass) {
23   this.formElementCssClasses.push(formElementCssClass);
24 }
25
26
27 NodeForm.prototype.keyExists = function(key, array) {
28   if (!array || (array.constructor !== Array && array.constructor !== Object)) {
29     return false;
30   }
31   for (var i = 0; i < array.length; i++) {
32     if (array[i] === key) {
33       return true;
34     }
35   }
36   return key in array;
37 }
38
39 NodeForm.prototype.addSelectedTid = function(tid, formElementCssClass) {
40   if (!this.keyExists(formElementCssClass, this.formElementCssClasses)) {
41     this.formElementCssClasses.push(formElementCssClass);
42   }
43
44   if (this.selectedTids[formElementCssClass] === undefined) {
45
46     this.selectedTids[formElementCssClass] = [];
47   }
48
49   this.selectedTids[formElementCssClass].push(tid);
50 }
51
52 NodeForm.prototype.removeTid = function(value, formElementCssClass) {
53   const index = this.selectedTids[formElementCssClass].indexOf(parseInt(value));
54
55   if (index !== -1) {
56     this.selectedTids[formElementCssClass].splice(index, 1);
57   }
58 }
59
60 NodeForm.prototype.resetData = function(formElementCssClass) {
61   this.selectedTids[formElementCssClass] = [];
62 }
63
64 NodeForm.prototype.computeFieldWrapperCSSClasses = function(fieldNames) {
65   var wrapperCssClasses = [];
66
67   for (var index = 0; index < fieldNames.length; ++index) {
68     var fieldWrapperClass = '.field--name-' + fieldNames[index].replace(/_/g, '-');
69
70     wrapperCssClasses.push(fieldWrapperClass);
71   }
72
73   return wrapperCssClasses;
74 }
75
76 NodeForm.prototype.displayPermissionsByCheckbox = function(tid, checked, permissions) {
77   if (checked === false) {
78     this.resetData('checkbox_tid_' + tid);
79   } else if (checked === true){
80     this.addSelectedTid(parseInt(tid), 'checkbox_tid_' + tid);
81   }
82
83   this.renderPermissionsInfo(permissions);
84 }
85
86 NodeForm.prototype.displayPermissionsBySelect = function(fieldWrapperCSSClasses, permissions) {
87   for (var index = 0; index < fieldWrapperCSSClasses.length; ++index) {
88     var inputTypes = ['select', 'input'];
89
90     var fieldWrapperCSSClass = fieldWrapperCSSClasses[index];
91
92     for (var inputTypesIndex = 0; inputTypesIndex <= inputTypes.length; inputTypesIndex++) {
93       var values = this.jQuery(fieldWrapperCSSClass + ' select').val();
94
95       if (values !== undefined && values !== null && values.constructor === Array) {
96         if (values[0] === '_none') {
97           this.resetData(fieldWrapperCSSClass);
98         }
99
100         for (var i = 0; i < values.length; ++i) {
101           if (isNaN(values[i]) === false) {
102             this.addSelectedTid(parseInt(values[i]), fieldWrapperCSSClass);
103           }
104         }
105       }
106
107     }
108
109   }
110
111   this.renderPermissionsInfo(permissions);
112
113 }
114
115 NodeForm.prototype.displayPermissionsByAutocomplete = function(fieldWrapperCSSClasses, permissions) {
116   for (var index = 0; index < fieldWrapperCSSClasses.length; ++index) {
117     var fieldWrapperCSSClass = fieldWrapperCSSClasses[index];
118
119     var values = this.jQuery(fieldWrapperCSSClass + ' input').val();
120
121     if (values !== undefined && values.indexOf('(') !== -1 && values.indexOf(')')) {
122
123       this.resetData(fieldWrapperCSSClass);
124
125       var tidsInBrackets = values.match(/\(\d+\)/g);
126
127       if (tidsInBrackets !== undefined && tidsInBrackets !== null && tidsInBrackets.constructor === Array) {
128
129         for (var i = 0; i < tidsInBrackets.length; ++i) {
130           var selectedTid = parseInt(tidsInBrackets[i].replace('(', '').replace(')', ''));
131           this.addSelectedTid(selectedTid, fieldWrapperCSSClass);
132         }
133
134       }
135
136     }
137
138   }
139
140   this.renderPermissionsInfo(permissions);
141
142 }
143
144 NodeForm.prototype.separateByComma = function(values) {
145   return values.join(', ');
146 }
147
148 NodeForm.prototype.renderPermissionsInfo = function(permissions) {
149
150   var permissionsToDisplay = this.getPermissionsByTids(this.getSelectedTids(), permissions);
151
152   var allowedUsersHtml = '<b>' + Drupal.t('Allowed users:') + '</b> ';
153
154   if (this.isAllowedUsersRestriction(permissionsToDisplay)) {
155     allowedUsersHtml += this.separateByComma(permissionsToDisplay['permittedUsers']);
156   } else {
157     allowedUsersHtml += '<i>' + Drupal.t('No user restrictions.') + '</i>';
158   }
159
160   var allowedRolesHtml = '<b>' + Drupal.t('Allowed roles:') + '</b> ';
161
162   if (this.isAllowedRolesRestriction(permissionsToDisplay)) {
163     allowedRolesHtml += this.separateByComma(permissionsToDisplay['permittedRoles']);
164   } else {
165     allowedRolesHtml += '<i>' + Drupal.t('No role restrictions.') + '</i>';;
166   }
167
168   var generalInfoText = Drupal.t("This widget shows information about taxonomy term related permissions. It's being updated, as soon you make any related changes in the form.");
169
170   this.jQuery('#edit-permissions-by-term-info .form-type-item').html(generalInfoText + '<br /><br />' + allowedUsersHtml + '<br />' + allowedRolesHtml);
171 }
172
173 NodeForm.prototype.isAllowedUsersRestriction = function(permissionsToDisplay) {
174   if (permissionsToDisplay['permittedUsers'].length > 0 && permissionsToDisplay['permittedUsers'] !== null) {
175     return true;
176   }
177
178   return false;
179 }
180
181 NodeForm.prototype.isAllowedRolesRestriction = function(permissionsToDisplay) {
182   if (permissionsToDisplay['permittedRoles'].length > 0 && permissionsToDisplay['permittedRoles'] !== null) {
183     return true;
184   }
185
186   return false;
187 }
188
189 NodeForm.prototype.pushUserDisplayNames = function(tids, permissionsToDisplay, permissions) {
190   for (var index = 0; index < tids.length; ++index) {
191     if (permissions['userDisplayNames'][tids[index]] !== undefined && permissions['userDisplayNames'][tids[index]] !== null &&
192         permissionsToDisplay['permittedUsers'].indexOf(permissions['userDisplayNames'][tids[index]]) === -1) {
193
194       var userDisplayNames = permissions['userDisplayNames'][tids[index]];
195
196       if (userDisplayNames.constructor === Array && userDisplayNames.length > 1) {
197         userDisplayNames.forEach(function(value){
198           if (permissionsToDisplay['permittedUsers'].indexOf(value) === -1) {
199             permissionsToDisplay['permittedUsers'].push(value);
200           }
201         });
202       } else {
203         if (permissionsToDisplay['permittedUsers'].indexOf(userDisplayNames) === -1) {
204           permissionsToDisplay['permittedUsers'].push(userDisplayNames);
205         }
206       }
207     }
208   }
209
210   return permissionsToDisplay;
211 }
212
213 NodeForm.prototype.pushRoles = function(tids, permissionsToDisplay, permissions) {
214   for (var index = 0; index < tids.length; ++index) {
215
216     if (permissions['roleLabels'] === undefined) {
217       return permissionsToDisplay;
218     }
219
220     if (permissions['roleLabels'][tids[index]] !== undefined && permissions['roleLabels'][tids[index]] !== null) {
221       permissions['roleLabels'][tids[index]].forEach(function(role){
222         if (permissionsToDisplay['permittedRoles'].indexOf(role) === -1) {
223           permissionsToDisplay['permittedRoles'].push(role);
224         }
225       });
226     }
227   }
228
229   return permissionsToDisplay;
230 }
231
232 NodeForm.prototype.getPermissionsByTids = function(tids, permissions) {
233   var permissionsToDisplay = {
234     permittedUsers: [],
235     permittedRoles: []
236   };
237
238   permissionsToDisplay = this.pushRoles(tids, permissionsToDisplay, permissions);
239   permissionsToDisplay = this.pushUserDisplayNames(tids, permissionsToDisplay, permissions);
240
241   return permissionsToDisplay;
242 }