Our Pipeline

Last updated, April 2021.

An error occurred while processing the template.
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