]> git.mxchange.org Git - friendica.git/blob - view/templates/item/compose-footer.tpl
Update linkPreview to allow using a generic selector
[friendica.git] / view / templates / item / compose-footer.tpl
1 <script type="text/javascript">
2         function updateLocationButtonDisplay(location_button, location_input)
3         {
4                 location_button.classList.remove('btn-primary');
5                 if (location_input.value) {
6                         location_button.disabled = false;
7                         location_button.classList.add('btn-primary');
8                         location_button.title = location_button.dataset.titleClear;
9                 } else if (!"geolocation" in navigator) {
10                         location_button.disabled = true;
11                         location_button.title = location_button.dataset.titleUnavailable;
12                 } else if (location_button.disabled) {
13                         location_button.title = location_button.dataset.titleDisabled;
14                 } else {
15                         location_button.title = location_button.dataset.titleSet;
16                 }
17         }
18
19         $(function() {
20                 // Jot attachment live preview.
21                 let $textarea = $('#comment-edit-text-0');
22                 $textarea.linkPreview();
23                 $textarea.keyup(function(){
24                         var textlen = $(this).val().length;
25                         $('#character-counter').text(textlen);
26                 });
27                 $textarea.editor_autocomplete(baseurl + '/search/acl');
28                 $textarea.bbco_autocomplete('bbcode');
29
30                 let $acl_allow_input = $('#acl_allow');
31                 let $group_allow_input = $('[name=group_allow]');
32                 let $contact_allow_input = $('[name=contact_allow]');
33                 let $acl_deny_input = $('#acl_deny');
34                 let $group_deny_input = $('[name=group_deny]');
35                 let $contact_deny_input = $('[name=contact_deny]');
36
37                 // Visibility accordion
38
39                 // Prevents open panel to collapse
40                 // @see https://stackoverflow.com/a/43593116
41                 $('[data-toggle="collapse"]').click(function(e) {
42                         target = $(this).attr('href');
43                         if ($(target).hasClass('in')) {
44                                 e.preventDefault(); // to stop the page jump to the anchor target.
45                                 e.stopPropagation()
46                         }
47                 });
48                 // Accessibility: enable space and enter to open a panel when focused
49                 $('body').on('keyup', '[data-toggle="collapse"]:focus', function (e) {
50                         if (e.key === ' ' || e.key === 'Enter') {
51                                 $(this).click();
52                                 e.preventDefault();
53                                 e.stopPropagation();
54                         }
55                 });
56
57                 $('#visibility-public-panel').on('show.bs.collapse', function() {
58                         $('#visibility-public').prop('checked', true);
59                         $group_allow_input.prop('disabled', true);
60                         $contact_allow_input.prop('disabled', true);
61                         $group_deny_input.prop('disabled', true);
62                         $contact_deny_input.prop('disabled', true);
63
64                         $('.profile-jot-net input[type=checkbox]').each(function() {
65                                 // Restores checkbox state if it had been saved
66                                 if ($(this).attr('data-checked') !== undefined) {
67                                         $(this).prop('checked', $(this).attr('data-checked') === 'true');
68                                 }
69                         });
70                         $('.profile-jot-net input').attr('disabled', false);
71                 });
72
73                 $('#visibility-custom-panel').on('show.bs.collapse', function() {
74                         $('#visibility-custom').prop('checked', true);
75                         $group_allow_input.prop('disabled', false);
76                         $contact_allow_input.prop('disabled', false);
77                         $group_deny_input.prop('disabled', false);
78                         $contact_deny_input.prop('disabled', false);
79
80                         $('.profile-jot-net input[type=checkbox]').each(function() {
81                                 // Saves current checkbox state
82                                 $(this)
83                                         .attr('data-checked', $(this).prop('checked'))
84                                         .prop('checked', false);
85                         });
86                         $('.profile-jot-net input').attr('disabled', 'disabled');
87                 });
88
89                 if (document.querySelector('input[name="visibility"]:checked').value === 'custom') {
90                         $('#visibility-custom-panel').collapse({parent: '#visibility-accordion'});
91                 }
92
93                 // Custom visibility tags inputs
94
95                 let acl_groups = new Bloodhound({
96                         local: {{$acl_groups|@json_encode nofilter}},
97                         identify: function(obj) { return obj.id; },
98                         datumTokenizer: Bloodhound.tokenizers.obj.whitespace(['name']),
99                         queryTokenizer: Bloodhound.tokenizers.whitespace,
100                 });
101                 let acl_contacts = new Bloodhound({
102                         local: {{$acl_contacts|@json_encode nofilter}},
103                         identify: function(obj) { return obj.id; },
104                         datumTokenizer: Bloodhound.tokenizers.obj.whitespace(['name', 'addr']),
105                         queryTokenizer: Bloodhound.tokenizers.whitespace,
106                 });
107                 let acl = new Bloodhound({
108                         local: {{$acl|@json_encode nofilter}},
109                         identify: function(obj) { return obj.id; },
110                         datumTokenizer: Bloodhound.tokenizers.obj.whitespace(['name', 'addr']),
111                         queryTokenizer: Bloodhound.tokenizers.whitespace,
112                 });
113                 acl.initialize();
114
115                 let suggestionTemplate = function (item) {
116                         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>';
117                 };
118
119                 $acl_allow_input.tagsinput({
120                         confirmKeys: [13, 44],
121                         freeInput: false,
122                         tagClass: function(item) {
123                                 switch (item.type) {
124                                         case 'group'   : return 'label label-primary';
125                                         case 'contact'  :
126                                         default:
127                                                 return 'label label-info';
128                                 }
129                         },
130                         itemValue: 'id',
131                         itemText: 'name',
132                         itemThumb: 'micro',
133                         itemTitle: function(item) {
134                                 return item.addr;
135                         },
136                         typeaheadjs: {
137                                 name: 'contacts',
138                                 displayKey: 'name',
139                                 templates: {
140                                         suggestion: suggestionTemplate
141                                 },
142                                 source: acl.ttAdapter()
143                         }
144                 });
145
146                 $acl_deny_input
147                 .tagsinput({
148                         confirmKeys: [13, 44],
149                         freeInput: false,
150                         tagClass: function(item) {
151                                 switch (item.type) {
152                                         case 'group'   : return 'label label-primary';
153                                         case 'contact'  :
154                                         default:
155                                                 return 'label label-info';
156                                 }
157                         },
158                         itemValue: 'id',
159                         itemText: 'name',
160                         itemThumb: 'micro',
161                         itemTitle: function(item) {
162                                 return item.addr;
163                         },
164                         typeaheadjs: {
165                                 name: 'contacts',
166                                 displayKey: 'name',
167                                 templates: {
168                                         suggestion: suggestionTemplate
169                                 },
170                                 source: acl.ttAdapter()
171                         }
172                 });
173
174                 // Import existing ACL into the tags input fields.
175
176                 $group_allow_input.val().split(',').forEach(function (val) {
177                         $acl_allow_input.tagsinput('add', acl_groups.get(val)[0]);
178                 });
179                 $contact_allow_input.val().split(',').forEach(function (val) {
180                         $acl_allow_input.tagsinput('add', acl_contacts.get(val)[0]);
181                 });
182                 $group_deny_input.val().split(',').forEach(function (val) {
183                         $acl_deny_input.tagsinput('add', acl_groups.get(val)[0]);
184                 });
185                 $contact_deny_input.val().split(',').forEach(function (val) {
186                         $acl_deny_input.tagsinput('add', acl_contacts.get(val)[0]);
187                 });
188
189                 // Anti-duplicate callback + acl fields value generation
190
191                 $acl_allow_input.on('itemAdded', function (event) {
192                         // Removes duplicate in the opposite acl box
193                         $acl_deny_input.tagsinput('remove', event.item);
194
195                         // Update the real acl field
196                         $group_allow_input.val('');
197                         $contact_allow_input.val('');
198                         [].forEach.call($acl_allow_input.tagsinput('items'), function (item) {
199                                 if (item.type === 'group') {
200                                         $group_allow_input.val($group_allow_input.val() + '<' + item.id + '>');
201                                 } else {
202                                         $contact_allow_input.val($contact_allow_input.val() + '<' + item.id + '>');
203                                 }
204                         });
205                 });
206
207                 $acl_deny_input.on('itemAdded', function (event) {
208                         // Removes duplicate in the opposite acl box
209                         $acl_allow_input.tagsinput('remove', event.item);
210
211                         // Update the real acl field
212                         $group_deny_input.val('');
213                         $contact_deny_input.val('');
214                         [].forEach.call($acl_deny_input.tagsinput('items'), function (item) {
215                                 if (item.type === 'group') {
216                                         $group_deny_input.val($group_allow_input.val() + '<' + item.id + '>');
217                                 } else {
218                                         $contact_deny_input.val($contact_allow_input.val() + '<' + item.id + '>');
219                                 }
220                         });
221                 });
222
223                 let location_button = document.getElementById('profile-location');
224                 let location_input = document.getElementById('jot-location');
225
226                 updateLocationButtonDisplay(location_button, location_input);
227
228                 location_input.addEventListener('change', function () {
229                         updateLocationButtonDisplay(location_button, location_input);
230                 });
231                 location_input.addEventListener('keyup', function () {
232                         updateLocationButtonDisplay(location_button, location_input);
233                 });
234
235                 location_button.addEventListener('click', function() {
236                         if (location_input.value) {
237                                 location_input.value = '';
238                                 updateLocationButtonDisplay(location_button, location_input);
239                         } else if ("geolocation" in navigator) {
240                                 navigator.geolocation.getCurrentPosition(function(position) {
241                                         location_input.value = position.coords.latitude + ', ' + position.coords.longitude;
242                                         updateLocationButtonDisplay(location_button, location_input);
243                                 }, function (error) {
244                                         location_button.disabled = true;
245                                         updateLocationButtonDisplay(location_button, location_input);
246                                 });
247                         }
248                 });
249         })
250 </script>