2 <div class="panel-group" id="visibility-accordion" 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" aria-expanded="{{if $visibility == 'public'}}true{{else}}false{{/if}}">
5 <input type="radio" name="visibility" id="visibility-public" value="public" tabindex="14" {{if $visibility == 'public'}}checked{{/if}}>
6 <i class="fa fa-globe"></i> {{$public_title}}
8 <fieldset id="visibility-public-panel" class="panel-collapse collapse{{if $visibility == 'public'}} in{{/if}}" role="tabpanel" aria-labelledby="visibility-public-heading" {{if $visibility != 'public'}}disabled{{/if}}>
9 <div class="panel-body">
10 <p>{{$public_desc}}</p>
11 {{if $for_federation}}
13 <h4>{{$jotnets_summary}}</h4>
14 {{$jotnets_disabled_label}}
15 {{elseif $jotnets_fields}}
16 {{if $jotnets_fields|count < 3}}
17 <div class="profile-jot-net">
19 <details class="profile-jot-net">
20 <summary>{{$jotnets_summary}}</summary>
23 {{foreach $jotnets_fields as $jotnets_field}}
24 {{if $jotnets_field.type == 'checkbox'}}
25 {{include file="field_checkbox.tpl" field=$jotnets_field.field}}
26 {{elseif $jotnets_field.type == 'select'}}
27 {{include file="field_select.tpl" field=$jotnets_field.field}}
31 {{if $jotnets_fields|count >= 3}}
41 <div class="panel panel-info">
42 <label class="panel-heading{{if $visibility != 'custom'}} collapsed{{/if}}" id="visibility-custom-heading" aria-expanded="{{if $visibility == 'custom'}}true{{else}}false{{/if}}">
43 <input type="radio" name="visibility" id="visibility-custom" value="custom" tabindex="15" {{if $visibility == 'custom'}}checked{{/if}}>
44 <i class="fa fa-lock"></i> {{$custom_title}}
46 <fieldset id="visibility-custom-panel" class="panel-collapse collapse{{if $visibility == 'custom'}} in{{/if}}" role="tabpanel" aria-labelledby="visibility-custom-heading" {{if $visibility != 'custom'}}disabled{{/if}}>
47 <input type="hidden" name="group_allow" value="{{$group_allow}}"/>
48 <input type="hidden" name="contact_allow" value="{{$contact_allow}}"/>
49 <input type="hidden" name="group_deny" value="{{$group_deny}}"/>
50 <input type="hidden" name="contact_deny" value="{{$contact_deny}}"/>
51 <div class="panel-body">
52 <p>{{$custom_desc}}</p>
54 <div class="form-group">
55 <label for="acl_allow">{{$allow_label}}</label>
56 <input type="text" class="form-control input-lg" id="acl_allow">
59 <div class="form-group">
60 <label for="acl_deny">{{$deny_label}}</label>
61 <input type="text" class="form-control input-lg" id="acl_deny">
69 {{if $for_federation}}
70 <div class="form-group">
71 <label for="profile-jot-email" id="profile-jot-email-label">{{$emailcc}}</label>
72 <input type="text" name="emailcc" id="profile-jot-email" class="form-control" title="{{$emtitle}}" />
74 <div id="profile-jot-email-end"></div>
77 <script type="text/javascript">
79 let $acl_allow_input = $('#acl_allow');
80 let $contact_allow_input = $('[name=contact_allow]');
81 let $group_allow_input = $('[name=group_allow]');
82 let $acl_deny_input = $('#acl_deny');
83 let $contact_deny_input = $('[name=contact_deny]');
84 let $group_deny_input = $('[name=group_deny]');
85 let $visibility_public_panel = $('#visibility-public-panel');
86 let $visibility_custom_panel = $('#visibility-custom-panel');
87 let $visibility_public_radio = $('#visibility-public');
88 let $visibility_custom_radio = $('#visibility-custom');
92 $visibility_public_panel.collapse({parent: '#visibility-accordion', toggle: false});
93 $visibility_custom_panel.collapse({parent: '#visibility-accordion', toggle: false});
96 $visibility_public_radio.on('change', function (e) {
98 $visibility_public_panel.collapse('show');
101 $visibility_public_panel.prop('disabled', false);
102 $visibility_custom_panel.prop('disabled', true);
104 $('.profile-jot-net input[type=checkbox]').each(function() {
105 // Restores checkbox state if it had been saved
106 if ($(this).attr('data-checked') !== undefined) {
107 $(this).prop('checked', $(this).attr('data-checked') === 'true');
110 $('.profile-jot-net input').attr('disabled', false);
113 $visibility_custom_radio.on('change', function(e) {
115 $visibility_custom_panel.collapse('show');
118 $visibility_public_panel.prop('disabled', true);
119 $visibility_custom_panel.prop('disabled', false);
121 $('.profile-jot-net input[type=checkbox]').each(function() {
122 // Saves current checkbox state
124 .attr('data-checked', $(this).prop('checked'))
125 .prop('checked', false);
127 $('.profile-jot-net input').attr('disabled', 'disabled');
130 // Custom visibility tags inputs
131 let acl_groups = new Bloodhound({
132 local: {{$acl_groups|@json_encode nofilter}},
133 identify: function(obj) { return obj.type + '-' + obj.id.toString(); },
134 datumTokenizer: Bloodhound.tokenizers.obj.whitespace(['name']),
135 queryTokenizer: Bloodhound.tokenizers.whitespace,
137 let acl_contacts = new Bloodhound({
138 local: {{$acl_contacts|@json_encode nofilter}},
139 identify: function(obj) { return obj.type + '-' + obj.id.toString(); },
140 datumTokenizer: Bloodhound.tokenizers.obj.whitespace(['name', 'addr']),
141 queryTokenizer: Bloodhound.tokenizers.whitespace,
143 let acl = new Bloodhound({
144 local: {{$acl_list|@json_encode nofilter}},
145 identify: function(obj) { return obj.type + '-' + obj.id.toString(); },
146 datumTokenizer: Bloodhound.tokenizers.obj.whitespace(['name', 'addr']),
147 queryTokenizer: Bloodhound.tokenizers.whitespace,
148 sorter: function (itemA, itemB) {
149 if (itemA.name === itemB.name) {
151 } else if (itemA.name > itemB.name) {
160 let suggestionTemplate = function (item) {
161 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>';
164 $acl_allow_input.tagsinput({
165 confirmKeys: [13, 44],
167 tagClass: function(item) {
169 case 'group' : return 'label label-primary';
172 return 'label label-info';
175 itemValue: function (item) { return item.type + '-' + item.id.toString(); },
178 itemTitle: function(item) {
185 suggestion: suggestionTemplate
187 source: acl.ttAdapter()
193 confirmKeys: [13, 44],
195 tagClass: function(item) {
197 case 'group' : return 'label label-primary';
200 return 'label label-info';
203 itemValue: function (item) { return item.type + '-' + item.id.toString(); },
206 itemTitle: function(item) {
213 suggestion: suggestionTemplate
215 source: acl.ttAdapter()
219 // Import existing ACL into the tags input fields.
221 $group_allow_input.val().split(',').forEach(function (group_id) {
222 $acl_allow_input.tagsinput('add', acl_groups.get('group-' + group_id)[0]);
224 $contact_allow_input.val().split(',').forEach(function (contact_id) {
225 $acl_allow_input.tagsinput('add', acl_contacts.get('contact-' + contact_id)[0]);
227 $group_deny_input.val().split(',').forEach(function (group_id) {
228 $acl_deny_input.tagsinput('add', acl_groups.get('group-' + group_id)[0]);
230 $contact_deny_input.val().split(',').forEach(function (contact_id) {
231 $acl_deny_input.tagsinput('add', acl_contacts.get('contact-' + contact_id)[0]);
234 // Anti-duplicate callback + acl fields value generation
236 $acl_allow_input.on('itemAdded', function (event) {
237 // Removes duplicate in the opposite acl box
238 $acl_deny_input.tagsinput('remove', event.item);
240 // Update the real acl field
241 $group_allow_input.val('');
242 $contact_allow_input.val('');
243 [].forEach.call($acl_allow_input.tagsinput('items'), function (item) {
244 if (item.type === 'group') {
245 $group_allow_input.val($group_allow_input.val() + ',' + item.id);
247 $contact_allow_input.val($contact_allow_input.val() + ',' + item.id);
252 $acl_deny_input.on('itemAdded', function (event) {
253 // Removes duplicate in the opposite acl box
254 $acl_allow_input.tagsinput('remove', event.item);
256 // Update the real acl field
257 $group_deny_input.val('');
258 $contact_deny_input.val('');
259 [].forEach.call($acl_deny_input.tagsinput('items'), function (item) {
260 if (item.type === 'group') {
261 $group_deny_input.val($group_allow_input.val() + ',' + item.id);
263 $contact_deny_input.val($contact_allow_input.val() + ',' + item.id);