'use strict'; /** * @namespace DataSpace */ const DataSpace = {}; DataSpace.BASE_URL = 'http://dataspace.ispc.cnr.it'; DataSpace.RES_ENDPOINT = '/resources/'; DataSpace.OBJECT_ORDER = { "Object Type" : null, "Object ID" : null, "Object Excavation code" : null, "Object Chronology" : null, "Object Era" : null, "Object Geographical Context of Discovery" : null, "Object Dimensions" : null, "Object Material" : null, "Object Description" : null, "Object Conservation State" : null, "Object Reused?" : null, "Object Project" : null, "Object Compiler" : null, "Object Bibliography" : null, }; /* export const SAMPLE_ORDER = { }; */ const OBJECT_REPORT = new Map(); OBJECT_REPORT.set( 'before-gallery', { "Object Type" : null, "Object ID" : null, "Object Excavation code" : null, "Object Chronology" : null, "Object Era" : null, "Object Geographical Context of Discovery" : null, "Object Dimensions" : null, "Object Material" : null, } ); OBJECT_REPORT.set( 'after-gallery', { "Object Description" : null, "Object Conservation State" : null, "Object Reused?" : null, "Object Project" : null, "Object Compiler" : null, "Object Bibliography" : null, } ); DataSpace.OBJECT_REPORT = OBJECT_REPORT; /** * Populate partial objects from * resource object based on Map * @todo * @param {object} resource * * @return {Map} */ DataSpace.createObjectShape = function(resource) { const shape = this.OBJECT_REPORT; let beforeGallery = shape.get('before-gallery'), afterGallery = shape.get('after-gallery'); for (const key in shape.get('before-gallery')) { beforeGallery[key] = resource[key]; } for (const key in shape.get('after-gallery')) { afterGallery[key] = resource[key]; } shape.set('before-gallery', beforeGallery); shape.set('after-gallery', afterGallery); return shape; } /** * Fetch JSON report... * @param {string} uuid The resource's UUID in Arches * @param {string} format Either 'json' or 'arches-json' * * @return {object} */ DataSpace.fetchReport = async function(uuid, format='json') { const jsonRep = await fetch(`${this.BASE_URL}${this.RES_ENDPOINT}${uuid}?format=${format}&indent=2`) .then(res => res.json()) .catch(excep => { _createError(excep, 'error') document.querySelector('.modal').classList.remove('active'); }); return jsonRep; } /** * Add window.print to link in navbar * * @return {void} */ DataSpace.printReport = function() { document.querySelector('#print') .addEventListener('click', () => { window.print(); }); } /** * Attach Leaflet.js map to HTML element * * @param {string[]} coordinates * @param {string} htmlId * * @return {void} */ DataSpace.createMap = function(coordinates, htmlId = 'map') { const map = L.map(htmlId).setView(coordinates, 17); L.tileLayer('https://tile.openstreetmap.org/{z}/{x}/{y}.png', { attribution: '© OpenStreetMap contributors' }).addTo(map); L.marker(coordinates).addTo(map) .bindPopup(`lat.: ${coordinates[0]}, long. : ${coordinates[1]}`) .openPopup(); } /** * @todo Use TS to define object shape * @param {object} resource The resource object (Arches JSON!) * * @return {string[]} */ DataSpace.getImagesSrc = function(resource) { // TODO hardcoded... const filesUri = `${this.BASE_URL}/files/uploadedfiles/`; // TODO don't filter this array, populate another one let arr = resource.tiles .filter(tile => { let key = Object.keys(tile.data)[0] return Array.isArray(tile.data[key]); }).filter(o => { let key = Object.keys(o.data)[0] return Object.keys(o.data[key][0]).includes('file_id') }); let fileNames = [], dataObjects = []; arr.forEach(d => dataObjects.push(d.data)); dataObjects.forEach(e => { e[Object.keys(e)[0]].forEach(o => { fileNames.push(filesUri + o.name) }); }); return fileNames; } function _createError(message, htmlId) { const error = document.createElement('div'); const clear = document.createElement('button'); error.className = 'toast toast-error'; clear.className = 'btn btn-clear float-right'; error.appendChild(clear); error.textContent = message; document.querySelector(`#${htmlId}`).appendChild(error); } export default DataSpace; /** * Fetch file blob (CORS...) * @todo * * @param {string} fileUri The file's URI in Arches * * @return {object} */ //export async function fetchFileBlob(fileUri); /** * Query report links to determine * resource instance type... */ /** * Create links list * @param {string[]} links The fetched resource links * @param {string} id The ID of the UL element * @param {string} replace The string that should replace loalhost... * * @return {void} export function createLinks(links, id, replace) { for (const link of links) { const item = document.createElement('li'); item.innerHTML = ` ${link.substring(link.lastIndexOf('/') + 1)} `; document.querySelector(`#${id}`).appendChild(item); } } */ /** * @todo Query report links to determine resource type? * @param {int} max Max number of resources to list * (randomly selected) * * @returns {Array} An array with selected resource links export async function fetchResourceList(max = 20) { // TODO Errors!! const list = await fetch(`${BASE_URL}${RES_ENDPOINT}`) .then(res => res.json()) .catch(); // Arbitrary slice... return list['ldp:contains'].slice(100, max + 100); } */