mirror of
https://github.com/lensapp/lens.git
synced 2025-05-20 05:10:56 +00:00
fix: load templates from sub-folders for user templates (Dock -> Create resource)
Signed-off-by: Roman <ixrock@gmail.com>
This commit is contained in:
parent
22a800ce73
commit
a29c9ca1b8
@ -199,6 +199,7 @@
|
|||||||
"electron-updater": "^4.6.0",
|
"electron-updater": "^4.6.0",
|
||||||
"electron-window-state": "^5.0.3",
|
"electron-window-state": "^5.0.3",
|
||||||
"fs-extra": "^9.0.1",
|
"fs-extra": "^9.0.1",
|
||||||
|
"glob": "^7.2.0",
|
||||||
"glob-to-regexp": "^0.4.1",
|
"glob-to-regexp": "^0.4.1",
|
||||||
"got": "^11.8.2",
|
"got": "^11.8.2",
|
||||||
"grapheme-splitter": "^1.0.4",
|
"grapheme-splitter": "^1.0.4",
|
||||||
|
|||||||
@ -20,8 +20,10 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
import fs from "fs-extra";
|
import fs from "fs-extra";
|
||||||
|
import glob from "glob";
|
||||||
import path from "path";
|
import path from "path";
|
||||||
import os from "os";
|
import os from "os";
|
||||||
|
import { promisify } from "util";
|
||||||
import { action, makeObservable, observable } from "mobx";
|
import { action, makeObservable, observable } from "mobx";
|
||||||
import logger from "../../../common/logger";
|
import logger from "../../../common/logger";
|
||||||
import { DockTabStore } from "./dock-tab.store";
|
import { DockTabStore } from "./dock-tab.store";
|
||||||
@ -30,7 +32,7 @@ import { dockStore, DockTabCreateSpecific, TabKind } from "./dock.store";
|
|||||||
export interface TemplatesGroup {
|
export interface TemplatesGroup {
|
||||||
label: string;
|
label: string;
|
||||||
templates: {
|
templates: {
|
||||||
[filename: string]: string;
|
[filepath: string]: string; // filepath is relative to templates folder
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -76,10 +78,10 @@ export class CreateResourceStore extends DockTabStore<string> {
|
|||||||
if (!templatesGroup) return; // exit: unknown templates source folder
|
if (!templatesGroup) return; // exit: unknown templates source folder
|
||||||
|
|
||||||
await fs.ensureDir(sourceFolder);
|
await fs.ensureDir(sourceFolder);
|
||||||
const fileNames = await fs.readdir(sourceFolder);
|
const files = await promisify(glob)("**/*.@(yaml|yml|json)", { cwd: sourceFolder });
|
||||||
|
|
||||||
templatesGroup.templates = Object.fromEntries(
|
templatesGroup.templates = Object.fromEntries(
|
||||||
fileNames.map(fileName => [fileName, "" /* empty: content not loaded yet */])
|
files.map(filePath => [filePath, "" /* empty: content not loaded yet */])
|
||||||
);
|
);
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
logger.error(`[CREATE-RESOURCE]: scanning template folders error: ${error}`);
|
logger.error(`[CREATE-RESOURCE]: scanning template folders error: ${error}`);
|
||||||
@ -87,8 +89,8 @@ export class CreateResourceStore extends DockTabStore<string> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@action
|
@action
|
||||||
async loadTemplate(init: { fileName: string, sourceFolder: string }): Promise<string> {
|
async loadTemplate(init: { filePath: string, sourceFolder: string }): Promise<string> {
|
||||||
const { fileName, sourceFolder } = init;
|
const { filePath, sourceFolder } = init;
|
||||||
|
|
||||||
const templatesGroup = this.templateGroups[sourceFolder];
|
const templatesGroup = this.templateGroups[sourceFolder];
|
||||||
|
|
||||||
@ -96,23 +98,23 @@ export class CreateResourceStore extends DockTabStore<string> {
|
|||||||
return ""; // unknown group, exit
|
return ""; // unknown group, exit
|
||||||
}
|
}
|
||||||
|
|
||||||
const template = templatesGroup.templates[fileName];
|
const template = templatesGroup.templates[filePath];
|
||||||
|
|
||||||
if (template) return template; // return cache, preloaded already
|
if (template) return template; // return cache, preloaded already
|
||||||
|
|
||||||
try {
|
try {
|
||||||
const templatePath = path.resolve(sourceFolder, fileName);
|
const templatePath = path.resolve(sourceFolder, filePath);
|
||||||
const pathExists = await fs.pathExists(templatePath);
|
const pathExists = await fs.pathExists(templatePath);
|
||||||
|
|
||||||
if (!pathExists) return ""; // template file not exists, skip
|
if (!pathExists) return ""; // template file not exists, skip
|
||||||
|
|
||||||
const textContent = await fs.readFile(templatePath, { encoding: "utf-8" });
|
const textContent = await fs.readFile(templatePath, { encoding: "utf-8" });
|
||||||
|
|
||||||
templatesGroup.templates[fileName] = textContent; // save cache
|
templatesGroup.templates[filePath] = textContent; // save cache
|
||||||
|
|
||||||
return textContent;
|
return textContent;
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
logger.error(`[CREATE-RESOURCE]: reading "${sourceFolder}/${fileName}" has failed: ${error}`);
|
logger.error(`[CREATE-RESOURCE]: reading "${sourceFolder}/${filePath}" has failed: ${error}`);
|
||||||
}
|
}
|
||||||
|
|
||||||
return "";
|
return "";
|
||||||
|
|||||||
@ -39,7 +39,7 @@ type SelectOptionTemplate = SelectOption<SelectOptionTemplateValue>;
|
|||||||
|
|
||||||
interface SelectOptionTemplateValue {
|
interface SelectOptionTemplateValue {
|
||||||
sourceFolder: string;
|
sourceFolder: string;
|
||||||
fileName: string;
|
filePath: string; // relative to `sourceFolder`
|
||||||
content?: string; // available after loading (template selection)
|
content?: string; // available after loading (template selection)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -113,10 +113,10 @@ export class CreateResourceInfoPanel extends React.Component<Props> {
|
|||||||
return Object.entries(createResourceStore.templateGroups).map(([sourceFolder, group]) => {
|
return Object.entries(createResourceStore.templateGroups).map(([sourceFolder, group]) => {
|
||||||
return {
|
return {
|
||||||
label: group.label,
|
label: group.label,
|
||||||
options: Object.entries(group.templates).map(([fileName]) => {
|
options: Object.entries(group.templates).map(([filePath]) => {
|
||||||
return {
|
return {
|
||||||
label: fileName,
|
label: filePath,
|
||||||
value: { fileName, sourceFolder },
|
value: { filePath, sourceFolder },
|
||||||
};
|
};
|
||||||
}),
|
}),
|
||||||
};
|
};
|
||||||
@ -124,8 +124,8 @@ export class CreateResourceInfoPanel extends React.Component<Props> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
onSelectTemplate = async ({ value }: SelectOptionTemplate) => {
|
onSelectTemplate = async ({ value }: SelectOptionTemplate) => {
|
||||||
const { fileName, sourceFolder, content } = value;
|
const { filePath, sourceFolder, content } = value;
|
||||||
const templateContent = content ?? await createResourceStore.loadTemplate({ fileName, sourceFolder });
|
const templateContent = content ?? await createResourceStore.loadTemplate({ filePath, sourceFolder });
|
||||||
|
|
||||||
createResourceStore.setData(this.tabId, templateContent); // update draft
|
createResourceStore.setData(this.tabId, templateContent); // update draft
|
||||||
};
|
};
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user