diff --git a/dDashboardServer/templates/property-3d.jinja2 b/dDashboardServer/templates/property-3d.jinja2
index 15ac8777c..780dff560 100644
--- a/dDashboardServer/templates/property-3d.jinja2
+++ b/dDashboardServer/templates/property-3d.jinja2
@@ -34,6 +34,14 @@
+ {% if not exists("showcase") %}
+ {% if can.ugc_manage %}{% endif %}
+ {% if can.properties_import %}
+
+
+
+ {% endif %}
+ {% endif %}
@@ -476,6 +484,30 @@ document.getElementById('resetPropertyBtn').addEventListener('click', () => {
document.getElementById('behaviorLog').innerHTML = '
Select a model with behaviors and trigger it.';
load();
});
+const reprocessModelsBtn = document.getElementById('reprocessModelsBtn');
+if (reprocessModelsBtn) reprocessModelsBtn.addEventListener('click', () => {
+ reprocessModelsBtn.disabled = true;
+ api.action('/api/ugc/reprocess', { kind: 'model', property: propertyId }).then((d) => toast(d.message, 'success'))
+ .catch(() => {}).finally(() => { reprocessModelsBtn.disabled = false; });
+});
+const importModelsFile = document.getElementById('importModelsFile');
+if (importModelsFile) {
+ document.getElementById('importModelsBtn').addEventListener('click', () => importModelsFile.click());
+ importModelsFile.addEventListener('change', async () => {
+ const file = importModelsFile.files[0];
+ if (!file) return;
+ const lxfml = await file.text();
+ importModelsFile.value = '';
+ api.action('/api/properties/' + propertyId + '/import', { lxfml }).then((d) => { toast(d.message, 'success'); load(); }).catch(() => {});
+ });
+}
+const removeModelsBtn = document.getElementById('removeModelsBtn');
+if (removeModelsBtn) removeModelsBtn.addEventListener('click', () => {
+ if (window.prompt('This deletes every model on the property. Type the property ID (' + propertyId + ') to confirm:') !== propertyId) return;
+ removeModelsBtn.disabled = true;
+ api.action('/api/properties/' + propertyId + '/remove_models', { confirm: propertyId }).then((d) => { toast(d.message, 'success'); load(); })
+ .catch(() => {}).finally(() => { removeModelsBtn.disabled = false; });
+});
document.getElementById('fullscreenBtn').addEventListener('click', () => {
const wrap = document.getElementById('viewerWrap');
if (document.fullscreenElement) document.exitFullscreen();