mirror of
https://github.com/hay-kot/homebox.git
synced 2024-12-18 13:06:32 +00:00
fix: ui/ux issues (#34)
* fix select first bug for creation * add link to header * fix date and display errors * drop group name requirement
This commit is contained in:
parent
79f7ad40cb
commit
a6e3989aee
13 changed files with 33 additions and 46 deletions
|
@ -23,7 +23,8 @@ tasks:
|
|||
python3 ./scripts/process-types.py ./frontend/lib/api/types/data-contracts.ts
|
||||
sources:
|
||||
- "./backend/app/api/**/*"
|
||||
- "./backend/app/internal/types/**/*"
|
||||
- "./backend/internal/repo/**/*"
|
||||
- "./backend/internal/services/**/*"
|
||||
- "./scripts/process-types.py"
|
||||
generates:
|
||||
- "./frontend/lib/api/types/data-contracts.ts"
|
||||
|
|
|
@ -1531,9 +1531,6 @@ const docTemplate = `{
|
|||
"email": {
|
||||
"type": "string"
|
||||
},
|
||||
"groupName": {
|
||||
"type": "string"
|
||||
},
|
||||
"name": {
|
||||
"type": "string"
|
||||
},
|
||||
|
|
|
@ -1523,9 +1523,6 @@
|
|||
"email": {
|
||||
"type": "string"
|
||||
},
|
||||
"groupName": {
|
||||
"type": "string"
|
||||
},
|
||||
"name": {
|
||||
"type": "string"
|
||||
},
|
||||
|
|
|
@ -322,8 +322,6 @@ definitions:
|
|||
properties:
|
||||
email:
|
||||
type: string
|
||||
groupName:
|
||||
type: string
|
||||
name:
|
||||
type: string
|
||||
password:
|
||||
|
|
|
@ -28,7 +28,6 @@ type (
|
|||
Name string `json:"name"`
|
||||
Email string `json:"email"`
|
||||
Password string `json:"password"`
|
||||
GroupName string `json:"groupName"`
|
||||
}
|
||||
UserAuthTokenDetail struct {
|
||||
Raw string `json:"raw"`
|
||||
|
@ -46,7 +45,6 @@ func (svc *UserService) RegisterUser(ctx context.Context, data UserRegistration)
|
|||
log.Debug().
|
||||
Str("name", data.Name).
|
||||
Str("email", data.Email).
|
||||
Str("groupName", data.GroupName).
|
||||
Str("groupToken", data.GroupToken).
|
||||
Msg("Registering new user")
|
||||
|
||||
|
@ -57,7 +55,7 @@ func (svc *UserService) RegisterUser(ctx context.Context, data UserRegistration)
|
|||
)
|
||||
|
||||
if data.GroupToken == "" {
|
||||
group, err = svc.repos.Groups.GroupCreate(ctx, data.GroupName)
|
||||
group, err = svc.repos.Groups.GroupCreate(ctx, "Home")
|
||||
if err != nil {
|
||||
log.Err(err).Msg("Failed to create group")
|
||||
return repo.UserOut{}, err
|
||||
|
|
|
@ -68,11 +68,13 @@
|
|||
|
||||
<BaseContainer cmp="header" class="py-6 max-w-none">
|
||||
<BaseContainer>
|
||||
<h2 class="mt-1 text-4xl font-bold tracking-tight text-neutral-content sm:text-5xl lg:text-6xl flex">
|
||||
HomeB
|
||||
<AppLogo class="w-12 -mb-4" />
|
||||
x
|
||||
</h2>
|
||||
<NuxtLink to="/home">
|
||||
<h2 class="mt-1 text-4xl font-bold tracking-tight text-neutral-content sm:text-5xl lg:text-6xl flex">
|
||||
HomeB
|
||||
<AppLogo class="w-12 -mb-4" />
|
||||
x
|
||||
</h2>
|
||||
</NuxtLink>
|
||||
<div class="ml-1 mt-2 text-lg text-neutral-content/75 space-x-2">
|
||||
<template v-for="link in links">
|
||||
<NuxtLink
|
||||
|
|
|
@ -37,13 +37,22 @@
|
|||
},
|
||||
});
|
||||
|
||||
const api = useUserApi();
|
||||
const toast = useNotifier();
|
||||
|
||||
const locationsStore = useLocationStore();
|
||||
const locations = computed(() => locationsStore.locations);
|
||||
|
||||
const labelStore = useLabelStore();
|
||||
const labels = computed(() => labelStore.labels);
|
||||
|
||||
const submitBtn = ref(null);
|
||||
|
||||
const modal = useVModel(props, "modelValue");
|
||||
const loading = ref(false);
|
||||
const focused = ref(false);
|
||||
const form = reactive({
|
||||
location: {} as LocationOut,
|
||||
location: locations.value && locations.value.length > 0 ? locations.value[0] : ({} as LocationOut),
|
||||
name: "",
|
||||
description: "",
|
||||
color: "", // Future!
|
||||
|
@ -65,14 +74,6 @@
|
|||
focused.value = true;
|
||||
}
|
||||
);
|
||||
const api = useUserApi();
|
||||
const toast = useNotifier();
|
||||
|
||||
const locationsStore = useLocationStore();
|
||||
const locations = computed(() => locationsStore.locations);
|
||||
|
||||
const labelStore = useLabelStore();
|
||||
const labels = computed(() => labelStore.labels);
|
||||
|
||||
async function create() {
|
||||
if (!form.location) {
|
||||
|
@ -88,7 +89,7 @@
|
|||
|
||||
const { error } = await api.items.create(out);
|
||||
if (error) {
|
||||
toast.error("Couldn't create label");
|
||||
toast.error("Couldn't create item");
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
|
@ -19,7 +19,7 @@
|
|||
return "";
|
||||
}
|
||||
|
||||
if (nullDate(dt)) {
|
||||
if (!validDate(dt)) {
|
||||
return "";
|
||||
}
|
||||
|
||||
|
@ -35,10 +35,6 @@
|
|||
}
|
||||
});
|
||||
|
||||
function nullDate(dt: Date) {
|
||||
return dt.getFullYear() === 1;
|
||||
}
|
||||
|
||||
const props = defineProps({
|
||||
date: {
|
||||
type: [Date, String],
|
||||
|
|
|
@ -8,7 +8,6 @@ function userFactory(): UserRegistration {
|
|||
email: faker.internet.email(),
|
||||
password: faker.internet.password(),
|
||||
name: faker.name.firstName(),
|
||||
groupName: faker.animal.cat(),
|
||||
token: "",
|
||||
};
|
||||
}
|
||||
|
|
|
@ -30,10 +30,10 @@ export async function sharedUserClient(): Promise<UserClient> {
|
|||
return userClient(cache.token);
|
||||
}
|
||||
const testUser = {
|
||||
groupName: "test-group",
|
||||
email: "__test__@__test__.com",
|
||||
name: "__test__",
|
||||
password: "__test__",
|
||||
token: "",
|
||||
};
|
||||
|
||||
const api = client();
|
||||
|
|
|
@ -219,7 +219,6 @@ export interface ServerValidationError {
|
|||
|
||||
export interface UserRegistration {
|
||||
email: string;
|
||||
groupName: string;
|
||||
name: string;
|
||||
password: string;
|
||||
token: string;
|
||||
|
|
|
@ -21,7 +21,6 @@
|
|||
|
||||
const username = ref("");
|
||||
const email = ref("");
|
||||
const groupName = ref("");
|
||||
const password = ref("");
|
||||
const canRegister = ref(false);
|
||||
|
||||
|
@ -50,7 +49,6 @@
|
|||
name: username.value,
|
||||
email: email.value,
|
||||
password: password.value,
|
||||
groupName: groupName.value,
|
||||
token: groupToken.value,
|
||||
});
|
||||
|
||||
|
@ -152,8 +150,7 @@
|
|||
</h2>
|
||||
<FormTextField v-model="email" label="Set your email?" />
|
||||
<FormTextField v-model="username" label="What's your name?" />
|
||||
<FormTextField v-if="groupToken == ''" v-model="groupName" label="Name your group" />
|
||||
<div v-else class="pt-4 pb-1 text-center">
|
||||
<div v-if="!(groupToken == '')" class="pt-4 pb-1 text-center">
|
||||
<p>You're Joining an Existing Group!</p>
|
||||
<button type="button" class="text-xs underline" @click="groupToken = ''">
|
||||
Don't Want To Join a Group?
|
||||
|
|
|
@ -177,14 +177,14 @@
|
|||
if (preferences.value.showEmpty) {
|
||||
return true;
|
||||
}
|
||||
return item.value?.purchaseFrom || item.value?.purchasePrice;
|
||||
return item.value?.purchaseFrom || item.value?.purchasePrice !== "0";
|
||||
});
|
||||
|
||||
const purchaseDetails = computed<(Detail | DateDetail)[]>(() => {
|
||||
const purchaseDetails = computed<Array<Detail | DateDetail>>(() => {
|
||||
return [
|
||||
{
|
||||
name: "Purchase From",
|
||||
label: item.value?.purchaseFrom || "",
|
||||
text: item.value?.purchaseFrom || "",
|
||||
},
|
||||
{
|
||||
name: "Purchase Price",
|
||||
|
@ -193,18 +193,19 @@
|
|||
{
|
||||
name: "Purchase Date",
|
||||
text: item.value.purchaseTime,
|
||||
type: "date",
|
||||
},
|
||||
] as (Detail | DateDetail)[];
|
||||
];
|
||||
});
|
||||
|
||||
const showSold = computed(() => {
|
||||
if (preferences.value.showEmpty) {
|
||||
return true;
|
||||
}
|
||||
return item.value?.soldTo || item.value?.soldPrice;
|
||||
return item.value?.soldTo || item.value?.soldPrice !== "0";
|
||||
});
|
||||
|
||||
const soldDetails = computed<Array<Detail>>(() => {
|
||||
const soldDetails = computed<Array<Detail | DateDetail>>(() => {
|
||||
return [
|
||||
{
|
||||
name: "Sold To",
|
||||
|
@ -217,8 +218,9 @@
|
|||
{
|
||||
name: "Sold At",
|
||||
text: item.value?.soldTime || "",
|
||||
type: "date",
|
||||
},
|
||||
] as Detail[];
|
||||
];
|
||||
});
|
||||
|
||||
const confirm = useConfirm();
|
||||
|
|
Loading…
Reference in a new issue