adjustments

This commit is contained in:
Emily
2024-06-03 02:14:57 +02:00
parent 2ff3cd134f
commit 65ecbaa550
7 changed files with 55 additions and 147 deletions

View File

@@ -0,0 +1,39 @@
import type { TProject } from "@schema/ProjectSchema";
const projects = useFetch<TProject[]>('/api/project/list', {
key: 'projectslist', ...signHeaders()
});
export function useProjectsList() {
return { ...projects, projects: projects.data }
}
const activeProjectId = useFetch<string>(`/api/user/active_project`, {
key: 'activeProjectId', ...signHeaders(),
});
export function useActiveProjectId() {
return { ...activeProjectId, pid: activeProjectId.data }
}
export function useActiveProject() {
if (isLiveDemo()) {
const { data: liveDemoProject } = useLiveDemo();
return liveDemoProject;
}
return computed(() => {
if (!projects.data.value) return;
if (!activeProjectId.data.value) return;
const target = projects.data.value.find(e => e._id.toString() == activeProjectId.data.value);
return target;
});
}
export async function setActiveProject(project_id: string) {
await $fetch<string>(`/api/user/set_active_project?project_id=${project_id}`, signHeaders());
await activeProjectId.refresh();
}

View File

@@ -1,28 +0,0 @@
import type { TProject } from "@schema/ProjectSchema";
const projects = useFetch<TProject[]>('/api/project/list', { key: 'projectslist', ...signHeaders() });
export function useProjectsList() { return projects; }
const activeProjectId = useFetch<string>(`/api/user/active_project`, { key: 'activeProjectId', ...signHeaders() });
export function useActiveProjectId() { return activeProjectId; }
export function useActiveProject() {
if (isLiveDemo()) {
const { data: liveDemoProject } = useLiveDemo();
return liveDemoProject;
}
const { data: projects } = useProjectsList();
const { data: activeProjectId } = useActiveProjectId();
return computed(() => {
if (!projects.value) return;
if (!activeProjectId.value) return;
return projects.value.find(e => e._id.toString() == activeProjectId.value);
});
}
export async function setActiveProject(project_id: string) {
await $fetch<string>(`/api/user/set_active_project?project_id=${project_id}`, signHeaders());
activeProjectId.refresh();
}

View File

@@ -14,7 +14,7 @@ const columns = [
{ key: 'created_at', label: 'Creation', sortable: true } { key: 'created_at', label: 'Creation', sortable: true }
] ]
const sort = ref({ const sort = ref<any>({
column: 'created_at', column: 'created_at',
direction: 'desc' direction: 'desc'
}) })

View File

@@ -19,7 +19,7 @@ const columns = [
{ key: 'created_at', label: 'Date', sortable: true } { key: 'created_at', label: 'Date', sortable: true }
] ]
const sort = ref({ const sort = ref<any>({
column: 'created_at', column: 'created_at',
direction: 'desc' direction: 'desc'
}) })
@@ -67,8 +67,7 @@ onMounted(async () => {
th: { color: 'text-text-sub' }, th: { color: 'text-text-sub' },
tbody: 'divide-y divide-gray-300/20', tbody: 'divide-y divide-gray-300/20',
divide: '', divide: '',
}" v-model:sort="sort" :columns="selectedColumns" :rows="tableData" :loading="loadingData" sort-mode="manual" }" v-model:sort="sort" :columns="selectedColumns" :rows="tableData" :loading="loadingData" sort-mode="manual">
:sortButton="{ color: '#000000' }">
<template #metadata-data="{ row }"> <template #metadata-data="{ row }">
<div v-if="row.metadata" class="flex flex-col gap-1"> <div v-if="row.metadata" class="flex flex-col gap-1">

View File

@@ -1,102 +0,0 @@
<script lang="ts" setup>
definePageMeta({ layout: 'dashboard' });
const selectLabels = [
{ label: 'Day', value: 'day' },
{ label: 'Month', value: 'month' },
];
const activeProject = useActiveProject();
// const { data: names } = useFetch(`/api/metrics/${activeProject.value?._id.toString()}/events/names`, signHeaders());
const eventsStackedSelectIndex = ref<number>(0);
const text = ref<string>("");
const response = ref<string>("");
const loading = ref<boolean>(false);
async function ask() {
if (loading.value) return;
if (!activeProject.value) return;
loading.value = true;
response.value = '';
const res = await $fetch(`/api/ai/${activeProject.value._id.toString()}/ask`, {
method: 'POST',
body: JSON.stringify({ text: text.value }),
...signHeaders({ 'Content-Type': 'application/json' })
});
text.value = '';
loading.value = false;
response.value = res || 'NO_RESPONSE';
}
const { isAdmin } = useUserRoles();
</script>
<template>
<div class="w-full h-full p-6">
<CardTitled class="p-4 flex-1" title="Events" sub="Events stacked bar chart.">
<template #header>
<SelectButton @changeIndex="eventsStackedSelectIndex = $event" :currentIndex="eventsStackedSelectIndex"
:options="selectLabels">
</SelectButton>
</template>
<div>
<EventsStackedBarChart :slice="(selectLabels[eventsStackedSelectIndex].value as any)">
</EventsStackedBarChart>
</div>
</CardTitled>
<div class="p-4 text-[1.3rem] flex flex-col gap-4" v-if="isAdmin">
<div class="flex gap-8">
<input class="w-full p-4 px-8 poppins rounded-full" type="text" v-model="text">
<div class="bg-menu py-2 px-10 flex items-center rounded-lg cursor-pointer hover:bg-menu/80"
@click="ask()">
{{ loading ? 'Loading' : 'Send' }}
</div>
</div>
<div v-if="response">
{{ response }}
</div>
</div>
<!--
<div>
<br>
<br>
<div> Event names:</div>
<br>
<div v-for="name of names">
{{ name }}
</div>
</div> -->
<!-- <div class="flex w-full gap-6 flex-col xl:flex-row">
<div class="flex-1">
<div class="bg-menu p-6 rounded-xl flex flex-col gap-6">
<div class="poppins font-semibold text-[1.1rem]">
Manage your events
</div>
<div class="w-full">
<DashboardEventsColorManager></DashboardEventsColorManager>
</div>
</div>
</div>
<div class="flex-1">
<DashboardEventsBarCard></DashboardEventsBarCard>
</div>
</div> -->
</div>
</template>

View File

@@ -1,6 +1,5 @@
<script setup lang="ts"> <script setup lang="ts">
definePageMeta({ layout: 'dashboard' }); definePageMeta({ layout: 'dashboard' });
const projectName = ref<string>(""); const projectName = ref<string>("");
@@ -8,7 +7,7 @@ const creating = ref<boolean>(false);
const router = useRouter(); const router = useRouter();
const { data: projects, refresh: refreshProjects } = useProjectsList(); const { projects, refresh } = useProjectsList();
const isFirstProject = computed(() => { return projects.value?.length == 0; }) const isFirstProject = computed(() => { return projects.value?.length == 0; })
@@ -37,7 +36,7 @@ async function createProject() {
body: JSON.stringify({ name: projectName.value }) body: JSON.stringify({ name: projectName.value })
}); });
await refreshProjects(); await refresh();
const newActiveProjectId = projects.value?.[projects.value?.length - 1]._id.toString(); const newActiveProjectId = projects.value?.[projects.value?.length - 1]._id.toString();
if (newActiveProjectId) { if (newActiveProjectId) {
@@ -45,9 +44,6 @@ async function createProject() {
} }
await refreshProjects();
router.push('/'); router.push('/');
} catch (ex: any) { } catch (ex: any) {

View File

@@ -2,26 +2,30 @@
definePageMeta({ layout: 'dashboard' }); definePageMeta({ layout: 'dashboard' });
const { data: projects, refresh } = useProjectsList(); const { projects, refresh } = useProjectsList();
const activeProject = useActiveProject(); const { pid } = useActiveProjectId();
async function deleteProject(projectId: string, projectName: string) { async function deleteProject(projectId: string, projectName: string) {
const sure = confirm(`Are you sure to delete the project ${projectName} ?`); const sure = confirm(`Are you sure to delete the project ${projectName} ?`);
if (!sure) return; if (!sure) return;
try { try {
await $fetch('/api/project/delete', { await $fetch('/api/project/delete', {
method: 'DELETE', method: 'DELETE',
...signHeaders({ 'Content-Type': 'application/json' }), ...signHeaders({ 'Content-Type': 'application/json' }),
body: JSON.stringify({ project_id: projectId }) body: JSON.stringify({ project_id: projectId })
}); });
if (activeProject.value?._id.toString() == projectId) {
await refresh();
if (pid.value == projectId) {
const firstProjectId = projects.value?.[0]?._id.toString(); const firstProjectId = projects.value?.[0]?._id.toString();
if (firstProjectId) { if (firstProjectId) {
await setActiveProject(firstProjectId); await setActiveProject(firstProjectId);
} }
} }
await refresh();
} catch (ex: any) { } catch (ex: any) {
alert(ex.message); alert(ex.message);
} }
@@ -59,12 +63,12 @@ async function deleteProject(projectId: string, projectName: string) {
Create your first project... Create your first project...
</div> </div>
<div class="flex gap-12 flex-wrap" v-if="activeProject"> <div class="flex gap-12 flex-wrap" v-if="pid">
<div v-for="e of projects"> <div v-for="e of projects">
<DashboardProjectSelectionCard @click="setActiveProject(e._id.toString())" <DashboardProjectSelectionCard @click="setActiveProject(e._id.toString())"
:active="activeProject._id == e._id" :title="e.name" :active="pid == e._id.toString()" :title="e.name"
:subtitle="activeProject._id == e._id ? 'ATTIVO' : ''" :subtitle="pid == e._id.toString() ? 'ATTIVO' : ''"
:chip="e.premium ? 'PREMIUM PLAN' : 'FREE PLAN'"> :chip="e.premium ? 'PREMIUM PLAN' : 'FREE PLAN'">
</DashboardProjectSelectionCard> </DashboardProjectSelectionCard>
<div @click="deleteProject(e._id.toString(), e.name)" <div @click="deleteProject(e._id.toString(), e.name)"