@ulb-darmstadt/shacl-form 3.1.0 → 3.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,17 +1,25 @@
1
- import{a as e,i as t,n,o as r,r as i,t as a}from"./assets/property-template-DahfpzrJ.js";import*as o from"leaflet";import"leaflet-editable/src/Leaflet.Editable.js";import s from"leaflet/dist/leaflet.css?raw";import c from"leaflet.fullscreen/Control.FullScreen.css?raw";import"leaflet.fullscreen/Control.FullScreen.js";import{Literal as l}from"n3";function u(r,o,s){if(s){let s=a(r)>0;if(r.class&&!r.hasValue)return r.config.theme.createListEditor(r.label,o,s,i(r.class,r),r);if(r.in){let e=r.config.lists[r.in];if(e?.length){let t=n(e,r.config.store,r.config.languages);return r.config.theme.createListEditor(r.label,o,s,t,r)}else console.error(`list not found:`,r.in,`existing lists:`,r.config.lists)}if(r.datatype?.equals(e)||r.languageIn?.length||r.datatype===void 0&&o instanceof l&&o.language)return r.config.theme.createLangStringEditor(r.label,o,s,r);switch(r.datatype?.value.replace(t,``)){case`integer`:case`float`:case`double`:case`decimal`:return r.config.theme.createNumberEditor(r.label,o,s,r);case`date`:case`dateTime`:return r.config.theme.createDateEditor(r.label,o,s,r);case`boolean`:return r.config.theme.createBooleanEditor(r.label,o,s,r);case`base64Binary`:return r.config.theme.createFileEditor(r.label,o,s,r)}return r.config.theme.createTextEditor(r.label,o,s,r)}else return o?r.config.theme.createViewer(r.label,o,r):document.createElement(`div`)}var d=`
2
- #shaclMapDialog .closeButton { position: absolute; right: 0; top: 0; z-index: 1; padding: 6px 8px; cursor: pointer; border: 0; background-color: #FFFA; font-size: 24px; z-index: 1000; }
1
+ import{a as e,i as t,n,o as r,r as i,t as a}from"./assets/property-template-DahfpzrJ.js";import*as o from"leaflet";import"leaflet-editable/src/Leaflet.Editable.js";import s from"leaflet/dist/leaflet.css?raw";import c from"leaflet.fullscreen/dist/Control.FullScreen.css?raw";import"leaflet.fullscreen";import"leaflet.heat/dist/leaflet-heat.js";import{RokitButton as l}from"@ro-kit/ui-widgets";import{DataFactory as u,Literal as d}from"n3";function f(r,o,s){if(s){let s=a(r)>0;if(r.class&&!r.hasValue)return r.config.theme.createListEditor(r.label,o,s,i(r.class,r),r);if(r.in){let e=r.config.lists[r.in];if(e?.length){let t=n(e,r.config.store,r.config.languages);return r.config.theme.createListEditor(r.label,o,s,t,r)}else console.error(`list not found:`,r.in,`existing lists:`,r.config.lists)}if(r.datatype?.equals(e)||r.languageIn?.length||r.datatype===void 0&&o instanceof d&&o.language)return r.config.theme.createLangStringEditor(r.label,o,s,r);switch(r.datatype?.value.replace(t,``)){case`integer`:case`float`:case`double`:case`decimal`:return r.config.theme.createNumberEditor(r.label,o,s,r);case`date`:case`dateTime`:return r.config.theme.createDateEditor(r.label,o,s,r);case`boolean`:return r.config.theme.createBooleanEditor(r.label,o,s,r);case`base64Binary`:return r.config.theme.createFileEditor(r.label,o,s,r)}return r.config.theme.createTextEditor(r.label,o,s,r)}else return o?r.config.theme.createViewer(r.label,o,r):document.createElement(`div`)}var p=c.replace(`:root`,`:host`),m=`
2
+ #shaclMapDialog .closeButton { position: absolute; right: 0; top: 0; z-index: 1000; padding: 6px 8px; cursor: pointer; border: 0; background-color: #FFFA; font-size: 24px; }
3
3
  #shaclMapDialog { padding: 0; width:90vw; height: 90vh; margin: auto; }
4
4
  #shaclMapDialog::backdrop { background-color: #0007; }
5
5
  #shaclMapDialog .closeButton:hover { background-color: #FFF }
6
- #shaclMapDialog .hint { position: absolute; right: 60px; top: 3px; z-index: 1; padding: 4px 6px; background-color: #FFFA; border-radius: 4px; z-index: 1000; pointer-events: none; }
6
+ #shaclMapDialog .hint { position: absolute; right: 60px; top: 3px; z-index: 1000; padding: 4px 6px; background-color: #FFFA; border-radius: 4px; pointer-events: none; }
7
7
  .leaflet-container { min-height: 300px; }
8
- .fullscreen-icon { background-image: url(data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgMjYgNTIiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTIwLjYgMzYuN0gxNmEuOS45IDAgMCAxLS44LS44di00LjVjMC0uMi4yLS40LjQtLjRoMS40Yy4zIDAgLjUuMi41LjR2M2gzYy4yIDAgLjQuMi40LjV2MS40YzAgLjItLjIuNC0uNC40em0tOS45LS44di00LjVjMC0uMi0uMi0uNC0uNC0uNEg4LjljLS4zIDAtLjUuMi0uNS40djNoLTNjLS4yIDAtLjQuMi0uNC41djEuNGMwIC4yLjIuNC40LjRIMTBjLjQgMCAuOC0uNC44LS44em0wIDEwLjdWNDJjMC0uNC0uNC0uOC0uOC0uOEg1LjRjLS4yIDAtLjQuMi0uNC40djEuNGMwIC4zLjIuNS40LjVoM3YzYzAgLjIuMi40LjUuNGgxLjRjLjIgMCAuNC0uMi40LS40em02LjkgMHYtM2gzYy4yIDAgLjQtLjIuNC0uNXYtMS40YzAtLjItLjItLjQtLjQtLjRIMTZjLS40IDAtLjguNC0uOC44djQuNWMwIC4yLjIuNC40LjRoMS40Yy4zIDAgLjUtLjIuNS0uNHpNNSAxMC4zVjUuOWMwLS41LjQtLjkuOS0uOWg0LjRjLjIgMCAuNC4yLjQuNFY3YzAgLjItLjIuNC0uNC40aC0zdjNjMCAuMi0uMi40LS40LjRINS40YS40LjQgMCAwIDEtLjQtLjR6bTEwLjMtNC45VjdjMCAuMi4yLjQuNC40aDN2M2MwIC4yLjIuNC40LjRoMS41Yy4yIDAgLjQtLjIuNC0uNFY1LjljMC0uNS0uNC0uOS0uOS0uOWgtNC40Yy0uMiAwLS40LjItLjQuNHptNS4zIDkuOUgxOWMtLjIgMC0uNC4yLS40LjR2M2gtM2MtLjIgMC0uNC4yLS40LjR2MS41YzAgLjIuMi40LjQuNGg0LjRjLjUgMCAuOS0uNC45LS45di00LjRjMC0uMi0uMi0uNC0uNC0uNHptLTkuOSA1LjNWMTljMC0uMi0uMi0uNC0uNC0uNGgtM3YtM2MwLS4yLS4yLS40LS40LS40SDUuNGMtLjIgMC0uNC4yLS40LjR2NC40YzAgLjUuNC45LjkuOWg0LjRjLjIgMCAuNC0uMi40LS40eiIgZmlsbD0iY3VycmVudENvbG9yIi8+PC9zdmc+); }
9
8
  #shaclMapDialogContainer { width:100%; height: 100%; }
10
- `,f=`
11
- <dialog id="shaclMapDialog" onclick="event.target==this && this.close()">
9
+ .query-editor .query-map { height: 250px; min-height: 250px; width: 100%; flex-basis: 100%; margin-top: 4px; }
10
+ .query-editor .query-map .leaflet-pane, .query-editor .query-map .leaflet-top { z-index: 0; }
11
+ .query-editor .query-map .leaflet-heatmap-layer { opacity: 0.5; }
12
+ .query-editor.query-map-editor { flex-wrap: wrap; align-items: stretch; }
13
+ .query-editor.query-map-editor > label { width: auto; flex-basis: 100%; padding-right: 0; }
14
+ .query-editor.query-map-editor > .query-controls { position: relative; flex-basis: 100%; }
15
+ .query-editor .query-map-clear { position: absolute; top: 8px; right: 8px; z-index: 1; }
16
+ .query-editor .query-map-clear::part(button) { background-color: rgba(255, 255, 255, 0.9); }
17
+ .query-editor .query-map-clear[hidden] { display: none; }
18
+ `,h=`
19
+ <dialog id="shaclMapDialog">
12
20
  <div id="shaclMapDialogContainer"></div>
13
21
  <div class="hint">&#x24D8; Draw a polygon or marker, then close dialog</div>
14
- <button class="closeButton" type="button" onclick="this.parentElement.close()">&#x2715;</button>
15
- </dialog>`,p={lng:8.657238961696038,lat:49.87627570549512},m=`&copy; <a href="http://www.openstreetmap.org/copyright">OpenStreetMap</a>`,h=`https://tile.openstreetmap.de/{z}/{x}/{y}.png`,g=o.icon({iconUrl:`data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABkAAAApCAYAAADAk4LOAAAFgUlEQVR4Aa1XA5BjWRTN2oW17d3YaZtr2962HUzbDNpjszW24mRt28p47v7zq/bXZtrp/lWnXr337j3nPCe85NcypgSFdugCpW5YoDAMRaIMqRi6aKq5E3YqDQO3qAwjVWrD8Ncq/RBpykd8oZUb/kaJutow8r1aP9II0WmLKLIsJyv1w/kqw9Ch2MYdB++12Onxee/QMwvf4/Dk/Lfp/i4nxTXtOoQ4pW5Aj7wpici1A9erdAN2OH64x8OSP9j3Ft3b7aWkTg/Fm91siTra0f9on5sQr9INejH6CUUUpavjFNq1B+Oadhxmnfa8RfEmN8VNAsQhPqF55xHkMzz3jSmChWU6f7/XZKNH+9+hBLOHYozuKQPxyMPUKkrX/K0uWnfFaJGS1QPRtZsOPtr3NsW0uyh6NNCOkU3Yz+bXbT3I8G3xE5EXLXtCXbbqwCO9zPQYPRTZ5vIDXD7U+w7rFDEoUUf7ibHIR4y6bLVPXrz8JVZEql13trxwue/uDivd3fkWRbS6/IA2bID4uk0UpF1N8qLlbBlXs4Ee7HLTfV1j54APvODnSfOWBqtKVvjgLKzF5YdEk5ewRkGlK0i33Eofffc7HT56jD7/6U+qH3Cx7SBLNntH5YIPvODnyfIXZYRVDPqgHtLs5ABHD3YzLuespb7t79FY34DjMwrVrcTuwlT55YMPvOBnRrJ4VXTdNnYug5ucHLBjEpt30701A3Ts+HEa73u6dT3FNWwflY86eMHPk+Yu+i6pzUpRrW7SNDg5JHR4KapmM5Wv2E8Tfcb1HoqqHMHU+uWDD7zg54mz5/2BSnizi9T1Dg4QQXLToGNCkb6tb1NU+QAlGr1++eADrzhn/u8Q2YZhQVlZ5+CAOtqfbhmaUCS1ezNFVm2imDbPmPng5wmz+gwh+oHDce0eUtQ6OGDIyR0uUhUsoO3vfDmmgOezH0mZN59x7MBi++WDL1g/eEiU3avlidO671bkLfwbw5XV2P8Pzo0ydy4t2/0eu33xYSOMOD8hTf4CrBtGMSoXfPLchX+J0ruSePw3LZeK0juPJbYzrhkH0io7B3k164hiGvawhOKMLkrQLyVpZg8rHFW7E2uHOL888IBPlNZ1FPzstSJM694fWr6RwpvcJK60+0HCILTBzZLFNdtAzJaohze60T8qBzyh5ZuOg5e7uwQppofEmf2++DYvmySqGBuKaicF1blQjhuHdvCIMvp8whTTfZzI7RldpwtSzL+F1+wkdZ2TBOW2gIF88PBTzD/gpeREAMEbxnJcaJHNHrpzji0gQCS6hdkEeYt9DF/2qPcEC8RM28Hwmr3sdNyht00byAut2k3gufWNtgtOEOFGUwcXWNDbdNbpgBGxEvKkOQsxivJx33iow0Vw5S6SVTrpVq11ysA2Rp7gTfPfktc6zhtXBBC+adRLshf6sG2RfHPZ5EAc4sVZ83yCN00Fk/4kggu40ZTvIEm5g24qtU4KjBrx/BTTH8ifVASAG7gKrnWxJDcU7x8X6Ecczhm3o6YicvsLXWfh3Ch1W0k8x0nXF+0fFxgt4phz8QvypiwCCFKMqXCnqXExjq10beH+UUA7+nG6mdG/Pu0f3LgFcGrl2s0kNNjpmoJ9o4B29CMO8dMT4Q5ox8uitF6fqsrJOr8qnwNbRzv6hSnG5wP+64C7h9lp30hKNtKdWjtdkbuPA19nJ7Tz3zR/ibgARbhb4AlhavcBebmTHcFl2fvYEnW0ox9xMxKBS8btJ+KiEbq9zA4RthQXDhPa0T9TEe69gWupwc6uBUphquXgf+/FrIjweHQS4/pduMe5ERUMHUd9xv8ZR98CxkS4F2n3EUrUZ10EYNw7BWm9x1GiPssi3GgiGRDKWRYZfXlON+dfNbM+GgIwYdwAAAAASUVORK5CYII=`,shadowUrl:`data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACkAAAApCAQAAAACach9AAACMUlEQVR4Ae3ShY7jQBAE0Aoz/f9/HTMzhg1zrdKUrJbdx+Kd2nD8VNudfsL/Th///dyQN2TH6f3y/BGpC379rV+S+qqetBOxImNQXL8JCAr2V4iMQXHGNJxeCfZXhSRBcQMfvkOWUdtfzlLgAENmZDcmo2TVmt8OSM2eXxBp3DjHSMFutqS7SbmemzBiR+xpKCNUIRkdkkYxhAkyGoBvyQFEJEefwSmmvBfJuJ6aKqKWnAkvGZOaZXTUgFqYULWNSHUckZuR1HIIimUExutRxwzOLROIG4vKmCKQt364mIlhSyzAf1m9lHZHJZrlAOMMztRRiKimp/rpdJDc9Awry5xTZCte7FHtuS8wJgeYGrex28xNTd086Dik7vUMscQOa8y4DoGtCCSkAKlNwpgNtphjrC6MIHUkR6YWxxs6Sc5xqn222mmCRFzIt8lEdKx+ikCtg91qS2WpwVfBelJCiQJwvzixfI9cxZQWgiSJelKnwBElKYtDOb2MFbhmUigbReQBV0Cg4+qMXSxXSyGUn4UbF8l+7qdSGnTC0XLCmahIgUHLhLOhpVCtw4CzYXvLQWQbJNmxoCsOKAxSgBJno75avolkRw8iIAFcsdc02e9iyCd8tHwmeSSoKTowIgvscSGZUOA7PuCN5b2BX9mQM7S0wYhMNU74zgsPBj3HU7wguAfnxxjFQGBE6pwN+GjME9zHY7zGp8wVxMShYX9NXvEWD3HbwJf4giO4CFIQxXScH1/TM+04kkBiAAAAAElFTkSuQmCC`,iconSize:[25,41],shadowSize:[41,41],iconAnchor:[12,41],shadowAnchor:[14,41],popupAnchor:[-3,-76]}),_=class extends r{constructor(e){super(e,s+`
16
- `+c+`
17
- `+d)}initEditMode(e){e.insertAdjacentHTML(`beforeend`,f);let t=e.querySelector(`#shaclMapDialogContainer`);this.map=o.map(t,{fullscreenControl:!0,editable:!0,layers:[o.tileLayer(h)],zoom:5,maxBounds:v,center:p}),this.map.attributionControl.addAttribution(m);let n=o.Control.extend({options:{position:`topleft`,callback:null,kind:``,html:``},onAdd:function(e){let t=o.DomUtil.create(`div`,`leaflet-control leaflet-bar`),n=o.DomUtil.create(`a`,``,t);return n.href=`#`,n.title=`Create a new `+this.options.kind,n.innerHTML=this.options.html,o.DomEvent.on(n,`click`,o.DomEvent.stop).on(n,`click`,()=>{window.LAYER=this.options.callback.call(e.editTools)},this),t}});this.map.addControl(new(n.extend({options:{callback:()=>{this.displayedShape?.remove(),this.displayedShape=this.map?.editTools.startPolygon()},kind:`polygon`,html:`▰`}}))),this.map.addControl(new(n.extend({options:{callback:()=>{this.displayedShape?.remove(),this.displayedShape=this.map?.editTools.startMarker(void 0,{icon:g})},kind:`marker`,html:`•`}}))),this.map.on(`editable:drawing:end`,()=>{this.saveChanges()}),this.map.on(`editable:vertex:dragend`,()=>{this.saveChanges()});let r=e.querySelector(`#shaclMapDialog`);return r.addEventListener(`close`,()=>{let e=document.body.style.top;document.body.style.position=``,document.body.style.top=``,window.scrollTo(0,parseInt(e||`0`)*-1),this.currentEditor&&this.createdGeometry&&(this.currentEditor.value=b(this.createdGeometry),this.currentEditor.dispatchEvent(new Event(`change`,{bubbles:!0})))}),r}createEditor(e,t){let n=e.config.form.querySelector(`#shaclMapDialog`);n||=this.initEditMode(e.config.form);let r=e.config.theme.createButton(`Open&#160;map...`,!1);r.style.marginLeft=`5px`,r.classList.add(`open-map-button`),r.onclick=()=>{this.currentEditor=i.querySelector(`.editor`),this.createdGeometry=void 0,this.displayedShape?.remove(),this.drawAndZoomToGeometry(y(this.currentEditor.value||``),this.map),document.body.style.top=`-${window.scrollY}px`,document.body.style.position=`fixed`,n.showModal()};let i=u(e,t||null,!0);return i.appendChild(r),i}createViewer(e,t){let n=document.createElement(`div`),r=y(t.value);if(r?.coordinates?.length){let e=o.map(n,{fullscreenControl:!0,layers:[o.tileLayer(h)],zoom:5,center:p,maxBounds:v});e.attributionControl.addAttribution(m),this.drawAndZoomToGeometry(r,e)}return n}drawAndZoomToGeometry(e,t){if(setTimeout(()=>{t.invalidateSize()}),e?.type===`Point`){let n={lng:e.coordinates[0],lat:e.coordinates[1]};this.displayedShape=o.marker(n,{icon:g}).addTo(t),t.setView(n,15,{animate:!1})}else if(e?.type===`Polygon`){let n=e.coordinates[0].map(e=>({lng:e[0],lat:e[1]})),r=o.polygon(n).addTo(t);this.displayedShape=r,t.fitBounds(r.getBounds(),{animate:!1}),setTimeout(()=>{t.fitBounds(r.getBounds(),{animate:!1}),t.setView(r.getCenter(),void 0,{animate:!1})},1)}else t.setZoom(5)}saveChanges(){if(this.displayedShape instanceof o.Marker){let e=this.displayedShape.getLatLng();this.createdGeometry={type:`Point`,coordinates:[e.lng,e.lat]}}else if(this.displayedShape instanceof o.Polygon){let e=this.displayedShape.getLatLngs();e[0][0].equals(e[0][e[0].length-1])||e[0].push(e[0][0]),this.createdGeometry={type:`Polygon`,coordinates:[e[0].map(e=>[e.lng,e.lat])]}}else this.createdGeometry=void 0}},v=[[-90,-180],[90,180]];function y(e){let t=e.match(/^POINT\((.*)\)$/);if(t?.length==2){let e=t[1].split(` `);if(e.length===2)return{type:`Point`,coordinates:[parseFloat(e[0]),parseFloat(e[1])]}}let n=e.match(/^POLYGON[(]{2}(.*)[)]{2}$/);if(n?.length==2){let e=n[1].split(`,`);if(e.length>2){let t=[],n=[];t.push(n);for(let t of e){let e=t.split(` `);e.length===2&&n.push([parseFloat(e[0]),parseFloat(e[1])])}return{type:`Polygon`,coordinates:t}}}}function b(e){return e.type===`Point`?`POINT(${e.coordinates.join(` `)})`:e.type===`Polygon`?`POLYGON((${e.coordinates[0].map(e=>e.join(` `)).join(`,`)}))`:``}export{_ as LeafletPlugin,b as geometryToWkt,y as wktToGeometry,v as worldBounds};
22
+ <button class="closeButton" type="button">&#x2715;</button>
23
+ </dialog>`,g={lng:8.657238961696038,lat:49.87627570549512},_=`&copy; <a href="http://www.openstreetmap.org/copyright">OpenStreetMap</a>`,v=`https://tile.openstreetmap.de/{z}/{x}/{y}.png`,y=o.icon({iconUrl:`data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABkAAAApCAYAAADAk4LOAAAFgUlEQVR4Aa1XA5BjWRTN2oW17d3YaZtr2962HUzbDNpjszW24mRt28p47v7zq/bXZtrp/lWnXr337j3nPCe85NcypgSFdugCpW5YoDAMRaIMqRi6aKq5E3YqDQO3qAwjVWrD8Ncq/RBpykd8oZUb/kaJutow8r1aP9II0WmLKLIsJyv1w/kqw9Ch2MYdB++12Onxee/QMwvf4/Dk/Lfp/i4nxTXtOoQ4pW5Aj7wpici1A9erdAN2OH64x8OSP9j3Ft3b7aWkTg/Fm91siTra0f9on5sQr9INejH6CUUUpavjFNq1B+Oadhxmnfa8RfEmN8VNAsQhPqF55xHkMzz3jSmChWU6f7/XZKNH+9+hBLOHYozuKQPxyMPUKkrX/K0uWnfFaJGS1QPRtZsOPtr3NsW0uyh6NNCOkU3Yz+bXbT3I8G3xE5EXLXtCXbbqwCO9zPQYPRTZ5vIDXD7U+w7rFDEoUUf7ibHIR4y6bLVPXrz8JVZEql13trxwue/uDivd3fkWRbS6/IA2bID4uk0UpF1N8qLlbBlXs4Ee7HLTfV1j54APvODnSfOWBqtKVvjgLKzF5YdEk5ewRkGlK0i33Eofffc7HT56jD7/6U+qH3Cx7SBLNntH5YIPvODnyfIXZYRVDPqgHtLs5ABHD3YzLuespb7t79FY34DjMwrVrcTuwlT55YMPvOBnRrJ4VXTdNnYug5ucHLBjEpt30701A3Ts+HEa73u6dT3FNWwflY86eMHPk+Yu+i6pzUpRrW7SNDg5JHR4KapmM5Wv2E8Tfcb1HoqqHMHU+uWDD7zg54mz5/2BSnizi9T1Dg4QQXLToGNCkb6tb1NU+QAlGr1++eADrzhn/u8Q2YZhQVlZ5+CAOtqfbhmaUCS1ezNFVm2imDbPmPng5wmz+gwh+oHDce0eUtQ6OGDIyR0uUhUsoO3vfDmmgOezH0mZN59x7MBi++WDL1g/eEiU3avlidO671bkLfwbw5XV2P8Pzo0ydy4t2/0eu33xYSOMOD8hTf4CrBtGMSoXfPLchX+J0ruSePw3LZeK0juPJbYzrhkH0io7B3k164hiGvawhOKMLkrQLyVpZg8rHFW7E2uHOL888IBPlNZ1FPzstSJM694fWr6RwpvcJK60+0HCILTBzZLFNdtAzJaohze60T8qBzyh5ZuOg5e7uwQppofEmf2++DYvmySqGBuKaicF1blQjhuHdvCIMvp8whTTfZzI7RldpwtSzL+F1+wkdZ2TBOW2gIF88PBTzD/gpeREAMEbxnJcaJHNHrpzji0gQCS6hdkEeYt9DF/2qPcEC8RM28Hwmr3sdNyht00byAut2k3gufWNtgtOEOFGUwcXWNDbdNbpgBGxEvKkOQsxivJx33iow0Vw5S6SVTrpVq11ysA2Rp7gTfPfktc6zhtXBBC+adRLshf6sG2RfHPZ5EAc4sVZ83yCN00Fk/4kggu40ZTvIEm5g24qtU4KjBrx/BTTH8ifVASAG7gKrnWxJDcU7x8X6Ecczhm3o6YicvsLXWfh3Ch1W0k8x0nXF+0fFxgt4phz8QvypiwCCFKMqXCnqXExjq10beH+UUA7+nG6mdG/Pu0f3LgFcGrl2s0kNNjpmoJ9o4B29CMO8dMT4Q5ox8uitF6fqsrJOr8qnwNbRzv6hSnG5wP+64C7h9lp30hKNtKdWjtdkbuPA19nJ7Tz3zR/ibgARbhb4AlhavcBebmTHcFl2fvYEnW0ox9xMxKBS8btJ+KiEbq9zA4RthQXDhPa0T9TEe69gWupwc6uBUphquXgf+/FrIjweHQS4/pduMe5ERUMHUd9xv8ZR98CxkS4F2n3EUrUZ10EYNw7BWm9x1GiPssi3GgiGRDKWRYZfXlON+dfNbM+GgIwYdwAAAAASUVORK5CYII=`,shadowUrl:`data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACkAAAApCAQAAAACach9AAACMUlEQVR4Ae3ShY7jQBAE0Aoz/f9/HTMzhg1zrdKUrJbdx+Kd2nD8VNudfsL/Th///dyQN2TH6f3y/BGpC379rV+S+qqetBOxImNQXL8JCAr2V4iMQXHGNJxeCfZXhSRBcQMfvkOWUdtfzlLgAENmZDcmo2TVmt8OSM2eXxBp3DjHSMFutqS7SbmemzBiR+xpKCNUIRkdkkYxhAkyGoBvyQFEJEefwSmmvBfJuJ6aKqKWnAkvGZOaZXTUgFqYULWNSHUckZuR1HIIimUExutRxwzOLROIG4vKmCKQt364mIlhSyzAf1m9lHZHJZrlAOMMztRRiKimp/rpdJDc9Awry5xTZCte7FHtuS8wJgeYGrex28xNTd086Dik7vUMscQOa8y4DoGtCCSkAKlNwpgNtphjrC6MIHUkR6YWxxs6Sc5xqn222mmCRFzIt8lEdKx+ikCtg91qS2WpwVfBelJCiQJwvzixfI9cxZQWgiSJelKnwBElKYtDOb2MFbhmUigbReQBV0Cg4+qMXSxXSyGUn4UbF8l+7qdSGnTC0XLCmahIgUHLhLOhpVCtw4CzYXvLQWQbJNmxoCsOKAxSgBJno75avolkRw8iIAFcsdc02e9iyCd8tHwmeSSoKTowIgvscSGZUOA7PuCN5b2BX9mQM7S0wYhMNU74zgsPBj3HU7wguAfnxxjFQGBE6pwN+GjME9zHY7zGp8wVxMShYX9NXvEWD3HbwJf4giO4CFIQxXScH1/TM+04kkBiAAAAAElFTkSuQmCC`,iconSize:[25,41],shadowSize:[41,41],iconAnchor:[12,41],shadowAnchor:[14,41],popupAnchor:[-3,-76]});function b(e,t){return o.map(e,{...t,layers:[o.tileLayer(v)]})}function x(e,t){return window.L.heatLayer(e,{maxZoom:t})}function S(e,t,n){return new(o.Control.extend({options:{position:`topleft`},onAdd:()=>{let r=o.DomUtil.create(`div`,`leaflet-control leaflet-bar`),i=o.DomUtil.create(`a`,``,r);return i.href=`#`,i.title=e,i.innerHTML=t,o.DomEvent.on(i,`click`,o.DomEvent.stop).on(i,`click`,n),r}}))}var C=class extends r{constructor(e){super(e,s+`
24
+ `+p+`
25
+ `+m)}initEditMode(e){e.insertAdjacentHTML(`beforeend`,h);let t=e.querySelector(`#shaclMapDialogContainer`);this.map=b(t,{fullscreenControl:!0,editable:!0,zoom:5,maxBounds:A,center:g}),this.map.attributionControl.addAttribution(_);let n=this.map;this.map.addControl(S(`Create a new polygon`,`▰`,()=>{this.displayedShape?.remove(),this.displayedShape=n.editTools.startPolygon()})),this.map.addControl(S(`Create a new marker`,`•`,()=>{this.displayedShape?.remove(),this.displayedShape=n.editTools.startMarker(void 0,{icon:y})})),this.map.on(`editable:drawing:end editable:vertex:dragend`,()=>{this.saveChanges()});let r=e.querySelector(`#shaclMapDialog`);return r.addEventListener(`click`,e=>{e.target===r&&r.close()}),r.querySelector(`.closeButton`)?.addEventListener(`click`,()=>r.close()),r.addEventListener(`close`,()=>{let e=document.body.style.top;document.body.style.position=``,document.body.style.top=``,window.scrollTo(0,parseInt(e||`0`)*-1),this.currentEditor&&this.createdGeometry&&(this.currentEditor.value=N(this.createdGeometry),this.currentEditor.dispatchEvent(new Event(`change`,{bubbles:!0})))}),r}createEditor(e,t){let n=e.config.form.querySelector(`#shaclMapDialog`);n||=this.initEditMode(e.config.form);let r=e.config.theme.createButton(`Open&#160;map...`,!1);r.style.marginLeft=`5px`,r.classList.add(`open-map-button`),r.onclick=()=>{this.currentEditor=i.querySelector(`.editor`),this.createdGeometry=void 0,this.displayedShape?.remove(),this.drawAndZoomToGeometry(j(this.currentEditor.value||``),this.map),document.body.style.top=`-${window.scrollY}px`,document.body.style.position=`fixed`,n.showModal()};let i=f(e,t||null,!0);return i.appendChild(r),i}createQueryEditor(e,t){let n=document.createElement(`div`);n.classList.add(`query-editor`,`query-map-editor`),n.dataset.queryFieldId=e.id,n.setAttribute(`part`,`query-editor`);let r=document.createElement(`label`);r.textContent=t.label,t.description&&(r.title=t.description.value),n.appendChild(r);let i=document.createElement(`div`);i.classList.add(`query-controls`),n.appendChild(i);let a=document.createElement(`div`);a.classList.add(`query-map`),i.appendChild(a);let s=new l;s.classList.add(`clear`,`query-map-clear`),s.title=`Clear`,s.dense=t.config.theme.dense,s.icon=!0,s.hidden=!0,i.appendChild(s);let c=!1,d,f=b(a,{attributionControl:!1,fullscreenControl:!0,maxBoundsViscosity:1,trackResize:!1,zoom:0});f.fitBounds(A).setMaxBounds(A),f.on(`moveend`,()=>{c=f.getZoom()>0,s.hidden=!c;let e=c?T(f.getBounds()):void 0;e!==d&&(d=e,n.dispatchEvent(new Event(`change`,{bubbles:!0})))}),s.addEventListener(`click`,e=>{e.stopPropagation(),f.fitBounds(A,{animate:!1})});let p,m=o.featureGroup().addTo(f),h=e=>{if(m.clearLayers(),p=void 0,e)if(e.heatmap){if(!w(f,a)){p=e;return}let t=P(e.heatmap);t.length&&x(t,f.getZoom()||0).addTo(m)}else D(e,m)};return new ResizeObserver(()=>{a.clientWidth<=0||a.clientHeight<=0||(f.invalidateSize({debounceMoveend:!0}),p&&h(p))}).observe(a),n.getQueryCriteria=()=>!c||!d?[]:[{field:e,operator:`equals`,value:u.literal(d,t.datatype)}],n.setQueryFacet=h,n}createViewer(e,t){let n=document.createElement(`div`),r=j(t.value);if(r){let e=b(n,{fullscreenControl:!0,zoom:5,center:g,maxBounds:A});e.attributionControl.addAttribution(_),k(r,e)}return n}drawAndZoomToGeometry(e,t){this.displayedShape=k(e,t)}saveChanges(){if(this.displayedShape instanceof o.Marker){let{lng:e,lat:t}=this.displayedShape.getLatLng();this.createdGeometry={type:`Point`,coordinates:[e,t]};return}if(this.displayedShape instanceof o.Polygon){let e=this.displayedShape.getLatLngs()[0];if(!e.length){this.createdGeometry=void 0;return}let t=e.map(({lng:e,lat:t})=>[e,t]);e[0].equals(e[e.length-1])||t.push([...t[0]]),this.createdGeometry={type:`Polygon`,coordinates:[t]};return}this.createdGeometry=void 0}};function w(e,t){let n=t.getBoundingClientRect(),r=e.getSize();return n.width>0&&n.height>0&&r.x>0&&r.y>0}function T(e){let t=E(e.getSouth(),-90,90),n=E(e.getWest(),-180,180),r=E(e.getNorth(),-90,90),i=E(e.getEast(),-180,180);return`POLYGON((${n} ${t},${i} ${t},${i} ${r},${n} ${r},${n} ${t}))`}function E(e,t,n){return Math.min(n,Math.max(t,e))}function D(e,t){if(!e.buckets?.length)return;let n=Math.max(...e.buckets.map(e=>e.count));for(let r of e.buckets){let e=j(r.value.value);if(!e)continue;let i=n>0?r.count/n:0;if(e.type===`Point`){let[n,r]=e.coordinates;o.circleMarker({lat:r,lng:n},{radius:4+i*16,fillColor:`#3388ff`,fillOpacity:.4+i*.4,color:`#3388ff`,weight:1}).addTo(t)}else o.polygon(O(e.coordinates[0]),{fillColor:`#3388ff`,fillOpacity:.15+i*.35,color:`#3388ff`,weight:1}).addTo(t)}}function O(e){return e.map(([e,t])=>({lat:t,lng:e}))}function k(e,t){if(setTimeout(()=>t.invalidateSize()),e?.type===`Point`){let[n,r]=e.coordinates,i={lng:n,lat:r},a=o.marker(i,{icon:y}).addTo(t);return t.setView(i,15,{animate:!1}),a}if(e?.type===`Polygon`){let n=o.polygon(O(e.coordinates[0])).addTo(t),r=n.getBounds();return t.fitBounds(r,{animate:!1}),setTimeout(()=>{t.fitBounds(r,{animate:!1}),t.setView(n.getCenter(),void 0,{animate:!1})},1),n}t.setZoom(5)}var A=[[-90,-180],[90,180]];function j(e){let t=e.match(/^POINT\s*\(\s*([^()]+)\s*\)$/i);if(t){let e=M(t[1]);return e?{type:`Point`,coordinates:e}:void 0}let n=e.match(/^POLYGON\s*\(\(\s*(.*?)\s*\)\)$/i);if(!n)return;let r=n[1].split(`,`).map(M);if(!(r.length<3||r.some(e=>!e)))return{type:`Polygon`,coordinates:[r]}}function M(e){let t=e.trim().split(/\s+/).map(Number);return t.length===2&&t.every(Number.isFinite)?t:void 0}function N(e){return e.type===`Point`?`POINT(${e.coordinates.join(` `)})`:`POLYGON((${e.coordinates[0].map(e=>e.join(` `)).join(`,`)}))`}function P(e){let t=[];if(e.columns<=0||e.rows<=0||!Number.isFinite(e.minX)||!Number.isFinite(e.maxX)||!Number.isFinite(e.minY)||!Number.isFinite(e.maxY))return t;let n=(e.maxX-e.minX)/e.columns,r=(e.maxY-e.minY)/e.rows;for(let i=0;i<Math.min(e.rows,e.counts.length);i++){let a=e.counts[i];if(a!==null)for(let o=0;o<Math.min(e.columns,a.length);o++){if(!Number.isFinite(a[o])||a[o]<=0)continue;let s=e.maxY-(i+.5)*r,c=e.minX+(o+.5)*n;t.push([s,c,a[o]])}}return t}export{C as LeafletPlugin,N as geometryToWkt,j as wktToGeometry,A as worldBounds};
@@ -1,7 +1,7 @@
1
1
  import { Literal, NamedNode, Quad } from 'n3';
2
2
  import { Term } from '@rdfjs/types';
3
- import { Config } from './config';
4
- import { ShaclNodeTemplate } from './node-template';
3
+ import { Config } from './config.js';
4
+ import { ShaclNodeTemplate } from './node-template.js';
5
5
  export declare const mappers: Record<string, (template: ShaclPropertyTemplate, term: Term) => void>;
6
6
  export declare class ShaclPropertyTemplate {
7
7
  label: string;
@@ -1,13 +1,14 @@
1
1
  import { BlankNode, NamedNode, Quad, Store } from 'n3';
2
2
  import { Term } from '@rdfjs/types';
3
- import { ShaclNode } from './node';
4
- import { ShaclPropertyTemplate } from './property-template';
3
+ import { ShaclNode } from './node.js';
4
+ import { ShaclPropertyTemplate } from './property-template.js';
5
5
  export declare class ShaclProperty extends HTMLElement {
6
6
  template: ShaclPropertyTemplate;
7
7
  container: HTMLElement;
8
8
  parent: ShaclNode;
9
9
  constructor(template: ShaclPropertyTemplate, parent: ShaclNode);
10
10
  bindValues(valueSubject: NamedNode | BlankNode | undefined, multiValuedPath?: boolean): Promise<void>;
11
+ initializeQuery(): Promise<void>;
11
12
  addPropertyInstance(value?: Term, linked?: boolean, forceRemovable?: boolean): Promise<HTMLElement | undefined>;
12
13
  updateControls(): Promise<void>;
13
14
  instanceCount(): number;
@@ -17,3 +18,4 @@ export declare class ShaclProperty extends HTMLElement {
17
18
  createAddControls(): Promise<HTMLDivElement>;
18
19
  }
19
20
  export declare function createPropertyInstance(template: ShaclPropertyTemplate, value?: Term, forceRemovable?: boolean, linked?: boolean, parentNode?: ShaclNode): Promise<HTMLElement>;
21
+ export declare function createRemoveButtonWrapper(colorize: boolean): HTMLDivElement;
@@ -0,0 +1,3 @@
1
+ import { QueryEditor, QueryField } from './index.js';
2
+ import { ShaclPropertyTemplate } from '../property-template.js';
3
+ export declare function createQueryEditor(field: QueryField, template: ShaclPropertyTemplate): QueryEditor;
@@ -0,0 +1,55 @@
1
+ import { Term } from '@rdfjs/types';
2
+ export type QueryField = {
3
+ id: string;
4
+ path: string[];
5
+ shapePath?: string[];
6
+ datatype?: string;
7
+ };
8
+ export declare function isRangeQueryField(field: QueryField): boolean;
9
+ export type QueryCriterion = {
10
+ field: QueryField;
11
+ operator: 'contains' | 'equals' | 'range';
12
+ value?: Term;
13
+ min?: Term;
14
+ max?: Term;
15
+ };
16
+ export type Query = {
17
+ rootShapeId: string;
18
+ targetClass?: string;
19
+ criteria: QueryCriterion[];
20
+ };
21
+ export type HeatmapGrid = {
22
+ columns: number;
23
+ rows: number;
24
+ minX: number;
25
+ maxX: number;
26
+ minY: number;
27
+ maxY: number;
28
+ counts: number[][];
29
+ };
30
+ export type QueryFacet = {
31
+ fieldId: string;
32
+ count: number;
33
+ buckets?: {
34
+ value: Term;
35
+ label?: string;
36
+ count: number;
37
+ }[];
38
+ min?: Term;
39
+ max?: Term;
40
+ heatmap?: HeatmapGrid;
41
+ error?: boolean;
42
+ };
43
+ export type QueryFacetRequest = {
44
+ query: Query;
45
+ fields: QueryField[];
46
+ signal: AbortSignal;
47
+ };
48
+ export interface QueryFacetProvider {
49
+ getFacets(request: QueryFacetRequest): Promise<QueryFacet[]>;
50
+ }
51
+ export type QueryEditor = HTMLElement & {
52
+ queryField: QueryField;
53
+ getQueryCriteria: () => QueryCriterion[];
54
+ setQueryFacet: (facet?: QueryFacet) => void;
55
+ };
@@ -0,0 +1,24 @@
1
+ import type { ShaclForm } from '../form.js';
2
+ import { ShaclProperty } from '../property.js';
3
+ import { ShaclPropertyTemplate } from '../property-template.js';
4
+ import type { Query } from './index.js';
5
+ export declare class QueryModeController {
6
+ readonly stylesheet: CSSStyleSheet;
7
+ private readonly host;
8
+ private facetAbortController?;
9
+ private facetRequest;
10
+ private facetsApplied;
11
+ constructor(host: ShaclForm);
12
+ initialize(): Promise<void>;
13
+ handleChange(): void;
14
+ getQuery(): Query;
15
+ refreshFacets(): void;
16
+ dispose(): void;
17
+ private emitQueryAndRefreshFacets;
18
+ private requestFacets;
19
+ private applyFacets;
20
+ private setFacetsPending;
21
+ }
22
+ export declare function initializeQueryProperty(property: ShaclProperty): Promise<void>;
23
+ export declare function activateNodeConstraintOption(properties: ShaclProperty[], constraintElement: HTMLElement): Promise<void>;
24
+ export declare function activatePropertyConstraintOption(template: ShaclPropertyTemplate, context: ShaclProperty, constraintElement: HTMLElement): Promise<void>;
@@ -0,0 +1,75 @@
1
+ import { NamedNode } from 'n3';
2
+ import { Term } from '@rdfjs/types';
3
+ import { QueryFacet, QueryFacetRequest, QueryField, QueryFacetProvider, Query } from './index.js';
4
+ export type SparqlDatasetScope = {
5
+ type: 'default';
6
+ } | {
7
+ type: 'named';
8
+ graph?: NamedNode;
9
+ };
10
+ export type SparqlRootPatternContext = {
11
+ query: Query;
12
+ rootVariable: string;
13
+ graphVariable?: string;
14
+ };
15
+ export type SparqlQueryBuilderOptions = {
16
+ dataset?: SparqlDatasetScope;
17
+ rootPattern?: (context: SparqlRootPatternContext) => string;
18
+ caseSensitive?: boolean;
19
+ };
20
+ export type SparqlSelectOptions = {
21
+ projection?: string[];
22
+ distinct?: boolean;
23
+ orderBy?: string;
24
+ limit?: number;
25
+ offset?: number;
26
+ };
27
+ export type SparqlBindingValue = {
28
+ type: 'uri' | 'literal' | 'typed-literal' | 'bnode';
29
+ value: string;
30
+ datatype?: string;
31
+ 'xml:lang'?: string;
32
+ };
33
+ export type SparqlSelectResult = {
34
+ head?: {
35
+ vars?: string[];
36
+ };
37
+ results: {
38
+ bindings: Record<string, SparqlBindingValue>[];
39
+ };
40
+ };
41
+ export type SparqlSelectExecutor = (query: string, signal: AbortSignal) => Promise<SparqlSelectResult>;
42
+ export type SparqlQueryProviderOptions = SparqlQueryBuilderOptions & {
43
+ bucketLimit?: number;
44
+ headers?: Record<string, string>;
45
+ onError?: (error: unknown, field: QueryField) => void;
46
+ };
47
+ export declare class SparqlQueryBuilder {
48
+ readonly options: SparqlQueryBuilderOptions;
49
+ constructor(options?: SparqlQueryBuilderOptions);
50
+ buildWhere(query: Query): string;
51
+ buildSelect(query: Query, options?: SparqlSelectOptions): string;
52
+ buildFacetSelect(request: QueryFacetRequest, field: QueryField, bucketLimit?: number): string;
53
+ buildFacetsSelect(request: QueryFacetRequest, bucketLimit?: number): string;
54
+ private rootPattern;
55
+ /**
56
+ * Builds SPARQL patterns for each criterion. Variable names are scoped by prefix:
57
+ * - `criterion_{fieldIndex}_{pathHop}` for intermediate path nodes
58
+ * - `value_{criterionIndex}` for the terminal bound variable
59
+ * These prefixes ensure no collision with facet variables (`facet_{fieldId}_{pathHop}`).
60
+ */
61
+ private criterionPatterns;
62
+ private pathPattern;
63
+ private wrapDataset;
64
+ }
65
+ export declare class SparqlQueryProvider implements QueryFacetProvider {
66
+ readonly builder: SparqlQueryBuilder;
67
+ readonly executor: SparqlSelectExecutor;
68
+ readonly bucketLimit: number;
69
+ readonly onError?: (error: unknown, field: QueryField) => void;
70
+ constructor(endpoint: string, options?: SparqlQueryProviderOptions);
71
+ constructor(executor: SparqlSelectExecutor, options?: SparqlQueryProviderOptions);
72
+ getFacets(request: QueryFacetRequest): Promise<QueryFacet[]>;
73
+ select(query: Query, options?: SparqlSelectOptions, signal?: AbortSignal): Promise<SparqlSelectResult>;
74
+ }
75
+ export declare function termToSparql(term: Term): string;
@@ -1,5 +1,5 @@
1
1
  import { Prefixes, Quad } from 'n3';
2
- import { RdfUrlResolver } from './plugin';
2
+ import { RdfUrlResolver } from './plugin.js';
3
3
  export declare const rdfCache: Record<string, Promise<Quad[]>>;
4
4
  export declare const prefixes: Prefixes;
5
5
  type RdfSource = {
@@ -1,4 +1,4 @@
1
1
  import { NamedNode, Quad, Literal, Prefixes } from 'n3';
2
- import { Editor } from './theme';
2
+ import { Editor } from './theme.js';
3
3
  export declare function serialize(quads: Quad[], format: string, prefixes?: Prefixes): string;
4
4
  export declare function toRDF(editor: Editor): NamedNode | Literal | undefined;
package/dist/sparql.js ADDED
@@ -0,0 +1,9 @@
1
+ import{DataFactory as e}from"n3";e.namedNode(`loaded-shapes`),e.namedNode(`loaded-data`);var t=e.namedNode(`http://www.w3.org/1999/02/22-rdf-syntax-ns#type`);e.namedNode(`http://www.w3.org/1999/02/22-rdf-syntax-ns#langString`);var n=e.namedNode(`http://purl.org/dc/terms/conformsTo`);e.namedNode(`http://www.w3.org/2000/01/rdf-schema#subClassOf`),e.namedNode(`http://www.w3.org/2002/07/owl#imports`),e.namedNode(`http://www.w3.org/2004/02/skos/core#broader`),e.namedNode(`http://www.w3.org/2004/02/skos/core#narrower`),e.namedNode(`http://www.w3.org/ns/shacl#NodeShape`),e.namedNode(`http://www.w3.org/ns/shacl#IRI`),e.namedNode(`http://www.w3.org/ns/shacl#property`),e.namedNode(`http://www.w3.org/ns/shacl#class`),e.namedNode(`http://www.w3.org/ns/shacl#node`),e.namedNode(`http://www.w3.org/ns/shacl#targetClass`),e.namedNode(`http://www.w3.org/ns/shacl#nodeKind`),e.namedNode(`http://www.w3.org/2001/XMLSchema#string`),e.namedNode(`http://www.w3.org/2001/XMLSchema#boolean`);var r=new Set([`http://www.w3.org/2001/XMLSchema#integer`,`http://www.w3.org/2001/XMLSchema#int`,`http://www.w3.org/2001/XMLSchema#short`,`http://www.w3.org/2001/XMLSchema#byte`,`http://www.w3.org/2001/XMLSchema#unsignedInt`,`http://www.w3.org/2001/XMLSchema#unsignedShort`,`http://www.w3.org/2001/XMLSchema#unsignedByte`,`http://www.w3.org/2001/XMLSchema#long`,`http://www.w3.org/2001/XMLSchema#unsignedLong`,`http://www.w3.org/2001/XMLSchema#float`,`http://www.w3.org/2001/XMLSchema#double`,`http://www.w3.org/2001/XMLSchema#decimal`,`http://www.w3.org/2001/XMLSchema#date`,`http://www.w3.org/2001/XMLSchema#dateTime`]);function i(e){return e.datatype!==void 0&&r.has(e.datatype)}var a=`?root`,o=class{constructor(e={}){this.options=e}buildWhere(e){let t=[this.rootPattern(e),...this.criterionPatterns(e)].filter(Boolean).join(`
2
+ `);return this.wrapDataset(t)}buildSelect(e,t={}){let n=t.projection?.length?t.projection.join(` `):a,r=`SELECT ${t.distinct===!1?``:`DISTINCT `}${n} WHERE {\n${g(this.buildWhere(e))}\n}`;return t.orderBy&&(r+=`\nORDER BY ${t.orderBy}`),t.limit!==void 0&&(r+=`\nLIMIT ${v(t.limit,`limit`)}`),t.offset!==void 0&&(r+=`\nOFFSET ${v(t.offset,`offset`)}`),r}buildFacetSelect(e,t,n=100){let r=`?facetValue`,o=[this.rootPattern(e.query),...this.criterionPatterns(e.query),this.pathPattern(t.path,r,`facet_${_(t.id)}`)].filter(Boolean).join(`
3
+ `),s=this.wrapDataset(o);return i(t)?`SELECT (COUNT(DISTINCT ${a}) AS ?count) (MIN(${r}) AS ?min) (MAX(${r}) AS ?max) WHERE {\n${g(s)}\n}`:`SELECT ${r} ?count ?total WHERE {\n { SELECT ${r} (COUNT(DISTINCT ${a}) AS ?count) WHERE {\n${g(g(s))}\n } GROUP BY ${r} }\n { SELECT (COUNT(DISTINCT ${a}) AS ?total) WHERE {\n${g(g(s))}\n } }\n}\nORDER BY DESC(?count)\nLIMIT ${v(n,`bucketLimit`)}`}buildFacetsSelect(e,t=100){return`SELECT ?fieldId ?facetValue ?count ?total ?min ?max WHERE {\n${e.fields.map(n=>{let r=`?facetValue`,o=[this.rootPattern(e.query),...this.criterionPatterns(e.query),this.pathPattern(n.path,r,`facet_${_(n.id)}`)].filter(Boolean).join(`
4
+ `),s=this.wrapDataset(o),c=`BIND(${p(n.id)} AS ?fieldId)`;return i(n)?`{\n ${c}\n { SELECT (COUNT(DISTINCT ${a}) AS ?count) (MIN(${r}) AS ?min) (MAX(${r}) AS ?max) WHERE {\n${g(g(s))}\n } }\n}`:`{\n ${c}\n { SELECT ${r} (COUNT(DISTINCT ${a}) AS ?count) WHERE {\n${g(g(s))}\n } GROUP BY ${r} ORDER BY DESC(?count) LIMIT ${v(t,`bucketLimit`)} }\n { SELECT (COUNT(DISTINCT ${a}) AS ?total) WHERE {\n${g(g(s))}\n } }\n}`}).map(g).join(`
5
+ UNION
6
+ `)}\n}`}rootPattern(r){return this.options.rootPattern?this.options.rootPattern({query:r,rootVariable:a,graphVariable:this.options.dataset?.type===`named`&&!this.options.dataset.graph?`?graph`:void 0}):r.targetClass?`${a} ${l(t)} ${l(e.namedNode(r.targetClass))} .`:`${a} ${l(n)} ${l(e.namedNode(r.rootShapeId))} .`}criterionPatterns(e){return e.criteria.flatMap((e,t)=>{let n=`?value_${t}`,r=this.pathPattern(e.field.path,n,`criterion_${t}`);if(e.operator===`equals`&&e.value)return[r,`VALUES ${n} { ${l(e.value)} }`];if(e.operator===`contains`&&e.value){let t=p(e.value.value),i=[`FILTER(CONTAINS(${this.options.caseSensitive?`STR(${n})`:`LCASE(STR(${n}))`}, ${this.options.caseSensitive?t:`LCASE(${t})`}))`];return e.value.termType===`Literal`&&e.value.language&&i.push(`FILTER(LANGMATCHES(LANG(${n}), ${p(e.value.language)}))`),[r,...i]}if(e.operator===`range`){let t=[];return e.min&&t.push(`FILTER(${n} >= ${l(e.min)})`),e.max&&t.push(`FILTER(${n} <= ${l(e.max)})`),[r,...t]}return[]})}pathPattern(t,n,r){let i=a;return t.map((a,o)=>{let s=o===t.length-1?n:`?${r}_${o}`,c=`${i} ${l(e.namedNode(a))} ${s} .`;return i=s,c}).join(`
7
+ `)}wrapDataset(e){let t=this.options.dataset??{type:`default`};return t.type==="default"?e:`GRAPH ${t.graph?l(t.graph):`?graph`} {\n${g(e)}\n}`}},s=class{constructor(e,t={}){this.builder=new o(t),this.executor=typeof e==`string`?c(e,t.headers):e,this.bucketLimit=Math.max(0,Math.floor(t.bucketLimit??100)),this.onError=t.onError}async getFacets(e){let t=[...e.fields];if(t.length===0)return[];if(e.signal.aborted)throw new DOMException(`Facet request aborted`,`AbortError`);try{let n=this.builder.buildFacetsSelect(e,this.bucketLimit),r=(await this.executor(n,e.signal)).results?.bindings??[],i=new Map;for(let e of r){let t=e.fieldId?.value;if(t){let n=i.get(t)??[];n.push(e),i.set(t,n)}}return t.map(e=>u(e,{results:{bindings:i.get(e.id)??[]}}))}catch(n){if(e.signal.aborted)throw n;return t.map(e=>(this.onError?.(n,e),{fieldId:e.id,count:0,error:!0}))}}async select(e,t={},n=new AbortController().signal){return this.executor(this.builder.buildSelect(e,t),n)}};function c(e,t={}){let n={"content-type":`application/x-www-form-urlencoded`,accept:`application/sparql-results+json`,...t};return async(t,r)=>{let i=await fetch(e,{method:`POST`,signal:r,headers:n,body:new URLSearchParams({query:t})});if(!i.ok)throw Error(`SPARQL request failed: ${i.status}`);return i.json()}}function l(e){if(e.termType===`NamedNode`)return`<${m(e.value)}>`;if(e.termType===`BlankNode`)return`_:${h(e.value)}`;if(e.termType===`Literal`){let t=e,n=p(t.value);return t.language?`${n}@${t.language.replace(/[^A-Za-z0-9-]/g,``)}`:t.datatype?`${n}^^<${m(t.datatype.value)}>`:n}throw Error(`Unsupported RDF term in SPARQL query: ${e.termType}`)}function u(e,t){let n=t.results?.bindings??[];if(i(e)){let t=n[0]??{};return{fieldId:e.id,count:f(t.count),min:t.min?d(t.min):void 0,max:t.max?d(t.max):void 0}}let r=n.flatMap(e=>e.facetValue?[{value:d(e.facetValue),count:f(e.count)}]:[]);return{fieldId:e.id,count:f(n[0]?.total),buckets:r}}function d(t){return t.type===`uri`?e.namedNode(t.value):t.type===`bnode`?e.blankNode(t.value):t[`xml:lang`]?e.literal(t.value,t[`xml:lang`]):t.datatype?e.literal(t.value,e.namedNode(t.datatype)):e.literal(t.value)}function f(e){let t=Number(e?.value??0);return Number.isFinite(t)?t:0}function p(e){return`"${e.replace(/\\/g,`\\\\`).replace(/"/g,`\\"`).replace(/\n/g,`\\n`).replace(/\r/g,`\\r`)}"`}function m(e){return e.replace(/[^A-Za-z0-9\-._~:/?#[\]@!$&'()*+,;=%]/g,e=>`%`+e.charCodeAt(0).toString(16).toUpperCase().padStart(2,`0`))}function h(e){return e.replace(/[^A-Za-z0-9\-_.]/g,e=>`_`+e.charCodeAt(0).toString(16).toUpperCase().padStart(2,`0`))}function g(e){return e.split(`
8
+ `).map(e=>` ${e}`).join(`
9
+ `)}function _(e){return e.replace(/[^A-Za-z0-9_]/g,`_`)}function v(e,t){if(!Number.isInteger(e)||e<0)throw Error(`${t} must be a non-negative integer`);return e}export{o as SparqlQueryBuilder,s as SparqlQueryProvider,l as termToSparql};
package/dist/theme.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  import { NamedNode } from 'n3';
2
2
  import { Term } from '@rdfjs/types';
3
- import { ShaclPropertyTemplate } from './property-template';
3
+ import { ShaclPropertyTemplate } from './property-template.js';
4
4
  export type Editor = HTMLElement & {
5
5
  value: string;
6
6
  type?: string;
@@ -1,6 +1,6 @@
1
1
  import { Term } from '@rdfjs/types';
2
- import { ShaclPropertyTemplate } from "./property-template";
3
- import { Editor, InputListEntry, Theme } from "./theme";
2
+ import { ShaclPropertyTemplate } from './property-template.js';
3
+ import { Editor, InputListEntry, Theme } from './theme.js';
4
4
  export declare class DefaultTheme extends Theme {
5
5
  idCtr: number;
6
6
  constructor(overriddenCss?: string);
package/dist/util.d.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  import { Literal, NamedNode, Prefixes, Quad, Store } from 'n3';
2
2
  import { Term } from '@rdfjs/types';
3
- import { InputListEntry } from './theme';
4
- import { ShaclPropertyTemplate } from './property-template';
3
+ import { InputListEntry } from './theme.js';
4
+ import { ShaclPropertyTemplate } from './property-template.js';
5
5
  export declare function findObjectValueByPredicate(quads: Quad[], predicate: string, prefix?: string, languages?: string[]): string;
6
6
  export declare function findObjectByPredicate(quads: Quad[], predicate: string, prefix?: string, languages?: string[]): Term | undefined;
7
7
  export declare function focusFirstInputElement(context: HTMLElement): void;
package/package.json CHANGED
@@ -1,20 +1,35 @@
1
1
  {
2
2
  "name": "@ulb-darmstadt/shacl-form",
3
- "version": "3.1.0",
3
+ "version": "3.2.0",
4
4
  "description": "SHACL form generator",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.js",
7
7
  "types": "dist/form.d.ts",
8
+ "typesVersions": {
9
+ "*": {
10
+ "sparql": [
11
+ "dist/query/sparql.d.ts"
12
+ ],
13
+ "plugins/*": [
14
+ "dist/plugins/*"
15
+ ]
16
+ }
17
+ },
8
18
  "type": "module",
9
19
  "exports": {
10
20
  ".": {
11
- "import": "./dist/index.js",
12
- "types": "./dist/form.d.ts"
21
+ "types": "./dist/form.d.ts",
22
+ "import": "./dist/index.js"
23
+ },
24
+ "./sparql": {
25
+ "types": "./dist/query/sparql.d.ts",
26
+ "import": "./dist/sparql.js"
13
27
  },
14
28
  "./plugins/*": "./dist/plugins/*"
15
29
  },
16
30
  "files": [
17
- "dist"
31
+ "dist",
32
+ "src/query/query-mode.md"
18
33
  ],
19
34
  "repository": {
20
35
  "type": "git",
@@ -34,47 +49,51 @@
34
49
  ],
35
50
  "scripts": {
36
51
  "dev": "vite serve ./demo --host",
37
- "build": "npm run clean && tsc && npm run build-lib && npm run build-bundle && npm run build-plugins",
52
+ "build": "npm run clean && tsc && npm run build-lib && npm run build-sparql && npm run build-bundle && npm run build-plugins",
38
53
  "preview": "vite preview",
39
54
  "test": "web-test-runner --config test/config.js",
40
55
  "lint": "eslint \"src/**/*.{ts,tsx}\"",
41
56
  "clean": "rimraf dist",
42
57
  "build-lib": "vite build -c ./vite.config.ts",
58
+ "build-sparql": "vite build -c ./vite.config.sparql.ts",
43
59
  "build-bundle": "vite build -c ./vite.config.bundle.ts",
44
60
  "build-plugins": "vite build -c ./vite.config.plugins.ts"
45
61
  },
46
62
  "devDependencies": {
47
- "@open-wc/testing": "^4.0.0",
63
+ "@eslint/js": "^10.0.1",
64
+ "@open-wc/testing": "^5.0.0",
48
65
  "@remcovaes/web-test-runner-vite-plugin": "^1.4.1",
49
66
  "@types/jsonld": "^1.5.15",
50
67
  "@types/leaflet": "^1.9.21",
51
68
  "@types/leaflet-editable": "^1.2.7",
52
- "@types/leaflet.fullscreen": "^3.0.3",
69
+ "@types/leaflet.heat": "^0.2.5",
53
70
  "@types/mapbox__mapbox-gl-draw": "^1.4.9",
54
71
  "@types/mocha": "^10.0.10",
55
72
  "@types/n3": "^1.26.1",
56
- "@typescript-eslint/eslint-plugin": "^8.59.2",
57
- "@typescript-eslint/parser": "^8.59.2",
58
- "@web/test-runner": "^0.20.2",
59
- "@web/test-runner-chrome": "^0.18.1",
60
- "@web/test-runner-puppeteer": "^0.18.0",
61
- "eslint": "^10.3.0",
62
- "puppeteer": "^24.43.0",
73
+ "@typescript-eslint/eslint-plugin": "^8.64.0",
74
+ "@typescript-eslint/parser": "^8.64.0",
75
+ "@web/test-runner": "^1.0.0",
76
+ "@web/test-runner-chrome": "^1.0.0",
77
+ "@web/test-runner-puppeteer": "^1.0.0",
78
+ "eslint": "^10.7.0",
79
+ "globals": "^17.7.0",
80
+ "puppeteer": "^25.3.0",
63
81
  "rdf-isomorphic": "^2.0.1",
64
82
  "rimraf": "^6.1.3",
65
83
  "rollup-plugin-peer-deps-external": "^2.2.4",
66
84
  "typescript": "^6.0.3",
67
- "vite": "^8.0.11"
85
+ "vite": "^8.1.5"
68
86
  },
69
87
  "peerDependencies": {
70
- "@ro-kit/ui-widgets": "^1.0.44",
88
+ "@ro-kit/ui-widgets": "^1.0.49",
71
89
  "jsonld": "^9.0.0",
72
90
  "leaflet": "^1.9.4",
73
91
  "leaflet-editable": "^1.3.2",
74
- "leaflet.fullscreen": "^4.0.0",
92
+ "leaflet.fullscreen": "^5.3.3",
93
+ "leaflet.heat": "^0.2.0",
75
94
  "n3": "^1.0.26",
76
95
  "rdfxml-streaming-parser": "^3.1.0",
77
- "shacl-engine": "^1.1.0",
96
+ "shacl-engine": "^1.1.2",
78
97
  "uuid": "^13.0.0"
79
98
  }
80
99
  }