diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..e8374ce --- /dev/null +++ b/.dockerignore @@ -0,0 +1,39 @@ +# Git +.git +.gitignore + +# Dependencies +node_modules +viewer/node_modules + +# Build output +viewer/dist +viewer/build + +# IDE / Editor specific +.vscode +.idea +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? + +# Local env files +.env.local +.env.*.local + +# Logs +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* + +# OS generated files +.DS_Store +.DS_Store? +._* +.Spotlight-V100 +.Trashes +ehthumbs.db +Thumbs.db diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..047885b --- /dev/null +++ b/Dockerfile @@ -0,0 +1,28 @@ +# Use a lightweight Node.js image +FROM node:20-alpine + +# Set the working directory inside the container +WORKDIR /app + +# Copy package.json and lock files from the viewer directory first +# to leverage Docker layer caching +COPY viewer/package.json viewer/pnpm-lock.yaml* ./ + +# Install pnpm globally +RUN npm install -g pnpm + +# Install all dependencies (including devDependencies for Vite) +RUN pnpm install --frozen-lockfile + +# Copy the rest of the application source code from the viewer directory +COPY viewer/ ./ + +# Build the application for production +RUN pnpm build + +# Expose the port Vite preview will run on +EXPOSE 3000 + +# The command to run the app using Vite's preview server +# --host 0.0.0.0 is crucial to make the server accessible from outside the container +CMD ["pnpm", "exec", "vite", "preview", "--host", "0.0.0.0", "--port", "3000"] \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..abdbf11 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,10 @@ +services: + qna-viewer: + build: + context: . + dockerfile: Dockerfile + image: qna-viewer:latest + container_name: qna-viewer-app + ports: + - "8073:3000" + restart: unless-stopped \ No newline at end of file diff --git a/viewer/.env b/viewer/.env index 95512a4..cfee55a 100644 --- a/viewer/.env +++ b/viewer/.env @@ -15,6 +15,7 @@ VITE_DESCOPE_PROJECT_ID=P2wON5fy1K6kyia269VpeIzYP8oP VITE_DESCOPE_FLOW_ID=sign-up-with-password-standard VITE_DESCOPE_USER_PROFILE_WIDGET_ID=user-profile-widget-standard + # Descope base URL DESCOPE_BASE_URL="" # Descope base static URL diff --git a/viewer/src/components/DynamicForm.tsx b/viewer/src/components/DynamicForm.tsx index 322eda0..0ab606b 100644 --- a/viewer/src/components/DynamicForm.tsx +++ b/viewer/src/components/DynamicForm.tsx @@ -59,9 +59,10 @@ export function DynamicForm({ }; const renderField = (field: FeedbackField) => { + const value = String(formData[field.id] ?? ""); const commonProps = { id: field.id, - value: formData[field.id] ?? "", + value: value, disabled: field.readOnly, }; diff --git a/viewer/src/components/DynamicTable.tsx b/viewer/src/components/DynamicTable.tsx index 5525112..2a64921 100644 --- a/viewer/src/components/DynamicTable.tsx +++ b/viewer/src/components/DynamicTable.tsx @@ -375,8 +375,8 @@ export function DynamicTable({
diff --git a/viewer/src/main.tsx b/viewer/src/main.tsx index c57e0b1..a46d62c 100644 --- a/viewer/src/main.tsx +++ b/viewer/src/main.tsx @@ -15,7 +15,7 @@ ReactDOM.createRoot(document.getElementById("root")!).render( - + diff --git a/viewer/src/pages/FeedbackListPage.tsx b/viewer/src/pages/FeedbackListPage.tsx index f6628da..5c15fbb 100644 --- a/viewer/src/pages/FeedbackListPage.tsx +++ b/viewer/src/pages/FeedbackListPage.tsx @@ -51,13 +51,13 @@ export function FeedbackListPage() { fetchSchemaAndFeedbacks(); }, [projectId, channelId]); - const handleRowClick = (row: Feedback) => { + const handleRowClick = (row: any) => { navigate( `/projects/${projectId}/channels/${channelId}/feedbacks/${row.id}`, ); }; - const renderExpandedRow = (row: Row) => ( + const renderExpandedRow = (row: Row) => (

{row.original.title}

{row.original.contents}

@@ -68,6 +68,11 @@ export function FeedbackListPage() { return
로딩 중...
; } + const tableData = feedbacks.map(item => ({ + ...item, + updatedAt: item.updatedAt || new Date().toISOString(), + })); + return (