@genesislcap/pbc-notify-ui 14.484.2 → 14.485.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -89,7 +89,7 @@
89
89
  "type": {
90
90
  "text": "array"
91
91
  },
92
- "default": "[\n {\n label: 'Equals',\n operator: 'EQUALS',\n },\n {\n label: 'Not Equals',\n operator: 'NOT_EQUALS',\n },\n {\n label: 'Greater Than',\n operator: 'GREATER_THAN',\n },\n {\n label: 'Less Than',\n operator: 'LESS_THAN',\n },\n {\n label: 'Null',\n operator: 'NULL',\n },\n {\n label: 'Not Null',\n operator: 'NOT_NULL',\n },\n {\n label: 'Blank',\n operator: 'BLANK',\n },\n {\n label: 'Not Blank',\n operator: 'NOT_BLANK',\n },\n]"
92
+ "default": "[\n {\n label: 'Equals',\n operator: 'EQUALS',\n },\n {\n label: 'Not Equals',\n operator: 'NOT_EQUALS',\n },\n {\n label: 'Greater Than',\n operator: 'GREATER_THAN',\n },\n {\n label: 'Less Than',\n operator: 'LESS_THAN',\n },\n {\n label: 'Starts With',\n operator: 'STARTS_WITH',\n },\n {\n label: 'Ends With',\n operator: 'ENDS_WITH',\n },\n {\n label: 'Null',\n operator: 'NULL',\n },\n {\n label: 'Not Null',\n operator: 'NOT_NULL',\n },\n {\n label: 'Blank',\n operator: 'BLANK',\n },\n {\n label: 'Not Blank',\n operator: 'NOT_BLANK',\n },\n]"
93
93
  },
94
94
  {
95
95
  "kind": "variable",
@@ -1831,6 +1831,24 @@
1831
1831
  }
1832
1832
  ]
1833
1833
  },
1834
+ {
1835
+ "kind": "method",
1836
+ "name": "hasUnsupportedOperator",
1837
+ "static": true,
1838
+ "return": {
1839
+ "type": {
1840
+ "text": "boolean"
1841
+ }
1842
+ },
1843
+ "parameters": [
1844
+ {
1845
+ "name": "conditions",
1846
+ "type": {
1847
+ "text": "ConditionNode[]"
1848
+ }
1849
+ }
1850
+ ]
1851
+ },
1834
1852
  {
1835
1853
  "kind": "method",
1836
1854
  "name": "flattenConditions",
@@ -1 +1 @@
1
- {"version":3,"file":"rule-dialog.d.ts","sourceRoot":"","sources":["../../../../../../../src/components/foundation-notification-dashboard/components/rules/rule-dialog/rule-dialog.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,kCAAkC,CAAC;AAC9D,OAAO,EAAiB,cAAc,EAAc,MAAM,uBAAuB,CAAC;AAClF,OAAO,EAEL,aAAa,EAGb,UAAU,EACX,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAE,aAAa,EAAE,MAAM,wCAAwC,CAAC;AACvE,OAAO,EAAE,WAAW,EAAE,MAAM,sCAAsC,CAAC;AACnE,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE,MAAM,wCAAwC,CAAC;AAU9E,OAAO,EAAQ,cAAc,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAE7E;;;;;GAKG;AACH,qBAKa,UAAW,SAAQ,cAAc;IAC/B,WAAW,EAAE,WAAW,CAAC;IACvB,aAAa,EAAE,aAAa,CAAC;IAC7B,aAAa,EAAE,aAAa,CAAC;IAE5C,MAAM,EAAE,KAAK,CAAC;IACF,cAAc,EAAE,CAAC,OAAO,cAAc,CAAC,CAAC,MAAM,OAAO,cAAc,CAAC,CAAC;IAEjF,OAAO,CAAC,MAAM,CAAgB;IAClB,IAAI,EAAE,MAAM,CAAM;IAClB,WAAW,EAAE,MAAM,CAAM;IACzB,QAAQ,EAAE,MAAM,CAAM;IACtB,KAAK,EAAE,MAAM,CAAM;IACnB,QAAQ,EAAE,MAAM,CAAM;IACtB,UAAU,EAAE,UAAU,EAAE,CAAqB;IAC7C,MAAM,EAAE,MAAM,CAAM;IACpB,OAAO,EAAE,MAAM,CAAM;IACrB,UAAU,EAAE,KAAK,CAAC,aAAa,CAAC,CAAM;IACtC,cAAc,EAAE,OAAO,CAAC;IAIxB,oBAAoB,EAAE,MAAM,CAAM;IAElC,SAAS,EAAE,KAAK,CAAC,MAAM,CAAC,CAAM;IAC9B,MAAM,EAAE,KAAK,CAAC,KAAK,CAAC,CAAM;IAC1B,MAAM,EAAE,MAAM,EAAE,CAAM;IAErB,UAAU,CAAC,MAAM,EAAE,gBAAgB;IAmBhD,KAAK;YAsBS,UAAU;YAUV,QAAQ;IAuBtB,OAAO,CAAC,wBAAwB;IAQhC,OAAO,CAAC,oBAAoB;IAc5B,IAAI,eAAe,IAAI,MAAM,CAE5B;IAED,MAAM;IAaN,OAAO,CAAC,gBAAgB;IAiCxB,gBAAgB,CAAC,QAAQ,KAAA;IASnB,eAAe;IAOrB,YAAY;IAKZ,QAAQ;IAKR,aAAa,CAAC,eAAe,EAAE,aAAa;IAI5C,eAAe,CAAC,gBAAgB,EAAE,aAAa;IAUxC,sBAAsB;CAK9B"}
1
+ {"version":3,"file":"rule-dialog.d.ts","sourceRoot":"","sources":["../../../../../../../src/components/foundation-notification-dashboard/components/rules/rule-dialog/rule-dialog.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,kCAAkC,CAAC;AAC9D,OAAO,EAAiB,cAAc,EAAc,MAAM,uBAAuB,CAAC;AAClF,OAAO,EAEL,aAAa,EAGb,UAAU,EACX,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAE,aAAa,EAAE,MAAM,wCAAwC,CAAC;AACvE,OAAO,EAAE,WAAW,EAAE,MAAM,sCAAsC,CAAC;AACnE,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE,MAAM,wCAAwC,CAAC;AAU9E,OAAO,EAAQ,cAAc,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAE7E;;;;;GAKG;AACH,qBAKa,UAAW,SAAQ,cAAc;IAC/B,WAAW,EAAE,WAAW,CAAC;IACvB,aAAa,EAAE,aAAa,CAAC;IAC7B,aAAa,EAAE,aAAa,CAAC;IAE5C,MAAM,EAAE,KAAK,CAAC;IACF,cAAc,EAAE,CAAC,OAAO,cAAc,CAAC,CAAC,MAAM,OAAO,cAAc,CAAC,CAAC;IAEjF,OAAO,CAAC,MAAM,CAAgB;IAClB,IAAI,EAAE,MAAM,CAAM;IAClB,WAAW,EAAE,MAAM,CAAM;IACzB,QAAQ,EAAE,MAAM,CAAM;IACtB,KAAK,EAAE,MAAM,CAAM;IACnB,QAAQ,EAAE,MAAM,CAAM;IACtB,UAAU,EAAE,UAAU,EAAE,CAAqB;IAC7C,MAAM,EAAE,MAAM,CAAM;IACpB,OAAO,EAAE,MAAM,CAAM;IACrB,UAAU,EAAE,KAAK,CAAC,aAAa,CAAC,CAAM;IACtC,cAAc,EAAE,OAAO,CAAC;IAIxB,oBAAoB,EAAE,MAAM,CAAM;IAElC,SAAS,EAAE,KAAK,CAAC,MAAM,CAAC,CAAM;IAC9B,MAAM,EAAE,KAAK,CAAC,KAAK,CAAC,CAAM;IAC1B,MAAM,EAAE,MAAM,EAAE,CAAM;IAErB,UAAU,CAAC,MAAM,EAAE,gBAAgB;IAmBhD,KAAK;YAsBS,UAAU;YAUV,QAAQ;IAuBtB,OAAO,CAAC,wBAAwB;IAQhC,OAAO,CAAC,oBAAoB;IAc5B,IAAI,eAAe,IAAI,MAAM,CAE5B;IAED,MAAM;IAaN,OAAO,CAAC,gBAAgB;IAkCxB,gBAAgB,CAAC,QAAQ,KAAA;IASnB,eAAe;IAOrB,YAAY;IAKZ,QAAQ;IAKR,aAAa,CAAC,eAAe,EAAE,aAAa;IAI5C,eAAe,CAAC,gBAAgB,EAAE,aAAa;IAUxC,sBAAsB;CAK9B"}
@@ -1 +1 @@
1
- {"version":3,"file":"template-dialog.d.ts","sourceRoot":"","sources":["../../../../../../../src/components/foundation-notification-dashboard/components/templates/template-dialog/template-dialog.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,kCAAkC,CAAC;AAC9D,OAAO,EAAiB,cAAc,EAAwB,MAAM,uBAAuB,CAAC;AAC5F,OAAO,EAEL,aAAa,EAGb,UAAU,EACX,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAE,aAAa,EAAE,MAAM,wCAAwC,CAAC;AACvE,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE,MAAM,wCAAwC,CAAC;AAC9E,OAAO,EAAE,eAAe,EAAE,MAAM,0CAA0C,CAAC;AAU3E,OAAO,EAAE,sBAAsB,EAAY,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAE/F;;;;;GAKG;AACH,qBAKa,cAAe,SAAQ,cAAc;IAC/B,eAAe,EAAE,eAAe,CAAC;IACnC,aAAa,EAAE,aAAa,CAAC;IAC7B,aAAa,EAAE,aAAa,CAAC;IAE5C,MAAM,EAAE,KAAK,CAAC;IACF,kBAAkB,EAAE,CAAC,OAAO,kBAAkB,CAAC,CAAC,MAAM,OAAO,kBAAkB,CAAC,CACrF;IAEP,OAAO,CAAC,UAAU,CAAgB;IACtB,IAAI,EAAE,MAAM,CAAQ;IACpB,WAAW,EAAE,MAAM,CAAQ;IAC3B,MAAM,MAAQ;IACd,OAAO,MAAQ;IACf,QAAQ,EAAE,MAAM,CAAM;IACtB,KAAK,EAAE,MAAM,CAAM;IACnB,QAAQ,EAAE,MAAM,CAAM;IACtB,UAAU,EAAE,UAAU,EAAE,CAAqB;IAE7C,UAAU,EAAE,KAAK,CAAC,sBAAsB,CAAC,CAAM;IAC/C,UAAU,EAAE,KAAK,CAAC,aAAa,CAAC,CAAM;IAItC,oBAAoB,EAAE,MAAM,CAAM;IAElC,SAAS,EAAE,KAAK,CAAC,MAAM,CAAC,CAAM;IAC9B,MAAM,EAAE,KAAK,CAAC,KAAK,CAAC,CAAM;IAC1B,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,CAAM;IAEvC,OAAO,CAAC,cAAc,CAAkE;IAE3E,UAAU,CAAC,MAAM,EAAE,GAAG;IAoBnC,KAAK;YAuBS,cAAc;YAUd,YAAY;IAwB1B,OAAO,CAAC,wBAAwB;IAQhC,OAAO,CAAC,oBAAoB;IAc5B,IAAI,mBAAmB,IAAI,MAAM,CAEhC;IAED,MAAM;IAwBN,OAAO,CAAC,oBAAoB;IAqC5B,gBAAgB,CAAC,QAAQ,KAAA;IASnB,eAAe;IAOrB,YAAY;IAKZ,QAAQ;IAKR,aAAa,CAAC,eAAe,EAAE,aAAa;IAI5C,eAAe,CAAC,gBAAgB,EAAE,aAAa;IAW/C,YAAY;IAIZ,aAAa,CAAC,eAAe,EAAE,sBAAsB;IAIrD,eAAe,CAAC,gBAAgB,EAAE,sBAAsB;IAYxD,IACW,sBAAsB,IAAI,OAAO,CAE3C;CACF"}
1
+ {"version":3,"file":"template-dialog.d.ts","sourceRoot":"","sources":["../../../../../../../src/components/foundation-notification-dashboard/components/templates/template-dialog/template-dialog.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,kCAAkC,CAAC;AAC9D,OAAO,EAAiB,cAAc,EAAwB,MAAM,uBAAuB,CAAC;AAC5F,OAAO,EAEL,aAAa,EAGb,UAAU,EACX,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAE,aAAa,EAAE,MAAM,wCAAwC,CAAC;AACvE,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE,MAAM,wCAAwC,CAAC;AAC9E,OAAO,EAAE,eAAe,EAAE,MAAM,0CAA0C,CAAC;AAU3E,OAAO,EAAE,sBAAsB,EAAY,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAE/F;;;;;GAKG;AACH,qBAKa,cAAe,SAAQ,cAAc;IAC/B,eAAe,EAAE,eAAe,CAAC;IACnC,aAAa,EAAE,aAAa,CAAC;IAC7B,aAAa,EAAE,aAAa,CAAC;IAE5C,MAAM,EAAE,KAAK,CAAC;IACF,kBAAkB,EAAE,CAAC,OAAO,kBAAkB,CAAC,CAAC,MAAM,OAAO,kBAAkB,CAAC,CACrF;IAEP,OAAO,CAAC,UAAU,CAAgB;IACtB,IAAI,EAAE,MAAM,CAAQ;IACpB,WAAW,EAAE,MAAM,CAAQ;IAC3B,MAAM,MAAQ;IACd,OAAO,MAAQ;IACf,QAAQ,EAAE,MAAM,CAAM;IACtB,KAAK,EAAE,MAAM,CAAM;IACnB,QAAQ,EAAE,MAAM,CAAM;IACtB,UAAU,EAAE,UAAU,EAAE,CAAqB;IAE7C,UAAU,EAAE,KAAK,CAAC,sBAAsB,CAAC,CAAM;IAC/C,UAAU,EAAE,KAAK,CAAC,aAAa,CAAC,CAAM;IAItC,oBAAoB,EAAE,MAAM,CAAM;IAElC,SAAS,EAAE,KAAK,CAAC,MAAM,CAAC,CAAM;IAC9B,MAAM,EAAE,KAAK,CAAC,KAAK,CAAC,CAAM;IAC1B,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,CAAM;IAEvC,OAAO,CAAC,cAAc,CAAkE;IAE3E,UAAU,CAAC,MAAM,EAAE,GAAG;IAoBnC,KAAK;YAuBS,cAAc;YAUd,YAAY;IAwB1B,OAAO,CAAC,wBAAwB;IAQhC,OAAO,CAAC,oBAAoB;IAc5B,IAAI,mBAAmB,IAAI,MAAM,CAEhC;IAED,MAAM;IAwBN,OAAO,CAAC,oBAAoB;IAsC5B,gBAAgB,CAAC,QAAQ,KAAA;IASnB,eAAe;IAOrB,YAAY;IAKZ,QAAQ;IAKR,aAAa,CAAC,eAAe,EAAE,aAAa;IAI5C,eAAe,CAAC,gBAAgB,EAAE,aAAa;IAW/C,YAAY;IAIZ,aAAa,CAAC,eAAe,EAAE,sBAAsB;IAIrD,eAAe,CAAC,gBAAgB,EAAE,sBAAsB;IAYxD,IACW,sBAAsB,IAAI,OAAO,CAE3C;CACF"}
@@ -32,6 +32,7 @@ export declare class DynamicRuleUtils {
32
32
  static hasMultiValueCondition(conditions: ConditionNode[]): boolean;
33
33
  static hasOrJoin(conditions: ConditionNode[]): boolean;
34
34
  static hasGroup(conditions: ConditionNode[]): boolean;
35
+ static hasUnsupportedOperator(conditions: ConditionNode[]): boolean;
35
36
  static flattenConditions(conditions: ConditionNode[]): ConditionBuilderEntity[];
36
37
  static resolveLeftValues(conditions: ConditionNode[], fields: any[]): ConditionNode[];
37
38
  static createEmptyGroup: () => ConditionGroupEntity;
@@ -1 +1 @@
1
- {"version":3,"file":"notification-dashboard.utils.d.ts","sourceRoot":"","sources":["../../../../src/components/foundation-notification-dashboard/notification-dashboard.utils.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,sBAAsB,EACtB,oBAAoB,EACpB,aAAa,EASd,MAAM,oBAAoB,CAAC;AAG5B,OAAO,EAAE,sBAAsB,EAAE,MAAM,8DAA8D,CAAC;AAEtG,qBAAa,aAAa;IAClB,OAAO,CAAC,MAAM,CAAC,IAAI,CAAO;IAChC,MAAM,CAAC,UAAU,QAAO,MAAM,CAAyB;CACxD;AAED,eAAO,MAAM,OAAO,GAAI,UAAK,YAC8C,CAAC;AAkH5E,qBAAa,gBAAgB;IAC3B,MAAM,CAAC,oBAAoB,QAAO,sBAAsB,CAOrD;IAEH,MAAM,CAAC,gBAAgB,GAAI,OAAO,MAAM,EAAE,OAAO,MAAM;;;;;;;;;MASpD;IAQH,MAAM,CAAC,oBAAoB,GACzB,OAAO,MAAM,EACb,MAAM,MAAM,EACZ,SAAQ;QAAE,UAAU,EAAE,MAAM,CAAA;KAAE,EAAO;;;;;;MAOpC;IAEH,MAAM,CAAC,kBAAkB,GAAI,aAAa,GAAG,EAAE,EAAE,OAAO,MAAM,KAAG,MAAM,CACS;IAIhF,MAAM,CAAC,iBAAiB,GAAI,aAAa,GAAG,EAAE,EAAE,OAAO,MAAM,KAAG,MAAM,CAGpE;IAKF,MAAM,CAAC,gBAAgB,CAAC,UAAU,EAAE,aAAa,EAAE,EAAE,UAAU,CAAC,KAAA,GAAG,GAAG;IAkBtE,MAAM,CAAC,sBAAsB,CAAC,UAAU,EAAE,aAAa,EAAE,GAAG,OAAO;IAUnE,MAAM,CAAC,SAAS,CAAC,UAAU,EAAE,aAAa,EAAE,GAAG,OAAO;IAWtD,MAAM,CAAC,QAAQ,CAAC,UAAU,EAAE,aAAa,EAAE,GAAG,OAAO;IAOrD,MAAM,CAAC,iBAAiB,CAAC,UAAU,EAAE,aAAa,EAAE,GAAG,sBAAsB,EAAE;IAa/E,MAAM,CAAC,iBAAiB,CAAC,UAAU,EAAE,aAAa,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,aAAa,EAAE;IAcrF,MAAM,CAAC,gBAAgB,QAAO,oBAAoB,CAI/C;IAWH,MAAM,CAAC,kBAAkB,CAAC,UAAU,EAAE,aAAa,EAAE,GAAG,MAAM;IAiB9D,MAAM,CAAC,kBAAkB,CAAC,aAAa,EAAE,MAAM,GAAG,aAAa,EAAE,GAAG,IAAI;CAazE;AAqRD,qBAAa,aAAa;IACxB,MAAM,CAAC,oBAAoB,QAAO,sBAAsB,CAOrD;IAEH,MAAM,CAAC,aAAa,CAAC,UAAU,KAAA;;;;;;;;IAe/B,OAAO,CAAC,MAAM,CAAC,eAAe;IAe9B,MAAM,CAAC,aAAa,CAAC,UAAU,KAAA,EAAE,UAAU,CAAC,KAAA;IAgB5C,MAAM,CAAC,sBAAsB,CAAC,UAAU,KAAA;CAmBzC;AAED,qBAAa,SAAS;IACpB,OAAO,CAAC,MAAM,CAAC,eAAe;IAe9B,MAAM,CAAC,aAAa,CAAC,UAAU,KAAA;CAYhC;AAID,wBAAgB,qBAAqB,CAAC,KAAK,KAAA,QAa1C"}
1
+ {"version":3,"file":"notification-dashboard.utils.d.ts","sourceRoot":"","sources":["../../../../src/components/foundation-notification-dashboard/notification-dashboard.utils.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,sBAAsB,EACtB,oBAAoB,EACpB,aAAa,EASd,MAAM,oBAAoB,CAAC;AAG5B,OAAO,EAAE,sBAAsB,EAAE,MAAM,8DAA8D,CAAC;AAEtG,qBAAa,aAAa;IAClB,OAAO,CAAC,MAAM,CAAC,IAAI,CAAO;IAChC,MAAM,CAAC,UAAU,QAAO,MAAM,CAAyB;CACxD;AAED,eAAO,MAAM,OAAO,GAAI,UAAK,YAC8C,CAAC;AAkH5E,qBAAa,gBAAgB;IAC3B,MAAM,CAAC,oBAAoB,QAAO,sBAAsB,CAOrD;IAEH,MAAM,CAAC,gBAAgB,GAAI,OAAO,MAAM,EAAE,OAAO,MAAM;;;;;;;;;MASpD;IAQH,MAAM,CAAC,oBAAoB,GACzB,OAAO,MAAM,EACb,MAAM,MAAM,EACZ,SAAQ;QAAE,UAAU,EAAE,MAAM,CAAA;KAAE,EAAO;;;;;;MAOpC;IAEH,MAAM,CAAC,kBAAkB,GAAI,aAAa,GAAG,EAAE,EAAE,OAAO,MAAM,KAAG,MAAM,CACS;IAIhF,MAAM,CAAC,iBAAiB,GAAI,aAAa,GAAG,EAAE,EAAE,OAAO,MAAM,KAAG,MAAM,CAGpE;IAKF,MAAM,CAAC,gBAAgB,CAAC,UAAU,EAAE,aAAa,EAAE,EAAE,UAAU,CAAC,KAAA,GAAG,GAAG;IAkBtE,MAAM,CAAC,sBAAsB,CAAC,UAAU,EAAE,aAAa,EAAE,GAAG,OAAO;IAUnE,MAAM,CAAC,SAAS,CAAC,UAAU,EAAE,aAAa,EAAE,GAAG,OAAO;IAWtD,MAAM,CAAC,QAAQ,CAAC,UAAU,EAAE,aAAa,EAAE,GAAG,OAAO;IAUrD,MAAM,CAAC,sBAAsB,CAAC,UAAU,EAAE,aAAa,EAAE,GAAG,OAAO;IAYnE,MAAM,CAAC,iBAAiB,CAAC,UAAU,EAAE,aAAa,EAAE,GAAG,sBAAsB,EAAE;IAa/E,MAAM,CAAC,iBAAiB,CAAC,UAAU,EAAE,aAAa,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,aAAa,EAAE;IAcrF,MAAM,CAAC,gBAAgB,QAAO,oBAAoB,CAI/C;IAWH,MAAM,CAAC,kBAAkB,CAAC,UAAU,EAAE,aAAa,EAAE,GAAG,MAAM;IAiB9D,MAAM,CAAC,kBAAkB,CAAC,aAAa,EAAE,MAAM,GAAG,aAAa,EAAE,GAAG,IAAI;CAazE;AAqUD,qBAAa,aAAa;IACxB,MAAM,CAAC,oBAAoB,QAAO,sBAAsB,CAOrD;IAEH,MAAM,CAAC,aAAa,CAAC,UAAU,KAAA;;;;;;;;IAe/B,OAAO,CAAC,MAAM,CAAC,eAAe;IAe9B,MAAM,CAAC,aAAa,CAAC,UAAU,KAAA,EAAE,UAAU,CAAC,KAAA;IAgB5C,MAAM,CAAC,sBAAsB,CAAC,UAAU,KAAA;CAmBzC;AAED,qBAAa,SAAS;IACpB,OAAO,CAAC,MAAM,CAAC,eAAe;IAe9B,MAAM,CAAC,aAAa,CAAC,UAAU,KAAA;CAYhC;AAID,wBAAgB,qBAAqB,CAAC,KAAK,KAAA,QAa1C"}
@@ -3,6 +3,8 @@ export declare enum LogicalOperator {
3
3
  NOT_EQUALS = "NOT_EQUALS",
4
4
  GREATER_THAN = "GREATER_THAN",
5
5
  LESS_THAN = "LESS_THAN",
6
+ STARTS_WITH = "STARTS_WITH",
7
+ ENDS_WITH = "ENDS_WITH",
6
8
  NULL = "NULL",
7
9
  NOT_NULL = "NOT_NULL",
8
10
  BLANK = "BLANK",
@@ -1 +1 @@
1
- {"version":3,"file":"notify.types.d.ts","sourceRoot":"","sources":["../../src/notify.types.ts"],"names":[],"mappings":"AACA,oBAAY,eAAe;IACzB,MAAM,WAAW;IACjB,UAAU,eAAe;IACzB,YAAY,iBAAiB;IAC7B,SAAS,cAAc;IACvB,IAAI,SAAS;IACb,QAAQ,aAAa;IACrB,KAAK,UAAU;IACf,SAAS,cAAc;CACxB;AAED,eAAO,MAAM,gBAAgB;;;GAiC5B,CAAC;AAEF,eAAO,MAAM,oBAAoB;;;GAyBhC,CAAC;AAEF,eAAO,MAAM,iCAAiC,mBAK7C,CAAC;AAEF,oBAAY,aAAa;IACvB,KAAK,UAAU;IACf,UAAU,eAAe;CAC1B;AAED,oBAAY,SAAS;IAEnB,MAAM,WAAW;IACjB,OAAO,YAAY;IACnB,MAAM,WAAW;CAClB;AAED,oBAAY,eAAe;IACzB,SAAS,cAAc;IACvB,aAAa,kBAAkB;IAC/B,OAAO,YAAY;CACpB;AAED,oBAAY,QAAQ;IAClB,WAAW,gBAAgB;IAC3B,QAAQ,aAAa;IACrB,OAAO,YAAY;IACnB,OAAO,YAAY;CACpB;AAED,oBAAY,cAAc;IACxB,KAAK,UAAU;IACf,MAAM,WAAW;IACjB,MAAM,WAAW;IACjB,WAAW,gBAAgB;CAC5B;AAED,oBAAY,UAAU;IACpB,MAAM,WAAW;IACjB,IAAI,SAAS;IACb,eAAe,oBAAoB;IACnC,KAAK,UAAU;CAChB;AAED,oBAAY,UAAU;IACpB,MAAM,WAAW;IACjB,MAAM,WAAW;IACjB,MAAM,WAAW;CAClB;AAED,eAAO,MAAM,iBAAiB,cAAsB,CAAC;AAErD,oBAAY,UAAU;IACpB,KAAK,KAAK;IACV,IAAI,SAAS;CACd;AAID,oBAAY,YAAY;IACtB,GAAG,QAAQ;IACX,EAAE,OAAO;CACV;AAED,MAAM,MAAM,sBAAsB,GAAG;IACnC,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,EAAE,GAAG,CAAC;IAChB,gBAAgB,EAAE,MAAM,CAAC;IACzB,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IAGpB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,CAAC;AAOF,MAAM,MAAM,oBAAoB,GAAG;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,EAAE,aAAa,EAAE,CAAC;CAC3B,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG,sBAAsB,GAAG,oBAAoB,CAAC"}
1
+ {"version":3,"file":"notify.types.d.ts","sourceRoot":"","sources":["../../src/notify.types.ts"],"names":[],"mappings":"AACA,oBAAY,eAAe;IACzB,MAAM,WAAW;IACjB,UAAU,eAAe;IACzB,YAAY,iBAAiB;IAC7B,SAAS,cAAc;IAKvB,WAAW,gBAAgB;IAC3B,SAAS,cAAc;IACvB,IAAI,SAAS;IACb,QAAQ,aAAa;IACrB,KAAK,UAAU;IACf,SAAS,cAAc;CACxB;AAED,eAAO,MAAM,gBAAgB;;;GAyC5B,CAAC;AAEF,eAAO,MAAM,oBAAoB;;;GAyBhC,CAAC;AAEF,eAAO,MAAM,iCAAiC,mBAK7C,CAAC;AAEF,oBAAY,aAAa;IACvB,KAAK,UAAU;IACf,UAAU,eAAe;CAC1B;AAED,oBAAY,SAAS;IAEnB,MAAM,WAAW;IACjB,OAAO,YAAY;IACnB,MAAM,WAAW;CAClB;AAED,oBAAY,eAAe;IACzB,SAAS,cAAc;IACvB,aAAa,kBAAkB;IAC/B,OAAO,YAAY;CACpB;AAED,oBAAY,QAAQ;IAClB,WAAW,gBAAgB;IAC3B,QAAQ,aAAa;IACrB,OAAO,YAAY;IACnB,OAAO,YAAY;CACpB;AAED,oBAAY,cAAc;IACxB,KAAK,UAAU;IACf,MAAM,WAAW;IACjB,MAAM,WAAW;IACjB,WAAW,gBAAgB;CAC5B;AAED,oBAAY,UAAU;IACpB,MAAM,WAAW;IACjB,IAAI,SAAS;IACb,eAAe,oBAAoB;IACnC,KAAK,UAAU;CAChB;AAED,oBAAY,UAAU;IACpB,MAAM,WAAW;IACjB,MAAM,WAAW;IACjB,MAAM,WAAW;CAClB;AAED,eAAO,MAAM,iBAAiB,cAAsB,CAAC;AAErD,oBAAY,UAAU;IACpB,KAAK,KAAK;IACV,IAAI,SAAS;CACd;AAID,oBAAY,YAAY;IACtB,GAAG,QAAQ;IACX,EAAE,OAAO;CACV;AAED,MAAM,MAAM,sBAAsB,GAAG;IACnC,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,EAAE,GAAG,CAAC;IAChB,gBAAgB,EAAE,MAAM,CAAC;IACzB,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IAGpB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,CAAC;AAOF,MAAM,MAAM,oBAAoB,GAAG;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,EAAE,aAAa,EAAE,CAAC;CAC3B,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG,sBAAsB,GAAG,oBAAoB,CAAC"}
@@ -149,7 +149,8 @@ let RuleDialog = class RuleDialog extends GenesisElement {
149
149
  // structured CONDITIONS. The server branches on which one is non-null.
150
150
  const useRaw = DynamicRuleUtils.hasMultiValueCondition(this.conditions) ||
151
151
  DynamicRuleUtils.hasOrJoin(this.conditions) ||
152
- DynamicRuleUtils.hasGroup(this.conditions);
152
+ DynamicRuleUtils.hasGroup(this.conditions) ||
153
+ DynamicRuleUtils.hasUnsupportedOperator(this.conditions);
153
154
  return Object.assign(Object.assign({}, (this.ruleDialogMode === RuleDialogMode.EDIT && { DYNAMIC_RULE_ID: this.ruleId })), { RULE_NAME: this.name, RULE_DESCRIPTION: this.description, RULE_TABLE: this.resource, TABLE_OPERATIONS: this.updateType, RULE_EXPRESSION: useRaw
154
155
  ? null
155
156
  : {
@@ -166,7 +166,8 @@ let TemplateDialog = class TemplateDialog extends GenesisElement {
166
166
  // excluded automatically.
167
167
  const useRaw = DynamicRuleUtils.hasMultiValueCondition(this.conditions) ||
168
168
  DynamicRuleUtils.hasOrJoin(this.conditions) ||
169
- DynamicRuleUtils.hasGroup(this.conditions);
169
+ DynamicRuleUtils.hasGroup(this.conditions) ||
170
+ DynamicRuleUtils.hasUnsupportedOperator(this.conditions);
170
171
  return Object.assign(Object.assign({}, (this.templateDialogMode === TemplateDialogMode.EDIT && {
171
172
  DYNAMIC_RULE_ID: this.templateId,
172
173
  })), { RULE_NAME: this.name, RULE_DESCRIPTION: this.description, RULE_TABLE: this.resource, TABLE_OPERATIONS: this.updateType, RULE_EXPRESSION: useRaw
@@ -156,6 +156,18 @@ export class DynamicRuleUtils {
156
156
  static hasGroup(conditions) {
157
157
  return conditions.some(isGroupNode);
158
158
  }
159
+ // STARTS_WITH/ENDS_WITH compile to a Groovy method-call clause
160
+ // (`FIELD.startsWith("value")`), which the structured CONDITIONS format
161
+ // cannot express - genesis-criteria's server-side Operation enum only has
162
+ // ==, !=, >, < (see EvaluatorExpressionParser). Any condition using one of
163
+ // these always forces RAW_RULE_EXPRESSION, same as a group or multi-value
164
+ // condition.
165
+ static hasUnsupportedOperator(conditions) {
166
+ return conditions.some((node) => isGroupNode(node)
167
+ ? DynamicRuleUtils.hasUnsupportedOperator(node.CHILDREN)
168
+ : node.LOGICAL_OPERATOR === LogicalOperator.STARTS_WITH ||
169
+ node.LOGICAL_OPERATOR === LogicalOperator.ENDS_WITH);
170
+ }
159
171
  // Flattens a condition/group tree into just its leaf conditions, at any
160
172
  // depth - for callers that only care about "is this parameter used
161
173
  // anywhere" and don't need to know the group structure.
@@ -329,6 +341,17 @@ const resolveTemplateTextExpression = (expr) => {
329
341
  return (_b = expr.VALUE) !== null && _b !== void 0 ? _b : '';
330
342
  }
331
343
  };
344
+ // Escapes a value for safe interpolation into a double-quoted Groovy string
345
+ // literal, guarding both injection routes double-quoted Groovy strings allow:
346
+ // 1. Breaking out of the literal, e.g. RIGHT_VALUE = `x") || (1==1` - closed
347
+ // off by escaping `"`.
348
+ // 2. GString interpolation, e.g. RIGHT_VALUE = `${1==1}` or `$foo` - Groovy
349
+ // evaluates `${...}`/`$identifier` as live code INSIDE a double-quoted
350
+ // string even without breaking out of it, so `"` alone is not enough;
351
+ // escaping `$` as `\$` forces it to stay a literal dollar sign.
352
+ // Order matters: backslash must be escaped first, before the other two
353
+ // replacements introduce new backslashes of their own.
354
+ const escapeGroovyStringLiteral = (value) => value.replace(/\\/g, '\\\\').replace(/"/g, '\\"').replace(/\$/g, '\\$');
332
355
  const buildConditionClause = (condition) => {
333
356
  var _b;
334
357
  const name = condition.LEFT_VALUE.FIELD_NAME;
@@ -340,6 +363,21 @@ const buildConditionClause = (condition) => {
340
363
  if (logicalOperator === LogicalOperator.BLANK || logicalOperator === LogicalOperator.NOT_BLANK) {
341
364
  return `(${name} ${logicalOperator === LogicalOperator.BLANK ? '==' : '!='} "")`;
342
365
  }
366
+ if (logicalOperator === LogicalOperator.STARTS_WITH ||
367
+ logicalOperator === LogicalOperator.ENDS_WITH) {
368
+ // No structured-CONDITIONS representation - compiled as a Groovy method
369
+ // call, evaluated at runtime via the platform's Groovy-backed
370
+ // EvaluatorPool (confirmed: RAW_RULE_EXPRESSION is stored verbatim and
371
+ // never re-validated by the structured-expression parser at load/eval
372
+ // time, only at create/edit-time in the dashboard itself). Unlike the
373
+ // ==/>/< path below, the argument is always a String literal regardless
374
+ // of the field's own type - String.startsWith/endsWith takes a
375
+ // CharSequence, so UNQUOTED_FIELD_TYPES (which exists for bare numeric/
376
+ // boolean comparisons) doesn't apply here.
377
+ const method = logicalOperator === LogicalOperator.STARTS_WITH ? 'startsWith' : 'endsWith';
378
+ const value = escapeGroovyStringLiteral(String(condition.RIGHT_VALUE));
379
+ return `(${name}.${method}("${value}"))`;
380
+ }
343
381
  const op = (_b = OPERATOR_SYMBOLS[logicalOperator]) !== null && _b !== void 0 ? _b : '==';
344
382
  // Rules support a "FIELD" RIGHT_CRITERIA (compare to another field) via a
345
383
  // separate RightCriteria enum (rule-condition-builder.types.ts) that this
@@ -384,6 +422,22 @@ const parseAtom = (atom) => {
384
422
  value: '',
385
423
  };
386
424
  }
425
+ // FIELD.startsWith("value") / FIELD.endsWith("value") - the method-call
426
+ // clause buildConditionClause emits for STARTS_WITH/ENDS_WITH. Reverses
427
+ // escapeGroovyStringLiteral so the value round-trips through edit unchanged.
428
+ const methodMatch = inner.match(/^([A-Za-z0-9_]+)\.(startsWith|endsWith)\("(.*)"\)$/);
429
+ if (methodMatch) {
430
+ return {
431
+ name: methodMatch[1].trim(),
432
+ operator: methodMatch[2] === 'startsWith' ? LogicalOperator.STARTS_WITH : LogicalOperator.ENDS_WITH,
433
+ // Single combined-pattern pass (not sequential independent replaces) so
434
+ // an escaped backslash immediately followed by an escaped quote/dollar
435
+ // can't be misinterpreted - each `\` in the raw text is always followed
436
+ // by exactly one of \, ", or $ (escapeGroovyStringLiteral's output),
437
+ // and this consumes both characters together in one match.
438
+ value: methodMatch[3].replace(/\\([\\"$])/g, '$1'),
439
+ };
440
+ }
387
441
  const symbol = ['==', '!=', '>', '<'].find((s) => inner.includes(` ${s} `));
388
442
  if (!symbol)
389
443
  return null;
@@ -5,6 +5,12 @@ export var LogicalOperator;
5
5
  LogicalOperator["NOT_EQUALS"] = "NOT_EQUALS";
6
6
  LogicalOperator["GREATER_THAN"] = "GREATER_THAN";
7
7
  LogicalOperator["LESS_THAN"] = "LESS_THAN";
8
+ // No structured-CONDITIONS representation server-side (genesis-criteria's
9
+ // Operation enum has no string-method operator) - a condition using either
10
+ // of these always compiles to RAW_RULE_EXPRESSION. See
11
+ // DynamicRuleUtils.hasUnsupportedOperator.
12
+ LogicalOperator["STARTS_WITH"] = "STARTS_WITH";
13
+ LogicalOperator["ENDS_WITH"] = "ENDS_WITH";
8
14
  LogicalOperator["NULL"] = "NULL";
9
15
  LogicalOperator["NOT_NULL"] = "NOT_NULL";
10
16
  LogicalOperator["BLANK"] = "BLANK";
@@ -27,6 +33,14 @@ export const LogicalOperators = [
27
33
  label: 'Less Than',
28
34
  operator: 'LESS_THAN',
29
35
  },
36
+ {
37
+ label: 'Starts With',
38
+ operator: 'STARTS_WITH',
39
+ },
40
+ {
41
+ label: 'Ends With',
42
+ operator: 'ENDS_WITH',
43
+ },
30
44
  {
31
45
  label: 'Null',
32
46
  operator: 'NULL',
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@genesislcap/pbc-notify-ui",
3
3
  "description": "Genesis PBC Notify UI",
4
- "version": "14.484.2",
4
+ "version": "14.485.0",
5
5
  "license": "SEE LICENSE IN license.txt",
6
6
  "workspaces": [
7
7
  "client"
@@ -83,30 +83,30 @@
83
83
  "@commitlint/format": "^19.0.3",
84
84
  "@genesiscommunitysuccess/cep-fast-plugin": "5.0.3",
85
85
  "@genesiscommunitysuccess/custom-elements-lsp": "5.0.3",
86
- "@genesislcap/design-system-configurator": "14.484.2",
87
- "@genesislcap/eslint-config": "14.484.2",
88
- "@genesislcap/eslint-stylelint-builder": "14.484.2",
89
- "@genesislcap/foundation-testing": "14.484.2",
90
- "@genesislcap/genx": "14.484.2",
91
- "@genesislcap/prettier-config": "14.484.2",
92
- "@genesislcap/stylelint-config": "14.484.2",
93
- "@genesislcap/vite-builder": "14.484.2",
94
- "@genesislcap/webpack-builder": "14.484.2",
86
+ "@genesislcap/design-system-configurator": "14.485.0",
87
+ "@genesislcap/eslint-config": "14.485.0",
88
+ "@genesislcap/eslint-stylelint-builder": "14.485.0",
89
+ "@genesislcap/foundation-testing": "14.485.0",
90
+ "@genesislcap/genx": "14.485.0",
91
+ "@genesislcap/prettier-config": "14.485.0",
92
+ "@genesislcap/stylelint-config": "14.485.0",
93
+ "@genesislcap/vite-builder": "14.485.0",
94
+ "@genesislcap/webpack-builder": "14.485.0",
95
95
  "dayjs": "^1.11.7"
96
96
  },
97
97
  "dependencies": {
98
- "@genesislcap/foundation-comms": "14.484.2",
99
- "@genesislcap/foundation-criteria": "14.484.2",
100
- "@genesislcap/foundation-entity-management": "14.484.2",
101
- "@genesislcap/foundation-forms": "14.484.2",
102
- "@genesislcap/foundation-layout": "14.484.2",
103
- "@genesislcap/foundation-logger": "14.484.2",
104
- "@genesislcap/foundation-notifications": "14.484.2",
105
- "@genesislcap/foundation-ui": "14.484.2",
106
- "@genesislcap/foundation-utils": "14.484.2",
107
- "@genesislcap/rapid-design-system": "14.484.2",
108
- "@genesislcap/rapid-grid-pro": "14.484.2",
109
- "@genesislcap/web-core": "14.484.2",
98
+ "@genesislcap/foundation-comms": "14.485.0",
99
+ "@genesislcap/foundation-criteria": "14.485.0",
100
+ "@genesislcap/foundation-entity-management": "14.485.0",
101
+ "@genesislcap/foundation-forms": "14.485.0",
102
+ "@genesislcap/foundation-layout": "14.485.0",
103
+ "@genesislcap/foundation-logger": "14.485.0",
104
+ "@genesislcap/foundation-notifications": "14.485.0",
105
+ "@genesislcap/foundation-ui": "14.485.0",
106
+ "@genesislcap/foundation-utils": "14.485.0",
107
+ "@genesislcap/rapid-design-system": "14.485.0",
108
+ "@genesislcap/rapid-grid-pro": "14.485.0",
109
+ "@genesislcap/web-core": "14.485.0",
110
110
  "lodash.debounce": "^4.0.8",
111
111
  "rxjs": "^7.5.4"
112
112
  },
@@ -114,5 +114,5 @@
114
114
  "access": "public"
115
115
  },
116
116
  "customElements": "dist/custom-elements.json",
117
- "gitHead": "a7740b909c78ff2335e44ecd9d9d61d9ecb0f557"
117
+ "gitHead": "6d8eacc0597e7a9a323fa3838c493e7ac8ddc589"
118
118
  }
@@ -182,7 +182,8 @@ export class RuleDialog extends GenesisElement {
182
182
  const useRaw =
183
183
  DynamicRuleUtils.hasMultiValueCondition(this.conditions) ||
184
184
  DynamicRuleUtils.hasOrJoin(this.conditions) ||
185
- DynamicRuleUtils.hasGroup(this.conditions);
185
+ DynamicRuleUtils.hasGroup(this.conditions) ||
186
+ DynamicRuleUtils.hasUnsupportedOperator(this.conditions);
186
187
  return {
187
188
  ...(this.ruleDialogMode === RuleDialogMode.EDIT && { DYNAMIC_RULE_ID: this.ruleId }),
188
189
  RULE_NAME: this.name,
@@ -201,7 +201,8 @@ export class TemplateDialog extends GenesisElement {
201
201
  const useRaw =
202
202
  DynamicRuleUtils.hasMultiValueCondition(this.conditions) ||
203
203
  DynamicRuleUtils.hasOrJoin(this.conditions) ||
204
- DynamicRuleUtils.hasGroup(this.conditions);
204
+ DynamicRuleUtils.hasGroup(this.conditions) ||
205
+ DynamicRuleUtils.hasUnsupportedOperator(this.conditions);
205
206
  return {
206
207
  ...(this.templateDialogMode === TemplateDialogMode.EDIT && {
207
208
  DYNAMIC_RULE_ID: this.templateId,
@@ -232,6 +232,21 @@ export class DynamicRuleUtils {
232
232
  return conditions.some(isGroupNode);
233
233
  }
234
234
 
235
+ // STARTS_WITH/ENDS_WITH compile to a Groovy method-call clause
236
+ // (`FIELD.startsWith("value")`), which the structured CONDITIONS format
237
+ // cannot express - genesis-criteria's server-side Operation enum only has
238
+ // ==, !=, >, < (see EvaluatorExpressionParser). Any condition using one of
239
+ // these always forces RAW_RULE_EXPRESSION, same as a group or multi-value
240
+ // condition.
241
+ static hasUnsupportedOperator(conditions: ConditionNode[]): boolean {
242
+ return conditions.some((node) =>
243
+ isGroupNode(node)
244
+ ? DynamicRuleUtils.hasUnsupportedOperator(node.CHILDREN)
245
+ : node.LOGICAL_OPERATOR === LogicalOperator.STARTS_WITH ||
246
+ node.LOGICAL_OPERATOR === LogicalOperator.ENDS_WITH,
247
+ );
248
+ }
249
+
235
250
  // Flattens a condition/group tree into just its leaf conditions, at any
236
251
  // depth - for callers that only care about "is this parameter used
237
252
  // anywhere" and don't need to know the group structure.
@@ -383,6 +398,19 @@ const resolveTemplateTextExpression = (expr: any): string => {
383
398
  }
384
399
  };
385
400
 
401
+ // Escapes a value for safe interpolation into a double-quoted Groovy string
402
+ // literal, guarding both injection routes double-quoted Groovy strings allow:
403
+ // 1. Breaking out of the literal, e.g. RIGHT_VALUE = `x") || (1==1` - closed
404
+ // off by escaping `"`.
405
+ // 2. GString interpolation, e.g. RIGHT_VALUE = `${1==1}` or `$foo` - Groovy
406
+ // evaluates `${...}`/`$identifier` as live code INSIDE a double-quoted
407
+ // string even without breaking out of it, so `"` alone is not enough;
408
+ // escaping `$` as `\$` forces it to stay a literal dollar sign.
409
+ // Order matters: backslash must be escaped first, before the other two
410
+ // replacements introduce new backslashes of their own.
411
+ const escapeGroovyStringLiteral = (value: string): string =>
412
+ value.replace(/\\/g, '\\\\').replace(/"/g, '\\"').replace(/\$/g, '\\$');
413
+
386
414
  const buildConditionClause = (condition: ConditionBuilderEntity): string => {
387
415
  const name = condition.LEFT_VALUE.FIELD_NAME;
388
416
  const type = condition.LEFT_VALUE.FIELD_TYPE;
@@ -394,6 +422,23 @@ const buildConditionClause = (condition: ConditionBuilderEntity): string => {
394
422
  if (logicalOperator === LogicalOperator.BLANK || logicalOperator === LogicalOperator.NOT_BLANK) {
395
423
  return `(${name} ${logicalOperator === LogicalOperator.BLANK ? '==' : '!='} "")`;
396
424
  }
425
+ if (
426
+ logicalOperator === LogicalOperator.STARTS_WITH ||
427
+ logicalOperator === LogicalOperator.ENDS_WITH
428
+ ) {
429
+ // No structured-CONDITIONS representation - compiled as a Groovy method
430
+ // call, evaluated at runtime via the platform's Groovy-backed
431
+ // EvaluatorPool (confirmed: RAW_RULE_EXPRESSION is stored verbatim and
432
+ // never re-validated by the structured-expression parser at load/eval
433
+ // time, only at create/edit-time in the dashboard itself). Unlike the
434
+ // ==/>/< path below, the argument is always a String literal regardless
435
+ // of the field's own type - String.startsWith/endsWith takes a
436
+ // CharSequence, so UNQUOTED_FIELD_TYPES (which exists for bare numeric/
437
+ // boolean comparisons) doesn't apply here.
438
+ const method = logicalOperator === LogicalOperator.STARTS_WITH ? 'startsWith' : 'endsWith';
439
+ const value = escapeGroovyStringLiteral(String(condition.RIGHT_VALUE));
440
+ return `(${name}.${method}("${value}"))`;
441
+ }
397
442
 
398
443
  const op = OPERATOR_SYMBOLS[logicalOperator] ?? '==';
399
444
 
@@ -449,6 +494,24 @@ const parseAtom = (atom: string): { name: string; operator: string; value: strin
449
494
  };
450
495
  }
451
496
 
497
+ // FIELD.startsWith("value") / FIELD.endsWith("value") - the method-call
498
+ // clause buildConditionClause emits for STARTS_WITH/ENDS_WITH. Reverses
499
+ // escapeGroovyStringLiteral so the value round-trips through edit unchanged.
500
+ const methodMatch = inner.match(/^([A-Za-z0-9_]+)\.(startsWith|endsWith)\("(.*)"\)$/);
501
+ if (methodMatch) {
502
+ return {
503
+ name: methodMatch[1].trim(),
504
+ operator:
505
+ methodMatch[2] === 'startsWith' ? LogicalOperator.STARTS_WITH : LogicalOperator.ENDS_WITH,
506
+ // Single combined-pattern pass (not sequential independent replaces) so
507
+ // an escaped backslash immediately followed by an escaped quote/dollar
508
+ // can't be misinterpreted - each `\` in the raw text is always followed
509
+ // by exactly one of \, ", or $ (escapeGroovyStringLiteral's output),
510
+ // and this consumes both characters together in one match.
511
+ value: methodMatch[3].replace(/\\([\\"$])/g, '$1'),
512
+ };
513
+ }
514
+
452
515
  const symbol = ['==', '!=', '>', '<'].find((s) => inner.includes(` ${s} `));
453
516
  if (!symbol) return null;
454
517
  // Split on the FIRST occurrence only - a quoted value may itself contain
@@ -4,6 +4,12 @@ export enum LogicalOperator {
4
4
  NOT_EQUALS = 'NOT_EQUALS',
5
5
  GREATER_THAN = 'GREATER_THAN',
6
6
  LESS_THAN = 'LESS_THAN',
7
+ // No structured-CONDITIONS representation server-side (genesis-criteria's
8
+ // Operation enum has no string-method operator) - a condition using either
9
+ // of these always compiles to RAW_RULE_EXPRESSION. See
10
+ // DynamicRuleUtils.hasUnsupportedOperator.
11
+ STARTS_WITH = 'STARTS_WITH',
12
+ ENDS_WITH = 'ENDS_WITH',
7
13
  NULL = 'NULL',
8
14
  NOT_NULL = 'NOT_NULL',
9
15
  BLANK = 'BLANK',
@@ -27,6 +33,14 @@ export const LogicalOperators = [
27
33
  label: 'Less Than',
28
34
  operator: 'LESS_THAN',
29
35
  },
36
+ {
37
+ label: 'Starts With',
38
+ operator: 'STARTS_WITH',
39
+ },
40
+ {
41
+ label: 'Ends With',
42
+ operator: 'ENDS_WITH',
43
+ },
30
44
  {
31
45
  label: 'Null',
32
46
  operator: 'NULL',