mirror of
https://github.com/devonthesofa/obsidian-note-status.git
synced 2026-07-22 05:45:04 +00:00
117 lines
2.9 KiB
TypeScript
117 lines
2.9 KiB
TypeScript
import { StatusTemplate } from "@/types/pluginSettings";
|
|
import settingsService from "@/core/settingsService";
|
|
import {
|
|
PREDEFINED_TEMPLATES,
|
|
COMMUNITY_TEMPLATES,
|
|
} from "@/constants/predefinedTemplates";
|
|
|
|
/**
|
|
* Check if a template is a custom user template (not from marketplace)
|
|
*/
|
|
export const isCustomTemplate = (template: StatusTemplate): boolean => {
|
|
// Either matches an original predefined template
|
|
const matchesPredefined = PREDEFINED_TEMPLATES.some(
|
|
(pt) =>
|
|
pt.id === template.id ||
|
|
pt.name.toLowerCase() === template.name.toLowerCase(),
|
|
);
|
|
if (matchesPredefined) return false;
|
|
|
|
// Or matches an original community template
|
|
const matchesCommunity = COMMUNITY_TEMPLATES.some(
|
|
(ct) =>
|
|
ct.id === template.id ||
|
|
ct.name.toLowerCase() === template.name.toLowerCase(),
|
|
);
|
|
if (matchesCommunity) return false;
|
|
|
|
return true;
|
|
};
|
|
|
|
/**
|
|
* Check if a marketplace template has been modified by the user
|
|
*/
|
|
export const isTemplateModified = (template: StatusTemplate): boolean => {
|
|
const allMarketplaceTemplates = [
|
|
...PREDEFINED_TEMPLATES,
|
|
...COMMUNITY_TEMPLATES,
|
|
];
|
|
const original = allMarketplaceTemplates.find(
|
|
(pt) =>
|
|
pt.id === template.id ||
|
|
pt.name.toLowerCase() === template.name.toLowerCase(),
|
|
);
|
|
|
|
if (!original) return false;
|
|
|
|
// Compare relevant fields to see if anything changed
|
|
// We stringify for a deep comparison of statuses
|
|
const originalData = JSON.stringify({
|
|
name: original.name,
|
|
description: original.description,
|
|
statuses: original.statuses.map((s) => ({
|
|
name: s.name,
|
|
icon: s.icon,
|
|
lucideIcon: s.lucideIcon,
|
|
color: s.color,
|
|
})),
|
|
});
|
|
|
|
const currentData = JSON.stringify({
|
|
name: template.name,
|
|
description: template.description,
|
|
statuses: template.statuses.map((s) => ({
|
|
name: s.name,
|
|
icon: s.icon,
|
|
lucideIcon: s.lucideIcon,
|
|
color: s.color,
|
|
})),
|
|
});
|
|
|
|
return originalData !== currentData;
|
|
};
|
|
|
|
/**
|
|
* 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;
|
|
};
|