Completed
Push — master ( 46633a...a2975d )
by Maxence
02:51
created

nav.displayMembersInteraction   A

Complexity

Conditions 3
Paths 4

Size

Total Lines 19

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 3
nc 4
nop 1
dl 0
loc 19
rs 9.4285
c 0
b 0
f 0
1
/*
2
 * Circles - Bring cloud-users closer together.
3
 *
4
 * This file is licensed under the Affero General Public License version 3 or
5
 * later. See the COPYING file.
6
 *
7
 * @author Maxence Lange <[email protected]>
8
 * @copyright 2017
9
 * @license GNU AGPL version 3 or any later version
10
 *
11
 * This program is free software: you can redistribute it and/or modify
12
 * it under the terms of the GNU Affero General Public License as
13
 * published by the Free Software Foundation, either version 3 of the
14
 * License, or (at your option) any later version.
15
 *
16
 * This program is distributed in the hope that it will be useful,
17
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19
 * GNU Affero General Public License for more details.
20
 *
21
 * You should have received a copy of the GNU Affero General Public License
22
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
23
 *
24
 */
25
26
/** global: OC */
27
/** global: OCA */
28
/** global: Notyf */
29
30
/** global: actions */
31
/** global: nav */
32
/** global: elements */
33
/** global: settings */
34
/** global: resultCircles */
35
/** global: resultMembers */
36
/** global: resultLinks */
37
/** global: curr */
38
/** global: api */
39
/** global: define */
40
41
var nav = {
42
43
	initNavigation: function () {
44
		this.initElementsAddMemberNavigation();
45
		this.initElementsLinkCircleNavigation();
46
		this.initElementsCircleNavigation();
47
48
		this.displayCirclesList('all');
49
	},
50
51
52
	initElementsAddMemberNavigation: function () {
53
54
		elements.addMember.hide();
55
		elements.addMember.on('input propertychange paste focus', function () {
56
			var search = $(this).val().trim();
57
			if (search === '') {
58
				elements.membersSearchResult.fadeOut(400);
59
				return;
60
			}
61
62
			actions.searchMembersRequest(search);
63
			if (elements.membersSearchResult.children().length === 0) {
64
				elements.membersSearchResult.fadeOut(400);
65
			} else {
66
				elements.membersSearchResult.fadeIn(400);
67
			}
68
		}).blur(function () {
69
			elements.membersSearchResult.fadeOut(400);
70
			nav.circlesActionReturn();
71
		});
72
		elements.addMember.on('keydown', function (e) {
73
			if (e.keyCode === 27) {
74
				nav.circlesActionReturn();
75
			}
76
			if (e.keyCode === 13) {
77
				api.addMember(curr.circle, $(this).val(), resultMembers.addMemberResult);
78
			}
79
80
		});
81
82
	},
83
84
85
	initElementsLinkCircleNavigation: function () {
86
87
		elements.linkCircle.hide();
88
		elements.linkCircle.on('keydown', function (e) {
89
90
			if (e.keyCode === 27) {
91
				nav.circlesActionReturn();
92
			}
93
			if (e.keyCode !== 13) {
94
				return;
95
			}
96
97
			api.linkCircle(curr.circle, elements.linkCircle.val(),
98
				resultLinks.linkCircleResult);
99
		}).blur(function () {
100
			nav.circlesActionReturn();
101
		});
102
	},
103
104
105
	initElementsCircleNavigation: function () {
106
107
		elements.joinCircle.hide();
108
		elements.joinCircle.on('click', function () {
109
			api.joinCircle(curr.circle, resultCircles.joinCircleResult);
110
			nav.circlesActionReturn();
111
		});
112
113
		elements.leaveCircle.hide();
114
		elements.leaveCircle.on('click', function () {
115
			api.leaveCircle(curr.circle, resultCircles.leaveCircleResult);
116
			nav.circlesActionReturn();
117
		});
118
119
		elements.destroyCircle.on('click', function () {
120
			OC.dialogs.confirm(
121
				t('circles', 'Are you sure you want to delete this circle?'),
122
				t('circles', 'Please confirm'),
123
				function (e) {
124
					if (e === true) {
125
						api.destroyCircle(curr.circle, resultCircles.destroyCircleResult);
126
					}
127
				});
128
		});
129
130
		elements.joinCircleAccept.on('click', function () {
131
			api.joinCircle(curr.circle, resultCircles.joinCircleResult);
132
		});
133
134
		elements.joinCircleReject.on('click', function () {
135
			api.leaveCircle(curr.circle, resultCircles.leaveCircleResult);
136
		});
137
	},
138
139
140
	displayCirclesList: function (type) {
141
142
		curr.circlesType = type;
143
		curr.searchCircle = '';
144
		curr.searchUser = '';
145
146
		curr.circle = 0;
147
		curr.circleLevel = 0;
148
149
		elements.navigation.show('slide', 800);
150
		elements.emptyContent.show(800);
151
		elements.mainUI.fadeOut(800);
152
153
		elements.circlesSearch.val('');
154
		elements.addMember.val('');
155
		elements.linkCircle.val('');
156
157
		this.resetCirclesTypeSelection(type);
158
		elements.resetCirclesList();
159
		api.listCircles(type, '', 0, resultCircles.listCirclesResult);
160
	},
161
162
163
	resetCirclesTypeSelection: function (type) {
164
		elements.circlesList.children('div').removeClass('selected');
165
		elements.circlesList.children().each(function () {
166
			if ($(this).attr('circle-type') === type.toLowerCase()) {
167
				$(this).addClass('selected');
168
			}
169
		});
170
	},
171
172
	circlesActionReturn: function () {
173
		nav.displayCircleButtons(true);
174
		settings.displaySettings(false);
175
		nav.displayAddMemberInput(false);
176
		nav.displayLinkCircleInput(false);
177
		nav.displayJoinCircleButton(false);
178
		nav.displayInviteCircleButtons(false);
179
	},
180
181
	joinCircleAction: function () {
182
		nav.displayCircleButtons(false);
183
		nav.displayAddMemberInput(false);
184
		nav.displayLinkCircleInput(false);
185
		nav.displayJoinCircleButton(true);
186
	},
187
188
	displayCircleButtons: function (display) {
189
		if (display) {
190
			elements.buttonCircleActionReturn.hide(define.animationMenuSpeed);
191
			elements.buttonCircleActions.delay(define.animationMenuSpeed).show(
192
				define.animationMenuSpeed);
193
		} else {
194
			elements.buttonCircleActions.hide(define.animationMenuSpeed);
195
			elements.buttonCircleActionReturn.delay(define.animationMenuSpeed).show(
196
				define.animationMenuSpeed);
197
		}
198
	},
199
200
	displayAddMemberInput: function (display) {
201
		if (display) {
202
			elements.addMember.val('');
203
			elements.addMember.delay(define.animationMenuSpeed).show(define.animationMenuSpeed,
204
				function () {
205
					$(this).focus();
206
				});
207
		} else {
208
			elements.addMember.hide(define.animationMenuSpeed);
209
		}
210
	},
211
212
	displayLinkCircleInput: function (display) {
213
		if (display) {
214
			elements.linkCircle.val('');
215
			elements.linkCircle.delay(define.animationMenuSpeed).show(define.animationMenuSpeed,
216
				function () {
217
					$(this).focus();
218
				});
219
		} else {
220
			elements.linkCircle.hide(define.animationMenuSpeed);
221
		}
222
	},
223
224
225
	displayInviteCircleButtons: function (display) {
226
		if (display) {
227
			elements.joinCircleAccept.show(define.animationMenuSpeed);
228
			elements.joinCircleReject.delay(define.animationMenuSpeed).show(
229
				define.animationMenuSpeed);
230
		} else {
231
			elements.joinCircleAccept.hide(define.animationMenuSpeed);
232
			elements.joinCircleReject.hide(define.animationMenuSpeed);
233
		}
234
	},
235
236
	displayJoinCircleButton: function (display) {
237
		if (display) {
238
			if (curr.circleStatus === 'Invited') {
239
				elements.joinCircle.hide(define.animationMenuSpeed);
240
				elements.leaveCircle.hide(define.animationMenuSpeed);
241
				nav.displayInviteCircleButtons(true);
242
243
			} else {
244
				nav.displayInviteCircleButtons(false);
245
246
				if (curr.circleLevel === 0 && curr.circleStatus !== 'Requesting') {
247
					elements.joinCircle.delay(define.animationMenuSpeed).show(
248
						define.animationMenuSpeed);
249
					elements.leaveCircle.hide(define.animationMenuSpeed);
250
					elements.joinCircleAccept.hide(define.animationMenuSpeed);
251
					elements.joinCircleReject.hide(define.animationMenuSpeed);
252
253
				}
254
				else {
255
					elements.leaveCircle.delay(define.animationMenuSpeed).show(
256
						define.animationMenuSpeed);
257
					elements.joinCircle.hide(define.animationMenuSpeed);
258
				}
259
			}
260
		} else {
261
			elements.joinCircle.hide(define.animationMenuSpeed);
262
			elements.leaveCircle.hide(define.animationMenuSpeed);
263
		}
264
	},
265
266
267
	/**
268
	 *
269
	 * @param display
270
	 */
271
	displayOptionsNewCircle: function (display) {
272
		if (display) {
273
			elements.newType.fadeIn(300);
274
			elements.newSubmit.fadeIn(500);
275
			elements.newTypeDefinition.fadeIn(700);
276
		}
277
		else {
278
			elements.newType.fadeOut(700);
279
			elements.newSubmit.fadeOut(500);
280
			elements.newTypeDefinition.fadeOut(300);
281
		}
282
	},
283
284
285
	displayMembers: function (members) {
286
287
		elements.remMember.fadeOut(300);
288
		elements.rightPanel.fadeOut(300);
289
290
		elements.mainUIMembersTable.emptyTable();
291
		if (members === null) {
292
			elements.mainUIMembersTable.hide(200);
293
			return;
294
		}
295
296
		elements.mainUIMembersTable.show(200);
297
		for (var i = 0; i < members.length; i++) {
298
			var tmpl = elements.generateTmplMember(members[i]);
299
			elements.mainUIMembersTable.append(tmpl);
300
		}
301
302
		for (i = 0; i < 10; i++) {
303
			if (curr.circleLevel < 9 && curr.circleLevel <= i) {
304
				$('.level-select option[value="' + i + '"]').attr('disabled', 'disabled');
305
			}
306
		}
307
308
309
		elements.mainUIMembersTable.children('tr.entry').each(function () {
310
311
				var userId = $(this).attr('member-id');
312
313
				//
314
				// level
315
				var level = $(this).attr('member-level');
316
				var levelSelect = $(this).find('.level-select');
317
				if (level === '0') {
318
					levelSelect.hide();
319
				}
320
				else {
321
					levelSelect.show(200).val(level);
322
				}
323
				levelSelect.on('change', function () {
324
					actions.changeMemberLevel(userId, $(this).val());
325
				});
326
327
				//
328
				// status
329
				var status = $(this).attr('member-status');
330
				var statusSelect = $(this).find('.status-select');
331
332
				statusSelect.on('change', function () {
333
					actions.changeMemberStatus(userId, $(this).val());
334
				});
335
				statusSelect.append($('<option>', {
336
					value: status,
337
					text: t('circles', status)
338
				})).val(status);
339
340
				if (curr.circleLevel <= $(this).attr('member-level')) {
341
					return;
342
				}
343
344
				if (status === 'Member' || status === 'Invited') {
345
					statusSelect.append($('<option>', {
346
						value: 'remove_member',
347
						text: t('circles', 'Kick this member')
348
					}));
349
				}
350
351
				if (status === 'Requesting') {
352
					statusSelect.append($('<option>', {
353
						value: 'accept_request',
354
						text: t('circles', 'Accept the request')
355
					}));
356
					statusSelect.append($('<option>', {
357
						value: 'dismiss_request',
358
						text: t('circles', 'Dismiss the request')
359
					}));
360
				}
361
362
			}
363
		);
364
	},
365
366
367
	displayLinks: function (links) {
368
369
		elements.mainUILinksTable.emptyTable();
370
		if (links.length === 0) {
371
			elements.mainUILinksTable.hide(curr.animationSpeed);
372
			return;
373
		}
374
375
		elements.mainUILinksTable.show(curr.animationSpeed);
376
		for (var i = 0; i < links.length; i++) {
377
			var tmpl = elements.generateTmplLink(links[i]);
378
			elements.mainUILinksTable.append(tmpl);
379
		}
380
		//
381
		// for (i = 0; i < 10; i++) {
382
		// 	if (curr.circleLevel < 9 && curr.circleLevel <= i) {
383
		// 		$('.level-select option[value="' + i + '"]').attr('disabled', 'disabled');
384
		// 	}
385
		// }
386
387
388
	},
389
390
391
	displayCircleDetails: function (details) {
392
		elements.circlesDetails.children('#name').text(details.name);
393
		elements.circlesDetails.children('#type').text(t('circles', details.typeLongString));
394
395
		elements.buttonCircleActions.show(300);
396
		elements.addMember.hide(300);
397
	},
398
399
400
	displayMembersInteraction: function (details) {
401
		if (details.user.level < define.levelModerator) {
402
			elements.buttonAddMember.hide();
403
		} else {
404
			elements.buttonAddMember.show();
405
		}
406
407
		nav.displayMemberInteractionLinks(details);
408
409
		elements.joinCircleInteraction.hide();
410
		this.displayNonMemberInteraction(details);
411
412
		if (details.user.level === define.levelOwner) {
413
			elements.destroyCircle.show();
414
			elements.buttonCircleSettings.show();
415
			elements.buttonJoinCircle.hide();
416
		}
417
418
	},
419
420
	displayMemberInteractionLinks: function (details) {
421
		if (curr.allowed_federated === '0' || curr.circleSettings['allow_links'] !== 'true' ||
0 ignored issues
show
Coding Style introduced by
['allow_links'] could be written in dot notation.

You can rewrite this statement in dot notation:

var obj = { };
obj['foo'] = 'bar'; // Bad
obj.foo = 'bar'; // Good
Loading history...
422
			details.type === 'Personal' ||
423
			details.user.level < define.levelAdmin
424
		) {
425
			elements.buttonLinkCircle.hide();
426
		}
427
		else {
428
			elements.buttonLinkCircle.show();
429
		}
430
	},
431
432
433
	displayNonMemberInteraction: function (details) {
434
		elements.joinCircleAccept.hide();
435
		elements.joinCircleReject.hide();
436
		elements.joinCircleRequest.hide();
437
		elements.joinCircleInvite.hide();
438
		elements.buttonCircleSettings.hide();
439
		elements.destroyCircle.hide();
440
441
		if (details.user.status === 'Requesting') {
442
			elements.joinCircleRequest.show();
443
			return;
444
		}
445
446
		if (details.user.level > 0) {
447
			return;
448
		}
449
450
		setTimeout(function () {
451
			nav.joinCircleAction();
452
		}, 200);
453
	}
454
455
};
456
457