diff --git a/CHANGELOG.md b/CHANGELOG.md index f1b0fcb0..91324662 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,7 @@ ### 🎨 Enhancements - [#773](https://github.com/estruyf/vscode-front-matter/issues/773): Added the ability to rename content files +- [#777](https://github.com/estruyf/vscode-front-matter/issues/777): Show an error in the metadata panel if something went wrong while parsing the front matter ### ⚡️ Optimizations diff --git a/l10n/bundle.l10n.json b/l10n/bundle.l10n.json index 800620e1..be6c1c75 100644 --- a/l10n/bundle.l10n.json +++ b/l10n/bundle.l10n.json @@ -466,6 +466,7 @@ "panel.globalSettings.action.server.placeholder": "Example: {0}", "panel.metadata.title": "Metadata", + "panel.metadata.focusProblems": "Check the problems view for more information", "panel.otherActions.title": "Other actions", "panel.otherActions.writingSettings.enabled": "Writing settings enabled", @@ -768,6 +769,7 @@ "listeners.panel.dataListener.aiSuggestTaxonomy.noEditor.error": "No active editor", "listeners.panel.dataListener.aiSuggestTaxonomy.noData.error": "No article data", "listeners.panel.dataListener.getDataFileEntries.noDataFiles.error": "Couldn't find data file entries", + "listeners.panel.dataListener.pushMetadata.frontMatter.error": "Something went wrong while parsing your front matter. Please check the contents of your file.", "listeners.panel.taxonomyListener.aiSuggestTaxonomy.noEditor.error": "No active editor", diff --git a/src/listeners/panel/DataListener.ts b/src/listeners/panel/DataListener.ts index 071b1926..9bd5ee34 100644 --- a/src/listeners/panel/DataListener.ts +++ b/src/listeners/panel/DataListener.ts @@ -28,7 +28,7 @@ import { SETTING_TAXONOMY_CONTENT_TYPES } from '../../constants'; import { Article, Preview } from '../../commands'; -import { ParsedFrontMatter } from '../../parsers'; +import { FrontMatterParser, ParsedFrontMatter } from '../../parsers'; import { Field, Mode, PostMessageData, ContentType as IContentType } from '../../models'; import { encodeEmoji, fieldWhenClause } from '../../utils'; import { PanelProvider } from '../../panelWebView/PanelProvider'; @@ -198,6 +198,26 @@ export class DataListener extends BaseListener { try { if (filePath) { articleDetails = await ArticleHelper.getDetails(filePath); + + if (!articleDetails) { + try { + const contents = await ArticleHelper.getContents(filePath); + if (contents) { + FrontMatterParser.fromFile(contents); + } + } catch (e) { + this.sendMsg(Command.metadata, { + fmError: l10n.t( + LocalizationKey.listenersPanelDataListenerPushMetadataFrontMatterError + ), + fmErrorMessage: (e as Error).message + }); + return; + } + } + } else { + this.sendMsg(Command.metadata, undefined); + return; } } catch (e) { Logger.error(`DataListener::pushMetadata: ${(e as Error).message}`); diff --git a/src/localization/localization.enum.ts b/src/localization/localization.enum.ts index defeba97..bd477cfc 100644 --- a/src/localization/localization.enum.ts +++ b/src/localization/localization.enum.ts @@ -1504,6 +1504,10 @@ export enum LocalizationKey { * Metadata */ panelMetadataTitle = 'panel.metadata.title', + /** + * Check the output for more information + */ + panelMetadataFocusProblems = 'panel.metadata.focusProblems', /** * Other actions */ @@ -2536,6 +2540,10 @@ export enum LocalizationKey { * Couldn't find data file entries */ listenersPanelDataListenerGetDataFileEntriesNoDataFilesError = 'listeners.panel.dataListener.getDataFileEntries.noDataFiles.error', + /** + * Something went wrong while parsing your front matter. Please check the contents of your file. + */ + listenersPanelDataListenerPushMetadataFrontMatterError = 'listeners.panel.dataListener.pushMetadata.frontMatter.error', /** * No active editor */ diff --git a/src/panelWebView/ViewPanel.tsx b/src/panelWebView/ViewPanel.tsx index 75bf377c..307117d2 100644 --- a/src/panelWebView/ViewPanel.tsx +++ b/src/panelWebView/ViewPanel.tsx @@ -86,7 +86,7 @@ export const ViewPanel: React.FunctionComponent = ( return ; } - if (!metadata || Object.keys(metadata || {}).length === 0) { + if (!metadata) { return ; } diff --git a/src/panelWebView/components/Metadata.tsx b/src/panelWebView/components/Metadata.tsx index fd220f09..843e498d 100644 --- a/src/panelWebView/components/Metadata.tsx +++ b/src/panelWebView/components/Metadata.tsx @@ -8,7 +8,7 @@ import useContentType from '../../hooks/useContentType'; import { WrapperField } from './Fields/WrapperField'; import { ContentTypeValidator } from './ContentType/ContentTypeValidator'; import { FeatureFlag } from '../../components/features/FeatureFlag'; -import { FEATURE_FLAG } from '../../constants'; +import { FEATURE_FLAG, GeneralCommands } from '../../constants'; import { Messenger } from '@estruyf/vscode/dist/client'; import * as l10n from '@vscode/l10n'; import { LocalizationKey } from '../../localization'; @@ -33,6 +33,12 @@ const Metadata: React.FunctionComponent = ({ }: React.PropsWithChildren) => { const contentType = useContentType(settings, metadata); + const focusProblems = () => { + Messenger.send(GeneralCommands.toVSCode.runCommand, { + command: `workbench.panel.markers.view.focus` + }); + } + const onSendUpdate = React.useCallback((field: string | undefined, value: any, parents: string[]) => { if (!field) { return; @@ -93,7 +99,20 @@ const Metadata: React.FunctionComponent = ({ - {allFields} + { + metadata.fmError && metadata.fmErrorMessage ? ( +
+

{metadata.fmError}

+ + +
+ ) : allFields + } ); };