From 180ea7880bbadd7c6b94a49ade4d142fea39d9f9 Mon Sep 17 00:00:00 2001 From: Elio Struyf Date: Thu, 14 Sep 2023 17:31:57 +0200 Subject: [PATCH] #623 - Fix update metadata on move --- CHANGELOG.md | 1 + l10n/bundle.l10n.de.json | 3 +- l10n/bundle.l10n.fr.json | 3 +- l10n/bundle.l10n.it.json | 3 +- l10n/bundle.l10n.ja.json | 3 +- l10n/bundle.l10n.json | 2 + src/dashboardWebView/DashboardMessage.ts | 2 + .../components/Contents/Contents.tsx | 9 +- .../components/DataView/DataView.tsx | 7 +- .../components/Media/DetailsSlideOver.tsx | 169 +++++++----------- .../components/Media/Media.tsx | 6 +- .../components/SnippetsView/Snippets.tsx | 7 +- .../components/TaxonomyView/TaxonomyView.tsx | 8 +- .../components/WelcomeView/WelcomeScreen.tsx | 5 + src/dashboardWebView/models/NavigationType.ts | 1 + src/helpers/FilesHelper.ts | 15 +- src/helpers/MediaHelpers.ts | 5 + src/helpers/MediaLibrary.ts | 38 +++- src/listeners/dashboard/MediaListener.ts | 71 +++++++- src/localization/localization.enum.ts | 4 + src/models/UnmappedMedia.ts | 8 + src/models/index.ts | 1 + src/utils/flattenObjectKeys.ts | 32 ++++ src/utils/index.ts | 2 + 24 files changed, 279 insertions(+), 126 deletions(-) create mode 100644 src/models/UnmappedMedia.ts create mode 100644 src/utils/flattenObjectKeys.ts diff --git a/CHANGELOG.md b/CHANGELOG.md index e62b8895..7c6fb60b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,6 +15,7 @@ ### 🐞 Fixes +- [#623](https://github.com/estruyf/vscode-front-matter/issues/623): Fix issue where metadata is not maintained on file move - [#629](https://github.com/estruyf/vscode-front-matter/issues/629): Fix array indent to the new property - [#660](https://github.com/estruyf/vscode-front-matter/issues/660): Allow only to select unique content relationship values - [#661](https://github.com/estruyf/vscode-front-matter/issues/661): Fixing the dropdowns when used at the bottom of a collapsible group diff --git a/l10n/bundle.l10n.de.json b/l10n/bundle.l10n.de.json index 9b626235..64121796 100644 --- a/l10n/bundle.l10n.de.json +++ b/l10n/bundle.l10n.de.json @@ -337,5 +337,6 @@ "dashboard.steps.stepsToGetStarted.template.description": "Wählen Sie eine Vorlage aus, um die Datei frontmatter.json mit den empfohlenen Einstellungen vorzufüllen.", "listeners.dashboard.settingsListener.triggerTemplate.notification": "Vorlagendateien kopiert.", "common.openOnWebsite": "Auf der Website öffnen", - "common.filter.value": "Filtern nach {0}" + "common.filter.value": "Filtern nach {0}", + "dashboard.media.detailsSlideOver.unmapped.description": "Möchten Sie die Metadaten von nicht zugeordneten Dateien neu zuordnen?" } \ No newline at end of file diff --git a/l10n/bundle.l10n.fr.json b/l10n/bundle.l10n.fr.json index b50410c4..dd67bf59 100644 --- a/l10n/bundle.l10n.fr.json +++ b/l10n/bundle.l10n.fr.json @@ -337,5 +337,6 @@ "dashboard.steps.stepsToGetStarted.template.description": "Sélectionnez un modèle pour préremplir le fichier frontmatter.json avec les paramètres recommandés.", "listeners.dashboard.settingsListener.triggerTemplate.notification": "Fichiers de modèle copiés.", "common.openOnWebsite": "Ouvrir sur le site web", - "common.filter.value": "Filtrer par {0}" + "common.filter.value": "Filtrer par {0}", + "dashboard.media.detailsSlideOver.unmapped.description": "Voulez-vous remapper les métadonnées des fichiers non mappés?" } \ No newline at end of file diff --git a/l10n/bundle.l10n.it.json b/l10n/bundle.l10n.it.json index 3a840d77..0a16a374 100644 --- a/l10n/bundle.l10n.it.json +++ b/l10n/bundle.l10n.it.json @@ -337,5 +337,6 @@ "dashboard.steps.stepsToGetStarted.template.description": "Seleziona un modello per riempire in anticipo il file frontmatter.json con le impostazioni consigliate.", "listeners.dashboard.settingsListener.triggerTemplate.notification": "File del modello copiati.", "common.openOnWebsite": "Apri sul sito web", - "common.filter.value": "Filtra per {0}" + "common.filter.value": "Filtra per {0}", + "dashboard.media.detailsSlideOver.unmapped.description": "Vuoi riassegnare i metadati dei file non mappati?" } \ No newline at end of file diff --git a/l10n/bundle.l10n.ja.json b/l10n/bundle.l10n.ja.json index 0c90a71a..454f2727 100644 --- a/l10n/bundle.l10n.ja.json +++ b/l10n/bundle.l10n.ja.json @@ -337,5 +337,6 @@ "dashboard.steps.stepsToGetStarted.template.description": "おすすめの設定でfrontmatter.jsonファイルを事前に埋めるテンプレートを選択します。", "listeners.dashboard.settingsListener.triggerTemplate.notification": "テンプレートファイルがコピーされました。", "common.openOnWebsite": "ウェブサイトで開く", - "common.filter.value": "{0} でフィルタリング" + "common.filter.value": "{0} でフィルタリング", + "dashboard.media.detailsSlideOver.unmapped.description": "未割り当てのファイルのメタデータを再マップしますか" } \ No newline at end of file diff --git a/l10n/bundle.l10n.json b/l10n/bundle.l10n.json index c00e4582..0e5048f5 100644 --- a/l10n/bundle.l10n.json +++ b/l10n/bundle.l10n.json @@ -284,6 +284,8 @@ "dashboard.welcomeScreen.actions.description": "You can also use the extension from the Front Matter side panel. There you will find the actions you can perform specifically for your pages.", "dashboard.welcomeScreen.actions.thanks": "We hope you enjoy Front Matter!", + "dashboard.media.detailsSlideOver.unmapped.description": "Do you want to remap the metadata of unmapped files?", + "panel.contentType.contentTypeValidator.title": "Content-type", "panel.contentType.contentTypeValidator.hint": "We noticed field differences between the content-type and the front matter data. \n Would you like to create, update, or set the content-type for this content?", "panel.contentType.contentTypeValidator.button.create": "Create content-type", diff --git a/src/dashboardWebView/DashboardMessage.ts b/src/dashboardWebView/DashboardMessage.ts index 1325bd9e..80c0b9a5 100644 --- a/src/dashboardWebView/DashboardMessage.ts +++ b/src/dashboardWebView/DashboardMessage.ts @@ -37,6 +37,8 @@ export enum DashboardMessage { createMediaFolder = 'createMediaFolder', insertFile = 'insertFile', createHexoAssetFolder = 'createHexoAssetFolder', + getUnmappedMedia = 'getUnmappedMedia', + remapMediaMetadata = 'remapMediaMetadata', // Data dashboard getDataEntries = 'getDataEntries', diff --git a/src/dashboardWebView/components/Contents/Contents.tsx b/src/dashboardWebView/components/Contents/Contents.tsx index 49b1d6d3..2c69012d 100644 --- a/src/dashboardWebView/components/Contents/Contents.tsx +++ b/src/dashboardWebView/components/Contents/Contents.tsx @@ -1,7 +1,7 @@ import * as React from 'react'; -import { useRecoilValue } from 'recoil'; -import { Page } from '../../models'; -import { SettingsSelector } from '../../state'; +import { useRecoilState, useRecoilValue } from 'recoil'; +import { NavigationType, Page } from '../../models'; +import { DashboardViewAtom, SettingsSelector } from '../../state'; import { Overview } from './Overview'; import { Spinner } from '../Common/Spinner'; import { SponsorMsg } from '../Layout/SponsorMsg'; @@ -23,10 +23,13 @@ export const Contents: React.FunctionComponent = ({ }: React.PropsWithChildren) => { const settings = useRecoilValue(SettingsSelector); const { pageItems } = usePages(pages); + const [, setView] = useRecoilState(DashboardViewAtom); const pageFolders = [...new Set(pageItems.map((page) => page.fmFolder))]; useEffect(() => { + setView(NavigationType.Contents); + Messenger.send(DashboardMessage.sendTelemetry, { event: TelemetryEvent.webviewContentsView }); diff --git a/src/dashboardWebView/components/DataView/DataView.tsx b/src/dashboardWebView/components/DataView/DataView.tsx index a1bf7369..fde6a527 100644 --- a/src/dashboardWebView/components/DataView/DataView.tsx +++ b/src/dashboardWebView/components/DataView/DataView.tsx @@ -1,7 +1,7 @@ import * as React from 'react'; import { Header } from '../Header'; -import { useRecoilValue } from 'recoil'; -import { SettingsSelector } from '../../state'; +import { useRecoilState, useRecoilValue } from 'recoil'; +import { DashboardViewAtom, SettingsSelector } from '../../state'; import { DataForm } from './DataForm'; import { useCallback, useEffect, useMemo, useState } from 'react'; import { DataFile } from '../../../models/DataFile'; @@ -24,6 +24,7 @@ import { NavigationItem } from '../Layout'; import useThemeColors from '../../hooks/useThemeColors'; import * as l10n from '@vscode/l10n'; import { LocalizationKey } from '../../../localization'; +import { NavigationType } from '../../models'; export interface IDataViewProps { } @@ -35,6 +36,7 @@ export const DataView: React.FunctionComponent = ( const [dataEntries, setDataEntries] = useState(null); const settings = useRecoilValue(SettingsSelector); const { getColors } = useThemeColors(); + const [, setView] = useRecoilState(DashboardViewAtom); const setSchema = (dataFile: DataFile) => { setSelectedData(dataFile); @@ -135,6 +137,7 @@ export const DataView: React.FunctionComponent = ( }, [selectedData, , dataEntries, selectedIndex]); useEffect(() => { + setView(NavigationType.Data); Messenger.listen(messageListener); Messenger.send(DashboardMessage.sendTelemetry, { diff --git a/src/dashboardWebView/components/Media/DetailsSlideOver.tsx b/src/dashboardWebView/components/Media/DetailsSlideOver.tsx index 0f50d1f2..77408ec2 100644 --- a/src/dashboardWebView/components/Media/DetailsSlideOver.tsx +++ b/src/dashboardWebView/components/Media/DetailsSlideOver.tsx @@ -5,12 +5,11 @@ import { basename } from 'path'; import * as React from 'react'; import { Fragment, useCallback, useMemo } from 'react'; import { DateHelper } from '../../../helpers/DateHelper'; -import { MediaInfo } from '../../../models'; -import { Messenger } from '@estruyf/vscode/dist/client'; +import { MediaInfo, UnmappedMedia } from '../../../models'; +import { Messenger, messageHandler } from '@estruyf/vscode/dist/client'; import { DashboardMessage } from '../../DashboardMessage'; import { useRecoilValue } from 'recoil'; import { PageSelector, SelectedMediaFolderSelector } from '../../state'; -import useThemeColors from '../../hooks/useThemeColors'; import { DetailsItem } from './DetailsItem'; import { DetailsInput } from './DetailsInput'; import * as l10n from '@vscode/l10n'; @@ -44,10 +43,10 @@ export const DetailsSlideOver: React.FunctionComponent = const [filename, setFilename] = React.useState(media.filename); const [caption, setCaption] = React.useState(media.caption); const [title, setTitle] = React.useState(media.title); + const [unmapped, setUnmapped] = React.useState([]); const [alt, setAlt] = React.useState(media.alt); const selectedFolder = useRecoilValue(SelectedMediaFolderSelector); const page = useRecoilValue(PageSelector); - const { getColors } = useThemeColors(); const createdDate = useMemo(() => DateHelper.tryParse(media.ctime), [media]); const modifiedDate = useMemo(() => DateHelper.tryParse(media.mtime), [media]); @@ -70,6 +69,17 @@ export const DetailsSlideOver: React.FunctionComponent = onEditClose(); }, [media, filename, caption, alt, title, selectedFolder, page]); + const remapMetadata = useCallback((item: UnmappedMedia) => { + Messenger.send(DashboardMessage.remapMediaMetadata, { + file: media.fsPath, + unmappedItem: item, + folder: selectedFolder, + page + }); + + onEditClose(); + }, [media, filename, caption, alt, title, selectedFolder, page]); + React.useEffect(() => { setTitle(media.title); setAlt(media.alt); @@ -77,15 +87,21 @@ export const DetailsSlideOver: React.FunctionComponent = setFilename(media.filename); }, [media]); + React.useEffect(() => { + if (showForm) { + messageHandler.request(DashboardMessage.getUnmappedMedia, filename).then((result) => { + setUnmapped(result); + }); + } else { + setUnmapped([]); + } + }, [showForm, filename]); + return (
- +
= leaveTo="translate-x-full" >
-
+
- + {l10n.t(LocalizationKey.dashboardMediaDialogTitle)}
+ + )) + } + +
+ ) + } + +

{l10n.t(LocalizationKey.dashboardMediaMetadataPanelDescription)}

-
-