mirror of
https://github.com/devonthesofa/obsidian-note-status.git
synced 2026-07-22 12:30:24 +00:00
84 lines
2.2 KiB
TypeScript
84 lines
2.2 KiB
TypeScript
import { StatusTemplate } from "@/types/pluginSettings";
|
|
import settingsService from "@/core/settingsService";
|
|
import { PREDEFINED_TEMPLATES } from "@/constants/predefinedTemplates";
|
|
|
|
/**
|
|
* Get all enabled templates
|
|
*/
|
|
export const isCustomTemplate = (templateId: string): boolean => {
|
|
const i = PREDEFINED_TEMPLATES.findIndex((t) => t.id === templateId);
|
|
return i === -1;
|
|
};
|
|
|
|
/**
|
|
* Get template by ID
|
|
*/
|
|
export const getTemplateById = (id: string): StatusTemplate | undefined => {
|
|
const allTemplates = settingsService.settings.templates;
|
|
return allTemplates.find((template) => template.id === id);
|
|
};
|
|
|
|
/**
|
|
* Validate template name uniqueness
|
|
*/
|
|
export const isTemplateNameUnique = (
|
|
name: string,
|
|
excludeId?: string,
|
|
): boolean => {
|
|
const allTemplates = settingsService.settings.templates;
|
|
return !allTemplates.some(
|
|
(template) =>
|
|
template.name.toLowerCase() === name.toLowerCase() &&
|
|
template.id !== excludeId,
|
|
);
|
|
};
|
|
|
|
/**
|
|
* Generate unique template ID
|
|
*/
|
|
export const generateTemplateId = (
|
|
name: string,
|
|
existingTemplates?: StatusTemplate[],
|
|
): string => {
|
|
const baseId = name.toLowerCase().replace(/[^a-z0-9]/g, "-");
|
|
const allTemplates =
|
|
existingTemplates || settingsService.settings.templates;
|
|
|
|
let counter = 1;
|
|
let id = `custom-${baseId}`;
|
|
|
|
while (allTemplates.some((template) => template.id === id)) {
|
|
id = `custom-${baseId}-${counter}`;
|
|
counter++;
|
|
}
|
|
|
|
return id;
|
|
};
|
|
|
|
/**
|
|
* Generate a GitHub URL to submit a template to the marketplace
|
|
*/
|
|
export const getMarketplaceSubmissionUrl = (
|
|
template: StatusTemplate,
|
|
): string => {
|
|
const baseUrl =
|
|
"https://github.com/devonthesofa/obsidian-note-status/new/master/templates";
|
|
const filename = `${template.id.replace(/^custom-/, "")}.json`;
|
|
|
|
// Create a clean version of the template for the marketplace
|
|
const marketplaceTemplate = {
|
|
...template,
|
|
// Ensure the ID doesn't have the 'custom-' prefix for the marketplace
|
|
id: template.id.replace(/^custom-/, ""),
|
|
// Ensure statuses use the new ID
|
|
statuses: template.statuses.map((s) => ({
|
|
...s,
|
|
templateId: template.id.replace(/^custom-/, ""),
|
|
})),
|
|
};
|
|
|
|
const value = encodeURIComponent(
|
|
JSON.stringify(marketplaceTemplate, null, 2),
|
|
);
|
|
return `${baseUrl}?filename=${filename}&value=${value}`;
|
|
};
|