From cefbf74582b5cc3d16a244c1c066c77218c20a80 Mon Sep 17 00:00:00 2001 From: Elio Struyf Date: Fri, 6 Aug 2021 14:41:39 +0200 Subject: [PATCH] #51 - Default panel actions --- CHANGELOG.md | 1 + README.md | 8 ++++- assets/media/styles.css | 4 ++- assets/v2.2.0/baseview.png | Bin 0 -> 27478 bytes src/commands/Folders.ts | 32 ++++++++++++++++-- src/commands/StatusListener.ts | 2 +- src/commands/Template.ts | 18 +++++++---- src/helpers/ArticleHelper.ts | 8 +++++ src/models/PanelSettings.ts | 7 ++++ src/viewpanel/CommandToCode.ts | 4 ++- src/viewpanel/ViewPanel.tsx | 2 +- src/viewpanel/components/BaseView.tsx | 44 +++++++++++++++++++++++-- src/webview/ExplorerView.ts | 45 +++++++++++++++++--------- 13 files changed, 144 insertions(+), 31 deletions(-) create mode 100644 assets/v2.2.0/baseview.png diff --git a/CHANGELOG.md b/CHANGELOG.md index b30618f3..aa54654a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,7 @@ - [#48](https://github.com/estruyf/vscode-front-matter/issues/48): Added new folder registration message + notification helper - [#49](https://github.com/estruyf/vscode-front-matter/issues/49): New initialize project command - [#50](https://github.com/estruyf/vscode-front-matter/issues/50): Fix in the table rendering of rows +- [#51](https://github.com/estruyf/vscode-front-matter/issues/51): Panel actions base view enhanced to show project actions and information ## [2.1.0] - 2020-08-04 diff --git a/README.md b/README.md index 0931003d..714b4a7f 100644 --- a/README.md +++ b/README.md @@ -53,7 +53,13 @@ Initially, this panel has been created to make it easier to add tags and categor To leverage most of the capabilities of the extension. SEO information and everyday actions like slug optimization, updating the date, and publish/drafting the article. -The panel consists of the following sections: +When the panel opens on a none markdown file, it will contain the following sections: + +

+ Base view +

+ +When you open the Front Matter panel on a Markdown file, you get to see the following sections: **SEO Status** diff --git a/assets/media/styles.css b/assets/media/styles.css index 526bf6c5..d74a8202 100644 --- a/assets/media/styles.css +++ b/assets/media/styles.css @@ -248,7 +248,9 @@ filter: contrast(60%); } -.article__actions > * + * { +.article__actions > * + *, +.base__actions > * + *, +.base__information > * + * { --tw-space-y-reverse: 0; margin-top: calc(1rem * calc(1 - var(--tw-space-y-reverse))); margin-bottom: calc(1rem * var(--tw-space-y-reverse)); diff --git a/assets/v2.2.0/baseview.png b/assets/v2.2.0/baseview.png new file mode 100644 index 0000000000000000000000000000000000000000..9f3fda5f6be09f1963fde1b89960b05ba916fddd GIT binary patch literal 27478 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 literal 0 HcmV?d00001 diff --git a/src/commands/Folders.ts b/src/commands/Folders.ts index 346950dd..8dd4765a 100644 --- a/src/commands/Folders.ts +++ b/src/commands/Folders.ts @@ -1,7 +1,7 @@ import { commands, Uri, workspace, window } from "vscode"; -import { CONFIG_KEY, EXTENSION_NAME, SETTINGS_CONTENT_FOLDERS } from "../constants"; +import { CONFIG_KEY, SETTINGS_CONTENT_FOLDERS } from "../constants"; import { basename } from "path"; -import { ContentFolder } from "../models"; +import { ContentFolder, FolderInfo } from "../models"; import uniqBy = require("lodash.uniqby"); import { Template } from "./Template"; import { Notifications } from "../helpers/Notifications"; @@ -118,6 +118,34 @@ export class Folders { return folderPath; } + /** + * Get the registered folders information + */ + public static async getInfo(): Promise { + const folders = Folders.get(); + if (folders && folders.length > 0) { + let folderInfo: FolderInfo[] = []; + + for (const folder of folders) { + try { + const files = await workspace.fs.readDirectory(Uri.file(folder.fsPath)); + if (files) { + folderInfo.push({ + title: folder.title, + files: files.length + }); + } + } catch (e) { + // Skip the current folder + } + } + + return folderInfo; + } + + return null; + } + /** * Get the folder settings * @returns diff --git a/src/commands/StatusListener.ts b/src/commands/StatusListener.ts index e941d4b1..af1df44b 100644 --- a/src/commands/StatusListener.ts +++ b/src/commands/StatusListener.ts @@ -17,7 +17,7 @@ export class StatusListener { const publishMsg = "to publish"; let editor = vscode.window.activeTextEditor; - if (editor && editor.document && (editor.document.languageId.toLowerCase() === "markdown" || editor.document.languageId.toLowerCase() === "mdx")) { + if (editor && ArticleHelper.isMarkdownDile()) { try { const article = ArticleHelper.getFrontMatter(editor); diff --git a/src/commands/Template.ts b/src/commands/Template.ts index b00760f4..47d24af5 100644 --- a/src/commands/Template.ts +++ b/src/commands/Template.ts @@ -15,24 +15,30 @@ export class Template { * Check if the template folder is available */ public static async init() { + const isInitialized = await Template.isInitialized(); + await vscode.commands.executeCommand('setContext', CONTEXT.canInit, !isInitialized); + } + + /** + * Check if the project is already initialized + */ + public static async isInitialized() { const config = vscode.workspace.getConfiguration(CONFIG_KEY); const folder = config.get(SETTING_TEMPLATES_FOLDER); - const workspaceFolders = vscode.workspace.workspaceFolders; if (!folder || !workspaceFolders || workspaceFolders.length === 0) { - vscode.commands.executeCommand('setContext', CONTEXT.canInit, true); - return; + return false; } - + const workspaceFolder = workspaceFolders[0]; const templatePath = vscode.Uri.file(path.join(workspaceFolder.uri.fsPath, folder)); try { await vscode.workspace.fs.stat(templatePath); - vscode.commands.executeCommand('setContext', CONTEXT.canInit, false); + return true; } catch (e) { - vscode.commands.executeCommand('setContext', CONTEXT.canInit, true); + return false; } } diff --git a/src/helpers/ArticleHelper.ts b/src/helpers/ArticleHelper.ts index 894b5145..b4947721 100644 --- a/src/helpers/ArticleHelper.ts +++ b/src/helpers/ArticleHelper.ts @@ -96,4 +96,12 @@ export class ArticleHelper { indent: spaces || 2 } as DumpOptions as any)); } + + /** + * Checks if the current file is a markdown file + */ + public static isMarkdownDile() { + const editor = vscode.window.activeTextEditor; + return (editor && editor.document && (editor.document.languageId.toLowerCase() === "markdown" || editor.document.languageId.toLowerCase() === "mdx")); + } } \ No newline at end of file diff --git a/src/models/PanelSettings.ts b/src/models/PanelSettings.ts index d15018f6..f2bfb351 100644 --- a/src/models/PanelSettings.ts +++ b/src/models/PanelSettings.ts @@ -6,6 +6,8 @@ export interface PanelSettings { categories: string[]; freeform: boolean; scripts: CustomScript[]; + isInitialized: boolean; + contentInfo: FolderInfo[] | null; } export interface SEO { @@ -20,6 +22,11 @@ export interface Slug { suffix: number; } +export interface FolderInfo { + title: string; + files: number; +} + export interface CustomScript { title: string; script: string; diff --git a/src/viewpanel/CommandToCode.ts b/src/viewpanel/CommandToCode.ts index ebb4cdf1..1dc29d3c 100644 --- a/src/viewpanel/CommandToCode.ts +++ b/src/viewpanel/CommandToCode.ts @@ -12,5 +12,7 @@ export enum CommandToCode { openSettings = "open-settings", openFile = "open-file", openProject = "open-project", - runCustomScript = "custom-script" + runCustomScript = "custom-script", + initProject = "init-project", + createContent = "create-content", } \ No newline at end of file diff --git a/src/viewpanel/ViewPanel.tsx b/src/viewpanel/ViewPanel.tsx index df782697..e2e279ea 100644 --- a/src/viewpanel/ViewPanel.tsx +++ b/src/viewpanel/ViewPanel.tsx @@ -31,7 +31,7 @@ export const ViewPanel: React.FunctionComponent = (props: React if (!metadata || Object.keys(metadata).length === 0) { return ( - + ); } diff --git a/src/viewpanel/components/BaseView.tsx b/src/viewpanel/components/BaseView.tsx index ba717605..4d022f7c 100644 --- a/src/viewpanel/components/BaseView.tsx +++ b/src/viewpanel/components/BaseView.tsx @@ -1,11 +1,49 @@ import * as React from 'react'; +import { PanelSettings } from '../../models'; +import { CommandToCode } from '../CommandToCode'; +import { MessageHelper } from '../helper/MessageHelper'; +import { Collapsible } from './Collapsible'; -export interface IBaseViewProps {} +export interface IBaseViewProps { + settings: PanelSettings | undefined; +} + +export const BaseView: React.FunctionComponent = ({settings}: React.PropsWithChildren) => { + + const initProject = () => { + MessageHelper.sendMessage(CommandToCode.initProject); + }; + + const createContent = () => { + MessageHelper.sendMessage(CommandToCode.createContent); + }; -export const BaseView: React.FunctionComponent = (props: React.PropsWithChildren) => { return (

- +
+ +
+ + +
+
+ + { + settings?.contentInfo && ( + +
+ { + settings.contentInfo.map(folder => ( +
+ {folder.title}: {folder.files} file{folder.files > 1 ? 's' : ''} +
+ )) + } +
+
+ ) + } +
); }; \ No newline at end of file diff --git a/src/webview/ExplorerView.ts b/src/webview/ExplorerView.ts index c53f11f0..4fc494f1 100644 --- a/src/webview/ExplorerView.ts +++ b/src/webview/ExplorerView.ts @@ -1,3 +1,4 @@ +import { Template } from './../commands/Template'; import { SETTING_CUSTOM_SCRIPTS, SETTING_SEO_CONTENT_MIN_LENGTH, SETTING_SEO_DESCRIPTION_FIELD, SETTING_SLUG_UPDATE_FILE_NAME } from './../constants/settings'; import * as os from 'os'; import { PanelSettings, CustomScript } from './../models/PanelSettings'; @@ -14,6 +15,8 @@ import * as path from 'path'; import { fromMarkdown } from 'mdast-util-from-markdown'; import { Content } from 'mdast'; import { Notifications } from '../helpers/Notifications'; +import { COMMAND_NAME } from '../constants/Extension'; +import { Folders } from '../commands/Folders'; export class ExplorerView implements WebviewViewProvider, Disposable { @@ -75,7 +78,7 @@ export class ExplorerView implements WebviewViewProvider, Disposable { webviewView.onDidDispose(() => { webviewView.webview.html = ""; }, this), ); - webviewView.webview.onDidReceiveMessage(msg => { + webviewView.webview.onDidReceiveMessage(async (msg) => { switch(msg.command) { case CommandToCode.getData: this.getSettings(); @@ -136,6 +139,13 @@ export class ExplorerView implements WebviewViewProvider, Disposable { } } break; + case CommandToCode.initProject: + await commands.executeCommand(COMMAND_NAME.init); + this.getSettings(); + break; + case CommandToCode.createContent: + await commands.executeCommand(COMMAND_NAME.createContent); + break; } }); @@ -162,10 +172,15 @@ export class ExplorerView implements WebviewViewProvider, Disposable { * @param metadata */ public pushMetadata(metadata: any) { + const articleDetails = this.getArticleDetails(); + + if (articleDetails) { + metadata.articleDetails = articleDetails; + } + this.postWebviewMessage({ command: Command.metadata, data: { - ...metadata, - articleDetails: this.getArticleDetails() - } }); + ...metadata + }}); } /** @@ -225,7 +240,7 @@ export class ExplorerView implements WebviewViewProvider, Disposable { /** * Retrieve the extension settings */ - private getSettings() { + private async getSettings() { const config = workspace.getConfiguration(CONFIG_KEY); this.postWebviewMessage({ @@ -245,7 +260,9 @@ export class ExplorerView implements WebviewViewProvider, Disposable { tags: config.get(SETTING_TAXONOMY_TAGS) || [], categories: config.get(SETTING_TAXONOMY_CATEGORIES) || [], freeform: config.get(SETTING_PANEL_FREEFORM), - scripts: config.get(SETTING_CUSTOM_SCRIPTS) + scripts: config.get(SETTING_CUSTOM_SCRIPTS), + isInitialized: await Template.isInitialized(), + contentInfo: await Folders.getInfo() || null } as PanelSettings }); } @@ -260,10 +277,7 @@ export class ExplorerView implements WebviewViewProvider, Disposable { } const article = ArticleHelper.getFrontMatter(editor); - this.postWebviewMessage({ command: Command.metadata, data: { - ...article!.data, - articleDetails: this.getArticleDetails() - }}); + this.pushMetadata(article!.data); } /** @@ -281,10 +295,7 @@ export class ExplorerView implements WebviewViewProvider, Disposable { if (article && article.data) { article.data[tagType.toLowerCase()] = values || []; ArticleHelper.update(editor, article); - this.postWebviewMessage({ command: Command.metadata, data: { - ...article.data, - articleDetails: this.getArticleDetails() - }}); + this.pushMetadata(article!.data); } } @@ -314,7 +325,11 @@ export class ExplorerView implements WebviewViewProvider, Disposable { private getArticleDetails() { const editor = window.activeTextEditor; if (!editor) { - return ""; + return null; + } + + if (!ArticleHelper.isMarkdownDile()) { + return null; } const article = ArticleHelper.getFrontMatter(editor);