Advertisement
Guest User

Untitled

a guest
Oct 21st, 2017
69
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. (function () {
  2.     'use strict';
  3.  
  4.     angular.module('common.shared.personalization')
  5.         .factory('ComplexPersonalization', personalizationFactory)
  6.         .factory('PersonalizationCase', personalizationCaseFactory)
  7.         .factory('PersonalizationCaseCondition', personalizationCaseConditionFactory);
  8.  
  9.     personalizationFactory.$inject = ['Filter'];
  10.  
  11.     function personalizationFactory(Filter) {
  12.         /**
  13.          *
  14.          * @param {Object?} defaultCase
  15.          * @param {String} defaultCase.property
  16.          * @param {String} defaultCase.operator
  17.          * @param {String?} defaultText
  18.          * @constructor
  19.          */
  20.         function ComplexPersonalization( defaultCase, defaultText ) {
  21.             this.defaultText = defaultText || '';
  22.             this.defaultCase = defaultCase || {};
  23.  
  24.             this.cases = [];
  25.  
  26.             this.addCase();
  27.         }
  28.  
  29.         ComplexPersonalization.prototype.addCase = function() {
  30.             this.cases.push( new PersonalizationCase(this.defaultCase.property, this.defaultCase.operator) );
  31.         };
  32.  
  33.         ComplexPersonalization.prototype.removeCase = function( personalizationCase ) {
  34.             var index = this.cases.indexOf( personalizationCase );
  35.             this.cases.splice( index, 1 );
  36.         };
  37.  
  38.         /**
  39.          *
  40.          * @param {ColumnCollection} recipientColumns
  41.          * @returns {string}
  42.          */
  43.         ComplexPersonalization.prototype.toTwig = function(recipientColumns) {
  44.             var twig = '',
  45.                 me = this;
  46.  
  47.             if ( this.cases && this.cases.length ) {
  48.                 this.cases.forEach( function( personalizationCase, index ) {
  49.  
  50.                     if ( personalizationCase.conditions && personalizationCase.conditions.length && personalizationCase.booleanOperator ) {
  51.  
  52.                         twig += '{% ';
  53.  
  54.                         if ( index == 0 ) {
  55.                             twig += 'if ';
  56.                         } else {
  57.                             twig += 'elseif ';
  58.                         }
  59.  
  60.                         personalizationCase.conditions.forEach( function( condition, conditionIndex ) {
  61.  
  62.                             if ( conditionIndex != 0 ) {
  63.                                 twig += ' ' + personalizationCase.booleanOperator + ' ';
  64.                             }
  65.  
  66.                             var conditionOperator;
  67.                             var operatorDirection = 'leftToRight';
  68.                             var negation = false;
  69.  
  70.                             // TODO Use constants instead of strings......pls?
  71.                             switch ( condition.operator ) {
  72.                                 case '=ISSET=':
  73.                                 case '=NLIKE=':
  74.                                     conditionOperator = '!=';
  75.                                     break;
  76.  
  77.                                 case '=ewLIKE=':
  78.                                     conditionOperator = 'ends with';
  79.                                     break;
  80.  
  81.                                 case '=newLIKE=':
  82.                                     conditionOperator = 'ends with';
  83.                                     negation = true;
  84.                                     break;
  85.  
  86.                                 case '=swLIKE=':
  87.                                     conditionOperator = 'starts with';
  88.                                     break;
  89.  
  90.                                 case '=nswLIKE=':
  91.                                     conditionOperator = 'starts with';
  92.                                     negation = true;
  93.                                     break;
  94.  
  95.                                 case '=EMPTY=':
  96.                                 case '=LIKE=':
  97.                                 case '==':
  98.                                     conditionOperator = '==';
  99.                                     break;
  100.  
  101.                                 case '=cLIKE=':
  102.                                 case '=IN=':
  103.                                 case '=moCONTAINS=':
  104.                                 case '=CONTAINS=':
  105.                                     conditionOperator = 'in';
  106.                                     operatorDirection = 'rightToLeft';
  107.                                     break;
  108.  
  109.                                 case '=ncLIKE=':
  110.                                 case '=NIN=':
  111.                                 case '=NCONTAINS=':
  112.                                 case '=mnCONTAINS=':
  113.                                     conditionOperator = 'in';
  114.                                     operatorDirection = 'rightToLeft';
  115.                                     negation = true;
  116.                                     break;
  117.  
  118.                                 // TODO: '=maCONTAINS='
  119.  
  120.                                 case '=ne=':
  121.                                     conditionOperator = '!=';
  122.                                     break;
  123.  
  124.                                 case '=gt=':
  125.                                     conditionOperator = '>';
  126.                                     break;
  127.  
  128.                                 case '=ge=':
  129.                                     conditionOperator = '>=';
  130.                                     break;
  131.  
  132.                                 case '=lt=':
  133.                                     conditionOperator = '<';
  134.                                     break;
  135.  
  136.                                 case '=le=':
  137.                                     conditionOperator = '<=';
  138.                                     break;
  139.  
  140.                                 default:
  141.                                     conditionOperator = condition.operator;
  142.                             }
  143.  
  144.                             if (negation) {
  145.                                 twig += '(not ';
  146.                             }
  147.  
  148.                             twig += me.conditionToTwig(condition, conditionOperator, recipientColumns, operatorDirection === 'leftToRight');
  149.  
  150.                             if (negation) {
  151.                                 twig += ')';
  152.                             }
  153.  
  154.  
  155.                         } );
  156.  
  157.                         twig += ' %}' + personalizationCase.text
  158.  
  159.                     }
  160.  
  161.                 } );
  162.             }
  163.  
  164.             if ( this.defaultText && this.defaultText.length && twig.length ) {
  165.                 twig += '{% else %}' + this.defaultText;
  166.             }
  167.  
  168.             if ( twig.length ) {
  169.                 twig += '{% endif %}';
  170.             }
  171.  
  172.             return twig;
  173.         };
  174.  
  175.         /**
  176.          *
  177.          * @param {Object} condition
  178.          * @param {String} condition.value
  179.          * @param {String} condition.property
  180.          * @param {String} conditionOperator
  181.          * @param {ColumnCollection} columns
  182.          * @param {Boolean} leftToRight
  183.          */
  184.         ComplexPersonalization.prototype.conditionToTwig = function (condition, conditionOperator, columns, leftToRight) {
  185.             var result = '',
  186.                 isRecipientProperty = condition.property.indexOf('recipient.') !== -1,
  187.                 property = isRecipientProperty ? condition.property.substr(10) : condition.property,
  188.                 column = columns.getColumn(property) || {},
  189.                 isNumber = column.type === 'number' || column.useNumberOperators, // enum with numbers :)
  190.                 isBoolean = column.type === 'boolean',
  191.                 isEmptyOperator = condition.operator === '=EMPTY=',
  192.                 isSetOperator = condition.operator === '=ISSET=',
  193.                 serializedValue;
  194.  
  195.             if (!isEmptyOperator && !isSetOperator && (isNumber || isBoolean)) {
  196.                 serializedValue = condition.value || 0;
  197.             } else if (isEmptyOperator || isSetOperator) {
  198.                 serializedValue = '""';
  199.             } else if (column.type === 'date' || column.type === 'datetime') {
  200.                 // TODO call function to serialize datetime after issue with filters is done.
  201.                 serializedValue = moment(condition.value)
  202.                     .format(condition.value.imJustDateDude ? Filter.ServerDateFormat : Filter.ServerDateTimeFormat);
  203.                 serializedValue = '"' + serializedValue + '"';
  204.             } else {
  205.                 serializedValue = '"' + condition.value + '"';
  206.             }
  207.  
  208.             if (leftToRight) {
  209.                 result += '( ' + condition.property + ' ' + conditionOperator + ' ' + serializedValue + ' )';
  210.             } else {
  211.                 result += '( ' + serializedValue + ' ' + conditionOperator + ' ' + condition.property + ' )';
  212.             }
  213.  
  214.             return result;
  215.         };
  216.  
  217.         return ComplexPersonalization;
  218.     }
  219.  
  220.     function personalizationCaseFactory() {
  221.         return PersonalizationCase;
  222.     }
  223.  
  224.     function personalizationCaseConditionFactory() {
  225.         return PersonalizationCaseCondition;
  226.     }
  227.  
  228.     // *********************
  229.     // PersonalizationCase
  230.     // *********************
  231.     function PersonalizationCase(property, operator) {
  232.         this.text = '';
  233.         this.booleanOperator = 'or';
  234.         this.conditions = [];
  235.         this.defaultCaseCondition = {
  236.             property: property,
  237.             operator: operator
  238.         };
  239.  
  240.         this.addCondition();
  241.     }
  242.  
  243.     PersonalizationCase.prototype.addCondition = function() {
  244.         this.conditions.push(new PersonalizationCaseCondition(this.defaultCaseCondition.property, this.defaultCaseCondition.operator));
  245.     };
  246.  
  247.     PersonalizationCase.prototype.removeCondition = function( condition ) {
  248.         var index = this.conditions.indexOf( condition );
  249.         this.conditions.splice( index, 1 );
  250.     };
  251.  
  252.     /**
  253.      * @class
  254.      * @param {String?} property
  255.      * @param {String?} operator
  256.      */
  257.     function PersonalizationCaseCondition(property, operator) {
  258.         this.property = property;
  259.         this.operator = operator;
  260.         this.value = '';
  261.     }
  262. })();
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement