diff --git a/admin/templates/setting.mustache b/admin/templates/setting.mustache index f7f2c568e40..dbe89e26254 100644 --- a/admin/templates/setting.mustache +++ b/admin/templates/setting.mustache @@ -29,6 +29,7 @@ * element - The Element HTML * forceltr - Force this element to be displayed LTR * default - Default value + * dependenton - optional message listing the settings this one is dependent on Example context (json): { @@ -68,5 +69,6 @@
{{{default}}}
{{/default}}
{{{description}}}
+ {{#dependenton}}
{{{.}}}
{{/dependenton}} diff --git a/lang/en/admin.php b/lang/en/admin.php index 0cedfb063af..257381f2d93 100644 --- a/lang/en/admin.php +++ b/lang/en/admin.php @@ -1103,6 +1103,7 @@ $string['sessioncookiedomain'] = 'Cookie domain'; $string['sessioncookiepath'] = 'Cookie path'; $string['sessionhandling'] = 'Session handling'; $string['sessiontimeout'] = 'Timeout'; +$string['settingdependenton'] = 'This setting may be hidden, based on the value of {$a}'; $string['settingfileuploads'] = 'File uploading is required for normal operation, please enable it in PHP configuration.'; $string['settingmemorylimit'] = 'Insufficient memory detected, please set higher memory limit in PHP settings.'; $string['settingsafemode'] = 'Moodle is not fully compatible with safe mode, please ask server administrator to turn it off. Running Moodle under safe mode is not supported, please expect various problems if you do so.'; diff --git a/lib/adminlib.php b/lib/adminlib.php index 22c805d7143..edf599878df 100644 --- a/lib/adminlib.php +++ b/lib/adminlib.php @@ -1554,6 +1554,17 @@ class admin_settingpage implements part_of_admin_tree { */ public function hide_if($settingname, $dependenton, $condition = 'notchecked', $value = '1') { $this->dependencies[] = new admin_settingdependency($settingname, $dependenton, $condition, $value); + + // Reformat the dependency name to the plugin | name format used in the display. + $dependenton = str_replace('/', ' | ', $dependenton); + + // Let the setting know, so it can be displayed underneath. + $findname = str_replace('/', '', $settingname); + foreach ($this->settings as $name => $setting) { + if ($name === $findname) { + $setting->add_dependent_on($dependenton); + } + } } /** @@ -1663,6 +1674,8 @@ abstract class admin_setting { private $flags = array(); /** @var bool Whether this field must be forced LTR. */ private $forceltr = null; + /** @var array list of other settings that may cause this setting to be hidden */ + private $dependenton = []; /** * Constructor @@ -2032,6 +2045,22 @@ abstract class admin_setting { public function set_force_ltr($value) { $this->forceltr = $value; } + + /** + * Add a setting to the list of those that could cause this one to be hidden + * @param string $dependenton + */ + public function add_dependent_on($dependenton) { + $this->dependenton[] = $dependenton; + } + + /** + * Get a list of the settings that could cause this one to be hidden. + * @return array + */ + public function get_dependent_on() { + return $this->dependenton; + } } /** @@ -8683,6 +8712,10 @@ function format_admin_setting($setting, $title='', $form='', $description='', $l $context->error = $adminroot->errors[$context->fullname]->error; } + if ($dependenton = $setting->get_dependent_on()) { + $context->dependenton = get_string('settingdependenton', 'admin', implode(', ', $dependenton)); + } + $context->id = 'admin-' . $setting->name; $context->title = highlightfast($query, $title); $context->name = highlightfast($query, $context->name); diff --git a/lib/amd/build/showhidesettings.min.js b/lib/amd/build/showhidesettings.min.js index 2e1719fad4d..c3803c7fd2c 100644 --- a/lib/amd/build/showhidesettings.min.js +++ b/lib/amd/build/showhidesettings.min.js @@ -1 +1 @@ -define(["jquery"],function(a){function b(a){return a.is("input[type=hidden]")&&a.siblings('input[type=checkbox][name="'+a.attr("name")+'"]').length}function c(a,b){return a.is("input[type=radio]")&&a.attr("value")!==b}function d(a,d){return!b(a)&&!c(a,d)}function e(a){return a.is("input[type=radio]")&&!a.prop("checked")}function f(a){return a.is("input[type=checkbox]")&&!a.prop("checked")}function g(a){return a.is("select")&&a.prop("multiple")}function h(a,b){var c=a.val()||[];if(!b.length)return!1;if(c.length!==b.length)return!1;for(var d in c)if(c.hasOwnProperty(d)&&b.indexOf(c[d])===-1)return!1;return!0}function i(b){return a('[name="'+b+'"],[name="'+b+'[]"]')}function j(b){return a(b).attr("name").replace(/\[]/,"")}function k(b,c,d){return a.isFunction(o[c])?o[c](b,d):o.defaultCondition(b,d)}function l(b,c){c=c||j(b.currentTarget);var d=i(c);if(n.hasOwnProperty(c)){var e={};a.each(n[c],function(b,c){a.each(c,function(c,f){var g=k(d,b,c);a.each(f,function(a,b){e.hasOwnProperty(b)?e[b]=e[b]||g:e[b]=g})})}),a.each(e,function(b,c){i(b).each(function(b,d){var e=a(d).closest(".form-item");e.length&&(c?e.hide():e.show())})})}}function m(){a.each(n,function(a){var b=i(a);b.length&&(b.on("change",l),l(null,a))})}var n,o={notchecked:function(b,c){var e=!1;return c=String(c),b.each(function(b,f){var g=a(f);d(g,c)&&(e=e||!g.prop("checked"))}),e},checked:function(b,c){var e=!1;return c=String(c),b.each(function(b,f){var g=a(f);d(g,c)&&(e=e||g.prop("checked"))}),e},noitemselected:function(b){var c=!1;return b.each(function(b,d){var e=a(d);c=c||e.prop("selectedIndex")===-1}),c},eq:function(c,d){var i=!1,j=!1;return d=String(d),c.each(function(c,k){var l=a(k);if(!e(l)){if(b(l))return void(j=l.val()===d);if(f(l))return void(i=i||j);if(g(l)){var m=d.split("|");return void(i=h(l,m))}i=i||l.val()===d}}),i},"in":function(c,d){var i=!1,j=!1,k=d.split("|");return c.each(function(c,d){var l=a(d);if(!e(l))return b(l)?void(j=k.indexOf(l.val())>-1):f(l)?void(i=i||j):g(l)?void(i=h(l,k)):void(i=i||k.indexOf(l.val())>-1)}),i},defaultCondition:function(c,d){var i=!1,j=!1;return d=String(d),c.each(function(c,k){var l=a(k);if(!e(l)){if(b(l))return void(j=l.val()!==d);if(f(l))return void(i=i||j);if(g(l)){var m=d.split("|");return void(i=!h(l,m))}i=i||l.val()!==d}}),i}};return{init:function(a){n=a.dependencies,m()}}}); \ No newline at end of file +define(["jquery"],function(a){function b(a){return a.is("input[type=hidden]")&&a.siblings('input[type=checkbox][name="'+a.attr("name")+'"]').length}function c(a,b){return a.is("input[type=radio]")&&a.attr("value")!==b}function d(a,d){return!b(a)&&!c(a,d)}function e(a){return a.is("input[type=radio]")&&!a.prop("checked")}function f(a){return a.is("input[type=checkbox]")&&!a.prop("checked")}function g(a){return a.is("select")&&a.prop("multiple")}function h(a,b){var c=a.val()||[];if(!b.length)return!1;if(c.length!==b.length)return!1;for(var d in c)if(c.hasOwnProperty(d)&&b.indexOf(c[d])===-1)return!1;return!0}function i(b){return a('[name="'+b+'"],[name="'+b+'[]"]')}function j(b){return a(b).attr("name").replace(/\[]/,"")}function k(b,c,d){return a.isFunction(p[c])?p[c](b,d):p.defaultCondition(b,d)}function l(b,c){c=c||j(b.currentTarget);var d=i(c);if(o.hasOwnProperty(c)){var e={};a.each(o[c],function(b,c){a.each(c,function(c,f){var g=k(d,b,c);a.each(f,function(a,b){e.hasOwnProperty(b)?e[b]=e[b]||g:e[b]=g})})}),a.each(e,function(b,c){i(b).each(function(b,d){var e=a(d).closest(".form-item");e.length&&(c?e.hide():e.show())})})}}function m(){a.each(o,function(a){var b=i(a);b.length&&(b.on("change",l),l(null,a))})}function n(){a(".form-dependenton").hide()}var o,p={notchecked:function(b,c){var e=!1;return c=String(c),b.each(function(b,f){var g=a(f);d(g,c)&&(e=e||!g.prop("checked"))}),e},checked:function(b,c){var e=!1;return c=String(c),b.each(function(b,f){var g=a(f);d(g,c)&&(e=e||g.prop("checked"))}),e},noitemselected:function(b){var c=!1;return b.each(function(b,d){var e=a(d);c=c||e.prop("selectedIndex")===-1}),c},eq:function(c,d){var i=!1,j=!1;return d=String(d),c.each(function(c,k){var l=a(k);if(!e(l)){if(b(l))return void(j=l.val()===d);if(f(l))return void(i=i||j);if(g(l)){var m=d.split("|");return void(i=h(l,m))}i=i||l.val()===d}}),i},"in":function(c,d){var i=!1,j=!1,k=d.split("|");return c.each(function(c,d){var l=a(d);if(!e(l))return b(l)?void(j=k.indexOf(l.val())>-1):f(l)?void(i=i||j):g(l)?void(i=h(l,k)):void(i=i||k.indexOf(l.val())>-1)}),i},defaultCondition:function(c,d){var i=!1,j=!1;return d=String(d),c.each(function(c,k){var l=a(k);if(!e(l)){if(b(l))return void(j=l.val()!==d);if(f(l))return void(i=i||j);if(g(l)){var m=d.split("|");return void(i=!h(l,m))}i=i||l.val()!==d}}),i}};return{init:function(a){o=a.dependencies,m(),n()}}}); \ No newline at end of file diff --git a/lib/amd/src/showhidesettings.js b/lib/amd/src/showhidesettings.js index 1a1236c39d3..b260438246e 100644 --- a/lib/amd/src/showhidesettings.js +++ b/lib/amd/src/showhidesettings.js @@ -328,10 +328,18 @@ define(['jquery'], function($) { }); } + /** + * Hide the 'this setting may be hidden' messages. + */ + function hideDependencyInfo() { + $('.form-dependenton').hide(); + } + return { init: function(opts) { dependencies = opts.dependencies; initHandlers(); + hideDependencyInfo(); } }; }); \ No newline at end of file diff --git a/theme/bootstrapbase/templates/core_admin/setting.mustache b/theme/bootstrapbase/templates/core_admin/setting.mustache index ed172466eba..f8441ec8c93 100644 --- a/theme/bootstrapbase/templates/core_admin/setting.mustache +++ b/theme/bootstrapbase/templates/core_admin/setting.mustache @@ -29,6 +29,7 @@ * element - The Element HTML * forceltr - Force this element to be displayed LTR * default - Default value + * dependenton - optional message listing the settings this one is dependent on Example context (json): { @@ -66,4 +67,5 @@ {{/default}}
{{{description}}}
+ {{#dependenton}}
{{{.}}}
{{/dependenton}}