From 808415b9069a0c6aa7ac8d55d116d92464e65172 Mon Sep 17 00:00:00 2001 From: Tom Moor Date: Sat, 8 Jun 2024 21:51:52 -0400 Subject: [PATCH] fix: Indent/outdent list controls, closes #6974 --- app/editor/components/SelectionToolbar.tsx | 8 +++--- app/editor/extensions/Keys.ts | 2 +- app/editor/extensions/PasteHandler.ts | 4 +-- app/editor/extensions/Suggestion.ts | 2 +- app/editor/menus/divider.tsx | 2 +- app/editor/menus/formatting.tsx | 27 ++++++++++++++----- app/editor/menus/image.tsx | 2 +- app/editor/menus/readOnly.tsx | 2 +- app/editor/menus/table.tsx | 2 +- app/editor/menus/tableCol.tsx | 2 +- shared/editor/commands/codeFence.ts | 2 +- .../commands/deleteEmptyFirstParagraph.ts | 2 +- shared/editor/commands/splitHeading.ts | 2 +- shared/editor/commands/toggleBlockType.ts | 2 +- shared/editor/commands/toggleList.ts | 2 +- shared/editor/commands/toggleWrap.ts | 2 +- shared/editor/lib/InputRule.ts | 2 +- shared/editor/marks/Comment.ts | 2 +- shared/editor/marks/Link.tsx | 4 +-- shared/editor/marks/Placeholder.ts | 2 +- shared/editor/nodes/Blockquote.ts | 2 +- shared/editor/nodes/CheckboxItem.ts | 7 +++++ shared/editor/nodes/CodeFence.ts | 4 +-- shared/editor/nodes/HardBreak.ts | 4 +-- shared/editor/nodes/ListItem.ts | 6 ++--- shared/editor/plugins/FoldingHeaders.ts | 2 +- shared/editor/queries/findCollapsedNodes.ts | 2 +- shared/editor/queries/getMarkRange.ts | 2 +- shared/editor/queries/getParentListItem.ts | 4 +-- shared/editor/queries/isInCode.ts | 9 +++---- shared/editor/queries/isInList.ts | 15 ++++++++--- shared/editor/queries/isList.ts | 2 +- shared/editor/queries/isMarkActive.ts | 4 +-- shared/editor/queries/isNodeActive.ts | 4 +-- 34 files changed, 80 insertions(+), 62 deletions(-) diff --git a/app/editor/components/SelectionToolbar.tsx b/app/editor/components/SelectionToolbar.tsx index fc1b1e75b..763da2d69 100644 --- a/app/editor/components/SelectionToolbar.tsx +++ b/app/editor/components/SelectionToolbar.tsx @@ -3,10 +3,10 @@ import { EditorState, NodeSelection, TextSelection } from "prosemirror-state"; import * as React from "react"; import createAndInsertLink from "@shared/editor/commands/createAndInsertLink"; import filterExcessSeparators from "@shared/editor/lib/filterExcessSeparators"; -import getMarkRange from "@shared/editor/queries/getMarkRange"; -import isInCode from "@shared/editor/queries/isInCode"; -import isMarkActive from "@shared/editor/queries/isMarkActive"; -import isNodeActive from "@shared/editor/queries/isNodeActive"; +import { getMarkRange } from "@shared/editor/queries/getMarkRange"; +import { isInCode } from "@shared/editor/queries/isInCode"; +import { isMarkActive } from "@shared/editor/queries/isMarkActive"; +import { isNodeActive } from "@shared/editor/queries/isNodeActive"; import { getColumnIndex, getRowIndex } from "@shared/editor/queries/table"; import { MenuItem } from "@shared/editor/types"; import { creatingUrlPrefix } from "@shared/utils/urls"; diff --git a/app/editor/extensions/Keys.ts b/app/editor/extensions/Keys.ts index 51ac58683..1544d051f 100644 --- a/app/editor/extensions/Keys.ts +++ b/app/editor/extensions/Keys.ts @@ -8,7 +8,7 @@ import { Command, } from "prosemirror-state"; import Extension from "@shared/editor/lib/Extension"; -import isInCode from "@shared/editor/queries/isInCode"; +import { isInCode } from "@shared/editor/queries/isInCode"; export default class Keys extends Extension { get name() { diff --git a/app/editor/extensions/PasteHandler.ts b/app/editor/extensions/PasteHandler.ts index bc99a252a..2ddd2de3c 100644 --- a/app/editor/extensions/PasteHandler.ts +++ b/app/editor/extensions/PasteHandler.ts @@ -5,8 +5,8 @@ import { LANGUAGES } from "@shared/editor/extensions/Prism"; import Extension from "@shared/editor/lib/Extension"; import isMarkdown from "@shared/editor/lib/isMarkdown"; import normalizePastedMarkdown from "@shared/editor/lib/markdown/normalize"; -import isInCode from "@shared/editor/queries/isInCode"; -import isInList from "@shared/editor/queries/isInList"; +import { isInCode } from "@shared/editor/queries/isInCode"; +import { isInList } from "@shared/editor/queries/isInList"; import parseDocumentSlug from "@shared/utils/parseDocumentSlug"; import { isDocumentUrl, isUrl } from "@shared/utils/urls"; import stores from "~/stores"; diff --git a/app/editor/extensions/Suggestion.ts b/app/editor/extensions/Suggestion.ts index e6c328dc2..491db01ee 100644 --- a/app/editor/extensions/Suggestion.ts +++ b/app/editor/extensions/Suggestion.ts @@ -5,7 +5,7 @@ import { EditorState, Plugin } from "prosemirror-state"; import { isInTable } from "prosemirror-tables"; import Extension from "@shared/editor/lib/Extension"; import { SuggestionsMenuPlugin } from "@shared/editor/plugins/Suggestions"; -import isInCode from "@shared/editor/queries/isInCode"; +import { isInCode } from "@shared/editor/queries/isInCode"; export default class Suggestion extends Extension { state: { diff --git a/app/editor/menus/divider.tsx b/app/editor/menus/divider.tsx index 495b56942..384989ace 100644 --- a/app/editor/menus/divider.tsx +++ b/app/editor/menus/divider.tsx @@ -1,7 +1,7 @@ import { PageBreakIcon, HorizontalRuleIcon } from "outline-icons"; import { EditorState } from "prosemirror-state"; import * as React from "react"; -import isNodeActive from "@shared/editor/queries/isNodeActive"; +import { isNodeActive } from "@shared/editor/queries/isNodeActive"; import { MenuItem } from "@shared/editor/types"; import { Dictionary } from "~/hooks/useDictionary"; diff --git a/app/editor/menus/formatting.tsx b/app/editor/menus/formatting.tsx index 85dd31502..e05bf55a4 100644 --- a/app/editor/menus/formatting.tsx +++ b/app/editor/menus/formatting.tsx @@ -20,10 +20,10 @@ import { } from "outline-icons"; import { EditorState } from "prosemirror-state"; import * as React from "react"; -import isInCode from "@shared/editor/queries/isInCode"; -import isInList from "@shared/editor/queries/isInList"; -import isMarkActive from "@shared/editor/queries/isMarkActive"; -import isNodeActive from "@shared/editor/queries/isNodeActive"; +import { isInCode } from "@shared/editor/queries/isInCode"; +import { isInList } from "@shared/editor/queries/isInList"; +import { isMarkActive } from "@shared/editor/queries/isMarkActive"; +import { isNodeActive } from "@shared/editor/queries/isNodeActive"; import { MenuItem } from "@shared/editor/types"; import { Dictionary } from "~/hooks/useDictionary"; @@ -34,7 +34,6 @@ export default function formattingMenuItems( dictionary: Dictionary ): MenuItem[] { const { schema } = state; - const isList = isInList(state); const isCode = isInCode(state); const isCodeBlock = isInCode(state, { onlyBlock: true }); const isEmpty = state.selection.empty; @@ -152,13 +151,27 @@ export default function formattingMenuItems( name: "outdentList", tooltip: dictionary.outdent, icon: , - visible: isList && isMobile, + visible: + isMobile && isInList(state, { types: ["ordered_list", "bullet_list"] }), }, { name: "indentList", tooltip: dictionary.indent, icon: , - visible: isList && isMobile, + visible: + isMobile && isInList(state, { types: ["ordered_list", "bullet_list"] }), + }, + { + name: "outdentCheckboxList", + tooltip: dictionary.outdent, + icon: , + visible: isMobile && isInList(state, { types: ["checkbox_list"] }), + }, + { + name: "indentCheckboxList", + tooltip: dictionary.indent, + icon: , + visible: isMobile && isInList(state, { types: ["checkbox_list"] }), }, { name: "separator", diff --git a/app/editor/menus/image.tsx b/app/editor/menus/image.tsx index 04bbe0bac..035b4f01d 100644 --- a/app/editor/menus/image.tsx +++ b/app/editor/menus/image.tsx @@ -9,7 +9,7 @@ import { } from "outline-icons"; import { EditorState } from "prosemirror-state"; import * as React from "react"; -import isNodeActive from "@shared/editor/queries/isNodeActive"; +import { isNodeActive } from "@shared/editor/queries/isNodeActive"; import { MenuItem } from "@shared/editor/types"; import { Dictionary } from "~/hooks/useDictionary"; diff --git a/app/editor/menus/readOnly.tsx b/app/editor/menus/readOnly.tsx index 2a9dd331e..bc096c80c 100644 --- a/app/editor/menus/readOnly.tsx +++ b/app/editor/menus/readOnly.tsx @@ -1,7 +1,7 @@ import { CommentIcon } from "outline-icons"; import { EditorState } from "prosemirror-state"; import * as React from "react"; -import isMarkActive from "@shared/editor/queries/isMarkActive"; +import { isMarkActive } from "@shared/editor/queries/isMarkActive"; import { MenuItem } from "@shared/editor/types"; import { Dictionary } from "~/hooks/useDictionary"; diff --git a/app/editor/menus/table.tsx b/app/editor/menus/table.tsx index 5957dbc58..ae1b0654c 100644 --- a/app/editor/menus/table.tsx +++ b/app/editor/menus/table.tsx @@ -1,7 +1,7 @@ import { AlignFullWidthIcon, TrashIcon } from "outline-icons"; import { EditorState } from "prosemirror-state"; import * as React from "react"; -import isNodeActive from "@shared/editor/queries/isNodeActive"; +import { isNodeActive } from "@shared/editor/queries/isNodeActive"; import { MenuItem, TableLayout } from "@shared/editor/types"; import { Dictionary } from "~/hooks/useDictionary"; diff --git a/app/editor/menus/tableCol.tsx b/app/editor/menus/tableCol.tsx index af16af38f..0f8450622 100644 --- a/app/editor/menus/tableCol.tsx +++ b/app/editor/menus/tableCol.tsx @@ -12,7 +12,7 @@ import { import { EditorState } from "prosemirror-state"; import * as React from "react"; import styled from "styled-components"; -import isNodeActive from "@shared/editor/queries/isNodeActive"; +import { isNodeActive } from "@shared/editor/queries/isNodeActive"; import { MenuItem } from "@shared/editor/types"; import { Dictionary } from "~/hooks/useDictionary"; diff --git a/shared/editor/commands/codeFence.ts b/shared/editor/commands/codeFence.ts index be5294d57..2d4cdf217 100644 --- a/shared/editor/commands/codeFence.ts +++ b/shared/editor/commands/codeFence.ts @@ -1,5 +1,5 @@ import { Command, TextSelection } from "prosemirror-state"; -import isInCode from "../queries/isInCode"; +import { isInCode } from "../queries/isInCode"; /** * Moves the current selection to the previous newline, this is used inside diff --git a/shared/editor/commands/deleteEmptyFirstParagraph.ts b/shared/editor/commands/deleteEmptyFirstParagraph.ts index 3a706fac5..e8fdc43d2 100644 --- a/shared/editor/commands/deleteEmptyFirstParagraph.ts +++ b/shared/editor/commands/deleteEmptyFirstParagraph.ts @@ -1,5 +1,5 @@ import { Command } from "prosemirror-state"; -import isNodeActive from "../queries/isNodeActive"; +import { isNodeActive } from "../queries/isNodeActive"; /** * Deletes the first paragraph node if it is empty and the cursor is at the diff --git a/shared/editor/commands/splitHeading.ts b/shared/editor/commands/splitHeading.ts index 61d300a8d..e65769bf2 100644 --- a/shared/editor/commands/splitHeading.ts +++ b/shared/editor/commands/splitHeading.ts @@ -1,7 +1,7 @@ import { NodeType } from "prosemirror-model"; import { Command, TextSelection } from "prosemirror-state"; import { findBlockNodes } from "../queries/findChildren"; -import findCollapsedNodes from "../queries/findCollapsedNodes"; +import { findCollapsedNodes } from "../queries/findCollapsedNodes"; export default function splitHeading(type: NodeType): Command { return (state, dispatch): boolean => { diff --git a/shared/editor/commands/toggleBlockType.ts b/shared/editor/commands/toggleBlockType.ts index 50af07e5e..326232f51 100644 --- a/shared/editor/commands/toggleBlockType.ts +++ b/shared/editor/commands/toggleBlockType.ts @@ -1,7 +1,7 @@ import { setBlockType } from "prosemirror-commands"; import { NodeType } from "prosemirror-model"; import { Command } from "prosemirror-state"; -import isNodeActive from "../queries/isNodeActive"; +import { isNodeActive } from "../queries/isNodeActive"; /** * Toggles the block type of the current selection between the given type and the toggle type. diff --git a/shared/editor/commands/toggleList.ts b/shared/editor/commands/toggleList.ts index a5db03a0f..0895d5fc5 100644 --- a/shared/editor/commands/toggleList.ts +++ b/shared/editor/commands/toggleList.ts @@ -3,7 +3,7 @@ import { wrapInList, liftListItem } from "prosemirror-schema-list"; import { Command } from "prosemirror-state"; import { chainTransactions } from "../lib/chainTransactions"; import { findParentNode } from "../queries/findParentNode"; -import isList from "../queries/isList"; +import { isList } from "../queries/isList"; import clearNodes from "./clearNodes"; export default function toggleList( diff --git a/shared/editor/commands/toggleWrap.ts b/shared/editor/commands/toggleWrap.ts index bf52e4d0b..cbd47d3a3 100644 --- a/shared/editor/commands/toggleWrap.ts +++ b/shared/editor/commands/toggleWrap.ts @@ -2,7 +2,7 @@ import { wrapIn, lift } from "prosemirror-commands"; import { NodeType } from "prosemirror-model"; import { Command } from "prosemirror-state"; import { Primitive } from "utility-types"; -import isNodeActive from "../queries/isNodeActive"; +import { isNodeActive } from "../queries/isNodeActive"; export default function toggleWrap( type: NodeType, diff --git a/shared/editor/lib/InputRule.ts b/shared/editor/lib/InputRule.ts index fb1f472df..a7d4e3b29 100644 --- a/shared/editor/lib/InputRule.ts +++ b/shared/editor/lib/InputRule.ts @@ -1,6 +1,6 @@ import { InputRule as ProsemirrorInputRule } from "prosemirror-inputrules"; import { EditorState } from "prosemirror-state"; -import isInCode from "../queries/isInCode"; +import { isInCode } from "../queries/isInCode"; /** * A factory function for creating Prosemirror input rules that automatically insert text diff --git a/shared/editor/marks/Comment.ts b/shared/editor/marks/Comment.ts index e22097f78..84fac3518 100644 --- a/shared/editor/marks/Comment.ts +++ b/shared/editor/marks/Comment.ts @@ -4,7 +4,7 @@ import { Command, Plugin } from "prosemirror-state"; import { v4 as uuidv4 } from "uuid"; import collapseSelection from "../commands/collapseSelection"; import { chainTransactions } from "../lib/chainTransactions"; -import isMarkActive from "../queries/isMarkActive"; +import { isMarkActive } from "../queries/isMarkActive"; import Mark from "./Mark"; export default class Comment extends Mark { diff --git a/shared/editor/marks/Link.tsx b/shared/editor/marks/Link.tsx index 53a124444..0aabea525 100644 --- a/shared/editor/marks/Link.tsx +++ b/shared/editor/marks/Link.tsx @@ -12,8 +12,8 @@ import { Command, EditorState, Plugin, TextSelection } from "prosemirror-state"; import { EditorView } from "prosemirror-view"; import { toast } from "sonner"; import { sanitizeUrl } from "../../utils/urls"; -import getMarkRange from "../queries/getMarkRange"; -import isMarkActive from "../queries/isMarkActive"; +import { getMarkRange } from "../queries/getMarkRange"; +import { isMarkActive } from "../queries/isMarkActive"; import { EventType } from "../types"; import Mark from "./Mark"; diff --git a/shared/editor/marks/Placeholder.ts b/shared/editor/marks/Placeholder.ts index bacc1e56f..bef2a7cf3 100644 --- a/shared/editor/marks/Placeholder.ts +++ b/shared/editor/marks/Placeholder.ts @@ -1,6 +1,6 @@ import { MarkSpec } from "prosemirror-model"; import { Plugin, TextSelection } from "prosemirror-state"; -import getMarkRange from "../queries/getMarkRange"; +import { getMarkRange } from "../queries/getMarkRange"; import markRule from "../rules/mark"; import Mark from "./Mark"; diff --git a/shared/editor/nodes/Blockquote.ts b/shared/editor/nodes/Blockquote.ts index 564f95f49..d0517aa5c 100644 --- a/shared/editor/nodes/Blockquote.ts +++ b/shared/editor/nodes/Blockquote.ts @@ -3,7 +3,7 @@ import { NodeSpec, Node as ProsemirrorNode, NodeType } from "prosemirror-model"; import { Command } from "prosemirror-state"; import toggleWrap from "../commands/toggleWrap"; import { MarkdownSerializerState } from "../lib/markdown/serializer"; -import isNodeActive from "../queries/isNodeActive"; +import { isNodeActive } from "../queries/isNodeActive"; import Node from "./Node"; export default class Blockquote extends Node { diff --git a/shared/editor/nodes/CheckboxItem.ts b/shared/editor/nodes/CheckboxItem.ts index bf743eeef..88edc5c6f 100644 --- a/shared/editor/nodes/CheckboxItem.ts +++ b/shared/editor/nodes/CheckboxItem.ts @@ -88,6 +88,13 @@ export default class CheckboxItem extends Node { } }; + commands({ type }: { type: NodeType }) { + return { + indentCheckboxList: () => sinkListItem(type), + outdentCheckboxList: () => liftListItem(type), + }; + } + keys({ type }: { type: NodeType }) { return { Enter: splitListItem(type, { diff --git a/shared/editor/nodes/CodeFence.ts b/shared/editor/nodes/CodeFence.ts index c71874d05..6b22ec3e9 100644 --- a/shared/editor/nodes/CodeFence.ts +++ b/shared/editor/nodes/CodeFence.ts @@ -76,8 +76,8 @@ import Prism from "../extensions/Prism"; import { isCode } from "../lib/isCode"; import { MarkdownSerializerState } from "../lib/markdown/serializer"; import { findParentNode } from "../queries/findParentNode"; -import getMarkRange from "../queries/getMarkRange"; -import isInCode from "../queries/isInCode"; +import { getMarkRange } from "../queries/getMarkRange"; +import { isInCode } from "../queries/isInCode"; import Node from "./Node"; const PERSISTENCE_KEY = "rme-code-language"; diff --git a/shared/editor/nodes/HardBreak.ts b/shared/editor/nodes/HardBreak.ts index d0bc82ba2..4b3bbc23b 100644 --- a/shared/editor/nodes/HardBreak.ts +++ b/shared/editor/nodes/HardBreak.ts @@ -2,8 +2,8 @@ import { NodeSpec, NodeType } from "prosemirror-model"; import { Command } from "prosemirror-state"; import { isInTable } from "prosemirror-tables"; import { MarkdownSerializerState } from "../lib/markdown/serializer"; -import isInCode from "../queries/isInCode"; -import isNodeActive from "../queries/isNodeActive"; +import { isInCode } from "../queries/isInCode"; +import { isNodeActive } from "../queries/isNodeActive"; import breakRule from "../rules/breaks"; import Node from "./Node"; diff --git a/shared/editor/nodes/ListItem.ts b/shared/editor/nodes/ListItem.ts index e2946635f..6fdaa737c 100644 --- a/shared/editor/nodes/ListItem.ts +++ b/shared/editor/nodes/ListItem.ts @@ -14,9 +14,9 @@ import { import { DecorationSet, Decoration } from "prosemirror-view"; import { MarkdownSerializerState } from "../lib/markdown/serializer"; import { findParentNodeClosestToPos } from "../queries/findParentNode"; -import getParentListItem from "../queries/getParentListItem"; -import isInList from "../queries/isInList"; -import isList from "../queries/isList"; +import { getParentListItem } from "../queries/getParentListItem"; +import { isInList } from "../queries/isInList"; +import { isList } from "../queries/isList"; import Node from "./Node"; export default class ListItem extends Node { diff --git a/shared/editor/plugins/FoldingHeaders.ts b/shared/editor/plugins/FoldingHeaders.ts index edf7a8690..4c4331672 100644 --- a/shared/editor/plugins/FoldingHeaders.ts +++ b/shared/editor/plugins/FoldingHeaders.ts @@ -3,7 +3,7 @@ import { Decoration, DecorationSet } from "prosemirror-view"; import Storage from "../../utils/Storage"; import { headingToPersistenceKey } from "../lib/headingToSlug"; import { findBlockNodes } from "../queries/findChildren"; -import findCollapsedNodes from "../queries/findCollapsedNodes"; +import { findCollapsedNodes } from "../queries/findCollapsedNodes"; export class FoldingHeadersPlugin extends Plugin { constructor(documentId: string | undefined) { diff --git a/shared/editor/queries/findCollapsedNodes.ts b/shared/editor/queries/findCollapsedNodes.ts index fec130cc7..4ca42dcf7 100644 --- a/shared/editor/queries/findCollapsedNodes.ts +++ b/shared/editor/queries/findCollapsedNodes.ts @@ -1,7 +1,7 @@ import { Node } from "prosemirror-model"; import { findBlockNodes, NodeWithPos } from "./findChildren"; -export default function findCollapsedNodes(doc: Node): NodeWithPos[] { +export function findCollapsedNodes(doc: Node): NodeWithPos[] { const blocks = findBlockNodes(doc); const nodes: NodeWithPos[] = []; diff --git a/shared/editor/queries/getMarkRange.ts b/shared/editor/queries/getMarkRange.ts index c5a057304..825ff9b22 100644 --- a/shared/editor/queries/getMarkRange.ts +++ b/shared/editor/queries/getMarkRange.ts @@ -1,6 +1,6 @@ import { ResolvedPos, MarkType } from "prosemirror-model"; -export default function getMarkRange($pos?: ResolvedPos, type?: MarkType) { +export function getMarkRange($pos?: ResolvedPos, type?: MarkType) { if (!$pos || !type) { return false; } diff --git a/shared/editor/queries/getParentListItem.ts b/shared/editor/queries/getParentListItem.ts index 9ae354ebc..60e83667f 100644 --- a/shared/editor/queries/getParentListItem.ts +++ b/shared/editor/queries/getParentListItem.ts @@ -1,9 +1,7 @@ import { Node } from "prosemirror-model"; import { EditorState } from "prosemirror-state"; -export default function getParentListItem( - state: EditorState -): [Node, number] | void { +export function getParentListItem(state: EditorState): [Node, number] | void { const $head = state.selection.$head; for (let d = $head.depth; d > 0; d--) { const node = $head.node(d); diff --git a/shared/editor/queries/isInCode.ts b/shared/editor/queries/isInCode.ts index e9c6ba30b..fd9a8f9ab 100644 --- a/shared/editor/queries/isInCode.ts +++ b/shared/editor/queries/isInCode.ts @@ -1,6 +1,6 @@ import { EditorState } from "prosemirror-state"; -import isMarkActive from "./isMarkActive"; -import isNodeActive from "./isNodeActive"; +import { isMarkActive } from "./isMarkActive"; +import { isNodeActive } from "./isNodeActive"; type Options = { /** Only check if the selection is inside a code block. */ @@ -16,10 +16,7 @@ type Options = { * @param options The options. * @returns True if the selection is inside a code block or code mark. */ -export default function isInCode( - state: EditorState, - options?: Options -): boolean { +export function isInCode(state: EditorState, options?: Options): boolean { const { nodes, marks } = state.schema; if (!options?.onlyMark) { diff --git a/shared/editor/queries/isInList.ts b/shared/editor/queries/isInList.ts index d7c3a3290..b79a0f4a8 100644 --- a/shared/editor/queries/isInList.ts +++ b/shared/editor/queries/isInList.ts @@ -1,12 +1,19 @@ import { EditorState } from "prosemirror-state"; -export default function isInList(state: EditorState) { +/** + * Check if the current selection is in a list + * + * @param state - The current editor state + * @param options - Optionally check for specific list types + */ +export function isInList(state: EditorState, options?: { types: string[] }) { const $head = state.selection.$head; for (let d = $head.depth; d > 0; d--) { if ( - ["ordered_list", "bullet_list", "checkbox_list"].includes( - $head.node(d).type.name - ) + (options?.types + ? options.types + : ["ordered_list", "bullet_list", "checkbox_list"] + ).includes($head.node(d).type.name) ) { return true; } diff --git a/shared/editor/queries/isList.ts b/shared/editor/queries/isList.ts index 703199845..de814184e 100644 --- a/shared/editor/queries/isList.ts +++ b/shared/editor/queries/isList.ts @@ -1,6 +1,6 @@ import { Node, Schema } from "prosemirror-model"; -export default function isList(node: Node, schema: Schema) { +export function isList(node: Node, schema: Schema) { return ( node.type === schema.nodes.bullet_list || node.type === schema.nodes.ordered_list || diff --git a/shared/editor/queries/isMarkActive.ts b/shared/editor/queries/isMarkActive.ts index 01f69c082..eb646e860 100644 --- a/shared/editor/queries/isMarkActive.ts +++ b/shared/editor/queries/isMarkActive.ts @@ -1,7 +1,7 @@ import { MarkType } from "prosemirror-model"; import { EditorState } from "prosemirror-state"; -const isMarkActive = +export const isMarkActive = (type: MarkType) => (state: EditorState): boolean => { if (!type) { @@ -14,5 +14,3 @@ const isMarkActive = ? type.isInSet(state.storedMarks || $from.marks()) : state.doc.rangeHasMark(from, to, type)); }; - -export default isMarkActive; diff --git a/shared/editor/queries/isNodeActive.ts b/shared/editor/queries/isNodeActive.ts index cad4a16bf..96c288bc6 100644 --- a/shared/editor/queries/isNodeActive.ts +++ b/shared/editor/queries/isNodeActive.ts @@ -3,7 +3,7 @@ import { EditorState } from "prosemirror-state"; import { Primitive } from "utility-types"; import { findParentNode } from "./findParentNode"; -const isNodeActive = +export const isNodeActive = (type: NodeType, attrs: Record = {}) => (state: EditorState) => { if (!type) { @@ -26,5 +26,3 @@ const isNodeActive = return node.hasMarkup(type, { ...node.attrs, ...attrs }); }; - -export default isNodeActive;