Add icon to reset coordinates input.

This commit is contained in:
baldo 2022-09-01 13:11:17 +02:00
parent e9b8e0b7ae
commit 0bf8a149e7
5 changed files with 82 additions and 30 deletions

View file

@ -64,6 +64,8 @@ h2 {
input {
padding: $input-padding;
font-size: $input-font-size;
border: none;
border-radius: $input-border-radius;

View file

@ -91,6 +91,10 @@ function createMap(defaultLayers: L.Layer[], layers: { [p: string]: L.Layer }) {
function updateMarker() {
const coordinates = getCoordinates();
if (!coordinates) {
if (marker) {
marker.remove();
marker = null;
}
return;
}

View file

@ -13,6 +13,7 @@ interface Props {
placeholder: string;
constraint: Constraint;
validationError: string;
resetIconTitle?: string;
help?: string;
}
@ -24,8 +25,8 @@ const emit = defineEmits<{
const displayLabel = computed(() =>
props.label
? props.constraint.optional
? props.label
: `${props.label}*`
? `${props.label}:`
: `${props.label}*:`
: undefined
);
@ -33,6 +34,10 @@ const input = ref<HTMLInputElement>();
const valid = ref(true);
const validated = ref(false);
const hasResetIcon = computed(
() => !!(props.modelValue && props.resetIconTitle)
);
function registerValidationComponent() {
const instance = getCurrentInstance();
let parent = instance?.parent;
@ -48,16 +53,30 @@ function registerValidationComponent() {
);
}
function onInput() {
if (validated.value) {
validate();
}
function withInputElement(callback: (element: HTMLInputElement) => void): void {
const element = input.value;
if (!element) {
console.warn("Could not get referenced input element.");
return;
}
emit("update:modelValue", element.value);
callback(element);
}
function onInput() {
if (validated.value) {
validate();
}
withInputElement((element) => {
emit("update:modelValue", element.value);
});
}
function reset() {
withInputElement((element) => {
element.value = "";
onInput();
});
}
function validate(): boolean {
@ -82,27 +101,29 @@ onMounted(() => {
<template>
<div class="validation-form-input">
<label v-if="displayLabel">
{{ displayLabel }}:
<label>
{{ displayLabel }}
<ExpandableHelpBox v-if="props.help" :text="props.help" />
<input
ref="input"
:name="props.name"
:value="props.modelValue"
@input="onInput"
:type="props.type || 'text'"
:placeholder="props.placeholder"
/>
<span class="input-wrapper">
<input
ref="input"
:class="{ 'has-reset-icon': hasResetIcon }"
:name="props.name"
:value="props.modelValue"
@input="onInput"
:type="props.type || 'text'"
:placeholder="props.placeholder"
/>
<i
v-if="hasResetIcon"
class="fa fa-times reset-icon"
aria-hidden="true"
:title="props.resetIconTitle"
@click.prevent="reset"
/>
</span>
</label>
<input
v-if="!displayLabel"
ref="input"
:name="props.name"
:value="props.modelValue"
@input="onInput"
:type="props.type || 'text'"
:placeholder="props.placeholder"
/>
<div class="validation-error" v-if="!valid">
{{ props.validationError }}
</div>
@ -117,15 +138,35 @@ onMounted(() => {
}
label {
position: relative;
display: block;
font-weight: $label-font-weight;
cursor: pointer;
}
input {
box-sizing: border-box;
width: 100%;
margin: 0.25em 0;
.input-wrapper {
display: flex;
align-items: center;
input {
box-sizing: border-box;
width: 100%;
margin: 0.25em 0;
&.has-reset-icon {
padding-right: $input-with-reset-icon-padding-right;
}
}
.reset-icon {
cursor: pointer;
width: 0; // Allow input to really take up 100% width within flexbox.
margin-left: -$input-reset-icon-position-right;
font-size: $input-font-size;
color: $input-reset-icon-color;
}
}
.validation-error {

View file

@ -43,6 +43,7 @@ function onUpdateModelValue(value: string) {
:placeholder="`z. B. ${configStore.getConfig.coordsSelector.lat} ${configStore.getConfig.coordsSelector.lng}`"
:constraint="CONSTRAINTS.node.coords"
:validation-error="`Bitte gib die Koordinaten wie folgt an, Beispiel: ${configStore.getConfig.coordsSelector.lat} ${configStore.getConfig.coordsSelector.lng}`"
reset-icon-title="Koodinaten zurücksetzen"
/>
</div>

View file

@ -91,6 +91,7 @@ $validation-form-input-margin: 1em 0;
// Inputs
$input-padding: 0.25em 0.5em;
$input-font-size: 1em;
$input-background-color: $gray-lighter;
$input-text-color: $gray-darkest;
$input-placeholder-color: $gray-darkest;
@ -98,6 +99,9 @@ $input-placeholder-opacity: 0.8;
$input-border-radius: 0.5em;
$input-outline: 0.1em solid $variant-color-info;
$input-outline-offset: 0.125em;
$input-reset-icon-color: $gray-darkest;
$input-reset-icon-position-right: 1em;
$input-with-reset-icon-padding-right: 1.25em;
$checkbox-size: 1.25em;
$checkbox-margin: 0 0.5em 0 0;