From 8846a6816e9f36eed04a446f5f5c7e89b7cbcc47 Mon Sep 17 00:00:00 2001 From: LorenzoJokhan Date: Tue, 7 Mar 2023 14:18:55 +0100 Subject: [PATCH] Feature/group tags like mzm (#386) * Added grouping capabilities to tags on ideas(plannen) on create plannen page * Added tagid to checbox and label instead of non working option * specify if theme labels should be shown * Made it so tags can be grouped by use of extraData.theme * Changed default of showing labels to false for and made name consistent * Changed implementation to use type * Put back cache * Renamed theme fields to tagType * Added cache key for if an empty list was fetched * Added cachekey for empty list --- .../modules/openstad-pages/lib/load-tags.js | 15 ++++- .../resource-form-widgets/lib/fields.js | 23 ++++++- .../views/includes/fields/tags.html | 61 +++++++++++++++---- .../resource-overview-widgets/index.js | 2 + .../lib/arrangeFields.js | 2 +- .../resource-overview-widgets/lib/fields.js | 20 ++++++ .../views/includes/controls/tags.html | 46 ++++++++++++-- 7 files changed, 146 insertions(+), 23 deletions(-) diff --git a/packages/cms/lib/modules/openstad-pages/lib/load-tags.js b/packages/cms/lib/modules/openstad-pages/lib/load-tags.js index 77ce69f5c..e27fb13b3 100644 --- a/packages/cms/lib/modules/openstad-pages/lib/load-tags.js +++ b/packages/cms/lib/modules/openstad-pages/lib/load-tags.js @@ -1,4 +1,5 @@ const rp = require('request-promise'); +const _ = require('lodash'); const moment = require('moment'); // returns the new locale, in this case 'de' const url = require('url'); const internalApiUrl = process.env.INTERNAL_API_URL; @@ -17,18 +18,23 @@ module.exports = function (req, res, next) { */ if (globalData.siteId) { let tags; - + let retrievedEmpty = false; // if cacheIdeas is turned on, get ideas from cache // cacheIdeas is old key, should be refactored, // preferable we always have caching on + if (globalData.cacheIdeas) { let cacheKey = 'tags-' + globalData.siteId; tags = cache.get(cacheKey); + retrievedEmpty = cache.get(globalData.siteId + '-retrieved-tags-empty'); } - + if (Array.isArray(tags)) { req.data.openstadTags = tags; next(); + } else if(retrievedEmpty) { + req.data.openstadTags = []; + next(); } else { var options = { @@ -42,9 +48,14 @@ module.exports = function (req, res, next) { //add tags to to the data object so it's available in templates //use openstadTags instead of tags to prevent colliding with Apos req.data.openstadTags = response; + req.data.groupedOpenstadTags = _.groupBy(response, function(tag){return tag.type}); // set the cache if (globalData.cacheIdeas) { + cache.set(globalData.siteId + '-retrieved-tags-empty', response.length === 0, { + life: cacheLifespan + }) + cache.set('tags-' +req.data.global.siteId, response, { life: cacheLifespan }); diff --git a/packages/cms/lib/modules/resource-form-widgets/lib/fields.js b/packages/cms/lib/modules/resource-form-widgets/lib/fields.js index e2839af36..9a84661ca 100644 --- a/packages/cms/lib/modules/resource-form-widgets/lib/fields.js +++ b/packages/cms/lib/modules/resource-form-widgets/lib/fields.js @@ -148,7 +148,7 @@ const fields = [ { value: 'tags', label: "Tags (currently only works for ideas)", - showFields: ['fieldKey', 'fieldRequired', 'fieldMin', 'fieldMax'] + showFields: ['fieldKey', 'fieldRequired', 'tagType', 'showTagTypeLabels', 'fieldMin', 'fieldMax'] }, { value: 'raw', @@ -296,6 +296,27 @@ const fields = [ type: 'string', textarea: true }, + { + name: 'tagType', + label: 'Optionally specify the single type (one word) by which to fetch the tags.', + type: 'string' + }, + { + name: 'showTagTypeLabels', + label: 'When the above option is empty, select if the corresponding types should be shown or not', + type: 'boolean', + choices: [ + { + label: 'Yes', + value: true, + }, + { + label: 'No', + value: false, + } + ], + def: false + }, { name: 'notExtraDataKey', label: 'Save field in root if data object and not in extraData, will only work if column exists in database)', diff --git a/packages/cms/lib/modules/resource-form-widgets/views/includes/fields/tags.html b/packages/cms/lib/modules/resource-form-widgets/views/includes/fields/tags.html index 1f1aafca9..d5c445c27 100644 --- a/packages/cms/lib/modules/resource-form-widgets/views/includes/fields/tags.html +++ b/packages/cms/lib/modules/resource-form-widgets/views/includes/fields/tags.html @@ -1,17 +1,52 @@
- {% for tag in data.openstadTags %} -
- - + {% if field.tagType + and data.groupedOpenstadTags[field.tagType] + and data.groupedOpenstadTags[field.tagType].length %} + + {% for tag in data.groupedOpenstadTags[field.tagType] %} +
+ + +
+ {% endfor %} + {% endif %}
+ + + {% if field.tagType === '' or field.tagType === undefined %} + {% for key, tagList in data.groupedOpenstadTags %} + {% set outer_loop = loop %} + + {% if field.showTagTypeLabels %} + {% if outer_loop.length > 1 and key !== 'undefined' %} +

{{key}}

+ {% endif %} + + {% if outer_loop.length > 1 and key == 'undefined' %} +

Overig

+ {% endif %} + {% endif %} + + {% for tag in tagList %} +
+ + +
+ {% endfor %} {% endfor %} +{% endif %}
diff --git a/packages/cms/lib/modules/resource-overview-widgets/index.js b/packages/cms/lib/modules/resource-overview-widgets/index.js index 37005a532..d9f9033ed 100644 --- a/packages/cms/lib/modules/resource-overview-widgets/index.js +++ b/packages/cms/lib/modules/resource-overview-widgets/index.js @@ -261,6 +261,8 @@ module.exports = { return Object.assign({}, tag); }) : []; + widget.groupedOpenstadTags = req.data.groupedOpenstadTags; + let response; // if cache is turned on, check if current url is available in cache diff --git a/packages/cms/lib/modules/resource-overview-widgets/lib/arrangeFields.js b/packages/cms/lib/modules/resource-overview-widgets/lib/arrangeFields.js index 9382f176a..2e290ba93 100644 --- a/packages/cms/lib/modules/resource-overview-widgets/lib/arrangeFields.js +++ b/packages/cms/lib/modules/resource-overview-widgets/lib/arrangeFields.js @@ -55,7 +55,7 @@ module.exports = (self, options) => { { name: 'tags', label: 'Tags', - fields: ['displayTagFilters'] + fields: ['displayTagFilters', 'tagType', 'showTagTypeLabels'] }, { name: 'include_exclude', diff --git a/packages/cms/lib/modules/resource-overview-widgets/lib/fields.js b/packages/cms/lib/modules/resource-overview-widgets/lib/fields.js index fede604cc..7743c5616 100644 --- a/packages/cms/lib/modules/resource-overview-widgets/lib/fields.js +++ b/packages/cms/lib/modules/resource-overview-widgets/lib/fields.js @@ -541,6 +541,26 @@ module.exports = [ } ], }, + { + name: 'tagType', + label: 'If specified only show tags belonging to a certain type', + type: 'string', + }, + { + name: 'showTagTypeLabels', + label: 'If no tag type is specified, should the type name be shown per group?', + type: 'boolean', + choices: [ + { + label: 'Yes', + value: true + }, + { + label: 'No', + value: false, + } + ], + }, { name: 'displaySorting', label: 'Display sorting', diff --git a/packages/cms/lib/modules/resource-overview-widgets/views/includes/controls/tags.html b/packages/cms/lib/modules/resource-overview-widgets/views/includes/controls/tags.html index 3ba68c960..6aec1f4ac 100644 --- a/packages/cms/lib/modules/resource-overview-widgets/views/includes/controls/tags.html +++ b/packages/cms/lib/modules/resource-overview-widgets/views/includes/controls/tags.html @@ -5,13 +5,47 @@