Nav Bar do usuário deslogado.

Organização

teste_imagem_teste_testeaaaa

teste_imagem_teste_testeaaaa
  • Sobre
  • Infraestruturas
  • Demandas
  • Ofertas
  • Publicações
Sobre drop zone
lucas motta Administrador
Infraestruturas drop zone
Um erro ocorreu enquanto processava o modelo.
The following has evaluated to null or missing:
==> autorArticleId  [in template "34764#34807#41130" at line 104, column 46]

----
Tip: If the failing expression is known to legally refer to something that's sometimes null or missing, either specify a default value like myOptionalVar!myDefault, or use <#if myOptionalVar??>when-present<#else>when-missing</#if>. (These only cover the last step of the expression; to cover the whole expression, use parenthesis: (myOptionalVar.foo)!myDefault, (myOptionalVar.foo)??
----

----
FTL stack trace ("~" means nesting-related):
	- Failed at: #if autorArticleId != "0" && autorArt...  [in template "34764#34807#41130" at line 104, column 41]
----
1<#assign JournalArticleLocalService = serviceLocator.findService("com.liferay.journal.service.JournalArticleLocalService")> 
2<#assign UserLocalService = serviceLocator.findService("com.liferay.portal.kernel.service.UserLocalService")> 
3<#assign AssetCategoryLocalService = serviceLocator.findService("com.liferay.asset.kernel.service.AssetCategoryLocalService")> 
4<#assign OrganizationLocalService = serviceLocator.findService("com.liferay.portal.kernel.service.OrganizationLocalService") > 
5<#assign AssetTagLocalService = serviceLocator.findService("com.liferay.asset.kernel.service.AssetTagLocalService")> 
6<#-- <#assign  
7journalArticle = JournalArticleLocalService.getArticle(themeDisplay.getSiteGroupId(),.data_model["reserved-article-id"].data) 
8AssetEntryLocalService = serviceLocator.findService("com.liferay.asset.kernel.service.AssetEntryLocalService") 
9assetEntry = AssetEntryLocalService.getEntry(journalArticle.getModelClassName(), journalArticle.getResourcePrimKey()) 
10--> 
11<#assign  
12mbMessageLocalService = serviceLocator.findService("com.liferay.message.boards.service.MBMessageLocalService") 
13
14 
15<div id="upload-notice-container" style="display: none;"> 
16						<span id="close-btn-upload-container"> <i class="fa fa-xmark"></i> </span> 
17						<h5 class="upload-notice-title"> 
18							<i class="fa-sharp fa-solid fa-circle-exclamation"></i> 
19							Upload de infraestrutura em andamento 
20						</h5> 
21						<p> 
22							Caso os itens adicionados não estejam visíveis na página, aguarde um instante e <span>atualize a página</span> para visualizá-los. 
23						</p> 
24					</div> 
25				 
26<div class="bioec-profile-estrutura-main"> 
27		 
28    <div id="estruturas-lista" class="d-flex flex-column"> 
29				 
30				<#if entries?has_content> 
31					<#list entries as entry> 
32					 
33					<#assign journalArticle = JournalArticleLocalService.getLatestArticle(entry.getClassPK()) > 
34					<#assign articleXml = journalArticle.getDocument().getRootElement() > 
35					<#assign JournalArticleID = journalArticle.getId()> 
36					<#assign JournalArticleFrontId = journalArticle.getArticleId()> 
37					<#assign  
38						userIsAdmin = false 
39						orgId = "" 
40					  autorId = "" 
41
42						<#if articleXml.selectSingleNode("dynamic-element[@field-reference='Text57816561']")??> 
43								<#assign  
44						modelo = articleXml.selectSingleNode("dynamic-element[@field-reference='Text57816561']").getStringValue()!"" 
45						modelo = modelo?replace("\n\t\t", "") 
46						modelo = modelo?replace("\n\t", "")		 
47
48						</#if> 
49							 
50						<#if articleXml.selectSingleNode("dynamic-element[@field-reference='Text23707291']")??> 
51							<#assign  
52						marca = articleXml.selectSingleNode("dynamic-element[@field-reference='Text23707291']").getStringValue()!"" 
53						marca = marca?replace("\n\t\t", "") 
54						marca = marca?replace("\n\t", "")		 
55
56						</#if> 
57							 
58						<#if articleXml.selectSingleNode("dynamic-element[@field-reference='Text74754192']")??> 
59						    <#assign  
60						funcao = articleXml.selectSingleNode("dynamic-element[@field-reference='Text74754192']").getStringValue()!"" 
61						funcao = funcao?replace("\n\t\t", "") 
62						funcao = funcao?replace("\n\t", "")		 
63
64						</#if> 
65							 
66							<#if articleXml.selectSingleNode("dynamic-element[@field-reference='CampoDeTexto02890219']")??> 
67								<#assign  
68						imageSrc = articleXml.selectSingleNode("dynamic-element[@field-reference='CampoDeTexto02890219']").getStringValue()!"" 
69												  
70
71						</#if> 
72							 
73							<#if articleXml.selectSingleNode("dynamic-element[@field-reference='Text93109394']")??> 
74								<#assign  
75						autorId = articleXml.selectSingleNode("dynamic-element[@field-reference='Text93109394']").getStringValue()!"" 
76						autorId = autorId?replace("\n\t\t", "") 
77						autorId = autorId?replace("\n\t", "")		 
78						autorArticleId = "" 
79
80						</#if> 
81								<#assign  
82						commentsCount = mbMessageLocalService.getDiscussionMessagesCount(entry.getClassName(), entry.getClassPK(), 0)!"0" 
83					/> 
84					 
85					<#if autorId != "" && autorId??> 
86						<#assign 
87							autor = UserLocalService.fetchUser(autorId?number)!"" 
88							autorArticleId = autor.getExpandoBridge().getAttribute("journal-article")!"0" 
89						/> 
90						<#if autor != ""> 
91							<#assign autor = autor.getFullName()!""> 
92						<#else> 
93							<#assign autor = "Anônimo" > 
94						</#if> 
95					<#else>  
96						<#assign autor = "Anônimo" > 
97					</#if> 
98					 
99					<#assign categorias = AssetCategoryLocalService.getCategoryNames(entry.getClassName(), entry.getClassPK())!"" > 
100					 
101					<#assign 	categorias = AssetCategoryLocalService.getCategoryNames(entry.getClassName(), entry.getClassPK())!"" > 
102 
103					<#assign urlWC = ""> 
104					<#if autorArticleId != "0" && autorArticleId != "" && autor != "Anônimo"> 
105					<#assign autorArticle = JournalArticleLocalService.getLatestArticle(themeDisplay.getLayout().getGroupId(), autorArticleId?string) > 
106					<#assign urlWC = autorArticle.getUrlTitle()!""> 
107					</#if> 
108					 
109									 
110					<#assign tags = AssetTagLocalService.getTagNames("com.liferay.journal.model.JournalArticle", journalArticle.getResourcePrimKey()?number )  
111				 tagName = tags[0]!"" 
112				  
113
114				<#if tagName?contains("organization") && tagName != "" > 
115 
116					<#assign 
117					orgId = tagName?keep_after("organization-")				 
118					organization =  OrganizationLocalService.fetchOrganization(orgId?number)!"" 
119
120			 
121					 
122					<#if organization != "" && autor != "Anônimo" && autorArticleId != ""> 
123						<#assign	orgArticleId = organization.getExpandoBridge().getAttribute("journal-article") 
124							orgJournalArticle = JournalArticleLocalService.getArticle(themeDisplay.getLayout().getGroupId(),orgArticleId?c)  
125							urlWC = orgJournalArticle.getUrlTitle()!"" 
126							autor = organization.getName()!"" 
127
128					</#if> 
129				</#if> 
130					 
131					<#if themeDisplay.isSignedIn() > 
132						<#assign tags = AssetTagLocalService.getTagNames(entry.getClassName(), entry.getClassPK()) > 
133						<#assign orgId = (tags[0]!"")?remove_beginning("organization-") > 
134						<#assign userIsAdmin = OrganizationLocalService.hasUserOrganization(themeDisplay.getUserId(), orgId?number)> 
135					</#if> 
136					 
137					<div class="estruturas-lista-item" id="InfraItem${JournalArticleID}"> 
138							<div class="lista-checkmark"> 
139								<#if categorias?seq_contains("aprovado") > <i title="Aprovado" style="color: #4ECD66" class="fa-solid fa-circle-check"></i> </#if> 
140								<#if categorias?seq_contains("pendente") >	<i title="Em análise" style="color: #D90000"class="fa-solid fa-spinner"></i> </#if> 
141								<#if categorias?seq_contains("recusado") >	<i title="Recusado" style="color: #D90000"class="fa-solid fa-exclamation-circle"></i> </#if> 
142							</div> 
143 
144							<div class="lista-pic"> 
145									<#if imageSrc?trim !="" > 
146										<div class="bioec_infra_img" style="background-image: url(${imageSrc})"> 
147										</div> 
148									<#else> 
149										<div class="bioec_infra_img_placeholder"> 
150											<i class="fa-solid fa-image"></i> 
151											sem imagem 
152										</div> 
153									</#if> 
154							</div> 
155 
156							<div class="lista-desc"> 
157									<h5>${entry.getHighlightedTitle()}</h5> 
158									<p>Modelo: ${modelo}</p> 
159									<p>Marca: ${marca}</p> 
160							</div> 
161 
162							<div class="lista-arrow"> 
163									<button class="btn" type="button" data-toggle="collapse" data-target="#collapse-${entry.getClassPK()}" aria-expanded="false" aria-controls="collapse-${entry.getClassPK()}"> 
164											<i class="fa-solid fa-chevron-down"></i> 
165									</button> 
166							</div> 
167 
168							<span id="collapse-${entry.getClassPK()}" class="collapse lista-collapse"> 
169									<div class="lista-func"> 
170											<h5>Função </h5> 
171											<p>${funcao}</p> 
172									</div> 
173									 
174							<#if categorias?seq_contains("recusado") > 
175							<div style="border-top: 1px solid #E8ECEF; font-weight: bold; padding-top: 24px;"> 
176							<p>Conteudo Em Análise Pelo Cetiqt:</p> 
177							<p>Conteúdo recusado pelo CETIQT por violar as políticas de privacidade.</p> 
178							</div> 
179							</#if > 
180							 
181									<div class="lista-footnote"> 
182											<div> 
183													<span class="lista-date">${journalArticle.getDisplayDate()?string('dd/MM/yyyy')}</span> | <span class="lista-commentNumber">${commentsCount} comentários</span> <span class="barra-pipe"> | </span> <span class="lista-author">Publicado por <a <#if urlWC != ''>href="/w/${urlWC}</#if>">${autor}</a></span> 
184											</div> 
185											<#if userIsAdmin> 
186											<div class="buttonsActions"> 
187												<div style="cursor: pointer;font-size: 16px;" data-toggle="modal" data-target="#modalInfra${JournalArticleID}"> 
188													<i class="fa-solid fa-edit"></i> 
189												</div> 
190												<div style="cursor: pointer;font-size: 16px;" data-toggle="modal" data-target="#modal-infra-${entry.getClassPK()}"> 
191													<i class="fa-solid fa-trash-can"></i> 
192												</div> 
193												 
194											</div> 
195											</#if> 
196									</div> 
197							</span> 
198					</div> 
199					 
200					<#if userIsAdmin> 
201					<div style="display: none;" id="modal-infra-${entry.getClassPK()}" class="modal fade" role="dialog"> 
202						<div class="modal-dialog modal-lg" role="document"> 
203							<div class="modal-content"> 
204								<div class="modal-header" > 
205									<h4 class="m-0">Remover Infraestrutura</h4> 
206									<button type="button" class="close" data-dismiss="modal" aria-label="Close"> 
207										<span aria-hidden="true"> 
208											<i class="fa-solid fa-close"></i> 
209										</span> 
210									</button>    
211								</div> 
212								<div class="modal-body"> 
213									<h5>Você tem certeza que deseja remover essa infraestrutura?</h5> 
214									<div> 
215										Ao clicar em continuar, a infraestrutura será removida do seu perfil. 
216									</div> 
217								</div> 
218								<div class="modal-footer justify-content-end"> 
219										<button class="bioec_secondary_button" data-dismiss="modal">CANCELAR</button> 
220										<button class="bioec_primary_button" type="button" onclick="excluirInfra(${JournalArticleFrontId}, ${orgId})">CONTINUAR</button>  
221								</div> 
222							</div> 
223						</div>			 
224					</div> 
225					</#if> 
226					 
227					<#-- modal edição --> 
228 
229<#if userIsAdmin> 
230<div style="display: none;" id="modalInfra${JournalArticleID}" class="modal fade bioec-profile-infra-modal" role="dialog"> 
231	<div  class="modal-dialog modal-lg" role="document"> 
232 
233		<form class="form-group modal-content" id="formularioInfraestrutura${JournalArticleID}"> 
234			<div id="infraModal-l1-${JournalArticleID}" class="modal-header infraModal-l1" > 
235				<h5>Adicionar Infraestrutura</h5> 
236				<button id="fecharModal${JournalArticleID}" type="button" class="close" data-dismiss="modal" aria-label="Close"> 
237					<span aria-hidden="true">&times;</span> 
238				</button>    
239			</div> 
240			<div id="infraModal-l2-${JournalArticleID}" class="modal-body infraModal-l2"> 
241				<div id="infraName${JournalArticleID}" class="infraName"> 
242					<label class="ReqLabel" for="inputInfraName${JournalArticleID}">Nome da infraestrutura</label> 
243					<input type="text" id="inputInfraName${JournalArticleID}" value="${entry.getHighlightedTitle()}" placeholder="Nome da infraestrutura" required> 
244				</div> 
245			<div id="infraModel${JournalArticleID}" class="infraModel"> 
246				<label class="ReqLabel" for="inputInfraModel${JournalArticleID}">Modelo</label> 
247				<input type="text" id="inputInfraModel${JournalArticleID}" value="${modelo}" placeholder="Modelo" required> 
248			</div> 
249			<div id="infraBrand${JournalArticleID}" class="infraBrand"> 
250				<label class="ReqLabel" for="inputInfraBrand${JournalArticleID}">Marca</label> 
251				<input type="text" id="inputInfraBrand${JournalArticleID}" value="${marca}" placeholder="Marca" required> 
252			</div> 
253			 
254			<div id="infraImg${JournalArticleID}" class="infraImg"> 
255				<div style="display: flex; flex-direction: column; gap: 8px"> 
256					<label>Imagem da infraestrutura (Máx. 10 MB)</label> 
257					<label class="bioec_secondary_button" id="carregarImagem${JournalArticleID}" for="inputCarregarImagemInfra${JournalArticleID}" style="font-size: 16px;color: #333244;align-self:start;"> 
258						CARREGAR IMAGEM 
259					</label> 
260					<input id="inputCarregarImagemInfra${JournalArticleID}" class="inputCarregarImagemInfra" type="file" accept="image/*" onchange="encodeInfraImageAsURL${JournalArticleID}(this)"> 
261					<input class="d-none" id="inputInfraBase64${JournalArticleID}" value="${imageSrc}" /> 
262					<div class="imagemCarregadaInfra${JournalArticleID} d-md-none d-block" style="background-image: url(${imageSrc})"></div> 
263					<button type="button" id="removerImagemInfra${JournalArticleID}" class="<#if imageSrc == "" || imageSrc?? == false> d-none </#if> removerImagemInfra" > 
264						<i class="fa fa-trash"></i> Remover imagem	 
265					</button> 
266				</div> 
267				<div class="imagemCarregadaInfra${JournalArticleID} d-md-block d-none" style="background-image: url(${imageSrc})"></div> 
268			</div> 
269			 
270			<div id="infraFunction${JournalArticleID}" class="infraFunction"> 
271				<label class="ReqLabel" for="inputInfraFunction${JournalArticleID}">Função</label> 
272				<input type="text" id="inputInfraFunction${JournalArticleID}" class="inputInfraFunction" value="${funcao}" placeholder="Função" required> 
273			</div> 
274		</div> 
275		<div class="TextImportant"> 
276			<p> 
277			Importante: O conteúdo enviado passará por um processo interno de aprovação. Só então o conteúdo adicionado aparecerá no portal. 
278			</p> 
279		</div> 
280		<div id="infraModal-l3-${JournalArticleID}" class="modal-footer infraModal-l3"> 
281					<button class="bioec_secondary_button" onclick="">SALVAR E FECHAR</button> 
282		</div> 
283	</form> 
284	 
285	</div>			 
286</div> 
287</#if>					 
288					 
289 
290 
291 
292<script> 
293const SHOW_NOTICE_CONTAINER_BIOECONOMIA = "SHOW_NOTICE_CONTAINER_BIOECONOMIA"; 
294	 
295 
296 
297function closeNoticeContainer() { 
298  document.getElementById("upload-notice-container").style.display = "none"; 
299 
300  window.localStorage.removeItem(SHOW_NOTICE_CONTAINER_BIOECONOMIA); 
301
302 
303document 
304  .getElementById("close-btn-upload-container") 
305  .addEventListener("click", closeNoticeContainer); 
306 
307document.addEventListener("DOMContentLoaded", function(event) {  
308	console.log('chegou aqui', window.localStorage.getItem(SHOW_NOTICE_CONTAINER_BIOECONOMIA)); 
309  var showNoticeContainer = window.localStorage.getItem(SHOW_NOTICE_CONTAINER_BIOECONOMIA); 
310  if (showNoticeContainer == "true") { 
311    document.getElementById("upload-notice-container").style.display = "block"; 
312    window.localStorage.removeItem(SHOW_NOTICE_CONTAINER_BIOECONOMIA); 
313
314}); 
315 
316 
317 
318<#if userIsAdmin> 
319 
320document.querySelector('#formularioInfraestrutura${JournalArticleID}').addEventListener('submit', event => { 
321	event.preventDefault(); 
322	if (boolAddInfraestrutura == 0){ 
323		event.preventDefault(); 
324
325	editarSubmissao${JournalArticleID}(); 
326}); 
327 
328function editarSubmissao${JournalArticleID}(){ 
329 
330 
331		Liferay.Util.openToast({message: "Enviando requisição",type: "info",title: ""}); 
332		const infraData = { 
333			nome: document.getElementById("inputInfraName${JournalArticleID}").value, 
334			marca: document.getElementById("inputInfraBrand${JournalArticleID}").value, 
335			funcao: document.getElementById("inputInfraFunction${JournalArticleID}").value, 
336			modelo: document.getElementById("inputInfraModel${JournalArticleID}").value, 
337			autor: Liferay.ThemeDisplay.getUserName(), 
338			imagem: document.getElementById("inputInfraBase64${JournalArticleID}").value, 
339
340		console.log(JSON.stringify(infraData)); 
341 
342		fetch(Liferay.ThemeDisplay.getPortalURL() + "/o/infraestrutura/equipamento/${JournalArticleFrontId}", { 
343			method: 'PUT', 
344			"headers": { 
345				"x-csrf-token": Liferay.authToken, 
346				"Content-Type": "application/json" 
347			}, 
348			body: JSON.stringify(infraData) 
349		}) 
350		.then(res => { 
351			if(res.status == 200) { 
352			 
353				Liferay.Util.openToast({ 
354            message: "Infraestrutura editada com sucesso. Após a submissão, será iniciado um novo processo interno de aprovação do conteúdo enviado. Só então o conteúdo submetido aparecerá novamente no portal.", 
355            type: "success", 
356            title: "", 
357            toastProps: { 
358                autoClose: 5000 
359
360        }) 
361			 
362setTimeout(function(){ location.reload(); }, 2000); 
363				 
364			} else { 
365				Liferay.Util.openToast({ 
366            message: "Erro ao editar infraestrutura", 
367            type: "danger", 
368            title: "", 
369            toastProps: { 
370                autoClose: 5000 
371
372        }) 
373
374		}); 
375
376</#if> 
377 
378function excluirInfra(wcId, orgId) { 
379		Liferay.Util.openToast({message: "Enviando requisição",type: "info",title: ""}); 
380		fetch(Liferay.ThemeDisplay.getPortalURL() + "/o/infraestrutura/equipamento/" + wcId , { 
381			method: 'DELETE', 
382			"headers": { 
383				"x-csrf-token": Liferay.authToken, 
384				"Content-Type": "application/json" 
385
386		}) 
387		.then(res => { 
388			if(res.status == 200) { 
389				Liferay.Util.openToast({ 
390            message: "Infraestrutura excluida com sucesso", 
391            type: "success", 
392            title: "", 
393            toastProps: { 
394                autoClose: 5000 
395
396        }) 
397				setTimeout(function(){ location.reload(); }, 2000) 
398			} else { 
399				Liferay.Util.openToast({ 
400            message: "Erro ao excluir infraestrutura", 
401            type: "danger", 
402            title: "", 
403            toastProps: { 
404                autoClose: 5000 
405
406        }) 
407
408		}); 
409
410	 
411 
412	function encodeInfraImageAsURL${JournalArticleID}(element) { 
413  	let file = element.files[0]; 
414    let reader = new FileReader(); 
415    reader.onloadend = () => { 
416			if(reader.result)   { 
417				if(!validImageSize(reader.result)) return; 
418				try { 
419					Array.from(document.getElementsByClassName("imagemCarregadaInfra${JournalArticleID}")).forEach( el => el.style.backgroundImage = 'url(' + reader.result + ')' ) 
420					const base64_input = document.getElementById("inputInfraBase64${JournalArticleID}") 
421					base64_input.value = reader.result 
422					 
423					 
424					const removeImageButton = document.getElementById("removerImagemInfra${JournalArticleID}") 
425					removeImageButton.classList.remove("d-none") 
426				} catch (error) { 
427					console.error(error) 
428
429
430
431		reader.readAsDataURL(file); 
432
433	 
434	function removeImageInfra${JournalArticleID}() { 
435	try { 
436		const file_input = document.getElementById("inputCarregarImagemInfra${JournalArticleID}") 
437Array.from(document.getElementsByClassName("imagemCarregadaInfra${JournalArticleID}")).forEach( el => el.style.backgroundImage = "" ) 
438		const base64_input = document.getElementById("inputInfraBase64${JournalArticleID}") 
439		file_input.value = null 
440		base64_input.value = "" 
441		console.log("foi") 
442		const removeImageButton = document.getElementById("removerImagemInfra${JournalArticleID}") 
443		removeImageButton.classList.add("d-none") 
444	} catch (error) { 
445		console.error(error) 
446
447
448 
449 
450document.getElementById("removerImagemInfra${JournalArticleID}").addEventListener("click", removeImageInfra${JournalArticleID}); 
451	 
452</script> 
453<style> 
454 
455#upload-notice-container { 
456  background: var(--cinza-claro, #e8ecef); 
457  padding: 24px 24px 16px; 
458  width: 100%; 
459  position: relative; 
460  margin-bottom: 40px; 
461
462 
463#upload-notice-container #close-btn-upload-container { 
464  position: absolute; 
465  top: 0px; 
466  right: 2px; 
467  height: 24px; 
468  margin: 8px; 
469  cursor: pointer; 
470
471 
472#upload-notice-container #close-btn-upload-container i { 
473  font-size: 22px; 
474  color: #5B5C61; 
475
476 
477#upload-notice-container .upload-notice-title { 
478  font-size: 20px; 
479  /* font-family: Roboto; */ 
480  font-weight: 700; 
481  line-height: 150%; 
482  color: var(--texto, #5b5c61); 
483  display: flex; 
484  align-items: center; 
485  margin-bottom: 12px; 
486
487 
488#upload-notice-container .upload-notice-title i { 
489  color: #ffc806; 
490  margin-right: 12px; 
491  font-size: 24px; 
492
493 
494#upload-notice-container p { 
495  color: var(--texto, #5b5c61); 
496  font-size: 16px; 
497  /* font-family: Roboto; */ 
498  line-height: 150%; 
499  margin-bottom: 8px; 
500
501 
502#upload-notice-container p > span { 
503  font-weight: 700; 
504
505 
506 
507.imagemCarregadaInfra${JournalArticleID} { 
508	background-size: contain; 
509	background-position: center; 
510	background-repeat: no-repeat; 
511	height: 100px; 
512	width: 100px; 
513
514 
515#removerImagemInfra${JournalArticleID} { 
516	background: none; 
517	border: none; 
518	outline: none; 
519	color: #5B5C61; 
520	font-size: 16px; 
521	font-weight: 900; 
522	line-height: 24px; 
523	letter-spacing: 0em; 
524	width: fit-content; 
525	margin-left: 16px; 
526
527</style> 
528				</#list> 
529			</#if> 
530    </div> 
531</div> 
532 
533 
534<style> 
535 
536.bioec_infra_img { 
537    width: 140px; 
538    height: 140px; 
539    overflow: hidden; 
540		background-size: contain; 
541    background-position: center; 
542    background-repeat: no-repeat; 
543
544 
545.bioec_infra_img_placeholder { 
546    width: 140px; 
547    height: 140px; 
548    background-color: #E8ECEF; 
549    display: flex; 
550    flex-direction: column; 
551    align-items: center; 
552    justify-content: center; 
553    font-size: 14px; 
554    color: #5B5C61; 
555
556 
557.bioec_infra_img_placeholder i { 
558    font-size: 44px; 
559
560 
561 
562.bioec-profile-estrutura-main{ 
563	display: flex; 
564	gap: 40px; 
565	flex-direction: column; 
566	padding-bottom: 20px; 
567
568 
569.bioec-profile-estrutura-main h5, .bioec-profile-estrutura-main p, .bioec-profile-estrutura-main a{ 
570	color: #5B5C61; 
571
572 
573.bioec-profile-estrutura-main h5{ 
574	font-weight: 700; 
575
576.bioec-profile-estrutura-main h5, .bioec-profile-estrutura-main p{ 
577	 
578	font-size: 16px; 
579 
580
581 
582.bioec-profile-estrutura-main #estruturas-lista .estruturas-lista-item { 
583	border: 1px #BEBEBE solid;  
584	padding: 24px; 
585	display: grid; 
586	grid-template-columns: 24px 12px 138px 46px 1fr 12px 15px; 
587	grid-template-areas: "ck . pic . desc . arrw" 
588		". . clps clps clps clps clps"; 
589	margin-bottom: 40px; 
590
591 
592.bioec-profile-estrutura-main .lista-checkmark { grid-area: ck; } 
593.bioec-profile-estrutura-main .lista-pic { grid-area: pic; display: flex; justify-content: center;} 
594.bioec-profile-estrutura-main .lista-arrow { grid-area: arrw; } 
595.bioec-profile-estrutura-main .lista-collapse { grid-area: clps; } 
596 
597.bioec-profile-estrutura-main .lista-desc {  
598	grid-area: desc;  
599	display: flex;  
600	flex-direction: column; 
601	justify-content: center; 
602	 
603
604 
605.bioec-profile-estrutura-main .lista-desc h5{ 
606	margin-bottom: 12px; 
607}  
608 
609.bioec-profile-estrutura-main .lista-desc p{  
610	margin: 0; 
611
612 
613.bioec-profile-estrutura-main .lista-func {  
614	 
615	margin: 24px 0; 
616
617 
618.bioec-profile-estrutura-main .lista-footnote {  
619 
620	display: flex; 
621	justify-content: space-between; 
622	border-top: 1px solid #E8ECEF; 
623	padding-top: 12px; 
624	font-size: 14px; 
625	font-weight: 300; 
626	gap: 15px; 
627	color: #5B5C61; 
628 
629
630 
631.pagination-items-per-page.active > a,  
632.pagination-items-per-page.active > button,  
633.pagination-items-per-page.show > a,  
634.pagination-items-per-page.show > button, 
635.page-item.active .page-link,  
636.page-item.show .page-link{ 
637    border-color: #4ECD66; 
638    background-color: #4ECD66; 
639
640 
641.pagination-results, 
642.pagination-items-per-page > a,  
643.pagination-items-per-page > button, 
644.pagination-items-per-page > a:hover,  
645.pagination-items-per-page > button:hover, 
646.page-link{ 
647	color: #4ebe66; 
648
649 
650.estruturas-port{ 
651	border: 1px #BEBEBE solid;  
652	padding: 24px; 
653	display: flex; 
654	flex-direction: column; 
655	align-items: center; 
656	gap: 24px; 
657
658 
659.estruturas-port p{ 
660		text-align: center;	 
661    max-width: 760px; 
662    font-size: 18px; 
663    color: #5B5C61; 
664
665 
666.estruturas-port div{ 
667display: flex; 
668	justify-content: space-between; 
669	width: min(558px, 100%); 
670
671 
672.lista-arrow button{ 
673	padding: 0; 
674
675 
676.lista-arrow button:focus{ 
677	box-shadow: none; 
678
679 
680@media(max-width: 1100px){ 
681	.estruturas-port div{ 
682	flex-direction: column; 
683		gap: 30px; 
684
685 
686
687 
688@media(max-width: 450px){ 
689	.bioec-profile-estrutura-main .lista-footnote{ 
690		flex-direction: column; 
691		gap: 10px; 
692		align-items: flex-end; 
693		text-align: right; 
694
695
696 
697.bioec-profile-estrutura-main .lista-footnote .buttonsActions { 
698  display: flex; 
699  gap: 17px; 
700
701 
702@media(max-width:  768px){ 
703	.bioec-profile-estrutura-main #estruturas-lista .estruturas-lista-item{ 
704		grid-template-columns: 24px 1fr 10px 1fr 15px; 
705		grid-template-areas: "ck desc desc desc arrw" 
706													". pic pic pic ." 
707													"clps clps clps clps clps"; 
708 
709
710 
711	.bioec-profile-estrutura-main .lista-desc{ 
712	align-items: center; 
713
714 
715	.lista-pic{ 
716	display: flex; 
717	justify-content: center; 
718
719	 
720	.bioec-profile-estrutura-main .lista-footnote{ 
721		flex-direction: column; 
722    align-items: center; 
723
724	 
725	.bioec-profile-estrutura-main .lista-footnote > div { 
726    text-align: center; 
727
728   
729  .bioec-profile-estrutura-main .lista-footnote .barra-pipe { 
730    display: none; 
731
732  .bioec-profile-estrutura-main .lista-footnote .lista-author { 
733    display: flex; 
734    gap: 4px; 
735    justify-content: center; 
736
737  .bioec-profile-estrutura-main .lista-footnote .buttonsActions { 
738    width: 100%; 
739    justify-content: space-between; 
740
741
742</style> 
Demandas drop zone
adfgdfgf

hgsfghfsgh

sem imagem

Contato

dfghsdfg

54324354236

ghnsfgh

10/04/2023 | 0 cometários | Publicado por armando pereira
teste pro analytics demanda org

teste pro analytics demanda org

29/06/2023 | 0 cometários | Publicado por Luiz Miguel Dias Magdanello
Equipamento para determinação de ponto de fulgor

teste pro analytics demanda org

13/03/2023 | 0 cometários | Publicado por Anônimo
Reatores de alta pressão em batelada 1L, 2L, 7L

teste pro analytics demanda org

13/03/2023 | 0 cometários | Publicado por Anônimo
Tensiômetro para baixas tensões interfaciais

teste pro analytics demanda org

13/03/2023 | 0 cometários | Publicado por Anônimo
Analisador de tamanho de partícula

teste pro analytics demanda org

13/03/2023 | 0 cometários | Publicado por Anônimo
Potencial Zeta

teste pro analytics demanda org

13/03/2023 | 0 cometários | Publicado por Anônimo
Analisador de estabilidade coloidal

teste pro analytics demanda org

13/03/2023 | 0 cometários | Publicado por Anônimo
Análise Termogravimétrica com Calorimetria Exploratória Diferencial (TGA/DSC/DTA)

teste pro analytics demanda org

13/03/2023 | 0 cometários | Publicado por Anônimo
Equipamento de análise elementar de CHNS/O

teste pro analytics demanda org

13/03/2023 | 0 cometários | Publicado por Anônimo
Reator de Vidro de baixa pressão

teste pro analytics demanda org

13/03/2023 | 0 cometários | Publicado por Anônimo
Equipamento para determinação de ponto de fusão

teste pro analytics demanda org

13/03/2023 | 0 cometários | Publicado por Anônimo
Analisador de área

teste pro analytics demanda org

13/03/2023 | 0 cometários | Publicado por Anônimo
CG-MS

teste pro analytics demanda org

13/03/2023 | 0 cometários | Publicado por Anônimo
Ângulo de contato

teste pro analytics demanda org

13/03/2023 | 0 cometários | Publicado por Anônimo
Tensiômetro

teste pro analytics demanda org

13/03/2023 | 0 cometários | Publicado por Anônimo
Rotaevaporador

teste pro analytics demanda org

13/03/2023 | 0 cometários | Publicado por Anônimo
Reator Contínuo de Tanque Agitado de Alta Pressão

teste pro analytics demanda org

13/03/2023 | 0 cometários | Publicado por Anônimo
Titulador automático

teste pro analytics demanda org

13/03/2023 | 0 cometários | Publicado por Anônimo
ULTRA-TURRAX®

teste pro analytics demanda org

13/03/2023 | 0 cometários | Publicado por Anônimo
Ofertas drop zone
Um erro ocorreu enquanto processava o modelo.
The following has evaluated to null or missing:
==> autorArticleId  [in template "34764#34807#41133" at line 98, column 22]

----
Tip: If the failing expression is known to legally refer to something that's sometimes null or missing, either specify a default value like myOptionalVar!myDefault, or use <#if myOptionalVar??>when-present<#else>when-missing</#if>. (These only cover the last step of the expression; to cover the whole expression, use parenthesis: (myOptionalVar.foo)!myDefault, (myOptionalVar.foo)??
----

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

| 10/04/2023 | 0 comentários | Publicado por Anônimo
sem imagem

| 29/06/2023 | 0 comentários | Publicado por Anônimo
sem imagem

| 13/03/2023 | 0 comentários | Publicado por Anônimo
sem imagem

| 13/03/2023 | 0 comentários | Publicado por Anônimo
sem imagem

| 13/03/2023 | 0 comentários | Publicado por Anônimo
sem imagem

| 13/03/2023 | 0 comentários | Publicado por Anônimo
sem imagem

| 13/03/2023 | 0 comentários | Publicado por Anônimo
sem imagem

| 13/03/2023 | 0 comentários | Publicado por Anônimo
sem imagem

| 13/03/2023 | 0 comentários | Publicado por Anônimo
sem imagem

| 13/03/2023 | 0 comentários | Publicado por Anônimo
sem imagem

| 13/03/2023 | 0 comentários | Publicado por Anônimo
sem imagem

| 13/03/2023 | 0 comentários | Publicado por Anônimo
sem imagem

| 13/03/2023 | 0 comentários | Publicado por Anônimo
sem imagem

| 13/03/2023 | 0 comentários | Publicado por Anônimo
sem imagem

| 13/03/2023 | 0 comentários | Publicado por Anônimo
sem imagem

| 13/03/2023 | 0 comentários | Publicado por Anônimo
sem imagem

| 13/03/2023 | 0 comentários | Publicado por Anônimo
sem imagem

| 13/03/2023 | 0 comentários | Publicado por Anônimo
sem imagem

| 13/03/2023 | 0 comentários | Publicado por Anônimo
sem imagem

| 13/03/2023 | 0 comentários | Publicado por Anônimo
  • Sobre
  • Infraestruturas
  • Demandas
  • Ofertas
  • Publicações
Ordenar
Categoria
Marcador