From 42cdafbc645e0245258645689514f3834c8b8eae Mon Sep 17 00:00:00 2001 From: John Cowen Date: Thu, 26 Dec 2019 10:07:11 +0000 Subject: [PATCH 1/7] ui: Change action-group to use new popup-menu component in intentions --- .../base/components/display-toggle/index.scss | 2 + .../components/display-toggle/layout.scss | 7 +++ .../base/components/display-toggle/skin.scss | 3 + .../base/components/menu-panel/index.scss | 6 ++ .../base/components/menu-panel/layout.scss | 42 ++++++++++++++ .../base/components/menu-panel/skin.scss | 20 +++++++ .../base/components/popover-menu/index.scss | 5 ++ .../base/components/popover-menu/layout.scss | 16 +++++ .../base/components/popover-menu/skin.scss | 9 +++ ui-v2/app/styles/components/index.scss | 2 +- .../components/main-nav-horizontal/index.scss | 7 --- .../main-nav-horizontal/layout.scss | 58 +++---------------- .../components/main-nav-horizontal/skin.scss | 24 +------- ui-v2/app/styles/components/table.scss | 10 ++++ ui-v2/app/styles/core/typography.scss | 6 +- ui-v2/app/templates/dc/intentions/index.hbs | 23 ++++---- 16 files changed, 147 insertions(+), 93 deletions(-) create mode 100644 ui-v2/app/styles/base/components/display-toggle/index.scss create mode 100644 ui-v2/app/styles/base/components/display-toggle/layout.scss create mode 100644 ui-v2/app/styles/base/components/display-toggle/skin.scss create mode 100644 ui-v2/app/styles/base/components/popover-menu/index.scss create mode 100644 ui-v2/app/styles/base/components/popover-menu/layout.scss create mode 100644 ui-v2/app/styles/base/components/popover-menu/skin.scss diff --git a/ui-v2/app/styles/base/components/display-toggle/index.scss b/ui-v2/app/styles/base/components/display-toggle/index.scss new file mode 100644 index 000000000000..bc182521964a --- /dev/null +++ b/ui-v2/app/styles/base/components/display-toggle/index.scss @@ -0,0 +1,2 @@ +@import './skin'; +@import './layout'; diff --git a/ui-v2/app/styles/base/components/display-toggle/layout.scss b/ui-v2/app/styles/base/components/display-toggle/layout.scss new file mode 100644 index 000000000000..050c10f5bcb2 --- /dev/null +++ b/ui-v2/app/styles/base/components/display-toggle/layout.scss @@ -0,0 +1,7 @@ +%display-toggle-siblings, +%display-toggle-siblings ~ *:not(.animating):not(label) { + display: none; +} +%display-toggle-siblings:checked ~ *:not(label) { + display: block; +} diff --git a/ui-v2/app/styles/base/components/display-toggle/skin.scss b/ui-v2/app/styles/base/components/display-toggle/skin.scss new file mode 100644 index 000000000000..923a9a578c89 --- /dev/null +++ b/ui-v2/app/styles/base/components/display-toggle/skin.scss @@ -0,0 +1,3 @@ +%display-toggle-siblings ~ label { + cursor: pointer; +} diff --git a/ui-v2/app/styles/base/components/menu-panel/index.scss b/ui-v2/app/styles/base/components/menu-panel/index.scss index 68e1f002524a..9858d1354e9f 100644 --- a/ui-v2/app/styles/base/components/menu-panel/index.scss +++ b/ui-v2/app/styles/base/components/menu-panel/index.scss @@ -1,6 +1,12 @@ @import './skin'; @import './layout'; +%menu-panel [role='separator'] { + @extend %menu-panel-separator; +} +%menu-panel > div { + @extend %menu-panel-header; +} %menu-panel > ul > li > * { @extend %internal-button; } diff --git a/ui-v2/app/styles/base/components/menu-panel/layout.scss b/ui-v2/app/styles/base/components/menu-panel/layout.scss index 740cd7088eb5..febf23568f37 100644 --- a/ui-v2/app/styles/base/components/menu-panel/layout.scss +++ b/ui-v2/app/styles/base/components/menu-panel/layout.scss @@ -2,6 +2,9 @@ position: absolute; overflow: hidden; } +%menu-panel > ul > li > * { + position: relative; +} %menu-panel:not(.left) { right: 0px; } @@ -26,3 +29,42 @@ %menu-panel > ul > li > * { text-align: left !important; } +%menu-panel-separator { + padding-top: 0.35em; +} +%menu-panel-separator:not(:first-child) { + margin-top: 0.35em; +} +%menu-panel-separator:not(:empty) { + padding-left: 1em; + padding-right: 1em; + padding-bottom: 0.1em; +} +%menu-panel-header { + padding: 10px; + padding-left: 36px; +} +%menu-panel .is-active > *::after { + position: absolute; + top: 50%; + margin-top: -8px; + right: 10px; +} +%menu-panel-header::before { + position: absolute; + left: 15px; + top: calc(10px + 0.1em); +} +%menu-panel-header { + max-width: fit-content; +} +@supports not (max-width: fit-content) { + %menu-panel-header { + max-width: 200px; + } +} +@media #{$--lt-horizontal-nav} { + %menu-panel-header { + text-align: left; + } +} diff --git a/ui-v2/app/styles/base/components/menu-panel/skin.scss b/ui-v2/app/styles/base/components/menu-panel/skin.scss index 9d122d7510a2..67dab268289b 100644 --- a/ui-v2/app/styles/base/components/menu-panel/skin.scss +++ b/ui-v2/app/styles/base/components/menu-panel/skin.scss @@ -10,3 +10,23 @@ %menu-panel > ul > li { list-style-type: none; } +%menu-panel-separator { + text-transform: uppercase; + color: $gray-400; +} +%menu-panel-header + ul, +%menu-panel-separator:not(:first-child) { + border-top: $decor-border-100; + border-color: $gray-300; +} +%menu-panel-header { + background-color: $gray-050; +} +%menu-panel-header::before { + @extend %with-info-circle-fill-color-icon, %as-pseudo; + font-size: 1.1em; +} +%menu-panel .is-active > *::after { + @extend %with-check-plain-mask, %as-pseudo; + background-color: $magenta-600; +} diff --git a/ui-v2/app/styles/base/components/popover-menu/index.scss b/ui-v2/app/styles/base/components/popover-menu/index.scss new file mode 100644 index 000000000000..3e649ab5f5e2 --- /dev/null +++ b/ui-v2/app/styles/base/components/popover-menu/index.scss @@ -0,0 +1,5 @@ +@import '../display-toggle/index'; +@import '../toggle-button/index'; +@import '../menu-panel/index'; +@import './skin'; +@import './layout'; diff --git a/ui-v2/app/styles/base/components/popover-menu/layout.scss b/ui-v2/app/styles/base/components/popover-menu/layout.scss new file mode 100644 index 000000000000..e27420a4484b --- /dev/null +++ b/ui-v2/app/styles/base/components/popover-menu/layout.scss @@ -0,0 +1,16 @@ +%more-popover-menu { + @extend %display-toggle-siblings; +} +%more-popover-menu + label > * { + @extend %toggle-button; +} +%more-popover-menu + label + div { + @extend %menu-panel; + width: 192px; +} +%more-popover-menu + label + div:not(.above) { + top: 38px; +} +%more-popover-menu + label + div:not(.left) { + right: 10px; +} diff --git a/ui-v2/app/styles/base/components/popover-menu/skin.scss b/ui-v2/app/styles/base/components/popover-menu/skin.scss new file mode 100644 index 000000000000..c0e6ae727ff8 --- /dev/null +++ b/ui-v2/app/styles/base/components/popover-menu/skin.scss @@ -0,0 +1,9 @@ +%more-popover-menu + label > *::after { + @extend %with-more-horizontal-icon, %as-pseudo; + opacity: 0.7; + width: 16px; + height: 16px; +} +%more-popover-menu + label > * { + font-size: 0; +} diff --git a/ui-v2/app/styles/components/index.scss b/ui-v2/app/styles/components/index.scss index 445d0d8f8ff8..a22ddb64982e 100644 --- a/ui-v2/app/styles/components/index.scss +++ b/ui-v2/app/styles/components/index.scss @@ -1,3 +1,4 @@ +@import './form-elements'; @import './breadcrumbs'; @import './anchors'; @import './progress'; @@ -24,7 +25,6 @@ @import './phrase-editor'; @import './filter-bar'; @import './tomography-graph'; -@import './action-group'; @import './flash-message'; @import './code-editor'; @import './confirmation-dialog'; diff --git a/ui-v2/app/styles/components/main-nav-horizontal/index.scss b/ui-v2/app/styles/components/main-nav-horizontal/index.scss index e2b4044f74bb..ae5d8bd33747 100644 --- a/ui-v2/app/styles/components/main-nav-horizontal/index.scss +++ b/ui-v2/app/styles/components/main-nav-horizontal/index.scss @@ -21,10 +21,3 @@ %main-nav-horizontal-drop-nav { @extend %menu-panel; } -/*TODO: %menu-panel? */ -%main-nav-horizontal-drop-nav [role='separator'] { - @extend %main-nav-horizontal-drop-nav-separator; -} -%main-nav-horizontal-drop-nav > div { - @extend %main-nav-horizontal-drop-nav-header; -} diff --git a/ui-v2/app/styles/components/main-nav-horizontal/layout.scss b/ui-v2/app/styles/components/main-nav-horizontal/layout.scss index 6bbdd50edccb..18ebff58842c 100644 --- a/ui-v2/app/styles/components/main-nav-horizontal/layout.scss +++ b/ui-v2/app/styles/components/main-nav-horizontal/layout.scss @@ -1,64 +1,27 @@ -%main-nav-horizontal > ul > li, -%main-nav-horizontal-drop-nav a { - position: relative; -} %main-nav-horizontal [type='checkbox'] ~ div { display: none; } %main-nav-horizontal [type='checkbox']:checked ~ div { display: block; } +%main-nav-horizontal [type='checkbox'] + label > * { + /* less space as the chevron adds space */ + padding-right: 4px !important; +} +%main-nav-horizontal > ul > li { + position: relative; +} %main-nav-horizontal-action { display: block; padding: 5px 12px; white-space: nowrap; } -%main-nav-horizontal input + label > * { - /* less space as the chevron adds space */ - padding-right: 4px !important; -} %main-nav-horizontal-drop-nav { z-index: 400; /* TODO: We should probably make menu-panel default to left hand side*/ left: 0; right: auto; } -/* TODO: Revisit this once its part of menu-panel as its probably */ -/* a property of that */ -%main-nav-horizontal-drop-nav-separator:not(:empty) { - padding-left: 1em; - padding-right: 1em; - padding-bottom: 0.1em; -} -%main-nav-horizontal-drop-nav-separator { - padding-top: 0.35em; -} -%main-nav-horizontal-drop-nav-separator:not(:first-child) { - margin-top: 0.35em; -} -%main-nav-horizontal-drop-nav-header { - padding: 10px; - padding-left: 36px; -} -%main-nav-horizontal-drop-nav-header::before { - position: absolute; - left: 15px; - top: calc(10px + 0.1em); -} -%main-nav-horizontal-drop-nav-header { - max-width: fit-content; -} -@supports not (max-width: fit-content) { - %main-nav-horizontal-drop-nav-header { - max-width: 200px; - } -} -%main-nav-horizontal-drop-nav .is-active > *::after { - position: absolute; - top: 50%; - margin-top: -8px; - right: 10px; -} @media #{$--lt-horizontal-nav} { %main-nav-horizontal-panel label span { visibility: visible !important; @@ -120,9 +83,7 @@ } %main-nav-horizontal-drop-nav { width: 180px; - } - %main-nav-horizontal-drop-nav-header { - text-align: left; + top: 38px !important; } %main-nav-horizontal input + label > * { right: -15px; @@ -132,9 +93,6 @@ padding-top: 15px; padding-bottom: 15px; } - %main-nav-horizontal-drop-nav { - top: 38px !important; - } } @media #{$--horizontal-nav} { %main-nav-horizontal-panel { diff --git a/ui-v2/app/styles/components/main-nav-horizontal/skin.scss b/ui-v2/app/styles/components/main-nav-horizontal/skin.scss index 5789d79dd7f7..d0ea088e0489 100644 --- a/ui-v2/app/styles/components/main-nav-horizontal/skin.scss +++ b/ui-v2/app/styles/components/main-nav-horizontal/skin.scss @@ -35,14 +35,14 @@ %main-nav-horizontal input { display: none; } -%main-nav-horizontal input + label > *::after { +%main-nav-horizontal [type='checkbox'] + label > *::after { @extend %as-pseudo; @extend %with-chevron-down-mask; position: relative; top: 2px; background-color: $white; } -%main-nav-horizontal input:checked + label > *::after { +%main-nav-horizontal [type='checkbox']:checked + label > *::after { @extend %with-chevron-up-mask; } %main-nav-horizontal-toggle-button span { @@ -57,23 +57,3 @@ } } /**/ -%main-nav-horizontal-drop-nav-header { - background-color: $gray-050; -} -%main-nav-horizontal-drop-nav-separator { - text-transform: uppercase; - color: $gray-400; -} -%main-nav-horizontal-drop-nav .is-active > *::after { - @extend %with-check-plain-mask, %as-pseudo; - background-color: $magenta-600; -} -%main-nav-horizontal-drop-nav-header + ul, -%main-nav-horizontal-drop-nav-separator:not(:first-child) { - border-top: $decor-border-100; - border-color: $gray-300; -} -%main-nav-horizontal-drop-nav-header::before { - @extend %with-info-circle-fill-color-icon, %as-pseudo; - font-size: 1.1em; -} diff --git a/ui-v2/app/styles/components/table.scss b/ui-v2/app/styles/components/table.scss index 442040e7465c..5431f5afc306 100644 --- a/ui-v2/app/styles/components/table.scss +++ b/ui-v2/app/styles/components/table.scss @@ -1,8 +1,18 @@ @import '../base/components/table/index'; +@import '../base/components/popover-menu/index'; table { @extend %table, %table-flex; } +%table-actions [type='checkbox'] { + @extend %more-popover-menu; +} +%table-actions [type='checkbox'] + label { + position: absolute; + top: 8px; + right: 15px; +} + html.template-service.template-list td:first-child a span, html.template-node.template-show #services td:first-child a span, html.template-service.template-show #instances td:first-child a span { diff --git a/ui-v2/app/styles/core/typography.scss b/ui-v2/app/styles/core/typography.scss index d6c789cf947c..c09ad55cb68a 100644 --- a/ui-v2/app/styles/core/typography.scss +++ b/ui-v2/app/styles/core/typography.scss @@ -50,7 +50,7 @@ pre code, %form-element-label, %stats-card header a span, %footer, -%main-nav-horizontal-drop-nav > div, +%menu-panel-header, %app-view h1 span.kind-proxy { @extend %p2; } @@ -59,7 +59,7 @@ pre code, %main-content p, %app-view > div.disabled > div, %form-element-note, -%main-nav-horizontal-drop-nav-separator, +%menu-panel-separator, %form-element-error > strong { @extend %p3; } @@ -81,7 +81,7 @@ pre code, %splitter-card > header { font-weight: $typo-weight-bold; } -%main-nav-horizontal-drop-nav-separator { +%menu-panel-separator { font-weight: $typo-weight-medium; } /**/ diff --git a/ui-v2/app/templates/dc/intentions/index.hbs b/ui-v2/app/templates/dc/intentions/index.hbs index b689a4bb7dba..7c4bc2c0c263 100644 --- a/ui-v2/app/templates/dc/intentions/index.hbs +++ b/ui-v2/app/templates/dc/intentions/index.hbs @@ -63,16 +63,19 @@ {{#block-slot name='actions' as |index change checked|}} {{#confirmation-dialog confirming=false index=index message='Are you sure you want to delete this intention?'}} {{#block-slot name='action' as |confirm|}} - {{#action-group index=index onchange=(action change) checked=(if (eq checked index) 'checked')}} - - {{/action-group}} + {{#popover-menu}} + {{#block-slot name='trigger'}} + More + {{/block-slot}} + {{#block-slot name='menu'}} +
  • + Edit +
  • +
  • + +
  • + {{/block-slot}} + {{/popover-menu}} {{/block-slot}} {{#block-slot name='dialog' as |execute cancel message|}} {{delete-confirmation message=message execute=execute cancel=cancel}} From 6c2ec6c3a5d2a1d750c42838c781c8ea97277a3a Mon Sep 17 00:00:00 2001 From: John Cowen Date: Thu, 26 Dec 2019 10:08:33 +0000 Subject: [PATCH 2/7] ui: Slight amends to aria-menu to prevent scrolling --- ui-v2/app/components/aria-menu.js | 2 ++ ui-v2/app/components/toggle-button.js | 5 +++++ ui-v2/app/templates/components/popover-menu.hbs | 4 ++-- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/ui-v2/app/components/aria-menu.js b/ui-v2/app/components/aria-menu.js index 2e44215e253a..5717c7c34e24 100644 --- a/ui-v2/app/components/aria-menu.js +++ b/ui-v2/app/components/aria-menu.js @@ -83,6 +83,8 @@ export default Component.extend({ if (typeof keys[this.orientation][e.keyCode] === 'undefined') { return; } + // prevent any scroll, or default actions + e.preventDefault(); const $focused = this.dom.element(`${MENU_ITEMS}:focus`, this.$menu); let i; if ($focused) { diff --git a/ui-v2/app/components/toggle-button.js b/ui-v2/app/components/toggle-button.js index ed8148f0be0f..d9de9177e2e5 100644 --- a/ui-v2/app/components/toggle-button.js +++ b/ui-v2/app/components/toggle-button.js @@ -32,6 +32,11 @@ export default Component.extend({ click: function(e) { e.preventDefault(); this.input.checked = !this.input.checked; + // manually dispatched mouse events have a detail = 0 + // real mouse events have the number of click counts + if (e.detail !== 0) { + e.target.blur(); + } this.actions.change.apply(this, [e]); }, change: function(e) { diff --git a/ui-v2/app/templates/components/popover-menu.hbs b/ui-v2/app/templates/components/popover-menu.hbs index 125a9223c7a0..cb14d567b668 100644 --- a/ui-v2/app/templates/components/popover-menu.hbs +++ b/ui-v2/app/templates/components/popover-menu.hbs @@ -1,7 +1,7 @@ {{yield}} -{{#aria-menu as |change keydown ariaLabelledBy ariaControls expanded|}} +{{#aria-menu as |change keypress ariaLabelledBy ariaControls expanded|}} {{#toggle-button onchange=change as |click|}} - {{/toggle-button}}
    + {{#yield-slot name='header'}}
    {{yield}}
    {{else}} {{/yield-slot}} -