roamjs-components 0.78.11 → 0.79.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -8,15 +8,16 @@ const fuzzy_1 = tslib_1.__importDefault(require("fuzzy"));
8
8
  // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-constraint
9
9
  const AutocompleteInput = ({ value, setValue, onBlur, onConfirm, showButton, options = [], placeholder = "Enter value", autoFocus, multiline, id, filterOptions: _filterOptions, itemToQuery: _itemToQuery, renderItem, onNewItem: _onNewItem, }) => {
10
10
  const [isOpen, setIsOpen] = (0, react_1.useState)(false);
11
- const itemToQuery = (0, react_1.useMemo)(() => _itemToQuery || ((s) => (s ? `${s}` : "")), [_onNewItem]);
11
+ const itemToQuery = (0, react_1.useMemo)(() => _itemToQuery || ((s) => (s ? `${s}` : "")), [_itemToQuery]);
12
12
  const [query, setQuery] = (0, react_1.useState)(() => itemToQuery(value));
13
13
  const open = (0, react_1.useCallback)(() => setIsOpen(true), [setIsOpen]);
14
14
  const close = (0, react_1.useCallback)(() => setIsOpen(false), [setIsOpen]);
15
15
  const [isTyping, setIsTyping] = (0, react_1.useState)(false);
16
16
  const filterOptions = (0, react_1.useMemo)(() => _filterOptions ||
17
- ((o, q) => typeof o[0] === "string"
18
- ? fuzzy_1.default.filter(q, o).map((e) => e.string)
19
- : o), [_filterOptions]);
17
+ ((o, q) => fuzzy_1.default
18
+ .filter(q, o, { extract: itemToQuery })
19
+ .map((f) => f.original)
20
+ .filter((f) => !!f)), [_filterOptions, itemToQuery]);
20
21
  const onNewItem = (0, react_1.useMemo)(() => _onNewItem || ((s) => s), [_onNewItem]);
21
22
  const items = (0, react_1.useMemo)(() => (query ? filterOptions(options, query) : options), [query, options, filterOptions]);
22
23
  const menuRef = (0, react_1.useRef)(null);
@@ -1 +1 @@
1
- {"version":3,"file":"AutocompleteInput.js","sourceRoot":"","sources":["../../src/components/AutocompleteInput.tsx"],"names":[],"mappings":"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","sourcesContent":["import {\n InputGroup,\n Menu,\n MenuItem,\n PopoverPosition,\n Popover,\n Button,\n TextArea,\n} from \"@blueprintjs/core\";\nimport React, {\n useState,\n useCallback,\n useMemo,\n useRef,\n useEffect,\n} from \"react\";\nimport useArrowKeyDown from \"../hooks/useArrowKeyDown\";\nimport fuzzy from \"fuzzy\";\n\ntype FilterOptions<T> = (options: T[], query: string) => T[];\ntype OnNewItem<T> = (s: string) => T;\ntype ItemToQuery<T> = (t?: T) => string;\n\nexport type AutocompleteInputProps<T = string> = {\n value?: T;\n setValue: (q: T) => void;\n showButton?: boolean;\n onBlur?: (v: string) => void;\n onConfirm?: () => void;\n options?: T[];\n placeholder?: string;\n autoFocus?: boolean;\n multiline?: boolean;\n id?: string;\n filterOptions?: FilterOptions<T>;\n itemToQuery?: ItemToQuery<T>;\n renderItem?: (props: {\n item: T;\n onClick: () => void;\n active: boolean;\n }) => React.ReactElement;\n onNewItem?: OnNewItem<T>;\n};\n\n// eslint-disable-next-line @typescript-eslint/no-unnecessary-type-constraint\nconst AutocompleteInput = <T extends unknown = string>({\n value,\n setValue,\n onBlur,\n onConfirm,\n showButton,\n options = [],\n placeholder = \"Enter value\",\n autoFocus,\n multiline,\n id,\n filterOptions: _filterOptions,\n itemToQuery: _itemToQuery,\n renderItem,\n onNewItem: _onNewItem,\n}: AutocompleteInputProps<T>): React.ReactElement => {\n const [isOpen, setIsOpen] = useState(false);\n const itemToQuery = useMemo<ItemToQuery<T>>(\n () => _itemToQuery || ((s) => (s ? `${s}` : \"\")),\n [_onNewItem]\n );\n const [query, setQuery] = useState<string>(() => itemToQuery(value));\n const open = useCallback(() => setIsOpen(true), [setIsOpen]);\n const close = useCallback(() => setIsOpen(false), [setIsOpen]);\n const [isTyping, setIsTyping] = useState(false);\n const filterOptions = useMemo<FilterOptions<T>>(\n () =>\n _filterOptions ||\n ((o, q) =>\n typeof o[0] === \"string\"\n ? (fuzzy.filter(q, o).map((e) => e.string) as T[])\n : o),\n [_filterOptions]\n );\n const onNewItem = useMemo<OnNewItem<T>>(\n () => _onNewItem || ((s) => s as T),\n [_onNewItem]\n );\n\n const items = useMemo(\n () => (query ? filterOptions(options, query) : options),\n [query, options, filterOptions]\n );\n const menuRef = useRef<HTMLUListElement>(null);\n const inputRef = useRef<HTMLInputElement & HTMLTextAreaElement>(null);\n const onEnter = useCallback(\n (value?: T) => {\n if (isOpen && value) {\n setQuery(itemToQuery(value));\n setValue(value);\n setIsTyping(false);\n } else if (onConfirm) {\n onConfirm();\n } else {\n setIsOpen(true);\n }\n },\n [setValue, onConfirm, isOpen]\n );\n const { activeIndex, onKeyDown } = useArrowKeyDown({\n onEnter,\n results: items,\n menuRef,\n });\n useEffect(() => {\n if (!items.length || !isTyping) close();\n else open();\n }, [items, close, open, isTyping]);\n useEffect(() => {\n if (query) setValue(items[activeIndex] || onNewItem(query));\n }, [setValue, activeIndex, items, onNewItem, query]);\n useEffect(() => {\n if (\n inputRef.current &&\n inputRef.current === document.activeElement &&\n value\n ) {\n const index = itemToQuery(value).length;\n inputRef.current.setSelectionRange(index, index);\n }\n const touchEndListener = (e: TouchEvent) => {\n if (\n !e.target ||\n !menuRef.current ||\n menuRef.current.contains(e.target as Element)\n ) {\n return;\n }\n if (!inputRef.current || inputRef.current.contains(e.target as Element)) {\n return;\n }\n close();\n };\n document.body.addEventListener(\"touchend\", touchEndListener);\n return () =>\n document.body.removeEventListener(\"touchend\", touchEndListener);\n }, [inputRef, menuRef, close]);\n const Input = useMemo(() => (multiline ? TextArea : InputGroup), [multiline]);\n return (\n <Popover\n portalClassName={\"roamjs-autocomplete-input\"}\n targetClassName={\"roamjs-autocomplete-input-target\"}\n captureDismiss={true}\n isOpen={isOpen}\n onOpened={open}\n minimal\n autoFocus={false}\n enforceFocus={false}\n position={PopoverPosition.BOTTOM_LEFT}\n modifiers={{\n flip: { enabled: false },\n preventOverflow: { enabled: false },\n }}\n content={\n <Menu className={\"max-h-64 overflow-auto max-w-md\"} ulRef={menuRef}>\n {items.map((t, i) => {\n const onClick = () => {\n setIsTyping(false);\n setValue(t);\n setQuery(itemToQuery(t));\n inputRef.current?.focus();\n };\n const sharedProps = {\n onClick,\n onTouchEnd: onClick,\n active: activeIndex === i,\n };\n return renderItem ? (\n <React.Fragment key={i}>\n {renderItem?.({\n item: t,\n ...sharedProps,\n })}\n </React.Fragment>\n ) : (\n <MenuItem\n text={itemToQuery(t)}\n key={i}\n multiline\n {...sharedProps}\n />\n );\n })}\n </Menu>\n }\n target={\n <Input\n value={query}\n onChange={(e) => {\n setIsTyping(true);\n setQuery(e.target.value);\n }}\n autoFocus={autoFocus}\n placeholder={placeholder}\n onKeyDown={(e) => {\n if (e.key === \"Escape\") {\n e.stopPropagation();\n close();\n } else {\n onKeyDown(e);\n }\n }}\n id={id}\n onClick={() => setIsTyping(true)}\n onBlur={(e) => {\n if (\n e.relatedTarget === null ||\n !(e.relatedTarget as HTMLElement).closest?.(\n \".roamjs-autocomplete-input\"\n )\n ) {\n setIsTyping(false);\n }\n if (onBlur) {\n onBlur(e.target.value);\n }\n }}\n inputRef={inputRef}\n {...(showButton\n ? {\n rightElement: (\n <Button icon={\"add\"} minimal onClick={() => onEnter()} />\n ),\n }\n : {})}\n />\n }\n />\n );\n};\n\nexport default AutocompleteInput;\n"]}
1
+ {"version":3,"file":"AutocompleteInput.js","sourceRoot":"","sources":["../../src/components/AutocompleteInput.tsx"],"names":[],"mappings":";;;AAAA,4CAQ2B;AAC3B,uDAMe;AACf,uFAAuD;AACvD,0DAA0B;AA2B1B,6EAA6E;AAC7E,MAAM,iBAAiB,GAAG,CAA6B,EACrD,KAAK,EACL,QAAQ,EACR,MAAM,EACN,SAAS,EACT,UAAU,EACV,OAAO,GAAG,EAAE,EACZ,WAAW,GAAG,aAAa,EAC3B,SAAS,EACT,SAAS,EACT,EAAE,EACF,aAAa,EAAE,cAAc,EAC7B,WAAW,EAAE,YAAY,EACzB,UAAU,EACV,SAAS,EAAE,UAAU,GACK,EAAsB,EAAE;IAClD,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,IAAA,gBAAQ,EAAC,KAAK,CAAC,CAAC;IAC5C,MAAM,WAAW,GAAG,IAAA,eAAO,EACzB,GAAG,EAAE,CAAC,YAAY,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAChD,CAAC,YAAY,CAAC,CACf,CAAC;IACF,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,IAAA,gBAAQ,EAAS,GAAG,EAAE,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC;IACrE,MAAM,IAAI,GAAG,IAAA,mBAAW,EAAC,GAAG,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC;IAC7D,MAAM,KAAK,GAAG,IAAA,mBAAW,EAAC,GAAG,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC;IAC/D,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,IAAA,gBAAQ,EAAC,KAAK,CAAC,CAAC;IAChD,MAAM,aAAa,GAAG,IAAA,eAAO,EAC3B,GAAG,EAAE,CACH,cAAc;QACd,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CACR,eAAK;aACF,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC;aACtC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC;aACtB,MAAM,CAAC,CAAC,CAAC,EAAU,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAClC,CAAC,cAAc,EAAE,WAAW,CAAC,CAC9B,CAAC;IACF,MAAM,SAAS,GAAG,IAAA,eAAO,EACvB,GAAG,EAAE,CAAC,UAAU,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAM,CAAC,EACnC,CAAC,UAAU,CAAC,CACb,CAAC;IAEF,MAAM,KAAK,GAAG,IAAA,eAAO,EACnB,GAAG,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,aAAa,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,EACvD,CAAC,KAAK,EAAE,OAAO,EAAE,aAAa,CAAC,CAChC,CAAC;IACF,MAAM,OAAO,GAAG,IAAA,cAAM,EAAmB,IAAI,CAAC,CAAC;IAC/C,MAAM,QAAQ,GAAG,IAAA,cAAM,EAAyC,IAAI,CAAC,CAAC;IACtE,MAAM,OAAO,GAAG,IAAA,mBAAW,EACzB,CAAC,KAAS,EAAE,EAAE;QACZ,IAAI,MAAM,IAAI,KAAK,EAAE;YACnB,QAAQ,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC;YAC7B,QAAQ,CAAC,KAAK,CAAC,CAAC;YAChB,WAAW,CAAC,KAAK,CAAC,CAAC;SACpB;aAAM,IAAI,SAAS,EAAE;YACpB,SAAS,EAAE,CAAC;SACb;aAAM;YACL,SAAS,CAAC,IAAI,CAAC,CAAC;SACjB;IACH,CAAC,EACD,CAAC,QAAQ,EAAE,SAAS,EAAE,MAAM,CAAC,CAC9B,CAAC;IACF,MAAM,EAAE,WAAW,EAAE,SAAS,EAAE,GAAG,IAAA,yBAAe,EAAC;QACjD,OAAO;QACP,OAAO,EAAE,KAAK;QACd,OAAO;KACR,CAAC,CAAC;IACH,IAAA,iBAAS,EAAC,GAAG,EAAE;QACb,IAAI,CAAC,KAAK,CAAC,MAAM,IAAI,CAAC,QAAQ;YAAE,KAAK,EAAE,CAAC;;YACnC,IAAI,EAAE,CAAC;IACd,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC;IACnC,IAAA,iBAAS,EAAC,GAAG,EAAE;QACb,IAAI,KAAK;YAAE,QAAQ,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;IAC9D,CAAC,EAAE,CAAC,QAAQ,EAAE,WAAW,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC,CAAC;IACrD,IAAA,iBAAS,EAAC,GAAG,EAAE;QACb,IACE,QAAQ,CAAC,OAAO;YAChB,QAAQ,CAAC,OAAO,KAAK,QAAQ,CAAC,aAAa;YAC3C,KAAK,EACL;YACA,MAAM,KAAK,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC;YACxC,QAAQ,CAAC,OAAO,CAAC,iBAAiB,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;SAClD;QACD,MAAM,gBAAgB,GAAG,CAAC,CAAa,EAAE,EAAE;YACzC,IACE,CAAC,CAAC,CAAC,MAAM;gBACT,CAAC,OAAO,CAAC,OAAO;gBAChB,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAiB,CAAC,EAC7C;gBACA,OAAO;aACR;YACD,IAAI,CAAC,QAAQ,CAAC,OAAO,IAAI,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAiB,CAAC,EAAE;gBACvE,OAAO;aACR;YACD,KAAK,EAAE,CAAC;QACV,CAAC,CAAC;QACF,QAAQ,CAAC,IAAI,CAAC,gBAAgB,CAAC,UAAU,EAAE,gBAAgB,CAAC,CAAC;QAC7D,OAAO,GAAG,EAAE,CACV,QAAQ,CAAC,IAAI,CAAC,mBAAmB,CAAC,UAAU,EAAE,gBAAgB,CAAC,CAAC;IACpE,CAAC,EAAE,CAAC,QAAQ,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC;IAC/B,MAAM,KAAK,GAAG,IAAA,eAAO,EAAC,GAAG,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,eAAQ,CAAC,CAAC,CAAC,iBAAU,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC;IAC9E,OAAO,CACL,8BAAC,cAAO,IACN,eAAe,EAAE,2BAA2B,EAC5C,eAAe,EAAE,kCAAkC,EACnD,cAAc,EAAE,IAAI,EACpB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,IAAI,EACd,OAAO,QACP,SAAS,EAAE,KAAK,EAChB,YAAY,EAAE,KAAK,EACnB,QAAQ,EAAE,sBAAe,CAAC,WAAW,EACrC,SAAS,EAAE;YACT,IAAI,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE;YACxB,eAAe,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE;SACpC,EACD,OAAO,EACL,8BAAC,WAAI,IAAC,SAAS,EAAE,iCAAiC,EAAE,KAAK,EAAE,OAAO,IAC/D,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;YAClB,MAAM,OAAO,GAAG,GAAG,EAAE;;gBACnB,WAAW,CAAC,KAAK,CAAC,CAAC;gBACnB,QAAQ,CAAC,CAAC,CAAC,CAAC;gBACZ,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;gBACzB,MAAA,QAAQ,CAAC,OAAO,0CAAE,KAAK,EAAE,CAAC;YAC5B,CAAC,CAAC;YACF,MAAM,WAAW,GAAG;gBAClB,OAAO;gBACP,UAAU,EAAE,OAAO;gBACnB,MAAM,EAAE,WAAW,KAAK,CAAC;aAC1B,CAAC;YACF,OAAO,UAAU,CAAC,CAAC,CAAC,CAClB,8BAAC,eAAK,CAAC,QAAQ,IAAC,GAAG,EAAE,CAAC,IACnB,UAAU,aAAV,UAAU,uBAAV,UAAU,iBACT,IAAI,EAAE,CAAC,IACJ,WAAW,EACd,CACa,CAClB,CAAC,CAAC,CAAC,CACF,8BAAC,eAAQ,kBACP,IAAI,EAAE,WAAW,CAAC,CAAC,CAAC,EACpB,GAAG,EAAE,CAAC,EACN,SAAS,UACL,WAAW,EACf,CACH,CAAC;QACJ,CAAC,CAAC,CACG,EAET,MAAM,EACJ,8BAAC,KAAK,kBACJ,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE;gBACd,WAAW,CAAC,IAAI,CAAC,CAAC;gBAClB,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAC3B,CAAC,EACD,SAAS,EAAE,SAAS,EACpB,WAAW,EAAE,WAAW,EACxB,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE;gBACf,IAAI,CAAC,CAAC,GAAG,KAAK,QAAQ,EAAE;oBACtB,CAAC,CAAC,eAAe,EAAE,CAAC;oBACpB,KAAK,EAAE,CAAC;iBACT;qBAAM;oBACL,SAAS,CAAC,CAAC,CAAC,CAAC;iBACd;YACH,CAAC,EACD,EAAE,EAAE,EAAE,EACN,OAAO,EAAE,GAAG,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,EAChC,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE;;gBACZ,IACE,CAAC,CAAC,aAAa,KAAK,IAAI;oBACxB,CAAC,CAAA,MAAA,MAAC,CAAC,CAAC,aAA6B,EAAC,OAAO,mDACvC,4BAA4B,CAC7B,CAAA,EACD;oBACA,WAAW,CAAC,KAAK,CAAC,CAAC;iBACpB;gBACD,IAAI,MAAM,EAAE;oBACV,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;iBACxB;YACH,CAAC,EACD,QAAQ,EAAE,QAAQ,IACd,CAAC,UAAU;YACb,CAAC,CAAC;gBACE,YAAY,EAAE,CACZ,8BAAC,aAAM,IAAC,IAAI,EAAE,KAAK,EAAE,OAAO,QAAC,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,EAAE,GAAI,CAC1D;aACF;YACH,CAAC,CAAC,EAAE,CAAC,EACP,GAEJ,CACH,CAAC;AACJ,CAAC,CAAC;AAEF,kBAAe,iBAAiB,CAAC","sourcesContent":["import {\n InputGroup,\n Menu,\n MenuItem,\n PopoverPosition,\n Popover,\n Button,\n TextArea,\n} from \"@blueprintjs/core\";\nimport React, {\n useState,\n useCallback,\n useMemo,\n useRef,\n useEffect,\n} from \"react\";\nimport useArrowKeyDown from \"../hooks/useArrowKeyDown\";\nimport fuzzy from \"fuzzy\";\n\ntype FilterOptions<T> = (options: T[], query: string) => T[];\ntype OnNewItem<T> = (s: string) => T;\ntype ItemToQuery<T> = (t?: T) => string;\n\nexport type AutocompleteInputProps<T = string> = {\n value?: T;\n setValue: (q: T) => void;\n showButton?: boolean;\n onBlur?: (v: string) => void;\n onConfirm?: () => void;\n options?: T[];\n placeholder?: string;\n autoFocus?: boolean;\n multiline?: boolean;\n id?: string;\n filterOptions?: FilterOptions<T>;\n itemToQuery?: ItemToQuery<T>;\n renderItem?: (props: {\n item: T;\n onClick: () => void;\n active: boolean;\n }) => React.ReactElement;\n onNewItem?: OnNewItem<T>;\n};\n\n// eslint-disable-next-line @typescript-eslint/no-unnecessary-type-constraint\nconst AutocompleteInput = <T extends unknown = string>({\n value,\n setValue,\n onBlur,\n onConfirm,\n showButton,\n options = [],\n placeholder = \"Enter value\",\n autoFocus,\n multiline,\n id,\n filterOptions: _filterOptions,\n itemToQuery: _itemToQuery,\n renderItem,\n onNewItem: _onNewItem,\n}: AutocompleteInputProps<T>): React.ReactElement => {\n const [isOpen, setIsOpen] = useState(false);\n const itemToQuery = useMemo<ItemToQuery<T>>(\n () => _itemToQuery || ((s) => (s ? `${s}` : \"\")),\n [_itemToQuery]\n );\n const [query, setQuery] = useState<string>(() => itemToQuery(value));\n const open = useCallback(() => setIsOpen(true), [setIsOpen]);\n const close = useCallback(() => setIsOpen(false), [setIsOpen]);\n const [isTyping, setIsTyping] = useState(false);\n const filterOptions = useMemo<FilterOptions<T>>(\n () =>\n _filterOptions ||\n ((o, q) =>\n fuzzy\n .filter(q, o, { extract: itemToQuery })\n .map((f) => f.original)\n .filter((f): f is T => !!f)),\n [_filterOptions, itemToQuery]\n );\n const onNewItem = useMemo<OnNewItem<T>>(\n () => _onNewItem || ((s) => s as T),\n [_onNewItem]\n );\n\n const items = useMemo(\n () => (query ? filterOptions(options, query) : options),\n [query, options, filterOptions]\n );\n const menuRef = useRef<HTMLUListElement>(null);\n const inputRef = useRef<HTMLInputElement & HTMLTextAreaElement>(null);\n const onEnter = useCallback(\n (value?: T) => {\n if (isOpen && value) {\n setQuery(itemToQuery(value));\n setValue(value);\n setIsTyping(false);\n } else if (onConfirm) {\n onConfirm();\n } else {\n setIsOpen(true);\n }\n },\n [setValue, onConfirm, isOpen]\n );\n const { activeIndex, onKeyDown } = useArrowKeyDown({\n onEnter,\n results: items,\n menuRef,\n });\n useEffect(() => {\n if (!items.length || !isTyping) close();\n else open();\n }, [items, close, open, isTyping]);\n useEffect(() => {\n if (query) setValue(items[activeIndex] || onNewItem(query));\n }, [setValue, activeIndex, items, onNewItem, query]);\n useEffect(() => {\n if (\n inputRef.current &&\n inputRef.current === document.activeElement &&\n value\n ) {\n const index = itemToQuery(value).length;\n inputRef.current.setSelectionRange(index, index);\n }\n const touchEndListener = (e: TouchEvent) => {\n if (\n !e.target ||\n !menuRef.current ||\n menuRef.current.contains(e.target as Element)\n ) {\n return;\n }\n if (!inputRef.current || inputRef.current.contains(e.target as Element)) {\n return;\n }\n close();\n };\n document.body.addEventListener(\"touchend\", touchEndListener);\n return () =>\n document.body.removeEventListener(\"touchend\", touchEndListener);\n }, [inputRef, menuRef, close]);\n const Input = useMemo(() => (multiline ? TextArea : InputGroup), [multiline]);\n return (\n <Popover\n portalClassName={\"roamjs-autocomplete-input\"}\n targetClassName={\"roamjs-autocomplete-input-target\"}\n captureDismiss={true}\n isOpen={isOpen}\n onOpened={open}\n minimal\n autoFocus={false}\n enforceFocus={false}\n position={PopoverPosition.BOTTOM_LEFT}\n modifiers={{\n flip: { enabled: false },\n preventOverflow: { enabled: false },\n }}\n content={\n <Menu className={\"max-h-64 overflow-auto max-w-md\"} ulRef={menuRef}>\n {items.map((t, i) => {\n const onClick = () => {\n setIsTyping(false);\n setValue(t);\n setQuery(itemToQuery(t));\n inputRef.current?.focus();\n };\n const sharedProps = {\n onClick,\n onTouchEnd: onClick,\n active: activeIndex === i,\n };\n return renderItem ? (\n <React.Fragment key={i}>\n {renderItem?.({\n item: t,\n ...sharedProps,\n })}\n </React.Fragment>\n ) : (\n <MenuItem\n text={itemToQuery(t)}\n key={i}\n multiline\n {...sharedProps}\n />\n );\n })}\n </Menu>\n }\n target={\n <Input\n value={query}\n onChange={(e) => {\n setIsTyping(true);\n setQuery(e.target.value);\n }}\n autoFocus={autoFocus}\n placeholder={placeholder}\n onKeyDown={(e) => {\n if (e.key === \"Escape\") {\n e.stopPropagation();\n close();\n } else {\n onKeyDown(e);\n }\n }}\n id={id}\n onClick={() => setIsTyping(true)}\n onBlur={(e) => {\n if (\n e.relatedTarget === null ||\n !(e.relatedTarget as HTMLElement).closest?.(\n \".roamjs-autocomplete-input\"\n )\n ) {\n setIsTyping(false);\n }\n if (onBlur) {\n onBlur(e.target.value);\n }\n }}\n inputRef={inputRef}\n {...(showButton\n ? {\n rightElement: (\n <Button icon={\"add\"} minimal onClick={() => onEnter()} />\n ),\n }\n : {})}\n />\n }\n />\n );\n};\n\nexport default AutocompleteInput;\n"]}
@@ -2,6 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.useVersion = exports.useExtensionAPI = void 0;
4
4
  const tslib_1 = require("tslib");
5
+ // @deprecated - use utils/extensionApiContext instead
5
6
  const react_1 = tslib_1.__importStar(require("react"));
6
7
  const ExtensionApiContext = react_1.default.createContext(undefined);
7
8
  const useExtensionAPI = () => { var _a; return (_a = (0, react_1.useContext)(ExtensionApiContext)) === null || _a === void 0 ? void 0 : _a.extensionAPI; };
@@ -1 +1 @@
1
- {"version":3,"file":"ExtensionApiContext.js","sourceRoot":"","sources":["../../src/components/ExtensionApiContext.tsx"],"names":[],"mappings":";;;;AAAA,uDAA0C;AAG1C,MAAM,mBAAmB,GAAG,eAAK,CAAC,aAAa,CAC7C,SAAS,CACV,CAAC;AAEK,MAAM,eAAe,GAAG,GAAG,EAAE,WAClC,OAAA,MAAA,IAAA,kBAAU,EAAC,mBAAmB,CAAC,0CAAE,YAAY,CAAA,EAAA,CAAC;AADnC,QAAA,eAAe,mBACoB;AACzC,MAAM,UAAU,GAAG,GAAG,EAAE,WAC7B,OAAA,MAAA,IAAA,kBAAU,EAAC,mBAAmB,CAAC,0CAAE,SAAS,CAAC,OAAO,CAAA,EAAA,CAAC;AADxC,QAAA,UAAU,cAC8B;AAErD,MAAM,2BAA2B,GAE7B,CAAC,EAAsB,EAAE,EAAE;QAA1B,EAAE,QAAQ,OAAY,EAAP,KAAK,sBAApB,YAAsB,CAAF;IACvB,OAAO,CACL,8BAAC,mBAAmB,CAAC,QAAQ,IAAC,KAAK,EAAE,KAAK,IACvC,QAAQ,CACoB,CAChC,CAAC;AACJ,CAAC,CAAC;AAEF,kBAAe,2BAA2B,CAAC","sourcesContent":["import React, { useContext } from \"react\";\nimport { OnloadArgs } from \"../types\";\n\nconst ExtensionApiContext = React.createContext<OnloadArgs | undefined>(\n undefined\n);\n\nexport const useExtensionAPI = () =>\n useContext(ExtensionApiContext)?.extensionAPI;\nexport const useVersion = () =>\n useContext(ExtensionApiContext)?.extension.version;\n\nconst ExtensionApiContextProvider: React.FC<\n React.PropsWithChildren<OnloadArgs>\n> = ({ children, ...props }) => {\n return (\n <ExtensionApiContext.Provider value={props}>\n {children}\n </ExtensionApiContext.Provider>\n );\n};\n\nexport default ExtensionApiContextProvider;\n"]}
1
+ {"version":3,"file":"ExtensionApiContext.js","sourceRoot":"","sources":["../../src/components/ExtensionApiContext.tsx"],"names":[],"mappings":";;;;AAAA,sDAAsD;AACtD,uDAA0C;AAG1C,MAAM,mBAAmB,GAAG,eAAK,CAAC,aAAa,CAC7C,SAAS,CACV,CAAC;AAEK,MAAM,eAAe,GAAG,GAAG,EAAE,WAClC,OAAA,MAAA,IAAA,kBAAU,EAAC,mBAAmB,CAAC,0CAAE,YAAY,CAAA,EAAA,CAAC;AADnC,QAAA,eAAe,mBACoB;AACzC,MAAM,UAAU,GAAG,GAAG,EAAE,WAC7B,OAAA,MAAA,IAAA,kBAAU,EAAC,mBAAmB,CAAC,0CAAE,SAAS,CAAC,OAAO,CAAA,EAAA,CAAC;AADxC,QAAA,UAAU,cAC8B;AAErD,MAAM,2BAA2B,GAE7B,CAAC,EAAsB,EAAE,EAAE;QAA1B,EAAE,QAAQ,OAAY,EAAP,KAAK,sBAApB,YAAsB,CAAF;IACvB,OAAO,CACL,8BAAC,mBAAmB,CAAC,QAAQ,IAAC,KAAK,EAAE,KAAK,IACvC,QAAQ,CACoB,CAChC,CAAC;AACJ,CAAC,CAAC;AAEF,kBAAe,2BAA2B,CAAC","sourcesContent":["// @deprecated - use utils/extensionApiContext instead\nimport React, { useContext } from \"react\";\nimport { OnloadArgs } from \"../types\";\n\nconst ExtensionApiContext = React.createContext<OnloadArgs | undefined>(\n undefined\n);\n\nexport const useExtensionAPI = () =>\n useContext(ExtensionApiContext)?.extensionAPI;\nexport const useVersion = () =>\n useContext(ExtensionApiContext)?.extension.version;\n\nconst ExtensionApiContextProvider: React.FC<\n React.PropsWithChildren<OnloadArgs>\n> = ({ children, ...props }) => {\n return (\n <ExtensionApiContext.Provider value={props}>\n {children}\n </ExtensionApiContext.Provider>\n );\n};\n\nexport default ExtensionApiContextProvider;\n"]}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "roamjs-components",
3
3
  "description": "Expansive toolset, utilities, & components for developing RoamJS extensions.",
4
- "version": "0.78.11",
4
+ "version": "0.79.0",
5
5
  "main": "index.js",
6
6
  "types": "index.d.ts",
7
7
  "scripts": {
@@ -0,0 +1,29 @@
1
+ import { OnloadArgs } from "../types";
2
+ export declare const provideExtensionApi: (api: OnloadArgs["extensionAPI"]) => void;
3
+ declare const getExtensionApi: () => {
4
+ settings: {
5
+ get: (k: string) => unknown;
6
+ getAll: () => Record<string, unknown>;
7
+ panel: {
8
+ create: (c: {
9
+ tabTitle: string;
10
+ settings: {
11
+ id: string;
12
+ name: string;
13
+ description: string;
14
+ action: import("../types").Action;
15
+ }[];
16
+ }) => void;
17
+ };
18
+ set: (k: string, v: unknown) => Promise<void>;
19
+ };
20
+ ui: {
21
+ commandPalette: {
22
+ addCommand: (c: import("../types").AddCommandOptions) => Promise<void>;
23
+ removeCommand: (c: {
24
+ label: string;
25
+ }) => Promise<void>;
26
+ };
27
+ };
28
+ } | null;
29
+ export default getExtensionApi;
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.provideExtensionApi = void 0;
4
+ let extensionApi = null;
5
+ const provideExtensionApi = (api) => {
6
+ if (extensionApi) {
7
+ throw new Error("Extension API already provided");
8
+ }
9
+ extensionApi = api;
10
+ };
11
+ exports.provideExtensionApi = provideExtensionApi;
12
+ const getExtensionApi = () => extensionApi;
13
+ exports.default = getExtensionApi;
14
+ //# sourceMappingURL=extensionApiContext.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extensionApiContext.js","sourceRoot":"","sources":["../../src/util/extensionApiContext.ts"],"names":[],"mappings":";;;AAEA,IAAI,YAAY,GAAsC,IAAI,CAAC;AAEpD,MAAM,mBAAmB,GAAG,CAAC,GAA+B,EAAE,EAAE;IACrE,IAAI,YAAY,EAAE;QAChB,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC;KACnD;IACD,YAAY,GAAG,GAAG,CAAC;AACrB,CAAC,CAAC;AALW,QAAA,mBAAmB,uBAK9B;AAEF,MAAM,eAAe,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC;AAE3C,kBAAe,eAAe,CAAC","sourcesContent":["import { OnloadArgs } from \"../types\";\n\nlet extensionApi: OnloadArgs[\"extensionAPI\"] | null = null;\n\nexport const provideExtensionApi = (api: OnloadArgs[\"extensionAPI\"]) => {\n if (extensionApi) {\n throw new Error(\"Extension API already provided\");\n }\n extensionApi = api;\n};\n\nconst getExtensionApi = () => extensionApi;\n\nexport default getExtensionApi;\n"]}
@@ -5,6 +5,7 @@ const addStyle_1 = tslib_1.__importDefault(require("../dom/addStyle"));
5
5
  const react_dom_1 = tslib_1.__importDefault(require("react-dom"));
6
6
  const env_1 = require("./env");
7
7
  const shim_1 = require("use-sync-external-store/shim");
8
+ const extensionApiContext_1 = require("./extensionApiContext");
8
9
  const runExtension = ({ extensionId = (0, env_1.getRoamJSExtensionIdEnv)(), run, }) => {
9
10
  // eslint-disable-next-line @typescript-eslint/ban-ts-comment
10
11
  // @ts-ignore React17 shim
@@ -65,6 +66,7 @@ const runExtension = ({ extensionId = (0, env_1.getRoamJSExtensionIdEnv)(), run,
65
66
  if ((_c = (_b = (_a = window.roamjs) === null || _a === void 0 ? void 0 : _a.loaded) === null || _b === void 0 ? void 0 : _b.has) === null || _c === void 0 ? void 0 : _c.call(_b, extensionId)) {
66
67
  return;
67
68
  }
69
+ (0, extensionApiContext_1.provideExtensionApi)(args.extensionAPI);
68
70
  window.roamjs = {
69
71
  loaded: ((_d = window.roamjs) === null || _d === void 0 ? void 0 : _d.loaded) || new Set(),
70
72
  extension: ((_e = window.roamjs) === null || _e === void 0 ? void 0 : _e.extension) || {},
@@ -1 +1 @@
1
- {"version":3,"file":"runExtension.js","sourceRoot":"","sources":["../../src/util/runExtension.ts"],"names":[],"mappings":"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","sourcesContent":["import addStyle from \"../dom/addStyle\";\nimport { OnloadArgs } from \"../types/native\";\nimport ReactDOM from \"react-dom\";\nimport {\n getNodeEnv,\n getRoamJSExtensionIdEnv,\n getRoamJSVersionEnv,\n} from \"./env\";\nimport type { Registry } from \"../types\";\nimport { useSyncExternalStore } from \"use-sync-external-store/shim\";\n\ntype RunReturn =\n | void\n | (Partial<Registry> & { unload?: () => void })\n | (() => void);\n\ntype RunExtension = (args: OnloadArgs) => RunReturn | Promise<RunReturn>;\n\nconst runExtension = ({\n extensionId = getRoamJSExtensionIdEnv(),\n run,\n}: {\n extensionId?: string;\n run?: RunExtension;\n}): void | { onload: (args: OnloadArgs) => void; onunload: () => void } => {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore React17 shim\n window.React.useSyncExternalStore = useSyncExternalStore;\n let unload: (() => void) | undefined;\n\n const registry: Registry = {\n elements: [],\n reactRoots: [],\n observers: [],\n domListeners: [],\n commands: [],\n timeouts: [],\n };\n const register = (res: Partial<Registry>) => {\n Object.keys(res).forEach((k) => {\n const key = k as keyof Registry;\n const val = res[key];\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore this is actually safe, but dont know how to coerce\n registry[key].push(...val);\n });\n };\n const registerListener = ((e: CustomEvent) => {\n const res = e.detail as Partial<Registry>;\n register(res);\n }) as EventListener;\n document.body.addEventListener(\n `roamjs:${extensionId}:register`,\n registerListener\n );\n registry.domListeners.push({\n listener: registerListener,\n el: document.body,\n type: `roamjs:${extensionId}:register`,\n });\n const unregisterListener = ((e: CustomEvent) => {\n const res = e.detail as Partial<Registry>;\n Object.keys(res).forEach((k) => {\n const key = k as keyof Registry;\n const val = res[key];\n if (val) {\n val.forEach((el) => {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore this is actually safe, but dont know how to coerce\n const idx = registry[key].indexOf(el);\n if (idx > -1) {\n registry[key].splice(idx, 1);\n }\n });\n }\n });\n }) as EventListener;\n document.body.addEventListener(\n `roamjs:${extensionId}:unregister`,\n unregisterListener\n );\n registry.domListeners.push({\n listener: unregisterListener,\n el: document.body,\n type: `roamjs:${extensionId}:unregister`,\n });\n\n const onload = (args: OnloadArgs) => {\n if (window.roamjs?.loaded?.has?.(extensionId)) {\n return;\n }\n window.roamjs = {\n loaded: window.roamjs?.loaded || new Set(),\n extension: window.roamjs?.extension || {},\n version: window.roamjs?.version || {},\n actions: {},\n };\n window.roamjs.loaded.add(extensionId);\n window.roamjs.version[extensionId] = getRoamJSVersionEnv();\n\n registry.elements.push(\n addStyle(\n `.bp3-button:focus {\n outline-width: 2px;\n }`,\n \"roamjs-default\"\n )\n );\n\n const result = run?.(args);\n Promise.resolve(result).then((res) => {\n if (typeof res === \"function\") {\n unload = res;\n } else if (typeof res === \"object\") {\n const { unload: resUnload, ...registry } = res;\n register(registry);\n unload = resUnload;\n }\n const globalApi = window.roamjs.extension[extensionId];\n if (getNodeEnv() === \"development\") {\n if (globalApi) globalApi.extensionAPI = args.extensionAPI;\n else\n window.roamjs.extension[extensionId] = {\n extensionAPI: args.extensionAPI,\n };\n }\n document.body.dispatchEvent(new Event(`roamjs:${extensionId}:loaded`));\n });\n };\n\n const onunload = () => {\n registry.elements.forEach((e) => e.remove());\n registry.reactRoots.forEach((e) => {\n ReactDOM.unmountComponentAtNode(e);\n e.remove();\n });\n registry.observers.forEach((e) => e.disconnect());\n registry.domListeners.forEach((e) =>\n e.el.removeEventListener(e.type, e.listener)\n );\n registry.commands.forEach((label) =>\n window.roamAlphaAPI.ui.commandPalette.removeCommand({ label })\n );\n registry.timeouts.forEach((e) => window.clearTimeout(e.timeout));\n\n delete window.roamjs?.extension[extensionId];\n delete window.roamjs?.version[extensionId];\n window.roamjs?.loaded.delete(extensionId);\n if (!window.roamjs?.loaded.size) {\n document.getElementById(\"roamjs-default\")?.remove();\n }\n unload?.();\n };\n return {\n onload,\n onunload,\n };\n};\n\nexport default runExtension;\n"]}
1
+ {"version":3,"file":"runExtension.js","sourceRoot":"","sources":["../../src/util/runExtension.ts"],"names":[],"mappings":"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","sourcesContent":["import addStyle from \"../dom/addStyle\";\nimport { OnloadArgs } from \"../types/native\";\nimport ReactDOM from \"react-dom\";\nimport {\n getNodeEnv,\n getRoamJSExtensionIdEnv,\n getRoamJSVersionEnv,\n} from \"./env\";\nimport type { Registry } from \"../types\";\nimport { useSyncExternalStore } from \"use-sync-external-store/shim\";\nimport { provideExtensionApi } from \"./extensionApiContext\";\n\ntype RunReturn =\n | void\n | (Partial<Registry> & { unload?: () => void })\n | (() => void);\n\ntype RunExtension = (args: OnloadArgs) => RunReturn | Promise<RunReturn>;\n\nconst runExtension = ({\n extensionId = getRoamJSExtensionIdEnv(),\n run,\n}: {\n extensionId?: string;\n run?: RunExtension;\n}): void | { onload: (args: OnloadArgs) => void; onunload: () => void } => {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore React17 shim\n window.React.useSyncExternalStore = useSyncExternalStore;\n let unload: (() => void) | undefined;\n\n const registry: Registry = {\n elements: [],\n reactRoots: [],\n observers: [],\n domListeners: [],\n commands: [],\n timeouts: [],\n };\n const register = (res: Partial<Registry>) => {\n Object.keys(res).forEach((k) => {\n const key = k as keyof Registry;\n const val = res[key];\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore this is actually safe, but dont know how to coerce\n registry[key].push(...val);\n });\n };\n const registerListener = ((e: CustomEvent) => {\n const res = e.detail as Partial<Registry>;\n register(res);\n }) as EventListener;\n document.body.addEventListener(\n `roamjs:${extensionId}:register`,\n registerListener\n );\n registry.domListeners.push({\n listener: registerListener,\n el: document.body,\n type: `roamjs:${extensionId}:register`,\n });\n const unregisterListener = ((e: CustomEvent) => {\n const res = e.detail as Partial<Registry>;\n Object.keys(res).forEach((k) => {\n const key = k as keyof Registry;\n const val = res[key];\n if (val) {\n val.forEach((el) => {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore this is actually safe, but dont know how to coerce\n const idx = registry[key].indexOf(el);\n if (idx > -1) {\n registry[key].splice(idx, 1);\n }\n });\n }\n });\n }) as EventListener;\n document.body.addEventListener(\n `roamjs:${extensionId}:unregister`,\n unregisterListener\n );\n registry.domListeners.push({\n listener: unregisterListener,\n el: document.body,\n type: `roamjs:${extensionId}:unregister`,\n });\n\n const onload = (args: OnloadArgs) => {\n if (window.roamjs?.loaded?.has?.(extensionId)) {\n return;\n }\n provideExtensionApi(args.extensionAPI);\n window.roamjs = {\n loaded: window.roamjs?.loaded || new Set(),\n extension: window.roamjs?.extension || {},\n version: window.roamjs?.version || {},\n actions: {},\n };\n window.roamjs.loaded.add(extensionId);\n window.roamjs.version[extensionId] = getRoamJSVersionEnv();\n\n registry.elements.push(\n addStyle(\n `.bp3-button:focus {\n outline-width: 2px;\n }`,\n \"roamjs-default\"\n )\n );\n\n const result = run?.(args);\n Promise.resolve(result).then((res) => {\n if (typeof res === \"function\") {\n unload = res;\n } else if (typeof res === \"object\") {\n const { unload: resUnload, ...registry } = res;\n register(registry);\n unload = resUnload;\n }\n const globalApi = window.roamjs.extension[extensionId];\n if (getNodeEnv() === \"development\") {\n if (globalApi) globalApi.extensionAPI = args.extensionAPI;\n else\n window.roamjs.extension[extensionId] = {\n extensionAPI: args.extensionAPI,\n };\n }\n document.body.dispatchEvent(new Event(`roamjs:${extensionId}:loaded`));\n });\n };\n\n const onunload = () => {\n registry.elements.forEach((e) => e.remove());\n registry.reactRoots.forEach((e) => {\n ReactDOM.unmountComponentAtNode(e);\n e.remove();\n });\n registry.observers.forEach((e) => e.disconnect());\n registry.domListeners.forEach((e) =>\n e.el.removeEventListener(e.type, e.listener)\n );\n registry.commands.forEach((label) =>\n window.roamAlphaAPI.ui.commandPalette.removeCommand({ label })\n );\n registry.timeouts.forEach((e) => window.clearTimeout(e.timeout));\n\n delete window.roamjs?.extension[extensionId];\n delete window.roamjs?.version[extensionId];\n window.roamjs?.loaded.delete(extensionId);\n if (!window.roamjs?.loaded.size) {\n document.getElementById(\"roamjs-default\")?.remove();\n }\n unload?.();\n };\n return {\n onload,\n onunload,\n };\n};\n\nexport default runExtension;\n"]}