From ebf09c1e0a41dd088f5b647fdbc0844a266be792 Mon Sep 17 00:00:00 2001 From: ETLaurent Date: Wed, 28 Sep 2022 15:03:14 +0200 Subject: [PATCH 01/13] display placeholder for modal-driven widgets (#3882) --- modules/@apostrophecms/area/index.js | 3 +++ .../ui/apos/components/AposAreaEditor.vue | 12 +++++++++++- modules/@apostrophecms/widget-type/index.js | 3 ++- .../ui/apos/components/AposWidget.vue | 19 +++++++++++++++++-- .../ui/apos/mixins/AposWidgetMixin.js | 15 +++++++++++++++ 5 files changed, 48 insertions(+), 4 deletions(-) diff --git a/modules/@apostrophecms/area/index.js b/modules/@apostrophecms/area/index.js index 90460abd26..0bec89ed59 100644 --- a/modules/@apostrophecms/area/index.js +++ b/modules/@apostrophecms/area/index.js @@ -554,6 +554,7 @@ module.exports = { const widgetEditors = {}; const widgetManagers = {}; const widgetIsContextual = {}; + const widgetHasInitialModal = {}; const contextualWidgetDefaultData = {}; _.each(self.widgetManagers, function (manager, name) { @@ -563,6 +564,7 @@ module.exports = { widgetEditors[name] = (browserData && browserData.components && browserData.components.widgetEditor) || 'AposWidgetEditor'; widgetManagers[name] = manager.__meta.name; widgetIsContextual[name] = manager.options.contextual; + widgetHasInitialModal[name] = manager.options.initialModal !== false; contextualWidgetDefaultData[name] = manager.options.defaultData; }); @@ -573,6 +575,7 @@ module.exports = { widgetEditors }, widgetIsContextual, + widgetHasInitialModal, contextualWidgetDefaultData, widgetManagers, action: self.action diff --git a/modules/@apostrophecms/area/ui/apos/components/AposAreaEditor.vue b/modules/@apostrophecms/area/ui/apos/components/AposAreaEditor.vue index 13b6e7d271..b480591940 100644 --- a/modules/@apostrophecms/area/ui/apos/components/AposAreaEditor.vue +++ b/modules/@apostrophecms/area/ui/apos/components/AposAreaEditor.vue @@ -422,12 +422,19 @@ export default { } else if (this.widgetIsContextual(name)) { return this.insert({ widget: { - _id: cuid(), type: name, ...this.contextualWidgetDefaultData(name) }, index }); + } else if (!this.widgetHasInitialModal(name)) { + return this.insert({ + widget: { + type: name, + aposPlaceholder: true + }, + index + }); } else { const componentName = this.widgetEditorComponent(name); apos.area.activeEditor = this; @@ -478,6 +485,9 @@ export default { widgetIsContextual(type) { return this.moduleOptions.widgetIsContextual[type]; }, + widgetHasInitialModal(type) { + return this.moduleOptions.widgetHasInitialModal[type]; + }, widgetEditorComponent(type) { return this.moduleOptions.components.widgetEditors[type]; }, diff --git a/modules/@apostrophecms/widget-type/index.js b/modules/@apostrophecms/widget-type/index.js index aa6ffce70c..2010c0d6ef 100644 --- a/modules/@apostrophecms/widget-type/index.js +++ b/modules/@apostrophecms/widget-type/index.js @@ -281,6 +281,7 @@ module.exports = { await self.apos.schema.convert(req, schema, input, output); output.metaType = 'widget'; output.type = self.name; + output.aposPlaceholder = self.apos.launder.boolean(input.aposPlaceholder); return output; }, @@ -348,7 +349,7 @@ module.exports = { action: self.action, schema: schema, contextual: self.options.contextual, - skipInitialModal: self.options.skipInitialModal, + placeholderClass: self.options.placeholderClass, className: self.options.className, components: self.options.components }); diff --git a/modules/@apostrophecms/widget-type/ui/apos/components/AposWidget.vue b/modules/@apostrophecms/widget-type/ui/apos/components/AposWidget.vue index a9ccc54d49..45cc583e6c 100644 --- a/modules/@apostrophecms/widget-type/ui/apos/components/AposWidget.vue +++ b/modules/@apostrophecms/widget-type/ui/apos/components/AposWidget.vue @@ -1,6 +1,9 @@ + + + diff --git a/modules/@apostrophecms/widget-type/ui/apos/mixins/AposWidgetMixin.js b/modules/@apostrophecms/widget-type/ui/apos/mixins/AposWidgetMixin.js index f3a18e074b..85e076faa6 100644 --- a/modules/@apostrophecms/widget-type/ui/apos/mixins/AposWidgetMixin.js +++ b/modules/@apostrophecms/widget-type/ui/apos/mixins/AposWidgetMixin.js @@ -62,6 +62,21 @@ export default { this.rendered = '

Unable to render this widget.

'; console.error('Unable to render widget. Possibly the schema has been changed and the existing widget does not pass validation.', e); } + }, + getClasses() { + const { placeholderClass } = this.moduleOptions; + + if (placeholderClass === false) { + return {}; + } + + const className = typeof placeholderClass === 'string' && placeholderClass.length + ? placeholderClass + : 'apos-placeholder'; + + return { + [className]: this.value.aposPlaceholder === true + }; } } }; From b5f189d2ed10429b94566d6af624360b03ea3f0c Mon Sep 17 00:00:00 2001 From: ETLaurent Date: Wed, 28 Sep 2022 15:26:37 +0200 Subject: [PATCH 02/13] display placeholders for custom widgets (#3886) --- modules/@apostrophecms/widget-type/index.js | 12 +- test/modules/placeholder-page/index.js | 19 + test/modules/placeholder-page/views/page.html | 3 + test/modules/placeholder-widget/index.js | 36 ++ .../placeholder-widget/views/widget.html | 5 + test/widgets.js | 355 ++++++++++++------ 6 files changed, 306 insertions(+), 124 deletions(-) create mode 100644 test/modules/placeholder-page/index.js create mode 100644 test/modules/placeholder-page/views/page.html create mode 100644 test/modules/placeholder-widget/index.js create mode 100644 test/modules/placeholder-widget/views/widget.html diff --git a/modules/@apostrophecms/widget-type/index.js b/modules/@apostrophecms/widget-type/index.js index 2010c0d6ef..7179d2c201 100644 --- a/modules/@apostrophecms/widget-type/index.js +++ b/modules/@apostrophecms/widget-type/index.js @@ -161,8 +161,18 @@ module.exports = { ...self.getWidgetsBundles(`${widget.type}-widget`) }; + const clonedWidget = { ...widget }; + + if (widget.aposPlaceholder === true) { + self.schema.forEach(field => { + if (!widget[field.name] && field.placeholder !== undefined) { + clonedWidget[field.name] = field.placeholder; + } + }); + } + return self.render(req, self.template, { - widget: widget, + widget: clonedWidget, options: options, manager: self, contextOptions: _with diff --git a/test/modules/placeholder-page/index.js b/test/modules/placeholder-page/index.js new file mode 100644 index 0000000000..41290d6a90 --- /dev/null +++ b/test/modules/placeholder-page/index.js @@ -0,0 +1,19 @@ +module.exports = { + extend: '@apostrophecms/page-type', + options: { + label: 'Placeholder Test Page' + }, + fields: { + add: { + main: { + type: 'area', + label: 'Main', + options: { + widgets: { + placeholder: {} + } + } + } + } + } +}; diff --git a/test/modules/placeholder-page/views/page.html b/test/modules/placeholder-page/views/page.html new file mode 100644 index 0000000000..9d29e585d7 --- /dev/null +++ b/test/modules/placeholder-page/views/page.html @@ -0,0 +1,3 @@ +

Placeholder Test Page

+ +{% area data.page, 'main' %} diff --git a/test/modules/placeholder-widget/index.js b/test/modules/placeholder-widget/index.js new file mode 100644 index 0000000000..2c3df61098 --- /dev/null +++ b/test/modules/placeholder-widget/index.js @@ -0,0 +1,36 @@ +module.exports = { + extend: '@apostrophecms/widget-type', + options: { + label: 'Placeholder Test Widget', + initialModal: false + }, + fields: { + add: { + string: { + type: 'string', + label: 'String', + placeholder: 'String PLACEHOLDER' + }, + integer: { + type: 'integer', + label: 'Integer', + placeholder: 0 + }, + float: { + type: 'float', + label: 'Float', + placeholder: 0.1 + }, + date: { + type: 'date', + label: 'Date', + placeholder: 'YYYY-MM-DD' + }, + time: { + type: 'time', + label: 'Time', + placeholder: 'HH:MM:SS' + } + } + } +}; diff --git a/test/modules/placeholder-widget/views/widget.html b/test/modules/placeholder-widget/views/widget.html new file mode 100644 index 0000000000..15f8fe7de1 --- /dev/null +++ b/test/modules/placeholder-widget/views/widget.html @@ -0,0 +1,5 @@ + diff --git a/test/widgets.js b/test/widgets.js index ed0a7ccee3..c2e7beb871 100644 --- a/test/widgets.js +++ b/test/widgets.js @@ -1,154 +1,263 @@ const t = require('../test-lib/test.js'); const assert = require('assert'); -let apos; - describe('Widgets', function() { + const getRenderArgs = (req, page) => ({ + outerLayout: '@apostrophecms/template:outerLayout.html', + permissions: req.user && (req.user._permissions || {}), + scene: 'apos', + refreshing: false, + query: req.query, + url: req.url, + page + }); + let apos; + let req; + let homePath; this.timeout(t.timeout); - after(async function() { - return t.destroy(apos); - }); - - it('should add test modules', async function() { + before(async function() { apos = await t.create({ root: module, modules: { 'args-bad-page': {}, 'args-good-page': {}, - 'args-widget': {} + 'args-widget': {}, + 'placeholder-page': {}, + 'placeholder-widget': {} } }); - assert(apos.modules['args-good-page']); - assert(apos.modules['args-bad-page']); - assert(apos.modules['args-widget']); - }); - let testItems; + req = apos.task.getAnonReq(); - it('should insert test documents', async function() { const home = await apos.page.find(apos.task.getAnonReq(), { level: 0 }).toObject(); + homePath = home._id.replace(':en:published', ''); + }); + + after(function() { + return t.destroy(apos); + }); + + describe('area tag', function() { + let testItems = []; - assert(home); - const homeId = home._id; - - testItems = [ - { - _id: 'goodPageId:en:published', - aposLocale: 'en:published', - aposDocId: 'goodPageId', - type: 'args-good-page', - slug: '/good-page', - visibility: 'public', - path: `${homeId.replace(':en:published', '')}/good-page`, - level: 1, - rank: 0, - main: { - _id: 'randomAreaId1', - items: [ - { - _id: 'randomWidgetId1', - snippet: 'You can control what happens when the text reaches the edges of its content area using its attributes.', - metaType: 'widget', - type: 'args' - } - ], - metaType: 'area' + before(async function() { + testItems = [ + { + _id: 'goodPageId:en:published', + aposLocale: 'en:published', + aposDocId: 'goodPageId', + type: 'args-good-page', + slug: '/good-page', + visibility: 'public', + path: `${homePath}/good-page`, + level: 1, + rank: 0, + metaType: 'doc', + main: { + _id: 'randomAreaId1', + items: [ + { + _id: 'randomWidgetId1', + snippet: 'You can control what happens when the text reaches the edges of its content area using its attributes.', + metaType: 'widget', + type: 'args' + } + ], + metaType: 'area' + } + }, + { + _id: 'badPageId:en:published', + aposLocale: 'en:published', + aposDocId: 'badPageId', + type: 'args-bad-page', + slug: '/bad-page', + visibility: 'public', + path: `${homePath}/bad-page`, + level: 1, + rank: 0, + metaType: 'doc', + main: { + _id: 'randomAreaId2', + items: [ + { + _id: 'randomWidgetId2', + snippet: 'You can control what happens when the text reaches the edges of its content area using its attributes.', + metaType: 'widget', + type: 'args' + } + ], + metaType: 'area' + } } - }, - { - _id: 'badPageId:en:published', - aposLocale: 'en:published', - aposDocId: 'badPageId', - type: 'args-bad-page', - slug: '/bad-page', - visibility: 'public', - path: `${homeId.replace(':en:published', '')}/bad-page`, - level: 1, - rank: 0, - main: { - _id: 'randomAreaId2', - items: [ - { - _id: 'randomWidgetId2', - snippet: 'You can control what happens when the text reaches the edges of its content area using its attributes.', - metaType: 'widget', - type: 'args' - } - ], - metaType: 'area' + ]; + + await apos.doc.db.insertMany(testItems.map(item => ({ + ...item, + aposLocale: item.aposLocale.replace(':published', ':draft'), + _id: item._id.replace(':published', ':draft') + }))); + + await apos.doc.db.insertMany(testItems); + }); + + after(async function() { + await apos.doc.db.deleteMany({ + aposDocId: { + $in: testItems.map(item => item.aposDocId) } - } - ]; + }); + }); - // Insert draft versions too to match the A3 data model - const draftItems = await apos.doc.db.insertMany(testItems.map(item => ({ - ...item, - aposLocale: item.aposLocale.replace(':published', ':draft'), - _id: item._id.replace(':published', ':draft') - }))); - assert(draftItems.result.ok === 1); - assert(draftItems.insertedCount === 2); + it('should be able to render page template with well constructed area tag', async function() { + const goodPageDoc = await apos.page.find(req, { slug: '/good-page' }).toObject(); - const items = await apos.doc.db.insertMany(testItems); + const args = getRenderArgs(req, goodPageDoc); + const result = await apos.modules['args-good-page'].render(req, 'page', args); - assert(items.result.ok === 1); - assert(items.insertedCount === 2); - }); + assert(result.includes('

Good args page

')); + assert(result.includes('

You can control what happens when the text reaches the edges of its content area using its attributes.

')); + assert(result.includes('
  • color: 🟣
  • ')); + }); - it('should be able to render page template with well constructed area tag', async function() { - const req = apos.task.getAnonReq(); + it('should error while trying to render page template with poorly constructed area tag', async function() { + const badPageDoc = await apos.page.find(req, { slug: '/bad-page' }).toObject(); - const goodPageDoc = await apos.page.find(req, { slug: '/good-page' }) - .toObject(); - goodPageDoc.metaType = 'doc'; + const args = getRenderArgs(req, badPageDoc); - const args = { - outerLayout: '@apostrophecms/template:outerLayout.html', - permissions: req.user && (req.user._permissions || {}), - scene: 'apos', - refreshing: false, - query: req.query, - url: req.url, - page: goodPageDoc - }; + try { + await apos.modules['args-bad-page'].render(req, 'page', args); - let result; - try { - result = await apos.modules['args-good-page'].render(req, 'page', args); - } catch (error) { - assert(false); - } - - assert(result.indexOf('

    Good args page

    ') !== -1); - assert(result.indexOf('

    You can control what happens when the text reaches the edges of its content area using its attributes.

    ') !== -1); - assert(result.indexOf('
  • color: 🟣
  • ') !== -1); + assert(false); + } catch (error) { + assert(error.toString().includes('Too many arguments were passed')); + } + }); }); - it('should error while trying to render page template with poorly constructed area tag', async function() { - const req = apos.task.getAnonReq(); - - const badPageDoc = await apos.page.find(req, { slug: '/bad-page' }) - .toObject(); - badPageDoc.metaType = 'doc'; - - const args = { - outerLayout: '@apostrophecms/template:outerLayout.html', - permissions: req.user && (req.user._permissions || {}), - scene: 'apos', - refreshing: false, - query: req.query, - url: req.url, - page: badPageDoc - }; - - try { - await apos.modules['args-bad-page'].render(req, 'page', args); - - assert(false); - } catch (error) { - assert(error.toString().indexOf('Too many arguments were passed') !== -1); - } + describe('placeholders', function() { + let testItems = []; + let result; + + before(async function() { + const widgetBaseData = { + metaType: 'widget', + type: 'placeholder' + }; + const widgetData = { + ...widgetBaseData, + string: 'Some string', + integer: 2, + float: 2.2, + date: '2022-09-21', + time: '15:39:12' + }; + testItems = [ + { + _id: 'placeholder-page:en:published', + aposLocale: 'en:published', + aposDocId: 'placeholder-page', + type: 'placeholder-page', + slug: '/placeholder-page', + visibility: 'public', + path: `${homePath}/placeholder-page`, + level: 1, + rank: 0, + metaType: 'doc', + main: { + _id: 'area1', + items: [ + { + _id: 'widget1', + ...widgetBaseData, + aposPlaceholder: true + }, + { + _id: 'widget2', + ...widgetBaseData, + aposPlaceholder: false + }, + { + _id: 'widget3', + ...widgetBaseData + }, + { + _id: 'widget4', + ...widgetData + }, + { + _id: 'widget5', + ...widgetData, + aposPlaceholder: true + } + ], + metaType: 'area' + } + } + ]; + + await apos.doc.db.insertMany(testItems.map(item => ({ + ...item, + aposLocale: item.aposLocale.replace(':published', ':draft'), + _id: item._id.replace(':published', ':draft') + }))); + + await apos.doc.db.insertMany(testItems); + + const page = await apos.page.find(req, { slug: '/placeholder-page' }).toObject(); + + const args = getRenderArgs(req, page); + result = await apos.modules['placeholder-page'].render(req, 'page', args); + }); + + after(async function() { + await apos.doc.db.deleteMany({ + aposDocId: { + $in: testItems.map(item => item.aposDocId) + } + }); + }); + + it('should render the placeholders when widget\'s `aposPlaceholder` doc field is `true`', function() { + assert(result.includes('
  • widget1 - aposPlaceholder: true
  • ')); + assert(result.includes('
  • widget1 - string: String PLACEHOLDER
  • ')); + assert(result.includes('
  • widget1 - integer: 0
  • ')); + assert(result.includes('
  • widget1 - float: 0.1
  • ')); + assert(result.includes('
  • widget1 - date: YYYY-MM-DD
  • ')); + assert(result.includes('
  • widget1 - time: HH:MM:SS
  • ')); + }); + + it('should not render the placeholders when widget\'s `aposPlaceholder` doc field is `false`', function() { + assert(result.includes('
  • widget2 - aposPlaceholder: false
  • ')); + assert(!result.includes('
  • widget2 - string: String PLACEHOLDER
  • ')); + assert(!result.includes('
  • widget2 - integer: 0
  • ')); + assert(!result.includes('
  • widget2 - float: 0.1
  • ')); + assert(!result.includes('
  • widget2 - date: YYYY-MM-DD
  • ')); + assert(!result.includes('
  • widget2 - time: HH:MM:SS
  • ')); + }); + + it('should not render the placeholders when widget\'s `aposPlaceholder` doc field is not defined', function() { + assert(!result.includes('
  • widget3 - string: String PLACEHOLDER
  • ')); + assert(!result.includes('
  • widget3 - integer: 0
  • ')); + assert(!result.includes('
  • widget3 - float: 0.1
  • ')); + assert(!result.includes('
  • widget3 - date: YYYY-MM-DD
  • ')); + assert(!result.includes('
  • widget3 - time: HH:MM:SS
  • ')); + + assert(result.includes('
  • widget4 - string: Some string
  • ')); + assert(result.includes('
  • widget4 - integer: 2
  • ')); + assert(result.includes('
  • widget4 - float: 2.2
  • ')); + assert(result.includes('
  • widget4 - date: 2022-09-21
  • ')); + assert(result.includes('
  • widget4 - time: 15:39:12
  • ')); + }); + + it('should not render the placeholders when widget\'s fields are defined', function() { + assert(result.includes('
  • widget5 - string: Some string
  • ')); + assert(result.includes('
  • widget5 - integer: 2
  • ')); + assert(result.includes('
  • widget5 - float: 2.2
  • ')); + assert(result.includes('
  • widget5 - date: 2022-09-21
  • ')); + assert(result.includes('
  • widget5 - time: 15:39:12
  • ')); + }); }); }); From 0502b8cfb46804ed80ee78c1f749d3828b28a2b1 Mon Sep 17 00:00:00 2001 From: ETLaurent Date: Wed, 28 Sep 2022 15:29:26 +0200 Subject: [PATCH 03/13] display placeholder for rich-text-widget (#3888) --- modules/@apostrophecms/i18n/i18n/en.json | 1 + modules/@apostrophecms/i18n/i18n/es.json | 1 + modules/@apostrophecms/i18n/i18n/fr.json | 1 + modules/@apostrophecms/i18n/i18n/pt-BR.json | 1 + modules/@apostrophecms/i18n/i18n/sk.json | 1 + .../@apostrophecms/rich-text-widget/index.js | 4 +- .../components/AposRichTextWidgetEditor.vue | 84 ++++++++++++++++--- package.json | 9 +- 8 files changed, 86 insertions(+), 16 deletions(-) diff --git a/modules/@apostrophecms/i18n/i18n/en.json b/modules/@apostrophecms/i18n/i18n/en.json index 3611e1c773..41b5dad453 100644 --- a/modules/@apostrophecms/i18n/i18n/en.json +++ b/modules/@apostrophecms/i18n/i18n/en.json @@ -263,6 +263,7 @@ "richTextItalic": "Italic", "richTextLink": "Link", "richTextParagraph": "Paragraph (P)", + "richTextPlaceholder": "Start Typing Here...", "richTextH2": "Heading 2 (H2)", "richTextH3": "Heading 3 (H3)", "richTextH4": "Heading 4 (H4)", diff --git a/modules/@apostrophecms/i18n/i18n/es.json b/modules/@apostrophecms/i18n/i18n/es.json index dc670f239f..114e7e225a 100644 --- a/modules/@apostrophecms/i18n/i18n/es.json +++ b/modules/@apostrophecms/i18n/i18n/es.json @@ -242,6 +242,7 @@ "richTextItalic": "Cursiva", "richTextLink": "Liga", "richTextParagraph": "Párrafo (P)", + "richTextPlaceholder": "Comience a escribir aquí...", "richTextH2": "Título 2 (H2)", "richTextH3": "Título 3 (H3)", "richTextH4": "Título 4 (H4)", diff --git a/modules/@apostrophecms/i18n/i18n/fr.json b/modules/@apostrophecms/i18n/i18n/fr.json index 726d6da0b4..ed2694f783 100644 --- a/modules/@apostrophecms/i18n/i18n/fr.json +++ b/modules/@apostrophecms/i18n/i18n/fr.json @@ -249,6 +249,7 @@ "richTextItalic": "Italique", "richTextLink": "Lien", "richTextParagraph": "Paragraphe (P)", + "richTextPlaceholder": "Commencez à écrire ici...", "richTextH2": "Titre de niveau 2 (H2)", "richTextH3": "Titre de niveau 3 (H3)", "richTextH4": "Titre de niveau 4 (H4)", diff --git a/modules/@apostrophecms/i18n/i18n/pt-BR.json b/modules/@apostrophecms/i18n/i18n/pt-BR.json index bf770b1a30..70c23ba0fc 100644 --- a/modules/@apostrophecms/i18n/i18n/pt-BR.json +++ b/modules/@apostrophecms/i18n/i18n/pt-BR.json @@ -240,6 +240,7 @@ "richTextItalic": "Itálico", "richTextLink": "Link", "richTextParagraph": "Parágrafo (P)", + "richTextPlaceholder": "Comece a digitar aqui...", "richTextH2": "Título 2 (H2)", "richTextH3": "Título 3 (H3)", "richTextH4": "Título 4 (H4)", diff --git a/modules/@apostrophecms/i18n/i18n/sk.json b/modules/@apostrophecms/i18n/i18n/sk.json index a7ba795d1d..4019a1594d 100644 --- a/modules/@apostrophecms/i18n/i18n/sk.json +++ b/modules/@apostrophecms/i18n/i18n/sk.json @@ -252,6 +252,7 @@ "richTextItalic": "Kurzíva", "richTextLink": "Link", "richTextParagraph": "Odstavec (P)", + "richTextPlaceholder": "Začnite písať tu...", "richTextH2": "Nadpis 2 (H2)", "richTextH3": "Nadpis 3 (H3)", "richTextH4": "Nadpis 4 (H4)", diff --git a/modules/@apostrophecms/rich-text-widget/index.js b/modules/@apostrophecms/rich-text-widget/index.js index 863e8a8ffe..f85c707f10 100644 --- a/modules/@apostrophecms/rich-text-widget/index.js +++ b/modules/@apostrophecms/rich-text-widget/index.js @@ -9,6 +9,7 @@ module.exports = { icon: 'format-text-icon', label: 'apostrophe:richText', contextual: true, + placeholderText: 'apostrophe:richTextPlaceholder', defaultData: { content: '' }, className: false, minimumDefaultOptions: { @@ -417,7 +418,8 @@ module.exports = { tools: self.options.editorTools, defaultOptions: self.options.defaultOptions, tiptapTextCommands: self.options.tiptapTextCommands, - tiptapTypes: self.options.tiptapTypes + tiptapTypes: self.options.tiptapTypes, + placeholderText: self.options.placeholderText }; return finalData; } diff --git a/modules/@apostrophecms/rich-text-widget/ui/apos/components/AposRichTextWidgetEditor.vue b/modules/@apostrophecms/rich-text-widget/ui/apos/components/AposRichTextWidgetEditor.vue index 8ed9002c32..eacef9f22c 100644 --- a/modules/@apostrophecms/rich-text-widget/ui/apos/components/AposRichTextWidgetEditor.vue +++ b/modules/@apostrophecms/rich-text-widget/ui/apos/components/AposRichTextWidgetEditor.vue @@ -28,7 +28,10 @@
    -
    +
    {{ $t('apostrophe:emptyRichTextWidget') }}
    @@ -45,6 +48,8 @@ import TextAlign from '@tiptap/extension-text-align'; import Highlight from '@tiptap/extension-highlight'; import TextStyle from '@tiptap/extension-text-style'; import Underline from '@tiptap/extension-underline'; +import Placeholder from '@tiptap/extension-placeholder'; + export default { name: 'AposRichTextWidgetEditor', components: { @@ -88,7 +93,9 @@ export default { }, hasErrors: false }, - pending: null + pending: null, + isFocused: null, + showPlaceholder: null }; }, computed: { @@ -158,6 +165,9 @@ export default { tiptapTypes() { return this.moduleOptions.tiptapTypes; }, + placeholderText() { + return this.moduleOptions.placeholderText; + }, aposTiptapExtensions() { return (apos.tiptapExtensions || []) .map(extension => extension({ @@ -176,19 +186,63 @@ export default { } }, mounted() { + const extensions = [ + StarterKit, + TextAlign.configure({ + types: [ 'heading', 'paragraph' ] + }), + Highlight, + TextStyle, + Underline, + + // For this contextual widget, no need to check `widget.aposPlaceholder` value + // since `placeholderText` option is enough to decide whether to display it or not. + this.placeholderText && Placeholder.configure({ + placeholder: () => { + // Avoid brief display of the placeholder when loading the page. + if (this.isFocused === null) { + return ''; + } + + // Display placeholder after loading the page. + if (this.showPlaceholder === null) { + return this.$t(this.placeholderText); + } + + return this.showPlaceholder ? this.$t(this.placeholderText) : ''; + } + }) + ] + .filter(Boolean) + .concat(this.aposTiptapExtensions); + this.editor = new Editor({ content: this.initialContent, autofocus: this.autofocus, onUpdate: this.editorUpdate, - extensions: [ - StarterKit, - TextAlign.configure({ - types: [ 'heading', 'paragraph' ] - }), - Highlight, - TextStyle, - Underline - ].concat(this.aposTiptapExtensions) + extensions, + + // The following events are triggered: + // - before the placeholder configuration function, when loading the page + // - after it, once the page is loaded and we interact with the editors + // To solve this issue, use another `this.showPlaceholder` variable + // and toggle it after the placeholder configuration function is called, + // thanks to nextTick. + // The proper thing would be to call nextTick inside the placeholder + // function so that it can rely on the focus state set by these event + // listeners, but the placeholder function is called synchronously... + onFocus: () => { + this.isFocused = true; + this.$nextTick(() => { + this.showPlaceholder = false; + }); + }, + onBlur: () => { + this.isFocused = false; + this.$nextTick(() => { + this.showPlaceholder = true; + }); + } }); }, @@ -336,6 +390,14 @@ export default { outline: none; } + .apos-rich-text-editor__editor ::v-deep .ProseMirror p.is-empty:first-child::before { + content: attr(data-placeholder); + float: left; + pointer-events: none; + height: 0; + color: var(--a-base-4); + } + .apos-rich-text-editor__editor { @include apos-transition(); position: relative; diff --git a/package.json b/package.json index a279ca9e30..352a99658d 100644 --- a/package.json +++ b/package.json @@ -35,6 +35,7 @@ "@opentelemetry/semantic-conventions": "^1.0.1", "@tiptap/extension-highlight": "^2.0.0-beta.33", "@tiptap/extension-link": "^2.0.0-beta.38", + "@tiptap/extension-placeholder": "^2.0.0-beta.196", "@tiptap/extension-text-align": "^2.0.0-beta.29", "@tiptap/extension-text-style": "^2.0.0-beta.23", "@tiptap/extension-underline": "^2.0.0-beta.23", @@ -124,16 +125,16 @@ "eslint-config-apostrophe": "^3.4.0", "eslint-plugin-n": "^15.2.1", "eslint-plugin-node": "^11.1.0", + "eslint-plugin-promise": "^5.1.0", "eslint-plugin-vue": "^7.9.0", "mocha": "^9.1.2", "nyc": "^15.1.0", "replace-in-file": "^6.1.0", - "vue-eslint-parser": "^7.1.1", - "webpack-bundle-analyzer": "^3.9.0", - "eslint-plugin-promise": "^5.1.0", "stylelint": "^14.6.1", "stylelint-declaration-strict-value": "^1.8.0", - "stylelint-order": "^5.0.0" + "stylelint-order": "^5.0.0", + "vue-eslint-parser": "^7.1.1", + "webpack-bundle-analyzer": "^3.9.0" }, "browserslist": [ "ie >= 10" From e9dc3462a00850b42dd44a07efd143292f9cc3c7 Mon Sep 17 00:00:00 2001 From: ETLaurent Date: Wed, 28 Sep 2022 16:06:46 +0200 Subject: [PATCH 04/13] display default area-specific widget content (#3891) --- .../area/ui/apos/components/AposAreaEditor.vue | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/modules/@apostrophecms/area/ui/apos/components/AposAreaEditor.vue b/modules/@apostrophecms/area/ui/apos/components/AposAreaEditor.vue index b480591940..0f02ca60c3 100644 --- a/modules/@apostrophecms/area/ui/apos/components/AposAreaEditor.vue +++ b/modules/@apostrophecms/area/ui/apos/components/AposAreaEditor.vue @@ -423,7 +423,8 @@ export default { return this.insert({ widget: { type: name, - ...this.contextualWidgetDefaultData(name) + ...this.contextualWidgetDefaultData(name), + ...this.widgetAreaDefaultData(name) }, index }); @@ -431,7 +432,8 @@ export default { return this.insert({ widget: { type: name, - aposPlaceholder: true + aposPlaceholder: true, + ...this.widgetAreaDefaultData(name) }, index }); @@ -439,7 +441,7 @@ export default { const componentName = this.widgetEditorComponent(name); apos.area.activeEditor = this; const widget = await apos.modal.execute(componentName, { - value: null, + value: this.widgetAreaDefaultData(name), options: this.options.widgets[name], type: name, docId: this.docId @@ -456,6 +458,9 @@ export default { contextualWidgetDefaultData(type) { return this.moduleOptions.contextualWidgetDefaultData[type]; }, + widgetAreaDefaultData(type) { + return this.options.widgets[type]._def || null; + }, async insert({ index, widget }) { if (!widget._id) { widget._id = cuid(); From ae570fa04329b6be8b202679d1da45c805a319cb Mon Sep 17 00:00:00 2001 From: ETLaurent Date: Thu, 29 Sep 2022 11:14:17 +0200 Subject: [PATCH 05/13] display placeholder for image-widget (#3884) --- modules/@apostrophecms/i18n/i18n/en.json | 1 + modules/@apostrophecms/i18n/i18n/es.json | 1 + modules/@apostrophecms/i18n/i18n/fr.json | 1 + modules/@apostrophecms/i18n/i18n/pt-BR.json | 1 + modules/@apostrophecms/i18n/i18n/sk.json | 1 + modules/@apostrophecms/image-widget/index.js | 5 +- .../image-widget/public/placeholder.jpg | Bin 0 -> 205757 bytes .../image-widget/ui/src/index.scss | 3 + .../image-widget/views/widget.html | 62 ++-- test/modules/placeholder-page/index.js | 3 +- test/widgets.js | 287 ++++++++++++------ 11 files changed, 242 insertions(+), 123 deletions(-) create mode 100644 modules/@apostrophecms/image-widget/public/placeholder.jpg create mode 100644 modules/@apostrophecms/image-widget/ui/src/index.scss diff --git a/modules/@apostrophecms/i18n/i18n/en.json b/modules/@apostrophecms/i18n/i18n/en.json index 41b5dad453..25e6fc52ec 100644 --- a/modules/@apostrophecms/i18n/i18n/en.json +++ b/modules/@apostrophecms/i18n/i18n/en.json @@ -161,6 +161,7 @@ "home": "Home", "image": "Image", "imageFile": "Image File", + "imagePlaceholder": "Image placeholder", "imageTag": "Image Tag", "imageTags": "Image Tags", "images": "Images", diff --git a/modules/@apostrophecms/i18n/i18n/es.json b/modules/@apostrophecms/i18n/i18n/es.json index 114e7e225a..f16296c74c 100644 --- a/modules/@apostrophecms/i18n/i18n/es.json +++ b/modules/@apostrophecms/i18n/i18n/es.json @@ -150,6 +150,7 @@ "home": "Inicio", "image": "Imagen", "imageFile": "Archivo de Imagen", + "imagePlaceholder": "Marcador de posición de imagen", "imageTag": "Etiqueta de Imagen", "imageTags": "Etiquetas de Imágenes", "images": "Imágenes", diff --git a/modules/@apostrophecms/i18n/i18n/fr.json b/modules/@apostrophecms/i18n/i18n/fr.json index ed2694f783..c972a68b19 100644 --- a/modules/@apostrophecms/i18n/i18n/fr.json +++ b/modules/@apostrophecms/i18n/i18n/fr.json @@ -148,6 +148,7 @@ "home": "Accueil", "image": "Image", "imageFile": "Fichier d'image", + "imagePlaceholder": "Espace réservé pour l'image", "imageTag": "Tag d'image", "imageTags": "Tags d'image", "images": "Images", diff --git a/modules/@apostrophecms/i18n/i18n/pt-BR.json b/modules/@apostrophecms/i18n/i18n/pt-BR.json index 70c23ba0fc..b2f1b7903e 100644 --- a/modules/@apostrophecms/i18n/i18n/pt-BR.json +++ b/modules/@apostrophecms/i18n/i18n/pt-BR.json @@ -150,6 +150,7 @@ "home": "Home", "image": "Imagem", "imageFile": "Arquivo de Imagem", + "imagePlaceholder": "Espaço reservado para imagem", "imageTag": "Tag de Imagem", "imageTags": "Tags de Imagem", "images": "Imagens", diff --git a/modules/@apostrophecms/i18n/i18n/sk.json b/modules/@apostrophecms/i18n/i18n/sk.json index 4019a1594d..b616a197de 100644 --- a/modules/@apostrophecms/i18n/i18n/sk.json +++ b/modules/@apostrophecms/i18n/i18n/sk.json @@ -154,6 +154,7 @@ "home": "Domovská stránka", "image": "Obrázok", "imageFile": "Súbor s obrázkom", + "imagePlaceholder": "Zástupný symbol obrázka", "imageTag": "Značku obrázku", "imageTags": "Značky obrázkov", "images": "Obrázky", diff --git a/modules/@apostrophecms/image-widget/index.js b/modules/@apostrophecms/image-widget/index.js index 0be96522a5..b591f03ba9 100644 --- a/modules/@apostrophecms/image-widget/index.js +++ b/modules/@apostrophecms/image-widget/index.js @@ -4,7 +4,10 @@ module.exports = { label: 'apostrophe:image', className: false, icon: 'image-icon', - dimensionAttrs: false + dimensionAttrs: false, + initialModal: false, + placeholderClass: false, + placeholderUrl: '/modules/@apostrophecms/image-widget/placeholder.jpg' }, fields: { add: { diff --git a/modules/@apostrophecms/image-widget/public/placeholder.jpg b/modules/@apostrophecms/image-widget/public/placeholder.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a6c581a727a3155a0e6d5c030774bda4bbd1f0cc GIT binary patch literal 205757 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 +{% else %} + {% if data.options.className %} + {% set className = data.options.className %} + {% elif data.manager.options.className %} + {% set className = data.manager.options.className %} + {% endif %} -{% if data.options.dimensionAttrs %} - {% set dimensionAttrs = data.options.dimensionAttrs %} -{% elif data.manager.options.dimensionAttrs %} - {% set dimensionAttrs = data.manager.options.dimensionAttrs %} -{% endif %} + {% if data.options.dimensionAttrs %} + {% set dimensionAttrs = data.options.dimensionAttrs %} + {% elif data.manager.options.dimensionAttrs %} + {% set dimensionAttrs = data.manager.options.dimensionAttrs %} + {% endif %} -{% set attachment = apos.image.first(data.widget._image) %} + {% set attachment = apos.image.first(data.widget._image) %} -{% if attachment %} - {{ attachment._alt or '' }} + {% if attachment %} + {{ attachment._alt or '' }} + {% endif %} {% endif %} diff --git a/test/modules/placeholder-page/index.js b/test/modules/placeholder-page/index.js index 41290d6a90..299496113b 100644 --- a/test/modules/placeholder-page/index.js +++ b/test/modules/placeholder-page/index.js @@ -10,7 +10,8 @@ module.exports = { label: 'Main', options: { widgets: { - placeholder: {} + placeholder: {}, + '@apostrophecms/image': {} } } } diff --git a/test/widgets.js b/test/widgets.js index c2e7beb871..48a8ef43ac 100644 --- a/test/widgets.js +++ b/test/widgets.js @@ -1,5 +1,6 @@ const t = require('../test-lib/test.js'); const assert = require('assert'); +const { JSDOM } = require('jsdom'); describe('Widgets', function() { const getRenderArgs = (req, page) => ({ @@ -138,10 +139,40 @@ describe('Widgets', function() { }); describe('placeholders', function() { - let testItems = []; - let result; + const insertPage = async (apos, homePath, widgets) => { + const page = { + _id: 'placeholder-page:en:published', + aposLocale: 'en:published', + aposDocId: 'placeholder-page', + type: 'placeholder-page', + slug: '/placeholder-page', + visibility: 'public', + path: `${homePath}/placeholder-page`, + level: 1, + rank: 0, + metaType: 'doc', + main: { + _id: 'area1', + items: widgets, + metaType: 'area' + } + }; - before(async function() { + await apos.doc.db.insertOne(page); + await apos.doc.db.insertOne({ + ...page, + aposLocale: page.aposLocale.replace(':published', ':draft'), + _id: page._id.replace(':published', ':draft') + }); + }; + + const deletePage = async (apos, page) => { + await apos.doc.db.deleteMany({ + aposDocId: page.aposDocId + }); + }; + + describe('custom widget', function() { const widgetBaseData = { metaType: 'widget', type: 'placeholder' @@ -154,110 +185,178 @@ describe('Widgets', function() { date: '2022-09-21', time: '15:39:12' }; - testItems = [ - { - _id: 'placeholder-page:en:published', - aposLocale: 'en:published', - aposDocId: 'placeholder-page', - type: 'placeholder-page', - slug: '/placeholder-page', - visibility: 'public', - path: `${homePath}/placeholder-page`, - level: 1, - rank: 0, - metaType: 'doc', - main: { - _id: 'area1', - items: [ - { - _id: 'widget1', - ...widgetBaseData, - aposPlaceholder: true - }, - { - _id: 'widget2', - ...widgetBaseData, - aposPlaceholder: false - }, - { - _id: 'widget3', - ...widgetBaseData - }, - { - _id: 'widget4', - ...widgetData - }, - { - _id: 'widget5', - ...widgetData, - aposPlaceholder: true - } - ], - metaType: 'area' + + let page; + let result; + + before(async function() { + const widgets = [ + { + _id: 'widget1', + ...widgetBaseData, + aposPlaceholder: true + }, + { + _id: 'widget2', + ...widgetBaseData, + aposPlaceholder: false + }, + { + _id: 'widget3', + ...widgetBaseData + }, + { + _id: 'widget4', + ...widgetData + }, + { + _id: 'widget5', + ...widgetData, + aposPlaceholder: true } - } - ]; + ]; - await apos.doc.db.insertMany(testItems.map(item => ({ - ...item, - aposLocale: item.aposLocale.replace(':published', ':draft'), - _id: item._id.replace(':published', ':draft') - }))); + await insertPage(apos, homePath, widgets); + page = await apos.page.find(req, { slug: '/placeholder-page' }).toObject(); - await apos.doc.db.insertMany(testItems); + const args = getRenderArgs(req, page); + result = await apos.modules['placeholder-page'].render(req, 'page', args); + }); - const page = await apos.page.find(req, { slug: '/placeholder-page' }).toObject(); + after(async function() { + await deletePage(apos, page); + }); - const args = getRenderArgs(req, page); - result = await apos.modules['placeholder-page'].render(req, 'page', args); + it('should render the placeholders when widget\'s `aposPlaceholder` doc field is `true`', function() { + assert(result.includes('

  • widget1 - aposPlaceholder: true
  • ')); + assert(result.includes('
  • widget1 - string: String PLACEHOLDER
  • ')); + assert(result.includes('
  • widget1 - integer: 0
  • ')); + assert(result.includes('
  • widget1 - float: 0.1
  • ')); + assert(result.includes('
  • widget1 - date: YYYY-MM-DD
  • ')); + assert(result.includes('
  • widget1 - time: HH:MM:SS
  • ')); + }); + + it('should not render the placeholders when widget\'s `aposPlaceholder` doc field is `false`', function() { + assert(result.includes('
  • widget2 - aposPlaceholder: false
  • ')); + assert(!result.includes('
  • widget2 - string: String PLACEHOLDER
  • ')); + assert(!result.includes('
  • widget2 - integer: 0
  • ')); + assert(!result.includes('
  • widget2 - float: 0.1
  • ')); + assert(!result.includes('
  • widget2 - date: YYYY-MM-DD
  • ')); + assert(!result.includes('
  • widget2 - time: HH:MM:SS
  • ')); + }); + + it('should not render the placeholders when widget\'s `aposPlaceholder` doc field is not defined', function() { + assert(!result.includes('
  • widget3 - string: String PLACEHOLDER
  • ')); + assert(!result.includes('
  • widget3 - integer: 0
  • ')); + assert(!result.includes('
  • widget3 - float: 0.1
  • ')); + assert(!result.includes('
  • widget3 - date: YYYY-MM-DD
  • ')); + assert(!result.includes('
  • widget3 - time: HH:MM:SS
  • ')); + + assert(result.includes('
  • widget4 - string: Some string
  • ')); + assert(result.includes('
  • widget4 - integer: 2
  • ')); + assert(result.includes('
  • widget4 - float: 2.2
  • ')); + assert(result.includes('
  • widget4 - date: 2022-09-21
  • ')); + assert(result.includes('
  • widget4 - time: 15:39:12
  • ')); + }); + + it('should not render the placeholders when widget\'s fields are defined', function() { + assert(result.includes('
  • widget5 - string: Some string
  • ')); + assert(result.includes('
  • widget5 - integer: 2
  • ')); + assert(result.includes('
  • widget5 - float: 2.2
  • ')); + assert(result.includes('
  • widget5 - date: 2022-09-21
  • ')); + assert(result.includes('
  • widget5 - time: 15:39:12
  • ')); + }); }); - after(async function() { - await apos.doc.db.deleteMany({ - aposDocId: { - $in: testItems.map(item => item.aposDocId) + describe('image widget', function() { + const widgetBaseData = { + metaType: 'widget', + type: '@apostrophecms/image' + }; + const widgets = [ + { + _id: 'widget1', + ...widgetBaseData, + aposPlaceholder: true + }, + { + _id: 'widget2', + ...widgetBaseData, + aposPlaceholder: false + }, + { + _id: 'widget3', + ...widgetBaseData } + ]; + + let page; + let result; + + before(async function() { + await insertPage(apos, homePath, widgets); + page = await apos.page.find(req, { slug: '/placeholder-page' }).toObject(); + + const args = getRenderArgs(req, page); + result = await apos.modules['placeholder-page'].render(req, 'page', args); }); - }); - it('should render the placeholders when widget\'s `aposPlaceholder` doc field is `true`', function() { - assert(result.includes('
  • widget1 - aposPlaceholder: true
  • ')); - assert(result.includes('
  • widget1 - string: String PLACEHOLDER
  • ')); - assert(result.includes('
  • widget1 - integer: 0
  • ')); - assert(result.includes('
  • widget1 - float: 0.1
  • ')); - assert(result.includes('
  • widget1 - date: YYYY-MM-DD
  • ')); - assert(result.includes('
  • widget1 - time: HH:MM:SS
  • ')); - }); + after(async function() { + await deletePage(apos, page); + }); - it('should not render the placeholders when widget\'s `aposPlaceholder` doc field is `false`', function() { - assert(result.includes('
  • widget2 - aposPlaceholder: false
  • ')); - assert(!result.includes('
  • widget2 - string: String PLACEHOLDER
  • ')); - assert(!result.includes('
  • widget2 - integer: 0
  • ')); - assert(!result.includes('
  • widget2 - float: 0.1
  • ')); - assert(!result.includes('
  • widget2 - date: YYYY-MM-DD
  • ')); - assert(!result.includes('
  • widget2 - time: HH:MM:SS
  • ')); - }); + it('should render the image placeholder only when widget\'s `aposPlaceholder` doc field is `true`', function() { + const { document } = new JSDOM(result).window; + const imgNodes = document.querySelectorAll('img'); - it('should not render the placeholders when widget\'s `aposPlaceholder` doc field is not defined', function() { - assert(!result.includes('
  • widget3 - string: String PLACEHOLDER
  • ')); - assert(!result.includes('
  • widget3 - integer: 0
  • ')); - assert(!result.includes('
  • widget3 - float: 0.1
  • ')); - assert(!result.includes('
  • widget3 - date: YYYY-MM-DD
  • ')); - assert(!result.includes('
  • widget3 - time: HH:MM:SS
  • ')); - - assert(result.includes('
  • widget4 - string: Some string
  • ')); - assert(result.includes('
  • widget4 - integer: 2
  • ')); - assert(result.includes('
  • widget4 - float: 2.2
  • ')); - assert(result.includes('
  • widget4 - date: 2022-09-21
  • ')); - assert(result.includes('
  • widget4 - time: 15:39:12
  • ')); - }); + assert(imgNodes.length === 1); + assert(imgNodes[0].classList.contains('image-widget-placeholder')); + assert(imgNodes[0].alt === 'Image placeholder'); + assert(imgNodes[0].src === '/apos-frontend/default/modules/@apostrophecms/image-widget/placeholder.jpg'); + }); - it('should not render the placeholders when widget\'s fields are defined', function() { - assert(result.includes('
  • widget5 - string: Some string
  • ')); - assert(result.includes('
  • widget5 - integer: 2
  • ')); - assert(result.includes('
  • widget5 - float: 2.2
  • ')); - assert(result.includes('
  • widget5 - date: 2022-09-21
  • ')); - assert(result.includes('
  • widget5 - time: 15:39:12
  • ')); + describe('image widget - other module option', function() { + let _apos; + let _page; + let _result; + + before(async function() { + // Recreate local apos instance with falsy `placeholderUrl` option set to image widget module + _apos = await t.create({ + root: module, + modules: { + 'placeholder-page': {}, + '@apostrophecms/image-widget': { + options: { + placeholderUrl: null + } + } + } + }); + const _req = _apos.task.getAnonReq(); + + const home = await _apos.page.find(_apos.task.getAnonReq(), { level: 0 }).toObject(); + const _homePath = home._id.replace(':en:published', ''); + + await insertPage(_apos, _homePath, widgets); + _page = await _apos.page.find(_req, { slug: '/placeholder-page' }).toObject(); + + const args = getRenderArgs(_req, _page); + _result = await _apos.modules['placeholder-page'].render(_req, 'page', args); + }); + + after(async function() { + await deletePage(_apos, _page); + await t.destroy(_apos); + }); + + it('should not render the image placeholder when widget\'s module `placeholderUrl` option is falsy', function() { + const { document } = new JSDOM(_result).window; + const imgNodes = document.querySelectorAll('img'); + + assert(imgNodes.length === 0); + }); + }); }); }); }); From c71a8b4f7d3b477a687abee1218f6cc000725e24 Mon Sep 17 00:00:00 2001 From: ETLaurent Date: Thu, 29 Sep 2022 12:55:31 +0200 Subject: [PATCH 06/13] display placeholder for video-widget (#3885) --- modules/@apostrophecms/video-widget/index.js | 5 +- .../video-widget/views/widget.html | 40 ++-- test/modules/placeholder-page/index.js | 3 +- test/widgets.js | 226 +++++++++++++----- 4 files changed, 190 insertions(+), 84 deletions(-) diff --git a/modules/@apostrophecms/video-widget/index.js b/modules/@apostrophecms/video-widget/index.js index c46748b92a..301d424c20 100644 --- a/modules/@apostrophecms/video-widget/index.js +++ b/modules/@apostrophecms/video-widget/index.js @@ -14,7 +14,10 @@ module.exports = { options: { label: 'apostrophe:video', className: false, - icon: 'play-box-icon' + icon: 'play-box-icon', + initialModal: false, + placeholderClass: false, + placeholderUrl: 'https://youtu.be/Q5UX9yexEyM' }, fields: { add: { diff --git a/modules/@apostrophecms/video-widget/views/widget.html b/modules/@apostrophecms/video-widget/views/widget.html index 99976f2807..1663d7ae4d 100644 --- a/modules/@apostrophecms/video-widget/views/widget.html +++ b/modules/@apostrophecms/video-widget/views/widget.html @@ -1,20 +1,28 @@ -{% if data.options.className %} - {% set className = data.options.className %} -{% elif data.manager.options.className %} - {% set className = data.manager.options.className %} -{% endif %} - -{# oembed repopulates me #} -{% if data.widget.video %} +{% if data.widget.aposPlaceholder and data.manager.options.placeholderUrl %}
    - {% if data.widget.video.thumbnail %} - {{ data.widget.video.thumbnail }} - {% endif %}
    -{% elif data.user %} -

    No video selected

    -{% endif %} \ No newline at end of file +{% else %} + {% if data.options.className %} + {% set className = data.options.className %} + {% elif data.manager.options.className %} + {% set className = data.manager.options.className %} + {% endif %} + + {# oembed repopulates me #} + {% if data.widget.video %} +
    + {% if data.widget.video.thumbnail %} + {{ data.widget.video.thumbnail }} + {% endif %} +
    + {% elif data.user %} +

    No video selected

    + {% endif %} +{% endif %} diff --git a/test/modules/placeholder-page/index.js b/test/modules/placeholder-page/index.js index 299496113b..ee37e0d9bb 100644 --- a/test/modules/placeholder-page/index.js +++ b/test/modules/placeholder-page/index.js @@ -11,7 +11,8 @@ module.exports = { options: { widgets: { placeholder: {}, - '@apostrophecms/image': {} + '@apostrophecms/image': {}, + '@apostrophecms/video': {} } } } diff --git a/test/widgets.js b/test/widgets.js index 48a8ef43ac..5f4e8c9ae2 100644 --- a/test/widgets.js +++ b/test/widgets.js @@ -268,93 +268,187 @@ describe('Widgets', function() { }); }); - describe('image widget', function() { - const widgetBaseData = { - metaType: 'widget', - type: '@apostrophecms/image' - }; - const widgets = [ - { - _id: 'widget1', - ...widgetBaseData, - aposPlaceholder: true + const mediaWidgetTypeToAssertion = { + image: { + placeholderUrlOverride: '/modules/@apostrophecms/my-image-widget/placeholder.webp', + assertAposPlaceholderTrue(document) { + const imgNodes = document.querySelectorAll('img'); + + assert(imgNodes.length === 1); + assert(imgNodes[0].classList.contains('image-widget-placeholder')); + assert(imgNodes[0].alt === 'Image placeholder'); + assert(imgNodes[0].src === '/apos-frontend/default/modules/@apostrophecms/image-widget/placeholder.jpg'); }, - { - _id: 'widget2', - ...widgetBaseData, - aposPlaceholder: false + assertFalsyPlaceholderUrl(document) { + const imgNodes = document.querySelectorAll('img'); + + assert(imgNodes.length === 0); }, - { - _id: 'widget3', - ...widgetBaseData + assertPlaceholderUrlOverride(document) { + const imgNodes = document.querySelectorAll('img'); + + assert(imgNodes.length === 1); + assert(imgNodes[0].classList.contains('image-widget-placeholder')); + assert(imgNodes[0].alt === 'Image placeholder'); + assert(imgNodes[0].src === '/apos-frontend/default/modules/@apostrophecms/my-image-widget/placeholder.webp'); } - ]; + }, + video: { + placeholderUrlOverride: 'https://vimeo.com/57946935', + assertAposPlaceholderTrue(document) { + const videoWrapperNodes = document.querySelectorAll('[data-apos-video-widget]'); + + assert(videoWrapperNodes.length === 1); + assert(videoWrapperNodes[0].dataset.aposVideoUrl === 'https://youtu.be/Q5UX9yexEyM'); + }, + assertFalsyPlaceholderUrl(document) { + const videoWrapperNodes = document.querySelectorAll('[data-apos-video-widget]'); - let page; - let result; + assert(videoWrapperNodes.length === 0); + }, + assertPlaceholderUrlOverride(document) { + const videoWrapperNodes = document.querySelectorAll('[data-apos-video-widget]'); - before(async function() { - await insertPage(apos, homePath, widgets); - page = await apos.page.find(req, { slug: '/placeholder-page' }).toObject(); + assert(videoWrapperNodes.length === 1); + assert(videoWrapperNodes[0].dataset.aposVideoUrl === 'https://vimeo.com/57946935'); + } + } + }; - const args = getRenderArgs(req, page); - result = await apos.modules['placeholder-page'].render(req, 'page', args); - }); + Object.entries(mediaWidgetTypeToAssertion).forEach(([ + type, + { + placeholderUrlOverride, + assertAposPlaceholderTrue, + assertFalsyPlaceholderUrl, + assertPlaceholderUrlOverride + } + ]) => { + describe(`${type} widget`, function() { + const widgetBaseData = { + metaType: 'widget', + type: `@apostrophecms/${type}` + }; + const widgets = [ + { + _id: 'widget1', + ...widgetBaseData, + aposPlaceholder: true + }, + { + _id: 'widget2', + ...widgetBaseData, + aposPlaceholder: false + }, + { + _id: 'widget3', + ...widgetBaseData + } + ]; - after(async function() { - await deletePage(apos, page); - }); + let page; + let result; - it('should render the image placeholder only when widget\'s `aposPlaceholder` doc field is `true`', function() { - const { document } = new JSDOM(result).window; - const imgNodes = document.querySelectorAll('img'); + before(async function() { + await insertPage(apos, homePath, widgets); + page = await apos.page.find(req, { slug: '/placeholder-page' }).toObject(); - assert(imgNodes.length === 1); - assert(imgNodes[0].classList.contains('image-widget-placeholder')); - assert(imgNodes[0].alt === 'Image placeholder'); - assert(imgNodes[0].src === '/apos-frontend/default/modules/@apostrophecms/image-widget/placeholder.jpg'); - }); + const args = getRenderArgs(req, page); + result = await apos.modules['placeholder-page'].render(req, 'page', args); + }); - describe('image widget - other module option', function() { - let _apos; - let _page; - let _result; + after(async function() { + await deletePage(apos, page); + }); - before(async function() { - // Recreate local apos instance with falsy `placeholderUrl` option set to image widget module - _apos = await t.create({ - root: module, - modules: { - 'placeholder-page': {}, - '@apostrophecms/image-widget': { - options: { - placeholderUrl: null + it(`should render the ${type} placeholder only when widget's \`aposPlaceholder\` doc field is \`true\``, function() { + const { document } = new JSDOM(result).window; + + assertAposPlaceholderTrue(document); + }); + + describe(`${type} widget - falsy placeholderUrl`, function() { + let _apos; + let _page; + let _result; + + before(async function() { + // Recreate local apos instance with falsy `placeholderUrl` option set to widget module + _apos = await t.create({ + root: module, + modules: { + 'placeholder-page': {}, + [`@apostrophecms/${type}-widget`]: { + options: { + placeholderUrl: null + } } } - } + }); + const _req = _apos.task.getAnonReq(); + + const home = await _apos.page.find(_apos.task.getAnonReq(), { level: 0 }).toObject(); + const _homePath = home._id.replace(':en:published', ''); + + await insertPage(_apos, _homePath, widgets); + _page = await _apos.page.find(_req, { slug: '/placeholder-page' }).toObject(); + + const args = getRenderArgs(_req, _page); + _result = await _apos.modules['placeholder-page'].render(_req, 'page', args); }); - const _req = _apos.task.getAnonReq(); - const home = await _apos.page.find(_apos.task.getAnonReq(), { level: 0 }).toObject(); - const _homePath = home._id.replace(':en:published', ''); + after(async function() { + await deletePage(_apos, _page); + await t.destroy(_apos); + }); - await insertPage(_apos, _homePath, widgets); - _page = await _apos.page.find(_req, { slug: '/placeholder-page' }).toObject(); + it(`should not render the ${type} placeholder when widget's module \`placeholderUrl\` option is falsy`, function() { + const { document } = new JSDOM(_result).window; - const args = getRenderArgs(_req, _page); - _result = await _apos.modules['placeholder-page'].render(_req, 'page', args); + assertFalsyPlaceholderUrl(document); + }); }); - after(async function() { - await deletePage(_apos, _page); - await t.destroy(_apos); - }); + describe(`${type} widget - placeholderUrl override`, function() { + let _apos; + let _page; + let _result; + + before(async function() { + // Recreate local apos instance with falsy `placeholderUrl` option set to widget module + _apos = await t.create({ + root: module, + modules: { + 'placeholder-page': {}, + [`@apostrophecms/${type}-widget`]: { + options: { + placeholderUrl: placeholderUrlOverride + } + } + } + }); + const _req = _apos.task.getAnonReq(); - it('should not render the image placeholder when widget\'s module `placeholderUrl` option is falsy', function() { - const { document } = new JSDOM(_result).window; - const imgNodes = document.querySelectorAll('img'); + const home = await _apos.page.find(_apos.task.getAnonReq(), { level: 0 }).toObject(); + const _homePath = home._id.replace(':en:published', ''); - assert(imgNodes.length === 0); + await insertPage(_apos, _homePath, widgets); + _page = await _apos.page.find(_req, { slug: '/placeholder-page' }).toObject(); + + const args = getRenderArgs(_req, _page); + _result = await _apos.modules['placeholder-page'].render(_req, 'page', args); + }); + + after(async function() { + await deletePage(_apos, _page); + await t.destroy(_apos); + }); + + it(`should render the ${type} placeholder set to the widget's module \`placeholderUrl\` override`, function() { + const { document } = new JSDOM(_result).window; + + assertPlaceholderUrlOverride(document); + }); }); }); }); From 2193cb65e4c093e1afddbd56f6cecb88af535447 Mon Sep 17 00:00:00 2001 From: Etienne Laurent Date: Thu, 29 Sep 2022 16:15:15 +0200 Subject: [PATCH 07/13] simplify placeholder class condition --- .../widget-type/ui/apos/mixins/AposWidgetMixin.js | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/modules/@apostrophecms/widget-type/ui/apos/mixins/AposWidgetMixin.js b/modules/@apostrophecms/widget-type/ui/apos/mixins/AposWidgetMixin.js index 85e076faa6..61170c1d24 100644 --- a/modules/@apostrophecms/widget-type/ui/apos/mixins/AposWidgetMixin.js +++ b/modules/@apostrophecms/widget-type/ui/apos/mixins/AposWidgetMixin.js @@ -70,9 +70,7 @@ export default { return {}; } - const className = typeof placeholderClass === 'string' && placeholderClass.length - ? placeholderClass - : 'apos-placeholder'; + const className = placeholderClass || 'apos-placeholder'; return { [className]: this.value.aposPlaceholder === true From 94add677b7fb142e3ed288083cdd149ca03ae22e Mon Sep 17 00:00:00 2001 From: Etienne Laurent Date: Fri, 30 Sep 2022 12:36:53 +0200 Subject: [PATCH 08/13] set aposPlaceholder to false when inserting a widget with def values --- .../area/ui/apos/components/AposAreaEditor.vue | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/modules/@apostrophecms/area/ui/apos/components/AposAreaEditor.vue b/modules/@apostrophecms/area/ui/apos/components/AposAreaEditor.vue index 0f02ca60c3..d0637cf2a3 100644 --- a/modules/@apostrophecms/area/ui/apos/components/AposAreaEditor.vue +++ b/modules/@apostrophecms/area/ui/apos/components/AposAreaEditor.vue @@ -429,11 +429,15 @@ export default { index }); } else if (!this.widgetHasInitialModal(name)) { + const widgetAreaDefaultData = this.widgetAreaDefaultData(name); + + // If a widget has area-specific default values, + // then we set aposPlaceholder to false: return this.insert({ widget: { type: name, - aposPlaceholder: true, - ...this.widgetAreaDefaultData(name) + aposPlaceholder: !widgetAreaDefaultData, + ...widgetAreaDefaultData }, index }); @@ -459,7 +463,11 @@ export default { return this.moduleOptions.contextualWidgetDefaultData[type]; }, widgetAreaDefaultData(type) { - return this.options.widgets[type]._def || null; + const defaults = this.options.widgets[type]._def; + + return defaults && Object.keys(defaults).length + ? defaults + : null; }, async insert({ index, widget }) { if (!widget._id) { From f88c210ae38f31cad2629e5b25f9fe1a6b14ec1c Mon Sep 17 00:00:00 2001 From: ETLaurent Date: Mon, 3 Oct 2022 11:40:31 +0200 Subject: [PATCH 09/13] do not render widgets placeholder on preview mode (#3894) --- modules/@apostrophecms/widget-type/index.js | 5 ++ test/widgets.js | 72 +++++++++++++++++---- 2 files changed, 66 insertions(+), 11 deletions(-) diff --git a/modules/@apostrophecms/widget-type/index.js b/modules/@apostrophecms/widget-type/index.js index 7179d2c201..63da763b90 100644 --- a/modules/@apostrophecms/widget-type/index.js +++ b/modules/@apostrophecms/widget-type/index.js @@ -164,6 +164,11 @@ module.exports = { const clonedWidget = { ...widget }; if (widget.aposPlaceholder === true) { + // Do not render widget on preview mode: + if (req.query.aposEdit !== '1') { + return ''; + } + self.schema.forEach(field => { if (!widget[field.name] && field.placeholder !== undefined) { clonedWidget[field.name] = field.placeholder; diff --git a/test/widgets.js b/test/widgets.js index 5f4e8c9ae2..577e1e8e1f 100644 --- a/test/widgets.js +++ b/test/widgets.js @@ -30,9 +30,13 @@ describe('Widgets', function() { } }); - req = apos.task.getAnonReq(); + req = apos.task.getAnonReq({ + query: { + aposEdit: '1' + } + }); - const home = await apos.page.find(apos.task.getAnonReq(), { level: 0 }).toObject(); + const home = await apos.page.find(req, { level: 0 }).toObject(); homePath = home._id.replace(':en:published', ''); }); @@ -266,6 +270,19 @@ describe('Widgets', function() { assert(result.includes('
  • widget5 - date: 2022-09-21
  • ')); assert(result.includes('
  • widget5 - time: 15:39:12
  • ')); }); + + it('should not render the placeholders on preview mode', async function() { + // eslint-disable-next-line no-unused-vars + const { aposEdit, ...query } = req.query; + const _nonEditingReq = { + ...req, + query + }; + const args = getRenderArgs(_nonEditingReq, page); + const _result = await apos.modules['placeholder-page'].render(_nonEditingReq, 'page', args); + + assert(!_result.includes('widget1')); + }); }); const mediaWidgetTypeToAssertion = { @@ -279,6 +296,11 @@ describe('Widgets', function() { assert(imgNodes[0].alt === 'Image placeholder'); assert(imgNodes[0].src === '/apos-frontend/default/modules/@apostrophecms/image-widget/placeholder.jpg'); }, + assertPreviewMode(document) { + const imgNodes = document.querySelectorAll('img'); + + assert(imgNodes.length === 0); + }, assertFalsyPlaceholderUrl(document) { const imgNodes = document.querySelectorAll('img'); @@ -301,6 +323,11 @@ describe('Widgets', function() { assert(videoWrapperNodes.length === 1); assert(videoWrapperNodes[0].dataset.aposVideoUrl === 'https://youtu.be/Q5UX9yexEyM'); }, + assertPreviewMode(document) { + const videoWrapperNodes = document.querySelectorAll('[data-apos-video-widget]'); + + assert(videoWrapperNodes.length === 0); + }, assertFalsyPlaceholderUrl(document) { const videoWrapperNodes = document.querySelectorAll('[data-apos-video-widget]'); @@ -320,6 +347,7 @@ describe('Widgets', function() { { placeholderUrlOverride, assertAposPlaceholderTrue, + assertPreviewMode, assertFalsyPlaceholderUrl, assertPlaceholderUrlOverride } @@ -361,13 +389,27 @@ describe('Widgets', function() { await deletePage(apos, page); }); - it(`should render the ${type} placeholder only when widget's \`aposPlaceholder\` doc field is \`true\``, function() { + it('should render the placeholder only when widget\'s `aposPlaceholder` doc field is `true`', function() { const { document } = new JSDOM(result).window; assertAposPlaceholderTrue(document); }); - describe(`${type} widget - falsy placeholderUrl`, function() { + it('should not render the placeholders on preview mode', async function() { + // eslint-disable-next-line no-unused-vars + const { aposEdit, ...query } = req.query; + const _nonEditingReq = { + ...req, + query + }; + const args = getRenderArgs(_nonEditingReq, page); + const _result = await apos.modules['placeholder-page'].render(_nonEditingReq, 'page', args); + + const { document } = new JSDOM(_result).window; + assertPreviewMode(document); + }); + + describe('placeholderUrl - falsy', function() { let _apos; let _page; let _result; @@ -385,9 +427,13 @@ describe('Widgets', function() { } } }); - const _req = _apos.task.getAnonReq(); + const _req = _apos.task.getAnonReq({ + query: { + aposEdit: '1' + } + }); - const home = await _apos.page.find(_apos.task.getAnonReq(), { level: 0 }).toObject(); + const home = await _apos.page.find(_req, { level: 0 }).toObject(); const _homePath = home._id.replace(':en:published', ''); await insertPage(_apos, _homePath, widgets); @@ -402,14 +448,14 @@ describe('Widgets', function() { await t.destroy(_apos); }); - it(`should not render the ${type} placeholder when widget's module \`placeholderUrl\` option is falsy`, function() { + it('should not render the placeholder when widget\'s module `placeholderUrl` option is falsy', function() { const { document } = new JSDOM(_result).window; assertFalsyPlaceholderUrl(document); }); }); - describe(`${type} widget - placeholderUrl override`, function() { + describe('placeholderUrl - override', function() { let _apos; let _page; let _result; @@ -427,9 +473,13 @@ describe('Widgets', function() { } } }); - const _req = _apos.task.getAnonReq(); + const _req = _apos.task.getAnonReq({ + query: { + aposEdit: '1' + } + }); - const home = await _apos.page.find(_apos.task.getAnonReq(), { level: 0 }).toObject(); + const home = await _apos.page.find(_req, { level: 0 }).toObject(); const _homePath = home._id.replace(':en:published', ''); await insertPage(_apos, _homePath, widgets); @@ -444,7 +494,7 @@ describe('Widgets', function() { await t.destroy(_apos); }); - it(`should render the ${type} placeholder set to the widget's module \`placeholderUrl\` override`, function() { + it('should render the placeholder set to the widget\'s module `placeholderUrl` override', function() { const { document } = new JSDOM(_result).window; assertPlaceholderUrlOverride(document); From 0e58146d59690d6430ca265eb0de960083c61843 Mon Sep 17 00:00:00 2001 From: ETLaurent Date: Mon, 10 Oct 2022 10:36:28 +0200 Subject: [PATCH 10/13] add placeholder widget option (#3897) --- modules/@apostrophecms/area/index.js | 5 ++++- .../area/ui/apos/components/AposAreaEditor.vue | 11 ++++++----- modules/@apostrophecms/image-widget/index.js | 2 +- modules/@apostrophecms/rich-text-widget/index.js | 3 ++- modules/@apostrophecms/video-widget/index.js | 2 +- modules/@apostrophecms/widget-type/index.js | 5 ++++- .../widget-type/ui/apos/mixins/AposWidgetMixin.js | 6 ++---- test/modules/placeholder-widget/index.js | 2 +- 8 files changed, 21 insertions(+), 15 deletions(-) diff --git a/modules/@apostrophecms/area/index.js b/modules/@apostrophecms/area/index.js index 0bec89ed59..c30ca991f5 100644 --- a/modules/@apostrophecms/area/index.js +++ b/modules/@apostrophecms/area/index.js @@ -554,6 +554,7 @@ module.exports = { const widgetEditors = {}; const widgetManagers = {}; const widgetIsContextual = {}; + const widgetHasPlaceholder = {}; const widgetHasInitialModal = {}; const contextualWidgetDefaultData = {}; @@ -564,7 +565,8 @@ module.exports = { widgetEditors[name] = (browserData && browserData.components && browserData.components.widgetEditor) || 'AposWidgetEditor'; widgetManagers[name] = manager.__meta.name; widgetIsContextual[name] = manager.options.contextual; - widgetHasInitialModal[name] = manager.options.initialModal !== false; + widgetHasPlaceholder[name] = manager.options.placeholder; + widgetHasInitialModal[name] = !widgetHasPlaceholder[name] && manager.options.initialModal !== false; contextualWidgetDefaultData[name] = manager.options.defaultData; }); @@ -575,6 +577,7 @@ module.exports = { widgetEditors }, widgetIsContextual, + widgetHasPlaceholder, widgetHasInitialModal, contextualWidgetDefaultData, widgetManagers, diff --git a/modules/@apostrophecms/area/ui/apos/components/AposAreaEditor.vue b/modules/@apostrophecms/area/ui/apos/components/AposAreaEditor.vue index d0637cf2a3..b939b6d0b7 100644 --- a/modules/@apostrophecms/area/ui/apos/components/AposAreaEditor.vue +++ b/modules/@apostrophecms/area/ui/apos/components/AposAreaEditor.vue @@ -430,14 +430,12 @@ export default { }); } else if (!this.widgetHasInitialModal(name)) { const widgetAreaDefaultData = this.widgetAreaDefaultData(name); - - // If a widget has area-specific default values, - // then we set aposPlaceholder to false: + const aposPlaceholder = this.widgetHasPlaceholder(name) && !widgetAreaDefaultData; return this.insert({ widget: { type: name, - aposPlaceholder: !widgetAreaDefaultData, - ...widgetAreaDefaultData + ...widgetAreaDefaultData, + aposPlaceholder }, index }); @@ -498,6 +496,9 @@ export default { widgetIsContextual(type) { return this.moduleOptions.widgetIsContextual[type]; }, + widgetHasPlaceholder(type) { + return this.moduleOptions.widgetHasPlaceholder[type]; + }, widgetHasInitialModal(type) { return this.moduleOptions.widgetHasInitialModal[type]; }, diff --git a/modules/@apostrophecms/image-widget/index.js b/modules/@apostrophecms/image-widget/index.js index b591f03ba9..f0ad842097 100644 --- a/modules/@apostrophecms/image-widget/index.js +++ b/modules/@apostrophecms/image-widget/index.js @@ -5,7 +5,7 @@ module.exports = { className: false, icon: 'image-icon', dimensionAttrs: false, - initialModal: false, + placeholder: true, placeholderClass: false, placeholderUrl: '/modules/@apostrophecms/image-widget/placeholder.jpg' }, diff --git a/modules/@apostrophecms/rich-text-widget/index.js b/modules/@apostrophecms/rich-text-widget/index.js index f85c707f10..2a86234421 100644 --- a/modules/@apostrophecms/rich-text-widget/index.js +++ b/modules/@apostrophecms/rich-text-widget/index.js @@ -9,6 +9,7 @@ module.exports = { icon: 'format-text-icon', label: 'apostrophe:richText', contextual: true, + placeholder: true, placeholderText: 'apostrophe:richTextPlaceholder', defaultData: { content: '' }, className: false, @@ -419,7 +420,7 @@ module.exports = { defaultOptions: self.options.defaultOptions, tiptapTextCommands: self.options.tiptapTextCommands, tiptapTypes: self.options.tiptapTypes, - placeholderText: self.options.placeholderText + placeholderText: self.options.placeholder && self.options.placeholderText }; return finalData; } diff --git a/modules/@apostrophecms/video-widget/index.js b/modules/@apostrophecms/video-widget/index.js index 301d424c20..50f42510f4 100644 --- a/modules/@apostrophecms/video-widget/index.js +++ b/modules/@apostrophecms/video-widget/index.js @@ -15,7 +15,7 @@ module.exports = { label: 'apostrophe:video', className: false, icon: 'play-box-icon', - initialModal: false, + placeholder: true, placeholderClass: false, placeholderUrl: 'https://youtu.be/Q5UX9yexEyM' }, diff --git a/modules/@apostrophecms/widget-type/index.js b/modules/@apostrophecms/widget-type/index.js index 63da763b90..dba083735c 100644 --- a/modules/@apostrophecms/widget-type/index.js +++ b/modules/@apostrophecms/widget-type/index.js @@ -97,7 +97,10 @@ const _ = require('lodash'); module.exports = { cascades: [ 'fields' ], options: { - neverLoadSelf: true + neverLoadSelf: true, + initialModal: true, + placeholder: false, + placeholderClass: 'apos-placeholder' }, init(self) { diff --git a/modules/@apostrophecms/widget-type/ui/apos/mixins/AposWidgetMixin.js b/modules/@apostrophecms/widget-type/ui/apos/mixins/AposWidgetMixin.js index 61170c1d24..0a37542a0e 100644 --- a/modules/@apostrophecms/widget-type/ui/apos/mixins/AposWidgetMixin.js +++ b/modules/@apostrophecms/widget-type/ui/apos/mixins/AposWidgetMixin.js @@ -66,14 +66,12 @@ export default { getClasses() { const { placeholderClass } = this.moduleOptions; - if (placeholderClass === false) { + if (!placeholderClass) { return {}; } - const className = placeholderClass || 'apos-placeholder'; - return { - [className]: this.value.aposPlaceholder === true + [placeholderClass]: this.value.aposPlaceholder === true }; } } diff --git a/test/modules/placeholder-widget/index.js b/test/modules/placeholder-widget/index.js index 2c3df61098..32932d91ac 100644 --- a/test/modules/placeholder-widget/index.js +++ b/test/modules/placeholder-widget/index.js @@ -2,7 +2,7 @@ module.exports = { extend: '@apostrophecms/widget-type', options: { label: 'Placeholder Test Widget', - initialModal: false + placeholder: true }, fields: { add: { From e8186369f36d2bd41578905919e0e0bf901db597 Mon Sep 17 00:00:00 2001 From: Etienne Laurent Date: Thu, 6 Oct 2022 19:05:05 +0200 Subject: [PATCH 11/13] add default widgets to an area --- modules/@apostrophecms/area/index.js | 1 + modules/@apostrophecms/doc-type/index.js | 4 +-- .../ui/apos/components/AposDocEditor.vue | 1 + modules/@apostrophecms/global/index.js | 2 +- modules/@apostrophecms/module/index.js | 3 ++ modules/@apostrophecms/page/index.js | 14 ++++---- modules/@apostrophecms/piece-type/index.js | 10 +++--- modules/@apostrophecms/schema/index.js | 35 ++++++++++++++++--- modules/@apostrophecms/widget-type/index.js | 2 +- 9 files changed, 51 insertions(+), 21 deletions(-) diff --git a/modules/@apostrophecms/area/index.js b/modules/@apostrophecms/area/index.js index c30ca991f5..5dc845a223 100644 --- a/modules/@apostrophecms/area/index.js +++ b/modules/@apostrophecms/area/index.js @@ -251,6 +251,7 @@ module.exports = { // // Returns a new array of sanitized items. async sanitizeItems(req, items, options) { + console.log(require('util').inspect(items, { depth: 9, colors: true, showHidden: false })); options = options || {}; const result = []; const errors = []; diff --git a/modules/@apostrophecms/doc-type/index.js b/modules/@apostrophecms/doc-type/index.js index f3e9f3f7f4..707fac529c 100644 --- a/modules/@apostrophecms/doc-type/index.js +++ b/modules/@apostrophecms/doc-type/index.js @@ -368,8 +368,8 @@ module.exports = { }, // Returns a new instance of the doc type, with the appropriate default // values for each schema field. - newInstance() { - const doc = self.apos.schema.newInstance(self.schema); + async newInstance(req) { + const doc = await self.apos.schema.newInstance(req, self.schema); doc.type = self.name; return doc; }, diff --git a/modules/@apostrophecms/doc-type/ui/apos/components/AposDocEditor.vue b/modules/@apostrophecms/doc-type/ui/apos/components/AposDocEditor.vue index fcb9f5d6bf..23e6ad9577 100644 --- a/modules/@apostrophecms/doc-type/ui/apos/components/AposDocEditor.vue +++ b/modules/@apostrophecms/doc-type/ui/apos/components/AposDocEditor.vue @@ -605,6 +605,7 @@ export default { async loadNewInstance () { this.docReady = false; const newInstance = await this.getNewInstance(); + console.log('🚀 ~ file: AposDocEditor.vue ~ line 610 ~ loadNewInstance ~ newInstance', newInstance); this.original = newInstance; if (newInstance && newInstance.type !== this.docType) { this.docType = newInstance.type; diff --git a/modules/@apostrophecms/global/index.js b/modules/@apostrophecms/global/index.js index afc1e4cc62..235bf5b123 100644 --- a/modules/@apostrophecms/global/index.js +++ b/modules/@apostrophecms/global/index.js @@ -82,7 +82,7 @@ module.exports = { const req = self.apos.task.getReq(); const existing = await self.apos.doc.db.findOne({ slug: self.slug }); if (!existing) { - const _new = self.newInstance(); + const _new = await self.newInstance(req); Object.assign(_new, { slug: self.slug, type: self.name diff --git a/modules/@apostrophecms/module/index.js b/modules/@apostrophecms/module/index.js index c930a96229..5b40bf4fc2 100644 --- a/modules/@apostrophecms/module/index.js +++ b/modules/@apostrophecms/module/index.js @@ -186,6 +186,9 @@ module.exports = { res.status(200); res.send(result); } catch (err) { + console.log('------------------ ERR ----------------------'); + console.error(err); + console.log('------------------ END ERR ----------------------'); return self.routeSendError(req, err); } }; diff --git a/modules/@apostrophecms/page/index.js b/modules/@apostrophecms/page/index.js index 14541ce06e..2c50ee8204 100644 --- a/modules/@apostrophecms/page/index.js +++ b/modules/@apostrophecms/page/index.js @@ -235,7 +235,7 @@ module.exports = { // simply get a new page doc and return it const parentPage = await self.findForEditing(req, { _id: targetId }) .permission('edit', '@apostrophecms/any-page-type').toObject(); - const newChild = self.newChild(parentPage); + const newChild = self.newChild(req, parentPage); newChild._previewable = true; return newChild; } @@ -252,13 +252,13 @@ module.exports = { } let page; if ((position === 'firstChild') || (position === 'lastChild')) { - page = self.newChild(targetPage); + page = self.newChild(req, targetPage); } else { const parentPage = targetPage._ancestors[targetPage._ancestors.length - 1]; if (!parentPage) { throw self.apos.error('notfound'); } - page = self.newChild(parentPage); + page = self.newChild(req, parentPage); } await manager.convert(req, input, page, { onlyPresentFields: true, @@ -963,7 +963,7 @@ database.`); // such that no child page types are permitted, this method // returns null. Visibility settings are inherited from the // parent page. - newChild(parentPage) { + async newChild(req, parentPage) { const pageType = self.allowedChildTypes(parentPage)[0]; if (!pageType) { self.apos.util.warn('No allowed Page types are specified.'); @@ -977,7 +977,7 @@ database.`); throw self.apos.error('error', `The page type module ${pageType} does not exist in the project.`); } } - const page = manager.newInstance(); + const page = await manager.newInstance(req); _.extend(page, { title: 'New Page', slug: self.apos.util.addSlashIfNeeded(parentPage.slug) + 'new-page', @@ -1883,14 +1883,14 @@ database.`); delete cloned._defaults; let ordinaryDefaults; if (parent) { - ordinaryDefaults = self.newChild(parent); + ordinaryDefaults = self.newChild(req, parent); } else { // The home page is being parked const type = item.type || parkedDefaults.type; if (!type) { throw new Error('Parked home page must have an explicit page type:\n\n' + JSON.stringify(item, null, ' ')); } - ordinaryDefaults = self.apos.doc.getManager(type).newInstance(); + ordinaryDefaults = await self.apos.doc.getManager(type).newInstance(req); } const _item = { ...ordinaryDefaults, diff --git a/modules/@apostrophecms/piece-type/index.js b/modules/@apostrophecms/piece-type/index.js index 812e41a07e..8d5cb15065 100644 --- a/modules/@apostrophecms/piece-type/index.js +++ b/modules/@apostrophecms/piece-type/index.js @@ -238,7 +238,7 @@ module.exports = { async post(req) { self.publicApiCheck(req); if (req.body._newInstance) { - const newInstance = self.newInstance(); + const newInstance = await self.newInstance(req); newInstance._previewable = self.addUrlsViaModule && (await self.addUrlsViaModule.readyToAddUrlsToPieces(req, self.name)); delete newInstance._url; return newInstance; @@ -747,7 +747,7 @@ module.exports = { // before inserting the piece. async convertInsertAndRefresh(req, input, options) { - const piece = self.newInstance(); + const piece = await self.newInstance(req); const copyingId = self.apos.launder.id(input._copyingId); await self.convert(req, input, piece, { onlyPresentFields: true, @@ -915,8 +915,8 @@ module.exports = { // is used to distinguish it from other samples. Useful // for things like testing pagination, see the // `your-piece-type:generate` task. - generate(i) { - const piece = self.newInstance(); + async generate(req, i) { + const piece = await self.newInstance(req); piece.title = 'Generated #' + (i + 1); return piece; }, @@ -1010,7 +1010,7 @@ module.exports = { const total = argv.total || 10; const req = self.apos.task.getReq(); for (let i = 0; i < total; i++) { - const piece = self.generate(i); + const piece = await self.generate(req, i); piece.aposSampleData = true; await self.insert(req, piece); } diff --git a/modules/@apostrophecms/schema/index.js b/modules/@apostrophecms/schema/index.js index c487c8073c..8857ef84fa 100644 --- a/modules/@apostrophecms/schema/index.js +++ b/modules/@apostrophecms/schema/index.js @@ -365,15 +365,40 @@ module.exports = { // Return a new object with all default settings // defined in the schema - newInstance(schema) { + async newInstance(req, schema) { const instance = {}; + const format = item => { + if (typeof item === 'string') { + return { type: item }; + } + for (const key in item) { + if (Array.isArray(item[key])) { + item[key] = item[key].map(format); + } + } + return item; + }; + for (const field of schema) { - if (field.def !== undefined) { - instance[field.name] = klona(field.def); - } else { - // All fields should have an initial value in the database + if (field.def === undefined) { instance[field.name] = null; + continue; + } + if (field.type !== 'area') { + instance[field.name] = klona(field.def); + continue; } + + const items = field.def.map(format); + const sanitizedItems = await self.apos.area.sanitizeItems(req, items, field.options); + + instance[field.name] = { + _id: self.apos.util.generateId(), + items: sanitizedItems, + metaType: 'area' + }; + + console.log(require('util').inspect(instance[field.name], { depth: 9, colors: true, showHidden: false })); } return instance; }, diff --git a/modules/@apostrophecms/widget-type/index.js b/modules/@apostrophecms/widget-type/index.js index dba083735c..b492e5e7b9 100644 --- a/modules/@apostrophecms/widget-type/index.js +++ b/modules/@apostrophecms/widget-type/index.js @@ -293,7 +293,7 @@ module.exports = { } // Make sure we get default values for contextual fields so // `by` doesn't go missing for `@apostrophecms/image-widget` - const output = self.apos.schema.newInstance(self.schema); + const output = await self.apos.schema.newInstance(req, self.schema); const schema = self.allowedSchema(req); output._id = self.apos.launder.id(input._id) || self.apos.util.generateId(); await self.apos.schema.convert(req, schema, input, output); From ab896be31bf12e767e0cbfe6046b27a25fa45f49 Mon Sep 17 00:00:00 2001 From: Etienne Laurent Date: Mon, 10 Oct 2022 11:01:09 +0200 Subject: [PATCH 12/13] force placeholder for new instance --- modules/@apostrophecms/area/index.js | 13 ++++++++++--- modules/@apostrophecms/schema/index.js | 7 ++++--- modules/@apostrophecms/schema/lib/addFieldTypes.js | 4 ++-- modules/@apostrophecms/widget-type/index.js | 4 ++-- 4 files changed, 18 insertions(+), 10 deletions(-) diff --git a/modules/@apostrophecms/area/index.js b/modules/@apostrophecms/area/index.js index 5dc845a223..deabcf1672 100644 --- a/modules/@apostrophecms/area/index.js +++ b/modules/@apostrophecms/area/index.js @@ -245,13 +245,15 @@ module.exports = { // options to sanitize against. Thus h5 can be legal // in one rich text widget and not in another. // + // `forcePlaceholder` is used to choose whether to render the widgets + // with their placeholder or not, depending on their manager options. + // // If any errors occur sanitizing the individual widgets, // an array of errors with `path` and `error` properties // is thrown. // // Returns a new array of sanitized items. - async sanitizeItems(req, items, options) { - console.log(require('util').inspect(items, { depth: 9, colors: true, showHidden: false })); + async sanitizeItems(req, items, options, forcePlaceholder = false) { options = options || {}; const result = []; const errors = []; @@ -266,6 +268,11 @@ module.exports = { self.warnMissingWidgetType(item.type); continue; } + + if (forcePlaceholder && manager.options.placeholder) { + item.aposPlaceholder = true; + } + const widgetOptions = widgetsOptions[item.type]; if (!widgetOptions) { // This widget is not specified for this area at all @@ -273,7 +280,7 @@ module.exports = { } let newItem; try { - newItem = await manager.sanitize(req, item, widgetOptions); + newItem = await manager.sanitize(req, item, widgetOptions, forcePlaceholder); newItem._id = self.apos.launder.id(item._id) || self.apos.util.generateId(); } catch (e) { if (Array.isArray(e)) { diff --git a/modules/@apostrophecms/schema/index.js b/modules/@apostrophecms/schema/index.js index 8857ef84fa..caa1ca0758 100644 --- a/modules/@apostrophecms/schema/index.js +++ b/modules/@apostrophecms/schema/index.js @@ -367,6 +367,7 @@ module.exports = { // defined in the schema async newInstance(req, schema) { const instance = {}; + const forcePlaceholder = true; const format = item => { if (typeof item === 'string') { return { type: item }; @@ -390,7 +391,7 @@ module.exports = { } const items = field.def.map(format); - const sanitizedItems = await self.apos.area.sanitizeItems(req, items, field.options); + const sanitizedItems = await self.apos.area.sanitizeItems(req, items, field.options, forcePlaceholder); instance[field.name] = { _id: self.apos.util.generateId(), @@ -507,7 +508,7 @@ module.exports = { // set error class names, etc. If the error is not a string, it is a // database error etc. and should not be displayed in the browser directly. - async convert(req, schema, data, destination) { + async convert(req, schema, data, destination, forcePlaceholder) { if (Array.isArray(req)) { throw new Error('convert invoked without a req, do you have one in your context?'); } @@ -526,7 +527,7 @@ module.exports = { const convert = self.fieldTypes[field.type].convert; if (convert) { try { - await convert(req, field, data, destination); + await convert(req, field, data, destination, forcePlaceholder); } catch (e) { if (Array.isArray(e)) { const invalid = self.apos.error('invalid', { diff --git a/modules/@apostrophecms/schema/lib/addFieldTypes.js b/modules/@apostrophecms/schema/lib/addFieldTypes.js index a3487823c9..abcaffd089 100644 --- a/modules/@apostrophecms/schema/lib/addFieldTypes.js +++ b/modules/@apostrophecms/schema/lib/addFieldTypes.js @@ -10,7 +10,7 @@ const dateRegex = /^\d{4}-(0[1-9]|1[012])-(0[1-9]|[12][0-9]|3[01])$/; module.exports = (self) => { self.addFieldType({ name: 'area', - async convert(req, field, data, destination) { + async convert(req, field, data, destination, forcePlaceholder) { const _id = self.apos.launder.id(data[field.name] && data[field.name]._id) || self.apos.util.generateId(); if (typeof data[field.name] === 'string') { destination[field.name] = self.apos.area.fromPlaintext(data[field.name]); @@ -34,7 +34,7 @@ module.exports = (self) => { // Always recover graciously and import something reasonable, like an empty area items = []; } - items = await self.apos.area.sanitizeItems(req, items, field.options || {}); + items = await self.apos.area.sanitizeItems(req, items, field.options || {}, forcePlaceholder); destination[field.name] = { _id, items, diff --git a/modules/@apostrophecms/widget-type/index.js b/modules/@apostrophecms/widget-type/index.js index b492e5e7b9..b80b1230d9 100644 --- a/modules/@apostrophecms/widget-type/index.js +++ b/modules/@apostrophecms/widget-type/index.js @@ -286,7 +286,7 @@ module.exports = { // // Returns a new, sanitized widget object. - async sanitize(req, input, options) { + async sanitize(req, input, options, forcePlaceholder) { if (!input || typeof input !== 'object') { // Do not crash input = {}; @@ -296,7 +296,7 @@ module.exports = { const output = await self.apos.schema.newInstance(req, self.schema); const schema = self.allowedSchema(req); output._id = self.apos.launder.id(input._id) || self.apos.util.generateId(); - await self.apos.schema.convert(req, schema, input, output); + await self.apos.schema.convert(req, schema, input, output, forcePlaceholder); output.metaType = 'widget'; output.type = self.name; output.aposPlaceholder = self.apos.launder.boolean(input.aposPlaceholder); From 0f5914ba7f738d83dc19f5c7b72ad4fa90b33582 Mon Sep 17 00:00:00 2001 From: Etienne Laurent Date: Mon, 10 Oct 2022 17:27:30 +0200 Subject: [PATCH 13/13] TODO --- .../ui/apos/components/AposArrayEditor.vue | 46 ++++++++++++++++++- 1 file changed, 45 insertions(+), 1 deletion(-) diff --git a/modules/@apostrophecms/schema/ui/apos/components/AposArrayEditor.vue b/modules/@apostrophecms/schema/ui/apos/components/AposArrayEditor.vue index f8e6ad21b1..86a4c48af1 100644 --- a/modules/@apostrophecms/schema/ui/apos/components/AposArrayEditor.vue +++ b/modules/@apostrophecms/schema/ui/apos/components/AposArrayEditor.vue @@ -357,11 +357,55 @@ export default { }, newInstance() { const instance = {}; + // TODO: pseudo code: + // CALL /api/v1/@apostrophecms/schema/new-array-item { scopedArrayName: field.scopedArrayName } + // IN BACK-END + // const schema = self.getArrayManager(scopedArrayName).schema; + // newInstance(req) { + // if (req) { + // return body(); + // } else { + // return legacy(); + // } + // async function body() { ... } + // } + const format = item => { + if (typeof item === 'string') { + return { + _id: cuid(), + type: item, + metaType: 'widget' + }; + } + for (const key in item) { + if (Array.isArray(item[key])) { + item[key] = item[key].map(format); + } + } + return { + _id: cuid(), + ...item, + metaType: 'widget' + }; + }; + for (const field of this.schema) { - if (field.def !== undefined) { + if (field.def === undefined) { + instance[field.name] = null; + continue; + } + if (field.type !== 'area') { instance[field.name] = klona(field.def); + continue; } + + instance[field.name] = { + _id: cuid(), + items: field.def.map(format), + metaType: 'area' + }; } + console.log('instance', instance); return instance; }, label(item) {