]> git.mxchange.org Git - friendica.git/blob - view/templates/acl_selector.tpl
RU translations THX Alexander An
[friendica.git] / view / templates / acl_selector.tpl
1 <div id="acl-wrapper">
2         <div class="panel-group" id="visibility-accordion-{{$input_group_id}}" role="tablist" aria-multiselectable="true">
3                 <div class="panel panel-success">
4                         <label class="panel-heading{{if $visibility != 'public'}} collapsed{{/if}}" id="visibility-public-heading-{{$input_group_id}}" aria-expanded="{{if $visibility == 'public'}}true{{else}}false{{/if}}">
5                                 <input type="radio" name="{{$input_names.visibility}}" id="visibility-public-{{$input_group_id}}" value="public" tabindex="14" {{if $visibility == 'public'}}checked{{/if}}>
6                                 <i class="fa fa-globe"></i> {{$public_title}}
7                         </label>
8                         <fieldset id="visibility-public-panel-{{$input_group_id}}" class="panel-collapse collapse{{if $visibility == 'public'}} in{{/if}}" role="tabpanel" aria-labelledby="visibility-public-heading-{{$input_group_id}}" {{if $visibility != 'public'}}disabled{{/if}}>
9                                 <div class="panel-body">
10                                         <p>{{$public_desc}}</p>
11                         {{if $for_federation}}
12                                 {{if $jotnets_fields}}
13                                     {{if $jotnets_fields|count < 3}}
14                                                                 <div class="profile-jot-net">
15                                     {{else}}
16                                                                 <details class="profile-jot-net">
17                                                                 <summary>{{$jotnets_summary}}</summary>
18                                     {{/if}}
19
20                                     {{foreach $jotnets_fields as $jotnets_field}}
21                                         {{if $jotnets_field.type == 'checkbox'}}
22                                             {{include file="field_checkbox.tpl" field=$jotnets_field.field}}
23                                         {{elseif $jotnets_field.type == 'select'}}
24                                             {{include file="field_select.tpl" field=$jotnets_field.field}}
25                                         {{/if}}
26                                     {{/foreach}}
27
28                                     {{if $jotnets_fields|count >= 3}}
29                                                                 </details>
30                                     {{else}}
31                                                                 </div>
32                                     {{/if}}
33                                     {{/if}}
34                         {{/if}}
35                                 </div>
36                         </fieldset>
37                 </div>
38                 <div class="panel panel-info">
39                         <label class="panel-heading{{if $visibility != 'custom'}} collapsed{{/if}}" id="visibility-custom-heading-{{$input_group_id}}" aria-expanded="{{if $visibility == 'custom'}}true{{else}}false{{/if}}">
40                                 <input type="radio" name="{{$input_names.visibility}}" id="visibility-custom-{{$input_group_id}}" value="custom" tabindex="15" {{if $visibility == 'custom'}}checked{{/if}}>
41                                 <i class="fa fa-lock"></i> {{$custom_title}}
42                         </label>
43                         <fieldset id="visibility-custom-panel-{{$input_group_id}}" class="panel-collapse collapse{{if $visibility == 'custom'}} in{{/if}}" role="tabpanel" aria-labelledby="visibility-custom-heading-{{$input_group_id}}" {{if $visibility != 'custom'}}disabled{{/if}}>
44                                 <input type="hidden" name="{{$input_names.group_allow}}" value="{{$group_allow}}"/>
45                                 <input type="hidden" name="{{$input_names.contact_allow}}" value="{{$contact_allow}}"/>
46                                 <input type="hidden" name="{{$input_names.group_deny}}" value="{{$group_deny}}"/>
47                                 <input type="hidden" name="{{$input_names.contact_deny}}" value="{{$contact_deny}}"/>
48                                 <div class="panel-body">
49                                         <p>{{$custom_desc}}</p>
50
51                                         <div class="form-group">
52                                                 <label for="acl_allow-{{$input_group_id}}">{{$allow_label}}</label>
53                                                 <input type="text" class="form-control input-lg" id="acl_allow-{{$input_group_id}}">
54                                         </div>
55
56                                         <div class="form-group">
57                                                 <label for="acl_deny-{{$input_group_id}}">{{$deny_label}}</label>
58                                                 <input type="text" class="form-control input-lg" id="acl_deny-{{$input_group_id}}">
59                                         </div>
60                                 </div>
61                         </fieldset>
62                 </div>
63         </div>
64
65
66 {{if $for_federation}}
67         <div class="form-group">
68                 <label for="profile-jot-email" id="profile-jot-email-label-{{$input_group_id}}">{{$emailcc}}</label>
69                 <input type="text" name="{{$input_names.emailcc}}" id="profile-jot-email-{{$input_group_id}}" class="form-control" title="{{$emtitle}}" />
70         </div>
71         <div id="profile-jot-email-end-{{$input_group_id}}"></div>
72 {{/if}}
73 </div>
74 <script type="text/javascript">
75         $(function() {
76                 let $acl_allow_input = $('#acl_allow-{{$input_group_id}}');
77                 let $contact_allow_input = $('[name="{{$input_names.contact_allow}}"]');
78                 let $group_allow_input = $('[name="{{$input_names.group_allow}}"]');
79                 let $acl_deny_input = $('#acl_deny-{{$input_group_id}}');
80                 let $contact_deny_input = $('[name="{{$input_names.contact_deny}}"]');
81                 let $group_deny_input = $('[name="{{$input_names.group_deny}}"]');
82                 let $visibility_public_panel = $('#visibility-public-panel-{{$input_group_id}}');
83                 let $visibility_custom_panel = $('#visibility-custom-panel-{{$input_group_id}}');
84                 let $visibility_public_radio = $('#visibility-public-{{$input_group_id}}');
85                 let $visibility_custom_radio = $('#visibility-custom-{{$input_group_id}}');
86
87                 // Frio specific
88                 if ($.fn.collapse) {
89                         $visibility_public_panel.collapse({parent: '#visibility-accordion-{{$input_group_id}}', toggle: false});
90                         $visibility_custom_panel.collapse({parent: '#visibility-accordion-{{$input_group_id}}', toggle: false});
91                 }
92
93                 $visibility_public_radio.on('change', function (e) {
94                         if ($.fn.collapse) {
95                                 $visibility_public_panel.collapse('show');
96                         }
97
98                         $visibility_public_panel.prop('disabled', false);
99                         $visibility_custom_panel.prop('disabled', true);
100
101                         $('#visibility-public-panel-{{$input_group_id}} .profile-jot-net input[type=checkbox]').each(function() {
102                                 // Restores checkbox state if it had been saved
103                                 if ($(this).attr('data-checked') !== undefined) {
104                                         $(this).prop('checked', $(this).attr('data-checked') === 'true');
105                                 }
106                         });
107                         $('#visibility-public-panel-{{$input_group_id}} .profile-jot-net input').attr('disabled', false);
108                 });
109
110                 $visibility_custom_radio.on('change', function(e) {
111                         if ($.fn.collapse) {
112                                 $visibility_custom_panel.collapse('show');
113                         }
114
115                         $visibility_public_panel.prop('disabled', true);
116                         $visibility_custom_panel.prop('disabled', false);
117
118                         $('#visibility-public-panel-{{$input_group_id}} .profile-jot-net input[type=checkbox]').each(function() {
119                                 // Saves current checkbox state
120                                 $(this)
121                                         .attr('data-checked', $(this).prop('checked'))
122                                         .prop('checked', false);
123                         });
124                         $('#visibility-public-panel-{{$input_group_id}} .profile-jot-net input').attr('disabled', 'disabled');
125                 });
126
127                 // Custom visibility tags inputs
128                 let acl_groups = new Bloodhound({
129                         local: {{$acl_groups|@json_encode nofilter}},
130                         identify: function(obj) { return obj.type + '-' + obj.id.toString(); },
131                         datumTokenizer: Bloodhound.tokenizers.obj.whitespace(['name']),
132                         queryTokenizer: Bloodhound.tokenizers.whitespace,
133                 });
134                 let acl_contacts = new Bloodhound({
135                         local: {{$acl_contacts|@json_encode nofilter}},
136                         identify: function(obj) { return obj.type + '-' + obj.id.toString(); },
137                         datumTokenizer: Bloodhound.tokenizers.obj.whitespace(['name', 'addr']),
138                         queryTokenizer: Bloodhound.tokenizers.whitespace,
139                 });
140                 let acl = new Bloodhound({
141                         local: {{$acl_list|@json_encode nofilter}},
142                         identify: function(obj) { return obj.type + '-' + obj.id.toString(); },
143                         datumTokenizer: Bloodhound.tokenizers.obj.whitespace(['name', 'addr']),
144                         queryTokenizer: Bloodhound.tokenizers.whitespace,
145                         sorter: function (itemA, itemB) {
146                                 if (itemA.name === itemB.name) {
147                                         return 0;
148                                 } else if (itemA.name > itemB.name) {
149                                         return 1;
150                                 } else {
151                                         return -1;
152                                 }
153                         },
154                 });
155                 acl.initialize();
156
157                 let suggestionTemplate = function (item) {
158                         return '<div><img src="' + item.micro + '" alt="" style="float: left; width: auto; height: 2.8em; margin-right: 0.5em;"> <strong>' + item.name + '</strong><br /><em>' + item.addr + '</em></div>';
159                 };
160
161                 $acl_allow_input.tagsinput({
162                         confirmKeys: [13, 44],
163                         freeInput: false,
164                         tagClass: function(item) {
165                                 switch (item.type) {
166                                         case 'group'   : return 'label label-primary';
167                                         case 'contact'  :
168                                         default:
169                                                 return 'label label-info';
170                                 }
171                         },
172                         itemValue: function (item) { return item.type + '-' + item.id.toString(); },
173                         itemText: 'name',
174                         itemThumb: 'micro',
175                         itemTitle: function(item) {
176                                 return item.addr;
177                         },
178                         typeaheadjs: {
179                                 name: 'contacts',
180                                 displayKey: 'name',
181                                 templates: {
182                                         suggestion: suggestionTemplate
183                                 },
184                                 source: acl.ttAdapter()
185                         }
186                 });
187
188                 $acl_deny_input
189                         .tagsinput({
190                                 confirmKeys: [13, 44],
191                                 freeInput: false,
192                                 tagClass: function(item) {
193                                         switch (item.type) {
194                                                 case 'group'   : return 'label label-primary';
195                                                 case 'contact'  :
196                                                 default:
197                                                         return 'label label-info';
198                                         }
199                                 },
200                                 itemValue: function (item) { return item.type + '-' + item.id.toString(); },
201                                 itemText: 'name',
202                                 itemThumb: 'micro',
203                                 itemTitle: function(item) {
204                                         return item.addr;
205                                 },
206                                 typeaheadjs: {
207                                         name: 'contacts',
208                                         displayKey: 'name',
209                                         templates: {
210                                                 suggestion: suggestionTemplate
211                                         },
212                                         source: acl.ttAdapter()
213                                 }
214                         });
215
216                 // Import existing ACL into the tags input fields.
217
218                 $group_allow_input.val().split(',').forEach(function (group_id) {
219                         $acl_allow_input.tagsinput('add', acl_groups.get('group-' + group_id)[0]);
220                 });
221                 $contact_allow_input.val().split(',').forEach(function (contact_id) {
222                         $acl_allow_input.tagsinput('add', acl_contacts.get('contact-' + contact_id)[0]);
223                 });
224                 $group_deny_input.val().split(',').forEach(function (group_id) {
225                         $acl_deny_input.tagsinput('add', acl_groups.get('group-' + group_id)[0]);
226                 });
227                 $contact_deny_input.val().split(',').forEach(function (contact_id) {
228                         $acl_deny_input.tagsinput('add', acl_contacts.get('contact-' + contact_id)[0]);
229                 });
230
231                 // Anti-duplicate callback + acl fields value generation
232
233                 $acl_allow_input.on('itemAdded itemRemoved', function (event) {
234                         if (event.type === 'itemAdded') {
235                                 // Removes duplicate in the opposite acl box
236                                 $acl_deny_input.tagsinput('remove', event.item);
237                         }
238
239                         // Update the real acl field
240                         $group_allow_input.val('');
241                         $contact_allow_input.val('');
242                         [].forEach.call($acl_allow_input.tagsinput('items'), function (item) {
243                                 if (item.type === 'group') {
244                                         $group_allow_input.val($group_allow_input.val() + ',' + item.id);
245                                 } else {
246                                         $contact_allow_input.val($contact_allow_input.val() + ',' + item.id);
247                                 }
248                         });
249                 });
250
251                 $acl_deny_input.on('itemAdded itemRemoved', function (event) {
252                         if (event.type === 'itemAdded') {
253                                 // Removes duplicate in the opposite acl box
254                                 $acl_allow_input.tagsinput('remove', event.item);
255                         }
256
257                         // Update the real acl field
258                         $group_deny_input.val('');
259                         $contact_deny_input.val('');
260                         [].forEach.call($acl_deny_input.tagsinput('items'), function (item) {
261                                 if (item.type === 'group') {
262                                         $group_deny_input.val($group_deny_input.val() + ',' + item.id);
263                                 } else {
264                                         $contact_deny_input.val($contact_deny_input.val() + ',' + item.id);
265                                 }
266                         });
267                 });
268         });
269 </script>