From 476ec6c2fd079982a8b7ce25694485ef78fa69f2 Mon Sep 17 00:00:00 2001 From: Elio Struyf Date: Tue, 5 Oct 2021 08:32:45 +0200 Subject: [PATCH] #132 - Persist the last opened folder location --- src/commands/Article.ts | 3 +-- src/commands/Dashboard.ts | 24 +++++++++++++++---- src/commands/Folders.ts | 2 +- src/commands/Preview.ts | 3 +-- src/commands/StatusListener.ts | 2 +- src/commands/Template.ts | 2 +- src/constants/Extension.ts | 3 --- src/constants/ExtensionState.ts | 6 +++++ src/constants/Navigation.ts | 1 + src/constants/index.ts | 3 +++ src/dashboardWebView/DashboardCommand.ts | 2 +- src/dashboardWebView/DashboardMessage.ts | 2 +- .../components/Header/Breadcrumb.tsx | 7 +++--- .../components/Media/Media.tsx | 11 +++++---- .../components/SponsorMsg.tsx | 2 +- .../components/WelcomeScreen.tsx | 2 +- src/extension.ts | 2 +- src/helpers/Extension.ts | 24 ++++++++++++------- src/helpers/SlugHelper.ts | 3 +-- 19 files changed, 65 insertions(+), 39 deletions(-) create mode 100644 src/constants/ExtensionState.ts create mode 100644 src/constants/Navigation.ts diff --git a/src/commands/Article.ts b/src/commands/Article.ts index 90c75841..b6a3f44f 100644 --- a/src/commands/Article.ts +++ b/src/commands/Article.ts @@ -1,7 +1,6 @@ -import { SETTING_AUTO_UPDATE_DATE, SETTING_MODIFIED_FIELD, SETTING_SLUG_UPDATE_FILE_NAME, SETTING_TEMPLATES_PREFIX } from './../constants/settings'; +import { SETTING_AUTO_UPDATE_DATE, SETTING_MODIFIED_FIELD, SETTING_SLUG_UPDATE_FILE_NAME, SETTING_TEMPLATES_PREFIX, CONFIG_KEY, SETTING_DATE_FORMAT, SETTING_SLUG_PREFIX, SETTING_SLUG_SUFFIX } from './../constants'; import * as vscode from 'vscode'; import { TaxonomyType } from "../models"; -import { CONFIG_KEY, SETTING_DATE_FORMAT, SETTING_SLUG_PREFIX, SETTING_SLUG_SUFFIX } from "../constants/settings"; import { format } from "date-fns"; import { ArticleHelper, Settings, SlugHelper } from '../helpers'; import matter = require('gray-matter'); diff --git a/src/commands/Dashboard.ts b/src/commands/Dashboard.ts index c26d6cde..ba3aa064 100644 --- a/src/commands/Dashboard.ts +++ b/src/commands/Dashboard.ts @@ -1,4 +1,4 @@ -import { SETTINGS_CONTENT_STATIC_FOLDER, SETTING_DATE_FIELD, SETTING_SEO_DESCRIPTION_FIELD, SETTINGS_DASHBOARD_OPENONSTART, SETTINGS_DASHBOARD_MEDIA_SNIPPET, SETTING_TAXONOMY_CONTENT_TYPES } from './../constants/settings'; +import { SETTINGS_CONTENT_STATIC_FOLDER, SETTING_DATE_FIELD, SETTING_SEO_DESCRIPTION_FIELD, SETTINGS_DASHBOARD_OPENONSTART, SETTINGS_DASHBOARD_MEDIA_SNIPPET, SETTING_TAXONOMY_CONTENT_TYPES, DefaultFields, HOME_PAGE_NAVIGATION_ID, ExtensionState, COMMAND_NAME } from '../constants'; import { ArticleHelper } from './../helpers/ArticleHelper'; import { basename, dirname, extname, join } from "path"; import { existsSync, readdirSync, statSync, unlinkSync, writeFileSync } from "fs"; @@ -10,7 +10,6 @@ import { DashboardCommand } from '../dashboardWebView/DashboardCommand'; import { DashboardMessage } from '../dashboardWebView/DashboardMessage'; import { Page } from '../dashboardWebView/models/Page'; import { openFileInEditor } from '../helpers/openFileInEditor'; -import { COMMAND_NAME, EXTENSION_STATE_PAGES_VIEW } from '../constants/Extension'; import { Template } from './Template'; import { Notifications } from '../helpers/Notifications'; import { Settings } from '../dashboardWebView/models/Settings'; @@ -20,7 +19,6 @@ import { ViewType } from '../dashboardWebView/state'; import { EditorHelper, WebviewHelper } from '@estruyf/vscode'; import { MediaInfo, MediaPaths } from './../models/MediaPaths'; import { decodeBase64Image } from '../helpers/decodeBase64Image'; -import { DefaultFields } from '../constants'; import { DashboardData } from '../models/DashboardData'; import { ExplorerView } from '../explorerView/ExplorerView'; import { MediaLibrary } from '../helpers/MediaLibrary'; @@ -161,7 +159,7 @@ export class Dashboard { } break; case DashboardMessage.setPageViewType: - Extension.getInstance().setState(EXTENSION_STATE_PAGES_VIEW, msg.data); + Extension.getInstance().setState(ExtensionState.PagesView, msg.data); break; case DashboardMessage.getMedia: Dashboard.getMedia(msg?.data?.page, msg?.data?.folder); @@ -254,7 +252,7 @@ export class Dashboard { categories: SettingsHelper.getTaxonomy(TaxonomyType.Category), openOnStart: SettingsHelper.get(SETTINGS_DASHBOARD_OPENONSTART), versionInfo: ext.getVersion(), - pageViewType: await ext.getState(EXTENSION_STATE_PAGES_VIEW), + pageViewType: await ext.getState(ExtensionState.PagesView), mediaSnippet: SettingsHelper.get(SETTINGS_DASHBOARD_MEDIA_SNIPPET) || [], contentTypes: SettingsHelper.get(SETTING_TAXONOMY_CONTENT_TYPES) || [], contentFolders: Folders.get().map(f => f.path), @@ -278,6 +276,19 @@ export class Dashboard { const staticFolder = SettingsHelper.get(SETTINGS_CONTENT_STATIC_FOLDER); const contentFolders = Folders.get(); + // If the static folder is not set, retreive the last opened location + if (!selectedFolder) { + const stateValue = await Extension.getInstance().getState(ExtensionState.SelectedFolder); + if (stateValue) { + selectedFolder = stateValue; + } + } + + // Go to the home folder + if (selectedFolder === HOME_PAGE_NAVIGATION_ID) { + selectedFolder = ''; + } + const relSelectedFolderPath = selectedFolder ? selectedFolder.substring((wsFolder?.fsPath || "").length + 1) : ''; let allMedia: MediaInfo[] = []; @@ -371,6 +382,9 @@ export class Dashboard { } } + // Store the last opened folder + await Extension.getInstance().setState(ExtensionState.SelectedFolder, selectedFolder); + Dashboard.postWebviewMessage({ command: DashboardCommand.media, data: { diff --git a/src/commands/Folders.ts b/src/commands/Folders.ts index 37f8b3e8..e5cc4d6e 100644 --- a/src/commands/Folders.ts +++ b/src/commands/Folders.ts @@ -1,5 +1,5 @@ import { Questions } from './../helpers/Questions'; -import { SETTINGS_CONTENT_PAGE_FOLDERS, SETTINGS_CONTENT_STATIC_FOLDER } from './../constants/settings'; +import { SETTINGS_CONTENT_PAGE_FOLDERS, SETTINGS_CONTENT_STATIC_FOLDER } from './../constants'; import { commands, Uri, workspace, window } from "vscode"; import { basename, join } from "path"; import { ContentFolder, FileInfo, FolderInfo } from "../models"; diff --git a/src/commands/Preview.ts b/src/commands/Preview.ts index 298078ac..efbaeb5b 100644 --- a/src/commands/Preview.ts +++ b/src/commands/Preview.ts @@ -1,11 +1,10 @@ -import { SETTING_PREVIEW_HOST, SETTING_PREVIEW_PATHNAME } from './../constants/settings'; +import { SETTING_PREVIEW_HOST, SETTING_PREVIEW_PATHNAME, CONTEXT } from './../constants'; import { ArticleHelper } from './../helpers/ArticleHelper'; import { join } from "path"; import { commands, env, Uri, ViewColumn, window } from "vscode"; import { Settings } from '../helpers'; import { PreviewSettings } from '../models'; import { format } from 'date-fns'; -import { CONTEXT } from '../constants/context'; export class Preview { diff --git a/src/commands/StatusListener.ts b/src/commands/StatusListener.ts index 00ed1b6f..ac5b887c 100644 --- a/src/commands/StatusListener.ts +++ b/src/commands/StatusListener.ts @@ -1,4 +1,4 @@ -import { SETTING_SEO_DESCRIPTION_FIELD, SETTING_SEO_DESCRIPTION_LENGTH, SETTING_SEO_TITLE_LENGTH } from './../constants/settings'; +import { SETTING_SEO_DESCRIPTION_FIELD, SETTING_SEO_DESCRIPTION_LENGTH, SETTING_SEO_TITLE_LENGTH } from './../constants'; import * as vscode from 'vscode'; import { ArticleHelper, SeoHelper, Settings } from '../helpers'; import { ExplorerView } from '../explorerView/ExplorerView'; diff --git a/src/commands/Template.ts b/src/commands/Template.ts index 141b3f9b..da9c7120 100644 --- a/src/commands/Template.ts +++ b/src/commands/Template.ts @@ -8,7 +8,7 @@ import sanitize from '../helpers/Sanitize'; import { ArticleHelper, Settings } from '../helpers'; import { Article } from '.'; import { Notifications } from '../helpers/Notifications'; -import { CONTEXT } from '../constants/context'; +import { CONTEXT } from '../constants'; import { Project } from './Project'; import { Folders } from './Folders'; diff --git a/src/constants/Extension.ts b/src/constants/Extension.ts index fec6ec46..05c71422 100644 --- a/src/constants/Extension.ts +++ b/src/constants/Extension.ts @@ -3,9 +3,6 @@ const extensionName = "frontMatter"; export const EXTENSION_ID = 'eliostruyf.vscode-front-matter'; export const EXTENSION_BETA_ID = 'eliostruyf.vscode-front-matter-beta'; -export const EXTENSION_STATE_VERSION = 'frontMatter:Version'; -export const EXTENSION_STATE_PAGES_VIEW = 'frontMatter:Pages:ViewType'; - export const getCommandName = (command: string) => { return `${extensionName}.${command}`; }; diff --git a/src/constants/ExtensionState.ts b/src/constants/ExtensionState.ts new file mode 100644 index 00000000..8efd291e --- /dev/null +++ b/src/constants/ExtensionState.ts @@ -0,0 +1,6 @@ + +export const ExtensionState = { + PagesView: `frontMatter:Pages:ViewType`, + SelectedFolder: `frontMatter:SelectedFolder`, + Version: `frontMatter:Version` +}; \ No newline at end of file diff --git a/src/constants/Navigation.ts b/src/constants/Navigation.ts new file mode 100644 index 00000000..7ebf76d3 --- /dev/null +++ b/src/constants/Navigation.ts @@ -0,0 +1 @@ +export const HOME_PAGE_NAVIGATION_ID = "FrontMatter:RootFolder"; \ No newline at end of file diff --git a/src/constants/index.ts b/src/constants/index.ts index cf830ff8..c2b754b1 100644 --- a/src/constants/index.ts +++ b/src/constants/index.ts @@ -1,6 +1,9 @@ +export * from './ContentType'; export * from './DefaultFields'; export * from './Extension'; +export * from './ExtensionState'; export * from './Links'; +export * from './Navigation'; export * from './charMap'; export * from './context'; export * from './settings'; diff --git a/src/dashboardWebView/DashboardCommand.ts b/src/dashboardWebView/DashboardCommand.ts index 314125fb..42442972 100644 --- a/src/dashboardWebView/DashboardCommand.ts +++ b/src/dashboardWebView/DashboardCommand.ts @@ -3,5 +3,5 @@ export enum DashboardCommand { pages = "pages", settings = "settings", media = "media", - viewData = "viewData", + viewData = "viewData" } \ No newline at end of file diff --git a/src/dashboardWebView/DashboardMessage.ts b/src/dashboardWebView/DashboardMessage.ts index f3944647..cb86a9c6 100644 --- a/src/dashboardWebView/DashboardMessage.ts +++ b/src/dashboardWebView/DashboardMessage.ts @@ -17,5 +17,5 @@ export enum DashboardMessage { deleteMedia = 'deleteMedia', insertPreviewImage = 'insertPreviewImage', updateMediaMetadata = 'updateMediaMetadata', - createMediaFolder = 'createMediaFolder', + createMediaFolder = 'createMediaFolder' } \ No newline at end of file diff --git a/src/dashboardWebView/components/Header/Breadcrumb.tsx b/src/dashboardWebView/components/Header/Breadcrumb.tsx index 414a0fe8..13ac21dd 100644 --- a/src/dashboardWebView/components/Header/Breadcrumb.tsx +++ b/src/dashboardWebView/components/Header/Breadcrumb.tsx @@ -1,7 +1,8 @@ -import { HomeIcon } from '@heroicons/react/solid'; +import { CollectionIcon } from '@heroicons/react/outline'; import { basename, join } from 'path'; import * as React from 'react'; import { useRecoilState, useRecoilValue } from 'recoil'; +import { HOME_PAGE_NAVIGATION_ID } from '../../../constants'; import { SelectedMediaFolderAtom, SettingsAtom } from '../../state'; export interface IBreadcrumbProps {} @@ -63,8 +64,8 @@ export const Breadcrumb: React.FunctionComponent = (props: Rea
  1. -
    diff --git a/src/dashboardWebView/components/Media/Media.tsx b/src/dashboardWebView/components/Media/Media.tsx index bf07b63f..dc52082d 100644 --- a/src/dashboardWebView/components/Media/Media.tsx +++ b/src/dashboardWebView/components/Media/Media.tsx @@ -55,13 +55,14 @@ export const Media: React.FunctionComponent = (props: React.PropsWi accept: 'image/*' }); - const messageListener = (message: MessageEvent>) => { + const messageListener = (message: MessageEvent>) => { if (message.data.command === DashboardCommand.media) { + const data: MediaPaths = message.data.data as MediaPaths; setLoading(false); - setMedia(message.data.data.media); - setTotal(message.data.data.total); - setFolders(message.data.data.folders); - setSelectedFolder(message.data.data.selectedFolder); + setMedia(data.media); + setTotal(data.total); + setFolders(data.folders); + setSelectedFolder(data.selectedFolder); } }; diff --git a/src/dashboardWebView/components/SponsorMsg.tsx b/src/dashboardWebView/components/SponsorMsg.tsx index 7cae5734..4b4fc342 100644 --- a/src/dashboardWebView/components/SponsorMsg.tsx +++ b/src/dashboardWebView/components/SponsorMsg.tsx @@ -1,6 +1,6 @@ import { HeartIcon, StarIcon } from '@heroicons/react/outline'; import * as React from 'react'; -import { REVIEW_LINK, SPONSOR_LINK } from '../../constants/Links'; +import { REVIEW_LINK, SPONSOR_LINK } from '../../constants'; import { VersionInfo } from '../../models'; export interface ISponsorMsgProps { diff --git a/src/dashboardWebView/components/WelcomeScreen.tsx b/src/dashboardWebView/components/WelcomeScreen.tsx index ef5cdd1f..5933391c 100644 --- a/src/dashboardWebView/components/WelcomeScreen.tsx +++ b/src/dashboardWebView/components/WelcomeScreen.tsx @@ -1,6 +1,6 @@ import { HeartIcon, StarIcon } from '@heroicons/react/outline'; import * as React from 'react'; -import { GITHUB_LINK, REVIEW_LINK, SPONSOR_LINK } from '../../constants/Links'; +import { GITHUB_LINK, REVIEW_LINK, SPONSOR_LINK } from '../../constants'; import { Messenger } from '@estruyf/vscode/dist/client'; import { FrontMatterIcon } from '../../panelWebView/components/Icons/FrontMatterIcon'; import { GitHubIcon } from '../../panelWebView/components/Icons/GitHubIcon'; diff --git a/src/extension.ts b/src/extension.ts index e40ebf06..93e7a99c 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -6,7 +6,7 @@ import { Folders } from './commands/Folders'; import { Preview } from './commands/Preview'; import { Project } from './commands/Project'; import { Template } from './commands/Template'; -import { COMMAND_NAME } from './constants/Extension'; +import { COMMAND_NAME } from './constants'; import { TaxonomyType } from './models'; import { MarkdownFoldingProvider } from './providers/MarkdownFoldingProvider'; import { TagType } from './panelWebView/TagType'; diff --git a/src/helpers/Extension.ts b/src/helpers/Extension.ts index 6a5ef072..69dfbb7b 100644 --- a/src/helpers/Extension.ts +++ b/src/helpers/Extension.ts @@ -1,9 +1,7 @@ import { basename } from "path"; import { extensions, Uri, ExtensionContext, window, workspace, commands } from "vscode"; import { Folders, WORKSPACE_PLACEHOLDER } from "../commands/Folders"; -import { EXTENSION_NAME, GITHUB_LINK, SETTINGS_CONTENT_FOLDERS, SETTINGS_CONTENT_PAGE_FOLDERS, SETTING_DATE_FIELD, SETTING_MODIFIED_FIELD, SETTING_SEO_DESCRIPTION_FIELD, SETTING_TAXONOMY_CONTENT_TYPES } from "../constants"; -import { DEFAULT_CONTENT_TYPE_NAME } from "../constants/ContentType"; -import { EXTENSION_BETA_ID, EXTENSION_ID, EXTENSION_STATE_VERSION } from "../constants/Extension"; +import { EXTENSION_NAME, GITHUB_LINK, SETTINGS_CONTENT_FOLDERS, SETTINGS_CONTENT_PAGE_FOLDERS, SETTING_DATE_FIELD, SETTING_MODIFIED_FIELD, SETTING_SEO_DESCRIPTION_FIELD, SETTING_TAXONOMY_CONTENT_TYPES, DEFAULT_CONTENT_TYPE_NAME, EXTENSION_BETA_ID, EXTENSION_ID, ExtensionState } from "../constants"; import { ContentType } from "../models"; import { Notifications } from "./Notifications"; import { Settings } from "./SettingsHelper"; @@ -32,7 +30,7 @@ export class Extension { public getVersion(): { usedVersion: string | undefined, installedVersion: string } { const frontMatter = extensions.getExtension(this.isBetaVersion() ? EXTENSION_BETA_ID : EXTENSION_ID)!; let installedVersion = frontMatter.packageJSON.version; - const usedVersion = this.ctx.globalState.get(EXTENSION_STATE_VERSION); + const usedVersion = this.ctx.globalState.get(ExtensionState.Version); if (this.isBetaVersion()) { installedVersion = `${installedVersion}-beta`; @@ -78,7 +76,7 @@ export class Extension { * Set the current version information for the extension */ public setVersion(installedVersion: string): void { - this.ctx.globalState.update(EXTENSION_STATE_VERSION, installedVersion); + this.ctx.globalState.update(ExtensionState.Version, installedVersion); } /** @@ -156,12 +154,20 @@ export class Extension { } } - public async setState(propKey: string, propValue: string): Promise { - await this.ctx.globalState.update(propKey, propValue); + public async setState(propKey: string, propValue: string, type: "workspace" | "global" = "global"): Promise { + if (type === "global") { + await this.ctx.globalState.update(propKey, propValue); + } else { + await this.ctx.workspaceState.update(propKey, propValue); + } } - public async getState(propKey: string): Promise { - return await this.ctx.globalState.get(propKey); + public async getState(propKey: string, type: "workspace" | "global" = "global"): Promise { + if (type === "global") { + return await this.ctx.globalState.get(propKey); + } else { + return await this.ctx.workspaceState.get(propKey); + } } public isBetaVersion() { diff --git a/src/helpers/SlugHelper.ts b/src/helpers/SlugHelper.ts index 00fdc37b..1404027b 100644 --- a/src/helpers/SlugHelper.ts +++ b/src/helpers/SlugHelper.ts @@ -1,5 +1,4 @@ -import { stopWords } from '../constants/stopwords-en'; -import { charMap } from '../constants/charMap'; +import { stopWords, charMap } from '../constants'; export class SlugHelper {