1052
| <![CDATA[<span class="text-white" style="font-size:xx-large"><svg class="lexicon-icon lexicon-icon-acessibilidade" focusable="false" id="fmtl" role="presentation"><use xlink:href="https://www.bnb.gov.br/o/bnb-dxp-theme/images/bnb/icons.svg#acessibilidade"/></svg></span>]]>
|
1520
| <![CDATA[<div class="card m-0 background-position-y-center background-position-x-center" style="border:none; background-size:cover; background-image: url(/o/adaptive-media/image/2909253/lg/cdc-convenios-home.png?t=1669057647127)">
<div class="card m-0 p-4 d-flex justify-content-end" style="border:none; min-height: 240px; background: linear-gradient(transparent 30%, rgba(0,0,0,0.6) 70%); background-blend-mode: darken;">
<a href="/credito-pessoal-consignado-convenios" class="stretched-link h5 text-white" aria-label="Saiba mais sobre CDC Convênio">
CDC Convênio
</a>
<div class="text-white"><p>Crédito pessoal na medida, com vantagens exclusivas pra você</p></div>
</div>
</div>]]>
|
1521
| <![CDATA[<div class="card m-0 p-4 d-flex justify-content-end" style="border:none; min-height: 240px; background: linear-gradient(transparent 30%, rgba(0,0,0,0.6) 70%); background-blend-mode: darken;">
<a href="/credito-pessoal-consignado-convenios" class="stretched-link h5 text-white" aria-label="Saiba mais sobre CDC Convênio">
CDC Convênio
</a>
<div class="text-white"><p>Crédito pessoal na medida, com vantagens exclusivas pra você</p></div>
</div>]]>
|
1593
| <![CDATA[<div class="card m-0 background-position-y-center background-position-x-center" style="border:none; background-size:cover; background-image: url(/o/adaptive-media/image/2191866/md/mulher-com-oculos-de-realidade-virtual.jpg?t=1660251216072)">
<div class="card m-0 p-4 d-flex justify-content-end" style="border:none; min-height: 240px; background: linear-gradient(transparent 30%, rgba(0,0,0,0.6) 70%); background-blend-mode: darken;">
<a href="https://www.bnb.gov.br/fne-inovacao" class="stretched-link h5 text-white" aria-label="Saiba mais sobre FNE Inovação">
FNE Inovação
</a>
<div class="text-white"><p>Inove em produtos, serviços e processos da sua empresa.</p></div>
</div>
</div>]]>
|
1594
| <![CDATA[<div class="card m-0 p-4 d-flex justify-content-end" style="border:none; min-height: 240px; background: linear-gradient(transparent 30%, rgba(0,0,0,0.6) 70%); background-blend-mode: darken;">
<a href="https://www.bnb.gov.br/fne-inovacao" class="stretched-link h5 text-white" aria-label="Saiba mais sobre FNE Inovação">
FNE Inovação
</a>
<div class="text-white"><p>Inove em produtos, serviços e processos da sua empresa.</p></div>
</div>]]>
|
1666
| <![CDATA[<div class="card m-0 background-position-y-center background-position-x-center" style="border:none; background-size:cover; background-image: url(/o/adaptive-media/image/1529191/md/Cart%C3%A3o+BNB+Agro.jpg?t=1652818815671)">
<div class="card m-0 p-4 d-flex justify-content-end" style="border:none; min-height: 240px; background: linear-gradient(transparent 30%, rgba(0,0,0,0.6) 70%); background-blend-mode: darken;">
<a href="/cartao-bnb-agro" class="stretched-link h5 text-white" aria-label="Saiba mais sobre Cartão BNB Agro">
Cartão BNB Agro
</a>
<div class="text-white"><p>Saiba como obter o financiamento para desenvolver o seu agronegócio</p></div>
</div>
</div>]]>
|
1667
| <![CDATA[<div class="card m-0 p-4 d-flex justify-content-end" style="border:none; min-height: 240px; background: linear-gradient(transparent 30%, rgba(0,0,0,0.6) 70%); background-blend-mode: darken;">
<a href="/cartao-bnb-agro" class="stretched-link h5 text-white" aria-label="Saiba mais sobre Cartão BNB Agro">
Cartão BNB Agro
</a>
<div class="text-white"><p>Saiba como obter o financiamento para desenvolver o seu agronegócio</p></div>
</div>]]>
|
1734
| <![CDATA[<div class="card m-0 background-position-y-center background-position-x-center" style="border:none; background-size:cover; background-image: url(/o/adaptive-media/image/56619/md/por-do-sol.jpg?t=1623335791470)">
<div class="card m-0 p-4 d-flex justify-content-end" style="border:none; min-height: 240px; background: linear-gradient(transparent 30%, rgba(0,0,0,0.6) 70%); background-blend-mode: darken;">
<a href="/agroamigo-sol" class="stretched-link h5 text-white" aria-label="Saiba mais sobre Agroamigo Sol">
Agroamigo Sol
</a>
<div class="text-white"><p>Crédito para geração de energia solar no meio rural.</p></div>
</div>
</div>]]>
|
1735
| <![CDATA[<div class="card m-0 p-4 d-flex justify-content-end" style="border:none; min-height: 240px; background: linear-gradient(transparent 30%, rgba(0,0,0,0.6) 70%); background-blend-mode: darken;">
<a href="/agroamigo-sol" class="stretched-link h5 text-white" aria-label="Saiba mais sobre Agroamigo Sol">
Agroamigo Sol
</a>
<div class="text-white"><p>Crédito para geração de energia solar no meio rural.</p></div>
</div>]]>
|
1772
| <![CDATA[<ul class="nav" style="max-height: 344px" role="navigation">
<li class="nav-item " role="presentation">
<a class="nav-link text-secondary-d1" href="https://www.bnb.gov.br/web/guest/institucional">
<svg class="lexicon-icon lexicon-icon-bnb-simbolo mr-2" focusable="false" id="unxm" role="presentation"><use xlink:href="https://www.bnb.gov.br/o/bnb-dxp-theme/images/bnb/icons.svg#bnb-simbolo"/></svg> Institucional
</a>
</li>
<li class="nav-item " role="presentation">
<a class="nav-link text-secondary-d1" href="https://www.bnb.gov.br/web/guest/desenvolvimento-regional">
<svg class="lexicon-icon lexicon-icon-trajeto mr-2" focusable="false" id="wcnx" role="presentation"><use xlink:href="https://www.bnb.gov.br/o/bnb-dxp-theme/images/bnb/icons.svg#trajeto"/></svg> Desenvolvimento Regional
</a>
</li>
<li class="nav-item " role="presentation">
<a class="nav-link text-secondary-d1" href="https://www.bnb.gov.br/web/guest/sustentabilidade">
<svg class="lexicon-icon lexicon-icon-responsabilidade-ambiental mr-2" focusable="false" id="oucj" role="presentation"><use xlink:href="https://www.bnb.gov.br/o/bnb-dxp-theme/images/bnb/icons.svg#responsabilidade-ambiental"/></svg> Sustentabilidade
</a>
</li>
<li class="nav-item " role="presentation">
<a class="nav-link text-secondary-d1" href="https://www.bnb.gov.br/web/guest/cultura">
<svg class="lexicon-icon lexicon-icon-mascaras-cultura mr-2" focusable="false" id="ncao" role="presentation"><use xlink:href="https://www.bnb.gov.br/o/bnb-dxp-theme/images/bnb/icons.svg#mascaras-cultura"/></svg> Cultura
</a>
</li>
<li class="nav-item " role="presentation">
<a class="nav-link text-secondary-d1" href="https://www.bnb.gov.br/web/guest/etene">
<svg class="lexicon-icon lexicon-icon-prancheta-dados mr-2" focusable="false" id="abhh" role="presentation"><use xlink:href="https://www.bnb.gov.br/o/bnb-dxp-theme/images/bnb/icons.svg#prancheta-dados"/></svg> Etene
</a>
</li>
<li class="nav-item " role="presentation">
<a class="nav-link text-secondary-d1" href="https://www.bnb.gov.br/web/guest/hub-de-inovacao">
<svg class="lexicon-icon lexicon-icon-foguete mr-2" focusable="false" id="twaf" role="presentation"><use xlink:href="https://www.bnb.gov.br/o/bnb-dxp-theme/images/bnb/icons.svg#foguete"/></svg> Hubine
</a>
</li>
<li class="nav-item " role="presentation">
<a class="nav-link text-secondary-d1" href="https://www.bnb.gov.br/web/guest/fundeci">
<svg class="lexicon-icon lexicon-icon-pasta-indicadores mr-2" focusable="false" id="rzsn" role="presentation"><use xlink:href="https://www.bnb.gov.br/o/bnb-dxp-theme/images/bnb/icons.svg#pasta-indicadores"/></svg> Fundeci
</a>
</li>
<li class="nav-item " role="presentation">
<a class="nav-link text-secondary-d1" href="https://www.bnb.gov.br/web/guest/relacao-com-acionistas-e-investidores">
<svg class="lexicon-icon lexicon-icon-relacionamento-2 mr-2" focusable="false" id="xxdm" role="presentation"><use xlink:href="https://www.bnb.gov.br/o/bnb-dxp-theme/images/bnb/icons.svg#relacionamento-2"/></svg> Relação com Acionistas e Investidores
</a>
</li>
<li class="nav-item " role="presentation">
<a class="nav-link text-secondary-d1" href="https://www.bnb.gov.br/web/guest/open-finance">
<svg class="lexicon-icon lexicon-icon-open-finance mr-2" focusable="false" id="xqbe" role="presentation"><use xlink:href="https://www.bnb.gov.br/o/bnb-dxp-theme/images/bnb/icons.svg#open-finance"/></svg> Open Finance
</a>
</li>
<li class="nav-item " role="presentation">
<a class="nav-link text-secondary-d1" href="https://www.bnb.gov.br/web/guest/atividades-financiadas">
<svg class="lexicon-icon lexicon-icon-credito-2 mr-2" focusable="false" id="cepa" role="presentation"><use xlink:href="https://www.bnb.gov.br/o/bnb-dxp-theme/images/bnb/icons.svg#credito-2"/></svg> Atividades Financiadas
</a>
</li>
<li class="nav-item " role="presentation">
<a class="nav-link text-secondary-d1" href="https://www.bnb.gov.br/web/guest/eventos">
<svg class="lexicon-icon lexicon-icon-programacao mr-2" focusable="false" id="ouek" role="presentation"><use xlink:href="https://www.bnb.gov.br/o/bnb-dxp-theme/images/bnb/icons.svg#programacao"/></svg> Eventos
</a>
</li>
<li class="nav-item " role="presentation">
<a class="nav-link text-secondary-d1" href="https://www.bnb.gov.br/web/guest/revista-juridica">
<svg class="lexicon-icon lexicon-icon-livro-aberto mr-2" focusable="false" id="ilrx" role="presentation"><use xlink:href="https://www.bnb.gov.br/o/bnb-dxp-theme/images/bnb/icons.svg#livro-aberto"/></svg> Revista Jurídica
</a>
</li>
<li class="nav-item " role="presentation">
<a class="nav-link text-secondary-d1" href="https://www.bnb.gov.br/web/guest/transparencia-e-prestacao-de-contas">
<svg class="lexicon-icon lexicon-icon-view mr-2" focusable="false" id="dlwf" role="presentation"><use xlink:href="https://www.bnb.gov.br/o/bnb-dxp-theme/images/clay/icons.svg#view"/></svg> Transparência e Prestação de Contas
</a>
</li>
<li class="nav-item " role="presentation">
<a class="nav-link text-secondary-d1" href="https://www.bnb.gov.br/web/guest/seguranca">
<svg class="lexicon-icon lexicon-icon-protegido mr-2" focusable="false" id="rygx" role="presentation"><use xlink:href="https://www.bnb.gov.br/o/bnb-dxp-theme/images/bnb/icons.svg#protegido"/></svg> Segurança
</a>
</li>
<li class="nav-item " role="presentation">
<a class="nav-link text-secondary-d1" href="https://www.bnb.gov.br/web/guest/privacidade-e-protecao-de-dados">
<svg class="lexicon-icon lexicon-icon-hidden mr-2" focusable="false" id="jodj" role="presentation"><use xlink:href="https://www.bnb.gov.br/o/bnb-dxp-theme/images/clay/icons.svg#hidden"/></svg> Privacidade e Proteção de Dados
</a>
</li>
<li class="nav-item " role="presentation">
<a class="nav-link text-secondary-d1" href="https://www.bnb.gov.br/web/guest/sobre-o-banco">
<svg class="lexicon-icon lexicon-icon-bnb-simbolo mr-2" focusable="false" id="egtw" role="presentation"><use xlink:href="https://www.bnb.gov.br/o/bnb-dxp-theme/images/bnb/icons.svg#bnb-simbolo"/></svg> Tudo Sobre o Banco
</a>
</li>
</ul>]]>
|
1961
| <![CDATA[<section class="bg-" style="">
<div class="container px-3 py-5">
<div class="row ">
<div class="col-md-12">
<div id="fragment-0-iofy" >
<div class="portlet-boundary portlet-boundary_com_liferay_site_navigation_breadcrumb_web_portlet_SiteNavigationBreadcrumbPortlet_ portlet-static portlet-static-end portlet-breadcrumb " id="p_p_id_com_liferay_site_navigation_breadcrumb_web_portlet_SiteNavigationBreadcrumbPortlet_INSTANCE_bdBSZcEPvDWD_">
<span id="p_com_liferay_site_navigation_breadcrumb_web_portlet_SiteNavigationBreadcrumbPortlet_INSTANCE_bdBSZcEPvDWD"></span>
<section class="portlet" id="portlet_com_liferay_site_navigation_breadcrumb_web_portlet_SiteNavigationBreadcrumbPortlet_INSTANCE_bdBSZcEPvDWD">
<div class="portlet-content">
<div class="autofit-float autofit-row portlet-header mb-0">
</div>
<div class=" portlet-content-container">
<div class="portlet-body">
<nav aria-label="Caminho de Navegação" id="_com_liferay_site_navigation_breadcrumb_web_portlet_SiteNavigationBreadcrumbPortlet_INSTANCE_bdBSZcEPvDWD_breadcrumbs-defaultScreen">
<style>
.isDisabled {
color: darkslategray !important;
pointer-events: none;
}
.confIcon{
height:0.7em;
margin-top:0;
}
</style>
<a class="breadcrumb-last-item" href="https://www.bnb.gov.br/web/guest/acesso-a-informacao">Acesso à Informação</a>
<svg class="lexicon-icon lexicon-icon-caret-right-l" focusable="false" id="bkhd" role="presentation"><use xlink:href="https://www.bnb.gov.br/o/bnb-dxp-theme/images/clay/icons.svg#caret-right-l" /></svg> <span class="breadcrumb-item">Empregados</span>
</nav>
</div>
</div>
</div>
</section>
</div>
</div>
<div id="fragment-1170299-xyah" > <div class="fragment_1170299">
<h1 class="text-primary mt-4 mb-3">
Empregados
</h1>
</div></div><style>.fragment_1170299 {
}</style>
<div id="fragment-0-vinp" > <div class="component-paragraph pb-3 text-left text-break">
<div><p class="lead">Nesta seção, são divulgadas informações sobre concursos públicos de provimento de cargos e relação dos empregados lotados ou em exercício no Banco do Nordeste.</p>
</div>
</div></div><style>.component-paragraph img {
max-width: 100%;
}</style><script>(function() {var fragmentElement = document.querySelector('#fragment-0-vinp'); var configuration = {"textAlign":"left","bottomSpacing":"3","textColor":{"cssClass":"","rgbValue":""}};/**
* Copyright (c) 2000-present Liferay, Inc. All rights reserved.
*
* This library is free software; you can redistribute it and/or modify it under
* the terms of the GNU Lesser General Public License as published by the Free
* Software Foundation; either version 2.1 of the License, or (at your option)
* any later version.
*
* This library is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
* details.
*/;}());</script>
</div>
</div>
</div>
</section>]]>
|
2339
| <![CDATA[<section class="bg-light" style="">
<div class="container px-3 py-0">
<div class="row ">
<div class="col-md-12">
<div id="fragment-0-fdhb" > <div class="py-4"></div></div><script>(function() {var fragmentElement = document.querySelector('#fragment-0-fdhb'); var configuration = {"height":"py-4"};/**
* Copyright (c) 2000-present Liferay, Inc. All rights reserved.
*
* This library is free software; you can redistribute it and/or modify it under
* the terms of the GNU Lesser General Public License as published by the Free
* Software Foundation; either version 2.1 of the License, or (at your option)
* any later version.
*
* This library is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
* details.
*/;}());</script>
<div id="fragment-0-rzef" > <h2 class="component-heading mb-0 pb-4 text-left text-break ">
<span>Relação de Empregados, Bolsistas e Terceirizados</span>
</h2></div><style>.fragment-heading-text-colored a {
color: inherit;
}</style><script>(function() {var fragmentElement = document.querySelector('#fragment-0-rzef'); var configuration = {"textAlign":"left","bottomSpacing":"4","headingLevel":"h2","textColor":{"cssClass":"","rgbValue":""}};/**
* Copyright (c) 2000-present Liferay, Inc. All rights reserved.
*
* This library is free software; you can redistribute it and/or modify it under
* the terms of the GNU Lesser General Public License as published by the Free
* Software Foundation; either version 2.1 of the License, or (at your option)
* any later version.
*
* This library is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
* details.
*/;}());</script>
</div>
</div>
</div>
</section>]]>
|
2403
| <![CDATA[<section class="bg-light" style="">
<div class="container px-3 py-0">
<div class="row ">
<div class="col-md-4">
<div id="fragment-47410-brdw" >
<div class="card card-horizontal shadow">
<div class="card-body">
<div class="card-row">
<div class="autofit-col align-self-start" style="font-size:4.5rem">
<svg class="lexicon-icon lexicon-icon-arquivo-ods text-tertiary mt-1" focusable="false" id="avbc" role="presentation"><use xlink:href="https://www.bnb.gov.br/o/bnb-dxp-theme/images/bnb/icons.svg#arquivo-ods" /></svg> </div>
<div class="autofit-col autofit-col-expand autofit-col-gutters">
<div class="card-title"><div class="h6"><a href="https://www.bnb.gov.br/documents/45807/73074/Rela%C3%A7%C3%A3o+de+empregados+do+Banco+do+Nordeste.ods/8aef6f12-b55b-92a3-0ba0-a98a39a1b016?version=20.0&t=1694543439215&download=true" class="stretched-link">Relação de empregados do Banco do Nordeste.ods</a></div></div>
<div class="card-subtitle">
<span class="font-weight-bold">Atualizado em: </span>12/09/2023
</div>
<div class="card-detail">
<span class="label label-unstyled text-uppercase" id="ohcw"><span class="label-item label-item-expand">ods</span></span><span class="label label-unstyled text-uppercase" id="skqi"><span class="label-item label-item-expand">545 KB</span></span> </div>
</div>
</div>
</div>
</div></div><style>.fragment_136960 {
}</style>
</div>
<div class="col-md-4">
<div id="fragment-47410-pqem" >
<div class="card card-horizontal shadow">
<div class="card-body">
<div class="card-row">
<div class="autofit-col align-self-start" style="font-size:4.5rem">
<svg class="lexicon-icon lexicon-icon-arquivo-ods text-tertiary mt-1" focusable="false" id="dzfo" role="presentation"><use xlink:href="https://www.bnb.gov.br/o/bnb-dxp-theme/images/bnb/icons.svg#arquivo-ods" /></svg> </div>
<div class="autofit-col autofit-col-expand autofit-col-gutters">
<div class="card-title"><div class="h6"><a href="https://www.bnb.gov.br/documents/45807/73074/Rela%C3%A7%C3%A3o+de+bolsistas+do+Banco+do+Nordeste.ods/3cd53ab9-6ebd-e657-09b5-0969e26e4bf3?version=21.0&t=1694618526072&download=true" class="stretched-link">Relação de bolsistas do Banco do Nordeste.ods</a></div></div>
<div class="card-subtitle">
<span class="font-weight-bold">Atualizado em: </span>13/09/2023
</div>
<div class="card-detail">
<span class="label label-unstyled text-uppercase" id="uyug"><span class="label-item label-item-expand">ods</span></span><span class="label label-unstyled text-uppercase" id="rakp"><span class="label-item label-item-expand">262 KB</span></span> </div>
</div>
</div>
</div>
</div></div>
</div>
<div class="col-md-4">
<div id="fragment-47410-pind" >
<div class="card card-horizontal shadow">
<div class="card-body">
<div class="card-row">
<div class="autofit-col align-self-start" style="font-size:4.5rem">
<svg class="lexicon-icon lexicon-icon-arquivo-ods text-tertiary mt-1" focusable="false" id="oavg" role="presentation"><use xlink:href="https://www.bnb.gov.br/o/bnb-dxp-theme/images/bnb/icons.svg#arquivo-ods" /></svg> </div>
<div class="autofit-col autofit-col-expand autofit-col-gutters">
<div class="card-title"><div class="h6"><a href="https://www.bnb.gov.br/documents/45835/0/Rela%C3%A7%C3%A3o+de+terceirizados+do+Banco+do+Nordeste.ods/92a9d11e-72b6-3e66-7d87-1e5dce5ee960?version=6.0&t=1693954303945&download=true" class="stretched-link">Relação de terceirizados do Banco do Nordeste.ods</a></div></div>
<div class="card-subtitle">
<span class="font-weight-bold">Atualizado em: </span>05/09/2023
</div>
<div class="card-detail">
<span class="label label-unstyled text-uppercase" id="fbbp"><span class="label-item label-item-expand">ods</span></span><span class="label label-unstyled text-uppercase" id="sjxt"><span class="label-item label-item-expand">138 KB</span></span> </div>
</div>
</div>
</div>
</div></div>
</div>
</div>
</div>
</section>]]>
|
2418
| <![CDATA[<div class="autofit-col align-self-start" style="font-size:4.5rem">
<svg class="lexicon-icon lexicon-icon-arquivo-ods text-tertiary mt-1" focusable="false" id="avbc" role="presentation"><use xlink:href="https://www.bnb.gov.br/o/bnb-dxp-theme/images/bnb/icons.svg#arquivo-ods" /></svg> </div>]]>
|
2450
| <![CDATA[<div class="autofit-col align-self-start" style="font-size:4.5rem">
<svg class="lexicon-icon lexicon-icon-arquivo-ods text-tertiary mt-1" focusable="false" id="dzfo" role="presentation"><use xlink:href="https://www.bnb.gov.br/o/bnb-dxp-theme/images/bnb/icons.svg#arquivo-ods" /></svg> </div>]]>
|
2481
| <![CDATA[<div class="autofit-col align-self-start" style="font-size:4.5rem">
<svg class="lexicon-icon lexicon-icon-arquivo-ods text-tertiary mt-1" focusable="false" id="oavg" role="presentation"><use xlink:href="https://www.bnb.gov.br/o/bnb-dxp-theme/images/bnb/icons.svg#arquivo-ods" /></svg> </div>]]>
|
2517
| <![CDATA[<section class="bg-light" style="">
<div class="container px-3 py-0">
<div class="row ">
<div class="col-md-12">
<div id="fragment-0-mnah" > <div class="py-3"></div></div><script>(function() {var fragmentElement = document.querySelector('#fragment-0-mnah'); var configuration = {"height":"py-3"};/**
* Copyright (c) 2000-present Liferay, Inc. All rights reserved.
*
* This library is free software; you can redistribute it and/or modify it under
* the terms of the GNU Lesser General Public License as published by the Free
* Software Foundation; either version 2.1 of the License, or (at your option)
* any later version.
*
* This library is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
* details.
*/;}());</script>
</div>
</div>
</div>
</section>]]>
|
2561
| <![CDATA[<section class="bg-primary" style="">
<div class="container px-3 py-5">
<div class="row ">
<div class="col-md-12">
<div id="fragment-0-qqxm" > <h2 class="component-heading mb-0 pb-3 text-white text-left text-break fragment-heading-text-colored">
<span>Concursos</span>
</h2></div><script>(function() {var fragmentElement = document.querySelector('#fragment-0-qqxm'); var configuration = {"textAlign":"left","bottomSpacing":"3","headingLevel":"h2","textColor":{"cssClass":"white","rgbValue":"rgb(230, 230, 230)"}};/**
* Copyright (c) 2000-present Liferay, Inc. All rights reserved.
*
* This library is free software; you can redistribute it and/or modify it under
* the terms of the GNU Lesser General Public License as published by the Free
* Software Foundation; either version 2.1 of the License, or (at your option)
* any later version.
*
* This library is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
* details.
*/;}());</script>
<div id="fragment-0-fxme" >
<div class="portlet-boundary portlet-boundary_com_liferay_site_navigation_site_map_web_portlet_SiteNavigationSiteMapPortlet_ portlet-static portlet-static-end portlet-site-map " id="p_p_id_com_liferay_site_navigation_site_map_web_portlet_SiteNavigationSiteMapPortlet_INSTANCE_iRIRmokgS8HG_">
<span id="p_com_liferay_site_navigation_site_map_web_portlet_SiteNavigationSiteMapPortlet_INSTANCE_iRIRmokgS8HG"></span>
<section class="portlet" id="portlet_com_liferay_site_navigation_site_map_web_portlet_SiteNavigationSiteMapPortlet_INSTANCE_iRIRmokgS8HG">
<div class="portlet-content">
<div class="autofit-float autofit-row portlet-header mb-0">
</div>
<div class=" portlet-content-container">
<div class="portlet-body">
<ul class="list-group mb-4">
<li class="list-group-item list-group-item-flex align-items-center">
<div class="autofit-col autofit-col-expand font-weight-bold">
<a href="/acesso-a-informacao/empregados/concurso-publico-de-2022" title="Concurso Público de 2022" aria-label="Concurso Público de 2022">Concurso Público de 2022</a>
</div>
<div class="autofit">
<span class="label label-lg label-success">
<span class="label-item label-item-expand">Em Andamento</span>
</span>
</div>
</li>
<li class="list-group-item list-group-item-flex align-items-center">
<div class="autofit-col autofit-col-expand font-weight-bold">
<a href="/acesso-a-informacao/empregados/concurso-publico-de-2018" title="Concurso Público de 2018" aria-label="Concurso Público de 2018">Concurso Público de 2018</a>
</div>
<div class="autofit">
<span class="label label-lg label-success">
<span class="label-item label-item-expand">Em Andamento</span>
</span>
</div>
</li>
<li class="list-group-item list-group-item-flex align-items-center">
<div class="autofit-col autofit-col-expand font-weight-bold">
<a href="/acesso-a-informacao/empregados/concurso-publico-de-2014" title="Concurso Público de 2014" aria-label="Concurso Público de 2014">Concurso Público de 2014</a>
</div>
<div class="autofit">
<span class="label label-lg label-danger">
<span class="label-item label-item-expand">Encerrado</span>
</span>
</div>
</li>
<li class="list-group-item list-group-item-flex align-items-center">
<div class="autofit-col autofit-col-expand font-weight-bold">
<a href="/acesso-a-informacao/empregados/concurso-publico-de-2010" title="Concurso Público de 2010" aria-label="Concurso Público de 2010">Concurso Público de 2010</a>
</div>
<div class="autofit">
<span class="label label-lg label-danger">
<span class="label-item label-item-expand">Encerrado</span>
</span>
</div>
</li>
</ul>
</div>
</div>
</div>
</section>
</div>
</div>
</div>
</div>
</div>
</section>]]>
|
2949
| <![CDATA[<section class="bg-" style="">
<div class="container px-3 py-5">
<div class="row ">
<div class="col-md-12">
<div id="fragment-0-nsrw" > <h2 class="component-heading mb-0 pb-3 text-left text-break ">
<span>Acordos Coletivos de Trabalho</span>
</h2></div><script>(function() {var fragmentElement = document.querySelector('#fragment-0-nsrw'); var configuration = {"textAlign":"left","bottomSpacing":"3","headingLevel":"h2","textColor":{"cssClass":"","rgbValue":""}};/**
* Copyright (c) 2000-present Liferay, Inc. All rights reserved.
*
* This library is free software; you can redistribute it and/or modify it under
* the terms of the GNU Lesser General Public License as published by the Free
* Software Foundation; either version 2.1 of the License, or (at your option)
* any later version.
*
* This library is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
* details.
*/;}());</script>
<div id="fragment-2316268-jnyh" >
<script id="data_jnyh" type="application/json">{"title":"Acordos Coletivos de Trabalho - Contec","type":0,"typeSettings":{"anyClassTypeDLFileEntryAssetRendererFactory":"47046","orderByColumn1":"ddm__keyword__47047__DataReferência"}}</script>
<h3 class="mb-0 pb-3 text-primary text-left text-break fragment-heading-text-colored">
<div>Contec</div>
</h3>
<span class="loading-animation"></span>
<div class="documents-list"></div>
</div><style>.page-item button {
border-radius: 2rem !important;
}</style><script>(function() {var fragmentElement = document.querySelector('#fragment-2316268-jnyh'); var configuration = {"contentSetId":"2705607","showDateConversions":false,"showModifiedDate":true,"showRefDate":false,"textAlign":"left","pageSize":"50","showYear":false,"groupBy":"noGroup","textColor":{"cssClass":"primary","rgbValue":"rgb(122, 18, 44)"},"useTitle":true,"usePagination":false,"bottomSpacing":"3","labelForYear":"Ocorrido em","useContentSetTitle":false,"labelForRefDate":"Referente a","headingLevel":"h3","showCreateDate":true,"activeDebug":false};const editMode = document.body.classList.contains('has-edit-mode-menu')
const apiURL = `${Liferay.ThemeDisplay.getPortalURL()}/o/headless-delivery`
const contentSetsEndPoint = `/v1.0/content-sets/${configuration.contentSetId}/content-set-elements`
const restrictFields = 'title,content.contentUrl,content.dateCreated,content.dateModified,content.documentType,content.fileExtension,content.sizeInBytes'
const params = { fields: restrictFields, 'pageSize': configuration.pageSize, 'page': 1 }
const pathThemeImages = Liferay.ThemeDisplay.getPathThemeImages()
const spritemapBNB = `${pathThemeImages}/bnb/icons.svg`
const spritemapClay = `${pathThemeImages}/clay/icons.svg`
const scriptAssetListJson = fragmentElement.querySelector(`script#data_${fragmentElement.id.slice(-4)}`)
const assetListObject = (scriptAssetListJson) ? JSON.parse(scriptAssetListJson.text) : null
const documentsList = fragmentElement.querySelector('.documents-list')
const loadingAnimation = fragmentElement.querySelector('.loading-animation')
const orderByYearAttrs = ['modifiedDate', 'createDate', 'publishDate', 'ddm__keyword__47047__DataReferência', 'ddm__keyword__47054__Ano']
const orderByMonthYearAttrs = ['modifiedDate', 'createDate', 'publishDate', 'ddm__keyword__47047__DataReferência']
const orderByDayAttrs = ['modifiedDate', 'createDate', 'publishDate', 'ddm__keyword__47047__DataReferência']
const fileEntryTypes = { 'docOrdin': 47046, 'docAnual': 47053 }
const validity = (assetListObject) ? validateConfiguration() : null
validity && init()
// funcao de inicialização
function init() {
fragmentElement.classList.add('mb-4')
editMode && reportConstraints()
fetchDocumentsPage()
}
// constrói um objeto para verificar status de validade de algumas configurações
function validateConfiguration() {
let orderByColumn = assetListObject.typeSettings.orderByColumn1
let orderByColumnName = getOrderByFieldName(orderByColumn)
let canGroupByYear = orderByYearAttrs.includes(orderByColumn)
let canGroupByMonthYear = orderByMonthYearAttrs.includes(orderByColumn)
let canGroupByDay = orderByDayAttrs.includes(orderByColumn)
let canShowRefDate = (assetListObject.typeSettings.anyClassTypeDLFileEntryAssetRendererFactory == fileEntryTypes.docOrdin)
let canShowYear = (assetListObject.typeSettings.anyClassTypeDLFileEntryAssetRendererFactory == fileEntryTypes.docAnual)
let validityState = {
'canGroupByYear': {
'state': canGroupByYear,
'msg' : canGroupByYear ? '' : `A coleção não pode ser agrupada por ano, pois está ordenada por ${orderByColumnName}.`
},
'canGroupByMonthYear': {
'state': canGroupByMonthYear,
'msg' : canGroupByMonthYear ? '' : `A coleção não pode ser agrupada por mês e ano, pois está ordenada por ${orderByColumnName}.`
},
'canGroupByDay': {
'state': canGroupByDay,
'msg' : canGroupByDay ? '' : `A coleção não pode ser agrupada por dia, pois está ordenada por ${orderByColumnName}.`
},
'canShowRefDate': {
'state': canShowRefDate,
'msg' : canShowRefDate ? '' : 'Não é possível mostrar o campo Data de Referência. Esse metadado existe apenas em coleções de Documentos Ordinários.'
},
'canShowYear': {
'state': canShowYear,
'msg' : canShowYear ? '' : 'Não é possível mostrar o campo Ano. Esse metadado existe apenas em coleções de Documentos Anuais.'
}
}
return validityState
}
// alerta sobre restrições na configuração
function reportConstraints() {
cleanAlerts()
// alerta sobre restrições
let validationMessages = []
configuration.groupBy == 'groupByYear' && !validity.canGroupByYear.state && validationMessages.push(validity.canGroupByYear.msg)
configuration.groupBy == 'groupByMonthYear' && !validity.canGroupByMonthYear.state && validationMessages.push(validity.canGroupByMonthYear.msg)
configuration.groupBy == 'groupByDay' && !validity.canGroupByDay.state && validationMessages.push(validity.canGroupByDay.msg)
configuration.showRefDate && !validity.canShowRefDate.state && validationMessages.push(validity.canShowRefDate.msg)
configuration.showYear && !validity.canShowYear.state && validationMessages.push(validity.canShowYear.msg)
validationMessages.length > 0 && displayAlert('danger', 'Configuração inválida', validationMessages.join('<br/>'), documentsList, 'beforebegin')
// debug
if (configuration.activeDebug) {
console.clear()
console.log('Propriedades da Coleção:')
console.log(assetListObject)
console.log('Configuração do Fragmento:')
console.log(configuration)
console.log('Validade da Configuração:')
console.log(validity)
}
}
// principal funcao para pegar os dados
function fetchDocumentsPage(page) {
params.page = (page) ? page : params.page
let request = Liferay.Util.addParams(params, apiURL+contentSetsEndPoint)
fetch(
request,
{
method: 'GET',
headers: {
'Content-Type': 'application/json'
}
}
).then(response => {
if (response.ok) {
return response.json()
}
}).then(documents => {
handleDocuments(documents)
if (editMode && configuration.activeDebug) {
console.log(`Retorno da requisição (page ${params.page}):`)
console.log(documents)
}
})
}
// manipula dados retornados da coleção
function handleDocuments(documents) {
loadingAnimation && loadingAnimation.remove()
if (documents.items.length > 0) {
switch (configuration.groupBy) {
case 'noGroup':
renderDocumentsList(documents)
break
case 'groupByYear':
(validity.canGroupByYear.state) ? renderDocumentsListByGroup(documents) : renderDocumentsList(documents)
break
case 'groupByMonthYear':
(validity.canGroupByMonthYear.state) ? renderDocumentsListByGroup(documents) : renderDocumentsList(documents)
break
case 'groupByDay':
(validity.canGroupByDay.state) ? renderDocumentsListByGroup(documents) : renderDocumentsList(documents)
break
}
configuration.usePagination && renderPaginationBar(documents.page, documents.lastPage, documents.totalCount)
} else {
displayAlert('info', 'Aviso', 'Não foram encontrados documentos', documentsList, 'afterbegin')
}
}
// renderiza lista agrupada
function renderDocumentsListByGroup(documents) {
let lastListGroup = documentsList.querySelector('.list-group:last-child')
let currentGroup = (lastListGroup) ? lastListGroup.dataset.group : 0
configuration.activeDebug
&& configuration.showDateConversions
&& editMode
&& console.log(`Extração do grupo a partir do campo ${getOrderByFieldName(assetListObject.typeSettings.orderByColumn1)}:`)
documents.items.forEach(doc => {
let group = getDocumentGroup(doc)
if (currentGroup != group) {
let listGroup = document.createElement('ul')
listGroup.classList.add('list-group')
listGroup.dataset.group = group
listGroup.setAttribute('aria-label', `${assetListObject.title} de ${group}`)
lastListGroup = documentsList.insertAdjacentElement('beforeend', listGroup)
lastListGroup.insertAdjacentHTML('afterbegin', renderListGroupHeader(group))
currentGroup = group
}
lastListGroup.insertAdjacentHTML('beforeend', renderListGroupItem(doc))
})
}
// extrai e retorna o dado (string) utilizado como agrupador (dia, mês ou ano) a partir do campo utilizado como primeira ordenação da coleção
function getDocumentGroup(document) {
let fieldData
let group
let dateField
let options
let test
let orderByColumn = assetListObject.typeSettings.orderByColumn1
switch (orderByColumn) {
case 'ddm__keyword__47047__DataReferência':
fieldData = document.content.documentType.contentFields[0].contentFieldValue.data
break
case 'ddm__keyword__47054__Ano':
fieldData = document.content.documentType.contentFields[0].contentFieldValue.data
break
case 'modifiedDate':
fieldData = document.content.dateModified
break
case 'createDate':
fieldData = document.content.dateCreated
break
case 'publishDate': // verificar esse caso por que não há uma campo data de publicação em coleções de documentos
fieldData = document.content.dateCreated
break
}
dateField = new Date(fieldData)
switch (configuration.groupBy) {
case 'groupByYear':
test = (orderByColumn == 'ddm__keyword__47047__DataReferência' || orderByColumn == 'ddm__keyword__47054__Ano')
group = test ? dateField.getUTCFullYear() : dateField.getFullYear()
break
case 'groupByMonthYear':
test = (orderByColumn == 'ddm__keyword__47047__DataReferência')
options = test ? {month:'long', year:'numeric', timeZone: 'UTC'} : { month:'long', year:'numeric' }
group = dateField.toLocaleDateString('pt-BR', options)
group = group.charAt(0).toUpperCase() + group.slice(1)
break
case 'groupByDay':
test = (orderByColumn == 'ddm__keyword__47047__DataReferência')
options = test ? {timeZone: 'UTC'} : {}
group = dateField.toLocaleDateString('pt-BR', options)
break
}
configuration.activeDebug && configuration.showDateConversions && editMode && console.log(`${fieldData} --> ${group}`)
return group
}
// renderiza lista comum
function renderDocumentsList(documents) {
let listGroup = getNodeElement(documentsList, 'afterbegin', 'ul', '.list-group')
listGroup.setAttribute('aria-label', assetListObject.title)
documents.items.forEach(doc => {
listGroup.insertAdjacentHTML('beforeend', renderListGroupItem(doc))
})
}
// renderiza cabeçalho da lista
function renderListGroupHeader(title) {
let listHeaderHTML = `
<li class="list-group-header">
<span class="list-group-header-title"><big>${title}</big></span>
</li>
`
return listHeaderHTML
}
// renderiza um item da lista
function renderListGroupItem(document) {
let dateCreated = (configuration.showCreateDate) ? new Date(document.content.dateCreated) : null
let dateCreatedHTML = (dateCreated) ? `
<div class="d-flex flex-row flex-lg-column text-lg-right ml-lg-3 mr-md-2 mr-lg-0">
<span class="small font-weight-bold text-nowrap mr-1 mr-lg-0">Publicado em</span>
<span class="small">${dateCreated.toLocaleDateString('pt-BR')}</span>
</div>` : ''
let dateModified = (configuration.showModifiedDate) ? new Date(document.content.dateModified) : null
let dateModifiedHTML = (dateModified) ? `
<div class="d-flex flex-row flex-lg-column text-lg-right ml-lg-3 mr-md-2 mr-lg-0">
<span class="small font-weight-bold text-nowrap mr-1 mr-lg-0">Atualizado em</span>
<span class="small">${dateModified.toLocaleDateString('pt-BR')}</span>
</div>` : ''
let refDate = (configuration.showRefDate && validity.canShowRefDate.state) ? new Date(document.content.documentType.contentFields[0].contentFieldValue.data) : null
let refDateHTML = (refDate) ? `
<div class="d-flex flex-row flex-lg-column text-lg-right ml-lg-3 mr-md-2 mr-lg-0">
<span class="small font-weight-bold text-nowrap mr-1 mr-lg-0">${configuration.labelForRefDate}</span>
<span class="small">${refDate.toLocaleDateString('pt-BR', {timeZone: 'UTC'})}</span>
</div>` : ''
let year = (configuration.showYear && validity.canShowYear.state) ? document.content.documentType.contentFields[0].contentFieldValue.data : null
let yearHTML = (year) ? `
<div class="d-flex flex-row flex-lg-column text-lg-right ml-lg-3 mr-md-2 mr-lg-0">
<span class="small font-weight-bold text-nowrap mr-1 mr-lg-0">${configuration.labelForYear}</span>
<span class="small">${year}</span>
</div>` : ''
let hasMetadatas = (year || refDate || dateCreated || dateModified)
let metadataHTML = (hasMetadatas) ? `
<div class="d-flex flex-column flex-md-row">
${yearHTML}
${refDateHTML}
${dateCreatedHTML}
${dateModifiedHTML}
</div>` : ''
let listItemHTML = `
<li class="list-group-item list-group-item-flex align-items-center">
<div class="autofit-col">
<svg class="lexicon-icon text-tertiary lexicon-icon-lg" focusable="false" role="presentation"
viewBox="0 0 512 512">
<use xlink:href="${spritemapBNB}#arquivo-${document.content.fileExtension}" />
</svg>
</div>
<div class="autofit-col autofit-col-expand">
<div class="d-flex flex-column flex-lg-row justify-content-start justify-content-lg-between">
<div class="d-flex flex-column">
<span class="list-group-title">
<a href="${document.content.contentUrl}">${document.title}</a>
</span>
<span class="list-group-subtitle text-uppercase small">
${document.content.fileExtension}, ${Liferay.Util.formatStorage(document.content.sizeInBytes, {addSpaceBeforeSuffix: true})}
</span>
</div>
${metadataHTML}
</div>
</div>
</li>
`
return listItemHTML
}
// renderiza paginação
function renderPaginationBar(page, lastPage, totalCount) {
let paginationBar = getNodeElement(fragmentElement, 'beforeend', 'div', '.pagination-bar')
let lastIndex = (page === lastPage) ? totalCount : configuration.pageSize*page
let nDocuments = (page+1 === lastPage) ? totalCount - configuration.pageSize*page : configuration.pageSize
paginationBar.classList.add('justify-content-center', 'justify-content-lg-between')
let textColor = (configuration.textColor.cssClass) ? `text-${configuration.textColor.cssClass}` : ''
paginationBar.innerHTML = `
<div class="pagination-results mr-0 ${textColor}">Exibindo 1 a ${lastIndex} de ${totalCount} documentos.</div>
<ul class="pagination">
<li class="page-item">
<button class="btn btn-unstyled page-link" type="button">
Exibir mais ${nDocuments} documentos
${renderIcon('angle-down', spritemapClay, 'ml-2')}
</button>
</li>
</ul>
`
let showMoreButton = paginationBar.querySelector('button.page-link')
if (page !== lastPage) {
showMoreButton.addEventListener('click', e => {
showMoreButton.querySelector('svg').remove()
let loadAnimation = getNodeElement(showMoreButton, 'beforeend', 'span', '.loading-animation')
loadAnimation.classList.add('loading-animation-sm', 'ml-2')
fetchDocumentsPage(page+1)
})
} else {
showMoreButton.remove()
}
}
// imprime um mensagem de alerta
function displayAlert(style, title, msg, parentNode, position) {
let styleIcons = {
'danger': 'exclamation-full',
'success': 'check-circle-full',
'info': 'info-circle',
'warning': 'warning-full'
}
let html = `
<div class="alert p-4 alert-${style}" role="alert">
<span class="alert-indicator">
${renderIcon(styleIcons[style], spritemapClay, '')}
</span>
<strong>${title}:</strong>
<p class="mt-2 mb-0">${msg}</p>
</div>
`
parentNode.insertAdjacentHTML(position, html)
}
// limpa mensagens de alerta
function cleanAlerts() {
let alerts = fragmentElement.querySelectorAll('.alert')
alerts.forEach(alert => alert.remove())
}
// imprime icone SGV
function renderIcon(icon, spritemap, cssClasses) {
return `
<svg class="lexicon-icon lexicon-icon-${icon} ${cssClasses}" focusable="false" role="presentation">
<use href="${spritemap}#${icon}"></use>
</svg>
`
}
// retorna/cria um elemento html de uma classe css
// ascendantNode é um nó ascendente
// position é uma string 'beforeend', 'afterbegin' +
// elementType uma string 'ul', 'div' etc
// cssClass é uma classe css
function getNodeElement(ascendantNode, position, elementType, cssClass) {
let nodeElement
if (ascendantNode.querySelector(cssClass)) {
nodeElement = ascendantNode.querySelector(cssClass)
} else {
nodeElement = document.createElement(elementType)
nodeElement = ascendantNode.insertAdjacentElement(position, nodeElement)
nodeElement.classList.add(cssClass.slice(1))
}
return nodeElement
}
// retorna nome amigável do campo usado como 1ª ordenação
function getOrderByFieldName(orderByColumn) {
let regExp = /^ddm__keyword__\d+__(.+)/
let matchExp = regExp.exec(orderByColumn)
return (matchExp) ? matchExp[1] : Liferay.Language.get(orderByColumn)
};}());</script>
<div id="fragment-2316268-cixx" >
<script id="data_cixx" type="application/json">{"title":"Acordos Coletivos de Trabalho - Contraf","type":0,"typeSettings":{"anyClassTypeDLFileEntryAssetRendererFactory":"47046","orderByColumn1":"ddm__keyword__47047__DataReferência"}}</script>
<h3 class="mb-0 pb-3 text-primary text-left text-break fragment-heading-text-colored">
<div>Contraf</div>
</h3>
<span class="loading-animation"></span>
<div class="documents-list"></div>
</div><script>(function() {var fragmentElement = document.querySelector('#fragment-2316268-cixx'); var configuration = {"contentSetId":"2705609","showDateConversions":false,"showModifiedDate":true,"showRefDate":false,"textAlign":"left","pageSize":"50","showYear":false,"groupBy":"noGroup","textColor":{"cssClass":"primary","rgbValue":"rgb(122, 18, 44)"},"useTitle":true,"usePagination":false,"bottomSpacing":"3","labelForYear":"Ocorrido em","useContentSetTitle":false,"labelForRefDate":"Referente a","headingLevel":"h3","showCreateDate":true,"activeDebug":false};const editMode = document.body.classList.contains('has-edit-mode-menu')
const apiURL = `${Liferay.ThemeDisplay.getPortalURL()}/o/headless-delivery`
const contentSetsEndPoint = `/v1.0/content-sets/${configuration.contentSetId}/content-set-elements`
const restrictFields = 'title,content.contentUrl,content.dateCreated,content.dateModified,content.documentType,content.fileExtension,content.sizeInBytes'
const params = { fields: restrictFields, 'pageSize': configuration.pageSize, 'page': 1 }
const pathThemeImages = Liferay.ThemeDisplay.getPathThemeImages()
const spritemapBNB = `${pathThemeImages}/bnb/icons.svg`
const spritemapClay = `${pathThemeImages}/clay/icons.svg`
const scriptAssetListJson = fragmentElement.querySelector(`script#data_${fragmentElement.id.slice(-4)}`)
const assetListObject = (scriptAssetListJson) ? JSON.parse(scriptAssetListJson.text) : null
const documentsList = fragmentElement.querySelector('.documents-list')
const loadingAnimation = fragmentElement.querySelector('.loading-animation')
const orderByYearAttrs = ['modifiedDate', 'createDate', 'publishDate', 'ddm__keyword__47047__DataReferência', 'ddm__keyword__47054__Ano']
const orderByMonthYearAttrs = ['modifiedDate', 'createDate', 'publishDate', 'ddm__keyword__47047__DataReferência']
const orderByDayAttrs = ['modifiedDate', 'createDate', 'publishDate', 'ddm__keyword__47047__DataReferência']
const fileEntryTypes = { 'docOrdin': 47046, 'docAnual': 47053 }
const validity = (assetListObject) ? validateConfiguration() : null
validity && init()
// funcao de inicialização
function init() {
fragmentElement.classList.add('mb-4')
editMode && reportConstraints()
fetchDocumentsPage()
}
// constrói um objeto para verificar status de validade de algumas configurações
function validateConfiguration() {
let orderByColumn = assetListObject.typeSettings.orderByColumn1
let orderByColumnName = getOrderByFieldName(orderByColumn)
let canGroupByYear = orderByYearAttrs.includes(orderByColumn)
let canGroupByMonthYear = orderByMonthYearAttrs.includes(orderByColumn)
let canGroupByDay = orderByDayAttrs.includes(orderByColumn)
let canShowRefDate = (assetListObject.typeSettings.anyClassTypeDLFileEntryAssetRendererFactory == fileEntryTypes.docOrdin)
let canShowYear = (assetListObject.typeSettings.anyClassTypeDLFileEntryAssetRendererFactory == fileEntryTypes.docAnual)
let validityState = {
'canGroupByYear': {
'state': canGroupByYear,
'msg' : canGroupByYear ? '' : `A coleção não pode ser agrupada por ano, pois está ordenada por ${orderByColumnName}.`
},
'canGroupByMonthYear': {
'state': canGroupByMonthYear,
'msg' : canGroupByMonthYear ? '' : `A coleção não pode ser agrupada por mês e ano, pois está ordenada por ${orderByColumnName}.`
},
'canGroupByDay': {
'state': canGroupByDay,
'msg' : canGroupByDay ? '' : `A coleção não pode ser agrupada por dia, pois está ordenada por ${orderByColumnName}.`
},
'canShowRefDate': {
'state': canShowRefDate,
'msg' : canShowRefDate ? '' : 'Não é possível mostrar o campo Data de Referência. Esse metadado existe apenas em coleções de Documentos Ordinários.'
},
'canShowYear': {
'state': canShowYear,
'msg' : canShowYear ? '' : 'Não é possível mostrar o campo Ano. Esse metadado existe apenas em coleções de Documentos Anuais.'
}
}
return validityState
}
// alerta sobre restrições na configuração
function reportConstraints() {
cleanAlerts()
// alerta sobre restrições
let validationMessages = []
configuration.groupBy == 'groupByYear' && !validity.canGroupByYear.state && validationMessages.push(validity.canGroupByYear.msg)
configuration.groupBy == 'groupByMonthYear' && !validity.canGroupByMonthYear.state && validationMessages.push(validity.canGroupByMonthYear.msg)
configuration.groupBy == 'groupByDay' && !validity.canGroupByDay.state && validationMessages.push(validity.canGroupByDay.msg)
configuration.showRefDate && !validity.canShowRefDate.state && validationMessages.push(validity.canShowRefDate.msg)
configuration.showYear && !validity.canShowYear.state && validationMessages.push(validity.canShowYear.msg)
validationMessages.length > 0 && displayAlert('danger', 'Configuração inválida', validationMessages.join('<br/>'), documentsList, 'beforebegin')
// debug
if (configuration.activeDebug) {
console.clear()
console.log('Propriedades da Coleção:')
console.log(assetListObject)
console.log('Configuração do Fragmento:')
console.log(configuration)
console.log('Validade da Configuração:')
console.log(validity)
}
}
// principal funcao para pegar os dados
function fetchDocumentsPage(page) {
params.page = (page) ? page : params.page
let request = Liferay.Util.addParams(params, apiURL+contentSetsEndPoint)
fetch(
request,
{
method: 'GET',
headers: {
'Content-Type': 'application/json'
}
}
).then(response => {
if (response.ok) {
return response.json()
}
}).then(documents => {
handleDocuments(documents)
if (editMode && configuration.activeDebug) {
console.log(`Retorno da requisição (page ${params.page}):`)
console.log(documents)
}
})
}
// manipula dados retornados da coleção
function handleDocuments(documents) {
loadingAnimation && loadingAnimation.remove()
if (documents.items.length > 0) {
switch (configuration.groupBy) {
case 'noGroup':
renderDocumentsList(documents)
break
case 'groupByYear':
(validity.canGroupByYear.state) ? renderDocumentsListByGroup(documents) : renderDocumentsList(documents)
break
case 'groupByMonthYear':
(validity.canGroupByMonthYear.state) ? renderDocumentsListByGroup(documents) : renderDocumentsList(documents)
break
case 'groupByDay':
(validity.canGroupByDay.state) ? renderDocumentsListByGroup(documents) : renderDocumentsList(documents)
break
}
configuration.usePagination && renderPaginationBar(documents.page, documents.lastPage, documents.totalCount)
} else {
displayAlert('info', 'Aviso', 'Não foram encontrados documentos', documentsList, 'afterbegin')
}
}
// renderiza lista agrupada
function renderDocumentsListByGroup(documents) {
let lastListGroup = documentsList.querySelector('.list-group:last-child')
let currentGroup = (lastListGroup) ? lastListGroup.dataset.group : 0
configuration.activeDebug
&& configuration.showDateConversions
&& editMode
&& console.log(`Extração do grupo a partir do campo ${getOrderByFieldName(assetListObject.typeSettings.orderByColumn1)}:`)
documents.items.forEach(doc => {
let group = getDocumentGroup(doc)
if (currentGroup != group) {
let listGroup = document.createElement('ul')
listGroup.classList.add('list-group')
listGroup.dataset.group = group
listGroup.setAttribute('aria-label', `${assetListObject.title} de ${group}`)
lastListGroup = documentsList.insertAdjacentElement('beforeend', listGroup)
lastListGroup.insertAdjacentHTML('afterbegin', renderListGroupHeader(group))
currentGroup = group
}
lastListGroup.insertAdjacentHTML('beforeend', renderListGroupItem(doc))
})
}
// extrai e retorna o dado (string) utilizado como agrupador (dia, mês ou ano) a partir do campo utilizado como primeira ordenação da coleção
function getDocumentGroup(document) {
let fieldData
let group
let dateField
let options
let test
let orderByColumn = assetListObject.typeSettings.orderByColumn1
switch (orderByColumn) {
case 'ddm__keyword__47047__DataReferência':
fieldData = document.content.documentType.contentFields[0].contentFieldValue.data
break
case 'ddm__keyword__47054__Ano':
fieldData = document.content.documentType.contentFields[0].contentFieldValue.data
break
case 'modifiedDate':
fieldData = document.content.dateModified
break
case 'createDate':
fieldData = document.content.dateCreated
break
case 'publishDate': // verificar esse caso por que não há uma campo data de publicação em coleções de documentos
fieldData = document.content.dateCreated
break
}
dateField = new Date(fieldData)
switch (configuration.groupBy) {
case 'groupByYear':
test = (orderByColumn == 'ddm__keyword__47047__DataReferência' || orderByColumn == 'ddm__keyword__47054__Ano')
group = test ? dateField.getUTCFullYear() : dateField.getFullYear()
break
case 'groupByMonthYear':
test = (orderByColumn == 'ddm__keyword__47047__DataReferência')
options = test ? {month:'long', year:'numeric', timeZone: 'UTC'} : { month:'long', year:'numeric' }
group = dateField.toLocaleDateString('pt-BR', options)
group = group.charAt(0).toUpperCase() + group.slice(1)
break
case 'groupByDay':
test = (orderByColumn == 'ddm__keyword__47047__DataReferência')
options = test ? {timeZone: 'UTC'} : {}
group = dateField.toLocaleDateString('pt-BR', options)
break
}
configuration.activeDebug && configuration.showDateConversions && editMode && console.log(`${fieldData} --> ${group}`)
return group
}
// renderiza lista comum
function renderDocumentsList(documents) {
let listGroup = getNodeElement(documentsList, 'afterbegin', 'ul', '.list-group')
listGroup.setAttribute('aria-label', assetListObject.title)
documents.items.forEach(doc => {
listGroup.insertAdjacentHTML('beforeend', renderListGroupItem(doc))
})
}
// renderiza cabeçalho da lista
function renderListGroupHeader(title) {
let listHeaderHTML = `
<li class="list-group-header">
<span class="list-group-header-title"><big>${title}</big></span>
</li>
`
return listHeaderHTML
}
// renderiza um item da lista
function renderListGroupItem(document) {
let dateCreated = (configuration.showCreateDate) ? new Date(document.content.dateCreated) : null
let dateCreatedHTML = (dateCreated) ? `
<div class="d-flex flex-row flex-lg-column text-lg-right ml-lg-3 mr-md-2 mr-lg-0">
<span class="small font-weight-bold text-nowrap mr-1 mr-lg-0">Publicado em</span>
<span class="small">${dateCreated.toLocaleDateString('pt-BR')}</span>
</div>` : ''
let dateModified = (configuration.showModifiedDate) ? new Date(document.content.dateModified) : null
let dateModifiedHTML = (dateModified) ? `
<div class="d-flex flex-row flex-lg-column text-lg-right ml-lg-3 mr-md-2 mr-lg-0">
<span class="small font-weight-bold text-nowrap mr-1 mr-lg-0">Atualizado em</span>
<span class="small">${dateModified.toLocaleDateString('pt-BR')}</span>
</div>` : ''
let refDate = (configuration.showRefDate && validity.canShowRefDate.state) ? new Date(document.content.documentType.contentFields[0].contentFieldValue.data) : null
let refDateHTML = (refDate) ? `
<div class="d-flex flex-row flex-lg-column text-lg-right ml-lg-3 mr-md-2 mr-lg-0">
<span class="small font-weight-bold text-nowrap mr-1 mr-lg-0">${configuration.labelForRefDate}</span>
<span class="small">${refDate.toLocaleDateString('pt-BR', {timeZone: 'UTC'})}</span>
</div>` : ''
let year = (configuration.showYear && validity.canShowYear.state) ? document.content.documentType.contentFields[0].contentFieldValue.data : null
let yearHTML = (year) ? `
<div class="d-flex flex-row flex-lg-column text-lg-right ml-lg-3 mr-md-2 mr-lg-0">
<span class="small font-weight-bold text-nowrap mr-1 mr-lg-0">${configuration.labelForYear}</span>
<span class="small">${year}</span>
</div>` : ''
let hasMetadatas = (year || refDate || dateCreated || dateModified)
let metadataHTML = (hasMetadatas) ? `
<div class="d-flex flex-column flex-md-row">
${yearHTML}
${refDateHTML}
${dateCreatedHTML}
${dateModifiedHTML}
</div>` : ''
let listItemHTML = `
<li class="list-group-item list-group-item-flex align-items-center">
<div class="autofit-col">
<svg class="lexicon-icon text-tertiary lexicon-icon-lg" focusable="false" role="presentation"
viewBox="0 0 512 512">
<use xlink:href="${spritemapBNB}#arquivo-${document.content.fileExtension}" />
</svg>
</div>
<div class="autofit-col autofit-col-expand">
<div class="d-flex flex-column flex-lg-row justify-content-start justify-content-lg-between">
<div class="d-flex flex-column">
<span class="list-group-title">
<a href="${document.content.contentUrl}">${document.title}</a>
</span>
<span class="list-group-subtitle text-uppercase small">
${document.content.fileExtension}, ${Liferay.Util.formatStorage(document.content.sizeInBytes, {addSpaceBeforeSuffix: true})}
</span>
</div>
${metadataHTML}
</div>
</div>
</li>
`
return listItemHTML
}
// renderiza paginação
function renderPaginationBar(page, lastPage, totalCount) {
let paginationBar = getNodeElement(fragmentElement, 'beforeend', 'div', '.pagination-bar')
let lastIndex = (page === lastPage) ? totalCount : configuration.pageSize*page
let nDocuments = (page+1 === lastPage) ? totalCount - configuration.pageSize*page : configuration.pageSize
paginationBar.classList.add('justify-content-center', 'justify-content-lg-between')
let textColor = (configuration.textColor.cssClass) ? `text-${configuration.textColor.cssClass}` : ''
paginationBar.innerHTML = `
<div class="pagination-results mr-0 ${textColor}">Exibindo 1 a ${lastIndex} de ${totalCount} documentos.</div>
<ul class="pagination">
<li class="page-item">
<button class="btn btn-unstyled page-link" type="button">
Exibir mais ${nDocuments} documentos
${renderIcon('angle-down', spritemapClay, 'ml-2')}
</button>
</li>
</ul>
`
let showMoreButton = paginationBar.querySelector('button.page-link')
if (page !== lastPage) {
showMoreButton.addEventListener('click', e => {
showMoreButton.querySelector('svg').remove()
let loadAnimation = getNodeElement(showMoreButton, 'beforeend', 'span', '.loading-animation')
loadAnimation.classList.add('loading-animation-sm', 'ml-2')
fetchDocumentsPage(page+1)
})
} else {
showMoreButton.remove()
}
}
// imprime um mensagem de alerta
function displayAlert(style, title, msg, parentNode, position) {
let styleIcons = {
'danger': 'exclamation-full',
'success': 'check-circle-full',
'info': 'info-circle',
'warning': 'warning-full'
}
let html = `
<div class="alert p-4 alert-${style}" role="alert">
<span class="alert-indicator">
${renderIcon(styleIcons[style], spritemapClay, '')}
</span>
<strong>${title}:</strong>
<p class="mt-2 mb-0">${msg}</p>
</div>
`
parentNode.insertAdjacentHTML(position, html)
}
// limpa mensagens de alerta
function cleanAlerts() {
let alerts = fragmentElement.querySelectorAll('.alert')
alerts.forEach(alert => alert.remove())
}
// imprime icone SGV
function renderIcon(icon, spritemap, cssClasses) {
return `
<svg class="lexicon-icon lexicon-icon-${icon} ${cssClasses}" focusable="false" role="presentation">
<use href="${spritemap}#${icon}"></use>
</svg>
`
}
// retorna/cria um elemento html de uma classe css
// ascendantNode é um nó ascendente
// position é uma string 'beforeend', 'afterbegin' +
// elementType uma string 'ul', 'div' etc
// cssClass é uma classe css
function getNodeElement(ascendantNode, position, elementType, cssClass) {
let nodeElement
if (ascendantNode.querySelector(cssClass)) {
nodeElement = ascendantNode.querySelector(cssClass)
} else {
nodeElement = document.createElement(elementType)
nodeElement = ascendantNode.insertAdjacentElement(position, nodeElement)
nodeElement.classList.add(cssClass.slice(1))
}
return nodeElement
}
// retorna nome amigável do campo usado como 1ª ordenação
function getOrderByFieldName(orderByColumn) {
let regExp = /^ddm__keyword__\d+__(.+)/
let matchExp = regExp.exec(orderByColumn)
return (matchExp) ? matchExp[1] : Liferay.Language.get(orderByColumn)
};}());</script>
</div>
</div>
</div>
</section>]]>
|
3779
| <![CDATA[<section class="bg-quaternary" style="">
<div class="container px-3 py-5">
<div class="row ">
<div class="col-md-12">
<div id="fragment-0-aymq" > <h2 class="component-heading mb-0 pb-3 text-primary text-left text-break fragment-heading-text-colored">
<span>Convenções Coletivas de Trabalho</span>
</h2></div><script>(function() {var fragmentElement = document.querySelector('#fragment-0-aymq'); var configuration = {"textAlign":"left","bottomSpacing":"3","headingLevel":"h2","textColor":{"cssClass":"primary","rgbValue":"rgb(122, 18, 44)"}};/**
* Copyright (c) 2000-present Liferay, Inc. All rights reserved.
*
* This library is free software; you can redistribute it and/or modify it under
* the terms of the GNU Lesser General Public License as published by the Free
* Software Foundation; either version 2.1 of the License, or (at your option)
* any later version.
*
* This library is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
* details.
*/;}());</script>
<div id="fragment-2316268-rpdw" >
<script id="data_rpdw" type="application/json">{"title":"Convenções Coletivas de Trabalho - Contec","type":0,"typeSettings":{"anyClassTypeDLFileEntryAssetRendererFactory":"47046","orderByColumn1":"ddm__keyword__47047__DataReferência"}}</script>
<h3 class="mb-0 pb-3 text-primary text-left text-break fragment-heading-text-colored">
<div>Contec</div>
</h3>
<span class="loading-animation"></span>
<div class="documents-list"></div>
</div><script>(function() {var fragmentElement = document.querySelector('#fragment-2316268-rpdw'); var configuration = {"contentSetId":"2705611","showDateConversions":false,"showModifiedDate":true,"showRefDate":false,"textAlign":"left","pageSize":"50","showYear":false,"groupBy":"noGroup","textColor":{"cssClass":"primary","rgbValue":"rgb(122, 18, 44)"},"useTitle":true,"usePagination":false,"bottomSpacing":"3","labelForYear":"Ocorrido em","useContentSetTitle":false,"labelForRefDate":"Referente a","headingLevel":"h3","showCreateDate":true,"activeDebug":false};const editMode = document.body.classList.contains('has-edit-mode-menu')
const apiURL = `${Liferay.ThemeDisplay.getPortalURL()}/o/headless-delivery`
const contentSetsEndPoint = `/v1.0/content-sets/${configuration.contentSetId}/content-set-elements`
const restrictFields = 'title,content.contentUrl,content.dateCreated,content.dateModified,content.documentType,content.fileExtension,content.sizeInBytes'
const params = { fields: restrictFields, 'pageSize': configuration.pageSize, 'page': 1 }
const pathThemeImages = Liferay.ThemeDisplay.getPathThemeImages()
const spritemapBNB = `${pathThemeImages}/bnb/icons.svg`
const spritemapClay = `${pathThemeImages}/clay/icons.svg`
const scriptAssetListJson = fragmentElement.querySelector(`script#data_${fragmentElement.id.slice(-4)}`)
const assetListObject = (scriptAssetListJson) ? JSON.parse(scriptAssetListJson.text) : null
const documentsList = fragmentElement.querySelector('.documents-list')
const loadingAnimation = fragmentElement.querySelector('.loading-animation')
const orderByYearAttrs = ['modifiedDate', 'createDate', 'publishDate', 'ddm__keyword__47047__DataReferência', 'ddm__keyword__47054__Ano']
const orderByMonthYearAttrs = ['modifiedDate', 'createDate', 'publishDate', 'ddm__keyword__47047__DataReferência']
const orderByDayAttrs = ['modifiedDate', 'createDate', 'publishDate', 'ddm__keyword__47047__DataReferência']
const fileEntryTypes = { 'docOrdin': 47046, 'docAnual': 47053 }
const validity = (assetListObject) ? validateConfiguration() : null
validity && init()
// funcao de inicialização
function init() {
fragmentElement.classList.add('mb-4')
editMode && reportConstraints()
fetchDocumentsPage()
}
// constrói um objeto para verificar status de validade de algumas configurações
function validateConfiguration() {
let orderByColumn = assetListObject.typeSettings.orderByColumn1
let orderByColumnName = getOrderByFieldName(orderByColumn)
let canGroupByYear = orderByYearAttrs.includes(orderByColumn)
let canGroupByMonthYear = orderByMonthYearAttrs.includes(orderByColumn)
let canGroupByDay = orderByDayAttrs.includes(orderByColumn)
let canShowRefDate = (assetListObject.typeSettings.anyClassTypeDLFileEntryAssetRendererFactory == fileEntryTypes.docOrdin)
let canShowYear = (assetListObject.typeSettings.anyClassTypeDLFileEntryAssetRendererFactory == fileEntryTypes.docAnual)
let validityState = {
'canGroupByYear': {
'state': canGroupByYear,
'msg' : canGroupByYear ? '' : `A coleção não pode ser agrupada por ano, pois está ordenada por ${orderByColumnName}.`
},
'canGroupByMonthYear': {
'state': canGroupByMonthYear,
'msg' : canGroupByMonthYear ? '' : `A coleção não pode ser agrupada por mês e ano, pois está ordenada por ${orderByColumnName}.`
},
'canGroupByDay': {
'state': canGroupByDay,
'msg' : canGroupByDay ? '' : `A coleção não pode ser agrupada por dia, pois está ordenada por ${orderByColumnName}.`
},
'canShowRefDate': {
'state': canShowRefDate,
'msg' : canShowRefDate ? '' : 'Não é possível mostrar o campo Data de Referência. Esse metadado existe apenas em coleções de Documentos Ordinários.'
},
'canShowYear': {
'state': canShowYear,
'msg' : canShowYear ? '' : 'Não é possível mostrar o campo Ano. Esse metadado existe apenas em coleções de Documentos Anuais.'
}
}
return validityState
}
// alerta sobre restrições na configuração
function reportConstraints() {
cleanAlerts()
// alerta sobre restrições
let validationMessages = []
configuration.groupBy == 'groupByYear' && !validity.canGroupByYear.state && validationMessages.push(validity.canGroupByYear.msg)
configuration.groupBy == 'groupByMonthYear' && !validity.canGroupByMonthYear.state && validationMessages.push(validity.canGroupByMonthYear.msg)
configuration.groupBy == 'groupByDay' && !validity.canGroupByDay.state && validationMessages.push(validity.canGroupByDay.msg)
configuration.showRefDate && !validity.canShowRefDate.state && validationMessages.push(validity.canShowRefDate.msg)
configuration.showYear && !validity.canShowYear.state && validationMessages.push(validity.canShowYear.msg)
validationMessages.length > 0 && displayAlert('danger', 'Configuração inválida', validationMessages.join('<br/>'), documentsList, 'beforebegin')
// debug
if (configuration.activeDebug) {
console.clear()
console.log('Propriedades da Coleção:')
console.log(assetListObject)
console.log('Configuração do Fragmento:')
console.log(configuration)
console.log('Validade da Configuração:')
console.log(validity)
}
}
// principal funcao para pegar os dados
function fetchDocumentsPage(page) {
params.page = (page) ? page : params.page
let request = Liferay.Util.addParams(params, apiURL+contentSetsEndPoint)
fetch(
request,
{
method: 'GET',
headers: {
'Content-Type': 'application/json'
}
}
).then(response => {
if (response.ok) {
return response.json()
}
}).then(documents => {
handleDocuments(documents)
if (editMode && configuration.activeDebug) {
console.log(`Retorno da requisição (page ${params.page}):`)
console.log(documents)
}
})
}
// manipula dados retornados da coleção
function handleDocuments(documents) {
loadingAnimation && loadingAnimation.remove()
if (documents.items.length > 0) {
switch (configuration.groupBy) {
case 'noGroup':
renderDocumentsList(documents)
break
case 'groupByYear':
(validity.canGroupByYear.state) ? renderDocumentsListByGroup(documents) : renderDocumentsList(documents)
break
case 'groupByMonthYear':
(validity.canGroupByMonthYear.state) ? renderDocumentsListByGroup(documents) : renderDocumentsList(documents)
break
case 'groupByDay':
(validity.canGroupByDay.state) ? renderDocumentsListByGroup(documents) : renderDocumentsList(documents)
break
}
configuration.usePagination && renderPaginationBar(documents.page, documents.lastPage, documents.totalCount)
} else {
displayAlert('info', 'Aviso', 'Não foram encontrados documentos', documentsList, 'afterbegin')
}
}
// renderiza lista agrupada
function renderDocumentsListByGroup(documents) {
let lastListGroup = documentsList.querySelector('.list-group:last-child')
let currentGroup = (lastListGroup) ? lastListGroup.dataset.group : 0
configuration.activeDebug
&& configuration.showDateConversions
&& editMode
&& console.log(`Extração do grupo a partir do campo ${getOrderByFieldName(assetListObject.typeSettings.orderByColumn1)}:`)
documents.items.forEach(doc => {
let group = getDocumentGroup(doc)
if (currentGroup != group) {
let listGroup = document.createElement('ul')
listGroup.classList.add('list-group')
listGroup.dataset.group = group
listGroup.setAttribute('aria-label', `${assetListObject.title} de ${group}`)
lastListGroup = documentsList.insertAdjacentElement('beforeend', listGroup)
lastListGroup.insertAdjacentHTML('afterbegin', renderListGroupHeader(group))
currentGroup = group
}
lastListGroup.insertAdjacentHTML('beforeend', renderListGroupItem(doc))
})
}
// extrai e retorna o dado (string) utilizado como agrupador (dia, mês ou ano) a partir do campo utilizado como primeira ordenação da coleção
function getDocumentGroup(document) {
let fieldData
let group
let dateField
let options
let test
let orderByColumn = assetListObject.typeSettings.orderByColumn1
switch (orderByColumn) {
case 'ddm__keyword__47047__DataReferência':
fieldData = document.content.documentType.contentFields[0].contentFieldValue.data
break
case 'ddm__keyword__47054__Ano':
fieldData = document.content.documentType.contentFields[0].contentFieldValue.data
break
case 'modifiedDate':
fieldData = document.content.dateModified
break
case 'createDate':
fieldData = document.content.dateCreated
break
case 'publishDate': // verificar esse caso por que não há uma campo data de publicação em coleções de documentos
fieldData = document.content.dateCreated
break
}
dateField = new Date(fieldData)
switch (configuration.groupBy) {
case 'groupByYear':
test = (orderByColumn == 'ddm__keyword__47047__DataReferência' || orderByColumn == 'ddm__keyword__47054__Ano')
group = test ? dateField.getUTCFullYear() : dateField.getFullYear()
break
case 'groupByMonthYear':
test = (orderByColumn == 'ddm__keyword__47047__DataReferência')
options = test ? {month:'long', year:'numeric', timeZone: 'UTC'} : { month:'long', year:'numeric' }
group = dateField.toLocaleDateString('pt-BR', options)
group = group.charAt(0).toUpperCase() + group.slice(1)
break
case 'groupByDay':
test = (orderByColumn == 'ddm__keyword__47047__DataReferência')
options = test ? {timeZone: 'UTC'} : {}
group = dateField.toLocaleDateString('pt-BR', options)
break
}
configuration.activeDebug && configuration.showDateConversions && editMode && console.log(`${fieldData} --> ${group}`)
return group
}
// renderiza lista comum
function renderDocumentsList(documents) {
let listGroup = getNodeElement(documentsList, 'afterbegin', 'ul', '.list-group')
listGroup.setAttribute('aria-label', assetListObject.title)
documents.items.forEach(doc => {
listGroup.insertAdjacentHTML('beforeend', renderListGroupItem(doc))
})
}
// renderiza cabeçalho da lista
function renderListGroupHeader(title) {
let listHeaderHTML = `
<li class="list-group-header">
<span class="list-group-header-title"><big>${title}</big></span>
</li>
`
return listHeaderHTML
}
// renderiza um item da lista
function renderListGroupItem(document) {
let dateCreated = (configuration.showCreateDate) ? new Date(document.content.dateCreated) : null
let dateCreatedHTML = (dateCreated) ? `
<div class="d-flex flex-row flex-lg-column text-lg-right ml-lg-3 mr-md-2 mr-lg-0">
<span class="small font-weight-bold text-nowrap mr-1 mr-lg-0">Publicado em</span>
<span class="small">${dateCreated.toLocaleDateString('pt-BR')}</span>
</div>` : ''
let dateModified = (configuration.showModifiedDate) ? new Date(document.content.dateModified) : null
let dateModifiedHTML = (dateModified) ? `
<div class="d-flex flex-row flex-lg-column text-lg-right ml-lg-3 mr-md-2 mr-lg-0">
<span class="small font-weight-bold text-nowrap mr-1 mr-lg-0">Atualizado em</span>
<span class="small">${dateModified.toLocaleDateString('pt-BR')}</span>
</div>` : ''
let refDate = (configuration.showRefDate && validity.canShowRefDate.state) ? new Date(document.content.documentType.contentFields[0].contentFieldValue.data) : null
let refDateHTML = (refDate) ? `
<div class="d-flex flex-row flex-lg-column text-lg-right ml-lg-3 mr-md-2 mr-lg-0">
<span class="small font-weight-bold text-nowrap mr-1 mr-lg-0">${configuration.labelForRefDate}</span>
<span class="small">${refDate.toLocaleDateString('pt-BR', {timeZone: 'UTC'})}</span>
</div>` : ''
let year = (configuration.showYear && validity.canShowYear.state) ? document.content.documentType.contentFields[0].contentFieldValue.data : null
let yearHTML = (year) ? `
<div class="d-flex flex-row flex-lg-column text-lg-right ml-lg-3 mr-md-2 mr-lg-0">
<span class="small font-weight-bold text-nowrap mr-1 mr-lg-0">${configuration.labelForYear}</span>
<span class="small">${year}</span>
</div>` : ''
let hasMetadatas = (year || refDate || dateCreated || dateModified)
let metadataHTML = (hasMetadatas) ? `
<div class="d-flex flex-column flex-md-row">
${yearHTML}
${refDateHTML}
${dateCreatedHTML}
${dateModifiedHTML}
</div>` : ''
let listItemHTML = `
<li class="list-group-item list-group-item-flex align-items-center">
<div class="autofit-col">
<svg class="lexicon-icon text-tertiary lexicon-icon-lg" focusable="false" role="presentation"
viewBox="0 0 512 512">
<use xlink:href="${spritemapBNB}#arquivo-${document.content.fileExtension}" />
</svg>
</div>
<div class="autofit-col autofit-col-expand">
<div class="d-flex flex-column flex-lg-row justify-content-start justify-content-lg-between">
<div class="d-flex flex-column">
<span class="list-group-title">
<a href="${document.content.contentUrl}">${document.title}</a>
</span>
<span class="list-group-subtitle text-uppercase small">
${document.content.fileExtension}, ${Liferay.Util.formatStorage(document.content.sizeInBytes, {addSpaceBeforeSuffix: true})}
</span>
</div>
${metadataHTML}
</div>
</div>
</li>
`
return listItemHTML
}
// renderiza paginação
function renderPaginationBar(page, lastPage, totalCount) {
let paginationBar = getNodeElement(fragmentElement, 'beforeend', 'div', '.pagination-bar')
let lastIndex = (page === lastPage) ? totalCount : configuration.pageSize*page
let nDocuments = (page+1 === lastPage) ? totalCount - configuration.pageSize*page : configuration.pageSize
paginationBar.classList.add('justify-content-center', 'justify-content-lg-between')
let textColor = (configuration.textColor.cssClass) ? `text-${configuration.textColor.cssClass}` : ''
paginationBar.innerHTML = `
<div class="pagination-results mr-0 ${textColor}">Exibindo 1 a ${lastIndex} de ${totalCount} documentos.</div>
<ul class="pagination">
<li class="page-item">
<button class="btn btn-unstyled page-link" type="button">
Exibir mais ${nDocuments} documentos
${renderIcon('angle-down', spritemapClay, 'ml-2')}
</button>
</li>
</ul>
`
let showMoreButton = paginationBar.querySelector('button.page-link')
if (page !== lastPage) {
showMoreButton.addEventListener('click', e => {
showMoreButton.querySelector('svg').remove()
let loadAnimation = getNodeElement(showMoreButton, 'beforeend', 'span', '.loading-animation')
loadAnimation.classList.add('loading-animation-sm', 'ml-2')
fetchDocumentsPage(page+1)
})
} else {
showMoreButton.remove()
}
}
// imprime um mensagem de alerta
function displayAlert(style, title, msg, parentNode, position) {
let styleIcons = {
'danger': 'exclamation-full',
'success': 'check-circle-full',
'info': 'info-circle',
'warning': 'warning-full'
}
let html = `
<div class="alert p-4 alert-${style}" role="alert">
<span class="alert-indicator">
${renderIcon(styleIcons[style], spritemapClay, '')}
</span>
<strong>${title}:</strong>
<p class="mt-2 mb-0">${msg}</p>
</div>
`
parentNode.insertAdjacentHTML(position, html)
}
// limpa mensagens de alerta
function cleanAlerts() {
let alerts = fragmentElement.querySelectorAll('.alert')
alerts.forEach(alert => alert.remove())
}
// imprime icone SGV
function renderIcon(icon, spritemap, cssClasses) {
return `
<svg class="lexicon-icon lexicon-icon-${icon} ${cssClasses}" focusable="false" role="presentation">
<use href="${spritemap}#${icon}"></use>
</svg>
`
}
// retorna/cria um elemento html de uma classe css
// ascendantNode é um nó ascendente
// position é uma string 'beforeend', 'afterbegin' +
// elementType uma string 'ul', 'div' etc
// cssClass é uma classe css
function getNodeElement(ascendantNode, position, elementType, cssClass) {
let nodeElement
if (ascendantNode.querySelector(cssClass)) {
nodeElement = ascendantNode.querySelector(cssClass)
} else {
nodeElement = document.createElement(elementType)
nodeElement = ascendantNode.insertAdjacentElement(position, nodeElement)
nodeElement.classList.add(cssClass.slice(1))
}
return nodeElement
}
// retorna nome amigável do campo usado como 1ª ordenação
function getOrderByFieldName(orderByColumn) {
let regExp = /^ddm__keyword__\d+__(.+)/
let matchExp = regExp.exec(orderByColumn)
return (matchExp) ? matchExp[1] : Liferay.Language.get(orderByColumn)
};}());</script>
<div id="fragment-2316268-cjar" >
<script id="data_cjar" type="application/json">{"title":"Convenções Coletivas de Trabalho - Contraf","type":0,"typeSettings":{"anyClassTypeDLFileEntryAssetRendererFactory":"47046","orderByColumn1":"ddm__keyword__47047__DataReferência"}}</script>
<h3 class="mb-0 pb-3 text-primary text-left text-break fragment-heading-text-colored">
<div>Contraf</div>
</h3>
<span class="loading-animation"></span>
<div class="documents-list"></div>
</div><script>(function() {var fragmentElement = document.querySelector('#fragment-2316268-cjar'); var configuration = {"contentSetId":"2705613","showDateConversions":false,"showModifiedDate":true,"showRefDate":false,"textAlign":"left","pageSize":"50","showYear":false,"groupBy":"noGroup","textColor":{"cssClass":"primary","rgbValue":"rgb(122, 18, 44)"},"useTitle":true,"usePagination":false,"bottomSpacing":"3","labelForYear":"Ocorrido em","useContentSetTitle":false,"labelForRefDate":"Referente a","headingLevel":"h3","showCreateDate":true,"activeDebug":false};const editMode = document.body.classList.contains('has-edit-mode-menu')
const apiURL = `${Liferay.ThemeDisplay.getPortalURL()}/o/headless-delivery`
const contentSetsEndPoint = `/v1.0/content-sets/${configuration.contentSetId}/content-set-elements`
const restrictFields = 'title,content.contentUrl,content.dateCreated,content.dateModified,content.documentType,content.fileExtension,content.sizeInBytes'
const params = { fields: restrictFields, 'pageSize': configuration.pageSize, 'page': 1 }
const pathThemeImages = Liferay.ThemeDisplay.getPathThemeImages()
const spritemapBNB = `${pathThemeImages}/bnb/icons.svg`
const spritemapClay = `${pathThemeImages}/clay/icons.svg`
const scriptAssetListJson = fragmentElement.querySelector(`script#data_${fragmentElement.id.slice(-4)}`)
const assetListObject = (scriptAssetListJson) ? JSON.parse(scriptAssetListJson.text) : null
const documentsList = fragmentElement.querySelector('.documents-list')
const loadingAnimation = fragmentElement.querySelector('.loading-animation')
const orderByYearAttrs = ['modifiedDate', 'createDate', 'publishDate', 'ddm__keyword__47047__DataReferência', 'ddm__keyword__47054__Ano']
const orderByMonthYearAttrs = ['modifiedDate', 'createDate', 'publishDate', 'ddm__keyword__47047__DataReferência']
const orderByDayAttrs = ['modifiedDate', 'createDate', 'publishDate', 'ddm__keyword__47047__DataReferência']
const fileEntryTypes = { 'docOrdin': 47046, 'docAnual': 47053 }
const validity = (assetListObject) ? validateConfiguration() : null
validity && init()
// funcao de inicialização
function init() {
fragmentElement.classList.add('mb-4')
editMode && reportConstraints()
fetchDocumentsPage()
}
// constrói um objeto para verificar status de validade de algumas configurações
function validateConfiguration() {
let orderByColumn = assetListObject.typeSettings.orderByColumn1
let orderByColumnName = getOrderByFieldName(orderByColumn)
let canGroupByYear = orderByYearAttrs.includes(orderByColumn)
let canGroupByMonthYear = orderByMonthYearAttrs.includes(orderByColumn)
let canGroupByDay = orderByDayAttrs.includes(orderByColumn)
let canShowRefDate = (assetListObject.typeSettings.anyClassTypeDLFileEntryAssetRendererFactory == fileEntryTypes.docOrdin)
let canShowYear = (assetListObject.typeSettings.anyClassTypeDLFileEntryAssetRendererFactory == fileEntryTypes.docAnual)
let validityState = {
'canGroupByYear': {
'state': canGroupByYear,
'msg' : canGroupByYear ? '' : `A coleção não pode ser agrupada por ano, pois está ordenada por ${orderByColumnName}.`
},
'canGroupByMonthYear': {
'state': canGroupByMonthYear,
'msg' : canGroupByMonthYear ? '' : `A coleção não pode ser agrupada por mês e ano, pois está ordenada por ${orderByColumnName}.`
},
'canGroupByDay': {
'state': canGroupByDay,
'msg' : canGroupByDay ? '' : `A coleção não pode ser agrupada por dia, pois está ordenada por ${orderByColumnName}.`
},
'canShowRefDate': {
'state': canShowRefDate,
'msg' : canShowRefDate ? '' : 'Não é possível mostrar o campo Data de Referência. Esse metadado existe apenas em coleções de Documentos Ordinários.'
},
'canShowYear': {
'state': canShowYear,
'msg' : canShowYear ? '' : 'Não é possível mostrar o campo Ano. Esse metadado existe apenas em coleções de Documentos Anuais.'
}
}
return validityState
}
// alerta sobre restrições na configuração
function reportConstraints() {
cleanAlerts()
// alerta sobre restrições
let validationMessages = []
configuration.groupBy == 'groupByYear' && !validity.canGroupByYear.state && validationMessages.push(validity.canGroupByYear.msg)
configuration.groupBy == 'groupByMonthYear' && !validity.canGroupByMonthYear.state && validationMessages.push(validity.canGroupByMonthYear.msg)
configuration.groupBy == 'groupByDay' && !validity.canGroupByDay.state && validationMessages.push(validity.canGroupByDay.msg)
configuration.showRefDate && !validity.canShowRefDate.state && validationMessages.push(validity.canShowRefDate.msg)
configuration.showYear && !validity.canShowYear.state && validationMessages.push(validity.canShowYear.msg)
validationMessages.length > 0 && displayAlert('danger', 'Configuração inválida', validationMessages.join('<br/>'), documentsList, 'beforebegin')
// debug
if (configuration.activeDebug) {
console.clear()
console.log('Propriedades da Coleção:')
console.log(assetListObject)
console.log('Configuração do Fragmento:')
console.log(configuration)
console.log('Validade da Configuração:')
console.log(validity)
}
}
// principal funcao para pegar os dados
function fetchDocumentsPage(page) {
params.page = (page) ? page : params.page
let request = Liferay.Util.addParams(params, apiURL+contentSetsEndPoint)
fetch(
request,
{
method: 'GET',
headers: {
'Content-Type': 'application/json'
}
}
).then(response => {
if (response.ok) {
return response.json()
}
}).then(documents => {
handleDocuments(documents)
if (editMode && configuration.activeDebug) {
console.log(`Retorno da requisição (page ${params.page}):`)
console.log(documents)
}
})
}
// manipula dados retornados da coleção
function handleDocuments(documents) {
loadingAnimation && loadingAnimation.remove()
if (documents.items.length > 0) {
switch (configuration.groupBy) {
case 'noGroup':
renderDocumentsList(documents)
break
case 'groupByYear':
(validity.canGroupByYear.state) ? renderDocumentsListByGroup(documents) : renderDocumentsList(documents)
break
case 'groupByMonthYear':
(validity.canGroupByMonthYear.state) ? renderDocumentsListByGroup(documents) : renderDocumentsList(documents)
break
case 'groupByDay':
(validity.canGroupByDay.state) ? renderDocumentsListByGroup(documents) : renderDocumentsList(documents)
break
}
configuration.usePagination && renderPaginationBar(documents.page, documents.lastPage, documents.totalCount)
} else {
displayAlert('info', 'Aviso', 'Não foram encontrados documentos', documentsList, 'afterbegin')
}
}
// renderiza lista agrupada
function renderDocumentsListByGroup(documents) {
let lastListGroup = documentsList.querySelector('.list-group:last-child')
let currentGroup = (lastListGroup) ? lastListGroup.dataset.group : 0
configuration.activeDebug
&& configuration.showDateConversions
&& editMode
&& console.log(`Extração do grupo a partir do campo ${getOrderByFieldName(assetListObject.typeSettings.orderByColumn1)}:`)
documents.items.forEach(doc => {
let group = getDocumentGroup(doc)
if (currentGroup != group) {
let listGroup = document.createElement('ul')
listGroup.classList.add('list-group')
listGroup.dataset.group = group
listGroup.setAttribute('aria-label', `${assetListObject.title} de ${group}`)
lastListGroup = documentsList.insertAdjacentElement('beforeend', listGroup)
lastListGroup.insertAdjacentHTML('afterbegin', renderListGroupHeader(group))
currentGroup = group
}
lastListGroup.insertAdjacentHTML('beforeend', renderListGroupItem(doc))
})
}
// extrai e retorna o dado (string) utilizado como agrupador (dia, mês ou ano) a partir do campo utilizado como primeira ordenação da coleção
function getDocumentGroup(document) {
let fieldData
let group
let dateField
let options
let test
let orderByColumn = assetListObject.typeSettings.orderByColumn1
switch (orderByColumn) {
case 'ddm__keyword__47047__DataReferência':
fieldData = document.content.documentType.contentFields[0].contentFieldValue.data
break
case 'ddm__keyword__47054__Ano':
fieldData = document.content.documentType.contentFields[0].contentFieldValue.data
break
case 'modifiedDate':
fieldData = document.content.dateModified
break
case 'createDate':
fieldData = document.content.dateCreated
break
case 'publishDate': // verificar esse caso por que não há uma campo data de publicação em coleções de documentos
fieldData = document.content.dateCreated
break
}
dateField = new Date(fieldData)
switch (configuration.groupBy) {
case 'groupByYear':
test = (orderByColumn == 'ddm__keyword__47047__DataReferência' || orderByColumn == 'ddm__keyword__47054__Ano')
group = test ? dateField.getUTCFullYear() : dateField.getFullYear()
break
case 'groupByMonthYear':
test = (orderByColumn == 'ddm__keyword__47047__DataReferência')
options = test ? {month:'long', year:'numeric', timeZone: 'UTC'} : { month:'long', year:'numeric' }
group = dateField.toLocaleDateString('pt-BR', options)
group = group.charAt(0).toUpperCase() + group.slice(1)
break
case 'groupByDay':
test = (orderByColumn == 'ddm__keyword__47047__DataReferência')
options = test ? {timeZone: 'UTC'} : {}
group = dateField.toLocaleDateString('pt-BR', options)
break
}
configuration.activeDebug && configuration.showDateConversions && editMode && console.log(`${fieldData} --> ${group}`)
return group
}
// renderiza lista comum
function renderDocumentsList(documents) {
let listGroup = getNodeElement(documentsList, 'afterbegin', 'ul', '.list-group')
listGroup.setAttribute('aria-label', assetListObject.title)
documents.items.forEach(doc => {
listGroup.insertAdjacentHTML('beforeend', renderListGroupItem(doc))
})
}
// renderiza cabeçalho da lista
function renderListGroupHeader(title) {
let listHeaderHTML = `
<li class="list-group-header">
<span class="list-group-header-title"><big>${title}</big></span>
</li>
`
return listHeaderHTML
}
// renderiza um item da lista
function renderListGroupItem(document) {
let dateCreated = (configuration.showCreateDate) ? new Date(document.content.dateCreated) : null
let dateCreatedHTML = (dateCreated) ? `
<div class="d-flex flex-row flex-lg-column text-lg-right ml-lg-3 mr-md-2 mr-lg-0">
<span class="small font-weight-bold text-nowrap mr-1 mr-lg-0">Publicado em</span>
<span class="small">${dateCreated.toLocaleDateString('pt-BR')}</span>
</div>` : ''
let dateModified = (configuration.showModifiedDate) ? new Date(document.content.dateModified) : null
let dateModifiedHTML = (dateModified) ? `
<div class="d-flex flex-row flex-lg-column text-lg-right ml-lg-3 mr-md-2 mr-lg-0">
<span class="small font-weight-bold text-nowrap mr-1 mr-lg-0">Atualizado em</span>
<span class="small">${dateModified.toLocaleDateString('pt-BR')}</span>
</div>` : ''
let refDate = (configuration.showRefDate && validity.canShowRefDate.state) ? new Date(document.content.documentType.contentFields[0].contentFieldValue.data) : null
let refDateHTML = (refDate) ? `
<div class="d-flex flex-row flex-lg-column text-lg-right ml-lg-3 mr-md-2 mr-lg-0">
<span class="small font-weight-bold text-nowrap mr-1 mr-lg-0">${configuration.labelForRefDate}</span>
<span class="small">${refDate.toLocaleDateString('pt-BR', {timeZone: 'UTC'})}</span>
</div>` : ''
let year = (configuration.showYear && validity.canShowYear.state) ? document.content.documentType.contentFields[0].contentFieldValue.data : null
let yearHTML = (year) ? `
<div class="d-flex flex-row flex-lg-column text-lg-right ml-lg-3 mr-md-2 mr-lg-0">
<span class="small font-weight-bold text-nowrap mr-1 mr-lg-0">${configuration.labelForYear}</span>
<span class="small">${year}</span>
</div>` : ''
let hasMetadatas = (year || refDate || dateCreated || dateModified)
let metadataHTML = (hasMetadatas) ? `
<div class="d-flex flex-column flex-md-row">
${yearHTML}
${refDateHTML}
${dateCreatedHTML}
${dateModifiedHTML}
</div>` : ''
let listItemHTML = `
<li class="list-group-item list-group-item-flex align-items-center">
<div class="autofit-col">
<svg class="lexicon-icon text-tertiary lexicon-icon-lg" focusable="false" role="presentation"
viewBox="0 0 512 512">
<use xlink:href="${spritemapBNB}#arquivo-${document.content.fileExtension}" />
</svg>
</div>
<div class="autofit-col autofit-col-expand">
<div class="d-flex flex-column flex-lg-row justify-content-start justify-content-lg-between">
<div class="d-flex flex-column">
<span class="list-group-title">
<a href="${document.content.contentUrl}">${document.title}</a>
</span>
<span class="list-group-subtitle text-uppercase small">
${document.content.fileExtension}, ${Liferay.Util.formatStorage(document.content.sizeInBytes, {addSpaceBeforeSuffix: true})}
</span>
</div>
${metadataHTML}
</div>
</div>
</li>
`
return listItemHTML
}
// renderiza paginação
function renderPaginationBar(page, lastPage, totalCount) {
let paginationBar = getNodeElement(fragmentElement, 'beforeend', 'div', '.pagination-bar')
let lastIndex = (page === lastPage) ? totalCount : configuration.pageSize*page
let nDocuments = (page+1 === lastPage) ? totalCount - configuration.pageSize*page : configuration.pageSize
paginationBar.classList.add('justify-content-center', 'justify-content-lg-between')
let textColor = (configuration.textColor.cssClass) ? `text-${configuration.textColor.cssClass}` : ''
paginationBar.innerHTML = `
<div class="pagination-results mr-0 ${textColor}">Exibindo 1 a ${lastIndex} de ${totalCount} documentos.</div>
<ul class="pagination">
<li class="page-item">
<button class="btn btn-unstyled page-link" type="button">
Exibir mais ${nDocuments} documentos
${renderIcon('angle-down', spritemapClay, 'ml-2')}
</button>
</li>
</ul>
`
let showMoreButton = paginationBar.querySelector('button.page-link')
if (page !== lastPage) {
showMoreButton.addEventListener('click', e => {
showMoreButton.querySelector('svg').remove()
let loadAnimation = getNodeElement(showMoreButton, 'beforeend', 'span', '.loading-animation')
loadAnimation.classList.add('loading-animation-sm', 'ml-2')
fetchDocumentsPage(page+1)
})
} else {
showMoreButton.remove()
}
}
// imprime um mensagem de alerta
function displayAlert(style, title, msg, parentNode, position) {
let styleIcons = {
'danger': 'exclamation-full',
'success': 'check-circle-full',
'info': 'info-circle',
'warning': 'warning-full'
}
let html = `
<div class="alert p-4 alert-${style}" role="alert">
<span class="alert-indicator">
${renderIcon(styleIcons[style], spritemapClay, '')}
</span>
<strong>${title}:</strong>
<p class="mt-2 mb-0">${msg}</p>
</div>
`
parentNode.insertAdjacentHTML(position, html)
}
// limpa mensagens de alerta
function cleanAlerts() {
let alerts = fragmentElement.querySelectorAll('.alert')
alerts.forEach(alert => alert.remove())
}
// imprime icone SGV
function renderIcon(icon, spritemap, cssClasses) {
return `
<svg class="lexicon-icon lexicon-icon-${icon} ${cssClasses}" focusable="false" role="presentation">
<use href="${spritemap}#${icon}"></use>
</svg>
`
}
// retorna/cria um elemento html de uma classe css
// ascendantNode é um nó ascendente
// position é uma string 'beforeend', 'afterbegin' +
// elementType uma string 'ul', 'div' etc
// cssClass é uma classe css
function getNodeElement(ascendantNode, position, elementType, cssClass) {
let nodeElement
if (ascendantNode.querySelector(cssClass)) {
nodeElement = ascendantNode.querySelector(cssClass)
} else {
nodeElement = document.createElement(elementType)
nodeElement = ascendantNode.insertAdjacentElement(position, nodeElement)
nodeElement.classList.add(cssClass.slice(1))
}
return nodeElement
}
// retorna nome amigável do campo usado como 1ª ordenação
function getOrderByFieldName(orderByColumn) {
let regExp = /^ddm__keyword__\d+__(.+)/
let matchExp = regExp.exec(orderByColumn)
return (matchExp) ? matchExp[1] : Liferay.Language.get(orderByColumn)
};}());</script>
</div>
</div>
</div>
</section>]]>
|
4607
| <![CDATA[<section class="bg-" style="">
<div class="container px-3 py-5">
<div class="row ">
<div class="col-md-12">
<div id="fragment-2316268-pbno" >
<script id="data_pbno" type="application/json">{"title":"Seleção de Estagiários 2018","type":0,"typeSettings":{"anyClassTypeDLFileEntryAssetRendererFactory":"47046","orderByColumn1":"modifiedDate"}}</script>
<h2 class="mb-0 pb-3 text-left text-break ">
Seleção de Estagiários 2018
</h2>
<span class="loading-animation"></span>
<div class="documents-list"></div>
</div><script>(function() {var fragmentElement = document.querySelector('#fragment-2316268-pbno'); var configuration = {"contentSetId":"2715708","showDateConversions":false,"showModifiedDate":true,"showRefDate":false,"textAlign":"left","pageSize":"50","showYear":false,"groupBy":"noGroup","textColor":{"cssClass":"","rgbValue":""},"useTitle":true,"usePagination":false,"bottomSpacing":"3","labelForYear":"Ocorrido em","useContentSetTitle":true,"labelForRefDate":"Referente a","headingLevel":"h2","showCreateDate":true,"activeDebug":false};const editMode = document.body.classList.contains('has-edit-mode-menu')
const apiURL = `${Liferay.ThemeDisplay.getPortalURL()}/o/headless-delivery`
const contentSetsEndPoint = `/v1.0/content-sets/${configuration.contentSetId}/content-set-elements`
const restrictFields = 'title,content.contentUrl,content.dateCreated,content.dateModified,content.documentType,content.fileExtension,content.sizeInBytes'
const params = { fields: restrictFields, 'pageSize': configuration.pageSize, 'page': 1 }
const pathThemeImages = Liferay.ThemeDisplay.getPathThemeImages()
const spritemapBNB = `${pathThemeImages}/bnb/icons.svg`
const spritemapClay = `${pathThemeImages}/clay/icons.svg`
const scriptAssetListJson = fragmentElement.querySelector(`script#data_${fragmentElement.id.slice(-4)}`)
const assetListObject = (scriptAssetListJson) ? JSON.parse(scriptAssetListJson.text) : null
const documentsList = fragmentElement.querySelector('.documents-list')
const loadingAnimation = fragmentElement.querySelector('.loading-animation')
const orderByYearAttrs = ['modifiedDate', 'createDate', 'publishDate', 'ddm__keyword__47047__DataReferência', 'ddm__keyword__47054__Ano']
const orderByMonthYearAttrs = ['modifiedDate', 'createDate', 'publishDate', 'ddm__keyword__47047__DataReferência']
const orderByDayAttrs = ['modifiedDate', 'createDate', 'publishDate', 'ddm__keyword__47047__DataReferência']
const fileEntryTypes = { 'docOrdin': 47046, 'docAnual': 47053 }
const validity = (assetListObject) ? validateConfiguration() : null
validity && init()
// funcao de inicialização
function init() {
fragmentElement.classList.add('mb-4')
editMode && reportConstraints()
fetchDocumentsPage()
}
// constrói um objeto para verificar status de validade de algumas configurações
function validateConfiguration() {
let orderByColumn = assetListObject.typeSettings.orderByColumn1
let orderByColumnName = getOrderByFieldName(orderByColumn)
let canGroupByYear = orderByYearAttrs.includes(orderByColumn)
let canGroupByMonthYear = orderByMonthYearAttrs.includes(orderByColumn)
let canGroupByDay = orderByDayAttrs.includes(orderByColumn)
let canShowRefDate = (assetListObject.typeSettings.anyClassTypeDLFileEntryAssetRendererFactory == fileEntryTypes.docOrdin)
let canShowYear = (assetListObject.typeSettings.anyClassTypeDLFileEntryAssetRendererFactory == fileEntryTypes.docAnual)
let validityState = {
'canGroupByYear': {
'state': canGroupByYear,
'msg' : canGroupByYear ? '' : `A coleção não pode ser agrupada por ano, pois está ordenada por ${orderByColumnName}.`
},
'canGroupByMonthYear': {
'state': canGroupByMonthYear,
'msg' : canGroupByMonthYear ? '' : `A coleção não pode ser agrupada por mês e ano, pois está ordenada por ${orderByColumnName}.`
},
'canGroupByDay': {
'state': canGroupByDay,
'msg' : canGroupByDay ? '' : `A coleção não pode ser agrupada por dia, pois está ordenada por ${orderByColumnName}.`
},
'canShowRefDate': {
'state': canShowRefDate,
'msg' : canShowRefDate ? '' : 'Não é possível mostrar o campo Data de Referência. Esse metadado existe apenas em coleções de Documentos Ordinários.'
},
'canShowYear': {
'state': canShowYear,
'msg' : canShowYear ? '' : 'Não é possível mostrar o campo Ano. Esse metadado existe apenas em coleções de Documentos Anuais.'
}
}
return validityState
}
// alerta sobre restrições na configuração
function reportConstraints() {
cleanAlerts()
// alerta sobre restrições
let validationMessages = []
configuration.groupBy == 'groupByYear' && !validity.canGroupByYear.state && validationMessages.push(validity.canGroupByYear.msg)
configuration.groupBy == 'groupByMonthYear' && !validity.canGroupByMonthYear.state && validationMessages.push(validity.canGroupByMonthYear.msg)
configuration.groupBy == 'groupByDay' && !validity.canGroupByDay.state && validationMessages.push(validity.canGroupByDay.msg)
configuration.showRefDate && !validity.canShowRefDate.state && validationMessages.push(validity.canShowRefDate.msg)
configuration.showYear && !validity.canShowYear.state && validationMessages.push(validity.canShowYear.msg)
validationMessages.length > 0 && displayAlert('danger', 'Configuração inválida', validationMessages.join('<br/>'), documentsList, 'beforebegin')
// debug
if (configuration.activeDebug) {
console.clear()
console.log('Propriedades da Coleção:')
console.log(assetListObject)
console.log('Configuração do Fragmento:')
console.log(configuration)
console.log('Validade da Configuração:')
console.log(validity)
}
}
// principal funcao para pegar os dados
function fetchDocumentsPage(page) {
params.page = (page) ? page : params.page
let request = Liferay.Util.addParams(params, apiURL+contentSetsEndPoint)
fetch(
request,
{
method: 'GET',
headers: {
'Content-Type': 'application/json'
}
}
).then(response => {
if (response.ok) {
return response.json()
}
}).then(documents => {
handleDocuments(documents)
if (editMode && configuration.activeDebug) {
console.log(`Retorno da requisição (page ${params.page}):`)
console.log(documents)
}
})
}
// manipula dados retornados da coleção
function handleDocuments(documents) {
loadingAnimation && loadingAnimation.remove()
if (documents.items.length > 0) {
switch (configuration.groupBy) {
case 'noGroup':
renderDocumentsList(documents)
break
case 'groupByYear':
(validity.canGroupByYear.state) ? renderDocumentsListByGroup(documents) : renderDocumentsList(documents)
break
case 'groupByMonthYear':
(validity.canGroupByMonthYear.state) ? renderDocumentsListByGroup(documents) : renderDocumentsList(documents)
break
case 'groupByDay':
(validity.canGroupByDay.state) ? renderDocumentsListByGroup(documents) : renderDocumentsList(documents)
break
}
configuration.usePagination && renderPaginationBar(documents.page, documents.lastPage, documents.totalCount)
} else {
displayAlert('info', 'Aviso', 'Não foram encontrados documentos', documentsList, 'afterbegin')
}
}
// renderiza lista agrupada
function renderDocumentsListByGroup(documents) {
let lastListGroup = documentsList.querySelector('.list-group:last-child')
let currentGroup = (lastListGroup) ? lastListGroup.dataset.group : 0
configuration.activeDebug
&& configuration.showDateConversions
&& editMode
&& console.log(`Extração do grupo a partir do campo ${getOrderByFieldName(assetListObject.typeSettings.orderByColumn1)}:`)
documents.items.forEach(doc => {
let group = getDocumentGroup(doc)
if (currentGroup != group) {
let listGroup = document.createElement('ul')
listGroup.classList.add('list-group')
listGroup.dataset.group = group
listGroup.setAttribute('aria-label', `${assetListObject.title} de ${group}`)
lastListGroup = documentsList.insertAdjacentElement('beforeend', listGroup)
lastListGroup.insertAdjacentHTML('afterbegin', renderListGroupHeader(group))
currentGroup = group
}
lastListGroup.insertAdjacentHTML('beforeend', renderListGroupItem(doc))
})
}
// extrai e retorna o dado (string) utilizado como agrupador (dia, mês ou ano) a partir do campo utilizado como primeira ordenação da coleção
function getDocumentGroup(document) {
let fieldData
let group
let dateField
let options
let test
let orderByColumn = assetListObject.typeSettings.orderByColumn1
switch (orderByColumn) {
case 'ddm__keyword__47047__DataReferência':
fieldData = document.content.documentType.contentFields[0].contentFieldValue.data
break
case 'ddm__keyword__47054__Ano':
fieldData = document.content.documentType.contentFields[0].contentFieldValue.data
break
case 'modifiedDate':
fieldData = document.content.dateModified
break
case 'createDate':
fieldData = document.content.dateCreated
break
case 'publishDate': // verificar esse caso por que não há uma campo data de publicação em coleções de documentos
fieldData = document.content.dateCreated
break
}
dateField = new Date(fieldData)
switch (configuration.groupBy) {
case 'groupByYear':
test = (orderByColumn == 'ddm__keyword__47047__DataReferência' || orderByColumn == 'ddm__keyword__47054__Ano')
group = test ? dateField.getUTCFullYear() : dateField.getFullYear()
break
case 'groupByMonthYear':
test = (orderByColumn == 'ddm__keyword__47047__DataReferência')
options = test ? {month:'long', year:'numeric', timeZone: 'UTC'} : { month:'long', year:'numeric' }
group = dateField.toLocaleDateString('pt-BR', options)
group = group.charAt(0).toUpperCase() + group.slice(1)
break
case 'groupByDay':
test = (orderByColumn == 'ddm__keyword__47047__DataReferência')
options = test ? {timeZone: 'UTC'} : {}
group = dateField.toLocaleDateString('pt-BR', options)
break
}
configuration.activeDebug && configuration.showDateConversions && editMode && console.log(`${fieldData} --> ${group}`)
return group
}
// renderiza lista comum
function renderDocumentsList(documents) {
let listGroup = getNodeElement(documentsList, 'afterbegin', 'ul', '.list-group')
listGroup.setAttribute('aria-label', assetListObject.title)
documents.items.forEach(doc => {
listGroup.insertAdjacentHTML('beforeend', renderListGroupItem(doc))
})
}
// renderiza cabeçalho da lista
function renderListGroupHeader(title) {
let listHeaderHTML = `
<li class="list-group-header">
<span class="list-group-header-title"><big>${title}</big></span>
</li>
`
return listHeaderHTML
}
// renderiza um item da lista
function renderListGroupItem(document) {
let dateCreated = (configuration.showCreateDate) ? new Date(document.content.dateCreated) : null
let dateCreatedHTML = (dateCreated) ? `
<div class="d-flex flex-row flex-lg-column text-lg-right ml-lg-3 mr-md-2 mr-lg-0">
<span class="small font-weight-bold text-nowrap mr-1 mr-lg-0">Publicado em</span>
<span class="small">${dateCreated.toLocaleDateString('pt-BR')}</span>
</div>` : ''
let dateModified = (configuration.showModifiedDate) ? new Date(document.content.dateModified) : null
let dateModifiedHTML = (dateModified) ? `
<div class="d-flex flex-row flex-lg-column text-lg-right ml-lg-3 mr-md-2 mr-lg-0">
<span class="small font-weight-bold text-nowrap mr-1 mr-lg-0">Atualizado em</span>
<span class="small">${dateModified.toLocaleDateString('pt-BR')}</span>
</div>` : ''
let refDate = (configuration.showRefDate && validity.canShowRefDate.state) ? new Date(document.content.documentType.contentFields[0].contentFieldValue.data) : null
let refDateHTML = (refDate) ? `
<div class="d-flex flex-row flex-lg-column text-lg-right ml-lg-3 mr-md-2 mr-lg-0">
<span class="small font-weight-bold text-nowrap mr-1 mr-lg-0">${configuration.labelForRefDate}</span>
<span class="small">${refDate.toLocaleDateString('pt-BR', {timeZone: 'UTC'})}</span>
</div>` : ''
let year = (configuration.showYear && validity.canShowYear.state) ? document.content.documentType.contentFields[0].contentFieldValue.data : null
let yearHTML = (year) ? `
<div class="d-flex flex-row flex-lg-column text-lg-right ml-lg-3 mr-md-2 mr-lg-0">
<span class="small font-weight-bold text-nowrap mr-1 mr-lg-0">${configuration.labelForYear}</span>
<span class="small">${year}</span>
</div>` : ''
let hasMetadatas = (year || refDate || dateCreated || dateModified)
let metadataHTML = (hasMetadatas) ? `
<div class="d-flex flex-column flex-md-row">
${yearHTML}
${refDateHTML}
${dateCreatedHTML}
${dateModifiedHTML}
</div>` : ''
let listItemHTML = `
<li class="list-group-item list-group-item-flex align-items-center">
<div class="autofit-col">
<svg class="lexicon-icon text-tertiary lexicon-icon-lg" focusable="false" role="presentation"
viewBox="0 0 512 512">
<use xlink:href="${spritemapBNB}#arquivo-${document.content.fileExtension}" />
</svg>
</div>
<div class="autofit-col autofit-col-expand">
<div class="d-flex flex-column flex-lg-row justify-content-start justify-content-lg-between">
<div class="d-flex flex-column">
<span class="list-group-title">
<a href="${document.content.contentUrl}">${document.title}</a>
</span>
<span class="list-group-subtitle text-uppercase small">
${document.content.fileExtension}, ${Liferay.Util.formatStorage(document.content.sizeInBytes, {addSpaceBeforeSuffix: true})}
</span>
</div>
${metadataHTML}
</div>
</div>
</li>
`
return listItemHTML
}
// renderiza paginação
function renderPaginationBar(page, lastPage, totalCount) {
let paginationBar = getNodeElement(fragmentElement, 'beforeend', 'div', '.pagination-bar')
let lastIndex = (page === lastPage) ? totalCount : configuration.pageSize*page
let nDocuments = (page+1 === lastPage) ? totalCount - configuration.pageSize*page : configuration.pageSize
paginationBar.classList.add('justify-content-center', 'justify-content-lg-between')
let textColor = (configuration.textColor.cssClass) ? `text-${configuration.textColor.cssClass}` : ''
paginationBar.innerHTML = `
<div class="pagination-results mr-0 ${textColor}">Exibindo 1 a ${lastIndex} de ${totalCount} documentos.</div>
<ul class="pagination">
<li class="page-item">
<button class="btn btn-unstyled page-link" type="button">
Exibir mais ${nDocuments} documentos
${renderIcon('angle-down', spritemapClay, 'ml-2')}
</button>
</li>
</ul>
`
let showMoreButton = paginationBar.querySelector('button.page-link')
if (page !== lastPage) {
showMoreButton.addEventListener('click', e => {
showMoreButton.querySelector('svg').remove()
let loadAnimation = getNodeElement(showMoreButton, 'beforeend', 'span', '.loading-animation')
loadAnimation.classList.add('loading-animation-sm', 'ml-2')
fetchDocumentsPage(page+1)
})
} else {
showMoreButton.remove()
}
}
// imprime um mensagem de alerta
function displayAlert(style, title, msg, parentNode, position) {
let styleIcons = {
'danger': 'exclamation-full',
'success': 'check-circle-full',
'info': 'info-circle',
'warning': 'warning-full'
}
let html = `
<div class="alert p-4 alert-${style}" role="alert">
<span class="alert-indicator">
${renderIcon(styleIcons[style], spritemapClay, '')}
</span>
<strong>${title}:</strong>
<p class="mt-2 mb-0">${msg}</p>
</div>
`
parentNode.insertAdjacentHTML(position, html)
}
// limpa mensagens de alerta
function cleanAlerts() {
let alerts = fragmentElement.querySelectorAll('.alert')
alerts.forEach(alert => alert.remove())
}
// imprime icone SGV
function renderIcon(icon, spritemap, cssClasses) {
return `
<svg class="lexicon-icon lexicon-icon-${icon} ${cssClasses}" focusable="false" role="presentation">
<use href="${spritemap}#${icon}"></use>
</svg>
`
}
// retorna/cria um elemento html de uma classe css
// ascendantNode é um nó ascendente
// position é uma string 'beforeend', 'afterbegin' +
// elementType uma string 'ul', 'div' etc
// cssClass é uma classe css
function getNodeElement(ascendantNode, position, elementType, cssClass) {
let nodeElement
if (ascendantNode.querySelector(cssClass)) {
nodeElement = ascendantNode.querySelector(cssClass)
} else {
nodeElement = document.createElement(elementType)
nodeElement = ascendantNode.insertAdjacentElement(position, nodeElement)
nodeElement.classList.add(cssClass.slice(1))
}
return nodeElement
}
// retorna nome amigável do campo usado como 1ª ordenação
function getOrderByFieldName(orderByColumn) {
let regExp = /^ddm__keyword__\d+__(.+)/
let matchExp = regExp.exec(orderByColumn)
return (matchExp) ? matchExp[1] : Liferay.Language.get(orderByColumn)
};}());</script>
</div>
</div>
</div>
</section>]]>
|
5310
| <![CDATA[<a aria-label="Instagram" href="https://www.instagram.com/bancodonordeste/" target="_blank" class="mx-2 lexicon-icon-box bg-dark text-white rounded-circle" style="font-size:1.3em" role="menuitem">
<span>
<svg class="lexicon-icon lexicon-icon-social-instagram" focusable="false" id="ztky" role="presentation"><use xlink:href="https://www.bnb.gov.br/o/bnb-dxp-theme/images/bnb/icons.svg#social-instagram"/></svg> </span>
<span class="hide-accessible">Instagram</span>
</a>]]>
|
5315
| <![CDATA[<a aria-label="Youtube" href="https://www.youtube.com/bancodonordesteoficial" target="_blank" class="mx-2 lexicon-icon-box bg-dark text-white rounded-circle" style="font-size:1.3em" role="menuitem">
<span>
<svg class="lexicon-icon lexicon-icon-social-youtube" focusable="false" id="jkuc" role="presentation"><use xlink:href="https://www.bnb.gov.br/o/bnb-dxp-theme/images/bnb/icons.svg#social-youtube"/></svg> </span>
<span class="hide-accessible">Youtube</span>
</a>]]>
|
5320
| <![CDATA[<a aria-label="Facebook" href="https://www.facebook.com/bancodonordeste" target="_blank" class="mx-2 lexicon-icon-box bg-dark text-white rounded-circle" style="font-size:1.3em" role="menuitem">
<span>
<svg class="lexicon-icon lexicon-icon-social-facebook" focusable="false" id="flpa" role="presentation"><use xlink:href="https://www.bnb.gov.br/o/bnb-dxp-theme/images/bnb/icons.svg#social-facebook"/></svg> </span>
<span class="hide-accessible">Facebook</span>
</a>]]>
|
5325
| <![CDATA[<a aria-label="Twitter" href="https://twitter.com/BancodoNordeste" target="_blank" class="mx-2 lexicon-icon-box bg-dark text-white rounded-circle" style="font-size:1.3em" role="menuitem">
<span>
<svg class="lexicon-icon lexicon-icon-social-twitter" focusable="false" id="qogw" role="presentation"><use xlink:href="https://www.bnb.gov.br/o/bnb-dxp-theme/images/bnb/icons.svg#social-twitter"/></svg> </span>
<span class="hide-accessible">Twitter</span>
</a>]]>
|
5408
| <![CDATA[<img alt="Selo da Ética" style="width:154px" src="https://www.bnb.gov.br/o/bnb-dxp-theme/images/selo-etica.svg" />]]>
|
5411
| <![CDATA[<img alt="Selo da Lei de Acesso à Informação" style="width:42px" src="https://www.bnb.gov.br/o/bnb-dxp-theme/images/selo-lai.svg" />]]>
|
730
| <![CDATA[<style data-senna-track="temporary" type="text/css">
</style>]]>
|
2236
| <![CDATA[<style>
.isDisabled {
color: darkslategray !important;
pointer-events: none;
}
.confIcon{
height:0.7em;
margin-top:0;
}
</style>]]>
|
2295
| <![CDATA[<style>.fragment_1170299 {
}</style>]]>
|
2303
| <![CDATA[<style>.component-paragraph img {
max-width: 100%;
}</style>]]>
|
2367
| <![CDATA[<style>.fragment-heading-text-colored a {
color: inherit;
}</style>]]>
|
2432
| <![CDATA[<style>.fragment_136960 {
}</style>]]>
|
2989
| <![CDATA[<style>.page-item button {
border-radius: 2rem !important;
}</style>]]>
|
101
| <![CDATA[<script id="f5_cspm">(function(){var f5_cspm={f5_p:'AJILFLJGHBJOCFNIGDPGEOGJPKFGAKPHENFNGNHPGLHBCGABEJLNCKDJKLLAGFHJLIMBEELIAAJJLABAFGBAFGEIAAPNPHFFFOLFNCNIPDJBJJKBBPPDHDMNBEOIJFDK',setCharAt:function(str,index,chr){if(index>str.length-1)return str;return str.substr(0,index)+chr+str.substr(index+1);},get_byte:function(str,i){var s=(i/16)|0;i=(i&15);s=s*32;return((str.charCodeAt(i+16+s)-65)<<4)|(str.charCodeAt(i+s)-65);},set_byte:function(str,i,b){var s=(i/16)|0;i=(i&15);s=s*32;str=f5_cspm.setCharAt(str,(i+16+s),String.fromCharCode((b>>4)+65));str=f5_cspm.setCharAt(str,(i+s),String.fromCharCode((b&15)+65));return str;},set_latency:function(str,latency){latency=latency&0xffff;str=f5_cspm.set_byte(str,40,(latency>>8));str=f5_cspm.set_byte(str,41,(latency&0xff));str=f5_cspm.set_byte(str,35,2);return str;},wait_perf_data:function(){try{var wp=window.performance.timing;if(wp.loadEventEnd>0){var res=wp.loadEventEnd-wp.navigationStart;if(res<60001){var cookie_val=f5_cspm.set_latency(f5_cspm.f5_p,res);window.document.cookie='f5avr0961558605aaaaaaaaaaaaaaaa_cspm_='+encodeURIComponent(cookie_val)+';path=/';}
return;}}
catch(err){return;}
setTimeout(f5_cspm.wait_perf_data,100);return;},go:function(){var chunk=window.document.cookie.split(/\s*;\s*/);for(var i=0;i<chunk.length;++i){var pair=chunk[i].split(/\s*=\s*/);if(pair[0]=='f5_cspm'&&pair[1]=='1234')
{var d=new Date();d.setTime(d.getTime()-1000);window.document.cookie='f5_cspm=;expires='+d.toUTCString()+';path=/;';setTimeout(f5_cspm.wait_perf_data,100);}}}}
f5_cspm.go();}());</script>]]>
|
230
| <![CDATA[<script data-senna-track="temporary" type="text/javascript">
// <![CDATA[
var Liferay = Liferay || {};
Liferay.Browser = {
acceptsGzip: function() {
return false;
},
getMajorVersion: function() {
return 0;
},
getRevision: function() {
return '';
},
getVersion: function() {
return '';
},
isAir: function() {
return false;
},
isChrome: function() {
return false;
},
isEdge: function() {
return false;
},
isFirefox: function() {
return false;
},
isGecko: function() {
return false;
},
isIe: function() {
return false;
},
isIphone: function() {
return false;
},
isLinux: function() {
return false;
},
isMac: function() {
return false;
},
isMobile: function() {
return false;
},
isMozilla: function() {
return false;
},
isOpera: function() {
return false;
},
isRtf: function() {
return false;
},
isSafari: function() {
return false;
},
isSun: function() {
return false;
},
isWebKit: function() {
return false;
},
isWindows: function() {
return false;
}
};
Liferay.Data = Liferay.Data || {};
Liferay.Data.ICONS_INLINE_SVG = true;
Liferay.Data.NAV_SELECTOR = '#navigation';
Liferay.Data.NAV_SELECTOR_MOBILE = '#navigationCollapse';
Liferay.Data.isCustomizationView = function() {
return false;
};
Liferay.Data.notices = [
null
];
Liferay.PortletKeys = {
DOCUMENT_LIBRARY: 'com_liferay_document_library_web_portlet_DLPortlet',
DYNAMIC_DATA_MAPPING: 'com_liferay_dynamic_data_mapping_web_portlet_DDMPortlet',
ITEM_SELECTOR: 'com_liferay_item_selector_web_portlet_ItemSelectorPortlet'
};
Liferay.PropsValues = {
JAVASCRIPT_SINGLE_PAGE_APPLICATION_TIMEOUT: 0,
NTLM_AUTH_ENABLED: false,
UPLOAD_SERVLET_REQUEST_IMPL_MAX_SIZE: 104857600
};
Liferay.ThemeDisplay = {
getLayoutId: function() {
return '45';
},
getLayoutRelativeControlPanelURL: function() {
return '/group/guest/~/control_panel/manage';
},
getLayoutRelativeURL: function() {
return '/web/guest/acesso-a-informacao/empregados';
},
getLayoutURL: function() {
return 'https://www.bnb.gov.br/web/guest/acesso-a-informacao/empregados';
},
getParentLayoutId: function() {
return '15';
},
isControlPanel: function() {
return false;
},
isPrivateLayout: function() {
return 'false';
},
isVirtualLayout: function() {
return false;
},
getBCP47LanguageId: function() {
return 'pt-BR';
},
getCanonicalURL: function() {
return 'https\x3a\x2f\x2fwww\x2ebnb\x2egov\x2ebr\x2facesso-a-informacao\x2fempregados';
},
getCDNBaseURL: function() {
return 'https://www.bnb.gov.br';
},
getCDNDynamicResourcesHost: function() {
return '';
},
getCDNHost: function() {
return '';
},
getCompanyGroupId: function() {
return '20128';
},
getCompanyId: function() {
return '20101';
},
getDefaultLanguageId: function() {
return 'pt_BR';
},
getDoAsUserIdEncoded: function() {
return '';
},
getLanguageId: function() {
return 'pt_BR';
},
getParentGroupId: function() {
return '20124';
},
getPathContext: function() {
return '';
},
getPathImage: function() {
return '/image';
},
getPathJavaScript: function() {
return '/o/frontend-js-web';
},
getPathMain: function() {
return '/c';
},
getPathThemeImages: function() {
return 'https://www.bnb.gov.br/o/bnb-dxp-theme/images';
},
getPathThemeRoot: function() {
return '/o/bnb-dxp-theme';
},
getPlid: function() {
return '70';
},
getPortalURL: function() {
return 'https://www.bnb.gov.br';
},
getRealUserId: function() {
return '20105';
},
getScopeGroupId: function() {
return '20124';
},
getScopeGroupIdOrLiveGroupId: function() {
return '20124';
},
getSessionId: function() {
return '';
},
getSiteAdminURL: function() {
return 'https://www.bnb.gov.br/group/guest/~/control_panel/manage?p_p_lifecycle=0&p_p_state=maximized&p_p_mode=view';
},
getSiteGroupId: function() {
return '20124';
},
getURLControlPanel: function() {
return '/group/control_panel?refererPlid=70';
},
getURLHome: function() {
return 'https\x3a\x2f\x2fwww\x2ebnb\x2egov\x2ebr\x2fweb\x2fguest';
},
getUserEmailAddress: function() {
return '';
},
getUserId: function() {
return '20105';
},
getUserName: function() {
return '';
},
isAddSessionIdToURL: function() {
return false;
},
isImpersonated: function() {
return false;
},
isSignedIn: function() {
return false;
},
isStagedPortlet: function() {
return false;
},
isStateExclusive: function() {
return false;
},
isStateMaximized: function() {
return false;
},
isStatePopUp: function() {
return false;
}
};
var themeDisplay = Liferay.ThemeDisplay;
Liferay.AUI = {
getAvailableLangPath: function() {
return 'available_languages.jsp?browserId=other&themeId=portalbancodonordeste_WAR_bnbdxptheme&colorSchemeId=01&minifierType=js&languageId=pt_BR&t=1694179751488';
},
getCombine: function() {
return true;
},
getComboPath: function() {
return '/combo/?browserId=other&minifierType=&languageId=pt_BR&t=1670770798365&';
},
getDateFormat: function() {
return '%d/%m/%Y';
},
getEditorCKEditorPath: function() {
return '/o/frontend-editor-ckeditor-web';
},
getFilter: function() {
var filter = 'raw';
filter = 'min';
return filter;
},
getFilterConfig: function() {
var instance = this;
var filterConfig = null;
if (!instance.getCombine()) {
filterConfig = {
replaceStr: '.js' + instance.getStaticResourceURLParams(),
searchExp: '\\.js$'
};
}
return filterConfig;
},
getJavaScriptRootPath: function() {
return '/o/frontend-js-web';
},
getLangPath: function() {
return 'aui_lang.jsp?browserId=other&themeId=portalbancodonordeste_WAR_bnbdxptheme&colorSchemeId=01&minifierType=js&languageId=pt_BR&t=1670770798365';
},
getPortletRootPath: function() {
return '/html/portlet';
},
getStaticResourceURLParams: function() {
return '?browserId=other&minifierType=&languageId=pt_BR&t=1670770798365';
}
};
Liferay.authToken = 'ziHcnDs1';
Liferay.currentURL = '\x2fweb\x2fguest\x2facesso-a-informacao\x2fempregados';
Liferay.currentURLEncoded = '\x252Fweb\x252Fguest\x252Facesso-a-informacao\x252Fempregados';
// ]]>
</script>]]>
|
579
| <![CDATA[<script data-senna-track="temporary" type="text/javascript">
// <![CDATA[
// ]]>
</script>]]>
|
602
| <![CDATA[<script data-senna-track="permanent" id="googleAnalyticsScript" type="text/javascript">
(function(i, s, o, g, r, a, m) {
i['GoogleAnalyticsObject'] = r;
i[r] = i[r] || function() {
var arrayValue = i[r].q || [];
i[r].q = arrayValue;
(i[r].q).push(arguments);
};
i[r].l = 1 * new Date();
a = s.createElement(o);
m = s.getElementsByTagName(o)[0];
a.async = 1;
a.src = g;
m.parentNode.insertBefore(a, m);
})(window, document, 'script', '//www.google-analytics.com/analytics.js', 'ga');
ga('create', 'UA-7227019-1', 'auto');
ga('send', 'pageview');
Liferay.on(
'endNavigate',
function(event) {
ga('set', 'page', event.path);
ga('send', 'pageview');
}
);
</script>]]>
|
661
| <![CDATA[<script>
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
gtag('config', 'G-0W34JDGDKK');
</script>]]>
|
769
| <![CDATA[<script type="text/javascript">
// <![CDATA[
Liferay.Loader.require('frontend-js-spa-web@3.0.53/liferay/init.es', function(frontendJsSpaWeb3053LiferayInitEs) {
(function(){
var frontendJsSpaWebLiferayInitEs = frontendJsSpaWeb3053LiferayInitEs;
(function() {var $ = AUI.$;var _ = AUI._;
Liferay.SPA = Liferay.SPA || {};
Liferay.SPA.cacheExpirationTime = -1;
Liferay.SPA.clearScreensCache = false;
Liferay.SPA.debugEnabled = false;
Liferay.SPA.excludedPaths = ["/c/document_library","/documents","/image"];
Liferay.SPA.loginRedirect = '';
Liferay.SPA.navigationExceptionSelectors = ':not([target="_blank"]):not([data-senna-off]):not([data-resource-href]):not([data-cke-saved-href]):not([data-cke-saved-href])';
Liferay.SPA.requestTimeout = 0;
Liferay.SPA.userNotification = {
message: 'Parece que isso está demorando mais do que o esperado.',
timeout: 30000,
title: 'Oops'
};
frontendJsSpaWebLiferayInitEs.default.init(
function(app) {
app.setPortletsBlacklist({"com_liferay_site_navigation_directory_web_portlet_SitesDirectoryPortlet":true,"com_liferay_nested_portlets_web_portlet_NestedPortletsPortlet":true,"com_liferay_login_web_portlet_LoginPortlet":true,"com_liferay_login_web_portlet_FastLoginPortlet":true});
app.setValidStatusCodes([221,490,494,499,491,492,493,495,220]);
}
);})();})();
});
// ]]>
</script>]]>
|
798
| <![CDATA[<script type="text/javascript">
// <![CDATA[
Liferay.on(
'ddmFieldBlur', function(event) {
if (window.Analytics) {
Analytics.send(
'fieldBlurred',
'Form',
{
fieldName: event.fieldName,
focusDuration: event.focusDuration,
formId: event.formId,
page: event.page
}
);
}
}
);
Liferay.on(
'ddmFieldFocus', function(event) {
if (window.Analytics) {
Analytics.send(
'fieldFocused',
'Form',
{
fieldName: event.fieldName,
formId: event.formId,
page: event.page
}
);
}
}
);
Liferay.on(
'ddmFormPageShow', function(event) {
if (window.Analytics) {
Analytics.send(
'pageViewed',
'Form',
{
formId: event.formId,
page: event.page,
title: event.title
}
);
}
}
);
Liferay.on(
'ddmFormSubmit', function(event) {
if (window.Analytics) {
Analytics.send(
'formSubmitted',
'Form',
{
formId: event.formId
}
);
}
}
);
Liferay.on(
'ddmFormView', function(event) {
if (window.Analytics) {
Analytics.send(
'formViewed',
'Form',
{
formId: event.formId,
title: event.title
}
);
}
}
);
// ]]>
</script>]]>
|
910
| <![CDATA[<script data-senna-track="temporary" type="text/javascript">
if (window.Analytics) {
window._com_liferay_document_library_analytics_isViewFileEntry = false;
}
</script>]]>
|
1046
| <![CDATA[<script>
new window.VLibras.Widget('https://vlibras.gov.br/app');
</script>]]>
|
2305
| <![CDATA[<script>(function() {var fragmentElement = document.querySelector('#fragment-0-vinp'); var configuration = {"textAlign":"left","bottomSpacing":"3","textColor":{"cssClass":"","rgbValue":""}};/**
* Copyright (c) 2000-present Liferay, Inc. All rights reserved.
*
* This library is free software; you can redistribute it and/or modify it under
* the terms of the GNU Lesser General Public License as published by the Free
* Software Foundation; either version 2.1 of the License, or (at your option)
* any later version.
*
* This library is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
* details.
*/;}());</script>]]>
|
2349
| <![CDATA[<script>(function() {var fragmentElement = document.querySelector('#fragment-0-fdhb'); var configuration = {"height":"py-4"};/**
* Copyright (c) 2000-present Liferay, Inc. All rights reserved.
*
* This library is free software; you can redistribute it and/or modify it under
* the terms of the GNU Lesser General Public License as published by the Free
* Software Foundation; either version 2.1 of the License, or (at your option)
* any later version.
*
* This library is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
* details.
*/;}());</script>]]>
|
2369
| <![CDATA[<script>(function() {var fragmentElement = document.querySelector('#fragment-0-rzef'); var configuration = {"textAlign":"left","bottomSpacing":"4","headingLevel":"h2","textColor":{"cssClass":"","rgbValue":""}};/**
* Copyright (c) 2000-present Liferay, Inc. All rights reserved.
*
* This library is free software; you can redistribute it and/or modify it under
* the terms of the GNU Lesser General Public License as published by the Free
* Software Foundation; either version 2.1 of the License, or (at your option)
* any later version.
*
* This library is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
* details.
*/;}());</script>]]>
|
2527
| <![CDATA[<script>(function() {var fragmentElement = document.querySelector('#fragment-0-mnah'); var configuration = {"height":"py-3"};/**
* Copyright (c) 2000-present Liferay, Inc. All rights reserved.
*
* This library is free software; you can redistribute it and/or modify it under
* the terms of the GNU Lesser General Public License as published by the Free
* Software Foundation; either version 2.1 of the License, or (at your option)
* any later version.
*
* This library is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
* details.
*/;}());</script>]]>
|
2573
| <![CDATA[<script>(function() {var fragmentElement = document.querySelector('#fragment-0-qqxm'); var configuration = {"textAlign":"left","bottomSpacing":"3","headingLevel":"h2","textColor":{"cssClass":"white","rgbValue":"rgb(230, 230, 230)"}};/**
* Copyright (c) 2000-present Liferay, Inc. All rights reserved.
*
* This library is free software; you can redistribute it and/or modify it under
* the terms of the GNU Lesser General Public License as published by the Free
* Software Foundation; either version 2.1 of the License, or (at your option)
* any later version.
*
* This library is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
* details.
*/;}());</script>]]>
|
2961
| <![CDATA[<script>(function() {var fragmentElement = document.querySelector('#fragment-0-nsrw'); var configuration = {"textAlign":"left","bottomSpacing":"3","headingLevel":"h2","textColor":{"cssClass":"","rgbValue":""}};/**
* Copyright (c) 2000-present Liferay, Inc. All rights reserved.
*
* This library is free software; you can redistribute it and/or modify it under
* the terms of the GNU Lesser General Public License as published by the Free
* Software Foundation; either version 2.1 of the License, or (at your option)
* any later version.
*
* This library is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
* details.
*/;}());</script>]]>
|
2980
| <![CDATA[<script id="data_jnyh" type="application/json">{"title":"Acordos Coletivos de Trabalho - Contec","type":0,"typeSettings":{"anyClassTypeDLFileEntryAssetRendererFactory":"47046","orderByColumn1":"ddm__keyword__47047__DataReferência"}}</script>]]>
|
2991
| <![CDATA[<script>(function() {var fragmentElement = document.querySelector('#fragment-2316268-jnyh'); var configuration = {"contentSetId":"2705607","showDateConversions":false,"showModifiedDate":true,"showRefDate":false,"textAlign":"left","pageSize":"50","showYear":false,"groupBy":"noGroup","textColor":{"cssClass":"primary","rgbValue":"rgb(122, 18, 44)"},"useTitle":true,"usePagination":false,"bottomSpacing":"3","labelForYear":"Ocorrido em","useContentSetTitle":false,"labelForRefDate":"Referente a","headingLevel":"h3","showCreateDate":true,"activeDebug":false};const editMode = document.body.classList.contains('has-edit-mode-menu')
const apiURL = `${Liferay.ThemeDisplay.getPortalURL()}/o/headless-delivery`
const contentSetsEndPoint = `/v1.0/content-sets/${configuration.contentSetId}/content-set-elements`
const restrictFields = 'title,content.contentUrl,content.dateCreated,content.dateModified,content.documentType,content.fileExtension,content.sizeInBytes'
const params = { fields: restrictFields, 'pageSize': configuration.pageSize, 'page': 1 }
const pathThemeImages = Liferay.ThemeDisplay.getPathThemeImages()
const spritemapBNB = `${pathThemeImages}/bnb/icons.svg`
const spritemapClay = `${pathThemeImages}/clay/icons.svg`
const scriptAssetListJson = fragmentElement.querySelector(`script#data_${fragmentElement.id.slice(-4)}`)
const assetListObject = (scriptAssetListJson) ? JSON.parse(scriptAssetListJson.text) : null
const documentsList = fragmentElement.querySelector('.documents-list')
const loadingAnimation = fragmentElement.querySelector('.loading-animation')
const orderByYearAttrs = ['modifiedDate', 'createDate', 'publishDate', 'ddm__keyword__47047__DataReferência', 'ddm__keyword__47054__Ano']
const orderByMonthYearAttrs = ['modifiedDate', 'createDate', 'publishDate', 'ddm__keyword__47047__DataReferência']
const orderByDayAttrs = ['modifiedDate', 'createDate', 'publishDate', 'ddm__keyword__47047__DataReferência']
const fileEntryTypes = { 'docOrdin': 47046, 'docAnual': 47053 }
const validity = (assetListObject) ? validateConfiguration() : null
validity && init()
// funcao de inicialização
function init() {
fragmentElement.classList.add('mb-4')
editMode && reportConstraints()
fetchDocumentsPage()
}
// constrói um objeto para verificar status de validade de algumas configurações
function validateConfiguration() {
let orderByColumn = assetListObject.typeSettings.orderByColumn1
let orderByColumnName = getOrderByFieldName(orderByColumn)
let canGroupByYear = orderByYearAttrs.includes(orderByColumn)
let canGroupByMonthYear = orderByMonthYearAttrs.includes(orderByColumn)
let canGroupByDay = orderByDayAttrs.includes(orderByColumn)
let canShowRefDate = (assetListObject.typeSettings.anyClassTypeDLFileEntryAssetRendererFactory == fileEntryTypes.docOrdin)
let canShowYear = (assetListObject.typeSettings.anyClassTypeDLFileEntryAssetRendererFactory == fileEntryTypes.docAnual)
let validityState = {
'canGroupByYear': {
'state': canGroupByYear,
'msg' : canGroupByYear ? '' : `A coleção não pode ser agrupada por ano, pois está ordenada por ${orderByColumnName}.`
},
'canGroupByMonthYear': {
'state': canGroupByMonthYear,
'msg' : canGroupByMonthYear ? '' : `A coleção não pode ser agrupada por mês e ano, pois está ordenada por ${orderByColumnName}.`
},
'canGroupByDay': {
'state': canGroupByDay,
'msg' : canGroupByDay ? '' : `A coleção não pode ser agrupada por dia, pois está ordenada por ${orderByColumnName}.`
},
'canShowRefDate': {
'state': canShowRefDate,
'msg' : canShowRefDate ? '' : 'Não é possível mostrar o campo Data de Referência. Esse metadado existe apenas em coleções de Documentos Ordinários.'
},
'canShowYear': {
'state': canShowYear,
'msg' : canShowYear ? '' : 'Não é possível mostrar o campo Ano. Esse metadado existe apenas em coleções de Documentos Anuais.'
}
}
return validityState
}
// alerta sobre restrições na configuração
function reportConstraints() {
cleanAlerts()
// alerta sobre restrições
let validationMessages = []
configuration.groupBy == 'groupByYear' && !validity.canGroupByYear.state && validationMessages.push(validity.canGroupByYear.msg)
configuration.groupBy == 'groupByMonthYear' && !validity.canGroupByMonthYear.state && validationMessages.push(validity.canGroupByMonthYear.msg)
configuration.groupBy == 'groupByDay' && !validity.canGroupByDay.state && validationMessages.push(validity.canGroupByDay.msg)
configuration.showRefDate && !validity.canShowRefDate.state && validationMessages.push(validity.canShowRefDate.msg)
configuration.showYear && !validity.canShowYear.state && validationMessages.push(validity.canShowYear.msg)
validationMessages.length > 0 && displayAlert('danger', 'Configuração inválida', validationMessages.join('<br/>'), documentsList, 'beforebegin')
// debug
if (configuration.activeDebug) {
console.clear()
console.log('Propriedades da Coleção:')
console.log(assetListObject)
console.log('Configuração do Fragmento:')
console.log(configuration)
console.log('Validade da Configuração:')
console.log(validity)
}
}
// principal funcao para pegar os dados
function fetchDocumentsPage(page) {
params.page = (page) ? page : params.page
let request = Liferay.Util.addParams(params, apiURL+contentSetsEndPoint)
fetch(
request,
{
method: 'GET',
headers: {
'Content-Type': 'application/json'
}
}
).then(response => {
if (response.ok) {
return response.json()
}
}).then(documents => {
handleDocuments(documents)
if (editMode && configuration.activeDebug) {
console.log(`Retorno da requisição (page ${params.page}):`)
console.log(documents)
}
})
}
// manipula dados retornados da coleção
function handleDocuments(documents) {
loadingAnimation && loadingAnimation.remove()
if (documents.items.length > 0) {
switch (configuration.groupBy) {
case 'noGroup':
renderDocumentsList(documents)
break
case 'groupByYear':
(validity.canGroupByYear.state) ? renderDocumentsListByGroup(documents) : renderDocumentsList(documents)
break
case 'groupByMonthYear':
(validity.canGroupByMonthYear.state) ? renderDocumentsListByGroup(documents) : renderDocumentsList(documents)
break
case 'groupByDay':
(validity.canGroupByDay.state) ? renderDocumentsListByGroup(documents) : renderDocumentsList(documents)
break
}
configuration.usePagination && renderPaginationBar(documents.page, documents.lastPage, documents.totalCount)
} else {
displayAlert('info', 'Aviso', 'Não foram encontrados documentos', documentsList, 'afterbegin')
}
}
// renderiza lista agrupada
function renderDocumentsListByGroup(documents) {
let lastListGroup = documentsList.querySelector('.list-group:last-child')
let currentGroup = (lastListGroup) ? lastListGroup.dataset.group : 0
configuration.activeDebug
&& configuration.showDateConversions
&& editMode
&& console.log(`Extração do grupo a partir do campo ${getOrderByFieldName(assetListObject.typeSettings.orderByColumn1)}:`)
documents.items.forEach(doc => {
let group = getDocumentGroup(doc)
if (currentGroup != group) {
let listGroup = document.createElement('ul')
listGroup.classList.add('list-group')
listGroup.dataset.group = group
listGroup.setAttribute('aria-label', `${assetListObject.title} de ${group}`)
lastListGroup = documentsList.insertAdjacentElement('beforeend', listGroup)
lastListGroup.insertAdjacentHTML('afterbegin', renderListGroupHeader(group))
currentGroup = group
}
lastListGroup.insertAdjacentHTML('beforeend', renderListGroupItem(doc))
})
}
// extrai e retorna o dado (string) utilizado como agrupador (dia, mês ou ano) a partir do campo utilizado como primeira ordenação da coleção
function getDocumentGroup(document) {
let fieldData
let group
let dateField
let options
let test
let orderByColumn = assetListObject.typeSettings.orderByColumn1
switch (orderByColumn) {
case 'ddm__keyword__47047__DataReferência':
fieldData = document.content.documentType.contentFields[0].contentFieldValue.data
break
case 'ddm__keyword__47054__Ano':
fieldData = document.content.documentType.contentFields[0].contentFieldValue.data
break
case 'modifiedDate':
fieldData = document.content.dateModified
break
case 'createDate':
fieldData = document.content.dateCreated
break
case 'publishDate': // verificar esse caso por que não há uma campo data de publicação em coleções de documentos
fieldData = document.content.dateCreated
break
}
dateField = new Date(fieldData)
switch (configuration.groupBy) {
case 'groupByYear':
test = (orderByColumn == 'ddm__keyword__47047__DataReferência' || orderByColumn == 'ddm__keyword__47054__Ano')
group = test ? dateField.getUTCFullYear() : dateField.getFullYear()
break
case 'groupByMonthYear':
test = (orderByColumn == 'ddm__keyword__47047__DataReferência')
options = test ? {month:'long', year:'numeric', timeZone: 'UTC'} : { month:'long', year:'numeric' }
group = dateField.toLocaleDateString('pt-BR', options)
group = group.charAt(0).toUpperCase() + group.slice(1)
break
case 'groupByDay':
test = (orderByColumn == 'ddm__keyword__47047__DataReferência')
options = test ? {timeZone: 'UTC'} : {}
group = dateField.toLocaleDateString('pt-BR', options)
break
}
configuration.activeDebug && configuration.showDateConversions && editMode && console.log(`${fieldData} --> ${group}`)
return group
}
// renderiza lista comum
function renderDocumentsList(documents) {
let listGroup = getNodeElement(documentsList, 'afterbegin', 'ul', '.list-group')
listGroup.setAttribute('aria-label', assetListObject.title)
documents.items.forEach(doc => {
listGroup.insertAdjacentHTML('beforeend', renderListGroupItem(doc))
})
}
// renderiza cabeçalho da lista
function renderListGroupHeader(title) {
let listHeaderHTML = `
<li class="list-group-header">
<span class="list-group-header-title"><big>${title}</big></span>
</li>
`
return listHeaderHTML
}
// renderiza um item da lista
function renderListGroupItem(document) {
let dateCreated = (configuration.showCreateDate) ? new Date(document.content.dateCreated) : null
let dateCreatedHTML = (dateCreated) ? `
<div class="d-flex flex-row flex-lg-column text-lg-right ml-lg-3 mr-md-2 mr-lg-0">
<span class="small font-weight-bold text-nowrap mr-1 mr-lg-0">Publicado em</span>
<span class="small">${dateCreated.toLocaleDateString('pt-BR')}</span>
</div>` : ''
let dateModified = (configuration.showModifiedDate) ? new Date(document.content.dateModified) : null
let dateModifiedHTML = (dateModified) ? `
<div class="d-flex flex-row flex-lg-column text-lg-right ml-lg-3 mr-md-2 mr-lg-0">
<span class="small font-weight-bold text-nowrap mr-1 mr-lg-0">Atualizado em</span>
<span class="small">${dateModified.toLocaleDateString('pt-BR')}</span>
</div>` : ''
let refDate = (configuration.showRefDate && validity.canShowRefDate.state) ? new Date(document.content.documentType.contentFields[0].contentFieldValue.data) : null
let refDateHTML = (refDate) ? `
<div class="d-flex flex-row flex-lg-column text-lg-right ml-lg-3 mr-md-2 mr-lg-0">
<span class="small font-weight-bold text-nowrap mr-1 mr-lg-0">${configuration.labelForRefDate}</span>
<span class="small">${refDate.toLocaleDateString('pt-BR', {timeZone: 'UTC'})}</span>
</div>` : ''
let year = (configuration.showYear && validity.canShowYear.state) ? document.content.documentType.contentFields[0].contentFieldValue.data : null
let yearHTML = (year) ? `
<div class="d-flex flex-row flex-lg-column text-lg-right ml-lg-3 mr-md-2 mr-lg-0">
<span class="small font-weight-bold text-nowrap mr-1 mr-lg-0">${configuration.labelForYear}</span>
<span class="small">${year}</span>
</div>` : ''
let hasMetadatas = (year || refDate || dateCreated || dateModified)
let metadataHTML = (hasMetadatas) ? `
<div class="d-flex flex-column flex-md-row">
${yearHTML}
${refDateHTML}
${dateCreatedHTML}
${dateModifiedHTML}
</div>` : ''
let listItemHTML = `
<li class="list-group-item list-group-item-flex align-items-center">
<div class="autofit-col">
<svg class="lexicon-icon text-tertiary lexicon-icon-lg" focusable="false" role="presentation"
viewBox="0 0 512 512">
<use xlink:href="${spritemapBNB}#arquivo-${document.content.fileExtension}" />
</svg>
</div>
<div class="autofit-col autofit-col-expand">
<div class="d-flex flex-column flex-lg-row justify-content-start justify-content-lg-between">
<div class="d-flex flex-column">
<span class="list-group-title">
<a href="${document.content.contentUrl}">${document.title}</a>
</span>
<span class="list-group-subtitle text-uppercase small">
${document.content.fileExtension}, ${Liferay.Util.formatStorage(document.content.sizeInBytes, {addSpaceBeforeSuffix: true})}
</span>
</div>
${metadataHTML}
</div>
</div>
</li>
`
return listItemHTML
}
// renderiza paginação
function renderPaginationBar(page, lastPage, totalCount) {
let paginationBar = getNodeElement(fragmentElement, 'beforeend', 'div', '.pagination-bar')
let lastIndex = (page === lastPage) ? totalCount : configuration.pageSize*page
let nDocuments = (page+1 === lastPage) ? totalCount - configuration.pageSize*page : configuration.pageSize
paginationBar.classList.add('justify-content-center', 'justify-content-lg-between')
let textColor = (configuration.textColor.cssClass) ? `text-${configuration.textColor.cssClass}` : ''
paginationBar.innerHTML = `
<div class="pagination-results mr-0 ${textColor}">Exibindo 1 a ${lastIndex} de ${totalCount} documentos.</div>
<ul class="pagination">
<li class="page-item">
<button class="btn btn-unstyled page-link" type="button">
Exibir mais ${nDocuments} documentos
${renderIcon('angle-down', spritemapClay, 'ml-2')}
</button>
</li>
</ul>
`
let showMoreButton = paginationBar.querySelector('button.page-link')
if (page !== lastPage) {
showMoreButton.addEventListener('click', e => {
showMoreButton.querySelector('svg').remove()
let loadAnimation = getNodeElement(showMoreButton, 'beforeend', 'span', '.loading-animation')
loadAnimation.classList.add('loading-animation-sm', 'ml-2')
fetchDocumentsPage(page+1)
})
} else {
showMoreButton.remove()
}
}
// imprime um mensagem de alerta
function displayAlert(style, title, msg, parentNode, position) {
let styleIcons = {
'danger': 'exclamation-full',
'success': 'check-circle-full',
'info': 'info-circle',
'warning': 'warning-full'
}
let html = `
<div class="alert p-4 alert-${style}" role="alert">
<span class="alert-indicator">
${renderIcon(styleIcons[style], spritemapClay, '')}
</span>
<strong>${title}:</strong>
<p class="mt-2 mb-0">${msg}</p>
</div>
`
parentNode.insertAdjacentHTML(position, html)
}
// limpa mensagens de alerta
function cleanAlerts() {
let alerts = fragmentElement.querySelectorAll('.alert')
alerts.forEach(alert => alert.remove())
}
// imprime icone SGV
function renderIcon(icon, spritemap, cssClasses) {
return `
<svg class="lexicon-icon lexicon-icon-${icon} ${cssClasses}" focusable="false" role="presentation">
<use href="${spritemap}#${icon}"></use>
</svg>
`
}
// retorna/cria um elemento html de uma classe css
// ascendantNode é um nó ascendente
// position é uma string 'beforeend', 'afterbegin' +
// elementType uma string 'ul', 'div' etc
// cssClass é uma classe css
function getNodeElement(ascendantNode, position, elementType, cssClass) {
let nodeElement
if (ascendantNode.querySelector(cssClass)) {
nodeElement = ascendantNode.querySelector(cssClass)
} else {
nodeElement = document.createElement(elementType)
nodeElement = ascendantNode.insertAdjacentElement(position, nodeElement)
nodeElement.classList.add(cssClass.slice(1))
}
return nodeElement
}
// retorna nome amigável do campo usado como 1ª ordenação
function getOrderByFieldName(orderByColumn) {
let regExp = /^ddm__keyword__\d+__(.+)/
let matchExp = regExp.exec(orderByColumn)
return (matchExp) ? matchExp[1] : Liferay.Language.get(orderByColumn)
};}());</script>]]>
|
3373
| <![CDATA[<script id="data_cixx" type="application/json">{"title":"Acordos Coletivos de Trabalho - Contraf","type":0,"typeSettings":{"anyClassTypeDLFileEntryAssetRendererFactory":"47046","orderByColumn1":"ddm__keyword__47047__DataReferência"}}</script>]]>
|
3382
| <![CDATA[<script>(function() {var fragmentElement = document.querySelector('#fragment-2316268-cixx'); var configuration = {"contentSetId":"2705609","showDateConversions":false,"showModifiedDate":true,"showRefDate":false,"textAlign":"left","pageSize":"50","showYear":false,"groupBy":"noGroup","textColor":{"cssClass":"primary","rgbValue":"rgb(122, 18, 44)"},"useTitle":true,"usePagination":false,"bottomSpacing":"3","labelForYear":"Ocorrido em","useContentSetTitle":false,"labelForRefDate":"Referente a","headingLevel":"h3","showCreateDate":true,"activeDebug":false};const editMode = document.body.classList.contains('has-edit-mode-menu')
const apiURL = `${Liferay.ThemeDisplay.getPortalURL()}/o/headless-delivery`
const contentSetsEndPoint = `/v1.0/content-sets/${configuration.contentSetId}/content-set-elements`
const restrictFields = 'title,content.contentUrl,content.dateCreated,content.dateModified,content.documentType,content.fileExtension,content.sizeInBytes'
const params = { fields: restrictFields, 'pageSize': configuration.pageSize, 'page': 1 }
const pathThemeImages = Liferay.ThemeDisplay.getPathThemeImages()
const spritemapBNB = `${pathThemeImages}/bnb/icons.svg`
const spritemapClay = `${pathThemeImages}/clay/icons.svg`
const scriptAssetListJson = fragmentElement.querySelector(`script#data_${fragmentElement.id.slice(-4)}`)
const assetListObject = (scriptAssetListJson) ? JSON.parse(scriptAssetListJson.text) : null
const documentsList = fragmentElement.querySelector('.documents-list')
const loadingAnimation = fragmentElement.querySelector('.loading-animation')
const orderByYearAttrs = ['modifiedDate', 'createDate', 'publishDate', 'ddm__keyword__47047__DataReferência', 'ddm__keyword__47054__Ano']
const orderByMonthYearAttrs = ['modifiedDate', 'createDate', 'publishDate', 'ddm__keyword__47047__DataReferência']
const orderByDayAttrs = ['modifiedDate', 'createDate', 'publishDate', 'ddm__keyword__47047__DataReferência']
const fileEntryTypes = { 'docOrdin': 47046, 'docAnual': 47053 }
const validity = (assetListObject) ? validateConfiguration() : null
validity && init()
// funcao de inicialização
function init() {
fragmentElement.classList.add('mb-4')
editMode && reportConstraints()
fetchDocumentsPage()
}
// constrói um objeto para verificar status de validade de algumas configurações
function validateConfiguration() {
let orderByColumn = assetListObject.typeSettings.orderByColumn1
let orderByColumnName = getOrderByFieldName(orderByColumn)
let canGroupByYear = orderByYearAttrs.includes(orderByColumn)
let canGroupByMonthYear = orderByMonthYearAttrs.includes(orderByColumn)
let canGroupByDay = orderByDayAttrs.includes(orderByColumn)
let canShowRefDate = (assetListObject.typeSettings.anyClassTypeDLFileEntryAssetRendererFactory == fileEntryTypes.docOrdin)
let canShowYear = (assetListObject.typeSettings.anyClassTypeDLFileEntryAssetRendererFactory == fileEntryTypes.docAnual)
let validityState = {
'canGroupByYear': {
'state': canGroupByYear,
'msg' : canGroupByYear ? '' : `A coleção não pode ser agrupada por ano, pois está ordenada por ${orderByColumnName}.`
},
'canGroupByMonthYear': {
'state': canGroupByMonthYear,
'msg' : canGroupByMonthYear ? '' : `A coleção não pode ser agrupada por mês e ano, pois está ordenada por ${orderByColumnName}.`
},
'canGroupByDay': {
'state': canGroupByDay,
'msg' : canGroupByDay ? '' : `A coleção não pode ser agrupada por dia, pois está ordenada por ${orderByColumnName}.`
},
'canShowRefDate': {
'state': canShowRefDate,
'msg' : canShowRefDate ? '' : 'Não é possível mostrar o campo Data de Referência. Esse metadado existe apenas em coleções de Documentos Ordinários.'
},
'canShowYear': {
'state': canShowYear,
'msg' : canShowYear ? '' : 'Não é possível mostrar o campo Ano. Esse metadado existe apenas em coleções de Documentos Anuais.'
}
}
return validityState
}
// alerta sobre restrições na configuração
function reportConstraints() {
cleanAlerts()
// alerta sobre restrições
let validationMessages = []
configuration.groupBy == 'groupByYear' && !validity.canGroupByYear.state && validationMessages.push(validity.canGroupByYear.msg)
configuration.groupBy == 'groupByMonthYear' && !validity.canGroupByMonthYear.state && validationMessages.push(validity.canGroupByMonthYear.msg)
configuration.groupBy == 'groupByDay' && !validity.canGroupByDay.state && validationMessages.push(validity.canGroupByDay.msg)
configuration.showRefDate && !validity.canShowRefDate.state && validationMessages.push(validity.canShowRefDate.msg)
configuration.showYear && !validity.canShowYear.state && validationMessages.push(validity.canShowYear.msg)
validationMessages.length > 0 && displayAlert('danger', 'Configuração inválida', validationMessages.join('<br/>'), documentsList, 'beforebegin')
// debug
if (configuration.activeDebug) {
console.clear()
console.log('Propriedades da Coleção:')
console.log(assetListObject)
console.log('Configuração do Fragmento:')
console.log(configuration)
console.log('Validade da Configuração:')
console.log(validity)
}
}
// principal funcao para pegar os dados
function fetchDocumentsPage(page) {
params.page = (page) ? page : params.page
let request = Liferay.Util.addParams(params, apiURL+contentSetsEndPoint)
fetch(
request,
{
method: 'GET',
headers: {
'Content-Type': 'application/json'
}
}
).then(response => {
if (response.ok) {
return response.json()
}
}).then(documents => {
handleDocuments(documents)
if (editMode && configuration.activeDebug) {
console.log(`Retorno da requisição (page ${params.page}):`)
console.log(documents)
}
})
}
// manipula dados retornados da coleção
function handleDocuments(documents) {
loadingAnimation && loadingAnimation.remove()
if (documents.items.length > 0) {
switch (configuration.groupBy) {
case 'noGroup':
renderDocumentsList(documents)
break
case 'groupByYear':
(validity.canGroupByYear.state) ? renderDocumentsListByGroup(documents) : renderDocumentsList(documents)
break
case 'groupByMonthYear':
(validity.canGroupByMonthYear.state) ? renderDocumentsListByGroup(documents) : renderDocumentsList(documents)
break
case 'groupByDay':
(validity.canGroupByDay.state) ? renderDocumentsListByGroup(documents) : renderDocumentsList(documents)
break
}
configuration.usePagination && renderPaginationBar(documents.page, documents.lastPage, documents.totalCount)
} else {
displayAlert('info', 'Aviso', 'Não foram encontrados documentos', documentsList, 'afterbegin')
}
}
// renderiza lista agrupada
function renderDocumentsListByGroup(documents) {
let lastListGroup = documentsList.querySelector('.list-group:last-child')
let currentGroup = (lastListGroup) ? lastListGroup.dataset.group : 0
configuration.activeDebug
&& configuration.showDateConversions
&& editMode
&& console.log(`Extração do grupo a partir do campo ${getOrderByFieldName(assetListObject.typeSettings.orderByColumn1)}:`)
documents.items.forEach(doc => {
let group = getDocumentGroup(doc)
if (currentGroup != group) {
let listGroup = document.createElement('ul')
listGroup.classList.add('list-group')
listGroup.dataset.group = group
listGroup.setAttribute('aria-label', `${assetListObject.title} de ${group}`)
lastListGroup = documentsList.insertAdjacentElement('beforeend', listGroup)
lastListGroup.insertAdjacentHTML('afterbegin', renderListGroupHeader(group))
currentGroup = group
}
lastListGroup.insertAdjacentHTML('beforeend', renderListGroupItem(doc))
})
}
// extrai e retorna o dado (string) utilizado como agrupador (dia, mês ou ano) a partir do campo utilizado como primeira ordenação da coleção
function getDocumentGroup(document) {
let fieldData
let group
let dateField
let options
let test
let orderByColumn = assetListObject.typeSettings.orderByColumn1
switch (orderByColumn) {
case 'ddm__keyword__47047__DataReferência':
fieldData = document.content.documentType.contentFields[0].contentFieldValue.data
break
case 'ddm__keyword__47054__Ano':
fieldData = document.content.documentType.contentFields[0].contentFieldValue.data
break
case 'modifiedDate':
fieldData = document.content.dateModified
break
case 'createDate':
fieldData = document.content.dateCreated
break
case 'publishDate': // verificar esse caso por que não há uma campo data de publicação em coleções de documentos
fieldData = document.content.dateCreated
break
}
dateField = new Date(fieldData)
switch (configuration.groupBy) {
case 'groupByYear':
test = (orderByColumn == 'ddm__keyword__47047__DataReferência' || orderByColumn == 'ddm__keyword__47054__Ano')
group = test ? dateField.getUTCFullYear() : dateField.getFullYear()
break
case 'groupByMonthYear':
test = (orderByColumn == 'ddm__keyword__47047__DataReferência')
options = test ? {month:'long', year:'numeric', timeZone: 'UTC'} : { month:'long', year:'numeric' }
group = dateField.toLocaleDateString('pt-BR', options)
group = group.charAt(0).toUpperCase() + group.slice(1)
break
case 'groupByDay':
test = (orderByColumn == 'ddm__keyword__47047__DataReferência')
options = test ? {timeZone: 'UTC'} : {}
group = dateField.toLocaleDateString('pt-BR', options)
break
}
configuration.activeDebug && configuration.showDateConversions && editMode && console.log(`${fieldData} --> ${group}`)
return group
}
// renderiza lista comum
function renderDocumentsList(documents) {
let listGroup = getNodeElement(documentsList, 'afterbegin', 'ul', '.list-group')
listGroup.setAttribute('aria-label', assetListObject.title)
documents.items.forEach(doc => {
listGroup.insertAdjacentHTML('beforeend', renderListGroupItem(doc))
})
}
// renderiza cabeçalho da lista
function renderListGroupHeader(title) {
let listHeaderHTML = `
<li class="list-group-header">
<span class="list-group-header-title"><big>${title}</big></span>
</li>
`
return listHeaderHTML
}
// renderiza um item da lista
function renderListGroupItem(document) {
let dateCreated = (configuration.showCreateDate) ? new Date(document.content.dateCreated) : null
let dateCreatedHTML = (dateCreated) ? `
<div class="d-flex flex-row flex-lg-column text-lg-right ml-lg-3 mr-md-2 mr-lg-0">
<span class="small font-weight-bold text-nowrap mr-1 mr-lg-0">Publicado em</span>
<span class="small">${dateCreated.toLocaleDateString('pt-BR')}</span>
</div>` : ''
let dateModified = (configuration.showModifiedDate) ? new Date(document.content.dateModified) : null
let dateModifiedHTML = (dateModified) ? `
<div class="d-flex flex-row flex-lg-column text-lg-right ml-lg-3 mr-md-2 mr-lg-0">
<span class="small font-weight-bold text-nowrap mr-1 mr-lg-0">Atualizado em</span>
<span class="small">${dateModified.toLocaleDateString('pt-BR')}</span>
</div>` : ''
let refDate = (configuration.showRefDate && validity.canShowRefDate.state) ? new Date(document.content.documentType.contentFields[0].contentFieldValue.data) : null
let refDateHTML = (refDate) ? `
<div class="d-flex flex-row flex-lg-column text-lg-right ml-lg-3 mr-md-2 mr-lg-0">
<span class="small font-weight-bold text-nowrap mr-1 mr-lg-0">${configuration.labelForRefDate}</span>
<span class="small">${refDate.toLocaleDateString('pt-BR', {timeZone: 'UTC'})}</span>
</div>` : ''
let year = (configuration.showYear && validity.canShowYear.state) ? document.content.documentType.contentFields[0].contentFieldValue.data : null
let yearHTML = (year) ? `
<div class="d-flex flex-row flex-lg-column text-lg-right ml-lg-3 mr-md-2 mr-lg-0">
<span class="small font-weight-bold text-nowrap mr-1 mr-lg-0">${configuration.labelForYear}</span>
<span class="small">${year}</span>
</div>` : ''
let hasMetadatas = (year || refDate || dateCreated || dateModified)
let metadataHTML = (hasMetadatas) ? `
<div class="d-flex flex-column flex-md-row">
${yearHTML}
${refDateHTML}
${dateCreatedHTML}
${dateModifiedHTML}
</div>` : ''
let listItemHTML = `
<li class="list-group-item list-group-item-flex align-items-center">
<div class="autofit-col">
<svg class="lexicon-icon text-tertiary lexicon-icon-lg" focusable="false" role="presentation"
viewBox="0 0 512 512">
<use xlink:href="${spritemapBNB}#arquivo-${document.content.fileExtension}" />
</svg>
</div>
<div class="autofit-col autofit-col-expand">
<div class="d-flex flex-column flex-lg-row justify-content-start justify-content-lg-between">
<div class="d-flex flex-column">
<span class="list-group-title">
<a href="${document.content.contentUrl}">${document.title}</a>
</span>
<span class="list-group-subtitle text-uppercase small">
${document.content.fileExtension}, ${Liferay.Util.formatStorage(document.content.sizeInBytes, {addSpaceBeforeSuffix: true})}
</span>
</div>
${metadataHTML}
</div>
</div>
</li>
`
return listItemHTML
}
// renderiza paginação
function renderPaginationBar(page, lastPage, totalCount) {
let paginationBar = getNodeElement(fragmentElement, 'beforeend', 'div', '.pagination-bar')
let lastIndex = (page === lastPage) ? totalCount : configuration.pageSize*page
let nDocuments = (page+1 === lastPage) ? totalCount - configuration.pageSize*page : configuration.pageSize
paginationBar.classList.add('justify-content-center', 'justify-content-lg-between')
let textColor = (configuration.textColor.cssClass) ? `text-${configuration.textColor.cssClass}` : ''
paginationBar.innerHTML = `
<div class="pagination-results mr-0 ${textColor}">Exibindo 1 a ${lastIndex} de ${totalCount} documentos.</div>
<ul class="pagination">
<li class="page-item">
<button class="btn btn-unstyled page-link" type="button">
Exibir mais ${nDocuments} documentos
${renderIcon('angle-down', spritemapClay, 'ml-2')}
</button>
</li>
</ul>
`
let showMoreButton = paginationBar.querySelector('button.page-link')
if (page !== lastPage) {
showMoreButton.addEventListener('click', e => {
showMoreButton.querySelector('svg').remove()
let loadAnimation = getNodeElement(showMoreButton, 'beforeend', 'span', '.loading-animation')
loadAnimation.classList.add('loading-animation-sm', 'ml-2')
fetchDocumentsPage(page+1)
})
} else {
showMoreButton.remove()
}
}
// imprime um mensagem de alerta
function displayAlert(style, title, msg, parentNode, position) {
let styleIcons = {
'danger': 'exclamation-full',
'success': 'check-circle-full',
'info': 'info-circle',
'warning': 'warning-full'
}
let html = `
<div class="alert p-4 alert-${style}" role="alert">
<span class="alert-indicator">
${renderIcon(styleIcons[style], spritemapClay, '')}
</span>
<strong>${title}:</strong>
<p class="mt-2 mb-0">${msg}</p>
</div>
`
parentNode.insertAdjacentHTML(position, html)
}
// limpa mensagens de alerta
function cleanAlerts() {
let alerts = fragmentElement.querySelectorAll('.alert')
alerts.forEach(alert => alert.remove())
}
// imprime icone SGV
function renderIcon(icon, spritemap, cssClasses) {
return `
<svg class="lexicon-icon lexicon-icon-${icon} ${cssClasses}" focusable="false" role="presentation">
<use href="${spritemap}#${icon}"></use>
</svg>
`
}
// retorna/cria um elemento html de uma classe css
// ascendantNode é um nó ascendente
// position é uma string 'beforeend', 'afterbegin' +
// elementType uma string 'ul', 'div' etc
// cssClass é uma classe css
function getNodeElement(ascendantNode, position, elementType, cssClass) {
let nodeElement
if (ascendantNode.querySelector(cssClass)) {
nodeElement = ascendantNode.querySelector(cssClass)
} else {
nodeElement = document.createElement(elementType)
nodeElement = ascendantNode.insertAdjacentElement(position, nodeElement)
nodeElement.classList.add(cssClass.slice(1))
}
return nodeElement
}
// retorna nome amigável do campo usado como 1ª ordenação
function getOrderByFieldName(orderByColumn) {
let regExp = /^ddm__keyword__\d+__(.+)/
let matchExp = regExp.exec(orderByColumn)
return (matchExp) ? matchExp[1] : Liferay.Language.get(orderByColumn)
};}());</script>]]>
|
3791
| <![CDATA[<script>(function() {var fragmentElement = document.querySelector('#fragment-0-aymq'); var configuration = {"textAlign":"left","bottomSpacing":"3","headingLevel":"h2","textColor":{"cssClass":"primary","rgbValue":"rgb(122, 18, 44)"}};/**
* Copyright (c) 2000-present Liferay, Inc. All rights reserved.
*
* This library is free software; you can redistribute it and/or modify it under
* the terms of the GNU Lesser General Public License as published by the Free
* Software Foundation; either version 2.1 of the License, or (at your option)
* any later version.
*
* This library is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
* details.
*/;}());</script>]]>
|
3810
| <![CDATA[<script id="data_rpdw" type="application/json">{"title":"Convenções Coletivas de Trabalho - Contec","type":0,"typeSettings":{"anyClassTypeDLFileEntryAssetRendererFactory":"47046","orderByColumn1":"ddm__keyword__47047__DataReferência"}}</script>]]>
|
3819
| <![CDATA[<script>(function() {var fragmentElement = document.querySelector('#fragment-2316268-rpdw'); var configuration = {"contentSetId":"2705611","showDateConversions":false,"showModifiedDate":true,"showRefDate":false,"textAlign":"left","pageSize":"50","showYear":false,"groupBy":"noGroup","textColor":{"cssClass":"primary","rgbValue":"rgb(122, 18, 44)"},"useTitle":true,"usePagination":false,"bottomSpacing":"3","labelForYear":"Ocorrido em","useContentSetTitle":false,"labelForRefDate":"Referente a","headingLevel":"h3","showCreateDate":true,"activeDebug":false};const editMode = document.body.classList.contains('has-edit-mode-menu')
const apiURL = `${Liferay.ThemeDisplay.getPortalURL()}/o/headless-delivery`
const contentSetsEndPoint = `/v1.0/content-sets/${configuration.contentSetId}/content-set-elements`
const restrictFields = 'title,content.contentUrl,content.dateCreated,content.dateModified,content.documentType,content.fileExtension,content.sizeInBytes'
const params = { fields: restrictFields, 'pageSize': configuration.pageSize, 'page': 1 }
const pathThemeImages = Liferay.ThemeDisplay.getPathThemeImages()
const spritemapBNB = `${pathThemeImages}/bnb/icons.svg`
const spritemapClay = `${pathThemeImages}/clay/icons.svg`
const scriptAssetListJson = fragmentElement.querySelector(`script#data_${fragmentElement.id.slice(-4)}`)
const assetListObject = (scriptAssetListJson) ? JSON.parse(scriptAssetListJson.text) : null
const documentsList = fragmentElement.querySelector('.documents-list')
const loadingAnimation = fragmentElement.querySelector('.loading-animation')
const orderByYearAttrs = ['modifiedDate', 'createDate', 'publishDate', 'ddm__keyword__47047__DataReferência', 'ddm__keyword__47054__Ano']
const orderByMonthYearAttrs = ['modifiedDate', 'createDate', 'publishDate', 'ddm__keyword__47047__DataReferência']
const orderByDayAttrs = ['modifiedDate', 'createDate', 'publishDate', 'ddm__keyword__47047__DataReferência']
const fileEntryTypes = { 'docOrdin': 47046, 'docAnual': 47053 }
const validity = (assetListObject) ? validateConfiguration() : null
validity && init()
// funcao de inicialização
function init() {
fragmentElement.classList.add('mb-4')
editMode && reportConstraints()
fetchDocumentsPage()
}
// constrói um objeto para verificar status de validade de algumas configurações
function validateConfiguration() {
let orderByColumn = assetListObject.typeSettings.orderByColumn1
let orderByColumnName = getOrderByFieldName(orderByColumn)
let canGroupByYear = orderByYearAttrs.includes(orderByColumn)
let canGroupByMonthYear = orderByMonthYearAttrs.includes(orderByColumn)
let canGroupByDay = orderByDayAttrs.includes(orderByColumn)
let canShowRefDate = (assetListObject.typeSettings.anyClassTypeDLFileEntryAssetRendererFactory == fileEntryTypes.docOrdin)
let canShowYear = (assetListObject.typeSettings.anyClassTypeDLFileEntryAssetRendererFactory == fileEntryTypes.docAnual)
let validityState = {
'canGroupByYear': {
'state': canGroupByYear,
'msg' : canGroupByYear ? '' : `A coleção não pode ser agrupada por ano, pois está ordenada por ${orderByColumnName}.`
},
'canGroupByMonthYear': {
'state': canGroupByMonthYear,
'msg' : canGroupByMonthYear ? '' : `A coleção não pode ser agrupada por mês e ano, pois está ordenada por ${orderByColumnName}.`
},
'canGroupByDay': {
'state': canGroupByDay,
'msg' : canGroupByDay ? '' : `A coleção não pode ser agrupada por dia, pois está ordenada por ${orderByColumnName}.`
},
'canShowRefDate': {
'state': canShowRefDate,
'msg' : canShowRefDate ? '' : 'Não é possível mostrar o campo Data de Referência. Esse metadado existe apenas em coleções de Documentos Ordinários.'
},
'canShowYear': {
'state': canShowYear,
'msg' : canShowYear ? '' : 'Não é possível mostrar o campo Ano. Esse metadado existe apenas em coleções de Documentos Anuais.'
}
}
return validityState
}
// alerta sobre restrições na configuração
function reportConstraints() {
cleanAlerts()
// alerta sobre restrições
let validationMessages = []
configuration.groupBy == 'groupByYear' && !validity.canGroupByYear.state && validationMessages.push(validity.canGroupByYear.msg)
configuration.groupBy == 'groupByMonthYear' && !validity.canGroupByMonthYear.state && validationMessages.push(validity.canGroupByMonthYear.msg)
configuration.groupBy == 'groupByDay' && !validity.canGroupByDay.state && validationMessages.push(validity.canGroupByDay.msg)
configuration.showRefDate && !validity.canShowRefDate.state && validationMessages.push(validity.canShowRefDate.msg)
configuration.showYear && !validity.canShowYear.state && validationMessages.push(validity.canShowYear.msg)
validationMessages.length > 0 && displayAlert('danger', 'Configuração inválida', validationMessages.join('<br/>'), documentsList, 'beforebegin')
// debug
if (configuration.activeDebug) {
console.clear()
console.log('Propriedades da Coleção:')
console.log(assetListObject)
console.log('Configuração do Fragmento:')
console.log(configuration)
console.log('Validade da Configuração:')
console.log(validity)
}
}
// principal funcao para pegar os dados
function fetchDocumentsPage(page) {
params.page = (page) ? page : params.page
let request = Liferay.Util.addParams(params, apiURL+contentSetsEndPoint)
fetch(
request,
{
method: 'GET',
headers: {
'Content-Type': 'application/json'
}
}
).then(response => {
if (response.ok) {
return response.json()
}
}).then(documents => {
handleDocuments(documents)
if (editMode && configuration.activeDebug) {
console.log(`Retorno da requisição (page ${params.page}):`)
console.log(documents)
}
})
}
// manipula dados retornados da coleção
function handleDocuments(documents) {
loadingAnimation && loadingAnimation.remove()
if (documents.items.length > 0) {
switch (configuration.groupBy) {
case 'noGroup':
renderDocumentsList(documents)
break
case 'groupByYear':
(validity.canGroupByYear.state) ? renderDocumentsListByGroup(documents) : renderDocumentsList(documents)
break
case 'groupByMonthYear':
(validity.canGroupByMonthYear.state) ? renderDocumentsListByGroup(documents) : renderDocumentsList(documents)
break
case 'groupByDay':
(validity.canGroupByDay.state) ? renderDocumentsListByGroup(documents) : renderDocumentsList(documents)
break
}
configuration.usePagination && renderPaginationBar(documents.page, documents.lastPage, documents.totalCount)
} else {
displayAlert('info', 'Aviso', 'Não foram encontrados documentos', documentsList, 'afterbegin')
}
}
// renderiza lista agrupada
function renderDocumentsListByGroup(documents) {
let lastListGroup = documentsList.querySelector('.list-group:last-child')
let currentGroup = (lastListGroup) ? lastListGroup.dataset.group : 0
configuration.activeDebug
&& configuration.showDateConversions
&& editMode
&& console.log(`Extração do grupo a partir do campo ${getOrderByFieldName(assetListObject.typeSettings.orderByColumn1)}:`)
documents.items.forEach(doc => {
let group = getDocumentGroup(doc)
if (currentGroup != group) {
let listGroup = document.createElement('ul')
listGroup.classList.add('list-group')
listGroup.dataset.group = group
listGroup.setAttribute('aria-label', `${assetListObject.title} de ${group}`)
lastListGroup = documentsList.insertAdjacentElement('beforeend', listGroup)
lastListGroup.insertAdjacentHTML('afterbegin', renderListGroupHeader(group))
currentGroup = group
}
lastListGroup.insertAdjacentHTML('beforeend', renderListGroupItem(doc))
})
}
// extrai e retorna o dado (string) utilizado como agrupador (dia, mês ou ano) a partir do campo utilizado como primeira ordenação da coleção
function getDocumentGroup(document) {
let fieldData
let group
let dateField
let options
let test
let orderByColumn = assetListObject.typeSettings.orderByColumn1
switch (orderByColumn) {
case 'ddm__keyword__47047__DataReferência':
fieldData = document.content.documentType.contentFields[0].contentFieldValue.data
break
case 'ddm__keyword__47054__Ano':
fieldData = document.content.documentType.contentFields[0].contentFieldValue.data
break
case 'modifiedDate':
fieldData = document.content.dateModified
break
case 'createDate':
fieldData = document.content.dateCreated
break
case 'publishDate': // verificar esse caso por que não há uma campo data de publicação em coleções de documentos
fieldData = document.content.dateCreated
break
}
dateField = new Date(fieldData)
switch (configuration.groupBy) {
case 'groupByYear':
test = (orderByColumn == 'ddm__keyword__47047__DataReferência' || orderByColumn == 'ddm__keyword__47054__Ano')
group = test ? dateField.getUTCFullYear() : dateField.getFullYear()
break
case 'groupByMonthYear':
test = (orderByColumn == 'ddm__keyword__47047__DataReferência')
options = test ? {month:'long', year:'numeric', timeZone: 'UTC'} : { month:'long', year:'numeric' }
group = dateField.toLocaleDateString('pt-BR', options)
group = group.charAt(0).toUpperCase() + group.slice(1)
break
case 'groupByDay':
test = (orderByColumn == 'ddm__keyword__47047__DataReferência')
options = test ? {timeZone: 'UTC'} : {}
group = dateField.toLocaleDateString('pt-BR', options)
break
}
configuration.activeDebug && configuration.showDateConversions && editMode && console.log(`${fieldData} --> ${group}`)
return group
}
// renderiza lista comum
function renderDocumentsList(documents) {
let listGroup = getNodeElement(documentsList, 'afterbegin', 'ul', '.list-group')
listGroup.setAttribute('aria-label', assetListObject.title)
documents.items.forEach(doc => {
listGroup.insertAdjacentHTML('beforeend', renderListGroupItem(doc))
})
}
// renderiza cabeçalho da lista
function renderListGroupHeader(title) {
let listHeaderHTML = `
<li class="list-group-header">
<span class="list-group-header-title"><big>${title}</big></span>
</li>
`
return listHeaderHTML
}
// renderiza um item da lista
function renderListGroupItem(document) {
let dateCreated = (configuration.showCreateDate) ? new Date(document.content.dateCreated) : null
let dateCreatedHTML = (dateCreated) ? `
<div class="d-flex flex-row flex-lg-column text-lg-right ml-lg-3 mr-md-2 mr-lg-0">
<span class="small font-weight-bold text-nowrap mr-1 mr-lg-0">Publicado em</span>
<span class="small">${dateCreated.toLocaleDateString('pt-BR')}</span>
</div>` : ''
let dateModified = (configuration.showModifiedDate) ? new Date(document.content.dateModified) : null
let dateModifiedHTML = (dateModified) ? `
<div class="d-flex flex-row flex-lg-column text-lg-right ml-lg-3 mr-md-2 mr-lg-0">
<span class="small font-weight-bold text-nowrap mr-1 mr-lg-0">Atualizado em</span>
<span class="small">${dateModified.toLocaleDateString('pt-BR')}</span>
</div>` : ''
let refDate = (configuration.showRefDate && validity.canShowRefDate.state) ? new Date(document.content.documentType.contentFields[0].contentFieldValue.data) : null
let refDateHTML = (refDate) ? `
<div class="d-flex flex-row flex-lg-column text-lg-right ml-lg-3 mr-md-2 mr-lg-0">
<span class="small font-weight-bold text-nowrap mr-1 mr-lg-0">${configuration.labelForRefDate}</span>
<span class="small">${refDate.toLocaleDateString('pt-BR', {timeZone: 'UTC'})}</span>
</div>` : ''
let year = (configuration.showYear && validity.canShowYear.state) ? document.content.documentType.contentFields[0].contentFieldValue.data : null
let yearHTML = (year) ? `
<div class="d-flex flex-row flex-lg-column text-lg-right ml-lg-3 mr-md-2 mr-lg-0">
<span class="small font-weight-bold text-nowrap mr-1 mr-lg-0">${configuration.labelForYear}</span>
<span class="small">${year}</span>
</div>` : ''
let hasMetadatas = (year || refDate || dateCreated || dateModified)
let metadataHTML = (hasMetadatas) ? `
<div class="d-flex flex-column flex-md-row">
${yearHTML}
${refDateHTML}
${dateCreatedHTML}
${dateModifiedHTML}
</div>` : ''
let listItemHTML = `
<li class="list-group-item list-group-item-flex align-items-center">
<div class="autofit-col">
<svg class="lexicon-icon text-tertiary lexicon-icon-lg" focusable="false" role="presentation"
viewBox="0 0 512 512">
<use xlink:href="${spritemapBNB}#arquivo-${document.content.fileExtension}" />
</svg>
</div>
<div class="autofit-col autofit-col-expand">
<div class="d-flex flex-column flex-lg-row justify-content-start justify-content-lg-between">
<div class="d-flex flex-column">
<span class="list-group-title">
<a href="${document.content.contentUrl}">${document.title}</a>
</span>
<span class="list-group-subtitle text-uppercase small">
${document.content.fileExtension}, ${Liferay.Util.formatStorage(document.content.sizeInBytes, {addSpaceBeforeSuffix: true})}
</span>
</div>
${metadataHTML}
</div>
</div>
</li>
`
return listItemHTML
}
// renderiza paginação
function renderPaginationBar(page, lastPage, totalCount) {
let paginationBar = getNodeElement(fragmentElement, 'beforeend', 'div', '.pagination-bar')
let lastIndex = (page === lastPage) ? totalCount : configuration.pageSize*page
let nDocuments = (page+1 === lastPage) ? totalCount - configuration.pageSize*page : configuration.pageSize
paginationBar.classList.add('justify-content-center', 'justify-content-lg-between')
let textColor = (configuration.textColor.cssClass) ? `text-${configuration.textColor.cssClass}` : ''
paginationBar.innerHTML = `
<div class="pagination-results mr-0 ${textColor}">Exibindo 1 a ${lastIndex} de ${totalCount} documentos.</div>
<ul class="pagination">
<li class="page-item">
<button class="btn btn-unstyled page-link" type="button">
Exibir mais ${nDocuments} documentos
${renderIcon('angle-down', spritemapClay, 'ml-2')}
</button>
</li>
</ul>
`
let showMoreButton = paginationBar.querySelector('button.page-link')
if (page !== lastPage) {
showMoreButton.addEventListener('click', e => {
showMoreButton.querySelector('svg').remove()
let loadAnimation = getNodeElement(showMoreButton, 'beforeend', 'span', '.loading-animation')
loadAnimation.classList.add('loading-animation-sm', 'ml-2')
fetchDocumentsPage(page+1)
})
} else {
showMoreButton.remove()
}
}
// imprime um mensagem de alerta
function displayAlert(style, title, msg, parentNode, position) {
let styleIcons = {
'danger': 'exclamation-full',
'success': 'check-circle-full',
'info': 'info-circle',
'warning': 'warning-full'
}
let html = `
<div class="alert p-4 alert-${style}" role="alert">
<span class="alert-indicator">
${renderIcon(styleIcons[style], spritemapClay, '')}
</span>
<strong>${title}:</strong>
<p class="mt-2 mb-0">${msg}</p>
</div>
`
parentNode.insertAdjacentHTML(position, html)
}
// limpa mensagens de alerta
function cleanAlerts() {
let alerts = fragmentElement.querySelectorAll('.alert')
alerts.forEach(alert => alert.remove())
}
// imprime icone SGV
function renderIcon(icon, spritemap, cssClasses) {
return `
<svg class="lexicon-icon lexicon-icon-${icon} ${cssClasses}" focusable="false" role="presentation">
<use href="${spritemap}#${icon}"></use>
</svg>
`
}
// retorna/cria um elemento html de uma classe css
// ascendantNode é um nó ascendente
// position é uma string 'beforeend', 'afterbegin' +
// elementType uma string 'ul', 'div' etc
// cssClass é uma classe css
function getNodeElement(ascendantNode, position, elementType, cssClass) {
let nodeElement
if (ascendantNode.querySelector(cssClass)) {
nodeElement = ascendantNode.querySelector(cssClass)
} else {
nodeElement = document.createElement(elementType)
nodeElement = ascendantNode.insertAdjacentElement(position, nodeElement)
nodeElement.classList.add(cssClass.slice(1))
}
return nodeElement
}
// retorna nome amigável do campo usado como 1ª ordenação
function getOrderByFieldName(orderByColumn) {
let regExp = /^ddm__keyword__\d+__(.+)/
let matchExp = regExp.exec(orderByColumn)
return (matchExp) ? matchExp[1] : Liferay.Language.get(orderByColumn)
};}());</script>]]>
|
4201
| <![CDATA[<script id="data_cjar" type="application/json">{"title":"Convenções Coletivas de Trabalho - Contraf","type":0,"typeSettings":{"anyClassTypeDLFileEntryAssetRendererFactory":"47046","orderByColumn1":"ddm__keyword__47047__DataReferência"}}</script>]]>
|
4210
| <![CDATA[<script>(function() {var fragmentElement = document.querySelector('#fragment-2316268-cjar'); var configuration = {"contentSetId":"2705613","showDateConversions":false,"showModifiedDate":true,"showRefDate":false,"textAlign":"left","pageSize":"50","showYear":false,"groupBy":"noGroup","textColor":{"cssClass":"primary","rgbValue":"rgb(122, 18, 44)"},"useTitle":true,"usePagination":false,"bottomSpacing":"3","labelForYear":"Ocorrido em","useContentSetTitle":false,"labelForRefDate":"Referente a","headingLevel":"h3","showCreateDate":true,"activeDebug":false};const editMode = document.body.classList.contains('has-edit-mode-menu')
const apiURL = `${Liferay.ThemeDisplay.getPortalURL()}/o/headless-delivery`
const contentSetsEndPoint = `/v1.0/content-sets/${configuration.contentSetId}/content-set-elements`
const restrictFields = 'title,content.contentUrl,content.dateCreated,content.dateModified,content.documentType,content.fileExtension,content.sizeInBytes'
const params = { fields: restrictFields, 'pageSize': configuration.pageSize, 'page': 1 }
const pathThemeImages = Liferay.ThemeDisplay.getPathThemeImages()
const spritemapBNB = `${pathThemeImages}/bnb/icons.svg`
const spritemapClay = `${pathThemeImages}/clay/icons.svg`
const scriptAssetListJson = fragmentElement.querySelector(`script#data_${fragmentElement.id.slice(-4)}`)
const assetListObject = (scriptAssetListJson) ? JSON.parse(scriptAssetListJson.text) : null
const documentsList = fragmentElement.querySelector('.documents-list')
const loadingAnimation = fragmentElement.querySelector('.loading-animation')
const orderByYearAttrs = ['modifiedDate', 'createDate', 'publishDate', 'ddm__keyword__47047__DataReferência', 'ddm__keyword__47054__Ano']
const orderByMonthYearAttrs = ['modifiedDate', 'createDate', 'publishDate', 'ddm__keyword__47047__DataReferência']
const orderByDayAttrs = ['modifiedDate', 'createDate', 'publishDate', 'ddm__keyword__47047__DataReferência']
const fileEntryTypes = { 'docOrdin': 47046, 'docAnual': 47053 }
const validity = (assetListObject) ? validateConfiguration() : null
validity && init()
// funcao de inicialização
function init() {
fragmentElement.classList.add('mb-4')
editMode && reportConstraints()
fetchDocumentsPage()
}
// constrói um objeto para verificar status de validade de algumas configurações
function validateConfiguration() {
let orderByColumn = assetListObject.typeSettings.orderByColumn1
let orderByColumnName = getOrderByFieldName(orderByColumn)
let canGroupByYear = orderByYearAttrs.includes(orderByColumn)
let canGroupByMonthYear = orderByMonthYearAttrs.includes(orderByColumn)
let canGroupByDay = orderByDayAttrs.includes(orderByColumn)
let canShowRefDate = (assetListObject.typeSettings.anyClassTypeDLFileEntryAssetRendererFactory == fileEntryTypes.docOrdin)
let canShowYear = (assetListObject.typeSettings.anyClassTypeDLFileEntryAssetRendererFactory == fileEntryTypes.docAnual)
let validityState = {
'canGroupByYear': {
'state': canGroupByYear,
'msg' : canGroupByYear ? '' : `A coleção não pode ser agrupada por ano, pois está ordenada por ${orderByColumnName}.`
},
'canGroupByMonthYear': {
'state': canGroupByMonthYear,
'msg' : canGroupByMonthYear ? '' : `A coleção não pode ser agrupada por mês e ano, pois está ordenada por ${orderByColumnName}.`
},
'canGroupByDay': {
'state': canGroupByDay,
'msg' : canGroupByDay ? '' : `A coleção não pode ser agrupada por dia, pois está ordenada por ${orderByColumnName}.`
},
'canShowRefDate': {
'state': canShowRefDate,
'msg' : canShowRefDate ? '' : 'Não é possível mostrar o campo Data de Referência. Esse metadado existe apenas em coleções de Documentos Ordinários.'
},
'canShowYear': {
'state': canShowYear,
'msg' : canShowYear ? '' : 'Não é possível mostrar o campo Ano. Esse metadado existe apenas em coleções de Documentos Anuais.'
}
}
return validityState
}
// alerta sobre restrições na configuração
function reportConstraints() {
cleanAlerts()
// alerta sobre restrições
let validationMessages = []
configuration.groupBy == 'groupByYear' && !validity.canGroupByYear.state && validationMessages.push(validity.canGroupByYear.msg)
configuration.groupBy == 'groupByMonthYear' && !validity.canGroupByMonthYear.state && validationMessages.push(validity.canGroupByMonthYear.msg)
configuration.groupBy == 'groupByDay' && !validity.canGroupByDay.state && validationMessages.push(validity.canGroupByDay.msg)
configuration.showRefDate && !validity.canShowRefDate.state && validationMessages.push(validity.canShowRefDate.msg)
configuration.showYear && !validity.canShowYear.state && validationMessages.push(validity.canShowYear.msg)
validationMessages.length > 0 && displayAlert('danger', 'Configuração inválida', validationMessages.join('<br/>'), documentsList, 'beforebegin')
// debug
if (configuration.activeDebug) {
console.clear()
console.log('Propriedades da Coleção:')
console.log(assetListObject)
console.log('Configuração do Fragmento:')
console.log(configuration)
console.log('Validade da Configuração:')
console.log(validity)
}
}
// principal funcao para pegar os dados
function fetchDocumentsPage(page) {
params.page = (page) ? page : params.page
let request = Liferay.Util.addParams(params, apiURL+contentSetsEndPoint)
fetch(
request,
{
method: 'GET',
headers: {
'Content-Type': 'application/json'
}
}
).then(response => {
if (response.ok) {
return response.json()
}
}).then(documents => {
handleDocuments(documents)
if (editMode && configuration.activeDebug) {
console.log(`Retorno da requisição (page ${params.page}):`)
console.log(documents)
}
})
}
// manipula dados retornados da coleção
function handleDocuments(documents) {
loadingAnimation && loadingAnimation.remove()
if (documents.items.length > 0) {
switch (configuration.groupBy) {
case 'noGroup':
renderDocumentsList(documents)
break
case 'groupByYear':
(validity.canGroupByYear.state) ? renderDocumentsListByGroup(documents) : renderDocumentsList(documents)
break
case 'groupByMonthYear':
(validity.canGroupByMonthYear.state) ? renderDocumentsListByGroup(documents) : renderDocumentsList(documents)
break
case 'groupByDay':
(validity.canGroupByDay.state) ? renderDocumentsListByGroup(documents) : renderDocumentsList(documents)
break
}
configuration.usePagination && renderPaginationBar(documents.page, documents.lastPage, documents.totalCount)
} else {
displayAlert('info', 'Aviso', 'Não foram encontrados documentos', documentsList, 'afterbegin')
}
}
// renderiza lista agrupada
function renderDocumentsListByGroup(documents) {
let lastListGroup = documentsList.querySelector('.list-group:last-child')
let currentGroup = (lastListGroup) ? lastListGroup.dataset.group : 0
configuration.activeDebug
&& configuration.showDateConversions
&& editMode
&& console.log(`Extração do grupo a partir do campo ${getOrderByFieldName(assetListObject.typeSettings.orderByColumn1)}:`)
documents.items.forEach(doc => {
let group = getDocumentGroup(doc)
if (currentGroup != group) {
let listGroup = document.createElement('ul')
listGroup.classList.add('list-group')
listGroup.dataset.group = group
listGroup.setAttribute('aria-label', `${assetListObject.title} de ${group}`)
lastListGroup = documentsList.insertAdjacentElement('beforeend', listGroup)
lastListGroup.insertAdjacentHTML('afterbegin', renderListGroupHeader(group))
currentGroup = group
}
lastListGroup.insertAdjacentHTML('beforeend', renderListGroupItem(doc))
})
}
// extrai e retorna o dado (string) utilizado como agrupador (dia, mês ou ano) a partir do campo utilizado como primeira ordenação da coleção
function getDocumentGroup(document) {
let fieldData
let group
let dateField
let options
let test
let orderByColumn = assetListObject.typeSettings.orderByColumn1
switch (orderByColumn) {
case 'ddm__keyword__47047__DataReferência':
fieldData = document.content.documentType.contentFields[0].contentFieldValue.data
break
case 'ddm__keyword__47054__Ano':
fieldData = document.content.documentType.contentFields[0].contentFieldValue.data
break
case 'modifiedDate':
fieldData = document.content.dateModified
break
case 'createDate':
fieldData = document.content.dateCreated
break
case 'publishDate': // verificar esse caso por que não há uma campo data de publicação em coleções de documentos
fieldData = document.content.dateCreated
break
}
dateField = new Date(fieldData)
switch (configuration.groupBy) {
case 'groupByYear':
test = (orderByColumn == 'ddm__keyword__47047__DataReferência' || orderByColumn == 'ddm__keyword__47054__Ano')
group = test ? dateField.getUTCFullYear() : dateField.getFullYear()
break
case 'groupByMonthYear':
test = (orderByColumn == 'ddm__keyword__47047__DataReferência')
options = test ? {month:'long', year:'numeric', timeZone: 'UTC'} : { month:'long', year:'numeric' }
group = dateField.toLocaleDateString('pt-BR', options)
group = group.charAt(0).toUpperCase() + group.slice(1)
break
case 'groupByDay':
test = (orderByColumn == 'ddm__keyword__47047__DataReferência')
options = test ? {timeZone: 'UTC'} : {}
group = dateField.toLocaleDateString('pt-BR', options)
break
}
configuration.activeDebug && configuration.showDateConversions && editMode && console.log(`${fieldData} --> ${group}`)
return group
}
// renderiza lista comum
function renderDocumentsList(documents) {
let listGroup = getNodeElement(documentsList, 'afterbegin', 'ul', '.list-group')
listGroup.setAttribute('aria-label', assetListObject.title)
documents.items.forEach(doc => {
listGroup.insertAdjacentHTML('beforeend', renderListGroupItem(doc))
})
}
// renderiza cabeçalho da lista
function renderListGroupHeader(title) {
let listHeaderHTML = `
<li class="list-group-header">
<span class="list-group-header-title"><big>${title}</big></span>
</li>
`
return listHeaderHTML
}
// renderiza um item da lista
function renderListGroupItem(document) {
let dateCreated = (configuration.showCreateDate) ? new Date(document.content.dateCreated) : null
let dateCreatedHTML = (dateCreated) ? `
<div class="d-flex flex-row flex-lg-column text-lg-right ml-lg-3 mr-md-2 mr-lg-0">
<span class="small font-weight-bold text-nowrap mr-1 mr-lg-0">Publicado em</span>
<span class="small">${dateCreated.toLocaleDateString('pt-BR')}</span>
</div>` : ''
let dateModified = (configuration.showModifiedDate) ? new Date(document.content.dateModified) : null
let dateModifiedHTML = (dateModified) ? `
<div class="d-flex flex-row flex-lg-column text-lg-right ml-lg-3 mr-md-2 mr-lg-0">
<span class="small font-weight-bold text-nowrap mr-1 mr-lg-0">Atualizado em</span>
<span class="small">${dateModified.toLocaleDateString('pt-BR')}</span>
</div>` : ''
let refDate = (configuration.showRefDate && validity.canShowRefDate.state) ? new Date(document.content.documentType.contentFields[0].contentFieldValue.data) : null
let refDateHTML = (refDate) ? `
<div class="d-flex flex-row flex-lg-column text-lg-right ml-lg-3 mr-md-2 mr-lg-0">
<span class="small font-weight-bold text-nowrap mr-1 mr-lg-0">${configuration.labelForRefDate}</span>
<span class="small">${refDate.toLocaleDateString('pt-BR', {timeZone: 'UTC'})}</span>
</div>` : ''
let year = (configuration.showYear && validity.canShowYear.state) ? document.content.documentType.contentFields[0].contentFieldValue.data : null
let yearHTML = (year) ? `
<div class="d-flex flex-row flex-lg-column text-lg-right ml-lg-3 mr-md-2 mr-lg-0">
<span class="small font-weight-bold text-nowrap mr-1 mr-lg-0">${configuration.labelForYear}</span>
<span class="small">${year}</span>
</div>` : ''
let hasMetadatas = (year || refDate || dateCreated || dateModified)
let metadataHTML = (hasMetadatas) ? `
<div class="d-flex flex-column flex-md-row">
${yearHTML}
${refDateHTML}
${dateCreatedHTML}
${dateModifiedHTML}
</div>` : ''
let listItemHTML = `
<li class="list-group-item list-group-item-flex align-items-center">
<div class="autofit-col">
<svg class="lexicon-icon text-tertiary lexicon-icon-lg" focusable="false" role="presentation"
viewBox="0 0 512 512">
<use xlink:href="${spritemapBNB}#arquivo-${document.content.fileExtension}" />
</svg>
</div>
<div class="autofit-col autofit-col-expand">
<div class="d-flex flex-column flex-lg-row justify-content-start justify-content-lg-between">
<div class="d-flex flex-column">
<span class="list-group-title">
<a href="${document.content.contentUrl}">${document.title}</a>
</span>
<span class="list-group-subtitle text-uppercase small">
${document.content.fileExtension}, ${Liferay.Util.formatStorage(document.content.sizeInBytes, {addSpaceBeforeSuffix: true})}
</span>
</div>
${metadataHTML}
</div>
</div>
</li>
`
return listItemHTML
}
// renderiza paginação
function renderPaginationBar(page, lastPage, totalCount) {
let paginationBar = getNodeElement(fragmentElement, 'beforeend', 'div', '.pagination-bar')
let lastIndex = (page === lastPage) ? totalCount : configuration.pageSize*page
let nDocuments = (page+1 === lastPage) ? totalCount - configuration.pageSize*page : configuration.pageSize
paginationBar.classList.add('justify-content-center', 'justify-content-lg-between')
let textColor = (configuration.textColor.cssClass) ? `text-${configuration.textColor.cssClass}` : ''
paginationBar.innerHTML = `
<div class="pagination-results mr-0 ${textColor}">Exibindo 1 a ${lastIndex} de ${totalCount} documentos.</div>
<ul class="pagination">
<li class="page-item">
<button class="btn btn-unstyled page-link" type="button">
Exibir mais ${nDocuments} documentos
${renderIcon('angle-down', spritemapClay, 'ml-2')}
</button>
</li>
</ul>
`
let showMoreButton = paginationBar.querySelector('button.page-link')
if (page !== lastPage) {
showMoreButton.addEventListener('click', e => {
showMoreButton.querySelector('svg').remove()
let loadAnimation = getNodeElement(showMoreButton, 'beforeend', 'span', '.loading-animation')
loadAnimation.classList.add('loading-animation-sm', 'ml-2')
fetchDocumentsPage(page+1)
})
} else {
showMoreButton.remove()
}
}
// imprime um mensagem de alerta
function displayAlert(style, title, msg, parentNode, position) {
let styleIcons = {
'danger': 'exclamation-full',
'success': 'check-circle-full',
'info': 'info-circle',
'warning': 'warning-full'
}
let html = `
<div class="alert p-4 alert-${style}" role="alert">
<span class="alert-indicator">
${renderIcon(styleIcons[style], spritemapClay, '')}
</span>
<strong>${title}:</strong>
<p class="mt-2 mb-0">${msg}</p>
</div>
`
parentNode.insertAdjacentHTML(position, html)
}
// limpa mensagens de alerta
function cleanAlerts() {
let alerts = fragmentElement.querySelectorAll('.alert')
alerts.forEach(alert => alert.remove())
}
// imprime icone SGV
function renderIcon(icon, spritemap, cssClasses) {
return `
<svg class="lexicon-icon lexicon-icon-${icon} ${cssClasses}" focusable="false" role="presentation">
<use href="${spritemap}#${icon}"></use>
</svg>
`
}
// retorna/cria um elemento html de uma classe css
// ascendantNode é um nó ascendente
// position é uma string 'beforeend', 'afterbegin' +
// elementType uma string 'ul', 'div' etc
// cssClass é uma classe css
function getNodeElement(ascendantNode, position, elementType, cssClass) {
let nodeElement
if (ascendantNode.querySelector(cssClass)) {
nodeElement = ascendantNode.querySelector(cssClass)
} else {
nodeElement = document.createElement(elementType)
nodeElement = ascendantNode.insertAdjacentElement(position, nodeElement)
nodeElement.classList.add(cssClass.slice(1))
}
return nodeElement
}
// retorna nome amigável do campo usado como 1ª ordenação
function getOrderByFieldName(orderByColumn) {
let regExp = /^ddm__keyword__\d+__(.+)/
let matchExp = regExp.exec(orderByColumn)
return (matchExp) ? matchExp[1] : Liferay.Language.get(orderByColumn)
};}());</script>]]>
|
4620
| <![CDATA[<script id="data_pbno" type="application/json">{"title":"Seleção de Estagiários 2018","type":0,"typeSettings":{"anyClassTypeDLFileEntryAssetRendererFactory":"47046","orderByColumn1":"modifiedDate"}}</script>]]>
|
4629
| <![CDATA[<script>(function() {var fragmentElement = document.querySelector('#fragment-2316268-pbno'); var configuration = {"contentSetId":"2715708","showDateConversions":false,"showModifiedDate":true,"showRefDate":false,"textAlign":"left","pageSize":"50","showYear":false,"groupBy":"noGroup","textColor":{"cssClass":"","rgbValue":""},"useTitle":true,"usePagination":false,"bottomSpacing":"3","labelForYear":"Ocorrido em","useContentSetTitle":true,"labelForRefDate":"Referente a","headingLevel":"h2","showCreateDate":true,"activeDebug":false};const editMode = document.body.classList.contains('has-edit-mode-menu')
const apiURL = `${Liferay.ThemeDisplay.getPortalURL()}/o/headless-delivery`
const contentSetsEndPoint = `/v1.0/content-sets/${configuration.contentSetId}/content-set-elements`
const restrictFields = 'title,content.contentUrl,content.dateCreated,content.dateModified,content.documentType,content.fileExtension,content.sizeInBytes'
const params = { fields: restrictFields, 'pageSize': configuration.pageSize, 'page': 1 }
const pathThemeImages = Liferay.ThemeDisplay.getPathThemeImages()
const spritemapBNB = `${pathThemeImages}/bnb/icons.svg`
const spritemapClay = `${pathThemeImages}/clay/icons.svg`
const scriptAssetListJson = fragmentElement.querySelector(`script#data_${fragmentElement.id.slice(-4)}`)
const assetListObject = (scriptAssetListJson) ? JSON.parse(scriptAssetListJson.text) : null
const documentsList = fragmentElement.querySelector('.documents-list')
const loadingAnimation = fragmentElement.querySelector('.loading-animation')
const orderByYearAttrs = ['modifiedDate', 'createDate', 'publishDate', 'ddm__keyword__47047__DataReferência', 'ddm__keyword__47054__Ano']
const orderByMonthYearAttrs = ['modifiedDate', 'createDate', 'publishDate', 'ddm__keyword__47047__DataReferência']
const orderByDayAttrs = ['modifiedDate', 'createDate', 'publishDate', 'ddm__keyword__47047__DataReferência']
const fileEntryTypes = { 'docOrdin': 47046, 'docAnual': 47053 }
const validity = (assetListObject) ? validateConfiguration() : null
validity && init()
// funcao de inicialização
function init() {
fragmentElement.classList.add('mb-4')
editMode && reportConstraints()
fetchDocumentsPage()
}
// constrói um objeto para verificar status de validade de algumas configurações
function validateConfiguration() {
let orderByColumn = assetListObject.typeSettings.orderByColumn1
let orderByColumnName = getOrderByFieldName(orderByColumn)
let canGroupByYear = orderByYearAttrs.includes(orderByColumn)
let canGroupByMonthYear = orderByMonthYearAttrs.includes(orderByColumn)
let canGroupByDay = orderByDayAttrs.includes(orderByColumn)
let canShowRefDate = (assetListObject.typeSettings.anyClassTypeDLFileEntryAssetRendererFactory == fileEntryTypes.docOrdin)
let canShowYear = (assetListObject.typeSettings.anyClassTypeDLFileEntryAssetRendererFactory == fileEntryTypes.docAnual)
let validityState = {
'canGroupByYear': {
'state': canGroupByYear,
'msg' : canGroupByYear ? '' : `A coleção não pode ser agrupada por ano, pois está ordenada por ${orderByColumnName}.`
},
'canGroupByMonthYear': {
'state': canGroupByMonthYear,
'msg' : canGroupByMonthYear ? '' : `A coleção não pode ser agrupada por mês e ano, pois está ordenada por ${orderByColumnName}.`
},
'canGroupByDay': {
'state': canGroupByDay,
'msg' : canGroupByDay ? '' : `A coleção não pode ser agrupada por dia, pois está ordenada por ${orderByColumnName}.`
},
'canShowRefDate': {
'state': canShowRefDate,
'msg' : canShowRefDate ? '' : 'Não é possível mostrar o campo Data de Referência. Esse metadado existe apenas em coleções de Documentos Ordinários.'
},
'canShowYear': {
'state': canShowYear,
'msg' : canShowYear ? '' : 'Não é possível mostrar o campo Ano. Esse metadado existe apenas em coleções de Documentos Anuais.'
}
}
return validityState
}
// alerta sobre restrições na configuração
function reportConstraints() {
cleanAlerts()
// alerta sobre restrições
let validationMessages = []
configuration.groupBy == 'groupByYear' && !validity.canGroupByYear.state && validationMessages.push(validity.canGroupByYear.msg)
configuration.groupBy == 'groupByMonthYear' && !validity.canGroupByMonthYear.state && validationMessages.push(validity.canGroupByMonthYear.msg)
configuration.groupBy == 'groupByDay' && !validity.canGroupByDay.state && validationMessages.push(validity.canGroupByDay.msg)
configuration.showRefDate && !validity.canShowRefDate.state && validationMessages.push(validity.canShowRefDate.msg)
configuration.showYear && !validity.canShowYear.state && validationMessages.push(validity.canShowYear.msg)
validationMessages.length > 0 && displayAlert('danger', 'Configuração inválida', validationMessages.join('<br/>'), documentsList, 'beforebegin')
// debug
if (configuration.activeDebug) {
console.clear()
console.log('Propriedades da Coleção:')
console.log(assetListObject)
console.log('Configuração do Fragmento:')
console.log(configuration)
console.log('Validade da Configuração:')
console.log(validity)
}
}
// principal funcao para pegar os dados
function fetchDocumentsPage(page) {
params.page = (page) ? page : params.page
let request = Liferay.Util.addParams(params, apiURL+contentSetsEndPoint)
fetch(
request,
{
method: 'GET',
headers: {
'Content-Type': 'application/json'
}
}
).then(response => {
if (response.ok) {
return response.json()
}
}).then(documents => {
handleDocuments(documents)
if (editMode && configuration.activeDebug) {
console.log(`Retorno da requisição (page ${params.page}):`)
console.log(documents)
}
})
}
// manipula dados retornados da coleção
function handleDocuments(documents) {
loadingAnimation && loadingAnimation.remove()
if (documents.items.length > 0) {
switch (configuration.groupBy) {
case 'noGroup':
renderDocumentsList(documents)
break
case 'groupByYear':
(validity.canGroupByYear.state) ? renderDocumentsListByGroup(documents) : renderDocumentsList(documents)
break
case 'groupByMonthYear':
(validity.canGroupByMonthYear.state) ? renderDocumentsListByGroup(documents) : renderDocumentsList(documents)
break
case 'groupByDay':
(validity.canGroupByDay.state) ? renderDocumentsListByGroup(documents) : renderDocumentsList(documents)
break
}
configuration.usePagination && renderPaginationBar(documents.page, documents.lastPage, documents.totalCount)
} else {
displayAlert('info', 'Aviso', 'Não foram encontrados documentos', documentsList, 'afterbegin')
}
}
// renderiza lista agrupada
function renderDocumentsListByGroup(documents) {
let lastListGroup = documentsList.querySelector('.list-group:last-child')
let currentGroup = (lastListGroup) ? lastListGroup.dataset.group : 0
configuration.activeDebug
&& configuration.showDateConversions
&& editMode
&& console.log(`Extração do grupo a partir do campo ${getOrderByFieldName(assetListObject.typeSettings.orderByColumn1)}:`)
documents.items.forEach(doc => {
let group = getDocumentGroup(doc)
if (currentGroup != group) {
let listGroup = document.createElement('ul')
listGroup.classList.add('list-group')
listGroup.dataset.group = group
listGroup.setAttribute('aria-label', `${assetListObject.title} de ${group}`)
lastListGroup = documentsList.insertAdjacentElement('beforeend', listGroup)
lastListGroup.insertAdjacentHTML('afterbegin', renderListGroupHeader(group))
currentGroup = group
}
lastListGroup.insertAdjacentHTML('beforeend', renderListGroupItem(doc))
})
}
// extrai e retorna o dado (string) utilizado como agrupador (dia, mês ou ano) a partir do campo utilizado como primeira ordenação da coleção
function getDocumentGroup(document) {
let fieldData
let group
let dateField
let options
let test
let orderByColumn = assetListObject.typeSettings.orderByColumn1
switch (orderByColumn) {
case 'ddm__keyword__47047__DataReferência':
fieldData = document.content.documentType.contentFields[0].contentFieldValue.data
break
case 'ddm__keyword__47054__Ano':
fieldData = document.content.documentType.contentFields[0].contentFieldValue.data
break
case 'modifiedDate':
fieldData = document.content.dateModified
break
case 'createDate':
fieldData = document.content.dateCreated
break
case 'publishDate': // verificar esse caso por que não há uma campo data de publicação em coleções de documentos
fieldData = document.content.dateCreated
break
}
dateField = new Date(fieldData)
switch (configuration.groupBy) {
case 'groupByYear':
test = (orderByColumn == 'ddm__keyword__47047__DataReferência' || orderByColumn == 'ddm__keyword__47054__Ano')
group = test ? dateField.getUTCFullYear() : dateField.getFullYear()
break
case 'groupByMonthYear':
test = (orderByColumn == 'ddm__keyword__47047__DataReferência')
options = test ? {month:'long', year:'numeric', timeZone: 'UTC'} : { month:'long', year:'numeric' }
group = dateField.toLocaleDateString('pt-BR', options)
group = group.charAt(0).toUpperCase() + group.slice(1)
break
case 'groupByDay':
test = (orderByColumn == 'ddm__keyword__47047__DataReferência')
options = test ? {timeZone: 'UTC'} : {}
group = dateField.toLocaleDateString('pt-BR', options)
break
}
configuration.activeDebug && configuration.showDateConversions && editMode && console.log(`${fieldData} --> ${group}`)
return group
}
// renderiza lista comum
function renderDocumentsList(documents) {
let listGroup = getNodeElement(documentsList, 'afterbegin', 'ul', '.list-group')
listGroup.setAttribute('aria-label', assetListObject.title)
documents.items.forEach(doc => {
listGroup.insertAdjacentHTML('beforeend', renderListGroupItem(doc))
})
}
// renderiza cabeçalho da lista
function renderListGroupHeader(title) {
let listHeaderHTML = `
<li class="list-group-header">
<span class="list-group-header-title"><big>${title}</big></span>
</li>
`
return listHeaderHTML
}
// renderiza um item da lista
function renderListGroupItem(document) {
let dateCreated = (configuration.showCreateDate) ? new Date(document.content.dateCreated) : null
let dateCreatedHTML = (dateCreated) ? `
<div class="d-flex flex-row flex-lg-column text-lg-right ml-lg-3 mr-md-2 mr-lg-0">
<span class="small font-weight-bold text-nowrap mr-1 mr-lg-0">Publicado em</span>
<span class="small">${dateCreated.toLocaleDateString('pt-BR')}</span>
</div>` : ''
let dateModified = (configuration.showModifiedDate) ? new Date(document.content.dateModified) : null
let dateModifiedHTML = (dateModified) ? `
<div class="d-flex flex-row flex-lg-column text-lg-right ml-lg-3 mr-md-2 mr-lg-0">
<span class="small font-weight-bold text-nowrap mr-1 mr-lg-0">Atualizado em</span>
<span class="small">${dateModified.toLocaleDateString('pt-BR')}</span>
</div>` : ''
let refDate = (configuration.showRefDate && validity.canShowRefDate.state) ? new Date(document.content.documentType.contentFields[0].contentFieldValue.data) : null
let refDateHTML = (refDate) ? `
<div class="d-flex flex-row flex-lg-column text-lg-right ml-lg-3 mr-md-2 mr-lg-0">
<span class="small font-weight-bold text-nowrap mr-1 mr-lg-0">${configuration.labelForRefDate}</span>
<span class="small">${refDate.toLocaleDateString('pt-BR', {timeZone: 'UTC'})}</span>
</div>` : ''
let year = (configuration.showYear && validity.canShowYear.state) ? document.content.documentType.contentFields[0].contentFieldValue.data : null
let yearHTML = (year) ? `
<div class="d-flex flex-row flex-lg-column text-lg-right ml-lg-3 mr-md-2 mr-lg-0">
<span class="small font-weight-bold text-nowrap mr-1 mr-lg-0">${configuration.labelForYear}</span>
<span class="small">${year}</span>
</div>` : ''
let hasMetadatas = (year || refDate || dateCreated || dateModified)
let metadataHTML = (hasMetadatas) ? `
<div class="d-flex flex-column flex-md-row">
${yearHTML}
${refDateHTML}
${dateCreatedHTML}
${dateModifiedHTML}
</div>` : ''
let listItemHTML = `
<li class="list-group-item list-group-item-flex align-items-center">
<div class="autofit-col">
<svg class="lexicon-icon text-tertiary lexicon-icon-lg" focusable="false" role="presentation"
viewBox="0 0 512 512">
<use xlink:href="${spritemapBNB}#arquivo-${document.content.fileExtension}" />
</svg>
</div>
<div class="autofit-col autofit-col-expand">
<div class="d-flex flex-column flex-lg-row justify-content-start justify-content-lg-between">
<div class="d-flex flex-column">
<span class="list-group-title">
<a href="${document.content.contentUrl}">${document.title}</a>
</span>
<span class="list-group-subtitle text-uppercase small">
${document.content.fileExtension}, ${Liferay.Util.formatStorage(document.content.sizeInBytes, {addSpaceBeforeSuffix: true})}
</span>
</div>
${metadataHTML}
</div>
</div>
</li>
`
return listItemHTML
}
// renderiza paginação
function renderPaginationBar(page, lastPage, totalCount) {
let paginationBar = getNodeElement(fragmentElement, 'beforeend', 'div', '.pagination-bar')
let lastIndex = (page === lastPage) ? totalCount : configuration.pageSize*page
let nDocuments = (page+1 === lastPage) ? totalCount - configuration.pageSize*page : configuration.pageSize
paginationBar.classList.add('justify-content-center', 'justify-content-lg-between')
let textColor = (configuration.textColor.cssClass) ? `text-${configuration.textColor.cssClass}` : ''
paginationBar.innerHTML = `
<div class="pagination-results mr-0 ${textColor}">Exibindo 1 a ${lastIndex} de ${totalCount} documentos.</div>
<ul class="pagination">
<li class="page-item">
<button class="btn btn-unstyled page-link" type="button">
Exibir mais ${nDocuments} documentos
${renderIcon('angle-down', spritemapClay, 'ml-2')}
</button>
</li>
</ul>
`
let showMoreButton = paginationBar.querySelector('button.page-link')
if (page !== lastPage) {
showMoreButton.addEventListener('click', e => {
showMoreButton.querySelector('svg').remove()
let loadAnimation = getNodeElement(showMoreButton, 'beforeend', 'span', '.loading-animation')
loadAnimation.classList.add('loading-animation-sm', 'ml-2')
fetchDocumentsPage(page+1)
})
} else {
showMoreButton.remove()
}
}
// imprime um mensagem de alerta
function displayAlert(style, title, msg, parentNode, position) {
let styleIcons = {
'danger': 'exclamation-full',
'success': 'check-circle-full',
'info': 'info-circle',
'warning': 'warning-full'
}
let html = `
<div class="alert p-4 alert-${style}" role="alert">
<span class="alert-indicator">
${renderIcon(styleIcons[style], spritemapClay, '')}
</span>
<strong>${title}:</strong>
<p class="mt-2 mb-0">${msg}</p>
</div>
`
parentNode.insertAdjacentHTML(position, html)
}
// limpa mensagens de alerta
function cleanAlerts() {
let alerts = fragmentElement.querySelectorAll('.alert')
alerts.forEach(alert => alert.remove())
}
// imprime icone SGV
function renderIcon(icon, spritemap, cssClasses) {
return `
<svg class="lexicon-icon lexicon-icon-${icon} ${cssClasses}" focusable="false" role="presentation">
<use href="${spritemap}#${icon}"></use>
</svg>
`
}
// retorna/cria um elemento html de uma classe css
// ascendantNode é um nó ascendente
// position é uma string 'beforeend', 'afterbegin' +
// elementType uma string 'ul', 'div' etc
// cssClass é uma classe css
function getNodeElement(ascendantNode, position, elementType, cssClass) {
let nodeElement
if (ascendantNode.querySelector(cssClass)) {
nodeElement = ascendantNode.querySelector(cssClass)
} else {
nodeElement = document.createElement(elementType)
nodeElement = ascendantNode.insertAdjacentElement(position, nodeElement)
nodeElement.classList.add(cssClass.slice(1))
}
return nodeElement
}
// retorna nome amigável do campo usado como 1ª ordenação
function getOrderByFieldName(orderByColumn) {
let regExp = /^ddm__keyword__\d+__(.+)/
let matchExp = regExp.exec(orderByColumn)
return (matchExp) ? matchExp[1] : Liferay.Language.get(orderByColumn)
};}());</script>]]>
|
5865
| <![CDATA[<script type="text/javascript">
// <![CDATA[
Liferay.BrowserSelectors.run();
// ]]>
</script>]]>
|
5894
| <![CDATA[<script type="text/javascript">
// <![CDATA[
Liferay.currentURL = '\x2fweb\x2fguest\x2facesso-a-informacao\x2fempregados';
Liferay.currentURLEncoded = '\x252Fweb\x252Fguest\x252Facesso-a-informacao\x252Fempregados';
// ]]>
</script>]]>
|
5911
| <![CDATA[<script type="text/javascript">
// <![CDATA[
// ]]>
</script>]]>
|
5942
| <![CDATA[<script type="text/javascript">
// <![CDATA[
(function() {var $ = AUI.$;var _ = AUI._;
var onVote = function(event) {
if (window.Analytics) {
Analytics.send('VOTE', 'Ratings', {
className: event.className,
classPK: event.classPK,
ratingType: event.ratingType,
score: event.score
});
}
};
var onDestroyPortlet = function() {
Liferay.detach('ratings:vote', onVote);
Liferay.detach('destroyPortlet', onDestroyPortlet);
};
Liferay.on('ratings:vote', onVote);
Liferay.on('destroyPortlet', onDestroyPortlet);
})();(function() {var $ = AUI.$;var _ = AUI._;
var onDestroyPortlet = function() {
Liferay.detach('messagePosted', onMessagePosted);
Liferay.detach('destroyPortlet', onDestroyPortlet);
};
Liferay.on('destroyPortlet', onDestroyPortlet);
var onMessagePosted = function(event) {
if (window.Analytics) {
Analytics.send('posted', 'Comment', {
className: event.className,
classPK: event.classPK,
commentId: event.commentId,
text: event.text
});
}
};
Liferay.on('messagePosted', onMessagePosted);
})();(function() {var $ = AUI.$;var _ = AUI._;
var onShare = function(data) {
if (window.Analytics) {
Analytics.send('shared', 'SocialBookmarks', {
className: data.className,
classPK: data.classPK,
type: data.type,
url: data.url
});
}
};
var onDestroyPortlet = function() {
Liferay.detach('socialBookmarks:share', onShare);
Liferay.detach('destroyPortlet', onDestroyPortlet);
};
Liferay.on('socialBookmarks:share', onShare);
Liferay.on('destroyPortlet', onDestroyPortlet);
})();(function() {var $ = AUI.$;var _ = AUI._;
var pathnameRegexp = /\/documents\/(\d+)\/(\d+)\/(.+?)\/([^&]+)/;
function handleDownloadClick(event) {
if (event.target.nodeName.toLowerCase() === 'a' && window.Analytics) {
var anchor = event.target;
var match = pathnameRegexp.exec(anchor.pathname);
var fileEntryId =
anchor.dataset.analyticsFileEntryId ||
(anchor.parentElement &&
anchor.parentElement.dataset.analyticsFileEntryId);
if (fileEntryId && match) {
var getParameterValue = function(parameterName) {
var result = null;
anchor.search
.substr(1)
.split('&')
.forEach(function(item) {
var tmp = item.split('=');
if (tmp[0] === parameterName) {
result = decodeURIComponent(tmp[1]);
}
});
return result;
};
Analytics.send('documentDownloaded', 'Document', {
groupId: match[1],
fileEntryId: fileEntryId,
preview: !!window._com_liferay_document_library_analytics_isViewFileEntry,
title: decodeURIComponent(match[3].replace(/\+/gi, ' ')),
version: getParameterValue('version')
});
}
}
}
var onDestroyPortlet = function() {
document.body.removeEventListener('click', handleDownloadClick);
};
Liferay.once('destroyPortlet', onDestroyPortlet);
var onPortletReady = function() {
document.body.addEventListener('click', handleDownloadClick);
};
Liferay.once('portletReady', onPortletReady);
})();(function() {var $ = AUI.$;var _ = AUI._;
function showDialog(uri, title, namespace, refreshOnClose) {
Liferay.Util.openWindow({
dialog: {
centered: true,
constrain: true,
cssClass: 'sharing-dialog',
destroyOnHide: true,
modal: true,
height: 540,
width: 600,
on: {
visibleChange: function(event) {
if (refreshOnClose && !event.newVal) {
Liferay.Portlet.refresh('#p_p_id' + namespace);
}
}
}
},
id: 'sharingDialog',
title: Liferay.Util.escapeHTML(title),
uri: uri
});
}
var Sharing = {};
Liferay.provide(
Sharing,
'share',
function(classNameId, classPK, title, namespace, refreshOnClose) {
var sharingParameters = {
classNameId: classNameId,
classPK: classPK
};
var sharingURL = Liferay.Util.PortletURL.createPortletURL(
'https://www.bnb.gov.br/group/guest/~/control_panel/manage?p_p_id=com_liferay_sharing_web_portlet_SharingPortlet&p_p_lifecycle=0&p_p_state=pop_up&_com_liferay_sharing_web_portlet_SharingPortlet_mvcRenderCommandName=%2Fsharing%2Fshare&p_p_auth=bA16YtWz',
sharingParameters
);
showDialog(sharingURL.toString(), title, namespace, refreshOnClose);
},
['liferay-util-window']
);
Liferay.provide(
Sharing,
'manageCollaborators',
function(classNameId, classPK, namespace, refreshOnClose) {
var manageCollaboratorsParameters = {
classNameId: classNameId,
classPK: classPK
};
var manageCollaboratorsURL = Liferay.Util.PortletURL.createPortletURL(
'https://www.bnb.gov.br/group/guest/~/control_panel/manage?p_p_id=com_liferay_sharing_web_portlet_ManageCollaboratorsPortlet&p_p_lifecycle=0&p_p_state=pop_up&_com_liferay_sharing_web_portlet_ManageCollaboratorsPortlet_mvcRenderCommandName=%2Fsharing%2Fmanage_collaborators&p_p_auth=Z0117hTl',
manageCollaboratorsParameters
);
showDialog(
manageCollaboratorsURL.toString(),
'Gerenciar colaboradores',
namespace,
refreshOnClose
);
},
['liferay-util-window']
);
Liferay.Sharing = Sharing;
})();
if (Liferay.Data.ICONS_INLINE_SVG) {
svg4everybody(
{
attributeName: 'data-href',
polyfill: true,
validate: function (src, svg, use) {
return !src || !src.startsWith('#');
}
}
);
}
Liferay.Portlet.register('com_liferay_site_navigation_site_map_web_portlet_SiteNavigationSiteMapPortlet_INSTANCE_iRIRmokgS8HG');
Liferay.Portlet.onLoad(
{
canEditTitle: false,
columnPos: 0,
isStatic: 'end',
namespacedId: 'p_p_id_com_liferay_site_navigation_site_map_web_portlet_SiteNavigationSiteMapPortlet_INSTANCE_iRIRmokgS8HG_',
portletId: 'com_liferay_site_navigation_site_map_web_portlet_SiteNavigationSiteMapPortlet_INSTANCE_iRIRmokgS8HG',
refreshURL: '\x2fc\x2fportal\x2frender_portlet\x3fp_l_id\x3d70\x26p_p_id\x3dcom_liferay_site_navigation_site_map_web_portlet_SiteNavigationSiteMapPortlet_INSTANCE_iRIRmokgS8HG\x26p_p_lifecycle\x3d0\x26p_t_lifecycle\x3d0\x26p_p_state\x3dnormal\x26p_p_mode\x3dview\x26p_p_col_id\x3dnull\x26p_p_col_pos\x3dnull\x26p_p_col_count\x3dnull\x26p_p_static\x3d1\x26p_p_isolated\x3d1\x26currentURL\x3d\x252Fweb\x252Fguest\x252Facesso-a-informacao\x252Fempregados',
refreshURLData: {}
}
);
Liferay.Portlet.register('com_liferay_site_navigation_menu_web_portlet_SiteNavigationMenuPortlet_INSTANCE_name_navigation_menu');
Liferay.Portlet.onLoad(
{
canEditTitle: false,
columnPos: 0,
isStatic: 'end',
namespacedId: 'p_p_id_com_liferay_site_navigation_menu_web_portlet_SiteNavigationMenuPortlet_INSTANCE_name_navigation_menu_',
portletId: 'com_liferay_site_navigation_menu_web_portlet_SiteNavigationMenuPortlet_INSTANCE_name_navigation_menu',
refreshURL: '\x2fc\x2fportal\x2frender_portlet\x3fp_l_id\x3d70\x26p_p_id\x3dcom_liferay_site_navigation_menu_web_portlet_SiteNavigationMenuPortlet_INSTANCE_name_navigation_menu\x26p_p_lifecycle\x3d0\x26p_t_lifecycle\x3d0\x26p_p_state\x3dnormal\x26p_p_mode\x3dview\x26p_p_col_id\x3dnull\x26p_p_col_pos\x3dnull\x26p_p_col_count\x3dnull\x26p_p_static\x3d1\x26p_p_isolated\x3d1\x26currentURL\x3d\x252Fweb\x252Fguest\x252Facesso-a-informacao\x252Fempregados',
refreshURLData: {}
}
);
Liferay.Portlet.register('com_liferay_site_navigation_menu_web_portlet_SiteNavigationMenuPortlet_INSTANCE_lgpd_navigation_menu');
Liferay.Portlet.onLoad(
{
canEditTitle: false,
columnPos: 0,
isStatic: 'end',
namespacedId: 'p_p_id_com_liferay_site_navigation_menu_web_portlet_SiteNavigationMenuPortlet_INSTANCE_lgpd_navigation_menu_',
portletId: 'com_liferay_site_navigation_menu_web_portlet_SiteNavigationMenuPortlet_INSTANCE_lgpd_navigation_menu',
refreshURL: '\x2fc\x2fportal\x2frender_portlet\x3fp_l_id\x3d70\x26p_p_id\x3dcom_liferay_site_navigation_menu_web_portlet_SiteNavigationMenuPortlet_INSTANCE_lgpd_navigation_menu\x26p_p_lifecycle\x3d0\x26p_t_lifecycle\x3d0\x26p_p_state\x3dnormal\x26p_p_mode\x3dview\x26p_p_col_id\x3dnull\x26p_p_col_pos\x3dnull\x26p_p_col_count\x3dnull\x26p_p_static\x3d1\x26p_p_isolated\x3d1\x26currentURL\x3d\x252Fweb\x252Fguest\x252Facesso-a-informacao\x252Fempregados',
refreshURLData: {}
}
);
Liferay.Portlet.register('com_liferay_site_navigation_breadcrumb_web_portlet_SiteNavigationBreadcrumbPortlet_INSTANCE_bdBSZcEPvDWD');
Liferay.Portlet.onLoad(
{
canEditTitle: false,
columnPos: 0,
isStatic: 'end',
namespacedId: 'p_p_id_com_liferay_site_navigation_breadcrumb_web_portlet_SiteNavigationBreadcrumbPortlet_INSTANCE_bdBSZcEPvDWD_',
portletId: 'com_liferay_site_navigation_breadcrumb_web_portlet_SiteNavigationBreadcrumbPortlet_INSTANCE_bdBSZcEPvDWD',
refreshURL: '\x2fc\x2fportal\x2frender_portlet\x3fp_l_id\x3d70\x26p_p_id\x3dcom_liferay_site_navigation_breadcrumb_web_portlet_SiteNavigationBreadcrumbPortlet_INSTANCE_bdBSZcEPvDWD\x26p_p_lifecycle\x3d0\x26p_t_lifecycle\x3d0\x26p_p_state\x3dnormal\x26p_p_mode\x3dview\x26p_p_col_id\x3dnull\x26p_p_col_pos\x3dnull\x26p_p_col_count\x3dnull\x26p_p_static\x3d1\x26p_p_isolated\x3d1\x26currentURL\x3d\x252Fweb\x252Fguest\x252Facesso-a-informacao\x252Fempregados',
refreshURLData: {}
}
);
Liferay.Loader.require('metal-dom/src/all/dom', function(metalDomSrcAllDom) {
(function(){
var dom = metalDomSrcAllDom;
(function() {var $ = AUI.$;var _ = AUI._;
var focusInPortletHandler = dom.delegate(
document,
'focusin',
'.portlet',
function(event) {
dom.addClasses(dom.closest(event.delegateTarget, '.portlet'), 'open');
}
);
var focusOutPortletHandler = dom.delegate(
document,
'focusout',
'.portlet',
function(event) {
dom.removeClasses(dom.closest(event.delegateTarget, '.portlet'), 'open');
}
);
})();})();
});AUI().use('liferay-menu', 'liferay-notice', 'aui-base', 'liferay-session', 'liferay-poller', function(A) {(function() {var $ = AUI.$;var _ = AUI._;
if (A.UA.mobile) {
Liferay.Util.addInputCancel();
}
})();(function() {var $ = AUI.$;var _ = AUI._;
new Liferay.Menu();
var liferayNotices = Liferay.Data.notices;
for (var i = 1; i < liferayNotices.length; i++) {
new Liferay.Notice(liferayNotices[i]);
}
})();(function() {var $ = AUI.$;var _ = AUI._;
Liferay.Session = new Liferay.SessionBase(
{
autoExtend: true,
redirectOnExpire: false,
redirectUrl: 'https\x3a\x2f\x2fwww\x2ebnb\x2egov\x2ebr\x2fweb\x2fguest',
sessionLength: 900,
sessionTimeoutOffset: 70,
warningLength: 0
}
);
})();});
// ]]>
</script>]]>
|
6278
| <![CDATA[<script type="text/javascript">
// <![CDATA[
AUI().use(
'aui-base',
function(A) {
var frameElement = window.frameElement;
if (frameElement && frameElement.getAttribute('id') === 'simulationDeviceIframe') {
A.getBody().addClass('lfr-has-simulation-panel');
}
}
);
// ]]>
</script>]]>
|
6291
| <![CDATA[<script type="text/javascript">
// <![CDATA[
Liferay.Loader.require('frontend-js-tooltip-support-web@2.0.5/index', function(frontendJsTooltipSupportWeb205Index) {
(function(){
var TooltipSupport = frontendJsTooltipSupportWeb205Index;
(function() {
try {
TooltipSupport.default()
}
catch (err) {
console.error(err);
}
})();})();
});
// ]]>
</script>]]>
|