mirror of
https://github.com/Litlyx/litlyx
synced 2025-12-10 15:58:38 +01:00
adjustments
This commit is contained in:
39
dashboard/composables/Projects.ts
Normal file
39
dashboard/composables/Projects.ts
Normal 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();
|
||||||
|
}
|
||||||
@@ -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();
|
|
||||||
}
|
|
||||||
@@ -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'
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -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">
|
||||||
|
|||||||
@@ -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>
|
|
||||||
@@ -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) {
|
||||||
|
|||||||
@@ -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)"
|
||||||
|
|||||||
Reference in New Issue
Block a user