Tutup

Karyawan Vale tersenyum di lanskap hijau. Dia mengenakan seragam Vale
hijau, kacamata, helm, dan penutup telinga. Artefak gelombang visual Vale

Filtro atual: 'folderId:2699492'

Faça sua busca

Para a facilitar a procura pelos documentos que você precisa, utilize a busca por palavra-chave, tipo de documento e/ou um tema-chave.

    Kesalahan terjadi ketika Memproses Template.
    The following has evaluated to null or missing:
    ==> restClient.get("/headless-admin-taxonomy/v1.0/taxonomy-vocabularies/" + vocabularyId + "/taxonomy-categories?fields=id&restricFields=actions,availableLanguages,taxonomyCategoryUsageCount&page=1&pageSize=30").items  [in template "44549#44620#1292787" at line 30, column 22]
    
    ----
    Tip: It's the step after the last dot that caused this error, not those before it.
    ----
    Tip: If the failing expression is known to legally refer to something that's sometimes null or missing, either specify a default value like myOptionalVar!myDefault, or use <#if myOptionalVar??>when-present<#else>when-missing</#if>. (These only cover the last step of the expression; to cover the whole expression, use parenthesis: (myOptionalVar.foo)!myDefault, (myOptionalVar.foo)??
    ----
    
    ----
    FTL stack trace ("~" means nesting-related):
    	- Failed at: categories = restClient.get("/headles...  [in template "44549#44620#1292787" at line 30, column 9]
    ----
    1<#assign images_path = "/documents/d/guest/" /> 
    2<#assign total = searchContainer.getTotal() /> 
    3<#assign start = searchContainer.getStart() /> 
    4<#assign delta = searchContainer.getDelta() />     
    5<#assign totalPages = (total/delta)?ceiling /> 
    6<#assign currentPage = ((start+1)/delta)?ceiling />     
    7<#assign isFirstPage = currentPage == 1 /> 
    8<#assign isLastPage = currentPage == totalPages /> 
    9<#assign iteratorURL = searchContainer.getIteratorURL().toString() /> 
    10<#assign iteratorURL += iteratorURL?contains("?")?then("", "?") /> 
    11<#assign firstPageURL = iteratorURL + '&start=1'/> 
    12<#assign lastPageURL = iteratorURL + '&start=' + totalPages?string/> 
    13<#assign previousURL = iteratorURL + '&start=' + (currentPage - 1)?string /> 
    14<#assign nextURL = iteratorURL + '&start=' + (currentPage + 1)?string /> 
    15 
    16<#assign startPage = (currentPage < 3)?then(1, currentPage - 1) /> 
    17<#assign endPage = 2 + startPage /> 
    18<#assign endPage = (totalPages < endPage)?then(totalPages, endPage) /> 
    19<#assign diff = startPage - endPage + 2 /> 
    20<#assign startPage -= (startPage - diff > 0)?then(diff, 0) /> 
    21 
    22<#assign FOLDER_NAME_CUSTOM_FIELD_NAME = 'name'/> 
    23<#assign DATE_CUSTOM_FIELD_NAME = 'date'/> 
    24 
    25<#assign documentFolderResource = resourceLocator.locate("/headless-delivery/v1.0", "DocumentFolder") /> 
    26<#assign documentResource = resourceLocator.locate("/headless-delivery/v1.0", "Document") /> 
    27<#assign structuredContentResource = resourceLocator.locate("/headless-delivery/v1.0", "StructuredContent") /> 
    28<#assign 
    29	vocabularyId = 1970869 
    30	categories = restClient.get("/headless-admin-taxonomy/v1.0/taxonomy-vocabularies/" + vocabularyId + "/taxonomy-categories?fields=id&restricFields=actions,availableLanguages,taxonomyCategoryUsageCount&page=1&pageSize=30").items 
    31/> 
    32 
    33<#function getVocabularyCategoriesIds> 
    34  <#return categories?map(category -> category.id?number)/> 
    35</#function> 
    36 
    37<#function getDocumentDate entry> 
    38    <#if entry.className == "com.liferay.document.library.kernel.model.DLFolder"> 
    39        <#assign documentOrFolder = documentFolderResource.getDocumentFolder(entry.getClassPK()) /> 
    40    <#else> 
    41        <#assign documentOrFolder = documentResource.getDocument(entry.getClassPK()) /> 
    42    </#if> 
    43 
    44    <#list documentOrFolder.getCustomFields() as customField> 
    45        <#if customField.getName() == DATE_CUSTOM_FIELD_NAME && customField.getCustomValue().getData()?has_content> 
    46            <#return customField.getCustomValue().getData()?datetime.iso> 
    47        </#if> 
    48    </#list> 
    49     
    50    <#return ""> 
    51</#function> 
    52 
    53<#assign documentsCategoriesIds = getVocabularyCategoriesIds() /> 
    54 
    55<div class="vale-widget-resultados-biblioteca-documentos position-relative" id="resultados-biblioteca-documentos-${randomNamespace}"> 
    56    <p class="results-count texto-sm text-right position-absolute"> 
    57        ${searchContainer.getTotal()} <@liferay.language key="results" /> 
    58    </p> 
    59    <table class="mb-6 table table-autofit"> 
    60        <thead class="thead"> 
    61            <tr> 
    62                <th class="pl-0"> 
    63                    <img class="pl-0" src="${images_path}folder" /> 
    64                </th> 
    65                <th class="table-cell-expand font-weight-medium text-verde-vale"> 
    66                    <@liferay.language key="name" /> 
    67                </th> 
    68                <th class="table-cell-expand-smallest table-cell-minw-150 d-table-cell font-weight-medium text-verde-vale text-right text-lg-left"> 
    69                    <@liferay.language key="category" /> 
    70                </th> 
    71                <th class="table-cell-expand-smallest table-cell-minw-150 d-none d-lg-table-cell font-weight-medium text-verde-vale"> 
    72                    <@liferay.language key="subcategory" /> 
    73                </th> 
    74                <th class="table-cell-expand-smallest table-cell-minw-150 d-none d-lg-table-cell font-weight-medium text-verde-vale"> 
    75                    <span class="mr-2"><@liferay.language key="date" /></span> 
    76                    <img data-sorting-field="expando__keyword__custom_fields__date_sortable" class="sort-arrow" src="${images_path}seta-bai_sec" /> 
    77                </th> 
    78                <th class="table-cell-expand-smallest table-cell-minw-150 d-none d-lg-table-cell table-column-text-end font-weight-medium text-verde-vale"> 
    79                    <span class="mr-2"><@liferay.language key="size" /></span> 
    80                    <img data-sorting-field="size" class="sort-arrow" src="${images_path}seta-bai_sec" /> 
    81                </th> 
    82        </thead> 
    83        <tbody> 
    84            <tr><td class="border-none py-3"></td></tr> 
    85        </tbody> 
    86        <tbody class="border-none"> 
    87            <#if entries?has_content>  
    88                <#list entries as entry > 
    89                    <#assign isFile = (entry.className == "com.liferay.document.library.kernel.model.DLFileEntry")/> 
    90                    <#assign documentCategoryName = "-" /> 
    91                    <#assign documentSubCategoryName = "-" /> 
    92                    <#if isFile> 
    93                        <#assign document = documentResource.getDocument(entry.getClassPK())/> 
    94                        <#assign documentCategoriesBriefs = document.getTaxonomyCategoryBriefs()/> 
    95                        <#assign documentCategory = documentCategoriesBriefs?filter( 
    96                            category -> documentsCategoriesIds?seq_contains(category.getTaxonomyCategoryId()?number) 
    97                        )?first!"-" /> 
    98                        <#assign documentCategoryName = (documentCategory == "-")?then("-", documentCategory.getTaxonomyCategoryName()) /> 
    99                        <#if documentCategory != "-"> 
    100                            <#assign 
    101                                documentCategoryId = documentCategory.getTaxonomyCategoryId()?string 
    102                                documentSubCategoriesIds = taxonomyCategoryResource.getTaxonomyCategoryTaxonomyCategoriesPage( 
    103                                    documentCategoryId, null, null, null, null, null).getItems()?map(c -> c.getId()?number) 
    104                                documentSubCatogoryBrief = documentCategoriesBriefs?filter( 
    105                                    categoryBrief -> documentSubCategoriesIds?seq_contains(categoryBrief.getTaxonomyCategoryId()) 
    106                                )?first!"" 
    107                                documentSubCategoryName = documentSubCatogoryBrief?has_content?then(documentSubCatogoryBrief.getTaxonomyCategoryName(), "-") 
    108                            /> 
    109                        </#if> 
    110                    </#if> 
    111                    <tr> 
    112                        <td class="pl-0"> 
    113                            <img src="${images_path + isFile?then('pdf_ic','folder')}" /> 
    114                        </td> 
    115                        <#--  Nome  --> 
    116                        <td class="table-cell-expand font-weight-normal"> 
    117                            <#if isFile> 
    118                                <a href="${document.contentUrl}" target="_blank">${entry.getTitle()}</a> 
    119															<#else> 
    120                                <a href="#" data-folder-id="${entry.classPK}">${getFolderLocalizedName(entry)}</a> 
    121                            </#if> 
    122                        </td> 
    123                        <#--  Categoria  --> 
    124                        <td class="table-cell-expand-smallest d-table-cell font-weight-normal text-right text-lg-left"> 
    125                            ${documentCategoryName} 
    126                        </td> 
    127                        <#--  Subcategoria  --> 
    128                        <td class="table-cell-expand-smallest d-none d-lg-table-cell font-weight-normal"> 
    129                            ${documentSubCategoryName} 
    130                        </td> 
    131                        <#--  Data  --> 
    132                        <#setting date_format="dd/MM/yyyy"> 
    133                        <td class="table-cell-expand-smallest d-none d-lg-table-cell font-weight-normal"> 
    134                            ${getDocumentDate(entry)?date} 
    135                        </td> 
    136                        <#--  Tamanho  --> 
    137                        <#--   
    138                            A opção de "Exibir resultados em forma de documento" deve estar  
    139                            selecionada para esse valor funcionar 
    140                        --> 
    141                        <td class="table-cell-expand-smallest d-none d-lg-table-cell table-column-text-end font-weight-normal"> 
    142                            <#if isFile> 
    143                                <#assign size = document.sizeInBytes/> 
    144                                <#if size < 1000000>  
    145                                    <#assign size = (size / 10)?round / 100 /> 
    146                                    ${(locale == 'pt_BR')?then(size?string?replace('.', ','), size)} KB 
    147                                <#else> 
    148                                    <#assign size = (size / 10000)?round / 100 /> 
    149                                    ${(locale == 'pt_BR')?then(size?string?replace('.', ','), size)} MB 
    150                                </#if> 
    151                            </#if> 
    152                        </td> 
    153                    </tr> 
    154                </#list> 
    155            </#if> 
    156        </tbody> 
    157    </table> 
    158    <div class="line-divider"></div> 
    159    <div class="pagination d-flex justify-content-center my-5"> 
    160        <a  
    161            class="pagination-option text-decoration-none mr-sm-5 ${isFirstPage?then('disabled', '')}"  
    162            href="${previousURL}"  
    163            disabled="${isFirstPage?string}" 
    164
    165            <img 
    166                class="btn btn-primary border-amarelo-vale bg-amarelo-vale mr-2 p-1 rounded-circle" 
    167                src="${images_path}seta-2-esq_bra" 
    168                alt="button-prev" 
    169            /> 
    170            <span class="btn btn-link text-amarelo-vale p-0 d-none d-sm-inline"> 
    171                <@liferay.language key="previous" /> 
    172            </span> 
    173        </a> 
    174         
    175        <#if (startPage > 1)> 
    176            <a 
    177                class="mr-2" 
    178                href="${firstPageURL}" 
    179
    180                <span 
    181                    class="pagination-item btn btn-primary p-1 rounded-circle" 
    182                    alt="first-page-button" 
    183                >1 
    184                </span> 
    185            </a> 
    186            <#if currentPage != 3>  
    187                <span class="elipsis h-100 mt-auto mr-2">...</span> 
    188            </#if> 
    189        </#if> 
    190 
    191        <#list startPage..endPage as i> 
    192            <a 
    193                class="mr-2 ${(i == currentPage)?then('disabled', '')}" 
    194                href="${iteratorURL + '&start=' + i?string}" 
    195
    196                <span 
    197                    class="pagination-item ${(currentPage == i)?then('is-active', '')} btn btn-primary p-1 rounded-circle" 
    198                    alt="first-page-button" 
    199                >${i} 
    200                </span> 
    201            </a> 
    202        </#list> 
    203 
    204        <#if (endPage < totalPages)> 
    205            <#if currentPage != totalPages - 2>  
    206                <span class="elipsis h-100 mt-auto mr-2">...</span> 
    207            </#if> 
    208            <a 
    209                class="mr-2" 
    210                href="${lastPageURL}" 
    211
    212                <span 
    213                    class="pagination-item btn btn-primary p-1 rounded-circle" 
    214                    alt="last-page-button" 
    215                >${totalPages} 
    216                </span> 
    217            </a> 
    218        </#if> 
    219 
    220        <a  
    221            class="pagination-option text-decoration-none ml-sm-5 ${isLastPage?then('disabled', '')}"  
    222            href="${nextURL}"  
    223            disabled="${isLastPage?string}" 
    224        >       
    225        <span class="btn btn-link text-amarelo-vale mr-2 p-0 d-none d-sm-inline"> 
    226            <@liferay.language key="next" /> 
    227        </span> 
    228        <img 
    229            class="btn btn-primary border-amarelo-vale bg-amarelo-vale p-1 rounded-circle" 
    230            src="${images_path}seta-2-dir_bra" 
    231            alt="button-next" 
    232        /> 
    233        </a> 
    234    </div> 
    235</div> 
    236 
    237<#function getFolderLocalizedName entry> 
    238    <#if entry.className != "com.liferay.document.library.kernel.model.DLFolder"> 
    239        <#return entry.getTitle()> 
    240    </#if> 
    241 
    242    <#assign folder = documentFolderResource.getDocumentFolder(entry.getClassPK()) /> 
    243    <#list folder.customFields as customField> 
    244        <#if customField.name == FOLDER_NAME_CUSTOM_FIELD_NAME && customField.customValue.data?has_content> 
    245            <#return customField.customValue.data> 
    246        </#if> 
    247    </#list> 
    248     
    249    <#return entry.getTitle()> 
    250</#function> 
    251 
    252<script> 
    253(function(){ 
    254    const SORT_QUERY_PARAM = 'sort'; 
    255    const FOLDER_FILTER_QUERY_PARAM = 'folder-filter'; 
    256 
    257    const resultsWidget = document.querySelector('#resultados-biblioteca-documentos-${randomNamespace}'); 
    258 
    259    // Seta links para pastas 
    260    resultsWidget.querySelectorAll('[data-folder-id]').forEach(el => el.addEventListener('click', goToFolder)); 
    261 
    262    const anchorId = resultsWidget.closest('.vale-fragmento-biblioteca-de-documentos').querySelector('.portlet').id; 
    263     
    264    // adiciona âncora nos links de paginação  
    265    resultsWidget.querySelectorAll('.pagination a').forEach(link => link.href += '#' + anchorId); 
    266 
    267    function goToFolder(e) { 
    268        e.preventDefault(); 
    269        const folderId = e.currentTarget.dataset.folderId; 
    270        const url = new URL(window.location); 
    271 
    272        clearQueryParams(url); 
    273        url.searchParams.set(FOLDER_FILTER_QUERY_PARAM, 'folderId:' + folderId); 
    274        url.hash = anchorId; 
    275 
    276        if (e.ctrlKey) { 
    277            window.open(url.href, '_blank'); // abrir em outra aba 
    278        } else { 
    279            navigateTo(url.href) 
    280
    281
    282 
    283    function clearQueryParams(url) { 
    284        const params = []; 
    285        for (let entry of url.searchParams.entries()) params.push(entry[0]); 
    286        params.forEach(param => url.searchParams.delete(param)); 
    287
    288 
    289    // Configura seta de ordenação 
    290    const sortingParam = new URLSearchParams(window.location.search).get(SORT_QUERY_PARAM); 
    291    const sortingColumns = resultsWidget.querySelectorAll('[data-sorting-field]').forEach(column => { 
    292        const sortingField = column.dataset.sortingField; 
    293 
    294        if (sortingParam === sortingField) column.classList.add("invert"); // ordem crescente (seta para cima) 
    295         
    296        column.addEventListener('click', debounce_leading(() => { 
    297            let newSortingField; 
    298            if (column.classList.contains("invert")) { 
    299                newSortingField = sortingField + "-"; // descrescente 
    300                column.classList.remove("invert"); 
    301            } else { 
    302                newSortingField = sortingField; 
    303                column.classList.add("invert"); 
    304
    305 
    306            const url = new URL(window.location); 
    307            url.searchParams.set(SORT_QUERY_PARAM, newSortingField); 
    308            url.hash = anchorId; 
    309             
    310            navigateTo(url.href); 
    311        })); 
    312    }); 
    313 
    314    function navigateTo(url) { 
    315        if(Liferay && Liferay.SPA.app) { 
    316            Liferay.SPA.app.navigate(url); 
    317        } else { 
    318            document.location.href = url; 
    319
    320
    321 
    322    function debounce_leading(func, timeout = 50) { // ignora chamadas em sequência 
    323        let timer; 
    324        return (...args) => { 
    325            if (!timer) { 
    326                func.apply(this, args); 
    327
    328            clearTimeout(timer); 
    329            timer = setTimeout(() => { 
    330                timer = undefined; 
    331            }, timeout); 
    332        }; 
    333
    334})() 
    335</script>