diff --git a/app/controllers/projects_controller.ts b/app/controllers/projects_controller.ts new file mode 100644 index 0000000..7b4d43e --- /dev/null +++ b/app/controllers/projects_controller.ts @@ -0,0 +1,50 @@ +// app/controllers/projects_controller.ts +import Project from '#models/project'; +import type { HttpContext } from '@adonisjs/core/http'; + +export default class ProjectsController { + // GET /settings/projects + public async index({ inertia, auth }: HttpContext) { + const projects = await Project.all(); + // return inertia.render('Admin/Project/Index', { projects }); + return inertia.render('Admin/Project/Index', { + projects: projects, + can: { + edit: await auth.user?.can(['settings']), + create: await auth.user?.can(['settings']), + }, + }); + } + + // GET /settings/projects/create + public async create({ inertia }: HttpContext) { + return inertia.render('Admin/Project/Create'); + } + + // POST /settings/projects + public async store({ request, response, session }: HttpContext) { + const data = request.only(['label', 'name', 'description']); + + await Project.create(data); + + session.flash('success', 'Project created successfully'); + return response.redirect().toRoute('settings.project.index'); + } + + // GET /settings/projects/:id/edit + public async edit({ params, inertia }: HttpContext) { + const project = await Project.findOrFail(params.id); + return inertia.render('Admin/Project/Edit', { project }); + } + + // PUT /settings/projects/:id + public async update({ params, request, response, session }: HttpContext) { + const project = await Project.findOrFail(params.id); + const data = request.only(['label', 'name', 'description']); + + await project.merge(data).save(); + + session.flash('success', 'Project updated successfully'); + return response.redirect().toRoute('settings.project.index'); + } +} diff --git a/resources/js/Pages/Admin/Project/Create.vue b/resources/js/Pages/Admin/Project/Create.vue new file mode 100644 index 0000000..f0f8ee5 --- /dev/null +++ b/resources/js/Pages/Admin/Project/Create.vue @@ -0,0 +1,144 @@ + + + \ No newline at end of file diff --git a/resources/js/Pages/Admin/Project/Edit.vue b/resources/js/Pages/Admin/Project/Edit.vue new file mode 100644 index 0000000..4fceaf1 --- /dev/null +++ b/resources/js/Pages/Admin/Project/Edit.vue @@ -0,0 +1,154 @@ + + + \ No newline at end of file diff --git a/resources/js/Pages/Admin/Project/Index.vue b/resources/js/Pages/Admin/Project/Index.vue new file mode 100644 index 0000000..13dcbf9 --- /dev/null +++ b/resources/js/Pages/Admin/Project/Index.vue @@ -0,0 +1,182 @@ + + + \ No newline at end of file diff --git a/resources/js/menu.ts b/resources/js/menu.ts index 16d08d7..55921f3 100644 --- a/resources/js/menu.ts +++ b/resources/js/menu.ts @@ -12,7 +12,7 @@ import { mdiShieldCrownOutline, mdiLicense, mdiFileDocument, - mdiLibraryShelves + mdiFolderMultiple, } from '@mdi/js'; export default [ @@ -92,6 +92,12 @@ export default [ label: 'Licenses', roles: ['administrator'], }, + { + route: 'settings.project.index', + icon: mdiFolderMultiple, + label: 'Projects', + roles: ['administrator'], + }, ], }, diff --git a/start/routes.ts b/start/routes.ts index fd6d9fd..cd564a4 100644 --- a/start/routes.ts +++ b/start/routes.ts @@ -34,6 +34,7 @@ import DatasetController from '#app/Controllers/Http/Submitter/DatasetController import PersonController from '#app/Controllers/Http/Submitter/PersonController'; import EditorDatasetController from '#app/Controllers/Http/Editor/DatasetController'; import ReviewerDatasetController from '#app/Controllers/Http/Reviewer/DatasetController'; +import ProjectsController from '#app/controllers/projects_controller'; import './routes/api.js'; import { middleware } from './kernel.js'; import db from '@adonisjs/lucid/services/db'; // Import the DB service @@ -234,6 +235,19 @@ router .where('id', router.matchers.number()) .use(middleware.can(['settings'])); + // Project routes + // List all projects + router.get('/projects', [ProjectsController, 'index']).as('project.index'); + // Show create form + router.get('/projects/create', [ProjectsController, 'create']).as('project.create').use(middleware.can(['settings']));; + // Store new project + router.post('/projects', [ProjectsController, 'store']).as('project.store').use(middleware.can(['settings']));; + // Show edit form + router.get('/projects/:id/edit',[ProjectsController, 'edit']).as('project.edit').use(middleware.can(['settings']));; + // Update project + router.put('/projects/:id',[ProjectsController, 'update']).as('project.update').use(middleware.can(['settings']));; + + // Mimetype routes router.get('/mimetype', [MimetypeController, 'index']).as('mimetype.index'); router