Quintiq file version 2.0
#parent: DataHolderPeriods
Response OnDataChanged () id:Response_BaseFormCapacityPlanning_DataHolderPeriods_OnDataChanged
{
  #keys: '[136682.2.891024112]'
  CanBindMultiple: false
  DefinitionID: 'Responsedef_WebComponent_OnDataChanged'
  QuillAction
  {
    Body:
    [*
      //Zoom based on selected granularity in navigation panel
      data :=  ApplicationMacroPlanner.DataHolderPeriods().Data().Copy(); // refer to global dataholder as this.Data seems referring to old data 
      totalfutureperiods := counter( data, Elements, period, true, not period.IsHistorical() ); 
      level :=1;
      // when total period more than 10, zoomlevel will be 10% of the total future periods bucket 
      if ( totalfutureperiods > 10 )
      {
        level := floor( 0.1 * totalfutureperiods ) ;  
      }
      // sort by time unit level, 1-Hour, 2-Day, 3-Week, 4-Month, 5-Quarter, 6-Year
      timeunits := selectuniquevalues( data, Elements, period, true, [String]period.TimeUnitLevel() + "-" + period.TimeUnit() ); 
      timeunits := selectsortedset( timeunits, Elements, e, true, e.Tokenize( "-" ).Element( 0 ) );// tokenized to sort by time unit level from Day->Week->Month->Quarter->Year  
      customzoomrange := JSON::Array();
      
      traverse( timeunits, Elements, element )
      {
        timeunit := element.Tokenize( "-" ).Element( 1 );
          
        isquarter := timeunit = Translations::MP_GlobalParameters_Quarter();
        size := counter( data, Elements, period, true, not period.IsHistorical() and period.TimeUnit() = timeunit );
        maxloop := size/ level;
        unit := ifexpr( isquarter, Translations::MP_GlobalParameters_Month(), timeunit ) ; //Quarter is not supported, replace with month
        //minimum keep 2 buckets - if zoom in
        for ( i := 2; i <= maxloop; i++ )
        {
          loop := i;
          
          if ( i > 2 )
          {
             loop := loop * level;
          }
          
          loop := loop * ifexpr( isquarter, 3, 1 ) // time 3 if is in quarter, default * 1;
          // Core Tech granularity is plural thus we add "s" to it
          zoomLevel := unit + "s";
          zoom1 := JSON::Object();
          zoom1.Add( 'unit', zoomLevel );
          zoom1.Add( 'count', loop );
          customzoomrange.Add( zoom1);
        }
      }
      
      GanttChartCapacityPlanning.NavigationRange( customzoomrange.Build() );
      
      //Snap to gantt chart
      Form.SnapToGanttChart();
    *]
    GroupServerCalls: false
  }
}
