From 223f3025f0c5f6dd335eafced0f44c47f77977ef Mon Sep 17 00:00:00 2001 From: Sam Georges Date: Fri, 11 Jul 2014 18:50:11 +1000 Subject: [PATCH] Adds a hint system to the backend --- modules/backend/assets/css/october.css | 32 +++++++---- modules/backend/assets/js/october.tab.js | 2 +- .../backend/assets/less/controls/common.less | 20 +++++++ modules/backend/assets/less/controls/tab.less | 22 ++++---- modules/backend/classes/Controller.php | 54 ++++++++++++++++++- modules/backend/layouts/_hint.htm | 26 +++++++++ 6 files changed, 132 insertions(+), 24 deletions(-) create mode 100644 modules/backend/layouts/_hint.htm diff --git a/modules/backend/assets/css/october.css b/modules/backend/assets/css/october.css index fb406fc2b..4b41dcee0 100644 --- a/modules/backend/assets/css/october.css +++ b/modules/backend/assets/css/october.css @@ -9289,6 +9289,9 @@ table.table.data tr.list-tree-level-25 td.list-data-column-1 { font-weight: bold; } .control-simplelist.is-selectable li a { + padding: 5px 10px; + margin: -5px -10px; + display: block; color: #333333; } .control-simplelist.is-selectable li:hover { @@ -10412,6 +10415,9 @@ html.cssanimations .cursor-loading-indicator.hide { font-size: 14px; margin-bottom: 20px; } +.callout > .close { + margin: 15px 15px 0 0; +} .callout.callout-danger > .header { background: #f6b5b2; } @@ -10521,6 +10527,13 @@ html.cssanimations .cursor-loading-indicator.hide { .callout > .content .action-panel { padding: 10px 0 0 0; } +.callout.no-icon > .header h3, +.callout.no-icon > .header p { + margin-left: 0; +} +.callout.no-subheader > .header i { + margin-top: -5px; +} .dropdown-menu { padding: 0; background: transparent; @@ -11027,7 +11040,7 @@ body.dropdown-open .dropdown-overlay { } .control-tabs.content-tabs > ul.nav-tabs li { margin-right: 0; - border-top: 1px solid transparent; + border-top: 1px solid #e3e5e7; border-right: 1px solid #e3e5e7; } .control-tabs.content-tabs > ul.nav-tabs li a { @@ -11039,24 +11052,17 @@ body.dropdown-open .dropdown-overlay { background: transparent; } .control-tabs.content-tabs > ul.nav-tabs li:first-child { - border-left: 1px solid transparent; -} -.control-tabs.content-tabs > ul.nav-tabs li:first-child.active { border-left: 1px solid #e3e5e7; } .control-tabs.content-tabs > ul.nav-tabs li:last-child { - border-right: none; + border-right: 1px solid #e3e5e7; } .control-tabs.content-tabs > ul.nav-tabs li.active { - border-top: 1px solid #e3e5e7; background: #ffffff; } .control-tabs.content-tabs > ul.nav-tabs li.active a { font-weight: 600; } -.control-tabs.content-tabs > ul.nav-tabs li.active:last-child { - border-right: 1px solid #e3e5e7; -} .control-tabs.content-tabs > .tab-content > .tab-pane { padding-top: 0; } @@ -11071,8 +11077,14 @@ body.dropdown-open .dropdown-overlay { .control-tabs.content-tabs.tabs-flush > ul.nav-tabs li { border-top: none; } +.control-tabs.content-tabs.tabs-flush > ul.nav-tabs li:last-child { + border-right: 1px solid transparent; +} .control-tabs.content-tabs.tabs-flush > ul.nav-tabs li:first-child { - border-left: none; + border-left: 1px solid transparent; +} +.control-tabs.content-tabs.tabs-flush > ul.nav-tabs li.active:last-child { + border-right: 1px solid #e3e5e7; } .hide-tabs .control-tabs ul.nav-tabs { display: none; diff --git a/modules/backend/assets/js/october.tab.js b/modules/backend/assets/js/october.tab.js index 3def74610..25e6c40dc 100644 --- a/modules/backend/assets/js/october.tab.js +++ b/modules/backend/assets/js/october.tab.js @@ -128,7 +128,7 @@ } Tab.prototype.initTab = function(li) { - var + var $tabs = $('>li', this.$tabsContainer), tabIndex = $tabs.index(li), time = new Date().getTime(), diff --git a/modules/backend/assets/less/controls/common.less b/modules/backend/assets/less/controls/common.less index 63f6e3a2d..75c3958b4 100644 --- a/modules/backend/assets/less/controls/common.less +++ b/modules/backend/assets/less/controls/common.less @@ -41,6 +41,10 @@ font-size: 14px; margin-bottom: @line-height-computed; + > .close { + margin: 15px 15px 0 0; + } + &.callout-danger { > .header { background: @callout-danger-header-bg; @@ -136,4 +140,20 @@ padding: 10px 0 0 0; } } + + &.no-icon { + > .header { + h3, p { + margin-left: 0; + } + } + } + + &.no-subheader { + > .header { + i { + margin-top: -5px; + } + } + } } \ No newline at end of file diff --git a/modules/backend/assets/less/controls/tab.less b/modules/backend/assets/less/controls/tab.less index d558c606b..843bf7ca6 100644 --- a/modules/backend/assets/less/controls/tab.less +++ b/modules/backend/assets/less/controls/tab.less @@ -261,7 +261,7 @@ li { margin-right: 0; - border-top: 1px solid transparent; + border-top: 1px solid @color-tab-content-border; border-right: 1px solid @color-tab-content-border; a { @@ -274,26 +274,18 @@ } &:first-child { - border-left: 1px solid transparent; - &.active { - border-left: 1px solid @color-tab-content-border; - } + border-left: 1px solid @color-tab-content-border; } &:last-child { - border-right: none; + border-right: 1px solid @color-tab-content-border; } &.active { - border-top: 1px solid @color-tab-content-border; background: @color-tab-content-active-bg; a { font-weight: 600; } - - &:last-child { - border-right: 1px solid @color-tab-content-border; - } } } } @@ -323,8 +315,14 @@ li { border-top: none; } + li:last-child { + border-right: 1px solid transparent; + } li:first-child { - border-left: none; + border-left: 1px solid transparent; + } + li.active:last-child { + border-right: 1px solid @color-tab-content-border; } } } diff --git a/modules/backend/classes/Controller.php b/modules/backend/classes/Controller.php index 1c8d46cbb..c8bba10ec 100644 --- a/modules/backend/classes/Controller.php +++ b/modules/backend/classes/Controller.php @@ -13,8 +13,10 @@ use Redirect; use Response; use Exception; use BackendAuth; +use Backend\Models\UserPreferences; use Backend\Models\BackendPreferences; use System\Classes\SystemException; +use System\Classes\ApplicationException; use October\Rain\Extension\Extendable; use October\Rain\Support\ValidationException; use Illuminate\Database\Eloquent\MassAssignmentException; @@ -92,7 +94,7 @@ class Controller extends Extendable /** * @var array Default methods which cannot be called as actions. */ - public $hiddenActions = ['run', 'actionExists', 'pageAction', 'getId', 'handleError']; + public $hiddenActions = ['run', 'actionExists', 'pageAction', 'getId', 'setStatusCode', 'handleError', 'makeHintPartial']; /** * @var array Controller specified methods which cannot be called as actions. @@ -478,4 +480,54 @@ class Controller extends Extendable $this->fatalError = $exception->getMessage(); $this->vars['fatalError'] = $exception->getMessage(); } + + // + // Hints + // + + /** + * Renders a hint partial, used for displaying informative information that + * can be hidden by the user. + * @param string $name Unique key name + * @param string $partial Reference to content (partial name) + * @param array $params Extra parameters + * @return string + */ + public function makeHintPartial($name, $partial, array $params = []) + { + return $this->makeLayoutPartial('hint', [ + 'hintName' => $name, + 'hintPartial' => $partial, + 'hintParams' => $params + ] + $params); + } + + /** + * Ajax handler to hide a backend hint, once hidden the partial + * will no longer display for the user. + * @return void + */ + public function onHideBackendHint() + { + if (!$name = post('name')) + throw new ApplicationException('Missing a hint name.'); + + $preferences = UserPreferences::forUser(); + $hiddenHints = $preferences->get('backend::hints.hidden', []); + $hiddenHints[$name] = 1; + + $preferences->set('backend::hints.hidden', $hiddenHints); + } + + /** + * Checks if a hint has been hidden by the user. + * @param string $name Unique key name + * @return boolean + */ + public function isBackendHintHidden($name) + { + $hiddenHints = UserPreferences::forUser()->get('backend::hints.hidden', []); + return array_key_exists($name, $hiddenHints); + } + } \ No newline at end of file diff --git a/modules/backend/layouts/_hint.htm b/modules/backend/layouts/_hint.htm new file mode 100644 index 000000000..1d8ae6288 --- /dev/null +++ b/modules/backend/layouts/_hint.htm @@ -0,0 +1,26 @@ + +isBackendHintHidden($hintName)): ?> +
+ + + + +
+ +

+

+
+ +
+ makePartial($hintPartial, $hintParams) ?> +
+
+ \ No newline at end of file