Skip to content

Commit 9c58eca

Browse files
committed
Bug fixes
1 parent 82de7d0 commit 9c58eca

File tree

8 files changed

+53
-53
lines changed

8 files changed

+53
-53
lines changed

src/pg/menuItemIcon/menuItemIcon.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ export default class PgMenuItemIcon extends HTMLElement {
4747
detail: { index: this.index }
4848
}));
4949
});
50-
this.$label.addEventListener('keydown', (e: KeyboardEvent) => {
50+
this.$button.addEventListener('keydown', (e: KeyboardEvent) => {
5151
switch (e.key) {
5252
case 'ArrowDown':
5353
this.dispatchEvent(new CustomEvent('down', {
@@ -66,7 +66,7 @@ export default class PgMenuItemIcon extends HTMLElement {
6666
}
6767

6868
focus() {
69-
this.$label.focus();
69+
this.$button.focus();
7070
}
7171

7272
getHeight(): number {

src/pg/overlay/overlay.ts

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,27 @@
11
import { Component } from '@pictogrammers/element';
22

3-
const layers: any[] = [];
4-
const promises: any[] = [];
3+
const layers: Set<HTMLElement> = new Set();
4+
const promises: Map<HTMLElement, (value: any) => void> = new Map();
55

66
@Component()
77
export default class PgOverlay extends HTMLElement {
88
static open(props: any = {}): Promise<any> {
99
var ele = document.createElement(this.name);
1010
Object.assign(ele, props);
1111
document.body.appendChild(ele);
12-
layers.push(ele);
12+
layers.add(ele);
1313
return new Promise((resolve) => {
14-
promises.push(resolve);
14+
promises.set(ele, resolve);
1515
});
1616
}
1717

1818
close(result?: any) {
19-
layers.pop().remove();
20-
promises.pop()(result);
19+
this.remove();
20+
layers.delete(this);
21+
const resolve = promises.get(this);
22+
if (resolve) {
23+
resolve(result);
24+
}
25+
promises.delete(this);
2126
}
2227
}

src/pg/overlayContextMenu/README.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,13 @@ Components that use `PgOverlayContextMenu` include:
1212
import PgMenuItem from '@pictogrammers/components/pg/menuItem';
1313

1414
#isOpen: false;
15-
handleSourceClick() {
15+
handleSourceClick(e: MouseEvent) {
1616
if (this.#isOpen) { return; }
1717
this.#isOpen = true;
1818
const result = await PgOverlayContextMenu.open({
1919
source: this.$element,
20+
x: e.clientX,
21+
y: e.clientY,
2022
items: [{
2123
label: 'Item 1',
2224
value: 'item1',

src/pg/overlayContextMenu/__examples__/basic/basic.css

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,14 @@ p {
1010
border-radius: 1rem;
1111
align-items: center;
1212
justify-content: center;
13+
cursor: default;
1314
background: var(--pg-focus-background-color, rgba(79, 143, 249, 0.1));
1415
color: rgba(79, 143, 249, 0.75);
1516
text-shadow: 0 0 4px #fff;
17+
box-sizing: border-box;
18+
outline: 0;
19+
}
20+
21+
[part=area]:focus {
22+
border-width: 2px;
1623
}

src/pg/overlayContextMenu/__examples__/basic/basic.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
<div class="example">
2-
<div part="area">
2+
<div part="area" tabindex="0">
33
Right Click Here
44
</div>
55
<p>Result: <code part="result"></code></p></p>
Lines changed: 17 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,15 @@
11
import { Component, Part, Prop } from '@pictogrammers/element';
22

3-
import PgMenuItem from '../../../menuItem/menuItem';
3+
import PgMenuItemIcon from '../../../menuItemIcon/menuItemIcon';
44
import PgMenuDivider from '../../../menuDivider/menuDivider';
55
import PgOverlayContextMenu from '../../overlayContextMenu';
66

77
import template from './basic.html';
88
import style from './basic.css';
99

10+
const IconFile = 'M13,9V3.5L18.5,9M6,2C4.89,2 4,2.89 4,4V20A2,2 0 0,0 6,22H18A2,2 0 0,0 20,20V8L14,2H6Z';
11+
const IconFolder = 'M10,4H4C2.89,4 2,4.89 2,6V18A2,2 0 0,0 4,20H20A2,2 0 0,0 22,18V8C22,6.89 21.1,6 20,6H12L10,4Z';
12+
1013
@Component({
1114
selector: 'x-pg-overlay-context-menu-basic',
1215
template,
@@ -23,31 +26,33 @@ export default class XPgOverlayContextMenuBasic extends HTMLElement {
2326

2427
#value = null;
2528

26-
#menuOpen = false;
27-
async #handleContextMenu(e: any) {
28-
if (this.#menuOpen) { return; }
29+
async #handleContextMenu(e: MouseEvent) {
2930
e.preventDefault();
3031
const items = [{
31-
label: 'Item 1',
32+
label: 'Add File',
3233
value: 'item1',
33-
type: PgMenuItem
34+
icon: IconFile,
35+
type: PgMenuItemIcon
3436
},
3537
{
36-
label: 'Item 2',
38+
label: 'Add Folder',
3739
value: 'item2',
38-
type: PgMenuItem
40+
icon: IconFolder,
41+
type: PgMenuItemIcon
3942
},
4043
{
4144
type: PgMenuDivider
4245
},
4346
{
44-
label: 'Item 3',
47+
label: 'More Items',
4548
value: 'item3',
46-
type: PgMenuItem
49+
icon: IconFile,
50+
type: PgMenuItemIcon
4751
}];
48-
this.#menuOpen = true;
4952
const result = await PgOverlayContextMenu.open({
5053
source: this.$area,
54+
x: e.clientX,
55+
y: e.clientY,
5156
value: this.#value,
5257
items,
5358
oninput: (value) => {
@@ -57,7 +62,6 @@ export default class XPgOverlayContextMenuBasic extends HTMLElement {
5762
if (result !== undefined) {
5863
this.#value = result;
5964
}
60-
this.$result.textContent = result;
61-
this.#menuOpen = false;
65+
this.$result.textContent = JSON.stringify(result);
6266
}
6367
}

src/pg/overlayContextMenu/overlayContextMenu.css

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,6 @@
1111
--pg-menu-box-shadow: 0 0.125rem 0.5rem rgba(0, 0, 0, 0.25);
1212
top: anchor(top);
1313
left: anchor(left);
14-
min-width: calc(anchor-size(width) + calc(2 * var(--pg-menu-padding, 0.25rem)));
14+
min-width: 10rem;
1515
translate: var(--pg-overlay-menu-_x, 0) var(--pg-overlay-menu-_y, 0);
1616
}

src/pg/overlayContextMenu/overlayContextMenu.ts

Lines changed: 11 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,9 @@ import PgOverlay from '../overlay/overlay';
66
import template from './overlayContextMenu.html';
77
import style from './overlayContextMenu.css';
88

9+
// Only allow a single open context menu
10+
const stack: PgOverlayContextMenu[] = [];
11+
912
@Component({
1013
selector: 'pg-overlay-context-menu',
1114
template,
@@ -16,6 +19,8 @@ export default class PgOverlayContextMenu extends PgOverlay {
1619
@Part() $menu: PgMenu;
1720

1821
@Prop() source: HTMLElement | null = null;
22+
@Prop() x: number = 0;
23+
@Prop() y: number = 0;
1924
@Prop() default: any = null;
2025
@Prop() items: any[] = [];
2126
@Prop() value: any = null;
@@ -31,6 +36,8 @@ export default class PgOverlayContextMenu extends PgOverlay {
3136
}
3237

3338
connectedCallback() {
39+
stack.pop()?.close();
40+
stack.push(this);
3441
this.$menu.addEventListener('select', this.#handleSelect.bind(this));
3542
this.$overlay.popover = 'auto';
3643
if (this.source !== null) {
@@ -42,39 +49,13 @@ export default class PgOverlayContextMenu extends PgOverlay {
4249
this.$overlay.addEventListener('toggle', this.#toggle.bind(this));
4350
// Position
4451
const rect = this.source?.getBoundingClientRect();
45-
let x = 0, y = 0;
46-
const value = this.value === null || typeof this.value !== 'object'
47-
? this.value
48-
: this.value.value;
49-
// value is an item in the items list
50-
const index = this.value === null
51-
? -1
52-
: this.items.findIndex(x => x.value === value);
53-
if (index !== -1) {
54-
const height = this.$menu.getItemHeight(index);
55-
// Overlap item
56-
y -= this.$menu.getItemOffset(0, index);
57-
if (rect?.height !== height && rect?.height) {
58-
y += (rect.height - height) / 2;
59-
}
60-
} else if (this.items.length > 0) {
61-
// insert default if defined
62-
if (this.default) {
63-
this.default.checked = true;
64-
this.$menu.items.unshift(this.default);
65-
}
66-
// focus first item
67-
const height = this.$menu.getItemHeight(0);
68-
y -= this.$menu.getItemOffset(0, 0);
69-
if (rect?.height !== height && rect?.height) {
70-
y += (rect.height - height) / 2;
71-
}
72-
}
52+
const x = this.x - (rect?.left || 0),
53+
y = this.y - (rect?.top || 0);
7354
// ToDo: update to CSS Variables
7455
this.$overlay.style.setProperty('--pg-overlay-menu-_x', `${x}px`);
7556
this.$overlay.style.setProperty('--pg-overlay-menu-_y', `${y}px`);
7657
// Focus
77-
this.$menu.focus(index);
58+
this.$menu.focus(0);
7859
}
7960

8061
#toggle(e: ToggleEvent) {
@@ -85,6 +66,7 @@ export default class PgOverlayContextMenu extends PgOverlay {
8566
}
8667

8768
disconnectedCallback() {
69+
8870
}
8971

9072
#handleSelect(e: any) {

0 commit comments

Comments
 (0)