diff --git a/packages/api/src/controllers/files.js b/packages/api/src/controllers/files.js index a05ee697c..74e6c81ed 100644 --- a/packages/api/src/controllers/files.js +++ b/packages/api/src/controllers/files.js @@ -5,10 +5,6 @@ const hasPermission = require('../utility/hasPermission'); const socket = require('../utility/socket'); const scheduler = require('./scheduler'); -const markdownAutorunRegex = /<\!--.*@autorun\s*(\n.*-->|-->)/s; -const markdownButtonRegex = /<\!--.*@button\s+([^\n]+)(\n.*-->|-->)/s; -const markdownIconRegex = /<\!--.*@icon\s+([^\n]+)(\n.*-->|-->)/s; - function serialize(format, data) { if (format == 'text') return data; if (format == 'json') return JSON.stringify(data); @@ -84,29 +80,4 @@ module.exports = { } return res; }, - - markdownManifest_meta: 'get', - async markdownManifest() { - if (!hasPermission(`files/markdown/read`)) return []; - const dir = path.join(filesdir(), 'markdown'); - if (!(await fs.exists(dir))) return []; - const files = await fs.readdir(dir); - const res = []; - for (const file of files) { - const filePath = path.join(dir, file); - const text = await fs.readFile(filePath, { encoding: 'utf-8' }); - const autorun = text.match(markdownAutorunRegex); - const button = text.match(markdownButtonRegex); - const icon = text.match(markdownIconRegex); - if (autorun || button) { - res.push({ - file, - autorun: !!autorun, - button: button ? button[1].trim() : undefined, - icon: icon ? icon[1].trim() : undefined, - }); - } - } - return res; - }, }; diff --git a/packages/web/src/appobj/FavoriteFileAppObject.js b/packages/web/src/appobj/FavoriteFileAppObject.js index 54eecc173..0eaade630 100644 --- a/packages/web/src/appobj/FavoriteFileAppObject.js +++ b/packages/web/src/appobj/FavoriteFileAppObject.js @@ -6,10 +6,45 @@ import axios from '../utility/axios'; import useOpenNewTab from '../utility/useOpenNewTab'; import { SavedFileAppObjectBase } from './SavedFileAppObject'; +export function useOpenFavorite() { + const openNewTab = useOpenNewTab(); + + const openFavorite = React.useCallback( + async (favorite) => { + const { icon, tabComponent, title, props, tabdata } = favorite; + let tabdataNew = tabdata; + if (props.savedFile) { + const resp = await axios.post('files/load', { + folder: props.savedFolder, + file: props.savedFile, + format: props.savedFormat, + }); + tabdataNew = { + ...tabdata, + editor: resp.data, + }; + } + openNewTab( + { + title, + icon: icon || 'img favorite', + props, + tabComponent, + }, + tabdataNew + ); + }, + [openNewTab] + ); + + return openFavorite; +} + export function FavoriteFileAppObject({ data, commonProps }) { const { icon, tabComponent, title, props, tabdata } = data; const openNewTab = useOpenNewTab(); const showModal = useShowModal(); + const openFavorite = useOpenFavorite(); const editFavorite = () => { showModal((modalState) => ); @@ -24,27 +59,7 @@ export function FavoriteFileAppObject({ data, commonProps }) { title={title} disableRename onLoad={async (data) => { - let tabdataNew = tabdata; - if (props.savedFile) { - const resp = await axios.post('files/load', { - folder: props.savedFolder, - file: props.savedFile, - format: props.savedFormat, - }); - tabdataNew = { - ...tabdata, - editor: resp.data, - }; - } - openNewTab( - { - title, - icon: icon || 'img favorite', - props, - tabComponent, - }, - tabdataNew - ); + openFavorite(data); }} menuExt={Edit} /> diff --git a/packages/web/src/modals/FavoriteModal.js b/packages/web/src/modals/FavoriteModal.js index 342166997..ce11f57e5 100644 --- a/packages/web/src/modals/FavoriteModal.js +++ b/packages/web/src/modals/FavoriteModal.js @@ -26,6 +26,8 @@ export default function FavoriteModal({ modalState, editingData = undefined, sav return { title: editingData.title, icon: editingData.icon, + showInToolbar: editingData.showInToolbar, + openOnStartup: editingData.openOnStartup, }; } }, []); diff --git a/packages/web/src/utility/metadataLoaders.js b/packages/web/src/utility/metadataLoaders.js index 6d0077a99..ff35eea7c 100644 --- a/packages/web/src/utility/metadataLoaders.js +++ b/packages/web/src/utility/metadataLoaders.js @@ -52,12 +52,6 @@ const favoritesLoader = () => ({ reloadTrigger: 'files-changed-favorites', }); -const markdownManifestLoader = () => ({ - url: 'files/markdown-manifest', - params: {}, - reloadTrigger: 'files-changed-markdown', -}); - // const sqlObjectListLoader = ({ conid, database }) => ({ // url: 'metadata/list-objects', // params: { conid, database }, @@ -282,13 +276,6 @@ export function useFiles(args) { return useCore(filesLoader, args); } -export function getMarkdownManifest(args) { - return getCore(markdownManifestLoader, args); -} -export function useMarkdownManifest(args) { - return useCore(markdownManifestLoader, args); -} - export function getFavorites(args) { return getCore(favoritesLoader, args); } diff --git a/packages/web/src/widgets/Toolbar.js b/packages/web/src/widgets/Toolbar.js index 1c88bab4a..42faf46da 100644 --- a/packages/web/src/widgets/Toolbar.js +++ b/packages/web/src/widgets/Toolbar.js @@ -4,7 +4,7 @@ import ConnectionModal from '../modals/ConnectionModal'; import styled from 'styled-components'; import ToolbarButton, { ToolbarButtonExternalImage } from './ToolbarButton'; import useNewQuery from '../query/useNewQuery'; -import { useConfig, useMarkdownManifest } from '../utility/metadataLoaders'; +import { useConfig, useFavorites } from '../utility/metadataLoaders'; import { useSetOpenedTabs, useOpenedTabs, useCurrentTheme, useSetCurrentTheme } from '../utility/globalState'; import useNewFreeTable from '../freetable/useNewFreeTable'; import ImportExportModal from '../modals/ImportExportModal'; @@ -16,6 +16,7 @@ import AboutModal from '../modals/AboutModal'; import useOpenNewTab from '../utility/useOpenNewTab'; import tabs from '../tabs'; import FavoriteModal from '../modals/FavoriteModal'; +import { useOpenFavorite } from '../appobj/FavoriteFileAppObject'; const ToolbarContainer = styled.div` display: flex; @@ -36,7 +37,8 @@ export default function ToolBar({ toolbarPortalRef }) { const setCurrentTheme = useSetCurrentTheme(); const extensions = useExtensions(); const electron = getElectron(); - const markdownManifest = useMarkdownManifest(); + const favorites = useFavorites(); + const openFavorite = useOpenFavorite(); const currentTab = openedTabs.find((x) => x.selected); @@ -84,45 +86,46 @@ export default function ToolBar({ toolbarPortalRef }) { showModal((modalState) => ); }; - function openTabFromButton(page) { - if ( - openedTabs.find( - (x) => x.tabComponent == 'MarkdownViewTab' && x.props && x.props.file == page.file && x.closedTime == null - ) - ) { - setOpenedTabs((tabs) => - tabs.map((tab) => ({ - ...tab, - selected: tab.tabComponent == 'MarkdownViewTab' && tab.props && tab.props.file == page.file, - })) - ); - } else { - openNewTab({ - title: page.button || page.file, - tabComponent: 'MarkdownViewTab', - icon: page.icon || 'img markdown', - props: { - file: page.file, - }, - }); - } + function openTabFromButton(favorite) { + openFavorite(favorite); + // if ( + // openedTabs.find( + // (x) => x.tabComponent == 'MarkdownViewTab' && x.props && x.props.file == page.file && x.closedTime == null + // ) + // ) { + // setOpenedTabs((tabs) => + // tabs.map((tab) => ({ + // ...tab, + // selected: tab.tabComponent == 'MarkdownViewTab' && tab.props && tab.props.file == page.file, + // })) + // ); + // } else { + // openNewTab({ + // title: page.button || page.file, + // tabComponent: 'MarkdownViewTab', + // icon: page.icon || 'img markdown', + // props: { + // file: page.file, + // }, + // }); + // } } React.useEffect(() => { - for (const page of (markdownManifest || []).filter((x) => x.autorun)) { - openTabFromButton(page); + for (const fav of (favorites || []).filter((x) => x.openOnStartup)) { + openTabFromButton(fav); } - }, [markdownManifest]); + }, [favorites]); return ( {!electron && } - {(markdownManifest || []) - .filter((x) => x.button) + {(favorites || []) + .filter((x) => x.showInToolbar) .map((x) => ( - openTabFromButton(x)} icon={x.icon || 'icon markdown'}> - {x.button} + openTabFromButton(x)} icon={x.icon || 'icon favorite'}> + {x.title} ))} {config.runAsPortal == false && (