obm-upload-form-ui 0.1.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.
- package/LICENSE +674 -0
- package/README.md +153 -0
- package/dist/_plugin-vue_export-helper-DQLEQ__A.js +44 -0
- package/dist/_plugin-vue_export-helper-DQLEQ__A.js.map +1 -0
- package/dist/core/client/auth.d.ts +37 -0
- package/dist/core/client/errors.d.ts +31 -0
- package/dist/core/client/formApi.d.ts +23 -0
- package/dist/core/client/http.d.ts +10 -0
- package/dist/core/config.d.ts +25 -0
- package/dist/core/geo/wkt.d.ts +7 -0
- package/dist/core/i18n/messages.d.ts +13 -0
- package/dist/core/index.d.ts +16 -0
- package/dist/core/schema/guards.d.ts +12 -0
- package/dist/core/schema/normalize.d.ts +10 -0
- package/dist/core/schema/types.d.ts +119 -0
- package/dist/core/submit/linked.d.ts +58 -0
- package/dist/core/submit/metadata.d.ts +37 -0
- package/dist/core/submit/submitClient.d.ts +40 -0
- package/dist/core/validation/engine.d.ts +18 -0
- package/dist/core/validation/rules.d.ts +29 -0
- package/dist/core/validation/types.d.ts +48 -0
- package/dist/core.js +377 -0
- package/dist/core.js.map +1 -0
- package/dist/custom-elements/obm-upload-form-ui.css +1 -0
- package/dist/custom-elements/obm-upload-form.iife.js +21 -0
- package/dist/custom-elements/obm-upload-form.iife.js.map +1 -0
- package/dist/custom-elements/obm-upload-form.js +16889 -0
- package/dist/custom-elements/obm-upload-form.js.map +1 -0
- package/dist/engine-7r1HChwT.js +174 -0
- package/dist/engine-7r1HChwT.js.map +1 -0
- package/dist/obm-upload-form-ui.css +1 -0
- package/dist/vue/FieldWrapper.vue.d.ts +30 -0
- package/dist/vue/UploadForm.vue.d.ts +58 -0
- package/dist/vue/ValidationSummary.vue.d.ts +13 -0
- package/dist/vue/fieldRegistry.d.ts +5 -0
- package/dist/vue/fields/ArrayField.vue.d.ts +14 -0
- package/dist/vue/fields/AutocompleteField.vue.d.ts +15 -0
- package/dist/vue/fields/BooleanField.vue.d.ts +14 -0
- package/dist/vue/fields/NumericField.vue.d.ts +14 -0
- package/dist/vue/fields/SelectField.vue.d.ts +15 -0
- package/dist/vue/fields/TemporalField.vue.d.ts +14 -0
- package/dist/vue/fields/TextAreaField.vue.d.ts +14 -0
- package/dist/vue/fields/TextField.vue.d.ts +14 -0
- package/dist/vue/fields/TimeIntervalField.vue.d.ts +14 -0
- package/dist/vue/fields/UnsupportedField.vue.d.ts +8 -0
- package/dist/vue/fields/WktTextField.vue.d.ts +14 -0
- package/dist/vue/index.d.ts +19 -0
- package/dist/vue/types.d.ts +22 -0
- package/dist/vue/uiText.d.ts +3 -0
- package/dist/vue/useFormState.d.ts +13 -0
- package/dist/vue-leaflet/GeometryField.vue.d.ts +14 -0
- package/dist/vue-leaflet/index.d.ts +9 -0
- package/dist/vue-leaflet.js +117 -0
- package/dist/vue-leaflet.js.map +1 -0
- package/dist/vue.js +813 -0
- package/dist/vue.js.map +1 -0
- package/dist/wkt-C0dkXG1x.js +359 -0
- package/dist/wkt-C0dkXG1x.js.map +1 -0
- package/package.json +113 -0
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { FormSchema } from '../core/schema/types';
|
|
2
|
+
/**
|
|
3
|
+
* Reactive record values for a form schema: initialized from column
|
|
4
|
+
* default_value (including hidden columns, which are submitted but not
|
|
5
|
+
* rendered), with sticky/once_field-aware reset for "save and add another".
|
|
6
|
+
*/
|
|
7
|
+
export declare function useFormState(schema: FormSchema, initial?: Record<string, unknown>): {
|
|
8
|
+
values: Record<string, unknown>;
|
|
9
|
+
initialize: (overlay?: Record<string, unknown>) => void;
|
|
10
|
+
setValue: (column: string, value: unknown) => void;
|
|
11
|
+
dataForSubmit: () => Record<string, unknown>;
|
|
12
|
+
resetForNextEntry: () => void;
|
|
13
|
+
};
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { FieldProps } from '../vue/types';
|
|
2
|
+
declare const _default: import('vue').DefineComponent<FieldProps, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {
|
|
3
|
+
"update:modelValue": (value: unknown) => any;
|
|
4
|
+
}, string, import('vue').PublicProps, Readonly<FieldProps> & Readonly<{
|
|
5
|
+
"onUpdate:modelValue"?: ((value: unknown) => any) | undefined;
|
|
6
|
+
}>, {
|
|
7
|
+
language: string;
|
|
8
|
+
issues: import('../core').ValidationIssue[];
|
|
9
|
+
disabled: boolean;
|
|
10
|
+
options: import('../core').FormListElement[];
|
|
11
|
+
}, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {
|
|
12
|
+
mapContainer: HTMLDivElement;
|
|
13
|
+
}, HTMLDivElement>;
|
|
14
|
+
export default _default;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { FieldRegistry } from '../vue/fieldRegistry';
|
|
2
|
+
export { default as GeometryField } from './GeometryField.vue';
|
|
3
|
+
/**
|
|
4
|
+
* Registry overrides upgrading geometry columns from the WKT text fallback
|
|
5
|
+
* to the interactive map widget:
|
|
6
|
+
*
|
|
7
|
+
* <UploadForm :schema="schema" :registry="geometryFieldRegistry()" />
|
|
8
|
+
*/
|
|
9
|
+
export declare function geometryFieldRegistry(): Partial<FieldRegistry>;
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
import { defineComponent as S, ref as y, computed as D, onMounted as F, onBeforeUnmount as G, watch as N, openBlock as g, createElementBlock as v, createElementVNode as _, withDirectives as O, vModelCheckbox as B, createTextVNode as J, createCommentVNode as E, toDisplayString as M, unref as W } from "vue";
|
|
2
|
+
import * as a from "leaflet";
|
|
3
|
+
import "leaflet-draw";
|
|
4
|
+
import { w as z, g as U } from "./wkt-C0dkXG1x.js";
|
|
5
|
+
import { u as A, _ as R } from "./_plugin-vue_export-helper-DQLEQ__A.js";
|
|
6
|
+
const Z = { class: "obm-geometry" }, K = { class: "obm-geometry__toggle" }, j = ["value", "disabled"], q = {
|
|
7
|
+
key: 1,
|
|
8
|
+
class: "obm-geometry__hint"
|
|
9
|
+
}, H = /* @__PURE__ */ S({
|
|
10
|
+
__name: "GeometryField",
|
|
11
|
+
props: {
|
|
12
|
+
column: {},
|
|
13
|
+
modelValue: {},
|
|
14
|
+
issues: { default: () => [] },
|
|
15
|
+
disabled: { type: Boolean, default: !1 },
|
|
16
|
+
options: { default: void 0 },
|
|
17
|
+
language: { default: "en" }
|
|
18
|
+
},
|
|
19
|
+
emits: ["update:modelValue"],
|
|
20
|
+
setup(b, { emit: L }) {
|
|
21
|
+
const n = b, k = L, s = y(null), d = y(!1), c = y(!1);
|
|
22
|
+
let t = null, e = null, x = null, m = !1;
|
|
23
|
+
const r = D(() => n.modelValue == null ? "" : String(n.modelValue)), T = D(() => n.disabled || n.column.api_params.readonly);
|
|
24
|
+
function V() {
|
|
25
|
+
const o = n.column.type, l = o === "wkt";
|
|
26
|
+
return {
|
|
27
|
+
marker: l || o === "point" ? {} : !1,
|
|
28
|
+
polyline: l || o === "line" ? {} : !1,
|
|
29
|
+
polygon: l || o === "polygon" ? {} : !1,
|
|
30
|
+
rectangle: !1,
|
|
31
|
+
circle: !1,
|
|
32
|
+
circlemarker: !1
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
function h() {
|
|
36
|
+
const o = (e == null ? void 0 : e.getLayers()) ?? [];
|
|
37
|
+
if (o.length === 0) return null;
|
|
38
|
+
const l = o[0];
|
|
39
|
+
return U(l.toGeoJSON().geometry);
|
|
40
|
+
}
|
|
41
|
+
function p() {
|
|
42
|
+
m = !0, k("update:modelValue", h());
|
|
43
|
+
}
|
|
44
|
+
function f() {
|
|
45
|
+
if (!(!t || !e) && (e.clearLayers(), c.value = !1, r.value.trim() !== ""))
|
|
46
|
+
try {
|
|
47
|
+
const o = z(r.value);
|
|
48
|
+
a.geoJSON(o).eachLayer((C) => e == null ? void 0 : e.addLayer(C));
|
|
49
|
+
const u = e.getBounds();
|
|
50
|
+
u.isValid() && t.fitBounds(u, { maxZoom: 14, padding: [20, 20] });
|
|
51
|
+
} catch {
|
|
52
|
+
c.value = !0;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
F(() => {
|
|
56
|
+
s.value && (t = a.map(s.value, { center: [47.18, 19.5], zoom: 6 }), a.tileLayer("https://tile.openstreetmap.org/{z}/{x}/{y}.png", {
|
|
57
|
+
maxZoom: 19,
|
|
58
|
+
attribution: "© OpenStreetMap contributors"
|
|
59
|
+
}).addTo(t), e = new a.FeatureGroup(), t.addLayer(e), T.value || (x = new a.Control.Draw({
|
|
60
|
+
draw: V(),
|
|
61
|
+
edit: { featureGroup: e }
|
|
62
|
+
}), t.addControl(x)), t.on(a.Draw.Event.CREATED, (o) => {
|
|
63
|
+
e == null || e.clearLayers(), e == null || e.addLayer(o.layer), p();
|
|
64
|
+
}), t.on(a.Draw.Event.EDITED, p), t.on(a.Draw.Event.DELETED, p), f(), setTimeout(() => t == null ? void 0 : t.invalidateSize(), 0));
|
|
65
|
+
}), G(() => {
|
|
66
|
+
t == null || t.remove(), t = null;
|
|
67
|
+
}), N(r, () => {
|
|
68
|
+
if (m) {
|
|
69
|
+
m = !1;
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
f();
|
|
73
|
+
});
|
|
74
|
+
function w(o) {
|
|
75
|
+
const l = o.target.value;
|
|
76
|
+
k("update:modelValue", l === "" ? null : l), f();
|
|
77
|
+
}
|
|
78
|
+
return (o, l) => (g(), v("div", Z, [
|
|
79
|
+
_("div", {
|
|
80
|
+
ref_key: "mapContainer",
|
|
81
|
+
ref: s,
|
|
82
|
+
class: "obm-geometry__map"
|
|
83
|
+
}, null, 512),
|
|
84
|
+
_("label", K, [
|
|
85
|
+
O(_("input", {
|
|
86
|
+
"onUpdate:modelValue": l[0] || (l[0] = (u) => d.value = u),
|
|
87
|
+
type: "checkbox"
|
|
88
|
+
}, null, 512), [
|
|
89
|
+
[B, d.value]
|
|
90
|
+
]),
|
|
91
|
+
l[1] || (l[1] = J(" WKT ", -1))
|
|
92
|
+
]),
|
|
93
|
+
d.value ? (g(), v("textarea", {
|
|
94
|
+
key: 0,
|
|
95
|
+
class: "obm-geometry__text",
|
|
96
|
+
rows: "3",
|
|
97
|
+
value: r.value,
|
|
98
|
+
disabled: T.value,
|
|
99
|
+
onInput: w
|
|
100
|
+
}, null, 40, j)) : E("", !0),
|
|
101
|
+
c.value ? (g(), v("p", q, M(W(A)("invalidWkt", b.language)), 1)) : E("", !0)
|
|
102
|
+
]));
|
|
103
|
+
}
|
|
104
|
+
}), i = /* @__PURE__ */ R(H, [["__scopeId", "data-v-08c09476"]]);
|
|
105
|
+
function $() {
|
|
106
|
+
return {
|
|
107
|
+
point: i,
|
|
108
|
+
line: i,
|
|
109
|
+
polygon: i,
|
|
110
|
+
wkt: i
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
export {
|
|
114
|
+
i as GeometryField,
|
|
115
|
+
$ as geometryFieldRegistry
|
|
116
|
+
};
|
|
117
|
+
//# sourceMappingURL=vue-leaflet.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vue-leaflet.js","sources":["../src/vue-leaflet/GeometryField.vue","../src/vue-leaflet/index.ts"],"sourcesContent":["<script setup lang=\"ts\">\nimport type { Feature } from 'geojson';\nimport * as L from 'leaflet';\nimport 'leaflet-draw';\nimport { computed, onBeforeUnmount, onMounted, ref, watch } from 'vue';\nimport { geoJSONToWkt, wktToGeoJSON } from '../core/geo/wkt';\nimport { uiText } from '../vue/uiText';\nimport type { FieldEmits, FieldProps } from '../vue/types';\n\n/**\n * Leaflet + Leaflet.draw editor for geometry columns (point/line/polygon/wkt).\n * The model value is a WKT string — converted at the edge, mirroring the\n * thr_vizfolyasok initMap() bridge (map speaks GeoJSON, the form speaks WKT).\n *\n * NOTE: hosts must include the Leaflet and Leaflet.draw stylesheets\n * themselves (see the vue-leaflet entry README section); they are not\n * bundled here.\n */\nconst props = withDefaults(defineProps<FieldProps>(), {\n issues: () => [],\n disabled: false,\n options: undefined,\n language: 'en',\n});\nconst emit = defineEmits<FieldEmits>();\n\nconst mapContainer = ref<HTMLElement | null>(null);\nconst editAsText = ref(false);\nconst parseFailed = ref(false);\n\nlet map: L.Map | null = null;\nlet drawnItems: L.FeatureGroup | null = null;\nlet drawControl: L.Control.Draw | null = null;\n/** Guards the watcher against reacting to our own emits. */\nlet internalUpdate = false;\n\nconst text = computed(() => (props.modelValue == null ? '' : String(props.modelValue)));\nconst isDisabled = computed(() => props.disabled || props.column.api_params.readonly);\n\nfunction drawOptionsForType(): L.Control.DrawOptions {\n const type = props.column.type;\n const anyGeometry = type === 'wkt';\n return {\n marker: anyGeometry || type === 'point' ? {} : false,\n polyline: anyGeometry || type === 'line' ? {} : false,\n polygon: anyGeometry || type === 'polygon' ? {} : false,\n rectangle: false,\n circle: false,\n circlemarker: false,\n };\n}\n\nfunction currentWkt(): string | null {\n const layers = drawnItems?.getLayers() ?? [];\n if (layers.length === 0) return null;\n const layer = layers[0] as L.Layer & { toGeoJSON: () => Feature };\n return geoJSONToWkt(layer.toGeoJSON().geometry);\n}\n\nfunction emitFromMap() {\n internalUpdate = true;\n emit('update:modelValue', currentWkt());\n}\n\nfunction renderValueOnMap() {\n if (!map || !drawnItems) return;\n drawnItems.clearLayers();\n parseFailed.value = false;\n if (text.value.trim() === '') return;\n try {\n const geometry = wktToGeoJSON(text.value);\n const geoJsonLayer = L.geoJSON(geometry);\n geoJsonLayer.eachLayer((layer) => drawnItems?.addLayer(layer));\n const bounds = drawnItems.getBounds();\n if (bounds.isValid()) {\n map.fitBounds(bounds, { maxZoom: 14, padding: [20, 20] });\n }\n } catch {\n parseFailed.value = true;\n }\n}\n\nonMounted(() => {\n if (!mapContainer.value) return;\n map = L.map(mapContainer.value, { center: [47.18, 19.5], zoom: 6 });\n L.tileLayer('https://tile.openstreetmap.org/{z}/{x}/{y}.png', {\n maxZoom: 19,\n attribution: '© OpenStreetMap contributors',\n }).addTo(map);\n\n drawnItems = new L.FeatureGroup();\n map.addLayer(drawnItems);\n\n if (!isDisabled.value) {\n drawControl = new L.Control.Draw({\n draw: drawOptionsForType(),\n edit: { featureGroup: drawnItems },\n });\n map.addControl(drawControl);\n }\n\n map.on(L.Draw.Event.CREATED, (event) => {\n // One geometry per column: a new drawing replaces the previous one.\n drawnItems?.clearLayers();\n drawnItems?.addLayer((event as L.DrawEvents.Created).layer);\n emitFromMap();\n });\n map.on(L.Draw.Event.EDITED, emitFromMap);\n map.on(L.Draw.Event.DELETED, emitFromMap);\n\n renderValueOnMap();\n setTimeout(() => map?.invalidateSize(), 0);\n});\n\nonBeforeUnmount(() => {\n map?.remove();\n map = null;\n});\n\nwatch(text, () => {\n if (internalUpdate) {\n internalUpdate = false;\n return;\n }\n renderValueOnMap();\n});\n\nfunction onTextInput(event: Event) {\n const value = (event.target as HTMLTextAreaElement).value;\n emit('update:modelValue', value === '' ? null : value);\n renderValueOnMap();\n}\n</script>\n\n<template>\n <div class=\"obm-geometry\">\n <div ref=\"mapContainer\" class=\"obm-geometry__map\" />\n <label class=\"obm-geometry__toggle\">\n <input v-model=\"editAsText\" type=\"checkbox\" />\n WKT\n </label>\n <textarea\n v-if=\"editAsText\"\n class=\"obm-geometry__text\"\n rows=\"3\"\n :value=\"text\"\n :disabled=\"isDisabled\"\n @input=\"onTextInput\"\n />\n <p v-if=\"parseFailed\" class=\"obm-geometry__hint\">{{ uiText('invalidWkt', language) }}</p>\n </div>\n</template>\n\n<style scoped>\n.obm-geometry__map {\n height: var(--obm-form-map-height, 300px);\n border: 1px solid var(--obm-form-input-border, #bbb);\n border-radius: var(--obm-form-input-radius, 4px);\n}\n\n.obm-geometry__toggle {\n display: inline-flex;\n align-items: center;\n gap: 0.3rem;\n margin-top: 0.3rem;\n font-size: 0.85rem;\n color: var(--obm-form-description-color, #666);\n cursor: pointer;\n}\n\n.obm-geometry__text {\n display: block;\n width: 100%;\n margin-top: 0.3rem;\n padding: var(--obm-form-input-padding, 0.4rem 0.6rem);\n border: 1px solid var(--obm-form-input-border, #bbb);\n border-radius: var(--obm-form-input-radius, 4px);\n font-family: var(--obm-form-mono-font, monospace);\n font-size: 0.9rem;\n box-sizing: border-box;\n resize: vertical;\n}\n\n.obm-geometry__hint {\n margin: 0.2rem 0 0;\n font-size: 0.85rem;\n color: var(--obm-form-warning-color, #b9770e);\n}\n</style>\n","/**\n * Leaflet entry (`obm-upload-form-ui/vue-leaflet`).\n *\n * Kept separate from `/vue` so Leaflet stays an optional peer dependency:\n * importing the plain widget set never pulls Leaflet.\n *\n * Hosts must include the Leaflet + Leaflet.draw stylesheets themselves, e.g.:\n * import 'leaflet/dist/leaflet.css';\n * import 'leaflet-draw/dist/leaflet.draw.css';\n */\nimport type { FieldRegistry } from '../vue/fieldRegistry';\nimport GeometryField from './GeometryField.vue';\n\nexport { default as GeometryField } from './GeometryField.vue';\n\n/**\n * Registry overrides upgrading geometry columns from the WKT text fallback\n * to the interactive map widget:\n *\n * <UploadForm :schema=\"schema\" :registry=\"geometryFieldRegistry()\" />\n */\nexport function geometryFieldRegistry(): Partial<FieldRegistry> {\n return {\n point: GeometryField,\n line: GeometryField,\n polygon: GeometryField,\n wkt: GeometryField,\n };\n}\n"],"names":["props","__props","emit","__emit","mapContainer","ref","editAsText","parseFailed","map","drawnItems","drawControl","internalUpdate","text","computed","isDisabled","drawOptionsForType","type","anyGeometry","currentWkt","layers","layer","geoJSONToWkt","emitFromMap","renderValueOnMap","geometry","wktToGeoJSON","L","bounds","onMounted","event","onBeforeUnmount","watch","onTextInput","value","_openBlock","_createElementBlock","_hoisted_1","_createElementVNode","_hoisted_2","$event","_hoisted_4","_toDisplayString","_unref","uiText","geometryFieldRegistry","GeometryField"],"mappings":"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"}
|