1 {% extends "page.html.twig" %}
3 {% set can_export = login.isGroupManager() and preferences.pref_bool_groupsmanagers_exports or login.isAdmin() or login.isStaff() %}
5 {% macro group_item(login, group, opened, selected) %}
6 <div class="{% if group.getGroups()|length > 0 %}title{% if group.getName() in opened %} active{% endif %}{% else %}nochild{% endif %}">
7 <i class="{% if group.getGroups()|length > 0 %}dropdown{% else %}empty{% endif %} icon"></i>
8 <a class="ui{% if group.getName() == selected %} primary{% endif %} label" href="{% if login.isGroupManager(group.getId()) %}{{ url_for("groups", {"id": group.getId()}) }}{% else %}#{% endif %}">
12 {% if group.getGroups()|length > 0 %}
13 <div class="content{% if group.getName() in opened %} active{% endif %}">
14 <div class="accordion">
15 {% for child_group in group.getGroups() %}
16 {{ _self.group_item(login, child_group, opened, selected) }}
24 {% if group.getId() %}
25 {% set opened = group.getFullName()|split(' / ') %}
26 {% set selected = opened|last %}
27 <div class="ui stackable grid">
28 <div class="three wide column">
29 <div class="ui top attached accordion-styled header">{{ _T("Select a group") }} :</div>
30 <div class="ui attached accordion-styled scrolling segment loader_selector">
31 <div class="ui tree accordion">
32 {% for group in groups_root %}
33 {{ _self.group_item(login, group, opened, selected) }}
38 <div class="ui basic fitted segment">
39 <div class="ui wrapping spaced buttons">
40 <a href="{{ url_for("pdf_groups") }}" class="ui labeled icon fluid button tooltip" title="{{ _T("Export all groups and their members as PDF") }}">
41 <i class="file pdf red labeled icon" aria-hidden="true"></i>
42 {{ _T("All groups PDF") }}
44 {% if login.isAdmin() or login.isStaff() %}
45 <a href="{{ url_for("add_group", {"name": "NAME"}) }}" class="ui labeled icon fluid button tooltip" id="newgroup" title="{{ _T("New group") }}">
46 <i class="plus circle green icon" aria-hidden="true"></i>
54 <div class="thirteen wide column">
55 {% include "elements/group.html.twig" with {"group": group, "groups": groups} %}
63 {% block javascripts %}
64 <script type="text/javascript">
69 $('#newgroup').click(function(){
70 var _href = $(this).attr('href');
71 var _input = '<div class="ui labeled input"><div class="ui label">{{ _T("Name:") }}</div><input type="text" name="new_group_name" id="new_group_name" required/></div>';
73 title: '{{ _T("Add a new group") }}',
76 onApprove: function() {
77 var _name = $('#new_group_name').val();
81 url: '{{ url_for("ajax_groupname_unique") }}',
87 {% include "elements/js/loader.js.twig" with {
88 selector: ".segment:not(.tab).loader_selector",
91 success: function(res){
92 if ( res.success == false ) {
94 {% include "elements/js/modal.js.twig" with {
95 modal_title_twig: _T("An error occurred :(")|e("js"),
96 modal_content: "res.message",
98 modal_content_class: "scrolling",
99 modal_deny_only: true,
100 modal_cancel_text: _T("Close")|e("js"),
101 modal_classname: "redalert",
104 {% include "elements/js/modal.js.twig" with {
105 modal_title_twig: _T("The group name you have requested already exists in the database.")|e("js"),
106 modal_without_content: true,
108 modal_deny_only: true,
109 modal_cancel_text: _T("Close")|e("js"),
110 modal_classname: "redalert",
114 $(location).attr('href', _href.replace('NAME', _name));
118 {% include "elements/js/modal.js.twig" with {
119 modal_title_twig: _T("An error occurred checking name uniqueness :(")|e("js"),
120 modal_without_content: true,
122 modal_deny_only: true,
123 modal_cancel_text: _T("Close")|e("js"),
124 modal_classname: "redalert",
129 {% include "elements/js/modal.js.twig" with {
130 modal_title_twig: _T("Please provide a group name")|e("js"),
131 modal_without_content: true,
133 modal_deny_only: true,
134 modal_cancel_text: _T("Close")|e("js"),
135 modal_classname: "redalert",
141 text : '{{ _T("Create")|e('js') }}',
143 class : 'icon labeled green approve'
145 text : '{{ _T("Close")|e('js') }}',
147 class : 'icon labeled deny'
154 var _btnuser_mapping = function(){
155 $('#btnusers_small, #btnmanagers_small').click(function(){
156 _mode = ($(this).attr('id') == 'btnusers_small') ? 'members' : 'managers';
157 var _persons = $('input[name="' + _mode + '[]"]').map(function() {
158 return $(this).val();
161 url: '{{ url_for('ajaxMembers') }}',
166 gid: $('#id_group').val(),
170 {% include "elements/js/loader.js.twig" with {
172 selector: ".tab.segment.active .loader_selector"
174 success: function(res){
175 _members_dialog(res, _mode);
178 {% include "elements/js/modal.js.twig" with {
179 modal_title_twig: _T("An error occurred displaying members interface :(")|e("js"),
180 modal_without_content: true,
182 modal_deny_only: true,
183 modal_cancel_text: _T("Close")|e("js"),
184 modal_classname: "redalert",
193 var _members_dialog = function(res, mode){
194 var _title = '{{ _T("Group members selection")|e('js') }}';
195 if ( mode == 'managers' ) {
196 _title = '{{ _T("Group managers selection")|e('js') }}';
198 {% include "elements/js/modal.js.twig" with {
199 modal_title: "_title",
200 modal_content: "res",
201 modal_class: "members-selection fullscreen",
202 modal_content_class: "scrolling",
203 modal_deny_only: true,
204 modal_cancel_text: _T("Close")|e("js")
206 _members_ajax_mapper(res, $('#group_id').val(), mode);
210 var _members_ajax_mapper = function(res, gid, mode){
211 $('#btnvalid').click(function(){
212 //store entities in the original page so they can be saved
214 if ( mode == 'managers' ) {
215 _container = $('#group_managers');
217 _container = $('#group_members');
219 var _persons = new Array();
220 $('li[id^="member_"]').each(function(){
221 _persons[_persons.length] = this.id.substring(7, this.id.length);
223 if ( _persons.length == 0 ) {
227 url: '{{ url_for('ajaxGroupMembers') }}',
233 {% include "elements/js/loader.js.twig" with {
234 selector: "#btnvalid",
237 success: function(res){
238 var _modified = '<div class="ui icon yellow small message with-transition"><i class="exclamation triangle icon"></i><div class="content">{{ _T("Items in this list have been modified. Don't forget to save your changes.")|e('js') }}</div></div>';
239 _container.find('.message').remove();
241 _container.find('.loader_selector').remove();
242 _container.children('.segment').append(res);
243 _container.children('#group_' + mode + ' .segment').append(_modified);
245 var _emptyselection = '<tbody><tr><td colspan="2">{{ _T("No member attached")|e('js') }}</td></tr></tbody>';
246 _container.find('table.listing tbody').remove();
247 _container.find('table.listing').append(_emptyselection);
248 _container.children('#group_' + mode + ' .segment').append(_modified);
250 $('.members-selection').modal('hide');
251 $('.message.with-transition').transition('flash');
254 {% include "elements/js/modal.js.twig" with {
255 modal_title_twig: _T("An error occurred displaying members interface :(")|e("js"),
256 modal_without_content: true,
258 modal_deny_only: true,
259 modal_cancel_text: _T("Close")|e("js"),
260 modal_classname: "redalert",
267 var _none = $('#none_selected').clone();
268 $('li[id^="member_"]').click(function(){
270 if ( $('#selected_members ul li').length == 0 ) {
271 $('#selected_members ul').append(_none);
275 $('#listing tbody tr').click(function(event){
276 event.preventDefault();
277 var _mlink = $(this).find('.username_row a');
278 var _mid = _mlink[0].href.match(/.*\/(\d+)$/)[1];
279 var _mname = _mlink.text();
280 $('#none_selected').remove()
281 if ( $('#member_' + _mid).length == 0 ) {
282 var _li = '<li id="member_' + _mid + '" class="item"><i class="ui user minus icon"></i><span class="ui content">' + _mname + '</span></li>';
283 $('#selected_members ul').append(_li);
284 $('#member_' + _mid).click(function(){
286 if ( $('#selected_members ul li').length == 0 ) {
287 $('#selected_members ul').append(_none);
292 }).css('cursor', 'pointer').attr('title', '{{ _T("Click on a contribution row to attach it to the current transaction")|e('js') }}');
294 $('.members-selection .pagination a').click(function(){
295 var gid = $('#the_id').val();
296 var _members = new Array();
297 $('li[id^="member_"]').each(function(){
298 _members[_members.length] = this.id.substring(7, this.id.length);
311 {% include "elements/js/loader.js.twig" with {
314 success: function(res){
315 $('#listing').remove();
316 var _listing = $($.parseHTML(res)).find('#listing');
317 $('.members-selection .eleven.wide.column').append(_listing);
318 _members_ajax_mapper(res, gid, _mode);
321 {% include "elements/js/modal.js.twig" with {
322 modal_title_twig: _T("An error occurred displaying members interface :(")|e("js"),
323 modal_without_content: true,
325 modal_deny_only: true,
326 modal_cancel_text: _T("Close")|e("js"),
327 modal_classname: "redalert",
335 {% include "elements/js/removal.js.twig" with {
337 loader_selector: "#delete",
338 single_action: "true"