Teste 15/02
Organização
Teste 15/02
Java method "com.sun.proxy.$Proxy136.getOrganization(long)" threw an exception when invoked on com.sun.proxy.$Proxy136 object "com.liferay.portal.service.impl.OrganizationLocalServiceImpl@51e5b32a"; see cause exception in the Java stack trace. ---- FTL stack trace ("~" means nesting-related): - Failed at: organization = OrganizationLocalServi... [in template "34764#34807#null" at line 14, column 17] ----
1<#assign
2 OrganizationLocalService = serviceLocator.findService("com.liferay.portal.kernel.service.OrganizationLocalService")
3/>
4
5<#assign
6 viewerHasPrivileges = false
7 userId = themeDisplay.getUserId()
8/>
9
10<#if userId?? && _CUSTOM_FIELD_organization.getData()?? && _CUSTOM_FIELD_organization.getData() !="" >
11 <#assign
12 orgId = _CUSTOM_FIELD_organization.getData()?number
13 viewerHasPrivileges = OrganizationLocalService.hasUserOrganization(userId, orgId)
14 organization = OrganizationLocalService.getOrganization(orgId)
15 />
16</#if>
17
18<#assign
19 nome = organization.getName()!""
20 imagem = (viewerHasPrivileges || DDMStructure_Field84114755.getData()!="0")?string(DDMStructure_CampoDeTexto18329557.getData()!"","")
21 tipo = (viewerHasPrivileges || DDMStructure_Numrico28474992.getData()!="0")?string(DDMStructure_Text61401294.getData()!"","")
22 tipo = tipo?replace("\n", "")
23 tipo = tipo?replace("\t", "")
24 tipo = tipo?replace("\r", "")
25 pais = (viewerHasPrivileges || DDMStructure_Field45654872.getData()!="0")?string(DDMStructure_Text47038833.getData()!"","")
26 cidade = (viewerHasPrivileges || DDMStructure_Field81614178.getData()!="0")?string(DDMStructure_Text38119908.getData()!"","")
27 estado = (viewerHasPrivileges || DDMStructure_Field89862022.getData()!="0")?string(DDMStructure_Text87845472.getData()!"","")!""
28
29 site = (viewerHasPrivileges || DDMStructure_Field62760436.getData()!="0")?string(DDMStructure_Text98734375.getData()!"","")
30 instagram = ""
31 linkedin = (viewerHasPrivileges || DDMStructure_Field18557678.getData()!="0")?string(DDMStructure_Text82629110.getData()!"","")
32 facebook = ""
33
34 sobre = (DDMStructure_Field80037203.getData()!="0")?string(DDMStructure_Text54730891.getData()!"","")
35 competencias = (DDMStructure_Numrico42321087.getData()!="0")?string(DDMStructure_Text51537691.getData()!"","")
36 setores = (DDMStructure_Field04200031.getData()!="0")?string("yes","")
37
38 instituicao = (viewerHasPrivileges || DDMStructure_Numrico42321087.getData()!="0")?string(DDMStructure_Text31001996.getData()!"","")
39 tipoDeEntidade = (viewerHasPrivileges || DDMStructure_Numrico28474992.getData()!="0")?string(DDMStructure_Text53411607.getData()!"","")
40
41
42>
43
44<div class="bioec_org_info_container">
45
46 <#if viewerHasPrivileges>
47 <!--<div class="botoesSidebarMobile mb-5">
48 <button class="bioec_secondary_button" data-toggle="modal" data-target="#bioec-org-delete-modal">
49 EXCLUIR ORGANIZAÇÃO
50 </button>
51 <button class="bioec_primary_button" data-toggle="modal" data-target="#bioec-org-edit-modal">
52 EDITAR
53 </button>
54 </div> -->
55 </#if>
56
57 <div id="profilePic">
58 <#if imagem?trim == "">
59 <div class="profilePic-container">
60 <i class="fa fa-user"></i>
61 <a id="btnEditOrgModal" type="button" data-toggle="modal" data-target="#bioec-org-edit-modal">
62 <i class="fa fa-edit"></i>
63 </a>
64 </div>
65 <#else>
66 <div id="ProfilePic_Frame">
67 <img src="${imagem}" />
68 <a id="btnEditOrgModal" type="button" data-toggle="modal" data-target="#bioec-org-edit-modal">
69 <i class="fa fa-edit"></i>
70 </a>
71 </div>
72 </#if>
73
74 </div>
75
76 <#if nome!="">
77 <label class="bioec_org_info_label">Nome da Organização</label>
78 <div class="bioec_org_info_content">${nome}</div>
79 </#if>
80
81 <#if tipo!="">
82 <label class="bioec_org_info_label">Tipo de Organização</label>
83 <div class="bioec_org_info_content">${tipo}</div>
84 </#if>
85
86 <#if instituicao!="" && tipo == "Grupo de Pesquisa/Universidade">
87 <label class="bioec_org_info_label">Instituição</label>
88 <div class="bioec_org_info_content">${instituicao}</div>
89 </#if>
90
91 <#if tipoDeEntidade!="" && tipo == "Investidor/Agência de Fomento">
92 <label class="bioec_org_info_label">Tipo de Entidade</label>
93 <div class="bioec_org_info_content">${tipoDeEntidade}</div>
94 </#if>
95
96 <#if cidade!="">
97 <label class="bioec_org_info_label">Cidade</label>
98 <div class="bioec_org_info_content">${cidade}</div>
99 </#if>
100
101 <#if estado!="">
102 <label class="bioec_org_info_label">Estado</label>
103 <div class="bioec_org_info_content">${estado}</div>
104 </#if>
105
106 <#if pais!="">
107 <label class="bioec_org_info_label">País</label>
108 <div class="bioec_org_info_content">${pais}</div>
109 </#if>
110
111 <div class="bioec_org_info_social_container">
112 <#if site != "">
113 <a href="${site}" target="_blank" rel="noopener noreferrer">
114 <i class="fa-solid fa-laptop"></i>
115 </a>
116 </#if>
117
118 <#if instagram != "">
119 <a href="${instagram}" target="_blank" rel="noopener noreferrer">
120 <i class="fa-brands fa-instagram"></i>
121 </a>
122 </#if>
123
124 <#if linkedin != "">
125 <a href="${linkedin}" target="_blank" rel="noopener noreferrer">
126 <i class="fa-brands fa-linkedin-in"></i>
127 </a>
128 </#if>
129
130 <#if facebook != "">
131 <a href="${facebook}" target="_blank" rel="noopener noreferrer">
132 <i class="fa-brands fa-facebook"></i>
133 </a>
134 </#if>
135
136 </div>
137
138 <#if false && viewerHasPrivileges>
139 <button data-toggle="modal" data-target="#privacyModal" class="bioec_primary_button">
140 CONFIGURAÇÕES DE PRIVACIDADE
141 </button>
142 </#if>
143</div>
144
145<style>
146.bioec_org_info_container {
147 display: flex;
148 flex-direction: column;
149 background-color: #E8ECEF;
150 height: 100%;
151 padding: 40px 24px 40px 0;
152}
153
154.bioec_org_info_img_placeholder {
155 align-self: center;
156 height: 120px;
157 width: 120px;
158 background-color: #595A5F;
159 border-radius: 50%;
160 display: flex;
161 align-items: center;
162 justify-content: center;
163 color: var(--white-1);
164 font-size: 72px;
165 cursor: default;
166}
167
168.bioec_org_info_label {
169 display: block;
170 font-weight: 700;
171 font-size: 20px;
172 line-height: 150%;
173 color: #5B5C61;
174 margin-bottom: 8px;
175 margin-top: 24px;
176 cursor: text;
177}
178
179.bioec_org_info_content {
180 display: block;
181 font-weight: 400;
182 font-size: 16px;
183 line-height: 150%;
184 color: #5B5C61;
185 border-bottom: 1px solid #BEBEBE;
186 padding-bottom: 4px;
187}
188
189.bioec_org_info_social_container {
190 display: flex;
191 flex-direction: row;
192 align-items: center;
193 justify-content: center;
194 margin: 40px 0;
195}
196
197.bioec_org_info_social_container a {
198 font-size: 35px;
199 color: #5B5C61;
200 margin: 0 15px;
201}
202
203.botoesSidebarMobile{
204display: none;
205justify-content: flex-end;
206gap: 20px;
207}
208#profilePic {
209 display: flex;
210 justify-content: center;
211 width: 120px;
212 height: 120px;
213 margin: auto;
214 position: relative;
215}
216
217#profilePic a:hover {
218 text-decoration: none;
219}
220
221#profilePic a#btnEditOrgModal {
222 text-decoration: none;
223 position: absolute;
224 right: 0;
225 bottom: 0;
226 color: var(--white);
227 background-color: var(--color-3);
228 height: 40px;
229 width: 40px;
230 border-radius: 50%;
231 border: none;
232 outline: none;
233 display: flex;
234 align-items: center;
235 justify-content: center;
236 padding: 0;
237 font-size: 18px;
238
239}
240
241#ProfilePic_Frame {
242 border-radius: 50%;
243 width: 100%;
244 height: 100%;
245 overflow: hidden;
246}
247 #ProfilePic_Frame img {
248 width: 100%;
249 height: 100%;
250 object-fit: cover;
251}
252
253.profilePic-container {
254 color: #FFF;
255 background-color: #595A5F;
256 border-radius: 50%;
257 position: relative;
258 display: flex;
259 align-items: center;
260 justify-content: center;
261 padding: 35px;
262 width: 100%;
263 height: 100%;
264 font-size: 70px;
265}
266
267
268@media (max-width: 1200px) {
269 .bioec_org_info_container {
270 padding: 40px 24px;
271 }
272}
273
274@media (max-width: 994px) {
275.botoesSidebarMobile{
276display: flex;
277}
278}
279</style>
Java method "com.sun.proxy.$Proxy136.getOrganization(long)" threw an exception when invoked on com.sun.proxy.$Proxy136 object "com.liferay.portal.service.impl.OrganizationLocalServiceImpl@51e5b32a"; see cause exception in the Java stack trace. ---- FTL stack trace ("~" means nesting-related): - Failed at: organization = OrganizationLocalServi... [in template "34764#34807#null" at line 20, column 17] ----
1<#assign
2 OrganizationLocalService = serviceLocator.findService("com.liferay.portal.kernel.service.OrganizationLocalService")
3 JournalArticleLocalService = serviceLocator.findService("com.liferay.journal.service.JournalArticleLocalService")
4/>
5
6<#assign
7 hasPrivileges = false
8 userId = themeDisplay.getUserId()
9/>
10
11<#assign
12 orgTypes = ["Entidade Governamental","Associação","Outras ICT's","Comunidade Tradicional/Cooperativa","Startup",
13 "Entidade do Terceiro Setor","Investidor/Agência de Fomento","Grupo de Pesquisa/Universidade","Empresa"]
14/>
15
16<#if userId?? && _CUSTOM_FIELD_organization.getData()?? && _CUSTOM_FIELD_organization.getData() !="" >
17<#assign
18 orgId = _CUSTOM_FIELD_organization.getData()?number
19 hasPrivileges = OrganizationLocalService.hasUserOrganization(userId, orgId)
20 organization = OrganizationLocalService.getOrganization(orgId)
21/>
22</#if>
23
24<#if hasPrivileges>
25 <#assign
26 organization = OrganizationLocalService.getOrganization(_CUSTOM_FIELD_organization.getData()?number)
27 articleId = organization.getExpandoBridge().getAttribute("journal-article")
28 journalArticle = JournalArticleLocalService.getArticle(themeDisplay.getLayout().getGroupId(),articleId?c)
29 articleXml = journalArticle.getDocument().getRootElement()
30
31 setoresXml = articleXml.selectNodes("dynamic-element[@name='Text40807358']")
32 setores = ""
33 />
34 <#list setoresXml as setor>
35 <#assign setores = setores + "'" + setor.getStringValue()?trim + "'," >
36 </#list>
37
38 <button class="bioec_secondary_button mx-3" data-toggle="modal" style="display: flex;margin-left: auto !important;margin-right: auto !important;margin-top: 24px;" data-target="#bioec-org-delete-modal">EXCLUIR ORGANIZAÇÃO</button>
39 <!-- <div class="mt-4 d-md-flex d-none align-items-center justify-content-end">
40 <button class="bioec_primary_button bioec_editar" data-toggle="modal" data-target="#bioec-org-edit-modal">EDITAR</button>
41 </div> -->
42
43 <#-- MODAL DE EXLUIR ORGANIZAÇÃO -->
44 <div id="bioec-org-delete-modal" class="modal fade" style="display: none;" role="dialog" aria-hidden="true">
45 <div class="modal-dialog" role="document">
46 <div class="modal-content px-4 py-3">
47 <div class="modal-header">
48 <h5 class="modal-title">Excluir organização</h5>
49 <button type="button" class="close" data-dismiss="modal" aria-label="Close">
50 <span aria-hidden="true">×</span>
51 </button>
52 </div>
53 <div class="d-flex justify-content-end py-3">
54 <button type="button" class="bioec_secondary_button mx-3" data-dismiss="modal">CANCELAR</button>
55 <button type="button" class="bioec_primary_button" onclick="deleteOrg()" >CONTINUAR</button>
56 </div>
57 </div>
58 </div>
59 </div>
60
61
62
63 <link href="https://cdn.jsdelivr.net/npm/select2@4.1.0-rc.0/dist/css/select2.min.css" rel="stylesheet" />
64 <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.6.3/jquery.min.js" integrity="sha512-STof4xm1wgkfm7heWqFJVn58Hm3EtS31XFaagaa8VMReCXAkQnJZ+jEy8PCC/iT18dFy95WcExNHFTqLyp72eQ==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
65 <script src="https://cdn.jsdelivr.net/npm/select2@4.1.0-rc.0/dist/js/select2.min.js"></script>
66 <link
67 rel="stylesheet"
68 href="https://cdnjs.cloudflare.com/ajax/libs/croppie/2.6.5/croppie.min.css"
69 integrity="sha512-zxBiDORGDEAYDdKLuYU9X/JaJo/DPzE42UubfBw9yg8Qvb2YRRIQ8v4KsGHOx2H1/+sdSXyXxLXv5r7tHc9ygg=="
70 crossorigin="anonymous"
71 referrerpolicy="no-referrer"
72 />
73
74 <script
75 src="https://cdnjs.cloudflare.com/ajax/libs/croppie/2.6.5/croppie.min.js"
76 integrity="sha512-Gs+PsXsGkmr+15rqObPJbenQ2wB3qYvTHuJO6YJzPe/dTLvhy0fmae2BcnaozxDo5iaF8emzmCZWbQ1XXiX2Ig=="
77 crossorigin="anonymous"
78 referrerpolicy="no-referrer"
79 ></script>
80
81
82<style>
83
84 .bioec_profile-form h1 {
85 font-weight: 400;
86 font-size: 39px;
87 line-height: 150%;
88 color: #5B5C61;
89 }
90
91 .bioec_profile-form-control {
92 margin-bottom: 40px;
93 }
94
95 .bioec_profile-form-control label {
96 color: #5B5C61;
97 font-size: 20px;
98 font-weight: 700;
99 line-height: 30px;
100 margin-bottom: 8px;
101 }
102
103 .bioec_profile-form-control label[required]::before {
104 content: "*";
105 color: #ff0000;
106 margin-right: 0.4rem;
107 }
108
109 .bioec_profile-form-control input,
110 .bioec_profile-form-control select {
111 border-radius: 0;
112 outline: none;
113 border: none;
114 border-bottom: 1px solid #BEBEBE;
115 font-size: 16px;
116 font-weight: 400;
117 line-height: 24px;
118 color: #5B5C61;
119 width: 100%;
120 background-color: transparent;
121 padding: 2px;
122 margin: 0;
123 }
124
125 .submit-attempted .bioec_profile-form-control input:invalid,
126 .submit-attempted .bioec_profile-form-control select:invalid {
127 border-bottom: 1px solid #ff0000;
128 }
129
130 .bioec_profile-flex-container {
131 display: flex;
132 flex-direction: row;
133 justify-content: space-between;
134 flex-wrap: wrap;
135 }
136
137 .bioec_profile-flex-container .bioec_profile-form-control {
138 width: 50%;
139 padding-right: 1.5rem;
140 }
141
142 .bioec_profile-form-control textarea {
143 font-size: 16px;
144 font-weight: 400;
145 line-height: 24px;
146 color: #5B5C61;
147 width: 100%;
148 background-color: transparent;
149 border-radius: 0;
150 border: 1px solid #BEBEBE;
151 resize: none;
152 outline: none;
153 margin-top: 24px;
154 }
155
156 .modal-header h1{
157 color: #5B5C61;
158 margin-bottom: 0px;
159 font-size: 25px;
160 line-height: 58.5px;
161 font-weight: 400;
162 }
163
164 @media (max-width: 768px) {
165 .bioec_profile-flex-container .bioec_profile-form-control {
166 margin-bottom: 1.5rem;
167 width: 100%;
168 padding-right: 0rem;
169 }
170 }
171</style>
172
173<script>
174
175function deleteOrg() {
176 Liferay.Util.openToast({message: "Enviando requisição",type: "info",title: ""});
177 fetch(Liferay.ThemeDisplay.getPortalURL() + "/o/profile-management/organization/${_CUSTOM_FIELD_organization.getData()}",
178 {
179 method: "DELETE",
180 headers: {
181 "x-csrf-token": Liferay.authToken,
182 "Content-Type": "application/json",
183 "Accept": "application/json"
184 }
185 })
186 .then( Liferay.Util.openToast({
187 message: "Estamos processando seu arquivo. Favor aguarde por alguns segundos e redireciorameos você automaticamente.",
188 type: "success",
189 title: "",
190 toastProps: {
191 autoClose: 2000
192 }
193 }))
194 .then(setTimeout(() => { window.location.href = Liferay.ThemeDisplay.getPortalURL() + "/meu-perfil#deleteOrg" }, 2000))
195
196
197
198}
199
200
201
202</script>
203
204</#if>
Java method "com.sun.proxy.$Proxy136.getOrganization(long)" threw an exception when invoked on com.sun.proxy.$Proxy136 object "com.liferay.portal.service.impl.OrganizationLocalServiceImpl@51e5b32a"; see cause exception in the Java stack trace. ---- FTL stack trace ("~" means nesting-related): - Failed at: organization = OrganizationLocalServi... [in template "34764#34807#null" at line 20, column 17] ----
1<#assign
2 OrganizationLocalService = serviceLocator.findService("com.liferay.portal.kernel.service.OrganizationLocalService")
3 JournalArticleLocalService = serviceLocator.findService("com.liferay.journal.service.JournalArticleLocalService")
4/>
5
6<#assign
7 hasPrivileges = false
8 userId = themeDisplay.getUserId()
9/>
10
11<#assign
12 orgTypes = ["Entidade Governamental","Associação","Outras ICT's","Comunidade Tradicional/Cooperativa","Startup",
13 "Entidade do Terceiro Setor","Investidor/Agência de Fomento","Grupo de Pesquisa/Universidade","Empresa"]
14/>
15
16<#if userId?? && _CUSTOM_FIELD_organization.getData()?? && _CUSTOM_FIELD_organization.getData() !="" >
17<#assign
18 orgId = _CUSTOM_FIELD_organization.getData()?number
19 hasPrivileges = OrganizationLocalService.hasUserOrganization(userId, orgId)
20 organization = OrganizationLocalService.getOrganization(orgId)
21/>
22</#if>
23
24<#if hasPrivileges && _CUSTOM_FIELD_organization.getData()?? && _CUSTOM_FIELD_organization.getData() !="">
25 <#assign
26 organization = OrganizationLocalService.getOrganization(_CUSTOM_FIELD_organization.getData()?number)
27 articleId = organization.getExpandoBridge().getAttribute("journal-article")
28 journalArticle = JournalArticleLocalService.getArticle(themeDisplay.getLayout().getGroupId(),articleId?c)
29 articleXml = journalArticle.getDocument().getRootElement()
30
31 setoresXml = articleXml.selectNodes("dynamic-element[@name='Text40807358']")
32 setores = ""
33 />
34 <#list setoresXml as setor>
35 <#assign setores = setores + "'" + setor.getStringValue()?trim + "'," >
36 </#list>
37
38 <div class="mt-4 d-md-flex d-none align-items-center justify-content-end" style="display:none!important;" >
39 <button class="bioec_secondary_button mx-3" data-toggle="modal" data-target="#bioec-org-delete-modal" >EXCLUIR ORGANIZAÇÃO</button>
40 <button class="bioec_primary_button bioec_editar" data-toggle="modal" data-target="#bioec-org-edit-modal" >EDITAR</button>
41 </div>
42
43
44
45
46
47 <#-- MODAL DE EXLUIR ORGANIZAÇÃO -->
48 <div id="bioec-org-delete-modal" class="modal fade" style="display: none;" role="dialog" aria-hidden="true">
49 <div class="modal-dialog" role="document">
50 <div class="modal-content px-4 py-3">
51 <div class="modal-header">
52 <h5 class="modal-title">Excluir organização</h5>
53 <button type="button" class="close" data-dismiss="modal" aria-label="Close">
54 <span aria-hidden="true">×</span>
55 </button>
56 </div>
57 <div class="d-flex justify-content-end py-3">
58 <button type="button" class="bioec_secondary_button mx-3" data-dismiss="modal">CANCELAR</button>
59 <button type="button" class="bioec_primary_button" onclick="deleteOrg()" >CONTINUAR</button>
60 </div>
61 </div>
62 </div>
63 </div>
64
65 <#-- MODAL DE EDIÇÃO -->
66 <div id="bioec-org-edit-modal" class="modal fade" style="display: none;" tabindex="-1" role="dialog" aria-hidden="true">
67 <div class="modal-dialog modal-lg" role="document">
68 <div class="modal-content px-4 py-3">
69
70 <div class="modal-header">
71 <h1>Sobre a organização</h1>
72 <button type="button" class="close" data-dismiss="modal" aria-label="Close" onclick="closeAndReset()">
73 <span aria-hidden="true">×</span>
74 </button>
75 </div>
76
77 <div class="modal-body">
78 <form id="organization-form" class="bioec_profile-form">
79<#assign imagemOrg = DDMStructure_CampoDeTexto18329557.getData() >
80
81 <div class="d-flex justify-content-center my-5" style="
82 flex-direction: column;
83 align-items: center;
84 ">
85 <div id="orgPicContainer" class="bioec_form-picture-container" ${(imagemOrg != "")?string("style='background-image: url("+ imagemOrg +")'","")} >
86 <i id="user-icon" class="fa fa-user"></i>
87 <button type="button" onclick="openFileSelectImagem()">
88 <i class="fa fa-edit"></i>
89 </button>
90 </div>
91 <input name="imagem" id="file-input" class="d-none" type="file" onchange="encodeImageAsURL(this)" accept="image/*"/>
92 <input class="d-none" id="inputOrgBase64OrgModal" />
93 <button type="button" onclick="removeImageOrgModal(this)" id="removerImagemOrgModal" ${(imagemOrg != "")?string("", "class='d-none'")}>
94 <i class="fa fa-trash"></i> Remover imagem
95 </button>
96 </div>
97
98 <div class="bioec_profile-flex-container">
99 <div class="bioec_profile-form-control">
100 <label required>Tipo de Organização</label>
101 <select id="tipo-de-organizacao" name="tipo" required title="Selecionar" value="${DDMStructure_Text61401294.getData()}">
102 <option value="" disabled selected>Selecionar</option>
103 <#list orgTypes as type>
104 <option value="${type}" ${(type==DDMStructure_Text61401294.getData())?string("selected","")} >${type}</option>
105 </#list>
106 </select>
107 </div>
108
109 <div class="bioec_profile-form-control">
110 <div id="org-tipo-6" class="d-none">
111 <label>Tipo de entidade</label>
112 <input name="investimento" type="text" id="tipodeentidadeOrganizacao" value="${DDMStructure_Text53411607.getData()}" />
113 </div>
114 <div id="org-tipo-7" class="d-none">
115 <label>Instituição</label>
116 <input name="instituicao" type="text" id="instituicaoOrganizacao" value="${DDMStructure_Text31001996.getData()}" />
117 </div>
118 </div>
119
120 <div class="bioec_profile-form-control">
121 <label required for="nomeOrganizacao">Nome da Organização</label>
122 <input id="nomeOrganizacao" name="nome" type="text" required value="${organization.getName()}" />
123 </div>
124
125 <div class="bioec_profile-form-control">
126 <label for="cidadeOrganizacao">Cidade</label>
127 <input id="cidadeOrganizacao" name="cidade" type="text" value="${DDMStructure_Text38119908.getData()}" />
128 </div>
129
130 <div class="bioec_profile-form-control">
131 <label for="estadoOrganizacao">Estado</label>
132 <input id="estadoOrganizacao" name="estado" type="text" value="${DDMStructure_Text87845472.getData()}" />
133 </div>
134
135
136 <div class="bioec_profile-form-control">
137 <label for="paisOrganizacao">País</label>
138 <input id="paisOrganizacao" name="pais" type="text" value="${DDMStructure_Text47038833.getData()}" />
139 </div>
140
141 </div>
142
143 <h1 class="my-5">Informações digitais</h1>
144
145 <div class="bioec_profile-flex-container">
146 <div class="bioec_profile-form-control">
147 <label for="siteOrganizacao">Site</label>
148 <input id="siteOrganizacao" name="site" type="url" value="${DDMStructure_Text98734375.getData()}" />
149 </div>
150 <div class="bioec_profile-form-control">
151 <label for="linkedinOrganizacao">Linkedin</label>
152 <input id="linkedinOrganizacao" name="linkedin" type="url" value="${DDMStructure_Text82629110.getData()}" />
153 </div>
154 <#-- <div class="bioec_profile-form-control">
155 <label>Instagram</label>
156 <input name="instagram" type="url" value="${Text28208517.getData()}" />
157 </div>
158 <div class="bioec_profile-form-control">
159 <label>Facebook</label>
160 <input name="facebook" type="url" value="${Text71851201.getData()}" />
161 </div> -->
162 </div>
163
164 <h1 class="my-5">Campo de atuação</h1>
165
166 <div>
167 <div class="bioec_profile-form-control">
168 <label required for="sobreOrganizacao">Sobre a organização</label>
169 <textarea id="sobreOrganizacao" name="sobre" rows="5" >${DDMStructure_Text54730891.getData()}</textarea>
170 </div>
171
172 <div class="bioec_profile-form-control">
173 <label required for="competenciasOrganizacao">Competências tecnológicas</label>
174 <textarea id="competenciasOrganizacao" name="competencias" rows="5" >${DDMStructure_Text51537691.getData()}</textarea>
175 </div>
176
177 <div class="bioec_profile-form-control">
178 <label required>Setores de atuação</label>
179 <select id="setores-de-atuacao" name="setores" multiple="multiple" style="width: 100%">
180 <option value="Agroindústria">Agroindústria</option>
181 <option value="Água Potável e Saneamento">Água Potável e Saneamento</option>
182 <option value="Alimentos e Bebidas">Alimentos e Bebidas</option>
183 <option value="Análise de Ciclo de Vida">Análise de Ciclo de Vida</option>
184 <option value="Biotecnologia">Biotecnologia</option>
185 <option value="Educação">Educação</option>
186 <option value="Energia e Biocombustíveis">Energia e Biocombustíveis</option>
187 <option value="Higiene Pessoal, Perfumaria e Cosméticos">Higiene Pessoal, Perfumaria e Cosméticos</option>
188 <option value="Inovação">Inovação</option>
189 </select>
190 </div>
191
192 <!-- <h1 class="mt-5 mb-4">Você na organização</h1>
193
194 <div class="bioec_profile-flex-container">
195 <div class="bioec_profile-form-control">
196 <label>Cargo/Função</label>
197 <input name="cargo" type="text" value="Administrador" />
198 </div>
199 </div> -->
200
201 </div>
202
203 <div class="d-flex justify-content-center my-5">
204 <button type="button" data-dismiss="modal" class="bioec_secondary_button mx-3" onclick="closeAndReset()">CANCELAR</a>
205 <button type="button" class="bioec_primary_button mx-3" onclick="submitOrganization()">SALVAR</button>
206 </div>
207
208 </form>
209 </div>
210 </div>
211 </div>
212 </div>
213
214 <link href="https://cdn.jsdelivr.net/npm/select2@4.1.0-rc.0/dist/css/select2.min.css" rel="stylesheet" />
215 <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.6.3/jquery.min.js" integrity="sha512-STof4xm1wgkfm7heWqFJVn58Hm3EtS31XFaagaa8VMReCXAkQnJZ+jEy8PCC/iT18dFy95WcExNHFTqLyp72eQ==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
216 <script src="https://cdn.jsdelivr.net/npm/select2@4.1.0-rc.0/dist/js/select2.min.js"></script>
217
218<script>
219
220
221function toggleSpecialFields(value) {
222 if(value == "Investidor/Agência de Fomento") {
223 $("#org-tipo-6").removeClass("d-none")
224 $("#org-tipo-7").addClass("d-none")
225 } else if(value == "Grupo de Pesquisa/Universidade") {
226 $("#org-tipo-7").removeClass("d-none")
227 $("#org-tipo-6").addClass("d-none")
228 } else {
229 $("#org-tipo-6").addClass("d-none")
230 $("#org-tipo-7").addClass("d-none")
231 }
232}
233
234$("#tipo-de-organizacao").change((obj) => {
235 const v = obj.target.value
236 toggleSpecialFields(v)
237});
238
239toggleSpecialFields(document.getElementById("tipo-de-organizacao").value)
240
241$(document).ready(() => {
242 $("#setores-de-atuacao").select2({
243 language: {
244 noResults: () => "Nenhum resultado encontrado",
245 },
246 selectionCssClass: "bioec_multi_select",
247 });
248 $("#setores-de-atuacao").val([${setores}]);
249 $("#setores-de-atuacao").trigger('change');
250
251 let urlSearchParams = new URLSearchParams(window.location.search);
252
253 if( urlSearchParams.has('popup_editar') == 1){
254 $('.bioec_editar').click();
255 urlSearchParams.delete('popup_editar');
256 if (history.replaceState) {
257 let searchString = urlSearchParams.toString().length > 0 ? '?' + urlSearchParams.toString() : '';
258 let newUrl = window.location.protocol + "//" + window.location.host + window.location.pathname + searchString + window.location.hash;
259 history.replaceState(null, '', newUrl);
260 }
261 }
262});
263
264function validImageSize(base64="") {
265 const decoded = atob(base64.substring(base64.indexOf(',') + 1));
266 const sizeMB = decoded.length / 1e+6;
267 console.log("MB: " + decoded.length / 1e+6);
268 if(sizeMB > 10) {
269 Liferay.Util.openToast({
270 message: "O tamanho da imagem não deve ultrapassar 10 MB.",
271 type: "danger",
272 title: "",
273 toastProps: {
274 autoClose: 5000
275 }
276 })
277 return false
278 }
279 return true
280}
281
282 function encodeImageAsURL(element) {
283 let file = element.files[0];
284 let reader = new FileReader();
285 reader.onloadend = () => {
286 if(reader.result) {
287 if(!validImageSize(reader.result)) return;
288 try {
289 console.log("hi!")
290 const pic_container = document.getElementById("orgPicContainer")
291 const base64_input = document.getElementById("inputOrgBase64OrgModal")
292 base64_input.value = reader.result
293 pic_container.style.backgroundImage = 'url(' + reader.result + ')'
294 const removeImageButton = document.getElementById(
295 "removerImagemOrgModal"
296 );
297 const user_icon = document.getElementById("user-icon")
298 user_icon.style.display = "none";
299 removeImageButton.classList.remove("d-none");
300 } catch (error) {
301 console.error(error)
302 }
303 }
304 }
305 reader.readAsDataURL(file);
306 }
307
308 function removeImageOrgModal(element) {
309 try {
310 const file_input = document.getElementById("file-input");
311 const pic_container = document.getElementById("orgPicContainer")
312 const base64_input = document.getElementById("inputOrgBase64OrgModal");
313
314 file_input.value = null;
315 base64_input.value = "";
316 pic_container.style.backgroundImage = null;
317
318 const user_icon = document.getElementById("user-icon")
319 user_icon.style.display = "block";
320
321 const removeImageButton = document.getElementById("removerImagemOrgModal");
322 removeImageButton.classList.add("d-none");
323 } catch (error) {
324 console.error(error);
325 }
326 }
327
328function openFileSelectImagem() {
329 document.getElementById("file-input").click();
330}
331
332function initUrl(input, defaulthost) {
333 const value = input.value;
334 if(!value) {
335 input.value = defaulthost;
336 }
337}
338
339function submitForm() {
340console.log("Tentativa de envio")
341const form = document.getElementById("organization-form")
342form.classList.add("submit-attempted")
343}
344
345function closeAndReset() {
346 document.getElementById("organization-form").reset();
347}
348
349</script>
350
351<style>
352
353 .bioec_profile-form #removerImagemOrgModal {
354 background: none;
355 cursor: pointer;
356 border: none;
357 outline: none;
358 color: #5b5c61;
359 font-size: 16px;
360 font-weight: 900;
361 line-height: 24px;
362 letter-spacing: 0em;
363 width: fit-content;
364 margin-left: 16px;
365 margin-top: 22px;
366 }
367
368
369 .bioec_profile-form h1 {
370 font-weight: 400;
371 font-size: 39px;
372 line-height: 150%;
373 color: #5B5C61;
374 }
375
376 .bioec_profile-form-control {
377 margin-bottom: 40px;
378 }
379
380 .bioec_profile-form-control label {
381 color: #5B5C61;
382 font-size: 20px;
383 font-weight: 700;
384 line-height: 30px;
385 margin-bottom: 8px;
386 }
387
388 .bioec_profile-form-control label[required]::before {
389 content: "*";
390 color: #ff0000;
391 margin-right: 0.4rem;
392 }
393
394 .bioec_profile-form-control input,
395 .bioec_profile-form-control select {
396 border-radius: 0;
397 outline: none;
398 border: none;
399 border-bottom: 1px solid #BEBEBE;
400 font-size: 16px;
401 font-weight: 400;
402 line-height: 24px;
403 color: #5B5C61;
404 width: 100%;
405 background-color: transparent;
406 padding: 2px;
407 margin: 0;
408 }
409
410 .submit-attempted .bioec_profile-form-control input:invalid,
411 .submit-attempted .bioec_profile-form-control select:invalid {
412 border-bottom: 1px solid #ff0000;
413 }
414
415 .bioec_profile-flex-container {
416 display: flex;
417 flex-direction: row;
418 justify-content: space-between;
419 flex-wrap: wrap;
420 }
421
422 .bioec_profile-flex-container .bioec_profile-form-control {
423 width: 50%;
424 padding-right: 1.5rem;
425 }
426
427 .bioec_profile-form-control textarea {
428 font-size: 16px;
429 font-weight: 400;
430 line-height: 24px;
431 color: #5B5C61;
432 width: 100%;
433 background-color: transparent;
434 border-radius: 0;
435 border: 1px solid #BEBEBE;
436 resize: none;
437 outline: none;
438 margin-top: 24px;
439 }
440
441 .bioec_form-picture-container {
442 color: var(--white);
443 background-color: #595A5F;
444 border-radius: 50%;
445 position: relative;
446 display: flex;
447 align-items: center;
448 justify-content: center;
449 padding: 35px;
450 width: 180px;
451 height: 180px;
452 font-size: 100px;
453 background-size: cover;
454 }
455
456 .bioec_form-picture-container[style] > i {
457 display: none;
458 }
459
460 .bioec_form-picture-container button {
461 position: absolute;
462 right: 0;
463 bottom: 0;
464 color: var(--white);
465 background-color: var(--color-3);
466 height: 40px;
467 width: 40px;
468 border-radius: 50%;
469 border: none;
470 outline: none;
471 display: flex;
472 align-items: center;
473 justify-content: center;
474 padding: 0;
475 font-size: 18px
476 }
477
478 .bioec_multi_select {
479 font-size: 16px;
480 font-weight: 400;
481 line-height: 24px;
482 color: #5B5C61;
483 width: 100%;
484 background-color: transparent;
485 border-radius: 0 !important;
486 border: 1px solid #BEBEBE !important;
487 resize: none;
488 outline: none;
489 padding: 12px !important;
490 }
491
492 .bioec_multi_select .select2-selection__choice {
493 background-color: transparent !important;
494 margin-left: 12px !important;
495 margin-top: 0px !important;
496 }
497
498 .modal-header h1{
499 color: #5B5C61;
500 margin-bottom: 0px;
501 font-size: 25px;
502 line-height: 58.5px;
503 font-weight: 400;
504 }
505
506 @media (max-width: 768px) {
507 .bioec_profile-flex-container .bioec_profile-form-control {
508 margin-bottom: 1.5rem;
509 width: 100%;
510 padding-right: 0rem;
511 }
512 }
513</style>
514
515<script>
516
517function deleteOrg() {
518 Liferay.Util.openToast({message: "Enviando requisição",type: "info",title: ""});
519 fetch(Liferay.ThemeDisplay.getPortalURL() + "/o/profile-management/organization/${_CUSTOM_FIELD_organization.getData()}",
520 {
521 method: "DELETE",
522 headers: {
523 "x-csrf-token": Liferay.authToken,
524 "Content-Type": "application/json",
525 "Accept": "application/json"
526 }
527 })
528 .then( Liferay.Util.openToast({
529 message: "Estamos processando seu arquivo. Favor aguarde por alguns segundos e redireciorameos você automaticamente.",
530 type: "success",
531 title: "",
532 toastProps: {
533 autoClose: 2000
534 }
535 }))
536 .then(setTimeout(() => { window.location.href = Liferay.ThemeDisplay.getPortalURL() + "/meu-perfil#deleteOrg" }, 2000))
537
538
539
540}
541
542
543function submitOrganization() {
544 Liferay.Util.openToast({
545 message: "Enviando requisição",
546 type: "info",
547 title: "",
548 });
549 console.log("submitOrganization");
550 let site = document.getElementById("siteOrganizacao").value;
551 let linkedin = document.getElementById("linkedinOrganizacao").value;
552
553 if (site != "") {
554 if (
555 !site.startsWith("https://") &&
556 !site.startsWith("http://") &&
557 !site.startsWith("https://www") &&
558 !site.startsWith("http://www")
559 ) {
560 Liferay.Util.openToast({
561 message:
562 "O campo 'site' precisa começar com 'https://', 'http://', 'https://www' ou 'http://www' para ser válido",
563 type: "danger",
564 title: "",
565 toastProps: {
566 autoClose: 5000,
567 },
568 });
569 return;
570 }
571 }
572
573 if (linkedin != "") {
574 if (
575 !linkedin.startsWith("https://www.linkedin.com") &&
576 !site.startsWith("http://www.linkedin.com") &&
577 !linkedin.startsWith("https://linkedin.com") &&
578 !site.startsWith("http://linkedin.com")
579 ) {
580 Liferay.Util.openToast({
581 message:
582 "O campo 'linkedin' precisa começar com 'https://www.linkedin.com' ou 'http://www.linkedin.com' com ou sem os 'www.' para ser válido",
583 type: "danger",
584 title: "",
585 toastProps: {
586 autoClose: 5000,
587 },
588 });
589 return;
590 }
591 }
592
593 fetch(
594 Liferay.ThemeDisplay.getPortalURL() +
595 "/o/profile-management/organization/${_CUSTOM_FIELD_organization.getData()}",
596 {
597 method: "PUT",
598 headers: {
599 "x-csrf-token": Liferay.authToken,
600 "Content-Type": "application/json",
601 },
602 body: JSON.stringify({
603 imagem: document.getElementById("inputOrgBase64OrgModal").value,
604 tipo: document.getElementById("tipo-de-organizacao").value,
605 nome: document.getElementById("nomeOrganizacao").value.trim(),
606 cidade: document.getElementById("cidadeOrganizacao").value,
607 estado: document.getElementById("estadoOrganizacao").value,
608 pais: document.getElementById("paisOrganizacao").value,
609 site: document.getElementById("siteOrganizacao").value,
610 linkedin: document.getElementById("linkedinOrganizacao").value,
611 sobre: document.getElementById("sobreOrganizacao").value,
612 setores: $("#setores-de-atuacao").select2("val"),
613 competencias: document.getElementById("competenciasOrganizacao").value,
614 tipodeentidade: document.getElementById("tipodeentidadeOrganizacao")
615 .value,
616 instituicao: document.getElementById("instituicaoOrganizacao").value,
617 }),
618 }
619 )
620 .then(
621 (response) =>
622 new Promise((resolve, reject) => {
623 resolve({
624 status: response.status,
625 ok: response.ok,
626 }).then((r) => console.log(r));
627 reject({}).then((c) => console.log(c));
628 })
629 )
630 .then((res) => {
631 if (res.status == "200") {
632 Liferay.Util.openToast({
633 message: "Perfil alterado com sucesso.",
634 type: "success",
635 title: "",
636 toastProps: {
637 autoClose: 5000,
638 },
639 });
640 location.reload();
641 } else if(res.status == "302"){
642 Liferay.Util.openToast({
643 message: "Cadastre uma organização com SITE diferente.",
644 type: "danger",
645 title: "Site inserido já existe",
646 toastProps: {
647 autoClose: 5000
648 }
649 })
650 } else if(res.status == "409"){
651 Liferay.Util.openToast({
652 message: "Cadastre uma organização com Nome da Organização diferente.",
653 type: "danger",
654 title: "Nome da Organização cadastrada já existe",
655 toastProps: {
656 autoClose: 5000
657 }
658 })
659 }
660 })
661 .catch((e) => console.log(e));
662}
663
664
665</script>
666
667</#if>
Java method "com.sun.proxy.$Proxy136.getOrganization(long)" threw an exception when invoked on com.sun.proxy.$Proxy136 object "com.liferay.portal.service.impl.OrganizationLocalServiceImpl@51e5b32a"; see cause exception in the Java stack trace. ---- FTL stack trace ("~" means nesting-related): - Failed at: organization = OrganizationLocalServi... [in template "34764#34807#null" at line 15, column 17] ----
1<#assign
2 OrganizationLocalService = serviceLocator.findService("com.liferay.portal.kernel.service.OrganizationLocalService")
3 JournalArticleLocalService = serviceLocator.findService("com.liferay.journal.service.JournalArticleLocalService")
4/>
5
6<#assign
7 viewerHasPrivileges = false
8 userId = themeDisplay.getUserId()
9/>
10
11<#if userId?? && _CUSTOM_FIELD_organization.getData()?? && _CUSTOM_FIELD_organization.getData() !="" >
12 <#assign
13 orgId = _CUSTOM_FIELD_organization.getData()?number
14 viewerHasPrivileges = OrganizationLocalService.hasUserOrganization(userId, orgId)
15 organization = OrganizationLocalService.getOrganization(orgId)
16 />
17</#if>
18
19
20<#if (viewerHasPrivileges || DDMStructure_Field04200031.getData() != "0") && _CUSTOM_FIELD_organization.getData()?? && _CUSTOM_FIELD_organization.getData() !="" >
21<#assign
22 organization = OrganizationLocalService.getOrganization(_CUSTOM_FIELD_organization.getData()?number)
23 articleId = organization.getExpandoBridge().getAttribute("journal-article")
24 journalArticle = JournalArticleLocalService.getArticle(themeDisplay.getLayout().getGroupId(),articleId?c)
25 articleXml = journalArticle.getDocument().getRootElement()
26
27 setores = articleXml.selectNodes("dynamic-element[@name='Text67772680']")
28/>
29<#else>
30<#assign setores = ["privado"] />
31</#if>
32
33<#assign
34
35 sobre = (viewerHasPrivileges || DDMStructure_Field80037203.getData()!="0")?string(DDMStructure_Text54730891.getData()!"","")
36 competencias = (viewerHasPrivileges || DDMStructure_Field75645729.getData()!="0")?string(DDMStructure_Text51537691.getData()!"","")
37
38>
39
40<div>
41
42 <#if viewerHasPrivileges || DDMStructure_Field80037203.getData()!="0" >
43 <div class="bioec_org_sobre">
44 <label>Sobre a organização</label>
45 <div class="bioec_org_sobre_container">
46 <#if sobre != "">
47 ${sobre}
48 <#else>
49 <div class="bioec_org_sobre_vazio">
50 Nenhuma descrição foi adicionada neste perfil ainda
51 </div>
52 </#if>
53 </div>
54 </div>
55 </#if>
56
57 <#if viewerHasPrivileges || DDMStructure_Field75645729.getData()!="0" >
58 <div class="bioec_org_sobre">
59 <label>Competências tecnológicas</label>
60 <div class="bioec_org_sobre_container">
61 <#if competencias != "">
62 ${competencias}
63 <#else>
64 <div class="bioec_org_sobre_vazio">
65 Nenhuma descrição foi adicionada neste perfil ainda
66 </div>
67 </#if>
68 </div>
69 </div>
70 </#if>
71
72 <#if viewerHasPrivileges || DDMStructure_Field04200031.getData()!="0" >
73 <div class="bioec_org_sobre">
74 <label>Setor(es) de atuação</label>
75 <div class="bioec_org_sobre_container">
76 <#if setores[0]!="privado">
77 <#if setores?size == 1 && setores[0].getStringValue()?trim == "" >
78 <div class="bioec_org_sobre_vazio">
79 Nenhum setor foi adicionado neste perfil ainda
80 </div>
81 <#else>
82 <#if setores?size != 0 >
83 <ul>
84 <#list setores as setor>
85 <li>${setor.getStringValue()}</li>
86 </#list>
87 </ul>
88 <#else>
89 <div class="bioec_org_sobre_vazio">
90 Nenhum setor foi adicionado neste perfil ainda
91 </div>
92 </#if>
93 </#if>
94 <#else>
95 <div class="bioec_org_sobre_vazio">
96 Nenhum setor foi adicionado neste perfil ainda
97 </div>
98 </#if>
99 </div>
100 </div>
101 </#if>
102
103</div>
104
105<style>
106.bioec_org_sobre label {
107 color: #5B5C61;
108 font-weight: 700;
109 margin-bottom: 10px;
110 font-size: 20px;
111 line-height: 30px;
112}
113
114.bioec_org_sobre_container {
115 font-size: 16px;
116 border: 1px solid #BEBEBE;
117 padding: 24px;
118 color: #5B5C61;
119 margin-bottom: 40px;
120}
121
122.bioec_org_sobre_vazio {
123 color: #5B5C61;
124 font-size: 16px;
125 text-align: center;
126 font-weight: 700;
127}
128
129.bioec_org_sobre_container ul {
130 color: #5B5C61;
131 margin: 0;
132}
133</style>
Java method "com.sun.proxy.$Proxy136.getOrganization(long)" threw an exception when invoked on com.sun.proxy.$Proxy136 object "com.liferay.portal.service.impl.OrganizationLocalServiceImpl@51e5b32a"; see cause exception in the Java stack trace. ---- FTL stack trace ("~" means nesting-related): - Failed at: organization = OrganizationLocalServi... [in template "34764#34807#null" at line 24, column 9] ----
1<#assign
2 viewerHasPrivileges = false
3 userId = themeDisplay.getUserId()
4/>
5<#assign JournalArticleLocalService = serviceLocator.findService("com.liferay.journal.service.JournalArticleLocalService")>
6
7
8<#if userId?? && _CUSTOM_FIELD_organization.getData()?? && _CUSTOM_FIELD_organization.getData() !="" >
9 <#assign
10 OrganizationLocalService = serviceLocator.findService("com.liferay.portal.kernel.service.OrganizationLocalService")
11 />
12 <#assign
13 orgId = _CUSTOM_FIELD_organization.getData()?number
14 viewerHasPrivileges = OrganizationLocalService.hasUserOrganization(userId, orgId)
15 />
16</#if>
17
18<#assign
19 UserLocalService = serviceLocator.findService("com.liferay.portal.kernel.service.UserLocalService")
20/>
21<#assign
22 orgId = _CUSTOM_FIELD_organization.getData()?number
23 users = UserLocalService.getOrganizationUsers(orgId)
24 organization = OrganizationLocalService.getOrganization(orgId)
25 nomeDaOrg = organization.getName()!""
26/>
27
28<div class="bioec_org_admins">
29 <label>Administradores desse perfil</label>
30
31 <#list users as user>
32 <#assign userArticleId = user.getExpandoBridge().getAttribute("journal-article")!"0" >
33
34 <#assign urlWC = "">
35 <#if userArticleId != "0" && userArticleId != "">
36 <#assign userArticle = JournalArticleLocalService.getLatestArticle(themeDisplay.getLayout().getGroupId(), userArticleId?string) >
37 <#assign urlWC = userArticle.getUrlTitle()!"">
38 </#if>
39
40
41 <#assign
42 nome = user.getFullName()
43 />
44 <div class="bioec_org_admin_container">
45 <div class="bioec_org_admin_img_placeholder">
46 <i class="fa-solid fa-user"></i>
47 </div>
48 <div class="bioec_org_admin_content">
49 <b><a style="color: #5B5C61;" href="<#if urlWC != ''>/w/${urlWC}</#if>">${nome}</a></b>
50 Administrador
51 </div>
52 <#if viewerHasPrivileges>
53 <div class="bioec_org_admin_buttons_container">
54 <#if userId != user.getUserId() >
55 <button class="bioec_org_admin_button d-none" data-toggle="modal" data-target="#bioec-admin-modal">
56 <i class="fa-solid fa-pen-to-square"></i>
57 </button>
58 <button class="bioec_org_admin_button" onclick="removeAdminFromOrg(${user.getUserId()})">
59 <i class="fa-solid fa-trash-can"></i>
60 </button>
61 </#if>
62 </div>
63 </#if>
64 </div>
65 </#list>
66
67 <#if viewerHasPrivileges>
68 <div class="bioec_org_flex_end">
69 <#if (1 < users?size)>
70 <button class="bioec_secondary_button mx-3 mb-4 mb-md-0" data-toggle="modal" data-target="#bioec-leave-modal">DEIXAR DE SER ADMINISTRADOR</button>
71 </#if>
72 <button class="bioec_primary_button bioec_modal-adicionar" data-toggle="modal" data-target="#bioec-admin-modal">ADICIONAR ADMINISTRADOR</button>
73 </div>
74
75 <#-- MODAL DE ADICIONAR ADMINISTRADOR -->
76 <div id="bioec-admin-modal" class="modal fade" style="display: none;" role="dialog" aria-hidden="true">
77 <div class="modal-dialog modal-lg" role="document">
78 <div class="modal-content">
79 <div class="py-3 px-4 d-flex justify-content-between bioec_modal-line">
80 <div class="bioec_modal-title">Adicionar administrador</div>
81 <button type="button" class="close" data-dismiss="modal" aria-label="Close">
82 <i class="fa-solid fa-xmark"></i>
83 </button>
84 </div>
85 <div class="bioec_modal-form">
86 <div class="py-3 px-4 bioec_modal-line">
87 <h1>${title.getData()}</h1>
88 <div class="bioec_modal-form-control">
89 <label>E-mail do administrador</label>
90 <input id="admin-email" type="text" placeholder="Digite aqui" value="" >
91 </div>
92 <div class="bioec_modal-form-control d-none">
93 <label>Cargo/Função</label>
94 <input id="admin-role" type="text" placeholder="Digite aqui" value="" >
95 </div>
96 </div>
97 <div class="py-3 px-4 d-flex justify-content-end">
98 <button type="button" class="bioec_secondary_button mx-3" data-dismiss="modal">CANCELAR</button>
99 <button type="button" class="bioec_primary_button" onclick="addAdminToOrg()">CONTINUAR</button>
100 </div>
101 </div>
102 </div>
103 </div>
104 </div>
105
106 <#-- MODAL DE DEIXAR ORGANIZAÇÃO -->
107 <div id="bioec-leave-modal" class="modal fade" style="display: none;" role="dialog" aria-hidden="true">
108 <div class="modal-dialog modal-lg" role="document">
109 <div class="modal-content px-4 py-4">
110 <div class="d-flex justify-content-between">
111 <h5 class="modal-title">Deixar de ser administrador</h5>
112 <button type="button" class="close" data-dismiss="modal" aria-label="Close">
113 <span aria-hidden="true">×</span>
114 </button>
115 </div>
116 <div class="my-3">
117 <div class="mb-3">
118 ${title.getData()}
119 </div>
120 Ao clicar em continuar, a organização será removida do seu perfil. Caso possua outros administradores, ela continuará nos perfis desses usuários.
121 </div>
122 <div class="d-flex justify-content-end">
123 <button type="button" class="bioec_secondary_button mx-3" data-dismiss="modal">CANCELAR</button>
124 <button type="button" class="bioec_primary_button" onclick="quitOrganization()" >CONTINUAR</button>
125 </div>
126 </div>
127 </div>
128 </div>
129
130 </#if>
131</div>
132
133<script>
134
135$(document).ready(() => {
136 let urlSearchParams = new URLSearchParams(window.location.search);
137
138 if( urlSearchParams.has('popup_adicionar_admin') == 1){
139 $('.bioec_modal-adicionar').click();
140 urlSearchParams.delete("popup_adicionar_admin");
141 if (history.replaceState) {
142 let searchString = urlSearchParams.toString().length > 0 ? '?' + urlSearchParams.toString() : '';
143 let newUrl = window.location.protocol + "//" + window.location.host + window.location.pathname + searchString + window.location.hash;
144 history.replaceState(null, '', newUrl);
145 }
146 }
147});
148
149
150
151
152function quitOrganization() {
153 const url = Liferay.ThemeDisplay.getPortalURL() + "/o/profile-management/organization/${_CUSTOM_FIELD_organization.getData()}/user/" + ${userId}
154 fetch(url, {
155 method: 'DELETE',
156 "headers": {
157 "x-csrf-token": Liferay.authToken,
158 "Content-Type": "application/json"
159 }
160 })
161 .then(res => {
162 if(res.status == "200"){
163 Liferay.Util.openToast({
164 message: "Você deixou de ser Administrador",
165 type: "success",
166 title: "",
167 toastProps: {
168 autoClose: 5000
169 }
170 })
171 location.reload();
172 } else {throw "err";}
173 })
174 .catch(() => showErrorToast("Não foi possível adicionar o administrador. Verifique o email e tente novamente"))
175}
176
177function removeAdminFromOrg(userId) {
178 console.log(userId)
179 if(userId) {
180 const url = Liferay.ThemeDisplay.getPortalURL() + "/o/profile-management/organization/${_CUSTOM_FIELD_organization.getData()}/user/" + userId
181 fetch(url, {
182 method: 'DELETE',
183 "headers": {
184 "x-csrf-token": Liferay.authToken,
185 "Content-Type": "application/json"
186 }
187 })
188 .then(res => {
189 if(res.status == "200"){
190 Liferay.Util.openToast({
191 message: "Administrador deletado com sucesso.",
192 type: "success",
193 title: "",
194 toastProps: {
195 autoClose: 5000
196 }
197 })
198 location.reload();
199 } else {throw "err";}
200 })
201 .catch(() => showErrorToast("Não foi possível adicionar o administrador. Verifique o email e tente novamente"))
202 }
203}
204
205function addAdminToOrg() {
206 const userEmail = document.getElementById("admin-email").value
207 console.log(userEmail)
208 if(userEmail) {
209 const url = Liferay.ThemeDisplay.getPortalURL() + "/o/profile-management/organization/${_CUSTOM_FIELD_organization.getData()}/user/" + userEmail
210 fetch(url, {
211 method: 'POST',
212 "headers": {
213 "x-csrf-token": Liferay.authToken,
214 "Content-Type": "application/json"
215 }
216 })
217 .then(res => {
218 if(res.status == "200"){
219 Liferay.Util.openToast({
220 message: "Administrador adicionado com sucesso.",
221 type: "success",
222 title: "",
223 toastProps: {
224 autoClose: 5000
225 }
226 })
227 location.reload();
228 gtag('event', 'admnistrador_registrado', {
229 "orgName" : "${nomeDaOrg}"
230 });
231 } else {throw "err";}
232 })
233 .catch(() => showErrorToast("Não foi possível adicionar o administrador. Verifique o email e tente novamente"))
234 }
235}
236
237const showErrorToast = message => {
238 Liferay.Util.openToast({
239 message,
240 type: "danger",
241 title: "",
242 toastProps: {
243 autoClose: 5000,
244 style: { top: 0 },
245 }
246 })
247 }
248
249</script>
250
251<style>
252 .bioec_org_admins {
253 margin-bottom: 40px;
254 }
255
256 .bioec_org_admins label {
257 color: #5B5C61;
258 font-weight: 700;
259 margin-bottom: 10px;
260 font-size: 20px;
261 line-height: 30px;
262 }
263
264 .bioec_org_admin_container {
265 border: 1px solid #BEBEBE;
266 padding: 24px;
267 margin-bottom: 25px;
268 display: flex;
269 flex-direction: row;
270 align-items: center;
271 }
272
273 .bioec_org_flex_end {
274 display: flex;
275 flex-direction: row;
276 align-items: center;
277 justify-content: end;
278 }
279
280 .bioec_org_admin_img_placeholder {
281 align-self: center;
282 height: 48px;
283 width: 48px;
284 background-color: #595A5F;
285 border-radius: 50%;
286 display: flex;
287 align-items: center;
288 justify-content: center;
289 color: var(--white-1);
290 font-size: 28px;
291 }
292
293 .bioec_org_admin_content {
294 font-size: 16px;
295 color: #5B5C61;
296 flex: 1;
297 margin: 0 12px;
298 }
299
300 .bioec_org_admin_content b {
301 display: block;
302 }
303
304 .bioec_org_admin_button {
305 color: var(--white-1);
306 background-color: #595A5F;
307 border-radius: 8px;
308 border: none;
309 outline: none;
310 width: 34px;
311 height: 34px;
312 font-size: 16px;
313 padding: 0px;
314 margin-left: 12px;
315 }
316
317 .bioec_org_admin_buttons_container {
318 display: flex;
319 flex-direction: row;
320 }
321
322 .bioec_modal-title {
323 font-weight: 700;
324 font-size: 20px;
325 color: #5B5C61;
326 }
327
328 .bioec_modal-line {
329 border-bottom: 1px solid #E8ECEF;
330 }
331
332 .bioec_modal-form h1 {
333 font-weight: 400;
334 font-size: 24px;
335 line-height: 150%;
336 color: #5B5C61;
337 margin-bottom: 40px;
338 }
339
340 .bioec_modal-form-control {
341 margin-bottom: 24px;
342 }
343
344 .bioec_modal-form-control label {
345 color: #5B5C61;
346 font-size: 20px;
347 font-weight: 700;
348 line-height: 30px;
349 margin-bottom: 8px;
350 }
351
352 .bioec_modal-form-control label[required]::before {
353 content: "*";
354 color: #ff0000;
355 margin-right: 0.4rem;
356 }
357
358 .bioec_modal-form-control input {
359 border-radius: 0;
360 outline: none;
361 border: none;
362 border-bottom: 1px solid #BEBEBE;
363 font-size: 16px;
364 font-weight: 400;
365 line-height: 24px;
366 color: #5B5C61;
367 width: 100%;
368 background-color: transparent;
369 padding: 2px;
370 margin: 0;
371 }
372
373 @media (max-width: 767px) {
374 .bioec_org_admin_buttons_container {
375 flex-direction: column;
376 }
377 .bioec_org_admin_button {
378 margin-bottom: 12px;
379 }
380 .bioec_org_flex_end {
381 flex-direction: column;
382 align-items: center;
383 }
384 }
385</style>
Sintetizador de oligonucleotídeos
Modelo: .
Marca: .
Função
O Sintetizador de oligonucleotídeos é um equipamento para a síntese in vitro de moléculas personalizadas de DNA ou RNA. Caracterizado por empregar reagentes denominados amidites, que são análogos químicos dos componentes biológicos do DNA e RNA, os quais são depositados sequencialmente de maneira automatizada em colunas e então convertidos nos equivalentes bioativos, dessa forma construindo sequências personalizadas de DNA ou RNA. Características: O equipamento operar de maneira automatizada, com a definição dos parâmetros da síntese sendo controlada por software; Conta com computador, sistema operacional e software para controle do dispositivo e Contém espaço para 2 placas de 96 poços, totalizando 192 sínteses simultâneas, onde a síntese ocorre independentemente em cada poço permitindo oligos com sequências e tamanhos diferentes sendo sintetizados na mesma corrida.
Bluepippin
Modelo: .
Marca: Sage Science
Função
Este equipamento auxilia na construção de bibliotecas para as plataformas NGS. O Blue Pippin apresenta a capacidade de coletar fragmentos de DNA com seleção de tamanho de até 50 kb e proteínas, além do benefício extra da eletroforese de campo pulsado que favorece a coleta de DNA de alto peso molecular. Para aplicações genômicas de longo alcance, o equipamento conta com a filtragem High-Pass que permite aos usuários coletarem todos os fragmentos acima de um limite de tamanho definido pelo usuário. Tamanhos de alvos ou intervalos de tamanhos são inseridos no software e as frações são coletadas no buffer. Até 5 amostras / cassete de gel podem ser processadas, sem possibilidade de contaminação cruzada. Aplicações: Sequenciamento de uma única molécula ; Isolamento de miRNA ; Sequenciamento de DNA ; RNA-seq ; Genotipagem e Especificação de massa de proteína.
Pipping Pulse
Modelo: .
Marca: Sage Science
Função
Equipamento de Eletroforese em Gel de Campo Pulsado para seleção de DNA de até 100 kb, está eletroforese é uma estratégia para a resolução de grandes fragmentos de DNA para análise. O Pippin Pulse possui uma interface de software simples que fornece aos usuários total flexibilidade para desenvolver seus próprios protocolos de inversão de campo. A faixa de operação é de 25 a 175V e até 200 mA . O equipamento inclui a fonte de alimentação, cabos, software (para PC) para programação e manual do usuário. Aplicações: Qualificar a amostra para uso no Sequenciamento.
Sistema de PCR
Modelo: QuantStudio™ 6 Flex
Marca: Life technologies
Função
O sistema de PCR em tempo real QuantStudio™ 6 Flex da Applied Biosystems® facilita aplicações baseadas em PCR em tempo real com uma seleção de bloco atualizável, permitindo que você planeje experimentos hoje e cresça com as necessidades de amanhã. O sistema QuantStudio™ 6 Flex acomoda a troca de blocos de 96 poços, 96 poços Fast ou 384 poços. O sistema é fornecido com um tipo de bloco (neste caso, um bloco de 384 poços); outros tipos de blocos podem ser adquiridos separadamente. A precisão aprimorada dos dados de poço a poço e de instrumento a instrumento é obtida com o sistema OptiFlex®, que apresenta 5 canais de filtro de emissão e excitação acoplados.
Sequenciador Sanger
Modelo: .
Marca: .
Função
O sequenciador de DNA Sanger (analisador de DNA 3730) de 48 capilares tem por objetivo realizar análises genéticas de alto rendimento, permitindo análise de fragmentos de DNA, como microssatélites, AFLP, análise SNP, detecção de mutação e sequenciamento tradicional de DNA. O equipamento à base de eletroforese capilar, onde o DNA-alvo é copiado muitas vezes, produzindo fragmentos de comprimentos diferentes (até 900 pares de base). Tem a capacidade de processar 1000 amostras ou 700 mil pares de base por dia. Dessa forma é possível realizar o sequenciamento de partes do genoma. Aplicações: ; Sequenciamento de novo ; Sequenciamento de DNA ; Validação de sequenciamento de próxima geração ; Sequenciamento HLA ; Sequenciamento Microbiano e Sequenciamento Mitocondrial
Sequenciador
Modelo: .
Marca: Illumina
Função
Sequenciamento de alto rendimento de fragmentos curtos a médios de DNA através do método de síntese (SBS) - output de até 120 GB de dados por corrida. A plataforma Illumina vem sendo adotada como padrão para um grande número de aplicações em genômica, transcriptômica e metagenômica. Aplicações: Análise de interação DNA-Proteína. Sequenciamento de: Análise de interação DNA-Proteína; Exomas; Amplicons e painéis gênicos; RNA; Regiões metiladas e Metagenômico 16S.
Sequenciador PacBio (3ª GERAÇÃO)
Modelo: .
Marca: Pacific Biosciences
Função
O equipamento PacBio realiza sequenciamento de alto rendimento de fragmentos longos de DNA através do método de sequenciamento de molécula única em tempo real (SMRT) - output de até 5 a 10 GB por célula SMRT. O método da PacBio permite a detecção da amplificação de fragmentos individualmente, sem a necessidade de amplificação. Isso reduz os erros causados pela amplificação, e permite a detecção de bases modificadas. Aplicações: Determinação de variantes em uma população e Detecção de modificações no DNA (epigenética). Sequenciamento: Sequenciamento de novo de genomas inteiros, por exemplo, de humanos, plantas, animais e micro-organismo e também a detectar variantes estruturais; RNA (RNAseq); Amplicons ; Metagenoma e Transcriptoma.
Tapestation
Modelo: .
Marca: .
Função
Sistema automatizado para análise eletroforética de biomoléculas, sendo capaz de analisar a integridade de DNA genômico, processo indispensável para a análise de amostras visando o Sequenciamento de Nova Geração (NGS). Oferece processamento automatizado de amostras visando o controle de qualidade das mesmas. Aplicações: Controle de qualidade de DNA genômico (gDNA), incluindo número de integridade de DNA ; Controle de qualidade de DNA celular livre com pureza %c fDNA e Controle de qualidade de biblioteca de NGS e análise de bibliotecas amplificadas. Aplicações adicionais incluem: Reação em cadeia da polimerase (PCR) e análise de fragmento de PCR multiplex, bem como controle de qualidade de produtos de PCR quantitativos.
Infraestrutura em síntese química
Modelo:
Marca:
Função
Reatores de milicanais (bancada e piloto); reatores Parr; Central analítica (HPLC, GC, GCMS, FRX, DRX, FTIR, RAMAN, etc); moinho Mazzuco; Dynamic shape analyzer; Drop shape analyzer; Mastersizer; Tensiometer; Litesizer; Spinning drop; Turbiscan
Conteudo Em Análise Pelo Cetiqt:
Conteúdo recusado pelo CETIQT por violar as políticas de privacidade.
Infraestrutura em fibras
Modelo:
Marca:
Função
Conteudo Em Análise Pelo Cetiqt:
Conteúdo recusado pelo CETIQT por violar as políticas de privacidade.
Infraestrutura em biotecnologia
Modelo:
Marca:
Função
Conteudo Em Análise Pelo Cetiqt:
Conteúdo recusado pelo CETIQT por violar as políticas de privacidade.
Extrusora Mono rosca(fibras químicas)
Modelo:
Marca: Extrusora piloto monorosca com capacidade de processamento ideal para pesquisa e teste de polímeros. Permite realização de incorporação de pigmentos, desenvolvimento de compósitos e misturas poliméricas e degasagem de polímeros fundidos. Equipado com um sistema de fieiras composta por capilares onde o filamento resultante é solidificado por resfriamento.
Função
Extrusora Dupla rosca(fibras químicas)
Modelo:
Marca: Extrusora piloto dupla rosca com capacidade de processamento ideal para pesquisa e teste de polímeros. Permite realização de incorporação de pigmentos, desenvolvimento de compósitos e misturas poliméricas e degasagem de polímeros fundidos. Equipado com um sistema de fieiras composta por capilares onde o filamento resultante é solidificado por resfriamento. Por conta do sistema dupla rosca contra rotacional, que garante maior cisalhamento durante o processamento, essa extrusora é mais indicada para obtenção de nanocompósitos, em relação à monorosca.
Função
Reômetro Capilar (fibras químicas)
Modelo:
Marca: Projetado para medir a viscosidade de cisalhamento e outras propriedades reológicas. O reômetro capilar para plásticos consiste em um sistema de pistão-matriz projetado para medir a viscosidade de polímeros fundidos em função da temperatura e da taxa de deformação. Ele é capaz de testar polímeros básicos, compostos, vários compósitos com pequenas partículas ou fibras de reforço, matéria-prima para moldagem por injeção de metal e materiais similares.
Função
Reômetro Elongacional
Modelo:
Marca: O reômetro elongacional é ideal para caracterização de materiais a serem submetidos ao processo de extrusão.
Função
Reômetro Online (fibras químicas)
Modelo:
Marca: O reômetro é inserido em linha logo na saída da extrusora, o que permite acessar e visualiza informações de processo sobre a estrutura reológica e molecular de polímeros em tempo real, além de fornecer os dados para sistemas de TI de nível superior. O princício do reômetro online é o mesmo do reômetro capilar, sendo o trabalho do pistão realizado pelo parafuso da extrusora.
Função
Sistema de Fiação à Úmido (fibras químicas)
Modelo:
Marca: O equipamento de fiação a úmido em escala piloto permite a obtenção de fios artificiais por processamento em solução. Neste sistema, polímero é dissolvido em um solvente de fiação onde a solução polimérica é extrudada através de uma fieira submersa em um banho de coagulação composto de não solventes. O banho de coagulação faz com que o polímero precipite em forma de fibra.
Função
Sistema de Fiação à Úmido de Bancada (fibras químicas)
Modelo:
Marca: O equipamento de fiação a úmido de bancada permite a obtenção de fios artificiais por processamento em solução. Neste sistema, polímero é dissolvido em um solvente de fiação onde a solução polimérica é extrudada através de uma fieira submersa em um banho de coagulação composto de não solventes. O banho de coagulação faz com que o polímero precipite em forma de fibra. O sistema de bancada permite reprodução do processo em menores quantidades.
Função
Passador (fiação)
Modelo:
Marca: Diminui as irregularidades da manta de carda e a prepara para as operações subsequentes, como uniformizar o diâmetro da fita por duplicação. Ele mistura e paraleliza as fibras, aumentando o alinhamento, e estira o material, reduzindo sua massa. Adequado para fibras curtas e longas.
Função
Maçaroqueira (fiação)
Modelo:
Marca: Reduz a densidade linear da fita do passador por rascunho. Depois de reduzir a densidade linear, a fita é transferida para o pavio (uma forma fina de corda).
Função
The following has evaluated to null or missing: ==> autorArticleId [in template "34764#34807#41127" at line 87, column 38] ---- Tip: If the failing expression is known to legally refer to something that's sometimes null or missing, either specify a default value like myOptionalVar!myDefault, or use <#if myOptionalVar??>when-present<#else>when-missing</#if>. (These only cover the last step of the expression; to cover the whole expression, use parenthesis: (myOptionalVar.foo)!myDefault, (myOptionalVar.foo)?? ---- ---- FTL stack trace ("~" means nesting-related): - Failed at: #if autorArticleId != "0" && autorArt... [in template "34764#34807#41127" at line 87, column 33] ----
1<#assign JournalArticleLocalService = serviceLocator.findService("com.liferay.journal.service.JournalArticleLocalService")>
2<#assign UserLocalService = serviceLocator.findService("com.liferay.portal.kernel.service.UserLocalService")>
3<#assign AssetCategoryLocalService = serviceLocator.findService("com.liferay.asset.kernel.service.AssetCategoryLocalService")>
4<#assign
5mbMessageLocalService = serviceLocator.findService("com.liferay.message.boards.service.MBMessageLocalService")
6 tagsLocalService = serviceLocator.findService("com.liferay.asset.kernel.service.AssetTagLocalService")
7 OrganizationLocalService = serviceLocator.findService("com.liferay.portal.kernel.service.OrganizationLocalService")
8>
9
10
11<div class="bioec-profile-demanda-main">
12 <div id="demanda-lista-container" class="d-flex flex-column">
13 <#if entries?has_content>
14 <#list entries as entry>
15 <#assign journalArticle = JournalArticleLocalService.getLatestArticle(entry.getClassPK()) >
16 <#assign JournalArticleID = journalArticle.getId()>
17 <#assign JournalArticleFrontId = journalArticle.getArticleId()>
18 <#assign articleXml = journalArticle.getDocument().getRootElement()
19 userIsAdmin = false
20 orgId = ""
21 autorId = ""
22 >
23
24 <#assign nomeParaContato = "">
25
26 <#if articleXml.selectSingleNode("dynamic-element[@field-reference='Text77253735']")??>
27
28 <#assign nomeParaContato = articleXml.selectSingleNode("dynamic-element[@field-reference='Text77253735']").getStringValue()!""
29 nomeParaContato = nomeParaContato?replace("\n\t\t", "")
30 nomeParaContato = nomeParaContato?replace("\n\t", "")
31 >
32
33 </#if>
34 <#if articleXml.selectSingleNode("dynamic-element[@field-reference='Text94974146']")??>
35 <#assign telefone = articleXml.selectSingleNode("dynamic-element[@field-reference='Text94974146']").getStringValue()!""
36 telefone = telefone?replace("\n\t\t", "")
37 telefone = telefone?replace("\n\t", "")
38 >
39 </#if>
40
41 <#if articleXml.selectSingleNode("dynamic-element[@field-reference='Text68569631']")??>
42 <#assign email = articleXml.selectSingleNode("dynamic-element[@field-reference='Text68569631']").getStringValue()!""
43 email = email?replace("\n\t\t", "")
44 email = email?replace("\n\t", "")
45 >
46 </#if>
47
48 <#if articleXml.selectSingleNode("dynamic-element[@field-reference='CopyOfCopyOfText18267936']")??>
49 <#assign desc = articleXml.selectSingleNode("dynamic-element[@field-reference='CopyOfCopyOfText18267936']").getStringValue()!""
50 desc = desc?replace("\n\t\t", "")
51 desc = desc?replace("\n\t", "")
52 >
53 </#if>
54 <#if articleXml.selectSingleNode("dynamic-element[@field-reference='Text97565506']")??>
55 <#assign imagem = articleXml.selectSingleNode("dynamic-element[@field-reference='Text97565506']").getStringValue()!""
56 imagem = imagem?replace("(\r\n)+", "",'r')
57 imagem = imagem?replace(" ", "",'r')
58 >
59 </#if>
60 <#if articleXml.selectSingleNode("dynamic-element[@field-reference='Text99746569']")??>
61 <#assign
62 autorId = articleXml.selectSingleNode("dynamic-element[@field-reference='Text99746569']").getStringValue()!""
63 autorId = autorId?replace("\n\t\t", "")
64 autorId = autorId?replace("\n\t", "")
65 autorArticleId = ""
66 >
67 </#if>
68 <#assign
69 commentsCount = mbMessageLocalService.getDiscussionMessagesCount(entry.getClassName(), entry.getClassPK(), 0)!"0"
70 >
71
72 <#if autorId != "" && autorId??>
73 <#assign
74 autor = UserLocalService.fetchUser(autorId?number)!""
75 autorArticleId = autor.getExpandoBridge().getAttribute("journal-article")!"0"
76 />
77 <#if autor != "">
78 <#assign autor = autor.getFullName()!"">
79 <#else>
80 <#assign autor = "Anônimo" >
81 </#if>
82 <#else>
83 <#assign autor = "Anônimo" >
84 </#if>
85 <#assign categorias = AssetCategoryLocalService.getCategoryNames(entry.getClassName(), entry.getClassPK())!"" >
86 <#assign urlWC = "">
87 <#if autorArticleId != "0" && autorArticleId != "" && autor != "Anônimo">
88 <#assign autorArticle = JournalArticleLocalService.getLatestArticle(themeDisplay.getLayout().getGroupId(), autorArticleId?string) >
89 <#assign urlWC = autorArticle.getUrlTitle()!"">
90 </#if>
91
92 <#assign tags = tagsLocalService.getTagNames("com.liferay.journal.model.JournalArticle", journalArticle.getResourcePrimKey()?number )
93 tagName = tags[0]!""
94 orgOrUser = ""
95 >
96
97 <#if tagName?contains("organization") && tagName != "" >
98 <#assign orgOrUser = "org">
99 <#else>
100 <#assign orgOrUser = "user">
101 </#if>
102
103 <#if orgOrUser == "org" >
104
105 <#assign
106 orgId = tagName?keep_after("organization-")
107 organization = OrganizationLocalService.fetchOrganization(orgId?number)!""
108 >
109
110
111 <#if organization != "" && autor != "Anônimo">
112
113 <#assign orgArticleId = organization.getExpandoBridge().getAttribute("journal-article")
114 orgJournalArticle = JournalArticleLocalService.getArticle(themeDisplay.getLayout().getGroupId(),orgArticleId?c)
115 urlWC = orgJournalArticle.getUrlTitle()!""
116 autor = organization.getName()!""
117 >
118
119 </#if>
120 </#if>
121
122 <#if themeDisplay.isSignedIn() >
123 <#if tagName?contains("organization-")>
124 <#assign userIsAdmin = OrganizationLocalService.hasUserOrganization(themeDisplay.getUserId(), orgId?number)>
125 <#else>
126 <#if autorId?number == themeDisplay.getUserId()>
127 <script>console.log("oi");</script>
128 <#assign userIsAdmin = true>
129 </#if>
130 </#if>
131
132
133 </#if>
134
135
136
137 <div class="demanda-lista-item">
138
139 <div class="lista-checkmark">
140 <#if categorias?seq_contains("aprovado") > <i title="Aprovado" style="color: #4ECD66" class="fa-solid fa-circle-check"></i> </#if>
141 <#if categorias?seq_contains("pendente") > <i title="Em análise" style="color: #D90000"class="fa-solid fa-spinner"></i> </#if>
142 <#if categorias?seq_contains("recusado") > <i title="Recusado" style="color: #D90000"class="fa-solid fa-exclamation-circle"></i> </#if>
143 </div>
144
145
146 <div class="lista-titulo">
147 <h5>${entry.getHighlightedTitle()}</h5>
148 </div>
149
150 <div class="lista-arrow">
151 <button style="padding: 0;" class="btn" type="button" data-toggle="collapse" data-target="#collapseID${entry.getClassPK()}" aria-expanded="false" aria-controls="collapseID${entry.getClassPK()}">
152 <i class="fa-solid fa-chevron-down"></i>
153 </button>
154 </div>
155
156 <div class="lista-desc">
157 <p>${desc}</p>
158 </div>
159
160 <div class="lista-collapse collapse" id="collapseID${entry.getClassPK()}">
161 <#if nomeParaContato != "" || telefone != "" || email != "" || imagem?trim !="">
162 <div class="lista-details">
163 <div class="lista-pic">
164 <i class="fa-solid fa-image-slash"></i>
165 <#if imagem?trim !="" >
166 <img class="bioec_demanda_img" src="${imagem}">
167 <#else>
168 <div class="bioec_demanda_img_placeholder">
169 <i class="fa-solid fa-image"></i>
170 sem imagem
171 </div>
172 </#if>
173 </div>
174 <#if nomeParaContato != "" || telefone != "" || email != "" >
175 <div class="lista-contato">
176 <p>Contato</p>
177 <p class="lista-author">${nomeParaContato}</p>
178 <p class="lista-phone">${telefone}</p>
179 <p class="lista-email">${email}</p>
180 </div>
181 </#if>
182 </div>
183 </#if>
184
185 <#if categorias?seq_contains("recusado") >
186 <div style="border-top: 1px solid #E8ECEF; font-weight: bold; padding-top: 24px;">
187 <p>Conteúdo Em Análise Pelo Cetiqt:</p>
188 <p>Conteúdo recusado pelo CETIQT por violar as políticas de privacidade.</p>
189 </div>
190 </#if>
191 <div class="lista-footnote">
192 <div>
193 <span class="lista-date">${journalArticle.getDisplayDate()?string('dd/MM/yyyy')}</span> | <span class="lista-commentNumber">${commentsCount} cometários</span> <span class="barra-pipe"> | </span> <span class="lista-author">Publicado por <a <#if urlWC != ''>href="/w/${urlWC}</#if>">${autor}</a></span>
194 </div>
195 <#if userIsAdmin>
196 <div class="buttonsActions">
197 <div style="cursor: pointer;font-size: 16px;" data-toggle="modal" data-target="#modalDemanda${JournalArticleID}">
198 <i class="fa-solid fa-edit"></i>
199 </div>
200 <div style="cursor: pointer;font-size: 16px;" data-toggle="modal" data-target="#modal-demanda-${entry.getClassPK()}">
201 <i class="fa-solid fa-trash-can"></i>
202 </div>
203
204 </div>
205 </#if>
206 </div>
207 </div>
208 </div>
209
210 <#if userIsAdmin>
211 <div style="display: none;" id="modal-demanda-${entry.getClassPK()}" class="modal fade" role="dialog">
212 <div class="modal-dialog modal-lg" role="document">
213 <div class="modal-content">
214 <div class="modal-header" >
215 <h4 class="m-0">Remover Demanda</h4>
216 <button type="button" class="close" data-dismiss="modal" aria-label="Close">
217 <span aria-hidden="true">
218 <i class="fa-solid fa-close"></i>
219 </span>
220 </button>
221 </div>
222 <div class="modal-body">
223 <h5>Você tem certeza que deseja remover essa demanda?</h5>
224 <div>
225 Ao clicar em continuar, a demanda será removida do seu perfil.
226 </div>
227 </div>
228 <div class="modal-footer justify-content-end">
229 <button class="bioec_secondary_button" data-dismiss="modal">CANCELAR</button>
230 <button class="bioec_primary_button" type="button" onclick="excluirDemanda(${JournalArticleFrontId}, ${orgId})">CONTINUAR</button>
231 </div>
232 </div>
233 </div>
234 </div>
235
236 <#-- modal edição -->
237
238
239 <div style="display: none;" id="modalDemanda${JournalArticleID}" class="modal fade bioec-profile-demanda-modal modalDemanda" role="dialog">
240 <div class="modal-dialog modal-lg" role="document">
241 <form id="formularioDemanda${JournalArticleID}" class="form-group modal-content formularioDemanda">
242 <div id="demandaModal-l1${JournalArticleID}" class="modal-header demandaModal-l1">
243 <h5>Adicionar demanda</h5>
244 <button type="button" class="close" data-dismiss="modal" aria-label="Close">
245 <span aria-hidden="true">×</span>
246 </button>
247 </div>
248 <div id="demandaModal-l2${JournalArticleID}" class="modal-body demandaModal-l2">
249 <div id="demandaTitle${JournalArticleID}" class="demandaTitle">
250 <label class="ReqLabel" for="demandaInputTitle${JournalArticleID}">Título da demanda</label>
251 <input id="demandaInputTitle${JournalArticleID}" value="${entry.getHighlightedTitle()}" type="text" placeholder="Inserir um título" required>
252 </div>
253 <div id="demandaName${JournalArticleID}" class="demandaName">
254 <label class="" for="demandaInputName${JournalArticleID}">Nome para contato</label>
255 <input value="${nomeParaContato}" id="demandaInputName${JournalArticleID}" placeholder="Inserir nome" type="text">
256 </div>
257 <div id="demandaTelephone${JournalArticleID}" class="demandaTelephone">
258 <label class="" for="demandaInputPhone${JournalArticleID}">Telefone para contato</label>
259 <input value="${telefone}" id="demandaInputPhone${JournalArticleID}" name="demandaInputPhone" type="text" placeholder ='(__)_____-_____' minlength="14" />
260 </div>
261 <div id="demandaEmail${JournalArticleID}" class="demandaEmail">
262 <label class="" for="demandaInputEmail${JournalArticleID}">E-mail para contato</label>
263 <input value="${email}" id="demandaInputEmail${JournalArticleID}" placeholder="Inserir e-mail" type="text">
264 </div>
265 <div id="demandaDesc${JournalArticleID}" class="demandaDesc">
266 <label class="ReqLabel" for="demandaInputDesc${JournalArticleID}">Descrição</label>
267 <textarea id="demandaInputDesc${JournalArticleID}" style="max-width: 100%;font-size: 16px;height: 80px;border: 1px solid #BEBEBE;" required>${desc}</textarea>
268 </div>
269 <div id="demandaImg${JournalArticleID}" class="demandaImg">
270 <div style="display: flex; flex-direction: column; gap: 8px">
271 <label>Imagem da demanda (Máx. 10 MB)</label>
272 <label class="btn carregarImagem" id="carregarImagem${JournalArticleID}" for="inputCarregarImagemDemanda${JournalArticleID}" style="font-size: 16px; cursor: pointer;">CARREGAR IMAGEM</label>
273 <input class="inputCarregarImagemDemanda" id="inputCarregarImagemDemanda${JournalArticleID}" type="file" accept="image/*" onchange="encodeDemandaImageAsURL${JournalArticleID}(this)">
274 <input class="d-none" id="inputDemandaBase64${JournalArticleID}" value="${imagem}" />
275 <div class="imagemCarregadaDemanda imagemCarregadaDemanda${JournalArticleID} d-md-none d-block" style="background-image: url(${imagem})"></div>
276 <button type="button" id="removerImagemDemanda${JournalArticleID}" class="<#if imagem == "" || imagem?? == false> d-none </#if> removerImagemDemanda" >
277 <i class="fa fa-trash"></i> Remover imagem
278 </button>
279 </div>
280 <div class="imagemCarregadaDemanda imagemCarregadaDemanda${JournalArticleID} d-md-block d-none" style="background-image: url(${imagem})"></div>
281 </div>
282 </div>
283 <div class="TextImportant">
284 <p>
285 Importante: O conteúdo enviado passará por um processo interno de aprovação. Só então o conteúdo adicionado aparecerá no portal.
286 </p>
287 </div>
288
289 <div id="demandaModal-l3${JournalArticleID}" class="modal-footer demandaModal-l3">
290 <button class="btn button-empty" onclick="" id="demandas-saveAndClose${JournalArticleID}">SALVAR E FECHAR</button>
291 </div>
292 </form>
293 </div>
294 </div>
295
296 </#if>
297 <#--
298
299
300
301
302 <div style="display: none;" id="modalInfra${JournalArticleID}" class="modal fade bioec-profile-infra-modal" role="dialog">
303 <div class="modal-dialog modal-lg" role="document">
304
305 <form class="form-group modal-content" id="formularioInfraestrutura${JournalArticleID}">
306 <div id="infraModal-l1-${JournalArticleID}" class="modal-header infraModal-l1" >
307 <h5>Adicionar Infraestrutura</h5>
308 <button id="fecharModal${JournalArticleID}" type="button" class="close" data-dismiss="modal" aria-label="Close">
309 <span aria-hidden="true">×</span>
310 </button>
311 </div>
312 <div id="infraModal-l2-${JournalArticleID}" class="modal-body infraModal-l2">
313 <div id="infraName${JournalArticleID}" class="infraName">
314 <label class="ReqLabel" for="inputInfraName${JournalArticleID}">Nome da infraestrutura</label>
315 <input type="text" id="inputInfraName${JournalArticleID}" value="${entry.getHighlightedTitle()}" placeholder="Nome da infraestrutura" required>
316 </div>
317 <div id="infraModel${JournalArticleID}" class="infraModel">
318 <label class="ReqLabel" for="inputInfraModel${JournalArticleID}">Modelo</label>
319 <input type="text" id="inputInfraModel${JournalArticleID}" value="${modelo}" placeholder="Modelo" required>
320 </div>
321 <div id="infraBrand${JournalArticleID}" class="infraBrand">
322 <label class="ReqLabel" for="inputInfraBrand${JournalArticleID}">Marca</label>
323 <input type="text" id="inputInfraBrand${JournalArticleID}" value="${marca}" placeholder="Marca" required>
324 </div>
325
326 <div id="infraImg${JournalArticleID}" class="infraImg">
327 <div style="display: flex; flex-direction: column; gap: 8px">
328 <label>Imagem da infraestrutura (Máx. 10 MB)</label>
329 <label class="bioec_secondary_button" id="carregarImagem${JournalArticleID}" for="inputCarregarImagemInfra${JournalArticleID}" style="font-size: 16px;color: #333244;align-self:start;">
330 CARREGAR IMAGEM
331 </label>
332 <input id="inputCarregarImagemInfra${JournalArticleID}" class="inputCarregarImagemInfra" type="file" accept="image/*" onchange="encodeInfraImageAsURL${JournalArticleID}(this)">
333 <input class="d-none" id="inputInfraBase64${JournalArticleID}" />
334 <div class="imagemCarregadaInfra${JournalArticleID} d-md-none d-block"></div>
335 <button type="button" id="removerImagemInfra${JournalArticleID}" class="d-none removerImagemInfra" >
336 <i class="fa fa-trash"></i> Remover imagem
337 </button>
338 </div>
339 <div class="imagemCarregadaInfra${JournalArticleID} d-md-block d-none"></div>
340 </div>
341
342 <div id="infraFunction${JournalArticleID}" class="infraFunction">
343 <label class="ReqLabel" for="inputInfraFunction${JournalArticleID}">Função</label>
344 <input type="text" id="inputInfraFunction${JournalArticleID}" class="inputInfraFunction" value="${funcao}" placeholder="Função" required>
345 </div>
346 </div>
347 <div class="TextImportant">
348 <p>
349 Importante: O conteúdo enviado passará por um processo interno de aprovação. Só então o conteúdo adicionado aparecerá no portal.
350 </p>
351 </div>
352 <div id="infraModal-l3-${JournalArticleID}" class="modal-footer infraModal-l3">
353 <button class="bioec_secondary_button" id="demandas-saveAndClose${JournalArticleID}" onclick="">SALVAR E FECHAR</button>
354 </div>
355 </form>
356
357 </div>
358
359
360 -->
361
362
363
364 <script>
365 <#if userIsAdmin>
366 function excluirDemanda(wcId, orgId) {
367 Liferay.Util.openToast({message: "Enviando requisição",type: "info",title: ""});
368 fetch(Liferay.ThemeDisplay.getPortalURL() + "/o/demanda/" + wcId, {
369 method: 'DELETE',
370 "headers": {
371 "x-csrf-token": Liferay.authToken,
372 "Content-Type": "application/json"
373 }
374 })
375 .then(res => {
376 if(res.status == 200) {
377 Liferay.Util.openToast({
378 message: "Infraestrutura excluida com sucesso",
379 type: "success",
380 title: "",
381 toastProps: {
382 autoClose: 5000
383 }
384 })
385 setTimeout(function(){ location.reload(); }, 2000)
386 } else {
387 Liferay.Util.openToast({
388 message: "Erro ao excluir infraestrutura",
389 type: "danger",
390 title: "",
391 toastProps: {
392 autoClose: 5000
393 }
394 })
395 }
396 });
397 }
398
399
400
401
402 function validImageSize(base64="") {
403 const decoded = atob(base64.substring(base64.indexOf(',') + 1));
404 const sizeMB = decoded.length / 1e+6;
405 console.log("MB: " + decoded.length / 1e+6);
406 if(sizeMB > 10) {
407 Liferay.Util.openToast({
408 message: "O tamanho da imagem não deve ultrapassar 10 MB.",
409 type: "danger",
410 title: "",
411 toastProps: {
412 autoClose: 5000
413 }
414 })
415 return false
416 }
417 return true
418 }
419
420 function encodeDemandaImageAsURL${JournalArticleID}(element) {
421 let file = element.files[0];
422 let reader = new FileReader();
423 reader.onloadend = () => {
424 if(reader.result) {
425 if(!validImageSize(reader.result)) return;
426 try {
427 const base64_input = document.getElementById("inputDemandaBase64${JournalArticleID}")
428 base64_input.value = reader.result
429 Array.from(document.getElementsByClassName("imagemCarregadaDemanda${JournalArticleID}")).forEach( el => el.style.backgroundImage = 'url(' + reader.result + ')' )
430
431 const removeImageButton = document.getElementById("removerImagemDemanda${JournalArticleID}")
432 removeImageButton.classList.remove("d-none")
433 } catch (error) {
434 console.error(error)
435 }
436 }
437 }
438 reader.readAsDataURL(file);
439 }
440
441 function removeImageDemanda${JournalArticleID}() {
442 try {
443 const file_input = document.getElementById("inputCarregarImagemDemanda${JournalArticleID}")
444 Array.from(document.getElementsByClassName("imagemCarregadaDemanda${JournalArticleID}")).forEach( el => el.style.backgroundImage = "" )
445 const base64_input = document.getElementById("inputDemandaBase64${JournalArticleID}")
446 file_input.value = null
447 base64_input.value = ""
448
449 const removeImageButton = document.getElementById("removerImagemDemanda${JournalArticleID}")
450 removeImageButton.classList.add("d-none")
451 } catch (error) {
452 console.error(error)
453 }
454}
455
456
457document.getElementById("removerImagemDemanda${JournalArticleID}").addEventListener("click", removeImageDemanda${JournalArticleID});
458
459<#-- Rest da edição de organização -->
460
461<#if orgOrUser == "org">
462document.querySelector('#formularioDemanda${JournalArticleID}').addEventListener('submit', event => {
463 event.preventDefault();
464 adicionarDemanda${JournalArticleID}();
465});
466
467function adicionarDemanda${JournalArticleID}() {
468 Liferay.Util.openToast({message: "Enviando requisição",type: "info",title: ""});
469 $("#demandas-saveAndClose${JournalArticleID}").prop("disabled",true);
470
471
472
473 const demandaData = {
474 titulo: document.getElementById("demandaInputTitle${JournalArticleID}").value,
475 nomeContato: document.getElementById("demandaInputName${JournalArticleID}").value,
476 telefoneContato: document.getElementById("demandaInputPhone${JournalArticleID}").value,
477 emailContato: document.getElementById("demandaInputEmail${JournalArticleID}").value,
478 descricao: document.getElementById("demandaInputDesc${JournalArticleID}").value,
479 imagem: document.getElementById("inputDemandaBase64${JournalArticleID}").value,
480 }
481
482 console.log(demandaData);
483
484 fetch(Liferay.ThemeDisplay.getPortalURL() + "/o/demanda/${JournalArticleFrontId}", {
485 method: 'PUT',
486 "headers": {
487 "x-csrf-token": Liferay.authToken,
488 "Content-Type": "application/json"
489 },
490 body: JSON.stringify(demandaData)
491 })
492 .then(res => {
493 if(res.status == 200) {
494 Liferay.Util.openToast({
495 message: "Demanda editada com sucesso. Após a submissão, será iniciado o processo interno de aprovação do conteúdo enviado. Só então o conteúdo submetido aparecerá no portal.",
496 type: "success",
497 title: "",
498 toastProps: {
499 autoClose: 5000
500 }
501 })
502 setTimeout(function(){ location.reload(); }, 2000);
503 } else {
504 $("#demandas-saveAndClose${JournalArticleID}").prop("disabled",false);
505 Liferay.Util.openToast({
506 message: "Erro ao editada demanda",
507 type: "danger",
508 title: "",
509 toastProps: {
510 autoClose: 5000
511 }
512 })
513 }
514 })
515
516 }
517</#if>
518
519<#-- Rest da edição de pessoa fisica -->
520
521
522 <#if orgOrUser == "user">
523
524 document.querySelector('#formularioDemanda${JournalArticleID}').addEventListener('submit', event => {
525 event.preventDefault();
526 adicionarDemanda${JournalArticleID}();
527 });
528
529 function adicionarDemanda${JournalArticleID}() {
530 Liferay.Util.openToast({message: "Enviando requisição",type: "info",title: ""});
531 $("#demandas-saveAndClose${JournalArticleID}").prop("disabled",true);
532
533 const demandaData = {
534 titulo: document.getElementById("demandaInputTitle${JournalArticleID}").value,
535 nomeContato: document.getElementById("demandaInputName${JournalArticleID}").value,
536 telefoneContato: document.getElementById("demandaInputPhone${JournalArticleID}").value,
537 emailContato: document.getElementById("demandaInputEmail${JournalArticleID}").value,
538 descricao: document.getElementById("demandaInputDesc${JournalArticleID}").value,
539 imagem: document.getElementById("inputDemandaBase64${JournalArticleID}").value,
540 }
541
542 console.log(demandaData);
543
544 fetch(Liferay.ThemeDisplay.getPortalURL() + "/o/demanda/${JournalArticleFrontId}", {
545 method: 'PUT',
546 "headers": {
547 "x-csrf-token": Liferay.authToken,
548 "Content-Type": "application/json"
549 },
550 body: JSON.stringify(demandaData)
551 })
552 .then( res => {
553 if(res.status == 200) {
554 Liferay.Util.openToast({
555 message: "Demanda editada com sucesso. Após a submissão, será iniciado o processo interno de aprovação do conteúdo enviado. Só então o conteúdo submetido aparecerá no portal.",
556 type: "success",
557 title: "",
558 toastProps: {
559 autoClose: 5000
560 }
561 })
562 setTimeout(function(){ location.reload(); }, 2000);
563 } else {
564 $("#demandas-saveAndClose${JournalArticleID}").prop("disabled",false);
565 Liferay.Util.openToast({
566 message: "Erro ao editar Demanda",
567 type: "danger",
568 title: "",
569 toastProps: {
570 autoClose: 5000
571 }
572 })
573 }
574 });
575
576 };
577
578
579 </#if>
580
581
582 </#if>
583 </script>
584
585
586
587
588 </#list>
589 </#if>
590 </div>
591</div>
592
593<style>
594.bioec_demanda_img {
595 overflow: hidden;
596 background-size: contain;
597 background-position: center;
598 background-repeat: no-repeat;
599}
600
601.bioec_demanda_img_placeholder {
602 width: 140px;
603 height: 140px;
604 background-color: #E8ECEF;
605 display: flex;
606 flex-direction: column;
607 align-items: center;
608 justify-content: center;
609 font-size: 14px;
610 color: #5B5C61;
611}
612
613.bioec_demanda_img_placeholder i {
614 font-size: 44px;
615}
616
617
618.pagination-items-per-page.active > a,
619.pagination-items-per-page.active > button,
620.pagination-items-per-page.show > a,
621.pagination-items-per-page.show > button,
622.page-item.active .page-link,
623.page-item.show .page-link{
624 border-color: #4ECD66;
625 background-color: #4ECD66;
626}
627
628.pagination-results,
629.pagination-items-per-page > a,
630.pagination-items-per-page > button,
631.pagination-items-per-page > a:hover,
632.pagination-items-per-page > button:hover,
633.page-link{
634 color: #4ebe66;
635}
636
637.bioec-profile-demanda-main{
638 display: flex;
639 gap: 40px;
640 flex-direction: column;
641 padding-bottom: 20px;
642}
643.bioec-profile-demanda-main h5{
644 font-weight: 700;
645}
646.bioec-profile-demanda-main h5, .bioec-profile-demanda-main p{
647 color: #5B5C61;
648 margin-bottom: 0px;
649 font-size: 16px;
650
651}
652
653.bioec-profile-demanda-main #demanda-lista-container>div{
654 border: 1px #BEBEBE solid;
655 padding: 24px 24px 0 24px;
656 margin-bottom: 40px;
657 display: grid;
658 grid-row-gap: 24px;
659 grid-template-columns: 24px 12px 1fr 15px;
660 grid-template-areas:
661 "ck . tit arrw"
662 "desc desc desc desc"
663 "clps clps clps clps";
664}
665
666.bioec-profile-demanda-main .lista-checkmark { grid-area: ck; display: flex; }
667.bioec-profile-demanda-main .lista-checkmark i { font-size: 24px; }
668.bioec-profile-demanda-main .lista-pic { grid-area: pic; display: flex; justify-content: center;}
669.bioec-profile-demanda-main .lista-arrow { grid-area: arrw; }
670
671.bioec-profile-demanda-main .lista-titulo {
672 grid-area: tit;
673 display: flex;
674 flex-direction: column;
675 justify-content: center;
676
677}
678
679.bioec-profile-demanda-main .lista-titulo h5{
680 margin-bottom: 0px;
681}
682
683.bioec-profile-demanda-main .lista-desc {
684grid-area: desc;
685}
686
687.bioec-profile-demanda-main .lista-desc p{
688 margin: 0;
689}
690
691.bioec-profile-demanda-main a{
692 color: #5B5C61;
693}
694
695.demanda-port{
696 border: 1px #BEBEBE solid;
697 padding: 24px;
698 display: flex;
699 flex-direction: column;
700 align-items: center;
701 gap: 24px;
702}
703
704.demanda-port p{
705text-align: center;
706
707}
708
709.demanda-port div{
710display: flex;
711 justify-content: space-between;
712 width: min(558px, 100%);
713}
714
715.button-empty {
716border: solid 1px #4ECD66;
717padding: 8px 24px;
718color: #333244;
719 transition: 250ms;
720}
721
722.button-empty:hover{
723 background-color: #4ECD66;
724}
725
726.button-filled {
727background-color: #4ECD66;
728border: solid 1px #4ECD66;
729padding: 8px 24px;
730color: #333244;
731transition: 250ms;
732
733}
734
735.button-filled:hover{
736 background-color: transparent;
737}
738
739.bioec-profile-demanda-main .lista-footnote {
740
741 display: flex;
742 justify-content: space-between;
743 border-top: 1px solid #E8ECEF;
744 padding-top: 12px;
745 font-size: 14px;
746 font-weight: 300;
747 gap: 15px;
748 color: #5B5C61;
749
750}
751.lista-collapse{
752display: flex;
753flex-direction: column;
754gap: 24px;
755grid-area: clps;
756padding-bottom: 24px;
757}
758
759 .lista-details{
760 display: flex;
761 justify-content: flex-start;
762 gap: 24px;
763}
764.lista-pic img {
765 max-height: 138px;
766 max-width: 138px;
767}
768
769.bioec-profile-demanda-main p{
770
771}
772
773.imagemCarregadaDemanda {
774 height: 100px;
775 width: 100px;
776 background-size: contain;
777 background-position: center;
778 background-repeat: no-repeat;
779}
780
781
782.ButtonAddDemanda {
783 background: #4ECD66;
784 border-radius: 8px;
785 padding: 8px 24px;
786 border: none;
787 font-weight: 700;
788 color: #333244;
789 font-family: 'Roboto';
790 float: right;
791 text-transform: uppercase;
792}
793.ButtonAddDemanda:hover{
794 color: #333244;
795 text-decoration: none;
796}
797
798.bioec-profile-demanda-modal label {
799 margin: 0;
800 cursor: default;
801 font-size: 20px;
802 font-weight: 700;
803 color: #5B5C61;
804}
805
806.bioec-profile-demanda-modal div {
807 width: 100%;
808}
809
810#demandaModal-l1, .demandaModal-l1 {
811 padding: 18px 24px;
812 display: flex;
813 justify-content: space-between;
814}
815
816#demandaModal-l1 img, .demandaModal-l1 img {
817 cursor: pointer;
818}
819
820#demandaModal-l1 h5, .demandaModal-l1 h5 {
821 margin: 0;
822 font-size: 20px;
823 font-weight: 700;
824 color: #5B5C61;
825}
826
827#demandaModal-l2, .demandaModal-l2 {
828 border-top: 1px solid #E8ECEF;
829 display: grid;
830 grid-template-columns: 1fr 1fr;
831 grid-template-areas:
832 "titu nome"
833 "fone mail"
834 "desc desc"
835 "imagem ."
836 ;
837 column-gap: 24px;
838 row-gap: 40px;
839 padding: 24px;
840}
841
842#demandaModal-l2>div, .demandaModal-l2>div {
843 display: flex;
844 flex-direction: column;
845 gap: 8px;
846}
847
848#demandaTitle, .demandaTitle {
849 grid-area: titu;
850}
851
852#demandaName, .demandaName {
853 grid-area: nome;
854}
855
856#demandaTelephone, .demandaTelephone {
857 grid-area: fone;
858}
859
860#demandaEmail, .demandaEmail {
861 grid-area: mail;
862}
863
864#demandaBrand, .demandaBrand {
865 grid-area: marca;
866}
867
868#demandaModal-l2>#demandaImg, .demandaModal-l2>.demandaImg {
869 grid-area: imagem;
870 display: flex;
871 flex-direction: column;
872}
873
874#demandaDesc, .demandaDesc {
875 grid-area: desc;
876
877}
878
879#demandaDesc input, .demandaDesc input {
880 height: 80px;
881}
882
883.TextImportant{
884 border-bottom: 1px solid #E8ECEF;
885 padding: 24px;
886 color: #5B5C61;
887}
888
889.bioec-profile-demanda-modal input[type="text"] {
890 border-top: none;
891 border-left: none;
892 border-right: none;
893 border-bottom: 1px solid #BEBEBE;
894 width: 100%;
895 font-size: 16px;
896
897}
898
899
900.bioec-profile-demanda-modal input[type="text"]:focus-visible {
901 outline: none;
902 border-bottom: 1px solid black;
903
904}
905
906.bioec-profile-demanda-modal .ReqLabel:before {
907 content: "* ";
908 color: #D90000;
909
910}
911
912#inputCarregarImagemDemanda, .inputCarregarImagemDemanda {
913 display: none;
914}
915
916#carregarImagem, .carregarImagem {
917 padding: 8px 24px;
918 border: 1px solid #4ECD66;
919 width: fit-content;
920 transition: 250ms;
921
922}
923
924#carregarImagem:hover, .carregarImagem:hover {
925 background-color: #4ECD66;
926}
927
928.button-empty {
929 border: solid 1px #4ECD66;
930 padding: 8px 24px;
931 color: #333244;
932 transition: 250ms;
933 font-weight: bold;
934}
935
936.button-empty:hover {
937 background-color: #4ECD66;
938}
939
940.button-filled {
941 background-color: #4ECD66;
942 border: solid 1px #4ECD66;
943 padding: 8px 24px;
944 color: #333244;
945 transition: 250ms;
946 font-weight: bold;
947}
948
949.button-filled:hover {
950 background-color: transparent;
951}
952
953#demandaModal-l3, .demandaModal-l3 {
954 gap: 24px;
955 display: flex;
956 justify-content: flex-end;
957 padding: 24px;
958}
959
960.modal {
961 padding: initial !important;
962 border-radius: 4px !important;
963
964}
965
966.modal a.close-modal {
967 display: none;
968}
969
970#removerImagemDemanda, .removerImagemDemanda {
971 background: none;
972 border: none;
973 outline: none;
974 color: #5B5C61;
975 font-size: 16px;
976 font-weight: 900;
977 line-height: 24px;
978 letter-spacing: 0em;
979 width: fit-content;
980 margin-left: 16px;
981}
982
983
984@media(max-width: 964px){
985 .lista-pic img {
986 width: 100%;
987 max-height: unset;
988 max-width: unset;
989
990 }
991}
992
993@media (max-width: 550px) {
994 #demandaModal-l2, .demandaModal-l2 {
995 display: flex;
996 flex-direction: column;
997 }
998
999 #demandaModal-l3, .demandaModal-l3 {
1000 display: flex;
1001 flex-direction: column;
1002 }
1003}
1004
1005@media(max-width: 450px){
1006 .bioec-profile-demanda-main .lista-details{
1007 flex-direction: column;
1008 }
1009
1010 .lista-contato{
1011 text-align: center;
1012 }
1013
1014 .bioec-profile-demanda-main .lista-footnote{
1015 flex-direction: column;
1016 gap: 10px;
1017 align-items: flex-end;
1018 text-align: right;
1019 }
1020}
1021
1022@media(max-width: 992px){
1023 #demanda-lista-container {
1024 padding-inline: 15px;
1025 }
1026}
1027
1028.bioec-profile-demanda-main .lista-footnote .buttonsActions {
1029 display: flex;
1030 gap: 17px;
1031}
1032
1033@media (max-width: 768px) {
1034 .bioec-profile-demanda-main .lista-desc {
1035 gap: 24px;
1036 flex-direction: column-reverse;
1037 }
1038 .bioec-profile-demanda-main .lista-footnote {
1039 flex-direction: column;
1040 align-items: center;
1041 }
1042 .bioec-profile-demanda-main .lista-footnote > div {
1043 text-align: center;
1044 }
1045
1046 .bioec-profile-demanda-main .lista-footnote .barra-pipe {
1047 display: none;
1048 }
1049 .bioec-profile-demanda-main .lista-footnote .lista-author {
1050 display: flex;
1051 gap: 4px;
1052 justify-content: center;
1053 }
1054 .bioec-profile-demanda-main .lista-footnote .buttonsActions {
1055 width: 100%;
1056 justify-content: space-between;
1057 }
1058}
1059
1060
1061</style>
1062
1063
1064<script>
1065
1066
1067
1068</script>
The following has evaluated to null or missing: ==> autorArticleId [in template "34764#34807#41133" at line 98, column 22] ---- Tip: If the failing expression is known to legally refer to something that's sometimes null or missing, either specify a default value like myOptionalVar!myDefault, or use <#if myOptionalVar??>when-present<#else>when-missing</#if>. (These only cover the last step of the expression; to cover the whole expression, use parenthesis: (myOptionalVar.foo)!myDefault, (myOptionalVar.foo)?? ---- ---- FTL stack trace ("~" means nesting-related): - Failed at: #if autorArticleId != "0" && autorArt... [in template "34764#34807#41133" at line 98, column 17] ----
1<#assign JournalArticleLocalService = serviceLocator.findService("com.liferay.journal.service.JournalArticleLocalService")>
2<#assign UserLocalService = serviceLocator.findService("com.liferay.portal.kernel.service.UserLocalService")>
3<#assign AssetCategoryLocalService = serviceLocator.findService("com.liferay.asset.kernel.service.AssetCategoryLocalService")>
4<#assign mbMessageLocalService = serviceLocator.findService("com.liferay.message.boards.service.MBMessageLocalService")>
5<#assign OrganizationLocalService = serviceLocator.findService("com.liferay.portal.kernel.service.OrganizationLocalService")
6 tagsLocalService = serviceLocator.findService("com.liferay.asset.kernel.service.AssetTagLocalService")
7>
8
9
10
11
12
13
14
15
16<div class="bioec-profile-oferta-main">
17 <div id="oferta-lista-container" class="d-flex flex-column">
18 <#if entries?has_content>
19 <#list entries as entry>
20 <#assign journalArticle = JournalArticleLocalService.getLatestArticle(entry.getClassPK()) >
21 <#assign JournalArticleID = journalArticle.getId()>
22 <#assign JournalArticleFrontId = journalArticle.getArticleId()>
23 <#assign articleXml = journalArticle.getDocument().getRootElement()
24 userIsAdmin = false
25 orgId = ""
26 autorId = ""
27 >
28
29 <#if articleXml.selectSingleNode("dynamic-element[@field-reference='CampoDeTexto50355704']")??>
30
31 <#assign nomeParaContato = articleXml.selectSingleNode("dynamic-element[@field-reference='CampoDeTexto50355704']").getStringValue()!""
32 nomeParaContato = nomeParaContato?replace("\n\t\t", "")
33 nomeParaContato = nomeParaContato?replace("\n\t", "")
34 >
35 </#if>
36
37 <#if articleXml.selectSingleNode("dynamic-element[@field-reference='Text90715721']")??>
38 <#assign telefone = articleXml.selectSingleNode("dynamic-element[@field-reference='Text90715721']")!""
39 telefone = telefone.getStringValue()!""
40 telefone = telefone?replace("\n\t\t", "")
41 telefone = telefone?replace("\n\t", "")
42 >
43
44 </#if>
45
46 <#if articleXml.selectSingleNode("dynamic-element[@field-reference='Text68569631']")??>
47 <#assign email = articleXml.selectSingleNode("dynamic-element[@field-reference='Text68569631']").getStringValue()!""
48 email = email?replace("\n\t\t", "")
49 email = email?replace("\n\t", "")
50 >
51 </#if>
52
53
54 <#if articleXml.selectSingleNode("dynamic-element[@field-reference='CopyOfText18267936']")??>
55 <#assign desc = articleXml.selectSingleNode("dynamic-element[@field-reference='CopyOfText18267936']").getStringValue()!""
56 desc = desc?replace("\n\t\t", "")
57 desc = desc?replace("\n\t", "")
58 >
59 </#if>
60
61 <#if articleXml.selectSingleNode("dynamic-element[@field-reference='Text80669990']")??>
62 <#assign imagem = articleXml.selectSingleNode("dynamic-element[@field-reference='Text80669990']").getStringValue()!""
63 imagem = imagem?replace("\n\t\t", "")
64 imagem = imagem?replace("\n\t", "")
65 >
66 </#if>
67
68 <#if articleXml.selectSingleNode("dynamic-element[@field-reference='CampoDeTexto97452704']")??>
69 <#assign autorId = articleXml.selectSingleNode("dynamic-element[@field-reference='CampoDeTexto97452704']").getStringValue()!""
70 autorId = autorId?replace("\n\t\t", "")
71 autorId = autorId?replace("\n\t", "")
72 autorArticleId = ""
73 >
74 </#if>
75
76 <#assign
77 commentsCount = mbMessageLocalService.getDiscussionMessagesCount(entry.getClassName(), entry.getClassPK(), 0)!"0"
78 >
79
80
81
82 <#if autorId != "" && autorId??>
83 <#assign
84 autor = UserLocalService.fetchUser(autorId?number)!""
85 autorArticleId = autor.getExpandoBridge().getAttribute("journal-article")!"0"
86 />
87 <#if autor != "">
88 <#assign autor = autor.getFullName()!"">
89 <#else>
90 <#assign autor = "Anônimo" >
91 </#if>
92 <#else>
93 <#assign autor = "Anônimo" >
94 </#if>
95 <#assign categorias = AssetCategoryLocalService.getCategoryNames(entry.getClassName(), entry.getClassPK())!"" >
96 <#assign urlWC = "">
97
98 <#if autorArticleId != "0" && autorArticleId != "" && autor != "Anônimo">
99 <#assign autorArticle = JournalArticleLocalService.getLatestArticle(themeDisplay.getLayout().getGroupId(), autorArticleId?string) >
100 <#assign urlWC = autorArticle.getUrlTitle()!"">
101 </#if>
102
103
104 <#assign tags = tagsLocalService.getTagNames("com.liferay.journal.model.JournalArticle", journalArticle.getResourcePrimKey()?number )
105 tagName = tags[0]!""
106 orgOrUser = ""
107 >
108
109 <#if tagName?contains("organization") && tagName != "" >
110 <#assign orgOrUser = "org">
111 <#else>
112 <#assign orgOrUser = "user">
113 </#if>
114
115 <#if orgOrUser == "org" >
116
117 <#assign
118 orgId = tagName?keep_after("organization-")
119 organization = OrganizationLocalService.fetchOrganization(orgId?number)!""
120 >
121
122
123 <#if organization != "" && autor != "Anônimo">
124 <#assign orgArticleId = organization.getExpandoBridge().getAttribute("journal-article")
125 orgJournalArticle = JournalArticleLocalService.getArticle(themeDisplay.getLayout().getGroupId(),orgArticleId?c)
126 urlWC = orgJournalArticle.getUrlTitle()!""
127 autor = organization.getName()!""
128 >
129
130 </#if>
131 </#if>
132
133 <#if themeDisplay.isSignedIn() >
134 <#if tagName?contains("organization-")>
135 <#assign userIsAdmin = OrganizationLocalService.hasUserOrganization(themeDisplay.getUserId(), orgId?number)>
136 <#else>
137 <#if autorId?number == themeDisplay.getUserId()>
138 <script>console.log("oi");</script>
139 <#assign userIsAdmin = true>
140 </#if>
141 </#if>
142
143
144 </#if>
145
146
147 <div class="oferta-lista-item">
148 <div class="lista-checkmark">
149 <#if categorias?seq_contains("aprovado") > <i title="Aprovado" style="color: #4ECD66" class="fa-solid fa-circle-check"></i> </#if>
150 <#if categorias?seq_contains("pendente") > <i title="Em análise" style="color: #D90000"class="fa-solid fa-spinner"></i> </#if>
151 <#if categorias?seq_contains("recusado") > <i title="Recusado" style="color: #D90000"class="fa-solid fa-exclamation-circle"></i> </#if>
152 </div>
153
154
155 <div class="lista-titulo">
156 <h5>${entry.getHighlightedTitle()}</h5>
157 </div>
158
159 <div class="lista-arrow">
160 <button style="padding: 0;" class="btn" type="button" data-toggle="collapse" data-target="#collapseID${entry.getClassPK()}" aria-expanded="false" aria-controls="collapseID${entry.getClassPK()}">
161 <i class="fa-solid fa-chevron-down"></i>
162 </button>
163 </div>
164
165 <div class="lista-desc">
166 <p>${desc}</p>
167 </div>
168
169 <div class="lista-collapse collapse" id="collapseID${entry.getClassPK()}">
170 <#if nomeParaContato != "" || telefone != "" || email != "" || imagem?trim !="">
171 <div class="lista-details">
172 <div class="lista-pic">
173 <i class="fa-solid fa-image-slash"></i>
174 <#if imagem?trim !="" >
175 <img class="bioec_oferta_img" src="${imagem}">
176 <#else>
177 <div class="bioec_oferta_img_placeholder">
178 <i class="fa-solid fa-image"></i>
179 sem imagem
180 </div>
181 </#if>
182 </div>
183 <#if nomeParaContato != "" || telefone != "" || email != "" >
184 <div class="lista-contato">
185 <p>Contato</p>
186 <p class="lista-author">${nomeParaContato}</p>
187 <p class="lista-phone">${telefone}</p>
188 <p class="lista-email">${email}</p>
189 </div>
190 </#if>
191 </div>
192 </#if>
193
194 <#if categorias?seq_contains("recusado") >
195 <div style="border-top: 1px solid #E8ECEF; font-weight: bold; padding-top: 24px;">
196 <p>Conteúdo Em Análise Pelo Cetiqt:</p>
197 <p>Conteúdo recusado pelo CETIQT por violar as políticas de privacidade.</p>
198 </div>
199 </#if>
200 <div class="lista-footnote">
201 <div>
202 <span class="lista-date">${journalArticle.getDisplayDate()?string('dd/MM/yyyy')}</span> | <span class="lista-commentNumber">${commentsCount} cometários</span> <span class="barra-pipe"> | </span> <span class="lista-author">Publicado por <a <#if urlWC != ''>href="/w/${urlWC}</#if>">${autor}</a></span>
203 </div>
204 <#if userIsAdmin>
205 <div class="buttonsActions">
206 <div style="cursor: pointer;font-size: 16px;" data-toggle="modal" data-target="#modalOferta${JournalArticleID}">
207 <i class="fa-solid fa-edit"></i>
208 </div>
209 <div style="cursor: pointer;font-size: 16px;" data-toggle="modal" data-target="#modal-oferta-${entry.getClassPK()}">
210 <i class="fa-solid fa-trash-can"></i>
211 </div>
212
213 </div>
214 </#if>
215 </div>
216 </div>
217 </div>
218
219 <#if userIsAdmin>
220 <div style="display: none;" id="modal-oferta-${entry.getClassPK()}" class="modal fade" role="dialog">
221 <div class="modal-dialog modal-lg" role="document">
222 <div class="modal-content">
223 <div class="modal-header" >
224 <h4 class="m-0">Remover Oferta</h4>
225 <button type="button" class="close" data-dismiss="modal" aria-label="Close">
226 <span aria-hidden="true">
227 <i class="fa-solid fa-close"></i>
228 </span>
229 </button>
230 </div>
231 <div class="modal-body">
232 <h5>Você tem certeza que deseja remover essa oferta?</h5>
233 <div>
234 Ao clicar em continuar, a oferta será removida do seu perfil.
235 </div>
236 </div>
237 <div class="modal-footer justify-content-end">
238 <button class="bioec_secondary_button" data-dismiss="modal">CANCELAR</button>
239 <button class="bioec_primary_button" type="button" onclick="excluirOferta(${JournalArticleFrontId}, ${orgId})">CONTINUAR</button>
240 </div>
241 </div>
242 </div>
243 </div>
244
245 <#-- modal edição -->
246
247
248 <div style="display: none;" id="modalOferta${JournalArticleID}" class="modal fade bioec-profile-oferta-modal modalOferta" role="dialog">
249 <div class="modal-dialog modal-lg" role="document">
250 <form id="formularioOferta${JournalArticleID}" class="form-group modal-content formularioOferta">
251 <div id="ofertaModal-l1${JournalArticleID}" class="modal-header ofertaModal-l1">
252 <h5>Adicionar oferta</h5>
253 <button type="button" class="close" data-dismiss="modal" aria-label="Close">
254 <span aria-hidden="true">×</span>
255 </button>
256 </div>
257 <div id="ofertaModal-l2${JournalArticleID}" class="modal-body ofertaModal-l2">
258 <div id="ofertaTitle${JournalArticleID}" class="ofertaTitle">
259 <label class="ReqLabel" for="ofertaInputTitle${JournalArticleID}">Título da oferta</label>
260 <input id="ofertaInputTitle${JournalArticleID}" value="${entry.getHighlightedTitle()}" type="text" placeholder="Inserir um título" required>
261 </div>
262 <div id="ofertaName${JournalArticleID}" class="ofertaName">
263 <label class="" for="ofertaInputName${JournalArticleID}">Nome para contato</label>
264 <input value="${nomeParaContato}" id="ofertaInputName${JournalArticleID}" placeholder="Inserir nome" type="text">
265 </div>
266 <div id="ofertaTelephone${JournalArticleID}" class="ofertaTelephone">
267 <label class="" for="ofertaInputPhone${JournalArticleID}">Telefone para contato</label>
268 <input value="${telefone}" id="ofertaInputPhone${JournalArticleID}" name="ofertaInputPhone" type="text" placeholder ='(__)_____-_____' minlength="14" />
269 </div>
270 <div id="ofertaEmail${JournalArticleID}" class="ofertaEmail">
271 <label class="" for="ofertaInputEmail${JournalArticleID}">E-mail para contato</label>
272 <input value="${email}" id="ofertaInputEmail${JournalArticleID}" placeholder="Inserir e-mail" type="text">
273 </div>
274 <div id="ofertaDesc${JournalArticleID}" class="ofertaDesc">
275 <label class="ReqLabel" for="ofertaInputDesc${JournalArticleID}">Descrição</label>
276 <textarea id="ofertaInputDesc${JournalArticleID}" style="max-width: 100%;font-size: 16px;height: 80px;border: 1px solid #BEBEBE;" required>${desc}</textarea>
277 </div>
278 <div id="ofertaImg${JournalArticleID}" class="ofertaImg">
279 <div style="display: flex; flex-direction: column; gap: 8px">
280 <label>Imagem da oferta (Máx. 10 MB)</label>
281 <label class="btn carregarImagem" id="carregarImagem${JournalArticleID}" for="inputCarregarImagemOferta${JournalArticleID}" style="font-size: 16px; cursor: pointer;">CARREGAR IMAGEM</label>
282 <input class="inputCarregarImagemOferta" id="inputCarregarImagemOferta${JournalArticleID}" type="file" accept="image/*" onchange="encodeOfertaImageAsURL${JournalArticleID}(this)">
283 <input class="d-none" id="inputOfertaBase64${JournalArticleID}" value="${imagem}"/>
284 <div class="imagemCarregadaOferta imagemCarregadaOferta${JournalArticleID} d-md-none d-block" style="background-image: url(${imagem})"></div>
285 <button type="button" id="removerImagemOferta${JournalArticleID}" class="<#if imagem == "" || imagem?? == false> d-none </#if> removerImagemOferta" >
286 <i class="fa fa-trash"></i> Remover imagem
287 </button>
288 </div>
289 <div class="imagemCarregadaOferta imagemCarregadaOferta${JournalArticleID} d-md-block d-none" style="background-image: url(${imagem})"></div>
290 </div>
291 </div>
292 <div class="TextImportant">
293 <p>
294 Importante: O conteúdo enviado passará por um processo interno de aprovação. Só então o conteúdo adicionado aparecerá no portal.
295 </p>
296 </div>
297
298 <div id="ofertaModal-l3${JournalArticleID}" class="modal-footer ofertaModal-l3">
299 <button class="btn button-empty" onclick="" id="ofertas-saveAndClose${JournalArticleID}">SALVAR E FECHAR</button>
300 </div>
301 </form>
302 </div>
303 </div>
304
305 </#if>
306 <#--
307
308
309
310
311 <div style="display: none;" id="modalInfra${JournalArticleID}" class="modal fade bioec-profile-infra-modal" role="dialog">
312 <div class="modal-dialog modal-lg" role="document">
313
314 <form class="form-group modal-content" id="formularioInfraestrutura${JournalArticleID}">
315 <div id="infraModal-l1-${JournalArticleID}" class="modal-header infraModal-l1" >
316 <h5>Adicionar Infraestrutura</h5>
317 <button id="fecharModal${JournalArticleID}" type="button" class="close" data-dismiss="modal" aria-label="Close">
318 <span aria-hidden="true">×</span>
319 </button>
320 </div>
321 <div id="infraModal-l2-${JournalArticleID}" class="modal-body infraModal-l2">
322 <div id="infraName${JournalArticleID}" class="infraName">
323 <label class="ReqLabel" for="inputInfraName${JournalArticleID}">Nome da infraestrutura</label>
324 <input type="text" id="inputInfraName${JournalArticleID}" value="${entry.getHighlightedTitle()}" placeholder="Nome da infraestrutura" required>
325 </div>
326 <div id="infraModel${JournalArticleID}" class="infraModel">
327 <label class="ReqLabel" for="inputInfraModel${JournalArticleID}">Modelo</label>
328 <input type="text" id="inputInfraModel${JournalArticleID}" value="${modelo}" placeholder="Modelo" required>
329 </div>
330 <div id="infraBrand${JournalArticleID}" class="infraBrand">
331 <label class="ReqLabel" for="inputInfraBrand${JournalArticleID}">Marca</label>
332 <input type="text" id="inputInfraBrand${JournalArticleID}" value="${marca}" placeholder="Marca" required>
333 </div>
334
335 <div id="infraImg${JournalArticleID}" class="infraImg">
336 <div style="display: flex; flex-direction: column; gap: 8px">
337 <label>Imagem da infraestrutura (Máx. 10 MB)</label>
338 <label class="bioec_secondary_button" id="carregarImagem${JournalArticleID}" for="inputCarregarImagemInfra${JournalArticleID}" style="font-size: 16px;color: #333244;align-self:start;">
339 CARREGAR IMAGEM
340 </label>
341 <input id="inputCarregarImagemInfra${JournalArticleID}" class="inputCarregarImagemInfra" type="file" accept="image/*" onchange="encodeInfraImageAsURL${JournalArticleID}(this)">
342 <input class="d-none" id="inputInfraBase64${JournalArticleID}" />
343 <div class="imagemCarregadaInfra${JournalArticleID} d-md-none d-block"></div>
344 <button type="button" id="removerImagemInfra${JournalArticleID}" class="d-none removerImagemInfra" >
345 <i class="fa fa-trash"></i> Remover imagem
346 </button>
347 </div>
348 <div class="imagemCarregadaInfra${JournalArticleID} d-md-block d-none"></div>
349 </div>
350
351 <div id="infraFunction${JournalArticleID}" class="infraFunction">
352 <label class="ReqLabel" for="inputInfraFunction${JournalArticleID}">Função</label>
353 <input type="text" id="inputInfraFunction${JournalArticleID}" class="inputInfraFunction" value="${funcao}" placeholder="Função" required>
354 </div>
355 </div>
356 <div class="TextImportant">
357 <p>
358 Importante: O conteúdo enviado passará por um processo interno de aprovação. Só então o conteúdo adicionado aparecerá no portal.
359 </p>
360 </div>
361 <div id="infraModal-l3-${JournalArticleID}" class="modal-footer infraModal-l3">
362 <button class="bioec_secondary_button" id="ofertas-saveAndClose${JournalArticleID}" onclick="">SALVAR E FECHAR</button>
363 </div>
364 </form>
365
366 </div>
367
368
369 -->
370
371
372
373 <script>
374 <#if userIsAdmin>
375 function excluirOferta(wcId, orgId) {
376 Liferay.Util.openToast({message: "Enviando requisição",type: "info",title: ""});
377 fetch(Liferay.ThemeDisplay.getPortalURL() + "/o/oferta/" + wcId, {
378 method: 'DELETE',
379 "headers": {
380 "x-csrf-token": Liferay.authToken,
381 "Content-Type": "application/json"
382 }
383 })
384 .then(res => {
385 if(res.status == 200) {
386 Liferay.Util.openToast({
387 message: "Infraestrutura excluida com sucesso",
388 type: "success",
389 title: "",
390 toastProps: {
391 autoClose: 5000
392 }
393 })
394 setTimeout(function(){ location.reload(); }, 2000)
395 } else {
396 Liferay.Util.openToast({
397 message: "Erro ao excluir infraestrutura",
398 type: "danger",
399 title: "",
400 toastProps: {
401 autoClose: 5000
402 }
403 })
404 }
405 });
406 }
407
408
409
410
411 function validImageSize(base64="") {
412 const decoded = atob(base64.substring(base64.indexOf(',') + 1));
413 const sizeMB = decoded.length / 1e+6;
414 console.log("MB: " + decoded.length / 1e+6);
415 if(sizeMB > 10) {
416 Liferay.Util.openToast({
417 message: "O tamanho da imagem não deve ultrapassar 10 MB.",
418 type: "danger",
419 title: "",
420 toastProps: {
421 autoClose: 5000
422 }
423 })
424 return false
425 }
426 return true
427 }
428
429 function encodeOfertaImageAsURL${JournalArticleID}(element) {
430 let file = element.files[0];
431 let reader = new FileReader();
432 reader.onloadend = () => {
433 if(reader.result) {
434 if(!validImageSize(reader.result)) return;
435 try {
436 const base64_input = document.getElementById("inputOfertaBase64${JournalArticleID}")
437 base64_input.value = reader.result
438 Array.from(document.getElementsByClassName("imagemCarregadaOferta${JournalArticleID}")).forEach( el => el.style.backgroundImage = 'url(' + reader.result + ')' )
439
440 const removeImageButton = document.getElementById("removerImagemOferta${JournalArticleID}")
441 removeImageButton.classList.remove("d-none")
442 } catch (error) {
443 console.error(error)
444 }
445 }
446 }
447 reader.readAsDataURL(file);
448 }
449
450 function removeImageOferta${JournalArticleID}() {
451 try {
452 const file_input = document.getElementById("inputCarregarImagemOferta${JournalArticleID}")
453 Array.from(document.getElementsByClassName("imagemCarregadaOferta${JournalArticleID}")).forEach( el => el.style.backgroundImage = "" )
454 const base64_input = document.getElementById("inputOfertaBase64${JournalArticleID}")
455 file_input.value = null
456 base64_input.value = ""
457
458 const removeImageButton = document.getElementById("removerImagemOferta${JournalArticleID}")
459 removeImageButton.classList.add("d-none")
460 } catch (error) {
461 console.error(error)
462 }
463}
464
465
466
467document.getElementById("removerImagemOferta${JournalArticleID}").addEventListener("click", removeImageOferta${JournalArticleID});
468
469<#-- Rest da edição de organização -->
470
471<#if orgOrUser == "org">
472document.querySelector('#formularioOferta${JournalArticleID}').addEventListener('submit', event => {
473 event.preventDefault();
474 adicionarOferta${JournalArticleID}();
475});
476
477function adicionarOferta${JournalArticleID}() {
478 Liferay.Util.openToast({message: "Enviando requisição",type: "info",title: ""});
479 $("#ofertas-saveAndClose${JournalArticleID}").prop("disabled",true);
480
481
482
483 const ofertaData = {
484 titulo: document.getElementById("ofertaInputTitle${JournalArticleID}").value,
485 nomeContato: document.getElementById("ofertaInputName${JournalArticleID}").value,
486 telefoneContato: document.getElementById("ofertaInputPhone${JournalArticleID}").value,
487 emailContato: document.getElementById("ofertaInputEmail${JournalArticleID}").value,
488 descricao: document.getElementById("ofertaInputDesc${JournalArticleID}").value,
489 imagem: document.getElementById("inputOfertaBase64${JournalArticleID}").value,
490 }
491
492 console.log(ofertaData);
493
494 fetch(Liferay.ThemeDisplay.getPortalURL() + "/o/oferta/${JournalArticleFrontId}", {
495 method: 'PUT',
496 "headers": {
497 "x-csrf-token": Liferay.authToken,
498 "Content-Type": "application/json"
499 },
500 body: JSON.stringify(ofertaData)
501 })
502 .then(res => {
503 if(res.status == 200) {
504 Liferay.Util.openToast({
505 message: "Oferta editada com sucesso. Após a submissão, será iniciado o processo interno de aprovação do conteúdo enviado. Só então o conteúdo submetido aparecerá no portal.",
506 type: "success",
507 title: "",
508 toastProps: {
509 autoClose: 5000
510 }
511 })
512 setTimeout(function(){ location.reload(); }, 2000);
513 } else {
514 $("#ofertas-saveAndClose${JournalArticleID}").prop("disabled",false);
515 Liferay.Util.openToast({
516 message: "Erro ao editar oferta",
517 type: "danger",
518 title: "",
519 toastProps: {
520 autoClose: 5000
521 }
522 })
523 }
524 })
525 }
526</#if>
527
528<#-- Rest da edição de pessoa fisica -->
529
530
531
532 <#if orgOrUser == "user">
533
534 document.querySelector('#formularioOferta${JournalArticleID}').addEventListener('submit', event => {
535 event.preventDefault();
536 adicionarOferta${JournalArticleID}();
537 });
538
539 function adicionarOferta${JournalArticleID}() {
540 Liferay.Util.openToast({message: "Enviando requisição",type: "info",title: ""});
541 $("#ofertas-saveAndClose${JournalArticleID}").prop("disabled",true);
542
543 const ofertaData = {
544 titulo: document.getElementById("ofertaInputTitle${JournalArticleID}").value,
545 nomeContato: document.getElementById("ofertaInputName${JournalArticleID}").value,
546 telefoneContato: document.getElementById("ofertaInputPhone${JournalArticleID}").value,
547 emailContato: document.getElementById("ofertaInputEmail${JournalArticleID}").value,
548 descricao: document.getElementById("ofertaInputDesc${JournalArticleID}").value,
549 imagem: document.getElementById("inputOfertaBase64${JournalArticleID}").value,
550 }
551
552 console.log(ofertaData);
553
554 fetch(Liferay.ThemeDisplay.getPortalURL() + "/o/oferta/${JournalArticleFrontId}", {
555 method: 'PUT',
556 "headers": {
557 "x-csrf-token": Liferay.authToken,
558 "Content-Type": "application/json"
559 },
560 body: JSON.stringify(ofertaData)
561 })
562 .then( res => {
563 if(res.status == 200) {
564 Liferay.Util.openToast({
565 message: "Oferta editada com sucesso. Após a submissão, será iniciado o processo interno de aprovação do conteúdo enviado. Só então o conteúdo submetido aparecerá no portal.",
566 type: "success",
567 title: "",
568 toastProps: {
569 autoClose: 5000
570 }
571 })
572 setTimeout(function(){ location.reload(); }, 2000);
573 } else {
574 $("#ofertas-saveAndClose${JournalArticleID}").prop("disabled",false);
575 Liferay.Util.openToast({
576 message: "Erro ao editar Oferta",
577 type: "danger",
578 title: "",
579 toastProps: {
580 autoClose: 5000
581 }
582 })
583 }
584 });
585
586 };
587
588
589 </#if>
590
591
592 </#if>
593 </script>
594
595
596
597
598 </#list>
599 </#if>
600 </div>
601</div>
602
603<style>
604.bioec_oferta_img {
605 overflow: hidden;
606 background-size: contain;
607 background-position: center;
608 background-repeat: no-repeat;
609}
610
611.bioec_oferta_img_placeholder {
612 width: 140px;
613 height: 140px;
614 background-color: #E8ECEF;
615 display: flex;
616 flex-direction: column;
617 align-items: center;
618 justify-content: center;
619 font-size: 14px;
620 color: #5B5C61;
621}
622
623.bioec_oferta_img_placeholder i {
624 font-size: 44px;
625}
626
627
628.pagination-items-per-page.active > a,
629.pagination-items-per-page.active > button,
630.pagination-items-per-page.show > a,
631.pagination-items-per-page.show > button,
632.page-item.active .page-link,
633.page-item.show .page-link{
634 border-color: #4ECD66;
635 background-color: #4ECD66;
636}
637
638.pagination-results,
639.pagination-items-per-page > a,
640.pagination-items-per-page > button,
641.pagination-items-per-page > a:hover,
642.pagination-items-per-page > button:hover,
643.page-link{
644 color: #4ebe66;
645}
646
647.bioec-profile-oferta-main{
648 display: flex;
649 gap: 40px;
650 flex-direction: column;
651 padding-bottom: 20px;
652}
653.bioec-profile-oferta-main h5{
654 font-weight: 700;
655}
656.bioec-profile-oferta-main h5, .bioec-profile-oferta-main p{
657 color: #5B5C61;
658 margin-bottom: 0px;
659 font-size: 16px;
660
661}
662
663.bioec-profile-oferta-main #oferta-lista-container>div{
664 border: 1px #BEBEBE solid;
665 padding: 24px 24px 0 24px;
666 margin-bottom: 40px;
667 display: grid;
668 grid-row-gap: 24px;
669 grid-template-columns: 24px 12px 1fr 15px;
670 grid-template-areas:
671 "ck . tit arrw"
672 "desc desc desc desc"
673 "clps clps clps clps";
674}
675
676.bioec-profile-oferta-main .lista-checkmark { grid-area: ck; display: flex; }
677.bioec-profile-oferta-main .lista-checkmark i { font-size: 24px; }
678.bioec-profile-oferta-main .lista-pic { grid-area: pic; display: flex; justify-content: center;}
679.bioec-profile-oferta-main .lista-arrow { grid-area: arrw; }
680
681.bioec-profile-oferta-main .lista-titulo {
682 grid-area: tit;
683 display: flex;
684 flex-direction: column;
685 justify-content: center;
686
687}
688
689.bioec-profile-oferta-main .lista-titulo h5{
690 margin-bottom: 0px;
691}
692
693.bioec-profile-oferta-main .lista-desc {
694grid-area: desc;
695}
696
697.bioec-profile-oferta-main .lista-desc p{
698 margin: 0;
699}
700
701.bioec-profile-oferta-main a{
702 color: #5B5C61;
703}
704
705.oferta-port{
706 border: 1px #BEBEBE solid;
707 padding: 24px;
708 display: flex;
709 flex-direction: column;
710 align-items: center;
711 gap: 24px;
712}
713
714.oferta-port p{
715text-align: center;
716
717}
718
719.oferta-port div{
720display: flex;
721 justify-content: space-between;
722 width: min(558px, 100%);
723}
724
725.button-empty {
726border: solid 1px #4ECD66;
727padding: 8px 24px;
728color: #333244;
729 transition: 250ms;
730}
731
732.button-empty:hover{
733 background-color: #4ECD66;
734}
735
736.button-filled {
737background-color: #4ECD66;
738border: solid 1px #4ECD66;
739padding: 8px 24px;
740color: #333244;
741transition: 250ms;
742
743}
744
745.button-filled:hover{
746 background-color: transparent;
747}
748
749.bioec-profile-oferta-main .lista-footnote {
750
751 display: flex;
752 justify-content: space-between;
753 border-top: 1px solid #E8ECEF;
754 padding-top: 12px;
755 font-size: 14px;
756 font-weight: 300;
757 gap: 15px;
758 color: #5B5C61;
759
760}
761.lista-collapse{
762display: flex;
763flex-direction: column;
764gap: 24px;
765grid-area: clps;
766padding-bottom: 24px;
767}
768
769 .lista-details{
770 display: flex;
771 justify-content: flex-start;
772 gap: 24px;
773}
774.lista-pic img {
775 max-height: 138px;
776 max-width: 138px;
777}
778
779.bioec-profile-oferta-main p{
780
781}
782
783.imagemCarregadaOferta {
784 height: 100px;
785 width: 100px;
786 background-size: contain;
787 background-position: center;
788 background-repeat: no-repeat;
789}
790
791
792.ButtonAddOferta {
793 background: #4ECD66;
794 border-radius: 8px;
795 padding: 8px 24px;
796 border: none;
797 font-weight: 700;
798 color: #333244;
799 font-family: 'Roboto';
800 float: right;
801 text-transform: uppercase;
802}
803.ButtonAddOferta:hover{
804 color: #333244;
805 text-decoration: none;
806}
807
808.bioec-profile-oferta-modal label {
809 margin: 0;
810 cursor: default;
811 font-size: 20px;
812 font-weight: 700;
813 color: #5B5C61;
814}
815
816.bioec-profile-oferta-modal div {
817 width: 100%;
818}
819
820#ofertaModal-l1, .ofertaModal-l1 {
821 padding: 18px 24px;
822 display: flex;
823 justify-content: space-between;
824}
825
826#ofertaModal-l1 img, .ofertaModal-l1 img {
827 cursor: pointer;
828}
829
830#ofertaModal-l1 h5, .ofertaModal-l1 h5 {
831 margin: 0;
832 font-size: 20px;
833 font-weight: 700;
834 color: #5B5C61;
835}
836
837#ofertaModal-l2, .ofertaModal-l2 {
838 border-top: 1px solid #E8ECEF;
839 display: grid;
840 grid-template-columns: 1fr 1fr;
841 grid-template-areas:
842 "titu nome"
843 "fone mail"
844 "desc desc"
845 "imagem ."
846 ;
847 column-gap: 24px;
848 row-gap: 40px;
849 padding: 24px;
850}
851
852#ofertaModal-l2>div, .ofertaModal-l2>div {
853 display: flex;
854 flex-direction: column;
855 gap: 8px;
856}
857
858#ofertaTitle, .ofertaTitle {
859 grid-area: titu;
860}
861
862#ofertaName, .ofertaName {
863 grid-area: nome;
864}
865
866#ofertaTelephone, .ofertaTelephone {
867 grid-area: fone;
868}
869
870#ofertaEmail, .ofertaEmail {
871 grid-area: mail;
872}
873
874#ofertaBrand, .ofertaBrand {
875 grid-area: marca;
876}
877
878#ofertaModal-l2>#ofertaImg, .ofertaModal-l2>.ofertaImg {
879 grid-area: imagem;
880 display: flex;
881 flex-direction: column;
882}
883
884#ofertaDesc, .ofertaDesc {
885 grid-area: desc;
886
887}
888
889#ofertaDesc input, .ofertaDesc input {
890 height: 80px;
891}
892
893.TextImportant{
894 border-bottom: 1px solid #E8ECEF;
895 padding: 24px;
896 color: #5B5C61;
897}
898
899.bioec-profile-oferta-modal input[type="text"] {
900 border-top: none;
901 border-left: none;
902 border-right: none;
903 border-bottom: 1px solid #BEBEBE;
904 width: 100%;
905 font-size: 16px;
906
907}
908
909
910.bioec-profile-oferta-modal input[type="text"]:focus-visible {
911 outline: none;
912 border-bottom: 1px solid black;
913
914}
915
916.bioec-profile-oferta-modal .ReqLabel:before {
917 content: "* ";
918 color: #D90000;
919
920}
921
922#inputCarregarImagemOferta, .inputCarregarImagemOferta {
923 display: none;
924}
925
926#carregarImagem, .carregarImagem {
927 padding: 8px 24px;
928 border: 1px solid #4ECD66;
929 width: fit-content;
930 transition: 250ms;
931
932}
933
934#carregarImagem:hover, .carregarImagem:hover {
935 background-color: #4ECD66;
936}
937
938.button-empty {
939 border: solid 1px #4ECD66;
940 padding: 8px 24px;
941 color: #333244;
942 transition: 250ms;
943 font-weight: bold;
944}
945
946.button-empty:hover {
947 background-color: #4ECD66;
948}
949
950.button-filled {
951 background-color: #4ECD66;
952 border: solid 1px #4ECD66;
953 padding: 8px 24px;
954 color: #333244;
955 transition: 250ms;
956 font-weight: bold;
957}
958
959.button-filled:hover {
960 background-color: transparent;
961}
962
963#ofertaModal-l3, .ofertaModal-l3 {
964 gap: 24px;
965 display: flex;
966 justify-content: flex-end;
967 padding: 24px;
968}
969
970.modal {
971 padding: initial !important;
972 border-radius: 4px !important;
973
974}
975
976.modal a.close-modal {
977 display: none;
978}
979
980#removerImagemOferta, .removerImagemOferta {
981 background: none;
982 border: none;
983 outline: none;
984 color: #5B5C61;
985 font-size: 16px;
986 font-weight: 900;
987 line-height: 24px;
988 letter-spacing: 0em;
989 width: fit-content;
990 margin-left: 16px;
991}
992
993
994@media(max-width: 964px){
995 .lista-pic img {
996 width: 100%;
997 max-height: unset;
998 max-width: unset;
999
1000 }
1001}
1002
1003@media (max-width: 550px) {
1004 #ofertaModal-l2, .ofertaModal-l2 {
1005 display: flex;
1006 flex-direction: column;
1007 }
1008
1009 #ofertaModal-l3, .ofertaModal-l3 {
1010 display: flex;
1011 flex-direction: column;
1012 }
1013}
1014
1015@media(max-width: 450px){
1016 .bioec-profile-oferta-main .lista-details{
1017 flex-direction: column;
1018 }
1019
1020 .lista-contato{
1021 text-align: center;
1022 }
1023
1024 .bioec-profile-oferta-main .lista-footnote{
1025 flex-direction: column;
1026 gap: 10px;
1027 align-items: flex-end;
1028 text-align: right;
1029 }
1030}
1031
1032@media(max-width: 992px){
1033 #oferta-lista-container {
1034 padding-inline: 15px;
1035 }
1036}
1037
1038.bioec-profile-oferta-main .lista-footnote .buttonsActions {
1039 display: flex;
1040 gap: 17px;
1041}
1042
1043@media (max-width: 768px) {
1044 .bioec-profile-oferta-main .lista-desc {
1045 gap: 24px;
1046 flex-direction: column-reverse;
1047 }
1048 .bioec-profile-oferta-main .lista-footnote {
1049 flex-direction: column;
1050 align-items: center;
1051 }
1052 .bioec-profile-oferta-main .lista-footnote > div {
1053 text-align: center;
1054 }
1055
1056 .bioec-profile-oferta-main .lista-footnote .barra-pipe {
1057 display: none;
1058 }
1059 .bioec-profile-oferta-main .lista-footnote .lista-author {
1060 display: flex;
1061 gap: 4px;
1062 justify-content: center;
1063 }
1064 .bioec-profile-oferta-main .lista-footnote .buttonsActions {
1065 width: 100%;
1066 justify-content: space-between;
1067 }
1068}
1069
1070
1071</style>
1072
1073
1074<script>
1075
1076
1077
1078</script>
Conteúdo Em Análise Pelo Cetiqt:
Conteúdo recusado pelo CETIQT por violar as políticas de privacidade.
Conteúdo Em Análise Pelo Cetiqt:
Conteúdo recusado pelo CETIQT por violar as políticas de privacidade.
Conteúdo Em Análise Pelo Cetiqt:
Conteúdo recusado pelo CETIQT por violar as políticas de privacidade.