diff --git a/app/assets/css/main.css b/app/assets/css/main.css index 8e52533a4..7af53fb6a 100644 --- a/app/assets/css/main.css +++ b/app/assets/css/main.css @@ -3,6 +3,7 @@ @source "../../../content/**/*"; @source "../../../node_modules/.c12"; +@source "../../../modules/"; @theme static { --font-sans: 'Public Sans', sans-serif; diff --git a/app/layouts/admin.vue b/app/layouts/admin.vue deleted file mode 100644 index 56a8b72d4..000000000 --- a/app/layouts/admin.vue +++ /dev/null @@ -1,5 +0,0 @@ - diff --git a/app/pages/docs/[...slug].vue b/app/pages/docs/[...slug].vue index 7fc41a8fd..78507644f 100644 --- a/app/pages/docs/[...slug].vue +++ b/app/pages/docs/[...slug].vue @@ -191,7 +191,7 @@ function refreshHeading(opened: boolean) {
- +
({ + meta: { + name: 'feedback', + configKey: 'feedback' + }, + defaults: { + adminPath: '/_feedback/admin' + }, + async setup(options, nuxt) { + const { resolve } = createResolver(import.meta.url) + const adminPath = options.adminPath!.replace(/\/$/, '') + + const adminPassword = process.env.NUXT_FEEDBACK_ADMIN_PASSWORD || '' + + nuxt.options.runtimeConfig.feedback = { + adminPassword + } + + nuxt.options.runtimeConfig.public.feedback = { + adminPath, + hasPasswordAuth: !!adminPassword + } + + nuxt.hook('hub:db:schema:extend', async ({ dialect, paths }) => { + if (dialect === 'sqlite') { + paths.push(resolve('./runtime/server/db/schema.sqlite.ts')) + } + }) + + addComponentsDir({ + path: resolve('./runtime/components'), + prefix: 'Feedback' + }) + + addImportsDir(resolve('./runtime/composables')) + + addServerImportsDir(resolve('./runtime/server/utils')) + + addServerHandler({ + route: '/api/_feedback', + method: 'get', + handler: resolve('./runtime/server/api/feedback/index.get') + }) + + addServerHandler({ + route: '/api/_feedback', + method: 'post', + handler: resolve('./runtime/server/api/feedback/index.post') + }) + + addServerHandler({ + route: '/api/_feedback/:id', + method: 'delete', + handler: resolve('./runtime/server/api/feedback/[id].delete') + }) + + addServerHandler({ + route: '/api/auth/github', + method: 'get', + handler: resolve('./runtime/server/api/auth/github.get') + }) + + addServerHandler({ + route: '/api/auth/password', + method: 'post', + handler: resolve('./runtime/server/api/auth/password.post') + }) + + addRouteMiddleware({ + name: 'feedback-auth', + path: resolve('./runtime/middleware/auth') + }) + + addRouteMiddleware({ + name: 'feedback-guest', + path: resolve('./runtime/middleware/guest') + }) + + extendPages((pages) => { + pages.push({ + name: 'feedback-admin', + path: adminPath, + file: resolve('./runtime/pages/admin/index.vue') + }) + + pages.push({ + name: 'feedback-admin-login', + path: `${adminPath}/login`, + file: resolve('./runtime/pages/admin/login.vue') + }) + }) + + nuxt.options.routeRules![adminPath] = { ssr: false } + nuxt.options.routeRules![`${adminPath}/**`] = { ssr: false } + + nuxt.hook('prepare:types', ({ references }) => { + references.push({ + path: resolve('./types.ts') + }) + }) + } +}) + +export type { FeedbackModuleOptions } from './types' +export { FEEDBACK_OPTIONS, FEEDBACK_RATINGS, feedbackSchema, feedbackFormSchema } from './types' +export type { FeedbackRating, FeedbackOption, FeedbackInput, FeedbackItem, FeedbackSubmission, PageAnalytic } from './types' +export type { Feedback } from './runtime/shared/types/feedback' diff --git a/app/components/feedback/FeedbackChart.vue b/modules/feedback/runtime/components/Chart.vue similarity index 98% rename from app/components/feedback/FeedbackChart.vue rename to modules/feedback/runtime/components/Chart.vue index d3dadfed8..c0d3a4d77 100644 --- a/app/components/feedback/FeedbackChart.vue +++ b/modules/feedback/runtime/components/Chart.vue @@ -1,16 +1,7 @@ diff --git a/app/pages/admin/login.vue b/modules/feedback/runtime/pages/admin/login.vue similarity index 56% rename from app/pages/admin/login.vue rename to modules/feedback/runtime/pages/admin/login.vue index 5ee516add..f24973e0d 100644 --- a/app/pages/admin/login.vue +++ b/modules/feedback/runtime/pages/admin/login.vue @@ -1,18 +1,50 @@