Convert other components

This commit is contained in:
Jan Bader 2022-02-15 08:20:04 +00:00
parent 452d63c329
commit 5bbd096fc8
4 changed files with 88 additions and 100 deletions

View File

@ -1,11 +1,11 @@
<script lang="ts"> <script lang="ts" setup>
import { defineComponent, PropType } from "vue" import { defineComponent, PropType, ref, watch } from "vue"
import { GET } from "../api"; import { GET } from "../api";
import { useBudgetsStore } from "../stores/budget"; import { useBudgetsStore } from "../stores/budget";
export interface Suggestion { export interface Suggestion {
ID : string ID: string
Name : string Name: string
} }
interface Data { interface Data {
@ -14,88 +14,88 @@ interface Data {
Suggestions: Suggestion[] Suggestions: Suggestion[]
} }
export default defineComponent({ const props = defineProps<{
data() { modelValue: Suggestion,
return { type: String
Selected: undefined, }>();
SearchQuery: this.modelValue || "",
Suggestions: new Array<Suggestion>(),
} as Data
},
props: {
modelValue: Object as PropType<Suggestion>,
type: String
},
watch: {
SearchQuery() {
this.load(this.$data.SearchQuery);
}
},
methods: {
saveTransaction(e : MouseEvent) {
e.preventDefault();
},
load(text : String) {
this.$emit('update:modelValue', {ID: null, Name: text});
if (text == ""){
this.$data.Suggestions = [];
return;
}
const budgetStore = useBudgetsStore(); const Selected = ref<Suggestion | undefined>(props.modelValue || undefined);
GET("/budget/" + budgetStore.CurrentBudgetID + "/autocomplete/" + this.type + "?s=" + text) const SearchQuery = ref(props.modelValue?.Name || "");
.then(x=>x.json()) const Suggestions = ref<Array<Suggestion>>([]);
.then(x => { const emit = defineEmits(["update:modelValue"]);
let suggestions = x || []; watch(SearchQuery, () => {
if(suggestions.length > 10){ load(SearchQuery.value);
suggestions = suggestions.slice(0, 10); });
} function saveTransaction(e: MouseEvent) {
this.$data.Suggestions = suggestions; e.preventDefault();
}); };
}, function load(text: String) {
keypress(e : KeyboardEvent) { emit('update:modelValue', { ID: null, Name: text });
console.log(e.key); if (text == "") {
if(e.key == "Enter") { Suggestions.value = [];
const selected = this.$data.Suggestions[0]; return;
this.selectElement(selected);
const el = (<HTMLInputElement>e.target);
const inputElements = Array.from(el.ownerDocument.querySelectorAll('input:not([disabled]):not([readonly])'));
const currentIndex = inputElements.indexOf(el);
const nextElement = inputElements[currentIndex < inputElements.length - 1 ? currentIndex + 1 : 0];
(<HTMLInputElement>nextElement).focus();
}
},
selectElement(element : Suggestion) {
this.$data.Selected = element;
this.$data.Suggestions = [];
this.$emit('update:modelValue', element);
},
select(e : MouseEvent) {
const target = (<HTMLInputElement>e.target);
const valueAttribute = target.attributes.getNamedItem("value");
let selectedID = "";
if(valueAttribute != null)
selectedID = valueAttribute.value;
const selected = this.$data.Suggestions.filter(x => x.ID == selectedID)[0];
this.selectElement(selected);
},
clear() {
this.$data.Selected = undefined;
this.$emit('update:modelValue', {ID: null, Name: this.$data.SearchQuery});
}
} }
})
const budgetStore = useBudgetsStore();
GET("/budget/" + budgetStore.CurrentBudgetID + "/autocomplete/" + props.type + "?s=" + text)
.then(x => x.json())
.then(x => {
let suggestions = x || [];
if (suggestions.length > 10) {
suggestions = suggestions.slice(0, 10);
}
Suggestions.value = suggestions;
});
};
function keypress(e: KeyboardEvent) {
console.log(e.key);
if (e.key == "Enter") {
const selected = Suggestions.value[0];
selectElement(selected);
const el = (<HTMLInputElement>e.target);
const inputElements = Array.from(el.ownerDocument.querySelectorAll('input:not([disabled]):not([readonly])'));
const currentIndex = inputElements.indexOf(el);
const nextElement = inputElements[currentIndex < inputElements.length - 1 ? currentIndex + 1 : 0];
(<HTMLInputElement>nextElement).focus();
}
};
function selectElement(element: Suggestion) {
Selected.value = element;
Suggestions.value = [];
emit('update:modelValue', element);
};
function select(e: MouseEvent) {
const target = (<HTMLInputElement>e.target);
const valueAttribute = target.attributes.getNamedItem("value");
let selectedID = "";
if (valueAttribute != null)
selectedID = valueAttribute.value;
const selected = Suggestions.value.filter(x => x.ID == selectedID)[0];
selectElement(selected);
};
function clear() {
Selected.value = undefined;
emit('update:modelValue', { ID: null, Name: SearchQuery.value });
};
</script> </script>
<template> <template>
<div> <div>
<input class="border-b-2 border-black" @keypress="keypress" v-if="Selected == undefined" v-model="SearchQuery" /> <input
<span @click="clear" v-if="Selected != undefined" class="bg-gray-300">{{Selected.Name}}</span> class="border-b-2 border-black"
@keypress="keypress"
v-if="Selected == undefined"
v-model="SearchQuery"
/>
<span @click="clear" v-if="Selected != undefined" class="bg-gray-300">{{ Selected.Name }}</span>
<div v-if="Suggestions.length > 0" class="absolute bg-gray-400 w-64 p-2"> <div v-if="Suggestions.length > 0" class="absolute bg-gray-400 w-64 p-2">
<span v-for="suggestion in Suggestions" class="block" @click="select" :value="suggestion.ID"> <span
{{suggestion.Name}} v-for="suggestion in Suggestions"
</span> class="block"
@click="select"
:value="suggestion.ID"
>{{ suggestion.Name }}</span>
</div> </div>
</div> </div>
</template> </template>

View File

@ -1,9 +1,4 @@
<script lang="ts"> <script lang="ts" setup>
import { defineComponent } from "vue";
export default defineComponent({
})
</script> </script>
<template> <template>

View File

@ -1,19 +1,13 @@
<script lang="ts"> <script lang="ts" setup>
import { defineComponent } from "vue"; import { computed } from 'vue';
export default defineComponent({ const props = defineProps<{ value: number }>();
props: ["value"],
computed: {
formattedValue() {
return Number(this.value).toLocaleString(undefined, {
minimumFractionDigits: 2,
});
}
}
})
const formattedValue = computed(() => Number(props.value).toLocaleString(undefined, {
minimumFractionDigits: 2,
}));
</script> </script>
<template> <template>
<span class="text-right" :class="value < 0 ? 'negative' : ''">{{formattedValue}} </span> <span class="text-right" :class="value < 0 ? 'negative' : ''">{{ formattedValue }} </span>
</template> </template>

View File

@ -1,6 +1,5 @@
<script lang="ts" setup> <script lang="ts" setup>
import { mapState } from "pinia"; import { computed } from "vue";
import { computed, defineComponent } from "vue";
import { useBudgetsStore } from "../stores/budget"; import { useBudgetsStore } from "../stores/budget";
import { Transaction } from "../stores/budget-account"; import { Transaction } from "../stores/budget-account";
import Currency from "./Currency.vue"; import Currency from "./Currency.vue";