Completed
Push — master ( 4990c6...032b0b )
by Maxence
02:45
created

nav.initElementsAddMemberNavigation   B

Complexity

Conditions 4
Paths 6

Size

Total Lines 24

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
c 1
b 0
f 0
dl 0
loc 24
rs 8.6845
cc 4
nc 6
nop 1
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: resultGroups */
37
/** global: resultLinks */
38
/** global: curr */
39
/** global: api */
40
/** global: define */
41
42
var nav = {
43
44
	initNavigation: function () {
45
		this.initElementsAddMemberNavigation();
46
		this.initElementsLinkCircleNavigation();
47
		this.initElementsCircleNavigation();
48
49
		this.displayCirclesList('all');
50
	},
51
52
53
	initElementsAddMemberNavigation: function () {
54
55
		elements.addMember.hide();
56
		elements.addMember.on('input propertychange paste focus', function () {
57
			var search = $(this).val().trim();
58
			if (search === '') {
59
				elements.membersSearchResult.fadeOut(curr.animationMenuSpeed);
60
				return;
61
			}
62
63
			actions.searchMembersRequest(search);
64
			if (elements.membersSearchResult.children().length === 0) {
65
				elements.membersSearchResult.fadeOut(curr.animationMenuSpeed);
66
			} else {
67
				elements.membersSearchResult.fadeIn(curr.animationMenuSpeed);
68
			}
69
		}).blur(function () {
70
			setTimeout(function () {
71
				elements.membersSearchResult.fadeOut(curr.animationMenuSpeed);
72
				nav.circlesActionReturn();
73
			}, 100);
74
		});
75
		elements.addMember.on('keydown', function (e) {
76
			if (e.keyCode === 27) {
77
				nav.circlesActionReturn();
78
			}
79
			if (e.keyCode === 13) {
80
81
				if (curr.exactMemberSearchType === 'group') {
82
83
					OC.dialogs.confirm(
84
						t('circles',
85
							'This operation will add/invite all members of the group to the circle'),
86
						t('circles', 'Please confirm'),
87
						function (e) {
88
							if (e === true) {
89
								api.addGroupMembers(curr.circle, elements.addMember.val(),
90
									resultMembers.addGroupMembersResult);
91
							}
92
						});
93
				} else {
94
					api.addMember(curr.circle, elements.addMember.val(),
95
						resultMembers.addMemberResult);
96
				}
97
			}
98
		});
99
100
101
		elements.linkGroup.on('input propertychange paste focus', function () {
102
			var search = $(this).val().trim();
103
			if (search === '') {
104
				elements.groupsSearchResult.fadeOut(curr.animationMenuSpeed);
105
				return;
106
			}
107
108
			actions.searchGroupsRequest(search);
109
			if (elements.groupsSearchResult.children().length === 0) {
110
				elements.groupsSearchResult.fadeOut(curr.animationMenuSpeed);
111
			} else {
112
				elements.groupsSearchResult.fadeIn(curr.animationMenuSpeed);
113
			}
114
		}).blur(function () {
115
			setTimeout(function () {
116
				elements.groupsSearchResult.fadeOut(curr.animationMenuSpeed);
117
				nav.circlesActionReturn();
118
			}, 100);
119
		});
120
		elements.linkGroup.on('keydown', function (e) {
121
			if (e.keyCode === 27) {
122
				nav.circlesActionReturn();
123
			}
124
			if (e.keyCode === 13) {
125
				api.linkGroup(curr.circle, $(this).val(), resultGroups.linkGroupResult);
126
			}
127
		});
128
	},
129
130
131
	initElementsLinkCircleNavigation: function () {
132
133
		elements.linkCircle.hide();
134
		elements.linkCircle.on('keydown', function (e) {
135
136
			if (e.keyCode === 27) {
137
				nav.circlesActionReturn();
138
			}
139
			if (e.keyCode !== 13) {
140
				return;
141
			}
142
143
			api.linkCircle(curr.circle, elements.linkCircle.val().trim(),
144
				resultLinks.linkCircleResult);
145
		}).blur(function () {
146
			nav.circlesActionReturn();
147
		});
148
	},
149
150
151
	initElementsCircleNavigation: function () {
152
153
		elements.joinCircle.hide();
154
		elements.joinCircle.on('click', function () {
155
			api.joinCircle(curr.circle, resultCircles.joinCircleResult);
156
			nav.circlesActionReturn();
157
		});
158
159
		elements.leaveCircle.hide();
160
		elements.leaveCircle.on('click', function () {
161
			OC.dialogs.confirm(
162
				t('circles', 'Are you sure you want to leave this circle?'),
163
				t('circles', 'Please confirm'),
164
				function (e) {
165
					if (e === true) {
166
						api.leaveCircle(curr.circle, resultCircles.leaveCircleResult);
167
						nav.circlesActionReturn();
168
					}
169
				});
170
		});
171
172
		elements.destroyCircle.on('click', function () {
173
			OC.dialogs.confirm(
174
				t('circles', 'Are you sure you want to delete this circle?'),
175
				t('circles', 'This action is irreversible'),
176
				function (e) {
177
					if (e === true) {
178
						api.destroyCircle(curr.circle, resultCircles.destroyCircleResult);
179
					}
180
				});
181
		});
182
183
		elements.joinCircleAccept.on('click', function () {
184
			api.joinCircle(curr.circle, resultCircles.joinCircleResult);
185
		});
186
187
		elements.joinCircleReject.on('click', function () {
188
			api.leaveCircle(curr.circle, resultCircles.leaveCircleResult);
189
		});
190
	},
191
192
193
	displayCirclesList: function (type) {
194
195
		curr.circlesType = type;
196
		curr.searchCircle = '';
197
		curr.searchUser = '';
198
199
		curr.circle = 0;
200
		curr.circleLevel = 0;
201
202
		elements.navigation.show('slide', 800);
203
		elements.emptyContent.show(800);
204
		elements.mainUI.fadeOut(800);
205
206
		elements.circlesSearch.val('');
207
		elements.addMember.val('');
208
		elements.linkCircle.val('');
209
210
		this.resetCirclesTypeSelection(type);
211
		elements.resetCirclesList();
212
		api.listCircles(type, '', 0, resultCircles.listCirclesResult);
213
	},
214
215
216
	resetCirclesTypeSelection: function (type) {
217
		elements.circlesList.children('div').removeClass('selected');
218
		elements.circlesList.children().each(function () {
219
			if ($(this).attr('circle-type') === type.toLowerCase()) {
220
				$(this).addClass('selected');
221
			}
222
		});
223
	},
224
225
	circlesActionReturn: function () {
226
		nav.displayCircleButtons(true);
227
		settings.displaySettings(false);
228
		nav.displayAddMemberInput(false);
229
		nav.displayLinkGroupInput(false);
230
		nav.displayLinkCircleInput(false);
231
		nav.displayJoinCircleButton(false);
232
		nav.displayInviteCircleButtons(false);
233
	},
234
235
	joinCircleAction: function () {
236
		nav.displayCircleButtons(false);
237
		nav.displayAddMemberInput(false);
238
		nav.displayLinkCircleInput(false);
239
		nav.displayLinkGroupInput(false);
240
		nav.displayJoinCircleButton(true);
241
	},
242
243
	displayCircleButtons: function (display) {
244
		if (display) {
245
			elements.buttonCircleActionReturn.hide(define.animationMenuSpeed);
246
			elements.buttonCircleActions.delay(define.animationMenuSpeed).show(
247
				define.animationMenuSpeed);
248
		} else {
249
			elements.buttonCircleActions.hide(define.animationMenuSpeed);
250
			elements.buttonCircleActionReturn.delay(define.animationMenuSpeed).show(
251
				define.animationMenuSpeed);
252
		}
253
	},
254
255
	displayAddMemberInput: function (display) {
256
		if (display) {
257
			elements.addMember.val('');
258
			elements.addMember.delay(define.animationMenuSpeed).show(define.animationMenuSpeed,
259
				function () {
260
					$(this).focus();
261
				});
262
		} else {
263
			elements.addMember.hide(define.animationMenuSpeed);
264
		}
265
	},
266
267
	displayLinkGroupInput: function (display) {
268
		if (display) {
269
			elements.linkGroup.val('');
270
			elements.linkGroup.delay(define.animationMenuSpeed).show(define.animationMenuSpeed,
271
				function () {
272
					$(this).focus();
273
				});
274
		} else {
275
			elements.linkGroup.hide(define.animationMenuSpeed);
276
		}
277
	},
278
279
	displayLinkCircleInput: function (display) {
280
		if (display) {
281
			elements.linkCircle.val('');
282
			elements.linkCircle.delay(define.animationMenuSpeed).show(define.animationMenuSpeed,
283
				function () {
284
					$(this).focus();
285
				});
286
		} else {
287
			elements.linkCircle.hide(define.animationMenuSpeed);
288
		}
289
	},
290
291
292
	displayInviteCircleButtons: function (display) {
293
		if (display) {
294
			elements.joinCircleAccept.show(define.animationMenuSpeed);
295
			elements.joinCircleReject.delay(define.animationMenuSpeed).show(
296
				define.animationMenuSpeed);
297
		} else {
298
			elements.joinCircleAccept.hide(define.animationMenuSpeed);
299
			elements.joinCircleReject.hide(define.animationMenuSpeed);
300
		}
301
	},
302
303
	displayJoinCircleButton: function (display) {
304
		if (display) {
305
			if (curr.circleStatus === 'Invited') {
306
				elements.joinCircle.hide(define.animationMenuSpeed);
307
				elements.leaveCircle.hide(define.animationMenuSpeed);
308
				nav.displayInviteCircleButtons(true);
309
310
			} else {
311
				nav.displayInviteCircleButtons(false);
312
313
				if (curr.circleLevel === 0 && curr.circleStatus !== 'Requesting') {
314
					elements.joinCircle.delay(define.animationMenuSpeed).show(
315
						define.animationMenuSpeed);
316
					elements.leaveCircle.hide(define.animationMenuSpeed);
317
					elements.joinCircleAccept.hide(define.animationMenuSpeed);
318
					elements.joinCircleReject.hide(define.animationMenuSpeed);
319
320
				}
321
				else {
322
					elements.leaveCircle.delay(define.animationMenuSpeed).show(
323
						define.animationMenuSpeed);
324
					elements.joinCircle.hide(define.animationMenuSpeed);
325
				}
326
			}
327
		} else {
328
			elements.joinCircle.hide(define.animationMenuSpeed);
329
			elements.leaveCircle.hide(define.animationMenuSpeed);
330
		}
331
	},
332
333
334
	/**
335
	 *
336
	 * @param display
337
	 */
338
	displayOptionsNewCircle: function (display) {
339
		if (display) {
340
			elements.newType.fadeIn(300);
341
			elements.newSubmit.fadeIn(500);
342
			elements.newTypeDefinition.fadeIn(700);
343
		}
344
		else {
345
			elements.newType.fadeOut(700);
346
			elements.newSubmit.fadeOut(500);
347
			elements.newTypeDefinition.fadeOut(300);
348
		}
349
	},
350
351
352
	displayMembers: function (members) {
353
		if (members === '') {
354
			members = curr.circleMembers;
355
		} else {
356
			curr.circleMembers = members;
357
		}
358
359
		elements.mainUIMembersTable.emptyTable();
360
		if (members === null) {
361
			elements.mainUIMembersTable.hide(200);
362
			return;
363
		}
364
365
		elements.mainUIMembersTable.show(200);
366
		for (var i = 0; i < members.length; i++) {
367
			var tmpl = elements.generateTmplMember(members[i]);
368
			elements.mainUIMembersTable.append(tmpl);
369
		}
370
371
		for (i = 0; i < 10; i++) {
372
			if (curr.circleLevel < 9 && curr.circleLevel <= i
373
				|| curr.circleDetails.type === define.typePersonal) {
0 ignored issues
show
Bug introduced by
There seems to be a bad line break before ||.
Loading history...
374
				$('.level-select option[value="' + i + '"]').attr('disabled', 'disabled');
375
			}
376
		}
377
378
379
		elements.mainUIMembersTable.children('tr.entry').each(function () {
380
381
				var userId = $(this).attr('member-id');
382
				if (userId === curr.userId) {
383
					$(this).find('td.username').css('font-weight', 'bold').css('font-style', 'italic');
384
					$(this).css('background', '#e0e0e0');
385
				} else {
386
					$(this).css('background', '#fff');
387
				}
388
389
				//
390
				// level
391
				if (curr.circleDetails.type === define.typePersonal) {
392
					var levelString = $(this).attr('member-levelString');
393
					$(this).find('.level').text(levelString);
394
				} else {
395
					var level = Number($(this).attr('member-level'));
396
					var levelSelect = $(this).find('.level-select');
397
					if (level === 0) {
398
						levelSelect.hide();
399
					}
400
					else {
401
						levelSelect.show(200).val(level);
402
					}
403
					levelSelect.on('change', function () {
404
						actions.changeMemberLevel(userId, $(this).val());
405
					});
406
				}
407
408
				//
409
				// status
410
				var status = $(this).attr('member-status');
411
				var statusSelect = $(this).find('.status-select');
412
413
				statusSelect.on('change', function () {
414
					actions.changeMemberStatus(userId, $(this).val());
415
				});
416
				statusSelect.append($('<option>', {
417
					value: status,
418
					text: t('circles', status)
419
				})).val(status);
420
421
				if (curr.circleLevel <= $(this).attr('member-level')) {
422
					return;
423
				}
424
425
				if (status === 'Member' || status === 'Invited') {
426
					statusSelect.append($('<option>', {
427
						value: 'remove_member',
428
						text: t('circles', 'Kick this member')
429
					}));
430
				}
431
432
				if (status === 'Requesting') {
433
					statusSelect.append($('<option>', {
434
						value: 'accept_request',
435
						text: t('circles', 'Accept the request')
436
					}));
437
					statusSelect.append($('<option>', {
438
						value: 'dismiss_request',
439
						text: t('circles', 'Dismiss the request')
440
					}));
441
				}
442
443
			}
444
		);
445
	},
446
447
448
	displayGroups: function (groups) {
449
		if (groups === '') {
450
			groups = curr.circleGroups;
451
		} else {
452
			curr.circleGroups = groups;
453
		}
454
455
		if (groups === null || groups.length === 0) {
456
			elements.mainUIGroupsTable.hide(curr.animationSpeed);
457
			return;
458
		}
459
460
		elements.mainUIGroupsTable.emptyTable();
461
		elements.mainUIGroupsTable.show(200);
462
		for (var i = 0; i < groups.length; i++) {
463
			var tmpl = elements.generateTmplGroup(groups[i]);
464
			elements.mainUIGroupsTable.append(tmpl);
465
		}
466
467
		for (i = 0; i < 10; i++) {
468
			if (curr.circleLevel < 9 && curr.circleLevel <= i) {
469
				$('.level-select option[value="' + i + '"]').attr('disabled', 'disabled');
470
			}
471
			if (i > define.levelMember && curr.circleDetails.type === define.typePersonal) {
472
				$('.level-select option[value="' + i + '"]').remove();
473
			}
474
		}
475
476
		elements.mainUIGroupsTable.children('tr.entry').each(function () {
477
478
				var groupId = $(this).attr('group-id');
479
				if (curr.circleDetails.group !== null &&
480
					groupId === curr.circleDetails.group.group_id) {
481
					$(this).find('td.username').css('font-weight', 'bold').css('font-style', 'italic');
482
					$(this).css('background', '#e0e0e0');
483
				} else {
484
					$(this).css('background', '#fff');
485
				}
486
487
				var level = Number($(this).attr('group-level'));
488
				var levelSelect = $(this).find('.level-select');
489
				if (level === 0) {
490
					levelSelect.hide();
491
				}
492
				else {
493
					levelSelect.show(200).val(level);
494
				}
495
				levelSelect.append($('<option>', {
496
					value: 'remove_group',
497
					text: t('circles', 'Unlink this group')
498
				}));
499
500
				levelSelect.on('change', function () {
501
					actions.changeGroupLevel(groupId, $(this).val());
502
				});
503
			}
504
		);
505
	},
506
507
508
	displayLinks: function (links) {
509
510
		if (links === '') {
511
			links = curr.circleLinks;
512
		} else {
513
			curr.circleLinks = links;
514
		}
515
516
		elements.mainUILinksTable.hide(curr.animationSpeed);
517
		elements.mainUILinksTable.emptyTable();
518
		if (links === null || links.length === 0) {
519
			return;
520
		}
521
522
		elements.mainUILinksTable.show(curr.animationSpeed);
523
		for (var i = 0; i < links.length; i++) {
524
			var tmpl = elements.generateTmplLink(links[i]);
525
			elements.mainUILinksTable.append(tmpl);
526
		}
527
528
529
		elements.mainUILinksTable.children('tr.entry').each(function () {
530
531
			var linkId = $(this).attr('link-id');
532
			var status = parseInt($(this).attr('link-status'));
533
534
535
			var statusSelect = $(this).find('.link-status-select');
536
537
			statusSelect.on('change', function () {
538
				actions.changeLinkStatus(linkId, $(this).val());
539
			});
540
			statusSelect.append($('<option>', {
541
				value: status,
542
				text: define.linkStatus(status)
543
			})).val(status);
544
545
			if (curr.circleLevel < define.levelAdmin) {
546
				return;
547
			}
548
549
			if (status === define.linkSetup || status === define.linkRefused ||
550
				status === define.linkUp || status === define.linkDown) {
551
				statusSelect.append($('<option>', {
552
					value: define.linkRemove,
553
					text: t('circles', 'Remove this link')
554
				}));
555
			}
556
557
			if (status === define.linkRequestSent) {
558
				statusSelect.append($('<option>', {
559
					value: define.linkRemove,
560
					text: t('circles', 'Cancel the link request')
561
				}));
562
			}
563
564
			if (status === define.linkRequested) {
565
				statusSelect.append($('<option>', {
566
					value: define.linkUp,
567
					text: t('circles', 'Accept the link request')
568
				}));
569
				statusSelect.append($('<option>', {
570
					value: define.linkRemove,
571
					text: t('circles', 'Reject the link request')
572
				}));
573
			}
574
		});
575
	},
576
577
578
	displayCircleDetails: function (details) {
579
		elements.circleDetails.children('#name').text(details.name);
580
		elements.circleDesc.text(details.description);
581
582
		elements.circleDetails.children('#type').text(t('circles', details.typeLongString));
583
		if (details.description !== '') {
584
			elements.circleDesc.html(
585
				escapeHTML(details.description).replace(/\n/g, '&nbsp;<br />')).show(
586
				define.animationSpeed);
587
		}
588
		else {
589
			elements.circleDesc.text('').hide(define.animationSpeed);
590
		}
591
592
		elements.buttonCircleActions.show(300);
593
		elements.addMember.hide(300);
594
	},
595
596
597
	displayMembersInteraction: function (details) {
598
		if (details.viewer.level < define.levelModerator) {
599
			elements.buttonAddMember.hide();
600
		} else {
601
			elements.buttonAddMember.show();
602
		}
603
604
		nav.displayMemberInteractionCircleLinks(details);
605
		nav.displayMemberInteractionGroupLinks(details);
606
607
		elements.joinCircleInteraction.hide();
608
		elements.buttonJoinCircle.show();
609
610
		this.displayNonMemberInteraction(details);
611
612
		if (details.viewer.level === define.levelOwner) {
613
			elements.destroyCircle.show();
614
			elements.buttonCircleSettings.show();
615
			elements.buttonJoinCircle.hide();
616
		}
617
	},
618
619
620
	displayMemberInteractionGroupLinks: function (details) {
621
		if (curr.allowed_linked_groups === '0' ||
622
			details.viewer.level < define.levelAdmin
623
		) {
624
			elements.buttonLinkGroup.hide();
625
		}
626
		else {
627
			elements.buttonLinkGroup.show();
628
		}
629
	},
630
631
632
	displayMemberInteractionCircleLinks: function (details) {
633
		if (curr.allowed_federated_circles === '0' ||
634
			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...
635
			details.type === define.typePersonal ||
636
			details.viewer.level < define.levelAdmin
637
		) {
638
			elements.buttonLinkCircle.hide();
639
		}
640
		else {
641
			elements.buttonLinkCircle.show();
642
		}
643
	},
644
645
646
	displayNonMemberInteraction: function (details) {
647
		elements.joinCircleAccept.hide();
648
		elements.joinCircleReject.hide();
649
		elements.joinCircleRequest.hide();
650
		elements.joinCircleInvite.hide();
651
		elements.buttonCircleSettings.hide();
652
		elements.destroyCircle.hide();
653
654
		if (details.user.status === 'Requesting') {
655
			elements.joinCircleRequest.show();
656
			return;
657
		}
658
659
		if (details.user.status === 'Invited') {
660
			elements.joinCircleInvite.show();
661
			return;
662
		}
663
664
		if (details.viewer.level > 0) {
665
			return;
666
		}
667
668
		setTimeout(function () {
669
			nav.joinCircleAction();
670
		}, 200);
671
	}
672
673
};
674
675