From 5a6d1a49736b8a6e7f1ccaa051647ba67945502c Mon Sep 17 00:00:00 2001 From: gewfy Date: Sun, 19 Nov 2023 17:04:19 +0100 Subject: [PATCH 1/3] Add support for text templates to CMS editor --- cms/src/collections/collections.ts | 7 +++++ cms/src/editorComponents.ts/textTemplates.ts | 33 ++++++++++++++++++++ cms/src/fields/templates.ts | 27 ++++++++++++++++ cms/src/index.ts | 2 ++ cms/src/templates/editorTexts.json | 12 +++++++ 5 files changed, 81 insertions(+) create mode 100644 cms/src/editorComponents.ts/textTemplates.ts create mode 100644 cms/src/fields/templates.ts create mode 100644 cms/src/templates/editorTexts.json diff --git a/cms/src/collections/collections.ts b/cms/src/collections/collections.ts index d54df4e649..151034c624 100644 --- a/cms/src/collections/collections.ts +++ b/cms/src/collections/collections.ts @@ -7,6 +7,7 @@ import EXERCISE_DEFAULTS_FIELDS from '../fields/defaults'; import {TAG_FIELDS} from '../fields/tag'; import {COLLECTION_FIELDS} from '../fields/collection'; import {DEFAULT_LANGUAGE_TAG} from '../../../shared/src/constants/i18n'; +import EDITOR_TEXT_TEMPLATES_FIELDS from '../fields/templates'; export const exercises: CmsCollection = { name: 'exercises', @@ -38,6 +39,12 @@ export const settings: CmsCollection = { file: '/cms/src/defaults/exercise.json', fields: EXERCISE_DEFAULTS_FIELDS, }, + { + label: '🔖 Editor text templates', + name: 'text-templates', + file: '/cms/src/templates/editorTexts.json', + fields: EDITOR_TEXT_TEMPLATES_FIELDS, + }, ], i18n: false, extension: 'json', diff --git a/cms/src/editorComponents.ts/textTemplates.ts b/cms/src/editorComponents.ts/textTemplates.ts new file mode 100644 index 0000000000..6eedc9f580 --- /dev/null +++ b/cms/src/editorComponents.ts/textTemplates.ts @@ -0,0 +1,33 @@ +import {templates} from '../templates/editorTexts.json'; + +const templateOptions = templates.map(template => ({ + label: `${template.name} - ${template.text}`, + value: template.text, +})); + +const templatesSubPattern = templates + .map(template => template.text.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')) + .join('|'); + +const templatesPattern = new RegExp(`(${templatesSubPattern})(\\s|$)`); + +const textTemplates = { + id: 'textTemplate', + label: '🔖 Text template', + fields: [ + { + name: 'template', + label: 'Template', + widget: 'select', + options: templateOptions, + }, + ], + pattern: templatesPattern, + fromBlock: (match: RegExpMatchArray) => ({ + template: match[1], + }), + toBlock: (obj: {template: string}) => obj.template, + toPreview: (obj: {template: string}) => obj.template, +}; + +export default textTemplates; diff --git a/cms/src/fields/templates.ts b/cms/src/fields/templates.ts new file mode 100644 index 0000000000..cc615730d4 --- /dev/null +++ b/cms/src/fields/templates.ts @@ -0,0 +1,27 @@ +import {CmsField} from 'netlify-cms-core'; + +const EDITOR_TEXT_TEMPLATES_FIELDS: Array = [ + { + label: '🔖 Text templates', + label_singular: '🔖 Text template', + name: 'templates', + widget: 'list', + summary: '{{fields.name}} - {{fields.text}}', + fields: [ + { + label: '🔖 Name', + name: 'name', + widget: 'string', + required: true, + }, + { + label: '📝 Text', + name: 'text', + widget: 'text', + required: true, + }, + ], + }, +]; + +export default EDITOR_TEXT_TEMPLATES_FIELDS; diff --git a/cms/src/index.ts b/cms/src/index.ts index 9c57678405..b61d373457 100644 --- a/cms/src/index.ts +++ b/cms/src/index.ts @@ -15,6 +15,7 @@ import { email, } from './collections/collections'; import {Widget as uniqueIdWidget} from './widgets/uniqueIdWidget'; +import textTemplates from './editorComponents.ts/textTemplates'; CMS.init({ config: { @@ -50,3 +51,4 @@ CMS.init({ CMS.registerWidget(uniqueIdWidget); CMS.registerMediaLibrary(cloudinary); +CMS.registerEditorComponent(textTemplates); diff --git a/cms/src/templates/editorTexts.json b/cms/src/templates/editorTexts.json new file mode 100644 index 0000000000..2d5898a7bd --- /dev/null +++ b/cms/src/templates/editorTexts.json @@ -0,0 +1,12 @@ +{ + "templates": [ + { + "name": "Fooo", + "text": "hej hopp foo i min hopp!" + }, + { + "name": "Meow?", + "text": "(199)*{200} $ < /5" + } + ] +} \ No newline at end of file From 50f5850458e4d0cc96fb9957a0bc9e8cb55223bd Mon Sep 17 00:00:00 2001 From: gewfy Date: Sun, 19 Nov 2023 17:06:27 +0100 Subject: [PATCH 2/3] Empty templates --- cms/src/templates/editorTexts.json | 13 ++----------- 1 file changed, 2 insertions(+), 11 deletions(-) diff --git a/cms/src/templates/editorTexts.json b/cms/src/templates/editorTexts.json index 2d5898a7bd..da024f7062 100644 --- a/cms/src/templates/editorTexts.json +++ b/cms/src/templates/editorTexts.json @@ -1,12 +1,3 @@ { - "templates": [ - { - "name": "Fooo", - "text": "hej hopp foo i min hopp!" - }, - { - "name": "Meow?", - "text": "(199)*{200} $ < /5" - } - ] -} \ No newline at end of file + "templates": [] +} From 7c38b72dec3a2876e468dad80ff7fd7422dd24a6 Mon Sep 17 00:00:00 2001 From: gewfy Date: Sun, 19 Nov 2023 17:10:09 +0100 Subject: [PATCH 3/3] Add test template --- cms/src/fields/templates.ts | 1 + cms/src/templates/editorTexts.json | 9 +++++++-- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/cms/src/fields/templates.ts b/cms/src/fields/templates.ts index cc615730d4..0a9a338779 100644 --- a/cms/src/fields/templates.ts +++ b/cms/src/fields/templates.ts @@ -7,6 +7,7 @@ const EDITOR_TEXT_TEMPLATES_FIELDS: Array = [ name: 'templates', widget: 'list', summary: '{{fields.name}} - {{fields.text}}', + min: 1, fields: [ { label: '🔖 Name', diff --git a/cms/src/templates/editorTexts.json b/cms/src/templates/editorTexts.json index da024f7062..5423f00fbb 100644 --- a/cms/src/templates/editorTexts.json +++ b/cms/src/templates/editorTexts.json @@ -1,3 +1,8 @@ { - "templates": [] -} + "templates": [ + { + "name": "Test template", + "text": "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque dapibus elit ac orci malesuada, eu euismod lorem porttitor. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Quisque non tortor sed felis viverra aliquam. Maecenas iaculis tempor quam, eget eleifend nulla lacinia id. Sed sagittis tortor quis nisl vestibulum, vel consequat mauris finibus. Aenean ac elementum mauris. Praesent sed lorem aliquam, rutrum est non, maximus lectus. Aliquam eget dui euismod, accumsan sapien interdum, tincidunt dui. Nullam vel egestas erat.\n\nPellentesque quis elit sapien. Etiam rhoncus accumsan orci, eu dapibus mi mollis et. Maecenas ultrices bibendum tristique. Aliquam rhoncus sem eget tristique porttitor. Praesent bibendum id est vel dictum. Aliquam blandit bibendum convallis. Donec blandit pulvinar tempus. Suspendisse iaculis diam et consequat auctor. Morbi ac elit varius, gravida tellus vel, dictum nisi. Praesent mattis posuere euismod. Integer tempus luctus mauris et ullamcorper.\n\nMauris faucibus tempus neque, nec tincidunt dolor commodo quis. Duis non scelerisque risus. Nam suscipit mattis nisi, non dictum ex auctor nec. Vestibulum ut ultricies enim, eget congue nulla. Ut quis suscipit tellus, ac venenatis eros. Donec leo elit, euismod eu erat eu, mattis suscipit nunc. Suspendisse potenti." + } + ] +} \ No newline at end of file