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