Our Pipeline
Last updated, April 2021.
The following has evaluated to null or missing:
==> row.category  [in template "4257042#4257090#4793507" at line 41, column 24]
----
Tip: It's the step after the last dot that caused this error, not those before it.
----
Tip: If the failing expression is known to be legally refer to something that's sometimes null or missing, either specify a default value like myOptionalVar!myDefault, or use <#if myOptionalVar??>when-present<#else>when-missing</#if>. (These only cover the last step of the expression; to cover the whole expression, use parenthesis: (myOptionalVar.foo)!myDefault, (myOptionalVar.foo)??
----
----
FTL stack trace ("~" means nesting-related):
	- Failed at: #assign key = row.category.getData()  [in template "4257042#4257090#4793507" at line 41, column 9]
----
	1<style> 
				2    .star{ 
				3        position: absolute; 
				4    right: calc(100% - 50px);  
				5    top: 50%;  
				6    transform: translateY(-50%);  
				7    font-size: 16px;  
				8    visibility: visible;  
				9    } 
				10</style> 
				11<div class="pipeline-table"> 
				12  <table class="table table-responsive page-table--pipeline" id="table-pipeline"> 
				13    <thead> 
				14      <tr> 
				15        <th width="20%" scope="col"> 
				16              <@liferay.language key="sep.almirall.pipeline.commercial.molecule" /> 
				17        </th> 
				18        <th width="25%" scope="col"> 
				19              <@liferay.language key="sep.almirall.pipeline.indication" /> 
				20        </th> 
				21        <th width="12%" scope="col"> 
				22          <@liferay.language key="sep.almirall.pipeline.phase.one" /> 
				23        </th> 
				24        <th width="12%"  scope="col"> 
				25          <@liferay.language key="sep.almirall.pipeline.phase.two" /> 
				26        </th> 
				27        <th width="12%"  scope="col"> 
				28          <@liferay.language key="sep.almirall.pipeline.phase.three" /> 
				29        </th> 
				30        <th width="12%"  scope="col"> 
				31          <@liferay.language key="sep.almirall.pipeline.phase.under.registration" /> 
				32        </th> 
				33        <th width="12%" scope="col" > 
				34          <@liferay.language key="sep.almirall.pipeline.geography" /> 
				35        </th> 
				36      </tr> 
				37    </thead> 
				38    <tbody id="download-forms-table-tbody"> 
				39      <#assign groupedData = {} /> 
				40      <#list Project.getSiblings() as row> 
				41        <#assign key = row.category.getData() />  
				42          <#if groupedData[key]?exists> 
				43               
				44              <#assign newList = [] /> 
				45              <#list groupedData[key] as existingRow> 
				46                  <#assign newList = newList + [existingRow] /> 
				47              </#list> 
				48              <#assign newList = newList + [row] /> 
				49              <#assign groupedData = groupedData + { (key): newList } /> 
				50          <#else> 
				51               
				52              <#assign groupedData = groupedData + { (key): [row] } /> 
				53          </#if> 
				54      </#list> 
				55 
				56        <#list groupedData?keys as groupKey> 
				57        <tr> 
				58            <td colspan="7" class="category-row"> 
				59                <strong>${groupKey}</strong> 
				60            </td> 
				61        </tr> 
				62          <#list groupedData[groupKey] as row> 
				63            <#assign nombreProducto=row.CommercialName.getData()> 
				64              <tr class="content"> 
				65                <td class="first-row"> 
				66                  <div class="cell-content">${nombreProducto}</div> 
				67                </td> 
				68                <td class="td-border"> 
				69                  <div class="cell-content">${row.Indication.getData()}</div> 
				70                </td> 
				71                <td class="progressColumn td-border"> 
				72                <div class="cell-content"> 
				73                  <#assign percentageNumber=row.PhasePercentage.getData()?number /> 
				74                  <div class="progressW-bar progressW"> 
				75                    <div class="progress-value progressW " style="overflow: hidden" data-progress-percent="${percentageNumber}"> 
				76                      <span style="visibility:hidden;"> 
				77                        ${percentageNumber} ${definePhase(percentageNumber)} 
				78                      </span> 
				79                    </div> 
				80                  </div> 
				81                </div> 
				82                </td> 
				83                <td class="td-border"><div class="cell-content"></div></td> 
				84                <td class="td-border"><div class="cell-content"></div></td> 
				85                <td class="td-border"><div class="cell-content"></div></td> 
				86                <td> 
				87                <div class="cell-content"> 
				88                  <div class="wrap-geo"> 
				89                    <#list row.Country.getSiblings() as geo> 
				90                      <div class="wrap-geo-icon"> 
				91                        <#assign country=geo.getData()?lower_case> 
				92                          <#if country?starts_with("worldwide")> 
				93                            <img src="/o/almirall-restyling-theme/images/icons/worldwide.svg" alt="Worldwide" /> 
				94                            <#assign isExChina="*" />                                            
				95                              <#if country=="worldwide_exchina"><span class="star"> 
				96                                  ${isExChina} 
				97                                </span></#if> 
				98                            <#break> 
				99                              <#else> 
				100                                <#if country=="eu" || country=="europe"> 
				101                                  <img src="/o/almirall-restyling-theme/images/icons/EU.svg" alt="EU" /> 
				102                                </#if> 
				103                                <#if country=="u.s" || country=="united states"> 
				104                                  <img src="/o/almirall-restyling-theme/images/icons/US.svg" alt="U.S." /> 
				105                                </#if> 
				106                                <#if country=="china"> 
				107                                  <img src="/o/almirall-restyling-theme/images/icons/china.svg" alt="China" /> 
				108                                </#if> 
				109                                <#if country=="uk"> 
				110                                  <img src="/o/almirall-restyling-theme/images/icons/UK.svg" alt="UK" /> 
				111                                </#if> 
				112                          </#if> 
				113                      </div> 
				114                    </#list> 
				115                  </div> 
				116                </div> 
				117                </td> 
				118              </tr> 
				119          </#list> 
				120        </#list> 
				121    </tbody> 
				122  </table> 
				123 
				124  <#list Project.getSiblings() as row> 
				125    <#assign percentageNumber=row.PhasePercentage.getData()?number 
				126      countryList="" /> 
				127    <#list row.Country.getSiblings() as geo> 
				128      <#assign currentCountry=geo.getData()?lower_case /> 
				129      <#if currentCountry=="europe"> 
				130        <#assign currentCountry="EU" /> 
				131        <#elseif currentCountry=="united states" || currentCountry=="u.s." || currentCountry=="u.s"> 
				132          <#assign currentCountry="U.S." /> 
				133      </#if> 
				134      <#assign countryList+=" " +currentCountry /> 
				135    </#list> 
				136    <p class="content"><span style="display:none;"> 
				137        ${row.Indication.getData()} ${row.CommercialName.getData()} ${definePhase(percentageNumber)} ${countryList} 
				138      </span> 
				139      ${row.ProjectLegend.getData()} 
				140    </p> 
				141  </#list> 
				142</div> 
				143 
				144<#function definePhase n> 
				145  <#assign percentageNumber=n 
				146    phaseName="" 
				147    phasesNumber=4 
				148    number=0 /> 
				149  <#list 1..phasesNumber as phase> 
				150    <#assign number=number+(100/phasesNumber) /> 
				151    <#if percentageNumber <= number> 
				152      <#if phase==1> 
				153        <#assign phaseName="Phase 1"> 
				154      <#elseif phase == phasesNumber> 
				155            <#assign phaseName="Under registration"> 
				156      <#else> 
				157            <#assign phaseName="Fase" +(phase)> 
				158      </#if> 
				159      <#return phaseName /> 
				160      <#break> 
				161    </#if> 
				162  </#list> 
				163  <#return phaseName /> 
				164</#function> 
				165<script> 
				166$(function() { 
				167  moveProgressBar(); 
				168    const startColor = "#C9FFF4";   
				169    const endColor = "#E9C3FF";     
				170    const barStartColor = "#008C93"; 
				171    const barEndColor = "#8700D3"; 
				172 
				173  var rows = $(".page-table--pipeline tbody").find(".cell-content"); 
				174 
				175  
				176  if (rows.length > 0) { 
				177    const colorStep = 1 / (rows.length - 1);  
				178     
				179    rows.each(function(index) { 
				180   
				181      const position = index * colorStep; 
				182 
				183       
				184      const color = interpolateColor(startColor, endColor, position); 
				185      const barColor = interpolateColor(barStartColor, barEndColor, position); 
				186 
				187      
				188      $(this).css("background-color", color); 
				189      var progressBar = $(this).closest("td").find(".progress-value"); 
				190       
				191      if (progressBar.length) { 
				192        progressBar.css("background-color", barColor); 
				193      } 
				194    }); 
				195  } 
				196 
				197 
				198  function interpolateColor(color1, color2, factor) { 
				199    function hexToRgb(hex) { 
				200      return { 
				201        r: parseInt(hex.substr(1, 2), 16), 
				202        g: parseInt(hex.substr(3, 2), 16), 
				203        b: parseInt(hex.substr(5, 2), 16) 
				204      }; 
				205    } 
				206 
				207    function rgbToHex(r, g, b) { 
				208      return "#" + (1 << 24 | r << 16 | g << 8 | b).toString(16).slice(1).toUpperCase(); 
				209    } 
				210 
				211    
				212    var color1Rgb = hexToRgb(color1); 
				213    var color2Rgb = hexToRgb(color2); 
				214 
				215 
				216    var r = Math.round(color1Rgb.r + (color2Rgb.r - color1Rgb.r) * factor); 
				217    var g = Math.round(color1Rgb.g + (color2Rgb.g - color1Rgb.g) * factor); 
				218    var b = Math.round(color1Rgb.b + (color2Rgb.b - color1Rgb.b) * factor); 
				219 
				220 
				221    return rgbToHex(r, g, b); 
				222  } 
				223}) 
				224</script> 
		Programs in Research & Preclinical
