diff --git a/package.nls.json b/package.nls.json index c081df1e..091f77b0 100644 --- a/package.nls.json +++ b/package.nls.json @@ -185,7 +185,7 @@ "setting.frontMatter.media.contentTypes.items.properties.fields.properties.single.description": "Is a single line field", "setting.frontMatter.panel.openOnSupportedFile.markdownDescription": "Specifies if you want to open the panel when opening a supported file. [Docs](https://frontmatter.codes/docs/settings/overview#frontmatter.panel.openonsupportedfile) - [View in VS Code](command:simpleBrowser.show?%5B%22https://frontmatter.codes/docs/settings/overview%23frontmatter.panel.openonsupportedfile%22%5D)", - "setting.frontMatter.panel.freeform.markdownDescription": "Specifies if you want to allow yourself from entering unknown tags/categories in the tag picker (when enabled, you will have the option to store them afterwards). Default: true. [Docs](https://frontmatter.codes/docs/settings/overview#frontmatter.panel.freeform) - [View in VS Code](command:simpleBrowser.show?%5B%22https://frontmatter.codes/docs/settings/overview%23frontmatter.panel.freeform%22%5D)", + "setting.frontMatter.panel.freeform.markdownDescription": "Specifies whether the tag picker should allow unknown tags and categories. When enabled, you can enter new values and save them afterward. Default: true. [Docs](https://frontmatter.codes/docs/settings/overview#frontmatter.panel.freeform) - [View in VS Code](command:simpleBrowser.show?%5B%22https://frontmatter.codes/docs/settings/overview%23frontmatter.panel.freeform%22%5D)", "setting.frontMatter.panel.actions.disabled.markdownDescription": "Specify the actions you want to disable in the panel. [Docs](https://frontmatter.codes/docs/settings/overview#frontmatter.panel.actions.disabled) - [View in VS Code](command:simpleBrowser.show?%5B%22https://frontmatter.codes/docs/settings/overview%23frontmatter.panel.actions.disabled%22%5D)", "setting.frontMatter.preview.host.markdownDescription": "Specify the host URL (example: http://localhost:1313) to be used when opening the preview. [Docs](https://frontmatter.codes/docs/settings/overview#frontmatter.preview.host) - [View in VS Code](command:simpleBrowser.show?%5B%22https://frontmatter.codes/docs/settings/overview%23frontmatter.preview.host%22%5D)", "setting.frontMatter.preview.trailingSlash.markdownDescription": "Specify if you want to add a trailing slash to the preview URL. [Docs](https://frontmatter.codes/docs/settings/overview#frontmatter.preview.trailingslash) - [View in VS Code](command:simpleBrowser.show?%5B%22https://frontmatter.codes/docs/settings/overview%23frontmatter.preview.trailingslash%22%5D)", diff --git a/src/helpers/ContentTypeSchemaGenerator.ts b/src/helpers/ContentTypeSchemaGenerator.ts index 356be224..03594e6b 100644 --- a/src/helpers/ContentTypeSchemaGenerator.ts +++ b/src/helpers/ContentTypeSchemaGenerator.ts @@ -1,6 +1,10 @@ -import { ContentType, Field, FieldType, CustomTaxonomy } from '../models'; +import { ContentType, Field, CustomTaxonomy } from '../models'; import { Settings } from '../helpers/SettingsHelper'; -import { SETTING_TAXONOMY_FIELD_GROUPS, SETTING_TAXONOMY_CUSTOM } from '../constants'; +import { + SETTING_PANEL_FREEFORM, + SETTING_TAXONOMY_FIELD_GROUPS, + SETTING_TAXONOMY_CUSTOM +} from '../constants'; import { TaxonomyHelper } from './TaxonomyHelper'; import { TaxonomyType } from '../models/TaxonomyType'; @@ -119,6 +123,8 @@ export class ContentTypeSchemaGenerator { schema.default = field.default; } + const allowFreeformTaxonomies = Settings.get(SETTING_PANEL_FREEFORM) !== false; + // Map field type to JSON Schema type switch (field.type) { case 'string': @@ -182,10 +188,12 @@ export class ContentTypeSchemaGenerator { type: 'string' }; - // Get available tags and add as enum for validation - const availableTags = await TaxonomyHelper.get(TaxonomyType.Tag); - if (availableTags && availableTags.length > 0) { - schema.items.enum = availableTags; + if (!allowFreeformTaxonomies) { + // Get available tags and add as enum for validation + const availableTags = await TaxonomyHelper.get(TaxonomyType.Tag); + if (availableTags && availableTags.length > 0) { + schema.items.enum = availableTags; + } } break; } @@ -196,10 +204,12 @@ export class ContentTypeSchemaGenerator { type: 'string' }; - // Get available categories and add as enum for validation - const availableCategories = await TaxonomyHelper.get(TaxonomyType.Category); - if (availableCategories && availableCategories.length > 0) { - schema.items.enum = availableCategories; + if (!allowFreeformTaxonomies) { + // Get available categories and add as enum for validation + const availableCategories = await TaxonomyHelper.get(TaxonomyType.Category); + if (availableCategories && availableCategories.length > 0) { + schema.items.enum = availableCategories; + } } break; } @@ -210,13 +220,15 @@ export class ContentTypeSchemaGenerator { type: 'string' }; - // Get custom taxonomy options if taxonomyId is specified - if (field.taxonomyId) { - const customTaxonomies = Settings.get(SETTING_TAXONOMY_CUSTOM); - if (customTaxonomies && customTaxonomies.length > 0) { - const taxonomy = customTaxonomies.find((t) => t.id === field.taxonomyId); - if (taxonomy && taxonomy.options && taxonomy.options.length > 0) { - schema.items.enum = taxonomy.options; + if (!allowFreeformTaxonomies) { + // Get custom taxonomy options if taxonomyId is specified + if (field.taxonomyId) { + const customTaxonomies = Settings.get(SETTING_TAXONOMY_CUSTOM); + if (customTaxonomies && customTaxonomies.length > 0) { + const taxonomy = customTaxonomies.find((t) => t.id === field.taxonomyId); + if (taxonomy && taxonomy.options && taxonomy.options.length > 0) { + schema.items.enum = taxonomy.options; + } } } }