use group settings for format currency

This commit is contained in:
Hayden 2022-10-15 12:07:40 -08:00
parent 01dd5db2ee
commit e0116417f7
10 changed files with 82 additions and 23 deletions

View file

@ -41,6 +41,7 @@ func (ctrl *V1Controller) HandleGroupGet() http.HandlerFunc {
server.RespondError(w, http.StatusInternalServerError, err) server.RespondError(w, http.StatusInternalServerError, err)
return return
} }
group.Currency = strings.ToUpper(group.Currency) // TODO: Hack to fix the currency enums being lower caseÍ
server.Respond(w, http.StatusOK, group) server.Respond(w, http.StatusOK, group)

View file

@ -0,0 +1,22 @@
<template>
{{ value }}
</template>
<script setup lang="ts">
const props = defineProps({
amount: {
type: String,
required: true,
},
});
const fmt = await useFormatCurrency();
const value = computed(() => {
if (!props.amount || props.amount === "0") {
return "";
}
return fmt(props.amount);
});
</script>

View file

@ -7,9 +7,8 @@
</dt> </dt>
<dd class="mt-1 text-sm text-base-content sm:col-span-2 sm:mt-0"> <dd class="mt-1 text-sm text-base-content sm:col-span-2 sm:mt-0">
<slot :name="detail.slot || detail.name" v-bind="{ detail }"> <slot :name="detail.slot || detail.name" v-bind="{ detail }">
<template v-if="detail.type == 'date'"> <DateTime v-if="detail.type == 'date'" :date="detail.text" />
<DateTime :date="detail.text" /> <Currency v-else-if="detail.type == 'currency'" :amount="detail.text" />
</template>
<template v-else> <template v-else>
{{ detail.text }} {{ detail.text }}
</template> </template>
@ -21,11 +20,11 @@
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import type { DateDetail, Detail } from "./types"; import type { CustomDetail, Detail } from "./types";
defineProps({ defineProps({
details: { details: {
type: Object as () => (Detail | DateDetail)[], type: Object as () => (Detail | CustomDetail)[],
required: true, required: true,
}, },
}); });

View file

@ -1,15 +1,25 @@
export type StringLike = string | number | boolean; export type StringLike = string | number | boolean;
export type DateDetail = { type BaseDetail = {
name: string; name: string;
text: string | Date;
slot?: string; slot?: string;
type: "date";
}; };
export type Detail = { type DateDetail = BaseDetail & {
name: string; type: "date";
text: Date | string;
};
type CurrencyDetail = BaseDetail & {
type: "currency";
text: string;
};
export type CustomDetail = DateDetail | CurrencyDetail;
export type Detail = BaseDetail & {
text: StringLike; text: StringLike;
slot?: string;
type?: "text"; type?: "text";
}; };
export type Details = Array<Detail | CustomDetail>;

View file

@ -0,0 +1,21 @@
const cache = {
currency: "",
};
export function ResetCurrency() {
cache.currency = "";
}
export async function useFormatCurrency() {
if (!cache.currency) {
const client = useUserApi();
const { data: group } = await client.group.get();
if (group) {
cache.currency = group.currency;
}
}
return (value: number | string) => fmtCurrency(value, cache.currency);
}

View file

@ -1,5 +1,7 @@
export type Codes = "USD" | "EUR" | "GBP" | "JPY";
export type Currency = { export type Currency = {
code: string; code: Codes;
local: string; local: string;
symbol: string; symbol: string;
name: string; name: string;

View file

@ -1,5 +1,5 @@
<script setup lang="ts"> <script setup lang="ts">
import { DateDetail, Detail } from "~~/components/global/DetailsSection/types"; import { Detail, Details } from "~~/components/global/DetailsSection/types";
import { ItemAttachment } from "~~/lib/api/types/data-contracts"; import { ItemAttachment } from "~~/lib/api/types/data-contracts";
definePageMeta({ definePageMeta({
@ -145,7 +145,7 @@
}); });
const warrantyDetails = computed(() => { const warrantyDetails = computed(() => {
const details: (Detail | DateDetail)[] = [ const details: Details = [
{ {
name: "Lifetime Warranty", name: "Lifetime Warranty",
text: item.value?.lifetimeWarranty ? "Yes" : "No", text: item.value?.lifetimeWarranty ? "Yes" : "No",
@ -180,7 +180,7 @@
return item.value?.purchaseFrom || item.value?.purchasePrice !== "0"; return item.value?.purchaseFrom || item.value?.purchasePrice !== "0";
}); });
const purchaseDetails = computed<Array<Detail | DateDetail>>(() => { const purchaseDetails = computed<Details>(() => {
return [ return [
{ {
name: "Purchase From", name: "Purchase From",
@ -188,7 +188,8 @@
}, },
{ {
name: "Purchase Price", name: "Purchase Price",
text: item.value?.purchasePrice ? fmtCurrency(item.value.purchasePrice) : "", text: item.value?.purchasePrice || "",
type: "currency",
}, },
{ {
name: "Purchase Date", name: "Purchase Date",
@ -205,7 +206,7 @@
return item.value?.soldTo || item.value?.soldPrice !== "0"; return item.value?.soldTo || item.value?.soldPrice !== "0";
}); });
const soldDetails = computed<Array<Detail | DateDetail>>(() => { const soldDetails = computed<Details>(() => {
return [ return [
{ {
name: "Sold To", name: "Sold To",
@ -213,7 +214,8 @@
}, },
{ {
name: "Sold Price", name: "Sold Price",
text: item.value?.soldPrice ? fmtCurrency(item.value.soldPrice) : "", text: item.value?.soldPrice || "",
type: "currency",
}, },
{ {
name: "Sold At", name: "Sold At",

View file

@ -1,5 +1,5 @@
<script setup lang="ts"> <script setup lang="ts">
import type { DateDetail, Detail } from "~~/components/global/DetailsSection/types"; import type { CustomDetail, Detail } from "~~/components/global/DetailsSection/types";
definePageMeta({ definePageMeta({
middleware: ["auth"], middleware: ["auth"],
@ -23,7 +23,7 @@
return data; return data;
}); });
const details = computed<(Detail | DateDetail)[]>(() => { const details = computed<(Detail | CustomDetail)[]>(() => {
const details = [ const details = [
{ {
name: "Name", name: "Name",

View file

@ -1,5 +1,5 @@
<script setup lang="ts"> <script setup lang="ts">
import { Detail, DateDetail } from "~~/components/global/DetailsSection/types"; import { Detail, CustomDetail } from "~~/components/global/DetailsSection/types";
definePageMeta({ definePageMeta({
middleware: ["auth"], middleware: ["auth"],
@ -23,7 +23,7 @@
return data; return data;
}); });
const details = computed<(Detail | DateDetail)[]>(() => { const details = computed<(Detail | CustomDetail)[]>(() => {
const details = [ const details = [
{ {
name: "Name", name: "Name",

View file

@ -219,7 +219,9 @@
<BaseSectionHeader class="pb-0"> <BaseSectionHeader class="pb-0">
<Icon name="mdi-accounts" class="mr-2 -mt-1 text-base-600" /> <Icon name="mdi-accounts" class="mr-2 -mt-1 text-base-600" />
<span class="text-base-600"> Group Settings </span> <span class="text-base-600"> Group Settings </span>
<template #description> Shared Group Settings </template> <template #description>
Shared Group Settings. You may need to refresh your browser for some settings to apply.
</template>
</BaseSectionHeader> </BaseSectionHeader>
</template> </template>