Meu Perfil
Meu Perfil
Título da Página
The following has evaluated to null or missing: ==> autorId [in template "34764#34807#41127" at line 71, column 46] ---- Tip: If the failing expression is known to legally refer to something that's sometimes null or missing, either specify a default value like myOptionalVar!myDefault, or use <#if myOptionalVar??>when-present<#else>when-missing</#if>. (These only cover the last step of the expression; to cover the whole expression, use parenthesis: (myOptionalVar.foo)!myDefault, (myOptionalVar.foo)?? ---- ---- FTL stack trace ("~" means nesting-related): - Failed at: #if autorId != "" && autorId?? [in template "34764#34807#41127" at line 71, column 41] ----
1<#assign JournalArticleLocalService = serviceLocator.findService("com.liferay.journal.service.JournalArticleLocalService")>
2<#assign UserLocalService = serviceLocator.findService("com.liferay.portal.kernel.service.UserLocalService")>
3<#assign AssetCategoryLocalService = serviceLocator.findService("com.liferay.asset.kernel.service.AssetCategoryLocalService")>
4<#assign
5mbMessageLocalService = serviceLocator.findService("com.liferay.message.boards.service.MBMessageLocalService")
6 tagsLocalService = serviceLocator.findService("com.liferay.asset.kernel.service.AssetTagLocalService")
7 OrganizationLocalService = serviceLocator.findService("com.liferay.portal.kernel.service.OrganizationLocalService")
8>
9
10
11<div class="bioec-profile-demanda-main">
12 <div id="demanda-lista-container" class="d-flex flex-column">
13 <#if entries?has_content>
14 <#list entries as entry>
15 <#assign journalArticle = JournalArticleLocalService.getLatestArticle(entry.getClassPK()) >
16 <#assign JournalArticleID = journalArticle.getId()>
17 <#assign JournalArticleFrontId = journalArticle.getArticleId()>
18 <#assign articleXml = journalArticle.getDocument().getRootElement()
19 userIsAdmin = false
20 orgId = ""
21 >
22
23 <#assign nomeParaContato = "">
24
25 <#if articleXml.selectSingleNode("dynamic-element[@field-reference='Text77253735']")??>
26
27 <#assign nomeParaContato = articleXml.selectSingleNode("dynamic-element[@field-reference='Text77253735']").getStringValue()!""
28 nomeParaContato = nomeParaContato?replace("\n\t\t", "")
29 nomeParaContato = nomeParaContato?replace("\n\t", "")
30 >
31
32 </#if>
33 <#if articleXml.selectSingleNode("dynamic-element[@field-reference='Text94974146']")??>
34 <#assign telefone = articleXml.selectSingleNode("dynamic-element[@field-reference='Text94974146']").getStringValue()!""
35 telefone = telefone?replace("\n\t\t", "")
36 telefone = telefone?replace("\n\t", "")
37 >
38 </#if>
39
40 <#if articleXml.selectSingleNode("dynamic-element[@field-reference='Text68569631']")??>
41 <#assign email = articleXml.selectSingleNode("dynamic-element[@field-reference='Text68569631']").getStringValue()!""
42 email = email?replace("\n\t\t", "")
43 email = email?replace("\n\t", "")
44 >
45 </#if>
46
47 <#if articleXml.selectSingleNode("dynamic-element[@field-reference='CopyOfCopyOfText18267936']")??>
48 <#assign desc = articleXml.selectSingleNode("dynamic-element[@field-reference='CopyOfCopyOfText18267936']").getStringValue()!""
49 desc = desc?replace("\n\t\t", "")
50 desc = desc?replace("\n\t", "")
51 >
52 </#if>
53 <#if articleXml.selectSingleNode("dynamic-element[@field-reference='Text97565506']")??>
54 <#assign imagem = articleXml.selectSingleNode("dynamic-element[@field-reference='Text97565506']").getStringValue()!""
55 imagem = imagem?replace("(\r\n)+", "",'r')
56 imagem = imagem?replace(" ", "",'r')
57 >
58 </#if>
59 <#if articleXml.selectSingleNode("dynamic-element[@field-reference='Text99746569']")??>
60 <#assign
61 autorId = articleXml.selectSingleNode("dynamic-element[@field-reference='Text99746569']").getStringValue()!""
62 autorId = autorId?replace("\n\t\t", "")
63 autorId = autorId?replace("\n\t", "")
64 autorArticleId = ""
65 >
66 </#if>
67 <#assign
68 commentsCount = mbMessageLocalService.getDiscussionMessagesCount(entry.getClassName(), entry.getClassPK(), 0)!"0"
69 >
70
71 <#if autorId != "" && autorId??>
72 <#assign
73 autor = UserLocalService.fetchUser(autorId?number)!""
74 autorArticleId = autor.getExpandoBridge().getAttribute("journal-article")!"0"
75 />
76 <#if autor != "">
77 <#assign autor = autor.getFullName()!"">
78 <#else>
79 <#assign autor = "Anônimo" >
80 </#if>
81 <#else>
82 <#assign autor = "Anônimo" >
83 </#if>
84 <#assign categorias = AssetCategoryLocalService.getCategoryNames(entry.getClassName(), entry.getClassPK())!"" >
85 <#assign urlWC = "">
86 <#if autorArticleId != "0" && autorArticleId != "" && autor != "Anônimo">
87 <#assign autorArticle = JournalArticleLocalService.getLatestArticle(themeDisplay.getLayout().getGroupId(), autorArticleId?string) >
88 <#assign urlWC = autorArticle.getUrlTitle()!"">
89 </#if>
90
91 <#assign tags = tagsLocalService.getTagNames("com.liferay.journal.model.JournalArticle", journalArticle.getResourcePrimKey()?number )
92 tagName = tags[0]!""
93 orgOrUser = ""
94 >
95
96 <#if tagName?contains("organization") && tagName != "" >
97 <#assign orgOrUser = "org">
98 <#else>
99 <#assign orgOrUser = "user">
100 </#if>
101
102 <#if orgOrUser == "org" >
103
104 <#assign
105 orgId = tagName?keep_after("organization-")
106 organization = OrganizationLocalService.fetchOrganization(orgId?number)!""
107 >
108
109
110 <#if organization != "" && autor != "Anônimo">
111
112 <#assign orgArticleId = organization.getExpandoBridge().getAttribute("journal-article")
113 orgJournalArticle = JournalArticleLocalService.getArticle(themeDisplay.getLayout().getGroupId(),orgArticleId?c)
114 urlWC = orgJournalArticle.getUrlTitle()!""
115 autor = organization.getName()!""
116 >
117
118 </#if>
119 </#if>
120
121 <#if themeDisplay.isSignedIn() >
122 <#if tagName?contains("organization-")>
123 <#assign userIsAdmin = OrganizationLocalService.hasUserOrganization(themeDisplay.getUserId(), orgId?number)>
124 <#else>
125 <#if autorId?number == themeDisplay.getUserId()>
126 <script>console.log("oi");</script>
127 <#assign userIsAdmin = true>
128 </#if>
129 </#if>
130
131
132 </#if>
133
134
135
136 <div class="demanda-lista-item">
137
138 <div class="lista-checkmark">
139 <#if categorias?seq_contains("aprovado") > <i title="Aprovado" style="color: #4ECD66" class="fa-solid fa-circle-check"></i> </#if>
140 <#if categorias?seq_contains("pendente") > <i title="Em análise" style="color: #D90000"class="fa-solid fa-spinner"></i> </#if>
141 <#if categorias?seq_contains("recusado") > <i title="Recusado" style="color: #D90000"class="fa-solid fa-exclamation-circle"></i> </#if>
142 </div>
143
144
145 <div class="lista-titulo">
146 <h5>${entry.getHighlightedTitle()}</h5>
147 </div>
148
149 <div class="lista-arrow">
150 <button style="padding: 0;" class="btn" type="button" data-toggle="collapse" data-target="#collapseID${entry.getClassPK()}" aria-expanded="false" aria-controls="collapseID${entry.getClassPK()}">
151 <i class="fa-solid fa-chevron-down"></i>
152 </button>
153 </div>
154
155 <div class="lista-desc">
156 <p>${desc}</p>
157 </div>
158
159 <div class="lista-collapse collapse" id="collapseID${entry.getClassPK()}">
160 <#if nomeParaContato != "" || telefone != "" || email != "" || imagem?trim !="">
161 <div class="lista-details">
162 <div class="lista-pic">
163 <i class="fa-solid fa-image-slash"></i>
164 <#if imagem?trim !="" >
165 <img class="bioec_demanda_img" src="${imagem}">
166 <#else>
167 <div class="bioec_demanda_img_placeholder">
168 <i class="fa-solid fa-image"></i>
169 sem imagem
170 </div>
171 </#if>
172 </div>
173 <#if nomeParaContato != "" || telefone != "" || email != "" >
174 <div class="lista-contato">
175 <p>Contato</p>
176 <p class="lista-author">${nomeParaContato}</p>
177 <p class="lista-phone">${telefone}</p>
178 <p class="lista-email">${email}</p>
179 </div>
180 </#if>
181 </div>
182 </#if>
183
184 <#if categorias?seq_contains("recusado") >
185 <div style="border-top: 1px solid #E8ECEF; font-weight: bold; padding-top: 24px;">
186 <p>Conteúdo Em Análise Pelo Cetiqt:</p>
187 <p>Conteúdo recusado pelo CETIQT por violar as políticas de privacidade.</p>
188 </div>
189 </#if>
190 <div class="lista-footnote">
191 <div>
192 <span class="lista-date">${journalArticle.getDisplayDate()?string('dd/MM/yyyy')}</span> | <span class="lista-commentNumber">${commentsCount} cometários</span> <span class="barra-pipe"> | </span> <span class="lista-author">Publicado por <a <#if urlWC != ''>href="/w/${urlWC}</#if>">${autor}</a></span>
193 </div>
194 <#if userIsAdmin>
195 <div class="buttonsActions">
196 <div style="cursor: pointer;font-size: 16px;" data-toggle="modal" data-target="#modalDemanda${JournalArticleID}">
197 <i class="fa-solid fa-edit"></i>
198 </div>
199 <div style="cursor: pointer;font-size: 16px;" data-toggle="modal" data-target="#modal-demanda-${entry.getClassPK()}">
200 <i class="fa-solid fa-trash-can"></i>
201 </div>
202
203 </div>
204 </#if>
205 </div>
206 </div>
207 </div>
208
209 <#if userIsAdmin>
210 <div style="display: none;" id="modal-demanda-${entry.getClassPK()}" class="modal fade" role="dialog">
211 <div class="modal-dialog modal-lg" role="document">
212 <div class="modal-content">
213 <div class="modal-header" >
214 <h4 class="m-0">Remover Demanda</h4>
215 <button type="button" class="close" data-dismiss="modal" aria-label="Close">
216 <span aria-hidden="true">
217 <i class="fa-solid fa-close"></i>
218 </span>
219 </button>
220 </div>
221 <div class="modal-body">
222 <h5>Você tem certeza que deseja remover essa demanda?</h5>
223 <div>
224 Ao clicar em continuar, a demanda será removida do seu perfil.
225 </div>
226 </div>
227 <div class="modal-footer justify-content-end">
228 <button class="bioec_secondary_button" data-dismiss="modal">CANCELAR</button>
229 <button class="bioec_primary_button" type="button" onclick="excluirDemanda(${JournalArticleFrontId}, ${orgId})">CONTINUAR</button>
230 </div>
231 </div>
232 </div>
233 </div>
234
235 <#-- modal edição -->
236
237
238 <div style="display: none;" id="modalDemanda${JournalArticleID}" class="modal fade bioec-profile-demanda-modal modalDemanda" role="dialog">
239 <div class="modal-dialog modal-lg" role="document">
240 <form id="formularioDemanda${JournalArticleID}" class="form-group modal-content formularioDemanda">
241 <div id="demandaModal-l1${JournalArticleID}" class="modal-header demandaModal-l1">
242 <h5>Adicionar demanda</h5>
243 <button type="button" class="close" data-dismiss="modal" aria-label="Close">
244 <span aria-hidden="true">×</span>
245 </button>
246 </div>
247 <div id="demandaModal-l2${JournalArticleID}" class="modal-body demandaModal-l2">
248 <div id="demandaTitle${JournalArticleID}" class="demandaTitle">
249 <label class="ReqLabel" for="demandaInputTitle${JournalArticleID}">Título da demanda</label>
250 <input id="demandaInputTitle${JournalArticleID}" value="${entry.getHighlightedTitle()}" type="text" placeholder="Inserir um título" required>
251 </div>
252 <div id="demandaName${JournalArticleID}" class="demandaName">
253 <label class="" for="demandaInputName${JournalArticleID}">Nome para contato</label>
254 <input value="${nomeParaContato}" id="demandaInputName${JournalArticleID}" placeholder="Inserir nome" type="text">
255 </div>
256 <div id="demandaTelephone${JournalArticleID}" class="demandaTelephone">
257 <label class="" for="demandaInputPhone${JournalArticleID}">Telefone para contato</label>
258 <input value="${telefone}" id="demandaInputPhone${JournalArticleID}" name="demandaInputPhone" type="text" placeholder ='(__)_____-_____' minlength="14" />
259 </div>
260 <div id="demandaEmail${JournalArticleID}" class="demandaEmail">
261 <label class="" for="demandaInputEmail${JournalArticleID}">E-mail para contato</label>
262 <input value="${email}" id="demandaInputEmail${JournalArticleID}" placeholder="Inserir e-mail" type="text">
263 </div>
264 <div id="demandaDesc${JournalArticleID}" class="demandaDesc">
265 <label class="ReqLabel" for="demandaInputDesc${JournalArticleID}">Descrição</label>
266 <textarea id="demandaInputDesc${JournalArticleID}" style="max-width: 100%;font-size: 16px;height: 80px;border: 1px solid #BEBEBE;" required>${desc}</textarea>
267 </div>
268 <div id="demandaImg${JournalArticleID}" class="demandaImg">
269 <div style="display: flex; flex-direction: column; gap: 8px">
270 <label>Imagem da demanda (Máx. 10 MB)</label>
271 <label class="btn carregarImagem" id="carregarImagem${JournalArticleID}" for="inputCarregarImagemDemanda${JournalArticleID}" style="font-size: 16px; cursor: pointer;">CARREGAR IMAGEM</label>
272 <input class="inputCarregarImagemDemanda" id="inputCarregarImagemDemanda${JournalArticleID}" type="file" accept="image/*" onchange="encodeDemandaImageAsURL${JournalArticleID}(this)">
273 <input class="d-none" id="inputDemandaBase64${JournalArticleID}" value="${imagem}" />
274 <div class="imagemCarregadaDemanda imagemCarregadaDemanda${JournalArticleID} d-md-none d-block" style="background-image: url(${imagem})"></div>
275 <button type="button" id="removerImagemDemanda${JournalArticleID}" class="<#if imagem == "" || imagem?? == false> d-none </#if> removerImagemDemanda" >
276 <i class="fa fa-trash"></i> Remover imagem
277 </button>
278 </div>
279 <div class="imagemCarregadaDemanda imagemCarregadaDemanda${JournalArticleID} d-md-block d-none" style="background-image: url(${imagem})"></div>
280 </div>
281 </div>
282 <div class="TextImportant">
283 <p>
284 Importante: O conteúdo enviado passará por um processo interno de aprovação. Só então o conteúdo adicionado aparecerá no portal.
285 </p>
286 </div>
287
288 <div id="demandaModal-l3${JournalArticleID}" class="modal-footer demandaModal-l3">
289 <button class="btn button-empty" onclick="" id="demandas-saveAndClose${JournalArticleID}">SALVAR E FECHAR</button>
290 </div>
291 </form>
292 </div>
293 </div>
294
295 </#if>
296 <#--
297
298
299
300
301 <div style="display: none;" id="modalInfra${JournalArticleID}" class="modal fade bioec-profile-infra-modal" role="dialog">
302 <div class="modal-dialog modal-lg" role="document">
303
304 <form class="form-group modal-content" id="formularioInfraestrutura${JournalArticleID}">
305 <div id="infraModal-l1-${JournalArticleID}" class="modal-header infraModal-l1" >
306 <h5>Adicionar Infraestrutura</h5>
307 <button id="fecharModal${JournalArticleID}" type="button" class="close" data-dismiss="modal" aria-label="Close">
308 <span aria-hidden="true">×</span>
309 </button>
310 </div>
311 <div id="infraModal-l2-${JournalArticleID}" class="modal-body infraModal-l2">
312 <div id="infraName${JournalArticleID}" class="infraName">
313 <label class="ReqLabel" for="inputInfraName${JournalArticleID}">Nome da infraestrutura</label>
314 <input type="text" id="inputInfraName${JournalArticleID}" value="${entry.getHighlightedTitle()}" placeholder="Nome da infraestrutura" required>
315 </div>
316 <div id="infraModel${JournalArticleID}" class="infraModel">
317 <label class="ReqLabel" for="inputInfraModel${JournalArticleID}">Modelo</label>
318 <input type="text" id="inputInfraModel${JournalArticleID}" value="${modelo}" placeholder="Modelo" required>
319 </div>
320 <div id="infraBrand${JournalArticleID}" class="infraBrand">
321 <label class="ReqLabel" for="inputInfraBrand${JournalArticleID}">Marca</label>
322 <input type="text" id="inputInfraBrand${JournalArticleID}" value="${marca}" placeholder="Marca" required>
323 </div>
324
325 <div id="infraImg${JournalArticleID}" class="infraImg">
326 <div style="display: flex; flex-direction: column; gap: 8px">
327 <label>Imagem da infraestrutura (Máx. 10 MB)</label>
328 <label class="bioec_secondary_button" id="carregarImagem${JournalArticleID}" for="inputCarregarImagemInfra${JournalArticleID}" style="font-size: 16px;color: #333244;align-self:start;">
329 CARREGAR IMAGEM
330 </label>
331 <input id="inputCarregarImagemInfra${JournalArticleID}" class="inputCarregarImagemInfra" type="file" accept="image/*" onchange="encodeInfraImageAsURL${JournalArticleID}(this)">
332 <input class="d-none" id="inputInfraBase64${JournalArticleID}" />
333 <div class="imagemCarregadaInfra${JournalArticleID} d-md-none d-block"></div>
334 <button type="button" id="removerImagemInfra${JournalArticleID}" class="d-none removerImagemInfra" >
335 <i class="fa fa-trash"></i> Remover imagem
336 </button>
337 </div>
338 <div class="imagemCarregadaInfra${JournalArticleID} d-md-block d-none"></div>
339 </div>
340
341 <div id="infraFunction${JournalArticleID}" class="infraFunction">
342 <label class="ReqLabel" for="inputInfraFunction${JournalArticleID}">Função</label>
343 <input type="text" id="inputInfraFunction${JournalArticleID}" class="inputInfraFunction" value="${funcao}" placeholder="Função" required>
344 </div>
345 </div>
346 <div class="TextImportant">
347 <p>
348 Importante: O conteúdo enviado passará por um processo interno de aprovação. Só então o conteúdo adicionado aparecerá no portal.
349 </p>
350 </div>
351 <div id="infraModal-l3-${JournalArticleID}" class="modal-footer infraModal-l3">
352 <button class="bioec_secondary_button" id="demandas-saveAndClose${JournalArticleID}" onclick="">SALVAR E FECHAR</button>
353 </div>
354 </form>
355
356 </div>
357
358
359 -->
360
361
362
363 <script>
364 <#if userIsAdmin>
365 function excluirDemanda(wcId, orgId) {
366 Liferay.Util.openToast({message: "Enviando requisição",type: "info",title: ""});
367 fetch(Liferay.ThemeDisplay.getPortalURL() + "/o/demanda/" + wcId, {
368 method: 'DELETE',
369 "headers": {
370 "x-csrf-token": Liferay.authToken,
371 "Content-Type": "application/json"
372 }
373 })
374 .then(res => {
375 if(res.status == 200) {
376 Liferay.Util.openToast({
377 message: "Infraestrutura excluida com sucesso",
378 type: "success",
379 title: "",
380 toastProps: {
381 autoClose: 5000
382 }
383 })
384 setTimeout(function(){ location.reload(); }, 2000)
385 } else {
386 Liferay.Util.openToast({
387 message: "Erro ao excluir infraestrutura",
388 type: "danger",
389 title: "",
390 toastProps: {
391 autoClose: 5000
392 }
393 })
394 }
395 });
396 }
397
398
399
400
401 function validImageSize(base64="") {
402 const decoded = atob(base64.substring(base64.indexOf(',') + 1));
403 const sizeMB = decoded.length / 1e+6;
404 console.log("MB: " + decoded.length / 1e+6);
405 if(sizeMB > 10) {
406 Liferay.Util.openToast({
407 message: "O tamanho da imagem não deve ultrapassar 10 MB.",
408 type: "danger",
409 title: "",
410 toastProps: {
411 autoClose: 5000
412 }
413 })
414 return false
415 }
416 return true
417 }
418
419 function encodeDemandaImageAsURL${JournalArticleID}(element) {
420 let file = element.files[0];
421 let reader = new FileReader();
422 reader.onloadend = () => {
423 if(reader.result) {
424 if(!validImageSize(reader.result)) return;
425 try {
426 const base64_input = document.getElementById("inputDemandaBase64${JournalArticleID}")
427 base64_input.value = reader.result
428 Array.from(document.getElementsByClassName("imagemCarregadaDemanda${JournalArticleID}")).forEach( el => el.style.backgroundImage = 'url(' + reader.result + ')' )
429
430 const removeImageButton = document.getElementById("removerImagemDemanda${JournalArticleID}")
431 removeImageButton.classList.remove("d-none")
432 } catch (error) {
433 console.error(error)
434 }
435 }
436 }
437 reader.readAsDataURL(file);
438 }
439
440 function removeImageDemanda${JournalArticleID}() {
441 try {
442 const file_input = document.getElementById("inputCarregarImagemDemanda${JournalArticleID}")
443 Array.from(document.getElementsByClassName("imagemCarregadaDemanda${JournalArticleID}")).forEach( el => el.style.backgroundImage = "" )
444 const base64_input = document.getElementById("inputDemandaBase64${JournalArticleID}")
445 file_input.value = null
446 base64_input.value = ""
447
448 const removeImageButton = document.getElementById("removerImagemDemanda${JournalArticleID}")
449 removeImageButton.classList.add("d-none")
450 } catch (error) {
451 console.error(error)
452 }
453}
454
455
456document.getElementById("removerImagemDemanda${JournalArticleID}").addEventListener("click", removeImageDemanda${JournalArticleID});
457
458<#-- Rest da edição de organização -->
459
460<#if orgOrUser == "org">
461document.querySelector('#formularioDemanda${JournalArticleID}').addEventListener('submit', event => {
462 event.preventDefault();
463 adicionarDemanda${JournalArticleID}();
464});
465
466function adicionarDemanda${JournalArticleID}() {
467 Liferay.Util.openToast({message: "Enviando requisição",type: "info",title: ""});
468 $("#demandas-saveAndClose${JournalArticleID}").prop("disabled",true);
469
470
471
472 const demandaData = {
473 titulo: document.getElementById("demandaInputTitle${JournalArticleID}").value,
474 nomeContato: document.getElementById("demandaInputName${JournalArticleID}").value,
475 telefoneContato: document.getElementById("demandaInputPhone${JournalArticleID}").value,
476 emailContato: document.getElementById("demandaInputEmail${JournalArticleID}").value,
477 descricao: document.getElementById("demandaInputDesc${JournalArticleID}").value,
478 imagem: document.getElementById("inputDemandaBase64${JournalArticleID}").value,
479 }
480
481 console.log(demandaData);
482
483 fetch(Liferay.ThemeDisplay.getPortalURL() + "/o/demanda/${JournalArticleFrontId}", {
484 method: 'PUT',
485 "headers": {
486 "x-csrf-token": Liferay.authToken,
487 "Content-Type": "application/json"
488 },
489 body: JSON.stringify(demandaData)
490 })
491 .then(res => {
492 if(res.status == 200) {
493 Liferay.Util.openToast({
494 message: "Demanda editada com sucesso. Após a submissão, será iniciado o processo interno de aprovação do conteúdo enviado. Só então o conteúdo submetido aparecerá no portal.",
495 type: "success",
496 title: "",
497 toastProps: {
498 autoClose: 5000
499 }
500 })
501 setTimeout(function(){ location.reload(); }, 2000);
502 } else {
503 $("#demandas-saveAndClose${JournalArticleID}").prop("disabled",false);
504 Liferay.Util.openToast({
505 message: "Erro ao editada demanda",
506 type: "danger",
507 title: "",
508 toastProps: {
509 autoClose: 5000
510 }
511 })
512 }
513 })
514
515 }
516</#if>
517
518<#-- Rest da edição de pessoa fisica -->
519
520
521 <#if orgOrUser == "user">
522
523 document.querySelector('#formularioDemanda${JournalArticleID}').addEventListener('submit', event => {
524 event.preventDefault();
525 adicionarDemanda${JournalArticleID}();
526 });
527
528 function adicionarDemanda${JournalArticleID}() {
529 Liferay.Util.openToast({message: "Enviando requisição",type: "info",title: ""});
530 $("#demandas-saveAndClose${JournalArticleID}").prop("disabled",true);
531
532 const demandaData = {
533 titulo: document.getElementById("demandaInputTitle${JournalArticleID}").value,
534 nomeContato: document.getElementById("demandaInputName${JournalArticleID}").value,
535 telefoneContato: document.getElementById("demandaInputPhone${JournalArticleID}").value,
536 emailContato: document.getElementById("demandaInputEmail${JournalArticleID}").value,
537 descricao: document.getElementById("demandaInputDesc${JournalArticleID}").value,
538 imagem: document.getElementById("inputDemandaBase64${JournalArticleID}").value,
539 }
540
541 console.log(demandaData);
542
543 fetch(Liferay.ThemeDisplay.getPortalURL() + "/o/demanda/${JournalArticleFrontId}", {
544 method: 'PUT',
545 "headers": {
546 "x-csrf-token": Liferay.authToken,
547 "Content-Type": "application/json"
548 },
549 body: JSON.stringify(demandaData)
550 })
551 .then( res => {
552 if(res.status == 200) {
553 Liferay.Util.openToast({
554 message: "Demanda editada com sucesso. Após a submissão, será iniciado o processo interno de aprovação do conteúdo enviado. Só então o conteúdo submetido aparecerá no portal.",
555 type: "success",
556 title: "",
557 toastProps: {
558 autoClose: 5000
559 }
560 })
561 setTimeout(function(){ location.reload(); }, 2000);
562 } else {
563 $("#demandas-saveAndClose${JournalArticleID}").prop("disabled",false);
564 Liferay.Util.openToast({
565 message: "Erro ao editar Demanda",
566 type: "danger",
567 title: "",
568 toastProps: {
569 autoClose: 5000
570 }
571 })
572 }
573 });
574
575 };
576
577
578 </#if>
579
580
581 </#if>
582 </script>
583
584
585
586
587 </#list>
588 </#if>
589 </div>
590</div>
591
592<style>
593.bioec_demanda_img {
594 overflow: hidden;
595 background-size: contain;
596 background-position: center;
597 background-repeat: no-repeat;
598}
599
600.bioec_demanda_img_placeholder {
601 width: 140px;
602 height: 140px;
603 background-color: #E8ECEF;
604 display: flex;
605 flex-direction: column;
606 align-items: center;
607 justify-content: center;
608 font-size: 14px;
609 color: #5B5C61;
610}
611
612.bioec_demanda_img_placeholder i {
613 font-size: 44px;
614}
615
616
617.pagination-items-per-page.active > a,
618.pagination-items-per-page.active > button,
619.pagination-items-per-page.show > a,
620.pagination-items-per-page.show > button,
621.page-item.active .page-link,
622.page-item.show .page-link{
623 border-color: #4ECD66;
624 background-color: #4ECD66;
625}
626
627.pagination-results,
628.pagination-items-per-page > a,
629.pagination-items-per-page > button,
630.pagination-items-per-page > a:hover,
631.pagination-items-per-page > button:hover,
632.page-link{
633 color: #4ebe66;
634}
635
636.bioec-profile-demanda-main{
637 display: flex;
638 gap: 40px;
639 flex-direction: column;
640 padding-bottom: 20px;
641}
642.bioec-profile-demanda-main h5{
643 font-weight: 700;
644}
645.bioec-profile-demanda-main h5, .bioec-profile-demanda-main p{
646 color: #5B5C61;
647 margin-bottom: 0px;
648 font-size: 16px;
649
650}
651
652.bioec-profile-demanda-main #demanda-lista-container>div{
653 border: 1px #BEBEBE solid;
654 padding: 24px 24px 0 24px;
655 margin-bottom: 40px;
656 display: grid;
657 grid-row-gap: 24px;
658 grid-template-columns: 24px 12px 1fr 15px;
659 grid-template-areas:
660 "ck . tit arrw"
661 "desc desc desc desc"
662 "clps clps clps clps";
663}
664
665.bioec-profile-demanda-main .lista-checkmark { grid-area: ck; display: flex; }
666.bioec-profile-demanda-main .lista-checkmark i { font-size: 24px; }
667.bioec-profile-demanda-main .lista-pic { grid-area: pic; display: flex; justify-content: center;}
668.bioec-profile-demanda-main .lista-arrow { grid-area: arrw; }
669
670.bioec-profile-demanda-main .lista-titulo {
671 grid-area: tit;
672 display: flex;
673 flex-direction: column;
674 justify-content: center;
675
676}
677
678.bioec-profile-demanda-main .lista-titulo h5{
679 margin-bottom: 0px;
680}
681
682.bioec-profile-demanda-main .lista-desc {
683grid-area: desc;
684}
685
686.bioec-profile-demanda-main .lista-desc p{
687 margin: 0;
688}
689
690.bioec-profile-demanda-main a{
691 color: #5B5C61;
692}
693
694.demanda-port{
695 border: 1px #BEBEBE solid;
696 padding: 24px;
697 display: flex;
698 flex-direction: column;
699 align-items: center;
700 gap: 24px;
701}
702
703.demanda-port p{
704text-align: center;
705
706}
707
708.demanda-port div{
709display: flex;
710 justify-content: space-between;
711 width: min(558px, 100%);
712}
713
714.button-empty {
715border: solid 1px #4ECD66;
716padding: 8px 24px;
717color: #333244;
718 transition: 250ms;
719}
720
721.button-empty:hover{
722 background-color: #4ECD66;
723}
724
725.button-filled {
726background-color: #4ECD66;
727border: solid 1px #4ECD66;
728padding: 8px 24px;
729color: #333244;
730transition: 250ms;
731
732}
733
734.button-filled:hover{
735 background-color: transparent;
736}
737
738.bioec-profile-demanda-main .lista-footnote {
739
740 display: flex;
741 justify-content: space-between;
742 border-top: 1px solid #E8ECEF;
743 padding-top: 12px;
744 font-size: 14px;
745 font-weight: 300;
746 gap: 15px;
747 color: #5B5C61;
748
749}
750.lista-collapse{
751display: flex;
752flex-direction: column;
753gap: 24px;
754grid-area: clps;
755padding-bottom: 24px;
756}
757
758 .lista-details{
759 display: flex;
760 justify-content: flex-start;
761 gap: 24px;
762}
763.lista-pic img {
764 max-height: 138px;
765 max-width: 138px;
766}
767
768.bioec-profile-demanda-main p{
769
770}
771
772.imagemCarregadaDemanda {
773 height: 100px;
774 width: 100px;
775 background-size: contain;
776 background-position: center;
777 background-repeat: no-repeat;
778}
779
780
781.ButtonAddDemanda {
782 background: #4ECD66;
783 border-radius: 8px;
784 padding: 8px 24px;
785 border: none;
786 font-weight: 700;
787 color: #333244;
788 font-family: 'Roboto';
789 float: right;
790 text-transform: uppercase;
791}
792.ButtonAddDemanda:hover{
793 color: #333244;
794 text-decoration: none;
795}
796
797.bioec-profile-demanda-modal label {
798 margin: 0;
799 cursor: default;
800 font-size: 20px;
801 font-weight: 700;
802 color: #5B5C61;
803}
804
805.bioec-profile-demanda-modal div {
806 width: 100%;
807}
808
809#demandaModal-l1, .demandaModal-l1 {
810 padding: 18px 24px;
811 display: flex;
812 justify-content: space-between;
813}
814
815#demandaModal-l1 img, .demandaModal-l1 img {
816 cursor: pointer;
817}
818
819#demandaModal-l1 h5, .demandaModal-l1 h5 {
820 margin: 0;
821 font-size: 20px;
822 font-weight: 700;
823 color: #5B5C61;
824}
825
826#demandaModal-l2, .demandaModal-l2 {
827 border-top: 1px solid #E8ECEF;
828 display: grid;
829 grid-template-columns: 1fr 1fr;
830 grid-template-areas:
831 "titu nome"
832 "fone mail"
833 "desc desc"
834 "imagem ."
835 ;
836 column-gap: 24px;
837 row-gap: 40px;
838 padding: 24px;
839}
840
841#demandaModal-l2>div, .demandaModal-l2>div {
842 display: flex;
843 flex-direction: column;
844 gap: 8px;
845}
846
847#demandaTitle, .demandaTitle {
848 grid-area: titu;
849}
850
851#demandaName, .demandaName {
852 grid-area: nome;
853}
854
855#demandaTelephone, .demandaTelephone {
856 grid-area: fone;
857}
858
859#demandaEmail, .demandaEmail {
860 grid-area: mail;
861}
862
863#demandaBrand, .demandaBrand {
864 grid-area: marca;
865}
866
867#demandaModal-l2>#demandaImg, .demandaModal-l2>.demandaImg {
868 grid-area: imagem;
869 display: flex;
870 flex-direction: column;
871}
872
873#demandaDesc, .demandaDesc {
874 grid-area: desc;
875
876}
877
878#demandaDesc input, .demandaDesc input {
879 height: 80px;
880}
881
882.TextImportant{
883 border-bottom: 1px solid #E8ECEF;
884 padding: 24px;
885 color: #5B5C61;
886}
887
888.bioec-profile-demanda-modal input[type="text"] {
889 border-top: none;
890 border-left: none;
891 border-right: none;
892 border-bottom: 1px solid #BEBEBE;
893 width: 100%;
894 font-size: 16px;
895
896}
897
898
899.bioec-profile-demanda-modal input[type="text"]:focus-visible {
900 outline: none;
901 border-bottom: 1px solid black;
902
903}
904
905.bioec-profile-demanda-modal .ReqLabel:before {
906 content: "* ";
907 color: #D90000;
908
909}
910
911#inputCarregarImagemDemanda, .inputCarregarImagemDemanda {
912 display: none;
913}
914
915#carregarImagem, .carregarImagem {
916 padding: 8px 24px;
917 border: 1px solid #4ECD66;
918 width: fit-content;
919 transition: 250ms;
920
921}
922
923#carregarImagem:hover, .carregarImagem:hover {
924 background-color: #4ECD66;
925}
926
927.button-empty {
928 border: solid 1px #4ECD66;
929 padding: 8px 24px;
930 color: #333244;
931 transition: 250ms;
932 font-weight: bold;
933}
934
935.button-empty:hover {
936 background-color: #4ECD66;
937}
938
939.button-filled {
940 background-color: #4ECD66;
941 border: solid 1px #4ECD66;
942 padding: 8px 24px;
943 color: #333244;
944 transition: 250ms;
945 font-weight: bold;
946}
947
948.button-filled:hover {
949 background-color: transparent;
950}
951
952#demandaModal-l3, .demandaModal-l3 {
953 gap: 24px;
954 display: flex;
955 justify-content: flex-end;
956 padding: 24px;
957}
958
959.modal {
960 padding: initial !important;
961 border-radius: 4px !important;
962
963}
964
965.modal a.close-modal {
966 display: none;
967}
968
969#removerImagemDemanda, .removerImagemDemanda {
970 background: none;
971 border: none;
972 outline: none;
973 color: #5B5C61;
974 font-size: 16px;
975 font-weight: 900;
976 line-height: 24px;
977 letter-spacing: 0em;
978 width: fit-content;
979 margin-left: 16px;
980}
981
982
983@media(max-width: 964px){
984 .lista-pic img {
985 width: 100%;
986 max-height: unset;
987 max-width: unset;
988
989 }
990}
991
992@media (max-width: 550px) {
993 #demandaModal-l2, .demandaModal-l2 {
994 display: flex;
995 flex-direction: column;
996 }
997
998 #demandaModal-l3, .demandaModal-l3 {
999 display: flex;
1000 flex-direction: column;
1001 }
1002}
1003
1004@media(max-width: 450px){
1005 .bioec-profile-demanda-main .lista-details{
1006 flex-direction: column;
1007 }
1008
1009 .lista-contato{
1010 text-align: center;
1011 }
1012
1013 .bioec-profile-demanda-main .lista-footnote{
1014 flex-direction: column;
1015 gap: 10px;
1016 align-items: flex-end;
1017 text-align: right;
1018 }
1019}
1020
1021@media(max-width: 992px){
1022 #demanda-lista-container {
1023 padding-inline: 15px;
1024 }
1025}
1026
1027.bioec-profile-demanda-main .lista-footnote .buttonsActions {
1028 display: flex;
1029 gap: 17px;
1030}
1031
1032@media (max-width: 768px) {
1033 .bioec-profile-demanda-main .lista-desc {
1034 gap: 24px;
1035 flex-direction: column-reverse;
1036 }
1037 .bioec-profile-demanda-main .lista-footnote {
1038 flex-direction: column;
1039 align-items: center;
1040 }
1041 .bioec-profile-demanda-main .lista-footnote > div {
1042 text-align: center;
1043 }
1044
1045 .bioec-profile-demanda-main .lista-footnote .barra-pipe {
1046 display: none;
1047 }
1048 .bioec-profile-demanda-main .lista-footnote .lista-author {
1049 display: flex;
1050 gap: 4px;
1051 justify-content: center;
1052 }
1053 .bioec-profile-demanda-main .lista-footnote .buttonsActions {
1054 width: 100%;
1055 justify-content: space-between;
1056 }
1057}
1058
1059
1060</style>
1061
1062
1063<script>
1064
1065
1066
1067</script>
The following has evaluated to null or missing: ==> autorId [in template "34764#34807#41133" at line 81, column 54] ---- Tip: If the failing expression is known to legally refer to something that's sometimes null or missing, either specify a default value like myOptionalVar!myDefault, or use <#if myOptionalVar??>when-present<#else>when-missing</#if>. (These only cover the last step of the expression; to cover the whole expression, use parenthesis: (myOptionalVar.foo)!myDefault, (myOptionalVar.foo)?? ---- ---- FTL stack trace ("~" means nesting-related): - Failed at: #if autorId != "" && autorId?? [in template "34764#34807#41133" at line 81, column 49] ----
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 >
27
28 <#if articleXml.selectSingleNode("dynamic-element[@field-reference='CampoDeTexto50355704']")??>
29
30 <#assign nomeParaContato = articleXml.selectSingleNode("dynamic-element[@field-reference='CampoDeTexto50355704']").getStringValue()!""
31 nomeParaContato = nomeParaContato?replace("\n\t\t", "")
32 nomeParaContato = nomeParaContato?replace("\n\t", "")
33 >
34 </#if>
35
36 <#if articleXml.selectSingleNode("dynamic-element[@field-reference='Text90715721']")??>
37 <#assign telefone = articleXml.selectSingleNode("dynamic-element[@field-reference='Text90715721']")!""
38 telefone = telefone.getStringValue()!""
39 telefone = telefone?replace("\n\t\t", "")
40 telefone = telefone?replace("\n\t", "")
41 >
42
43 </#if>
44
45 <#if articleXml.selectSingleNode("dynamic-element[@field-reference='Text68569631']")??>
46 <#assign email = articleXml.selectSingleNode("dynamic-element[@field-reference='Text68569631']").getStringValue()!""
47 email = email?replace("\n\t\t", "")
48 email = email?replace("\n\t", "")
49 >
50 </#if>
51
52
53 <#if articleXml.selectSingleNode("dynamic-element[@field-reference='CopyOfText18267936']")??>
54 <#assign desc = articleXml.selectSingleNode("dynamic-element[@field-reference='CopyOfText18267936']").getStringValue()!""
55 desc = desc?replace("\n\t\t", "")
56 desc = desc?replace("\n\t", "")
57 >
58 </#if>
59
60 <#if articleXml.selectSingleNode("dynamic-element[@field-reference='Text80669990']")??>
61 <#assign imagem = articleXml.selectSingleNode("dynamic-element[@field-reference='Text80669990']").getStringValue()!""
62 imagem = imagem?replace("\n\t\t", "")
63 imagem = imagem?replace("\n\t", "")
64 >
65 </#if>
66
67 <#if articleXml.selectSingleNode("dynamic-element[@field-reference='CampoDeTexto97452704']")??>
68 <#assign autorId = articleXml.selectSingleNode("dynamic-element[@field-reference='CampoDeTexto97452704']").getStringValue()!""
69 autorId = autorId?replace("\n\t\t", "")
70 autorId = autorId?replace("\n\t", "")
71 autorArticleId = ""
72 >
73 </#if>
74
75 <#assign
76 commentsCount = mbMessageLocalService.getDiscussionMessagesCount(entry.getClassName(), entry.getClassPK(), 0)!"0"
77 >
78
79
80
81 <#if autorId != "" && autorId??>
82 <#assign
83 autor = UserLocalService.fetchUser(autorId?number)!""
84 autorArticleId = autor.getExpandoBridge().getAttribute("journal-article")!"0"
85 />
86 <#if autor != "">
87 <#assign autor = autor.getFullName()!"">
88 <#else>
89 <#assign autor = "Anônimo" >
90 </#if>
91 <#else>
92 <#assign autor = "Anônimo" >
93 </#if>
94 <#assign categorias = AssetCategoryLocalService.getCategoryNames(entry.getClassName(), entry.getClassPK())!"" >
95 <#assign urlWC = "">
96
97 <#if autorArticleId != "0" && autorArticleId != "" && autor != "Anônimo">
98 <#assign autorArticle = JournalArticleLocalService.getLatestArticle(themeDisplay.getLayout().getGroupId(), autorArticleId?string) >
99 <#assign urlWC = autorArticle.getUrlTitle()!"">
100 </#if>
101
102
103 <#assign tags = tagsLocalService.getTagNames("com.liferay.journal.model.JournalArticle", journalArticle.getResourcePrimKey()?number )
104 tagName = tags[0]!""
105 orgOrUser = ""
106 >
107
108 <#if tagName?contains("organization") && tagName != "" >
109 <#assign orgOrUser = "org">
110 <#else>
111 <#assign orgOrUser = "user">
112 </#if>
113
114 <#if orgOrUser == "org" >
115
116 <#assign
117 orgId = tagName?keep_after("organization-")
118 organization = OrganizationLocalService.fetchOrganization(orgId?number)!""
119 >
120
121
122 <#if organization != "" && autor != "Anônimo">
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
129 </#if>
130 </#if>
131
132 <#if themeDisplay.isSignedIn() >
133 <#if tagName?contains("organization-")>
134 <#assign userIsAdmin = OrganizationLocalService.hasUserOrganization(themeDisplay.getUserId(), orgId?number)>
135 <#else>
136 <#if autorId?number == themeDisplay.getUserId()>
137 <script>console.log("oi");</script>
138 <#assign userIsAdmin = true>
139 </#if>
140 </#if>
141
142
143 </#if>
144
145
146 <div class="oferta-lista-item">
147 <div class="lista-checkmark">
148 <#if categorias?seq_contains("aprovado") > <i title="Aprovado" style="color: #4ECD66" class="fa-solid fa-circle-check"></i> </#if>
149 <#if categorias?seq_contains("pendente") > <i title="Em análise" style="color: #D90000"class="fa-solid fa-spinner"></i> </#if>
150 <#if categorias?seq_contains("recusado") > <i title="Recusado" style="color: #D90000"class="fa-solid fa-exclamation-circle"></i> </#if>
151 </div>
152
153
154 <div class="lista-titulo">
155 <h5>${entry.getHighlightedTitle()}</h5>
156 </div>
157
158 <div class="lista-arrow">
159 <button style="padding: 0;" class="btn" type="button" data-toggle="collapse" data-target="#collapseID${entry.getClassPK()}" aria-expanded="false" aria-controls="collapseID${entry.getClassPK()}">
160 <i class="fa-solid fa-chevron-down"></i>
161 </button>
162 </div>
163
164 <div class="lista-desc">
165 <p>${desc}</p>
166 </div>
167
168 <div class="lista-collapse collapse" id="collapseID${entry.getClassPK()}">
169 <#if nomeParaContato != "" || telefone != "" || email != "" || imagem?trim !="">
170 <div class="lista-details">
171 <div class="lista-pic">
172 <i class="fa-solid fa-image-slash"></i>
173 <#if imagem?trim !="" >
174 <img class="bioec_oferta_img" src="${imagem}">
175 <#else>
176 <div class="bioec_oferta_img_placeholder">
177 <i class="fa-solid fa-image"></i>
178 sem imagem
179 </div>
180 </#if>
181 </div>
182 <#if nomeParaContato != "" || telefone != "" || email != "" >
183 <div class="lista-contato">
184 <p>Contato</p>
185 <p class="lista-author">${nomeParaContato}</p>
186 <p class="lista-phone">${telefone}</p>
187 <p class="lista-email">${email}</p>
188 </div>
189 </#if>
190 </div>
191 </#if>
192
193 <#if categorias?seq_contains("recusado") >
194 <div style="border-top: 1px solid #E8ECEF; font-weight: bold; padding-top: 24px;">
195 <p>Conteúdo Em Análise Pelo Cetiqt:</p>
196 <p>Conteúdo recusado pelo CETIQT por violar as políticas de privacidade.</p>
197 </div>
198 </#if>
199 <div class="lista-footnote">
200 <div>
201 <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>
202 </div>
203 <#if userIsAdmin>
204 <div class="buttonsActions">
205 <div style="cursor: pointer;font-size: 16px;" data-toggle="modal" data-target="#modalOferta${JournalArticleID}">
206 <i class="fa-solid fa-edit"></i>
207 </div>
208 <div style="cursor: pointer;font-size: 16px;" data-toggle="modal" data-target="#modal-oferta-${entry.getClassPK()}">
209 <i class="fa-solid fa-trash-can"></i>
210 </div>
211
212 </div>
213 </#if>
214 </div>
215 </div>
216 </div>
217
218 <#if userIsAdmin>
219 <div style="display: none;" id="modal-oferta-${entry.getClassPK()}" class="modal fade" role="dialog">
220 <div class="modal-dialog modal-lg" role="document">
221 <div class="modal-content">
222 <div class="modal-header" >
223 <h4 class="m-0">Remover Oferta</h4>
224 <button type="button" class="close" data-dismiss="modal" aria-label="Close">
225 <span aria-hidden="true">
226 <i class="fa-solid fa-close"></i>
227 </span>
228 </button>
229 </div>
230 <div class="modal-body">
231 <h5>Você tem certeza que deseja remover essa oferta?</h5>
232 <div>
233 Ao clicar em continuar, a oferta será removida do seu perfil.
234 </div>
235 </div>
236 <div class="modal-footer justify-content-end">
237 <button class="bioec_secondary_button" data-dismiss="modal">CANCELAR</button>
238 <button class="bioec_primary_button" type="button" onclick="excluirOferta(${JournalArticleFrontId}, ${orgId})">CONTINUAR</button>
239 </div>
240 </div>
241 </div>
242 </div>
243
244 <#-- modal edição -->
245
246
247 <div style="display: none;" id="modalOferta${JournalArticleID}" class="modal fade bioec-profile-oferta-modal modalOferta" role="dialog">
248 <div class="modal-dialog modal-lg" role="document">
249 <form id="formularioOferta${JournalArticleID}" class="form-group modal-content formularioOferta">
250 <div id="ofertaModal-l1${JournalArticleID}" class="modal-header ofertaModal-l1">
251 <h5>Adicionar oferta</h5>
252 <button type="button" class="close" data-dismiss="modal" aria-label="Close">
253 <span aria-hidden="true">×</span>
254 </button>
255 </div>
256 <div id="ofertaModal-l2${JournalArticleID}" class="modal-body ofertaModal-l2">
257 <div id="ofertaTitle${JournalArticleID}" class="ofertaTitle">
258 <label class="ReqLabel" for="ofertaInputTitle${JournalArticleID}">Título da oferta</label>
259 <input id="ofertaInputTitle${JournalArticleID}" value="${entry.getHighlightedTitle()}" type="text" placeholder="Inserir um título" required>
260 </div>
261 <div id="ofertaName${JournalArticleID}" class="ofertaName">
262 <label class="" for="ofertaInputName${JournalArticleID}">Nome para contato</label>
263 <input value="${nomeParaContato}" id="ofertaInputName${JournalArticleID}" placeholder="Inserir nome" type="text">
264 </div>
265 <div id="ofertaTelephone${JournalArticleID}" class="ofertaTelephone">
266 <label class="" for="ofertaInputPhone${JournalArticleID}">Telefone para contato</label>
267 <input value="${telefone}" id="ofertaInputPhone${JournalArticleID}" name="ofertaInputPhone" type="text" placeholder ='(__)_____-_____' minlength="14" />
268 </div>
269 <div id="ofertaEmail${JournalArticleID}" class="ofertaEmail">
270 <label class="" for="ofertaInputEmail${JournalArticleID}">E-mail para contato</label>
271 <input value="${email}" id="ofertaInputEmail${JournalArticleID}" placeholder="Inserir e-mail" type="text">
272 </div>
273 <div id="ofertaDesc${JournalArticleID}" class="ofertaDesc">
274 <label class="ReqLabel" for="ofertaInputDesc${JournalArticleID}">Descrição</label>
275 <textarea id="ofertaInputDesc${JournalArticleID}" style="max-width: 100%;font-size: 16px;height: 80px;border: 1px solid #BEBEBE;" required>${desc}</textarea>
276 </div>
277 <div id="ofertaImg${JournalArticleID}" class="ofertaImg">
278 <div style="display: flex; flex-direction: column; gap: 8px">
279 <label>Imagem da oferta (Máx. 10 MB)</label>
280 <label class="btn carregarImagem" id="carregarImagem${JournalArticleID}" for="inputCarregarImagemOferta${JournalArticleID}" style="font-size: 16px; cursor: pointer;">CARREGAR IMAGEM</label>
281 <input class="inputCarregarImagemOferta" id="inputCarregarImagemOferta${JournalArticleID}" type="file" accept="image/*" onchange="encodeOfertaImageAsURL${JournalArticleID}(this)">
282 <input class="d-none" id="inputOfertaBase64${JournalArticleID}" value="${imagem}"/>
283 <div class="imagemCarregadaOferta imagemCarregadaOferta${JournalArticleID} d-md-none d-block" style="background-image: url(${imagem})"></div>
284 <button type="button" id="removerImagemOferta${JournalArticleID}" class="<#if imagem == "" || imagem?? == false> d-none </#if> removerImagemOferta" >
285 <i class="fa fa-trash"></i> Remover imagem
286 </button>
287 </div>
288 <div class="imagemCarregadaOferta imagemCarregadaOferta${JournalArticleID} d-md-block d-none" style="background-image: url(${imagem})"></div>
289 </div>
290 </div>
291 <div class="TextImportant">
292 <p>
293 Importante: O conteúdo enviado passará por um processo interno de aprovação. Só então o conteúdo adicionado aparecerá no portal.
294 </p>
295 </div>
296
297 <div id="ofertaModal-l3${JournalArticleID}" class="modal-footer ofertaModal-l3">
298 <button class="btn button-empty" onclick="" id="ofertas-saveAndClose${JournalArticleID}">SALVAR E FECHAR</button>
299 </div>
300 </form>
301 </div>
302 </div>
303
304 </#if>
305 <#--
306
307
308
309
310 <div style="display: none;" id="modalInfra${JournalArticleID}" class="modal fade bioec-profile-infra-modal" role="dialog">
311 <div class="modal-dialog modal-lg" role="document">
312
313 <form class="form-group modal-content" id="formularioInfraestrutura${JournalArticleID}">
314 <div id="infraModal-l1-${JournalArticleID}" class="modal-header infraModal-l1" >
315 <h5>Adicionar Infraestrutura</h5>
316 <button id="fecharModal${JournalArticleID}" type="button" class="close" data-dismiss="modal" aria-label="Close">
317 <span aria-hidden="true">×</span>
318 </button>
319 </div>
320 <div id="infraModal-l2-${JournalArticleID}" class="modal-body infraModal-l2">
321 <div id="infraName${JournalArticleID}" class="infraName">
322 <label class="ReqLabel" for="inputInfraName${JournalArticleID}">Nome da infraestrutura</label>
323 <input type="text" id="inputInfraName${JournalArticleID}" value="${entry.getHighlightedTitle()}" placeholder="Nome da infraestrutura" required>
324 </div>
325 <div id="infraModel${JournalArticleID}" class="infraModel">
326 <label class="ReqLabel" for="inputInfraModel${JournalArticleID}">Modelo</label>
327 <input type="text" id="inputInfraModel${JournalArticleID}" value="${modelo}" placeholder="Modelo" required>
328 </div>
329 <div id="infraBrand${JournalArticleID}" class="infraBrand">
330 <label class="ReqLabel" for="inputInfraBrand${JournalArticleID}">Marca</label>
331 <input type="text" id="inputInfraBrand${JournalArticleID}" value="${marca}" placeholder="Marca" required>
332 </div>
333
334 <div id="infraImg${JournalArticleID}" class="infraImg">
335 <div style="display: flex; flex-direction: column; gap: 8px">
336 <label>Imagem da infraestrutura (Máx. 10 MB)</label>
337 <label class="bioec_secondary_button" id="carregarImagem${JournalArticleID}" for="inputCarregarImagemInfra${JournalArticleID}" style="font-size: 16px;color: #333244;align-self:start;">
338 CARREGAR IMAGEM
339 </label>
340 <input id="inputCarregarImagemInfra${JournalArticleID}" class="inputCarregarImagemInfra" type="file" accept="image/*" onchange="encodeInfraImageAsURL${JournalArticleID}(this)">
341 <input class="d-none" id="inputInfraBase64${JournalArticleID}" />
342 <div class="imagemCarregadaInfra${JournalArticleID} d-md-none d-block"></div>
343 <button type="button" id="removerImagemInfra${JournalArticleID}" class="d-none removerImagemInfra" >
344 <i class="fa fa-trash"></i> Remover imagem
345 </button>
346 </div>
347 <div class="imagemCarregadaInfra${JournalArticleID} d-md-block d-none"></div>
348 </div>
349
350 <div id="infraFunction${JournalArticleID}" class="infraFunction">
351 <label class="ReqLabel" for="inputInfraFunction${JournalArticleID}">Função</label>
352 <input type="text" id="inputInfraFunction${JournalArticleID}" class="inputInfraFunction" value="${funcao}" placeholder="Função" required>
353 </div>
354 </div>
355 <div class="TextImportant">
356 <p>
357 Importante: O conteúdo enviado passará por um processo interno de aprovação. Só então o conteúdo adicionado aparecerá no portal.
358 </p>
359 </div>
360 <div id="infraModal-l3-${JournalArticleID}" class="modal-footer infraModal-l3">
361 <button class="bioec_secondary_button" id="ofertas-saveAndClose${JournalArticleID}" onclick="">SALVAR E FECHAR</button>
362 </div>
363 </form>
364
365 </div>
366
367
368 -->
369
370
371
372 <script>
373 <#if userIsAdmin>
374 function excluirOferta(wcId, orgId) {
375 Liferay.Util.openToast({message: "Enviando requisição",type: "info",title: ""});
376 fetch(Liferay.ThemeDisplay.getPortalURL() + "/o/oferta/" + wcId, {
377 method: 'DELETE',
378 "headers": {
379 "x-csrf-token": Liferay.authToken,
380 "Content-Type": "application/json"
381 }
382 })
383 .then(res => {
384 if(res.status == 200) {
385 Liferay.Util.openToast({
386 message: "Infraestrutura excluida com sucesso",
387 type: "success",
388 title: "",
389 toastProps: {
390 autoClose: 5000
391 }
392 })
393 setTimeout(function(){ location.reload(); }, 2000)
394 } else {
395 Liferay.Util.openToast({
396 message: "Erro ao excluir infraestrutura",
397 type: "danger",
398 title: "",
399 toastProps: {
400 autoClose: 5000
401 }
402 })
403 }
404 });
405 }
406
407
408
409
410 function validImageSize(base64="") {
411 const decoded = atob(base64.substring(base64.indexOf(',') + 1));
412 const sizeMB = decoded.length / 1e+6;
413 console.log("MB: " + decoded.length / 1e+6);
414 if(sizeMB > 10) {
415 Liferay.Util.openToast({
416 message: "O tamanho da imagem não deve ultrapassar 10 MB.",
417 type: "danger",
418 title: "",
419 toastProps: {
420 autoClose: 5000
421 }
422 })
423 return false
424 }
425 return true
426 }
427
428 function encodeOfertaImageAsURL${JournalArticleID}(element) {
429 let file = element.files[0];
430 let reader = new FileReader();
431 reader.onloadend = () => {
432 if(reader.result) {
433 if(!validImageSize(reader.result)) return;
434 try {
435 const base64_input = document.getElementById("inputOfertaBase64${JournalArticleID}")
436 base64_input.value = reader.result
437 Array.from(document.getElementsByClassName("imagemCarregadaOferta${JournalArticleID}")).forEach( el => el.style.backgroundImage = 'url(' + reader.result + ')' )
438
439 const removeImageButton = document.getElementById("removerImagemOferta${JournalArticleID}")
440 removeImageButton.classList.remove("d-none")
441 } catch (error) {
442 console.error(error)
443 }
444 }
445 }
446 reader.readAsDataURL(file);
447 }
448
449 function removeImageOferta${JournalArticleID}() {
450 try {
451 const file_input = document.getElementById("inputCarregarImagemOferta${JournalArticleID}")
452 Array.from(document.getElementsByClassName("imagemCarregadaOferta${JournalArticleID}")).forEach( el => el.style.backgroundImage = "" )
453 const base64_input = document.getElementById("inputOfertaBase64${JournalArticleID}")
454 file_input.value = null
455 base64_input.value = ""
456
457 const removeImageButton = document.getElementById("removerImagemOferta${JournalArticleID}")
458 removeImageButton.classList.add("d-none")
459 } catch (error) {
460 console.error(error)
461 }
462}
463
464
465
466document.getElementById("removerImagemOferta${JournalArticleID}").addEventListener("click", removeImageOferta${JournalArticleID});
467
468<#-- Rest da edição de organização -->
469
470<#if orgOrUser == "org">
471document.querySelector('#formularioOferta${JournalArticleID}').addEventListener('submit', event => {
472 event.preventDefault();
473 adicionarOferta${JournalArticleID}();
474});
475
476function adicionarOferta${JournalArticleID}() {
477 Liferay.Util.openToast({message: "Enviando requisição",type: "info",title: ""});
478 $("#ofertas-saveAndClose${JournalArticleID}").prop("disabled",true);
479
480
481
482 const ofertaData = {
483 titulo: document.getElementById("ofertaInputTitle${JournalArticleID}").value,
484 nomeContato: document.getElementById("ofertaInputName${JournalArticleID}").value,
485 telefoneContato: document.getElementById("ofertaInputPhone${JournalArticleID}").value,
486 emailContato: document.getElementById("ofertaInputEmail${JournalArticleID}").value,
487 descricao: document.getElementById("ofertaInputDesc${JournalArticleID}").value,
488 imagem: document.getElementById("inputOfertaBase64${JournalArticleID}").value,
489 }
490
491 console.log(ofertaData);
492
493 fetch(Liferay.ThemeDisplay.getPortalURL() + "/o/oferta/${JournalArticleFrontId}", {
494 method: 'PUT',
495 "headers": {
496 "x-csrf-token": Liferay.authToken,
497 "Content-Type": "application/json"
498 },
499 body: JSON.stringify(ofertaData)
500 })
501 .then(res => {
502 if(res.status == 200) {
503 Liferay.Util.openToast({
504 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.",
505 type: "success",
506 title: "",
507 toastProps: {
508 autoClose: 5000
509 }
510 })
511 setTimeout(function(){ location.reload(); }, 2000);
512 } else {
513 $("#ofertas-saveAndClose${JournalArticleID}").prop("disabled",false);
514 Liferay.Util.openToast({
515 message: "Erro ao editar oferta",
516 type: "danger",
517 title: "",
518 toastProps: {
519 autoClose: 5000
520 }
521 })
522 }
523 })
524 }
525</#if>
526
527<#-- Rest da edição de pessoa fisica -->
528
529
530
531 <#if orgOrUser == "user">
532
533 document.querySelector('#formularioOferta${JournalArticleID}').addEventListener('submit', event => {
534 event.preventDefault();
535 adicionarOferta${JournalArticleID}();
536 });
537
538 function adicionarOferta${JournalArticleID}() {
539 Liferay.Util.openToast({message: "Enviando requisição",type: "info",title: ""});
540 $("#ofertas-saveAndClose${JournalArticleID}").prop("disabled",true);
541
542 const ofertaData = {
543 titulo: document.getElementById("ofertaInputTitle${JournalArticleID}").value,
544 nomeContato: document.getElementById("ofertaInputName${JournalArticleID}").value,
545 telefoneContato: document.getElementById("ofertaInputPhone${JournalArticleID}").value,
546 emailContato: document.getElementById("ofertaInputEmail${JournalArticleID}").value,
547 descricao: document.getElementById("ofertaInputDesc${JournalArticleID}").value,
548 imagem: document.getElementById("inputOfertaBase64${JournalArticleID}").value,
549 }
550
551 console.log(ofertaData);
552
553 fetch(Liferay.ThemeDisplay.getPortalURL() + "/o/oferta/${JournalArticleFrontId}", {
554 method: 'PUT',
555 "headers": {
556 "x-csrf-token": Liferay.authToken,
557 "Content-Type": "application/json"
558 },
559 body: JSON.stringify(ofertaData)
560 })
561 .then( res => {
562 if(res.status == 200) {
563 Liferay.Util.openToast({
564 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.",
565 type: "success",
566 title: "",
567 toastProps: {
568 autoClose: 5000
569 }
570 })
571 setTimeout(function(){ location.reload(); }, 2000);
572 } else {
573 $("#ofertas-saveAndClose${JournalArticleID}").prop("disabled",false);
574 Liferay.Util.openToast({
575 message: "Erro ao editar Oferta",
576 type: "danger",
577 title: "",
578 toastProps: {
579 autoClose: 5000
580 }
581 })
582 }
583 });
584
585 };
586
587
588 </#if>
589
590
591 </#if>
592 </script>
593
594
595
596
597 </#list>
598 </#if>
599 </div>
600</div>
601
602<style>
603.bioec_oferta_img {
604 overflow: hidden;
605 background-size: contain;
606 background-position: center;
607 background-repeat: no-repeat;
608}
609
610.bioec_oferta_img_placeholder {
611 width: 140px;
612 height: 140px;
613 background-color: #E8ECEF;
614 display: flex;
615 flex-direction: column;
616 align-items: center;
617 justify-content: center;
618 font-size: 14px;
619 color: #5B5C61;
620}
621
622.bioec_oferta_img_placeholder i {
623 font-size: 44px;
624}
625
626
627.pagination-items-per-page.active > a,
628.pagination-items-per-page.active > button,
629.pagination-items-per-page.show > a,
630.pagination-items-per-page.show > button,
631.page-item.active .page-link,
632.page-item.show .page-link{
633 border-color: #4ECD66;
634 background-color: #4ECD66;
635}
636
637.pagination-results,
638.pagination-items-per-page > a,
639.pagination-items-per-page > button,
640.pagination-items-per-page > a:hover,
641.pagination-items-per-page > button:hover,
642.page-link{
643 color: #4ebe66;
644}
645
646.bioec-profile-oferta-main{
647 display: flex;
648 gap: 40px;
649 flex-direction: column;
650 padding-bottom: 20px;
651}
652.bioec-profile-oferta-main h5{
653 font-weight: 700;
654}
655.bioec-profile-oferta-main h5, .bioec-profile-oferta-main p{
656 color: #5B5C61;
657 margin-bottom: 0px;
658 font-size: 16px;
659
660}
661
662.bioec-profile-oferta-main #oferta-lista-container>div{
663 border: 1px #BEBEBE solid;
664 padding: 24px 24px 0 24px;
665 margin-bottom: 40px;
666 display: grid;
667 grid-row-gap: 24px;
668 grid-template-columns: 24px 12px 1fr 15px;
669 grid-template-areas:
670 "ck . tit arrw"
671 "desc desc desc desc"
672 "clps clps clps clps";
673}
674
675.bioec-profile-oferta-main .lista-checkmark { grid-area: ck; display: flex; }
676.bioec-profile-oferta-main .lista-checkmark i { font-size: 24px; }
677.bioec-profile-oferta-main .lista-pic { grid-area: pic; display: flex; justify-content: center;}
678.bioec-profile-oferta-main .lista-arrow { grid-area: arrw; }
679
680.bioec-profile-oferta-main .lista-titulo {
681 grid-area: tit;
682 display: flex;
683 flex-direction: column;
684 justify-content: center;
685
686}
687
688.bioec-profile-oferta-main .lista-titulo h5{
689 margin-bottom: 0px;
690}
691
692.bioec-profile-oferta-main .lista-desc {
693grid-area: desc;
694}
695
696.bioec-profile-oferta-main .lista-desc p{
697 margin: 0;
698}
699
700.bioec-profile-oferta-main a{
701 color: #5B5C61;
702}
703
704.oferta-port{
705 border: 1px #BEBEBE solid;
706 padding: 24px;
707 display: flex;
708 flex-direction: column;
709 align-items: center;
710 gap: 24px;
711}
712
713.oferta-port p{
714text-align: center;
715
716}
717
718.oferta-port div{
719display: flex;
720 justify-content: space-between;
721 width: min(558px, 100%);
722}
723
724.button-empty {
725border: solid 1px #4ECD66;
726padding: 8px 24px;
727color: #333244;
728 transition: 250ms;
729}
730
731.button-empty:hover{
732 background-color: #4ECD66;
733}
734
735.button-filled {
736background-color: #4ECD66;
737border: solid 1px #4ECD66;
738padding: 8px 24px;
739color: #333244;
740transition: 250ms;
741
742}
743
744.button-filled:hover{
745 background-color: transparent;
746}
747
748.bioec-profile-oferta-main .lista-footnote {
749
750 display: flex;
751 justify-content: space-between;
752 border-top: 1px solid #E8ECEF;
753 padding-top: 12px;
754 font-size: 14px;
755 font-weight: 300;
756 gap: 15px;
757 color: #5B5C61;
758
759}
760.lista-collapse{
761display: flex;
762flex-direction: column;
763gap: 24px;
764grid-area: clps;
765padding-bottom: 24px;
766}
767
768 .lista-details{
769 display: flex;
770 justify-content: flex-start;
771 gap: 24px;
772}
773.lista-pic img {
774 max-height: 138px;
775 max-width: 138px;
776}
777
778.bioec-profile-oferta-main p{
779
780}
781
782.imagemCarregadaOferta {
783 height: 100px;
784 width: 100px;
785 background-size: contain;
786 background-position: center;
787 background-repeat: no-repeat;
788}
789
790
791.ButtonAddOferta {
792 background: #4ECD66;
793 border-radius: 8px;
794 padding: 8px 24px;
795 border: none;
796 font-weight: 700;
797 color: #333244;
798 font-family: 'Roboto';
799 float: right;
800 text-transform: uppercase;
801}
802.ButtonAddOferta:hover{
803 color: #333244;
804 text-decoration: none;
805}
806
807.bioec-profile-oferta-modal label {
808 margin: 0;
809 cursor: default;
810 font-size: 20px;
811 font-weight: 700;
812 color: #5B5C61;
813}
814
815.bioec-profile-oferta-modal div {
816 width: 100%;
817}
818
819#ofertaModal-l1, .ofertaModal-l1 {
820 padding: 18px 24px;
821 display: flex;
822 justify-content: space-between;
823}
824
825#ofertaModal-l1 img, .ofertaModal-l1 img {
826 cursor: pointer;
827}
828
829#ofertaModal-l1 h5, .ofertaModal-l1 h5 {
830 margin: 0;
831 font-size: 20px;
832 font-weight: 700;
833 color: #5B5C61;
834}
835
836#ofertaModal-l2, .ofertaModal-l2 {
837 border-top: 1px solid #E8ECEF;
838 display: grid;
839 grid-template-columns: 1fr 1fr;
840 grid-template-areas:
841 "titu nome"
842 "fone mail"
843 "desc desc"
844 "imagem ."
845 ;
846 column-gap: 24px;
847 row-gap: 40px;
848 padding: 24px;
849}
850
851#ofertaModal-l2>div, .ofertaModal-l2>div {
852 display: flex;
853 flex-direction: column;
854 gap: 8px;
855}
856
857#ofertaTitle, .ofertaTitle {
858 grid-area: titu;
859}
860
861#ofertaName, .ofertaName {
862 grid-area: nome;
863}
864
865#ofertaTelephone, .ofertaTelephone {
866 grid-area: fone;
867}
868
869#ofertaEmail, .ofertaEmail {
870 grid-area: mail;
871}
872
873#ofertaBrand, .ofertaBrand {
874 grid-area: marca;
875}
876
877#ofertaModal-l2>#ofertaImg, .ofertaModal-l2>.ofertaImg {
878 grid-area: imagem;
879 display: flex;
880 flex-direction: column;
881}
882
883#ofertaDesc, .ofertaDesc {
884 grid-area: desc;
885
886}
887
888#ofertaDesc input, .ofertaDesc input {
889 height: 80px;
890}
891
892.TextImportant{
893 border-bottom: 1px solid #E8ECEF;
894 padding: 24px;
895 color: #5B5C61;
896}
897
898.bioec-profile-oferta-modal input[type="text"] {
899 border-top: none;
900 border-left: none;
901 border-right: none;
902 border-bottom: 1px solid #BEBEBE;
903 width: 100%;
904 font-size: 16px;
905
906}
907
908
909.bioec-profile-oferta-modal input[type="text"]:focus-visible {
910 outline: none;
911 border-bottom: 1px solid black;
912
913}
914
915.bioec-profile-oferta-modal .ReqLabel:before {
916 content: "* ";
917 color: #D90000;
918
919}
920
921#inputCarregarImagemOferta, .inputCarregarImagemOferta {
922 display: none;
923}
924
925#carregarImagem, .carregarImagem {
926 padding: 8px 24px;
927 border: 1px solid #4ECD66;
928 width: fit-content;
929 transition: 250ms;
930
931}
932
933#carregarImagem:hover, .carregarImagem:hover {
934 background-color: #4ECD66;
935}
936
937.button-empty {
938 border: solid 1px #4ECD66;
939 padding: 8px 24px;
940 color: #333244;
941 transition: 250ms;
942 font-weight: bold;
943}
944
945.button-empty:hover {
946 background-color: #4ECD66;
947}
948
949.button-filled {
950 background-color: #4ECD66;
951 border: solid 1px #4ECD66;
952 padding: 8px 24px;
953 color: #333244;
954 transition: 250ms;
955 font-weight: bold;
956}
957
958.button-filled:hover {
959 background-color: transparent;
960}
961
962#ofertaModal-l3, .ofertaModal-l3 {
963 gap: 24px;
964 display: flex;
965 justify-content: flex-end;
966 padding: 24px;
967}
968
969.modal {
970 padding: initial !important;
971 border-radius: 4px !important;
972
973}
974
975.modal a.close-modal {
976 display: none;
977}
978
979#removerImagemOferta, .removerImagemOferta {
980 background: none;
981 border: none;
982 outline: none;
983 color: #5B5C61;
984 font-size: 16px;
985 font-weight: 900;
986 line-height: 24px;
987 letter-spacing: 0em;
988 width: fit-content;
989 margin-left: 16px;
990}
991
992
993@media(max-width: 964px){
994 .lista-pic img {
995 width: 100%;
996 max-height: unset;
997 max-width: unset;
998
999 }
1000}
1001
1002@media (max-width: 550px) {
1003 #ofertaModal-l2, .ofertaModal-l2 {
1004 display: flex;
1005 flex-direction: column;
1006 }
1007
1008 #ofertaModal-l3, .ofertaModal-l3 {
1009 display: flex;
1010 flex-direction: column;
1011 }
1012}
1013
1014@media(max-width: 450px){
1015 .bioec-profile-oferta-main .lista-details{
1016 flex-direction: column;
1017 }
1018
1019 .lista-contato{
1020 text-align: center;
1021 }
1022
1023 .bioec-profile-oferta-main .lista-footnote{
1024 flex-direction: column;
1025 gap: 10px;
1026 align-items: flex-end;
1027 text-align: right;
1028 }
1029}
1030
1031@media(max-width: 992px){
1032 #oferta-lista-container {
1033 padding-inline: 15px;
1034 }
1035}
1036
1037.bioec-profile-oferta-main .lista-footnote .buttonsActions {
1038 display: flex;
1039 gap: 17px;
1040}
1041
1042@media (max-width: 768px) {
1043 .bioec-profile-oferta-main .lista-desc {
1044 gap: 24px;
1045 flex-direction: column-reverse;
1046 }
1047 .bioec-profile-oferta-main .lista-footnote {
1048 flex-direction: column;
1049 align-items: center;
1050 }
1051 .bioec-profile-oferta-main .lista-footnote > div {
1052 text-align: center;
1053 }
1054
1055 .bioec-profile-oferta-main .lista-footnote .barra-pipe {
1056 display: none;
1057 }
1058 .bioec-profile-oferta-main .lista-footnote .lista-author {
1059 display: flex;
1060 gap: 4px;
1061 justify-content: center;
1062 }
1063 .bioec-profile-oferta-main .lista-footnote .buttonsActions {
1064 width: 100%;
1065 justify-content: space-between;
1066 }
1067}
1068
1069
1070</style>
1071
1072
1073<script>
1074
1075
1076
1077</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
Governo realiza consulta pública sobre lançamento do Programa de Bioeconomia e Desenvolvimento Regional
Com o objetivo de promover diálogo com a população sobre a implementação do Programa de Bioeocnomia e Desenvolvimento Regional, o Ministério da Integração e do Desenvolvimento Regional lançou uma consulta pública sobre o tema.
Para saber mais, clique aqui.
Notícia
Sete agendas para garantir o desenvolvimento econômico sustentável do Brasil
Artigo lista sete agendas prioritárias para colocar o Brasil na direção certa e em posição de liderança na corrida climática global.
Clique aqui para ler a notícia completa.
Notícia
Embrapii e Página 22 irão realizar webinar sobre valor da inovação para o desenvolvimento das Amazônias
No dia 24 de abril, às 10h (horário de Brasília), ocorrerá um webinar sobre "O valor da inovação para o desenvolvimento das Amazônias". O evento, que será organizado pela Embrapii e pela Revista Página 22, será o primeiro de uma série.
Clique aqui para assistir.
Notícia
BNDES adota medidas para conter desmatamento na Amazônia
O BNDES bloqueou o financiamento de quase 60 proprietários rurais envolvidos em atividades irregulares como forma de combater o desmatamento na Amazônia.
Clique aqui para ler mais detalhes da notícia.
Notícia
Respeito ao ser humano e à natureza atrai marca de calçados para o Brasil
A Vert, que hoje produz 4 milhões de calçados por ano, foi atraída para o Brasil pela legislação trabalhista e hoje emprega famílias envolvidas nas associações e cooperativas para o fornecimento de borracha da Amazônia, algodão do Nordeste e couro do Sul do país.
Para saber mais, clique aqui.
Notícia
Estudos indicam que 60% dos insumos globais já foram ou poderiam ter sido substituídos por biomateriais
A bioeconomia pode facilitar mudanças na produção de commodities no setor florestal. Além disso, estudos indicam que 60% dos insumos globais já poderiam ou foram substituídos por biomateriais.
Clique aqui para acessar mais detalhes dessa notícia.
Notícia
Café com Bioeconomia #26: Algas: matérias-primas estratégicas para o desenvolvimento da Bioeconomia Azul
A segunda edição internacional do Café com Bioeconomia aconteceu no dia 29 de março de 2023 e reuniu Levi Machado (Professor e pesquisador da UNESP), Luis Costa (Membro do Conselho Executivo de Operações e Desenvolvimento de Negócios da A4F), Scott Fahrenkrug (Fundador da Forjazul) e Thibaut Monfort-Micheo (CTO e co-fundador da FlexSea). O encontro, que acontece quinzenalmente, foi mediado por Rodrigo Cano (Analista de Mercado do Instituto SENAI de Inovação em Biossintéticos e Fibras, do SENAI CETIQT).
Rodrigo destacou que os panelistas representam toda a cadeia de valor: desde o cultivo, passando pelo processamento e aplicações finais. Em seguida, questionou como eles veem a bioeconomia azul no curto, médio e longo prazo e como se enxergam contribuindo com a área no futuro.
Levi comentou que é importante para o Brasil a criação de uma organização nacional de algas que agregue produtores, start-ups, biorrefinarias e empresas, e que fomente novas conexões. Além disso, indicou que é necessário aprimorar os processos pós-colheita, como a secagem, que pode comprometer componentes de interesse presentes na biomassa. Ressaltou também que os créditos de carbono ainda não são bem explorados nessa indústria, o que pode ser importante no futuro.
Luís acredita que, no curto prazo, é importante focar em consolidar os modelos de negócio já existentes e ir expandindo organicamente, sobretudo nos segmentos de maior valor agregado. Para ele, os governos possuem papel importante em regular o desenvolvimento do setor e as questões logísticas e de pegada de carbono requerem atenção. Comentou também que algumas empresas estão identificando que suas matérias-primas não são sustentáveis e recorrendo às algas para fazer a substituição, o que deve movimentar a área nos próximos anos. Luís destacou a pressão atual de aproveitar tudo o que é residual, o que poderá ajudar a tornar as biomassas marinhas competitivas.
Scott ressaltou o potencial de crescimento da indústria de algas no Brasil e complementou dizendo que é um desafio entender o que compõe a biomassa e então transformá-la em um produto, desafio que tem atacado como geneticista. Para ele, a produção no oceano precisa chegar na mesma maturidade que a produção em terra, pois já existem tecnologias disponíveis para tal. Scott também destacou que o desenvolvimento de novas linhagens pode ajudar profissionais que trabalham com algas e que já sentem os efeitos do aquecimento global.
Thibaut afirmou que a bioeconomia tem muito potencial, assim como as algas, mas que ainda falta investimento para que possa evoluir plenamente. Ele acredita também que as algas estão recebendo grande atenção, mas que existem outras oportunidades a serem exploradas e que é preciso tomar cuidado para manter a sustentabilidade da produção. Segundo ele, o maior impacto ambiental vem da extração de componentes ativos e que, portanto, desenvolver novas rotas mais sustentáveis de refino é importante.
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
Competição de biologia sintética da América Latina organiza mesa-redonda sobre Bioeconomia
A iGEM Design League, competição latino-americada de biologia sintética, fará uma mesa-redonda no dia 29 de março às 16h (horário de Brasília) sobre biotecnologia aplicada à bioeconomia sustentável.
Clique aqui para obter mais informações.
Artigo
Potencial da bioeconomia para o desenvolvimento sustentável da Amazônia e possibilidades para a atuação do BNDES
Artigo sobre bioeconomia publicado na revista do BNDES vence prêmio ABDE-BID de 2022 na categoria Financiamento ao desenvolvimento sustentável, inclusivo e inovativo.
Para ler o documento completo, clique aqui.
Artigo
The Diffusion of Bioplastics: What Can We Learn from Poly(Lactic Acid)?
O crescimento dos bioplásticos não acompanhou as projeções dos anos 2000. O artigo usa o caso do poliácido lático (PLA) e outros biopolímeros de maneira genérica para entender quais as condições que precisam ser combinadas hoje para permitir a expansão estimada para os próximos anos.
Clique aqui para acessar o artigo na íntegra.
Artigo
Business, biodiversity, and innovation in Brazil
O artigo lista questões urgentes e novas oportunidades de negócios de importância para a meta de sustentabilidade empresarial pós-2020 do Global Biodiversity Framework (GBF) e também o potencial impacto no Brasil.
Clique aqui para acessar o artigo completo.
Artigo
Gas fermentation of C1 feedstocks: commercialization status and future prospects
O artigo reúne os principais microorganismos e rotas microbiológicas capazes de transformar carbono C1 em produtos de alto valor agregado.
Para ler o artigo completo clique aqui.
Notícia
Café com Bioeconomia #25: Oportunidades e desafios da bioeconomia da indústria de polímeros
A edição do dia 15 de março de 2023 do Café com Bioeconomia reuniu José Carlos Pinto (Professor do Programa de Engenharia Química da COPPE), Luan Campos (Diretor de P&D da Polimex Bioplásticos) e Roberto Werneck (Especialista em open innovation da Braskem). 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 demanda por polímeros sustentáveis tem crescido de forma exacerbada. Por conta disso, Paulo destacou a relevância de ter presentes no evento representantes da Braskem (grande empresa do segmento), da Polimex (pequena empresa), e da COPPE (universidade). Ao longo do Café, os participantes foram provocados a responder questões acerca de estratégias, soluções drop-in e não drop-in, desenvolvimento de aplicações, novos produtos, entre outros.
Roberto falou sobre o polietileno (PE) verde da Braskem, que, segundo ele, é praticamente a nova cara da empresa, por ser hoje o produto-chave do portfólio. A visão inicial era de que o PE verde seria como o de origem fóssil, mas com a vantagem de capturar 3 tCO2eq/t de plástico. No entanto, o que perceberam foi que a versão verde se tornou outro produto. Roberto destacou também que, após muito estudo, a Braskem conseguiu chegar a uma rota de produção de polipropileno verde a partir de etanol que é economicamente competitiva. No momento, estão avaliando a implantação da tecnologia.
Luan indicou que a educação empreendedora fez a diferença para a Polimex, que sempre se preocupou em ouvir as dores da indústria antes de propor seus produtos. A empresa hoje tem como principal produto o Plástico Natural Biodegradável (PNB), que é produzido a partir de residuais do açaí e da indústria cervejeira. Outras biomassas que são alvo da empresa são o café e o bambu.
José Carlos ressaltou que ser bio não é sinônimo de ser bom para o ambiente, e lembrou que é necessário olhar para os balanços e buscar produtos que tenham as propriedades corretas para cada aplicação. As iniciativas da academia de novos materiais, segundo ele são infindáveis e incluem produtos derivados do glicerol, etanol, ácido succínico, ácido levulínico, celulose, lignina, entre outros. O que impede o avanço é que muitas vezes não são avaliadas questões como disponibilidade, produtividade, propriedades e preço. O professor destacou também que a universidade depende de parcerias com grandes empresas para desenvolver os produtos e, que nesse sentido, falta no Brasil mapear prioridades para criar políticas científicas capazes de viabilizar processos, bem como ações empreendedoras.
O Café com Bioeconomia é um evento quinzenal, on-line e interativo, no qual palestrantes e público discutem temas relevantes para a bioeconomia. Para receber a agenda e participar, inscreva-se em: https://portaldebioeconomia.com/
Para ouvir esse e outros Cafés, acesse o Spotify Café com Bioeconomia.
Notícia
Bioeconomia do Pará ganha destaque em artigo da Agência Reuters
Artigo da Agência Reuters, uma das maiores e mais importantes agências de notícias do mundo, dá destaque para a bioeconomia do Pará nos segmentos de alimento e moda.
Clique aqui para ler a notícia completa.
Notícia
Fórum Mundial de Bioeconomia está realizando pesquisa sobre criação de hub global de bioeconomia
O Fórum Mundial de Bioeconomia está realizando pesquisa em nível global sobre a criação de um hub de bioeconomia. A pesquisa pode ser respondida até setembro de 2023 e está disponível em várias línguas.
Clique aqui para ter mais informações e responder ao questionário.
Notícia
Idesam irá promover debate sobre Bioeconomia da Amazônia em 16 de março
O Idesam irá promover um debate sobre bioeconomia da Amazônia no dia 16 de março de 2023 das 17:30 às 22h pelo Youtube.
Clique aqui para acessar o link da transmissão.
Notícia
Café com Bioeconomia #24: Perspectivas da descarbonização no Brasil
O Café do dia 01 de março de 2023 reuniu Gerd Angelkorte (Pesquisador do Laboratório Cenergia, do COPPE/UFRJ), Laura Asano (Especialista em transição energética, da Raízen) e Thiago Falda (Presidente executivo da ABBI), e foi mediado por Leonardo Teixeira – Coordenador de Inteligência Competitiva do Instituto SENAI de Inovação em Biossintéticos e Fibras, do SENAI CETIQT.
Estudo recente da Associação Brasileira de Bioinovação (ABBI) em parceria com o SENAI CETIQT, Embrapa Agroenergia, LNBR/CNPEM e o Laboratório Cenergia COPPE/UFRJ apontou que a bioeconomia pode gerar ao Brasil faturamento industrial adicional de US$ 284 bilhões/ano, quando comparado às políticas correntes de mitigação de emissões de gases de efeito estufa. Além disso, as tecnologias da bioeconomia analisadas se mostram capazes de restringir emissões para que o país cumpra suas metas de descarbonização (acesse aqui). A continuação desse estudo é hoje conduzida pelo SENAI CETIQT, ABBI, Raízen e outros parceiros no âmbito do Agenda.Tech da Plataforma Inovação para a Indústria do SESI/SENAI.
Gerd esclareceu que o estudo da ABBI tomou como base resultados oriundos do modelo BLUES desenvolvido pelo Cenergia, um modelo de análise integrada que contêm mais de 30.000 tecnologias referentes ao setor agropecuário, energético, hídrico, entre outros. O Cenergia é um dos laboratórios de referência para a estimação de impactos no clima, com modelos reconhecidos inclusive pelo IPCC. Gerd destacou ainda que, embora não incluída no primeiro estudo da ABBI, a biodiversidade brasileira traz enorme potencial para fomentar a bioeconomia e a descarbonização.
Ao falar das experiências da Raízen, Laura destacou como a empresa já é renovável, mas que tem investigado de forma extensa as outras oportunidades que essa biomassa traz. Nesse sentido, a especialista destacou que não basta comparar soluções apenas em termos de conteúdo energético, mas que o impacto na descarbonização é fundamental. Laura apontou também que é necessário avaliar tecnologias e realidades de desenvolvimento para o sul global, que podem não ser as mesmas desenvolvidas para o norte global.
Já Thiago destacou os esforços conduzidos no Brasil que fomentaram o uso de matérias-primas renováveis e biotecnologia, como o pró-álcool, na década de 1970, e os esforços da FAPESP, nos anos 1990, para pôr o Brasil na vanguarda da biologia molecular (por exemplo, com o sequenciamento da Xyllela fastidiosa, bactéria causadora de doença em cítricos), respectivamente. No entanto, destacou também que há necessidade de mecanismos de compartilhamento de riscos para a inovação na bioeconomia e, de forma geral, a estruturação de políticas que fomentem a indústria baseada em bioinovações.
O Café com Bioeconomia é um evento quinzenal, on-line e interativo, no qual palestrantes e público discutem temas relevantes para a bioeconomia. 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 #23 - Biocombustíveis Avançados: uma ponte na transição energética
O Café do dia 15 de fevereiro de 2023 reuniu Carolina Grassi (Gerente de políticas públicas e inovações da Roundtable on Sustainable Biomaterials - RSB), Fernando Castro (Sócio-fundador e Diretor Geral da C.B.& Associates) e Gonçalo Pereira (Professor da Universidade Estadual de Campinas), e foi mediado por Leonardo Teixeira – Coordenador de Inteligência Competitiva do Instituto SENAI de Inovação em Biossintéticos e Fibras do SENAI CETIQT.
Durante a discussão, foi apontado que o Brasil já possui um posicionamento forte para o biodiesel e etanol de primeira geração, mas que, para atingir as metas de descarbonização, precisará olhar também para os biocombustíveis avançados. Contudo, a definição de biocombustíveis avançados ainda divide opiniões, tanto no Brasil quanto no mundo.
Nesse sentido, Carolina ressaltou alguns requisitos empregados pela RSB para classificar os combustíveis como avançados, como o fato de que a matéria-prima precisa ser um residual e apresentar inelasticidade. Além disso, seu valor econômico deve ser 5% menor que outros produtos da mesma cadeia de suprimentos. Ainda segundo a especialista, os biocombustíveis produzidos a partir de tecnologia Power-to-X são hoje aceitos como avançados, juntamente ao etanol de segunda geração, o biodiesel a partir de óleo de cozinha, entre outros.
Fernando, que participa do projeto da empresa Brasil BioFuels (BBF) para produzir diesel verde (HVO) e querosene de aviação (SAF) a partir de óleo de palma e óleo de soja, destaca a competitividade da produção da BFF. Segundo ele, o “Brasil tem um pré-sal verde na mão”, pois o país possui água, biomassa, vento e sol em abundância. Fernando salientou ainda que, nesse momento, todo o combustível a ser produzido pela BFF será consumido na região norte. Isso evitará o dispêndio elevado de combustíveis para o transporte de combustíveis renováveis.
A macaúba foi destacada pelo Professor Gonçalo como uma das biomassas do futuro para o Brasil, assim como a palma e o agave. Gonçalo ressaltou também que o potencial de geração de empregos da indústria de renováveis é muito elevado em relação à indústria fóssil e distribuído no país, próximos às diversas fontes de matérias-primas. Assim, sugeriu a criação de um roadmap que identifique opções de insumos e biocombustíveis, e que oriente políticas públicas de longo prazo.
O Café com Bioeconomia é um evento quinzenal, on-line e interativo, no qual palestrantes e público discutem temas relevantes para a bioeconomia. 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.