CENTRO NACIONAL DE PESQUISA EM ENERGIA E MATERIAIS - CNPEM
Organização
CENTRO NACIONAL DE PESQUISA EM ENERGIA E MATERIAIS - CNPEM
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?? && _CUSTOM_FIELD_organization.getData()?? && _CUSTOM_FIELD_organization.getData() !="" >
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") && _CUSTOM_FIELD_organization.getData()?? && _CUSTOM_FIELD_organization.getData() !="" >
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: ==> autorArticleId [in template "34764#34807#41127" at line 87, column 38] ---- 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#41127" at line 87, column 33] ----
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 autorId = ""
22 >
23
24 <#assign nomeParaContato = "">
25
26 <#if articleXml.selectSingleNode("dynamic-element[@field-reference='Text77253735']")??>
27
28 <#assign nomeParaContato = articleXml.selectSingleNode("dynamic-element[@field-reference='Text77253735']").getStringValue()!""
29 nomeParaContato = nomeParaContato?replace("\n\t\t", "")
30 nomeParaContato = nomeParaContato?replace("\n\t", "")
31 >
32
33 </#if>
34 <#if articleXml.selectSingleNode("dynamic-element[@field-reference='Text94974146']")??>
35 <#assign telefone = articleXml.selectSingleNode("dynamic-element[@field-reference='Text94974146']").getStringValue()!""
36 telefone = telefone?replace("\n\t\t", "")
37 telefone = telefone?replace("\n\t", "")
38 >
39 </#if>
40
41 <#if articleXml.selectSingleNode("dynamic-element[@field-reference='Text68569631']")??>
42 <#assign email = articleXml.selectSingleNode("dynamic-element[@field-reference='Text68569631']").getStringValue()!""
43 email = email?replace("\n\t\t", "")
44 email = email?replace("\n\t", "")
45 >
46 </#if>
47
48 <#if articleXml.selectSingleNode("dynamic-element[@field-reference='CopyOfCopyOfText18267936']")??>
49 <#assign desc = articleXml.selectSingleNode("dynamic-element[@field-reference='CopyOfCopyOfText18267936']").getStringValue()!""
50 desc = desc?replace("\n\t\t", "")
51 desc = desc?replace("\n\t", "")
52 >
53 </#if>
54 <#if articleXml.selectSingleNode("dynamic-element[@field-reference='Text97565506']")??>
55 <#assign imagem = articleXml.selectSingleNode("dynamic-element[@field-reference='Text97565506']").getStringValue()!""
56 imagem = imagem?replace("(\r\n)+", "",'r')
57 imagem = imagem?replace(" ", "",'r')
58 >
59 </#if>
60 <#if articleXml.selectSingleNode("dynamic-element[@field-reference='Text99746569']")??>
61 <#assign
62 autorId = articleXml.selectSingleNode("dynamic-element[@field-reference='Text99746569']").getStringValue()!""
63 autorId = autorId?replace("\n\t\t", "")
64 autorId = autorId?replace("\n\t", "")
65 autorArticleId = ""
66 >
67 </#if>
68 <#assign
69 commentsCount = mbMessageLocalService.getDiscussionMessagesCount(entry.getClassName(), entry.getClassPK(), 0)!"0"
70 >
71
72 <#if autorId != "" && autorId??>
73 <#assign
74 autor = UserLocalService.fetchUser(autorId?number)!""
75 autorArticleId = autor.getExpandoBridge().getAttribute("journal-article")!"0"
76 />
77 <#if autor != "">
78 <#assign autor = autor.getFullName()!"">
79 <#else>
80 <#assign autor = "Anônimo" >
81 </#if>
82 <#else>
83 <#assign autor = "Anônimo" >
84 </#if>
85 <#assign categorias = AssetCategoryLocalService.getCategoryNames(entry.getClassName(), entry.getClassPK())!"" >
86 <#assign urlWC = "">
87 <#if autorArticleId != "0" && autorArticleId != "" && autor != "Anônimo">
88 <#assign autorArticle = JournalArticleLocalService.getLatestArticle(themeDisplay.getLayout().getGroupId(), autorArticleId?string) >
89 <#assign urlWC = autorArticle.getUrlTitle()!"">
90 </#if>
91
92 <#assign tags = tagsLocalService.getTagNames("com.liferay.journal.model.JournalArticle", journalArticle.getResourcePrimKey()?number )
93 tagName = tags[0]!""
94 orgOrUser = ""
95 >
96
97 <#if tagName?contains("organization") && tagName != "" >
98 <#assign orgOrUser = "org">
99 <#else>
100 <#assign orgOrUser = "user">
101 </#if>
102
103 <#if orgOrUser == "org" >
104
105 <#assign
106 orgId = tagName?keep_after("organization-")
107 organization = OrganizationLocalService.fetchOrganization(orgId?number)!""
108 >
109
110
111 <#if organization != "" && autor != "Anônimo">
112
113 <#assign orgArticleId = organization.getExpandoBridge().getAttribute("journal-article")
114 orgJournalArticle = JournalArticleLocalService.getArticle(themeDisplay.getLayout().getGroupId(),orgArticleId?c)
115 urlWC = orgJournalArticle.getUrlTitle()!""
116 autor = organization.getName()!""
117 >
118
119 </#if>
120 </#if>
121
122 <#if themeDisplay.isSignedIn() >
123 <#if tagName?contains("organization-")>
124 <#assign userIsAdmin = OrganizationLocalService.hasUserOrganization(themeDisplay.getUserId(), orgId?number)>
125 <#else>
126 <#if autorId?number == themeDisplay.getUserId()>
127 <script>console.log("oi");</script>
128 <#assign userIsAdmin = true>
129 </#if>
130 </#if>
131
132
133 </#if>
134
135
136
137 <div class="demanda-lista-item">
138
139 <div class="lista-checkmark">
140 <#if categorias?seq_contains("aprovado") > <i title="Aprovado" style="color: #4ECD66" class="fa-solid fa-circle-check"></i> </#if>
141 <#if categorias?seq_contains("pendente") > <i title="Em análise" style="color: #D90000"class="fa-solid fa-spinner"></i> </#if>
142 <#if categorias?seq_contains("recusado") > <i title="Recusado" style="color: #D90000"class="fa-solid fa-exclamation-circle"></i> </#if>
143 </div>
144
145
146 <div class="lista-titulo">
147 <h5>${entry.getHighlightedTitle()}</h5>
148 </div>
149
150 <div class="lista-arrow">
151 <button style="padding: 0;" class="btn" type="button" data-toggle="collapse" data-target="#collapseID${entry.getClassPK()}" aria-expanded="false" aria-controls="collapseID${entry.getClassPK()}">
152 <i class="fa-solid fa-chevron-down"></i>
153 </button>
154 </div>
155
156 <div class="lista-desc">
157 <p>${desc}</p>
158 </div>
159
160 <div class="lista-collapse collapse" id="collapseID${entry.getClassPK()}">
161 <#if nomeParaContato != "" || telefone != "" || email != "" || imagem?trim !="">
162 <div class="lista-details">
163 <div class="lista-pic">
164 <i class="fa-solid fa-image-slash"></i>
165 <#if imagem?trim !="" >
166 <img class="bioec_demanda_img" src="${imagem}">
167 <#else>
168 <div class="bioec_demanda_img_placeholder">
169 <i class="fa-solid fa-image"></i>
170 sem imagem
171 </div>
172 </#if>
173 </div>
174 <#if nomeParaContato != "" || telefone != "" || email != "" >
175 <div class="lista-contato">
176 <p>Contato</p>
177 <p class="lista-author">${nomeParaContato}</p>
178 <p class="lista-phone">${telefone}</p>
179 <p class="lista-email">${email}</p>
180 </div>
181 </#if>
182 </div>
183 </#if>
184
185 <#if categorias?seq_contains("recusado") >
186 <div style="border-top: 1px solid #E8ECEF; font-weight: bold; padding-top: 24px;">
187 <p>Conteúdo Em Análise Pelo Cetiqt:</p>
188 <p>Conteúdo recusado pelo CETIQT por violar as políticas de privacidade.</p>
189 </div>
190 </#if>
191 <div class="lista-footnote">
192 <div>
193 <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>
194 </div>
195 <#if userIsAdmin>
196 <div class="buttonsActions">
197 <div style="cursor: pointer;font-size: 16px;" data-toggle="modal" data-target="#modalDemanda${JournalArticleID}">
198 <i class="fa-solid fa-edit"></i>
199 </div>
200 <div style="cursor: pointer;font-size: 16px;" data-toggle="modal" data-target="#modal-demanda-${entry.getClassPK()}">
201 <i class="fa-solid fa-trash-can"></i>
202 </div>
203
204 </div>
205 </#if>
206 </div>
207 </div>
208 </div>
209
210 <#if userIsAdmin>
211 <div style="display: none;" id="modal-demanda-${entry.getClassPK()}" class="modal fade" role="dialog">
212 <div class="modal-dialog modal-lg" role="document">
213 <div class="modal-content">
214 <div class="modal-header" >
215 <h4 class="m-0">Remover Demanda</h4>
216 <button type="button" class="close" data-dismiss="modal" aria-label="Close">
217 <span aria-hidden="true">
218 <i class="fa-solid fa-close"></i>
219 </span>
220 </button>
221 </div>
222 <div class="modal-body">
223 <h5>Você tem certeza que deseja remover essa demanda?</h5>
224 <div>
225 Ao clicar em continuar, a demanda será removida do seu perfil.
226 </div>
227 </div>
228 <div class="modal-footer justify-content-end">
229 <button class="bioec_secondary_button" data-dismiss="modal">CANCELAR</button>
230 <button class="bioec_primary_button" type="button" onclick="excluirDemanda(${JournalArticleFrontId}, ${orgId})">CONTINUAR</button>
231 </div>
232 </div>
233 </div>
234 </div>
235
236 <#-- modal edição -->
237
238
239 <div style="display: none;" id="modalDemanda${JournalArticleID}" class="modal fade bioec-profile-demanda-modal modalDemanda" role="dialog">
240 <div class="modal-dialog modal-lg" role="document">
241 <form id="formularioDemanda${JournalArticleID}" class="form-group modal-content formularioDemanda">
242 <div id="demandaModal-l1${JournalArticleID}" class="modal-header demandaModal-l1">
243 <h5>Adicionar demanda</h5>
244 <button type="button" class="close" data-dismiss="modal" aria-label="Close">
245 <span aria-hidden="true">×</span>
246 </button>
247 </div>
248 <div id="demandaModal-l2${JournalArticleID}" class="modal-body demandaModal-l2">
249 <div id="demandaTitle${JournalArticleID}" class="demandaTitle">
250 <label class="ReqLabel" for="demandaInputTitle${JournalArticleID}">Título da demanda</label>
251 <input id="demandaInputTitle${JournalArticleID}" value="${entry.getHighlightedTitle()}" type="text" placeholder="Inserir um título" required>
252 </div>
253 <div id="demandaName${JournalArticleID}" class="demandaName">
254 <label class="" for="demandaInputName${JournalArticleID}">Nome para contato</label>
255 <input value="${nomeParaContato}" id="demandaInputName${JournalArticleID}" placeholder="Inserir nome" type="text">
256 </div>
257 <div id="demandaTelephone${JournalArticleID}" class="demandaTelephone">
258 <label class="" for="demandaInputPhone${JournalArticleID}">Telefone para contato</label>
259 <input value="${telefone}" id="demandaInputPhone${JournalArticleID}" name="demandaInputPhone" type="text" placeholder ='(__)_____-_____' minlength="14" />
260 </div>
261 <div id="demandaEmail${JournalArticleID}" class="demandaEmail">
262 <label class="" for="demandaInputEmail${JournalArticleID}">E-mail para contato</label>
263 <input value="${email}" id="demandaInputEmail${JournalArticleID}" placeholder="Inserir e-mail" type="text">
264 </div>
265 <div id="demandaDesc${JournalArticleID}" class="demandaDesc">
266 <label class="ReqLabel" for="demandaInputDesc${JournalArticleID}">Descrição</label>
267 <textarea id="demandaInputDesc${JournalArticleID}" style="max-width: 100%;font-size: 16px;height: 80px;border: 1px solid #BEBEBE;" required>${desc}</textarea>
268 </div>
269 <div id="demandaImg${JournalArticleID}" class="demandaImg">
270 <div style="display: flex; flex-direction: column; gap: 8px">
271 <label>Imagem da demanda (Máx. 10 MB)</label>
272 <label class="btn carregarImagem" id="carregarImagem${JournalArticleID}" for="inputCarregarImagemDemanda${JournalArticleID}" style="font-size: 16px; cursor: pointer;">CARREGAR IMAGEM</label>
273 <input class="inputCarregarImagemDemanda" id="inputCarregarImagemDemanda${JournalArticleID}" type="file" accept="image/*" onchange="encodeDemandaImageAsURL${JournalArticleID}(this)">
274 <input class="d-none" id="inputDemandaBase64${JournalArticleID}" value="${imagem}" />
275 <div class="imagemCarregadaDemanda imagemCarregadaDemanda${JournalArticleID} d-md-none d-block" style="background-image: url(${imagem})"></div>
276 <button type="button" id="removerImagemDemanda${JournalArticleID}" class="<#if imagem == "" || imagem?? == false> d-none </#if> removerImagemDemanda" >
277 <i class="fa fa-trash"></i> Remover imagem
278 </button>
279 </div>
280 <div class="imagemCarregadaDemanda imagemCarregadaDemanda${JournalArticleID} d-md-block d-none" style="background-image: url(${imagem})"></div>
281 </div>
282 </div>
283 <div class="TextImportant">
284 <p>
285 Importante: O conteúdo enviado passará por um processo interno de aprovação. Só então o conteúdo adicionado aparecerá no portal.
286 </p>
287 </div>
288
289 <div id="demandaModal-l3${JournalArticleID}" class="modal-footer demandaModal-l3">
290 <button class="btn button-empty" onclick="" id="demandas-saveAndClose${JournalArticleID}">SALVAR E FECHAR</button>
291 </div>
292 </form>
293 </div>
294 </div>
295
296 </#if>
297 <#--
298
299
300
301
302 <div style="display: none;" id="modalInfra${JournalArticleID}" class="modal fade bioec-profile-infra-modal" role="dialog">
303 <div class="modal-dialog modal-lg" role="document">
304
305 <form class="form-group modal-content" id="formularioInfraestrutura${JournalArticleID}">
306 <div id="infraModal-l1-${JournalArticleID}" class="modal-header infraModal-l1" >
307 <h5>Adicionar Infraestrutura</h5>
308 <button id="fecharModal${JournalArticleID}" type="button" class="close" data-dismiss="modal" aria-label="Close">
309 <span aria-hidden="true">×</span>
310 </button>
311 </div>
312 <div id="infraModal-l2-${JournalArticleID}" class="modal-body infraModal-l2">
313 <div id="infraName${JournalArticleID}" class="infraName">
314 <label class="ReqLabel" for="inputInfraName${JournalArticleID}">Nome da infraestrutura</label>
315 <input type="text" id="inputInfraName${JournalArticleID}" value="${entry.getHighlightedTitle()}" placeholder="Nome da infraestrutura" required>
316 </div>
317 <div id="infraModel${JournalArticleID}" class="infraModel">
318 <label class="ReqLabel" for="inputInfraModel${JournalArticleID}">Modelo</label>
319 <input type="text" id="inputInfraModel${JournalArticleID}" value="${modelo}" placeholder="Modelo" required>
320 </div>
321 <div id="infraBrand${JournalArticleID}" class="infraBrand">
322 <label class="ReqLabel" for="inputInfraBrand${JournalArticleID}">Marca</label>
323 <input type="text" id="inputInfraBrand${JournalArticleID}" value="${marca}" placeholder="Marca" required>
324 </div>
325
326 <div id="infraImg${JournalArticleID}" class="infraImg">
327 <div style="display: flex; flex-direction: column; gap: 8px">
328 <label>Imagem da infraestrutura (Máx. 10 MB)</label>
329 <label class="bioec_secondary_button" id="carregarImagem${JournalArticleID}" for="inputCarregarImagemInfra${JournalArticleID}" style="font-size: 16px;color: #333244;align-self:start;">
330 CARREGAR IMAGEM
331 </label>
332 <input id="inputCarregarImagemInfra${JournalArticleID}" class="inputCarregarImagemInfra" type="file" accept="image/*" onchange="encodeInfraImageAsURL${JournalArticleID}(this)">
333 <input class="d-none" id="inputInfraBase64${JournalArticleID}" />
334 <div class="imagemCarregadaInfra${JournalArticleID} d-md-none d-block"></div>
335 <button type="button" id="removerImagemInfra${JournalArticleID}" class="d-none removerImagemInfra" >
336 <i class="fa fa-trash"></i> Remover imagem
337 </button>
338 </div>
339 <div class="imagemCarregadaInfra${JournalArticleID} d-md-block d-none"></div>
340 </div>
341
342 <div id="infraFunction${JournalArticleID}" class="infraFunction">
343 <label class="ReqLabel" for="inputInfraFunction${JournalArticleID}">Função</label>
344 <input type="text" id="inputInfraFunction${JournalArticleID}" class="inputInfraFunction" value="${funcao}" placeholder="Função" required>
345 </div>
346 </div>
347 <div class="TextImportant">
348 <p>
349 Importante: O conteúdo enviado passará por um processo interno de aprovação. Só então o conteúdo adicionado aparecerá no portal.
350 </p>
351 </div>
352 <div id="infraModal-l3-${JournalArticleID}" class="modal-footer infraModal-l3">
353 <button class="bioec_secondary_button" id="demandas-saveAndClose${JournalArticleID}" onclick="">SALVAR E FECHAR</button>
354 </div>
355 </form>
356
357 </div>
358
359
360 -->
361
362
363
364 <script>
365 <#if userIsAdmin>
366 function excluirDemanda(wcId, orgId) {
367 Liferay.Util.openToast({message: "Enviando requisição",type: "info",title: ""});
368 fetch(Liferay.ThemeDisplay.getPortalURL() + "/o/demanda/" + wcId, {
369 method: 'DELETE',
370 "headers": {
371 "x-csrf-token": Liferay.authToken,
372 "Content-Type": "application/json"
373 }
374 })
375 .then(res => {
376 if(res.status == 200) {
377 Liferay.Util.openToast({
378 message: "Infraestrutura excluida com sucesso",
379 type: "success",
380 title: "",
381 toastProps: {
382 autoClose: 5000
383 }
384 })
385 setTimeout(function(){ location.reload(); }, 2000)
386 } else {
387 Liferay.Util.openToast({
388 message: "Erro ao excluir infraestrutura",
389 type: "danger",
390 title: "",
391 toastProps: {
392 autoClose: 5000
393 }
394 })
395 }
396 });
397 }
398
399
400
401
402 function validImageSize(base64="") {
403 const decoded = atob(base64.substring(base64.indexOf(',') + 1));
404 const sizeMB = decoded.length / 1e+6;
405 console.log("MB: " + decoded.length / 1e+6);
406 if(sizeMB > 10) {
407 Liferay.Util.openToast({
408 message: "O tamanho da imagem não deve ultrapassar 10 MB.",
409 type: "danger",
410 title: "",
411 toastProps: {
412 autoClose: 5000
413 }
414 })
415 return false
416 }
417 return true
418 }
419
420 function encodeDemandaImageAsURL${JournalArticleID}(element) {
421 let file = element.files[0];
422 let reader = new FileReader();
423 reader.onloadend = () => {
424 if(reader.result) {
425 if(!validImageSize(reader.result)) return;
426 try {
427 const base64_input = document.getElementById("inputDemandaBase64${JournalArticleID}")
428 base64_input.value = reader.result
429 Array.from(document.getElementsByClassName("imagemCarregadaDemanda${JournalArticleID}")).forEach( el => el.style.backgroundImage = 'url(' + reader.result + ')' )
430
431 const removeImageButton = document.getElementById("removerImagemDemanda${JournalArticleID}")
432 removeImageButton.classList.remove("d-none")
433 } catch (error) {
434 console.error(error)
435 }
436 }
437 }
438 reader.readAsDataURL(file);
439 }
440
441 function removeImageDemanda${JournalArticleID}() {
442 try {
443 const file_input = document.getElementById("inputCarregarImagemDemanda${JournalArticleID}")
444 Array.from(document.getElementsByClassName("imagemCarregadaDemanda${JournalArticleID}")).forEach( el => el.style.backgroundImage = "" )
445 const base64_input = document.getElementById("inputDemandaBase64${JournalArticleID}")
446 file_input.value = null
447 base64_input.value = ""
448
449 const removeImageButton = document.getElementById("removerImagemDemanda${JournalArticleID}")
450 removeImageButton.classList.add("d-none")
451 } catch (error) {
452 console.error(error)
453 }
454}
455
456
457document.getElementById("removerImagemDemanda${JournalArticleID}").addEventListener("click", removeImageDemanda${JournalArticleID});
458
459<#-- Rest da edição de organização -->
460
461<#if orgOrUser == "org">
462document.querySelector('#formularioDemanda${JournalArticleID}').addEventListener('submit', event => {
463 event.preventDefault();
464 adicionarDemanda${JournalArticleID}();
465});
466
467function adicionarDemanda${JournalArticleID}() {
468 Liferay.Util.openToast({message: "Enviando requisição",type: "info",title: ""});
469 $("#demandas-saveAndClose${JournalArticleID}").prop("disabled",true);
470
471
472
473 const demandaData = {
474 titulo: document.getElementById("demandaInputTitle${JournalArticleID}").value,
475 nomeContato: document.getElementById("demandaInputName${JournalArticleID}").value,
476 telefoneContato: document.getElementById("demandaInputPhone${JournalArticleID}").value,
477 emailContato: document.getElementById("demandaInputEmail${JournalArticleID}").value,
478 descricao: document.getElementById("demandaInputDesc${JournalArticleID}").value,
479 imagem: document.getElementById("inputDemandaBase64${JournalArticleID}").value,
480 }
481
482 console.log(demandaData);
483
484 fetch(Liferay.ThemeDisplay.getPortalURL() + "/o/demanda/${JournalArticleFrontId}", {
485 method: 'PUT',
486 "headers": {
487 "x-csrf-token": Liferay.authToken,
488 "Content-Type": "application/json"
489 },
490 body: JSON.stringify(demandaData)
491 })
492 .then(res => {
493 if(res.status == 200) {
494 Liferay.Util.openToast({
495 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.",
496 type: "success",
497 title: "",
498 toastProps: {
499 autoClose: 5000
500 }
501 })
502 setTimeout(function(){ location.reload(); }, 2000);
503 } else {
504 $("#demandas-saveAndClose${JournalArticleID}").prop("disabled",false);
505 Liferay.Util.openToast({
506 message: "Erro ao editada demanda",
507 type: "danger",
508 title: "",
509 toastProps: {
510 autoClose: 5000
511 }
512 })
513 }
514 })
515
516 }
517</#if>
518
519<#-- Rest da edição de pessoa fisica -->
520
521
522 <#if orgOrUser == "user">
523
524 document.querySelector('#formularioDemanda${JournalArticleID}').addEventListener('submit', event => {
525 event.preventDefault();
526 adicionarDemanda${JournalArticleID}();
527 });
528
529 function adicionarDemanda${JournalArticleID}() {
530 Liferay.Util.openToast({message: "Enviando requisição",type: "info",title: ""});
531 $("#demandas-saveAndClose${JournalArticleID}").prop("disabled",true);
532
533 const demandaData = {
534 titulo: document.getElementById("demandaInputTitle${JournalArticleID}").value,
535 nomeContato: document.getElementById("demandaInputName${JournalArticleID}").value,
536 telefoneContato: document.getElementById("demandaInputPhone${JournalArticleID}").value,
537 emailContato: document.getElementById("demandaInputEmail${JournalArticleID}").value,
538 descricao: document.getElementById("demandaInputDesc${JournalArticleID}").value,
539 imagem: document.getElementById("inputDemandaBase64${JournalArticleID}").value,
540 }
541
542 console.log(demandaData);
543
544 fetch(Liferay.ThemeDisplay.getPortalURL() + "/o/demanda/${JournalArticleFrontId}", {
545 method: 'PUT',
546 "headers": {
547 "x-csrf-token": Liferay.authToken,
548 "Content-Type": "application/json"
549 },
550 body: JSON.stringify(demandaData)
551 })
552 .then( res => {
553 if(res.status == 200) {
554 Liferay.Util.openToast({
555 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.",
556 type: "success",
557 title: "",
558 toastProps: {
559 autoClose: 5000
560 }
561 })
562 setTimeout(function(){ location.reload(); }, 2000);
563 } else {
564 $("#demandas-saveAndClose${JournalArticleID}").prop("disabled",false);
565 Liferay.Util.openToast({
566 message: "Erro ao editar Demanda",
567 type: "danger",
568 title: "",
569 toastProps: {
570 autoClose: 5000
571 }
572 })
573 }
574 });
575
576 };
577
578
579 </#if>
580
581
582 </#if>
583 </script>
584
585
586
587
588 </#list>
589 </#if>
590 </div>
591</div>
592
593<style>
594.bioec_demanda_img {
595 overflow: hidden;
596 background-size: contain;
597 background-position: center;
598 background-repeat: no-repeat;
599}
600
601.bioec_demanda_img_placeholder {
602 width: 140px;
603 height: 140px;
604 background-color: #E8ECEF;
605 display: flex;
606 flex-direction: column;
607 align-items: center;
608 justify-content: center;
609 font-size: 14px;
610 color: #5B5C61;
611}
612
613.bioec_demanda_img_placeholder i {
614 font-size: 44px;
615}
616
617
618.pagination-items-per-page.active > a,
619.pagination-items-per-page.active > button,
620.pagination-items-per-page.show > a,
621.pagination-items-per-page.show > button,
622.page-item.active .page-link,
623.page-item.show .page-link{
624 border-color: #4ECD66;
625 background-color: #4ECD66;
626}
627
628.pagination-results,
629.pagination-items-per-page > a,
630.pagination-items-per-page > button,
631.pagination-items-per-page > a:hover,
632.pagination-items-per-page > button:hover,
633.page-link{
634 color: #4ebe66;
635}
636
637.bioec-profile-demanda-main{
638 display: flex;
639 gap: 40px;
640 flex-direction: column;
641 padding-bottom: 20px;
642}
643.bioec-profile-demanda-main h5{
644 font-weight: 700;
645}
646.bioec-profile-demanda-main h5, .bioec-profile-demanda-main p{
647 color: #5B5C61;
648 margin-bottom: 0px;
649 font-size: 16px;
650
651}
652
653.bioec-profile-demanda-main #demanda-lista-container>div{
654 border: 1px #BEBEBE solid;
655 padding: 24px 24px 0 24px;
656 margin-bottom: 40px;
657 display: grid;
658 grid-row-gap: 24px;
659 grid-template-columns: 24px 12px 1fr 15px;
660 grid-template-areas:
661 "ck . tit arrw"
662 "desc desc desc desc"
663 "clps clps clps clps";
664}
665
666.bioec-profile-demanda-main .lista-checkmark { grid-area: ck; display: flex; }
667.bioec-profile-demanda-main .lista-checkmark i { font-size: 24px; }
668.bioec-profile-demanda-main .lista-pic { grid-area: pic; display: flex; justify-content: center;}
669.bioec-profile-demanda-main .lista-arrow { grid-area: arrw; }
670
671.bioec-profile-demanda-main .lista-titulo {
672 grid-area: tit;
673 display: flex;
674 flex-direction: column;
675 justify-content: center;
676
677}
678
679.bioec-profile-demanda-main .lista-titulo h5{
680 margin-bottom: 0px;
681}
682
683.bioec-profile-demanda-main .lista-desc {
684grid-area: desc;
685}
686
687.bioec-profile-demanda-main .lista-desc p{
688 margin: 0;
689}
690
691.bioec-profile-demanda-main a{
692 color: #5B5C61;
693}
694
695.demanda-port{
696 border: 1px #BEBEBE solid;
697 padding: 24px;
698 display: flex;
699 flex-direction: column;
700 align-items: center;
701 gap: 24px;
702}
703
704.demanda-port p{
705text-align: center;
706
707}
708
709.demanda-port div{
710display: flex;
711 justify-content: space-between;
712 width: min(558px, 100%);
713}
714
715.button-empty {
716border: solid 1px #4ECD66;
717padding: 8px 24px;
718color: #333244;
719 transition: 250ms;
720}
721
722.button-empty:hover{
723 background-color: #4ECD66;
724}
725
726.button-filled {
727background-color: #4ECD66;
728border: solid 1px #4ECD66;
729padding: 8px 24px;
730color: #333244;
731transition: 250ms;
732
733}
734
735.button-filled:hover{
736 background-color: transparent;
737}
738
739.bioec-profile-demanda-main .lista-footnote {
740
741 display: flex;
742 justify-content: space-between;
743 border-top: 1px solid #E8ECEF;
744 padding-top: 12px;
745 font-size: 14px;
746 font-weight: 300;
747 gap: 15px;
748 color: #5B5C61;
749
750}
751.lista-collapse{
752display: flex;
753flex-direction: column;
754gap: 24px;
755grid-area: clps;
756padding-bottom: 24px;
757}
758
759 .lista-details{
760 display: flex;
761 justify-content: flex-start;
762 gap: 24px;
763}
764.lista-pic img {
765 max-height: 138px;
766 max-width: 138px;
767}
768
769.bioec-profile-demanda-main p{
770
771}
772
773.imagemCarregadaDemanda {
774 height: 100px;
775 width: 100px;
776 background-size: contain;
777 background-position: center;
778 background-repeat: no-repeat;
779}
780
781
782.ButtonAddDemanda {
783 background: #4ECD66;
784 border-radius: 8px;
785 padding: 8px 24px;
786 border: none;
787 font-weight: 700;
788 color: #333244;
789 font-family: 'Roboto';
790 float: right;
791 text-transform: uppercase;
792}
793.ButtonAddDemanda:hover{
794 color: #333244;
795 text-decoration: none;
796}
797
798.bioec-profile-demanda-modal label {
799 margin: 0;
800 cursor: default;
801 font-size: 20px;
802 font-weight: 700;
803 color: #5B5C61;
804}
805
806.bioec-profile-demanda-modal div {
807 width: 100%;
808}
809
810#demandaModal-l1, .demandaModal-l1 {
811 padding: 18px 24px;
812 display: flex;
813 justify-content: space-between;
814}
815
816#demandaModal-l1 img, .demandaModal-l1 img {
817 cursor: pointer;
818}
819
820#demandaModal-l1 h5, .demandaModal-l1 h5 {
821 margin: 0;
822 font-size: 20px;
823 font-weight: 700;
824 color: #5B5C61;
825}
826
827#demandaModal-l2, .demandaModal-l2 {
828 border-top: 1px solid #E8ECEF;
829 display: grid;
830 grid-template-columns: 1fr 1fr;
831 grid-template-areas:
832 "titu nome"
833 "fone mail"
834 "desc desc"
835 "imagem ."
836 ;
837 column-gap: 24px;
838 row-gap: 40px;
839 padding: 24px;
840}
841
842#demandaModal-l2>div, .demandaModal-l2>div {
843 display: flex;
844 flex-direction: column;
845 gap: 8px;
846}
847
848#demandaTitle, .demandaTitle {
849 grid-area: titu;
850}
851
852#demandaName, .demandaName {
853 grid-area: nome;
854}
855
856#demandaTelephone, .demandaTelephone {
857 grid-area: fone;
858}
859
860#demandaEmail, .demandaEmail {
861 grid-area: mail;
862}
863
864#demandaBrand, .demandaBrand {
865 grid-area: marca;
866}
867
868#demandaModal-l2>#demandaImg, .demandaModal-l2>.demandaImg {
869 grid-area: imagem;
870 display: flex;
871 flex-direction: column;
872}
873
874#demandaDesc, .demandaDesc {
875 grid-area: desc;
876
877}
878
879#demandaDesc input, .demandaDesc input {
880 height: 80px;
881}
882
883.TextImportant{
884 border-bottom: 1px solid #E8ECEF;
885 padding: 24px;
886 color: #5B5C61;
887}
888
889.bioec-profile-demanda-modal input[type="text"] {
890 border-top: none;
891 border-left: none;
892 border-right: none;
893 border-bottom: 1px solid #BEBEBE;
894 width: 100%;
895 font-size: 16px;
896
897}
898
899
900.bioec-profile-demanda-modal input[type="text"]:focus-visible {
901 outline: none;
902 border-bottom: 1px solid black;
903
904}
905
906.bioec-profile-demanda-modal .ReqLabel:before {
907 content: "* ";
908 color: #D90000;
909
910}
911
912#inputCarregarImagemDemanda, .inputCarregarImagemDemanda {
913 display: none;
914}
915
916#carregarImagem, .carregarImagem {
917 padding: 8px 24px;
918 border: 1px solid #4ECD66;
919 width: fit-content;
920 transition: 250ms;
921
922}
923
924#carregarImagem:hover, .carregarImagem:hover {
925 background-color: #4ECD66;
926}
927
928.button-empty {
929 border: solid 1px #4ECD66;
930 padding: 8px 24px;
931 color: #333244;
932 transition: 250ms;
933 font-weight: bold;
934}
935
936.button-empty:hover {
937 background-color: #4ECD66;
938}
939
940.button-filled {
941 background-color: #4ECD66;
942 border: solid 1px #4ECD66;
943 padding: 8px 24px;
944 color: #333244;
945 transition: 250ms;
946 font-weight: bold;
947}
948
949.button-filled:hover {
950 background-color: transparent;
951}
952
953#demandaModal-l3, .demandaModal-l3 {
954 gap: 24px;
955 display: flex;
956 justify-content: flex-end;
957 padding: 24px;
958}
959
960.modal {
961 padding: initial !important;
962 border-radius: 4px !important;
963
964}
965
966.modal a.close-modal {
967 display: none;
968}
969
970#removerImagemDemanda, .removerImagemDemanda {
971 background: none;
972 border: none;
973 outline: none;
974 color: #5B5C61;
975 font-size: 16px;
976 font-weight: 900;
977 line-height: 24px;
978 letter-spacing: 0em;
979 width: fit-content;
980 margin-left: 16px;
981}
982
983
984@media(max-width: 964px){
985 .lista-pic img {
986 width: 100%;
987 max-height: unset;
988 max-width: unset;
989
990 }
991}
992
993@media (max-width: 550px) {
994 #demandaModal-l2, .demandaModal-l2 {
995 display: flex;
996 flex-direction: column;
997 }
998
999 #demandaModal-l3, .demandaModal-l3 {
1000 display: flex;
1001 flex-direction: column;
1002 }
1003}
1004
1005@media(max-width: 450px){
1006 .bioec-profile-demanda-main .lista-details{
1007 flex-direction: column;
1008 }
1009
1010 .lista-contato{
1011 text-align: center;
1012 }
1013
1014 .bioec-profile-demanda-main .lista-footnote{
1015 flex-direction: column;
1016 gap: 10px;
1017 align-items: flex-end;
1018 text-align: right;
1019 }
1020}
1021
1022@media(max-width: 992px){
1023 #demanda-lista-container {
1024 padding-inline: 15px;
1025 }
1026}
1027
1028.bioec-profile-demanda-main .lista-footnote .buttonsActions {
1029 display: flex;
1030 gap: 17px;
1031}
1032
1033@media (max-width: 768px) {
1034 .bioec-profile-demanda-main .lista-desc {
1035 gap: 24px;
1036 flex-direction: column-reverse;
1037 }
1038 .bioec-profile-demanda-main .lista-footnote {
1039 flex-direction: column;
1040 align-items: center;
1041 }
1042 .bioec-profile-demanda-main .lista-footnote > div {
1043 text-align: center;
1044 }
1045
1046 .bioec-profile-demanda-main .lista-footnote .barra-pipe {
1047 display: none;
1048 }
1049 .bioec-profile-demanda-main .lista-footnote .lista-author {
1050 display: flex;
1051 gap: 4px;
1052 justify-content: center;
1053 }
1054 .bioec-profile-demanda-main .lista-footnote .buttonsActions {
1055 width: 100%;
1056 justify-content: space-between;
1057 }
1058}
1059
1060
1061</style>
1062
1063
1064<script>
1065
1066
1067
1068</script>
The following has evaluated to null or missing: ==> autorArticleId [in template "34764#34807#41133" at line 98, column 22] ---- 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#41133" at line 98, column 17] ----
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 mbMessageLocalService = serviceLocator.findService("com.liferay.message.boards.service.MBMessageLocalService")>
5<#assign OrganizationLocalService = serviceLocator.findService("com.liferay.portal.kernel.service.OrganizationLocalService")
6 tagsLocalService = serviceLocator.findService("com.liferay.asset.kernel.service.AssetTagLocalService")
7>
8
9
10
11
12
13
14
15
16<div class="bioec-profile-oferta-main">
17 <div id="oferta-lista-container" class="d-flex flex-column">
18 <#if entries?has_content>
19 <#list entries as entry>
20 <#assign journalArticle = JournalArticleLocalService.getLatestArticle(entry.getClassPK()) >
21 <#assign JournalArticleID = journalArticle.getId()>
22 <#assign JournalArticleFrontId = journalArticle.getArticleId()>
23 <#assign articleXml = journalArticle.getDocument().getRootElement()
24 userIsAdmin = false
25 orgId = ""
26 autorId = ""
27 >
28
29 <#if articleXml.selectSingleNode("dynamic-element[@field-reference='CampoDeTexto50355704']")??>
30
31 <#assign nomeParaContato = articleXml.selectSingleNode("dynamic-element[@field-reference='CampoDeTexto50355704']").getStringValue()!""
32 nomeParaContato = nomeParaContato?replace("\n\t\t", "")
33 nomeParaContato = nomeParaContato?replace("\n\t", "")
34 >
35 </#if>
36
37 <#if articleXml.selectSingleNode("dynamic-element[@field-reference='Text90715721']")??>
38 <#assign telefone = articleXml.selectSingleNode("dynamic-element[@field-reference='Text90715721']")!""
39 telefone = telefone.getStringValue()!""
40 telefone = telefone?replace("\n\t\t", "")
41 telefone = telefone?replace("\n\t", "")
42 >
43
44 </#if>
45
46 <#if articleXml.selectSingleNode("dynamic-element[@field-reference='Text68569631']")??>
47 <#assign email = articleXml.selectSingleNode("dynamic-element[@field-reference='Text68569631']").getStringValue()!""
48 email = email?replace("\n\t\t", "")
49 email = email?replace("\n\t", "")
50 >
51 </#if>
52
53
54 <#if articleXml.selectSingleNode("dynamic-element[@field-reference='CopyOfText18267936']")??>
55 <#assign desc = articleXml.selectSingleNode("dynamic-element[@field-reference='CopyOfText18267936']").getStringValue()!""
56 desc = desc?replace("\n\t\t", "")
57 desc = desc?replace("\n\t", "")
58 >
59 </#if>
60
61 <#if articleXml.selectSingleNode("dynamic-element[@field-reference='Text80669990']")??>
62 <#assign imagem = articleXml.selectSingleNode("dynamic-element[@field-reference='Text80669990']").getStringValue()!""
63 imagem = imagem?replace("\n\t\t", "")
64 imagem = imagem?replace("\n\t", "")
65 >
66 </#if>
67
68 <#if articleXml.selectSingleNode("dynamic-element[@field-reference='CampoDeTexto97452704']")??>
69 <#assign autorId = articleXml.selectSingleNode("dynamic-element[@field-reference='CampoDeTexto97452704']").getStringValue()!""
70 autorId = autorId?replace("\n\t\t", "")
71 autorId = autorId?replace("\n\t", "")
72 autorArticleId = ""
73 >
74 </#if>
75
76 <#assign
77 commentsCount = mbMessageLocalService.getDiscussionMessagesCount(entry.getClassName(), entry.getClassPK(), 0)!"0"
78 >
79
80
81
82 <#if autorId != "" && autorId??>
83 <#assign
84 autor = UserLocalService.fetchUser(autorId?number)!""
85 autorArticleId = autor.getExpandoBridge().getAttribute("journal-article")!"0"
86 />
87 <#if autor != "">
88 <#assign autor = autor.getFullName()!"">
89 <#else>
90 <#assign autor = "Anônimo" >
91 </#if>
92 <#else>
93 <#assign autor = "Anônimo" >
94 </#if>
95 <#assign categorias = AssetCategoryLocalService.getCategoryNames(entry.getClassName(), entry.getClassPK())!"" >
96 <#assign urlWC = "">
97
98 <#if autorArticleId != "0" && autorArticleId != "" && autor != "Anônimo">
99 <#assign autorArticle = JournalArticleLocalService.getLatestArticle(themeDisplay.getLayout().getGroupId(), autorArticleId?string) >
100 <#assign urlWC = autorArticle.getUrlTitle()!"">
101 </#if>
102
103
104 <#assign tags = tagsLocalService.getTagNames("com.liferay.journal.model.JournalArticle", journalArticle.getResourcePrimKey()?number )
105 tagName = tags[0]!""
106 orgOrUser = ""
107 >
108
109 <#if tagName?contains("organization") && tagName != "" >
110 <#assign orgOrUser = "org">
111 <#else>
112 <#assign orgOrUser = "user">
113 </#if>
114
115 <#if orgOrUser == "org" >
116
117 <#assign
118 orgId = tagName?keep_after("organization-")
119 organization = OrganizationLocalService.fetchOrganization(orgId?number)!""
120 >
121
122
123 <#if organization != "" && autor != "Anônimo">
124 <#assign orgArticleId = organization.getExpandoBridge().getAttribute("journal-article")
125 orgJournalArticle = JournalArticleLocalService.getArticle(themeDisplay.getLayout().getGroupId(),orgArticleId?c)
126 urlWC = orgJournalArticle.getUrlTitle()!""
127 autor = organization.getName()!""
128 >
129
130 </#if>
131 </#if>
132
133 <#if themeDisplay.isSignedIn() >
134 <#if tagName?contains("organization-")>
135 <#assign userIsAdmin = OrganizationLocalService.hasUserOrganization(themeDisplay.getUserId(), orgId?number)>
136 <#else>
137 <#if autorId?number == themeDisplay.getUserId()>
138 <script>console.log("oi");</script>
139 <#assign userIsAdmin = true>
140 </#if>
141 </#if>
142
143
144 </#if>
145
146
147 <div class="oferta-lista-item">
148 <div class="lista-checkmark">
149 <#if categorias?seq_contains("aprovado") > <i title="Aprovado" style="color: #4ECD66" class="fa-solid fa-circle-check"></i> </#if>
150 <#if categorias?seq_contains("pendente") > <i title="Em análise" style="color: #D90000"class="fa-solid fa-spinner"></i> </#if>
151 <#if categorias?seq_contains("recusado") > <i title="Recusado" style="color: #D90000"class="fa-solid fa-exclamation-circle"></i> </#if>
152 </div>
153
154
155 <div class="lista-titulo">
156 <h5>${entry.getHighlightedTitle()}</h5>
157 </div>
158
159 <div class="lista-arrow">
160 <button style="padding: 0;" class="btn" type="button" data-toggle="collapse" data-target="#collapseID${entry.getClassPK()}" aria-expanded="false" aria-controls="collapseID${entry.getClassPK()}">
161 <i class="fa-solid fa-chevron-down"></i>
162 </button>
163 </div>
164
165 <div class="lista-desc">
166 <p>${desc}</p>
167 </div>
168
169 <div class="lista-collapse collapse" id="collapseID${entry.getClassPK()}">
170 <#if nomeParaContato != "" || telefone != "" || email != "" || imagem?trim !="">
171 <div class="lista-details">
172 <div class="lista-pic">
173 <i class="fa-solid fa-image-slash"></i>
174 <#if imagem?trim !="" >
175 <img class="bioec_oferta_img" src="${imagem}">
176 <#else>
177 <div class="bioec_oferta_img_placeholder">
178 <i class="fa-solid fa-image"></i>
179 sem imagem
180 </div>
181 </#if>
182 </div>
183 <#if nomeParaContato != "" || telefone != "" || email != "" >
184 <div class="lista-contato">
185 <p>Contato</p>
186 <p class="lista-author">${nomeParaContato}</p>
187 <p class="lista-phone">${telefone}</p>
188 <p class="lista-email">${email}</p>
189 </div>
190 </#if>
191 </div>
192 </#if>
193
194 <#if categorias?seq_contains("recusado") >
195 <div style="border-top: 1px solid #E8ECEF; font-weight: bold; padding-top: 24px;">
196 <p>Conteúdo Em Análise Pelo Cetiqt:</p>
197 <p>Conteúdo recusado pelo CETIQT por violar as políticas de privacidade.</p>
198 </div>
199 </#if>
200 <div class="lista-footnote">
201 <div>
202 <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>
203 </div>
204 <#if userIsAdmin>
205 <div class="buttonsActions">
206 <div style="cursor: pointer;font-size: 16px;" data-toggle="modal" data-target="#modalOferta${JournalArticleID}">
207 <i class="fa-solid fa-edit"></i>
208 </div>
209 <div style="cursor: pointer;font-size: 16px;" data-toggle="modal" data-target="#modal-oferta-${entry.getClassPK()}">
210 <i class="fa-solid fa-trash-can"></i>
211 </div>
212
213 </div>
214 </#if>
215 </div>
216 </div>
217 </div>
218
219 <#if userIsAdmin>
220 <div style="display: none;" id="modal-oferta-${entry.getClassPK()}" class="modal fade" role="dialog">
221 <div class="modal-dialog modal-lg" role="document">
222 <div class="modal-content">
223 <div class="modal-header" >
224 <h4 class="m-0">Remover Oferta</h4>
225 <button type="button" class="close" data-dismiss="modal" aria-label="Close">
226 <span aria-hidden="true">
227 <i class="fa-solid fa-close"></i>
228 </span>
229 </button>
230 </div>
231 <div class="modal-body">
232 <h5>Você tem certeza que deseja remover essa oferta?</h5>
233 <div>
234 Ao clicar em continuar, a oferta será removida do seu perfil.
235 </div>
236 </div>
237 <div class="modal-footer justify-content-end">
238 <button class="bioec_secondary_button" data-dismiss="modal">CANCELAR</button>
239 <button class="bioec_primary_button" type="button" onclick="excluirOferta(${JournalArticleFrontId}, ${orgId})">CONTINUAR</button>
240 </div>
241 </div>
242 </div>
243 </div>
244
245 <#-- modal edição -->
246
247
248 <div style="display: none;" id="modalOferta${JournalArticleID}" class="modal fade bioec-profile-oferta-modal modalOferta" role="dialog">
249 <div class="modal-dialog modal-lg" role="document">
250 <form id="formularioOferta${JournalArticleID}" class="form-group modal-content formularioOferta">
251 <div id="ofertaModal-l1${JournalArticleID}" class="modal-header ofertaModal-l1">
252 <h5>Adicionar oferta</h5>
253 <button type="button" class="close" data-dismiss="modal" aria-label="Close">
254 <span aria-hidden="true">×</span>
255 </button>
256 </div>
257 <div id="ofertaModal-l2${JournalArticleID}" class="modal-body ofertaModal-l2">
258 <div id="ofertaTitle${JournalArticleID}" class="ofertaTitle">
259 <label class="ReqLabel" for="ofertaInputTitle${JournalArticleID}">Título da oferta</label>
260 <input id="ofertaInputTitle${JournalArticleID}" value="${entry.getHighlightedTitle()}" type="text" placeholder="Inserir um título" required>
261 </div>
262 <div id="ofertaName${JournalArticleID}" class="ofertaName">
263 <label class="" for="ofertaInputName${JournalArticleID}">Nome para contato</label>
264 <input value="${nomeParaContato}" id="ofertaInputName${JournalArticleID}" placeholder="Inserir nome" type="text">
265 </div>
266 <div id="ofertaTelephone${JournalArticleID}" class="ofertaTelephone">
267 <label class="" for="ofertaInputPhone${JournalArticleID}">Telefone para contato</label>
268 <input value="${telefone}" id="ofertaInputPhone${JournalArticleID}" name="ofertaInputPhone" type="text" placeholder ='(__)_____-_____' minlength="14" />
269 </div>
270 <div id="ofertaEmail${JournalArticleID}" class="ofertaEmail">
271 <label class="" for="ofertaInputEmail${JournalArticleID}">E-mail para contato</label>
272 <input value="${email}" id="ofertaInputEmail${JournalArticleID}" placeholder="Inserir e-mail" type="text">
273 </div>
274 <div id="ofertaDesc${JournalArticleID}" class="ofertaDesc">
275 <label class="ReqLabel" for="ofertaInputDesc${JournalArticleID}">Descrição</label>
276 <textarea id="ofertaInputDesc${JournalArticleID}" style="max-width: 100%;font-size: 16px;height: 80px;border: 1px solid #BEBEBE;" required>${desc}</textarea>
277 </div>
278 <div id="ofertaImg${JournalArticleID}" class="ofertaImg">
279 <div style="display: flex; flex-direction: column; gap: 8px">
280 <label>Imagem da oferta (Máx. 10 MB)</label>
281 <label class="btn carregarImagem" id="carregarImagem${JournalArticleID}" for="inputCarregarImagemOferta${JournalArticleID}" style="font-size: 16px; cursor: pointer;">CARREGAR IMAGEM</label>
282 <input class="inputCarregarImagemOferta" id="inputCarregarImagemOferta${JournalArticleID}" type="file" accept="image/*" onchange="encodeOfertaImageAsURL${JournalArticleID}(this)">
283 <input class="d-none" id="inputOfertaBase64${JournalArticleID}" value="${imagem}"/>
284 <div class="imagemCarregadaOferta imagemCarregadaOferta${JournalArticleID} d-md-none d-block" style="background-image: url(${imagem})"></div>
285 <button type="button" id="removerImagemOferta${JournalArticleID}" class="<#if imagem == "" || imagem?? == false> d-none </#if> removerImagemOferta" >
286 <i class="fa fa-trash"></i> Remover imagem
287 </button>
288 </div>
289 <div class="imagemCarregadaOferta imagemCarregadaOferta${JournalArticleID} d-md-block d-none" style="background-image: url(${imagem})"></div>
290 </div>
291 </div>
292 <div class="TextImportant">
293 <p>
294 Importante: O conteúdo enviado passará por um processo interno de aprovação. Só então o conteúdo adicionado aparecerá no portal.
295 </p>
296 </div>
297
298 <div id="ofertaModal-l3${JournalArticleID}" class="modal-footer ofertaModal-l3">
299 <button class="btn button-empty" onclick="" id="ofertas-saveAndClose${JournalArticleID}">SALVAR E FECHAR</button>
300 </div>
301 </form>
302 </div>
303 </div>
304
305 </#if>
306 <#--
307
308
309
310
311 <div style="display: none;" id="modalInfra${JournalArticleID}" class="modal fade bioec-profile-infra-modal" role="dialog">
312 <div class="modal-dialog modal-lg" role="document">
313
314 <form class="form-group modal-content" id="formularioInfraestrutura${JournalArticleID}">
315 <div id="infraModal-l1-${JournalArticleID}" class="modal-header infraModal-l1" >
316 <h5>Adicionar Infraestrutura</h5>
317 <button id="fecharModal${JournalArticleID}" type="button" class="close" data-dismiss="modal" aria-label="Close">
318 <span aria-hidden="true">×</span>
319 </button>
320 </div>
321 <div id="infraModal-l2-${JournalArticleID}" class="modal-body infraModal-l2">
322 <div id="infraName${JournalArticleID}" class="infraName">
323 <label class="ReqLabel" for="inputInfraName${JournalArticleID}">Nome da infraestrutura</label>
324 <input type="text" id="inputInfraName${JournalArticleID}" value="${entry.getHighlightedTitle()}" placeholder="Nome da infraestrutura" required>
325 </div>
326 <div id="infraModel${JournalArticleID}" class="infraModel">
327 <label class="ReqLabel" for="inputInfraModel${JournalArticleID}">Modelo</label>
328 <input type="text" id="inputInfraModel${JournalArticleID}" value="${modelo}" placeholder="Modelo" required>
329 </div>
330 <div id="infraBrand${JournalArticleID}" class="infraBrand">
331 <label class="ReqLabel" for="inputInfraBrand${JournalArticleID}">Marca</label>
332 <input type="text" id="inputInfraBrand${JournalArticleID}" value="${marca}" placeholder="Marca" required>
333 </div>
334
335 <div id="infraImg${JournalArticleID}" class="infraImg">
336 <div style="display: flex; flex-direction: column; gap: 8px">
337 <label>Imagem da infraestrutura (Máx. 10 MB)</label>
338 <label class="bioec_secondary_button" id="carregarImagem${JournalArticleID}" for="inputCarregarImagemInfra${JournalArticleID}" style="font-size: 16px;color: #333244;align-self:start;">
339 CARREGAR IMAGEM
340 </label>
341 <input id="inputCarregarImagemInfra${JournalArticleID}" class="inputCarregarImagemInfra" type="file" accept="image/*" onchange="encodeInfraImageAsURL${JournalArticleID}(this)">
342 <input class="d-none" id="inputInfraBase64${JournalArticleID}" />
343 <div class="imagemCarregadaInfra${JournalArticleID} d-md-none d-block"></div>
344 <button type="button" id="removerImagemInfra${JournalArticleID}" class="d-none removerImagemInfra" >
345 <i class="fa fa-trash"></i> Remover imagem
346 </button>
347 </div>
348 <div class="imagemCarregadaInfra${JournalArticleID} d-md-block d-none"></div>
349 </div>
350
351 <div id="infraFunction${JournalArticleID}" class="infraFunction">
352 <label class="ReqLabel" for="inputInfraFunction${JournalArticleID}">Função</label>
353 <input type="text" id="inputInfraFunction${JournalArticleID}" class="inputInfraFunction" value="${funcao}" placeholder="Função" required>
354 </div>
355 </div>
356 <div class="TextImportant">
357 <p>
358 Importante: O conteúdo enviado passará por um processo interno de aprovação. Só então o conteúdo adicionado aparecerá no portal.
359 </p>
360 </div>
361 <div id="infraModal-l3-${JournalArticleID}" class="modal-footer infraModal-l3">
362 <button class="bioec_secondary_button" id="ofertas-saveAndClose${JournalArticleID}" onclick="">SALVAR E FECHAR</button>
363 </div>
364 </form>
365
366 </div>
367
368
369 -->
370
371
372
373 <script>
374 <#if userIsAdmin>
375 function excluirOferta(wcId, orgId) {
376 Liferay.Util.openToast({message: "Enviando requisição",type: "info",title: ""});
377 fetch(Liferay.ThemeDisplay.getPortalURL() + "/o/oferta/" + wcId, {
378 method: 'DELETE',
379 "headers": {
380 "x-csrf-token": Liferay.authToken,
381 "Content-Type": "application/json"
382 }
383 })
384 .then(res => {
385 if(res.status == 200) {
386 Liferay.Util.openToast({
387 message: "Infraestrutura excluida com sucesso",
388 type: "success",
389 title: "",
390 toastProps: {
391 autoClose: 5000
392 }
393 })
394 setTimeout(function(){ location.reload(); }, 2000)
395 } else {
396 Liferay.Util.openToast({
397 message: "Erro ao excluir infraestrutura",
398 type: "danger",
399 title: "",
400 toastProps: {
401 autoClose: 5000
402 }
403 })
404 }
405 });
406 }
407
408
409
410
411 function validImageSize(base64="") {
412 const decoded = atob(base64.substring(base64.indexOf(',') + 1));
413 const sizeMB = decoded.length / 1e+6;
414 console.log("MB: " + decoded.length / 1e+6);
415 if(sizeMB > 10) {
416 Liferay.Util.openToast({
417 message: "O tamanho da imagem não deve ultrapassar 10 MB.",
418 type: "danger",
419 title: "",
420 toastProps: {
421 autoClose: 5000
422 }
423 })
424 return false
425 }
426 return true
427 }
428
429 function encodeOfertaImageAsURL${JournalArticleID}(element) {
430 let file = element.files[0];
431 let reader = new FileReader();
432 reader.onloadend = () => {
433 if(reader.result) {
434 if(!validImageSize(reader.result)) return;
435 try {
436 const base64_input = document.getElementById("inputOfertaBase64${JournalArticleID}")
437 base64_input.value = reader.result
438 Array.from(document.getElementsByClassName("imagemCarregadaOferta${JournalArticleID}")).forEach( el => el.style.backgroundImage = 'url(' + reader.result + ')' )
439
440 const removeImageButton = document.getElementById("removerImagemOferta${JournalArticleID}")
441 removeImageButton.classList.remove("d-none")
442 } catch (error) {
443 console.error(error)
444 }
445 }
446 }
447 reader.readAsDataURL(file);
448 }
449
450 function removeImageOferta${JournalArticleID}() {
451 try {
452 const file_input = document.getElementById("inputCarregarImagemOferta${JournalArticleID}")
453 Array.from(document.getElementsByClassName("imagemCarregadaOferta${JournalArticleID}")).forEach( el => el.style.backgroundImage = "" )
454 const base64_input = document.getElementById("inputOfertaBase64${JournalArticleID}")
455 file_input.value = null
456 base64_input.value = ""
457
458 const removeImageButton = document.getElementById("removerImagemOferta${JournalArticleID}")
459 removeImageButton.classList.add("d-none")
460 } catch (error) {
461 console.error(error)
462 }
463}
464
465
466
467document.getElementById("removerImagemOferta${JournalArticleID}").addEventListener("click", removeImageOferta${JournalArticleID});
468
469<#-- Rest da edição de organização -->
470
471<#if orgOrUser == "org">
472document.querySelector('#formularioOferta${JournalArticleID}').addEventListener('submit', event => {
473 event.preventDefault();
474 adicionarOferta${JournalArticleID}();
475});
476
477function adicionarOferta${JournalArticleID}() {
478 Liferay.Util.openToast({message: "Enviando requisição",type: "info",title: ""});
479 $("#ofertas-saveAndClose${JournalArticleID}").prop("disabled",true);
480
481
482
483 const ofertaData = {
484 titulo: document.getElementById("ofertaInputTitle${JournalArticleID}").value,
485 nomeContato: document.getElementById("ofertaInputName${JournalArticleID}").value,
486 telefoneContato: document.getElementById("ofertaInputPhone${JournalArticleID}").value,
487 emailContato: document.getElementById("ofertaInputEmail${JournalArticleID}").value,
488 descricao: document.getElementById("ofertaInputDesc${JournalArticleID}").value,
489 imagem: document.getElementById("inputOfertaBase64${JournalArticleID}").value,
490 }
491
492 console.log(ofertaData);
493
494 fetch(Liferay.ThemeDisplay.getPortalURL() + "/o/oferta/${JournalArticleFrontId}", {
495 method: 'PUT',
496 "headers": {
497 "x-csrf-token": Liferay.authToken,
498 "Content-Type": "application/json"
499 },
500 body: JSON.stringify(ofertaData)
501 })
502 .then(res => {
503 if(res.status == 200) {
504 Liferay.Util.openToast({
505 message: "Oferta 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.",
506 type: "success",
507 title: "",
508 toastProps: {
509 autoClose: 5000
510 }
511 })
512 setTimeout(function(){ location.reload(); }, 2000);
513 } else {
514 $("#ofertas-saveAndClose${JournalArticleID}").prop("disabled",false);
515 Liferay.Util.openToast({
516 message: "Erro ao editar oferta",
517 type: "danger",
518 title: "",
519 toastProps: {
520 autoClose: 5000
521 }
522 })
523 }
524 })
525 }
526</#if>
527
528<#-- Rest da edição de pessoa fisica -->
529
530
531
532 <#if orgOrUser == "user">
533
534 document.querySelector('#formularioOferta${JournalArticleID}').addEventListener('submit', event => {
535 event.preventDefault();
536 adicionarOferta${JournalArticleID}();
537 });
538
539 function adicionarOferta${JournalArticleID}() {
540 Liferay.Util.openToast({message: "Enviando requisição",type: "info",title: ""});
541 $("#ofertas-saveAndClose${JournalArticleID}").prop("disabled",true);
542
543 const ofertaData = {
544 titulo: document.getElementById("ofertaInputTitle${JournalArticleID}").value,
545 nomeContato: document.getElementById("ofertaInputName${JournalArticleID}").value,
546 telefoneContato: document.getElementById("ofertaInputPhone${JournalArticleID}").value,
547 emailContato: document.getElementById("ofertaInputEmail${JournalArticleID}").value,
548 descricao: document.getElementById("ofertaInputDesc${JournalArticleID}").value,
549 imagem: document.getElementById("inputOfertaBase64${JournalArticleID}").value,
550 }
551
552 console.log(ofertaData);
553
554 fetch(Liferay.ThemeDisplay.getPortalURL() + "/o/oferta/${JournalArticleFrontId}", {
555 method: 'PUT',
556 "headers": {
557 "x-csrf-token": Liferay.authToken,
558 "Content-Type": "application/json"
559 },
560 body: JSON.stringify(ofertaData)
561 })
562 .then( res => {
563 if(res.status == 200) {
564 Liferay.Util.openToast({
565 message: "Oferta 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.",
566 type: "success",
567 title: "",
568 toastProps: {
569 autoClose: 5000
570 }
571 })
572 setTimeout(function(){ location.reload(); }, 2000);
573 } else {
574 $("#ofertas-saveAndClose${JournalArticleID}").prop("disabled",false);
575 Liferay.Util.openToast({
576 message: "Erro ao editar Oferta",
577 type: "danger",
578 title: "",
579 toastProps: {
580 autoClose: 5000
581 }
582 })
583 }
584 });
585
586 };
587
588
589 </#if>
590
591
592 </#if>
593 </script>
594
595
596
597
598 </#list>
599 </#if>
600 </div>
601</div>
602
603<style>
604.bioec_oferta_img {
605 overflow: hidden;
606 background-size: contain;
607 background-position: center;
608 background-repeat: no-repeat;
609}
610
611.bioec_oferta_img_placeholder {
612 width: 140px;
613 height: 140px;
614 background-color: #E8ECEF;
615 display: flex;
616 flex-direction: column;
617 align-items: center;
618 justify-content: center;
619 font-size: 14px;
620 color: #5B5C61;
621}
622
623.bioec_oferta_img_placeholder i {
624 font-size: 44px;
625}
626
627
628.pagination-items-per-page.active > a,
629.pagination-items-per-page.active > button,
630.pagination-items-per-page.show > a,
631.pagination-items-per-page.show > button,
632.page-item.active .page-link,
633.page-item.show .page-link{
634 border-color: #4ECD66;
635 background-color: #4ECD66;
636}
637
638.pagination-results,
639.pagination-items-per-page > a,
640.pagination-items-per-page > button,
641.pagination-items-per-page > a:hover,
642.pagination-items-per-page > button:hover,
643.page-link{
644 color: #4ebe66;
645}
646
647.bioec-profile-oferta-main{
648 display: flex;
649 gap: 40px;
650 flex-direction: column;
651 padding-bottom: 20px;
652}
653.bioec-profile-oferta-main h5{
654 font-weight: 700;
655}
656.bioec-profile-oferta-main h5, .bioec-profile-oferta-main p{
657 color: #5B5C61;
658 margin-bottom: 0px;
659 font-size: 16px;
660
661}
662
663.bioec-profile-oferta-main #oferta-lista-container>div{
664 border: 1px #BEBEBE solid;
665 padding: 24px 24px 0 24px;
666 margin-bottom: 40px;
667 display: grid;
668 grid-row-gap: 24px;
669 grid-template-columns: 24px 12px 1fr 15px;
670 grid-template-areas:
671 "ck . tit arrw"
672 "desc desc desc desc"
673 "clps clps clps clps";
674}
675
676.bioec-profile-oferta-main .lista-checkmark { grid-area: ck; display: flex; }
677.bioec-profile-oferta-main .lista-checkmark i { font-size: 24px; }
678.bioec-profile-oferta-main .lista-pic { grid-area: pic; display: flex; justify-content: center;}
679.bioec-profile-oferta-main .lista-arrow { grid-area: arrw; }
680
681.bioec-profile-oferta-main .lista-titulo {
682 grid-area: tit;
683 display: flex;
684 flex-direction: column;
685 justify-content: center;
686
687}
688
689.bioec-profile-oferta-main .lista-titulo h5{
690 margin-bottom: 0px;
691}
692
693.bioec-profile-oferta-main .lista-desc {
694grid-area: desc;
695}
696
697.bioec-profile-oferta-main .lista-desc p{
698 margin: 0;
699}
700
701.bioec-profile-oferta-main a{
702 color: #5B5C61;
703}
704
705.oferta-port{
706 border: 1px #BEBEBE solid;
707 padding: 24px;
708 display: flex;
709 flex-direction: column;
710 align-items: center;
711 gap: 24px;
712}
713
714.oferta-port p{
715text-align: center;
716
717}
718
719.oferta-port div{
720display: flex;
721 justify-content: space-between;
722 width: min(558px, 100%);
723}
724
725.button-empty {
726border: solid 1px #4ECD66;
727padding: 8px 24px;
728color: #333244;
729 transition: 250ms;
730}
731
732.button-empty:hover{
733 background-color: #4ECD66;
734}
735
736.button-filled {
737background-color: #4ECD66;
738border: solid 1px #4ECD66;
739padding: 8px 24px;
740color: #333244;
741transition: 250ms;
742
743}
744
745.button-filled:hover{
746 background-color: transparent;
747}
748
749.bioec-profile-oferta-main .lista-footnote {
750
751 display: flex;
752 justify-content: space-between;
753 border-top: 1px solid #E8ECEF;
754 padding-top: 12px;
755 font-size: 14px;
756 font-weight: 300;
757 gap: 15px;
758 color: #5B5C61;
759
760}
761.lista-collapse{
762display: flex;
763flex-direction: column;
764gap: 24px;
765grid-area: clps;
766padding-bottom: 24px;
767}
768
769 .lista-details{
770 display: flex;
771 justify-content: flex-start;
772 gap: 24px;
773}
774.lista-pic img {
775 max-height: 138px;
776 max-width: 138px;
777}
778
779.bioec-profile-oferta-main p{
780
781}
782
783.imagemCarregadaOferta {
784 height: 100px;
785 width: 100px;
786 background-size: contain;
787 background-position: center;
788 background-repeat: no-repeat;
789}
790
791
792.ButtonAddOferta {
793 background: #4ECD66;
794 border-radius: 8px;
795 padding: 8px 24px;
796 border: none;
797 font-weight: 700;
798 color: #333244;
799 font-family: 'Roboto';
800 float: right;
801 text-transform: uppercase;
802}
803.ButtonAddOferta:hover{
804 color: #333244;
805 text-decoration: none;
806}
807
808.bioec-profile-oferta-modal label {
809 margin: 0;
810 cursor: default;
811 font-size: 20px;
812 font-weight: 700;
813 color: #5B5C61;
814}
815
816.bioec-profile-oferta-modal div {
817 width: 100%;
818}
819
820#ofertaModal-l1, .ofertaModal-l1 {
821 padding: 18px 24px;
822 display: flex;
823 justify-content: space-between;
824}
825
826#ofertaModal-l1 img, .ofertaModal-l1 img {
827 cursor: pointer;
828}
829
830#ofertaModal-l1 h5, .ofertaModal-l1 h5 {
831 margin: 0;
832 font-size: 20px;
833 font-weight: 700;
834 color: #5B5C61;
835}
836
837#ofertaModal-l2, .ofertaModal-l2 {
838 border-top: 1px solid #E8ECEF;
839 display: grid;
840 grid-template-columns: 1fr 1fr;
841 grid-template-areas:
842 "titu nome"
843 "fone mail"
844 "desc desc"
845 "imagem ."
846 ;
847 column-gap: 24px;
848 row-gap: 40px;
849 padding: 24px;
850}
851
852#ofertaModal-l2>div, .ofertaModal-l2>div {
853 display: flex;
854 flex-direction: column;
855 gap: 8px;
856}
857
858#ofertaTitle, .ofertaTitle {
859 grid-area: titu;
860}
861
862#ofertaName, .ofertaName {
863 grid-area: nome;
864}
865
866#ofertaTelephone, .ofertaTelephone {
867 grid-area: fone;
868}
869
870#ofertaEmail, .ofertaEmail {
871 grid-area: mail;
872}
873
874#ofertaBrand, .ofertaBrand {
875 grid-area: marca;
876}
877
878#ofertaModal-l2>#ofertaImg, .ofertaModal-l2>.ofertaImg {
879 grid-area: imagem;
880 display: flex;
881 flex-direction: column;
882}
883
884#ofertaDesc, .ofertaDesc {
885 grid-area: desc;
886
887}
888
889#ofertaDesc input, .ofertaDesc input {
890 height: 80px;
891}
892
893.TextImportant{
894 border-bottom: 1px solid #E8ECEF;
895 padding: 24px;
896 color: #5B5C61;
897}
898
899.bioec-profile-oferta-modal input[type="text"] {
900 border-top: none;
901 border-left: none;
902 border-right: none;
903 border-bottom: 1px solid #BEBEBE;
904 width: 100%;
905 font-size: 16px;
906
907}
908
909
910.bioec-profile-oferta-modal input[type="text"]:focus-visible {
911 outline: none;
912 border-bottom: 1px solid black;
913
914}
915
916.bioec-profile-oferta-modal .ReqLabel:before {
917 content: "* ";
918 color: #D90000;
919
920}
921
922#inputCarregarImagemOferta, .inputCarregarImagemOferta {
923 display: none;
924}
925
926#carregarImagem, .carregarImagem {
927 padding: 8px 24px;
928 border: 1px solid #4ECD66;
929 width: fit-content;
930 transition: 250ms;
931
932}
933
934#carregarImagem:hover, .carregarImagem:hover {
935 background-color: #4ECD66;
936}
937
938.button-empty {
939 border: solid 1px #4ECD66;
940 padding: 8px 24px;
941 color: #333244;
942 transition: 250ms;
943 font-weight: bold;
944}
945
946.button-empty:hover {
947 background-color: #4ECD66;
948}
949
950.button-filled {
951 background-color: #4ECD66;
952 border: solid 1px #4ECD66;
953 padding: 8px 24px;
954 color: #333244;
955 transition: 250ms;
956 font-weight: bold;
957}
958
959.button-filled:hover {
960 background-color: transparent;
961}
962
963#ofertaModal-l3, .ofertaModal-l3 {
964 gap: 24px;
965 display: flex;
966 justify-content: flex-end;
967 padding: 24px;
968}
969
970.modal {
971 padding: initial !important;
972 border-radius: 4px !important;
973
974}
975
976.modal a.close-modal {
977 display: none;
978}
979
980#removerImagemOferta, .removerImagemOferta {
981 background: none;
982 border: none;
983 outline: none;
984 color: #5B5C61;
985 font-size: 16px;
986 font-weight: 900;
987 line-height: 24px;
988 letter-spacing: 0em;
989 width: fit-content;
990 margin-left: 16px;
991}
992
993
994@media(max-width: 964px){
995 .lista-pic img {
996 width: 100%;
997 max-height: unset;
998 max-width: unset;
999
1000 }
1001}
1002
1003@media (max-width: 550px) {
1004 #ofertaModal-l2, .ofertaModal-l2 {
1005 display: flex;
1006 flex-direction: column;
1007 }
1008
1009 #ofertaModal-l3, .ofertaModal-l3 {
1010 display: flex;
1011 flex-direction: column;
1012 }
1013}
1014
1015@media(max-width: 450px){
1016 .bioec-profile-oferta-main .lista-details{
1017 flex-direction: column;
1018 }
1019
1020 .lista-contato{
1021 text-align: center;
1022 }
1023
1024 .bioec-profile-oferta-main .lista-footnote{
1025 flex-direction: column;
1026 gap: 10px;
1027 align-items: flex-end;
1028 text-align: right;
1029 }
1030}
1031
1032@media(max-width: 992px){
1033 #oferta-lista-container {
1034 padding-inline: 15px;
1035 }
1036}
1037
1038.bioec-profile-oferta-main .lista-footnote .buttonsActions {
1039 display: flex;
1040 gap: 17px;
1041}
1042
1043@media (max-width: 768px) {
1044 .bioec-profile-oferta-main .lista-desc {
1045 gap: 24px;
1046 flex-direction: column-reverse;
1047 }
1048 .bioec-profile-oferta-main .lista-footnote {
1049 flex-direction: column;
1050 align-items: center;
1051 }
1052 .bioec-profile-oferta-main .lista-footnote > div {
1053 text-align: center;
1054 }
1055
1056 .bioec-profile-oferta-main .lista-footnote .barra-pipe {
1057 display: none;
1058 }
1059 .bioec-profile-oferta-main .lista-footnote .lista-author {
1060 display: flex;
1061 gap: 4px;
1062 justify-content: center;
1063 }
1064 .bioec-profile-oferta-main .lista-footnote .buttonsActions {
1065 width: 100%;
1066 justify-content: space-between;
1067 }
1068}
1069
1070
1071</style>
1072
1073
1074<script>
1075
1076
1077
1078</script>
Notícia
Webinário sobre política nacional de plantas medicinais e fitoterápicos revisitada
O CIBS de Farmanguinhos/Fiocruz, através da Rede de Inovação em Medicamentos da Biodiversidade, e em parceria com a Abifina e a Abiquifi, estão organizando um webinário sobre a formulação, diretrizes e gestão da Política Nacional de Plantas Medicinais e Fitoterápicos. O evento ocorrerá de maneira remota nos dias 29, 30 e 31 de maio.
Clique aqui para saber mais e realizar sua inscrição.
Notícia
Café com Bioeconomia #27: Bioeconomia no setor de cosméticos: oportunidades e desafios
A edição do dia 12 de abril de 2023 do Café com Bioeconomia reuniu Daniela Valverde (Cientista Sênior do Grupo Boticário), Danniel Pinheiro (CEO da Biozer da Amazônia e Cofundador da Simbioze Amazônica), Fabio Brasiliano (Diretor de Meio Ambiente para a Bioeconomia e Clima da ABIHPEC) e Larissa Zonta (Especialista em Pesquisa e Inteligência de Produtos da Boticário). O encontro, que acontece quinzenalmente, foi mediado por Débora Way (Pesquisadora do Instituto SENAI de Inovação em Biossintéticos e Fibras do SENAI CETIQT).
A indústria de cosméticos tem se mostrado uma das mais dinâmicas no desenvolvimento de inovações voltadas a promover diversos aspectos da sustentabilidade. Dessa maneira, Débora destacou que esse dinamismo é impulsionado pela mudança de comportamento do consumidor, que atualmente possui maior engajamento ambiental e social, e clama por produtos naturais, orgânicos, veganos, sem testes em animais, menos agressivos ao meio ambiente, entre outros aspectos. Nesse sentido, alguns aspectos relacionados ao desenvolvimento de novos ingredientes provenientes da biodiversidade brasileira ou da biotecnologia foram abordados com os participantes.
Daniela comentou que é necessário estar atento ao que é seguro para o consumidor e citou, ao longo de sua fala, que alguns silicones foram eliminados dos produtos enxaguáveis do Grupo Boticário. Além disso, já trabalham para que nenhum produto não enxaguável seja produzido após 2023 com este itens. Daniela também mencionou que o grupo tem como estratégia ESG 16 compromissos para o futuro e destacou que o primeiro deles é mapear e solucionar 150% de todo o resíduo sólido gerado pela cadeia de valor da empresa, o que é muito significativo.
Larissa complementou dizendo que a biotecnologia tem muita conexão com sustentabilidade, o que está no DNA do Grupo e exemplificou um projeto de pesquisa para desenvolver fontes de cores (pigmentos e corantes) para produtos cosméticos a partir de processos biotecnológicos. Ressaltou também que o Grupo Boticário olha muito para a inovação aberta para acelerar e estar sempre à frente no desenvolvimento, pois acredita que é importante somar esforços com quem tem o mesmo compromisso, o mesmo desejo.
Danniel falou sobre a dificuldade de chegar no sensorial ideal e destacou que o fornecimento dos ingredientes renováveis ainda é, muitas vezes, pouco estabelecido. Segundo ele, a cadeia produtiva na Amazônia ainda não está estruturada, o que foi prontamente identificado pela Biozer. Dessa maneira, a start-up trabalha diretamente junto às comunidades, eliminando a figura do atravessador, para garantir a rastreabilidade dos seus produtos. Danniel ressaltou também a importância de manter o valor agregado na região por meio do desenvolvimento das cadeias locais. O reaproveitamento de materiais residuais também é foco da Biozer.
Fábio falou sobre a importância dos cosméticos no nosso dia a dia e comentou que os aspectos regulatórios são ainda um desafio. Destacou também que o Brasil é pioneiro em legislação de acesso a patrimônio genético e conhecimento tradicional associado. Segundo ele, a terceirização de etapas do processo produtivo é uma estratégia que empresas de menor porte encontram para operacionalizar sua produção quando não tem, por exemplo, uma área de biotecnologia interna.
O Café com Bioeconomia é um evento quinzenal, on-line e interativo, no qual palestrantes e público discutem temas relevantes para a área. Quer receber nossa agenda e participar? Inscreva-se em: https://portaldebioeconomia.com/
Quer ouvir este e outros Cafés? Estamos no Spotify em Café com Bioeconomia.
Notícia
Climatologista da USP fala sobre o desmatamento da Amazônia
O climatologista Carlos Nobre acredita que a Amazônia ainda não atingiu o "ponto de não retorno" em termos de desmatamento, o que contraria a afirmação de muitos outros cientistas.
Clique aqui para ler o conteúdo na íntegra.
Notícia
Café com Bioeconomia #29: Energia versus Bioenergia
A edição do dia 10 de maio de 2023 do Café com Bioeconomia reuniu Fábio Teixeira (Pesquisador do laboratório Cenergia), José Vitor Bomtempo (Coordenador do GEBio da Escola de Química da UFRJ) e Mateus Lopes (Diretor global de transição energética e investimentos da Raízen). O encontro, que acontece quinzenalmente, foi mediado por Paulo Coutinho (Pesquisador-chefe do Instituto SENAI de Inovação em Biossintéticos e Fibras do SENAI CETIQT).
A dinâmica desse evento se diferenciou por almejar a discussão acerca de um artigo publicado na revista MIT Sloan Management Review Brasil: https://www.mitsloanreview.com.br/post/como-os-paises-tropicais-podem-acelerar-seu-protagonismo-na-economia-net. Por esta razão, Fabio deu início ao evento com uma breve apresentação do documento, que descreve como sistemas integrados de produção de alimento e bioenergia podem acelerar a transição para economia net zero. Um dos grandes resultados do trabalho foi demonstrar que a indústria sucroenergética pode ser 10 vezes mais eficiente que a geração de energia fotovoltaica em termos de descarbonização.
Paulo então ressaltou que os sistemas integrados de produção acabam com a dicotomia energia versus alimento. No entanto, destacou a falta de indicadores para comparação com outros tipos de geração de energia. Paulo indagou também a priorização do tema de estocagem de CO2 em detrimento do seu uso para produção de outros produtos. Ademais, salientou que os sistemas integrados consistem em monoculturas e questionou como elas afetariam a biodiversidade.
Fábio discursou sobre economicidade associada à preocupação social e indicou que a produção de biocombustíveis no Brasil gera muitos empregos. Com relação ao questionamento de Paulo sobre monoculturas, Fabio explicou que a produção de proteínas alternativas poderia liberar terras antes ocupadas com pasto e que essas terras poderiam ser usadas para manutenção da biodiversidade.
Mateus cita que o documento chama as biorrefinarias de 2050 de sistemas integrados devido à inclusão da segurança alimentar em sua definição, algo que não era abordado no surgimento do conceito em torno de 2010. Ele concordou com Paulo acerca da utilização do CO2 para a geração de outros produtos, mas ressaltou o grande volume de gás produzido e o atraso em atingir as metas de descarbonização, tornando a estocagem um ponto de grande relevância para a retirada do CO2 da atmosfera.
José Vitor pontuou as características relevantes dos sistemas integrados, como a circularidade, a integração da bioeconomia, a produção de novos produtos, bem como a identificação de novas funções para produtos antigos e a necessidade de P&D, investimento e políticas contínuas. Também foi destacado que o processo vai de encontro à novas formas de integração industrial. José Vitor finalizou destacando oportunidades envolvendo outras culturas, como milho e soja, bem como o uso de florestas.
O Café com Bioeconomia é um evento quinzenal, on-line e interativo, no qual palestrantes e público discutem temas relevantes para a área. Quer receber nossa agenda e participar? Inscreva-se em: https://portaldebioeconomia.com/
Quer ouvir este e outros Cafés? Estamos no Spotify em Café com Bioeconomia.
Notícia
Lançamento de edital Sinapse Bio para apoiar ideias inovadoras na Amazônia
Será lançado hoje, 19/05/2023, um edital para apoiar até 70 ideias inovadoras na Amazônia. Serão disponibilizados até R$ 4,9 milhões.
Clique aqui para saber mais.
Notícia
Café com Bioeconomia #30: Um olhar sobre a produção de moléculas na bioeconomia
A edição do dia 24 de maio de 2023 do Café com Bioeconomia reuniu Daniela Trivella (Coordenadora da plataforma de Descoberta de Fármacos do LNBio, do CNPEM), Lígia Macedo (Pró-reitora de pesquisa e pós-graduação da UFMS e Coordenadora geral do Agrotec) e Lucio Freitas Junior (Gerente de projetos da CEINFAR, da USP). O encontro, que acontece quinzenalmente, foi mediado por Reinaldo Lucena (Diretor da Agrotec – Bioeconomia no Agronegócio).
Reinaldo questionou os participantes sobre o cenário atual e sobre as perspectivas de uso da biodiversidade na descoberta de novos fármacos. Além disso, ao abordar os bancos de moléculas, destacou que a maior biblioteca que temos atualmente, a de conhecimento tradicional dos povos originários, ainda é muito pouco explorada. Reinaldo abordou ainda a importância da criação da Rede MCTI/Embrapii de Bioeconomia e indicou a necessidade de se formar profissionais voltados à indústria para que haja futuramente maior estímulo à criação e manutenção de centros de PD&I dentro das empresas.
Daniela ressaltou que a biodiversidade e a quimiodiversidade são peças-chave para a descoberta de novos fármacos, mas que o Brasil ainda não é suficientemente ativo nesse aspecto. Somente nos últimos 10 anos o país começou a investir mais expressivamente em inovação radical na área. Segundo ela, a Embrapii é um dos principais motivos para esse desenvolvimento já que, antes, os financiamentos disponíveis não eram compatíveis com os prazos e investimentos requeridos para as pesquisas farmacêuticas. Daniela destacou ainda a importância de elaborar bibliotecas formatadas e padronizadas para atrair ainda mais empresas para os centros de P&D.
Lígia comentou sobre a dificuldade de levar os produtos ao mercado e sobre a necessidade de sair do ostracismo. Para ela, os grandes centros de pesquisa precisam mostrar que possuem a capacidade para resolver os problemas da indústria e, com isso, expandir desenvolvimentos para além do laboratório. Lígia destacou ainda a criação de uma biblioteca de peptídeos, os quais são quase completamente advindos da biodiversidade.
Lucio informou que a indústria farmacêutica sempre explorou mais a química sintética, deixando a biodiversidade em segundo plano devido à maior complexidade. No entanto, isso começou a mudar nos últimos anos. Nesse sentido, Lucio discursou sobre a importância da Rede MCTI/Embrapii de Bioeconomia na criação de novas oportunidades. Ele destacou também que, no Brasil, o conhecimento é gerado para a publicação de artigos, o que precisa ser mudado, para avançarmos no desenvolvimento de novos fármacos.
O Café com Bioeconomia é um evento quinzenal, on-line e interativo, no qual palestrantes e público discutem temas relevantes para a área. Quer receber nossa agenda e participar? Inscreva-se em: https://portaldebioeconomia.com/
Quer ouvir este e outros Cafés? Estamos no Spotify em Café com Bioeconomia.
Notícia
ABIHPEC organiza webinar sobre bioeconomia no setor de HPPC
A ABIHPEC irá promover um webinar no dia 20 de junho de 2023 sobre oportunidades e desafios da bioeconomia no setor de HPPC.
Para se inscrever, clique aqui.
Notícia
Café com Bioeconomia #31: Oportunidades e desafios da bioeconomia na indústria farmacêutica
A edição do dia 7 de junho de 2023 do Café com Bioeconomia reuniu Cristina Ropke (Diretora de inovação da Centroflora), Julino Rodrigues (Consultor de inteligência de mercado da ABIQUIFI) e Mário Frota Júnior (Sócio-fundador e diretor-presidente da Regenera Moléculas do Mar). O encontro, que acontece quinzenalmente, foi mediado por Eamim Squizani (Pesquisadora do Instituto SENAI de Inovação em Biossintéticos e Fibras do SENAI CETIQT).
Eamim solicitou aos participantes que tecessem comentários sobre a percepção de cada um acerca do investimento em P&D pela indústria farmacêutica nos últimos anos. Ela ressaltou a necessidade de inovar de maneira contínua, especialmente hoje no contexto em que os produtos não costumam ficar no auge por muito tempo. As oportunidades de fomento e o engajamento do setor industrial foram pontos recorrentes ao longo da discussão.
Cristina observou que nos últimos 3 anos houve mudança significativa no setor farmacêutico, pois as empresas estão investindo mais nos projetos de maior risco. Ela acredita que isso possa ser devido às oportunidades de fomento, que evoluíram e atualmente auxiliam nas parcerias para inovação, mas também porque há perspectiva de que os medicamentos genéricos deixem de ser tão interessantes no futuro. Cristina também comentou sobre a importância da legislação de acesso a patrimônio genético e sua missão de encontrar modelos econômicos maduros que beneficiem a todos.
Julino frisou que as ações de engajamento das empresas precisam ser contínuas e que é necessário agir com responsabilidade, pois tudo deixa marcas que irão refletir nas comunidades e nas políticas públicas. Ele também comentou que há muitas políticas que não olham para toda a cadeia e acabam por não conectar todas as etapas. Para resolver essa questão ele sugeriu conversas com as empresas e associações. Julino explicou ainda que considera importante que haja regulações mais ajustadas às empresas que investem em bioeconomia, de maneira que a discussão precisa ser levada ao governo.
Mário comentou sobre a grande cobrança para que os projetos deem resultados rápido e sobre o momento em que percebeu que a Regenera não poderia ser somente focada em fármacos devido à complexidade e morosidade dos desenvolvimentos. Nesse sentido, completou dizendo que o Brasil precisa melhorar o arcabouço regulatório e tributário de maneira a beneficiar quem está trabalhando com bioeconomia. Para ele, a inovação é na maioria das vezes incremental e não disruptiva, pois os empresários não querem comprar o risco. No entanto, assim como Cristina, Mário também percebeu movimento de aumento nos investimentos. Ele acredita que a edição gênica irá despontar como tendência para geração de moléculas e para o setor agro.
O Café com Bioeconomia é um evento quinzenal, on-line e interativo, no qual palestrantes e público discutem temas relevantes para a área. Quer receber nossa agenda e participar? Inscreva-se em: https://portaldebioeconomia.com/
Quer ouvir este e outros Cafés? Estamos no Spotify em Café com Bioeconomia.
Notícia
Hidrogênio verde pode ser segredo para zerar emissões na siderugia
A substituição do carvão pelo hidrogênio verde pode fazer com que a indústria de aço cumpra com as metas globais de emissões de gases até 2040.
Clique aqui para ler a notícia completa.
Notícia
Roadmap de créditos de biodiversidade é lançado para mobilizar financiamento global da natureza
Secretário de Meio Ambiente e Ministro de Estado francês lançaram em junho de 2023 um roadmap com objetivo de mobilizar o financiamento global da recuperação da natureza.
Clique aqui para mais informações.
Notícia
Evento discute propostas para superar desafios acerca do desenvolvimento sustentável da Amazõnia
Especialistas discutiram desenvolvimento sustentável da Amazônia em evento que está disponível no Youtube.
Para assistir, clique aqui.
Notícia
Beneficiamento do latex toma novos rumos nas mãos de mulheres no Pará
Comunidade ribeirinha no Pará deixa de ser fornecedora de látex e passa a beneficiar o material, produzindo bolsas e roupas com couro ecológico além de biojóias. A máquina que automatizou o beneficiamento vem trazendo muitos beneficios à localidade.
Clique aqui para ler a notícia completa.
Notícia
Café com Bioeconomia #32: O cooperativismo na construção da bioeconomia dos biomas
A edição do dia 21 de junho de 2023 do Café com Bioeconomia reuniu Eduardo Rocha (Consultor, facilitador e Gerente de Engajamento da Plataforma PPA), Marcelo Fukunaga (Diretor executivo da Coopafasb) e Valdivino Araújo (Sócio-fundador da Coopes). O encontro, que acontece quinzenalmente, foi mediado por José Vitor Bomtempo (Coordenador do GEBio da Escola de Química da UFRJ).
José Vitor iniciou relembrando uma série de seis episódios do Café com Bioeconomia sobre os diferentes biomas brasileiros e destacando que no Café de cooperativas o olhar seria inter-biomas. Ao longo do evento os participantes foram questionados sobre os desafios para o desenvolvimento das cadeias representadas por cada um e provocados a refletir sobre como seria a atuação de suas respectivas instituições se estivessem inseridas em outros biomas. A presença de mulheres e jovens nas cooperativas também foi tema da discussão.
Eduardo apontou que na Amazônia há muitas questões estruturantes como fatores limitantes, seja na questão logística, de acesso ou comunicação. Então, segundo ele, torna-se muito importante produzir as coisas localmente e fortalecer quem está na base por meio do ato cooperativo. Para Eduardo, as mulheres na Amazônia são as grandes responsáveis pela detenção e transmissão do conhecimento local, além de estarem envolvidas na etapa de produção e em outros processos essenciais. Sobre a permanência do jovem nas comunidades, ele destacou que a PPA procura fortalecer modelos de governança participativos em que estejam presentes mulheres, idosos e jovens.
Marcelo explicou que a Mata Atlântica é muito rica em frutas nativas nutritivas pouco conhecidas. Um exemplo é o fruto da juçara, que no estado de São Paulo quase foi extinto por causa da extração do palmito. A Coopafasb realizou trabalho de criação de cadeia de valor do fruto preservando o meio ambiente e empregando o sistema de cooperação. Marcelo comentou que no âmbito da pesquisa, especialmente falando de agroecologia, faltam estudos, e que na extensão rural faltam políticas públicas para auxiliar no desenvolvimento, embora perceba que com boa articulação e atuação em rede, essas políticas começam a ser construídas.
Valdivino, que representou a Caatinga com a Coopes, e tem como carro-chefe o licuri, indicou que pouco mais de 80% da organização é composta por mulheres, inclusive em cargo de diretoria. Além disso, esclareceu que desde o início da cooperativa a presença de parceiros estratégicos foi o que viabilizou o desenvolvimento da cadeia, até mesmo colocando o licuri no ramo farmacêutico. Ele destacou também, que independente do bioma, realizar o desenvolvimento econômico garantindo a preservação da espécie e da cultura do povo, e inserindo as famílias de baixa renda das comunidades tradicionais é sempre um desafio. Valdivino finalizou salientando que as trocas de experiências e parcerias são muito enriquecedoras e estimulando os participantes a fazerem intercâmbio para conhecerem as realidades de outras cooperativas.
O Café com Bioeconomia é um evento quinzenal, on-line e interativo, no qual palestrantes e público discutem temas relevantes para a área. Quer receber nossa agenda e participar? Inscreva-se em: https://portaldebioeconomia.com/
Quer ouvir este e outros Cafés? Estamos no Spotify em Café com Bioeconomia.
Notícia
Café com Bioeconomia #33: Oportunidades e desafios da bioeconomia na indústria de embalagens
A edição do dia 5 de julho de 2023 do Café com Bioeconomia reuniu André Badaró (Gerente de desenvolvimento de mercado da Klabin), José Alexandre Simão (Pesquisador líder de projetos de inovação da UNIPAC) e Stelvio Mazza (CEO da Já Fui Mandioca!). O encontro, que acontece quinzenalmente, foi mediado por Manoel Lisboa Neto (Diretor da Plasticxperience).
Manoel abordou a competitividade brasileira em relação a outros países, além dos principais trade-offs entre uso de materiais biodegradáveis e renováveis e a disponibilidade de recursos naturais para a produção de embalagens em grande escala. Ele lembrou ainda que, há cerca de 20 anos, o Brasil não tinha agenda de sustentabilidade tão forte e indagou se o cenário atual possui a capacidade de fomentar a bioeconomia.
Para André, o que impulsiona a bioeconomia é o mercado e, nesse sentido, é necessário haver mais conscientização da população para que os valores dos produtos, que muitas vezes não são competitivos com os de origem fóssil, possuam maior aceitação. Para ele, é papel da indústria otimizar os processos para melhorar desempenho e reduzir custos, mas o governo pode auxiliar na sensibilização da população quanto aos impactos ambientais daquilo que consome. André comentou também que a Klabin vem estudando o uso de nanotecnologia para aprimorar propriedades de barreira do papel.
José Alexandre acredita ser necessário migrar do modelo de economia linear para circular. Ele destacou a grande complexidade social existente no Brasil, que configura um obstáculo para impulsionar o mercado, e citou o uso de ferramentas de análise de ciclo de vida como indicador do desempenho ambiental dos produtos. José falou ainda sobre como o conceito de biorrefinarias chegou para romper com o receio de competição com alimentos a partir do aproveitamento integral da biomassa.
Stelvio, por sua vez, abordou a dificuldade da Já Fui Mandioca em competir com o mercado de plásticos, devido aos desafios adicionais inerentes ao uso de materiais naturais e ao fato de não haver ainda ecossistemas desenvolvidos para os produtos. Ele acredita que o Brasil está atrasado tanto no uso de matérias-primas quanto na etapa de transformação de embalagens renováveis, pois o país possui dificuldades em seu ambiente de negócios, o que gera empecilhos também à inovação.
O Café com Bioeconomia é um evento quinzenal, on-line e interativo, no qual palestrantes e público discutem temas relevantes para a área. Quer receber nossa agenda e participar? Inscreva-se em: https://portaldebioeconomia.com/
Quer ouvir este e outros Cafés? Estamos no Spotify em Café com Bioeconomia.
Notícia
Produção de biocombustível a partir de tamarindo é tema de pesquisa do Cetep
Polpa de tamarindo fermentada é utilizada na produção de etanol pelo Cetep.
Para ler a notícia na íntegra, clique aqui
Notícia
Pesquisadores criam concreto sustentável feito de bagaço de cana
Apelidado de Sugarcrete, concreto ssustentável feito de bagaço de cana promete emitir 20 vezes menos carbono que o convencional.
Para ler a notícia completa, clique aqui.
Notícia
Café com Bioeconomia #34: Rumo à transição verde: A integração de cadeias produtivas como agente transformador
A edição do dia 19 de julho de 2023 do Café com Bioeconomia reuniu Edvaldo de Morais (Líder da Divisão de Biorrefinarias & Recursos Naturais do LNBR do CNPEM) e Mateus Chagas (Pesquisador da Divisão de Biorrefinarias & Recursos Naturais do LNBR do CNPEM). O encontro, que acontece quinzenalmente, foi mediado por Patrícia Toledo (Gerente de Inovação e da Unidade Embrapii Biotecnologia do CNPEM).
Patrícia indagou os participantes sobre o papel real do hidrogênio na transição verde no contexto brasileiro e sobre a importância da diversificação de portfólio de produtos das empresas. Os principais gargalos enfrentados pela indústria para a integração das cadeias produtivas também foram discutidos durante o evento, bem como o propósito das análises de ciclo de vida como suporte para a transição para uma economia mais circular e sustentável. Os participantes também foram questionados sobre como as biorrefinarias podem contribuir com o desenvolvimento regional do país fora do eixo sul-sudeste e sobre como a exploração da biodiversidade está sendo vista pela indústria.
Edvaldo ressaltou que o hidrogênio tem papel fundamental na estratégia brasileira como gerador de energia, mas mais ainda como insumo, especialmente para a siderurgia e para a produção de fertilizantes. Ele indicou que além das análises de ciclo de vida, que foram sendo incorporadas aos serviços do CNPEM, agora são disponibilizados serviços de avaliação ecossistêmica, que analisam o uso racional de recursos naturais, além de modelar os ecossistemas. Para ele, o Brasil tem oportunidade única de exploração da diversidade biológica, e nesse sentido, Patrícia complementou informando que o CNPEM está mapeando bancos de dados da biodiversidade brasileira.
Mateus indicou que explorar outras possibilidades de incorporação do hidrogênio como insumo nas cadeias produtivas pode ser interessante para o país. Para ele, as soluções mais interessantes para Europa e EUA podem não ser as mais vantajosas para o Brasil e que, mesmo dentro do país, é importante avaliar as características de cada região. Em termos de biodiversidade, Mateus citou o uso da macaúba como exemplo de espécie nativa que pode ser usada no desenvolvimento de produtos de alto valor agregado. Mateus discutiu ainda que plantas industriais relacionadas à bioeconomia são, muitas vezes, pioneiras. Dessa maneira, a viabilidade econômica e a resistência à inovação foram indicadas por ele como alguns dos gargalos principais para a integração das cadeias produtivas.
O Café com Bioeconomia é um evento quinzenal, on-line e interativo, no qual palestrantes e público discutem temas relevantes para a área. Quer receber nossa agenda e participar? Inscreva-se em: https://portaldebioeconomia.com/
Quer ouvir este e outros Cafés? Estamos no Spotify em Café com Bioeconomia.
Notícia
Inscrições abertas para projeto "Amazônia em Casa, Floresta em Pé" até 31 de julho
O programa "Amazônia em Casa, Floresta em Pé" irá selecionar até 50 negócios que comercializem produtos da Amazônia e estejam focados em manter a floresta de pé. As incrições vão até dia 31 de julho de 2023. Para se inscrever, clique aqui.
Notícia
Café com Bioeconomia #35: Infraestrutura de pesquisa para a bioeconomia
A edição do dia 2 de agosto de 2023 do Café com Bioeconomia reuniu Cristiano Guimarães (Fundador e CSO na Nintx), Francisco Razzolini (CTO da Klabin) e Patrícia Léo (Gerente técnica do Laboratório de Biotecnologia Industrial do IPT). O encontro, que acontece quinzenalmente, foi mediado por Paulo Coutinho (Pesquisador-chefe do Instituto SENAI de Inovação em Biossintéticos e Fibras do SENAI CETIQT).
Paulo iniciou a discussão questionando os participantes sobre a relação entre ICTs e empresas e sobre a situação atual do Brasil em termos de infraestrutura para pesquisa em bioeconomia. Ao longo da conversa foram levantadas possíveis ações para solucionar a escassez de equipamentos, particularmente em escala piloto no país. Paulo destacou que o Brasil não conhece plenamente sua biodiversidade e comentou que além de haver uma série de bancos de dados de moléculas no país que não são compatíveis entre si, a descoberta das moléculas requer grande esforço de automação. Nesse sentido, ele citou uma nota técnica que será lançada pelo Instituto SENAI de Inovação em Biossintéticos e Fibras sobre o que está sendo chamado de biodiversity business discovery, e consiste na criação de diferentes pipelines para identificar compostos de interesse para diferentes setores industriais.
Cristiano pontuou que um dos desafios para os empreendedores e prestadores de serviço é inconstância das demandas por parte das empresas. Segundo ele, torna-se difícil custear os investimentos sem essa regularidade. Por isso, a Nintx possui parceria com o CNPEM, um dos únicos centros no Brasil capazes de auxiliar com a bioprospecção de suas moléculas. Cristiano ressaltou ainda que é necessário pensar a longo prazo para gerar projetos mais disruptivos, que realmente transformem o país.
Francisco enumerou uma série de iniciativas da Klabin em inovação e indicou que o Brasil evoluiu muito ao longo dos anos em termos de competências, mas ainda precisa evoluir em questões de suporte e infraestrutura, apesar de hoje já direcionar esforços para isso. Para ele, é mais interessante realizar projetos no país ao invés de no exterior, pois há uma carga de impostos muito pesada para contratações internacionais.
Para Patrícia, o escalonamento dos processos ainda é um desafio, particularmente para organismos geneticamente modificados. Nesse sentido, considera fundamental haver mais sinergia entre organizações públicas e privadas para viabilizar avanços nesse aspecto.
O Café com Bioeconomia é um evento quinzenal, on-line e interativo, no qual palestrantes e público discutem temas relevantes para a área. Quer receber nossa agenda e participar? Inscreva-se em: https://portaldebioeconomia.com/
Quer ouvir este e outros Cafés? Estamos no Spotify em Café com Bioeconomia.
Notícia
Instituto SENAI de Inovação em Biossintéticos e Fibras desenvolve biocorante azul
O Instituto SENAI de Inovação em Biossintéticos e Fibras desenvolveu biocorante azul, que pode substituir o índigo. O processo consiste em alterativa sustentável para a indústria têxtil e cosmética. Para ler mais, clique aqui.