Skip to content

Commit 657491e

Browse files
committed
- support menu.on and menu.off event
- fix bug: right click incorrectly considered as selection. - bump version
1 parent 9aebdf9 commit 657491e

File tree

11 files changed

+106
-6
lines changed

11 files changed

+106
-6
lines changed

CHANGELOG.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,11 @@
11
# Change Logs
22

3+
## v0.5.5
4+
5+
- support `menu.on` and `menu.off` event
6+
- fix bug: right click incorrectly considered as selection.
7+
8+
39
## v0.5.4
410

511
- add `insert` api

README.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,13 @@ Following are a list of possible events:
9191
- `col`: base col of the updated cell
9292
- `data`: data used to update. If it's a 2D array and `range` is true, then cells are updated with values in `data` correspondingly relative to `row` and `col` as the original cell
9393
- `range`: true if a range of cells are updated.
94+
- `menu.on`: fired when a `contextmenu` event is fired within sheet. Option is an object with following fields:
95+
- `evt`: corresponding event object
96+
- `node`: target node from which this event was fired.
97+
- `menu.off`: fired when a context menu is expected to dismiss. Option is an object with following fields:
98+
- `evt`: corresponding event object
99+
- `node`: target node from which this event was fired.
100+
94101

95102
## Rich Text
96103

dist/index.js

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -176,9 +176,35 @@
176176
this.dom.textarea.addEventListener('mousedown', function(e){
177177
return e.stopPropagation();
178178
});
179+
this.dom.sheet.addEventListener('contextmenu', function(e){
180+
this$.fire('menu.on', {
181+
evt: e,
182+
node: e.target
183+
});
184+
if (this$._menuOff) {
185+
return;
186+
}
187+
this$._menuOff = function(e){
188+
if (e.type === 'keydown' && e.keyCode !== 27) {
189+
return;
190+
}
191+
document.body.removeEventListener('click', this$._menuOff);
192+
document.body.removeEventListener('keydown', this$._menuOff);
193+
this$._menuOff = null;
194+
return this$.fire('menu.off', {
195+
evt: e,
196+
node: e.target
197+
});
198+
};
199+
document.body.addEventListener('click', this$._menuOff);
200+
return document.body.addEventListener('keydown', this$._menuOff);
201+
});
179202
dom = this.dom.sheet;
180203
dom.addEventListener('mousedown', function(e){
181204
var p, ref$, idx;
205+
if (e.button > 1) {
206+
return;
207+
}
182208
this$.edited();
183209
if (!(p = parent(e.target, '.cell', dom))) {
184210
return;

dist/index.min.js

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package-lock.json

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
"name": "@plotdb/sheet",
44
"license": "MIT",
55
"description": "spreadsheet",
6-
"version": "0.5.4",
6+
"version": "0.5.5",
77
"style": "dist/index.min.css",
88
"browser": "dist/index.min.js",
99
"main": "dist/index.min.js",

src/index.ls

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,9 +81,22 @@ sheet.prototype = Object.create(Object.prototype) <<< do
8181

8282
# to prevent grid selection
8383
@dom.textarea.addEventListener \mousedown, (e) -> e.stopPropagation!
84+
@dom.sheet.addEventListener \contextmenu, (e) ~>
85+
@fire \menu.on, {evt: e, node: e.target}
86+
if @_menu-off => return
87+
@_menu-off = (e) ~>
88+
if e.type == \keydown and e.keyCode != 27 => return
89+
document.body.removeEventListener \click, @_menu-off
90+
document.body.removeEventListener \keydown, @_menu-off
91+
@_menu-off = null
92+
@fire \menu.off, {evt: e, node: e.target}
93+
document.body.addEventListener \click, @_menu-off
94+
document.body.addEventListener \keydown, @_menu-off
8495

8596
dom = @dom.sheet
8697
dom.addEventListener \mousedown, (e) ~>
98+
# selection should skip right click
99+
if e.button > 1 => return
87100
@edited!
88101
if !(p = parent (e.target), '.cell', dom) => return
89102
idx = @index(p){row, col}

web/src/pug/index.pug

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,9 @@ block head
1212
https://community.airtable.com/t/3074
1313
*/
1414
body { overscroll-behavior: contain }
15+
[ld=menu] {
16+
position: absolute;
17+
}
1518
block body
1619
.ldcv(ld="ldcv",data-name="selection"): .base.w-640.rwd: .inner.p-4
1720
textarea.form-control.mb-4(ld="textarea",rows="7")
@@ -26,6 +29,9 @@ block body
2629
.btn.btn-sm.btn-outline-secondary(ld="cur") Show Current Selection
2730
.aspect-ratio.ratio-1by1
2831
#root.shadow-sm.border.border-secondary.rounded
32+
.dropdown-menu.shadow-sm(ld="menu")
33+
.dropdown-item(ld="del") Del Row/Col
34+
.dropdown-item(ld="ins") Ins Row/Col
2935

3036

3137
block script
@@ -44,6 +50,8 @@ block script
4450
row: -> s.select {row: 2}
4551
col: -> s.select {col: 2}
4652
all: -> s.select {}
53+
del: -> s.slice!
54+
ins: -> s.insert!
4755
cur: ->
4856
app.selection = s.select!
4957
ldcv.selection.toggle!
@@ -77,6 +85,20 @@ block script
7785
s.on \change, -> console.log it
7886
c = s.cell {x: 1, y: 1}
7987
console.log c
88+
s.on \menu.on, ({evt, node}) ->
89+
if !(node.classList.contains \idx) => return
90+
m = view.get(\menu)
91+
m.style.top = "#{evt.clientY}px"
92+
m.style.left = "#{evt.clientX}px"
93+
m.classList.toggle \show, true
94+
evt.preventDefault!
95+
evt.stopPropagation!
96+
s.on \menu.off, ({evt, node}) ->
97+
m = view.get(\menu)
98+
m.classList.toggle \show, false
99+
evt.preventDefault!
100+
evt.stopPropagation!
101+
80102
/*
81103
c.innerHTML = """
82104
<div class="dropdown">

web/static/assets/lib/@plotdb/sheet/dev/index.js

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -176,9 +176,35 @@
176176
this.dom.textarea.addEventListener('mousedown', function(e){
177177
return e.stopPropagation();
178178
});
179+
this.dom.sheet.addEventListener('contextmenu', function(e){
180+
this$.fire('menu.on', {
181+
evt: e,
182+
node: e.target
183+
});
184+
if (this$._menuOff) {
185+
return;
186+
}
187+
this$._menuOff = function(e){
188+
if (e.type === 'keydown' && e.keyCode !== 27) {
189+
return;
190+
}
191+
document.body.removeEventListener('click', this$._menuOff);
192+
document.body.removeEventListener('keydown', this$._menuOff);
193+
this$._menuOff = null;
194+
return this$.fire('menu.off', {
195+
evt: e,
196+
node: e.target
197+
});
198+
};
199+
document.body.addEventListener('click', this$._menuOff);
200+
return document.body.addEventListener('keydown', this$._menuOff);
201+
});
179202
dom = this.dom.sheet;
180203
dom.addEventListener('mousedown', function(e){
181204
var p, ref$, idx;
205+
if (e.button > 1) {
206+
return;
207+
}
182208
this$.edited();
183209
if (!(p = parent(e.target, '.cell', dom))) {
184210
return;

web/static/assets/lib/@plotdb/sheet/dev/index.min.js

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)