(e.target as HTMLElement).classList.add('is-selected')" @mouseleave="(e) => (e.target as HTMLElement).classList.remove('is-selected')" @mousedown.prevent="navigateTo('/explorer' + result._path); input = ''">
-
-
-
- {{ result.title.substring(0, clear(result.title).indexOf(clear(input))) }}{{ result.title.substring(clear(result.title).indexOf(clear(input)), clear(result.title).indexOf(clear(input)) + clear(input).length + 1) }}{{ result.title.substring(clear(result.title).indexOf(clear(input)) + clear(input).length + 1) }}
-
+
+
+
+
+ (e.target as HTMLElement).classList.add('is-selected')"
+ @mouseleave="(e) => (e.target as HTMLElement).classList.remove('is-selected')"
+ @mousedown.prevent="navigateTo(`/explorer/${result.id}${result.home}`); input = ''">
+
-
-
- Aucun résultat
-
+ (e.target as HTMLElement).classList.add('is-selected')"
+ @mouseleave="(e) => (e.target as HTMLElement).classList.remove('is-selected')"
+ @mousedown.prevent="navigateTo(`/explorer/${result.project}${result.path}`); input = ''">
+
+
+ (e.target as HTMLElement).classList.add('is-selected')"
+ @mouseleave="(e) => (e.target as HTMLElement).classList.remove('is-selected')"
+ @mousedown.prevent="navigateTo(`/user/${result.id}`); input = ''">
+
+
+
+ Aucun résultat
+
+
\ No newline at end of file
diff --git a/components/canvas/CanvasNode.vue b/components/canvas/CanvasNode.vue
index caf5116..cca85d3 100644
--- a/components/canvas/CanvasNode.vue
+++ b/components/canvas/CanvasNode.vue
@@ -36,14 +36,14 @@ if(props.node.color !== undefined)
-
+
-
+
-
+
@@ -61,6 +61,6 @@ if(props.node.color !== undefined)
- {{ props.node.label }}
+ {{ node.label }}
\ No newline at end of file
diff --git a/components/canvas/CanvasRenderer.client.vue b/components/canvas/CanvasRenderer.client.vue
index 275f600..f0fc890 100644
--- a/components/canvas/CanvasRenderer.client.vue
+++ b/components/canvas/CanvasRenderer.client.vue
@@ -1,11 +1,11 @@
-
-
- showPreview(e, true)" @mouseleave="hidePreview" v-bind="$attrs"
- :href="stringifyParsedURL({ host: '/explorer', pathname: (content?._path ?? href) + (isTag && anchor ? '/' + anchor.substring(1) : ''), hash: !isTag ? anchor : '', search: '' })"
- :target="target">
-
-
-
- showPreview(e, false)"
- @mouseleave="hidePreview">
-
-
-
-
-
-
{{ content?.title }}
-
-
-
-
-
-
-
-
-
-
-
-
Impossible de prévisualiser
-
Cliquez sur le lien pour accéder au contenu
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
+interface Prop
+{
+ href?: string;
+ class?: string;
+ project?: number;
+}
+const props = defineProps
();
+const path = ref(props.href), external = ref(false), hovered = ref(false), pos = ref();
+let timeout: NodeJS.Timeout;
+
+if (parseURL(props.href).protocol !== undefined)
+{
+ external.value = true;
+}
+
+let id = ref(props.project);
+if(id.value === undefined)
+{
+ id = useProject().id;
+}
+
+const { data: page, status, error, execute } = await useLazyFetch(`/api/project/${id.value}/file`, {
+ query: {
+ search: "%" + parseURL(props.href).pathname,
+ }
+});
+
+if(external.value)
+{
+ execute();
+}
+
+if (page.value && page.value[0])
+{
+ path.value = `/explorer/${id.value}${page.value[0].path}`;
+}
+
\ No newline at end of file
diff --git a/components/explorer/NavigationLink.vue b/components/explorer/NavigationLink.vue
index e6967cc..80fb1eb 100644
--- a/components/explorer/NavigationLink.vue
+++ b/components/explorer/NavigationLink.vue
@@ -35,7 +35,9 @@ function hideLeftPanel(_: Event)
-
+
-
+
-
+
{{ link.title }}
diff --git a/components/explorer/RightComponent.vue b/components/explorer/RightComponent.vue
index 8cfff10..c3682bb 100644
--- a/components/explorer/RightComponent.vue
+++ b/components/explorer/RightComponent.vue
@@ -1,11 +1,9 @@
diff --git a/composables/useProject.ts b/composables/useProject.ts
new file mode 100644
index 0000000..305e356
--- /dev/null
+++ b/composables/useProject.ts
@@ -0,0 +1,37 @@
+import type { Project } from "~/server/api/project.get";
+
+export default function useProject()
+{
+ const id = useState("projectId", () => 1);
+ const name = useState("projectName", undefined);
+ const owner = useState("projectOwner", undefined);
+ const home = useState("projectHomepage", () => null);
+
+ return {
+ id, name, owner, home, get, set
+ }
+}
+
+async function get(): Promise {
+ const id = useState("projectId");
+
+ if (!id.value)
+ return;
+
+ try {
+ const result = await $fetch(`/api/project/${id}`) as Project;
+
+ const name = useState("projectName");
+ const owner = useState("projectOwner");
+ const home = useState("projectHomepage");
+
+ name.value = result.name;
+ owner.value = result.owner;
+ home.value = result.home;
+ } catch(e) {}
+}
+function set(id: number): void {
+ const _id = useState("projectId");
+
+ _id.value = id;
+}
\ No newline at end of file
diff --git a/pages/explorer/[projectId]/[...slug].vue b/pages/explorer/[projectId]/[...slug].vue
index f780787..ca2aad3 100644
--- a/pages/explorer/[projectId]/[...slug].vue
+++ b/pages/explorer/[projectId]/[...slug].vue
@@ -1,15 +1,17 @@
+
+ {{ content[0].title }}
+
@@ -23,7 +25,7 @@ const { data: content } = await useFetch(`/api/project/${route.params.projectId}
-
+
diff --git a/pages/third-party.vue b/pages/third-party.vue
index faa72dd..97a06d3 100644
--- a/pages/third-party.vue
+++ b/pages/third-party.vue
@@ -18,7 +18,7 @@ Le logo a été créé grâce aux icones de [Game Icons](https://game-icons.net)
diff --git a/server/api/project.get.ts b/server/api/project.get.ts
index 4a044fc..675126d 100644
--- a/server/api/project.get.ts
+++ b/server/api/project.get.ts
@@ -1,12 +1,5 @@
import useDatabase from '~/composables/useDatabase';
-export interface Project
-{
- id: number;
- title: string;
- owner: number;
- homepage: number;
-}
export default defineEventHandler(async (e) => {
const query = getQuery(e);
diff --git a/server/api/project/[projectId].get.ts b/server/api/project/[projectId].get.ts
new file mode 100644
index 0000000..66c8da7
--- /dev/null
+++ b/server/api/project/[projectId].get.ts
@@ -0,0 +1,20 @@
+import useDatabase from '~/composables/useDatabase';
+
+export default defineEventHandler(async (e) => {
+ const project = getRouterParam(e, "projectId");
+
+ const where = ["project = $project"];
+ const criteria: Record
= { $project: project };
+
+ if (!!project) {
+ const db = useDatabase();
+
+ const content = db.query(`SELECT * FROM explorer_projects WHERE ${where.join(" and ")}`).get(criteria) as Project;
+
+ if (content) {
+ return content;
+ }
+ }
+
+ setResponseStatus(e, 404);
+});
\ No newline at end of file
diff --git a/server/api/project/[projectId].patch.ts b/server/api/project/[projectId].patch.ts
new file mode 100644
index 0000000..82694f5
--- /dev/null
+++ b/server/api/project/[projectId].patch.ts
@@ -0,0 +1,20 @@
+import useDatabase from '~/composables/useDatabase';
+
+export default defineEventHandler(async (e) => {
+ const project = getRouterParam(e, "projectId");
+
+ const where = ["project = $project"];
+ const criteria: Record = { $project: project };
+
+ if (!!project) {
+ const db = useDatabase();
+
+ const content = db.query(`SELECT * FROM explorer_projects WHERE ${where.join(" and ")}`).all(criteria) as Project[];
+
+ if (content.length > 0) {
+ return content;
+ }
+ }
+
+ setResponseStatus(e, 404);
+});
\ No newline at end of file
diff --git a/server/api/project/[projectId].post.ts b/server/api/project/[projectId].post.ts
new file mode 100644
index 0000000..82694f5
--- /dev/null
+++ b/server/api/project/[projectId].post.ts
@@ -0,0 +1,20 @@
+import useDatabase from '~/composables/useDatabase';
+
+export default defineEventHandler(async (e) => {
+ const project = getRouterParam(e, "projectId");
+
+ const where = ["project = $project"];
+ const criteria: Record = { $project: project };
+
+ if (!!project) {
+ const db = useDatabase();
+
+ const content = db.query(`SELECT * FROM explorer_projects WHERE ${where.join(" and ")}`).all(criteria) as Project[];
+
+ if (content.length > 0) {
+ return content;
+ }
+ }
+
+ setResponseStatus(e, 404);
+});
\ No newline at end of file
diff --git a/server/api/project/[projectId]/file/[fileId]/access.post.ts b/server/api/project/[projectId]/access.post.ts
similarity index 100%
rename from server/api/project/[projectId]/file/[fileId]/access.post.ts
rename to server/api/project/[projectId]/access.post.ts
diff --git a/server/api/project/[projectId]/file/[fileId]/comment.get.ts b/server/api/project/[projectId]/comment.get.ts
similarity index 69%
rename from server/api/project/[projectId]/file/[fileId]/comment.get.ts
rename to server/api/project/[projectId]/comment.get.ts
index 486b52c..935e3a1 100644
--- a/server/api/project/[projectId]/file/[fileId]/comment.get.ts
+++ b/server/api/project/[projectId]/comment.get.ts
@@ -1,27 +1,17 @@
import useDatabase from '~/composables/useDatabase';
-export interface Comment
-{
- file: number;
- user_id: number;
- sequence: number;
- position: number;
- length: number;
- content: string;
-}
export default defineEventHandler(async (e) => {
const project = getRouterParam(e, "projectId");
- const file = getRouterParam(e, "fileId");
const query = getQuery(e);
- if(!project)
+ if(!project || !query.path)
{
setResponseStatus(e, 404);
return;
}
- const where = ["project = $project", "file = $file"];
- const criteria: Record = { $project: project, $file: file };
+ const where = ["project = $project", "path = $path"];
+ const criteria: Record = { $project: project, $path: query.path };
if(where.length > 1)
{
diff --git a/server/api/project/[projectId]/file/[fileId]/comment.post.ts b/server/api/project/[projectId]/comment.post.ts
similarity index 100%
rename from server/api/project/[projectId]/file/[fileId]/comment.post.ts
rename to server/api/project/[projectId]/comment.post.ts
diff --git a/server/api/project/[projectId]/file.get.ts b/server/api/project/[projectId]/file.get.ts
index 830b678..b02eefb 100644
--- a/server/api/project/[projectId]/file.get.ts
+++ b/server/api/project/[projectId]/file.get.ts
@@ -1,14 +1,5 @@
import useDatabase from '~/composables/useDatabase';
-export interface File
-{
- id: number;
- path: string;
- title: string;
- type: 'Markdown' | 'Canvas' | 'File';
- content: string;
- owner: number;
-}
export default defineEventHandler(async (e) => {
const project = getRouterParam(e, "projectId");
const query = getQuery(e);
@@ -37,6 +28,11 @@ export default defineEventHandler(async (e) => {
where.push("type = $type");
criteria["$type"] = query.type;
}
+ if (query && query.search !== undefined)
+ {
+ where.push("path LIKE $search");
+ criteria["$search"] = query.search;
+ }
if(where.length > 1)
{
diff --git a/server/api/project/[projectId]/navigation.get.ts b/server/api/project/[projectId]/navigation.get.ts
index 4310f91..e6153bf 100644
--- a/server/api/project/[projectId]/navigation.get.ts
+++ b/server/api/project/[projectId]/navigation.get.ts
@@ -1,13 +1,5 @@
import useDatabase from '~/composables/useDatabase';
-export interface Navigation
-{
- title: string;
- path: string;
- type: string;
- order: number
- children?: Navigation[];
-}
export default defineEventHandler(async (e) => {
const project = getRouterParam(e, "projectId");
@@ -19,7 +11,7 @@ export default defineEventHandler(async (e) => {
const db = useDatabase();
- const content = db.query(`SELECT "path", "title", "type", "order" FROM explorer_files WHERE project = ?1 and navigable = 1`).all(project!).sort((a: any, b: any) => a.path.length - b.path.length) as any[];
+ const content = db.query(`SELECT "path", "title", "type", "order" FROM explorer_files WHERE project = ?1 and navigable = 1 and private = 0`).all(project!).sort((a: any, b: any) => a.path.length - b.path.length) as any[];
if(content.length > 0)
{
diff --git a/server/api/search.get.ts b/server/api/search.get.ts
new file mode 100644
index 0000000..2757c2c
--- /dev/null
+++ b/server/api/search.get.ts
@@ -0,0 +1,21 @@
+import useDatabase from '~/composables/useDatabase';
+
+export default defineEventHandler(async (e) => {
+ const query = getQuery(e);
+
+ if (query.search) {
+ const db = useDatabase();
+
+ const projects = db.query(`SELECT * FROM explorer_projects WHERE name LIKE ?1`).all(query.search) as Project[];
+ const files = db.query(`SELECT * FROM explorer_files WHERE title LIKE ?1 `).all(query.search) as File[];
+ const users = db.query(`SELECT id, username FROM users WHERE username LIKE ?1 `).all(query.search) as User[];
+
+ return {
+ projects,
+ files,
+ users
+ } as Search;
+ }
+
+ setResponseStatus(e, 404);
+});
\ No newline at end of file
diff --git a/types/api.ts b/types/api.ts
new file mode 100644
index 0000000..0370b1d
--- /dev/null
+++ b/types/api.ts
@@ -0,0 +1,39 @@
+export interface Project {
+ id: number;
+ name: string;
+ owner: number;
+ home: string;
+}
+export interface Navigation {
+ title: string;
+ path: string;
+ type: string;
+ order: number
+ children?: Navigation[];
+}
+export interface File {
+ id: number;
+ project: number;
+ path: string;
+ title: string;
+ type: 'Markdown' | 'Canvas' | 'File' | 'Folder';
+ content: string;
+ owner: number;
+}
+export interface Comment {
+ file: number;
+ user_id: number;
+ sequence: number;
+ position: number;
+ length: number;
+ content: string;
+}
+export interface User {
+ id: number;
+ username: string;
+}
+export interface Search {
+ projects: Project[];
+ files: File[];
+ users: User[];
+}
\ No newline at end of file
diff --git a/types/canvas.ts b/types/canvas.ts
index 88b57a8..9a448ca 100644
--- a/types/canvas.ts
+++ b/types/canvas.ts
@@ -1,8 +1,3 @@
-export interface Canvas {
- _id: string;
- _type: string;
- body: CanvasContent
-}
export interface CanvasContent {
nodes: CanvasNode[];
edges: CanvasEdge[];