Skip to content
This repository was archived by the owner on Mar 9, 2025. It is now read-only.

Commit cebe992

Browse files
authored
Merge pull request #867 from trey-wallis/dev
8.13.2
2 parents d4018eb + 67c94c7 commit cebe992

File tree

15 files changed

+58
-61
lines changed

15 files changed

+58
-61
lines changed

manifest.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -9,5 +9,5 @@
99
"fundingUrl": {
1010
"Buymeacoffee": "https://www.buymeacoffee.com/treywallis"
1111
},
12-
"version": "8.13.1"
12+
"version": "8.13.2"
1313
}

package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "obsidian-dataloom",
3-
"version": "8.13.1",
3+
"version": "8.13.2",
44
"description": "Weave together data from diverse sources into a cohesive table view. Inspired by Excel Spreadsheets and Notion.so.",
55
"main": "main.js",
66
"scripts": {

src/main.ts

+1-3
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@ import {
2222
import { LOOM_EXTENSION } from "./data/constants";
2323
import { createLoomFile } from "src/data/loom-file";
2424
import { hasDarkTheme } from "./shared/render/utils";
25-
import { removeCurrentFocusClass } from "./react/loom-app/app/hooks/use-focus/utils";
2625
import {
2726
loadPreviewModeApps,
2827
purgeEmbeddedLoomApps,
@@ -203,8 +202,7 @@ export default class DataLoomPlugin extends Plugin {
203202
this.registerDomEvent(document, "click", () => {
204203
log(this.settings.shouldDebug, "main handleClick");
205204

206-
//Clear the focus-visible class from the last focused element
207-
removeCurrentFocusClass();
205+
EventManager.getInstance().emit("clear-menu-trigger-focus");
208206
EventManager.getInstance().emit("global-click");
209207
});
210208

src/react/loom-app/app/hooks/use-app-events/index.tsx

+4-4
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,23 @@
11
import React from "react";
22
import { useMenuOperations } from "src/react/shared/menu-provider/hooks";
33
import { useLogger } from "src/shared/logger";
4-
import { removeCurrentFocusClass } from "../use-focus/utils";
54

65
export const useAppEvents = () => {
7-
const { topMenu, onRequestClose } = useMenuOperations();
6+
const { topMenu, onRequestClose, onClearMenuTriggerFocus } =
7+
useMenuOperations();
88
const logger = useLogger();
99
const handleClick = React.useCallback(
1010
(e: React.MouseEvent) => {
1111
logger("App handleClick");
1212
e.stopPropagation();
1313

1414
if (!topMenu) {
15-
removeCurrentFocusClass();
15+
onClearMenuTriggerFocus();
1616
return;
1717
}
1818
onRequestClose(topMenu.id, "close-on-save");
1919
},
20-
[topMenu, logger, onRequestClose]
20+
[topMenu, logger, onRequestClose, onClearMenuTriggerFocus]
2121
);
2222
return {
2323
onClick: handleClick,

src/react/loom-app/app/hooks/use-focus/index.tsx

+3-4
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ import {
33
getNumBottomBarFocusableEl,
44
getNumOptionBarFocusableEls,
55
isArrowKeyPressed,
6-
removeCurrentFocusClass,
76
getFocusLayerEl,
87
getFocusableEls,
98
} from "src/react/loom-app/app/hooks/use-focus/utils";
@@ -25,13 +24,13 @@ export default function useFocus() {
2524
const logger = useLogger();
2625
const { reactAppId } = useAppMount();
2726
const { loomState } = useLoomState();
28-
const { topMenu } = useMenuOperations();
27+
const { topMenu, onClearMenuTriggerFocus } = useMenuOperations();
2928

3029
function handleKeyDown(e: React.KeyboardEvent) {
3130
logger("useFocus handleKeyDown");
3231

3332
if (e.key === "Tab") {
34-
removeCurrentFocusClass();
33+
onClearMenuTriggerFocus();
3534

3635
//Prevent default tab behavior which is to move focus to next element
3736
//We will do that ourselves
@@ -110,7 +109,7 @@ export default function useFocus() {
110109
}
111110
}
112111
if (elementToFocus !== null) {
113-
removeCurrentFocusClass();
112+
onClearMenuTriggerFocus();
114113
(elementToFocus as HTMLElement).focus();
115114
}
116115
}

src/react/loom-app/app/hooks/use-focus/utils.ts

-20
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,6 @@
11
import { LoomMenu } from "src/react/shared/menu-provider/types";
22
import { findMenuTriggerEl } from "src/react/shared/menu-provider/utils";
33

4-
/**
5-
* Adds the dataloom-focusable--focused class to an element
6-
* We do this since because want to control the focus-visible class to appear when enter is pressed or we
7-
* click outside of the element
8-
* @param el - The element to add the focus-visible class to
9-
* @returns
10-
*/
11-
export const addFocusClass = (el: HTMLElement | null) => {
12-
el?.classList.add("dataloom-focusable--focused");
13-
};
14-
15-
/**
16-
* Removes the dataloom-focusable--focused class from an element
17-
* There should only be one element with this class at a time
18-
*/
19-
export const removeCurrentFocusClass = () => {
20-
const el = document.querySelector(".dataloom-focusable--focused");
21-
el?.classList.remove("dataloom-focusable--focused");
22-
};
23-
244
/**
255
* Gets the top menu element.
266
* If the top menu is null, then we return the app element.

src/react/loom-app/embed-cell/embed/index.tsx

-2
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,6 @@ import {
66
} from "src/shared/loom-state/types/loom-state";
77
import { appendOrReplaceFirstChild } from "src/shared/render/utils";
88

9-
import "./styles.css";
10-
119
interface Props {
1210
isExternalLink: boolean;
1311
content: string;

src/react/loom-app/embed-cell/embed/styles.css

-14
This file was deleted.

src/react/loom-app/embed-cell/styles.css

+6-1
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,9 @@
22
width: 100%;
33
height: 100%;
44
overflow: hidden;
5-
}
5+
}
6+
7+
.dataloom-embed-cell p {
8+
margin: 0;
9+
text-align: left;
10+
}

src/react/loom-app/option-bar/sources-menu/add-source-submenu/index.tsx

+6-2
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import { SourceAddHandler } from "../../../app/hooks/use-source/types";
1212
import { createFolderSource } from "src/shared/loom-state/loom-state-factory";
1313
import FolderSourceOptions from "./folder-source-options";
1414
import { AddSourceError } from "./types";
15+
import { normalizePath } from "obsidian";
1516

1617
interface Props {
1718
sources: Source[];
@@ -34,6 +35,9 @@ export default function AddSourceSubmenu({
3435
const includeSubfoldersInputId = React.useId();
3536

3637
function handleAddClick() {
38+
//Make sure that the path doesn't have a trailing slash
39+
const formattedPath = normalizePath(path);
40+
3741
if (type === null) {
3842
setError({
3943
message: "Please select a type",
@@ -46,7 +50,7 @@ export default function AddSourceSubmenu({
4650
inputId: pathInputId,
4751
});
4852
return;
49-
} else if (alreadyHasSource(sources, type, path)) {
53+
} else if (alreadyHasSource(sources, type, formattedPath)) {
5054
setError({
5155
message: "Source already exists",
5256
inputId: pathInputId,
@@ -56,7 +60,7 @@ export default function AddSourceSubmenu({
5660

5761
let source: Source;
5862
if (type === SourceType.FOLDER) {
59-
source = createFolderSource(path, includeSubfolders);
63+
source = createFolderSource(formattedPath, includeSubfolders);
6064
} else {
6165
setError({
6266
message: "Source not supported",

src/react/shared/menu-provider/hooks.ts

+9-2
Original file line numberDiff line numberDiff line change
@@ -82,14 +82,21 @@ export const useMenu = (
8282
};
8383

8484
export const useMenuOperations = () => {
85-
const { topMenu, canOpen, onCloseAll, onRequestClose, onClose } =
86-
useMenuContext();
85+
const {
86+
topMenu,
87+
canOpen,
88+
onCloseAll,
89+
onRequestClose,
90+
onClose,
91+
onClearMenuTriggerFocus,
92+
} = useMenuContext();
8793

8894
return {
8995
topMenu,
9096
canOpen,
9197
onCloseAll,
9298
onClose,
9399
onRequestClose,
100+
onClearMenuTriggerFocus,
94101
};
95102
};

src/react/shared/menu-provider/index.tsx

+20-5
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import {
1111
} from "./types";
1212
import { useLogger } from "src/shared/logger";
1313
import { getPositionFromEl } from "./utils";
14+
import EventManager from "src/shared/event/event-manager";
1415

1516
interface ContextProps {
1617
topMenu: LoomMenu | null;
@@ -40,6 +41,7 @@ interface ContextProps {
4041
onPositionUpdate: (id: string, value: LoomMenuPosition) => void;
4142
onCloseAll: () => void;
4243
onCloseRequestClear: (id: string) => void;
44+
onClearMenuTriggerFocus: () => void;
4345
}
4446

4547
const MenuContext = React.createContext<ContextProps | null>(null);
@@ -68,6 +70,23 @@ export default function MenuProvider({ children }: Props) {
6870

6971
const logger = useLogger();
7072

73+
const clearMenuTriggerFocus = React.useCallback(() => {
74+
logger("MenuProvider clearMenuTriggerFocus");
75+
setFocusedMenuTrigger(null);
76+
}, [logger]);
77+
78+
React.useEffect(() => {
79+
EventManager.getInstance().on(
80+
"clear-menu-trigger-focus",
81+
clearMenuTriggerFocus
82+
);
83+
return () =>
84+
EventManager.getInstance().off(
85+
"clear-menu-trigger-focus",
86+
clearMenuTriggerFocus
87+
);
88+
}, [clearMenuTriggerFocus]);
89+
7190
function handleOpen(
7291
parentComponentId: string,
7392
level: LoomMenuLevel,
@@ -118,11 +137,6 @@ export default function MenuProvider({ children }: Props) {
118137
[logger]
119138
);
120139

121-
function clearMenuTriggerFocus() {
122-
logger("MenuProvider clearMenuTriggerFocus");
123-
setFocusedMenuTrigger(null);
124-
}
125-
126140
const handleClose = React.useCallback(
127141
(id: string) => {
128142
logger("MenuProvider onClose");
@@ -253,6 +267,7 @@ export default function MenuProvider({ children }: Props) {
253267
onPositionUpdate: handlePositionUpdate,
254268
onCloseAll: handleCloseAll,
255269
onCloseRequestClear: handleCloseRequestClear,
270+
onClearMenuTriggerFocus: clearMenuTriggerFocus,
256271
}}
257272
>
258273
{children}

src/react/shared/menu-trigger/index.tsx

+3
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,9 @@ const MenuTrigger = React.forwardRef<HTMLDivElement, Props>(
6969
if (!topMenu) return;
7070
onRequestClose(topMenu?.id, "close-on-save");
7171
} else if (e.key === "Backspace") {
72+
//Stop propagation to the global event
73+
//This prevents the focused from being lost
74+
e.stopPropagation();
7275
onBackspaceDown?.();
7376
} else if (e.key.length === 1) {
7477
if (

src/shared/event/types.ts

+2-1
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ export type DataLoomEvent =
1414
| "global-keydown"
1515
| "download-csv"
1616
| "download-markdown"
17-
| "property-type-change";
17+
| "property-type-change"
18+
| "clear-menu-trigger-focus";
1819

1920
export type EventCallback = (...data: any[]) => void;

versions.json

+2-1
Original file line numberDiff line numberDiff line change
@@ -145,5 +145,6 @@
145145
"8.12.1": "1.2.0",
146146
"8.12.2": "1.4.0",
147147
"8.13.0": "1.4.0",
148-
"8.13.1": "1.4.0"
148+
"8.13.1": "1.4.0",
149+
"8.13.2": "1.4.0"
149150
}

0 commit comments

Comments
 (0)