diff --git a/app/webpacker/controllers/vertical_ellipsis_menu_controller.js b/app/webpacker/controllers/vertical_ellipsis_menu_controller.js new file mode 100644 index 0000000000..4a0da14e87 --- /dev/null +++ b/app/webpacker/controllers/vertical_ellipsis_menu_controller.js @@ -0,0 +1,21 @@ +import { Controller } from "stimulus"; + +export default class extends Controller { + static targets = ["content"]; + + connect() { + super.connect(); + window.addEventListener("click", (e) => { + if (this.element.contains(e.target)) return; + this.#hide(); + }); + } + + toggle() { + this.contentTarget.classList.toggle("show"); + } + + #hide() { + this.contentTarget.classList.remove("show"); + } +} diff --git a/app/webpacker/css/admin_v3/all.scss b/app/webpacker/css/admin_v3/all.scss index d9358e7a1b..f2d6fe5bd4 100644 --- a/app/webpacker/css/admin_v3/all.scss +++ b/app/webpacker/css/admin_v3/all.scss @@ -113,6 +113,7 @@ @import "../admin/reports"; @import "components/select2"; // admin_v3 @import "components/sidebar-item"; // admin_v3 +@import "components/vertical_ellipsis_menu"; // admin_v3 and only V3 @import "../admin/side_menu"; @import "../admin/tables"; @import "../admin/tag_rules"; diff --git a/app/webpacker/css/admin_v3/components/vertical_ellipsis_menu.scss b/app/webpacker/css/admin_v3/components/vertical_ellipsis_menu.scss new file mode 100644 index 0000000000..de35c98455 --- /dev/null +++ b/app/webpacker/css/admin_v3/components/vertical_ellipsis_menu.scss @@ -0,0 +1,62 @@ +.vertical-ellipsis-menu { + position: relative; + width: $btn-relaxed-height; + + i.fa-ellipsis-v { + cursor: pointer; + display: block; + height: $btn-relaxed-height; + width: $btn-relaxed-height; + line-height: $btn-relaxed-height; + text-align: center; + border-radius: 3px; + background-color: white; + } + + .vertical-ellipsis-menu-content { + position: absolute; + top: 0; + right: 0; + padding-top: 5px; + padding-bottom: 5px; + background-color: white; + @include defaultBoxShadow; + border-radius: 3px; + min-width: 80px; + display: none; + z-index: 100; + + &.show { + display: block; + } + + .vertical-ellipsis-menu-content-item { + display: block; + padding: 5px 10px; + cursor: pointer; + text-align: left; + border-left: 3px solid white; + color: $near-black; + text-decoration: none; + border-bottom: none; + + &:hover { + background-color: $light-grey; + border-left: 3px solid $spree-blue; + } + + &.delete { + color: $red; + + &:hover { + border-left: 3px solid $red; + background-color: $fair-pink; + } + } + } + } +} + +table.products td .vertical-ellipsis-menu { + float: right; +} diff --git a/spec/javascripts/stimulus/vertical_ellipsis_menu_controller_test.js b/spec/javascripts/stimulus/vertical_ellipsis_menu_controller_test.js new file mode 100644 index 0000000000..4e5fd9d0b3 --- /dev/null +++ b/spec/javascripts/stimulus/vertical_ellipsis_menu_controller_test.js @@ -0,0 +1,55 @@ +/** + * @jest-environment jsdom + */ + +import { Application } from "stimulus"; +import vertical_ellipsis_menu_controller from "../../../app/webpacker/controllers/vertical_ellipsis_menu_controller"; + +describe("VerticalEllipsisMenuController test", () => { + beforeAll(() => { + const application = Application.start(); + application.register("vertical-ellipsis-menu", vertical_ellipsis_menu_controller); + }); + + beforeEach(() => { + document.body.innerHTML = ` +