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}}
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">
16 <details class="profile-jot-net">
17 <summary>{{$jotnets_summary}}</summary>
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}}
28 {{if $jotnets_fields|count >= 3}}
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}}
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>
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}}">
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}}">
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}}" />
71 <div id="profile-jot-email-end-{{$input_group_id}}"></div>
74 <script type="text/javascript">
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}}');
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});
93 $visibility_public_radio.on('change', function (e) {
95 $visibility_public_panel.collapse('show');
98 $visibility_public_panel.prop('disabled', false);
99 $visibility_custom_panel.prop('disabled', true);
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');
107 $('#visibility-public-panel-{{$input_group_id}} .profile-jot-net input').attr('disabled', false);
110 $visibility_custom_radio.on('change', function(e) {
112 $visibility_custom_panel.collapse('show');
115 $visibility_public_panel.prop('disabled', true);
116 $visibility_custom_panel.prop('disabled', false);
118 $('#visibility-public-panel-{{$input_group_id}} .profile-jot-net input[type=checkbox]').each(function() {
119 // Saves current checkbox state
121 .attr('data-checked', $(this).prop('checked'))
122 .prop('checked', false);
124 $('#visibility-public-panel-{{$input_group_id}} .profile-jot-net input').attr('disabled', 'disabled');
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,
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,
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) {
148 } else if (itemA.name > itemB.name) {
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>';
161 $acl_allow_input.tagsinput({
162 confirmKeys: [13, 44],
164 tagClass: function(item) {
166 case 'group' : return 'label label-primary';
169 return 'label label-info';
172 itemValue: function (item) { return item.type + '-' + item.id.toString(); },
175 itemTitle: function(item) {
182 suggestion: suggestionTemplate
184 source: acl.ttAdapter()
190 confirmKeys: [13, 44],
192 tagClass: function(item) {
194 case 'group' : return 'label label-primary';
197 return 'label label-info';
200 itemValue: function (item) { return item.type + '-' + item.id.toString(); },
203 itemTitle: function(item) {
210 suggestion: suggestionTemplate
212 source: acl.ttAdapter()
216 // Import existing ACL into the tags input fields.
218 $group_allow_input.val().split(',').forEach(function (group_id) {
219 $acl_allow_input.tagsinput('add', acl_groups.get('group-' + group_id)[0]);
221 $contact_allow_input.val().split(',').forEach(function (contact_id) {
222 $acl_allow_input.tagsinput('add', acl_contacts.get('contact-' + contact_id)[0]);
224 $group_deny_input.val().split(',').forEach(function (group_id) {
225 $acl_deny_input.tagsinput('add', acl_groups.get('group-' + group_id)[0]);
227 $contact_deny_input.val().split(',').forEach(function (contact_id) {
228 $acl_deny_input.tagsinput('add', acl_contacts.get('contact-' + contact_id)[0]);
231 // Anti-duplicate callback + acl fields value generation
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);
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);
246 $contact_allow_input.val($contact_allow_input.val() + ',' + item.id);
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);
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);
264 $contact_deny_input.val($contact_deny_input.val() + ',' + item.id);