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.
Files changed (59) hide show
  1. package/LICENSE +674 -0
  2. package/README.md +153 -0
  3. package/dist/_plugin-vue_export-helper-DQLEQ__A.js +44 -0
  4. package/dist/_plugin-vue_export-helper-DQLEQ__A.js.map +1 -0
  5. package/dist/core/client/auth.d.ts +37 -0
  6. package/dist/core/client/errors.d.ts +31 -0
  7. package/dist/core/client/formApi.d.ts +23 -0
  8. package/dist/core/client/http.d.ts +10 -0
  9. package/dist/core/config.d.ts +25 -0
  10. package/dist/core/geo/wkt.d.ts +7 -0
  11. package/dist/core/i18n/messages.d.ts +13 -0
  12. package/dist/core/index.d.ts +16 -0
  13. package/dist/core/schema/guards.d.ts +12 -0
  14. package/dist/core/schema/normalize.d.ts +10 -0
  15. package/dist/core/schema/types.d.ts +119 -0
  16. package/dist/core/submit/linked.d.ts +58 -0
  17. package/dist/core/submit/metadata.d.ts +37 -0
  18. package/dist/core/submit/submitClient.d.ts +40 -0
  19. package/dist/core/validation/engine.d.ts +18 -0
  20. package/dist/core/validation/rules.d.ts +29 -0
  21. package/dist/core/validation/types.d.ts +48 -0
  22. package/dist/core.js +377 -0
  23. package/dist/core.js.map +1 -0
  24. package/dist/custom-elements/obm-upload-form-ui.css +1 -0
  25. package/dist/custom-elements/obm-upload-form.iife.js +21 -0
  26. package/dist/custom-elements/obm-upload-form.iife.js.map +1 -0
  27. package/dist/custom-elements/obm-upload-form.js +16889 -0
  28. package/dist/custom-elements/obm-upload-form.js.map +1 -0
  29. package/dist/engine-7r1HChwT.js +174 -0
  30. package/dist/engine-7r1HChwT.js.map +1 -0
  31. package/dist/obm-upload-form-ui.css +1 -0
  32. package/dist/vue/FieldWrapper.vue.d.ts +30 -0
  33. package/dist/vue/UploadForm.vue.d.ts +58 -0
  34. package/dist/vue/ValidationSummary.vue.d.ts +13 -0
  35. package/dist/vue/fieldRegistry.d.ts +5 -0
  36. package/dist/vue/fields/ArrayField.vue.d.ts +14 -0
  37. package/dist/vue/fields/AutocompleteField.vue.d.ts +15 -0
  38. package/dist/vue/fields/BooleanField.vue.d.ts +14 -0
  39. package/dist/vue/fields/NumericField.vue.d.ts +14 -0
  40. package/dist/vue/fields/SelectField.vue.d.ts +15 -0
  41. package/dist/vue/fields/TemporalField.vue.d.ts +14 -0
  42. package/dist/vue/fields/TextAreaField.vue.d.ts +14 -0
  43. package/dist/vue/fields/TextField.vue.d.ts +14 -0
  44. package/dist/vue/fields/TimeIntervalField.vue.d.ts +14 -0
  45. package/dist/vue/fields/UnsupportedField.vue.d.ts +8 -0
  46. package/dist/vue/fields/WktTextField.vue.d.ts +14 -0
  47. package/dist/vue/index.d.ts +19 -0
  48. package/dist/vue/types.d.ts +22 -0
  49. package/dist/vue/uiText.d.ts +3 -0
  50. package/dist/vue/useFormState.d.ts +13 -0
  51. package/dist/vue-leaflet/GeometryField.vue.d.ts +14 -0
  52. package/dist/vue-leaflet/index.d.ts +9 -0
  53. package/dist/vue-leaflet.js +117 -0
  54. package/dist/vue-leaflet.js.map +1 -0
  55. package/dist/vue.js +813 -0
  56. package/dist/vue.js.map +1 -0
  57. package/dist/wkt-C0dkXG1x.js +359 -0
  58. package/dist/wkt-C0dkXG1x.js.map +1 -0
  59. package/package.json +113 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vue.js","sources":["../src/vue/fields/ArrayField.vue","../src/vue/fields/AutocompleteField.vue","../src/vue/fields/BooleanField.vue","../src/vue/fields/NumericField.vue","../src/vue/fields/SelectField.vue","../src/vue/fields/TemporalField.vue","../src/vue/fields/TextAreaField.vue","../src/vue/fields/TextField.vue","../src/vue/fields/TimeIntervalField.vue","../src/vue/fields/UnsupportedField.vue","../src/vue/fields/WktTextField.vue","../src/vue/fieldRegistry.ts","../src/vue/useFormState.ts","../src/vue/FieldWrapper.vue","../src/vue/ValidationSummary.vue","../src/vue/UploadForm.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed, ref, useId } from 'vue';\nimport { uiText } from '../uiText';\nimport type { FieldEmits, FieldProps } from '../types';\n\n/** array columns: a repeatable list of single values, edited as tags. */\nconst props = withDefaults(defineProps<FieldProps>(), {\n issues: () => [],\n disabled: false,\n options: undefined,\n language: 'en',\n});\nconst emit = defineEmits<FieldEmits>();\n\nconst inputId = useId();\nconst draft = ref('');\n\nconst items = computed<string[]>(() =>\n Array.isArray(props.modelValue) ? props.modelValue.map(String) : [],\n);\nconst isDisabled = computed(() => props.disabled || props.column.api_params.readonly);\n\nfunction add() {\n const value = draft.value.trim();\n if (value === '' || isDisabled.value) return;\n emit('update:modelValue', [...items.value, value]);\n draft.value = '';\n}\n\nfunction remove(index: number) {\n if (isDisabled.value) return;\n const next = items.value.filter((_, itemIndex) => itemIndex !== index);\n emit('update:modelValue', next.length > 0 ? next : null);\n}\n\ndefineExpose({ inputId });\n</script>\n\n<template>\n <div class=\"obm-array\">\n <ul v-if=\"items.length > 0\" class=\"obm-array__items\">\n <li v-for=\"(item, index) in items\" :key=\"`${item}-${index}`\" class=\"obm-array__item\">\n {{ item }}\n <button\n type=\"button\"\n class=\"obm-array__remove\"\n :disabled=\"isDisabled\"\n :aria-label=\"uiText('removeItem', language)\"\n @click=\"remove(index)\"\n >\n ×\n </button>\n </li>\n </ul>\n <div class=\"obm-array__editor\">\n <input\n :id=\"inputId\"\n v-model=\"draft\"\n class=\"obm-input\"\n type=\"text\"\n :disabled=\"isDisabled\"\n @keydown.enter.prevent=\"add\"\n />\n <button type=\"button\" class=\"obm-array__add\" :disabled=\"isDisabled\" @click=\"add\">\n {{ uiText('addItem', language) }}\n </button>\n </div>\n </div>\n</template>\n\n<style scoped>\n.obm-array__items {\n display: flex;\n flex-wrap: wrap;\n gap: 0.3rem;\n margin: 0 0 0.3rem;\n padding: 0;\n list-style: none;\n}\n\n.obm-array__item {\n display: inline-flex;\n align-items: center;\n gap: 0.25rem;\n padding: 0.15rem 0.5rem;\n background: var(--obm-form-accent-soft, #e8f3ec);\n border-radius: 999px;\n font-size: 0.85rem;\n}\n\n.obm-array__remove {\n border: none;\n background: none;\n cursor: pointer;\n font: inherit;\n line-height: 1;\n}\n\n.obm-array__editor {\n display: flex;\n gap: 0.4rem;\n}\n\n.obm-input {\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: inherit;\n flex: 1;\n box-sizing: border-box;\n}\n\n.obm-array__add {\n padding: 0.35rem 0.8rem;\n border: 1px solid var(--obm-form-input-border, #bbb);\n border-radius: var(--obm-form-input-radius, 4px);\n background: var(--obm-form-button-bg, #f7f7f7);\n font: inherit;\n cursor: pointer;\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed, ref, useId } from 'vue';\nimport type { FormListElement } from '../../core/schema/types';\nimport { uiText } from '../uiText';\nimport type { FieldEmits, FieldProps } from '../types';\n\n/**\n * autocomplete / autocompletelist columns: a text input filtering the\n * pre-resolved list elements client-side. `autocompletelist` (or\n * list_definition.multiselect) keeps an array of values rendered as tags.\n * list_definition.extendable allows free text outside the list.\n */\nconst props = withDefaults(defineProps<FieldProps>(), {\n issues: () => [],\n disabled: false,\n options: undefined,\n language: 'en',\n});\nconst emit = defineEmits<FieldEmits>();\n\nconst inputId = useId();\nconst query = ref('');\nconst open = ref(false);\nconst highlighted = ref(0);\n\nconst elements = computed<FormListElement[]>(\n () => props.options ?? props.column.generated_list_elements,\n);\nconst multi = computed(\n () =>\n props.column.type === 'autocompletelist' || props.column.list_definition?.multiselect === true,\n);\nconst extendable = computed(() => props.column.list_definition?.extendable === true);\nconst isDisabled = computed(() => props.disabled || props.column.api_params.readonly);\n\nconst selected = computed<string[]>(() => {\n if (props.modelValue === null || props.modelValue === undefined || props.modelValue === '')\n return [];\n if (Array.isArray(props.modelValue)) return props.modelValue.map(String);\n return [String(props.modelValue)];\n});\n\nconst matches = computed(() => {\n const needle = query.value.trim().toLowerCase();\n const pool = elements.value.filter((element) => !selected.value.includes(element.value));\n if (needle === '') return pool.slice(0, 20);\n return pool\n .filter(\n (element) =>\n element.label.toLowerCase().includes(needle) ||\n element.value.toLowerCase().includes(needle),\n )\n .slice(0, 20);\n});\n\nfunction labelFor(value: string): string {\n return elements.value.find((element) => element.value === value)?.label ?? value;\n}\n\nfunction commit(values: string[]) {\n if (multi.value) {\n emit('update:modelValue', values.length > 0 ? values : null);\n } else {\n emit('update:modelValue', values.length > 0 ? values[values.length - 1] : null);\n }\n}\n\nfunction pick(element: FormListElement) {\n commit(multi.value ? [...selected.value, element.value] : [element.value]);\n query.value = multi.value ? '' : element.label;\n open.value = false;\n}\n\nfunction remove(value: string) {\n if (isDisabled.value) return;\n commit(selected.value.filter((item) => item !== value));\n}\n\nfunction onInput(event: Event) {\n query.value = (event.target as HTMLInputElement).value;\n open.value = true;\n highlighted.value = 0;\n if (!multi.value && extendable.value) {\n emit('update:modelValue', query.value === '' ? null : query.value);\n }\n if (!multi.value && query.value === '') {\n emit('update:modelValue', null);\n }\n}\n\nfunction onKeydown(event: KeyboardEvent) {\n if (event.key === 'ArrowDown') {\n open.value = true;\n highlighted.value = Math.min(highlighted.value + 1, matches.value.length - 1);\n event.preventDefault();\n } else if (event.key === 'ArrowUp') {\n highlighted.value = Math.max(highlighted.value - 1, 0);\n event.preventDefault();\n } else if (event.key === 'Enter') {\n if (open.value && matches.value[highlighted.value]) {\n pick(matches.value[highlighted.value]);\n event.preventDefault();\n } else if (extendable.value && multi.value && query.value.trim() !== '') {\n commit([...selected.value, query.value.trim()]);\n query.value = '';\n event.preventDefault();\n }\n } else if (event.key === 'Escape') {\n open.value = false;\n }\n}\n\nfunction onBlur() {\n // Delay so option mousedown/click wins over blur-close.\n setTimeout(() => {\n open.value = false;\n }, 150);\n}\n\ndefineExpose({ inputId });\n</script>\n\n<template>\n <div class=\"obm-autocomplete\">\n <ul v-if=\"multi && selected.length > 0\" class=\"obm-autocomplete__tags\">\n <li v-for=\"value in selected\" :key=\"value\" class=\"obm-autocomplete__tag\">\n {{ labelFor(value) }}\n <button\n type=\"button\"\n class=\"obm-autocomplete__remove\"\n :disabled=\"isDisabled\"\n :aria-label=\"uiText('removeItem', language)\"\n @click=\"remove(value)\"\n >\n ×\n </button>\n </li>\n </ul>\n <input\n :id=\"inputId\"\n class=\"obm-input\"\n type=\"text\"\n role=\"combobox\"\n :aria-expanded=\"open\"\n autocomplete=\"off\"\n :value=\"query\"\n :disabled=\"isDisabled\"\n @input=\"onInput\"\n @keydown=\"onKeydown\"\n @focus=\"open = true\"\n @blur=\"onBlur\"\n />\n <ul v-if=\"open && matches.length > 0\" class=\"obm-autocomplete__list\" role=\"listbox\">\n <li\n v-for=\"(element, index) in matches\"\n :key=\"element.value\"\n class=\"obm-autocomplete__option\"\n :class=\"{ 'obm-autocomplete__option--active': index === highlighted }\"\n role=\"option\"\n :aria-selected=\"index === highlighted\"\n @mousedown.prevent=\"pick(element)\"\n >\n {{ element.label }}\n </li>\n </ul>\n </div>\n</template>\n\n<style scoped>\n.obm-autocomplete {\n position: relative;\n max-width: var(--obm-form-select-width, 24rem);\n}\n\n.obm-input {\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: inherit;\n width: 100%;\n box-sizing: border-box;\n}\n\n.obm-autocomplete__list {\n position: absolute;\n z-index: 10;\n left: 0;\n right: 0;\n margin: 0.15rem 0 0;\n padding: 0;\n list-style: none;\n background: var(--obm-form-dropdown-bg, #fff);\n border: 1px solid var(--obm-form-input-border, #bbb);\n border-radius: var(--obm-form-input-radius, 4px);\n max-height: 14rem;\n overflow-y: auto;\n box-shadow: 0 2px 6px rgba(0, 0, 0, 0.15);\n}\n\n.obm-autocomplete__option {\n padding: 0.35rem 0.6rem;\n cursor: pointer;\n}\n\n.obm-autocomplete__option--active,\n.obm-autocomplete__option:hover {\n background: var(--obm-form-accent-soft, #e8f3ec);\n}\n\n.obm-autocomplete__tags {\n display: flex;\n flex-wrap: wrap;\n gap: 0.3rem;\n margin: 0 0 0.3rem;\n padding: 0;\n list-style: none;\n}\n\n.obm-autocomplete__tag {\n display: inline-flex;\n align-items: center;\n gap: 0.25rem;\n padding: 0.15rem 0.5rem;\n background: var(--obm-form-accent-soft, #e8f3ec);\n border-radius: 999px;\n font-size: 0.85rem;\n}\n\n.obm-autocomplete__remove {\n border: none;\n background: none;\n cursor: pointer;\n font: inherit;\n line-height: 1;\n padding: 0 0.1rem;\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed, useId } from 'vue';\nimport type { FieldEmits, FieldProps } from '../types';\n\nconst props = withDefaults(defineProps<FieldProps>(), {\n issues: () => [],\n disabled: false,\n options: undefined,\n language: 'en',\n});\nconst emit = defineEmits<FieldEmits>();\n\nconst inputId = useId();\n\n/** has_empty_line makes the field tri-state: unset / true / false. */\nconst triState = computed(() => props.column.has_empty_line);\n\nconst checked = computed(() => props.modelValue === true || props.modelValue === 'true');\n\nconst triStateValue = computed(() => {\n if (props.modelValue === true || props.modelValue === 'true') return 'true';\n if (props.modelValue === false || props.modelValue === 'false') return 'false';\n return '';\n});\n\nfunction onCheckbox(event: Event) {\n emit('update:modelValue', (event.target as HTMLInputElement).checked);\n}\n\nfunction onTriState(event: Event) {\n const value = (event.target as HTMLSelectElement).value;\n emit('update:modelValue', value === '' ? null : value === 'true');\n}\n\ndefineExpose({ inputId });\n</script>\n\n<template>\n <select\n v-if=\"triState\"\n :id=\"inputId\"\n class=\"obm-select\"\n :value=\"triStateValue\"\n :disabled=\"disabled || column.api_params.readonly\"\n @change=\"onTriState\"\n >\n <option value=\"\" />\n <option value=\"true\">✓</option>\n <option value=\"false\">✗</option>\n </select>\n <input\n v-else\n :id=\"inputId\"\n class=\"obm-checkbox\"\n type=\"checkbox\"\n :checked=\"checked\"\n :disabled=\"disabled || column.api_params.readonly\"\n @change=\"onCheckbox\"\n />\n</template>\n\n<style scoped>\n.obm-select {\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: inherit;\n max-width: var(--obm-form-boolean-width, 8rem);\n}\n\n.obm-checkbox {\n width: 1.1rem;\n height: 1.1rem;\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed, useId } from 'vue';\nimport { parseMinmaxBounds } from '../../core/validation/rules';\nimport type { FieldEmits, FieldProps } from '../types';\n\nconst props = withDefaults(defineProps<FieldProps>(), {\n issues: () => [],\n disabled: false,\n options: undefined,\n language: 'en',\n});\nconst emit = defineEmits<FieldEmits>();\n\nconst inputId = useId();\n\nconst bounds = computed(() => {\n if (props.column.validate.type !== 'minmax' || !props.column.validate.value) return null;\n return parseMinmaxBounds(props.column.validate.value);\n});\n\nconst text = computed(() => (props.modelValue == null ? '' : String(props.modelValue)));\n\nfunction onInput(event: Event) {\n const raw = (event.target as HTMLInputElement).value;\n if (raw === '') {\n emit('update:modelValue', null);\n return;\n }\n // Emit a number when parseable; otherwise keep the raw string so the\n // validation engine can flag it instead of silently dropping input.\n const numeric = Number(raw);\n emit('update:modelValue', Number.isFinite(numeric) ? numeric : raw);\n}\n\ndefineExpose({ inputId });\n</script>\n\n<template>\n <input\n :id=\"inputId\"\n class=\"obm-input obm-input--numeric\"\n type=\"number\"\n inputmode=\"decimal\"\n step=\"any\"\n :min=\"bounds?.min ?? undefined\"\n :max=\"bounds?.max ?? undefined\"\n :value=\"text\"\n :disabled=\"disabled || column.api_params.readonly\"\n :readonly=\"column.api_params.readonly\"\n @input=\"onInput\"\n />\n</template>\n\n<style scoped>\n.obm-input {\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: inherit;\n width: 100%;\n box-sizing: border-box;\n}\n\n.obm-input--numeric {\n max-width: var(--obm-form-numeric-width, 12rem);\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed, useId } from 'vue';\nimport type { FormListElement } from '../../core/schema/types';\nimport { uiText } from '../uiText';\nimport type { FieldEmits, FieldProps } from '../types';\n\n/**\n * list / custom_list columns. Variants driven by the schema:\n * - list_definition.multiselect → multiple selection (array model)\n * - api_params.list_elements_as_buttons → button group instead of <select>\n * - has_empty_line → leading empty option\n */\nconst props = withDefaults(defineProps<FieldProps>(), {\n issues: () => [],\n disabled: false,\n options: undefined,\n language: 'en',\n});\nconst emit = defineEmits<FieldEmits>();\n\nconst inputId = useId();\n\nconst elements = computed<FormListElement[]>(\n () => props.options ?? props.column.generated_list_elements,\n);\nconst multiselect = computed(() => props.column.list_definition?.multiselect === true);\nconst asButtons = computed(() => props.column.api_params.list_elements_as_buttons);\nconst isDisabled = computed(() => props.disabled || props.column.api_params.readonly);\n\nconst selectedValues = computed<string[]>(() => {\n if (props.modelValue === null || props.modelValue === undefined || props.modelValue === '')\n return [];\n if (Array.isArray(props.modelValue)) return props.modelValue.map(String);\n return [String(props.modelValue)];\n});\n\nfunction emitSingle(value: string) {\n emit('update:modelValue', value === '' ? null : value);\n}\n\nfunction onSelectChange(event: Event) {\n const select = event.target as HTMLSelectElement;\n if (multiselect.value) {\n const values = Array.from(select.selectedOptions).map((option) => option.value);\n emit('update:modelValue', values.length > 0 ? values : null);\n } else {\n emitSingle(select.value);\n }\n}\n\nfunction toggleButton(value: string) {\n if (isDisabled.value) return;\n if (multiselect.value) {\n const current = new Set(selectedValues.value);\n if (current.has(value)) {\n current.delete(value);\n } else {\n current.add(value);\n }\n emit('update:modelValue', current.size > 0 ? [...current] : null);\n } else {\n emitSingle(selectedValues.value.includes(value) ? '' : value);\n }\n}\n\ndefineExpose({ inputId });\n</script>\n\n<template>\n <div v-if=\"asButtons\" class=\"obm-buttons\" role=\"group\">\n <button\n v-for=\"element in elements\"\n :key=\"element.value\"\n type=\"button\"\n class=\"obm-buttons__item\"\n :class=\"{ 'obm-buttons__item--active': selectedValues.includes(element.value) }\"\n :disabled=\"isDisabled\"\n @click=\"toggleButton(element.value)\"\n >\n {{ element.label }}\n </button>\n <span v-if=\"elements.length === 0\" class=\"obm-buttons__empty\">{{\n uiText('noOptions', language)\n }}</span>\n </div>\n <!--\n In multiselect mode `value` must be absent, not just null/array: Vue funnels any bound\n value through `select.value`, which stringifies arrays (matching no option) and coerces\n null to '' — either way deselecting everything. Per-option :selected drives the selection.\n -->\n <select\n v-else\n :id=\"inputId\"\n class=\"obm-select\"\n :multiple=\"multiselect\"\n v-bind=\"multiselect ? {} : { value: selectedValues[0] ?? '' }\"\n :disabled=\"isDisabled\"\n @change=\"onSelectChange\"\n >\n <option v-if=\"column.has_empty_line && !multiselect\" value=\"\" />\n <option\n v-for=\"element in elements\"\n :key=\"element.value\"\n :value=\"element.value\"\n :selected=\"selectedValues.includes(element.value)\"\n >\n {{ element.label }}\n </option>\n </select>\n</template>\n\n<style scoped>\n.obm-select {\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: inherit;\n width: 100%;\n max-width: var(--obm-form-select-width, 24rem);\n box-sizing: border-box;\n}\n\n.obm-buttons {\n display: flex;\n flex-wrap: wrap;\n gap: 0.4rem;\n}\n\n.obm-buttons__item {\n padding: 0.35rem 0.8rem;\n border: 1px solid var(--obm-form-input-border, #bbb);\n border-radius: var(--obm-form-input-radius, 4px);\n background: var(--obm-form-button-bg, #f7f7f7);\n font: inherit;\n cursor: pointer;\n}\n\n.obm-buttons__item--active {\n background: var(--obm-form-accent, #2c7a4b);\n border-color: var(--obm-form-accent, #2c7a4b);\n color: var(--obm-form-accent-contrast, #fff);\n}\n\n.obm-buttons__item:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n}\n\n.obm-buttons__empty {\n color: var(--obm-form-description-color, #666);\n font-size: 0.85rem;\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed, useId } from 'vue';\nimport { VueDatePicker } from '@vuepic/vue-datepicker';\nimport { enUS, hu } from 'date-fns/locale';\nimport '@vuepic/vue-datepicker/dist/main.css';\nimport type { FieldEmits, FieldProps } from '../types';\n\n/**\n * Renders date / datetime / time columns with @vuepic/vue-datepicker.\n * Native <input type=\"date|time|datetime-local\"> was dropped because\n * Firefox has no picker UI for the time portion of those inputs\n * (keyboard/spinner entry only) — see\n * https://bugzilla.mozilla.org/show_bug.cgi?id=1726108.\n */\nconst props = withDefaults(defineProps<FieldProps>(), {\n issues: () => [],\n disabled: false,\n options: undefined,\n language: 'en',\n});\nconst emit = defineEmits<FieldEmits>();\n\nconst inputId = useId();\n\n// modelType is the wire format (parses an incoming string, formats the emitted\n// one) — kept identical to what the native inputs this replaces used to emit.\nconst WIRE_FORMAT: Record<string, string> = {\n date: 'yyyy-MM-dd',\n datetime: \"yyyy-MM-dd'T'HH:mm\",\n time: 'HH:mm',\n};\n// displayFormat is what's shown/typed in the text field: same shape as the\n// wire format, but a space instead of the ISO 'T' for datetime (nicer to type).\nconst DISPLAY_FORMAT: Record<string, string> = {\n date: 'yyyy-MM-dd',\n datetime: 'yyyy-MM-dd HH:mm',\n time: 'HH:mm',\n};\n\nconst modelType = computed(() => WIRE_FORMAT[props.column.type] ?? WIRE_FORMAT.date);\nconst displayFormat = computed(() => DISPLAY_FORMAT[props.column.type] ?? DISPLAY_FORMAT.date);\nconst isTimeOnly = computed(() => props.column.type === 'time');\nconst timeConfig = computed(() => ({ enableTimePicker: props.column.type !== 'date' }));\nconst locale = computed(() => (props.language === 'hu' ? hu : enUS));\n\nconst text = computed(() => (props.modelValue == null ? null : String(props.modelValue)));\n\nfunction onUpdate(value: string | null) {\n emit('update:modelValue', value ?? null);\n}\n\ndefineExpose({ inputId });\n</script>\n\n<template>\n <VueDatePicker\n class=\"obm-input obm-input--temporal\"\n :model-value=\"text\"\n :model-type=\"modelType\"\n :format=\"displayFormat\"\n :formats=\"{ input: displayFormat }\"\n :text-input=\"{ format: displayFormat }\"\n :time-picker=\"isTimeOnly\"\n :time-config=\"timeConfig\"\n :locale=\"locale\"\n :input-attrs=\"{ id: inputId }\"\n :disabled=\"disabled || column.api_params.readonly\"\n :readonly=\"column.api_params.readonly\"\n :auto-apply=\"true\"\n @update:model-value=\"onUpdate\"\n />\n</template>\n\n<style scoped>\n.obm-input--temporal {\n max-width: var(--obm-form-temporal-width, 16rem);\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed, useId } from 'vue';\nimport type { FieldEmits, FieldProps } from '../types';\n\nconst props = withDefaults(defineProps<FieldProps>(), {\n issues: () => [],\n disabled: false,\n options: undefined,\n language: 'en',\n});\nconst emit = defineEmits<FieldEmits>();\n\nconst inputId = useId();\nconst text = computed(() => (props.modelValue == null ? '' : String(props.modelValue)));\n\nfunction onInput(event: Event) {\n const value = (event.target as HTMLTextAreaElement).value;\n emit('update:modelValue', value === '' ? null : value);\n}\n\ndefineExpose({ inputId });\n</script>\n\n<template>\n <textarea\n :id=\"inputId\"\n class=\"obm-textarea\"\n rows=\"4\"\n :value=\"text\"\n :disabled=\"disabled || column.api_params.readonly\"\n :readonly=\"column.api_params.readonly\"\n @input=\"onInput\"\n />\n</template>\n\n<style scoped>\n.obm-textarea {\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: inherit;\n width: 100%;\n box-sizing: border-box;\n resize: vertical;\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed, useId } from 'vue';\nimport type { FieldEmits, FieldProps } from '../types';\n\nconst props = withDefaults(defineProps<FieldProps>(), {\n issues: () => [],\n disabled: false,\n options: undefined,\n language: 'en',\n});\nconst emit = defineEmits<FieldEmits>();\n\nconst inputId = useId();\nconst text = computed(() => (props.modelValue == null ? '' : String(props.modelValue)));\n\nfunction onInput(event: Event) {\n const value = (event.target as HTMLInputElement).value;\n emit('update:modelValue', value === '' ? null : value);\n}\n\ndefineExpose({ inputId });\n</script>\n\n<template>\n <input\n :id=\"inputId\"\n class=\"obm-input\"\n type=\"text\"\n :value=\"text\"\n :disabled=\"disabled || column.api_params.readonly\"\n :readonly=\"column.api_params.readonly\"\n @input=\"onInput\"\n />\n</template>\n\n<style scoped>\n.obm-input {\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: inherit;\n width: 100%;\n box-sizing: border-box;\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed, useId } from 'vue';\nimport { VueDatePicker } from '@vuepic/vue-datepicker';\nimport { enUS, hu } from 'date-fns/locale';\nimport '@vuepic/vue-datepicker/dist/main.css';\nimport type { FieldEmits, FieldProps } from '../types';\n\n/**\n * time_interval columns: a single range-mode time picker, modeled as a\n * \"HH:mm-HH:mm\" string. The picker only ever round-trips a full pair or\n * null — it has no concept of a half-filled range — so no extra glue is\n * needed for that case.\n * NOTE: the exact legacy wire format is unverified against live data; adjust\n * here if capture fixtures show a different convention.\n */\nconst props = withDefaults(defineProps<FieldProps>(), {\n issues: () => [],\n disabled: false,\n options: undefined,\n language: 'en',\n});\nconst emit = defineEmits<FieldEmits>();\n\nconst inputId = useId();\nconst locale = computed(() => (props.language === 'hu' ? hu : enUS));\n\nconst parts = computed<[string, string] | null>(() => {\n if (props.modelValue == null) return null;\n const [start = '', end = ''] = String(props.modelValue).split('-');\n return [start, end];\n});\n\nfunction onUpdate(value: [string, string] | null) {\n emit('update:modelValue', value == null ? null : `${value[0]}-${value[1]}`);\n}\n\ndefineExpose({ inputId });\n</script>\n\n<template>\n <VueDatePicker\n class=\"obm-input\"\n :model-value=\"parts\"\n model-type=\"HH:mm\"\n :formats=\"{ input: 'HH:mm' }\"\n :text-input=\"{ format: 'HH:mm' }\"\n time-picker\n range\n :locale=\"locale\"\n :input-attrs=\"{ id: inputId }\"\n :disabled=\"disabled || column.api_params.readonly\"\n :readonly=\"column.api_params.readonly\"\n :auto-apply=\"true\"\n @update:model-value=\"onUpdate\"\n />\n</template>\n\n<style scoped>\n.obm-input {\n max-width: var(--obm-form-temporal-width, 16rem);\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport { UNKNOWN_COLUMN_TYPE } from '../../core/schema/types';\nimport { uiText } from '../uiText';\nimport type { FieldProps } from '../types';\n\n/**\n * Placeholder for columns this version cannot edit: file_id / photo_id\n * (attachments are out of scope for v0) and unknown types. Never blocks the\n * rest of the form.\n */\nconst props = withDefaults(defineProps<FieldProps>(), {\n issues: () => [],\n disabled: false,\n options: undefined,\n language: 'en',\n});\n\nconst typeLabel = computed(() =>\n props.column.type === UNKNOWN_COLUMN_TYPE ? props.column.raw_type : props.column.type,\n);\n</script>\n\n<template>\n <div class=\"obm-unsupported\">\n <p class=\"obm-unsupported__message\">{{ uiText('unsupportedField', language) }}</p>\n <p class=\"obm-unsupported__type\">\n {{ uiText('unsupportedFieldType', language, { type: typeLabel }) }}\n </p>\n </div>\n</template>\n\n<style scoped>\n.obm-unsupported {\n padding: 0.5rem 0.75rem;\n border: 1px dashed var(--obm-form-input-border, #bbb);\n border-radius: var(--obm-form-input-radius, 4px);\n background: var(--obm-form-muted-bg, #fafafa);\n}\n\n.obm-unsupported__message {\n margin: 0;\n color: var(--obm-form-description-color, #666);\n}\n\n.obm-unsupported__type {\n margin: 0.2rem 0 0;\n font-size: 0.8rem;\n color: var(--obm-form-notice-color, #7f8c8d);\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed, useId } from 'vue';\nimport { isWkt } from '../../core/geo/wkt';\nimport { uiText } from '../uiText';\nimport type { FieldEmits, FieldProps } from '../types';\n\n/**\n * Fallback editor for geometry columns (point/line/polygon/wkt): a plain WKT\n * text area with a local validity hint. The Leaflet-based GeometryField from\n * `obm-upload-form-ui/vue-leaflet` replaces this when registered.\n */\nconst props = withDefaults(defineProps<FieldProps>(), {\n issues: () => [],\n disabled: false,\n options: undefined,\n language: 'en',\n});\nconst emit = defineEmits<FieldEmits>();\n\nconst inputId = useId();\nconst text = computed(() => (props.modelValue == null ? '' : String(props.modelValue)));\nconst invalidWkt = computed(() => text.value.trim() !== '' && !isWkt(text.value));\n\nfunction onInput(event: Event) {\n const value = (event.target as HTMLTextAreaElement).value;\n emit('update:modelValue', value === '' ? null : value);\n}\n\ndefineExpose({ inputId });\n</script>\n\n<template>\n <div class=\"obm-wkt\">\n <textarea\n :id=\"inputId\"\n class=\"obm-textarea\"\n rows=\"3\"\n :placeholder=\"`POINT(19.05 47.5)`\"\n :value=\"text\"\n :disabled=\"disabled || column.api_params.readonly\"\n :readonly=\"column.api_params.readonly\"\n @input=\"onInput\"\n />\n <p v-if=\"invalidWkt\" class=\"obm-wkt__hint\">{{ uiText('invalidWkt', language) }}</p>\n </div>\n</template>\n\n<style scoped>\n.obm-textarea {\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 width: 100%;\n box-sizing: border-box;\n resize: vertical;\n}\n\n.obm-wkt__hint {\n margin: 0.2rem 0 0;\n font-size: 0.85rem;\n color: var(--obm-form-warning-color, #b9770e);\n}\n</style>\n","import type { Component } from 'vue';\nimport { UNKNOWN_COLUMN_TYPE, type NormalizedColumnType } from '../core/schema/types';\nimport ArrayField from './fields/ArrayField.vue';\nimport AutocompleteField from './fields/AutocompleteField.vue';\nimport BooleanField from './fields/BooleanField.vue';\nimport NumericField from './fields/NumericField.vue';\nimport SelectField from './fields/SelectField.vue';\nimport TemporalField from './fields/TemporalField.vue';\nimport TextAreaField from './fields/TextAreaField.vue';\nimport TextField from './fields/TextField.vue';\nimport TimeIntervalField from './fields/TimeIntervalField.vue';\nimport UnsupportedField from './fields/UnsupportedField.vue';\nimport WktTextField from './fields/WktTextField.vue';\n\n/** Column type → widget component. Hosts may override any entry. */\nexport type FieldRegistry = Record<NormalizedColumnType, Component>;\n\nexport function createFieldRegistry(overrides: Partial<FieldRegistry> = {}): FieldRegistry {\n return {\n text: TextField,\n // crings / timetominutes render as plain text in v0 (validated only).\n crings: TextField,\n timetominutes: TextField,\n textarea: TextAreaField,\n numeric: NumericField,\n boolean: BooleanField,\n date: TemporalField,\n datetime: TemporalField,\n time: TemporalField,\n time_interval: TimeIntervalField,\n list: SelectField,\n custom_list: SelectField,\n autocomplete: AutocompleteField,\n autocompletelist: AutocompleteField,\n array: ArrayField,\n // Geometry columns fall back to WKT text editing; register the\n // Leaflet-based widget from obm-upload-form-ui/vue-leaflet to upgrade.\n point: WktTextField,\n line: WktTextField,\n polygon: WktTextField,\n wkt: WktTextField,\n // Attachments are out of scope for v0.\n file_id: UnsupportedField,\n photo_id: UnsupportedField,\n [UNKNOWN_COLUMN_TYPE]: UnsupportedField,\n ...overrides,\n };\n}\n","import { reactive } from 'vue';\nimport type { FormSchema } from '../core/schema/types';\n\n/**\n * Reactive record values for a form schema: initialized from column\n * default_value (including hidden columns, which are submitted but not\n * rendered), with sticky/once_field-aware reset for \"save and add another\".\n */\nexport function useFormState(schema: FormSchema, initial?: Record<string, unknown>) {\n const values = reactive<Record<string, unknown>>({});\n\n function initialize(overlay?: Record<string, unknown>) {\n for (const column of schema.columns) {\n // An explicit null in the overlay means \"cleared\" (widgets emit null),\n // so only an absent/undefined entry falls back to the column default.\n const provided = overlay?.[column.column];\n values[column.column] = provided !== undefined ? provided : (column.default_value ?? null);\n }\n // Keep unknown overlay keys (host-managed extra columns, e.g. link ids).\n for (const [key, value] of Object.entries(overlay ?? {})) {\n if (!(key in values)) values[key] = value;\n }\n }\n\n function setValue(column: string, value: unknown) {\n values[column] = value;\n }\n\n /** Plain snapshot of everything, hidden columns included. */\n function dataForSubmit(): Record<string, unknown> {\n return { ...values };\n }\n\n /**\n * Reset for a follow-up entry: sticky and once_field columns keep their\n * value, everything else returns to its default.\n */\n function resetForNextEntry() {\n for (const column of schema.columns) {\n if (column.api_params.sticky || column.api_params.once_field) continue;\n values[column.column] = column.default_value ?? null;\n }\n }\n\n initialize(initial);\n\n return { values, initialize, setValue, dataForSubmit, resetForNextEntry };\n}\n","<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport type { ColumnSchema } from '../core/schema/types';\nimport type { ValidationIssue } from '../core/validation/types';\nimport { uiText } from './uiText';\n\nconst props = withDefaults(\n defineProps<{\n column: ColumnSchema;\n issues?: ValidationIssue[];\n language?: string;\n /** id of the wrapped input, connected to the label. */\n inputId?: string;\n }>(),\n { issues: () => [], language: 'en', inputId: undefined },\n);\n\nconst errors = computed(() => props.issues.filter((issue) => issue.severity === 'error'));\nconst warnings = computed(() => props.issues.filter((issue) => issue.severity === 'warning'));\nconst notices = computed(() => props.issues.filter((issue) => issue.severity === 'unsupported'));\nconst invalid = computed(() => errors.value.length > 0);\n</script>\n\n<template>\n <div\n class=\"obm-field\"\n :class=\"{\n 'obm-field--invalid': invalid,\n 'obm-field--warning': !invalid && warnings.length > 0,\n }\"\n :data-column=\"column.column\"\n >\n <label class=\"obm-field__label\" :for=\"inputId\">\n {{ column.short_name }}\n <span\n v-if=\"column.validate.required\"\n class=\"obm-field__required\"\n :title=\"uiText('required', language)\"\n >*</span\n >\n </label>\n <p v-if=\"column.description\" class=\"obm-field__description\">{{ column.description }}</p>\n <div class=\"obm-field__control\">\n <slot />\n </div>\n <ul v-if=\"issues.length > 0\" class=\"obm-field__issues\">\n <li\n v-for=\"(issue, index) in errors\"\n :key=\"`e-${index}`\"\n class=\"obm-field__issue obm-field__issue--error\"\n >\n {{ issue.message }}\n </li>\n <li\n v-for=\"(issue, index) in warnings\"\n :key=\"`w-${index}`\"\n class=\"obm-field__issue obm-field__issue--warning\"\n >\n {{ issue.message }}\n </li>\n <li\n v-for=\"(issue, index) in notices\"\n :key=\"`n-${index}`\"\n class=\"obm-field__issue obm-field__issue--notice\"\n >\n {{ issue.message }}\n </li>\n </ul>\n </div>\n</template>\n\n<style scoped>\n.obm-field {\n display: flex;\n flex-direction: column;\n gap: var(--obm-form-field-gap, 0.25rem);\n margin-bottom: var(--obm-form-field-margin, 1rem);\n font-family: var(--obm-form-font-family, inherit);\n}\n\n.obm-field__label {\n font-weight: var(--obm-form-label-weight, 600);\n color: var(--obm-form-label-color, inherit);\n}\n\n.obm-field__required {\n color: var(--obm-form-required-color, #c0392b);\n margin-left: 0.15rem;\n}\n\n.obm-field__description {\n margin: 0;\n font-size: var(--obm-form-description-size, 0.85rem);\n color: var(--obm-form-description-color, #666);\n}\n\n.obm-field__issues {\n margin: 0;\n padding-left: 1.2rem;\n font-size: var(--obm-form-issue-size, 0.85rem);\n}\n\n.obm-field__issue--error {\n color: var(--obm-form-error-color, #c0392b);\n}\n\n.obm-field__issue--warning {\n color: var(--obm-form-warning-color, #b9770e);\n}\n\n.obm-field__issue--notice {\n color: var(--obm-form-notice-color, #7f8c8d);\n}\n\n.obm-field--invalid :deep(input),\n.obm-field--invalid :deep(select),\n.obm-field--invalid :deep(textarea) {\n border-color: var(--obm-form-error-color, #c0392b);\n outline-color: var(--obm-form-error-color, #c0392b);\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport type { ColumnSchema } from '../core/schema/types';\nimport type { ValidationIssue } from '../core/validation/types';\nimport { uiText } from './uiText';\n\nconst props = withDefaults(\n defineProps<{\n issues: ValidationIssue[];\n /** Used to resolve column names to labels. */\n columns?: ColumnSchema[];\n language?: string;\n }>(),\n { columns: () => [], language: 'en' },\n);\n\nfunction labelFor(column: string): string {\n return props.columns.find((item) => item.column === column)?.short_name ?? column;\n}\n\nconst errors = computed(() => props.issues.filter((issue) => issue.severity === 'error'));\nconst warnings = computed(() => props.issues.filter((issue) => issue.severity === 'warning'));\nconst notices = computed(() => props.issues.filter((issue) => issue.severity === 'unsupported'));\n</script>\n\n<template>\n <div v-if=\"issues.length > 0\" class=\"obm-summary\" role=\"alert\">\n <template v-if=\"errors.length > 0\">\n <p class=\"obm-summary__title obm-summary__title--error\">\n {{ uiText('validationSummaryTitle', language) }}\n </p>\n <ul class=\"obm-summary__list\">\n <li v-for=\"(issue, index) in errors\" :key=\"`e-${index}`\">\n <strong>{{ labelFor(issue.column) }}:</strong> {{ issue.message }}\n </li>\n </ul>\n </template>\n <template v-if=\"warnings.length > 0\">\n <p class=\"obm-summary__title obm-summary__title--warning\">\n {{ uiText('warningsTitle', language) }}\n </p>\n <ul class=\"obm-summary__list\">\n <li v-for=\"(issue, index) in warnings\" :key=\"`w-${index}`\">\n <strong>{{ labelFor(issue.column) }}:</strong> {{ issue.message }}\n </li>\n </ul>\n </template>\n <template v-if=\"notices.length > 0\">\n <p class=\"obm-summary__title obm-summary__title--notice\">\n {{ uiText('noticesTitle', language) }}\n </p>\n <ul class=\"obm-summary__list\">\n <li v-for=\"(issue, index) in notices\" :key=\"`n-${index}`\">\n <strong>{{ labelFor(issue.column) }}:</strong> {{ issue.message }}\n </li>\n </ul>\n </template>\n </div>\n</template>\n\n<style scoped>\n.obm-summary {\n border: 1px solid var(--obm-form-summary-border, #e0c9c5);\n border-left: 4px solid var(--obm-form-error-color, #c0392b);\n border-radius: var(--obm-form-input-radius, 4px);\n background: var(--obm-form-summary-bg, #fdf3f2);\n padding: 0.75rem 1rem;\n margin-bottom: 1rem;\n}\n\n.obm-summary__title {\n margin: 0 0 0.3rem;\n font-weight: 600;\n}\n\n.obm-summary__title--error {\n color: var(--obm-form-error-color, #c0392b);\n}\n\n.obm-summary__title--warning {\n color: var(--obm-form-warning-color, #b9770e);\n}\n\n.obm-summary__title--notice {\n color: var(--obm-form-notice-color, #7f8c8d);\n}\n\n.obm-summary__list {\n margin: 0 0 0.5rem;\n padding-left: 1.2rem;\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed, nextTick, ref, watch } from 'vue';\nimport type { ColumnSchema, FormListElement, FormSchema } from '../core/schema/types';\nimport { validateForm } from '../core/validation/engine';\nimport type { DocumentState, ValidationOptions, ValidationResult } from '../core/validation/types';\nimport { createFieldRegistry, type FieldRegistry } from './fieldRegistry';\nimport FieldWrapper from './FieldWrapper.vue';\nimport { uiText } from './uiText';\nimport { useFormState } from './useFormState';\nimport ValidationSummary from './ValidationSummary.vue';\n\n/**\n * Schema-driven upload form. Renders form_body (already sorted by\n * normalizeFormDetails), validates per the policy model (ADR 0002) and emits\n * `submit` — it does not POST itself; wire the event to submitObservation().\n */\nconst props = withDefaults(\n defineProps<{\n schema: FormSchema;\n /** Initial/externally-managed values; overlaid on column defaults. */\n modelValue?: Record<string, unknown>;\n validation?: ValidationOptions;\n registry?: Partial<FieldRegistry>;\n language?: string;\n disabled?: boolean;\n /** Hide the draft button for single-step forms. */\n showDraftButton?: boolean;\n labels?: Partial<{ saveDraft: string; finalize: string }>;\n }>(),\n {\n modelValue: undefined,\n validation: undefined,\n registry: undefined,\n language: 'en',\n disabled: false,\n showDraftButton: true,\n labels: () => ({}),\n },\n);\n\nconst emit = defineEmits<{\n 'update:modelValue': [values: Record<string, unknown>];\n /** Fired when validation allows submission (draft or final). */\n submit: [\n payload: { data: Record<string, unknown>; state: DocumentState; validation: ValidationResult },\n ];\n /** Fired when finalization is blocked by validation. */\n refused: [result: ValidationResult];\n}>();\n\nconst rootElement = ref<HTMLElement | null>(null);\nconst formState = useFormState(props.schema, props.modelValue);\nconst result = ref<ValidationResult | null>(null);\n\nwatch(\n () => props.modelValue,\n (next) => {\n if (next !== undefined) formState.initialize(next);\n },\n);\n\nconst registry = computed(() => createFieldRegistry(props.registry));\nconst validationOptions = computed<ValidationOptions>(() => ({\n ...props.validation,\n language: props.validation?.language ?? props.language,\n}));\n\n/** Hidden columns are submitted with their defaults but never rendered. */\nconst visibleColumns = computed(() =>\n props.schema.columns.filter((column) => !column.api_params.hidden),\n);\n\nfunction widgetFor(column: ColumnSchema) {\n return registry.value[column.type];\n}\n\n/**\n * Options for a column whose picklist depends on another column\n * (trigger_target_column / filterable_list_elements): the triggering\n * column's current value selects the option set. Data is pre-resolved in the\n * schema, so no server round trip is needed.\n */\nfunction optionsFor(column: ColumnSchema): FormListElement[] | undefined {\n if (!column.filterable_list_elements) return undefined;\n const source = props.schema.columns.find((candidate) =>\n candidate.list_definition?.trigger_target_column.includes(column.column),\n );\n if (!source) return undefined;\n const triggerValue = formState.values[source.column];\n if (triggerValue === null || triggerValue === undefined || triggerValue === '') return [];\n return column.filterable_list_elements[String(triggerValue)] ?? [];\n}\n\nfunction issuesFor(column: ColumnSchema) {\n return result.value?.issues.filter((issue) => issue.column === column.column) ?? [];\n}\n\nfunction onFieldUpdate(column: ColumnSchema, value: unknown) {\n formState.setValue(column.column, value);\n emit('update:modelValue', formState.dataForSubmit());\n}\n\nasync function scrollToFirstInvalid() {\n await nextTick();\n const target = rootElement.value?.querySelector('.obm-field--invalid');\n if (target && typeof target.scrollIntoView === 'function') {\n target.scrollIntoView({ behavior: 'smooth', block: 'center' });\n }\n}\n\nfunction submitWith(state: DocumentState) {\n const validation = validateForm(\n props.schema,\n formState.dataForSubmit(),\n state,\n validationOptions.value,\n );\n result.value = validation;\n if (validation.blocking) {\n emit('refused', validation);\n void scrollToFirstInvalid();\n return;\n }\n emit('submit', { data: formState.dataForSubmit(), state, validation });\n}\n\ndefineExpose({\n /** Sticky/once_field-aware reset for \"save and add another\" flows. */\n resetForNextEntry: formState.resetForNextEntry,\n validate: (state: DocumentState) =>\n validateForm(props.schema, formState.dataForSubmit(), state, validationOptions.value),\n});\n</script>\n\n<template>\n <div ref=\"rootElement\" class=\"obm-form\">\n <ValidationSummary\n :issues=\"result?.issues ?? []\"\n :columns=\"schema.columns\"\n :language=\"language\"\n />\n <FieldWrapper\n v-for=\"column in visibleColumns\"\n :key=\"column.column\"\n :column=\"column\"\n :issues=\"issuesFor(column)\"\n :language=\"language\"\n >\n <component\n :is=\"widgetFor(column)\"\n :column=\"column\"\n :model-value=\"formState.values[column.column]\"\n :issues=\"issuesFor(column)\"\n :disabled=\"disabled\"\n :options=\"optionsFor(column)\"\n :language=\"language\"\n @update:model-value=\"onFieldUpdate(column, $event)\"\n />\n </FieldWrapper>\n <div class=\"obm-form__actions\">\n <button\n v-if=\"showDraftButton\"\n type=\"button\"\n class=\"obm-form__button obm-form__button--draft\"\n :disabled=\"disabled\"\n @click=\"submitWith('draft')\"\n >\n {{ labels.saveDraft ?? uiText('saveDraft', language) }}\n </button>\n <button\n type=\"button\"\n class=\"obm-form__button obm-form__button--finalize\"\n :disabled=\"disabled\"\n @click=\"submitWith('final')\"\n >\n {{ labels.finalize ?? uiText('finalize', language) }}\n </button>\n </div>\n </div>\n</template>\n\n<style scoped>\n.obm-form {\n max-width: var(--obm-form-max-width, 42rem);\n font-family: var(--obm-form-font-family, inherit);\n}\n\n.obm-form__actions {\n display: flex;\n gap: 0.6rem;\n margin-top: 1.25rem;\n}\n\n.obm-form__button {\n padding: 0.5rem 1.1rem;\n border-radius: var(--obm-form-input-radius, 4px);\n font: inherit;\n cursor: pointer;\n}\n\n.obm-form__button--draft {\n border: 1px solid var(--obm-form-accent, #2c7a4b);\n background: transparent;\n color: var(--obm-form-accent, #2c7a4b);\n}\n\n.obm-form__button--finalize {\n border: 1px solid var(--obm-form-accent, #2c7a4b);\n background: var(--obm-form-accent, #2c7a4b);\n color: var(--obm-form-accent-contrast, #fff);\n}\n\n.obm-form__button:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n}\n</style>\n"],"names":["props","__props","emit","__emit","inputId","useId","draft","ref","items","computed","isDisabled","add","value","remove","index","next","_","itemIndex","__expose","_openBlock","_createElementBlock","_hoisted_1","_hoisted_2","_Fragment","_renderList","item","_createTextVNode","_toDisplayString","_createElementVNode","_unref","uiText","$event","_hoisted_3","_hoisted_4","_hoisted_6","query","open","highlighted","elements","multi","_a","extendable","selected","matches","needle","pool","element","labelFor","commit","values","pick","onInput","event","onKeydown","onBlur","_hoisted_5","_normalizeClass","_withModifiers","triState","checked","triStateValue","onCheckbox","onTriState","bounds","parseMinmaxBounds","text","raw","numeric","_b","multiselect","asButtons","selectedValues","emitSingle","onSelectChange","select","option","toggleButton","current","_mergeProps","WIRE_FORMAT","DISPLAY_FORMAT","modelType","displayFormat","isTimeOnly","timeConfig","locale","hu","enUS","onUpdate","_createBlock","VueDatePicker","parts","start","end","typeLabel","UNKNOWN_COLUMN_TYPE","invalidWkt","isWkt","createFieldRegistry","overrides","TextField","TextAreaField","NumericField","BooleanField","TemporalField","TimeIntervalField","SelectField","AutocompleteField","ArrayField","WktTextField","UnsupportedField","useFormState","schema","initial","reactive","initialize","overlay","column","provided","key","setValue","dataForSubmit","resetForNextEntry","errors","issue","warnings","notices","invalid","_renderSlot","_ctx","_hoisted_7","rootElement","formState","result","watch","registry","validationOptions","visibleColumns","widgetFor","optionsFor","source","candidate","triggerValue","issuesFor","onFieldUpdate","scrollToFirstInvalid","nextTick","target","submitWith","state","validation","validateForm","_createVNode","ValidationSummary","FieldWrapper","_resolveDynamicComponent"],"mappings":"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"}
@@ -0,0 +1,359 @@
1
+ var y = Object.defineProperty;
2
+ var E = (t, e, r) => e in t ? y(t, e, { enumerable: !0, configurable: !0, writable: !0, value: r }) : t[e] = r;
3
+ var p = (t, e, r) => E(t, typeof e != "symbol" ? e + "" : e, r);
4
+ class l extends Error {
5
+ constructor(e, r) {
6
+ super(e, r), this.name = new.target.name;
7
+ }
8
+ }
9
+ class D extends l {
10
+ }
11
+ class K extends l {
12
+ constructor(r, n, o) {
13
+ super(o != null && o.title ? `${r} ${o.title}` : `API request failed with HTTP ${r}`);
14
+ p(this, "status");
15
+ /** Parsed Problem JSON body, when the response carried one. */
16
+ p(this, "problem");
17
+ /** Raw response body text, for non-Problem error responses. */
18
+ p(this, "body");
19
+ this.status = r, this.problem = o, this.body = n;
20
+ }
21
+ }
22
+ class J extends l {
23
+ }
24
+ class h extends l {
25
+ }
26
+ var G = Object.defineProperty, x = (t, e, r) => e in t ? G(t, e, { enumerable: !0, configurable: !0, writable: !0, value: r }) : t[e] = r, m = (t, e, r) => (x(t, typeof e != "symbol" ? e + "" : e, r), r);
27
+ const S = [
28
+ "Point",
29
+ "LineString",
30
+ "Polygon",
31
+ "MultiPoint",
32
+ "MultiLineString",
33
+ "MultiPolygon",
34
+ "GeometryCollection"
35
+ ], P = ["ZM", "Z", "M"], a = "EMPTY";
36
+ class w {
37
+ constructor(e) {
38
+ m(this, "value"), m(this, "position"), this.value = e.toUpperCase(), this.position = 0;
39
+ }
40
+ match(e) {
41
+ this.skipWhitespaces();
42
+ for (const r of e) {
43
+ const n = r.toUpperCase();
44
+ if (this.value.startsWith(n, this.position))
45
+ return this.position += n.length, r;
46
+ }
47
+ return null;
48
+ }
49
+ matchRegex(e) {
50
+ this.skipWhitespaces();
51
+ for (const r of e) {
52
+ const n = this.value.substring(this.position).match(r);
53
+ if (n)
54
+ return this.position += n[0].length, n;
55
+ }
56
+ return null;
57
+ }
58
+ isMatch(e) {
59
+ return this.skipWhitespaces(), this.value.startsWith(e, this.position) ? (this.position += e.length, !0) : !1;
60
+ }
61
+ matchType() {
62
+ const e = this.match(S);
63
+ if (!e)
64
+ throw new Error("Expected geometry type");
65
+ return e;
66
+ }
67
+ matchDimension() {
68
+ switch (this.match(P)) {
69
+ case "ZM":
70
+ return { hasZ: !0, hasM: !0 };
71
+ case "Z":
72
+ return { hasZ: !0, hasM: !1 };
73
+ case "M":
74
+ return { hasZ: !1, hasM: !0 };
75
+ default:
76
+ return { hasZ: !1, hasM: !1 };
77
+ }
78
+ }
79
+ expectGroupStart() {
80
+ if (!this.isMatch("("))
81
+ throw new Error("Expected group start");
82
+ }
83
+ expectGroupEnd() {
84
+ if (!this.isMatch(")"))
85
+ throw new Error("Expected group end");
86
+ }
87
+ matchCoordinate(e) {
88
+ let r;
89
+ if (e.hasZ && e.hasM ? r = this.matchRegex([/^(\S*)\s+(\S*)\s+(\S*)\s+([^\s,)]*)/i]) : e.hasZ || e.hasM ? r = this.matchRegex([/^(\S*)\s+(\S*)\s+([^\s,)]*)/i]) : r = this.matchRegex([/^(\S*)\s+([^\s,)]*)/i]), !r)
90
+ throw new Error("Expected coordinates");
91
+ const n = e.hasZ && e.hasM ? [
92
+ parseFloat(r[1]),
93
+ parseFloat(r[2]),
94
+ parseFloat(r[3]),
95
+ parseFloat(r[4])
96
+ ] : e.hasZ ? [parseFloat(r[1]), parseFloat(r[2]), parseFloat(r[3])] : e.hasM ? [
97
+ parseFloat(r[1]),
98
+ parseFloat(r[2])
99
+ ] : [parseFloat(r[1]), parseFloat(r[2])];
100
+ if (!e.srid || e.srid === 4326)
101
+ return n;
102
+ if (e.srid === "http://www.opengis.net/def/crs/epsg/0/4326")
103
+ return n.length === 3 ? [n[1], n[0], n[2]] : [n[1], n[0]];
104
+ if (!e.proj)
105
+ throw new Error(
106
+ `EWKT data in an unknown SRID (${e.srid}) was provided, but a proj function was not`
107
+ );
108
+ return e.proj(
109
+ typeof e.srid == "string" ? e.srid : `EPSG:${e.srid}`,
110
+ "EPSG:4326",
111
+ n
112
+ );
113
+ }
114
+ matchCoordinates(e) {
115
+ const r = [];
116
+ do {
117
+ const n = this.isMatch("(");
118
+ r.push(this.matchCoordinate(e)), n && this.expectGroupEnd();
119
+ } while (this.isMatch(","));
120
+ return r;
121
+ }
122
+ skipWhitespaces() {
123
+ for (; this.position < this.value.length && this.value[this.position] === " "; )
124
+ this.position++;
125
+ }
126
+ }
127
+ const T = (t, e) => {
128
+ if (t.isMatch(a))
129
+ return e.emptyAsNull ? null : { type: "Point", coordinates: [] };
130
+ t.expectGroupStart();
131
+ const r = t.matchCoordinate(e);
132
+ return t.expectGroupEnd(), {
133
+ type: "Point",
134
+ coordinates: r
135
+ };
136
+ }, $ = (t, e) => {
137
+ if (t.isMatch(a))
138
+ return e.emptyAsNull ? null : { type: "LineString", coordinates: [] };
139
+ t.expectGroupStart();
140
+ const r = t.matchCoordinates(e);
141
+ return t.expectGroupEnd(), {
142
+ type: "LineString",
143
+ coordinates: r
144
+ };
145
+ }, N = (t, e) => {
146
+ if (t.isMatch(a))
147
+ return e.emptyAsNull ? null : { type: "Polygon", coordinates: [] };
148
+ const r = [];
149
+ for (t.expectGroupStart(), t.expectGroupStart(), r.push(t.matchCoordinates(e)), t.expectGroupEnd(); t.isMatch(","); )
150
+ t.expectGroupStart(), r.push(t.matchCoordinates(e)), t.expectGroupEnd();
151
+ return t.expectGroupEnd(), {
152
+ type: "Polygon",
153
+ coordinates: r
154
+ };
155
+ }, I = (t, e) => {
156
+ if (t.isMatch(a))
157
+ return e.emptyAsNull ? null : { type: "MultiPoint", coordinates: [] };
158
+ t.expectGroupStart();
159
+ const r = t.matchCoordinates(e);
160
+ return t.expectGroupEnd(), {
161
+ type: "MultiPoint",
162
+ coordinates: r
163
+ };
164
+ }, L = (t, e) => {
165
+ if (t.isMatch(a))
166
+ return e.emptyAsNull ? null : { type: "MultiLineString", coordinates: [] };
167
+ t.expectGroupStart();
168
+ const r = [];
169
+ do
170
+ t.expectGroupStart(), r.push(t.matchCoordinates(e)), t.expectGroupEnd();
171
+ while (t.isMatch(","));
172
+ return t.expectGroupEnd(), {
173
+ type: "MultiLineString",
174
+ coordinates: r
175
+ };
176
+ }, O = (t, e) => {
177
+ if (t.isMatch(a))
178
+ return e.emptyAsNull ? null : { type: "MultiPolygon", coordinates: [] };
179
+ t.expectGroupStart();
180
+ const r = [];
181
+ do {
182
+ t.expectGroupStart();
183
+ const n = [], o = [];
184
+ for (t.expectGroupStart(), n.push.apply(n, t.matchCoordinates(e)), t.expectGroupEnd(); t.isMatch(","); )
185
+ t.expectGroupStart(), o.push(t.matchCoordinates(e)), t.expectGroupEnd();
186
+ r.push([n, ...o]), t.expectGroupEnd();
187
+ } while (t.isMatch(","));
188
+ return t.expectGroupEnd(), {
189
+ type: "MultiPolygon",
190
+ coordinates: r
191
+ };
192
+ }, C = (t, e) => {
193
+ if (t.isMatch(a))
194
+ return e.emptyAsNull ? null : { type: "GeometryCollection", geometries: [] };
195
+ t.expectGroupStart();
196
+ const r = [];
197
+ do {
198
+ const n = f(t, e);
199
+ n && r.push(n);
200
+ } while (t.isMatch(","));
201
+ return t.expectGroupEnd(), {
202
+ type: "GeometryCollection",
203
+ geometries: r
204
+ };
205
+ };
206
+ function i(t) {
207
+ return t.join(" ");
208
+ }
209
+ function c(t) {
210
+ if (t === void 0)
211
+ return " ";
212
+ switch (t.length) {
213
+ case 3:
214
+ return " Z ";
215
+ default:
216
+ return " ";
217
+ }
218
+ }
219
+ function v(t) {
220
+ return t.coordinates.length === 0 ? "POINT EMPTY" : `POINT${c(t.coordinates)}(${i(
221
+ t.coordinates
222
+ )})`;
223
+ }
224
+ function R(t, e) {
225
+ return t.coordinates.length === 0 ? "MULTIPOINT EMPTY" : `MULTIPOINT${c(
226
+ t.coordinates[0]
227
+ )}(${t.coordinates.map(
228
+ (r) => e.version === "1.2.0" ? `(${i(r)})` : i(r)
229
+ ).join(",")})`;
230
+ }
231
+ function Z(t) {
232
+ if (t.coordinates.length === 0)
233
+ return "LINESTRING EMPTY";
234
+ const e = `(${t.coordinates.map((r) => i(r)).join(",")})`;
235
+ return `LINESTRING${c(t.coordinates[0])}${e}`;
236
+ }
237
+ function W(t, e) {
238
+ return t.geometries.length === 0 ? "GEOMETRYCOLLECTION EMPTY" : `GEOMETRYCOLLECTION${`(${t.geometries.map((r) => g(r, e)).join(",")})`}`;
239
+ }
240
+ function Y(t) {
241
+ if (t.coordinates.length === 0)
242
+ return "MULTILINESTRING EMPTY";
243
+ const e = `(${t.coordinates.map((r) => `(${r.map((n) => i(n))})`)})`;
244
+ return `MULTILINESTRING${c(t.coordinates[0][0])}${e}`;
245
+ }
246
+ function F(t) {
247
+ var e;
248
+ if (t.coordinates.length === 0)
249
+ return "POLYGON EMPTY";
250
+ const r = `(${t.coordinates.map((n) => `(${n.map((o) => i(o))})`)})`;
251
+ return `POLYGON${c((e = t.coordinates[0]) == null ? void 0 : e[0])}${r}`;
252
+ }
253
+ function b(t) {
254
+ var e, r;
255
+ if (t.coordinates.length === 0)
256
+ return "MULTIPOLYGON EMPTY";
257
+ const n = `(${t.coordinates.map((o) => `(${o.map((u) => `(${u.map((s) => i(s))})`)})`)})`;
258
+ return `MULTIPOLYGON${c(
259
+ (r = (e = t.coordinates[0]) == null ? void 0 : e[0]) == null ? void 0 : r[0]
260
+ )}${n}`;
261
+ }
262
+ function f(t, e) {
263
+ let r = null;
264
+ const n = t.matchRegex([/^SRID=(\d+);/i]);
265
+ if (n)
266
+ r = parseInt(n[1], 10);
267
+ else {
268
+ const d = t.matchRegex([/^<([^>]+)>/i]);
269
+ d && (r = d[1].toLowerCase());
270
+ }
271
+ const o = t.matchType(), u = t.matchDimension(), s = {
272
+ ...e,
273
+ srid: r,
274
+ hasZ: u.hasZ,
275
+ hasM: u.hasM
276
+ };
277
+ switch (o) {
278
+ case "Point":
279
+ return T(t, s);
280
+ case "LineString":
281
+ return $(t, s);
282
+ case "Polygon":
283
+ return N(t, s);
284
+ case "MultiPoint":
285
+ return I(t, s);
286
+ case "MultiLineString":
287
+ return L(t, s);
288
+ case "MultiPolygon":
289
+ return O(t, s);
290
+ case "GeometryCollection":
291
+ return C(t, s);
292
+ }
293
+ }
294
+ function g(t, e = { version: "1.1.0" }) {
295
+ switch (t.type) {
296
+ case "Point":
297
+ return v(t);
298
+ case "LineString":
299
+ return Z(t);
300
+ case "MultiPoint":
301
+ return R(t, e);
302
+ case "GeometryCollection":
303
+ return W(t, e);
304
+ case "Polygon":
305
+ return F(t);
306
+ case "MultiPolygon":
307
+ return b(t);
308
+ case "MultiLineString":
309
+ return Y(t);
310
+ }
311
+ }
312
+ function A(t, e = {
313
+ emptyAsNull: !0
314
+ }) {
315
+ return f(new w(t), e);
316
+ }
317
+ const k = /^\s*SRID=\d+\s*;/i;
318
+ function M(t, e = 80) {
319
+ return t.length > e ? `${t.slice(0, e)}…` : t;
320
+ }
321
+ function j(t) {
322
+ const e = t.replace(k, "").trim();
323
+ if (e === "")
324
+ throw new h("Cannot parse an empty WKT string");
325
+ let r;
326
+ try {
327
+ r = A(e);
328
+ } catch (n) {
329
+ throw new h(`Invalid WKT: ${M(e)}`, { cause: n });
330
+ }
331
+ if (r === null)
332
+ throw new h(`Invalid or empty WKT: ${M(e)}`);
333
+ return r;
334
+ }
335
+ function q(t) {
336
+ try {
337
+ return g(t);
338
+ } catch (e) {
339
+ throw new h("Could not convert GeoJSON geometry to WKT", { cause: e });
340
+ }
341
+ }
342
+ function H(t) {
343
+ try {
344
+ return j(t), !0;
345
+ } catch {
346
+ return !1;
347
+ }
348
+ }
349
+ export {
350
+ K as O,
351
+ D as a,
352
+ J as b,
353
+ l as c,
354
+ h as d,
355
+ q as g,
356
+ H as i,
357
+ j as w
358
+ };
359
+ //# sourceMappingURL=wkt-C0dkXG1x.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wkt-C0dkXG1x.js","sources":["../src/core/client/errors.ts","../node_modules/betterknown/dist/betterknown.mjs","../src/core/geo/wkt.ts"],"sourcesContent":["/** Base class for every error thrown by this library. */\nexport class ObmError extends Error {\n constructor(message: string, options?: ErrorOptions) {\n super(message, options);\n this.name = new.target.name;\n }\n}\n\n/** The request never produced an HTTP response (network failure, CORS, abort). */\nexport class ObmNetworkError extends ObmError {}\n\n/** RFC 9457 Problem Details, the API's error body format. */\nexport interface ProblemDetails {\n type?: string;\n title?: string;\n detail?: string;\n status?: number;\n instance?: string;\n [extension: string]: unknown;\n}\n\n/** A non-2xx HTTP response from the API. */\nexport class ObmApiError extends ObmError {\n readonly status: number;\n /** Parsed Problem JSON body, when the response carried one. */\n readonly problem: ProblemDetails | null;\n /** Raw response body text, for non-Problem error responses. */\n readonly body: string;\n\n constructor(status: number, body: string, problem: ProblemDetails | null) {\n super(problem?.title ? `${status} ${problem.title}` : `API request failed with HTTP ${status}`);\n this.status = status;\n this.problem = problem;\n this.body = body;\n }\n}\n\n/** The API returned a payload whose structure this library cannot interpret. */\nexport class ObmSchemaError extends ObmError {}\n\n/** WKT/GeoJSON conversion failure. */\nexport class ObmGeometryError extends ObmError {}\n","var d = Object.defineProperty;\nvar M = (t, e, n) => e in t ? d(t, e, { enumerable: !0, configurable: !0, writable: !0, value: n }) : t[e] = n;\nvar u = (t, e, n) => (M(t, typeof e != \"symbol\" ? e + \"\" : e, n), n);\nconst f = [\n \"Point\",\n \"LineString\",\n \"Polygon\",\n \"MultiPoint\",\n \"MultiLineString\",\n \"MultiPolygon\",\n \"GeometryCollection\"\n], g = [\"ZM\", \"Z\", \"M\"], c = \"EMPTY\";\nclass G {\n constructor(e) {\n u(this, \"value\");\n u(this, \"position\");\n this.value = e.toUpperCase(), this.position = 0;\n }\n match(e) {\n this.skipWhitespaces();\n for (const n of e) {\n const r = n.toUpperCase();\n if (this.value.startsWith(r, this.position))\n return this.position += r.length, n;\n }\n return null;\n }\n matchRegex(e) {\n this.skipWhitespaces();\n for (const n of e) {\n const r = this.value.substring(this.position).match(n);\n if (r)\n return this.position += r[0].length, r;\n }\n return null;\n }\n isMatch(e) {\n return this.skipWhitespaces(), this.value.startsWith(e, this.position) ? (this.position += e.length, !0) : !1;\n }\n matchType() {\n const e = this.match(f);\n if (!e)\n throw new Error(\"Expected geometry type\");\n return e;\n }\n matchDimension() {\n switch (this.match(g)) {\n case \"ZM\":\n return { hasZ: !0, hasM: !0 };\n case \"Z\":\n return { hasZ: !0, hasM: !1 };\n case \"M\":\n return { hasZ: !1, hasM: !0 };\n default:\n return { hasZ: !1, hasM: !1 };\n }\n }\n expectGroupStart() {\n if (!this.isMatch(\"(\"))\n throw new Error(\"Expected group start\");\n }\n expectGroupEnd() {\n if (!this.isMatch(\")\"))\n throw new Error(\"Expected group end\");\n }\n matchCoordinate(e) {\n let n;\n if (e.hasZ && e.hasM ? n = this.matchRegex([/^(\\S*)\\s+(\\S*)\\s+(\\S*)\\s+([^\\s,)]*)/i]) : e.hasZ || e.hasM ? n = this.matchRegex([/^(\\S*)\\s+(\\S*)\\s+([^\\s,)]*)/i]) : n = this.matchRegex([/^(\\S*)\\s+([^\\s,)]*)/i]), !n)\n throw new Error(\"Expected coordinates\");\n const r = e.hasZ && e.hasM ? [\n parseFloat(n[1]),\n parseFloat(n[2]),\n parseFloat(n[3]),\n parseFloat(n[4])\n ] : e.hasZ ? [parseFloat(n[1]), parseFloat(n[2]), parseFloat(n[3])] : e.hasM ? [\n parseFloat(n[1]),\n parseFloat(n[2])\n ] : [parseFloat(n[1]), parseFloat(n[2])];\n if (!e.srid || e.srid === 4326)\n return r;\n if (e.srid === \"http://www.opengis.net/def/crs/epsg/0/4326\")\n return r.length === 3 ? [r[1], r[0], r[2]] : [r[1], r[0]];\n if (!e.proj)\n throw new Error(\n `EWKT data in an unknown SRID (${e.srid}) was provided, but a proj function was not`\n );\n return e.proj(\n typeof e.srid == \"string\" ? e.srid : `EPSG:${e.srid}`,\n \"EPSG:4326\",\n r\n );\n }\n matchCoordinates(e) {\n const n = [];\n do {\n const r = this.isMatch(\"(\");\n n.push(this.matchCoordinate(e)), r && this.expectGroupEnd();\n } while (this.isMatch(\",\"));\n return n;\n }\n skipWhitespaces() {\n for (; this.position < this.value.length && this.value[this.position] === \" \"; )\n this.position++;\n }\n}\nconst E = (t, e) => {\n if (t.isMatch(c))\n return e.emptyAsNull ? null : { type: \"Point\", coordinates: [] };\n t.expectGroupStart();\n const n = t.matchCoordinate(e);\n return t.expectGroupEnd(), {\n type: \"Point\",\n coordinates: n\n };\n}, m = (t, e) => {\n if (t.isMatch(c))\n return e.emptyAsNull ? null : { type: \"LineString\", coordinates: [] };\n t.expectGroupStart();\n const n = t.matchCoordinates(e);\n return t.expectGroupEnd(), {\n type: \"LineString\",\n coordinates: n\n };\n}, y = (t, e) => {\n if (t.isMatch(c))\n return e.emptyAsNull ? null : { type: \"Polygon\", coordinates: [] };\n const n = [];\n for (t.expectGroupStart(), t.expectGroupStart(), n.push(t.matchCoordinates(e)), t.expectGroupEnd(); t.isMatch(\",\"); )\n t.expectGroupStart(), n.push(t.matchCoordinates(e)), t.expectGroupEnd();\n return t.expectGroupEnd(), {\n type: \"Polygon\",\n coordinates: n\n };\n}, S = (t, e) => {\n if (t.isMatch(c))\n return e.emptyAsNull ? null : { type: \"MultiPoint\", coordinates: [] };\n t.expectGroupStart();\n const n = t.matchCoordinates(e);\n return t.expectGroupEnd(), {\n type: \"MultiPoint\",\n coordinates: n\n };\n}, x = (t, e) => {\n if (t.isMatch(c))\n return e.emptyAsNull ? null : { type: \"MultiLineString\", coordinates: [] };\n t.expectGroupStart();\n const n = [];\n do\n t.expectGroupStart(), n.push(t.matchCoordinates(e)), t.expectGroupEnd();\n while (t.isMatch(\",\"));\n return t.expectGroupEnd(), {\n type: \"MultiLineString\",\n coordinates: n\n };\n}, P = (t, e) => {\n if (t.isMatch(c))\n return e.emptyAsNull ? null : { type: \"MultiPolygon\", coordinates: [] };\n t.expectGroupStart();\n const n = [];\n do {\n t.expectGroupStart();\n const r = [], s = [];\n for (t.expectGroupStart(), r.push.apply(r, t.matchCoordinates(e)), t.expectGroupEnd(); t.isMatch(\",\"); )\n t.expectGroupStart(), s.push(t.matchCoordinates(e)), t.expectGroupEnd();\n n.push([r, ...s]), t.expectGroupEnd();\n } while (t.isMatch(\",\"));\n return t.expectGroupEnd(), {\n type: \"MultiPolygon\",\n coordinates: n\n };\n}, T = (t, e) => {\n if (t.isMatch(c))\n return e.emptyAsNull ? null : { type: \"GeometryCollection\", geometries: [] };\n t.expectGroupStart();\n const n = [];\n do {\n const r = l(t, e);\n r && n.push(r);\n } while (t.isMatch(\",\"));\n return t.expectGroupEnd(), {\n type: \"GeometryCollection\",\n geometries: n\n };\n};\nfunction o(t) {\n return t.join(\" \");\n}\nfunction a(t) {\n if (t === void 0)\n return \" \";\n switch (t.length) {\n case 3:\n return \" Z \";\n default:\n return \" \";\n }\n}\nfunction L(t) {\n return t.coordinates.length === 0 ? \"POINT EMPTY\" : `POINT${a(t.coordinates)}(${o(\n t.coordinates\n )})`;\n}\nfunction N(t, e) {\n return t.coordinates.length === 0 ? \"MULTIPOINT EMPTY\" : `MULTIPOINT${a(\n t.coordinates[0]\n )}(${t.coordinates.map(\n (n) => e.version === \"1.2.0\" ? `(${o(n)})` : o(n)\n ).join(\",\")})`;\n}\nfunction C(t) {\n if (t.coordinates.length === 0)\n return \"LINESTRING EMPTY\";\n const e = `(${t.coordinates.map((n) => o(n)).join(\",\")})`;\n return `LINESTRING${a(t.coordinates[0])}${e}`;\n}\nfunction $(t, e) {\n return t.geometries.length === 0 ? \"GEOMETRYCOLLECTION EMPTY\" : `GEOMETRYCOLLECTION${`(${t.geometries.map((r) => w(r, e)).join(\",\")})`}`;\n}\nfunction I(t) {\n if (t.coordinates.length === 0)\n return \"MULTILINESTRING EMPTY\";\n const e = `(${t.coordinates.map((n) => `(${n.map((r) => o(r))})`)})`;\n return `MULTILINESTRING${a(t.coordinates[0][0])}${e}`;\n}\nfunction W(t) {\n var n;\n if (t.coordinates.length === 0)\n return \"POLYGON EMPTY\";\n const e = `(${t.coordinates.map((r) => `(${r.map((s) => o(s))})`)})`;\n return `POLYGON${a((n = t.coordinates[0]) == null ? void 0 : n[0])}${e}`;\n}\nfunction O(t) {\n var n, r;\n if (t.coordinates.length === 0)\n return \"MULTIPOLYGON EMPTY\";\n const e = `(${t.coordinates.map((s) => `(${s.map((h) => `(${h.map((i) => o(i))})`)})`)})`;\n return `MULTIPOLYGON${a(\n (r = (n = t.coordinates[0]) == null ? void 0 : n[0]) == null ? void 0 : r[0]\n )}${e}`;\n}\nfunction l(t, e) {\n let n = null;\n const r = t.matchRegex([/^SRID=(\\d+);/i]);\n if (r)\n n = parseInt(r[1], 10);\n else {\n const p = t.matchRegex([/^<([^>]+)>/i]);\n p && (n = p[1].toLowerCase());\n }\n const s = t.matchType(), h = t.matchDimension(), i = {\n ...e,\n srid: n,\n hasZ: h.hasZ,\n hasM: h.hasM\n };\n switch (s) {\n case \"Point\":\n return E(t, i);\n case \"LineString\":\n return m(t, i);\n case \"Polygon\":\n return y(t, i);\n case \"MultiPoint\":\n return S(t, i);\n case \"MultiLineString\":\n return x(t, i);\n case \"MultiPolygon\":\n return P(t, i);\n case \"GeometryCollection\":\n return T(t, i);\n }\n}\nfunction w(t, e = { version: \"1.1.0\" }) {\n switch (t.type) {\n case \"Point\":\n return L(t);\n case \"LineString\":\n return C(t);\n case \"MultiPoint\":\n return N(t, e);\n case \"GeometryCollection\":\n return $(t, e);\n case \"Polygon\":\n return W(t);\n case \"MultiPolygon\":\n return O(t);\n case \"MultiLineString\":\n return I(t);\n }\n}\nfunction R(t, e = {\n emptyAsNull: !0\n}) {\n return l(new G(t), e);\n}\nexport {\n w as geoJSONToWkt,\n R as wktToGeoJSON\n};\n","import { geoJSONToWkt as stringifyGeoJSON, wktToGeoJSON as parseWkt } from 'betterknown';\nimport type { Geometry } from 'geojson';\nimport { ObmGeometryError } from '../client/errors';\n\n/**\n * WKT↔GeoJSON conversion adapter. This module is the only place allowed to\n * import the underlying conversion library (see ADR 0003).\n *\n * v0 assumes EPSG:4326 in and out; a leading EWKT `SRID=nnnn;` prefix is\n * stripped and its SRID ignored.\n */\n\nconst SRID_PREFIX = /^\\s*SRID=\\d+\\s*;/i;\n\nfunction truncateForMessage(value: string, maxLength = 80): string {\n return value.length > maxLength ? `${value.slice(0, maxLength)}…` : value;\n}\n\n/** Parse a WKT string into a GeoJSON geometry. Throws ObmGeometryError on invalid input. */\nexport function wktToGeoJSON(wkt: string): Geometry {\n const cleaned = wkt.replace(SRID_PREFIX, '').trim();\n if (cleaned === '') {\n throw new ObmGeometryError('Cannot parse an empty WKT string');\n }\n let geometry: Geometry | null;\n try {\n geometry = parseWkt(cleaned) as Geometry | null;\n } catch (cause) {\n throw new ObmGeometryError(`Invalid WKT: ${truncateForMessage(cleaned)}`, { cause });\n }\n if (geometry === null) {\n throw new ObmGeometryError(`Invalid or empty WKT: ${truncateForMessage(cleaned)}`);\n }\n return geometry;\n}\n\n/** Serialize a GeoJSON geometry to WKT. Throws ObmGeometryError on failure. */\nexport function geoJSONToWkt(geometry: Geometry): string {\n try {\n return stringifyGeoJSON(geometry);\n } catch (cause) {\n throw new ObmGeometryError('Could not convert GeoJSON geometry to WKT', { cause });\n }\n}\n\n/** True when the string parses as (E)WKT. */\nexport function isWkt(value: string): boolean {\n try {\n wktToGeoJSON(value);\n return true;\n } catch {\n return false;\n }\n}\n"],"names":["ObmError","message","options","ObmNetworkError","ObmApiError","status","body","problem","__publicField","ObmSchemaError","ObmGeometryError","d","M","n","u","f","g","c","G","r","E","m","y","S","x","P","s","T","l","o","a","L","N","C","$","w","I","W","e","O","h","i","p","R","SRID_PREFIX","truncateForMessage","value","maxLength","wktToGeoJSON","wkt","cleaned","geometry","parseWkt","cause","geoJSONToWkt","stringifyGeoJSON","isWkt"],"mappings":"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","x_google_ignoreList":[1]}