Instituto SENAI de Inovação em Engenharia de Polímeros
Organização
Instituto SENAI de Inovação em Engenharia de Polímeros
The following has evaluated to null or missing: ==> organization.getExpandoBridge().getAttribute("journal-article") [in template "34764#34807#null" at line 23, column 21] ---- Tip: If the failing expression is known to 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: articleId = organization.getExpandoBr... [in template "34764#34807#null" at line 23, column 9] ----
1<#assign
2 OrganizationLocalService = serviceLocator.findService("com.liferay.portal.kernel.service.OrganizationLocalService")
3 JournalArticleLocalService = serviceLocator.findService("com.liferay.journal.service.JournalArticleLocalService")
4/>
5
6<#assign
7 viewerHasPrivileges = false
8 userId = themeDisplay.getUserId()
9/>
10
11<#if userId?? >
12 <#assign
13 orgId = _CUSTOM_FIELD_organization.getData()?number
14 viewerHasPrivileges = OrganizationLocalService.hasUserOrganization(userId, orgId)
15 organization = OrganizationLocalService.getOrganization(orgId)
16 />
17</#if>
18
19
20<#if viewerHasPrivileges || DDMStructure_Field04200031.getData() != "0">
21<#assign
22 organization = OrganizationLocalService.getOrganization(_CUSTOM_FIELD_organization.getData()?number)
23 articleId = organization.getExpandoBridge().getAttribute("journal-article")
24 journalArticle = JournalArticleLocalService.getArticle(themeDisplay.getLayout().getGroupId(),articleId?c)
25 articleXml = journalArticle.getDocument().getRootElement()
26
27 setores = articleXml.selectNodes("dynamic-element[@name='Text67772680']")
28/>
29<#else>
30<#assign setores = ["privado"] />
31</#if>
32
33<#assign
34
35 sobre = (viewerHasPrivileges || DDMStructure_Field80037203.getData()!="0")?string(DDMStructure_Text54730891.getData()!"","")
36 competencias = (viewerHasPrivileges || DDMStructure_Field75645729.getData()!="0")?string(DDMStructure_Text51537691.getData()!"","")
37
38>
39
40<div>
41
42 <#if viewerHasPrivileges || DDMStructure_Field80037203.getData()!="0" >
43 <div class="bioec_org_sobre">
44 <label>Sobre a organização</label>
45 <div class="bioec_org_sobre_container">
46 <#if sobre != "">
47 ${sobre}
48 <#else>
49 <div class="bioec_org_sobre_vazio">
50 Nenhuma descrição foi adicionada neste perfil ainda
51 </div>
52 </#if>
53 </div>
54 </div>
55 </#if>
56
57 <#if viewerHasPrivileges || DDMStructure_Field75645729.getData()!="0" >
58 <div class="bioec_org_sobre">
59 <label>Competências tecnológicas</label>
60 <div class="bioec_org_sobre_container">
61 <#if competencias != "">
62 ${competencias}
63 <#else>
64 <div class="bioec_org_sobre_vazio">
65 Nenhuma descrição foi adicionada neste perfil ainda
66 </div>
67 </#if>
68 </div>
69 </div>
70 </#if>
71
72 <#if viewerHasPrivileges || DDMStructure_Field04200031.getData()!="0" >
73 <div class="bioec_org_sobre">
74 <label>Setor(es) de atuação</label>
75 <div class="bioec_org_sobre_container">
76 <#if setores[0]!="privado">
77 <#if setores?size == 1 && setores[0].getStringValue()?trim == "" >
78 <div class="bioec_org_sobre_vazio">
79 Nenhum setor foi adicionado neste perfil ainda
80 </div>
81 <#else>
82 <#if setores?size != 0 >
83 <ul>
84 <#list setores as setor>
85 <li>${setor.getStringValue()}</li>
86 </#list>
87 </ul>
88 <#else>
89 <div class="bioec_org_sobre_vazio">
90 Nenhum setor foi adicionado neste perfil ainda
91 </div>
92 </#if>
93 </#if>
94 <#else>
95 <div class="bioec_org_sobre_vazio">
96 Nenhum setor foi adicionado neste perfil ainda
97 </div>
98 </#if>
99 </div>
100 </div>
101 </#if>
102
103</div>
104
105<style>
106.bioec_org_sobre label {
107 color: #5B5C61;
108 font-weight: 700;
109 margin-bottom: 10px;
110 font-size: 20px;
111 line-height: 30px;
112}
113
114.bioec_org_sobre_container {
115 font-size: 16px;
116 border: 1px solid #BEBEBE;
117 padding: 24px;
118 color: #5B5C61;
119 margin-bottom: 40px;
120}
121
122.bioec_org_sobre_vazio {
123 color: #5B5C61;
124 font-size: 16px;
125 text-align: center;
126 font-weight: 700;
127}
128
129.bioec_org_sobre_container ul {
130 color: #5B5C61;
131 margin: 0;
132}
133</style>
The following has evaluated to null or missing: ==> autorArticleId [in template "34764#34807#41130" at line 104, column 46] ---- Tip: If the failing expression is known to 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: #if autorArticleId != "0" && autorArt... [in template "34764#34807#41130" at line 104, column 41] ----
1<#assign JournalArticleLocalService = serviceLocator.findService("com.liferay.journal.service.JournalArticleLocalService")>
2<#assign UserLocalService = serviceLocator.findService("com.liferay.portal.kernel.service.UserLocalService")>
3<#assign AssetCategoryLocalService = serviceLocator.findService("com.liferay.asset.kernel.service.AssetCategoryLocalService")>
4<#assign OrganizationLocalService = serviceLocator.findService("com.liferay.portal.kernel.service.OrganizationLocalService") >
5<#assign AssetTagLocalService = serviceLocator.findService("com.liferay.asset.kernel.service.AssetTagLocalService")>
6<#-- <#assign
7journalArticle = JournalArticleLocalService.getArticle(themeDisplay.getSiteGroupId(),.data_model["reserved-article-id"].data)
8AssetEntryLocalService = serviceLocator.findService("com.liferay.asset.kernel.service.AssetEntryLocalService")
9assetEntry = AssetEntryLocalService.getEntry(journalArticle.getModelClassName(), journalArticle.getResourcePrimKey())
10-->
11<#assign
12mbMessageLocalService = serviceLocator.findService("com.liferay.message.boards.service.MBMessageLocalService")
13>
14
15<div id="upload-notice-container" style="display: none;">
16 <span id="close-btn-upload-container"> <i class="fa fa-xmark"></i> </span>
17 <h5 class="upload-notice-title">
18 <i class="fa-sharp fa-solid fa-circle-exclamation"></i>
19 Upload de infraestrutura em andamento
20 </h5>
21 <p>
22 Caso os itens adicionados não estejam visíveis na página, aguarde um instante e <span>atualize a página</span> para visualizá-los.
23 </p>
24 </div>
25
26<div class="bioec-profile-estrutura-main">
27
28 <div id="estruturas-lista" class="d-flex flex-column">
29
30 <#if entries?has_content>
31 <#list entries as entry>
32
33 <#assign journalArticle = JournalArticleLocalService.getLatestArticle(entry.getClassPK()) >
34 <#assign articleXml = journalArticle.getDocument().getRootElement() >
35 <#assign JournalArticleID = journalArticle.getId()>
36 <#assign JournalArticleFrontId = journalArticle.getArticleId()>
37 <#assign
38 userIsAdmin = false
39 orgId = ""
40 autorId = ""
41 >
42 <#if articleXml.selectSingleNode("dynamic-element[@field-reference='Text57816561']")??>
43 <#assign
44 modelo = articleXml.selectSingleNode("dynamic-element[@field-reference='Text57816561']").getStringValue()!""
45 modelo = modelo?replace("\n\t\t", "")
46 modelo = modelo?replace("\n\t", "")
47 >
48 </#if>
49
50 <#if articleXml.selectSingleNode("dynamic-element[@field-reference='Text23707291']")??>
51 <#assign
52 marca = articleXml.selectSingleNode("dynamic-element[@field-reference='Text23707291']").getStringValue()!""
53 marca = marca?replace("\n\t\t", "")
54 marca = marca?replace("\n\t", "")
55 >
56 </#if>
57
58 <#if articleXml.selectSingleNode("dynamic-element[@field-reference='Text74754192']")??>
59 <#assign
60 funcao = articleXml.selectSingleNode("dynamic-element[@field-reference='Text74754192']").getStringValue()!""
61 funcao = funcao?replace("\n\t\t", "")
62 funcao = funcao?replace("\n\t", "")
63 >
64 </#if>
65
66 <#if articleXml.selectSingleNode("dynamic-element[@field-reference='CampoDeTexto02890219']")??>
67 <#assign
68 imageSrc = articleXml.selectSingleNode("dynamic-element[@field-reference='CampoDeTexto02890219']").getStringValue()!""
69
70 >
71 </#if>
72
73 <#if articleXml.selectSingleNode("dynamic-element[@field-reference='Text93109394']")??>
74 <#assign
75 autorId = articleXml.selectSingleNode("dynamic-element[@field-reference='Text93109394']").getStringValue()!""
76 autorId = autorId?replace("\n\t\t", "")
77 autorId = autorId?replace("\n\t", "")
78 autorArticleId = ""
79 >
80 </#if>
81 <#assign
82 commentsCount = mbMessageLocalService.getDiscussionMessagesCount(entry.getClassName(), entry.getClassPK(), 0)!"0"
83 />
84
85 <#if autorId != "" && autorId??>
86 <#assign
87 autor = UserLocalService.fetchUser(autorId?number)!""
88 autorArticleId = autor.getExpandoBridge().getAttribute("journal-article")!"0"
89 />
90 <#if autor != "">
91 <#assign autor = autor.getFullName()!"">
92 <#else>
93 <#assign autor = "Anônimo" >
94 </#if>
95 <#else>
96 <#assign autor = "Anônimo" >
97 </#if>
98
99 <#assign categorias = AssetCategoryLocalService.getCategoryNames(entry.getClassName(), entry.getClassPK())!"" >
100
101 <#assign categorias = AssetCategoryLocalService.getCategoryNames(entry.getClassName(), entry.getClassPK())!"" >
102
103 <#assign urlWC = "">
104 <#if autorArticleId != "0" && autorArticleId != "" && autor != "Anônimo">
105 <#assign autorArticle = JournalArticleLocalService.getLatestArticle(themeDisplay.getLayout().getGroupId(), autorArticleId?string) >
106 <#assign urlWC = autorArticle.getUrlTitle()!"">
107 </#if>
108
109
110 <#assign tags = AssetTagLocalService.getTagNames("com.liferay.journal.model.JournalArticle", journalArticle.getResourcePrimKey()?number )
111 tagName = tags[0]!""
112
113 >
114 <#if tagName?contains("organization") && tagName != "" >
115
116 <#assign
117 orgId = tagName?keep_after("organization-")
118 organization = OrganizationLocalService.fetchOrganization(orgId?number)!""
119 >
120
121
122 <#if organization != "" && autor != "Anônimo" && autorArticleId != "">
123 <#assign orgArticleId = organization.getExpandoBridge().getAttribute("journal-article")
124 orgJournalArticle = JournalArticleLocalService.getArticle(themeDisplay.getLayout().getGroupId(),orgArticleId?c)
125 urlWC = orgJournalArticle.getUrlTitle()!""
126 autor = organization.getName()!""
127 >
128 </#if>
129 </#if>
130
131 <#if themeDisplay.isSignedIn() >
132 <#assign tags = AssetTagLocalService.getTagNames(entry.getClassName(), entry.getClassPK()) >
133 <#assign orgId = (tags[0]!"")?remove_beginning("organization-") >
134 <#assign userIsAdmin = OrganizationLocalService.hasUserOrganization(themeDisplay.getUserId(), orgId?number)>
135 </#if>
136
137 <div class="estruturas-lista-item" id="InfraItem${JournalArticleID}">
138 <div class="lista-checkmark">
139 <#if categorias?seq_contains("aprovado") > <i title="Aprovado" style="color: #4ECD66" class="fa-solid fa-circle-check"></i> </#if>
140 <#if categorias?seq_contains("pendente") > <i title="Em análise" style="color: #D90000"class="fa-solid fa-spinner"></i> </#if>
141 <#if categorias?seq_contains("recusado") > <i title="Recusado" style="color: #D90000"class="fa-solid fa-exclamation-circle"></i> </#if>
142 </div>
143
144 <div class="lista-pic">
145 <#if imageSrc?trim !="" >
146 <div class="bioec_infra_img" style="background-image: url(${imageSrc})">
147 </div>
148 <#else>
149 <div class="bioec_infra_img_placeholder">
150 <i class="fa-solid fa-image"></i>
151 sem imagem
152 </div>
153 </#if>
154 </div>
155
156 <div class="lista-desc">
157 <h5>${entry.getHighlightedTitle()}</h5>
158 <p>Modelo: ${modelo}</p>
159 <p>Marca: ${marca}</p>
160 </div>
161
162 <div class="lista-arrow">
163 <button class="btn" type="button" data-toggle="collapse" data-target="#collapse-${entry.getClassPK()}" aria-expanded="false" aria-controls="collapse-${entry.getClassPK()}">
164 <i class="fa-solid fa-chevron-down"></i>
165 </button>
166 </div>
167
168 <span id="collapse-${entry.getClassPK()}" class="collapse lista-collapse">
169 <div class="lista-func">
170 <h5>Função </h5>
171 <p>${funcao}</p>
172 </div>
173
174 <#if categorias?seq_contains("recusado") >
175 <div style="border-top: 1px solid #E8ECEF; font-weight: bold; padding-top: 24px;">
176 <p>Conteudo Em Análise Pelo Cetiqt:</p>
177 <p>Conteúdo recusado pelo CETIQT por violar as políticas de privacidade.</p>
178 </div>
179 </#if >
180
181 <div class="lista-footnote">
182 <div>
183 <span class="lista-date">${journalArticle.getDisplayDate()?string('dd/MM/yyyy')}</span> | <span class="lista-commentNumber">${commentsCount} comentários</span> <span class="barra-pipe"> | </span> <span class="lista-author">Publicado por <a <#if urlWC != ''>href="/w/${urlWC}</#if>">${autor}</a></span>
184 </div>
185 <#if userIsAdmin>
186 <div class="buttonsActions">
187 <div style="cursor: pointer;font-size: 16px;" data-toggle="modal" data-target="#modalInfra${JournalArticleID}">
188 <i class="fa-solid fa-edit"></i>
189 </div>
190 <div style="cursor: pointer;font-size: 16px;" data-toggle="modal" data-target="#modal-infra-${entry.getClassPK()}">
191 <i class="fa-solid fa-trash-can"></i>
192 </div>
193
194 </div>
195 </#if>
196 </div>
197 </span>
198 </div>
199
200 <#if userIsAdmin>
201 <div style="display: none;" id="modal-infra-${entry.getClassPK()}" class="modal fade" role="dialog">
202 <div class="modal-dialog modal-lg" role="document">
203 <div class="modal-content">
204 <div class="modal-header" >
205 <h4 class="m-0">Remover Infraestrutura</h4>
206 <button type="button" class="close" data-dismiss="modal" aria-label="Close">
207 <span aria-hidden="true">
208 <i class="fa-solid fa-close"></i>
209 </span>
210 </button>
211 </div>
212 <div class="modal-body">
213 <h5>Você tem certeza que deseja remover essa infraestrutura?</h5>
214 <div>
215 Ao clicar em continuar, a infraestrutura será removida do seu perfil.
216 </div>
217 </div>
218 <div class="modal-footer justify-content-end">
219 <button class="bioec_secondary_button" data-dismiss="modal">CANCELAR</button>
220 <button class="bioec_primary_button" type="button" onclick="excluirInfra(${JournalArticleFrontId}, ${orgId})">CONTINUAR</button>
221 </div>
222 </div>
223 </div>
224 </div>
225 </#if>
226
227 <#-- modal edição -->
228
229<#if userIsAdmin>
230<div style="display: none;" id="modalInfra${JournalArticleID}" class="modal fade bioec-profile-infra-modal" role="dialog">
231 <div class="modal-dialog modal-lg" role="document">
232
233 <form class="form-group modal-content" id="formularioInfraestrutura${JournalArticleID}">
234 <div id="infraModal-l1-${JournalArticleID}" class="modal-header infraModal-l1" >
235 <h5>Adicionar Infraestrutura</h5>
236 <button id="fecharModal${JournalArticleID}" type="button" class="close" data-dismiss="modal" aria-label="Close">
237 <span aria-hidden="true">×</span>
238 </button>
239 </div>
240 <div id="infraModal-l2-${JournalArticleID}" class="modal-body infraModal-l2">
241 <div id="infraName${JournalArticleID}" class="infraName">
242 <label class="ReqLabel" for="inputInfraName${JournalArticleID}">Nome da infraestrutura</label>
243 <input type="text" id="inputInfraName${JournalArticleID}" value="${entry.getHighlightedTitle()}" placeholder="Nome da infraestrutura" required>
244 </div>
245 <div id="infraModel${JournalArticleID}" class="infraModel">
246 <label class="ReqLabel" for="inputInfraModel${JournalArticleID}">Modelo</label>
247 <input type="text" id="inputInfraModel${JournalArticleID}" value="${modelo}" placeholder="Modelo" required>
248 </div>
249 <div id="infraBrand${JournalArticleID}" class="infraBrand">
250 <label class="ReqLabel" for="inputInfraBrand${JournalArticleID}">Marca</label>
251 <input type="text" id="inputInfraBrand${JournalArticleID}" value="${marca}" placeholder="Marca" required>
252 </div>
253
254 <div id="infraImg${JournalArticleID}" class="infraImg">
255 <div style="display: flex; flex-direction: column; gap: 8px">
256 <label>Imagem da infraestrutura (Máx. 10 MB)</label>
257 <label class="bioec_secondary_button" id="carregarImagem${JournalArticleID}" for="inputCarregarImagemInfra${JournalArticleID}" style="font-size: 16px;color: #333244;align-self:start;">
258 CARREGAR IMAGEM
259 </label>
260 <input id="inputCarregarImagemInfra${JournalArticleID}" class="inputCarregarImagemInfra" type="file" accept="image/*" onchange="encodeInfraImageAsURL${JournalArticleID}(this)">
261 <input class="d-none" id="inputInfraBase64${JournalArticleID}" value="${imageSrc}" />
262 <div class="imagemCarregadaInfra${JournalArticleID} d-md-none d-block" style="background-image: url(${imageSrc})"></div>
263 <button type="button" id="removerImagemInfra${JournalArticleID}" class="<#if imageSrc == "" || imageSrc?? == false> d-none </#if> removerImagemInfra" >
264 <i class="fa fa-trash"></i> Remover imagem
265 </button>
266 </div>
267 <div class="imagemCarregadaInfra${JournalArticleID} d-md-block d-none" style="background-image: url(${imageSrc})"></div>
268 </div>
269
270 <div id="infraFunction${JournalArticleID}" class="infraFunction">
271 <label class="ReqLabel" for="inputInfraFunction${JournalArticleID}">Função</label>
272 <input type="text" id="inputInfraFunction${JournalArticleID}" class="inputInfraFunction" value="${funcao}" placeholder="Função" required>
273 </div>
274 </div>
275 <div class="TextImportant">
276 <p>
277 Importante: O conteúdo enviado passará por um processo interno de aprovação. Só então o conteúdo adicionado aparecerá no portal.
278 </p>
279 </div>
280 <div id="infraModal-l3-${JournalArticleID}" class="modal-footer infraModal-l3">
281 <button class="bioec_secondary_button" onclick="">SALVAR E FECHAR</button>
282 </div>
283 </form>
284
285 </div>
286</div>
287</#if>
288
289
290
291
292<script>
293const SHOW_NOTICE_CONTAINER_BIOECONOMIA = "SHOW_NOTICE_CONTAINER_BIOECONOMIA";
294
295
296
297function closeNoticeContainer() {
298 document.getElementById("upload-notice-container").style.display = "none";
299
300 window.localStorage.removeItem(SHOW_NOTICE_CONTAINER_BIOECONOMIA);
301}
302
303document
304 .getElementById("close-btn-upload-container")
305 .addEventListener("click", closeNoticeContainer);
306
307document.addEventListener("DOMContentLoaded", function(event) {
308 console.log('chegou aqui', window.localStorage.getItem(SHOW_NOTICE_CONTAINER_BIOECONOMIA));
309 var showNoticeContainer = window.localStorage.getItem(SHOW_NOTICE_CONTAINER_BIOECONOMIA);
310 if (showNoticeContainer == "true") {
311 document.getElementById("upload-notice-container").style.display = "block";
312 window.localStorage.removeItem(SHOW_NOTICE_CONTAINER_BIOECONOMIA);
313 }
314});
315
316
317
318<#if userIsAdmin>
319
320document.querySelector('#formularioInfraestrutura${JournalArticleID}').addEventListener('submit', event => {
321 event.preventDefault();
322 if (boolAddInfraestrutura == 0){
323 event.preventDefault();
324 }
325 editarSubmissao${JournalArticleID}();
326});
327
328function editarSubmissao${JournalArticleID}(){
329
330
331 Liferay.Util.openToast({message: "Enviando requisição",type: "info",title: ""});
332 const infraData = {
333 nome: document.getElementById("inputInfraName${JournalArticleID}").value,
334 marca: document.getElementById("inputInfraBrand${JournalArticleID}").value,
335 funcao: document.getElementById("inputInfraFunction${JournalArticleID}").value,
336 modelo: document.getElementById("inputInfraModel${JournalArticleID}").value,
337 autor: Liferay.ThemeDisplay.getUserName(),
338 imagem: document.getElementById("inputInfraBase64${JournalArticleID}").value,
339 }
340 console.log(JSON.stringify(infraData));
341
342 fetch(Liferay.ThemeDisplay.getPortalURL() + "/o/infraestrutura/equipamento/${JournalArticleFrontId}", {
343 method: 'PUT',
344 "headers": {
345 "x-csrf-token": Liferay.authToken,
346 "Content-Type": "application/json"
347 },
348 body: JSON.stringify(infraData)
349 })
350 .then(res => {
351 if(res.status == 200) {
352
353 Liferay.Util.openToast({
354 message: "Infraestrutura editada com sucesso. Após a submissão, será iniciado um novo processo interno de aprovação do conteúdo enviado. Só então o conteúdo submetido aparecerá novamente no portal.",
355 type: "success",
356 title: "",
357 toastProps: {
358 autoClose: 5000
359 }
360 })
361
362setTimeout(function(){ location.reload(); }, 2000);
363
364 } else {
365 Liferay.Util.openToast({
366 message: "Erro ao editar infraestrutura",
367 type: "danger",
368 title: "",
369 toastProps: {
370 autoClose: 5000
371 }
372 })
373 }
374 });
375 }
376</#if>
377
378function excluirInfra(wcId, orgId) {
379 Liferay.Util.openToast({message: "Enviando requisição",type: "info",title: ""});
380 fetch(Liferay.ThemeDisplay.getPortalURL() + "/o/infraestrutura/equipamento/" + wcId , {
381 method: 'DELETE',
382 "headers": {
383 "x-csrf-token": Liferay.authToken,
384 "Content-Type": "application/json"
385 }
386 })
387 .then(res => {
388 if(res.status == 200) {
389 Liferay.Util.openToast({
390 message: "Infraestrutura excluida com sucesso",
391 type: "success",
392 title: "",
393 toastProps: {
394 autoClose: 5000
395 }
396 })
397 setTimeout(function(){ location.reload(); }, 2000)
398 } else {
399 Liferay.Util.openToast({
400 message: "Erro ao excluir infraestrutura",
401 type: "danger",
402 title: "",
403 toastProps: {
404 autoClose: 5000
405 }
406 })
407 }
408 });
409 }
410
411
412 function encodeInfraImageAsURL${JournalArticleID}(element) {
413 let file = element.files[0];
414 let reader = new FileReader();
415 reader.onloadend = () => {
416 if(reader.result) {
417 if(!validImageSize(reader.result)) return;
418 try {
419 Array.from(document.getElementsByClassName("imagemCarregadaInfra${JournalArticleID}")).forEach( el => el.style.backgroundImage = 'url(' + reader.result + ')' )
420 const base64_input = document.getElementById("inputInfraBase64${JournalArticleID}")
421 base64_input.value = reader.result
422
423
424 const removeImageButton = document.getElementById("removerImagemInfra${JournalArticleID}")
425 removeImageButton.classList.remove("d-none")
426 } catch (error) {
427 console.error(error)
428 }
429 }
430 }
431 reader.readAsDataURL(file);
432 }
433
434 function removeImageInfra${JournalArticleID}() {
435 try {
436 const file_input = document.getElementById("inputCarregarImagemInfra${JournalArticleID}")
437Array.from(document.getElementsByClassName("imagemCarregadaInfra${JournalArticleID}")).forEach( el => el.style.backgroundImage = "" )
438 const base64_input = document.getElementById("inputInfraBase64${JournalArticleID}")
439 file_input.value = null
440 base64_input.value = ""
441 console.log("foi")
442 const removeImageButton = document.getElementById("removerImagemInfra${JournalArticleID}")
443 removeImageButton.classList.add("d-none")
444 } catch (error) {
445 console.error(error)
446 }
447}
448
449
450document.getElementById("removerImagemInfra${JournalArticleID}").addEventListener("click", removeImageInfra${JournalArticleID});
451
452</script>
453<style>
454
455#upload-notice-container {
456 background: var(--cinza-claro, #e8ecef);
457 padding: 24px 24px 16px;
458 width: 100%;
459 position: relative;
460 margin-bottom: 40px;
461}
462
463#upload-notice-container #close-btn-upload-container {
464 position: absolute;
465 top: 0px;
466 right: 2px;
467 height: 24px;
468 margin: 8px;
469 cursor: pointer;
470}
471
472#upload-notice-container #close-btn-upload-container i {
473 font-size: 22px;
474 color: #5B5C61;
475}
476
477#upload-notice-container .upload-notice-title {
478 font-size: 20px;
479 /* font-family: Roboto; */
480 font-weight: 700;
481 line-height: 150%;
482 color: var(--texto, #5b5c61);
483 display: flex;
484 align-items: center;
485 margin-bottom: 12px;
486}
487
488#upload-notice-container .upload-notice-title i {
489 color: #ffc806;
490 margin-right: 12px;
491 font-size: 24px;
492}
493
494#upload-notice-container p {
495 color: var(--texto, #5b5c61);
496 font-size: 16px;
497 /* font-family: Roboto; */
498 line-height: 150%;
499 margin-bottom: 8px;
500}
501
502#upload-notice-container p > span {
503 font-weight: 700;
504}
505
506
507.imagemCarregadaInfra${JournalArticleID} {
508 background-size: contain;
509 background-position: center;
510 background-repeat: no-repeat;
511 height: 100px;
512 width: 100px;
513}
514
515#removerImagemInfra${JournalArticleID} {
516 background: none;
517 border: none;
518 outline: none;
519 color: #5B5C61;
520 font-size: 16px;
521 font-weight: 900;
522 line-height: 24px;
523 letter-spacing: 0em;
524 width: fit-content;
525 margin-left: 16px;
526}
527</style>
528 </#list>
529 </#if>
530 </div>
531</div>
532
533
534<style>
535
536.bioec_infra_img {
537 width: 140px;
538 height: 140px;
539 overflow: hidden;
540 background-size: contain;
541 background-position: center;
542 background-repeat: no-repeat;
543}
544
545.bioec_infra_img_placeholder {
546 width: 140px;
547 height: 140px;
548 background-color: #E8ECEF;
549 display: flex;
550 flex-direction: column;
551 align-items: center;
552 justify-content: center;
553 font-size: 14px;
554 color: #5B5C61;
555}
556
557.bioec_infra_img_placeholder i {
558 font-size: 44px;
559}
560
561
562.bioec-profile-estrutura-main{
563 display: flex;
564 gap: 40px;
565 flex-direction: column;
566 padding-bottom: 20px;
567}
568
569.bioec-profile-estrutura-main h5, .bioec-profile-estrutura-main p, .bioec-profile-estrutura-main a{
570 color: #5B5C61;
571}
572
573.bioec-profile-estrutura-main h5{
574 font-weight: 700;
575}
576.bioec-profile-estrutura-main h5, .bioec-profile-estrutura-main p{
577
578 font-size: 16px;
579
580}
581
582.bioec-profile-estrutura-main #estruturas-lista .estruturas-lista-item {
583 border: 1px #BEBEBE solid;
584 padding: 24px;
585 display: grid;
586 grid-template-columns: 24px 12px 138px 46px 1fr 12px 15px;
587 grid-template-areas: "ck . pic . desc . arrw"
588 ". . clps clps clps clps clps";
589 margin-bottom: 40px;
590}
591
592.bioec-profile-estrutura-main .lista-checkmark { grid-area: ck; }
593.bioec-profile-estrutura-main .lista-pic { grid-area: pic; display: flex; justify-content: center;}
594.bioec-profile-estrutura-main .lista-arrow { grid-area: arrw; }
595.bioec-profile-estrutura-main .lista-collapse { grid-area: clps; }
596
597.bioec-profile-estrutura-main .lista-desc {
598 grid-area: desc;
599 display: flex;
600 flex-direction: column;
601 justify-content: center;
602
603}
604
605.bioec-profile-estrutura-main .lista-desc h5{
606 margin-bottom: 12px;
607}
608
609.bioec-profile-estrutura-main .lista-desc p{
610 margin: 0;
611}
612
613.bioec-profile-estrutura-main .lista-func {
614
615 margin: 24px 0;
616}
617
618.bioec-profile-estrutura-main .lista-footnote {
619
620 display: flex;
621 justify-content: space-between;
622 border-top: 1px solid #E8ECEF;
623 padding-top: 12px;
624 font-size: 14px;
625 font-weight: 300;
626 gap: 15px;
627 color: #5B5C61;
628
629}
630
631.pagination-items-per-page.active > a,
632.pagination-items-per-page.active > button,
633.pagination-items-per-page.show > a,
634.pagination-items-per-page.show > button,
635.page-item.active .page-link,
636.page-item.show .page-link{
637 border-color: #4ECD66;
638 background-color: #4ECD66;
639}
640
641.pagination-results,
642.pagination-items-per-page > a,
643.pagination-items-per-page > button,
644.pagination-items-per-page > a:hover,
645.pagination-items-per-page > button:hover,
646.page-link{
647 color: #4ebe66;
648}
649
650.estruturas-port{
651 border: 1px #BEBEBE solid;
652 padding: 24px;
653 display: flex;
654 flex-direction: column;
655 align-items: center;
656 gap: 24px;
657}
658
659.estruturas-port p{
660 text-align: center;
661 max-width: 760px;
662 font-size: 18px;
663 color: #5B5C61;
664}
665
666.estruturas-port div{
667display: flex;
668 justify-content: space-between;
669 width: min(558px, 100%);
670}
671
672.lista-arrow button{
673 padding: 0;
674}
675
676.lista-arrow button:focus{
677 box-shadow: none;
678}
679
680@media(max-width: 1100px){
681 .estruturas-port div{
682 flex-direction: column;
683 gap: 30px;
684 }
685
686}
687
688@media(max-width: 450px){
689 .bioec-profile-estrutura-main .lista-footnote{
690 flex-direction: column;
691 gap: 10px;
692 align-items: flex-end;
693 text-align: right;
694 }
695}
696
697.bioec-profile-estrutura-main .lista-footnote .buttonsActions {
698 display: flex;
699 gap: 17px;
700}
701
702@media(max-width: 768px){
703 .bioec-profile-estrutura-main #estruturas-lista .estruturas-lista-item{
704 grid-template-columns: 24px 1fr 10px 1fr 15px;
705 grid-template-areas: "ck desc desc desc arrw"
706 ". pic pic pic ."
707 "clps clps clps clps clps";
708
709 }
710
711 .bioec-profile-estrutura-main .lista-desc{
712 align-items: center;
713 }
714
715 .lista-pic{
716 display: flex;
717 justify-content: center;
718 }
719
720 .bioec-profile-estrutura-main .lista-footnote{
721 flex-direction: column;
722 align-items: center;
723 }
724
725 .bioec-profile-estrutura-main .lista-footnote > div {
726 text-align: center;
727 }
728
729 .bioec-profile-estrutura-main .lista-footnote .barra-pipe {
730 display: none;
731 }
732 .bioec-profile-estrutura-main .lista-footnote .lista-author {
733 display: flex;
734 gap: 4px;
735 justify-content: center;
736 }
737 .bioec-profile-estrutura-main .lista-footnote .buttonsActions {
738 width: 100%;
739 justify-content: space-between;
740 }
741}
742</style>
The following has evaluated to null or missing: ==> autorId [in template "34764#34807#41127" at line 71, column 46] ---- Tip: If the failing expression is known to 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: #if autorId != "" && autorId?? [in template "34764#34807#41127" at line 71, column 41] ----
1<#assign JournalArticleLocalService = serviceLocator.findService("com.liferay.journal.service.JournalArticleLocalService")>
2<#assign UserLocalService = serviceLocator.findService("com.liferay.portal.kernel.service.UserLocalService")>
3<#assign AssetCategoryLocalService = serviceLocator.findService("com.liferay.asset.kernel.service.AssetCategoryLocalService")>
4<#assign
5mbMessageLocalService = serviceLocator.findService("com.liferay.message.boards.service.MBMessageLocalService")
6 tagsLocalService = serviceLocator.findService("com.liferay.asset.kernel.service.AssetTagLocalService")
7 OrganizationLocalService = serviceLocator.findService("com.liferay.portal.kernel.service.OrganizationLocalService")
8>
9
10
11<div class="bioec-profile-demanda-main">
12 <div id="demanda-lista-container" class="d-flex flex-column">
13 <#if entries?has_content>
14 <#list entries as entry>
15 <#assign journalArticle = JournalArticleLocalService.getLatestArticle(entry.getClassPK()) >
16 <#assign JournalArticleID = journalArticle.getId()>
17 <#assign JournalArticleFrontId = journalArticle.getArticleId()>
18 <#assign articleXml = journalArticle.getDocument().getRootElement()
19 userIsAdmin = false
20 orgId = ""
21 >
22
23 <#assign nomeParaContato = "">
24
25 <#if articleXml.selectSingleNode("dynamic-element[@field-reference='Text77253735']")??>
26
27 <#assign nomeParaContato = articleXml.selectSingleNode("dynamic-element[@field-reference='Text77253735']").getStringValue()!""
28 nomeParaContato = nomeParaContato?replace("\n\t\t", "")
29 nomeParaContato = nomeParaContato?replace("\n\t", "")
30 >
31
32 </#if>
33 <#if articleXml.selectSingleNode("dynamic-element[@field-reference='Text94974146']")??>
34 <#assign telefone = articleXml.selectSingleNode("dynamic-element[@field-reference='Text94974146']").getStringValue()!""
35 telefone = telefone?replace("\n\t\t", "")
36 telefone = telefone?replace("\n\t", "")
37 >
38 </#if>
39
40 <#if articleXml.selectSingleNode("dynamic-element[@field-reference='Text68569631']")??>
41 <#assign email = articleXml.selectSingleNode("dynamic-element[@field-reference='Text68569631']").getStringValue()!""
42 email = email?replace("\n\t\t", "")
43 email = email?replace("\n\t", "")
44 >
45 </#if>
46
47 <#if articleXml.selectSingleNode("dynamic-element[@field-reference='CopyOfCopyOfText18267936']")??>
48 <#assign desc = articleXml.selectSingleNode("dynamic-element[@field-reference='CopyOfCopyOfText18267936']").getStringValue()!""
49 desc = desc?replace("\n\t\t", "")
50 desc = desc?replace("\n\t", "")
51 >
52 </#if>
53 <#if articleXml.selectSingleNode("dynamic-element[@field-reference='Text97565506']")??>
54 <#assign imagem = articleXml.selectSingleNode("dynamic-element[@field-reference='Text97565506']").getStringValue()!""
55 imagem = imagem?replace("(\r\n)+", "",'r')
56 imagem = imagem?replace(" ", "",'r')
57 >
58 </#if>
59 <#if articleXml.selectSingleNode("dynamic-element[@field-reference='Text99746569']")??>
60 <#assign
61 autorId = articleXml.selectSingleNode("dynamic-element[@field-reference='Text99746569']").getStringValue()!""
62 autorId = autorId?replace("\n\t\t", "")
63 autorId = autorId?replace("\n\t", "")
64 autorArticleId = ""
65 >
66 </#if>
67 <#assign
68 commentsCount = mbMessageLocalService.getDiscussionMessagesCount(entry.getClassName(), entry.getClassPK(), 0)!"0"
69 >
70
71 <#if autorId != "" && autorId??>
72 <#assign
73 autor = UserLocalService.fetchUser(autorId?number)!""
74 autorArticleId = autor.getExpandoBridge().getAttribute("journal-article")!"0"
75 />
76 <#if autor != "">
77 <#assign autor = autor.getFullName()!"">
78 <#else>
79 <#assign autor = "Anônimo" >
80 </#if>
81 <#else>
82 <#assign autor = "Anônimo" >
83 </#if>
84 <#assign categorias = AssetCategoryLocalService.getCategoryNames(entry.getClassName(), entry.getClassPK())!"" >
85 <#assign urlWC = "">
86 <#if autorArticleId != "0" && autorArticleId != "" && autor != "Anônimo">
87 <#assign autorArticle = JournalArticleLocalService.getLatestArticle(themeDisplay.getLayout().getGroupId(), autorArticleId?string) >
88 <#assign urlWC = autorArticle.getUrlTitle()!"">
89 </#if>
90
91 <#assign tags = tagsLocalService.getTagNames("com.liferay.journal.model.JournalArticle", journalArticle.getResourcePrimKey()?number )
92 tagName = tags[0]!""
93 orgOrUser = ""
94 >
95
96 <#if tagName?contains("organization") && tagName != "" >
97 <#assign orgOrUser = "org">
98 <#else>
99 <#assign orgOrUser = "user">
100 </#if>
101
102 <#if orgOrUser == "org" >
103
104 <#assign
105 orgId = tagName?keep_after("organization-")
106 organization = OrganizationLocalService.fetchOrganization(orgId?number)!""
107 >
108
109
110 <#if organization != "" && autor != "Anônimo">
111
112 <#assign orgArticleId = organization.getExpandoBridge().getAttribute("journal-article")
113 orgJournalArticle = JournalArticleLocalService.getArticle(themeDisplay.getLayout().getGroupId(),orgArticleId?c)
114 urlWC = orgJournalArticle.getUrlTitle()!""
115 autor = organization.getName()!""
116 >
117
118 </#if>
119 </#if>
120
121 <#if themeDisplay.isSignedIn() >
122 <#if tagName?contains("organization-")>
123 <#assign userIsAdmin = OrganizationLocalService.hasUserOrganization(themeDisplay.getUserId(), orgId?number)>
124 <#else>
125 <#if autorId?number == themeDisplay.getUserId()>
126 <script>console.log("oi");</script>
127 <#assign userIsAdmin = true>
128 </#if>
129 </#if>
130
131
132 </#if>
133
134
135
136 <div class="demanda-lista-item">
137
138 <div class="lista-checkmark">
139 <#if categorias?seq_contains("aprovado") > <i title="Aprovado" style="color: #4ECD66" class="fa-solid fa-circle-check"></i> </#if>
140 <#if categorias?seq_contains("pendente") > <i title="Em análise" style="color: #D90000"class="fa-solid fa-spinner"></i> </#if>
141 <#if categorias?seq_contains("recusado") > <i title="Recusado" style="color: #D90000"class="fa-solid fa-exclamation-circle"></i> </#if>
142 </div>
143
144
145 <div class="lista-titulo">
146 <h5>${entry.getHighlightedTitle()}</h5>
147 </div>
148
149 <div class="lista-arrow">
150 <button style="padding: 0;" class="btn" type="button" data-toggle="collapse" data-target="#collapseID${entry.getClassPK()}" aria-expanded="false" aria-controls="collapseID${entry.getClassPK()}">
151 <i class="fa-solid fa-chevron-down"></i>
152 </button>
153 </div>
154
155 <div class="lista-desc">
156 <p>${desc}</p>
157 </div>
158
159 <div class="lista-collapse collapse" id="collapseID${entry.getClassPK()}">
160 <#if nomeParaContato != "" || telefone != "" || email != "" || imagem?trim !="">
161 <div class="lista-details">
162 <div class="lista-pic">
163 <i class="fa-solid fa-image-slash"></i>
164 <#if imagem?trim !="" >
165 <img class="bioec_demanda_img" src="${imagem}">
166 <#else>
167 <div class="bioec_demanda_img_placeholder">
168 <i class="fa-solid fa-image"></i>
169 sem imagem
170 </div>
171 </#if>
172 </div>
173 <#if nomeParaContato != "" || telefone != "" || email != "" >
174 <div class="lista-contato">
175 <p>Contato</p>
176 <p class="lista-author">${nomeParaContato}</p>
177 <p class="lista-phone">${telefone}</p>
178 <p class="lista-email">${email}</p>
179 </div>
180 </#if>
181 </div>
182 </#if>
183
184 <#if categorias?seq_contains("recusado") >
185 <div style="border-top: 1px solid #E8ECEF; font-weight: bold; padding-top: 24px;">
186 <p>Conteúdo Em Análise Pelo Cetiqt:</p>
187 <p>Conteúdo recusado pelo CETIQT por violar as políticas de privacidade.</p>
188 </div>
189 </#if>
190 <div class="lista-footnote">
191 <div>
192 <span class="lista-date">${journalArticle.getDisplayDate()?string('dd/MM/yyyy')}</span> | <span class="lista-commentNumber">${commentsCount} cometários</span> <span class="barra-pipe"> | </span> <span class="lista-author">Publicado por <a <#if urlWC != ''>href="/w/${urlWC}</#if>">${autor}</a></span>
193 </div>
194 <#if userIsAdmin>
195 <div class="buttonsActions">
196 <div style="cursor: pointer;font-size: 16px;" data-toggle="modal" data-target="#modalDemanda${JournalArticleID}">
197 <i class="fa-solid fa-edit"></i>
198 </div>
199 <div style="cursor: pointer;font-size: 16px;" data-toggle="modal" data-target="#modal-demanda-${entry.getClassPK()}">
200 <i class="fa-solid fa-trash-can"></i>
201 </div>
202
203 </div>
204 </#if>
205 </div>
206 </div>
207 </div>
208
209 <#if userIsAdmin>
210 <div style="display: none;" id="modal-demanda-${entry.getClassPK()}" class="modal fade" role="dialog">
211 <div class="modal-dialog modal-lg" role="document">
212 <div class="modal-content">
213 <div class="modal-header" >
214 <h4 class="m-0">Remover Demanda</h4>
215 <button type="button" class="close" data-dismiss="modal" aria-label="Close">
216 <span aria-hidden="true">
217 <i class="fa-solid fa-close"></i>
218 </span>
219 </button>
220 </div>
221 <div class="modal-body">
222 <h5>Você tem certeza que deseja remover essa demanda?</h5>
223 <div>
224 Ao clicar em continuar, a demanda será removida do seu perfil.
225 </div>
226 </div>
227 <div class="modal-footer justify-content-end">
228 <button class="bioec_secondary_button" data-dismiss="modal">CANCELAR</button>
229 <button class="bioec_primary_button" type="button" onclick="excluirDemanda(${JournalArticleFrontId}, ${orgId})">CONTINUAR</button>
230 </div>
231 </div>
232 </div>
233 </div>
234
235 <#-- modal edição -->
236
237
238 <div style="display: none;" id="modalDemanda${JournalArticleID}" class="modal fade bioec-profile-demanda-modal modalDemanda" role="dialog">
239 <div class="modal-dialog modal-lg" role="document">
240 <form id="formularioDemanda${JournalArticleID}" class="form-group modal-content formularioDemanda">
241 <div id="demandaModal-l1${JournalArticleID}" class="modal-header demandaModal-l1">
242 <h5>Adicionar demanda</h5>
243 <button type="button" class="close" data-dismiss="modal" aria-label="Close">
244 <span aria-hidden="true">×</span>
245 </button>
246 </div>
247 <div id="demandaModal-l2${JournalArticleID}" class="modal-body demandaModal-l2">
248 <div id="demandaTitle${JournalArticleID}" class="demandaTitle">
249 <label class="ReqLabel" for="demandaInputTitle${JournalArticleID}">Título da demanda</label>
250 <input id="demandaInputTitle${JournalArticleID}" value="${entry.getHighlightedTitle()}" type="text" placeholder="Inserir um título" required>
251 </div>
252 <div id="demandaName${JournalArticleID}" class="demandaName">
253 <label class="" for="demandaInputName${JournalArticleID}">Nome para contato</label>
254 <input value="${nomeParaContato}" id="demandaInputName${JournalArticleID}" placeholder="Inserir nome" type="text">
255 </div>
256 <div id="demandaTelephone${JournalArticleID}" class="demandaTelephone">
257 <label class="" for="demandaInputPhone${JournalArticleID}">Telefone para contato</label>
258 <input value="${telefone}" id="demandaInputPhone${JournalArticleID}" name="demandaInputPhone" type="text" placeholder ='(__)_____-_____' minlength="14" />
259 </div>
260 <div id="demandaEmail${JournalArticleID}" class="demandaEmail">
261 <label class="" for="demandaInputEmail${JournalArticleID}">E-mail para contato</label>
262 <input value="${email}" id="demandaInputEmail${JournalArticleID}" placeholder="Inserir e-mail" type="text">
263 </div>
264 <div id="demandaDesc${JournalArticleID}" class="demandaDesc">
265 <label class="ReqLabel" for="demandaInputDesc${JournalArticleID}">Descrição</label>
266 <textarea id="demandaInputDesc${JournalArticleID}" style="max-width: 100%;font-size: 16px;height: 80px;border: 1px solid #BEBEBE;" required>${desc}</textarea>
267 </div>
268 <div id="demandaImg${JournalArticleID}" class="demandaImg">
269 <div style="display: flex; flex-direction: column; gap: 8px">
270 <label>Imagem da demanda (Máx. 10 MB)</label>
271 <label class="btn carregarImagem" id="carregarImagem${JournalArticleID}" for="inputCarregarImagemDemanda${JournalArticleID}" style="font-size: 16px; cursor: pointer;">CARREGAR IMAGEM</label>
272 <input class="inputCarregarImagemDemanda" id="inputCarregarImagemDemanda${JournalArticleID}" type="file" accept="image/*" onchange="encodeDemandaImageAsURL${JournalArticleID}(this)">
273 <input class="d-none" id="inputDemandaBase64${JournalArticleID}" value="${imagem}" />
274 <div class="imagemCarregadaDemanda imagemCarregadaDemanda${JournalArticleID} d-md-none d-block" style="background-image: url(${imagem})"></div>
275 <button type="button" id="removerImagemDemanda${JournalArticleID}" class="<#if imagem == "" || imagem?? == false> d-none </#if> removerImagemDemanda" >
276 <i class="fa fa-trash"></i> Remover imagem
277 </button>
278 </div>
279 <div class="imagemCarregadaDemanda imagemCarregadaDemanda${JournalArticleID} d-md-block d-none" style="background-image: url(${imagem})"></div>
280 </div>
281 </div>
282 <div class="TextImportant">
283 <p>
284 Importante: O conteúdo enviado passará por um processo interno de aprovação. Só então o conteúdo adicionado aparecerá no portal.
285 </p>
286 </div>
287
288 <div id="demandaModal-l3${JournalArticleID}" class="modal-footer demandaModal-l3">
289 <button class="btn button-empty" onclick="" id="demandas-saveAndClose${JournalArticleID}">SALVAR E FECHAR</button>
290 </div>
291 </form>
292 </div>
293 </div>
294
295 </#if>
296 <#--
297
298
299
300
301 <div style="display: none;" id="modalInfra${JournalArticleID}" class="modal fade bioec-profile-infra-modal" role="dialog">
302 <div class="modal-dialog modal-lg" role="document">
303
304 <form class="form-group modal-content" id="formularioInfraestrutura${JournalArticleID}">
305 <div id="infraModal-l1-${JournalArticleID}" class="modal-header infraModal-l1" >
306 <h5>Adicionar Infraestrutura</h5>
307 <button id="fecharModal${JournalArticleID}" type="button" class="close" data-dismiss="modal" aria-label="Close">
308 <span aria-hidden="true">×</span>
309 </button>
310 </div>
311 <div id="infraModal-l2-${JournalArticleID}" class="modal-body infraModal-l2">
312 <div id="infraName${JournalArticleID}" class="infraName">
313 <label class="ReqLabel" for="inputInfraName${JournalArticleID}">Nome da infraestrutura</label>
314 <input type="text" id="inputInfraName${JournalArticleID}" value="${entry.getHighlightedTitle()}" placeholder="Nome da infraestrutura" required>
315 </div>
316 <div id="infraModel${JournalArticleID}" class="infraModel">
317 <label class="ReqLabel" for="inputInfraModel${JournalArticleID}">Modelo</label>
318 <input type="text" id="inputInfraModel${JournalArticleID}" value="${modelo}" placeholder="Modelo" required>
319 </div>
320 <div id="infraBrand${JournalArticleID}" class="infraBrand">
321 <label class="ReqLabel" for="inputInfraBrand${JournalArticleID}">Marca</label>
322 <input type="text" id="inputInfraBrand${JournalArticleID}" value="${marca}" placeholder="Marca" required>
323 </div>
324
325 <div id="infraImg${JournalArticleID}" class="infraImg">
326 <div style="display: flex; flex-direction: column; gap: 8px">
327 <label>Imagem da infraestrutura (Máx. 10 MB)</label>
328 <label class="bioec_secondary_button" id="carregarImagem${JournalArticleID}" for="inputCarregarImagemInfra${JournalArticleID}" style="font-size: 16px;color: #333244;align-self:start;">
329 CARREGAR IMAGEM
330 </label>
331 <input id="inputCarregarImagemInfra${JournalArticleID}" class="inputCarregarImagemInfra" type="file" accept="image/*" onchange="encodeInfraImageAsURL${JournalArticleID}(this)">
332 <input class="d-none" id="inputInfraBase64${JournalArticleID}" />
333 <div class="imagemCarregadaInfra${JournalArticleID} d-md-none d-block"></div>
334 <button type="button" id="removerImagemInfra${JournalArticleID}" class="d-none removerImagemInfra" >
335 <i class="fa fa-trash"></i> Remover imagem
336 </button>
337 </div>
338 <div class="imagemCarregadaInfra${JournalArticleID} d-md-block d-none"></div>
339 </div>
340
341 <div id="infraFunction${JournalArticleID}" class="infraFunction">
342 <label class="ReqLabel" for="inputInfraFunction${JournalArticleID}">Função</label>
343 <input type="text" id="inputInfraFunction${JournalArticleID}" class="inputInfraFunction" value="${funcao}" placeholder="Função" required>
344 </div>
345 </div>
346 <div class="TextImportant">
347 <p>
348 Importante: O conteúdo enviado passará por um processo interno de aprovação. Só então o conteúdo adicionado aparecerá no portal.
349 </p>
350 </div>
351 <div id="infraModal-l3-${JournalArticleID}" class="modal-footer infraModal-l3">
352 <button class="bioec_secondary_button" id="demandas-saveAndClose${JournalArticleID}" onclick="">SALVAR E FECHAR</button>
353 </div>
354 </form>
355
356 </div>
357
358
359 -->
360
361
362
363 <script>
364 <#if userIsAdmin>
365 function excluirDemanda(wcId, orgId) {
366 Liferay.Util.openToast({message: "Enviando requisição",type: "info",title: ""});
367 fetch(Liferay.ThemeDisplay.getPortalURL() + "/o/demanda/" + wcId, {
368 method: 'DELETE',
369 "headers": {
370 "x-csrf-token": Liferay.authToken,
371 "Content-Type": "application/json"
372 }
373 })
374 .then(res => {
375 if(res.status == 200) {
376 Liferay.Util.openToast({
377 message: "Infraestrutura excluida com sucesso",
378 type: "success",
379 title: "",
380 toastProps: {
381 autoClose: 5000
382 }
383 })
384 setTimeout(function(){ location.reload(); }, 2000)
385 } else {
386 Liferay.Util.openToast({
387 message: "Erro ao excluir infraestrutura",
388 type: "danger",
389 title: "",
390 toastProps: {
391 autoClose: 5000
392 }
393 })
394 }
395 });
396 }
397
398
399
400
401 function validImageSize(base64="") {
402 const decoded = atob(base64.substring(base64.indexOf(',') + 1));
403 const sizeMB = decoded.length / 1e+6;
404 console.log("MB: " + decoded.length / 1e+6);
405 if(sizeMB > 10) {
406 Liferay.Util.openToast({
407 message: "O tamanho da imagem não deve ultrapassar 10 MB.",
408 type: "danger",
409 title: "",
410 toastProps: {
411 autoClose: 5000
412 }
413 })
414 return false
415 }
416 return true
417 }
418
419 function encodeDemandaImageAsURL${JournalArticleID}(element) {
420 let file = element.files[0];
421 let reader = new FileReader();
422 reader.onloadend = () => {
423 if(reader.result) {
424 if(!validImageSize(reader.result)) return;
425 try {
426 const base64_input = document.getElementById("inputDemandaBase64${JournalArticleID}")
427 base64_input.value = reader.result
428 Array.from(document.getElementsByClassName("imagemCarregadaDemanda${JournalArticleID}")).forEach( el => el.style.backgroundImage = 'url(' + reader.result + ')' )
429
430 const removeImageButton = document.getElementById("removerImagemDemanda${JournalArticleID}")
431 removeImageButton.classList.remove("d-none")
432 } catch (error) {
433 console.error(error)
434 }
435 }
436 }
437 reader.readAsDataURL(file);
438 }
439
440 function removeImageDemanda${JournalArticleID}() {
441 try {
442 const file_input = document.getElementById("inputCarregarImagemDemanda${JournalArticleID}")
443 Array.from(document.getElementsByClassName("imagemCarregadaDemanda${JournalArticleID}")).forEach( el => el.style.backgroundImage = "" )
444 const base64_input = document.getElementById("inputDemandaBase64${JournalArticleID}")
445 file_input.value = null
446 base64_input.value = ""
447
448 const removeImageButton = document.getElementById("removerImagemDemanda${JournalArticleID}")
449 removeImageButton.classList.add("d-none")
450 } catch (error) {
451 console.error(error)
452 }
453}
454
455
456document.getElementById("removerImagemDemanda${JournalArticleID}").addEventListener("click", removeImageDemanda${JournalArticleID});
457
458<#-- Rest da edição de organização -->
459
460<#if orgOrUser == "org">
461document.querySelector('#formularioDemanda${JournalArticleID}').addEventListener('submit', event => {
462 event.preventDefault();
463 adicionarDemanda${JournalArticleID}();
464});
465
466function adicionarDemanda${JournalArticleID}() {
467 Liferay.Util.openToast({message: "Enviando requisição",type: "info",title: ""});
468 $("#demandas-saveAndClose${JournalArticleID}").prop("disabled",true);
469
470
471
472 const demandaData = {
473 titulo: document.getElementById("demandaInputTitle${JournalArticleID}").value,
474 nomeContato: document.getElementById("demandaInputName${JournalArticleID}").value,
475 telefoneContato: document.getElementById("demandaInputPhone${JournalArticleID}").value,
476 emailContato: document.getElementById("demandaInputEmail${JournalArticleID}").value,
477 descricao: document.getElementById("demandaInputDesc${JournalArticleID}").value,
478 imagem: document.getElementById("inputDemandaBase64${JournalArticleID}").value,
479 }
480
481 console.log(demandaData);
482
483 fetch(Liferay.ThemeDisplay.getPortalURL() + "/o/demanda/${JournalArticleFrontId}", {
484 method: 'PUT',
485 "headers": {
486 "x-csrf-token": Liferay.authToken,
487 "Content-Type": "application/json"
488 },
489 body: JSON.stringify(demandaData)
490 })
491 .then(res => {
492 if(res.status == 200) {
493 Liferay.Util.openToast({
494 message: "Demanda editada com sucesso. Após a submissão, será iniciado o processo interno de aprovação do conteúdo enviado. Só então o conteúdo submetido aparecerá no portal.",
495 type: "success",
496 title: "",
497 toastProps: {
498 autoClose: 5000
499 }
500 })
501 setTimeout(function(){ location.reload(); }, 2000);
502 } else {
503 $("#demandas-saveAndClose${JournalArticleID}").prop("disabled",false);
504 Liferay.Util.openToast({
505 message: "Erro ao editada demanda",
506 type: "danger",
507 title: "",
508 toastProps: {
509 autoClose: 5000
510 }
511 })
512 }
513 })
514
515 }
516</#if>
517
518<#-- Rest da edição de pessoa fisica -->
519
520
521 <#if orgOrUser == "user">
522
523 document.querySelector('#formularioDemanda${JournalArticleID}').addEventListener('submit', event => {
524 event.preventDefault();
525 adicionarDemanda${JournalArticleID}();
526 });
527
528 function adicionarDemanda${JournalArticleID}() {
529 Liferay.Util.openToast({message: "Enviando requisição",type: "info",title: ""});
530 $("#demandas-saveAndClose${JournalArticleID}").prop("disabled",true);
531
532 const demandaData = {
533 titulo: document.getElementById("demandaInputTitle${JournalArticleID}").value,
534 nomeContato: document.getElementById("demandaInputName${JournalArticleID}").value,
535 telefoneContato: document.getElementById("demandaInputPhone${JournalArticleID}").value,
536 emailContato: document.getElementById("demandaInputEmail${JournalArticleID}").value,
537 descricao: document.getElementById("demandaInputDesc${JournalArticleID}").value,
538 imagem: document.getElementById("inputDemandaBase64${JournalArticleID}").value,
539 }
540
541 console.log(demandaData);
542
543 fetch(Liferay.ThemeDisplay.getPortalURL() + "/o/demanda/${JournalArticleFrontId}", {
544 method: 'PUT',
545 "headers": {
546 "x-csrf-token": Liferay.authToken,
547 "Content-Type": "application/json"
548 },
549 body: JSON.stringify(demandaData)
550 })
551 .then( res => {
552 if(res.status == 200) {
553 Liferay.Util.openToast({
554 message: "Demanda editada com sucesso. Após a submissão, será iniciado o processo interno de aprovação do conteúdo enviado. Só então o conteúdo submetido aparecerá no portal.",
555 type: "success",
556 title: "",
557 toastProps: {
558 autoClose: 5000
559 }
560 })
561 setTimeout(function(){ location.reload(); }, 2000);
562 } else {
563 $("#demandas-saveAndClose${JournalArticleID}").prop("disabled",false);
564 Liferay.Util.openToast({
565 message: "Erro ao editar Demanda",
566 type: "danger",
567 title: "",
568 toastProps: {
569 autoClose: 5000
570 }
571 })
572 }
573 });
574
575 };
576
577
578 </#if>
579
580
581 </#if>
582 </script>
583
584
585
586
587 </#list>
588 </#if>
589 </div>
590</div>
591
592<style>
593.bioec_demanda_img {
594 overflow: hidden;
595 background-size: contain;
596 background-position: center;
597 background-repeat: no-repeat;
598}
599
600.bioec_demanda_img_placeholder {
601 width: 140px;
602 height: 140px;
603 background-color: #E8ECEF;
604 display: flex;
605 flex-direction: column;
606 align-items: center;
607 justify-content: center;
608 font-size: 14px;
609 color: #5B5C61;
610}
611
612.bioec_demanda_img_placeholder i {
613 font-size: 44px;
614}
615
616
617.pagination-items-per-page.active > a,
618.pagination-items-per-page.active > button,
619.pagination-items-per-page.show > a,
620.pagination-items-per-page.show > button,
621.page-item.active .page-link,
622.page-item.show .page-link{
623 border-color: #4ECD66;
624 background-color: #4ECD66;
625}
626
627.pagination-results,
628.pagination-items-per-page > a,
629.pagination-items-per-page > button,
630.pagination-items-per-page > a:hover,
631.pagination-items-per-page > button:hover,
632.page-link{
633 color: #4ebe66;
634}
635
636.bioec-profile-demanda-main{
637 display: flex;
638 gap: 40px;
639 flex-direction: column;
640 padding-bottom: 20px;
641}
642.bioec-profile-demanda-main h5{
643 font-weight: 700;
644}
645.bioec-profile-demanda-main h5, .bioec-profile-demanda-main p{
646 color: #5B5C61;
647 margin-bottom: 0px;
648 font-size: 16px;
649
650}
651
652.bioec-profile-demanda-main #demanda-lista-container>div{
653 border: 1px #BEBEBE solid;
654 padding: 24px 24px 0 24px;
655 margin-bottom: 40px;
656 display: grid;
657 grid-row-gap: 24px;
658 grid-template-columns: 24px 12px 1fr 15px;
659 grid-template-areas:
660 "ck . tit arrw"
661 "desc desc desc desc"
662 "clps clps clps clps";
663}
664
665.bioec-profile-demanda-main .lista-checkmark { grid-area: ck; display: flex; }
666.bioec-profile-demanda-main .lista-checkmark i { font-size: 24px; }
667.bioec-profile-demanda-main .lista-pic { grid-area: pic; display: flex; justify-content: center;}
668.bioec-profile-demanda-main .lista-arrow { grid-area: arrw; }
669
670.bioec-profile-demanda-main .lista-titulo {
671 grid-area: tit;
672 display: flex;
673 flex-direction: column;
674 justify-content: center;
675
676}
677
678.bioec-profile-demanda-main .lista-titulo h5{
679 margin-bottom: 0px;
680}
681
682.bioec-profile-demanda-main .lista-desc {
683grid-area: desc;
684}
685
686.bioec-profile-demanda-main .lista-desc p{
687 margin: 0;
688}
689
690.bioec-profile-demanda-main a{
691 color: #5B5C61;
692}
693
694.demanda-port{
695 border: 1px #BEBEBE solid;
696 padding: 24px;
697 display: flex;
698 flex-direction: column;
699 align-items: center;
700 gap: 24px;
701}
702
703.demanda-port p{
704text-align: center;
705
706}
707
708.demanda-port div{
709display: flex;
710 justify-content: space-between;
711 width: min(558px, 100%);
712}
713
714.button-empty {
715border: solid 1px #4ECD66;
716padding: 8px 24px;
717color: #333244;
718 transition: 250ms;
719}
720
721.button-empty:hover{
722 background-color: #4ECD66;
723}
724
725.button-filled {
726background-color: #4ECD66;
727border: solid 1px #4ECD66;
728padding: 8px 24px;
729color: #333244;
730transition: 250ms;
731
732}
733
734.button-filled:hover{
735 background-color: transparent;
736}
737
738.bioec-profile-demanda-main .lista-footnote {
739
740 display: flex;
741 justify-content: space-between;
742 border-top: 1px solid #E8ECEF;
743 padding-top: 12px;
744 font-size: 14px;
745 font-weight: 300;
746 gap: 15px;
747 color: #5B5C61;
748
749}
750.lista-collapse{
751display: flex;
752flex-direction: column;
753gap: 24px;
754grid-area: clps;
755padding-bottom: 24px;
756}
757
758 .lista-details{
759 display: flex;
760 justify-content: flex-start;
761 gap: 24px;
762}
763.lista-pic img {
764 max-height: 138px;
765 max-width: 138px;
766}
767
768.bioec-profile-demanda-main p{
769
770}
771
772.imagemCarregadaDemanda {
773 height: 100px;
774 width: 100px;
775 background-size: contain;
776 background-position: center;
777 background-repeat: no-repeat;
778}
779
780
781.ButtonAddDemanda {
782 background: #4ECD66;
783 border-radius: 8px;
784 padding: 8px 24px;
785 border: none;
786 font-weight: 700;
787 color: #333244;
788 font-family: 'Roboto';
789 float: right;
790 text-transform: uppercase;
791}
792.ButtonAddDemanda:hover{
793 color: #333244;
794 text-decoration: none;
795}
796
797.bioec-profile-demanda-modal label {
798 margin: 0;
799 cursor: default;
800 font-size: 20px;
801 font-weight: 700;
802 color: #5B5C61;
803}
804
805.bioec-profile-demanda-modal div {
806 width: 100%;
807}
808
809#demandaModal-l1, .demandaModal-l1 {
810 padding: 18px 24px;
811 display: flex;
812 justify-content: space-between;
813}
814
815#demandaModal-l1 img, .demandaModal-l1 img {
816 cursor: pointer;
817}
818
819#demandaModal-l1 h5, .demandaModal-l1 h5 {
820 margin: 0;
821 font-size: 20px;
822 font-weight: 700;
823 color: #5B5C61;
824}
825
826#demandaModal-l2, .demandaModal-l2 {
827 border-top: 1px solid #E8ECEF;
828 display: grid;
829 grid-template-columns: 1fr 1fr;
830 grid-template-areas:
831 "titu nome"
832 "fone mail"
833 "desc desc"
834 "imagem ."
835 ;
836 column-gap: 24px;
837 row-gap: 40px;
838 padding: 24px;
839}
840
841#demandaModal-l2>div, .demandaModal-l2>div {
842 display: flex;
843 flex-direction: column;
844 gap: 8px;
845}
846
847#demandaTitle, .demandaTitle {
848 grid-area: titu;
849}
850
851#demandaName, .demandaName {
852 grid-area: nome;
853}
854
855#demandaTelephone, .demandaTelephone {
856 grid-area: fone;
857}
858
859#demandaEmail, .demandaEmail {
860 grid-area: mail;
861}
862
863#demandaBrand, .demandaBrand {
864 grid-area: marca;
865}
866
867#demandaModal-l2>#demandaImg, .demandaModal-l2>.demandaImg {
868 grid-area: imagem;
869 display: flex;
870 flex-direction: column;
871}
872
873#demandaDesc, .demandaDesc {
874 grid-area: desc;
875
876}
877
878#demandaDesc input, .demandaDesc input {
879 height: 80px;
880}
881
882.TextImportant{
883 border-bottom: 1px solid #E8ECEF;
884 padding: 24px;
885 color: #5B5C61;
886}
887
888.bioec-profile-demanda-modal input[type="text"] {
889 border-top: none;
890 border-left: none;
891 border-right: none;
892 border-bottom: 1px solid #BEBEBE;
893 width: 100%;
894 font-size: 16px;
895
896}
897
898
899.bioec-profile-demanda-modal input[type="text"]:focus-visible {
900 outline: none;
901 border-bottom: 1px solid black;
902
903}
904
905.bioec-profile-demanda-modal .ReqLabel:before {
906 content: "* ";
907 color: #D90000;
908
909}
910
911#inputCarregarImagemDemanda, .inputCarregarImagemDemanda {
912 display: none;
913}
914
915#carregarImagem, .carregarImagem {
916 padding: 8px 24px;
917 border: 1px solid #4ECD66;
918 width: fit-content;
919 transition: 250ms;
920
921}
922
923#carregarImagem:hover, .carregarImagem:hover {
924 background-color: #4ECD66;
925}
926
927.button-empty {
928 border: solid 1px #4ECD66;
929 padding: 8px 24px;
930 color: #333244;
931 transition: 250ms;
932 font-weight: bold;
933}
934
935.button-empty:hover {
936 background-color: #4ECD66;
937}
938
939.button-filled {
940 background-color: #4ECD66;
941 border: solid 1px #4ECD66;
942 padding: 8px 24px;
943 color: #333244;
944 transition: 250ms;
945 font-weight: bold;
946}
947
948.button-filled:hover {
949 background-color: transparent;
950}
951
952#demandaModal-l3, .demandaModal-l3 {
953 gap: 24px;
954 display: flex;
955 justify-content: flex-end;
956 padding: 24px;
957}
958
959.modal {
960 padding: initial !important;
961 border-radius: 4px !important;
962
963}
964
965.modal a.close-modal {
966 display: none;
967}
968
969#removerImagemDemanda, .removerImagemDemanda {
970 background: none;
971 border: none;
972 outline: none;
973 color: #5B5C61;
974 font-size: 16px;
975 font-weight: 900;
976 line-height: 24px;
977 letter-spacing: 0em;
978 width: fit-content;
979 margin-left: 16px;
980}
981
982
983@media(max-width: 964px){
984 .lista-pic img {
985 width: 100%;
986 max-height: unset;
987 max-width: unset;
988
989 }
990}
991
992@media (max-width: 550px) {
993 #demandaModal-l2, .demandaModal-l2 {
994 display: flex;
995 flex-direction: column;
996 }
997
998 #demandaModal-l3, .demandaModal-l3 {
999 display: flex;
1000 flex-direction: column;
1001 }
1002}
1003
1004@media(max-width: 450px){
1005 .bioec-profile-demanda-main .lista-details{
1006 flex-direction: column;
1007 }
1008
1009 .lista-contato{
1010 text-align: center;
1011 }
1012
1013 .bioec-profile-demanda-main .lista-footnote{
1014 flex-direction: column;
1015 gap: 10px;
1016 align-items: flex-end;
1017 text-align: right;
1018 }
1019}
1020
1021@media(max-width: 992px){
1022 #demanda-lista-container {
1023 padding-inline: 15px;
1024 }
1025}
1026
1027.bioec-profile-demanda-main .lista-footnote .buttonsActions {
1028 display: flex;
1029 gap: 17px;
1030}
1031
1032@media (max-width: 768px) {
1033 .bioec-profile-demanda-main .lista-desc {
1034 gap: 24px;
1035 flex-direction: column-reverse;
1036 }
1037 .bioec-profile-demanda-main .lista-footnote {
1038 flex-direction: column;
1039 align-items: center;
1040 }
1041 .bioec-profile-demanda-main .lista-footnote > div {
1042 text-align: center;
1043 }
1044
1045 .bioec-profile-demanda-main .lista-footnote .barra-pipe {
1046 display: none;
1047 }
1048 .bioec-profile-demanda-main .lista-footnote .lista-author {
1049 display: flex;
1050 gap: 4px;
1051 justify-content: center;
1052 }
1053 .bioec-profile-demanda-main .lista-footnote .buttonsActions {
1054 width: 100%;
1055 justify-content: space-between;
1056 }
1057}
1058
1059
1060</style>
1061
1062
1063<script>
1064
1065
1066
1067</script>
Análises antivirais em têxteis
Analisar a atividade antiviral em materiais têxteis utilizando as cepas dos vírus do Sarampo em laboratório NB2 e da COVID-19 em laboratório NB3, através da norma ISO 18184, em parceria com a FIOCRUZ.
Contato
(21)99308-4506
rbergamini@cetiqt.senai.br
Identificação de produtos químicos têxteis
Identificar, através de técnicas analíticas (cromatografia, FTIR, XRF, etc.), os componentes químicos presentes nos produtos utilizados pela indústria têxtil, como: amaciantes, detergentes, espessantes, dentre outros.
Contato
(21)99308-4506
rbergamini@cetiqt.senai.br
Produção de Fibras Sintéticas
Produzir novas fibras sintéticas (polipropileno, poliéster, poliamida, etc.), aditivadas ou não, por fiação por fusão através do uso da extrusora localizada na Planta Piloto de Fibras Químicas do Instituto de Inovação. Podem ser produzidas multi ou monofilamentos contínuos com morfologias monocomponentes ou bicomponetes (núcleo/casca, lado a lado, ilhas no oceano e fatias segmentadas).
Contato
(07)03093-2219
rbergamini@cetiqt.senai.br
Otimização de produtos - Tecidos Planos
Produção de protótipos de tecido plano. Utilizar os teares planos da planta piloto de tecelagem do Instituto SENAI de Inovação para produzir protótipos em escala piloto com 50 cm de largura.
Contato
(07)03093-2219
rbergamini@cetiqt.senai.br