2 <div class="panel-group" id="visibility-accordion" role="tablist" aria-multiselectable="true">
3 <div class="panel panel-success">
4 <div class="panel-heading{{if $visibility != 'public'}} collapsed{{/if}}" id="visibility-public-heading" aria-expanded="{{if $visibility == 'public'}}true{{else}}false{{/if}}">
6 <input type="radio" name="visibility" id="visibility-public" value="public" tabindex="14" {{if $visibility == 'public'}}checked{{/if}}>
7 <i class="fa fa-globe"></i> {{$public_title}}
10 <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}}>
11 <div class="panel-body">
12 <p>{{$public_desc}}</p>
13 {{if $for_federation}}
15 <h4>{{$jotnets_summary}}</h4>
16 {{$jotnets_disabled_label}}
17 {{elseif $jotnets_fields}}
18 {{if $jotnets_fields|count < 3}}
19 <div class="profile-jot-net">
21 <details class="profile-jot-net">
22 <summary>{{$jotnets_summary}}</summary>
25 {{foreach $jotnets_fields as $jotnets_field}}
26 {{if $jotnets_field.type == 'checkbox'}}
27 {{include file="field_checkbox.tpl" field=$jotnets_field.field}}
28 {{elseif $jotnets_field.type == 'select'}}
29 {{include file="field_select.tpl" field=$jotnets_field.field}}
33 {{if $jotnets_fields|count >= 3}}
43 <div class="panel panel-info">
44 <div class="panel-heading{{if $visibility != 'custom'}} collapsed{{/if}}" id="visibility-custom-heading" aria-expanded="{{if $visibility == 'custom'}}true{{else}}false{{/if}}">
46 <input type="radio" name="visibility" id="visibility-custom" value="custom" tabindex="15" {{if $visibility == 'custom'}}checked{{/if}}>
47 <i class="fa fa-lock"></i> {{$custom_title}}
50 <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}}>
51 <input type="hidden" name="group_allow" value="{{$group_allow}}"/>
52 <input type="hidden" name="contact_allow" value="{{$contact_allow}}"/>
53 <input type="hidden" name="group_deny" value="{{$group_deny}}"/>
54 <input type="hidden" name="contact_deny" value="{{$contact_deny}}"/>
55 <div class="panel-body">
56 <p>{{$custom_desc}}</p>
58 <div class="form-group">
59 <label for="acl_allow">{{$allow_label}}</label>
60 <input type="text" class="form-control input-lg" id="acl_allow">
63 <div class="form-group">
64 <label for="acl_deny">{{$deny_label}}</label>
65 <input type="text" class="form-control input-lg" id="acl_deny">
73 {{if $for_federation}}
74 <div class="form-group">
75 <label for="profile-jot-email" id="profile-jot-email-label">{{$emailcc}}</label>
76 <input type="text" name="emailcc" id="profile-jot-email" class="form-control" title="{{$emtitle}}" />
78 <div id="profile-jot-email-end"></div>
81 <script type="text/javascript">
83 let $acl_allow_input = $('#acl_allow');
84 let $contact_allow_input = $('[name=contact_allow]');
85 let $group_allow_input = $('[name=group_allow]');
86 let $acl_deny_input = $('#acl_deny');
87 let $contact_deny_input = $('[name=contact_deny]');
88 let $group_deny_input = $('[name=group_deny]');
89 let $visibility_public_panel = $('#visibility-public-panel');
90 let $visibility_custom_panel = $('#visibility-custom-panel');
91 let $visibility_public_radio = $('#visibility-public');
92 let $visibility_custom_radio = $('#visibility-custom');
96 $visibility_public_panel.collapse({parent: '#visibility-accordion', toggle: false});
97 $visibility_custom_panel.collapse({parent: '#visibility-accordion', toggle: false});
100 $visibility_public_radio.on('change', function (e) {
102 $visibility_public_panel.collapse('show');
105 $visibility_public_panel.prop('disabled', false);
106 $visibility_custom_panel.prop('disabled', true);
108 $('.profile-jot-net input[type=checkbox]').each(function() {
109 // Restores checkbox state if it had been saved
110 if ($(this).attr('data-checked') !== undefined) {
111 $(this).prop('checked', $(this).attr('data-checked') === 'true');
114 $('.profile-jot-net input').attr('disabled', false);
117 $visibility_custom_radio.on('change', function(e) {
119 $visibility_custom_panel.collapse('show');
122 $visibility_public_panel.prop('disabled', true);
123 $visibility_custom_panel.prop('disabled', false);
125 $('.profile-jot-net input[type=checkbox]').each(function() {
126 // Saves current checkbox state
128 .attr('data-checked', $(this).prop('checked'))
129 .prop('checked', false);
131 $('.profile-jot-net input').attr('disabled', 'disabled');
134 // Custom visibility tags inputs
135 let acl_groups = new Bloodhound({
136 local: {{$acl_groups|@json_encode nofilter}},
137 identify: function(obj) { return obj.id; },
138 datumTokenizer: Bloodhound.tokenizers.obj.whitespace(['name']),
139 queryTokenizer: Bloodhound.tokenizers.whitespace,
141 let acl_contacts = new Bloodhound({
142 local: {{$acl_contacts|@json_encode nofilter}},
143 identify: function(obj) { return obj.id; },
144 datumTokenizer: Bloodhound.tokenizers.obj.whitespace(['name', 'addr']),
145 queryTokenizer: Bloodhound.tokenizers.whitespace,
147 let acl = new Bloodhound({
148 local: {{$acl_list|@json_encode nofilter}},
149 identify: function(obj) { return obj.id; },
150 datumTokenizer: Bloodhound.tokenizers.obj.whitespace(['name', 'addr']),
151 queryTokenizer: Bloodhound.tokenizers.whitespace,
155 let suggestionTemplate = function (item) {
156 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 $acl_allow_input.tagsinput({
160 confirmKeys: [13, 44],
162 tagClass: function(item) {
164 case 'group' : return 'label label-primary';
167 return 'label label-info';
173 itemTitle: function(item) {
180 suggestion: suggestionTemplate
182 source: acl.ttAdapter()
188 confirmKeys: [13, 44],
190 tagClass: function(item) {
192 case 'group' : return 'label label-primary';
195 return 'label label-info';
201 itemTitle: function(item) {
208 suggestion: suggestionTemplate
210 source: acl.ttAdapter()
214 // Import existing ACL into the tags input fields.
216 $group_allow_input.val().split(',').forEach(function (val) {
217 $acl_allow_input.tagsinput('add', acl_groups.get(val)[0]);
219 $contact_allow_input.val().split(',').forEach(function (val) {
220 $acl_allow_input.tagsinput('add', acl_contacts.get(val)[0]);
222 $group_deny_input.val().split(',').forEach(function (val) {
223 $acl_deny_input.tagsinput('add', acl_groups.get(val)[0]);
225 $contact_deny_input.val().split(',').forEach(function (val) {
226 $acl_deny_input.tagsinput('add', acl_contacts.get(val)[0]);
229 // Anti-duplicate callback + acl fields value generation
231 $acl_allow_input.on('itemAdded', function (event) {
232 // Removes duplicate in the opposite acl box
233 $acl_deny_input.tagsinput('remove', event.item);
235 // Update the real acl field
236 $group_allow_input.val('');
237 $contact_allow_input.val('');
238 [].forEach.call($acl_allow_input.tagsinput('items'), function (item) {
239 if (item.type === 'group') {
240 $group_allow_input.val($group_allow_input.val() + ',' + item.id);
242 $contact_allow_input.val($contact_allow_input.val() + ',' + item.id);
247 $acl_deny_input.on('itemAdded', function (event) {
248 // Removes duplicate in the opposite acl box
249 $acl_allow_input.tagsinput('remove', event.item);
251 // Update the real acl field
252 $group_deny_input.val('');
253 $contact_deny_input.val('');
254 [].forEach.call($acl_deny_input.tagsinput('items'), function (item) {
255 if (item.type === 'group') {
256 $group_deny_input.val($group_allow_input.val() + ',' + item.id);
258 $contact_deny_input.val($contact_allow_input.val() + ',' + item.id);