(function(){ function updateStatus(statusEl, result){ statusEl.removeClass('success error loading-small'); if (result && result.status === 'success' && result.data.message) { statusEl.addClass('success'); return true; } else { statusEl.addClass('error'); return false; } } function getSelection($row) { var values = $row.find('.applicableUsers').select2('val'); if (!values || values.length === 0) { values = ['all']; } return values; } function highlightBorder($element, highlight) { $element.toggleClass('warning-input', highlight); return highlight; } function highlightInput($input) { if ($input.attr('type') === 'text' || $input.attr('type') === 'password') { return highlightBorder($input, ($input.val() === '' && !$input.hasClass('optional'))); } } OC.MountConfig={ saveStorage:function($tr, callback) { var mountPoint = $tr.find('.mountPoint input').val(); var oldMountPoint = $tr.find('.mountPoint input').data('mountpoint'); if (mountPoint === '') { return false; } var statusSpan = $tr.find('.status span'); var backendClass = $tr.find('.backend').data('class'); var configuration = $tr.find('.configuration input'); var addMountPoint = true; if (configuration.length < 1) { return false; } var classOptions = {}; $.each(configuration, function(index, input) { if ($(input).val() === '' && !$(input).hasClass('optional')) { addMountPoint = false; return false; } if ($(input).is(':checkbox')) { if ($(input).is(':checked')) { classOptions[$(input).data('parameter')] = true; } else { classOptions[$(input).data('parameter')] = false; } } else { classOptions[$(input).data('parameter')] = $(input).val(); } }); if ($('#externalStorage').data('admin') === true) { var multiselect = getSelection($tr); } if (addMountPoint) { var status = false; if ($('#externalStorage').data('admin') === true) { var isPersonal = false; var oldGroups = $tr.find('.applicable').data('applicable-groups'); var oldUsers = $tr.find('.applicable').data('applicable-users'); var groups = []; var users = []; $.each(multiselect, function(index, value) { var pos = value.indexOf('(group)'); if (pos != -1) { var mountType = 'group'; var applicable = value.substr(0, pos); if ($.inArray(applicable, oldGroups) != -1) { oldGroups.splice($.inArray(applicable, oldGroups), 1); } groups.push(applicable); } else { var mountType = 'user'; var applicable = value; if ($.inArray(applicable, oldUsers) != -1) { oldUsers.splice($.inArray(applicable, oldUsers), 1); } users.push(applicable); } statusSpan.addClass('loading-small').removeClass('error success'); $.ajax({type: 'POST', url: OC.filePath('files_external', 'ajax', 'addMountPoint.php'), data: { mountPoint: mountPoint, 'class': backendClass, classOptions: classOptions, mountType: mountType, applicable: applicable, isPersonal: isPersonal, oldMountPoint: oldMountPoint }, success: function(result) { $tr.find('.mountPoint input').data('mountpoint', mountPoint); status = updateStatus(statusSpan, result); if (callback) { callback(status); } }, error: function(result){ status = updateStatus(statusSpan, result); if (callback) { callback(status); } } }); }); $tr.find('.applicable').data('applicable-groups', groups); $tr.find('.applicable').data('applicable-users', users); var mountType = 'group'; $.each(oldGroups, function(index, applicable) { $.ajax({type: 'POST', url: OC.filePath('files_external', 'ajax', 'removeMountPoint.php'), data: { mountPoint: mountPoint, 'class': backendClass, classOptions: classOptions, mountType: mountType, applicable: applicable, isPersonal: isPersonal } }); }); var mountType = 'user'; $.each(oldUsers, function(index, applicable) { $.ajax({type: 'POST', url: OC.filePath('files_external', 'ajax', 'removeMountPoint.php'), data: { mountPoint: mountPoint, 'class': backendClass, classOptions: classOptions, mountType: mountType, applicable: applicable, isPersonal: isPersonal } }); }); } else { var isPersonal = true; var mountType = 'user'; var applicable = OC.currentUser; statusSpan.addClass('loading-small').removeClass('error success'); $.ajax({type: 'POST', url: OC.filePath('files_external', 'ajax', 'addMountPoint.php'), data: { mountPoint: mountPoint, 'class': backendClass, classOptions: classOptions, mountType: mountType, applicable: applicable, isPersonal: isPersonal, oldMountPoint: oldMountPoint }, success: function(result) { $tr.find('.mountPoint input').data('mountpoint', mountPoint); status = updateStatus(statusSpan, result); if (callback) { callback(status); } }, error: function(result){ status = updateStatus(statusSpan, result); if (callback) { callback(status); } } }); } return status; } } }; $(document).ready(function() { var $externalStorage = $('#externalStorage'); //initialize hidden input field with list of users and groups $externalStorage.find('tr:not(#addMountPoint)').each(function(i,tr) { var $tr = $(tr); var $applicable = $tr.find('.applicable'); if ($applicable.length > 0) { var groups = $applicable.data('applicable-groups'); var groupsId = []; $.each(groups, function () { groupsId.push(this + '(group)'); }); var users = $applicable.data('applicable-users'); if (users.indexOf('all') > -1) { $tr.find('.applicableUsers').val(''); } else { $tr.find('.applicableUsers').val(groupsId.concat(users).join(',')); } } }); var userListLimit = 30; function addSelect2 ($elements) { if ($elements.length > 0) { $elements.select2({ placeholder: t('files_external', 'All users. Type to select user or group.'), allowClear: true, multiple: true, //minimumInputLength: 1, ajax: { url: OC.generateUrl('apps/files_external/applicable'), dataType: 'json', quietMillis: 100, data: function (term, page) { // page is the one-based page number tracked by Select2 return { pattern: term, //search term limit: userListLimit, // page size offset: userListLimit*(page-1) // page number starts with 0 }; }, results: function (data, page) { if (data.status === 'success') { var results = []; var userCount = 0; // users is an object // add groups $.each(data.groups, function(i, group) { results.push({name:group+'(group)', displayname:group, type:'group' }); }); // add users $.each(data.users, function(id, user) { userCount++; results.push({name:id, displayname:user, type:'user' }); }); var more = (userCount >= userListLimit) || (data.groups.length >= userListLimit); return {results: results, more: more}; } else { //FIXME add error handling } } }, initSelection: function(element, callback) { var users = {}; users['users'] = []; var toSplit = element.val().split(","); for (var i = 0; i < toSplit.length; i++) { users['users'].push(toSplit[i]); } $.ajax(OC.generateUrl('displaynames'), { type: 'POST', contentType: 'application/json', data: JSON.stringify(users), dataType: 'json' }).done(function(data) { var results = []; if (data.status === 'success') { $.each(data.users, function(user, displayname) { if (displayname !== false) { results.push({name:user, displayname:displayname, type:'user'}); } }); callback(results); } else { //FIXME add error handling } }); }, id: function(element) { return element.name; }, formatResult: function (element) { var $result = $('
'+escapeHTML(element.displayname)+''); var $div = $result.find('.avatardiv') .attr('data-type', element.type) .attr('data-name', element.name) .attr('data-displayname', element.displayname); if (element.type === 'group') { var url = OC.imagePath('core','places/contacts-dark'); // TODO better group icon $div.html(''); } return $result.get(0).outerHTML; }, formatSelection: function (element) { if (element.type === 'group') { return ''+escapeHTML(element.displayname+' '+t('files_external', '(group)'))+''; } else { return ''+escapeHTML(element.displayname)+''; } }, escapeMarkup: function (m) { return m; } // we escape the markup in formatResult and formatSelection }).on('select2-loaded', function() { $.each($('.avatardiv'), function(i, div) { var $div = $(div); if ($div.data('type') === 'user') { $div.avatar($div.data('name'),32); } }) }); } } addSelect2($('tr:not(#addMountPoint) .applicableUsers')); $externalStorage.on('change', '#selectBackend', function() { var $tr = $(this).closest('tr'); $externalStorage.find('tbody').append($tr.clone()); $externalStorage.find('tbody tr').last().find('.mountPoint input').val(''); var selected = $(this).find('option:selected').text(); var backendClass = $(this).val(); $tr.find('.backend').text(selected); if ($tr.find('.mountPoint input').val() === '') { $tr.find('.mountPoint input').val(suggestMountPoint(selected)); } $tr.addClass(backendClass); $tr.find('.status').append(''); $tr.find('.backend').data('class', backendClass); var configurations = $(this).data('configurations'); var $td = $tr.find('td.configuration'); $.each(configurations, function(backend, parameters) { if (backend === backendClass) { $.each(parameters['configuration'], function(parameter, placeholder) { var is_optional = false; if (placeholder.indexOf('&') === 0) { is_optional = true; placeholder = placeholder.substring(1); } var newElement; if (placeholder.indexOf('*') === 0) { var class_string = is_optional ? ' optional' : ''; newElement = $(''); } else if (placeholder.indexOf('!') === 0) { newElement = $(''); } else if (placeholder.indexOf('#') === 0) { newElement = $(''); } else { var class_string = is_optional ? ' optional' : ''; newElement = $(''); } highlightInput(newElement); $td.append(newElement); }); if (parameters['custom'] && $externalStorage.find('tbody tr.'+backendClass.replace(/\\/g, '\\\\')).length === 1) { OC.addScript('files_external', parameters['custom']); } $td.children().not('[type=hidden]').first().focus(); return false; } }); $tr.find('td').last().attr('class', 'remove'); $tr.find('td').last().removeAttr('style'); $tr.removeAttr('id'); $(this).remove(); addSelect2($tr.find('.applicableUsers')); }); function suggestMountPoint(defaultMountPoint) { var pos = defaultMountPoint.indexOf('/'); if (pos !== -1) { defaultMountPoint = defaultMountPoint.substring(0, pos); } defaultMountPoint = defaultMountPoint.replace(/\s+/g, ''); var i = 1; var append = ''; var match = true; while (match && i < 20) { match = false; $externalStorage.find('tbody td.mountPoint input').each(function(index, mountPoint) { if ($(mountPoint).val() === defaultMountPoint+append) { match = true; return false; } }); if (match) { append = i; i++; } else { break; } } return defaultMountPoint+append; } $externalStorage.on('paste', 'td input', function() { var $me = $(this); var $tr = $me.closest('tr'); setTimeout(function() { highlightInput($me); OC.MountConfig.saveStorage($tr); }, 20); }); var timer; $externalStorage.on('keyup', 'td input', function() { clearTimeout(timer); var $tr = $(this).closest('tr'); highlightInput($(this)); if ($(this).val) { timer = setTimeout(function() { OC.MountConfig.saveStorage($tr); }, 2000); } }); $externalStorage.on('change', 'td input:checkbox', function() { OC.MountConfig.saveStorage($(this).closest('tr')); }); $externalStorage.on('change', '.applicable', function() { OC.MountConfig.saveStorage($(this).closest('tr')); }); $externalStorage.on('click', '.status>span', function() { OC.MountConfig.saveStorage($(this).closest('tr')); }); $('#sslCertificate').on('click', 'td.remove>img', function() { var $tr = $(this).closest('tr'); $.post(OC.filePath('files_external', 'ajax', 'removeRootCertificate.php'), {cert: $tr.attr('id')}); $tr.remove(); return true; }); $externalStorage.on('click', 'td.remove>img', function() { var $tr = $(this).closest('tr'); var mountPoint = $tr.find('.mountPoint input').val(); if ($externalStorage.data('admin') === true) { var isPersonal = false; var multiselect = getSelection($tr); $.each(multiselect, function(index, value) { var pos = value.indexOf('(group)'); if (pos != -1) { var mountType = 'group'; var applicable = value.substr(0, pos); } else { var mountType = 'user'; var applicable = value; } $.post(OC.filePath('files_external', 'ajax', 'removeMountPoint.php'), { mountPoint: mountPoint, mountType: mountType, applicable: applicable, isPersonal: isPersonal }); }); } else { var mountType = 'user'; var applicable = OC.currentUser; var isPersonal = true; $.post(OC.filePath('files_external', 'ajax', 'removeMountPoint.php'), { mountPoint: mountPoint, mountType: mountType, applicable: applicable, isPersonal: isPersonal }); } $tr.remove(); }); var $allowUserMounting = $('#allowUserMounting'); $allowUserMounting.bind('change', function() { OC.msg.startSaving('#userMountingMsg'); if (this.checked) { OC.AppConfig.setValue('files_external', 'allow_user_mounting', 'yes'); $('input[name="allowUserMountingBackends\\[\\]"]').prop('checked', true); $('#userMountingBackends').removeClass('hidden'); $('input[name="allowUserMountingBackends\\[\\]"]').eq(0).trigger('change'); } else { OC.AppConfig.setValue('files_external', 'allow_user_mounting', 'no'); $('#userMountingBackends').addClass('hidden'); } OC.msg.finishedSaving('#userMountingMsg', {status: 'success', data: {message: t('files_external', 'Saved')}}); }); $('input[name="allowUserMountingBackends\\[\\]"]').bind('change', function() { OC.msg.startSaving('#userMountingMsg'); var userMountingBackends = $('input[name="allowUserMountingBackends\\[\\]"]:checked').map(function(){return $(this).val();}).get(); OC.AppConfig.setValue('files_external', 'user_mounting_backends', userMountingBackends.join()); OC.msg.finishedSaving('#userMountingMsg', {status: 'success', data: {message: t('files_external', 'Saved')}}); // disable allowUserMounting if(userMountingBackends.length === 0) { $allowUserMounting.prop('checked', false); $allowUserMounting.trigger('change'); } }); }); })();