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