mirror of https://github.com/nextcloud/server.git
Cleanup admin settings js files
* Move admin.js to webpack, so that this use the bundled jquery files instead of the deprecated window.$ Also fixing formatting * Remove log.js that seems to be from a time where logreader was bundled with server and I couldn't find an usage of it anymore * Fix recent regression in rebuild navigation function (now not depending on jquery anymore and bundled by webpack). Signed-off-by: Carl Schwan <carl@carlschwan.eu>pull/31116/head
parent
f5d1365bbd
commit
7c8a901b84
@ -1,333 +0,0 @@
|
|||||||
window.addEventListener('DOMContentLoaded', function(){
|
|
||||||
$('#excludedGroups,#linksExcludedGroups').each(function (index, element) {
|
|
||||||
OC.Settings.setupGroupsSelect($(element));
|
|
||||||
$(element).change(function(ev) {
|
|
||||||
var groups = ev.val || [];
|
|
||||||
groups = JSON.stringify(groups);
|
|
||||||
OCP.AppConfig.setValue('core', $(this).attr('name'), groups);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
|
|
||||||
$('#loglevel').change(function(){
|
|
||||||
$.post(OC.generateUrl('/settings/admin/log/level'), {level: $(this).val()},function(){
|
|
||||||
OC.Log.reload();
|
|
||||||
} );
|
|
||||||
});
|
|
||||||
|
|
||||||
$('#backgroundjobs span.crondate').tooltip({placement: 'top'});
|
|
||||||
|
|
||||||
$('#backgroundjobs input').change(function(){
|
|
||||||
if($(this).is(':checked')){
|
|
||||||
var mode = $(this).val();
|
|
||||||
if (mode === 'ajax' || mode === 'webcron' || mode === 'cron') {
|
|
||||||
OCP.AppConfig.setValue('core', 'backgroundjobs_mode', mode, {
|
|
||||||
success: function() {
|
|
||||||
// clear cron errors on background job mode change
|
|
||||||
OCP.AppConfig.deleteKey('core', 'cronErrors');
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
$('#shareAPIEnabled').change(function() {
|
|
||||||
$('#shareAPI p:not(#enable)').toggleClass('hidden', !this.checked);
|
|
||||||
});
|
|
||||||
|
|
||||||
$('#enableEncryption').change(function() {
|
|
||||||
$('#encryptionAPI div#EncryptionWarning').toggleClass('hidden');
|
|
||||||
});
|
|
||||||
|
|
||||||
$('#reallyEnableEncryption').click(function() {
|
|
||||||
$('#encryptionAPI div#EncryptionWarning').toggleClass('hidden');
|
|
||||||
$('#encryptionAPI div#EncryptionSettingsArea').toggleClass('hidden');
|
|
||||||
OCP.AppConfig.setValue('core', 'encryption_enabled', 'yes');
|
|
||||||
$('#enableEncryption').attr('disabled', 'disabled');
|
|
||||||
});
|
|
||||||
|
|
||||||
$('#startmigration').click(function(event){
|
|
||||||
$(window).on('beforeunload.encryption', function(e) {
|
|
||||||
return t('settings', 'Migration in progress. Please wait until the migration is finished');
|
|
||||||
});
|
|
||||||
event.preventDefault();
|
|
||||||
$('#startmigration').prop('disabled', true);
|
|
||||||
OC.msg.startAction('#startmigration_msg', t('settings', 'Migration started …'));
|
|
||||||
$.post(OC.generateUrl('/settings/admin/startmigration'), '', function(data){
|
|
||||||
OC.msg.finishedAction('#startmigration_msg', data);
|
|
||||||
if (data['status'] === 'success') {
|
|
||||||
$('#encryptionAPI div#selectEncryptionModules').toggleClass('hidden');
|
|
||||||
$('#encryptionAPI div#migrationWarning').toggleClass('hidden');
|
|
||||||
} else {
|
|
||||||
$('#startmigration').prop('disabled', false);
|
|
||||||
}
|
|
||||||
$(window).off('beforeunload.encryption');
|
|
||||||
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
$('#shareapiExpireAfterNDays').on('input', function() {
|
|
||||||
this.value = this.value.replace(/\D/g, '');
|
|
||||||
});
|
|
||||||
|
|
||||||
$('#shareAPI input:not(.noJSAutoUpdate)').change(function() {
|
|
||||||
var value = $(this).val();
|
|
||||||
if ($(this).attr('type') === 'checkbox') {
|
|
||||||
if (this.checked) {
|
|
||||||
value = 'yes';
|
|
||||||
} else {
|
|
||||||
value = 'no';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
OCP.AppConfig.setValue('core', $(this).attr('name'), value);
|
|
||||||
});
|
|
||||||
|
|
||||||
$('#shareapiDefaultExpireDate').change(function() {
|
|
||||||
$("#setDefaultExpireDate").toggleClass('hidden', !this.checked);
|
|
||||||
});
|
|
||||||
|
|
||||||
$('#shareapiDefaultInternalExpireDate').change(function() {
|
|
||||||
$("#setDefaultInternalExpireDate").toggleClass('hidden', !this.checked);
|
|
||||||
});
|
|
||||||
|
|
||||||
$('#shareapiDefaultRemoteExpireDate').change(function() {
|
|
||||||
$("#setDefaultRemoteExpireDate").toggleClass('hidden', !this.checked);
|
|
||||||
});
|
|
||||||
|
|
||||||
$('#publicShareDisclaimer').change(function() {
|
|
||||||
$("#publicShareDisclaimerText").toggleClass('hidden', !this.checked);
|
|
||||||
if(!this.checked) {
|
|
||||||
savePublicShareDisclaimerText('');
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
$('#shareApiDefaultPermissionsSection input').change(function(ev) {
|
|
||||||
var $el = $('#shareApiDefaultPermissions');
|
|
||||||
var $target = $(ev.target);
|
|
||||||
|
|
||||||
var value = $el.val();
|
|
||||||
if ($target.is(':checked')) {
|
|
||||||
value = value | $target.val();
|
|
||||||
} else {
|
|
||||||
value = value & ~$target.val();
|
|
||||||
}
|
|
||||||
|
|
||||||
// always set read permission
|
|
||||||
value |= OC.PERMISSION_READ;
|
|
||||||
|
|
||||||
// this will trigger the field's change event and will save it
|
|
||||||
$el.val(value).change();
|
|
||||||
|
|
||||||
ev.preventDefault();
|
|
||||||
|
|
||||||
return false;
|
|
||||||
});
|
|
||||||
|
|
||||||
var savePublicShareDisclaimerText = _.debounce(function(value) {
|
|
||||||
var options = {
|
|
||||||
success: function() {
|
|
||||||
OC.msg.finishedSuccess('#publicShareDisclaimerStatus', t('settings', 'Saved'));
|
|
||||||
},
|
|
||||||
error: function() {
|
|
||||||
OC.msg.finishedError('#publicShareDisclaimerStatus', t('settings', 'Not saved'));
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
OC.msg.startSaving('#publicShareDisclaimerStatus');
|
|
||||||
if (_.isString(value) && value !== '') {
|
|
||||||
OCP.AppConfig.setValue('core', 'shareapi_public_link_disclaimertext', value, options);
|
|
||||||
} else {
|
|
||||||
$('#publicShareDisclaimerText').val('');
|
|
||||||
OCP.AppConfig.deleteKey('core', 'shareapi_public_link_disclaimertext', options);
|
|
||||||
}
|
|
||||||
}, 500);
|
|
||||||
|
|
||||||
$('#publicShareDisclaimerText').on('change, keyup', function() {
|
|
||||||
savePublicShareDisclaimerText(this.value);
|
|
||||||
});
|
|
||||||
|
|
||||||
$('#shareapi_allow_share_dialog_user_enumeration').on('change', function() {
|
|
||||||
$('#shareapi_restrict_user_enumeration_to_group_setting').toggleClass('hidden', !this.checked);
|
|
||||||
$('#shareapi_restrict_user_enumeration_to_phone_setting').toggleClass('hidden', !this.checked);
|
|
||||||
$('#shareapi_restrict_user_enumeration_combinewarning_setting').toggleClass('hidden', !this.checked);
|
|
||||||
})
|
|
||||||
|
|
||||||
$('#allowLinks').change(function() {
|
|
||||||
$("#publicLinkSettings").toggleClass('hidden', !this.checked);
|
|
||||||
$('#setDefaultExpireDate').toggleClass('hidden', !(this.checked && $('#shareapiDefaultExpireDate')[0].checked));
|
|
||||||
});
|
|
||||||
|
|
||||||
$('#mail_smtpauth').change(function() {
|
|
||||||
if (!this.checked) {
|
|
||||||
$('#mail_credentials').addClass('hidden');
|
|
||||||
} else {
|
|
||||||
$('#mail_credentials').removeClass('hidden');
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
$('#mail_smtpmode').change(function() {
|
|
||||||
if ($(this).val() !== 'smtp') {
|
|
||||||
$('#setting_smtpauth').addClass('hidden');
|
|
||||||
$('#setting_smtphost').addClass('hidden');
|
|
||||||
$('#mail_smtpsecure_label').addClass('hidden');
|
|
||||||
$('#mail_smtpsecure').addClass('hidden');
|
|
||||||
$('#mail_credentials').addClass('hidden');
|
|
||||||
$('#mail_sendmailmode_label, #mail_sendmailmode').removeClass('hidden');
|
|
||||||
} else {
|
|
||||||
$('#setting_smtpauth').removeClass('hidden');
|
|
||||||
$('#setting_smtphost').removeClass('hidden');
|
|
||||||
$('#mail_smtpsecure_label').removeClass('hidden');
|
|
||||||
$('#mail_smtpsecure').removeClass('hidden');
|
|
||||||
if ($('#mail_smtpauth').is(':checked')) {
|
|
||||||
$('#mail_credentials').removeClass('hidden');
|
|
||||||
}
|
|
||||||
$('#mail_sendmailmode_label, #mail_sendmailmode').addClass('hidden');
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
var changeEmailSettings = function() {
|
|
||||||
if (OC.PasswordConfirmation.requiresPasswordConfirmation()) {
|
|
||||||
OC.PasswordConfirmation.requirePasswordConfirmation(changeEmailSettings);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
OC.msg.startSaving('#mail_settings_msg');
|
|
||||||
$.ajax({
|
|
||||||
url: OC.generateUrl('/settings/admin/mailsettings'),
|
|
||||||
type: 'POST',
|
|
||||||
data: $('#mail_general_settings_form').serialize(),
|
|
||||||
success: function(){
|
|
||||||
OC.msg.finishedSuccess('#mail_settings_msg', t('settings', 'Saved'));
|
|
||||||
},
|
|
||||||
error: function(xhr){
|
|
||||||
OC.msg.finishedError('#mail_settings_msg', xhr.responseJSON);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
var toggleEmailCredentials = function() {
|
|
||||||
if (OC.PasswordConfirmation.requiresPasswordConfirmation()) {
|
|
||||||
OC.PasswordConfirmation.requirePasswordConfirmation(toggleEmailCredentials);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
OC.msg.startSaving('#mail_settings_msg');
|
|
||||||
$.ajax({
|
|
||||||
url: OC.generateUrl('/settings/admin/mailsettings/credentials'),
|
|
||||||
type: 'POST',
|
|
||||||
data: $('#mail_credentials_settings').serialize(),
|
|
||||||
success: function(){
|
|
||||||
OC.msg.finishedSuccess('#mail_settings_msg', t('settings', 'Saved'));
|
|
||||||
},
|
|
||||||
error: function(xhr){
|
|
||||||
OC.msg.finishedError('#mail_settings_msg', xhr.responseJSON);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
$('#mail_general_settings_form').change(changeEmailSettings);
|
|
||||||
$('#mail_credentials_settings_submit').click(toggleEmailCredentials);
|
|
||||||
$('#mail_smtppassword').click(function() {
|
|
||||||
if (this.type === 'text' && this.value === '********') {
|
|
||||||
this.type = 'password';
|
|
||||||
this.value = '';
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
$('#sendtestemail').click(function(event){
|
|
||||||
event.preventDefault();
|
|
||||||
OC.msg.startAction('#sendtestmail_msg', t('settings', 'Sending…'));
|
|
||||||
|
|
||||||
$.ajax({
|
|
||||||
url: OC.generateUrl('/settings/admin/mailtest'),
|
|
||||||
type: 'POST',
|
|
||||||
success: function(){
|
|
||||||
OC.msg.finishedSuccess('#sendtestmail_msg', t('settings', 'Email sent'));
|
|
||||||
},
|
|
||||||
error: function(xhr){
|
|
||||||
OC.msg.finishedError('#sendtestmail_msg', xhr.responseJSON);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
$('#allowGroupSharing').change(function() {
|
|
||||||
$('#allowGroupSharing').toggleClass('hidden', !this.checked);
|
|
||||||
});
|
|
||||||
|
|
||||||
$('#shareapiExcludeGroups').change(function() {
|
|
||||||
$("#selectExcludedGroups").toggleClass('hidden', !this.checked);
|
|
||||||
});
|
|
||||||
|
|
||||||
var setupChecks = function () {
|
|
||||||
// run setup checks then gather error messages
|
|
||||||
$.when(
|
|
||||||
OC.SetupChecks.checkWebDAV(),
|
|
||||||
OC.SetupChecks.checkWellKnownUrl('GET', '/.well-known/webfinger', OC.theme.docPlaceholderUrl, $('#postsetupchecks').data('check-wellknown') === true, [200, 404], true),
|
|
||||||
OC.SetupChecks.checkWellKnownUrl('GET', '/.well-known/nodeinfo', OC.theme.docPlaceholderUrl, $('#postsetupchecks').data('check-wellknown') === true, [200, 404], true),
|
|
||||||
OC.SetupChecks.checkWellKnownUrl('PROPFIND', '/.well-known/caldav', OC.theme.docPlaceholderUrl, $('#postsetupchecks').data('check-wellknown') === true),
|
|
||||||
OC.SetupChecks.checkWellKnownUrl('PROPFIND', '/.well-known/carddav', OC.theme.docPlaceholderUrl, $('#postsetupchecks').data('check-wellknown') === true),
|
|
||||||
OC.SetupChecks.checkProviderUrl(OC.getRootPath() + '/ocm-provider/', OC.theme.docPlaceholderUrl, $('#postsetupchecks').data('check-wellknown') === true),
|
|
||||||
OC.SetupChecks.checkProviderUrl(OC.getRootPath() + '/ocs-provider/', OC.theme.docPlaceholderUrl, $('#postsetupchecks').data('check-wellknown') === true),
|
|
||||||
OC.SetupChecks.checkSetup(),
|
|
||||||
OC.SetupChecks.checkGeneric(),
|
|
||||||
OC.SetupChecks.checkWOFF2Loading(OC.filePath('core', '', 'fonts/NotoSans-Regular-latin.woff2'), OC.theme.docPlaceholderUrl),
|
|
||||||
OC.SetupChecks.checkDataProtected()
|
|
||||||
).then(function (check1, check2, check3, check4, check5, check6, check7, check8, check9, check10, check11) {
|
|
||||||
var messages = [].concat(check1, check2, check3, check4, check5, check6, check7, check8, check9, check10, check11);
|
|
||||||
var $el = $('#postsetupchecks');
|
|
||||||
$('#security-warning-state-loading').addClass('hidden');
|
|
||||||
|
|
||||||
var hasMessages = false;
|
|
||||||
var $errorsEl = $el.find('.errors');
|
|
||||||
var $warningsEl = $el.find('.warnings');
|
|
||||||
var $infoEl = $el.find('.info');
|
|
||||||
|
|
||||||
for (var i = 0; i < messages.length; i++) {
|
|
||||||
switch (messages[i].type) {
|
|
||||||
case OC.SetupChecks.MESSAGE_TYPE_INFO:
|
|
||||||
$infoEl.append('<li>' + messages[i].msg + '</li>');
|
|
||||||
break;
|
|
||||||
case OC.SetupChecks.MESSAGE_TYPE_WARNING:
|
|
||||||
$warningsEl.append('<li>' + messages[i].msg + '</li>');
|
|
||||||
break;
|
|
||||||
case OC.SetupChecks.MESSAGE_TYPE_ERROR:
|
|
||||||
default:
|
|
||||||
$errorsEl.append('<li>' + messages[i].msg + '</li>');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($errorsEl.find('li').length > 0) {
|
|
||||||
$errorsEl.removeClass('hidden');
|
|
||||||
hasMessages = true;
|
|
||||||
}
|
|
||||||
if ($warningsEl.find('li').length > 0) {
|
|
||||||
$warningsEl.removeClass('hidden');
|
|
||||||
hasMessages = true;
|
|
||||||
}
|
|
||||||
if ($infoEl.find('li').length > 0) {
|
|
||||||
$infoEl.removeClass('hidden');
|
|
||||||
hasMessages = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (hasMessages) {
|
|
||||||
$('#postsetupchecks-hint').removeClass('hidden');
|
|
||||||
if ($errorsEl.find('li').length > 0) {
|
|
||||||
$('#security-warning-state-failure').removeClass('hidden');
|
|
||||||
} else {
|
|
||||||
$('#security-warning-state-warning').removeClass('hidden');
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
var securityWarning = $('#security-warning');
|
|
||||||
if (securityWarning.children('ul').children().length === 0) {
|
|
||||||
$('#security-warning-state-ok').removeClass('hidden');
|
|
||||||
} else {
|
|
||||||
$('#security-warning-state-failure').removeClass('hidden');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
if (document.getElementById('security-warning') !== null) {
|
|
||||||
setupChecks();
|
|
||||||
}
|
|
||||||
});
|
|
@ -1,113 +0,0 @@
|
|||||||
/* global Handlebars */
|
|
||||||
OC.Settings = OC.Settings || {};
|
|
||||||
OC.Settings.Apps = OC.Settings.Apps || {
|
|
||||||
rebuildNavigation: function() {
|
|
||||||
$.getJSON(OC.linkToOCS('core/navigation', 2) + 'apps?format=json').done(function(response){
|
|
||||||
if(response.ocs.meta.status === 'ok') {
|
|
||||||
var addedApps = {};
|
|
||||||
var navEntries = response.ocs.data;
|
|
||||||
var container = $('#navigation #apps ul');
|
|
||||||
|
|
||||||
// remove disabled apps
|
|
||||||
for (var i = 0; i < navEntries.length; i++) {
|
|
||||||
var entry = navEntries[i];
|
|
||||||
if(container.children('li[data-id="' + entry.id + '"]').length === 0) {
|
|
||||||
addedApps[entry.id] = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
container.children('li[data-id]').each(function (index, el) {
|
|
||||||
var id = $(el).data('id');
|
|
||||||
// remove all apps that are not in the correct order
|
|
||||||
if (!navEntries[index] || (navEntries[index] && navEntries[index].id !== $(el).data('id'))) {
|
|
||||||
$(el).remove();
|
|
||||||
$('#appmenu li[data-id='+id+']').remove();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
var previousEntry = {};
|
|
||||||
// add enabled apps to #navigation and #appmenu
|
|
||||||
for (var i = 0; i < navEntries.length; i++) {
|
|
||||||
var entry = navEntries[i];
|
|
||||||
if (container.children('li[data-id="' + entry.id + '"]').length === 0) {
|
|
||||||
var li = $('<li></li>');
|
|
||||||
li.attr('data-id', entry.id);
|
|
||||||
var img = '<svg width="20" height="20" viewBox="0 0 20 20" alt="">';
|
|
||||||
if (OCA.Theming && OCA.Theming.inverted) {
|
|
||||||
img += '<defs><filter id="invert"><feColorMatrix in="SourceGraphic" type="matrix" values="-1 0 0 0 1 0 -1 0 0 1 0 0 -1 0 1 0 0 0 1 0" /></filter></defs>';
|
|
||||||
img += '<image x="0" y="0" width="20" height="20" preserveAspectRatio="xMinYMin meet" filter="url(#invert)" xlink:href="' + entry.icon + '" class="app-icon" />';
|
|
||||||
} else {
|
|
||||||
img += '<image x="0" y="0" width="20" height="20" preserveAspectRatio="xMinYMin meet" xlink:href="' + entry.icon + '" class="app-icon" />';
|
|
||||||
}
|
|
||||||
img += '</svg>';
|
|
||||||
var a = $('<a></a>').attr('href', entry.href);
|
|
||||||
var filename = $('<span></span>');
|
|
||||||
var loading = $('<div class="icon-loading-dark"></div>').css('display', 'none');
|
|
||||||
filename.text(entry.name);
|
|
||||||
a.prepend(loading);
|
|
||||||
a.prepend(filename);
|
|
||||||
a.prepend(img);
|
|
||||||
li.append(a);
|
|
||||||
|
|
||||||
// add app icon to the navigation
|
|
||||||
var previousElement = $('#navigation li[data-id=' + previousEntry.id + ']');
|
|
||||||
if (previousElement.length > 0) {
|
|
||||||
previousElement.after(li);
|
|
||||||
} else {
|
|
||||||
$('#navigation #apps').prepend(li);
|
|
||||||
}
|
|
||||||
|
|
||||||
// draw attention to the newly added app entry
|
|
||||||
// by flashing twice the more apps menu
|
|
||||||
if(addedApps[entry.id]) {
|
|
||||||
$('#header #more-apps')
|
|
||||||
.animate({opacity: 0.5})
|
|
||||||
.animate({opacity: 1})
|
|
||||||
.animate({opacity: 0.5})
|
|
||||||
.animate({opacity: 1});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($('#appmenu').children('li[data-id="' + entry.id + '"]').length === 0) {
|
|
||||||
var li = $('<li></li>');
|
|
||||||
li.attr('data-id', entry.id);
|
|
||||||
// Generating svg embedded image (see layout.user.php)
|
|
||||||
var img = '<svg width="20" height="20" viewBox="0 0 20 20" alt="">';
|
|
||||||
if (OCA.Theming && OCA.Theming.inverted) {
|
|
||||||
img += '<defs><filter id="invert"><feColorMatrix in="SourceGraphic" type="matrix" values="-1 0 0 0 1 0 -1 0 0 1 0 0 -1 0 1 0 0 0 1 0" /></filter></defs>';
|
|
||||||
img += '<image x="0" y="0" width="20" height="20" preserveAspectRatio="xMinYMin meet" filter="url(#invert)" xlink:href="' + entry.icon + '" class="app-icon" />';
|
|
||||||
} else {
|
|
||||||
img += '<image x="0" y="0" width="20" height="20" preserveAspectRatio="xMinYMin meet" xlink:href="' + entry.icon + '" class="app-icon" />';
|
|
||||||
}
|
|
||||||
img += '</svg>';
|
|
||||||
var a = $('<a></a>').attr('href', entry.href);
|
|
||||||
var filename = $('<span></span>');
|
|
||||||
var loading = $('<div class="icon-loading-dark"></div>').css('display', 'none');
|
|
||||||
filename.text(entry.name);
|
|
||||||
a.prepend(loading);
|
|
||||||
a.prepend(filename);
|
|
||||||
a.prepend(img);
|
|
||||||
li.append(a);
|
|
||||||
|
|
||||||
// add app icon to the navigation
|
|
||||||
var previousElement = $('#appmenu li[data-id=' + previousEntry.id + ']');
|
|
||||||
if (previousElement.length > 0) {
|
|
||||||
previousElement.after(li);
|
|
||||||
} else {
|
|
||||||
$('#appmenu').prepend(li);
|
|
||||||
}
|
|
||||||
|
|
||||||
if(addedApps[entry.id]) {
|
|
||||||
li.animate({opacity: 0.5})
|
|
||||||
.animate({opacity: 1})
|
|
||||||
.animate({opacity: 0.5})
|
|
||||||
.animate({opacity: 1});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
previousEntry = entry;
|
|
||||||
}
|
|
||||||
|
|
||||||
$(window).trigger('resize');
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
};
|
|
@ -1,85 +0,0 @@
|
|||||||
/**
|
|
||||||
* Copyright (c) 2012, Robin Appelman <icewind1991@gmail.com>
|
|
||||||
* Copyright (c) 2013, Morris Jobke <morris.jobke@gmail.com>
|
|
||||||
* This file is licensed under the Affero General Public License version 3 or later.
|
|
||||||
* See the COPYING-README file.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* global formatDate */
|
|
||||||
|
|
||||||
OC.Log = {
|
|
||||||
reload: function (count) {
|
|
||||||
if (!count) {
|
|
||||||
count = OC.Log.loaded;
|
|
||||||
}
|
|
||||||
OC.Log.loaded = 0;
|
|
||||||
$('#log tbody').empty();
|
|
||||||
OC.Log.getMore(count);
|
|
||||||
},
|
|
||||||
levels: ['Debug', 'Info', 'Warning', 'Error', 'Fatal'],
|
|
||||||
loaded: 3,//are initially loaded
|
|
||||||
getMore: function (count) {
|
|
||||||
count = count || 10;
|
|
||||||
$.get(OC.generateUrl('/settings/admin/log/entries'), {offset: OC.Log.loaded, count: count}, function (result) {
|
|
||||||
OC.Log.addEntries(result.data);
|
|
||||||
if (!result.remain) {
|
|
||||||
$('#moreLog').hide();
|
|
||||||
}
|
|
||||||
$('#lessLog').show();
|
|
||||||
});
|
|
||||||
},
|
|
||||||
showLess: function (count) {
|
|
||||||
count = count || 10;
|
|
||||||
//calculate remaining items - at least 3
|
|
||||||
OC.Log.loaded = Math.max(3, OC.Log.loaded - count);
|
|
||||||
$('#moreLog').show();
|
|
||||||
// remove all non-remaining items
|
|
||||||
$('#log tr').slice(OC.Log.loaded).remove();
|
|
||||||
if (OC.Log.loaded <= 3) {
|
|
||||||
$('#lessLog').hide();
|
|
||||||
}
|
|
||||||
},
|
|
||||||
addEntries: function (entries) {
|
|
||||||
for (var i = 0; i < entries.length; i++) {
|
|
||||||
var entry = entries[i];
|
|
||||||
var row = $('<tr/>');
|
|
||||||
var levelTd = $('<td/>');
|
|
||||||
levelTd.text(OC.Log.levels[entry.level]);
|
|
||||||
row.append(levelTd);
|
|
||||||
|
|
||||||
var appTd = $('<td/>');
|
|
||||||
appTd.text(entry.app);
|
|
||||||
row.append(appTd);
|
|
||||||
|
|
||||||
var messageTd = $('<td/>');
|
|
||||||
messageTd.addClass('log-message');
|
|
||||||
messageTd.text(entry.message);
|
|
||||||
row.append(messageTd);
|
|
||||||
|
|
||||||
var timeTd = $('<td/>');
|
|
||||||
timeTd.addClass('date');
|
|
||||||
if (isNaN(entry.time)) {
|
|
||||||
timeTd.text(entry.time);
|
|
||||||
} else {
|
|
||||||
timeTd.text(formatDate(entry.time * 1000));
|
|
||||||
}
|
|
||||||
row.append(timeTd);
|
|
||||||
|
|
||||||
var userTd = $('<td/>');
|
|
||||||
userTd.text(entry.user);
|
|
||||||
row.append(userTd);
|
|
||||||
|
|
||||||
$('#log').append(row);
|
|
||||||
}
|
|
||||||
OC.Log.loaded += entries.length;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
window.addEventListener('DOMContentLoaded', function () {
|
|
||||||
$('#moreLog').click(function () {
|
|
||||||
OC.Log.getMore();
|
|
||||||
});
|
|
||||||
$('#lessLog').click(function () {
|
|
||||||
OC.Log.showLess();
|
|
||||||
});
|
|
||||||
});
|
|
@ -0,0 +1,335 @@
|
|||||||
|
import $ from 'jquery'
|
||||||
|
import 'jquery-ui-dist/jquery-ui'
|
||||||
|
|
||||||
|
window.addEventListener('DOMContentLoaded', () => {
|
||||||
|
$('#excludedGroups,#linksExcludedGroups').each((index, element) => {
|
||||||
|
OC.Settings.setupGroupsSelect($(element))
|
||||||
|
$(element).change((ev) => {
|
||||||
|
let groups = ev.val || []
|
||||||
|
groups = JSON.stringify(groups)
|
||||||
|
OCP.AppConfig.setValue('core', $(this).attr('name'), groups)
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
$('#loglevel').change(() => {
|
||||||
|
$.post(OC.generateUrl('/settings/admin/log/level'), { level: $(this).val() }, () => {
|
||||||
|
OC.Log.reload()
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
$('#backgroundjobs span.crondate').tooltip({ placement: 'top' })
|
||||||
|
|
||||||
|
$('#backgroundjobs input').change(() => {
|
||||||
|
if ($(this).is(':checked')) {
|
||||||
|
const mode = $(this).val()
|
||||||
|
if (mode === 'ajax' || mode === 'webcron' || mode === 'cron') {
|
||||||
|
OCP.AppConfig.setValue('core', 'backgroundjobs_mode', mode, {
|
||||||
|
success: () => {
|
||||||
|
// clear cron errors on background job mode change
|
||||||
|
OCP.AppConfig.deleteKey('core', 'cronErrors')
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
$('#shareAPIEnabled').change(() => {
|
||||||
|
$('#shareAPI p:not(#enable)').toggleClass('hidden', !this.checked)
|
||||||
|
})
|
||||||
|
|
||||||
|
$('#enableEncryption').change(() => {
|
||||||
|
$('#encryptionAPI div#EncryptionWarning').toggleClass('hidden')
|
||||||
|
})
|
||||||
|
|
||||||
|
$('#reallyEnableEncryption').click(() => {
|
||||||
|
$('#encryptionAPI div#EncryptionWarning').toggleClass('hidden')
|
||||||
|
$('#encryptionAPI div#EncryptionSettingsArea').toggleClass('hidden')
|
||||||
|
OCP.AppConfig.setValue('core', 'encryption_enabled', 'yes')
|
||||||
|
$('#enableEncryption').attr('disabled', 'disabled')
|
||||||
|
})
|
||||||
|
|
||||||
|
$('#startmigration').click((event) => {
|
||||||
|
$(window).on('beforeunload.encryption', (e) => {
|
||||||
|
return t('settings', 'Migration in progress. Please wait until the migration is finished')
|
||||||
|
})
|
||||||
|
event.preventDefault()
|
||||||
|
$('#startmigration').prop('disabled', true)
|
||||||
|
OC.msg.startAction('#startmigration_msg', t('settings', 'Migration started …'))
|
||||||
|
$.post(OC.generateUrl('/settings/admin/startmigration'), '', function(data) {
|
||||||
|
OC.msg.finishedAction('#startmigration_msg', data)
|
||||||
|
if (data.status === 'success') {
|
||||||
|
$('#encryptionAPI div#selectEncryptionModules').toggleClass('hidden')
|
||||||
|
$('#encryptionAPI div#migrationWarning').toggleClass('hidden')
|
||||||
|
} else {
|
||||||
|
$('#startmigration').prop('disabled', false)
|
||||||
|
}
|
||||||
|
$(window).off('beforeunload.encryption')
|
||||||
|
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
$('#shareapiExpireAfterNDays').on('input', function() {
|
||||||
|
this.value = this.value.replace(/\D/g, '')
|
||||||
|
})
|
||||||
|
|
||||||
|
$('#shareAPI input:not(.noJSAutoUpdate)').change(function() {
|
||||||
|
let value = $(this).val()
|
||||||
|
if ($(this).attr('type') === 'checkbox') {
|
||||||
|
if (this.checked) {
|
||||||
|
value = 'yes'
|
||||||
|
} else {
|
||||||
|
value = 'no'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
OCP.AppConfig.setValue('core', $(this).attr('name'), value)
|
||||||
|
})
|
||||||
|
|
||||||
|
$('#shareapiDefaultExpireDate').change(function() {
|
||||||
|
$('setDefaultExpireDate').toggleClass('hidden', !this.checked)
|
||||||
|
})
|
||||||
|
|
||||||
|
$('#shareapiDefaultInternalExpireDate').change(function() {
|
||||||
|
$('#setDefaultInternalExpireDate').toggleClass('hidden', !this.checked)
|
||||||
|
})
|
||||||
|
|
||||||
|
$('#shareapiDefaultRemoteExpireDate').change(function() {
|
||||||
|
$('#setDefaultRemoteExpireDate').toggleClass('hidden', !this.checked)
|
||||||
|
})
|
||||||
|
|
||||||
|
$('#publicShareDisclaimer').change(function() {
|
||||||
|
$('#publicShareDisclaimerText').toggleClass('hidden', !this.checked)
|
||||||
|
if (!this.checked) {
|
||||||
|
savePublicShareDisclaimerText('')
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
$('#shareApiDefaultPermissionsSection input').change(function(ev) {
|
||||||
|
const $el = $('#shareApiDefaultPermissions')
|
||||||
|
const $target = $(ev.target)
|
||||||
|
|
||||||
|
let value = $el.val()
|
||||||
|
if ($target.is(':checked')) {
|
||||||
|
value = value | $target.val()
|
||||||
|
} else {
|
||||||
|
value = value & ~$target.val()
|
||||||
|
}
|
||||||
|
|
||||||
|
// always set read permission
|
||||||
|
value |= OC.PERMISSION_READ
|
||||||
|
|
||||||
|
// this will trigger the field's change event and will save it
|
||||||
|
$el.val(value).change()
|
||||||
|
|
||||||
|
ev.preventDefault()
|
||||||
|
|
||||||
|
return false
|
||||||
|
})
|
||||||
|
|
||||||
|
const savePublicShareDisclaimerText = _.debounce(function(value) {
|
||||||
|
const options = {
|
||||||
|
success: () => {
|
||||||
|
OC.msg.finishedSuccess('#publicShareDisclaimerStatus', t('settings', 'Saved'))
|
||||||
|
},
|
||||||
|
error: () => {
|
||||||
|
OC.msg.finishedError('#publicShareDisclaimerStatus', t('settings', 'Not saved'))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
OC.msg.startSaving('#publicShareDisclaimerStatus')
|
||||||
|
if (_.isString(value) && value !== '') {
|
||||||
|
OCP.AppConfig.setValue('core', 'shareapi_public_link_disclaimertext', value, options)
|
||||||
|
} else {
|
||||||
|
$('#publicShareDisclaimerText').val('')
|
||||||
|
OCP.AppConfig.deleteKey('core', 'shareapi_public_link_disclaimertext', options)
|
||||||
|
}
|
||||||
|
}, 500)
|
||||||
|
|
||||||
|
$('#publicShareDisclaimerText').on('change, keyup', function() {
|
||||||
|
savePublicShareDisclaimerText(this.value)
|
||||||
|
})
|
||||||
|
|
||||||
|
$('#shareapi_allow_share_dialog_user_enumeration').on('change', function() {
|
||||||
|
$('#shareapi_restrict_user_enumeration_to_group_setting').toggleClass('hidden', !this.checked)
|
||||||
|
$('#shareapi_restrict_user_enumeration_to_phone_setting').toggleClass('hidden', !this.checked)
|
||||||
|
$('#shareapi_restrict_user_enumeration_combinewarning_setting').toggleClass('hidden', !this.checked)
|
||||||
|
})
|
||||||
|
|
||||||
|
$('#allowLinks').change(function() {
|
||||||
|
$('#publicLinkSettings').toggleClass('hidden', !this.checked)
|
||||||
|
$('#setDefaultExpireDate').toggleClass('hidden', !(this.checked && $('#shareapiDefaultExpireDate')[0].checked))
|
||||||
|
})
|
||||||
|
|
||||||
|
$('#mail_smtpauth').change(function() {
|
||||||
|
if (!this.checked) {
|
||||||
|
$('#mail_credentials').addClass('hidden')
|
||||||
|
} else {
|
||||||
|
$('#mail_credentials').removeClass('hidden')
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
$('#mail_smtpmode').change(function() {
|
||||||
|
if ($(this).val() !== 'smtp') {
|
||||||
|
$('#setting_smtpauth').addClass('hidden')
|
||||||
|
$('#setting_smtphost').addClass('hidden')
|
||||||
|
$('#mail_smtpsecure_label').addClass('hidden')
|
||||||
|
$('#mail_smtpsecure').addClass('hidden')
|
||||||
|
$('#mail_credentials').addClass('hidden')
|
||||||
|
$('#mail_sendmailmode_label, #mail_sendmailmode').removeClass('hidden')
|
||||||
|
} else {
|
||||||
|
$('#setting_smtpauth').removeClass('hidden')
|
||||||
|
$('#setting_smtphost').removeClass('hidden')
|
||||||
|
$('#mail_smtpsecure_label').removeClass('hidden')
|
||||||
|
$('#mail_smtpsecure').removeClass('hidden')
|
||||||
|
if ($('#mail_smtpauth').is(':checked')) {
|
||||||
|
$('#mail_credentials').removeClass('hidden')
|
||||||
|
}
|
||||||
|
$('#mail_sendmailmode_label, #mail_sendmailmode').addClass('hidden')
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
const changeEmailSettings = function() {
|
||||||
|
if (OC.PasswordConfirmation.requiresPasswordConfirmation()) {
|
||||||
|
OC.PasswordConfirmation.requirePasswordConfirmation(changeEmailSettings)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
OC.msg.startSaving('#mail_settings_msg')
|
||||||
|
$.ajax({
|
||||||
|
url: OC.generateUrl('/settings/admin/mailsettings'),
|
||||||
|
type: 'POST',
|
||||||
|
data: $('#mail_general_settings_form').serialize(),
|
||||||
|
success: () => {
|
||||||
|
OC.msg.finishedSuccess('#mail_settings_msg', t('settings', 'Saved'))
|
||||||
|
},
|
||||||
|
error: (xhr) => {
|
||||||
|
OC.msg.finishedError('#mail_settings_msg', xhr.responseJSON)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
const toggleEmailCredentials = function() {
|
||||||
|
if (OC.PasswordConfirmation.requiresPasswordConfirmation()) {
|
||||||
|
OC.PasswordConfirmation.requirePasswordConfirmation(toggleEmailCredentials)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
OC.msg.startSaving('#mail_settings_msg')
|
||||||
|
$.ajax({
|
||||||
|
url: OC.generateUrl('/settings/admin/mailsettings/credentials'),
|
||||||
|
type: 'POST',
|
||||||
|
data: $('#mail_credentials_settings').serialize(),
|
||||||
|
success: () => {
|
||||||
|
OC.msg.finishedSuccess('#mail_settings_msg', t('settings', 'Saved'))
|
||||||
|
},
|
||||||
|
error: (xhr) => {
|
||||||
|
OC.msg.finishedError('#mail_settings_msg', xhr.responseJSON)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
$('#mail_general_settings_form').change(changeEmailSettings)
|
||||||
|
$('#mail_credentials_settings_submit').click(toggleEmailCredentials)
|
||||||
|
$('#mail_smtppassword').click(() => {
|
||||||
|
if (this.type === 'text' && this.value === '********') {
|
||||||
|
this.type = 'password'
|
||||||
|
this.value = ''
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
$('#sendtestemail').click((event) => {
|
||||||
|
event.preventDefault()
|
||||||
|
OC.msg.startAction('#sendtestmail_msg', t('settings', 'Sending…'))
|
||||||
|
|
||||||
|
$.ajax({
|
||||||
|
url: OC.generateUrl('/settings/admin/mailtest'),
|
||||||
|
type: 'POST',
|
||||||
|
success: () => {
|
||||||
|
OC.msg.finishedSuccess('#sendtestmail_msg', t('settings', 'Email sent'))
|
||||||
|
},
|
||||||
|
error: (xhr) => {
|
||||||
|
OC.msg.finishedError('#sendtestmail_msg', xhr.responseJSON)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
$('#allowGroupSharing').change(() => {
|
||||||
|
$('#allowGroupSharing').toggleClass('hidden', !this.checked)
|
||||||
|
})
|
||||||
|
|
||||||
|
$('#shareapiExcludeGroups').change(() => {
|
||||||
|
$('#selectExcludedGroups').toggleClass('hidden', !this.checked)
|
||||||
|
})
|
||||||
|
|
||||||
|
const setupChecks = () => {
|
||||||
|
// run setup checks then gather error messages
|
||||||
|
$.when(
|
||||||
|
OC.SetupChecks.checkWebDAV(),
|
||||||
|
OC.SetupChecks.checkWellKnownUrl('GET', '/.well-known/webfinger', OC.theme.docPlaceholderUrl, $('#postsetupchecks').data('check-wellknown') === true, [200, 404], true),
|
||||||
|
OC.SetupChecks.checkWellKnownUrl('GET', '/.well-known/nodeinfo', OC.theme.docPlaceholderUrl, $('#postsetupchecks').data('check-wellknown') === true, [200, 404], true),
|
||||||
|
OC.SetupChecks.checkWellKnownUrl('PROPFIND', '/.well-known/caldav', OC.theme.docPlaceholderUrl, $('#postsetupchecks').data('check-wellknown') === true),
|
||||||
|
OC.SetupChecks.checkWellKnownUrl('PROPFIND', '/.well-known/carddav', OC.theme.docPlaceholderUrl, $('#postsetupchecks').data('check-wellknown') === true),
|
||||||
|
OC.SetupChecks.checkProviderUrl(OC.getRootPath() + '/ocm-provider/', OC.theme.docPlaceholderUrl, $('#postsetupchecks').data('check-wellknown') === true),
|
||||||
|
OC.SetupChecks.checkProviderUrl(OC.getRootPath() + '/ocs-provider/', OC.theme.docPlaceholderUrl, $('#postsetupchecks').data('check-wellknown') === true),
|
||||||
|
OC.SetupChecks.checkSetup(),
|
||||||
|
OC.SetupChecks.checkGeneric(),
|
||||||
|
OC.SetupChecks.checkWOFF2Loading(OC.filePath('core', '', 'fonts/NotoSans-Regular-latin.woff2'), OC.theme.docPlaceholderUrl),
|
||||||
|
OC.SetupChecks.checkDataProtected()
|
||||||
|
).then((check1, check2, check3, check4, check5, check6, check7, check8, check9, check10, check11) => {
|
||||||
|
const messages = [].concat(check1, check2, check3, check4, check5, check6, check7, check8, check9, check10, check11)
|
||||||
|
const $el = $('#postsetupchecks')
|
||||||
|
$('#security-warning-state-loading').addClass('hidden')
|
||||||
|
|
||||||
|
let hasMessages = false
|
||||||
|
const $errorsEl = $el.find('.errors')
|
||||||
|
const $warningsEl = $el.find('.warnings')
|
||||||
|
const $infoEl = $el.find('.info')
|
||||||
|
|
||||||
|
for (let i = 0; i < messages.length; i++) {
|
||||||
|
switch (messages[i].type) {
|
||||||
|
case OC.SetupChecks.MESSAGE_TYPE_INFO:
|
||||||
|
$infoEl.append('<li>' + messages[i].msg + '</li>')
|
||||||
|
break
|
||||||
|
case OC.SetupChecks.MESSAGE_TYPE_WARNING:
|
||||||
|
$warningsEl.append('<li>' + messages[i].msg + '</li>')
|
||||||
|
break
|
||||||
|
case OC.SetupChecks.MESSAGE_TYPE_ERROR:
|
||||||
|
default:
|
||||||
|
$errorsEl.append('<li>' + messages[i].msg + '</li>')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($errorsEl.find('li').length > 0) {
|
||||||
|
$errorsEl.removeClass('hidden')
|
||||||
|
hasMessages = true
|
||||||
|
}
|
||||||
|
if ($warningsEl.find('li').length > 0) {
|
||||||
|
$warningsEl.removeClass('hidden')
|
||||||
|
hasMessages = true
|
||||||
|
}
|
||||||
|
if ($infoEl.find('li').length > 0) {
|
||||||
|
$infoEl.removeClass('hidden')
|
||||||
|
hasMessages = true
|
||||||
|
}
|
||||||
|
|
||||||
|
if (hasMessages) {
|
||||||
|
$('#postsetupchecks-hint').removeClass('hidden')
|
||||||
|
if ($errorsEl.find('li').length > 0) {
|
||||||
|
$('#security-warning-state-failure').removeClass('hidden')
|
||||||
|
} else {
|
||||||
|
$('#security-warning-state-warning').removeClass('hidden')
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
const securityWarning = $('#security-warning')
|
||||||
|
if (securityWarning.children('ul').children().length === 0) {
|
||||||
|
$('#security-warning-state-ok').removeClass('hidden')
|
||||||
|
} else {
|
||||||
|
$('#security-warning-state-failure').removeClass('hidden')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
if (document.getElementById('security-warning') !== null) {
|
||||||
|
setupChecks()
|
||||||
|
}
|
||||||
|
})
|
@ -0,0 +1,130 @@
|
|||||||
|
import axios from '@nextcloud/axios'
|
||||||
|
import { generateOcsUrl } from '@nextcloud/router'
|
||||||
|
|
||||||
|
export default () => {
|
||||||
|
return axios.get(generateOcsUrl('core/navigation', 2) + '/apps?format=json')
|
||||||
|
.then(({ data }) => {
|
||||||
|
if (data.ocs.meta.statuscode !== 200) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
const addedApps = {}
|
||||||
|
const navEntries = data.ocs.data
|
||||||
|
const container = document.querySelector('#navigation #apps ul')
|
||||||
|
|
||||||
|
// remove disabled apps
|
||||||
|
navEntries.forEach((entry) => {
|
||||||
|
if (!container.querySelector('li[data-id="' + entry.id + '"]')) {
|
||||||
|
addedApps[entry.id] = true
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
container.querySelectorAll('li[data-id]').forEach((el, index) => {
|
||||||
|
const id = el.dataset.id
|
||||||
|
// remove all apps that are not in the correct order
|
||||||
|
if (!navEntries[index] || (navEntries[index] && navEntries[index].id !== id)) {
|
||||||
|
el.remove()
|
||||||
|
document.querySelector(`#appmenu li[data-id=${id}]`).remove()
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
let previousEntry = {}
|
||||||
|
// add enabled apps to #navigation and #appmenu
|
||||||
|
navEntries.forEach((entry) => {
|
||||||
|
if (container.querySelector(`li[data-id="${entry.id}"]`) === null) {
|
||||||
|
const li = document.createElement('li')
|
||||||
|
li.dataset.id = entry.id
|
||||||
|
const img = `<svg width="20" height="20" viewBox="0 0 20 20" alt="">
|
||||||
|
<defs>
|
||||||
|
<filter id="invertMenuMore-${entry.id}"><feColorMatrix in="SourceGraphic" type="matrix" values="-1 0 0 0 1 0 -1 0 0 1 0 0 -1 0 1 0 0 0 1 0"></feColorMatrix></filter>
|
||||||
|
<mask id="hole">
|
||||||
|
<rect width="100%" height="100%" fill="white"></rect>
|
||||||
|
<circle r="4.5" cx="17" cy="3" fill="black"></circle>
|
||||||
|
</mask>
|
||||||
|
</defs>
|
||||||
|
<image x="0" y="0" width="16" height="16" filter="url(#invertMenuMore-${entry.id})" preserveAspectRatio="xMinYMin meet" xlink:href="${entry.icon}" class="app-icon" />
|
||||||
|
</svg>`
|
||||||
|
|
||||||
|
const imgElement = document.createElement('template')
|
||||||
|
imgElement.innerHTML = img
|
||||||
|
|
||||||
|
const a = document.createElement('a')
|
||||||
|
a.setAttribute('href', entry.href)
|
||||||
|
|
||||||
|
const filename = document.createElement('span')
|
||||||
|
filename.appendChild(document.createTextNode(entry.name))
|
||||||
|
|
||||||
|
const loading = document.createElement('div')
|
||||||
|
loading.setAttribute('class', 'unread-counter')
|
||||||
|
loading.style.display = 'none'
|
||||||
|
|
||||||
|
// draw attention to the newly added app entry
|
||||||
|
// by flashing twice the more apps menu
|
||||||
|
if (addedApps[entry.id]) {
|
||||||
|
a.classList.add('animated')
|
||||||
|
}
|
||||||
|
|
||||||
|
a.prepend(imgElement.content.firstChild, loading, filename)
|
||||||
|
li.append(a)
|
||||||
|
|
||||||
|
// add app icon to the navigation
|
||||||
|
const previousElement = document.querySelector(`#navigation li[data-id=${previousEntry.id}]`)
|
||||||
|
if (previousElement) {
|
||||||
|
previousElement.insertAdjacentElement('afterend', li)
|
||||||
|
} else {
|
||||||
|
document.querySelector('#navigation #apps ul').prepend(li)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (document.getElementById('appmenu').querySelector(`li[data-id="${entry.id}"]`) === null) {
|
||||||
|
const li = document.createElement('li')
|
||||||
|
li.dataset.id = entry.id
|
||||||
|
// Generating svg embedded image (see layout.user.php)
|
||||||
|
let img
|
||||||
|
if (OCA.Theming && OCA.Theming.inverted) {
|
||||||
|
img = `<svg width="20" height="20" viewBox="0 0 20 20" alt="">
|
||||||
|
<defs>
|
||||||
|
<filter id="invert"><feColorMatrix in="SourceGraphic" type="matrix" values="-1 0 0 0 1 0 -1 0 0 1 0 0 -1 0 1 0 0 0 1 0" /></filter>
|
||||||
|
</defs>
|
||||||
|
<image x="0" y="0" width="20" height="20" preserveAspectRatio="xMinYMin meet" filter="url(#invert)" xlink:href="${entry.icon}" class="app-icon" />
|
||||||
|
</svg>`
|
||||||
|
} else {
|
||||||
|
img = `<svg width="20" height="20" viewBox="0 0 20 20" alt="">
|
||||||
|
<image x="0" y="0" width="20" height="20" preserveAspectRatio="xMinYMin meet" xlink:href="${entry.icon}" class="app-icon" />
|
||||||
|
</svg>`
|
||||||
|
}
|
||||||
|
const imgElement = document.createElement('template')
|
||||||
|
imgElement.innerHTML = img
|
||||||
|
|
||||||
|
const a = document.createElement('a')
|
||||||
|
a.setAttribute('href', entry.href)
|
||||||
|
|
||||||
|
const filename = document.createElement('span')
|
||||||
|
filename.appendChild(document.createTextNode(entry.name))
|
||||||
|
|
||||||
|
const loading = document.createElement('div')
|
||||||
|
loading.setAttribute('class', 'icon-loading-dark')
|
||||||
|
loading.style.display = 'none'
|
||||||
|
|
||||||
|
// draw attention to the newly added app entry
|
||||||
|
// by flashing twice the more apps menu
|
||||||
|
if (addedApps[entry.id]) {
|
||||||
|
a.classList.add('animated')
|
||||||
|
}
|
||||||
|
|
||||||
|
a.prepend(loading, filename, imgElement.content.firstChild)
|
||||||
|
li.append(a)
|
||||||
|
|
||||||
|
// add app icon to the navigation
|
||||||
|
const previousElement = document.querySelector('#appmenu li[data-id=' + previousEntry.id + ']')
|
||||||
|
if (previousElement) {
|
||||||
|
previousElement.insertAdjacentElement('afterend', li)
|
||||||
|
} else {
|
||||||
|
document.queryElementById('appmenu').prepend(li)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
previousEntry = entry
|
||||||
|
})
|
||||||
|
window.dispatchEvent(new Event('resize'))
|
||||||
|
})
|
||||||
|
}
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
Loading…
Reference in New Issue