Empty Trash
diff --git a/app/assets/javascripts/components/NotesOptionsPanel.tsx b/app/assets/javascripts/components/NotesOptionsPanel.tsx
index 147010d02..93299f2d4 100644
--- a/app/assets/javascripts/components/NotesOptionsPanel.tsx
+++ b/app/assets/javascripts/components/NotesOptionsPanel.tsx
@@ -21,6 +21,7 @@ export const NotesOptionsPanel = observer(({ appState }: Props) => {
top: 0,
right: 0,
});
+ const [maxHeight, setMaxHeight] = useState('auto');
const buttonRef = useRef();
const panelRef = useRef();
const [closeOnBlur] = useCloseOnBlur(panelRef, setOpen);
@@ -35,6 +36,9 @@ export const NotesOptionsPanel = observer(({ appState }: Props) => {
open={open}
onChange={() => {
const rect = buttonRef.current.getBoundingClientRect();
+ const { clientHeight } = document.documentElement;
+ const footerHeight = 32;
+ setMaxHeight(clientHeight - rect.bottom - footerHeight - 2);
setPosition({
top: rect.bottom,
right: document.body.clientWidth - rect.right,
@@ -65,8 +69,9 @@ export const NotesOptionsPanel = observer(({ appState }: Props) => {
ref={panelRef}
style={{
...position,
+ maxHeight
}}
- className="sn-dropdown flex flex-col py-2"
+ className="sn-dropdown max-h-120 max-w-80 flex flex-col py-2 overflow-y-scroll fixed"
>
{open && (
{
style={{
top: optionsPanelTop,
}}
- className="sn-dropdown sn-dropdown-anchor-right grid gap-2 py-2"
+ className="sn-dropdown sn-dropdown-anchor-right absolute grid gap-2 py-2"
>
void
): Promise {
diff --git a/app/assets/javascripts/views/notes/notes_view.ts b/app/assets/javascripts/views/notes/notes_view.ts
index fc8c8b15c..cfbbaf40b 100644
--- a/app/assets/javascripts/views/notes/notes_view.ts
+++ b/app/assets/javascripts/views/notes/notes_view.ts
@@ -308,12 +308,16 @@ class NotesViewCtrl extends PureViewCtrl {
await this.selectNote(note);
}
if (this.state.selectedNotes[note.uuid]) {
- const clientHeight = document.documentElement.clientHeight;
+ const { clientHeight } = document.documentElement;
const defaultFontSize = window.getComputedStyle(
document.documentElement
).fontSize;
- const maxContextMenuHeight = parseFloat(defaultFontSize) * 20;
+ const maxContextMenuHeight = parseFloat(defaultFontSize) * 30;
const footerHeight = 32;
+
+ // Open up-bottom is default behavior
+ let openUpBottom = true;
+
const bottomSpace = clientHeight - footerHeight - e.clientY;
const upSpace = e.clientY;
@@ -321,23 +325,41 @@ class NotesViewCtrl extends PureViewCtrl {
if (maxContextMenuHeight > bottomSpace) {
// If there's enough space, open bottom-up
if (upSpace > maxContextMenuHeight) {
- this.appState.notes.setContextMenuPosition({
- bottom: clientHeight - e.clientY,
- left: e.clientX,
- });
- // Else, open on top of screen
+ openUpBottom = false;
+ this.appState.notes.setContextMenuMaxHeight(
+ 'auto'
+ );
+ // Else, reduce max height (menu will be scrollable) and open in whichever direction there's more space
} else {
- this.appState.notes.setContextMenuPosition({
- top: 2,
- left: e.clientX,
- });
+ if (upSpace > bottomSpace) {
+ this.appState.notes.setContextMenuMaxHeight(
+ upSpace - 2
+ );
+ openUpBottom = false;
+ } else {
+ this.appState.notes.setContextMenuMaxHeight(
+ bottomSpace - 2
+ );
+ }
}
} else {
+ this.appState.notes.setContextMenuMaxHeight(
+ 'auto'
+ );
+ }
+
+ if (openUpBottom) {
this.appState.notes.setContextMenuPosition({
top: e.clientY,
left: e.clientX,
});
+ } else {
+ this.appState.notes.setContextMenuPosition({
+ bottom: clientHeight - e.clientY,
+ left: e.clientX,
+ });
}
+
this.appState.notes.setContextMenuOpen(true);
}
}
diff --git a/app/assets/stylesheets/_sn.scss b/app/assets/stylesheets/_sn.scss
index 253373108..0218f6905 100644
--- a/app/assets/stylesheets/_sn.scss
+++ b/app/assets/stylesheets/_sn.scss
@@ -127,6 +127,10 @@
max-width: 15rem;
}
+.max-w-80 {
+ max-width: 20rem;
+}
+
.h-1px {
height: 1px;
}
@@ -151,8 +155,12 @@
height: 2.5rem;
}
-.max-h-80 {
- max-height: 20rem;
+.max-h-120 {
+ max-height: 30rem;
+}
+
+.fixed {
+ position: fixed;
}
.overflow-y-scroll {
@@ -198,7 +206,6 @@
}
.sn-dropdown {
- @extend .absolute;
@extend .bg-default;
@extend .min-w-80;
@extend .transition-transform;