Index: HTML/EN/html/settings.js =================================================================== --- HTML/EN/html/settings.js (revision 12258) +++ HTML/EN/html/settings.js (working copy) @@ -33,20 +33,28 @@ case "HOME": url = "[% webroot %]home.html?" break - case "BASIC_PLAYER_SETTINGS": - url = "[% webroot %]setup.html?page=BASIC_PLAYER_SETTINGS&playerid=[% playerid | uri %]" - break - case "BASIC_SERVER_SETTINGS": - url = "[% webroot %]setup.html?page=BASIC_SERVER_SETTINGS&" - break } if (option) { - window.location = url + 'player=[% playerURI %][% IF playerid %]&playerid=[% playerid | uri %][% END %]'; + // change the mouse cursor so user gets some feedback + $('settingsForm').setStyle({cursor:'wait'}); + new Ajax.Updater( { success: 'settingsRegion' }, url, { + method: 'post', + postBody: 'ajaxUpdate=1&player=[% playerURI %][% IF playerid %]&playerid=[% playerid | uri %][% END %]', + evalScripts: true, + asynchronous: true, + onFailure: function(t) { + alert('Error -- ' + t.responseText); + }, + onComplete: function(t) { + $('settingsForm').setStyle({cursor:'auto'}); + $('statusarea').update(''); + } + } ); + document.forms.settingsForm.action = url; } } -var validateAll = true; function prefValidate(myPref, sync) { new Ajax.Request('/jsonrpc.js', { method: 'post', @@ -72,7 +80,6 @@ // preference did not validate - highlight the field if (json.result.valid == '0') { myPref.style.background = '#ffcccc'; - validateAll = false; } else { new Effect.Highlight(myPref.name, { @@ -107,9 +114,9 @@ new Event.observe(window, 'load', function(){ // add event handlers to all fields which have a validator - [%- FOREACH item = validate %] - new Event.observe('[% item %]', 'blur', function(){ prefValidate($('[% item %]')); } ); - [%- END %] + [%- FOREACH pref = validate; IF pref.value %] + new Event.observe('[% pref.key %]', 'blur', function(){ prefValidate($('[% pref.key %]')); } ); + [%- END; END %] // try to redirect all form submissions by return key to the default submit button // listen for keypress events on all form elements except submit @@ -129,15 +136,36 @@ new Event.observe(window, 'resize', function(){resizeSettingsSection();}); new Event.observe('saveSettings', 'click', function(e){ - [%- FOREACH item = validate %] - prefValidate($('[% item %]'), true); - [%- END %] + $('settingsForm').setStyle({cursor:'wait'}); + Event.stop(e); + $('settingsForm').request({ + parameters: { useAJAX: 1, rescan: '' }, + onComplete: function(response) { + var results = parseData(response.responseText); - // if validation fails and user doesn't force the submit, cancel - if (!validateAll && !confirm("[% "SETUP_VALIDATION_FAILED" | string %]")) { - Event.stop(e); - validateAll = true; - } + $('statusarea').update(results['warning']); + resizeSettingsSection(); + + // highlighted fields + for (field in results) { + if ($(field)) { + if (results[field] == '0') { + $(field).style.background = '#ffcccc'; + } + else { + new Effect.Highlight(field, { + duration: 0.5, + startcolor: '#99ff99', + endcolor: '#ffffff', + restorecolor: '#ffffff' + }); + } + } + } + + $('settingsForm').setStyle({cursor:'auto'}); + } + }); }); resizeSettingsSection(); Index: HTML/EN/settings/footer.html =================================================================== --- HTML/EN/settings/footer.html (revision 12258) +++ HTML/EN/settings/footer.html (working copy) @@ -20,6 +20,7 @@ +[% IF NOT ajaxUpdate %]
[% IF prefs || NOT playerid %] [% IF NOT nosubmit %][% END %] @@ -31,3 +32,6 @@ [% PROCESS pagefooter.html %] +[% ELSE %] + +[% END %] Index: HTML/EN/settings/header.html =================================================================== --- HTML/EN/settings/header.html (revision 12258) +++ HTML/EN/settings/header.html (working copy) @@ -1,3 +1,4 @@ +[% IF NOT ajaxUpdate %] [% FILTER null %] @@ -2,29 +3,24 @@ [% pwd_list = BLOCK %] - - [% IF playerid %] - [% "PLAYER_SETTINGS" | string %] [% IF playername %][% "FOR" | string %] [% playername %][% END %] - [% ELSE %] - [% "SERVER_SETTINGS" | string %] - [% END %] - - / [% page | string %] - - [% END %] - - [% pageHeaderInfo = BLOCK %] [%- PROCESS setting_chooser.html setting_chooser_noHome = 1 %] [% END %] + [% pageHeaderScripts = BLOCK %] [% pageHeaderScripts %] + [% END %] + [% pageHeaderInfo = BLOCK %] + [%#- PROCESS setting_chooser.html setting_chooser_noHome = 1 %] + [% END %] + [% END %] -[% pagetitle = page | string; pageicon = 'settings'; noSpacer = 1; PROCESS pageheader.html %] +[% IF playerid; pagetitle='PLAYER_SETTINGS' | string; ELSE; pagetitle = 'SERVER_SETTINGS' | string; END %] +[% pageicon = 'settings'; noSpacer = 1; PROCESS pageheader.html %] -
+
[% IF warning %] @@ -37,6 +33,8 @@
+[% END %] + [% IF playerid %][% END %] [% IF player %][% END %] Index: HTML/ExBrowse3/header.html =================================================================== --- HTML/ExBrowse3/header.html (revision 12258) +++ HTML/ExBrowse3/header.html (working copy) @@ -14,6 +14,7 @@ + [% END %] Index: Slim/Utils/PluginManager.pm =================================================================== --- Slim/Utils/PluginManager.pm (revision 12258) +++ Slim/Utils/PluginManager.pm (working copy) @@ -432,6 +432,8 @@ my @found = (); +# foreach my $name (keys %{$plugins}) { +# my $manifest = $plugins->{$name}; while (my ($name, $manifest) = each %{$plugins}) { if (defined $manifest->{$category} && $manifest->{$category} eq $opType) { Index: Slim/Utils/Prefs.pm =================================================================== --- Slim/Utils/Prefs.pm (revision 12258) +++ Slim/Utils/Prefs.pm (working copy) @@ -261,7 +261,7 @@ $prefs->init(\%defaults); # set validation functions - $prefs->setValidate( 'num', qw(displaytexttimeout browseagelimit remotestreamtimeout) ); + $prefs->setValidate( 'num', qw(displaytexttimeout browseagelimit remotestreamtimeout screensavertimeout) ); $prefs->setValidate( 'dir', qw(cachedir playlistdir audiodir artfolder) ); $prefs->setValidate( 'array', qw(guessFileFormats titleFormat disabledformats) ); Index: Slim/Web/Settings.pm =================================================================== --- Slim/Web/Settings.pm (revision 12258) +++ Slim/Web/Settings.pm (working copy) @@ -66,7 +66,7 @@ # Handle the simple case where validation is done by prefs obj. my ($prefsClass, @prefs) = $class->prefs($client); - my @doValidate; + my (@valid); for my $pref (@prefs) { @@ -74,23 +74,27 @@ my (undef, $ok) = $prefsClass->set($pref, $paramRef->{$pref}); - if (!$ok) { + if ($ok) { + $paramRef->{'validated'}->{$pref} = 1; + } + else { $paramRef->{'warning'} .= sprintf(Slim::Utils::Strings::string('SETTINGS_INVALIDVALUE'), $paramRef->{$pref}, $pref) . '
'; + $paramRef->{'validated'}->{$pref} = 0; } } - push @doValidate, $pref if $prefsClass->hasValidator($pref); - + $paramRef->{'validate'}->{$pref} = $prefsClass->hasValidator($pref); $paramRef->{'prefs'}->{$pref} = $prefsClass->get($pref); } - # values that can be validated client-side - $paramRef->{'validate'} = \@doValidate; - if ($prefsClass) { $paramRef->{'namespace'} = $prefsClass->namespace; } + if ($paramRef->{'saveSettings'} && !$paramRef->{'warning'}) { + $paramRef->{'warning'} = Slim::Utils::Strings::string('SETUP_CHANGES_SAVED'); + } + # Common values $paramRef->{'page'} = $class->name; @@ -101,7 +105,7 @@ $paramRef->{'playername'} = $client->name(); } - return Slim::Web::HTTP::filltemplatefile($class->page, $paramRef); + return Slim::Web::HTTP::filltemplatefile($paramRef->{'useAJAX'} ? 'settings/ajaxSettings.txt' : $class->page, $paramRef); } 1; Index: strings.txt =================================================================== --- strings.txt (revision 12260) +++ strings.txt (working copy) @@ -6383,9 +6383,9 @@ DE "%s" ist kein gültiger Wert für %s EN Invalid value "%s" for %s -SETUP_VALIDATION_FAILED - DE Einige Werte konnten nicht verifiziert werden.\nWollen Sie dennoch fortfahren? - EN Some values could not be validated.\nDo you want to continue? +SETUP_CHANGES_SAVED + DE Änderungen wurden gespeichert. + EN Changes have been saved. SETUP_CURRENT CS Aktuální