Browse Source

Merge pull request #4692 from mfilser/custom_field_string_templates_regexp_possible

RegExp possible at "Custom Field String Templates"
Lauri Ojansivu 2 years ago
parent
commit
48b7ce8273

+ 7 - 8
client/components/cards/cardCustomFields.js

@@ -2,6 +2,7 @@ import moment from 'moment/min/moment-with-locales';
 import { TAPi18n } from '/imports/i18n';
 import { TAPi18n } from '/imports/i18n';
 import { DatePicker } from '/client/lib/datepicker';
 import { DatePicker } from '/client/lib/datepicker';
 import Cards from '/models/cards';
 import Cards from '/models/cards';
+import { CustomFieldStringTemplate } from '/client/lib/customFields'
 
 
 Template.cardCustomFieldsPopup.helpers({
 Template.cardCustomFieldsPopup.helpers({
   hasCustomField() {
   hasCustomField() {
@@ -245,21 +246,18 @@ CardCustomField.register('cardCustomField');
 }.register('cardCustomField-dropdown'));
 }.register('cardCustomField-dropdown'));
 
 
 // cardCustomField-stringtemplate
 // cardCustomField-stringtemplate
-(class extends CardCustomField {
+class CardCustomFieldStringTemplate extends CardCustomField {
   onCreated() {
   onCreated() {
     super.onCreated();
     super.onCreated();
 
 
-    this.stringtemplateFormat = this.data().definition.settings.stringtemplateFormat;
-    this.stringtemplateSeparator = this.data().definition.settings.stringtemplateSeparator;
+    this.customField = new CustomFieldStringTemplate(this.data().definition);
 
 
     this.stringtemplateItems = new ReactiveVar(this.data().value ?? []);
     this.stringtemplateItems = new ReactiveVar(this.data().value ?? []);
   }
   }
 
 
   formattedValue() {
   formattedValue() {
-    return (this.data().value ?? [])
-      .filter(value => !!value.trim())
-      .map(value => this.stringtemplateFormat.replace(/%\{value\}/gi, value))
-      .join(this.stringtemplateSeparator ?? '');
+    const ret = this.customField.getFormattedValue(this.data().value);
+    return ret;
   }
   }
 
 
   getItems() {
   getItems() {
@@ -330,4 +328,5 @@ CardCustomField.register('cardCustomField');
       },
       },
     ];
     ];
   }
   }
-}.register('cardCustomField-stringtemplate'));
+}
+CardCustomFieldStringTemplate.register('cardCustomField-stringtemplate');

+ 3 - 6
client/components/cards/minicard.js

@@ -1,4 +1,5 @@
 import { TAPi18n } from '/imports/i18n';
 import { TAPi18n } from '/imports/i18n';
+import { CustomFieldStringTemplate } from '/client/lib/customFields'
 
 
 // Template.cards.events({
 // Template.cards.events({
 //   'click .member': Popup.open('cardMember')
 //   'click .member': Popup.open('cardMember')
@@ -31,12 +32,8 @@ BlazeComponent.extendComponent({
     const customFieldTrueValue =
     const customFieldTrueValue =
       customField && customField.trueValue ? customField.trueValue : [];
       customField && customField.trueValue ? customField.trueValue : [];
 
 
-    return customFieldTrueValue
-      .filter(value => !!value.trim())
-      .map(value =>
-        definition.settings.stringtemplateFormat.replace(/%\{value\}/gi, value),
-      )
-      .join(definition.settings.stringtemplateSeparator ?? '');
+    const ret = new CustomFieldStringTemplate(definition).getFormattedValue(customFieldTrueValue);
+    return ret;
   },
   },
 
 
   showCreator() {
   showCreator() {

+ 38 - 0
client/lib/customFields.js

@@ -0,0 +1,38 @@
+class CustomField {
+  constructor(definition) {
+    this.definition = definition;
+  }
+}
+
+export class CustomFieldStringTemplate extends CustomField {
+  constructor(definition) {
+    super(definition);
+    this.format = definition.settings.stringtemplateFormat;
+    this.separator = definition.settings.stringtemplateSeparator;
+  }
+
+  getFormattedValue(rawValue) {
+    const ret = (rawValue ?? [])
+      .filter(value => !!value.trim())
+      .map(value => {
+        let _ret = this.format.replace(/[%$]\{.+?[^0-9]\}/g, function(_match) {
+          let __ret;
+          if (_match.match(/%\{value\}/i)) {
+            __ret = value;
+          } else {
+            _match = _match.replace(/^\$/, "");
+            try {
+              const _json = JSON.parse(_match);
+              __ret =  value.replace(new RegExp(_json.regex, _json.flags), _json.replace);
+            } catch (err) {
+              console.error(err);
+            }
+          }
+          return __ret;
+        });
+        return _ret;
+      })
+      .join(this.separator ?? '');
+    return ret;
+  }
+}