multi-dimensional visibility gird

Is there a way to set up a visibility grid based on a combination two or three other dropdown values?

Example:

dropdown 1 is a dropdown with of values A, B,C

dropdown 2 is a dropdown with of values 1, 2, 3, <blank>


Dropdown 3 should display a subset of options  dependent on dropdown 1 AND dropdown 2

dropdown1=A & dropdown2=1 -> dropdown 3 values i, ii

dropdown1=A & dropdown2=2 -> dropdown 3 values i, ii, iii

dropdown1=B & dropdown2=1 -> dropdown 3 values i

dropdown1=B & dropdown2= <blank> -> dropdown 3 values i, iii, iv

and so on...

thanks,
FrancescaS

Parents Reply Children
  • Brett Zufelt,

    I am having some trouble....

    I keep getting an error: FATAL[2019-1-23 15:17:57]: Uncaught TypeError: expression.match is not a function

    I defined the Expression following some of the expressions that are in the core sugar (like ForecastSalesStageExpression which restricts the dropdown based on parameters passed) 

    I see the expression at the bottom of the list when I run the "Rebuild Sugar Logic Functions"

    (restrictSalesGoalsDropdown) RestrictSalesGoalsDropdownExpression

    custom/include/Expressions/Expression/Enum/RestrictSalesGoalsDropdownExpression.php

    <?php
    require_once 'include/Expressions/Expression/Enum/EnumExpression.php';
    class RestrictSalesGoalsDropdownExpression extends EnumExpression
    {
        /**
         * Returns the entire enumeration bare.
         */

        public function evaluate()
        {
            $GLOBALS['log']->fatal('RestrictSalesGoalsDropdownExpression');
            $params = $this->getParameters();
            $keysToRemove = array();
              $array = array_keys($GLOBALS['app_list_strings']['opp_transaction_type_dd']);
              $goal_type = $params[0]->evaluate();
              $sales_group = $params[1]->evaluate();
              $sales_sub_group = $params[2]->evaluate();
              if($goal_type == 'Quarterly Sales Target'){
                $keysToRemove = array("B2B","B2C","B2E") ;
              }elseif($goal_type == 'Quarterly Forecasting Sales Quota'){
                $keysToRemove = array("B2E") ;
              }elseif($goal_type == 'Annual Sales Quota'){
                switch ($sales_group){
                  case "Academic":
                    switch ($sales_sub_group){
                      case "Key Accounts":
                        $keysToRemove = array("B2C");
                        break;
                      case "Oubound":
                        $keysToRemove = array("B2C");
                        break;
                      case "Inside Sales":
                        $keysToRemove = array("B2B", "B2C");
                        break;
                    }
                  break;
                  case "Commercial":
                    switch ($sales_sub_group){
                      case "AE":
                        $keysToRemove = array("B2C", "B2E");
                        break;
                      case "Enterprise":
                        $keysToRemove = array("B2B", "B2C");
                        break;
                      case "Inside Sales":
                        $keysToRemove = array("B2B", "B2E");
                        break;
                      case "Sales Group":
                        $keysToRemove = array("B2B", "B2C", "B2E");
                        break;
                    }
                  break;
                  case "IBD":
                    switch ($sales_sub_group){
                      case "AE":
                        $keysToRemove = array();
                        break;
                      case "Sales Group":
                        $keysToRemove = array("B2B", "B2C", "B2E");
                        break;
                    }
                  break;
                }
              }
            $list = rtrim(implode(',', array_diff($array, $keysToRemove)), ',');
            return $list;
        }



        /**
         * Returns the JS Equivalent of the evaluate function.
         */

        public static function getJSEvaluate()
        {
            return <<<JS
            var array = [],
                keysToRemove = [],
                params = this.getParameters(),
                array = _.keys(App.lang.getAppListStrings('opp_transaction_type_dd')),
                goal_type = params[0].evaluate(),
                sales_group = params[1].evaluate(),
                sales_sub_group = params[2].evaluate();
            if(goal_type == 'Quarterly Sales Target'){
              keysToRemove = ["B2B","B2C","B2E"] ;
            }else if(goal_type == 'Quarterly Forecasting Sales Quota'){
              keysToRemove = ["B2E"] ;
            }else if(goal_type == 'Annual Sales Quota'){
              switch (sales_group){
                case "Academic":
                  switch (sales_sub_group){
                    case "Key Accounts":
                      keysToRemove = ["B2C"];
                      break;
                    case "Oubound":
                      keysToRemove = ["B2C"];
                      break;
                    case "Inside Sales":
                      keysToRemove = ["B2B", "B2C"];
                      break;
                  }
                break;
                 case "Commercial":
                   switch (sales_sub_group){
                    case "AE":
                      keysToRemove = ["B2C", "B2E"];
                      break;
                    case "Enterprise":
                      keysToRemove = ["B2B", "B2C"];
                      break;
                    case "Inside Sales":
                      keysToRemove = ["B2B", "B2E"];
                      break;
                    case "Sales Group":
                      keysToRemove = ["B2B", "B2C", "B2E"];
                      break;
                  }
                break;
                case "IBD":
                  switch (sales_sub_group){
                    case "AE":
                      keysToRemove = array();
                      break;
                    case "Sales Group":
                      keysToRemove = ["B2B", "B2C", "B2E"];
                      break;
                  }
                break;
              }
            }
            return _.difference(array, keysToRemove);
    JS;
        }

        public static function getParamCount()
        {
            return 3;
        }

        static function getParameterTypes() {
          return array(AbstractExpression::$ENUM_TYPE, AbstractExpression::$ENUM_TYPE, AbstractExpression::$ENUM_TYPE);
        }

        /**
         * Returns the operation name that this Expression could be called by.
         */

        public static function getOperationName()
        {
            return array("restrictSalesGoalsDropdown");
        }
        /**
         * Returns the String representation of this Expression.
         */

        public function toString()
        {
        }

    I defined the Dependency

    custom/Extension/modules/sgoal_SalesGoals/Ext/Dependencies/deps.ext.php

    $dependencies['sgoal_SalesGoals']['setoptions_order_origin'] = array(
       'hooks' => array("edit","save"),
       'trigger' => true,
       'triggerFields' => array('goal_type', 'sales_entity_type', 'sales_group'),
       'onload' => true,
       'actions' => array(
          array(
            'name' => 'SetOptions',
            'params' => array(
               'target' => 'order_origin',
               'keys' => 'createList(restrictSalesGoalsDropdown($goal_type, $sales_entity_type, $sales_group))',               
               'labels' => 'createList(restrictSalesGoalsDropdown($goal_type, $sales_entity_type, $sales_group))',
            ),
          ),
        ),
    );

    Where am I going wrong? Clearly I'm not understanding this fully.

    Interestingly the dependency is not showing in 

    cache/modules/sgoal_SalesGoals/clients/base/dependency.php

    but is showing in 

    custom/modules/sgoal_SalesGoals/Ext/Dependencies/deps.ext.php

    thanks,
    FrancescaS