diff --git a/CHANGELOG.md b/CHANGELOG.md index 683217c3..c4ff9f8f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,6 +15,7 @@ - [#276](https://github.com/estruyf/vscode-front-matter/issues/276): Add a Front Matter walkthrough for VS Code - [#270](https://github.com/estruyf/vscode-front-matter/issues/270): Only show media files from public folder if `pageBundle` is not enabled on any of the content types - [#282](https://github.com/estruyf/vscode-front-matter/issues/282): Insert relative paths for media files located in a page bundle (also sub-folders) +- [#283](https://github.com/estruyf/vscode-front-matter/issues/283): Added published date sorting options for the content dashboard ### 🐞 Fixes diff --git a/src/dashboardWebView/components/Header/Sorting.tsx b/src/dashboardWebView/components/Header/Sorting.tsx index 79963c62..10733161 100644 --- a/src/dashboardWebView/components/Header/Sorting.tsx +++ b/src/dashboardWebView/components/Header/Sorting.tsx @@ -18,6 +18,8 @@ export interface ISortingProps { } export const sortOptions: SortingOption[] = [ + { name: "Published (asc)", id: SortOption.PublishedAsc, order: SortOrder.asc, type: SortType.date }, + { name: "Published (desc)", id: SortOption.PublishedDesc, order: SortOrder.desc, type: SortType.date }, { name: "Last modified (asc)", id: SortOption.LastModifiedAsc, order: SortOrder.asc, type: SortType.date }, { name: "Last modified (desc)", id: SortOption.LastModifiedDesc, order: SortOrder.desc, type: SortType.date }, { name: "By filename (asc)", id: SortOption.FileNameAsc, order: SortOrder.asc, type: SortType.string }, diff --git a/src/dashboardWebView/constants/SortOption.ts b/src/dashboardWebView/constants/SortOption.ts index 71c676d4..2e5ef496 100644 --- a/src/dashboardWebView/constants/SortOption.ts +++ b/src/dashboardWebView/constants/SortOption.ts @@ -1,4 +1,6 @@ export enum SortOption { + PublishedAsc = "PublishedAsc", + PublishedDesc = "PublishedDesc", LastModifiedAsc = "LastModifiedAsc", LastModifiedDesc = "LastModifiedDesc", FileNameAsc = "FileNameAsc", diff --git a/src/dashboardWebView/hooks/usePages.tsx b/src/dashboardWebView/hooks/usePages.tsx index 1fd405c2..a406ae8b 100644 --- a/src/dashboardWebView/hooks/usePages.tsx +++ b/src/dashboardWebView/hooks/usePages.tsx @@ -73,8 +73,12 @@ export default function usePages(pages: Page[]) { pagesSorted = pagesSorted.sort(Sorting.alphabetically("fmFileName")); } else if (sorting && sorting.id === SortOption.FileNameDesc) { pagesSorted = pagesSorted.sort(Sorting.alphabetically("fmFileName")).reverse(); + } else if (sorting && sorting.id === SortOption.PublishedAsc) { + pagesSorted = pagesSorted.sort(Sorting.number("fmPublished")); } else if (sorting && sorting.id === SortOption.LastModifiedAsc) { pagesSorted = pagesSorted.sort(Sorting.number("fmModified")); + } else if (sorting && sorting.id === SortOption.PublishedDesc) { + pagesSorted = pagesSorted.sort(Sorting.number("fmPublished")).reverse(); } else if (sorting && sorting.id === SortOption.LastModifiedDesc) { pagesSorted = pagesSorted.sort(Sorting.number("fmModified")).reverse(); } else if (sorting && sorting.id && sorting.name) { diff --git a/src/dashboardWebView/models/Page.ts b/src/dashboardWebView/models/Page.ts index 4c4a4fd9..a6b88940 100644 --- a/src/dashboardWebView/models/Page.ts +++ b/src/dashboardWebView/models/Page.ts @@ -5,6 +5,7 @@ export interface Page { fmFilePath: string; fmFileName: string; fmModified: number; + fmPublished: number | null | undefined; fmDraft: "Draft" | "Published", fmYear: number | null | undefined; fmPreviewImage: string; diff --git a/src/helpers/ArticleHelper.ts b/src/helpers/ArticleHelper.ts index 49661257..06f9d60d 100644 --- a/src/helpers/ArticleHelper.ts +++ b/src/helpers/ArticleHelper.ts @@ -215,7 +215,7 @@ export class ArticleHelper { const articleCt = ArticleHelper.getContentType(article.data); const modDateField = articleCt.fields.find(f => f.isModifiedDate); - return modDateField?.name || Settings.get(SETTING_MODIFIED_FIELD) as string || DefaultFields.PublishingDate; + return modDateField?.name || Settings.get(SETTING_MODIFIED_FIELD) as string || DefaultFields.LastModified; } /** diff --git a/src/listeners/dashboard/PagesListener.ts b/src/listeners/dashboard/PagesListener.ts index cbb0ce59..abb8a0c9 100644 --- a/src/listeners/dashboard/PagesListener.ts +++ b/src/listeners/dashboard/PagesListener.ts @@ -139,18 +139,25 @@ export class PagesListener extends BaseListener { if (article?.data.title) { const wsFolder = Folders.getWorkspaceFolder(); const descriptionField = Settings.get(SETTING_SEO_DESCRIPTION_FIELD) as string || DefaultFields.Description; + const dateField = ArticleHelper.getPublishDateField(article) || DefaultFields.PublishingDate; + const dateFieldValue = article?.data[dateField] ? DateHelper.tryParse(article?.data[dateField]) : undefined; + + const modifiedField = ArticleHelper.getModifiedDateField(article) || null; + const modifiedFieldValue = modifiedField && article?.data[modifiedField] ? DateHelper.tryParse(article?.data[modifiedField])?.getTime() : undefined; + const staticFolder = Settings.get(SETTING_CONTENT_STATIC_FOLDER); const page: Page = { ...article.data, // FrontMatter properties fmFolder: folderTitle, - fmModified: fileMtime, fmFilePath: filePath, fmFileName: fileName, fmDraft: ContentType.getDraftStatus(article?.data), - fmYear: article?.data[dateField] ? DateHelper.tryParse(article?.data[dateField])?.getFullYear() : null, + fmModified: modifiedFieldValue ? modifiedFieldValue : fileMtime, + fmPublished: dateFieldValue ? dateFieldValue.getTime() : null, + fmYear: dateFieldValue ? dateFieldValue.getFullYear() : null, fmPreviewImage: "", fmTags: [], fmCategories: [],